diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d8dcef1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,32 @@ +.buildpath +.hgignore.swp +.project +.orig +.swp +.idea/ +.settings/ +.vscode/ +vendor/ +composer.lock +gitpush.sh +pkg/ +bin/ +cbuild +**/.DS_Store +.vscode/ +.test/ +main +output/ +manifest/output/ +*.exe +tmp/ +resource/data/gen_sql +resource/log/ +resource/public/big_file +resource/public/upload_file +manifest/config/config.yaml +GFastV3 +/manifest/config/db.yaml +/public +/resource/ +.xlsx \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/api/app/process/process.go b/api/app/process/process.go new file mode 100644 index 0000000..5542871 --- /dev/null +++ b/api/app/process/process.go @@ -0,0 +1,4 @@ +package process + +type ProcessApi struct { +} diff --git a/api/app/process/req.go b/api/app/process/req.go new file mode 100644 index 0000000..50c4738 --- /dev/null +++ b/api/app/process/req.go @@ -0,0 +1,47 @@ +package process + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// 新增进度 +type CreateProcessReq struct { + g.Meta `path:"/process/create" method:"post" tags:"APP(里程碑进度上报)" summary:"新增里程碑进度"` + Stage string `json:"stage" v:"required" dc:"上传阶段名称"` + ProjectId int64 `json:"projectId" v:"required#该用户暂未绑定项目" dc:"项目ID"` + Percentage int `json:"percentage" dc:"完成情况(1已完成 0未完成)"` + Notes string `json:"notes" dc:"备注"` + CompleteTime gtime.Time `json:"completeTime" dc:"完成时间"` +} + +// 获取进度列表 +type ProcessListReq struct { + g.Meta `path:"/process/list" method:"get" tags:"APP(里程碑进度上报)" summary:"获取里程碑进度列表"` + ProjectId int64 `json:"projectId" v:"required" dc:"项目ID"` + Page int `json:"page" v:"required" dc:"页码"` + PageSize int `json:"pageSize" v:"required" dc:"每页大小"` +} + +// 更新进度信息 +type UpdateProcessReq struct { + g.Meta `path:"/process/update" method:"put" tags:"APP(里程碑进度上报)" summary:"更新里程碑进度信息"` + ProcessID int64 `json:"processId" v:"required" dc:"进度ID"` + Stage string `json:"stage" v:"required" dc:"上传阶段名称"` + ProjectId int64 `json:"projectId" v:"required" dc:"项目ID"` + Percentage int `json:"percentage" dc:"完成情况(1已完成 0未完成)"` + Notes string `json:"notes" dc:"备注"` + CompleteTime gtime.Time `json:"completeTime" dc:"完成时间"` +} + +// 删除进度 +type DeleteProcessReq struct { + g.Meta `path:"/process/delete" method:"delete" tags:"APP(里程碑进度上报)" summary:"删除里程碑进度"` + ProcessID int64 `json:"processId" v:"required" dc:"进度ID"` +} + +// 获取详情 +type ProcessDetailReq struct { + g.Meta `path:"/process/detail" method:"delete" tags:"APP(里程碑进度上报)" summary:"获取里程碑进度详情"` + ProcessID int64 `json:"processId" v:"required" dc:"进度ID"` +} diff --git a/api/app/process/res.go b/api/app/process/res.go new file mode 100644 index 0000000..7491357 --- /dev/null +++ b/api/app/process/res.go @@ -0,0 +1,56 @@ +package process + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + "time" +) + +// 新增进度 +type CreateProcessRes struct { +} + +// 获取列表 +type ProcessListRes struct { + g.Meta `mime:"application/json"` + Processes []ProcessVo `json:"processes"` +} + +// Process 表的结构体定义 +type Process struct { + g.Meta `mime:"application/json"` + ProcessID int64 `json:"processId" dc:"主键ID"` + ProjectId int64 `json:"projectId" dc:"项目ID"` + Stage string `json:"stage" dc:"阶段"` + Percentage int `json:"percentage" dc:"进度"` + Notes string `json:"notes" dc:"备注"` + CreatedAt time.Time `json:"createdAt" dc:"创建时间"` + UpdatedAt time.Time `json:"updatedAt" dc:"更新时间"` + CompleteTime gtime.Time `json:"completeTime" dc:"完成时间"` + CreatedBy int `json:"createdBy" dc:"录入人"` +} + +// Process 表的结构体定义 +type ProcessVo struct { + g.Meta `mime:"application/json"` + ProcessID int64 `json:"processId" dc:"主键ID"` + ProjectId int64 `json:"projectId" dc:"项目ID"` + Stage string `json:"stage" dc:"阶段"` + Percentage int `json:"percentage" dc:"进度"` + Notes string `json:"notes" dc:"备注"` + CreatedAt time.Time `json:"createdAt" dc:"创建时间"` + UpdatedAt time.Time `json:"updatedAt" dc:"更新时间"` + CompleteTime gtime.Time `json:"completeTime" dc:"完成时间"` + CreatedBy int `json:"createdBy" dc:"录入人ID"` + CreatedByName string `json:"createdByName" dc:"录入人姓名"` +} + +type UpdateProcessRes struct { +} + +type DeleteProcessRes struct { +} + +type ProcessDetailRes struct { + ProcessInfo ProcessVo `json:"processInfo"` +} diff --git a/api/app/process/service.go b/api/app/process/service.go new file mode 100644 index 0000000..323017d --- /dev/null +++ b/api/app/process/service.go @@ -0,0 +1,74 @@ +package process + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" +) + +func (p ProcessApi) CreateProcess(ctx context.Context, req *CreateProcessReq) (res *CreateProcessRes, err error) { + res = new(CreateProcessRes) + // 获取当前登陆用户的ID + userID := ct.New().GetUserId(ctx) + param := g.Map{ + "stage": req.Stage, + "project_id": req.ProjectId, + "percentage": req.Percentage, + "complete_time": req.CompleteTime, + "notes": req.Notes, + "created_by": userID, + } + // 插入数据 + _, err = g.Model("process").Ctx(ctx).Insert(param) + if err != nil { + return nil, err + } + return res, nil +} + +// 根据项目列表查询里程碑数据 +func (p ProcessApi) GetProcessList(ctx context.Context, req *ProcessListReq) (res *ProcessListRes, err error) { + res = new(ProcessListRes) + err = g.Model("process").Ctx(ctx).Fields("process.*,sys_user.user_nickname AS createdByName"). + LeftJoin("sys_user on sys_user.id = process.created_by"). + Where("project_id = ?", req.ProjectId).Page(req.Page, req.PageSize).Scan(&res.Processes) + if err != nil { + return nil, err + } + return res, nil +} + +func (p ProcessApi) UpdateProcess(ctx context.Context, req *UpdateProcessReq) (res *UpdateProcessRes, err error) { + res = new(UpdateProcessRes) + _, err = g.Model("process").Ctx(ctx).Data(g.Map{ + "stage": req.Stage, + "project_id": req.ProjectId, + "percentage": req.Percentage, + "complete_time": req.CompleteTime, + "notes": req.Notes, + }).Where("process_id = ?", req.ProcessID).Update() + if err != nil { + return nil, err + } + return res, nil +} + +func (p ProcessApi) DeleteProcess(ctx context.Context, req *DeleteProcessReq) (res *DeleteProcessRes, err error) { + res = new(DeleteProcessRes) + _, err = g.Model("process").Ctx(ctx).Where("process_id", req.ProcessID).Delete() + if err != nil { + return nil, err + } + return res, nil +} + +func (p ProcessApi) ProcessDetail(ctx context.Context, req *ProcessDetailReq) (res *ProcessDetailRes, err error) { + res = new(ProcessDetailRes) + g.Model("process").Ctx(ctx).Fields("process.*,sys_user.user_nickname AS createdByName"). + InnerJoin("sys_user on sys_user.id = process.created_by"). + Scan(&res.ProcessInfo) + if err != nil { + return nil, err + } + return res, nil +} diff --git a/api/app/project/project.go b/api/app/project/project.go new file mode 100644 index 0000000..09d0b0d --- /dev/null +++ b/api/app/project/project.go @@ -0,0 +1,4 @@ +package project + +type Project struct { +} diff --git a/api/app/project/req.go b/api/app/project/req.go new file mode 100644 index 0000000..c74e8fd --- /dev/null +++ b/api/app/project/req.go @@ -0,0 +1,44 @@ +package project + +import "github.com/gogf/gf/v2/frame/g" + +// 查询所有项目列表数据 +type ProjectIndexModuleReq struct { + g.Meta `path:"index" method:"get" tags:"APP(项目相关)" summary:"项目列表数据【首页列表】"` + ProjectName string `json:"projectName" dc:"模糊搜索项目名"` + PageNum int `json:"pageNum" dc:"页码" v:"required"` + PageSize int `json:"pageSize" dc:"每页数量" v:"required"` +} + +// 根据项目ID查询详情【基础数据】 +type ProjectIndexModuleDetailReq struct { + g.Meta `path:"base" method:"get" tags:"APP(项目相关)" summary:"项目详情数据【基础数据】"` + ProjectId string `json:"projectId" v:"required" dc:"项目ID"` +} + +// 根据项目ID查询详情【项目计划】 +type ProjectPlanDetailReq struct { + g.Meta `path:"plan" method:"get" tags:"APP(项目相关)" summary:"项目详情数据【项目计划】"` + ProjectId string `json:"projectId" v:"required" dc:"项目ID"` +} + +// 根据项目ID查询详情【视频监控】 +type ProjectVideoDetailReq struct { + g.Meta `path:"video" method:"get" tags:"APP(项目相关)" summary:"项目详情数据【视频监控】"` + ProjectId string `json:"projectId" v:"required" dc:"项目ID"` +} + +// 根据项目ID查询详情【施工日志】 +type ProjectLogReq struct { + g.Meta `path:"log" method:"get" tags:"APP(项目相关)" summary:"项目详情数据【施工日志】"` + ProjectId int64 `json:"projectId" v:"required" dc:"项目ID"` +} + +// 根据项目ID查询详情【计划详情】 +type ProjectPlanDetailStatusReq struct { + g.Meta `path:"/planDetail" tags:"APP(项目相关)" method:"get" summary:"项目详情数据【计划详情】"` + ProjectID int `json:"projectId"` + Status int `json:"status" dc:"任务状态 0:待开始 1:进行中 2:已完成 3:滞后"` + PageNum int `json:"pageNum" dc:"页码" v:"required"` + PageSize int `json:"pageSize" dc:"每页数量" v:"required"` +} diff --git a/api/app/project/res.go b/api/app/project/res.go new file mode 100644 index 0000000..f5ec861 --- /dev/null +++ b/api/app/project/res.go @@ -0,0 +1,126 @@ +package project + +import ( + "time" + + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/common" +) + +// 项目列表响应数据 +type ProjectListRes struct { + ProjectTotal int `json:"projectTotal"` // 项目总数 + BuildProject int `json:"buildProject"` // 在建项目数量 + ProjectCapacity int `json:"projectCapacity"` // 项目容量 + ProjectListModels []ProjectListModel `json:"projectListModels"` // 列表数据 +} +type ProjectListModel struct { + ProjectID int `json:"projectId"` // 项目ID + ProjectName string `json:"projectName"` // 项目名称 + ProductionDays int `json:"productionDays"` // 安全生产天数 + Status string `json:"status"` // 项目状态 + TotalQuantity int `json:"totalQuantity"` // 总数量 + CompletedQuantity int `json:"completedQuantity"` // 已完成数量 + ProjectLeader string `json:"projectLeader"` // 项目负责人 + OnStreamTime string `json:"onStreamTime"` // 开工时间 +} + +// 项目详情响应数据【基础数据部分】 +type ProjectDetailModelRes struct { + ProjectID int `json:"projectId"` // 项目ID + ProjectName string `json:"projectName"` // 项目名称 + ProjectLeader string `json:"projectLeader"` // 项目负责人 + OnStreamTime string `json:"onStreamTime"` // 开工时间(计划开工) + ProductionDays int `json:"productionDays"` // 安全生产天数 + TotalQuantity int `json:"totalQuantity"` // 总数量 + CompletedQuantity int `json:"completedQuantity"` // 已完成数量 +} + +// 项目详情响应数据【项目计划】 +type ProjectPlanDetailRes struct { + ProjectPlan +} +type ProjectPlan struct { + PendingPlan int `json:"pendingTasks"` // 待开始计划 + ProcessingPlan int `json:"processingTasks"` // 进行中计划 + CompletedPlan int `json:"completedTasks"` // 已完成计划 + DeferredPlan int `json:"deferredTasks"` // 滞后计划 +} + +type ProjectPlanDetailStatusRes struct { + g.Meta `mime:"application/json"` + common.ListRes + List []SchduleList `json:"list"` +} + +// SchduleList 计划详情 +type SchduleList struct { + // 工作名称 + WorkName string `json:"work_name"` + // 计划数量 + PlanNum int `json:"plan_num"` + // 实际完成数量 + FinishedNum int `json:"finished_num"` + // 开始时间 + StartTime string `json:"start_at"` + // 结束时间 + EndTime string `json:"end_at"` + // 工日 + WorkDay int `json:"work_day"` + // 工作量百分比 + WorkPercent int `json:"work_percent"` + // 负责人 + Leader string `json:"principal"` +} + +// 项目详情响应数据【视频监控】 +type ProjectVideoDetailRes struct { + YS7Devices []YS7Device +} + +type YS7Device struct { + ID int `json:"id"` + CreatedAt time.Time `json:"createdAt"` + DeviceSerial string `json:"deviceSerial"` + DeviceName string `json:"deviceName"` + DeviceType string `json:"deviceType"` + Status int `json:"status"` + Defence int `json:"defence"` + DeviceVersion string `json:"deviceVersion"` + ProjectID string `json:"projectId"` + Detail string `json:"detail"` + Position string `json:"position"` + Remark string `json:"remark"` + VideoEncrypted int `json:"videoEncrypted"` +} + +// 项目详情响应数据【施工日志】 +type ProjectLogRes struct { + Logs []ConstructionLog `json:"logs"` +} + +type ConstructionLog struct { + ID int64 `json:"id"` + DateOfOccurrence string `json:"dateOfOccurrence"` + Condition string `json:"condition"` + TechnologyQuality string `json:"technologyQuality"` + Remark string `json:"remark"` + Path string `json:"path"` + CreatedBy string `json:"createdBy"` + UpdatedBy string `json:"updatedBy"` + CreatedAt time.Time `json:"createdAt"` + UpdatedAt time.Time `json:"updatedAt"` + DeletedAt time.Time `json:"deletedAt"` +} + +type VisualProgress struct { + Id int64 `json:"id" dc:"主键"` + ProjectID int64 `json:"projectId" dc:"项目ID"` + ProjectName string `json:"projectName" dc:"项目名称"` + ReporterID int64 `json:"reporterId" dc:"上报人ID"` + ReporterName string `json:"reporterName" dc:"上报人名字"` + ReportTime time.Time `json:"reportTime" dc:"上报时间"` + Title string `json:"title" dc:"形象标题"` + ProgressDesc string `json:"progressDesc" dc:"进度描述"` + AttachmentURL string `json:"attachmentUrl" dc:"附件URL"` +} diff --git a/api/app/project/service.go b/api/app/project/service.go new file mode 100644 index 0000000..75bb407 --- /dev/null +++ b/api/app/project/service.go @@ -0,0 +1,279 @@ +package project + +import ( + "context" + "fmt" + "time" + + "github.com/gogf/gf/v2/frame/g" + "github.com/jinzhu/copier" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// 项目首页信息列表 +func (p Project) ProjectIndex(ctx context.Context, req *ProjectIndexModuleReq) (res *ProjectListRes, err error) { + res = new(ProjectListRes) + + // 查询所有项目总数 + count, err := g.Model("sys_project").Ctx(ctx).Count() + if err != nil { + return nil, err + } + res.ProjectTotal = count + + // 查询所有项目的总容量之和 + var capacity struct{ ProjectCapacity int } + err = g.Model("sys_project").Fields("SUM(actual) AS ProjectCapacity").Ctx(ctx).Scan(&capacity) + if err != nil { + return nil, err + } + res.ProjectCapacity = capacity.ProjectCapacity + + // 分页查询大项目基础信息,然后遍历信息去补全其他的数据 + var projects []struct { + ProjectID int `json:"projectId"` + ProjectName string `json:"projectName"` + ProjectLeader string `json:"projectLeader"` + OnStreamTime string `json:"onStreamTime"` + } + + // 构建查询模型 + query := g.Model("sys_project").Ctx(ctx). + Fields("id AS ProjectID, project_name AS ProjectName, on_stream_time AS OnStreamTime, principal AS ProjectLeader") + + if req.ProjectName != "" { + query = query.Where("project_name LIKE ?", "%"+req.ProjectName+"%") + } + + err = query.Scan(&projects) + if err != nil { + return nil, err + } + + buildProjectCount := 0 // 初始化在建项目数量计数器 + + for _, project := range projects { + // 初始化列表模型 + projectModel := ProjectListModel{ + ProjectID: project.ProjectID, + ProjectName: project.ProjectName, + ProjectLeader: project.ProjectLeader, + OnStreamTime: project.OnStreamTime, + } + + // 首先将字符串转换为 JSON + onStreamTime, err := time.Parse("2006-01-02", project.OnStreamTime) + if err != nil { + return nil, err + } + + // 检查该项目的所有子项目是否均有完成时间 + subProjectCount, err := g.Model("sub_project").Ctx(ctx).Where("project_id = ? AND done_time IS NOT NULL", project.ProjectID).Count() + totalSubProjects, err := g.Model("sub_project").Ctx(ctx).Where("project_id = ?", project.ProjectID).Count() + if err != nil { + return nil, err + } + + // 如果所有子项目的完成时间都不为空则设置为竣工 + if subProjectCount == totalSubProjects && totalSubProjects != 0 { + var latestDoneTimeString string + // 查询子项目最后完成的任务的时间 + err = g.Model("sub_project").Ctx(ctx). + Fields("MAX(done_time)"). + Where("project_id = ?", project.ProjectID). + Scan(&latestDoneTimeString) + if err != nil { + return nil, err + } + latestDoneTime, err := time.Parse("2006-01-02", latestDoneTimeString) + if err != nil { + return nil, err + } + // 安全生产天数等于最后任务的完成时间减去项目的开始时间 + projectModel.ProductionDays = int(latestDoneTime.Unix()-onStreamTime.Unix()) / 86400 + projectModel.Status = "竣工" + } else { + // 安全生产天数等于当前的时间减去项目的开始时间 + projectModel.ProductionDays = int(time.Now().Unix()-onStreamTime.Unix()) / 86400 + projectModel.Status = "在建" + buildProjectCount++ // 累加在建项目数量 + } + + // 查询相关工作计划的总量与完成量 + var work struct { + TotalQuantity int `json:"totalQuantity"` + CompletedQuantity int `json:"completedQuantity"` + } + err = g.Model("work_schedule").Ctx(ctx). + Fields("SUM(plan_num) AS totalQuantity, SUM(finished_num) AS completedQuantity"). + Where("project_id = ?", project.ProjectID). + Scan(&work) + if err != nil { + return nil, err + } + projectModel.TotalQuantity = work.TotalQuantity + projectModel.CompletedQuantity = work.CompletedQuantity + + // 添加到结果列表中 + res.ProjectListModels = append(res.ProjectListModels, projectModel) + } + + // 设置在建项目数量 + res.BuildProject = buildProjectCount + + return res, nil +} + +// 根据项目ID查询详情【基础数据】 +func (p Project) ProjectDetail(ctx context.Context, req *ProjectIndexModuleDetailReq) (res *ProjectDetailModelRes, err error) { + res = new(ProjectDetailModelRes) + + // 初始化查询模型,用于获取项目的基础信息 + var project struct { + ProjectID int `db:"ProjectID"` + ProjectName string `db:"ProjectName"` + ProjectLeader string `db:"ProjectLeader"` + OnStreamTime string `db:"OnStreamTime"` + } + + err = g.Model("sys_project").Ctx(ctx). + Fields("id AS ProjectID, project_name AS ProjectName, principal AS ProjectLeader, on_stream_time AS OnStreamTime"). + Where("id = ?", req.ProjectId). + Scan(&project) + if err != nil { + return nil, err + } + + // 将基本信息设置到响应结构体中 + res.ProjectID = project.ProjectID + res.ProjectName = project.ProjectName + res.ProjectLeader = project.ProjectLeader + res.OnStreamTime = project.OnStreamTime + + // 计算安全生产天数 + onStreamDate, err := time.Parse("2006-01-02", project.OnStreamTime) + if err != nil { + return nil, err + } + res.ProductionDays = int(time.Since(onStreamDate).Hours() / 24) // 将时间差转换为天数 + + // 获取总数量和已完成数量 + var quantities struct { + TotalQuantity int `db:"TotalQuantity"` + CompletedQuantity int `db:"CompletedQuantity"` + } + err = g.Model("work_schedule").Ctx(ctx). + Fields("SUM(plan_num) AS TotalQuantity, SUM(finished_num) AS CompletedQuantity"). + Where("project_id = ?", project.ProjectID). + Scan(&quantities) + if err != nil { + return nil, err + } + + res.TotalQuantity = quantities.TotalQuantity + res.CompletedQuantity = quantities.CompletedQuantity + + return res, nil +} + +// 根据项目ID查询详情【项目计划】 +func (p Project) ProjectPlanDetail(ctx context.Context, req *ProjectPlanDetailReq) (res *ProjectPlanDetailRes, err error) { + res = new(ProjectPlanDetailRes) + + // 使用结构体来接收查询结果 + var planCounts struct { + PendingPlan int `db:"PendingPlan"` // 待开始 + ProcessingPlan int `db:"ProcessingPlan"` // 进行中 + CompletedPlan int `db:"CompletedPlan"` // 已完成 + DeferredPlan int `db:"DeferredPlan"` // 滞后 + } + + // 构建查询语句以聚合不同状态的计划数量 + err = g.Model("work_schedule").Ctx(ctx). + Fields( + "SUM(case when status = 0 then 1 else 0 end) AS PendingPlan", + "SUM(case when status = 1 then 1 else 0 end) AS ProcessingPlan", + "SUM(case when status = 2 then 1 else 0 end) AS CompletedPlan", + "SUM(case when status = 3 then 1 else 0 end) AS DeferredPlan", + ). + Where("project_id = ?", req.ProjectId). + Scan(&planCounts) + if err != nil { + return nil, err + } + + // 将查询结果映射到响应结构体中 + res.ProjectPlan = ProjectPlan{ + PendingPlan: planCounts.PendingPlan, + ProcessingPlan: planCounts.ProcessingPlan, + CompletedPlan: planCounts.CompletedPlan, + DeferredPlan: planCounts.DeferredPlan, + } + + return res, nil +} + +// 根据项目ID查询详情【项目计划详情】 +func (p Project) ProjectPlanDetailStatus(ctx context.Context, req *ProjectPlanDetailStatusReq) (res *ProjectPlanDetailStatusRes, err error) { + res = new(ProjectPlanDetailStatusRes) + list := []model.SchduleDetail{} + m := dao.WorkSchedule.Ctx(ctx).As("wc"). + LeftJoin("work_status as ws", "wc.work_id = ws.work_id"). + LeftJoin("sys_project as sp", "wc.project_id = sp.id"). + Where("wc.status = ? AND wc.project_id = ?", req.Status, req.ProjectID) + + res.Total, err = m.Count() + if err != nil { + return nil, fmt.Errorf("failed to count: %w", err) + } + + res.CurrentPage = req.PageNum + + // 查询工作计划详情 + m = m.Fields("ws.work_name,wc.plan_num,wc.finished_num,wc.start_at,wc.end_at,sp.principal") + + err = m.Page(req.PageNum, req.PageSize).Scan(&list) + if err != nil { + return nil, fmt.Errorf("failed to fetch page: %w", err) + } + + res.List = make([]SchduleList, 0, len(list)) + copier.Copy(&res.List, &list) + + return res, nil +} + +// 根据项目ID查询详情【视频监控】 +func (p Project) ProjectVideoDetail(ctx context.Context, req *ProjectVideoDetailReq) (res *ProjectVideoDetailRes, err error) { + res = new(ProjectVideoDetailRes) + + err = g.Model("ys7devices").Ctx(ctx). + Fields( + "id AS ID, created_at AS CreatedAt, DeviceSerial, DeviceName, DeviceType, Status, Defence, DeviceVersion, ProjectId, Detail, Position, Remark, VideoEncrypted"). + Where("ProjectId = ?", req.ProjectId). + Order("CreatedAt DESC"). + Scan(&res.YS7Devices) + if err != nil { + return nil, err + } + + return res, nil +} + +// 根据项目ID查询详情【施工日志】 +func (p Project) GetConstructionLogs(ctx context.Context, req *ProjectLogReq) (res *ProjectLogRes, err error) { + res = new(ProjectLogRes) + + err = g.Model("bus_construction_log").Ctx(ctx). + Fields( + "id, date_of_occurrence, condition, technology_quality, remark, path, created_by, updated_by, created_at, updated_at, deleted_at"). + Where("project_id = ? AND deleted_at IS NULL", req.ProjectId). + Order("date_of_occurrence DESC"). + Scan(&res.Logs) + if err != nil { + return nil, err + } + + return res, nil +} diff --git a/api/app/stage/req.go b/api/app/stage/req.go new file mode 100644 index 0000000..1798e86 --- /dev/null +++ b/api/app/stage/req.go @@ -0,0 +1,31 @@ +package stage + +import ( + "github.com/gogf/gf/v2/frame/g" +) + +// 新增阶段 +type CreateStageReq struct { + g.Meta `path:"/stage/create" method:"post" tags:"APP(上报阶段)" summary:"创建新阶段"` + StageName string `json:"stageName" dc:"阶段名称"` +} + +// 获取阶段列表 +type StageListReq struct { + g.Meta `path:"/stage/list" method:"get" tags:"APP(上报阶段)" summary:"获取阶段列表"` + Page int `json:"page" dc:"页码"` + PageSize int `json:"pageSize" dc:"大小"` +} + +// 更新阶段信息 +type UpdateStageReq struct { + g.Meta `path:"/stage/update" method:"put" tags:"APP(上报阶段)" summary:"更新阶段信息"` + StageID int64 `json:"stageId" dc:"阶段ID"` + StageName string `json:"stageName" dc:"阶段名称"` +} + +// 删除阶段 +type DeleteStageReq struct { + g.Meta `path:"/stage/delete" method:"delete" tags:"APP(上报阶段)" summary:"删除阶段"` + StageID int64 `json:"stageId" dc:"阶段ID"` +} diff --git a/api/app/stage/res.go b/api/app/stage/res.go new file mode 100644 index 0000000..8084c98 --- /dev/null +++ b/api/app/stage/res.go @@ -0,0 +1,24 @@ +package stage + +import "time" + +type CreateStageRes struct { +} + +type StageListRes struct { + Stages []Stage `json:"stages"` +} + +// Stage 表的结构体定义 +type Stage struct { + StageID int64 `json:"stageId" gorm:"primary_key"` + StageName string `json:"stageName" dc:"阶段名称"` + CreatedAt time.Time `json:"createdAt" dc:"创建时间"` + UpdatedAt time.Time `json:"updatedAt" dc:"更新时间"` +} + +type UpdateStageRes struct { +} + +type DeleteStageRes struct { +} diff --git a/api/app/stage/service.go b/api/app/stage/service.go new file mode 100644 index 0000000..8d76f7e --- /dev/null +++ b/api/app/stage/service.go @@ -0,0 +1,52 @@ +package stage + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "time" +) + +// 创建阶段 +func (s StageApi) CreateStage(ctx context.Context, req *CreateStageReq) (res *CreateStageRes, err error) { + res = new(CreateStageRes) + stage := Stage{ + StageName: req.StageName, + CreatedAt: time.Now(), + UpdatedAt: time.Now(), + } + _, err = g.Model("stage").Ctx(ctx).Insert(&stage) + if err != nil { + return nil, err + } + return res, nil +} + +func (s StageApi) GetStageList(ctx context.Context, req *StageListReq) (res *StageListRes, err error) { + res = new(StageListRes) + err = g.Model("stage").Ctx(ctx).Page(req.Page, req.PageSize).Scan(&res.Stages) + if err != nil { + return nil, err + } + return res, nil +} + +func (s StageApi) UpdateStage(ctx context.Context, req *UpdateStageReq) (res *UpdateStageRes, err error) { + res = new(UpdateStageRes) + _, err = g.Model("stage").Ctx(ctx).Data(g.Map{ + "stage_name": req.StageName, + "updated_at": time.Now(), + }).Where("stage_id", req.StageID).Update() + if err != nil { + return nil, err + } + return res, nil +} + +func (s StageApi) DeleteStage(ctx context.Context, req *DeleteStageReq) (res *DeleteStageRes, err error) { + res = new(DeleteStageRes) + _, err = g.Model("stage").Ctx(ctx).Where("stage_id", req.StageID).Delete() + if err != nil { + return nil, err + } + return res, nil +} diff --git a/api/app/stage/stage.go b/api/app/stage/stage.go new file mode 100644 index 0000000..00021f4 --- /dev/null +++ b/api/app/stage/stage.go @@ -0,0 +1,4 @@ +package stage + +type StageApi struct { +} diff --git a/api/app/visual/req.go b/api/app/visual/req.go new file mode 100644 index 0000000..750b3af --- /dev/null +++ b/api/app/visual/req.go @@ -0,0 +1,48 @@ +package visual + +import ( + "github.com/gogf/gf/v2/frame/g" +) + +// 新增形象进度 +type CreateVisualProgressReq struct { + g.Meta `path:"/visual/create" method:"post" tags:"APP(形象进度相关)" summary:"新增形象进度"` + ProjectID int64 `json:"projectId" v:"required" dc:"项目ID"` + ReporterID int64 `json:"reporterId" v:"required" dc:"上报人ID"` + ReportTime string `json:"reportTime" v:"required" dc:"上报时间"` + Title string `json:"title" v:"required" dc:"形象标题"` + ProgressDesc string `json:"progressDesc" v:"required" dc:"进度描述"` + AttachmentURL string `json:"attachmentUrl" dc:"附件URL"` +} + +// 根据项目ID查询形象进度列表 +type ReadVisualProgressReq struct { + g.Meta `path:"/visual/list" method:"get" tags:"APP(形象进度相关)" summary:"查询指定项目的形象进度列表"` + ProjectID int64 `json:"projectId" v:"required" dc:"项目ID"` + Page int64 `json:"page" dc:"请求的页码" v:"required"` + PageSize int64 `json:"pageSize" dc:"每页显示的条目数" v:"required"` + Title string `json:"title" dc:"模糊搜索字段"` +} + +// 更新形象进度 +type UpdateVisualProgressReq struct { + g.Meta `path:"/visual/update" method:"post" tags:"APP(形象进度相关)" summary:"更新项目进度"` + ID int64 `json:"id" v:"required" dc:"记录ID"` + ProjectID int64 `json:"projectId" dc:"项目ID"` + ReporterID int64 `json:"reporterId" dc:"上报人ID"` + Title string `json:"title" dc:"形象标题"` + ProgressDesc string `json:"progressDesc" dc:"进度描述"` + AttachmentURL string `json:"attachmentUrl" dc:"附件URL"` +} + +// 删除形象进度 +type DeleteVisualProgressReq struct { + g.Meta `path:"/visual/delete" method:"delete" tags:"APP(形象进度相关)" summary:"删除项目进度"` + ID int64 `json:"id" v:"required" dc:"形象进度ID"` +} + +// 根据ID查询形象进度详情 +type GetVisualProgressDetailReq struct { + g.Meta `path:"/visual/detail" method:"get" tags:"APP(形象进度相关)" summary:"根据形象进度ID查询详情"` + ID int64 `json:"id" v:"required" dc:"形象进度ID"` +} diff --git a/api/app/visual/res.go b/api/app/visual/res.go new file mode 100644 index 0000000..0b53b5a --- /dev/null +++ b/api/app/visual/res.go @@ -0,0 +1,36 @@ +package visual + +// 新增形象进度 +type CreateVisualProgressRes struct{} + +// 形象进度列表 +type ReadVisualProgressRes struct { + ProgressList []VisualProgress `json:"progressList"` + Total int64 `json:"total"` +} +type VisualProgress struct { + Id int64 `json:"id" dc:"主键"` + ProjectID int64 `json:"projectId" dc:"项目ID"` + ProjectName string `json:"projectName" dc:"项目名称"` + ReporterID int64 `json:"reporterId" dc:"上报人ID"` + ReporterName string `json:"reporterName" dc:"上报人名字"` + ReportTime string `json:"reportTime" dc:"上报时间"` + Title string `json:"title" dc:"形象标题"` + ProgressDesc string `json:"progressDesc" dc:"进度描述"` + AttachmentURL string `json:"attachmentUrl" dc:"附件URL"` +} + +// 更新形象进度 +type UpdateVisualProgressRes struct{} + +// 删除形象进度 +type DeleteVisualProgressRes struct{} + +// 根据ID查询形象进度详情 +type GetVisualProgressDetailRes struct { + Detail VisualProgressDetail `json:"visualProgressDetail"` +} + +type VisualProgressDetail struct { + VisualProgress +} diff --git a/api/app/visual/router.go b/api/app/visual/router.go new file mode 100644 index 0000000..9978a6b --- /dev/null +++ b/api/app/visual/router.go @@ -0,0 +1,13 @@ +package visual + +import "github.com/gogf/gf/v2/net/ghttp" + +// 形象进度API +func InitAppProjectAPI(group *ghttp.RouterGroup) { + group.Middleware(ghttp.MiddlewareCORS) + group.Group("/visual", func(group *ghttp.RouterGroup) { + group.Group("/api/v1", func(group *ghttp.RouterGroup) { + group.Bind(new(Visual)) + }) + }) +} diff --git a/api/app/visual/service.go b/api/app/visual/service.go new file mode 100644 index 0000000..e0c40c6 --- /dev/null +++ b/api/app/visual/service.go @@ -0,0 +1,96 @@ +package visual + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" +) + +// 新增形象进度 +func (v Visual) CreateVisualProgress(ctx context.Context, req *CreateVisualProgressReq) (res *CreateVisualProgressRes, err error) { + res = &CreateVisualProgressRes{} + _, err = g.Model("visual_progress").Ctx(ctx).Data(g.Map{ + "project_id": req.ProjectID, + "reporter_id": req.ReporterID, + "report_time": req.ReportTime, + "title": req.Title, + "progress_desc": req.ProgressDesc, + "attachment_url": req.AttachmentURL, + }).Insert() + if err != nil { + return nil, err + } + return res, nil +} + +// 形象进度列表 +func (v Visual) GetVisualProgress(ctx context.Context, req *ReadVisualProgressReq) (res *ReadVisualProgressRes, err error) { + res = &ReadVisualProgressRes{} + offset := (req.Page - 1) * req.PageSize + count, err := g.Model("visual_progress").Ctx(ctx).Count() + if err != nil { + return nil, err + } + + err = g.Model("visual_progress").Ctx(ctx). + Fields("sys_project.id, sys_project.project_name, user.user_nickname AS reporterName, visual_progress.*"). + // 连表查询项目ID、项目名称 + LeftJoin("sys_project on visual_progress.project_id = sys_project.id"). + LeftJoin("sys_user AS user on user.id = visual_progress.reporter_id"). + Where("visual_progress.project_id = ?", req.ProjectID). + Where("visual_progress.title LIKE ?", "%"+req.Title+"%"). + Offset(int(offset)).Limit(int(req.PageSize)). + Order("visual_progress.report_time DESC"). + Scan(&res.ProgressList) + if err != nil { + return nil, err + } + res.Total = int64(count) + return res, nil +} + +// 更新形象进度 +func (v Visual) UpdateVisualProgress(ctx context.Context, req *UpdateVisualProgressReq) (res *UpdateVisualProgressRes, err error) { + res = &UpdateVisualProgressRes{} + + _, err = g.Model("visual_progress").Ctx(ctx).Data(g.Map{ + "project_id": req.ProjectID, + "reporter_id": req.ReporterID, + "title": req.Title, + "progress_desc": req.ProgressDesc, + "attachment_url": req.AttachmentURL, + }).Where("id", req.ID).Update() + if err != nil { + return nil, err + } + return res, nil +} + +// 删除形象进度 +func (v Visual) DeleteVisualProgress(ctx context.Context, req *DeleteVisualProgressReq) (res *DeleteVisualProgressRes, err error) { + res = &DeleteVisualProgressRes{} + // 删除之前调用一个方法,获取当前登录用户的ID,如果是自己才可以删除 + _, err = g.Model("visual_progress").Ctx(ctx).Where("id", req.ID).Delete() + if err != nil { + return nil, err + } + return res, nil +} + +// 根据ID查询形象进度详情 +func (v Visual) GetVisualProgressDetail(ctx context.Context, req *GetVisualProgressDetailReq) (res *GetVisualProgressDetailRes, err error) { + res = &GetVisualProgressDetailRes{} + // 查询项目基本信息 + err = g.Model("visual_progress").Ctx(ctx). + Fields("sys_project.id, sys_project.project_name, user.user_nickname AS reporterName, visual_progress.*"). + // 连表查询项目ID、项目名称 + InnerJoin("sys_project on visual_progress.project_id = sys_project.id"). + // 连表查询上报人名字(暂未确定是哪张用户表,需要联查) + InnerJoin("sys_user AS user on user.id = visual_progress.reporter_id"). + Where("visual_progress.id = ?", req.ID). + Scan(&res.Detail) + // 查询备注列表信息 + if err != nil { + return nil, err + } + return res, nil +} diff --git a/api/app/visual/visual.go b/api/app/visual/visual.go new file mode 100644 index 0000000..5548a2a --- /dev/null +++ b/api/app/visual/visual.go @@ -0,0 +1,4 @@ +package visual + +type Visual struct { +} diff --git a/api/app/visual_remark/req.go b/api/app/visual_remark/req.go new file mode 100644 index 0000000..7b34337 --- /dev/null +++ b/api/app/visual_remark/req.go @@ -0,0 +1,38 @@ +package visual_remark + +import "github.com/gogf/gf/v2/frame/g" + +// 新增形象进度评论 +type CreateRemarkReq struct { + g.Meta `path:"/remark/create" method:"post" tags:"APP(形象进度评论相关)" summary:"新增形象进度评论"` + VisualProgressID int `json:"visualProgressId" v:"required" dc:"形象进度ID"` + Comment string `json:"comment" v:"required" dc:"评论的内容"` + UserID int `json:"userId" v:"required" dc:"评论的用户ID"` +} + +// 查看某个形象进度的评论列表 +type ListRemarksReq struct { + g.Meta `path:"/remark/list" method:"get" tags:"APP(形象进度评论相关)" summary:"查看某个形象进度的评论列表"` + VisualID int64 `json:"visualID" v:"required" dc:"形象进度ID"` +} + +// 获取形象进度评论详细信息 +type GetRemarkDetailReq struct { + g.Meta `path:"/remark/detail" method:"get" tags:"APP(形象进度评论相关)" summary:"获取形象进度评论详细信息"` + ID int64 `json:"id" v:"required" dc:"备注ID"` +} + +// 更新形象进度评论 +type UpdateRemarkReq struct { + g.Meta `path:"/remark/update" method:"post" tags:"APP(形象进度评论相关)" summary:"更新形象进度评论"` + ID int `json:"id" v:"required" dc:"主键ID"` + VisualProgressID int `json:"visualProgressId" dc:"形象进度ID"` + Comment string `json:"comment" dc:"评论的内容"` + UserID int `json:"userId" dc:"评论的用户ID"` +} + +// 删除形象进度评论 +type DeleteRemarkReq struct { + g.Meta `path:"/remark/delete" method:"delete" tags:"APP(形象进度评论相关)" summary:"删除形象进度评论"` + ID int `json:"id" v:"required" dc:"主键ID"` +} diff --git a/api/app/visual_remark/res.go b/api/app/visual_remark/res.go new file mode 100644 index 0000000..4d955d6 --- /dev/null +++ b/api/app/visual_remark/res.go @@ -0,0 +1,31 @@ +package visual_remark + +// 查看某个形象进度的评论列表 +type ListRemarksRes struct { + VisualProgressRemarks []VisualProgressRemark `json:"visualProgressRemarks"` +} + +type VisualProgressRemark struct { + ID int `json:"id"` + Username string `json:"username"` + Avatar string `json:"avatar"` + VisualProgressID int `json:"visualProgressId"` + VisualProgressTitle string `json:"visualProgressTitle"` + Comment string `json:"comment"` + UserID int `json:"userId"` + CreatedAt string `json:"createdAt"` +} + +// 查看形象进度评论详细信息 +type GetRemarkDetailRes struct { + VisualProgressRemark +} + +// 新增形象进度评论 +type CreateRemarkRes struct{} + +// 更新形象进度评论 +type UpdateRemarkRes struct{} + +// 删除形象进度评论 +type DeleteRemarkRes struct{} diff --git a/api/app/visual_remark/service.go b/api/app/visual_remark/service.go new file mode 100644 index 0000000..6507f60 --- /dev/null +++ b/api/app/visual_remark/service.go @@ -0,0 +1,115 @@ +package visual_remark + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +// 列表请求 +func (v VisualRemark) ListRemarks(ctx context.Context, req *ListRemarksReq) (res *ListRemarksRes, err error) { + + res = &ListRemarksRes{} + err = g.Model("visual_progress_remark AS remark").Ctx(ctx). + Fields("remark.*,visual.title AS visualProgressTitle, user.user_nickname AS Username, cuser.head_icon AS Avatar"). + // 连表查询形象进度表得到形象进度标题 + LeftJoin("visual_progress AS visual", "visual.id = remark.visual_progress_id"). + // 连表查询评论人的名字(暂未确定是哪张用户表,需要联查) + LeftJoin("sys_user AS user on user.id = remark.user_id"). + // 头像需要从另外一张表查询出来 + LeftJoin("bus_construction_user AS cuser on cuser.phone = user.mobile"). + Where("visual.id = ? AND cuser.deleted_at is null", req.VisualID). + Scan(&res.VisualProgressRemarks) + + g.Dump(res.VisualProgressRemarks) + if err != nil { + return nil, err + } + return res, nil +} + +// 获取详情 +func (v VisualRemark) GetRemarkDetail(ctx context.Context, req *GetRemarkDetailReq) (res *GetRemarkDetailRes, err error) { + res = &GetRemarkDetailRes{} + err = g.Model("visual_progress_remark AS remark").Ctx(ctx). + Fields("remark.*,visual.title AS visualProgressTitle, user.user_nickname AS Username, user.avatar AS Avatar"). + // 连表查询形象进度表得到形象进度标题 + LeftJoin("visual_progress AS visual on visual.id = remark.visual_progress_id"). + // 连表查询评论人的名字 + LeftJoin("sys_user AS user on user.id = remark.user_id"). + Where("remark.id = ? AND cuser.deleted_at is null", req.ID). + Scan(&res.VisualProgressRemark) + if err != nil { + return nil, err + } + return res, nil +} + +// 新增形象进度 +func (v VisualRemark) CreateRemark(ctx context.Context, req *CreateRemarkReq) (res *CreateRemarkRes, err error) { + res = &CreateRemarkRes{} + _, err = g.Model("visual_progress_remark").Ctx(ctx).Data(g.Map{ + "visual_progress_id": req.VisualProgressID, + "comment": req.Comment, + "user_id": req.UserID, + }).Insert() + if err != nil { + return nil, err + } + + var VisualProgressVo struct { + ProjectId int `json:"projectId"` + ReporterId int `json:"reporterId"` + } + // 根据形象进度ID查询项目ID、发布者ID + g.Model("visual_progress").Fields("project_id AS ProjectId", "reporter_id AS ReporterId"). + Where("id", req.VisualProgressID).Scan(&VisualProgressVo) + + // 新增之后通知对应的发起人 + param := &system.CommentListAddReq{ + ProjectId: VisualProgressVo.ProjectId, + Receiver: VisualProgressVo.ReporterId, + Content: req.Comment, + Sender: req.UserID, + } + service.CommentList().Add(ctx, param) + return res, nil +} + +// 更新形象备注 +func (v VisualRemark) UpdateRemark(ctx context.Context, req *UpdateRemarkReq) (res *UpdateRemarkRes, err error) { + res = &UpdateRemarkRes{} + _, err = g.Model("visual_progress_remark").Ctx(ctx).Data(g.Map{ + "visual_progress_id": req.VisualProgressID, + "comment": req.Comment, + "user_id": req.UserID, + }).Where("id", req.ID).Update() + if err != nil { + return nil, err + } + return res, nil +} + +// 删除形象备注 +func (v VisualRemark) DeleteRemark(ctx context.Context, req *DeleteRemarkReq) (res *DeleteRemarkRes, err error) { + userID := ct.New().GetUserId(ctx) + var VisualProgressRemarkVo struct { + ID int `json:"id"` + UserID uint64 `json:"userId"` + } + g.Model("visual_progress_remark").Ctx(ctx).Where("id", req.ID).Scan(&VisualProgressRemarkVo) + // 当前用户等于评论的发起人才可以删除自己的评论 + if userID == VisualProgressRemarkVo.UserID { + res = &DeleteRemarkRes{} + _, err = g.Model("visual_progress_remark").Ctx(ctx).Where("id", req.ID).Delete() + if err != nil { + return nil, err + } + } else { + return nil, errors.New("只能删除自己的评论信息") + } + return +} diff --git a/api/app/visual_remark/visual_remark.go b/api/app/visual_remark/visual_remark.go new file mode 100644 index 0000000..dc710b1 --- /dev/null +++ b/api/app/visual_remark/visual_remark.go @@ -0,0 +1,4 @@ +package visual_remark + +type VisualRemark struct { +} diff --git a/api/attendanceMachine/req.go b/api/attendanceMachine/req.go new file mode 100644 index 0000000..a23a536 --- /dev/null +++ b/api/attendanceMachine/req.go @@ -0,0 +1,30 @@ +package attendanceMachine + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" +) + +type EquipmentTimeClockReq struct { + g.Meta `path:"/face" tags:"考勤机" method:"post" summary:"设备考勤打卡"` + commonApi.Author + Sn string `p:"sn"` + Count int `json:"Count"` + Logs []Log `json:"logs"` +} + +type Log struct { + UserID string `json:"user_id"` + RecogType string `json:"recog_type"` + RecogTime string `json:"recog_time"` + Photo string `json:"photo"` + Location struct { + Longitude string `json:"longitude"` + Latitude string `json:"latitude"` + } `json:"location"` +} + +type EquipmentTimeClockRes struct { + Result string `json:"Result"` + Msg string `json:"Msg"` +} diff --git a/api/attendanceMachine/router.go b/api/attendanceMachine/router.go new file mode 100644 index 0000000..2848db4 --- /dev/null +++ b/api/attendanceMachine/router.go @@ -0,0 +1,15 @@ +package attendanceMachine + +import "github.com/gogf/gf/v2/net/ghttp" + +type AttendanceMachineApi struct { +} + +func InitAttendanceMachineAPI(group *ghttp.RouterGroup) { + group.Middleware(ghttp.MiddlewareCORS) + group.Group("/", func(group *ghttp.RouterGroup) { + group.Group("/api/v1/record", func(group *ghttp.RouterGroup) { + group.Bind(new(AttendanceMachineApi)) + }) + }) +} diff --git a/api/attendanceMachine/service.go b/api/attendanceMachine/service.go new file mode 100644 index 0000000..7359ff9 --- /dev/null +++ b/api/attendanceMachine/service.go @@ -0,0 +1,308 @@ +// @Author cory 2025/3/5 10:27:00 +package attendanceMachine + +import ( + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + wxDao "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + wxBusAttendance "github.com/tiger1103/gfast/v3/internal/app/wxApplet/logic/busAttendance" + wxModel "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" + wxDo "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model/do" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" + "golang.org/x/net/context" + "io/ioutil" + "math" + "net/url" + "os" + "path/filepath" + "strconv" + "strings" + "time" +) + +func (w AttendanceMachineApi) TaskCreate(ctx context.Context, req *EquipmentTimeClockReq) (res *EquipmentTimeClockRes, err error) { + res = new(EquipmentTimeClockRes) + err = AttendanceMachine(ctx, req) + res.Result = "0" + res.Msg = "" + + r := ghttp.RequestFromCtx(ctx) + r.Response.ClearBuffer() + r.Response.WriteJson(res) + return +} + +func AttendanceMachine(ctx context.Context, req *EquipmentTimeClockReq) (err error) { + logs := req.Logs[0] + f1 := logs.Location.Longitude + f2 := logs.Location.Latitude + res, err := wxBusAttendance.ThisInverseGeocodingFunc(f1 + "," + f2) + liberr.ErrIsNil(ctx, err) + // 上次打卡距离此次打卡不超过3分支,那么提示“你刚刚已打上/下班卡了哦!” + currentTime := time.Now() + date := tool.New().GetFormattedDate(currentTime) + var bair *wxModel.BusAttendanceInfoRes + err = wxDao.BusAttendance.Ctx(ctx). + Where("openid", logs.UserID). + Where("printing_date", date). + Fields("clock_on,commuter").OrderDesc("clock_on").Limit().Scan(&bair) + liberr.ErrIsNil(ctx, err, "打卡失败!") + if err == nil && bair != nil { + //判断t1和t2是否相差180秒,如果小于180秒就直接return + flag, err := IsWithinThreeMinutes(currentTime, bair.ClockOn) + if err != nil { + return err + } + if flag { + txt := "" + if bair.Commuter == "1" { + txt = "您已上班打卡成功!杜绝重复打卡!" + } else { + txt = "您已下班打卡成功!杜绝重复打卡!" + } + err = errors.New(txt) + return err + } + } + lng, err := strconv.ParseFloat(f1, 64) + if err != nil { + err = errors.New("精准度转换错误!") + return + } + lat, err := strconv.ParseFloat(f2, 64) + if err != nil { + err = errors.New("纬度转换错误!") + return + } + lng, lat = coryCommon.GCJ02toWGS84(lng, lat) + // 0-0、判断是否开启打卡功能 (禁止打卡和离职都不允许打卡) + var userInfo *wxModel.BusConstructionUserInfoRes + err = dao.BusConstructionUser.Ctx(ctx).Where("openid", logs.UserID).Scan(&userInfo) + if userInfo.TeamId == 0 { + err = errors.New("当前用户暂无班组,无法打卡!") + return + } + + // 查看当前用户的打卡时间是否请假,如果请假就提示不用打卡 + count, err := wxDao.BusAskforleave.Ctx(ctx). + Where(wxDao.BusAskforleave.Columns().ProjectId, userInfo.ProjectId). + Where(wxDao.BusAskforleave.Columns().Openid, userInfo.Openid). + Where("(" + + "DATE_FORMAT(" + date + ",'%Y-%m-%d') BETWEEN DATE_FORMAT(start_time,'%Y-%m-%d') AND DATE_FORMAT(end_time,'%Y-%m-%d')" + + " or " + + "DATE_FORMAT(" + date + ",'%Y-%m-%d') BETWEEN DATE_FORMAT(start_time,'%Y-%m-%d') AND DATE_FORMAT(end_time,'%Y-%m-%d')" + + ")").Count() + liberr.ErrIsNil(ctx, err) + if count > 0 { + liberr.ErrIsNil(ctx, errors.New("您已请假,无需打卡!")) + return + } + + // 部分班组可以直接跳过在范围内打卡,获取当前用户班组,看看是否是可以在任何地点打卡 + value, errvalue := wxDao.SysProjectTeam.Ctx(ctx).Where("id", userInfo.TeamId).Fields("is_clock_in").Value() + if errvalue != nil { + err = errors.New("获取班组打卡状态失败!") + return err + } + if value.String() == "2" { + goto breakHere + } + // 计算是否在打卡范围中 + if true { + // 查询当前用户是否有加入班组,有的话看看是什么项目,再根据项目获取到方正,最后根据方正数据得出打卡范围 + projectId, _ := wxDao.SysProjectTeamMember.Ctx(ctx).As("a"). + LeftJoin("sys_project_team as b on a.team_id = b.id"). + Fields("a.project_id"). + Where("a.openid", logs.UserID).Value() + if projectId != nil { + var qf []*wxBusAttendance.ProjectPunchRangeRes + err = g.DB().Model("sys_project_punch_range").Where("project_id", projectId).Fields("punch_range").Scan(&qf) + if err != nil { + err = errors.New("系统错误,请联系管理员!") + return err + } + if len(qf) == 0 { + err = errors.New("未设置打卡范围!请联系管理员设置!") + return err + } + countI := len(qf) + countII := 0 + for _, dakaStr := range qf { + countII = countII + 1 + var dataInfo coryCommon.DetailedMap + err = json.Unmarshal([]byte(fmt.Sprint(dakaStr.PunchRange)), &dataInfo.Positions) + flag := coryCommon.RectangularFrameRange(dataInfo, lng, lat) + if flag { + goto breakHere + } else { + // 没有一次范围匹配上,那就直接返回 + if countII == countI { + err = errors.New("不在范围内,打卡无效!") + return err + } + } + } + } else { + err = errors.New("未指定打卡范围,请联系管理员!") + return err + } + } +breakHere: + if userInfo.Status == "1" { + err = errors.New("已离职,请联系管理员!") + return + } + if userInfo.Clock == "2" { + err = errors.New("已禁止打卡,请联系管理员!") + return + } + + if len(strings.Trim(userInfo.LeaveDate.String(), "")) != 0 { + err = errors.New("已退场,请联系管理员!") + return + } + clockStatus := "" + // 1、获取当日时间 + // 2、查询今日打卡记录 + gm := wxDao.BusAttendance.Ctx(ctx). + Where(wxDao.BusAttendance.Columns().Openid, logs.UserID). + Where(wxDao.BusAttendance.Columns().PrintingDate, date) + // 3、如果有判断是否打了上班卡,如果没有就打上班卡 + count1, _ := gm.Where("commuter", "1").Count() + if count1 == 0 { + // 打上班卡 + clockStatus = "1" + } + // 4、如果有判断是否打了下班卡,如果没有就打下班卡 + count2, _ := gm.Where("commuter", "2").Count() + if clockStatus == "" && count2 == 0 { + // 打下班卡 + clockStatus = "2" + } + // 5、上下班卡都打了,那么就提示今日打卡完成 + if count1 != 0 && count2 != 0 { + // 已完成当日打卡 + err = errors.New("当日打卡已完成!") + return err + } + + // 提交数据 + name := userInfo.NickName + if userInfo.UserName != "" { + name = userInfo.UserName + } + + // 将base64人脸换成图片存储到本地 + imagePath, err := DecodeBase64Image(logs.Photo) + if err != nil { + return err + } + rpath := coryCommon.ResourcePublicToFunc(imagePath, 1) + + attendance := wxDo.BusAttendance{ + PacePhoto: rpath, + UserName: name, + ProjectId: userInfo.ProjectId, + Openid: userInfo.Openid, + Commuter: clockStatus, + Lng: lng, + Lat: lat, + PrintingDate: date, + } + // 判断此次打卡状态 默认就为缺勤 + dateTime := tool.New().GetFormattedDateTime(time.Now()) + if userInfo.ProjectId > 0 { + value, err := dao.SysProject.Ctx(ctx).WherePri(userInfo.ProjectId).Fields("punch_range as punchRange").Value() + if err != nil { + err = errors.New("获取项目打卡范围失败!") + } + split := strings.Split(value.String(), ",") + strType := tool.New().TimeWithin(dateTime, split[0], split[1], clockStatus) + attendance.IsPinch = strType + attendance.PunchRange = value.String() // 记录项目的打卡时间,保留字段,后期有大用 + } + // 获取此次打卡的日薪 + vl, err := dao.BusConstructionUser.Ctx(ctx).As("a"). + LeftJoin("bus_type_of_wage as f on a.type_of_work = f.type_of_work"). + Fields("if (a.salary>0, a.salary,f.standard) as salary"). + Where("a.openid", logs.UserID).Value() + liberr.ErrIsNil(ctx, err, "获取薪资失败") + // 记录打卡时间(上下班打卡时间统一用clock_on) + attendance.ClockOn = dateTime + attendance.DailyWage = vl + attendance.Lng = lng + attendance.Lat = lat + attendance.Location = res.Regeocode.FormattedAddress + _, err = wxDao.BusAttendance.Ctx(ctx).Insert(attendance) + liberr.ErrIsNil(ctx, err, "添加失败") + return +} + +// DecodeBase64Image 函数用于解码 Base64 编码的图片数据并保存为图片 +func DecodeBase64Image(encodedStr string) (string, error) { + // 进行 URL 解码 + decodedURLStr, err := url.QueryUnescape(encodedStr) + if err != nil { + return "", fmt.Errorf("URL 解码失败: %w", err) + } + + // 提取真正的 Base64 数据 + parts := strings.SplitN(decodedURLStr, ",", 2) + if len(parts) != 2 { + return "", fmt.Errorf("无效的 Base64 编码图片数据格式") + } + base64Data := parts[1] + + // 进行 Base64 解码 + decodedData, err := base64.StdEncoding.DecodeString(base64Data) + if err != nil { + return "", fmt.Errorf("Base64 解码失败: %w", err) + } + + ht := coryCommon.Helmet + str := coryCommon.Ynr(ht) + fn := coryCommon.FileName("face") + dir, err := os.Getwd() + str = dir + "/" + str + fn + ".jpg" + str = filepath.ToSlash(str) + + // 保存解码后的图片到文件 + err = ioutil.WriteFile(str, decodedData, 0644) + if err != nil { + fmt.Println("保存图片文件出错:", err) + return "", fmt.Errorf("保存解码后的图片失败: %w", err) + } + return str, nil +} + +// 判断两个时间是否相差超过 3 分钟 +func isMinutesDifferenceGreaterThanThree(startTime, endTime time.Time) bool { + // 计算时间差(单位:秒) + diff := endTime.Sub(startTime).Seconds() + + // 判断是否超过 180 秒(3 分钟) + return diff > 180 +} + +// 判断两个时间的秒数差是否 <= 180 秒 +func IsWithinThreeMinutes(currentTime time.Time, strTime string) (bool, error) { + // 解析字符串时间,使用本地时区 + loc, _ := time.LoadLocation("Local") // 获取本地时区 + parsedTime, err := time.ParseInLocation("2006-01-02 15:04:05", strTime, loc) + if err != nil { + fmt.Println("时间解析错误:", err) + return false, err + } + // 计算时间差(秒) + diff := math.Abs(currentTime.Sub(parsedTime).Seconds()) + + // 判断是否相差 180 秒 + return diff <= 180, nil +} diff --git a/api/constant/video_hat.go b/api/constant/video_hat.go new file mode 100644 index 0000000..5ed37dd --- /dev/null +++ b/api/constant/video_hat.go @@ -0,0 +1,15 @@ +package constant + +import "github.com/gorilla/websocket" + +var Url string = "wss://caps.runde.pro/wss" + +const ( + Username = "重庆远界大数据" + Password = "Cqyj123`" + AdminId = "12316" + BatteryLevel = 20 // 电池电量 +) + +var Token = "" +var Conn *websocket.Conn = nil diff --git a/api/hwy/client/client.go b/api/hwy/client/client.go new file mode 100644 index 0000000..3f78b94 --- /dev/null +++ b/api/hwy/client/client.go @@ -0,0 +1,48 @@ +package client + +import ( + "bytes" + "encoding/json" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gctx" + "github.com/tiger1103/gfast/v3/api/hwy/sign" + "io/ioutil" + "net/http" + "net/url" +) + +// 封装 Get 请求 +func Get(uri string, params map[string]string) (error, []byte) { + joinPath, _ := url.JoinPath(sign.HOST, uri) + url := joinPath + "?" + sign.CreateLinkString(params) + response, err := g.Client().ContentJson().Get(gctx.New(), url) + if err != nil { + return err, []byte{} + } + bt := response.ReadAll() + return nil, bt +} + +// 封装 Post 请求 +func Post(uri string, params map[string]string) (error, []byte) { + // 把 map 转为 json + jsonData, err := json.Marshal(params) + if err != nil { + return err, nil + } + + // 使用http包发送POST请求 + response, err := http.Post(sign.HOST+uri, "application/json", bytes.NewBuffer(jsonData)) + if err != nil { + return err, nil + } + defer response.Body.Close() + + // 读取响应体 + body, err := ioutil.ReadAll(response.Body) + if err != nil { + return err, nil + } + + return nil, body +} diff --git a/api/hwy/detail/detail.go b/api/hwy/detail/detail.go new file mode 100644 index 0000000..d01990c --- /dev/null +++ b/api/hwy/detail/detail.go @@ -0,0 +1,74 @@ +package detail + +type Pub struct { + Code int `json:"code"` + Message string `json:"message"` + Obj struct { + } `json:"obj"` + Success bool `json:"success"` + Timestamp int `json:"timestamp"` +} + +/*逆变器设备详情*/ +type EquipmentDetail struct { + DivertorId string `json:"divertorId"` + DivertorName string `json:"divertorName"` + EquipmentName string `json:"equipmentName"` + EquipmentPn string `json:"equipmentPn"` + EquipmentSn string `json:"equipmentSn"` + Id string `json:"id"` + Kwp float64 `json:"kwp"` + MonKwh float64 `json:"monKwh"` + NowKw float64 `json:"nowKw"` + ParamDcacCode string `json:"paramDcacCode"` + ParamDcdcCode string `json:"paramDcdcCode"` + PowerPlantId string `json:"powerPlantId"` + PowerPlantName string `json:"powerPlantName"` + RatedPower float64 `json:"ratedPower"` + SoftDcacCode string `json:"softDcacCode"` + SoftDcdcCode string `json:"softDcdcCode"` + Status int `json:"status"` + SumKwh float64 `json:"sumKwh"` + TodayKwh float64 `json:"todayKwh"` + UpdateTime string `json:"updateTime"` + UserId string `json:"userId"` + UserName string `json:"userName"` + YearKwh float64 `json:"yearKwh"` +} + +/*电站详情*/ +type PlantDetail struct { + Address string `json:"address"` + City string `json:"city"` + CompanyId string `json:"companyId"` + CompanyName string `json:"companyName"` + DipAngle float64 `json:"dipAngle"` + District string `json:"district"` + Id string `json:"id"` + Kwp float64 `json:"kwp"` + Latitude string `json:"latitude"` + Longitude string `json:"longitude"` + MonKwh float64 `json:"monKwh"` + Name string `json:"name"` + NetworkTime string `json:"networkTime"` + NetworkType string `json:"networkType"` + NowKw float64 `json:"nowKw"` + OrientationAngle float64 `json:"orientationAngle"` + OwnerId string `json:"ownerId"` + OwnerName string `json:"ownerName"` + PaymentType string `json:"paymentType"` + PlantContact string `json:"plantContact"` + PlantContactPhone string `json:"plantContactPhone"` + PlantImg string `json:"plantImg"` + PowerPlantType string `json:"powerPlantType"` + Province string `json:"province"` + Remark string `json:"remark"` + ServiceProviderName string `json:"serviceProviderName"` + ServiceProviderPhone string `json:"serviceProviderPhone"` + Status int `json:"status"` + SubassemblyNumber int `json:"subassemblyNumber"` + SumKwh float64 `json:"sumKwh"` + TodayKwh float64 `json:"todayKwh"` + UpdateTime string `json:"updateTime"` + YearKwh float64 `json:"yearKwh"` +} diff --git a/api/hwy/equipment/equipment.go b/api/hwy/equipment/equipment.go new file mode 100644 index 0000000..845052a --- /dev/null +++ b/api/hwy/equipment/equipment.go @@ -0,0 +1,335 @@ +package equipment + +import ( + "context" + "encoding/json" + "strconv" + + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/hwy/client" + "github.com/tiger1103/gfast/v3/api/hwy/sign" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +type EquipmentApi struct{} + +// 从数据库中获取逆变器列表 +type EquipmentListQueryReq struct { + g.Meta `path:"/equipment/query" method:"get" tags:"禾望云相关" summary:"从数据库中获取逆变器列表【实时数据不一样准确】"` + PageNum int `json:"pageNum" dc:"分页数" v:"required"` + PageSize int `json:"pageSize" dc:"分页大小" v:"required"` +} + +func (e EquipmentApi) GetEquipmentListFromDB(ctx context.Context, req *EquipmentListQueryReq) (res *EquipmentListQueryRes, err error) { + res = new(EquipmentListQueryRes) + err = g.Try(ctx, func(ctx context.Context) { + // 从数据库中查询逆变器列表 + m := dao.Equipment.Ctx(ctx).WithAll() + + res.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + + if req.PageNum == 0 { + req.PageNum = 1 + } + + res.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = 10 + } + + err = m.Page(req.PageNum, req.PageSize).Scan(&res.List) + liberr.ErrIsNil(ctx, err, "获取逆变器列表失败") + }) + + return res, err +} + +// 禾望云逆变器列表请求 +type EquipmentListReq struct { + g.Meta `path:"/equipment/list" method:"get" tags:"禾望云相关" summary:"从平台获取逆变器列表【实时数据准确】"` + PageNum int `json:"pageNum" dc:"分页数" v:"required"` + PageSize int `json:"pageSize" dc:"分页大小" v:"required"` + PlantId int `json:"plantId" dc:"电站ID" v:"required"` +} + +func (e EquipmentApi) GetEquipmentListAndSave(ctx context.Context, req *EquipmentListReq) (res *EquipmentListRes, err error) { + res = new(EquipmentListRes) + data := make(map[string]string) + data["pageIndex"] = strconv.Itoa(req.PageNum) + data["pageSize"] = strconv.Itoa(req.PageSize) + data["plantId"] = strconv.Itoa(req.PlantId) + sign.SignByRSA(data) + err, bytes := client.Get("/openApi/equipment/getEquipmentListByPlantId", data) + if err != nil { + return res, err + } + err = json.Unmarshal(bytes, &res) + if err != nil { + return res, err + } + + // 处理响应并存储数据 + model := g.Model("equipment") + for _, record := range res.Result.Records { + _, err = model.Data(map[string]interface{}{ + "plantId": req.PlantId, + "divertorId": record.DivertorId, + "divertorName": record.DivertorName, + "equipmentName": record.EquipmentName, + "equipmentPn": record.EquipmentPn, + "equipmentSn": record.EquipmentSn, + "id": record.Id, + "kwp": record.Kwp, + "monKwh": record.MonKwh, + "nowKw": record.NowKw, + "paramDcacCode": record.ParamDcacCode, + "paramDcdcCode": record.ParamDcdcCode, + "powerPlantId": record.PowerPlantId, // 确保这个字段已经是字符串,或者在数据库中正确处理类型转换 + "powerPlantName": record.PowerPlantName, + "ratedPower": record.RatedPower, + "softDcacCode": record.SoftDcacCode, + "softDcdcCode": record.SoftDcdcCode, + "status": record.Status, + "sumKwh": record.SumKwh, + "todayKwh": record.TodayKwh, + "updateTime": record.UpdateTime, // 确保转换为适合数据库的日期时间格式 + "userId": record.UserId, + "userName": record.UserName, + "yearKwh": record.YearKwh, + }).Save() + if err != nil { + return res, err + } + } + + return res, nil +} + +// 获取逆变器详情 +type EquipmentDetailReq struct { + g.Meta `path:"/equipment/detail" method:"get" tags:"禾望云相关" summary:"获取逆变器详情"` + Id string `json:"id" dc:"逆变器ID" v:"required"` + Sn string `json:"sn" dc:"逆变器SN" v:"required"` +} + +func (e EquipmentApi) EquipmentDetail(ctx context.Context, req *EquipmentDetailReq) (res *EquipmentDetailRes, err error) { + res = new(EquipmentDetailRes) + data := make(map[string]string) + data["id"] = req.Id + data["sn"] = req.Sn + sign.SignByRSA(data) + err, bytes := client.Get("/openApi/equipment/getEquipmentDetail", data) + if err != nil { + return res, err + } + + err = json.Unmarshal(bytes, &res) + + var Address struct { + PlantAddress string `json:"plantAddress"` + } + + name := res.Result.PowerPlantName + g.Model("plant").Fields("address AS plantAddress").Where("name = ?", name).Scan(&Address) + + res.PlantAddress = Address.PlantAddress + return res, nil +} + +// 获取逆变器实时数据 +type EquipmentRealDataReq struct { + g.Meta `path:"/equipment/real/data" method:"get" tags:"禾望云相关" summary:"获取逆变器实时数据"` + Id string `json:"id" dc:"逆变器ID" v:"required"` + Sn string `json:"sn" dc:"逆变器SN" v:"required"` +} + +func (e EquipmentApi) EquipmentRealData(ctx context.Context, req *EquipmentRealDataReq) (res *EquipmentRealDataRes, err error) { + res = new(EquipmentRealDataRes) + data := make(map[string]string) + data["id"] = req.Id + data["sn"] = req.Sn + sign.SignByRSA(data) + err, bytes := client.Get("/openApi/equipment/getEquipmentData", data) + g.Dump(string(bytes)) + if err != nil { + return res, err + } + err = json.Unmarshal(bytes, &res) + return res, nil +} + +// 获取逆变器历史数据 +type EquipmentHistoryReq struct { + g.Meta `path:"/equipment/history" method:"get" tags:"禾望云相关" summary:"获取逆变器历史数据"` + Time string `json:"time" dc:"日期字符 yyyy-MM-dd" v:"required"` + Id string `json:"id" dc:"逆变器ID" v:"required"` + Sn string `json:"sn" dc:"逆变器SN" v:"required"` +} + +func (e EquipmentApi) EquipmentHistory(ctx context.Context, req *EquipmentHistoryReq) (*EquipmentHistoryRes, error) { + res := new(EquipmentHistoryRes) + data := map[string]string{ + "id": req.Id, + "sn": req.Sn, + "time": req.Time, + } + sign.SignByRSA(data) + err, bytes := client.Get("/openApi/equipment/getEquipmentHistoryData", data) + if err != nil { + return res, err + } + + err = json.Unmarshal(bytes, &res) + if err != nil { + return res, err + } + + requiredKeys := map[string]bool{ + "ACActivePower": true, + "ACReactivePower": true, + "DCInputPower": true, + "internalTemperature": true, + "gridFrequency": true, + "dayElectricity": true, + "inverterEfficiency": true, + } + + for i := range res.Result { + var filteredParams []struct { + Key string `json:"key"` + Name string `json:"name"` + Unit string `json:"unit"` + Value interface{} `json:"value"` + } + for _, param := range res.Result[i].ParamList { + if _, ok := requiredKeys[param.Key]; ok { + filteredParams = append(filteredParams, param) + } + } + res.Result[i].ParamList = filteredParams + } + + return res, nil +} + +// 获取逆变器日统计数据 +type EquipmentStaticDayReq struct { + g.Meta `path:"/equipment/static/day" method:"get" tags:"禾望云相关" summary:"获取逆变器日统计数据"` + StartTime string `json:"startTime" dc:"开始日期字符 yyyy-MM-dd" v:"required"` + EndTime string `json:"endTime" dc:"开始日期字符 yyyy-MM-dd" v:"required"` + Id string `json:"id" dc:"逆变器ID" v:"required"` + Sn string `json:"sn" dc:"逆变器SN" v:"required"` +} + +func (e EquipmentApi) EquipmentStaticDay(ctx context.Context, req *EquipmentStaticDayReq) (res *EquipmentStaticDayRes, err error) { + res = new(EquipmentStaticDayRes) + data := make(map[string]string) + data["id"] = req.Id + data["sn"] = req.Sn + data["startTime"] = req.StartTime + data["endTime"] = req.EndTime + sign.SignByRSA(data) + err, bytes := client.Get("/openApi/equipment/getEquipmentDayStatisticsData", data) + if err != nil { + return res, err + } + err = json.Unmarshal(bytes, &res) + return res, nil +} + +// 获取逆变器月统计数据 +type EquipmentStaticMonthReq struct { + g.Meta `path:"/equipment/static/month" method:"get" tags:"禾望云相关" summary:"获取逆变器月统计数据"` + StartTime string `json:"startTime" dc:"开始日期字符 yyyy-MM" v:"required"` + EndTime string `json:"endTime" dc:"开始日期字符 yyyy-MM" v:"required"` + Id string `json:"id" dc:"逆变器ID" v:"required"` + Sn string `json:"sn" dc:"逆变器SN" v:"required"` +} + +func (e EquipmentApi) EquipmentStaticMonth(ctx context.Context, req *EquipmentStaticMonthReq) (res *EquipmentStaticMonthRes, err error) { + res = new(EquipmentStaticMonthRes) + data := make(map[string]string) + data["id"] = req.Id + data["sn"] = req.Sn + data["startTime"] = req.StartTime + data["endTime"] = req.EndTime + sign.SignByRSA(data) + err, bytes := client.Get("/openApi/equipment/getEquipmentMonthStatisticsData", data) + if err != nil { + return res, err + } + err = json.Unmarshal(bytes, &res) + return res, nil +} + +// 获取逆变器年统计数据 +type EquipmentStaticYearReq struct { + g.Meta `path:"/equipment/static/year" method:"get" tags:"禾望云相关" summary:"获取逆变器年统计数据"` + StartTime string `json:"startTime" dc:"开始日期字符 yyyy" v:"required"` + EndTime string `json:"endTime" dc:"开始日期字符 yyyy" v:"required"` + Id string `json:"id" dc:"逆变器ID" v:"required"` + Sn string `json:"sn" dc:"逆变器SN" v:"required"` +} + +func (e EquipmentApi) EquipmentStaticYear(ctx context.Context, req *EquipmentStaticYearReq) (res *EquipmentStaticYearRes, err error) { + res = new(EquipmentStaticYearRes) + data := make(map[string]string) + data["id"] = req.Id + data["sn"] = req.Sn + data["startTime"] = req.StartTime + data["endTime"] = req.EndTime + sign.SignByRSA(data) + err, bytes := client.Get("/openApi/equipment/getEquipmentYearStatisticsData", data) + if err != nil { + return res, err + } + err = json.Unmarshal(bytes, &res) + return res, nil +} + +// 获取逆变器报警列表数据 +type EquipmentAlarmListReq struct { + g.Meta `path:"/equipment/alarm/list" method:"get" tags:"禾望云相关" summary:"获取逆变器报警数据列表"` + StartTime string `json:"startTime" dc:"开始日期字符 yyyy-MM-dd" v:"required"` + EndTime string `json:"endTime" dc:"开始日期字符 yyyy-MM-dd" v:"required"` + Pn string `json:"pn" dc:"逆变器PN" v:"required"` + Sn string `json:"sn" dc:"逆变器SN" v:"required"` +} + +func (e EquipmentApi) EquipmentAlarmList(ctx context.Context, req *EquipmentAlarmListReq) (res *EquipmentAlarmListRes, err error) { + res = new(EquipmentAlarmListRes) + data := make(map[string]string) + data["pn"] = req.Pn + data["sn"] = req.Sn + data["startTime"] = req.StartTime + data["endTime"] = req.EndTime + sign.SignByRSA(data) + err, bytes := client.Get("/openApi/equipment/getEquipmentFaultData", data) + if err != nil { + return res, err + } + err = json.Unmarshal(bytes, &res) + return res, nil +} + +// 获取逆变器报警相关数据 +type EquipmentAlarmDetailDataReq struct { + g.Meta `path:"/equipment/alarm/detail" method:"get" tags:"禾望云相关" summary:"获取逆变器报警数据详情"` + AlarmId string `json:"alarmId" dc:"报警ID" v:"required"` +} + +// 获取设备报警详情数据 +func (e EquipmentApi) EquipmentAlarmDetailData(ctx context.Context, req *EquipmentAlarmDetailDataReq) (res *EquipmentAlarmDetailDataRes, err error) { + res = new(EquipmentAlarmDetailDataRes) + data := make(map[string]string) + data["alarmId"] = req.AlarmId + sign.SignByRSA(data) + err, bytes := client.Post("openApi/equipment/getAlarmDetailDataById", data) + if err != nil { + return res, err + } + err = json.Unmarshal(bytes, &res) + return res, nil +} diff --git a/api/hwy/equipment/res.go b/api/hwy/equipment/res.go new file mode 100644 index 0000000..df75b54 --- /dev/null +++ b/api/hwy/equipment/res.go @@ -0,0 +1,296 @@ +package equipment + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +// 逆变器列表响应 +type EquipmentListRes struct { + Code int `json:"code"` + Message string `json:"message"` + Obj struct{} `json:"obj"` + Result struct { + Page struct { + PageIndex int `json:"pageIndex"` + PageSize int `json:"pageSize"` + Total int `json:"total"` + } `json:"page"` + Records []struct { + DivertorId string `json:"divertorId"` + DivertorName string `json:"divertorName"` + EquipmentName string `json:"equipmentName"` + EquipmentPn string `json:"equipmentPn"` + EquipmentSn string `json:"equipmentSn"` + Id string `json:"id"` + Kwp float64 `json:"kwp"` + MonKwh float64 `json:"monKwh"` + NowKw float64 `json:"nowKw"` + ParamDcacCode string `json:"paramDcacCode"` + ParamDcdcCode string `json:"paramDcdcCode"` + PowerPlantId string `json:"powerPlantId"` + PowerPlantName string `json:"powerPlantName"` + RatedPower float64 `json:"ratedPower"` + SoftDcacCode string `json:"softDcacCode"` + SoftDcdcCode string `json:"softDcdcCode"` + Status int `json:"status"` + SumKwh float64 `json:"sumKwh"` + TodayKwh float64 `json:"todayKwh"` + UpdateTime string `json:"updateTime"` + UserId string `json:"userId"` + UserName string `json:"userName"` + YearKwh float64 `json:"yearKwh"` + } `json:"records"` + Statistics struct { + AlarmNumber int `json:"alarmNumber"` + OfflineNumber int `json:"offlineNumber"` + OnlineNumber int `json:"onlineNumber"` + SumNumber int `json:"sumNumber"` + } `json:"statistics"` + } `json:"result"` + Success bool `json:"success"` + Timestamp int `json:"timestamp"` +} + +// 逆变器详情响应 +type EquipmentDetailRes struct { + Code int `json:"code"` + Message string `json:"message"` + Obj struct{} `json:"obj"` + PlantAddress string `json:"plantAddress"` + Result struct { + DivertorId string `json:"divertorId"` + DivertorName string `json:"divertorName"` + EquipmentName string `json:"equipmentName"` + EquipmentPn string `json:"equipmentPn"` + EquipmentSn string `json:"equipmentSn"` + Id string `json:"id"` + Kwp float64 `json:"kwp"` + MonKwh float64 `json:"monKwh"` + NowKw float64 `json:"nowKw"` + ParamDcacCode string `json:"paramDcacCode"` + ParamDcdcCode string `json:"paramDcdcCode"` + PowerPlantId string `json:"powerPlantId"` + PowerPlantName string `json:"powerPlantName"` + RatedPower float64 `json:"ratedPower"` + SoftDcacCode string `json:"softDcacCode"` + SoftDcdcCode string `json:"softDcdcCode"` + Status int `json:"status"` + SumKwh float64 `json:"sumKwh"` + TodayKwh float64 `json:"todayKwh"` + UpdateTime string `json:"updateTime"` + UserId string `json:"userId"` + UserName string `json:"userName"` + YearKwh float64 `json:"yearKwh"` + } `json:"result"` + Success bool `json:"success"` + Timestamp int `json:"timestamp"` +} + +// 逆变器实时数据 +type EquipmentRealDataRes struct { + Code int `json:"code"` + Message string `json:"message"` + Obj struct{} `json:"obj"` + Result struct { + EquipmentModel string `json:"equipmentModel"` + FullHours float64 `json:"fullHours"` + InternalTemperature float64 `json:"internalTemperature"` + MonKwh float64 `json:"monKwh"` + NowKw float64 `json:"nowKw"` + ParamData struct { + ParamList []struct { + Key string `json:"key"` + Name string `json:"name"` + Unit string `json:"unit"` + Value interface{} `json:"value"` + } `json:"paramList"` + Time string `json:"time"` + } `json:"paramData"` + PowerFactor float64 `json:"powerFactor"` + PowerPercentage float64 `json:"powerPercentage"` + PowerUnit string `json:"powerUnit"` + RatedPower float64 `json:"ratedPower"` + RatedVoltage float64 `json:"ratedVoltage"` + SumKwh float64 `json:"sumKwh"` + TodayKwh float64 `json:"todayKwh"` + YearKwh float64 `json:"yearKwh"` + } `json:"result"` + Success bool `json:"success"` + Timestamp int `json:"timestamp"` +} + +// 逆变器历史数据 +type EquipmentHistoryRes struct { + Code int `json:"code"` + Message string `json:"message"` + Obj struct{} `json:"obj"` + Result []struct { + ParamList []struct { + Key string `json:"key"` + Name string `json:"name"` + Unit string `json:"unit"` + Value interface{} `json:"value"` + } `json:"paramList"` + Time string `json:"time"` + } `json:"result"` + Success bool `json:"success"` + Timestamp int `json:"timestamp"` +} + +// 逆变器日统计数据 +type EquipmentStaticDayRes struct { + Code int `json:"code"` + Message string `json:"message"` + Obj struct{} `json:"obj"` + Success bool `json:"success"` + Timestamp int64 `json:"timestamp"` + Result []struct { + Time string `json:"time"` + Kwh float64 `json:"kwh"` + KwhUnit string `json:"kwhUnit"` + Earnings float64 `json:"earnings"` + EarningsUnit string `json:"earningsUnit"` + } `json:"result"` +} + +// 逆变器月统计数据 +type EquipmentStaticMonthRes struct { + Code int `json:"code"` + Message string `json:"message"` + Obj struct{} `json:"obj"` + Success bool `json:"success"` + Timestamp int64 `json:"timestamp"` + Result []struct { + Time string `json:"time"` + Kwh float64 `json:"kwh"` + KwhUnit string `json:"kwhUnit"` + Earnings float64 `json:"earnings"` + EarningsUnit string `json:"earningsUnit"` + } `json:"result"` +} + +// 逆变器年统计数据 +type EquipmentStaticYearRes struct { + Code int `json:"code"` + Message string `json:"message"` + Obj struct{} `json:"obj"` + Success bool `json:"success"` + Timestamp int64 `json:"timestamp"` + Result []struct { + Time string `json:"time"` + Kwh float64 `json:"kwh"` + KwhUnit string `json:"kwhUnit"` + Earnings float64 `json:"earnings"` + EarningsUnit string `json:"earningsUnit"` + } `json:"result"` +} + +// 逆变器报警列表数据 +type EquipmentAlarmListRes struct { + Code int `json:"code"` + Message string `json:"message"` + Obj struct{} `json:"obj"` + Result []struct { + AlarmCode string `json:"alarmCode"` + AlarmContent string `json:"alarmContent"` + AlarmGrade string `json:"alarmGrade"` + AlarmType string `json:"alarmType"` + CausesAnalysis string `json:"causesAnalysis"` + DiagnosticAdvice string `json:"diagnosticAdvice"` + EquipmentPn string `json:"equipmentPn"` + EquipmentSn string `json:"equipmentSn"` + Id string `json:"id"` + PlantContactPhone string `json:"plantContactPhone"` + PowerPlantId string `json:"powerPlantId"` + PowerPlantName string `json:"powerPlantName"` + ReportedTime string `json:"reportedTime"` + UserId string `json:"userId"` + UserName string `json:"userName"` + } `json:"result"` + Success bool `json:"success"` + Timestamp int `json:"timestamp"` +} + +// 逆变器报警数据 +type EquipmentAlarmDetailRes struct { + Code int `json:"code"` + Message string `json:"message"` + Obj struct{} `json:"obj"` + Result struct { + Page struct { + PageIndex int `json:"pageIndex"` + PageSize int `json:"pageSize"` + Total int `json:"total"` + } `json:"page"` + Records []struct { + AlarmCode string `json:"alarmCode"` + AlarmContent string `json:"alarmContent"` + AlarmGrade string `json:"alarmGrade"` + AlarmType string `json:"alarmType"` + CausesAnalysis string `json:"causesAnalysis"` + DiagnosticAdvice string `json:"diagnosticAdvice"` + EquipmentPn string `json:"equipmentPn"` + EquipmentSn string `json:"equipmentSn"` + Id string `json:"id"` + Phone string `json:"phone"` + PowerPlantAddress string `json:"powerPlantAddress"` + PowerPlantId string `json:"powerPlantId"` + PowerPlantName string `json:"powerPlantName"` + ReportedTime string `json:"reportedTime"` + RestoreTime string `json:"restoreTime"` + Status string `json:"status"` + UserId string `json:"userId"` + UserName string `json:"userName"` + } `json:"records"` + } `json:"result"` + Success bool `json:"success"` + Timestamp int `json:"timestamp"` +} + +// 逆变器报警详情 +type EquipmentAlarmDetailDataRes struct { + Code int `json:"code"` + Message string `json:"message"` + Result struct { + Address string `json:"address"` + AlarmCode string `json:"alarmCode"` + AlarmContent string `json:"alarmContent"` + AlarmGrade int `json:"alarmGrade"` + AlarmGradeName string `json:"alarmGradeName"` + AlarmSource int `json:"alarmSource"` + AlarmSourceName string `json:"alarmSourceName"` + CausesAnalysis string `json:"causesAnalysis"` + ContactName string `json:"contactName"` + DeviceModel string `json:"deviceModel"` + DiagnosticAdvice string `json:"diagnosticAdvice"` + Email string `json:"email"` + Id string `json:"id"` + IgnoreStatus int `json:"ignoreStatus"` + IgnoreStatusName string `json:"ignoreStatusName"` + OrganizationId string `json:"organizationId"` + OrganizationName string `json:"organizationName"` + Phone string `json:"phone"` + Pn string `json:"pn"` + PowerPlantId string `json:"powerPlantId"` + PowerPlantName string `json:"powerPlantName"` + ProductTypeName string `json:"productTypeName"` + ReportedTime string `json:"reportedTime"` + RestoreTime string `json:"restoreTime"` + Sn string `json:"sn"` + Status int `json:"status"` + StatusName string `json:"statusName"` + UserId string `json:"userId"` + UserName string `json:"userName"` + } `json:"result"` + Success bool `json:"success"` + Timestamp string `json:"timestamp"` +} + +// EquipmentListQueryRes 数据库查询返回 +type EquipmentListQueryRes struct { + g.Meta `mime:"application/json"` + common.ListRes + List []entity.Equipment `json:"list"` +} diff --git a/api/hwy/plant/plant.go b/api/hwy/plant/plant.go new file mode 100644 index 0000000..5dd336f --- /dev/null +++ b/api/hwy/plant/plant.go @@ -0,0 +1,217 @@ +package plant + +import ( + "context" + "encoding/json" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/hwy/client" + "github.com/tiger1103/gfast/v3/api/hwy/sign" + "strconv" +) + +type PlantApi struct { +} + +// 禾望云电站列表请求 +type PlantListReq struct { + g.Meta `path:"/plant/list" method:"get" tags:"禾望云相关" summary:"获取电站列表"` + PageNum int `json:"pageNum" dc:"分页数" v:"required"` + PageSize int `json:"pageSize" dc:"分页大小" v:"required"` + UserId string `json:"userId" dc:"用户ID"` +} + +func (p PlantApi) GetPlantList(ctx context.Context, req *PlantListReq) (res *PlantListRes, err error) { + res = new(PlantListRes) + data := make(map[string]string) + data["pageIndex"] = strconv.Itoa(req.PageNum) + data["pageSize"] = strconv.Itoa(req.PageSize) + sign.SignByRSA(data) + err, bytes := client.Get("/openApi/powerPlant/getPowerPlantList", data) + if err != nil { + return res, err + } + err = json.Unmarshal(bytes, &res) + if err != nil { + return res, err + } + + model := g.Model("plant") + for _, record := range res.Result.Records { + err = g.Try(ctx, func(ctx context.Context) { + // 尝试查找记录 + exists, _ := model.Where("id", record.Id).One() + // 准备数据 + data := map[string]interface{}{ + "id": record.Id, + "name": record.Name, + "address": record.Address, + "city": record.City, + "district": record.District, + "province": record.Province, + "latitude": record.Latitude, + "longitude": record.Longitude, + "kwp": record.Kwp, + "monKwh": record.MonKwh, + "nowKw": record.NowKw, + "sumKwh": record.SumKwh, + "todayKwh": record.TodayKwh, + "yearKwh": record.YearKwh, + "networkTime": record.NetworkTime, + "updateTime": record.UpdateTime, + "companyId": record.CompanyId, + "companyName": record.CompanyName, + "ownerId": record.OwnerId, + "ownerName": record.OwnerName, + "serviceProviderName": record.ServiceProviderName, + "serviceProviderPhone": record.ServiceProviderPhone, + "networkType": record.NetworkType, + "powerPlantType": record.PowerPlantType, + "status": record.Status, + "paymentType": record.PaymentType, + "plantContact": record.PlantContact, + "plantContactPhone": record.PlantContactPhone, + "plantImg": record.PlantImg, + "remark": record.Remark, + "dipAngle": record.DipAngle, + "orientationAngle": record.OrientationAngle, + "subassemblyNumber": record.SubassemblyNumber, + } + // 根据是否存在来决定是更新还是插入 + if exists.IsEmpty() { + model.Insert(data) + } else { + model.Where("id", record.Id).Data(data).Update() + } + }) + } + return res, err +} + +// 获取电站详情 +type PlantAddReq struct { + g.Meta `path:"/plant/deatil" method:"get" tags:"禾望云相关" summary:"获取电站详情"` + PlantId string `json:"plantId" dc:"电站ID" v:"required"` +} + +func (p PlantApi) PlanAdd(ctx context.Context, req *PlantAddReq) (res *PlantAddRes, err error) { + res = new(PlantAddRes) + data := make(map[string]string) + data["plantId"] = req.PlantId + sign.SignByRSA(data) + err, bytes := client.Get("/openApi/powerPlant/getPowerPlantDetailById", data) + if err != nil { + return res, err + } + err = json.Unmarshal(bytes, &res) + g.Dump(res) + return res, nil +} + +// 禾望云电站实时数据 +type RealDataReq struct { + g.Meta `path:"/plant/real/data" method:"get" tags:"禾望云相关" summary:"获取电站实时数据"` + PlantId string `json:"plantId" dc:"电站ID" v:"required"` +} + +func (p PlantApi) RealData(ctx context.Context, req *RealDataReq) (res *RealDataRes, err error) { + res = new(RealDataRes) + data := make(map[string]string) + data["plantId"] = req.PlantId + sign.SignByRSA(data) + err, bytes := client.Get("/openApi/powerPlant/getPowerPlantRealData", data) + if err != nil { + return res, err + } + err = json.Unmarshal(bytes, &res) + return res, nil +} + +// 禾望云电站日统计信息 +type DayStaticReq struct { + g.Meta `path:"/plant/static/day" method:"get" tags:"禾望云相关" summary:"获取电站日统计信息"` + StartTime string `json:"startTime" dc:"开始日期 yyyy-MM-dd" v:"required"` + PlantId string `json:"plantId" dc:"电站ID" v:"required"` + EndTime string `json:"endTime" dc:"结束日期 yyyy-MM-dd" v:"required"` +} + +func (p PlantApi) DayStatic(ctx context.Context, req *DayStaticReq) (res *DayStaticRes, err error) { + res = new(DayStaticRes) + data := make(map[string]string) + data["startTime"] = req.StartTime + data["plantId"] = req.PlantId + data["endTime"] = req.EndTime + sign.SignByRSA(data) + err, bytes := client.Get("/openApi/powerPlant/getPowerPlantDayStatisticsData", data) + if err != nil { + return res, err + } + err = json.Unmarshal(bytes, &res) + return res, nil +} + +// 禾望云电站月统计信息 +type MonthStaticReq struct { + g.Meta `path:"/plant/static/month" method:"get" tags:"禾望云相关" summary:"获取电站月统计信息"` + StartTime string `json:"startTime" dc:"开始日期 yyyy-MM" v:"required"` + PlantId string `json:"plantId" dc:"电站ID" v:"required"` + EndTime string `json:"endTime" dc:"结束日期 yyyy-MM" v:"required"` +} + +func (p PlantApi) MonthStatic(ctx context.Context, req *MonthStaticReq) (res *MonthStaticRes, err error) { + res = new(MonthStaticRes) + data := make(map[string]string) + data["startTime"] = req.StartTime + data["plantId"] = req.PlantId + data["endTime"] = req.EndTime + sign.SignByRSA(data) + err, bytes := client.Get("/openApi/powerPlant/getPowerPlantMonthStatisticsData", data) + if err != nil { + return res, err + } + err = json.Unmarshal(bytes, &res) + return res, nil +} + +// 禾望云电站年统计信息 +type YearStaticReq struct { + g.Meta `path:"/plant/static/year" method:"get" tags:"禾望云相关" summary:"获取电站年统计信息"` + StartTime string `json:"startTime" dc:"开始日期 yyyy" v:"required"` + PlantId string `json:"plantId" dc:"电站ID" v:"required"` + EndTime string `json:"endTime" dc:"结束日期 yyyy" v:"required"` +} + +func (p PlantApi) YearStatic(ctx context.Context, req *YearStaticReq) (res *YearStaticRes, err error) { + res = new(YearStaticRes) + data := make(map[string]string) + data["startTime"] = req.StartTime + data["plantId"] = req.PlantId + data["endTime"] = req.EndTime + sign.SignByRSA(data) + err, bytes := client.Get("/openApi/powerPlant/getPowerPlantYearStatisticsData", data) + if err != nil { + return res, err + } + err = json.Unmarshal(bytes, &res) + return res, nil +} + +// 禾望云电站历史记录 +type HistoryStaticReq struct { + g.Meta `path:"/plant/static/history" method:"get" tags:"禾望云相关" summary:"获取电站历史数据"` + PlantId string `json:"plantId" dc:"电站ID" v:"required"` + Time string `json:"time" dc:"日期字符 yyyy-MM-dd" v:"required"` +} + +func (p PlantApi) HistoryStatic(ctx context.Context, req *HistoryStaticReq) (res *HistoryStaticRes, err error) { + res = new(HistoryStaticRes) + data := make(map[string]string) + data["plantId"] = req.PlantId + data["time"] = req.Time + sign.SignByRSA(data) + err, bytes := client.Get("/openApi/powerPlant/getPowerPlantHistoryPower", data) + if err != nil { + return res, err + } + err = json.Unmarshal(bytes, &res) + return res, nil +} diff --git a/api/hwy/plant/res.go b/api/hwy/plant/res.go new file mode 100644 index 0000000..0eff65e --- /dev/null +++ b/api/hwy/plant/res.go @@ -0,0 +1,189 @@ +package plant + +// 电站详情 +type PlantAddRes struct { + Code int `json:"code"` + Message string `json:"message"` + Obj struct { + } `json:"obj"` + Result struct { + Address string `json:"address"` + City string `json:"city"` + CompanyId string `json:"companyId"` + CompanyName string `json:"companyName"` + DipAngle int `json:"dipAngle"` + District string `json:"district"` + Earnings int `json:"earnings"` + Id string `json:"id"` + Kwp int `json:"kwp"` + Latitude string `json:"latitude"` + Longitude string `json:"longitude"` + MonEarnings int `json:"monEarnings"` + MonKwh float64 `json:"monKwh"` + Name string `json:"name"` + NetworkType string `json:"networkType"` + NowKw int `json:"nowKw"` + OrientationAngle int `json:"orientationAngle"` + OwnerId string `json:"ownerId"` + PaymentType string `json:"paymentType"` + PlantContact string `json:"plantContact"` + PlantContactPhone string `json:"plantContactPhone"` + PlantImg string `json:"plantImg"` + PowerPlantType string `json:"powerPlantType"` + Province string `json:"province"` + Remark string `json:"remark"` + ServiceProviderEmail string `json:"serviceProviderEmail"` + ServiceProviderPhone string `json:"serviceProviderPhone"` + Status int `json:"status"` + SubassemblyNumber int `json:"subassemblyNumber"` + SumEarnings int `json:"sumEarnings"` + SumKwh float64 `json:"sumKwh"` + TodayEarnings int `json:"todayEarnings"` + TodayKwh float64 `json:"todayKwh"` + UpdateTime string `json:"updateTime"` + UserName string `json:"userName"` + YearEarnings int `json:"yearEarnings"` + YearKwh int `json:"yearKwh"` + } `json:"result"` + Success bool `json:"success"` + Timestamp int `json:"timestamp"` +} + +// 电站列表 +type PlantListRes struct { + Code int `json:"code"` + Message string `json:"message"` + Obj struct { + } `json:"obj"` + Result struct { + Page struct { + PageIndex int `json:"pageIndex"` + PageSize int `json:"pageSize"` + Total int `json:"total"` + } `json:"page"` + Records []struct { + Address string `json:"address"` + City string `json:"city"` + CompanyId string `json:"companyId"` + CompanyName string `json:"companyName"` + DipAngle int `json:"dipAngle"` + District string `json:"district"` + Id string `json:"id"` + Kwp float64 `json:"kwp"` + Latitude string `json:"latitude"` + Longitude string `json:"longitude"` + MonKwh float64 `json:"monKwh"` + Name string `json:"name"` + NetworkTime string `json:"networkTime"` + NetworkType string `json:"networkType"` + NowKw float64 `json:"nowKw"` + OrientationAngle int `json:"orientationAngle"` + OwnerId string `json:"ownerId"` + OwnerName string `json:"ownerName"` + PaymentType string `json:"paymentType"` + PlantContact string `json:"plantContact"` + PlantContactPhone string `json:"plantContactPhone"` + PlantImg string `json:"plantImg"` + PowerPlantType string `json:"powerPlantType"` + Province string `json:"province"` + Remark string `json:"remark"` + ServiceProviderName string `json:"serviceProviderName"` + ServiceProviderPhone string `json:"serviceProviderPhone"` + Status int `json:"status"` + SubassemblyNumber int `json:"subassemblyNumber"` + SumKwh float64 `json:"sumKwh"` + TodayKwh float64 `json:"todayKwh"` + UpdateTime string `json:"updateTime"` + YearKwh float64 `json:"yearKwh"` + } `json:"records"` + Statistics struct { + AlarmNumber int `json:"alarmNumber"` + OfflineNumber int `json:"offlineNumber"` + OnlineNumber int `json:"onlineNumber"` + SumNumber int `json:"sumNumber"` + } `json:"statistics"` + } `json:"result"` + Success bool `json:"success"` + Timestamp int `json:"timestamp"` +} + +// 电站实时数据 +type RealDataRes struct { + Code int `json:"code"` + Message string `json:"message"` + Obj struct { + } `json:"obj"` + Result struct { + NowKw int `json:"nowKw"` + PowerUnit string `json:"powerUnit"` + Time string `json:"time"` + } `json:"result"` + Success bool `json:"success"` + Timestamp int `json:"timestamp"` +} + +// 电站日统计信息 +type DayStaticRes struct { + Code int `json:"code"` + Message string `json:"message"` + Obj struct { + } `json:"obj"` + Result []struct { + Earnings int `json:"earnings"` + EarningsUnit string `json:"earningsUnit"` + Kwh int `json:"kwh"` + KwhUnit string `json:"kwhUnit"` + Time string `json:"time"` + } `json:"result"` + Success bool `json:"success"` + Timestamp int `json:"timestamp"` +} + +// 电站月统计信息 +type MonthStaticRes struct { + Code int `json:"code"` + Message string `json:"message"` + Obj struct { + } `json:"obj"` + Result []struct { + Earnings int `json:"earnings"` + EarningsUnit string `json:"earningsUnit"` + Kwh int `json:"kwh"` + KwhUnit string `json:"kwhUnit"` + Time string `json:"time"` + } `json:"result"` + Success bool `json:"success"` + Timestamp int `json:"timestamp"` +} + +// 电站年统计信息 +type YearStaticRes struct { + Code int `json:"code"` + Message string `json:"message"` + Obj struct { + } `json:"obj"` + Result []struct { + Earnings int `json:"earnings"` + EarningsUnit string `json:"earningsUnit"` + Kwh int `json:"kwh"` + KwhUnit string `json:"kwhUnit"` + Time string `json:"time"` + } `json:"result"` + Success bool `json:"success"` + Timestamp int `json:"timestamp"` +} + +// 电站历史记录 +type HistoryStaticRes struct { + Code int `json:"code"` + Message string `json:"message"` + Obj struct { + } `json:"obj"` + Result []struct { + NowKw int `json:"nowKw"` + PowerUnit string `json:"powerUnit"` + Time string `json:"time"` + } `json:"result"` + Success bool `json:"success"` + Timestamp int `json:"timestamp"` +} diff --git a/api/hwy/router/router.go b/api/hwy/router/router.go new file mode 100644 index 0000000..1856278 --- /dev/null +++ b/api/hwy/router/router.go @@ -0,0 +1,17 @@ +package hwy + +import ( + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/api/hwy/equipment" + "github.com/tiger1103/gfast/v3/api/hwy/plant" +) + +func InitHwyAPI(group *ghttp.RouterGroup) { + group.Middleware(ghttp.MiddlewareCORS) + group.Group("/manage", func(group *ghttp.RouterGroup) { + group.Group("/api/v1", func(group *ghttp.RouterGroup) { + group.Bind(new(plant.PlantApi)) + group.Bind(new(equipment.EquipmentApi)) + }) + }) +} diff --git a/api/hwy/sign/sign.go b/api/hwy/sign/sign.go new file mode 100644 index 0000000..f0810d8 --- /dev/null +++ b/api/hwy/sign/sign.go @@ -0,0 +1,92 @@ +package sign + +import ( + "crypto" + "crypto/rand" + "crypto/rsa" + "crypto/sha1" + "crypto/x509" + "encoding/base64" + "fmt" + "log" + "net/url" + "sort" + "strings" +) + +const APPID = "a23b2d45b0214f7ebbe167cd2e490435" +const PRI_KEY = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAOAoyk5ot2KHo3hFga+ozeSO6XORk6wd4MkyETSGCDrha8klXfTukAJfYz3eS/PpkdLJTGrd34D21BkKzJ7Pc+ExMwTEc4xTaWU9vVJWlshVgHUsfbRhVps3IivtK9e268j+7xHf0I6j0zJ7zOLO6aADf76e/GqVfA+rz0DPPR3jAgMBAAECgYEA3blbSy2nX42dM6VE/zTw28hEwOzZbiFrrHearyJ4140MKb2Nb23eAorJxnOxG0YI2MAGl5p5rr331AFrnxbCnb4JZ5fnT1uBNtmH4uEnHhIhQm3CsSukFWvnO5KRD+9Zl3BKUSor2ynCs5/EO0hcKlKCYtHiXKzkkUi65rLuH4kCQQD2tlELA8YDMGgKNOF3ZpvRrTqKxGb4wwg+jUX4ns4oXutc57EfG4R96MWG5gu4x/3ZVrHPMHsmPClnK7hAyXP/AkEA6JkfBiLkhlCmkCn5F3qDwuQNzTHqdm/Ql71Hogk6+2itVgJ9ua+Eegw5cVynPqrEWW2e7VbNjuiVlkMLJE0GHQJBAKFCOCTf+YzaFhcdy4X1DsJ13T8Y80mEiZ4BT4wbmRswN92JH+/6V5bJEFuFgIHuTxHBpgWMZeJvDoz+Obg3NVcCQE+tdFUzyrjAE+66khua2lv+p0OtX7Xmo7v3GPzG0K+isg4OmGbtWyI74cmVha0P7mb8CD8hRxU3U1a/7Kcow3kCQQCky3My+Qr+offSBqBE1cuFbkJ09G6nlotlPlO0pVnXOHMsUBCkfocv6QJ25KooppU1C1Cktgf9BYJ9b/r+r1Lu" +const HOST = "http://openapi.hopewindcloud.com/" + +// 对参数进行签名,并为 Map 添加 appid 和 sign 参数 +func SignByRSA(params map[string]string) string { + params["appid"] = APPID + content := CreateLinkString(params) + privateKeyBytes, err := base64.StdEncoding.DecodeString(PRI_KEY) + if err != nil { + return "" + } + pkcs8PrivateKey, err := x509.ParsePKCS8PrivateKey(privateKeyBytes) + if err != nil { + log.Fatalf("Failed to parse PKCS#8 private key: %v", err) + } + privateKey, ok := pkcs8PrivateKey.(*rsa.PrivateKey) + if !ok { + log.Fatal("Private key is not of type RSA") + } + h := sha1.New() + _, err = h.Write([]byte(content)) + if err != nil { + fmt.Println(err) + return "" + } + hashed := h.Sum(nil) + signed, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA1, hashed) + if err != nil { + fmt.Println(err) + return "" + } + sign := url.QueryEscape(base64.StdEncoding.EncodeToString(signed)) + params["sign"] = sign + return sign +} + +// paramsFilter 过滤参数 +func paramsFilter(params map[string]interface{}) map[string]string { + result := make(map[string]string) + if params == nil || len(params) == 0 { + return result + } + for key, value := range params { + if value == nil || key == "sign" { + continue + } + result[key] = value.(string) + } + return result +} + +// createLinkString 创建链接字符串 +func CreateLinkString(params map[string]string) string { + if params == nil { + return "" + } + // 排序键 + keys := make([]string, 0, len(params)) + for key := range params { + keys = append(keys, key) + } + sort.Strings(keys) + sb := strings.Builder{} + keyLastNum := len(keys) - 1 + for i, key := range keys { + value := params[key] + sb.WriteString(key) + sb.WriteString("=") + sb.WriteString(value) + if i != keyLastNum { + sb.WriteString("&") + } + } + return sb.String() +} diff --git a/api/pilot/manage/login.go b/api/pilot/manage/login.go new file mode 100644 index 0000000..15324aa --- /dev/null +++ b/api/pilot/manage/login.go @@ -0,0 +1,39 @@ +package manage + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" +) + +type LOGIN struct { +} +type LoginReq struct { + g.Meta `path:"login" summary:"pilot登录" method:"post" tags:"无人机遥控器"` + + Username string `json:"username" v:"required"` + Password string `json:"password" v:"required"` + //Flag int `json:"flag" v:"required"` +} +type LoginRes struct { + Username string `json:"username"` + UserId string `json:"user_id"` + WorkspaceId string `json:"workspace_id"` + UserType int `json:"user_type"` + MqttUsername string `json:"mqtt_username"` + MqttPassword string `json:"mqtt_password"` + AccessToken string `json:"access_token"` + MqttAddr string `json:"mqtt_addr"` +} + +func (receiver *LOGIN) Login(ctx context.Context, req *LoginReq) (res *LoginRes, err error) { + res = &LoginRes{} + res.Username = "pilot" + res.UserId = "be7c6c3d-afe9-4be4-b9eb-c55066c0914e" + res.WorkspaceId = "e3dea0f5-37f2-4d79-ae58-490af3228069" + res.UserType = 2 + res.MqttUsername = "pilot" + res.MqttPassword = "pilot123" + res.AccessToken = "abc" + res.MqttAddr = "tcp://jl.yj-3d.com:1883" + return +} diff --git a/api/pilot/manage/manage.go b/api/pilot/manage/manage.go new file mode 100644 index 0000000..6627d1e --- /dev/null +++ b/api/pilot/manage/manage.go @@ -0,0 +1,122 @@ +package manage + +import ( + "context" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" +) + +type MANAGE struct { +} +type UsualRes struct { +} +type BindReq struct { + g.Meta `path:"devices/{device_sn}/binding" summary:"绑定设备" method:"post" tags:"无人机遥控器"` + DeviceSN string `json:"device_sn"` + UserID string `json:"user_id"` + WorkspaceId string `json:"workspace_id"` +} + +func (receiver *MANAGE) Bind(ctx context.Context, req *BindReq) (res *UsualRes, err error) { + fmt.Println(req.DeviceSN) + fmt.Println(req.UserID) + fmt.Println(req.WorkspaceId) + return +} + +type UserCurrentReq struct { + g.Meta `path:"users/current" summary:"获取当前用户信息信息" method:"get" tags:"无人机遥控器"` +} +type UserCurrentRes struct { + Username string `json:"username"` + UserId string `json:"user_id"` + WorkspaceId string `json:"workspace_id"` + UserType int `json:"user_type"` + MqttUsername string `json:"mqtt_username"` + MqttPassword string `json:"mqtt_password"` + MqttAddr string `json:"mqtt_addr"` +} + +func (receiver *MANAGE) UserCurrent(ctx context.Context, req *UserCurrentReq) (res *UserCurrentRes, err error) { + res = &UserCurrentRes{} + res.Username = "pilot" + res.UserId = "be7c6c3d-afe9-4be4-b9eb-c55066c0914e" + res.WorkspaceId = "e3dea0f5-37f2-4d79-ae58-490af3228069" + res.UserType = 2 + res.MqttUsername = "pilot" + res.MqttPassword = "pilot123" + res.MqttAddr = "tcp://jl.yj-3d.com:1883" + return +} + +type WorkSpaceCurrentReq struct { + g.Meta `path:"workspaces/current" summary:"获取当前工作空间信息" method:"get" tags:"无人机遥控器"` +} +type WorkSpaceCurrentRes struct { + WorkspaceId string `json:"workspace_id"` + WorkspaceName string `json:"workspace_name"` + WorkspaceDesc string `json:"workspace_desc"` + PlatformName string `json:"platform_name"` + BindCode string `json:"bind_code"` +} + +func (receiver *MANAGE) WorkSpaceCurrent(ctx context.Context, req *WorkSpaceCurrentReq) (res *WorkSpaceCurrentRes, err error) { + res = &WorkSpaceCurrentRes{} + res.WorkspaceName = "测试组" + res.WorkspaceId = "e3dea0f5-37f2-4d79-ae58-490af3228069" + res.WorkspaceDesc = "中煤科工测试云平台" + res.PlatformName = "中煤科工光伏平台" + res.BindCode = "qwe" + return +} + +type TopologiesReq struct { + g.Meta `path:"workspaces/{workspace_id}/devices/topologies" summary:"获取设备拓扑列表)" method:"get" tags:"无人机遥控器"` +} +type TopologiesRes struct { + List []struct { + Hosts []struct { + Sn string `json:"sn"` + DeviceModel struct { + Key string `json:"key"` + Domain string `json:"domain"` + Type string `json:"type"` + SubType string `json:"sub_type"` + } `json:"device_model"` + OnlineStatus bool `json:"online_status"` + DeviceCallsign string `json:"device_callsign"` + UserId string `json:"user_id"` + UserCallsign string `json:"user_callsign"` + IconUrls struct { + NormalIconUrl string `json:"normal_icon_url"` + SelectedIconUrl string `json:"selected_icon_url"` + } `json:"icon_urls"` + } `json:"hosts"` + Parents []struct { + Sn string `json:"sn"` + OnlineStatus bool `json:"online_status"` + DeviceModel struct { + Key string `json:"key"` + Domain string `json:"domain"` + Type string `json:"type"` + SubType string `json:"sub_type"` + } `json:"device_model"` + DeviceCallsign string `json:"device_callsign"` + UserId string `json:"user_id"` + UserCallsign string `json:"user_callsign"` + IconUrls struct { + NormalIconUrl string `json:"normal_icon_url"` + SelectedIconUrl string `json:"selected_icon_url"` + } `json:"icon_urls"` + } `json:"parents"` + } `json:"list"` +} + +func (receiver *MANAGE) Topologies(ctx context.Context, req *TopologiesReq) (res *TopologiesRes, err error) { + workspace_id := ghttp.RequestFromCtx(ctx).Get("workspace_id") + fmt.Println("workspace_id", workspace_id) + res = &TopologiesRes{} + + return +} diff --git a/api/pilot/map/map.go b/api/pilot/map/map.go new file mode 100644 index 0000000..d3e5c78 --- /dev/null +++ b/api/pilot/map/map.go @@ -0,0 +1,51 @@ +package _map + +import ( + "context" + "fmt" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" +) + +type MAP struct { +} +type Element_groupsReq struct { + g.Meta `path:"workspaces/{workspace_id}/element-groups" summary:"获取元素列表" method:"get" tags:"无人机遥控器"` + GroupId string `json:"group_id"` + IsDistributed bool `json:"is_distributed"` +} +type Element_groupsRes struct { + Id string `json:"id"` + Type int `json:"type"` + Name string `json:"name"` + IsLock bool `json:"is_lock"` + CreateTime int64 `json:"create_time"` + Elements []struct { + Id string `json:"id"` + Name string `json:"name"` + CreateTime int64 `json:"create_time"` + UpdateTime int64 `json:"update_time"` + Resource struct { + Type int `json:"type"` + UserName string `json:"user_name"` + Content struct { + Type string `json:"type"` + Properties struct { + Color string `json:"color"` + ClampToGround bool `json:"clampToGround"` + } `json:"properties"` + Geometry struct { + Type string `json:"type"` + Coordinates []interface{} `json:"coordinates"` + } `json:"geometry"` + } `json:"content"` + } `json:"resource"` + } `json:"elements"` +} + +func (receiver MAP) Element_groups(ctx context.Context, req *Element_groupsReq) (res *Element_groupsRes, err error) { + workspace_id := ghttp.RequestFromCtx(ctx).Get("workspace_id") + fmt.Println("获取元素列表workspace_id", workspace_id) + return +} diff --git a/api/pilot/pilot.go b/api/pilot/pilot.go new file mode 100644 index 0000000..b847ebf --- /dev/null +++ b/api/pilot/pilot.go @@ -0,0 +1,32 @@ +package pilot + +import ( + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/api/pilot/manage" + _map "github.com/tiger1103/gfast/v3/api/pilot/map" + "github.com/tiger1103/gfast/v3/api/pilot/wayline" + "github.com/tiger1103/gfast/v3/api/pilot/ws" +) + +func InitPlilotAPI(group *ghttp.RouterGroup) { + group.Middleware(ghttp.MiddlewareCORS) + group.Group("/manage", func(group *ghttp.RouterGroup) { + group.Group("/api/v1", func(group *ghttp.RouterGroup) { + group.Bind(new(manage.LOGIN)) + //service.GfToken().Middleware(group) + group.Bind(new(manage.MANAGE)) + group.Bind(new(ws.WS)) + + }) + }) + group.Group("/wayline", func(group *ghttp.RouterGroup) { + group.Group("/api/v1", func(group *ghttp.RouterGroup) { + group.Bind(new(wayline.WAYLINE)) + }) + }) + group.Group("/map", func(group *ghttp.RouterGroup) { + group.Group("/api/v1", func(group *ghttp.RouterGroup) { + group.Bind(new(_map.MAP)) + }) + }) +} diff --git a/api/pilot/wayline/wayline.go b/api/pilot/wayline/wayline.go new file mode 100644 index 0000000..d5dcecc --- /dev/null +++ b/api/pilot/wayline/wayline.go @@ -0,0 +1,48 @@ +package wayline + +import ( + "context" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" +) + +type WAYLINE struct { +} + +type WaylinesReq struct { + g.Meta `path:"workspaces/{workspace_id}/waylines" summary:"获取航线列表" method:"get" tags:"无人机遥控器"` + Favorited bool `json:"favorited"` + Order_by string `json:"order_by"` + Page int `json:"page"` + PageSize int `json:"page_size"` + TemplateType []int `json:"template_type"` +} + +type Wayline struct { + Id string `json:"id"` + DroneModelKey string `json:"drone_model_key"` + Favorited bool `json:"favorited"` + Name string `json:"name"` + PayloadModelKeys []string `json:"payload_model_keys"` + TemplateTypes []int `json:"template_types"` + UpdateTime int64 `json:"update_time"` + UserName string `json:"user_name"` +} +type WaylinesRes struct { + List []Wayline `json:"list"` + Pagination struct { + Page int `json:"page"` + PageSize int `json:"page_size"` + Total int `json:"total"` + } `json:"pagination"` +} + +func (receiver WAYLINE) Waylines(ctx context.Context, req *WaylinesReq) (res *WaylinesRes, err error) { + workspace_id := ghttp.RequestFromCtx(ctx).Get("workspace_id") + fmt.Println("获取航线列表workspace_id", workspace_id) + fmt.Println(req.Order_by, req.TemplateType, req.Page, req.PageSize, req.Favorited) + res = &WaylinesRes{} + res.List = []Wayline{} + return +} diff --git a/api/pilot/ws/ws.go b/api/pilot/ws/ws.go new file mode 100644 index 0000000..fad1a3a --- /dev/null +++ b/api/pilot/ws/ws.go @@ -0,0 +1,32 @@ +package ws + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" +) + +type WS struct { +} + +type WsReq struct { + g.Meta `path:"ws2" summary:"ws2" method:"get" tags:"无人机"` +} + +type UsualRes struct { +} + +func (receiver *WS) WSConnect(ctx context.Context, req *WsReq) (res *UsualRes, err error) { + r := ghttp.RequestFromCtx(ctx) + ws, err := r.WebSocket() + if err != nil { + return nil, err + } + for { + _, _, err := ws.ReadMessage() + if err != nil { + return nil, err + } + //fmt.Println(msgType, string(msg)) + } +} diff --git a/api/project/index_count.go b/api/project/index_count.go new file mode 100644 index 0000000..b581af6 --- /dev/null +++ b/api/project/index_count.go @@ -0,0 +1,162 @@ +package project + +import ( + "context" + "encoding/json" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/glog" +) + +// PvModuleStatsReq 用于查询统计信息的请求结构体 +type PvModuleStatsReq struct { + g.Meta `path:"moduleStats" method:"get" tags:"项目首页相关" summary:"获取模块的统计信息"` + SubProjectId string `json:"subProjectId"` + FangzhenId string `json:"fangzhenId"` +} + +// PvModuleStatsRes 用于封装统计结果的响应结构体,调整为使用字符串描述类型 +type PvModuleStatsRes struct { + Data []struct { + TypeDesc string `json:"typeDesc"` + Total int `json:"total"` + Complete int `json:"complete"` + } `json:"data"` +} + +func (p Project) QueryPvModuleStats(ctx context.Context, req *PvModuleStatsReq) (res *PvModuleStatsRes, err error) { + model := g.Model("pv_module").Fields("type, COUNT(*) as total, SUM(CASE WHEN status='2' THEN 1 ELSE 0 END) as complete").Group("type") + if req.SubProjectId != "" { + model = model.Where("sub_projectid", req.SubProjectId) + } + if req.FangzhenId != "" { + model = model.Where("fangzhen_id", req.FangzhenId) + } + + var stats []struct { + Type int `json:"type"` + Total int `json:"total"` + Complete int `json:"complete"` + } + + err = model.Scan(&stats) + if err != nil { + glog.Error(ctx, "查询 pv_module 统计信息失败:", err) + return nil, err + } + + var resultStats []struct { + TypeDesc string `json:"typeDesc"` + Total int `json:"total"` + Complete int `json:"complete"` + } + + for _, stat := range stats { + typeDesc, exists := ConstMap[stat.Type] + if !exists { + glog.Error(ctx, "未知的 type:", stat.Type) + continue // 或者处理未知类型 + } + resultStats = append(resultStats, struct { + TypeDesc string `json:"typeDesc"` + Total int `json:"total"` + Complete int `json:"complete"` + }{TypeDesc: typeDesc, Total: stat.Total, Complete: stat.Complete}) + } + + return &PvModuleStatsRes{Data: resultStats}, nil +} + +// 修改请求结构体以接收类型切片 +type PvModuleQueryReq struct { + g.Meta `path:"indexCount" method:"get" tags:"项目首页相关" summary:"根据子项目ID、方针ID和类型来获取数据"` + SubProjectId string `json:"subProjectId"` + FangzhenId string `json:"fangzhenId"` + Types []int `json:"types"` // 新增字段,用于指定需要查询的类型 +} + +// 修改返回结果结构体,去除 total 和 complete +type PvModuleQueryRes struct { + Data map[int][]PVModule `json:"data"` + View string `json:"view" orm:"view"` +} + +func (p Project) QueryPVModule(ctx context.Context, req *PvModuleQueryReq) (res *PvModuleQueryRes, err error) { + res = new(PvModuleQueryRes) + // 查询对应方针的 View 值 + g.Model("qianqi_fangzhen").Where("id", req.FangzhenId).Scan(&res) + // 准备存储每种 type 对应的数据 + data := make(map[int][]PVModule) + + // 仅针对请求中指定的 type 进行查询 + for _, t := range req.Types { + var modules []PVModule + queryModel := g.Model("pv_module").Where("type", t) + if req.SubProjectId != "" { + queryModel = queryModel.Where("sub_projectid", req.SubProjectId) + } + if req.FangzhenId != "" { + queryModel = queryModel.Where("fangzhen_id", req.FangzhenId) + } + + err = queryModel.Scan(&modules) + if err != nil { + continue // 或处理错误 + } + + // 对 modules 进行处理,比如反序列化 Detail 字段、添加倾角和方位角等 + var processedModules []PVModule + for _, m := range modules { + // 反序列化 Detail 字段 + var detailMap map[string]interface{} + err = json.Unmarshal([]byte(m.Detail), &detailMap) + if err != nil { + continue + } + + // 为其添加倾角和方位角 + //detailMap["roll"] = m.Tilt + //detailMap["heading"] = m.Azimuth + // 重新序列化 + serializedDetail, _ := json.Marshal(detailMap) + + processedModules = append(processedModules, PVModule{ + ID: m.ID, + FangzhenID: m.FangzhenID, + SubProjectID: m.SubProjectID, + WorkID: m.WorkID, + Name: m.Name, + Status: m.Status, + DoneTime: m.DoneTime, + Detail: string(serializedDetail), + Type: t, + DeviceID: m.DeviceID, + EquipmentSn: "", + }) + } + + // 遍历processedModules中那些DeviceID不为空的值,取出数据,然后查询equipment表,根据设备id查询equipment表,得到设备sn,赋值给EquipmentSn + for i, mod := range processedModules { + if mod.DeviceID != "" { + var equipment struct { + EquipmentSn string + } + // 使用g.DB模型查询equipment表中的SN字段,假定设备的序列号字段为SN + err := g.Model("equipment").Fields("equipmentSn").Where("id", mod.DeviceID).Scan(&equipment) + if err != nil { + // 处理查询错误,例如记录日志或跳过 + continue + } + // 更新模块的EquipmentSn字段 + processedModules[i].EquipmentSn = equipment.EquipmentSn + } + } + + // 更新数据存储结构 + data[t] = processedModules + } + + res.Data = data + + return res, nil +} diff --git a/api/project/index_pv.go b/api/project/index_pv.go new file mode 100644 index 0000000..44aae82 --- /dev/null +++ b/api/project/index_pv.go @@ -0,0 +1,71 @@ +package project + +import ( + "context" + "encoding/json" + "unsafe" + + "github.com/gogf/gf/v2/frame/g" + lop "github.com/samber/lo/parallel" +) + +// 根据大项目ID去查询所有的数据 +type ProjectIndexModuleReq struct { + g.Meta `path:"index" method:"get" tags:"项目首页相关" summary:"根据项目ID获取数据"` + ID int64 `json:"id"` // 项目ID +} + +type ProjectIndexModuleRes struct { + Data []PVModule `json:"data"` // PVModule 切片 +} + +// 根据大项目ID去查询所有的 pv_module 数据 +func (p Project) ProjectIndexModule(ctx context.Context, req *ProjectIndexModuleReq) (res *ProjectIndexModuleRes, err error) { + // 准备返回结果 + res = &ProjectIndexModuleRes{} + + // 构建查询 + var modules []PVModule + err = g.Model("pv_module").As("pm"). + Fields("pm.id, pm.fangzhen_id, pm.sub_projectid, pm.work_id, pm.name, pm.status, pm.done_time, pm.detail, pm.type, pm.tilt,pm.azimuth"). + InnerJoin("sub_project sp", "pm.sub_projectid = sp.id"). + InnerJoin("sys_project sysp", "sp.project_id = sysp.id"). + Where("sysp.id", req.ID). + Where("sysp.deleted_at IS NULL"). + Scan(&modules) + // 错误处理 + if err != nil { + return nil, err + } + + // 并行处理每个元素 + lop.ForEach[PVModule](modules, func(x PVModule, i int) { + // 如果不是光伏板则不处理 + if x.Type != 15 { + return + } + + // 反序列化 detail 字段 + var detail map[string]interface{} + if err := json.Unmarshal([]byte(x.Detail), &detail); err != nil { + return + } + + // 为其添加倾角和方位角 + //detail["roll"] = x.Tilt + //detail["heading"] = x.Azimuth + + // 重新序列化 + detailBytes, err := json.Marshal(detail) + if err != nil { + return + } + + // 重新赋值给 modules[i].Detail + modules[i].Detail = *(*string)(unsafe.Pointer(&detailBytes)) + }) + + // 将查询结果赋值给返回结构 + res.Data = modules + return res, nil +} diff --git a/api/project/model.go b/api/project/model.go new file mode 100644 index 0000000..9b322be --- /dev/null +++ b/api/project/model.go @@ -0,0 +1,61 @@ +package project + +// 大项目表 +type SysProject struct { + ID int64 `json:"id"` // 项目ID + ProjectName string `json:"projectName"` // 项目名称 + ShortName string `json:"shortName"` // 项目简称 + PID int64 `json:"pId"` // 父ID + Status string `json:"status"` // 状态(0正常 1停用) + PicURL string `json:"picUrl"` // 项目图片URL + Lng string `json:"lng"` // 经度 + Lat string `json:"lat"` // 纬度 + Remark string `json:"remark"` // 备注 + Type string `json:"type"` // 项目类型 + ColourRGB string `json:"colourRgb"` // 展示颜色RGB值 + CreateBy string `json:"createBy"` // 创建者 + UpdateBy string `json:"updateBy"` // 更新者 + CreateTime string `json:"createTime"` // 创建时间 + UpdateTime string `json:"updateTime"` // 更新时间 + DeletedAt string `json:"deletedAt"` // 删除时间 + ProjectID string `json:"projectId"` // 废弃字段,项目ID + View string `json:"view"` // 项目所在地视角参数 + ProjectSite string `json:"projectSite"` // 项目地址 + Principal string `json:"principal"` // 负责人 + PrincipalPhone string `json:"principalPhone"` // 负责人电话 + PrincipalXZ string `json:"principalXz"` // 小程序薪资负责人 + Actual string `json:"actual"` // 实际容量 + Plan string `json:"plan"` // 计划容量 + OnStreamTime string `json:"onStreamTime"` // 开工时间 + PunchRange string `json:"punchRange"` // 打卡范围(默认值:"09:00,18:00") + DesignTotal int `json:"designTotal"` // 设计总量 + SecurityAgreement string `json:"securityAgreement"` // 安全协议书 + IsType string `json:"isType"` // 项目类型(1光伏 2风电) +} + +// 子项目表 +type SubProject struct { + ID uint `json:"id"` // 主键ID + ProjectID uint `json:"projectId"` // 项目ID + ProjectName string `json:"projectName"` // 子项目名 + CreatedAt string `json:"createdAt"` // 创建时间 +} + +// PVModule 表示光伏模块的数据模型 +type PVModule struct { + ID uint `json:"id" dc:"主键ID"` // 主键ID,用于唯一标识光伏模块 + FangzhenID string `json:"fangzhenId" dc:"方阵ID"` // 方阵ID,指示光伏模块所属方阵的唯一标识符 + SubProjectID string `json:"subProjectId" dc:"子项目ID"` // 子项目ID,标识光伏模块所属子项目的唯一标识符 + WorkID string `json:"workId" dc:"工作ID"` // 工作ID,表示光伏模块所关联的工作的唯一标识符 + Name string `json:"name" dc:"名字"` // 名字,光伏模块的名称或标识 + Status string `json:"status" dc:"状态"` // 状态,表示光伏模块的当前状态。可能的取值有:0表示未开始,1表示进行中,2表示已完成 + DoneTime string `json:"doneTime" dc:"完成时间"` // 完成时间,指示光伏模块完成的时间 + Detail string `json:"detail" dc:"坐标详细信息"` // 坐标详细信息,包含关于光伏模块的详细描述 + Type int `json:"type" dc:"类型"` // 类型,表示光伏模块的类型 + Tilt float64 `json:"-" orm:"tilt" dc:"倾斜角"` // 倾斜角 + Azimuth float64 `json:"-" orm:"azimuth" dc:"方位角"` // 方位角 + DeviceID string `json:"deviceID" orm:"device_id" dc:"设备ID"` // 设备ID + EquipmentSn string `json:"equipmentSn" dc:"设备序列号"` // 设备序列号 + //Heading float64 `json:"heading" orm:"heading" dc:"方位角"` // 方位角 + //Roll float64 `json:"roll" orm:"roll" dc:"倾斜角"` // 倾斜角 +} diff --git a/api/project/project.go b/api/project/project.go new file mode 100644 index 0000000..09d0b0d --- /dev/null +++ b/api/project/project.go @@ -0,0 +1,4 @@ +package project + +type Project struct { +} diff --git a/api/project/pv_update.go b/api/project/pv_update.go new file mode 100644 index 0000000..0874832 --- /dev/null +++ b/api/project/pv_update.go @@ -0,0 +1,46 @@ +package project + +import ( + "context" + "fmt" + "github.com/gogf/gf/v2/frame/g" +) + +// 根据 ID 更新 pv_module 数据库的信息 +type PvModuleUpdateBatchReq struct { + g.Meta `path:"updateBatch" method:"post" tags:"项目首页相关" summary:"批量更新数据"` + Modules []PVModule +} + +type PvModuleUpdateRes struct { +} + +// PvModuleUpdateBatch 根据ID批量更新对应的pv_module数据 +func (p Project) PvModuleUpdateBatch(ctx context.Context, req *PvModuleUpdateBatchReq) (res *PvModuleUpdateRes, err error) { + res = &PvModuleUpdateRes{} + batchSize := 300 // 每批处理的数据量 + + for i := 0; i < len(req.Modules); i += batchSize { + end := i + batchSize + if end > len(req.Modules) { + end = len(req.Modules) + } + batch := req.Modules[i:end] + + for _, module := range batch { + dataMap := g.Map{ + "detail": module.Detail, + } + // 更新操作 + if _, err := g.Model("pv_module").Data(dataMap).Where("id", module.ID).Update(); err != nil { + fmt.Printf("Error updating module ID %d: %v\n", module.ID, err) + return nil, err // 如果更新过程中出现错误,提前返回 + } + } + // 可以在这里加入日志,记录这一批次的处理情况 + fmt.Printf("Updated a batch of %d modules starting from ID %d\n", len(batch), batch[0].ID) + } + + // 返回更新结果 + return res, nil +} diff --git a/api/project/router.go b/api/project/router.go new file mode 100644 index 0000000..770c1ef --- /dev/null +++ b/api/project/router.go @@ -0,0 +1,12 @@ +package project + +import "github.com/gogf/gf/v2/net/ghttp" + +func InitProjectAPI(group *ghttp.RouterGroup) { + group.Middleware(ghttp.MiddlewareCORS) + group.Group("/manage", func(group *ghttp.RouterGroup) { + group.Group("/api/v1", func(group *ghttp.RouterGroup) { + group.Bind(new(Project)) + }) + }) +} diff --git a/api/project/type_map.go b/api/project/type_map.go new file mode 100644 index 0000000..0e48eca --- /dev/null +++ b/api/project/type_map.go @@ -0,0 +1,38 @@ +package project + +var ConstMap = map[int]string{ + 1: "防雷接地网", + 2: "接地沟", + 3: "接地敷设", + 4: "接地检测", + 5: "围栏", + 6: "围栏基础", + 7: "围栏安装", + 8: "道路", + 9: "道路路基", + 10: "道路排水沟", + 11: "低压部分", + 12: "低压钻孔", + 13: "低压桩基", + 14: "低压支架", + 15: "低压光伏板", + 16: "低压直流电缆", + 17: "低压接地线", + 18: "低压逆变器安装", + 19: "低压电缆沟开挖", + 20: "低压敷设", + 21: "低压调试", + 22: "高压部分", + 23: "高压箱变基础", + 24: "高压箱变安装", + 25: "高压电缆线开挖", + 26: "高压电缆敷设", + 27: "高压电缆试验", + 28: "高压电缆调式试验", + 29: "环网柜", + 30: "环网柜基础", + 31: "环网柜安装", + 32: "环网柜敷设", + 33: "环网柜试验", + 34: "环网柜调试试验", +} diff --git a/api/saft_hat/device.go b/api/saft_hat/device.go new file mode 100644 index 0000000..cc97d04 --- /dev/null +++ b/api/saft_hat/device.go @@ -0,0 +1,98 @@ +package saft_hat + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "time" +) + +// 新增安全帽设备 +type CreateDeviceReq struct { + g.Meta `path:"/device/create" method:"post" tags:"设备管理" summary:"创建新设备"` + DevNum string `json:"devNum" dc:"设备编号"` + DevName string `json:"devName" dc:"设备名称"` + ProjectID int64 `json:"projectId" dc:"项目ID"` +} + +type CreateDeviceRes struct { +} + +func (h Hat) CreateDevice(ctx context.Context, req *CreateDeviceReq) (res *CreateDeviceRes, err error) { + res = new(CreateDeviceRes) + device := g.Map{ + "dev_num": req.DevNum, + "dev_name": req.DevName, + "project_id": req.ProjectID, + "create_time": time.Now(), + } + _, err = g.Model("device").Ctx(ctx).Insert(device) + if err != nil { + return res, err + } + return res, nil +} + +// 获取安全帽设备列表 +type DeviceListReq struct { + g.Meta `path:"/device/list" method:"get" tags:"设备管理" summary:"获取设备信息"` + ProjectId int64 `json:"projectId" dc:"项目ID"` + Page int64 `json:"page" dc:"请求的页码" v:"required"` + PageSize int64 `json:"pageSize" dc:"每页显示的条目数" v:"required"` +} + +type DeviceListRes struct { + Devices []Device `json:"devices"` // 设备信息 +} + +func (h Hat) GetDevice(ctx context.Context, req *DeviceListReq) (res *DeviceListRes, err error) { + res = new(DeviceListRes) + offset := (req.Page - 1) * req.PageSize + var devices []Device + err = g.Model("device").Ctx(ctx).Where("project_id = ?", req.ProjectId).Offset(int(offset)).Limit(int(req.PageSize)).Scan(&devices) + if err != nil { + return nil, err + } + + res.Devices = devices + return res, nil +} + +// 删除设备信息 +type DeleteDeviceReq struct { + g.Meta `path:"/device/delete" method:"delete" tags:"设备管理" summary:"删除设备"` + DevNum string `json:"devNum" dc:"设备编号"` // 设备编号 +} + +type DeleteDeviceRes struct { +} + +func (h Hat) DeleteDevice(ctx context.Context, req *DeleteDeviceReq) (res *DeleteDeviceRes, err error) { + res = new(DeleteDeviceRes) + // 执行删除操作 + _, err = g.Model("device").Ctx(ctx).Where("dev_num", req.DevNum).Delete() + if err != nil { + return res, err + } + return res, nil +} + +// 修改安全帽的名称 +type UpdateDeviceNameReq struct { + g.Meta `path:"/device/update/name" method:"post" tags:"设备管理" summary:"更新安全帽设备名称"` + DevNum string `json:"devNum" dc:"设备编号"` + DevName string `json:"devName" dc:"设备名称"` +} + +type UpdateDeviceNameRes struct { +} + +func (h Hat) UpdateDeviceName(ctx context.Context, req *UpdateDeviceNameReq) (res *UpdateDeviceNameRes, err error) { + res = new(UpdateDeviceNameRes) + _, err = g.Model("device").Data(g.Map{ + "dev_name": req.DevName, + }).Where("dev_num", req.DevNum).Update() + if err != nil { + return res, err + } + return res, nil +} diff --git a/api/saft_hat/entity.go b/api/saft_hat/entity.go new file mode 100644 index 0000000..fb35848 --- /dev/null +++ b/api/saft_hat/entity.go @@ -0,0 +1,39 @@ +package saft_hat + +import "time" + +type Device struct { + DevNum string `json:"devNum" dc:"设备编号"` + DevName string `json:"devName" dc:"设备名称"` + Status int `json:"status" dc:"状态"` + CreateTime time.Time `json:"createTime" dc:"添加时间"` + UpdateTime time.Time `json:"updateTime" dc:"修改时间"` + ProjectID int64 `json:"projectId" dc:"项目id"` + Temperature float64 `json:"temperature" dc:"设备采集温度"` + Humidity float64 `json:"humidity" dc:"设备采集湿度"` + Posture int `json:"posture" dc:"姿势,1表示正常,-1表示脱帽,-2表示倒地"` + BatteryTemp float64 `json:"batteryTemp" dc:"电池温度"` + FixedBy string `json:"fixedBy" dc:"定位方"` + BatteryLevel float64 `json:"batteryLevel" dc:"电量"` + IsLowBattery int `json:"isLowBattery" dc:"是否低电量 1为低电量,0为正常"` +} + +type Location struct { + DevNum string `json:"devNum" dc:"设备编号"` + Time string `json:"time" dc:"时间"` + Alarm *int `json:"alarm" dc:"告警信息"` + Status *int `json:"status" dc:"状态"` + Latitude float64 `json:"latitude" dc:"纬度"` + Longitude float64 `json:"longitude" dc:"经度"` + Elevation *int16 `json:"elevation" dc:"海拔"` + Speed *int16 `json:"speed" dc:"速度"` + Direction *int16 `json:"direction" dc:"方向"` + Mileage *int64 `json:"mileage" dc:"里程数"` + AccEnable *bool `json:"accEnable" dc:"ACC开关"` + LocateEnable *bool `json:"locateEnable" dc:"定位开关"` + LatitudeType *int8 `json:"latitudeType" dc:"纬度类型"` // 0:北纬, 1:南纬 + LongitudeType *int8 `json:"longitudeType" dc:"经度类型"` // 0:东经, 1:西经 + SpeedingWarn *bool `json:"speedingWarn" dc:"超速报警"` + PowerVoltageWarn *bool `json:"powerVoltageWarn" dc:"电压告警"` + PowerFailure *bool `json:"powerFailure" dc:"电源掉电"` +} diff --git a/api/saft_hat/hat.go b/api/saft_hat/hat.go new file mode 100644 index 0000000..d1493fd --- /dev/null +++ b/api/saft_hat/hat.go @@ -0,0 +1,8 @@ +package saft_hat + +// 定义签名的 APPID 和密钥常量 +const secret = "5366474e589c4dcfadeef223a466ca0b" +const appid = "0c9ab925c6684ab4a33350e15ee35062" + +type Hat struct { +} diff --git a/api/saft_hat/hat_danger.go b/api/saft_hat/hat_danger.go new file mode 100644 index 0000000..e29d4c1 --- /dev/null +++ b/api/saft_hat/hat_danger.go @@ -0,0 +1,54 @@ +package saft_hat + +import ( + "context" + "errors" + "fmt" + "github.com/gogf/gf/v2/encoding/gjson" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/glog" + "io/ioutil" + "log" +) + +// 危险源数据上传结构体 +type Danger struct { + BT_MAC string `json:"BT_MAC"` // 危险源MAC + IMEI string `json:"IMEI"` // 设备IMEI编号 +} + +// 危险源数据上传请求 +type DangerReq struct { + g.Meta `path:"/device/danger" method:"post" tags:"安全帽相关" summary:"接收危险源数据(不需要前端调用)"` +} + +type DangerRes struct { +} + +func (h Hat) Danger(ctx context.Context, req *DangerReq) (res *DangerRes, err error) { + res = new(DangerRes) + r := g.RequestFromCtx(ctx) + body, err := ioutil.ReadAll(r.Body) + if err != nil { + log.Printf("Failed to read request body: %v", err) + return nil, err + } + defer r.Body.Close() + + timestamp := r.GetHeader("timestamp") + signature := r.GetHeader("signature") + + if !VerifySignature(string(body)+timestamp, signature, secret) { + glog.Errorf(ctx, "Signature verification failed") + return nil, errors.New("signature verification failed") + } + + var danger Danger + if err := gjson.DecodeTo(body, &danger); err != nil { + return nil, err + } + + fmt.Println("危险源数据", danger) + + return res, nil +} diff --git a/api/saft_hat/hat_data.go b/api/saft_hat/hat_data.go new file mode 100644 index 0000000..6ac09f5 --- /dev/null +++ b/api/saft_hat/hat_data.go @@ -0,0 +1,259 @@ +package saft_hat + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "github.com/gogf/gf/v2/encoding/gjson" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/glog" + "github.com/gorilla/websocket" + "io/ioutil" + "log" + "net/http" + "strconv" + "time" +) + +func StartWs() { + // 设置 WebSocket 路由 + http.HandleFunc("/ws", HandleConnections) + + // 开启一个新的协程,处理消息广播 + go HandleMessages() + + // 启动 WebSocket 服务器 + log.Println("http server started on :8222") + err := http.ListenAndServe(":8222", nil) + if err != nil { + log.Fatal("ListenAndServe: ", err) + } + +} + +// WebSocket 部分 +var clients = make(map[*websocket.Conn]bool) // 连接的客户端 +var broadcast = make(chan []byte) // 广播通道 +var upgrader = websocket.Upgrader{ + CheckOrigin: func(r *http.Request) bool { + return true + }, +} + +// 处理连接 +func HandleConnections(w http.ResponseWriter, r *http.Request) { + ws, err := upgrader.Upgrade(w, r, nil) + if err != nil { + log.Fatal(err) + } + defer ws.Close() + + // 注册新客户端 + clients[ws] = true + + // 无限循环,保持连接活跃,但不处理任何消息 + for { + if _, _, err := ws.ReadMessage(); err != nil { + log.Printf("error: %v", err) + delete(clients, ws) + break + } + } +} + +// 处理消息 +func HandleMessages() { + for { + // 从广播通道中获取消息 + msg := <-broadcast + + // 发送消息到所有连接的客户端 + for client := range clients { + err := client.WriteMessage(websocket.TextMessage, msg) + if err != nil { + log.Printf("websocket write error: %v", err) + client.Close() + delete(clients, client) + } + } + } +} + +// WS 推送的数据 +type BroadcastLocation struct { + DevNum string `json:"devNum"` + Time string `json:"time"` + Latitude float64 `json:"latitude"` + Longitude float64 `json:"longitude"` +} + +// Webhook 定位数据上传【远程发送给我们平台的数据】 +type WebhookRequest struct { + Temperature float64 `json:"temperature"` // 设备采集温度数据 + Humidity float64 `json:"humidity"` // 设备采集湿度数据 + Posture int `json:"posture"` // 姿态:1正常 -1脱帽 -2倒地 + BatteryTemp float64 `json:"batteryTemp"` // 电池温度 + FixedBy string `json:"fixedBy"` // 定位方式:GPS/BD、WIFI、BT + UtcDateTime int64 `json:"utcDateTime"` // 设备内部上传时间戳 + IMEI string `json:"IMEI"` // 设备IMEI + BatteryLevel float64 `json:"batteryLevel"` // 电池电量 + Charging int `json:"charging"` // 是否正在充电 1充电 0没充电 + BluetoothMac string `json:"bluetoothMac"` // 蓝牙Mac地址 + Type string `json:"type"` // 设备上传类型和时间 + Latitude float64 `json:"latitude"` // WGS-84:是国际标准,GPS坐标(Google Earth使用、或者GPS模块)纬度坐标 + Longitude float64 `json:"longitude"` // WGS-84:是国际标准,GPS坐标(Google Earth使用、或者GPS模块)经度坐标 + Altitude int `json:"altitude"` // 海拔高度 + BT string `json:"bt"` // 蓝牙定位相关:{个数}:{地址,信号} + LBS []string `json:"LBS"` // 多基站定位信息 + MAC []string `json:"MAC"` // WiFi - MAC地址信号 +} + +// 定位数据上传请求 +type DataReq struct { + g.Meta `path:"/device/data" method:"post" tags:"安全帽相关" summary:"接收安全帽数据(不需要前端调用)"` +} + +type DataRes struct { +} + +func (h Hat) Data(ctx context.Context, req *DataReq) (res *DataRes, err error) { + res = new(DataRes) + r := g.RequestFromCtx(ctx) + body, err := ioutil.ReadAll(r.Body) + if err != nil { + log.Printf("读取请求头失败: %v", err) + return res, err + } + defer r.Body.Close() // 延迟关闭请求体 + + // 从请求头中获取时间戳和签名 + timestamp := r.GetHeader("timestamp") + signature := r.GetHeader("signature") + + // 验证签名的有效性 + if !VerifySignature(string(body)+timestamp, signature, secret) { + glog.Errorf(ctx, "签名验证失败") + return res, errors.New("验证签名失败") + } + + // 解析请求体中的JSON数据到预定义的结构体 + var webhookData WebhookRequest + if err := gjson.DecodeTo(body, &webhookData); err != nil { + return res, err + } + + // 拿到数据之后,先取出 IMEI 设备号,根据 IMEI 查询,不存在则先插入数据到 device 表 + device := Device{ + DevNum: webhookData.IMEI, + Temperature: webhookData.Temperature, + Humidity: webhookData.Humidity, + Posture: webhookData.Posture, + FixedBy: webhookData.FixedBy, + BatteryLevel: webhookData.BatteryLevel, + } + + // 查询设备是否存在,存在则更新安全帽的状态信息 + count, err := g.Model(&device).Where("dev_num", device.DevNum).Count() + if err != nil { + glog.Errorf(ctx, "查询设备是否存在出错:%v", err) + } + + if count > 0 { + // 判断电池是否处于低电量状态 + var isLowBattery int + + // 电量小于 0.2 则设置为低电量 + if device.BatteryLevel < 0.2 { + isLowBattery = 1 + } else { + isLowBattery = 0 + } + + // 更新设备的数据 + _, err = g.Model("device").Data(g.Map{ + "temperature": device.Temperature, + "humidity": device.Humidity, + "posture": device.Posture, + "battery_temp": device.BatteryTemp, + "fixed_by": device.FixedBy, + "battery_level": device.BatteryLevel * 100, + "is_low_battery": isLowBattery, + "update_time": time.Now(), + }).Where("dev_num", device.DevNum).Update() + + if err != nil { + glog.Errorf(ctx, "更新设备数据出错:%v", err) + } + } + + // 将接收到的数据转换为 Location 结构体 + location := Location{ + DevNum: webhookData.IMEI, // 设备编号为 IMEI + Time: time.Now().Format("2006-01-02 15:04:05"), // 当前时间 + Latitude: webhookData.Latitude, // 将纬度转换为指针类型 + Longitude: webhookData.Longitude, // 将经度转换为指针类型 + } + + // 构建插入数据的参数 + data := g.Map{ + "dev_num": location.DevNum, + "time": location.Time, + "latitude": location.Latitude, + "longitude": location.Longitude, + } + + // 检查经纬度是否同时为 0,如果是则不执行插入操作,也不需要调用 Redis + if location.Latitude != 0 || location.Longitude != 0 { + // 执行插入操作 + _, err = g.Model("location").Data(data).Insert() + // 获取 Redis 客户端 + redis := g.Redis("helmetRedis") + + // 构造 Redis 的 key 和 value + key := "safety_helmet:" + location.DevNum + value := strconv.FormatFloat(location.Latitude, 'f', -1, 64) + "," + strconv.FormatFloat(location.Longitude, 'f', -1, 64) + + // 插入数据之后,写入 Redis 的发布订阅 + _, err = redis.Publish(ctx, key, value) + if err != nil { + glog.Info(ctx, "发布订阅出错") + return res, nil + } + // 插入数据之后,写入 Redis 的键值对 + _, err = redis.Set(ctx, key, value) + if err != nil { + glog.Info(ctx, "设置到Redis出错") + return res, nil + } + if err != nil { + // 处理可能的错误 + fmt.Println("Insert error:", err) + } + } else { + fmt.Println("Latitude and Longitude are both zero, insertion skipped.") + } + + // 返回响应对象 + return &DataRes{}, nil +} + +// 发送数据到 WS 客户端 +func sendToWs(location Location, err error) { + // 创建 WS 需要发送的数据对象 + broadcastLocation := BroadcastLocation{ + DevNum: location.DevNum, + Time: location.Time, + Latitude: location.Latitude, + Longitude: location.Longitude, + } + + // 转换为 JSON 字符串 + locationJSON, err := json.Marshal(broadcastLocation) + if err != nil { + log.Printf("location json marshal error: %v", err) + } else { + // 发送转换后的JSON字符串到广播通道 + broadcast <- locationJSON + } +} diff --git a/api/saft_hat/hat_location.go b/api/saft_hat/hat_location.go new file mode 100644 index 0000000..9e3b6dc --- /dev/null +++ b/api/saft_hat/hat_location.go @@ -0,0 +1,78 @@ +package saft_hat + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "strconv" + "time" + + "github.com/gogf/gf/v2/frame/g" +) + +// 更新设备定位数据 +type LocationReq struct { + g.Meta `path:"/device/location" method:"post" tags:"安全帽相关" summary:"刷新设备定位数据"` + Data string `json:"data" dc:"设备号"` // 设备数据 +} + +type LocationRes struct { + Code int `json:"code"` // 响应代码 + Data bool `json:"data"` // 是否成功 + Msg string `json:"msg"` // 响应消息 +} + +// 处理设备开关机时间的更新 +func (h Hat) Location(ctx context.Context, req *LocationReq) (res *LocationRes, err error) { + res = new(LocationRes) + data := req.Data + timestamp := time.Now().Unix() + + // 准备生成签名的参数 + params := map[string]string{ + "appid": appid, + "data": data, + "secret": secret, + "timestamp": strconv.FormatInt(timestamp, 10), + } + + // 生成签名 + sign := GenerateSignature(params) + + // 构造请求体 + payload := map[string]interface{}{ + "appid": appid, + "data": data, + "secret": secret, + "timestamp": timestamp, + "sign": sign, + } + payloadBytes, err := json.Marshal(payload) + if err != nil { + return res, err + } + + // 发送POST请求 + resp, err := http.Post("https://www.loctp.com/api/crm/v1/refresh/location", "application/json", bytes.NewBuffer(payloadBytes)) + if err != nil { + return res, err + } + defer resp.Body.Close() + + // 检查响应 + respBody, err := ioutil.ReadAll(resp.Body) + fmt.Println(string(respBody)) + if err != nil { + return res, err + } + + err = json.Unmarshal(respBody, res) + if err != nil { + return res, err + } + + return res, nil +} diff --git a/api/saft_hat/hat_rate.go b/api/saft_hat/hat_rate.go new file mode 100644 index 0000000..e15b4f6 --- /dev/null +++ b/api/saft_hat/hat_rate.go @@ -0,0 +1,81 @@ +package saft_hat + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "io/ioutil" + "net/http" + "strconv" + "time" +) + +// 定义设备上传速度频率请求【我们请求平台】 +type UploadRateReq struct { + g.Meta `path:"/device/rate" method:"post" tags:"安全帽相关" summary:"更新设备数据发送频率"` + Data string `json:"data" dc:"设备号"` // 设备数据 + RateTime int `json:"rateTime" dc:"上传频率单位是S"` // 上传频率 +} + +type UploadRateRes struct { + Code int `json:"code"` // 响应代码 + Data string `json:"data"` // 设备数据 + Msg string `json:"msg"` // 响应消息 +} + +func (h Hat) UpdateRate(ctx context.Context, req *UploadRateReq) (res *UploadRateRes, err error) { + res = new(UploadRateRes) + // 获取请求参数 + rateTime := req.RateTime + data := req.Data + timestamp := time.Now().Unix() + + // 准备生成签名的参数 + params := map[string]string{ + "appid": appid, + "data": data, + "rate_time": strconv.Itoa(rateTime), + "secret": secret, + "timestamp": strconv.FormatInt(timestamp, 10), + } + // 生成签名 + sign := GenerateSignature(params) + + // 构造请求体 + payload := map[string]interface{}{ + "appid": appid, + "data": data, + "rate_time": rateTime, + "timestamp": timestamp, + "secret": secret, + "sign": sign, + } + payloadBytes, err := json.Marshal(payload) + if err != nil { + return res, err + } + + // 发送POST请求 + resp, err := http.Post("https://www.loctp.com/api/crm/v1/uploadRate", "application/json", bytes.NewBuffer(payloadBytes)) + if err != nil { + return res, err + } + defer resp.Body.Close() + + // 检查响应 + respBody, err := ioutil.ReadAll(resp.Body) + err = json.Unmarshal(respBody, &res) + if err != nil { + return res, err + } + + // 把 respBody 转化为 UploadRateRes + err = json.Unmarshal(respBody, &res) + if err != nil { + // 处理错误,例如打印或返回错误 + fmt.Println("Error unmarshalling res:", err) + } + return res, err +} diff --git a/api/saft_hat/hat_sos.go b/api/saft_hat/hat_sos.go new file mode 100644 index 0000000..f307ada --- /dev/null +++ b/api/saft_hat/hat_sos.go @@ -0,0 +1,62 @@ +package saft_hat + +import ( + "context" + "errors" + "fmt" + "github.com/gogf/gf/v2/encoding/gjson" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/glog" + "io/ioutil" + "log" +) + +// SOS报警数据结构体 +type SOS struct { + Flag int `json:"flag"` // 两次数据上传标志:0:第二次 1:第一次 + UTCDateTime int64 `json:"utcDateTime"` // 设备内部上传时间戳 + Latitude float64 `json:"latitude"` // WGS-84 纬度坐标 + IMEI string `json:"IMEI"` // 设备IMEI编号 + Type string `json:"type"` // 设备上传类型和时间 + Longitude float64 `json:"longitude"` // WGS-84 经度坐标 +} + +// SOS报警数据上传请求【其它平台发给我们】 +type SOSReq struct { + g.Meta `path:"/device/alarm" method:"post" tags:"安全帽相关" summary:"接收SOS报警数据(不需要前端调用)"` +} + +type SOSRes struct { +} + +func (h Hat) SOS(ctx context.Context, req *SOSReq) (res *SOSRes, err error) { + r := g.RequestFromCtx(ctx) // 从上下文中获取请求对象 + body, err := ioutil.ReadAll(r.Body) // 读取请求体 + if err != nil { + log.Printf("读取请求头失败: %v", err) + return nil, err + } + defer r.Body.Close() // 延迟关闭请求体 + + // 从请求头中获取时间戳和签名 + timestamp := r.GetHeader("timestamp") + signature := r.GetHeader("signature") + + // 验证签名的有效性 + if !VerifySignature(string(body)+timestamp, signature, secret) { + glog.Errorf(ctx, "签名验证失败") + return nil, errors.New("验证签名失败") + } + + // 解析请求体中的 JSON 数据到预定义的结构体 + var sos SOS + if err := gjson.DecodeTo(body, &sos); err != nil { + return nil, err + } + + // 输出 SOS 的报警信息 + fmt.Println("报警信息:", sos) + + // 返回响应对象 + return &SOSRes{}, nil +} diff --git a/api/saft_hat/hat_status.go b/api/saft_hat/hat_status.go new file mode 100644 index 0000000..9b5ccd5 --- /dev/null +++ b/api/saft_hat/hat_status.go @@ -0,0 +1,133 @@ +package saft_hat + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "io/ioutil" + "net/http" + "strconv" + "strings" + "time" +) + +// 获取设备状态的请求结构 +type DeviceStatusReq struct { + g.Meta `path:"/device/status" method:"post" tags:"安全帽相关" summary:"获取安全帽状态"` + Data []string `json:"data" dc:"设备号"` +} + +// 获取设备状态 +func (h Hat) DeviceStatus(ctx context.Context, req *DeviceStatusReq) (res *DeviceStatusRes, err error) { + return StatusCheck(ctx, req.Data) +} + +type DeviceStatusRes struct { + Code int `json:"code"` // 响应代码 + Data []DeviceStatusInfo `json:"data"` // 设备数据 + Msg string `json:"msg"` // 响应消息 +} + +// 定义数组中每个对象的结构 +type DeviceStatusInfo struct { + IMEI string `json:"imei"` + Status int `json:"status"` +} + +// 检查设备的状态情况 +func StatusCheck(ctx context.Context, devNums []string) (res *DeviceStatusRes, err error) { + res = new(DeviceStatusRes) + data := strings.Join(devNums, ",") + timestamp := time.Now().Unix() + + // 准备生成签名的参数 + params := map[string]string{ + "appid": appid, + "data": data, + "secret": secret, + "timestamp": strconv.FormatInt(timestamp, 10), + } + + // 生成签名 + sign := GenerateSignature(params) + + // 构造请求体 + payload := map[string]interface{}{ + "appid": appid, + "data": data, + "secret": secret, + "sign": sign, + "timestamp": timestamp, + } + payloadBytes, err := json.Marshal(payload) + if err != nil { + return res, err + } + + // 发送POST请求 + resp, err := http.Post("https://www.loctp.com/api/crm/v1/getStatus", "application/json", bytes.NewBuffer(payloadBytes)) + + if err != nil { + return res, err + } + defer resp.Body.Close() + + // 检查响应 + respBody, err := ioutil.ReadAll(resp.Body) + fmt.Println(string(respBody)) + if err != nil { + return res, err + } + + err = json.Unmarshal(respBody, res) + if err != nil { + return res, err + } + + return res, nil +} + +// 心跳检测 +func HeartCheck() { + ticker := time.NewTicker(60 * time.Second) + defer ticker.Stop() // 确保ticker被适当释放 + + for { + select { + case <-ticker.C: + var devices []Device + err := g.Model("device").Fields("dev_num").Scan(&devices) + if err != nil { + fmt.Println("获取设备列表出错:", err) + continue // 如果获取失败,则跳过本次循环 + } + + if len(devices) == 0 { + fmt.Println("没有找到任何设备") + continue // 如果没有设备,则跳过本次循环 + } + + // 构建devNums切片 + var devNums []string + for _, device := range devices { + devNums = append(devNums, device.DevNum) + } + res, err := StatusCheck(context.Background(), devNums) + if err != nil { + fmt.Println("检查设备状态出错:", err) + continue // 如果检查失败,则跳过本次循环 + } + + for _, deviceStatus := range res.Data { + // 更新 device 表中的 status 字段 + _, err := g.Model("device").Data("status", deviceStatus.Status).Where("dev_num", deviceStatus.IMEI).Update() + if err != nil { + fmt.Printf("更新设备 %s 状态出错: %v\n", deviceStatus.IMEI, err) + continue // 如果更新失败,则跳过本次设备的更新 + } + } + } + } +} diff --git a/api/saft_hat/hat_text_audio.go b/api/saft_hat/hat_text_audio.go new file mode 100644 index 0000000..8e5dd9f --- /dev/null +++ b/api/saft_hat/hat_text_audio.go @@ -0,0 +1,78 @@ +package saft_hat + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "io/ioutil" + "net/http" + "strconv" + "time" +) + +// TextToAudioReq 定义发送自定义语音的请求结构体 +type TextToAudioReq struct { + g.Meta `path:"/device/text" method:"post" tags:"安全帽相关" summary:"发送自定义语言数据"` + Data string `json:"data" dc:"设备号"` + Text string `json:"text" dc:"发送语音的文字内容"` + Time int `json:"time" dc:"播放次数 最少一次 最多三次"` +} + +type TextToAudioRes struct { + Code int `json:"code"` // 响应代码 + Data string `json:"data"` // 设备数据 + Msg string `json:"msg"` // 响应消息 +} + +// 发送自定义语音 +func (h Hat) SendTextToAudio(ctx context.Context, req *TextToAudioReq) (res *TextToAudioRes, err error) { + res = new(TextToAudioRes) + timestamp := time.Now().Unix() + + // 准备生成签名的参数 + params := map[string]string{ + "appid": appid, + "data": req.Data, + "secret": secret, + "text": req.Text, + "time": strconv.Itoa(req.Time), + "timestamp": strconv.FormatInt(timestamp, 10), + } + + // 生成签名 + sign := GenerateSignature(params) + + // 构造请求体 + reqBody := map[string]interface{}{ + "data": req.Data, + "appid": appid, + "sign": sign, + "secret": secret, + "time": req.Time, + "text": req.Text, + "timestamp": strconv.FormatInt(timestamp, 10), + } + + payloadBytes, err := json.Marshal(reqBody) + if err != nil { + return res, err + } + + // 发送POST请求 + resp, err := http.Post("https://www.loctp.com/api/crm/v1/textToAudio", "application/json", bytes.NewBuffer(payloadBytes)) + if err != nil { + return res, err + } + defer resp.Body.Close() + + // 读取响应 + respBody, err := ioutil.ReadAll(resp.Body) + if err != nil { + return res, err + } + + fmt.Println("Response:", string(respBody)) + return res, nil +} diff --git a/api/saft_hat/hat_time.go b/api/saft_hat/hat_time.go new file mode 100644 index 0000000..79e3326 --- /dev/null +++ b/api/saft_hat/hat_time.go @@ -0,0 +1,114 @@ +package saft_hat + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "io/ioutil" + "net/http" + "strconv" + "strings" + "time" +) + +// 更新设备开关机时间 +type UpdateTimeReq struct { + g.Meta `path:"/device/uploadTime" method:"post" tags:"安全帽相关" summary:"更新设备开关机时间"` + Data string `json:"data" dc:"设备号"` // 设备数据 + OnTime string `json:"onTime" dc:"设备开机时间,例如 09:00"` // 设备开机时间 + OffTime string `json:"OffTime" dc:"设备关机时间,例如 23:00"` // 设备关机时间 +} + +type UpdateTimeRes struct { + Code int `json:"code"` // 响应代码 + Data string `json:"data"` // 设备数据 + Msg string `json:"msg"` // 响应消息 +} + +// 处理设备开关机时间的更新 +func (h Hat) UpdateTime(ctx context.Context, req *UpdateTimeReq) (res *UpdateTimeRes, err error) { + res = new(UpdateTimeRes) + data := req.Data + timestamp := time.Now().Unix() + + // 准备生成签名的参数 + params := map[string]string{ + "appid": appid, + "data": data, + "off_time": req.OffTime, + "on_time": req.OnTime, + "secret": secret, + "timestamp": strconv.FormatInt(timestamp, 10), + } + + // 生成签名 + sign := GenerateSignature(params) + + // 构造请求体 + payload := map[string]interface{}{ + "appid": appid, + "data": data, + "off_time": req.OffTime, + "on_time": req.OnTime, + "secret": secret, + "timestamp": timestamp, + "sign": sign, + } + payloadBytes, err := json.Marshal(payload) + if err != nil { + return res, err + } + + // 发送POST请求 + resp, err := http.Post("https://www.loctp.com/api/crm/v1/uploadTime", "application/json", bytes.NewBuffer(payloadBytes)) + if err != nil { + return res, err + } + defer resp.Body.Close() + + // 检查响应 + respBody, err := ioutil.ReadAll(resp.Body) + if err != nil { + return res, err + } + + // 解析包含多个设备号的字符串,设备号通过英文逗号分割 + devNums := strings.Split(req.Data, ",") + + // 对每个设备号执行插入或更新操作 + for _, devNum := range devNums { + // 首先去除可能的空格 + devNum = strings.TrimSpace(devNum) + type StutusType struct { + Status int + } + statusType := new(StutusType) + // 先查看该设备的状态 + g.Model("device").Fields("status").Where("dev_num = ?", devNum).Scan(&statusType) + // 如果设备在线(status=1)才允许更新它的开关机时间信息 + if statusType.Status == 1 { + // 插入或更新电池开关机时间 + _, err := g.Model("device").Data(g.Map{ + "dev_num": devNum, + "battery_on": req.OnTime, + "battery_off": req.OffTime, + }).Where("dev_num", devNum).Save() + // 如果发生错误,立即返回 + if err != nil { + fmt.Println("Error updating/inserting for device", devNum, ":", err) + return nil, err + } + } else { + fmt.Println("Device", devNum, "is not online; skipping update.") + } + } + + err = json.Unmarshal(respBody, res) + if err != nil { + return res, err + } + + return res, nil +} diff --git a/api/saft_hat/hat_tip.go b/api/saft_hat/hat_tip.go new file mode 100644 index 0000000..c262289 --- /dev/null +++ b/api/saft_hat/hat_tip.go @@ -0,0 +1,53 @@ +package saft_hat + +import ( + "context" + "errors" + "fmt" + "github.com/gogf/gf/v2/encoding/gjson" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/glog" + "io/ioutil" + "log" +) + +// 脱帽提示数据上传结构体 +type HatTip struct { + UTCDateTime int64 `json:"utcDateTime"` // 设备内部上传时间戳 + IMEI string `json:"IMEI"` // 设备IMEI编号 +} + +type HatTipReq struct { + g.Meta `path:"/device/tip" method:"post" tags:"安全帽相关" summary:"脱帽提醒(不需要前端调用)"` +} + +type HatTipRes struct { +} + +func (h Hat) HatTip(ctx context.Context, req *HatTipReq) (res *HatTipRes, err error) { + res = new(HatTipRes) + r := g.RequestFromCtx(ctx) + body, err := ioutil.ReadAll(r.Body) + if err != nil { + log.Printf("Failed to read request body: %v", err) + return nil, err + } + defer r.Body.Close() + + timestamp := r.GetHeader("timestamp") + signature := r.GetHeader("signature") + + if !VerifySignature(string(body)+timestamp, signature, secret) { + glog.Errorf(ctx, "Signature verification failed") + return nil, errors.New("signature verification failed") + } + + var hatTip HatTip + if err := gjson.DecodeTo(body, &hatTip); err != nil { + return nil, err + } + + fmt.Println("脱帽提示数据:", hatTip) + + return res, nil +} diff --git a/api/saft_hat/hat_voice.go b/api/saft_hat/hat_voice.go new file mode 100644 index 0000000..a0d8ac3 --- /dev/null +++ b/api/saft_hat/hat_voice.go @@ -0,0 +1,81 @@ +package saft_hat + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "io/ioutil" + "net/http" + "strconv" + "time" +) + +// 定义发送内置语音的请求结构 +type SendVoiceReq struct { + g.Meta `path:"/device/voice" method:"post" tags:"安全帽相关" summary:"发送内置语音"` + Data string `json:"data" dc:"设备号"` + VoiceType int `json:"voice_type" dc:"内置语音种类,具体参照温度,1、2、3、4、5....."` +} + +type SendVoiceRes struct { + Code int `json:"code"` // 响应代码 + Data string `json:"data"` // 设备数据 + Msg string `json:"msg"` // 响应消息 +} + +// 处理设备开关机时间的更新 +func (h Hat) SendVoice(ctx context.Context, req *SendVoiceReq) (res *SendVoiceRes, err error) { + res = new(SendVoiceRes) + data := req.Data + timestamp := time.Now().Unix() + + // 准备生成签名的参数 + params := map[string]string{ + "appid": appid, + "data": data, + "secret": secret, + "timestamp": strconv.FormatInt(timestamp, 10), + "voice_type": strconv.Itoa(req.VoiceType), + } + + // 生成签名 + sign := GenerateSignature(params) + + // 构造请求体 + payload := map[string]interface{}{ + "appid": appid, + "data": data, + "secret": secret, + "sign": sign, + "timestamp": timestamp, + "voice_type": strconv.Itoa(req.VoiceType), + } + payloadBytes, err := json.Marshal(payload) + if err != nil { + return res, err + } + + // 发送POST请求 + resp, err := http.Post("https://www.loctp.com/api/crm/v1/sendVoice", "application/json", bytes.NewBuffer(payloadBytes)) + + if err != nil { + return res, err + } + defer resp.Body.Close() + + // 检查响应 + respBody, err := ioutil.ReadAll(resp.Body) + fmt.Println(string(respBody)) + if err != nil { + return res, err + } + + err = json.Unmarshal(respBody, res) + if err != nil { + return res, err + } + + return res, nil +} diff --git a/api/saft_hat/router.go b/api/saft_hat/router.go new file mode 100644 index 0000000..f518d78 --- /dev/null +++ b/api/saft_hat/router.go @@ -0,0 +1,14 @@ +package saft_hat + +import ( + "github.com/gogf/gf/v2/net/ghttp" +) + +func InitHatAPI(group *ghttp.RouterGroup) { + group.Middleware(ghttp.MiddlewareCORS) + group.Group("/manage", func(group *ghttp.RouterGroup) { + group.Group("/api/v1", func(group *ghttp.RouterGroup) { + group.Bind(new(Hat)) + }) + }) +} diff --git a/api/saft_hat/util.go b/api/saft_hat/util.go new file mode 100644 index 0000000..2d113cf --- /dev/null +++ b/api/saft_hat/util.go @@ -0,0 +1,35 @@ +package saft_hat + +import ( + "crypto/md5" + "encoding/hex" + "sort" + "strings" +) + +// 使用参数名的ASCII升序排序后,将参数的值进行拼接并加密生成签名 +func GenerateSignature(params map[string]string) string { + // 获取所有的键并按照ASCII码排序 + var keys []string + for k := range params { + keys = append(keys, k) + } + sort.Strings(keys) + + // 按排序后的键,拼接它们的值 + var values []string + for _, k := range keys { + values = append(values, params[k]) + } + signStr := strings.Join(values, "&") + + // 将拼接后的字符串转换为小写 + signStr = strings.ToLower(signStr) + + // 使用MD5加密 + hash := md5.New() + hash.Write([]byte(signStr)) + md5String := hex.EncodeToString(hash.Sum(nil)) + + return md5String +} diff --git a/api/saft_hat/verify.go b/api/saft_hat/verify.go new file mode 100644 index 0000000..db3838d --- /dev/null +++ b/api/saft_hat/verify.go @@ -0,0 +1,21 @@ +package saft_hat + +import ( + "crypto/hmac" + "crypto/sha1" + "encoding/hex" + "log" +) + +// 函数用于验证请求的签名 +func VerifySignature(message, messageSignature, secret string) bool { + mac := hmac.New(sha1.New, []byte(secret)) // 初始化HMAC-SHA1 + mac.Write([]byte(message)) // 写入消息体以计算摘要 + expectedMAC := mac.Sum(nil) // 计算消息的摘要 + signature, err := hex.DecodeString(messageSignature) // 将签名从十六进制字符串解码 + if err != nil { + log.Printf("解码失败: %v", err) + return false + } + return hmac.Equal(signature, expectedMAC) // 比较计算得到的摘要和传入的签名 +} diff --git a/api/test/test_contact_info.go b/api/test/test_contact_info.go new file mode 100644 index 0000000..c1e09f0 --- /dev/null +++ b/api/test/test_contact_info.go @@ -0,0 +1,91 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-09-01 17:36:18 +// 生成路径: api/v1/test/test_contact_info.go +// 生成人:yqq +// desc:业主方联系人关联相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package test + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/test/model" +) + +// TestContactInfoSearchReq 分页请求参数 +type TestContactInfoSearchReq struct { + g.Meta `path:"/list" tags:"业主方联系人关联" method:"get" summary:"业主方联系人关联列表"` + Id string `p:"id"` // + OwenerId string `p:"owenerId" v:"owenerId@integer#需为整数"` // + ContactName string `p:"contactName"` // + ContactPost string `p:"contactPost"` // + ContactPhone string `p:"contactPhone"` // + commonApi.PageReq + commonApi.Author +} + +// TestContactInfoSearchRes 列表返回结果 +type TestContactInfoSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.TestContactInfoListRes `json:"list"` +} + +// TestContactInfoAddReq 添加操作请求参数 +type TestContactInfoAddReq struct { + g.Meta `path:"/add" tags:"业主方联系人关联" method:"post" summary:"业主方联系人关联添加"` + commonApi.Author + OwenerId uint `p:"owenerId" ` + ContactName string `p:"contactName" v:"required#不能为空"` + ContactPost string `p:"contactPost" ` + ContactPhone string `p:"contactPhone" ` +} + +// TestContactInfoAddRes 添加操作返回结果 +type TestContactInfoAddRes struct { + commonApi.EmptyRes +} + +// TestContactInfoEditReq 修改操作请求参数 +type TestContactInfoEditReq struct { + g.Meta `path:"/edit" tags:"业主方联系人关联" method:"put" summary:"业主方联系人关联修改"` + commonApi.Author + Id uint `p:"id" v:"required#主键ID不能为空"` + OwenerId uint `p:"owenerId" ` + ContactName string `p:"contactName" v:"required#不能为空"` + ContactPost string `p:"contactPost" ` + ContactPhone string `p:"contactPhone" ` +} + +// TestContactInfoEditRes 修改操作返回结果 +type TestContactInfoEditRes struct { + commonApi.EmptyRes +} + +// TestContactInfoGetReq 获取一条数据请求 +type TestContactInfoGetReq struct { + g.Meta `path:"/get" tags:"业主方联系人关联" method:"get" summary:"获取业主方联系人关联信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// TestContactInfoGetRes 获取一条数据结果 +type TestContactInfoGetRes struct { + g.Meta `mime:"application/json"` + *model.TestContactInfoInfoRes +} + +// TestContactInfoDeleteReq 删除数据请求 +type TestContactInfoDeleteReq struct { + g.Meta `path:"/delete" tags:"业主方联系人关联" method:"delete" summary:"删除业主方联系人关联"` + commonApi.Author + Ids []uint `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// TestContactInfoDeleteRes 删除数据返回 +type TestContactInfoDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/test/test_follow_info.go b/api/test/test_follow_info.go new file mode 100644 index 0000000..28e73ee --- /dev/null +++ b/api/test/test_follow_info.go @@ -0,0 +1,104 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-09-01 16:38:07 +// 生成路径: api/v1/test/test_follow_info.go +// 生成人:yqq +// desc:跟进信息相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package test + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/test/model" +) + +// TestFollowInfoSearchReq 分页请求参数 +type TestFollowInfoSearchReq struct { + g.Meta `path:"/list" tags:"跟进信息" method:"get" summary:"跟进信息列表"` + Id string `p:"id"` // + ProjectId string `p:"projectId" v:"projectId@integer#关联的项目需为整数"` //关联的项目 + FollowName string `p:"followName"` //跟进人姓名 + OwnerId string `p:"ownerId" v:"ownerId@integer#业主名需为整数"` //业主名 + ContactName string `p:"contactName"` //对接人姓名 + ConPostName string `p:"conPostName"` //对接人职称 + ContactPhone string `p:"contactPhone"` //对接人电话 + FollowInfo string `p:"followInfo"` //跟进情况 + FollowFile string `p:"followFile"` //相关附件 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建日期需为YYYY-MM-DD hh:mm:ss格式"` //创建日期 + commonApi.PageReq + commonApi.Author +} + +// TestFollowInfoSearchRes 列表返回结果 +type TestFollowInfoSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.TestFollowInfoListRes `json:"list"` +} + +// TestFollowInfoAddReq 添加操作请求参数 +type TestFollowInfoAddReq struct { + g.Meta `path:"/add" tags:"跟进信息" method:"post" summary:"跟进信息添加"` + commonApi.Author + ProjectId int `p:"projectId" v:"required#关联的项目不能为空"` + FollowName string `p:"followName" v:"required#跟进人姓名不能为空"` + OwnerId uint `p:"ownerId" ` + ContactName string `p:"contactName" v:"required#对接人姓名不能为空"` + ConPostName string `p:"conPostName" v:"required#对接人职称不能为空"` + ContactPhone string `p:"contactPhone" ` + FollowInfo string `p:"followInfo" ` + FollowFile string `p:"followFile" ` +} + +// TestFollowInfoAddRes 添加操作返回结果 +type TestFollowInfoAddRes struct { + commonApi.EmptyRes +} + +// TestFollowInfoEditReq 修改操作请求参数 +type TestFollowInfoEditReq struct { + g.Meta `path:"/edit" tags:"跟进信息" method:"put" summary:"跟进信息修改"` + commonApi.Author + Id uint `p:"id" v:"required#主键ID不能为空"` + ProjectId int `p:"projectId" v:"required#关联的项目不能为空"` + FollowName string `p:"followName" v:"required#跟进人姓名不能为空"` + OwnerId uint `p:"ownerId" ` + ContactName string `p:"contactName" v:"required#对接人姓名不能为空"` + ConPostName string `p:"conPostName" v:"required#对接人职称不能为空"` + ContactPhone string `p:"contactPhone" ` + FollowInfo string `p:"followInfo" ` + FollowFile string `p:"followFile" ` +} + +// TestFollowInfoEditRes 修改操作返回结果 +type TestFollowInfoEditRes struct { + commonApi.EmptyRes +} + +// TestFollowInfoGetReq 获取一条数据请求 +type TestFollowInfoGetReq struct { + g.Meta `path:"/get" tags:"跟进信息" method:"get" summary:"获取跟进信息信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// TestFollowInfoGetRes 获取一条数据结果 +type TestFollowInfoGetRes struct { + g.Meta `mime:"application/json"` + *model.TestFollowInfoInfoRes +} + +// TestFollowInfoDeleteReq 删除数据请求 +type TestFollowInfoDeleteReq struct { + g.Meta `path:"/delete" tags:"跟进信息" method:"delete" summary:"删除跟进信息"` + commonApi.Author + Ids []uint `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// TestFollowInfoDeleteRes 删除数据返回 +type TestFollowInfoDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/test/test_owner_info.go b/api/test/test_owner_info.go new file mode 100644 index 0000000..ce6359d --- /dev/null +++ b/api/test/test_owner_info.go @@ -0,0 +1,98 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-09-01 17:51:41 +// 生成路径: api/v1/test/test_owner_info.go +// 生成人:yqq +// desc:业主方基本情况相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package test + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/test/model" +) + +// TestOwnerInfoSearchReq 分页请求参数 +type TestOwnerInfoSearchReq struct { + g.Meta `path:"/list" tags:"业主方基本情况" method:"get" summary:"业主方基本情况列表"` + Id string `p:"id"` // + CompanyName string `p:"companyName"` //企业名称 + CompanyAddress string `p:"companyAddress"` //单位地址 + RegistrationType string `p:"registrationType"` //企业登记注册类型 + RegisteredCapital string `p:"registeredCapital" v:"registeredCapital@integer#注册资金需为整数"` //注册资金 + Legaler string `p:"legaler"` //法人代表 + LegalerPhone string `p:"legalerPhone"` //法人电话 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建日期需为YYYY-MM-DD hh:mm:ss格式"` //创建日期 + commonApi.PageReq + commonApi.Author +} + +// TestOwnerInfoSearchRes 列表返回结果 +type TestOwnerInfoSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.TestOwnerInfoListRes `json:"list"` +} + +// TestOwnerInfoAddReq 添加操作请求参数 +type TestOwnerInfoAddReq struct { + g.Meta `path:"/add" tags:"业主方基本情况" method:"post" summary:"业主方基本情况添加"` + commonApi.Author + CompanyName string `p:"companyName" v:"required#企业名称不能为空"` + CompanyAddress string `p:"companyAddress" ` + RegistrationType string `p:"registrationType" ` + RegisteredCapital int `p:"registeredCapital" ` + Legaler string `p:"legaler" ` + LegalerPhone string `p:"legalerPhone" ` +} + +// TestOwnerInfoAddRes 添加操作返回结果 +type TestOwnerInfoAddRes struct { + commonApi.EmptyRes +} + +// TestOwnerInfoEditReq 修改操作请求参数 +type TestOwnerInfoEditReq struct { + g.Meta `path:"/edit" tags:"业主方基本情况" method:"put" summary:"业主方基本情况修改"` + commonApi.Author + Id uint `p:"id" v:"required#主键ID不能为空"` + CompanyName string `p:"companyName" v:"required#企业名称不能为空"` + CompanyAddress string `p:"companyAddress" ` + RegistrationType string `p:"registrationType" ` + RegisteredCapital int `p:"registeredCapital" ` + Legaler string `p:"legaler" ` + LegalerPhone string `p:"legalerPhone" ` +} + +// TestOwnerInfoEditRes 修改操作返回结果 +type TestOwnerInfoEditRes struct { + commonApi.EmptyRes +} + +// TestOwnerInfoGetReq 获取一条数据请求 +type TestOwnerInfoGetReq struct { + g.Meta `path:"/get" tags:"业主方基本情况" method:"get" summary:"获取业主方基本情况信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// TestOwnerInfoGetRes 获取一条数据结果 +type TestOwnerInfoGetRes struct { + g.Meta `mime:"application/json"` + *model.TestOwnerInfoInfoRes +} + +// TestOwnerInfoDeleteReq 删除数据请求 +type TestOwnerInfoDeleteReq struct { + g.Meta `path:"/delete" tags:"业主方基本情况" method:"delete" summary:"删除业主方基本情况"` + commonApi.Author + Ids []uint `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// TestOwnerInfoDeleteRes 删除数据返回 +type TestOwnerInfoDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/test/test_project_info.go b/api/test/test_project_info.go new file mode 100644 index 0000000..ea96a19 --- /dev/null +++ b/api/test/test_project_info.go @@ -0,0 +1,104 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-09-01 16:15:09 +// 生成路径: api/v1/test/test_project_info.go +// 生成人:yqq +// desc:项目备案信息相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package test + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/test/model" +) + +// TestProjectInfoSearchReq 分页请求参数 +type TestProjectInfoSearchReq struct { + g.Meta `path:"/list" tags:"项目备案信息" method:"get" summary:"项目备案信息列表"` + Id string `p:"id"` // + ProjectName string `p:"projectName"` //项目名称 + ProjectAddress string `p:"projectAddress"` //单位地址 + ProjectLeader string `p:"projectLeader"` //项目负责人 + ResourceName string `p:"resourceName"` //资源方 + OwnerId string `p:"ownerId" v:"ownerId@integer#业主名id需为整数"` //业主名id + ProjectType string `p:"projectType"` //项目类型 + ProjectInfo string `p:"projectInfo"` //项目概况 + ProjectState string `p:"projectState" v:"projectState@integer#项目状态(0未开始 1进行中 2已完成)需为整数"` //项目状态(0未开始 1进行中 2已完成) + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建日期需为YYYY-MM-DD hh:mm:ss格式"` //创建日期 + commonApi.PageReq + commonApi.Author +} + +// TestProjectInfoSearchRes 列表返回结果 +type TestProjectInfoSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.TestProjectInfoListRes `json:"list"` +} + +// TestProjectInfoAddReq 添加操作请求参数 +type TestProjectInfoAddReq struct { + g.Meta `path:"/add" tags:"项目备案信息" method:"post" summary:"项目备案信息添加"` + commonApi.Author + ProjectName string `p:"projectName" v:"required#项目名称不能为空"` + ProjectAddress string `p:"projectAddress" ` + ProjectLeader string `p:"projectLeader" ` + ResourceName string `p:"resourceName" v:"required#资源方不能为空"` + OwnerId int `p:"ownerId" v:"required#业主名id不能为空"` + ProjectType string `p:"projectType" ` + ProjectInfo string `p:"projectInfo" ` + ProjectState int `p:"projectState" ` +} + +// TestProjectInfoAddRes 添加操作返回结果 +type TestProjectInfoAddRes struct { + commonApi.EmptyRes +} + +// TestProjectInfoEditReq 修改操作请求参数 +type TestProjectInfoEditReq struct { + g.Meta `path:"/edit" tags:"项目备案信息" method:"put" summary:"项目备案信息修改"` + commonApi.Author + Id uint `p:"id" v:"required#主键ID不能为空"` + ProjectName string `p:"projectName" v:"required#项目名称不能为空"` + ProjectAddress string `p:"projectAddress" ` + ProjectLeader string `p:"projectLeader" ` + ResourceName string `p:"resourceName" v:"required#资源方不能为空"` + OwnerId int `p:"ownerId" v:"required#业主名id不能为空"` + ProjectType string `p:"projectType" ` + ProjectInfo string `p:"projectInfo" ` + ProjectState int `p:"projectState" ` +} + +// TestProjectInfoEditRes 修改操作返回结果 +type TestProjectInfoEditRes struct { + commonApi.EmptyRes +} + +// TestProjectInfoGetReq 获取一条数据请求 +type TestProjectInfoGetReq struct { + g.Meta `path:"/get" tags:"项目备案信息" method:"get" summary:"获取项目备案信息信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// TestProjectInfoGetRes 获取一条数据结果 +type TestProjectInfoGetRes struct { + g.Meta `mime:"application/json"` + *model.TestProjectInfoInfoRes +} + +// TestProjectInfoDeleteReq 删除数据请求 +type TestProjectInfoDeleteReq struct { + g.Meta `path:"/delete" tags:"项目备案信息" method:"delete" summary:"删除项目备案信息"` + commonApi.Author + Ids []uint `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// TestProjectInfoDeleteRes 删除数据返回 +type TestProjectInfoDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/common/captcha.go b/api/v1/common/captcha.go new file mode 100644 index 0000000..aca0c14 --- /dev/null +++ b/api/v1/common/captcha.go @@ -0,0 +1,19 @@ +/* +* @desc:验证码参数 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/2 17:47 + */ + +package common + +import "github.com/gogf/gf/v2/frame/g" + +type CaptchaReq struct { + g.Meta `path:"/get" tags:"验证码" method:"get" summary:"获取验证码"` +} +type CaptchaRes struct { + g.Meta `mime:"application/json"` + Key string `json:"key"` + Img string `json:"img"` +} diff --git a/api/v1/common/coryCommon/baiduOCR.go b/api/v1/common/coryCommon/baiduOCR.go new file mode 100644 index 0000000..7a73698 --- /dev/null +++ b/api/v1/common/coryCommon/baiduOCR.go @@ -0,0 +1,491 @@ +package coryCommon + +import ( + "encoding/json" + "errors" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/gclient" + "github.com/gogf/gf/v2/os/gctx" + "github.com/tiger1103/gfast-cache/cache" + commonService "github.com/tiger1103/gfast/v3/internal/app/common/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" + "golang.org/x/net/context" + "io" + "io/ioutil" + "net/http" + "net/url" + "strings" + "time" +) + +/** +功能: + 文字识别:百度API识别身份证、银行卡内容、人脸检测、人脸对比 +*/ + +// OcrReq 请求体参数 身份证和银行卡都是此结构体, +type OcrReq struct { + Image string `json:"image"` // 二选一:图像数据,base64编码后进行urlencode,需去掉编码头(data:image/jpeg;base64, ) 要求base64编码和urlencode后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/jpeg/png/bmp格式 + Url string `json:"url"` // 二选一:图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/jpeg/png/bmp格式,当image字段存在时url字段失效 请注意关闭URL防盗链 + IdCardSide string `json:"id_card_side"` // 身份证需要此参数(人头面填写:front,国徽面填写:back) 银行卡不需要 + DetectPhoto bool `json:"detect_photo"` // 是否检测身份证进行裁剪,默认不检测。可选值:true-检测身份证并返回证照的 base64 编码及位置信息 +} + +/* +1、clientId 必须参数,应用的APIKey +2、clientSecret 必须参数,应用的Secret Key; +3、存在redis的数据前缀 +*/ +var clientId = "" +var clientSecret = "" +var cacheRedis = "zmGoBaiDuOcrAccessToken" + +func init() { + one, err := g.Cfg().Get(gctx.New(), "baiDuYun.clientId") + if err != nil { + fmt.Println("百度云API未找到!") + } + two, err := g.Cfg().Get(gctx.New(), "baiDuYun.clientSecret") + if err != nil { + fmt.Println("百度云Secret未找到!") + } + clientId = one.String() + clientSecret = two.String() +} + +/* +IDCardInfo 获取身份证相关数据 +*/ +type IDCardInfo struct { + WordsResult WordsResult `json:"words_result"` + WordsResultNum int `json:"words_result_num"` + IDCardNumberType int `json:"idcard_number_type"` + ImageStatus string `json:"image_status"` + LogID int64 `json:"log_id"` + Photo string `json:"photo"` +} +type WordsResult struct { + Name Field `json:"姓名"` + Nation Field `json:"民族"` + Address Field `json:"住址"` + CitizenIdentification Field `json:"公民身份号码"` + Birth Field `json:"出生"` + Gender Field `json:"性别"` + ExpirationDate Field `json:"失效日期"` + IssuingAuthority Field `json:"签发机关"` + IssueDate Field `json:"签发日期"` +} +type Field struct { + Location Location `json:"location"` + Words string `json:"words"` +} +type Location struct { + Top int `json:"top"` + Left int `json:"left"` + Width int `json:"width"` + Height int `json:"height"` +} + +func ImgOCR(vr OcrReq) (m map[string]interface{}) { + //请求路径+token + baseUrl := "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard" + //先从缓存里面捞取token,如果没得就重新获取token + var atStr = redisCacheStr() + // 构造 URL 参数 + params := url.Values{} + params.Set("access_token", atStr) + // 构造完整的请求 URL + requestURL := fmt.Sprintf("%s?%s", baseUrl, params.Encode()) + + response, err := gclient.New().ContentJson().ContentType("application/x-www-form-urlencoded").Post(gctx.New(), requestURL, vr) + if err != nil { + return + } + var dataInfo = strings.ReplaceAll(response.ReadAllString(), " ", "") + + //解析数据 + bodyData := []byte(dataInfo) + var idCardInfo IDCardInfo + err = json.Unmarshal(bodyData, &idCardInfo) + if err != nil { + fmt.Println("Failed to parse JSON data:", err) + return + } + m = make(map[string]interface{}) + //身份证正反面颠倒了,直接返回空 + if idCardInfo.ImageStatus == "reversed_side" { + return + } + + result := idCardInfo.WordsResult + //if idCardInfo.Photo != "" { + // m["pacePhoto"] = idCardInfo.Photo + //} + if result.Name.Words != "" { + m["userName"] = result.Name.Words + } + if result.Nation.Words != "" { + m["sfzNation"] = result.Nation.Words + } + if result.Address.Words != "" { + m["sfzSite"] = result.Address.Words + } + if result.CitizenIdentification.Words != "" { + m["sfzNumber"] = result.CitizenIdentification.Words + } + if result.Birth.Words != "" { + str, _ := tool.New().TimeCycle(result.Birth.Words) + m["sfzBirth"] = str + } + if result.Gender.Words != "" { + var se = result.Gender.Words + if se == "男" { + se = "1" + } else if se == "女" { + se = "2" + } else { + se = "3" + } + m["sex"] = se + } + if result.ExpirationDate.Words != "" { + str, err := tool.New().TimeCycle(result.ExpirationDate.Words) + if err == nil { + m["sfzEnd"] = str + } else { + str := result.ExpirationDate.Words + m["sfzEnd"] = str + } + } + if result.IssuingAuthority.Words != "" { + m["IssuingAuthority"] = result.IssuingAuthority.Words + } + if result.IssueDate.Words != "" { + str, _ := tool.New().TimeCycle(result.IssueDate.Words) + m["sfzStart"] = str + } + return m +} + +/* +BankData 获取银行卡相关数据 +针对卡号、有效期、发卡行、卡片类型、持卡人5个关键字段进行结构化识别,识别准确率超过99% +*/ +type BankData struct { + ValidDate string `json:"valid_date"` //有效期 + BankCardNumber string `json:"bank_card_number"` //银行卡卡号 + BankName string `json:"bank_name"` //银行名,不能识别时为空 + BankCardType int `json:"bank_card_type"` //银行卡类型,0:不能识别; 1:借记卡; 2:贷记卡(原信用卡大部分为贷记卡); 3:准贷记卡; 4:预付费卡 + HolderName string `json:"holder_name"` //持卡人姓名,不能识别时为空 +} + +type Result struct { + Res BankData `json:"result"` //具体数据 + Direction int `json:"direction"` //图像方向。 - - 1:未定义; - 0:正向; - 1:逆时针90度; - 2:逆时针180度; - 3:逆时针270度 + LogID int64 `json:"log_id"` //请求标识码,随机数,唯一。 +} + +func ImgYhkOCR(vr OcrReq) (m map[string]interface{}) { + m = make(map[string]interface{}) + //请求路径+token + baseUrl := "https://aip.baidubce.com/rest/2.0/ocr/v1/bankcard" + //先从缓存里面捞取token + var atStr = redisCacheStr() + // 构造 URL 参数 + params := url.Values{} + params.Set("access_token", atStr) + // 构造完整的请求 URL + requestURL := fmt.Sprintf("%s?%s", baseUrl, params.Encode()) + response, err := gclient.New().ContentJson().ContentType("application/x-www-form-urlencoded").Post(gctx.New(), requestURL, vr) + if err != nil { + return + } + //解析数据 + allString := response.ReadAllString() + bodyData := []byte(allString) + var result Result + err = json.Unmarshal(bodyData, &result) + if err != nil { + fmt.Println("Failed to parse JSON data:", err) + return + } + if result.Res.ValidDate != "" { + m["ValidDate"] = result.Res.ValidDate + } + if result.Res.BankCardNumber != "" { + m["yhkNumber"] = strings.ReplaceAll(result.Res.BankCardNumber, " ", "") + } + if result.Res.BankName != "" { + m["yhkOpeningBank"] = result.Res.BankName + } + if result.Res.BankCardType >= 0 { + m["BankCardType"] = result.Res.BankCardType + } + if result.Res.HolderName != "" { + m["yhkCardholder"] = result.Res.HolderName + } + return m + +} + +/* +HumanFaceReq 请求参数 人脸识别+人脸检测 +*/ +type HumanFaceReq struct { + Image string `json:"image"` //图片此处填写base64 + ImageType string `json:"image_type" gf:"default:BASE64" ` //图片类型-BASE64-URL-BASE64(此封装固定用base64) + FaceField string `json:"face_field" gf:"default:face_type,quality"` //包括age,expression,face_shape,gender,glasses,landmark,landmark150, quality,eye_status,emotion,face_type,mask,spoofing信息 逗号分隔. 默认只返回face_token、人脸框、概率和旋转角度 +} + +/* +HumanFaceRep 返回参数 人脸识别 +*/ +type HumanFaceRep struct { + ErrorCode int `json:"error_code"` + ErrorMsg string `json:"error_msg"` + LogId int `json:"log_id"` + Timestamp int `json:"timestamp"` + Cached int `json:"cached"` + Result struct { + FaceNum int `json:"face_num"` + FaceList []struct { + FaceToken string `json:"face_token"` + Location struct { + Left float64 `json:"left"` + Top float64 `json:"top"` + Width int `json:"width"` + Height int `json:"height"` + Rotation int `json:"rotation"` + } `json:"location"` + FaceProbability float64 `json:"face_probability"` + Angle struct { + Yaw float64 `json:"yaw"` + Pitch float64 `json:"pitch"` + Roll float64 `json:"roll"` + } `json:"angle"` + FaceType struct { + Type string `json:"type"` + Probability float64 `json:"probability"` + } `json:"face_type"` + Quality struct { + Occlusion struct { + LeftEye float64 `json:"left_eye"` + RightEye float64 `json:"right_eye"` + Nose float64 `json:"nose"` + Mouth float64 `json:"mouth"` + LeftCheek float64 `json:"left_cheek"` + RightCheek float64 `json:"right_cheek"` + ChinContour float64 `json:"chin_contour"` + } `json:"occlusion"` + Blur float64 `json:"blur"` + Illumination float64 `json:"illumination"` + Completeness int64 `json:"completeness"` + } `json:"quality"` + } `json:"face_list"` + } `json:"result"` +} + +func HumanFace(hf *HumanFaceReq) (err error) { + ctx := gctx.New() + err = g.Try(ctx, func(ctx context.Context) { + err = nil + //1、请求地址+token + url := "https://aip.baidubce.com/rest/2.0/face/v3/detect?access_token=" + redisCacheStr() + marshal, err := json.Marshal(hf) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + //3、准备请求 + payload := strings.NewReader(string(marshal)) + client := &http.Client{} + req, err := http.NewRequest("POST", url, payload) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + //4、设置请求头 + req.Header.Add("Content-Type", "application/json") + //5、发送请求 + res, err := client.Do(req) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + defer res.Body.Close() + //6、返回数据 + body, err := io.ReadAll(res.Body) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + var aaa = body + //解析数据 + var result HumanFaceRep + err = json.Unmarshal(aaa, &result) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + if result.ErrorCode != 0 { + if result.ErrorMsg == "pic not has face" { + err = errors.New("这张照片没有人脸") + liberr.ErrIsNil(ctx, err) + } else { + err = errors.New(result.ErrorMsg) + liberr.ErrIsNil(ctx, err) + } + return + } + + //1、人脸置信度,范围【0~1】,代表这是一张人脸的概率,0最小、1最大。其中返回0或1时,数据类型为Integer + dataInfo := result.Result.FaceList[0] + reliabilityOne := dataInfo.FaceProbability + if reliabilityOne != 1.0 { + err = errors.New("识别不清晰!") + } + //2、判断是否真是人脸 human: 真实人脸 cartoon: 卡通人脸 + reliabilityTwo := dataInfo.FaceType.Type + if reliabilityTwo == "cartoon" { + err = errors.New("请传入真实人脸!") + } else { + //判断可信度 置信度,范围0~1 + reliabilityThree := dataInfo.FaceType.Probability + if reliabilityThree < 0.8 { + err = errors.New("请勿化妆太过夸张!") + } + } + //3、人脸模糊程度,范围[0~1],0表示清晰,1表示模糊 + reliabilityFour := dataInfo.Quality.Blur + if reliabilityFour >= 0.1 { + err = errors.New("人脸过于模糊!") + } + //4、光线太暗 0~255 值越大光线越好 + reliabilityFive := dataInfo.Quality.Illumination + if reliabilityFive < 80.0 { + err = errors.New("光线太暗!") + } + //5、人脸是否完整 1完整 0不完整 + reliabilitySix := dataInfo.Quality.Completeness + if reliabilitySix != 1 { + err = errors.New("请确定人脸在图框内!") + } + return + }) + return +} + +// ComparisonRep 人脸检测返回数据 +type ComparisonRep struct { + ErrorCode int `json:"error_code"` + ErrorMsg string `json:"error_msg"` + LogId int `json:"log_id"` + Timestamp int `json:"timestamp"` + Cached int `json:"cached"` + Result struct { + Score float64 `json:"score"` //人脸相似度得分,推荐阈值80分 + FaceList []struct { + FaceToken string `json:"face_token"` + } `json:"face_list"` + } `json:"result"` +} + +func Comparison(arrObject []*HumanFaceReq) (score float64, err error) { + //1、请求地址+token + url := "https://aip.baidubce.com/rest/2.0/face/v3/match?access_token=" + redisCacheStr() + //2、请求参数转字符串json + marshal, err := json.Marshal(arrObject) + if err != nil { + return + } + payload := strings.NewReader(string(marshal)) + //3、准备post请求 + client := &http.Client{} + req, err := http.NewRequest("POST", url, payload) + if err != nil { + fmt.Println(err) + return + } + //4、设置请求头 + req.Header.Add("Content-Type", "application/json") + //5、发送请求关闭连接 + res, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer res.Body.Close() + //6、数据结果 + body, err := ioutil.ReadAll(res.Body) + if err != nil { + fmt.Println(err) + return + } + //7、解析数据 + var result ComparisonRep + err = json.Unmarshal(body, &result) + if err != nil { + fmt.Println("Failed to parse JSON data:", err) + return + } + score = result.Result.Score + return score, err +} + +/* +AccessTokenResponse 获取Access_token,有效期(秒为单位,有效期30天); +*/ +type AccessTokenResponse struct { + AccessToken string `json:"access_token"` +} + +func AccessTokenFunc() (str string) { + url := "https://aip.baidubce.com/oauth/2.0/token?client_id=" + clientId + "&client_secret=" + clientSecret + "&grant_type=client_credentials" + payload := strings.NewReader(``) + client := &http.Client{} + req, err := http.NewRequest("POST", url, payload) + + if err != nil { + fmt.Println(err) + return + } + req.Header.Add("Content-Type", "application/json") + req.Header.Add("Accept", "application/json") + + res, err := client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer res.Body.Close() + + body, err := ioutil.ReadAll(res.Body) + var tokenResponse AccessTokenResponse + json.Unmarshal(body, &tokenResponse) + + if err != nil { + fmt.Println(err) + return + } + return tokenResponse.AccessToken +} + +// 缓存捞取token,如果没得就重新获取token +func redisCacheStr() (atStr string) { + atStr = "" + ctx := gctx.New() + prefix := g.Cfg().MustGet(ctx, "system.cache.prefix").String() + gfCache := cache.New(prefix) + at := commonService.Cache().Get(ctx, gfCache.CachePrefix+cacheRedis) + if at == nil || at.String() == "" { + atStr = AccessTokenFunc() + //存储到redis,时间为29天 + commonService.Cache().Set(ctx, cacheRedis, atStr, time.Hour*24*29) + } else { + atStr = at.String() + } + //atStr = "24.c8814d3fc7961820f0e23ee9d80cf96c.2592000.1696671067.282335-38777216" + return atStr +} diff --git a/api/v1/common/coryCommon/base64ToImg.go b/api/v1/common/coryCommon/base64ToImg.go new file mode 100644 index 0000000..79a7bfb --- /dev/null +++ b/api/v1/common/coryCommon/base64ToImg.go @@ -0,0 +1,104 @@ +package coryCommon + +import ( + "encoding/base64" + "errors" + "fmt" + "github.com/gogf/gf/v2/os/gfile" + "io/ioutil" + "math/rand" + "os" + "path/filepath" + "strings" + "time" +) + +// Base64ToImgFunc 将base64转成图片保存在本地 +func Base64ToImgFunc(base64Str string, numTyoe string, cdPath string) (outputPath string, err error) { + // 获取当前时间+随机数得到文件名 + currentTime := time.Now() + timestamp := currentTime.UnixNano() / int64(time.Millisecond) + randomNum := rand.Intn(1000) + uniqueFileName := fmt.Sprintf("%d_%d", timestamp, randomNum) + // 用户指定的本地文件路径 + //ynr := Ynr(Portrait + "/") + ynr := Ynr(cdPath + "/") + path := ynr + uniqueFileName + ".png" + path = filepath.ToSlash(path) + // Base64编码的图像字符串 + b64 := "data:image/png;" + base64Image := "" + if strings.Contains(base64Str, "base64,") { // 判断是否有【base64,】如果有就替换 + base64Image = strings.Replace(base64Str, base64Str[:strings.Index(base64Str, "base64,")], b64, 1) + } else { + base64Image = b64 + "base64," + base64Str + } + + // 调用函数将Base64图像保存到指定路径 + err = SaveBase64ImageToFile(base64Image, path) + if err != nil { + return + } else { + if numTyoe == "1" { + outputPath = strings.Replace(path, "resource/public", "file", 1) + return + } else if numTyoe == "2" { + outputPath = strings.Replace(path, "resource/public", "wxfile", 1) + return + } else { + err = errors.New("第二参数只能为1 or 2!") + return + } + } +} + +func Base64ToFileFunc(base64Str string, filePath string, suffix string, numTyoe string) (outputPath string, err error) { + + // 获取当前时间+随机数得到文件名 + timestamp := time.Now().UnixNano() / int64(time.Millisecond) + uniqueFileName := fmt.Sprintf("%d_%d", timestamp, rand.Intn(1000)) + // 用户指定的本地文件路径,filePath路径最后必须是/ + path := filepath.ToSlash(filePath + uniqueFileName + suffix) + // 调用函数将Base64图像保存到指定路径 + err = SaveBase64ImageToFile(base64Str, path) + if err != nil { + return + } else { + if numTyoe == "1" { + outputPath = strings.Replace(path, "resource/public", "file", 1) + return + } else if numTyoe == "2" { + outputPath = strings.Replace(path, "resource/public", "wxfile", 1) + return + } else { + err = errors.New("第二参数只能为1 or 2!") + return + } + } +} + +// SaveBase64ImageToFile 将Base64编码的图像保存到指定的本地文件路径 +func SaveBase64ImageToFile(base64Image string, outputPath string) error { + if len(outputPath) > 0 && outputPath[0] == '/' { + outputPath = outputPath[1:] + } + getwd, _ := os.Getwd() + outputPath = gfile.Join(getwd, outputPath) + outputPath = strings.ReplaceAll(outputPath, "\\", "/") + // 1. 解码Base64字符串 + parts := strings.Split(base64Image, ",") + if len(parts) != 2 { + return errors.New("Base64字符串格式不正确!") + } + data, err := base64.StdEncoding.DecodeString(parts[1]) + if err != nil { + return errors.New("转码错误!") + } + + // 2. 将字节数组保存为图像文件 + err = ioutil.WriteFile(outputPath, data, 0644) + if err != nil { + return errors.New("报错图像失败!") + } + return nil +} diff --git a/api/v1/common/coryCommon/basics.go b/api/v1/common/coryCommon/basics.go new file mode 100644 index 0000000..e96e2d5 --- /dev/null +++ b/api/v1/common/coryCommon/basics.go @@ -0,0 +1,107 @@ +package coryCommon + +import ( + "context" + "errors" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "reflect" + "strconv" +) + +func New() *coryCom { + return &coryCom{} +} + +type coryCom struct{} + +// CreateByOrUpdateBy 专门用来反射结构体中的创建人和更新人,然后返回回去,避免重复造轮子去写重复代码 +/** +*使用实例代码 + * by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + * infoRes := by.(model.BusCompanyInfoRes) + * res = &infoRes + * + *其中 updateByFieldVal.Set(reflect.ValueOf(updateByValue.Interface().(*gvar.Var).String())) 必须类型一致 +*/ +func (s *coryCom) CreateByOrUpdateBy(ctx context.Context, data interface{}) (dataRes interface{}) { + // 使用反射获取 data 的值和类型信息 + val := reflect.ValueOf(data) + typ := reflect.TypeOf(data) + + // 判断 data 是否为指针类型,并获取实际值 + if val.Kind() == reflect.Ptr { + val = val.Elem() + typ = typ.Elem() + } + + flagCreate := true + flagUpdate := true + // 获取 createBy 字段在结构体中的索引 + createByField, ok := typ.FieldByName("CreateBy") + if !ok { + flagCreate = false + //return data // 如果结构体中不存在 createBy 字段,则直接返回原始值 + createByField2, ok2 := typ.FieldByName("CreatedBy") + if ok2 { + createByField = createByField2 + flagCreate = true + } + } + updateByField, ok := typ.FieldByName("UpdateBy") + if !ok { + flagUpdate = false + //return data // 如果结构体中不存在 createBy 字段,则直接返回原始值 + updateByField2, ok2 := typ.FieldByName("UpdatedBy") + if ok2 { + updateByField = updateByField2 + flagCreate = true + } + } + if flagCreate { + // 判断 createBy 字段的类型是否为 string + if createByField.Type.Kind() != reflect.String { + // 如果 createBy 字段的类型不是 string,请根据需要进行相应的处理或返回错误 + // 此处假设 createBy 必须为 string 类型,如果不是则返回错误 + return errors.New("createBy字段类型不匹配") + } + // 获取原始的 createBy 字段的值并获取创建人 + createId := val.FieldByIndex(createByField.Index).String() + ve := SelectByString(ctx, IsNumeric(createId), createId) + // 设置 createBy 字段的值为指定参数 + createByFieldVal := val.FieldByIndex(createByField.Index) + createByFieldVal.SetString(ve) + } + if flagUpdate { + // 判断 updateBy 字段的类型是否为 string + if updateByField.Type.Kind() != reflect.String { + // 如果 createBy 字段的类型不是 string,请根据需要进行相应的处理或返回错误 + // 此处假设 createBy 必须为 string 类型,如果不是则返回错误 + return errors.New("updateBy字段类型不匹配") + } + // 获取原始的 createBy 字段的值并获取创建人 + updateId := val.FieldByIndex(updateByField.Index).String() + ve := SelectByString(ctx, IsNumeric(updateId), updateId) + // 设置 createBy 字段的值为指定参数 + updateByFieldVal := val.FieldByIndex(updateByField.Index) + updateByFieldVal.SetString(ve) + } + // 返回修改后的结构体 + return val.Interface() +} + +func IsNumeric(str string) bool { + _, err := strconv.ParseFloat(str, 64) + return err == nil +} + +// SelectByString 根据字符串查询到具体人对应的名称 +func SelectByString(ctx context.Context, flag bool, str string) (ve string) { + if flag { + value, _ := dao.SysUser.Ctx(ctx).Fields("user_nickname").Where("id", str).Value() + ve = value.String() + } else { + value, _ := dao.BusConstructionUser.Ctx(ctx).Fields("user_name").Where("openid", str).Value() + ve = value.String() + } + return +} diff --git a/api/v1/common/coryCommon/camera/cameraEntity.go b/api/v1/common/coryCommon/camera/cameraEntity.go new file mode 100644 index 0000000..49dfa41 --- /dev/null +++ b/api/v1/common/coryCommon/camera/cameraEntity.go @@ -0,0 +1,17 @@ +package camera + +type LoginCamera struct { + URLToken string `json:"URLToken"` + TokenTimeout int64 `json:"TokenTimeout"` +} + +type ChannelSnapReq struct { + Serial string `json:"serial" dc:"设备编号"` + Stime int64 `json:"stime" dc:"快照时间, 从录像截取指定时间的历史快照, now 表示取实时快照, 即抓图允许值: now, YYYYMMDDHHmmss"` + Format int64 `json:"format" dc:"stime 快照格式 允许值: jpeg, png"` +} +type ChannelSnapRes struct { + Serial string `json:"serial" dc:"设备编号"` + Stime int64 `json:"stime" dc:"快照时间, 从录像截取指定时间的历史快照, now 表示取实时快照, 即抓图允许值: now, YYYYMMDDHHmmss"` + Format int64 `json:"format" dc:"stime 快照格式 允许值: jpeg, png"` +} diff --git a/api/v1/common/coryCommon/camera/cameraUtil.go b/api/v1/common/coryCommon/camera/cameraUtil.go new file mode 100644 index 0000000..00666e1 --- /dev/null +++ b/api/v1/common/coryCommon/camera/cameraUtil.go @@ -0,0 +1,303 @@ +package camera + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "github.com/go-redis/redis/v8" + "github.com/gogf/gf/v2/crypto/gmd5" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gctx" + "github.com/tiger1103/gfast-cache/cache" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + commonService "github.com/tiger1103/gfast/v3/internal/app/common/service" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/third/arithmetic/SpartaApi" + "io" + "log" + "os" + "path/filepath" + "strconv" + "strings" + "time" +) + +// LoginCameraFunc 登录获取 身份凭证 +func LoginCameraFunc(ctx context.Context) (token string) { + api, _ := g.Cfg().Get(ctx, "LiveGBS.safety.api") + acc, _ := g.Cfg().Get(ctx, "LiveGBS.safety.acc") + pas, _ := g.Cfg().Get(ctx, "LiveGBS.safety.pas") + key := "loginCamera" + //从缓存捞取key + prefix := g.Cfg().MustGet(ctx, "system.cache.prefix").String() + gfCache := cache.New(prefix) + get := commonService.Cache().Get(ctx, gfCache.CachePrefix+key) + if get != nil && get.String() != "" { + token = get.String() + return token + } else { + account := acc.String() + password := gmd5.MustEncryptString(pas.String()) + uri := api.String() + "api/v1/login?username=" + account + "&password=" + password + "&url_token_only=true" + response, err := g.Client().Get(gctx.New(), uri) + if err != nil { + return + } + var lc *LoginCamera + err = json.Unmarshal([]byte(response.ReadAllString()), &lc) + if err != nil { + return + } + //将token存储到redis中,tiken默认时间为秒,实际计算为7天,(这里少100秒,防止token过期还存在redis中) + commonService.Cache().Set(ctx, key, lc.URLToken, time.Duration(lc.TokenTimeout-100)*time.Second) + token = lc.URLToken + return token + } +} + +var Rdb *redis.Client + +// camera.DYFunc() +// 发布小程序需要关闭 camera.DYFunc() +// DYFunc 连接redis +func DYFunc() { + ctx := gctx.New() + err := g.Try(ctx, func(ctx context.Context) { + fmt.Println("redis订阅已开启") + // 创建第一个 Redis 连接 + address, _ := g.Cfg().Get(ctx, "LiveGBS.redis.address") + password, _ := g.Cfg().Get(ctx, "LiveGBS.redis.password") + // 创建一个 Redis 客户端连接 + options := &redis.Options{ + Addr: address.String(), // 替换为你的 Redis 地址和端口 + Password: password.String(), // 替换为你的 Redis 密码 + DB: 1, // 替换为你的 Redis 数据库索引 + } + Rdb = redis.NewClient(options) + + // 创建一个订阅频道 + channelName := "device" // 替换为你要订阅的频道名 + pubsub := Rdb.Subscribe(context.Background(), channelName) + + // 处理订阅消息的 Goroutine + go func() { + for { + msg, err := pubsub.ReceiveMessage(context.Background()) + if err != nil { + log.Println("Error receiving message:", err) + time.Sleep(time.Second) // 出错时等待一段时间后重试 + continue + } + var strData = msg.Payload + log.Println("Received message:", strData) + //1、获取到数据,然后查看是否':'拼接(先不管拼接),不是':'就直接操作数据库 + split := strings.Split(strData, ":") + if len(split) < 2 { + onOrOff := strings.Split(split[0], " ")[1] + if strings.EqualFold(onOrOff, "on") { + onOrOff = "1" + } else { + onOrOff = "0" + } + _, err = dao.QianqiCamera.Ctx(ctx).Where("code", split[0]).Update(g.Map{"country_state": onOrOff}) + //if err != nil { + // id, _ := result.LastInsertId() + // if id > 0 { + // dao.BusCameraChannel.Ctx(ctx).Where("country_id", id).Update(g.Map{"status": onOrOff}) + // } + //} + } + time.Sleep(time.Second * 3) + } + }() + }) + fmt.Println("订阅错误问题:", err) +} + +// ChannelSnapFunc 快照 +func ChannelSnapFunc(ctx context.Context, id int64, serial string, code string, projectId int64) (err error) { + //获取预制位,前提是 PresetEnable == true + pb, err := PeeeresettingBitFunc(gctx.New(), serial, code) + if err != nil { + return err + } + for _, pi := range pb.PresetItemList { + if pi.PresetEnable == true { + //0、预置位 + err = PresettingBitFunc(ctx, serial, code, "goto", pi.PresetID, "") + //1、请求接口得到二进制数据 + suffix := "png" + api, _ := g.Cfg().Get(ctx, "LiveGBS.safety.api") + tokens := LoginCameraFunc(ctx) + uri := api.String() + "api/v1/device/channelsnap?serial=" + serial + "&code=" + code + "&stime=now&format=" + suffix + "&token=" + tokens + response, err := g.Client().Get(gctx.New(), uri) + if err != nil { + return err + } + //2、生成时间文件夹;生成文件名;然后同一斜杠得到完成路径 + ht := coryCommon.Helmet + str := coryCommon.Ynr(ht) + fn := coryCommon.FileName("helmet") + dir, err := os.Getwd() + str = dir + "/" + str + fn + "." + suffix + str = filepath.ToSlash(str) + //3、创建一个文件来保存图片数据;将响应体中的图片数据复制到文件中 + file, err := os.Create(str) + if err != nil { + err = errors.New("创建文件出错") + return err + } + // 创建一个缓冲区,用于读取数据(从 body 中读取数据) + var re = response + var by = re.Body + + lenStr, err := io.Copy(file, by) + if err != nil { + err = errors.New("复制图片数据到文件出错") + return err + } else { + file.Close() + } + if lenStr < 10240 { + file.Close() // 关闭文件 + os.Remove(str) + return err + } + //4、《斯巴达》调用算法接口圈出未带安全帽的人 + req := SpartaApi.RecognizeReq{ + CapUrl: str, + //RecType: "head smoke belt waste excavator Roller Truck_crane Loader Submersible_drilling_rig Sprinkler Truck_mounted_crane Truck", + RecType: "head smoke", + Async: "False", + CallBackUrl: "", + AreaHigh: "", + } + mp, flag, num, err := SpartaApi.CommonAlgorithmFunc(ctx, &req) + if err != nil { + os.Remove(str) + return err + } + ////4、《ys7》调用算法接口圈出未带安全帽的人 + //flag, num, err := ys7.InitYs7(str) + //if err != nil { + // os.Remove(str) + // return err + //} + //5、flag为true表示有违规数据 + if flag { + // 使用range遍历map + mpkStr := "" + mpvStr := "" + for key, value := range mp { + mpkStr = mpkStr + key + "," + mpvStr = mpvStr + value + "、" + } + mpkStr = strings.TrimRight(mpkStr, ",") + mpvStr = strings.TrimRight(mpvStr, "、") + //5、生成数据存储到数据表中(识别记录) + path := strings.ReplaceAll(ht, "/resource/public/", coryCommon.GetWd) + currentTime := time.Now() + dateString := currentTime.Format("2006-01-02") + path = path + dateString + "/" + fn + "." + suffix + addReq := system.BusTourAddReq{ + ProjectId: projectId, + TourCategory: "2", + TourType: "1", + Picture: path, + Describe: mpvStr, + Num: num, + TableName: dao.QianqiCamera.Table(), + TableId: id, + } + service.BusTour().Add(ctx, &addReq) + //6、生成数据存储到违规记录里面 + var bvl model.BusViolationLevelInfoRes + err = dao.BusViolationLevel.Ctx(ctx).Where("tour_type", mpkStr).Fields("id,grade").Scan(&bvl) + recordAddReq := do.BusViolationRecord{ + ProjectId: projectId, + LevelId: bvl.Id, + Level: bvl.Grade, + TourType: mpkStr, + DataSource: "camera", + //Picture: path, + //WxOrPc: "1", + } + dao.BusViolationRecord.Ctx(ctx).Insert(recordAddReq) + } + time.Sleep(20 * time.Second) + } + } + return err +} + +/* +PresettingBitFunc 设备控制-预置位控制 +serial: 国标号 +code: 通道号 +command: 指令 +preset: 预置位编号 +name: 预置位名称 +*/ +func PresettingBitFunc(ctx context.Context, serial string, code string, command string, preset int, name string) (err error) { + if name != "" && (name == "set" || name == "goto" || name == "remove") { + err = errors.New("控制指令允许值: set, goto, remove") + return err + } + if !(preset > 0 && preset <= 255) { + err = errors.New("预置位编号范围为:1~255") + return err + } + tokens := LoginCameraFunc(ctx) + api, _ := g.Cfg().Get(ctx, "LiveGBS.safety.api") + uri := api.String() + "api/v1/control/preset?serial=" + serial + + "&code=" + code + + "&command=" + command + + "&preset=" + strconv.Itoa(preset) + + "&token=" + tokens + if name != "" { + uri = uri + "&name=" + name + } + g.Client().Get(gctx.New(), uri) + return err +} + +func PeeeresettingBitFunc(ctx context.Context, serial string, code string) (pb *PeeeresettingBitEntity, err error) { + tokens := LoginCameraFunc(ctx) + api, _ := g.Cfg().Get(ctx, "LiveGBS.safety.api") + uri := api.String() + "api/v1/device/fetchpreset?serial=" + serial + + "&code=" + code + + "&token=" + tokens + + "&fill=false" + ft, errft := g.Client().Get(gctx.New(), uri) + var str = ft.ReadAllString() + err = json.Unmarshal([]byte(str), &pb) + if err != nil { + if strings.Contains(str, "offline") { + err = errors.New("当前设备不在线!") + } else if strings.Contains(str, "not found") { + err = errors.New("当前设备沒找到!") + } else { + err = errft + } + return + } + return +} + +type PeeeresettingBitEntity struct { + DeviceID string `json:"DeviceID"` + Result string `json:"Result"` + SumNum int `json:"SumNum"` + PresetItemList []*PeeeresettingBitListEntity `json:"PresetItemList"` +} + +type PeeeresettingBitListEntity struct { + PresetID int `json:"PresetID"` + PresetName string `json:"PresetName"` + PresetEnable bool `json:"PresetEnable"` +} diff --git a/api/v1/common/coryCommon/constant.go b/api/v1/common/coryCommon/constant.go new file mode 100644 index 0000000..89e103e --- /dev/null +++ b/api/v1/common/coryCommon/constant.go @@ -0,0 +1,58 @@ +package coryCommon + +const Global = "xny.yj-3d.com" + +var GlobalPath = "http://" + Global + ":7363" +var GlobalFile = "/file" + +// ==========================错误类型========================== + +// SYSERRHINT 系统错误 +var syserrhint = "系统错误,请联系管理员!" + +// ImportFile 系统错误 +var ImportFile = "导入文件有误!" + +// ===========================文件=========================== + +var GetWd = "/file/" // GetWd 静态文件路径 +var LargeFileClt = "/resource/public/clt/" // LargeFileClt 文件上传地址-【倾斜模型/光伏板】 +var LargeFileShp = "/resource/public/shp/" // LargeFileShp 文件上传地址-shp 红线 +var ProjectSplitTable = "/resource/public/projectSplitTable/" // ProjectSplitTable 项目划分表临时文件 +var Temporary = "/resource/public/temporary" // Temporary 临时文件存放地址 +var LargeFilePrivacy = "/resource/public/privacy/" // LargeFilePrivacy 身份证银行卡的存储位置 +var Portrait = "/resource/public/portrait" // Portrait 人像 - 人脸存储的地方(人脸对比的人脸和打卡的人脸都存放在此处) +var Helmet = "/resource/public/upload_file/" // Helmet 公共位置 +var GisModelLib = "/resource/public/mx/" // GisModelLib 模型库 +var Uav = "/resource/public/uav/" // uav 无人机资源 +var UavMerge = "resource/public/tif" // uav 无人机资源大图合并资源 +/* +网盘位置 +*/ +var Template = "/resource/public/masterMask" +var Template2 = "/resource/public/masterMask/dataFolder" //(工程资料)资料文件保存的位置 +var Template3 = "/resource/public/masterMask/sourceData" //(工程资料)源数据文件保存的位置 +var Report = "/resource/public/networkDisk/report" //(网盘)科研及专题报告 +var ProductionDrawing = "/resource/public/networkDisk/productionDrawing" //(网盘)施工图 +var Completion = "/resource/public/networkDisk/completion" //(网盘)竣工图 +var QualityMeeting = "/resource/public/networkDisk/qualityMeeting" //(网盘)质量会议 +var SafetyMeeting = "/resource/public/networkDisk/safetyMeeting" //(网盘)安全会议 + +// ==========================文件后缀========================== + +// PictureSuffix 常见图片后缀 +var PictureSuffix = "JPEG|JPG|HEIF|PNG" + +// ==========================项目常量========================== + +// gispath gis文件 +var gispath = "gisfile/" + +// commonpath common文件 +var commonpath = "commonfile/" + +// addFilePath GIS路径 +var addFilePath = "/yjearth4.0/static/source/" + +// suffix 文件后缀名称 +var suffix = "clt,pdf,zip" diff --git a/api/v1/common/coryCommon/coordinateTransform.go b/api/v1/common/coryCommon/coordinateTransform.go new file mode 100644 index 0000000..7c0ee71 --- /dev/null +++ b/api/v1/common/coryCommon/coordinateTransform.go @@ -0,0 +1,277 @@ +package coryCommon + +import ( + "math" + "strconv" +) + +// WGS84坐标系:即地球坐标系,国际上通用的坐标系。 +// GCJ02坐标系:即火星坐标系,WGS84坐标系经加密后的坐标系。Google Maps,高德在用。 +// BD09坐标系:即百度坐标系,GCJ02坐标系经加密后的坐标系。 + +const ( + X_PI = math.Pi * 3000.0 / 180.0 + OFFSET = 0.00669342162296594323 + AXIS = 6378245.0 +) + +// BD09toGCJ02 百度坐标系->火星坐标系 +func BD09toGCJ02(lon, lat float64) (float64, float64) { + x := lon - 0.0065 + y := lat - 0.006 + + z := math.Sqrt(x*x+y*y) - 0.00002*math.Sin(y*X_PI) + theta := math.Atan2(y, x) - 0.000003*math.Cos(x*X_PI) + + gLon := z * math.Cos(theta) + gLat := z * math.Sin(theta) + + return gLon, gLat +} + +// GCJ02toBD09 火星坐标系->百度坐标系 +func GCJ02toBD09(lon, lat float64) (float64, float64) { + z := math.Sqrt(lon*lon+lat*lat) + 0.00002*math.Sin(lat*X_PI) + theta := math.Atan2(lat, lon) + 0.000003*math.Cos(lon*X_PI) + + bdLon := z*math.Cos(theta) + 0.0065 + bdLat := z*math.Sin(theta) + 0.006 + + return bdLon, bdLat +} + +// WGS84toGCJ02 WGS84坐标系->火星坐标系 +func WGS84toGCJ02(lon, lat float64) (float64, float64) { + if isOutOFChina(lon, lat) { + return lon, lat + } + + mgLon, mgLat := delta(lon, lat) + + return mgLon, mgLat +} + +// GCJ02toWGS84 火星坐标系->WGS84坐标系 +func GCJ02toWGS84(lon, lat float64) (float64, float64) { + if isOutOFChina(lon, lat) { + return lon, lat + } + + mgLon, mgLat := delta(lon, lat) + + return lon*2 - mgLon, lat*2 - mgLat +} + +// BD09toWGS84 百度坐标系->WGS84坐标系 +func BD09toWGS84(lon, lat float64) (float64, float64) { + lon, lat = BD09toGCJ02(lon, lat) + return GCJ02toWGS84(lon, lat) +} + +// WGS84toBD09 WGS84坐标系->百度坐标系 +func WGS84toBD09(lon, lat float64) (float64, float64) { + lon, lat = WGS84toGCJ02(lon, lat) + return GCJ02toBD09(lon, lat) +} + +func delta(lon, lat float64) (float64, float64) { + dlat := transformlat(lon-105.0, lat-35.0) + dlon := transformlng(lon-105.0, lat-35.0) + + radlat := lat / 180.0 * math.Pi + magic := math.Sin(radlat) + magic = 1 - OFFSET*magic*magic + sqrtmagic := math.Sqrt(magic) + + dlat = (dlat * 180.0) / ((AXIS * (1 - OFFSET)) / (magic * sqrtmagic) * math.Pi) + dlon = (dlon * 180.0) / (AXIS / sqrtmagic * math.Cos(radlat) * math.Pi) + + mgLat := lat + dlat + mgLon := lon + dlon + + return mgLon, mgLat +} + +func transformlat(lon, lat float64) float64 { + var ret = -100.0 + 2.0*lon + 3.0*lat + 0.2*lat*lat + 0.1*lon*lat + 0.2*math.Sqrt(math.Abs(lon)) + ret += (20.0*math.Sin(6.0*lon*math.Pi) + 20.0*math.Sin(2.0*lon*math.Pi)) * 2.0 / 3.0 + ret += (20.0*math.Sin(lat*math.Pi) + 40.0*math.Sin(lat/3.0*math.Pi)) * 2.0 / 3.0 + ret += (160.0*math.Sin(lat/12.0*math.Pi) + 320*math.Sin(lat*math.Pi/30.0)) * 2.0 / 3.0 + return ret +} + +func transformlng(lon, lat float64) float64 { + var ret = 300.0 + lon + 2.0*lat + 0.1*lon*lon + 0.1*lon*lat + 0.1*math.Sqrt(math.Abs(lon)) + ret += (20.0*math.Sin(6.0*lon*math.Pi) + 20.0*math.Sin(2.0*lon*math.Pi)) * 2.0 / 3.0 + ret += (20.0*math.Sin(lon*math.Pi) + 40.0*math.Sin(lon/3.0*math.Pi)) * 2.0 / 3.0 + ret += (150.0*math.Sin(lon/12.0*math.Pi) + 300.0*math.Sin(lon/30.0*math.Pi)) * 2.0 / 3.0 + return ret +} + +func isOutOFChina(lon, lat float64) bool { + return !(lon > 73.66 && lon < 135.05 && lat > 3.86 && lat < 53.55) +} + +/* +=========================================================================================== +=========================================================================================== +=========================================================================================== +=========================================================================================== +=========================================================================================== +=========================================================================================== +=========================================================================================== +*/ + +// GPSUtil is a utility class for GPS calculations. +// 小写方法是私有方法,大写方法是公有方法 可根据需要调整 + +func News() *GPSUtil { + return &GPSUtil{} +} + +type GPSUtil struct { +} + +const ( + pi = 3.1415926535897932384626 // 圆周率 + x_pi = 3.14159265358979324 * 3000.0 / 180.0 // 圆周率对应的经纬度偏移 + a = 6378245.0 // 长半轴 + ee = 0.00669342162296594323 // 扁率 +) + +func (receiver *GPSUtil) transformLat(x, y float64) float64 { + ret := -100.0 + 2.0*x + 3.0*y + 0.2*y*y + 0.1*x*y + 0.2*math.Sqrt(math.Abs(x)) + ret += (20.0*math.Sin(6.0*x*pi) + 20.0*math.Sin(2.0*x*pi)) * 2.0 / 3.0 + ret += (20.0*math.Sin(y*pi) + 40.0*math.Sin(y/3.0*pi)) * 2.0 / 3.0 + ret += (160.0*math.Sin(y/12.0*pi) + 320*math.Sin(y*pi/30.0)) * 2.0 / 3.0 + return ret +} + +func (receiver *GPSUtil) transformlng(x, y float64) float64 { + ret := 300.0 + x + 2.0*y + 0.1*x*x + 0.1*x*y + 0.1*math.Sqrt(math.Abs(x)) + ret += (20.0*math.Sin(6.0*x*pi) + 20.0*math.Sin(2.0*x*pi)) * 2.0 / 3.0 + ret += (20.0*math.Sin(x*pi) + 40.0*math.Sin(x/3.0*pi)) * 2.0 / 3.0 + ret += (150.0*math.Sin(x/12.0*pi) + 300.0*math.Sin(x/30.0*pi)) * 2.0 / 3.0 + return ret +} + +func (receiver *GPSUtil) outOfChina(lat, lng float64) bool { + if lng < 72.004 || lng > 137.8347 { + return true + } + if lat < 0.8293 || lat > 55.8271 { + return true + } + return false +} + +func (receiver *GPSUtil) transform(lat, lng float64) []float64 { + if receiver.outOfChina(lat, lng) { + return []float64{lat, lng} + } + dLat := receiver.transformLat(lng-105.0, lat-35.0) + dlng := receiver.transformlng(lng-105.0, lat-35.0) + radLat := lat / 180.0 * pi + magic := math.Sin(radLat) + magic = 1 - ee*magic*magic + SqrtMagic := math.Sqrt(magic) + dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * SqrtMagic) * pi) + dlng = (dlng * 180.0) / (a / SqrtMagic * math.Cos(radLat) * pi) + mgLat := lat + dLat + mglng := lng + dlng + return []float64{mgLat, mglng} +} + +// WGS84_To_Gcj02 84 to 火星坐标系 (GCJ-02) World Geodetic System ==> Mars Geodetic System +// @param lat +// @param lng +// @return +func (receiver *GPSUtil) WGS84_To_Gcj02(lat, lng float64) []float64 { + if receiver.outOfChina(lat, lng) { + return []float64{lat, lng} + } + dLat := receiver.transformLat(lng-105.0, lat-35.0) + dlng := receiver.transformlng(lng-105.0, lat-35.0) + radLat := lat / 180.0 * pi + magic := math.Sin(radLat) + magic = 1 - ee*magic*magic + SqrtMagic := math.Sqrt(magic) + dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * SqrtMagic) * pi) + dlng = (dlng * 180.0) / (a / SqrtMagic * math.Cos(radLat) * pi) + mgLat := lat + dLat + mglng := lng + dlng + return []float64{mgLat, mglng} +} + +// GCJ02_To_WGS84 +// 火星坐标系 (GCJ-02) to WGS84 +// @param lng +// @param lat +// @return +func (receiver *GPSUtil) GCJ02_To_WGS84(lng, lat float64) []float64 { + gps := receiver.transform(lat, lng) + lngtitude := lng*2 - gps[1] + latitude := lat*2 - gps[0] + return []float64{lngtitude, latitude} +} + +/** + * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 将 GCJ-02 坐标转换成 BD-09 坐标 + * + * @param lat + * @param lng + */ +func (receiver *GPSUtil) gcj02_To_Bd09(lat, lng float64) []float64 { + x := lng + y := lat + z := math.Sqrt(x*x+y*y) + 0.00002*math.Sin(y*x_pi) + theta := math.Atan2(y, x) + 0.000003*math.Cos(x*x_pi) + templng := z*math.Cos(theta) + 0.0065 + tempLat := z*math.Sin(theta) + 0.006 + gps := []float64{tempLat, templng} + return gps +} + +/** + * * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 * * 将 BD-09 坐标转换成GCJ-02 坐标 * * @param + * bd_lat * @param bd_lng * @return + */ +func (receiver *GPSUtil) bd09_To_Gcj02(lat, lng float64) []float64 { + x := lng - 0.0065 + y := lat - 0.006 + z := math.Sqrt(x*x+y*y) - 0.00002*math.Sin(y*x_pi) + theta := math.Atan2(y, x) - 0.000003*math.Cos(x*x_pi) + templng := z * math.Cos(theta) + tempLat := z * math.Sin(theta) + gps := []float64{tempLat, templng} + return gps +} + +/**将WGS84转为bd09 + * @param lat + * @param lng + * @return + */ +func (receiver *GPSUtil) WGS84_To_bd09(lat, lng float64) []float64 { + gcj02 := receiver.WGS84_To_Gcj02(lat, lng) + bd09 := receiver.gcj02_To_Bd09(gcj02[0], gcj02[1]) + return bd09 +} + +func (receiver *GPSUtil) bd09_To_WGS84(lat, lng float64) []float64 { + gcj02 := receiver.bd09_To_Gcj02(lat, lng) + WGS84 := receiver.GCJ02_To_WGS84(gcj02[0], gcj02[1]) + //保留小数点后六位 + WGS84[0] = receiver.retain6(WGS84[0]) + WGS84[1] = receiver.retain6(WGS84[1]) + return WGS84 +} + +/**保留小数点后六位 + * @param num + * @return + */ +func (receiver *GPSUtil) retain6(num float64) float64 { + value, _ := strconv.ParseFloat(strconv.FormatFloat(num, 'f', 6, 64), 64) + return value +} diff --git a/api/v1/common/coryCommon/downloadFile.go b/api/v1/common/coryCommon/downloadFile.go new file mode 100644 index 0000000..a744bc5 --- /dev/null +++ b/api/v1/common/coryCommon/downloadFile.go @@ -0,0 +1,329 @@ +package coryCommon + +import ( + "archive/zip" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gctx" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "io" + "io/ioutil" + "net/http" + "os" + "path/filepath" + "strings" + "time" +) + +// CreateZipFile 生成一个压缩文件夹,然后将指定文件夹的数据(文件及文件夹)存放到压缩文件下 +func CreateZipFile(sourceDir, zipFile string) error { + zipFileToCreate, err := os.Create(zipFile) + if err != nil { + return err + } + defer zipFileToCreate.Close() + + zipWriter := zip.NewWriter(zipFileToCreate) + defer zipWriter.Close() + + err = filepath.Walk(sourceDir, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + return addFileToZip(zipWriter, path, sourceDir) + }) + if err != nil { + return err + } + + return nil +} + +func addFileToZip(zipWriter *zip.Writer, filePath, baseDir string) error { + fileToZip, err := os.Open(filePath) + if err != nil { + return err + } + defer fileToZip.Close() + + info, err := fileToZip.Stat() + if err != nil { + return err + } + + // 获取文件相对路径 + relPath, err := filepath.Rel(baseDir, filePath) + if err != nil { + return err + } + + // 替换路径分隔符确保在压缩文件中使用正斜杠 + relPath = strings.ReplaceAll(relPath, `\`, "/") + + header, err := zip.FileInfoHeader(info) + if err != nil { + return err + } + + header.Name = relPath + + if info.IsDir() { + header.Name += "/" + header.Method = zip.Store // Directory + } else { + header.Method = zip.Deflate // File + } + + writer, err := zipWriter.CreateHeader(header) + if err != nil { + return err + } + + if !info.IsDir() { + _, err = io.Copy(writer, fileToZip) + if err != nil { + return err + } + } + + return nil +} + +// MultifileDownload 【功能:多文件下载】===【参数:relativelyTemporaryPath相对路径、filesToCopy需要放在压缩包下载的文件】 +func MultifileDownload(relativelyTemporaryPath string, filesToCopy []string) (path string, err error) { + //网络资源下载到本地 + for i := range filesToCopy { + url := filesToCopy[i] + pathParts := strings.Split(url, "/") + fileName := pathParts[len(pathParts)-1] + filePath := filepath.ToSlash(GetCWD() + Temporary + "/" + fileName) + err = DownloadFile(url, filePath) + if err != nil { + return "", err + } + filesToCopy[i] = filePath + } + + // 1、创建临时压缩包 + zipFile, zipWriter, err := createTempZip(relativelyTemporaryPath) + if err != nil { + fmt.Println("Error creating temp zip:", err) + return "", err + } + defer func() { + zipWriter.Close() + zipFile.Close() + //暂时不删除、创建了个每月定时清除临时文件的定时器 + //for i := range filesToCopy { + // delFile(filesToCopy[i], 0) //删除临时文件 + //} + //go delFile(zipFile.Name(), 20) // 删除临时压缩文件,20秒后执行,防止文件还没下载完成就给删除了 + }() + + // 2、复制文件夹到压缩包 + for _, filePath := range filesToCopy { + err := copyFileToZip(zipWriter, filePath) + if err != nil { + fmt.Printf("Error copying %s to zip: %s\n", filePath, err) + return "", err + } + } + path = strings.ReplaceAll(filepath.ToSlash(zipFile.Name()), filepath.ToSlash(GetCWD())+"/resource/public", "/file") //如果服务器同步需要注意wxfile + return +} + +// 创建临时压缩包,并且提供写入数据 +func createTempZip(relativelyTemporaryPath string) (*os.File, *zip.Writer, error) { + cwd := GetCWD() + relativelyTemporaryPath + zipFile, err := os.CreateTemp(cwd, "temp_zip_*.zip") //*自动分配 + if err != nil { + return nil, nil, err + } + zipWriter := zip.NewWriter(zipFile) + return zipFile, zipWriter, nil +} + +// 复制文件到压缩包 +func copyFileToZip(zipWriter *zip.Writer, filePath string) error { + file, err := os.Open(filePath) + if err != nil { + return err + } + defer file.Close() + // 获取文件信息 + info, err := file.Stat() + if err != nil { + return err + } + // 创建zip文件中的文件头 + header, err := zip.FileInfoHeader(info) + if err != nil { + return err + } + // 指定文件名 + header.Name = filepath.Base(filePath) + // 创建zip文件中的文件 + writer, err := zipWriter.CreateHeader(header) + if err != nil { + return err + } + // 复制文件内容到zip文件中 + _, err = io.Copy(writer, file) + return err +} + +// delFile 删除文件 +func delFile(file string, second int) { + if second > 0 { + time.Sleep(time.Duration(second) * time.Second) + } + if err := os.Remove(file); err != nil { + fmt.Println("Failed to delete temporary file:", err) + } +} + +// DownloadFile URL资源下载到自定位置 +func DownloadFile(url, localPath string) error { + // 发起HTTP GET请求 + resp, err := http.Get(url) + if err != nil { + return err + } + defer resp.Body.Close() + + // 检查响应状态码 + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("HTTP request failed with status code: %d", resp.StatusCode) + } + + // 创建本地文件 + file, err := os.Create(localPath) + if err != nil { + return err + } + defer file.Close() + + // 将HTTP响应体的内容拷贝到本地文件 + _, err = io.Copy(file, resp.Body) + if err != nil { + return err + } + return nil +} + +// RemoveAllFilesInDirectory 删除指定目录下的所有文件 例子:"D:\\Cory\\go\\中煤\\zmkg-back\\resource\\public\\temporary" +func RemoveAllFilesInDirectory(directoryPath string) error { + // 获取指定目录下的所有文件和子目录 + files, err := filepath.Glob(filepath.Join(directoryPath, "*")) + if err != nil { + return err + } + // 遍历所有文件并删除 + for _, file := range files { + if err := os.RemoveAll(file); err != nil { + return err + } + fmt.Println("Deleted:", file) + } + return nil +} + +// GetFiles 获取目录下所有文件(包括文件夹中的文件) +func GetFiles(folder string) (filesList []string) { + files, _ := ioutil.ReadDir(folder) + for _, file := range files { + if file.IsDir() { + GetFiles(folder + "/" + file.Name()) + } else { + filesList = append(filesList, file.Name()) + } + } + + return +} + +// GetAllFile 获取目录下直属所有文件(不包括文件夹及其中的文件) +func GetAllFile(pathname string) (s []string, err error) { + rd, err := ioutil.ReadDir(pathname) + if err != nil { + fmt.Println("read dir fail:", err) + return s, err + } + + for _, fi := range rd { + if !fi.IsDir() { + fullName := pathname + "/" + fi.Name() + s = append(s, fullName) + } + } + return s, nil +} + +// Xcopy 复制文件 +func Xcopy(source, target string) (err error) { + // 打开源文件 + sourceFile, err := os.Open(source) + if err != nil { + return err + } + defer sourceFile.Close() + + // 创建目标文件 + destinationFile, err := os.Create(target) + if err != nil { + return err + } + defer destinationFile.Close() + + // 使用 io.Copy() 函数复制文件内容 + _, err = io.Copy(destinationFile, sourceFile) + return err +} + +// CustomizationMultifileDownload 定制下载(安全考试专用) +func CustomizationMultifileDownload(relativelyTemporaryPath string, mw []*model.ModelWeChatPdfWoRes) (path string, err error) { + //1、创建文件夹 + paht := filepath.ToSlash(GetCWD() + "/" + Ynr(Temporary+"/")) + folder := paht + FileName("aqks") //文件夹名 + folder = filepath.ToSlash(folder) + folder = folder[0 : len(folder)-1] + err = os.MkdirAll(folder, 0777) + if err != nil { + return + } + //2、网络资源下载到本地 + for i := range mw { + url := mw[i].Path + str := folder + "/" + mw[i].UserName + mw[i].Openid + os.MkdirAll(str, 0777) //根据名字创建子目录 + //url看看是几个文件 + fileNum := strings.Split(url, ",") + for j := range fileNum { + if fileNum[j] != "" { + //因为pdf是另外一个服务器所以需要下载,但是有的又是本地服务器,所以直接复制 + if strings.Contains(fileNum[j], "/wxfile/") { + pathstr := g.Cfg().MustGet(gctx.New(), "cory").String() + fileNum[j] + pathParts := strings.Split(pathstr, "/") + filePath := str + "/" + pathParts[len(pathParts)-1] + err = DownloadFile(pathstr, filePath) //下载网络图片 + if err != nil { + return "", err + } + } else { + source := FileToFunc(fileNum[j], 2) + pathParts := strings.Split(fileNum[j], "/") + target := str + "/" + pathParts[len(pathParts)-1] + err := Xcopy(source, target) + if err != nil { + return "", err + } + } + } + } + } + //3、压缩成压缩包zip + path = paht + FileName("aqks") + ".zip" + err = CreateZipFile(folder, path) + return +} diff --git a/api/v1/common/coryCommon/excelUtil/excel.go b/api/v1/common/coryCommon/excelUtil/excel.go new file mode 100644 index 0000000..908ffa1 --- /dev/null +++ b/api/v1/common/coryCommon/excelUtil/excel.go @@ -0,0 +1,515 @@ +package excelUtil + +import ( + "fmt" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/xuri/excelize/v2" + "os" + "strconv" + "time" +) + +// ExcelOne 每条数据一个工作簿 +func ExcelOne(oneDateOneList []*wxApplet.PunchingCardRecordOne) (file string, filePath string, fileName string) { + f := excelize.NewFile() + defer func() { + if err := f.Close(); err != nil { + fmt.Println(err) + } + }() + + for x, one := range oneDateOneList { + itoa := strconv.Itoa(x + 1) + // -----创建一个工作表 + _, err := f.NewSheet("Sheet" + itoa) + if err != nil { + fmt.Println(err) + return + } + // -----表数据 + //设置1、2行高度 + err = f.SetRowHeight("Sheet"+itoa, 1, 36) + err = f.SetRowHeight("Sheet"+itoa, 2, 14) + //1、左侧固定 ABC的1~2 + f.SetCellValue("Sheet"+itoa, "A1", "序号") + f.MergeCell("Sheet"+itoa, "A1", "A2") + + f.SetCellValue("Sheet"+itoa, "B1", "姓名") + f.MergeCell("Sheet"+itoa, "B1", "B2") + + f.SetCellValue("Sheet"+itoa, "C1", "") + f.MergeCell("Sheet"+itoa, "C1", "C2") + //2、左侧固定 ABC的3~4 + f.SetCellValue("Sheet"+itoa, "A3", "1") + f.MergeCell("Sheet"+itoa, "A3", "A4") + + f.SetCellValue("Sheet"+itoa, "B3", one.Name) + f.MergeCell("Sheet"+itoa, "B3", "B4") + + f.SetCellValue("Sheet"+itoa, "C3", "打卡记录") + f.SetCellValue("Sheet"+itoa, "C4", "工时") + + //3、中间数据---------从4开始创建列 + var num = "0" //循环生成列 + var numInt = 1 //循环列对应的编号 + var numi = 0 //循环过后需要的列 + for i := 0; i < len(one.PunchCard); i++ { + num = getColumnName(4 + i) + f.SetCellValue("Sheet"+itoa, num+"2", numInt) //循环列对应的编号 + f.SetCellValue("Sheet"+itoa, num+"3", one.PunchCard[i].Clock) //循环生成列 时间 + f.SetCellValue("Sheet"+itoa, num+"4", one.PunchCard[i].Hour) //循环生成列 统计 + numi = 4 + i + numInt = numInt + 1 + //最后一个总计 + if i == len(one.PunchCard)-1 { + f.SetCellValue("Sheet"+itoa, num+"5", "总计") //循环生成列 + } + } + f.MergeCell("Sheet"+itoa, getColumnName(4)+"1", getColumnName(numi)+"1") + f.SetCellValue("Sheet"+itoa, num+"1", "8月") + + numi = numi + 1 + num = getColumnName(numi) + //4、右侧不清楚 + f.SetCellValue("Sheet"+itoa, num+"1", "合计工时") + f.SetCellValue("Sheet"+itoa, num+"4", one.SumHour) + f.SetCellValue("Sheet"+itoa, num+"5", one.SumHour) + f.MergeCell("Sheet"+itoa, num+"1", num+"2") + + numi = numi + 1 + num = getColumnName(numi) + f.SetCellValue("Sheet"+itoa, num+"1", "合计工天") + f.SetCellValue("Sheet"+itoa, num+"4", one.SumDay) + f.SetCellValue("Sheet"+itoa, num+"5", one.SumDay) + f.MergeCell("Sheet"+itoa, num+"1", num+"2") + + numi = numi + 1 + num = getColumnName(numi) + f.SetCellValue("Sheet"+itoa, num+"1", "工人签名") + f.MergeCell("Sheet"+itoa, num+"1", num+"2") + + numi = numi + 1 + num = getColumnName(numi) + f.SetCellValue("Sheet"+itoa, num+"1", "备注") + f.MergeCell("Sheet"+itoa, num+"1", num+"2") + } + + // 设置工作簿的默认工作表 + f.SetActiveSheet(1) + + // 根据指定路径保存文件 + str := FileName() + filePath = coryCommon.Temporary + "/" + str + getwd, err := os.Getwd() + err = f.SaveAs(getwd + filePath) + if err != nil { + fmt.Println(err) + return "", "", "" + } + return getwd + filePath, filePath, str +} + +// ExcelTwo 多条数据在一个工作簿 +func ExcelTwo(oneDateOneList []*wxApplet.PunchingCardRecordOne) (file string, filePath string, fileName string) { + + f := excelize.NewFile() + defer func() { + if err := f.Close(); err != nil { + fmt.Println(err) + } + }() + + bottomStyleId, err := f.NewStyle(&excelize.Style{ + Border: []excelize.Border{ + {Type: "bottom", Color: "000000", Style: 1}, + //{Type: "diagonalDown", Color: "000000", Style: 5}, + //{Type: "diagonalUp", Color: "A020F0", Style: 6}, + }, + //背景 + Fill: excelize.Fill{ + Type: "pattern", + Color: []string{"#e6ecf0"}, + Pattern: 1, + }, + ////字体 + //Font: &excelize.Font{ + // Color: "#ffffff", // 字体颜色,这里使用蓝色 (#0000FF) + //}, + }) + + //全样式 + styleId, err := f.NewStyle(&excelize.Style{ + //边框 + Border: []excelize.Border{ + {Type: "left", Color: "000000", Style: 1}, + {Type: "top", Color: "000000", Style: 1}, + {Type: "bottom", Color: "000000", Style: 1}, + {Type: "right", Color: "000000", Style: 1}, + }, + //居中 + Alignment: &excelize.Alignment{ + Vertical: "center", // 上下居中 + Horizontal: "center", // 左右居中 + }, + //背景 + Fill: excelize.Fill{ + Type: "pattern", + Color: []string{"#e6ecf0"}, + Pattern: 1, + }, + ////字体 + //Font: &excelize.Font{ + // Color: "#ffffff", // 字体颜色,这里使用蓝色 (#0000FF) + //}, + }) + // 每组数据隔N行另起 + bookNum := 0 + for x, one := range oneDateOneList { + if one.Name == "" { + continue + } + itoa := "1" //第一个工作簿 + var num = "0" //循环生成列 + var numInt = 1 //循环列对应的编号 + var numi = 0 //循环过后需要的列 + for i := 0; i < len(one.PunchCard); i++ { + //设置1、2行高度 + err := f.SetRowHeight("Sheet"+itoa, bookNum+1, 36) + err = f.SetRowHeight("Sheet"+itoa, bookNum+2, 14) + if err != nil { + fmt.Println(err) + return + } + //1、左侧固定 ABC的1~2 + f.SetCellValue("Sheet"+itoa, "A"+strconv.Itoa((bookNum+1)), "序号") + f.MergeCell("Sheet"+itoa, "A"+strconv.Itoa((bookNum+1)), "A"+strconv.Itoa((bookNum+2))) + f.SetCellStyle("Sheet"+itoa, "A"+strconv.Itoa((bookNum+1)), "A"+strconv.Itoa((bookNum+2)), styleId) + + f.SetCellValue("Sheet"+itoa, "B"+strconv.Itoa((bookNum+1)), "姓名") + f.MergeCell("Sheet"+itoa, "B"+strconv.Itoa((bookNum+1)), "B"+strconv.Itoa((bookNum+2))) + f.SetCellStyle("Sheet"+itoa, "B"+strconv.Itoa((bookNum+1)), "B"+strconv.Itoa((bookNum+2)), styleId) + + f.SetCellValue("Sheet"+itoa, "C"+strconv.Itoa((bookNum+1)), "") + f.MergeCell("Sheet"+itoa, "C"+strconv.Itoa((bookNum+1)), "C"+strconv.Itoa((bookNum+2))) + f.SetCellStyle("Sheet"+itoa, "C"+strconv.Itoa((bookNum+1)), "C"+strconv.Itoa((bookNum+2)), styleId) + //2、左侧固定 ABC的3~4 + f.SetCellValue("Sheet"+itoa, "A"+strconv.Itoa((bookNum+3)), x+1) + f.MergeCell("Sheet"+itoa, "A"+strconv.Itoa((bookNum+3)), "A"+strconv.Itoa((bookNum+4))) + f.SetCellStyle("Sheet"+itoa, "A"+strconv.Itoa((bookNum+3)), "A"+strconv.Itoa((bookNum+4)), styleId) + + f.SetCellValue("Sheet"+itoa, "B"+strconv.Itoa((bookNum+3)), one.Name) + f.MergeCell("Sheet"+itoa, "B"+strconv.Itoa((bookNum+3)), "B"+strconv.Itoa((bookNum+4))) + f.SetCellStyle("Sheet"+itoa, "B"+strconv.Itoa((bookNum+3)), "B"+strconv.Itoa((bookNum+4)), styleId) + + //f.SetCellValue("Sheet"+itoa, "c"+strconv.Itoa((bookNum+3)), "打卡记录") + f.SetCellValue("Sheet"+itoa, "c"+strconv.Itoa((bookNum+3)), "工时") + f.MergeCell("Sheet"+itoa, "c"+strconv.Itoa((bookNum+3)), "c"+strconv.Itoa((bookNum+4))) + f.SetCellStyle("Sheet"+itoa, "c"+strconv.Itoa((bookNum+3)), "c"+strconv.Itoa((bookNum+4)), styleId) + + //3、中间数据---------从4开始创建列 + num = getColumnName(4 + i) + f.SetCellValue("Sheet"+itoa, num+strconv.Itoa((bookNum+2)), numInt) //循环列对应的编号 + f.SetCellStyle("Sheet"+itoa, num+strconv.Itoa((bookNum+2)), num+strconv.Itoa((bookNum+2)), styleId) //循环列对应的编号 + f.SetCellValue("Sheet"+itoa, num+strconv.Itoa((bookNum+3)), one.PunchCard[i].Clock) //循环生成列 时间 + f.SetCellStyle("Sheet"+itoa, num+strconv.Itoa((bookNum+3)), num+strconv.Itoa((bookNum+3)), styleId) //循环生成列 时间 + f.SetCellValue("Sheet"+itoa, num+strconv.Itoa((bookNum+4)), one.PunchCard[i].Hour) //循环生成列 统计 + f.SetCellStyle("Sheet"+itoa, num+strconv.Itoa((bookNum+4)), num+strconv.Itoa((bookNum+4)), styleId) //循环生成列 统计 + numi = 4 + i + numInt = numInt + 1 + //最后一个总计 + if i == len(one.PunchCard)-1 { + f.SetCellValue("Sheet"+itoa, num+strconv.Itoa((bookNum+5)), "总计") //循环生成列 + f.SetCellStyle("Sheet"+itoa, num+strconv.Itoa((bookNum+5)), "总计", styleId) //循环生成列 + } + } + f.SetCellValue("Sheet"+itoa, "D"+strconv.Itoa((bookNum+1)), one.Years) + f.MergeCell("Sheet"+itoa, getColumnName(4)+strconv.Itoa(bookNum+1), getColumnName(numi)+strconv.Itoa(bookNum+1)) + f.SetCellStyle("Sheet"+itoa, getColumnName(4)+strconv.Itoa(bookNum+1), getColumnName(numi)+strconv.Itoa(bookNum+1), styleId) + + numi = numi + 1 + num = getColumnName(numi) + //4、右侧不清楚 + f.SetCellValue("Sheet"+itoa, num+strconv.Itoa((bookNum+1)), "合计工时") + f.MergeCell("Sheet"+itoa, num+strconv.Itoa(bookNum+1), getColumnName(numi)+strconv.Itoa(bookNum+3)) + f.SetCellStyle("Sheet"+itoa, num+strconv.Itoa(bookNum+1), getColumnName(numi)+strconv.Itoa(bookNum+3), styleId) + + f.SetCellValue("Sheet"+itoa, num+strconv.Itoa((bookNum+4)), one.SumHour) + f.MergeCell("Sheet"+itoa, num+strconv.Itoa(bookNum+4), getColumnName(numi)+strconv.Itoa(bookNum+4)) + f.SetCellStyle("Sheet"+itoa, num+strconv.Itoa(bookNum+4), getColumnName(numi)+strconv.Itoa(bookNum+4), styleId) + + f.SetCellValue("Sheet"+itoa, num+strconv.Itoa((bookNum+5)), one.SumHour) + f.MergeCell("Sheet"+itoa, num+strconv.Itoa(bookNum+5), getColumnName(numi)+strconv.Itoa(bookNum+5)) + f.SetCellStyle("Sheet"+itoa, num+strconv.Itoa(bookNum+5), getColumnName(numi)+strconv.Itoa(bookNum+5), styleId) + + numi = numi + 1 + num = getColumnName(numi) + f.SetCellValue("Sheet"+itoa, num+strconv.Itoa((bookNum+1)), "合计工天") + f.MergeCell("Sheet"+itoa, num+strconv.Itoa(bookNum+1), getColumnName(numi)+strconv.Itoa(bookNum+3)) + f.SetCellStyle("Sheet"+itoa, num+strconv.Itoa(bookNum+1), getColumnName(numi)+strconv.Itoa(bookNum+3), styleId) + + f.SetCellValue("Sheet"+itoa, num+strconv.Itoa((bookNum+4)), one.SumDay) + f.MergeCell("Sheet"+itoa, num+strconv.Itoa(bookNum+4), getColumnName(numi)+strconv.Itoa(bookNum+4)) + f.SetCellStyle("Sheet"+itoa, num+strconv.Itoa(bookNum+4), getColumnName(numi)+strconv.Itoa(bookNum+4), styleId) + + f.SetCellValue("Sheet"+itoa, num+strconv.Itoa((bookNum+5)), one.SumDay) + f.MergeCell("Sheet"+itoa, num+strconv.Itoa(bookNum+5), getColumnName(numi)+strconv.Itoa(bookNum+5)) + f.SetCellStyle("Sheet"+itoa, num+strconv.Itoa(bookNum+5), getColumnName(numi)+strconv.Itoa(bookNum+5), styleId) + + numi = numi + 1 + num = getColumnName(numi) + f.SetCellValue("Sheet"+itoa, num+strconv.Itoa((bookNum+1)), "工人签名") + f.MergeCell("Sheet"+itoa, num+strconv.Itoa((bookNum+1)), num+strconv.Itoa((bookNum+3))) + f.SetCellStyle("Sheet"+itoa, num+strconv.Itoa((bookNum+1)), num+strconv.Itoa((bookNum+3)), styleId) + + f.SetCellValue("Sheet"+itoa, num+strconv.Itoa((bookNum+4)), "") + f.MergeCell("Sheet"+itoa, num+strconv.Itoa((bookNum+4)), num+strconv.Itoa((bookNum+5))) + f.SetCellStyle("Sheet"+itoa, num+strconv.Itoa((bookNum+4)), num+strconv.Itoa((bookNum+5)), styleId) + + numi = numi + 1 + num = getColumnName(numi) + f.SetCellValue("Sheet"+itoa, num+strconv.Itoa((bookNum+1)), "备注") + f.MergeCell("Sheet"+itoa, num+strconv.Itoa((bookNum+1)), num+strconv.Itoa((bookNum+3))) + f.SetCellStyle("Sheet"+itoa, num+strconv.Itoa((bookNum+1)), num+strconv.Itoa((bookNum+3)), styleId) + + f.SetCellValue("Sheet"+itoa, num+strconv.Itoa((bookNum+4)), "") + f.MergeCell("Sheet"+itoa, num+strconv.Itoa((bookNum+4)), num+strconv.Itoa((bookNum+5))) + f.SetCellStyle("Sheet"+itoa, num+strconv.Itoa((bookNum+4)), num+strconv.Itoa((bookNum+5)), styleId) + + f.SetCellStyle("Sheet"+itoa, "A"+strconv.Itoa((bookNum+5)), getColumnName(numi-4)+strconv.Itoa((bookNum+5)), bottomStyleId) + + bookNum = bookNum + 10 + } + + // 设置工作簿的默认工作表 + f.SetActiveSheet(1) + + // 根据指定路径保存文件 + str := FileName() + filePath = coryCommon.Temporary + "/" + str + getwd, err := os.Getwd() + err = f.SaveAs(getwd + filePath) + if err != nil { + fmt.Println(err) + return "", "", "" + } + return getwd + filePath, filePath, str +} + +// ExcelThree 多个工作簿,每个工作簿有多条数据 +func ExcelThree(gey []*wxApplet.GroupEntity) (file string, filePath string, fileName string) { + f := excelize.NewFile() + defer func() { + if err := f.Close(); err != nil { + fmt.Println(err) + } + }() + + bottomStyleId, err := f.NewStyle(&excelize.Style{ + Border: []excelize.Border{ + {Type: "bottom", Color: "000000", Style: 1}, + //{Type: "diagonalDown", Color: "000000", Style: 5}, + //{Type: "diagonalUp", Color: "A020F0", Style: 6}, + }, + //背景 + Fill: excelize.Fill{ + Type: "pattern", + Color: []string{"#e6ecf0"}, + Pattern: 1, + }, + ////字体 + //Font: &excelize.Font{ + // Color: "#ffffff", // 字体颜色,这里使用蓝色 (#0000FF) + //}, + }) + + //全样式 + styleId, err := f.NewStyle(&excelize.Style{ + //边框 + Border: []excelize.Border{ + {Type: "left", Color: "000000", Style: 1}, + {Type: "top", Color: "000000", Style: 1}, + {Type: "bottom", Color: "000000", Style: 1}, + {Type: "right", Color: "000000", Style: 1}, + }, + //居中 + Alignment: &excelize.Alignment{ + Vertical: "center", // 上下居中 + Horizontal: "center", // 左右居中 + }, + //背景 + Fill: excelize.Fill{ + Type: "pattern", + Color: []string{"#e6ecf0"}, + Pattern: 1, + }, + ////字体 + //Font: &excelize.Font{ + // Color: "#ffffff", // 字体颜色,这里使用蓝色 (#0000FF) + //}, + }) + + //工作簿 + for _, data := range gey { + //itoa := strconv.Itoa(y + 1) + itoa := data.GroupName + _, err = f.NewSheet(itoa) + + oneDateOneList := data.PunchingCardRecordOne + //工作簿里面的数据 + bookNum := 0 // 每组数据隔N行另起 + for x, one := range oneDateOneList { + //itoa := "1" //第一个工作簿 + var num = "0" //循环生成列 + var numInt = 1 //循环列对应的编号 + var numi = 0 //循环过后需要的列 + for i := 0; i < len(one.PunchCard); i++ { + //设置1、2行高度 + err := f.SetRowHeight(itoa, bookNum+1, 36) + err = f.SetRowHeight(itoa, bookNum+2, 14) + if err != nil { + fmt.Println(err) + return + } + //1、左侧固定 ABC的1~2 + f.SetCellValue(itoa, "A"+strconv.Itoa((bookNum+1)), "序号") + f.MergeCell(itoa, "A"+strconv.Itoa((bookNum+1)), "A"+strconv.Itoa((bookNum+2))) + f.SetCellStyle(itoa, "A"+strconv.Itoa((bookNum+1)), "A"+strconv.Itoa((bookNum+2)), styleId) + + f.SetCellValue(itoa, "B"+strconv.Itoa((bookNum+1)), "姓名") + f.MergeCell(itoa, "B"+strconv.Itoa((bookNum+1)), "B"+strconv.Itoa((bookNum+2))) + f.SetCellStyle(itoa, "B"+strconv.Itoa((bookNum+1)), "B"+strconv.Itoa((bookNum+2)), styleId) + + f.SetCellValue(itoa, "C"+strconv.Itoa((bookNum+1)), "") + f.MergeCell(itoa, "C"+strconv.Itoa((bookNum+1)), "C"+strconv.Itoa((bookNum+2))) + f.SetCellStyle(itoa, "C"+strconv.Itoa((bookNum+1)), "C"+strconv.Itoa((bookNum+2)), styleId) + //2、左侧固定 ABC的3~4 + f.SetCellValue(itoa, "A"+strconv.Itoa((bookNum+3)), x+1) + f.MergeCell(itoa, "A"+strconv.Itoa((bookNum+3)), "A"+strconv.Itoa((bookNum+4))) + f.SetCellStyle(itoa, "A"+strconv.Itoa((bookNum+3)), "A"+strconv.Itoa((bookNum+4)), styleId) + + f.SetCellValue(itoa, "B"+strconv.Itoa((bookNum+3)), one.Name) + f.MergeCell(itoa, "B"+strconv.Itoa((bookNum+3)), "B"+strconv.Itoa((bookNum+4))) + f.SetCellStyle(itoa, "B"+strconv.Itoa((bookNum+3)), "B"+strconv.Itoa((bookNum+4)), styleId) + + //f.SetCellValue(itoa, "c"+strconv.Itoa((bookNum+3)), "打卡记录") + f.SetCellValue(itoa, "c"+strconv.Itoa((bookNum+3)), "工时") + f.MergeCell(itoa, "c"+strconv.Itoa((bookNum+3)), "c"+strconv.Itoa((bookNum+4))) + f.SetCellStyle(itoa, "c"+strconv.Itoa((bookNum+3)), "c"+strconv.Itoa((bookNum+4)), styleId) + + //3、中间数据---------从4开始创建列 + num = getColumnName(4 + i) + f.SetCellValue(itoa, num+strconv.Itoa((bookNum+2)), numInt) //循环列对应的编号 + f.SetCellStyle(itoa, num+strconv.Itoa((bookNum+2)), num+strconv.Itoa((bookNum+2)), styleId) //循环列对应的编号 + f.SetCellValue(itoa, num+strconv.Itoa((bookNum+3)), one.PunchCard[i].Clock) //循环生成列 时间 + f.SetCellStyle(itoa, num+strconv.Itoa((bookNum+3)), num+strconv.Itoa((bookNum+3)), styleId) //循环生成列 时间 + f.SetCellValue(itoa, num+strconv.Itoa((bookNum+4)), one.PunchCard[i].Hour) //循环生成列 统计 + f.SetCellStyle(itoa, num+strconv.Itoa((bookNum+4)), num+strconv.Itoa((bookNum+4)), styleId) //循环生成列 统计 + numi = 4 + i + numInt = numInt + 1 + //最后一个总计 + if i == len(one.PunchCard)-1 { + f.SetCellValue(itoa, num+strconv.Itoa((bookNum+5)), "总计") //循环生成列 + f.SetCellStyle(itoa, num+strconv.Itoa((bookNum+5)), "总计", styleId) //循环生成列 + } + } + f.SetCellValue(itoa, "D"+strconv.Itoa((bookNum+1)), one.Years) + f.MergeCell(itoa, getColumnName(4)+strconv.Itoa(bookNum+1), getColumnName(numi)+strconv.Itoa(bookNum+1)) + f.SetCellStyle(itoa, getColumnName(4)+strconv.Itoa(bookNum+1), getColumnName(numi)+strconv.Itoa(bookNum+1), styleId) + + numi = numi + 1 + num = getColumnName(numi) + //4、右侧不清楚 + f.SetCellValue(itoa, num+strconv.Itoa((bookNum+1)), "合计工时") + f.MergeCell(itoa, num+strconv.Itoa(bookNum+1), getColumnName(numi)+strconv.Itoa(bookNum+3)) + f.SetCellStyle(itoa, num+strconv.Itoa(bookNum+1), getColumnName(numi)+strconv.Itoa(bookNum+3), styleId) + + f.SetCellValue(itoa, num+strconv.Itoa((bookNum+4)), one.SumHour) + f.MergeCell(itoa, num+strconv.Itoa(bookNum+4), getColumnName(numi)+strconv.Itoa(bookNum+4)) + f.SetCellStyle(itoa, num+strconv.Itoa(bookNum+4), getColumnName(numi)+strconv.Itoa(bookNum+4), styleId) + + f.SetCellValue(itoa, num+strconv.Itoa((bookNum+5)), one.SumHour) + f.MergeCell(itoa, num+strconv.Itoa(bookNum+5), getColumnName(numi)+strconv.Itoa(bookNum+5)) + f.SetCellStyle(itoa, num+strconv.Itoa(bookNum+5), getColumnName(numi)+strconv.Itoa(bookNum+5), styleId) + + numi = numi + 1 + num = getColumnName(numi) + f.SetCellValue(itoa, num+strconv.Itoa((bookNum+1)), "合计工天") + f.MergeCell(itoa, num+strconv.Itoa(bookNum+1), getColumnName(numi)+strconv.Itoa(bookNum+3)) + f.SetCellStyle(itoa, num+strconv.Itoa(bookNum+1), getColumnName(numi)+strconv.Itoa(bookNum+3), styleId) + + f.SetCellValue(itoa, num+strconv.Itoa((bookNum+4)), one.SumDay) + f.MergeCell(itoa, num+strconv.Itoa(bookNum+4), getColumnName(numi)+strconv.Itoa(bookNum+4)) + f.SetCellStyle(itoa, num+strconv.Itoa(bookNum+4), getColumnName(numi)+strconv.Itoa(bookNum+4), styleId) + + f.SetCellValue(itoa, num+strconv.Itoa((bookNum+5)), one.SumDay) + f.MergeCell(itoa, num+strconv.Itoa(bookNum+5), getColumnName(numi)+strconv.Itoa(bookNum+5)) + f.SetCellStyle(itoa, num+strconv.Itoa(bookNum+5), getColumnName(numi)+strconv.Itoa(bookNum+5), styleId) + + numi = numi + 1 + num = getColumnName(numi) + f.SetCellValue(itoa, num+strconv.Itoa((bookNum+1)), "工人签名") + f.MergeCell(itoa, num+strconv.Itoa((bookNum+1)), num+strconv.Itoa((bookNum+3))) + f.SetCellStyle(itoa, num+strconv.Itoa((bookNum+1)), num+strconv.Itoa((bookNum+3)), styleId) + + f.SetCellValue(itoa, num+strconv.Itoa((bookNum+4)), "") + f.MergeCell(itoa, num+strconv.Itoa((bookNum+4)), num+strconv.Itoa((bookNum+5))) + f.SetCellStyle(itoa, num+strconv.Itoa((bookNum+4)), num+strconv.Itoa((bookNum+5)), styleId) + + numi = numi + 1 + num = getColumnName(numi) + f.SetCellValue(itoa, num+strconv.Itoa((bookNum+1)), "备注") + f.MergeCell(itoa, num+strconv.Itoa((bookNum+1)), num+strconv.Itoa((bookNum+3))) + f.SetCellStyle(itoa, num+strconv.Itoa((bookNum+1)), num+strconv.Itoa((bookNum+3)), styleId) + + f.SetCellValue(itoa, num+strconv.Itoa((bookNum+4)), "") + f.MergeCell(itoa, num+strconv.Itoa((bookNum+4)), num+strconv.Itoa((bookNum+5))) + f.SetCellStyle(itoa, num+strconv.Itoa((bookNum+4)), num+strconv.Itoa((bookNum+5)), styleId) + + f.SetCellStyle(itoa, "A"+strconv.Itoa((bookNum+5)), getColumnName(numi-4)+strconv.Itoa((bookNum+5)), bottomStyleId) + + //err = f.SetCellStyle("Sheet1", "A"+strconv.Itoa((bookNum+1)), "A"+strconv.Itoa((bookNum+5)), leftStyleId) + //err = f.SetCellStyle("Sheet1", "I"+strconv.Itoa((bookNum+1)), "I"+strconv.Itoa((bookNum+5)), rightStyleId) + //err = f.SetCellStyle("Sheet1", "A"+strconv.Itoa((bookNum+1)), "I"+strconv.Itoa((bookNum+1)), topStyleId) + //err = f.SetCellStyle("Sheet1", "A"+strconv.Itoa((bookNum+5)), "I"+strconv.Itoa((bookNum+5)), bottomStyleId) + + bookNum = bookNum + 10 + } + } + + // 设置工作簿的默认工作表 + f.SetActiveSheet(1) + + // 根据指定路径保存文件 + str := FileName() + filePath = coryCommon.Temporary + "/" + str + getwd, err := os.Getwd() + err = f.SaveAs(getwd + filePath) + if err != nil { + fmt.Println(err) + return "", "", "" + } + return getwd + filePath, filePath, str +} + +// 根据列索引获取列的字母标识 比如1就是A 30就是AD +func getColumnName(index int) string { + var columnName string + for index > 0 { + mod := (index - 1) % 26 + columnName = string('A'+mod) + columnName + index = (index - 1) / 26 + } + return columnName +} + +// FileName 生成时间戳文件名 +func FileName() (str string) { + // 获取当前时间 + currentTime := time.Now() + // 格式化时间戳为字符串 + timestamp := currentTime.Format("20060102150405") + // 生成文件名 + fileName := fmt.Sprintf("zm_%s.xlsx", timestamp) + return fileName +} diff --git a/api/v1/common/coryCommon/excelUtil/excelEntity.go b/api/v1/common/coryCommon/excelUtil/excelEntity.go new file mode 100644 index 0000000..df0263e --- /dev/null +++ b/api/v1/common/coryCommon/excelUtil/excelEntity.go @@ -0,0 +1,55 @@ +package excelUtil + +type Style struct { + Border []Border + Fill Fill + Font *Font + Alignment *Alignment + Protection *Protection + NumFmt int + DecimalPlaces int + CustomNumFmt *string + NegRed bool +} + +type Fill struct { + Type string + Pattern int + Color []string + Shading int +} + +type Protection struct { + Hidden bool + Locked bool +} + +type Font struct { + Bold bool + Italic bool + Underline string + Family string + Size float64 + Strike bool + Color string + ColorIndexed int + ColorTheme *int + ColorTint float64 + VertAlign string +} +type Border struct { + Type string + Color string + Style int +} +type Alignment struct { + Horizontal string + Indent int + JustifyLastLine bool + ReadingOrder uint64 + RelativeIndent int + ShrinkToFit bool + TextRotation int + Vertical string + WrapText bool +} diff --git a/api/v1/common/coryCommon/imgData.go b/api/v1/common/coryCommon/imgData.go new file mode 100644 index 0000000..fa03430 --- /dev/null +++ b/api/v1/common/coryCommon/imgData.go @@ -0,0 +1,209 @@ +package coryCommon + +import ( + "bytes" + "encoding/base64" + "errors" + "fmt" + "image" + _ "image/gif" + _ "image/jpeg" + _ "image/png" + "io/ioutil" + "net/url" + "os" + "path/filepath" + "strconv" + "strings" +) + +const ( + MinShortEdge = 15 + MaxLongEdge = 4096 + MaxSize = 1024 * 1024 // 4MB + SupportedExts = ".jpg .jpeg .png .bmp" +) + +func ImgDataBase64(filePath string) (err error, encodedURL string) { + file, err := os.Open(filePath) + if err != nil { + fmt.Println("打开图像文件失败:", err) + err = errors.New("打开图像文件失败") + return + } + defer file.Close() + + fileInfo, err := file.Stat() + if err != nil { + fmt.Println("读取图像文件信息失败:", err) + err = errors.New("读取图像文件信息失败") + return + } + + fileSize := fileInfo.Size() + if fileSize > MaxSize { + fmt.Println("图像文件大小超过限制:", fileSize) + err = errors.New("图像文件大小超过限制") + return + } + + imgData, err := ioutil.ReadAll(file) + if err != nil { + fmt.Println("读取图像文件内容失败:", err) + err = errors.New("读取图像文件内容失败") + return + } + + bounds, format, err := image.DecodeConfig(bytes.NewReader(imgData)) + if err != nil { + fmt.Println("解码图像配置失败:", err) + err = errors.New("解码图像配置失败") + return + } + + if format != "jpeg" && format != "jpg" && format != "png" && format != "bmp" { + fmt.Println("不支持的图像格式:", format) + //err = errors.New("不支持的图像格式") + err = errors.New("支持的图像格式为:jpg、png、gif、bmp") + return + } + + width := bounds.Width + height := bounds.Height + shortEdge := width + if height < width { + shortEdge = height + } + + if shortEdge < MinShortEdge { + fmt.Println("图像尺寸的最短边小于要求:", shortEdge) + str := "图像尺寸的最短边小于要求:" + strconv.Itoa(shortEdge) + err = errors.New(str) + return + } + + if width > MaxLongEdge || height > MaxLongEdge { + fmt.Println("图像尺寸的最长边超过限制:", width, height) + str := "图像尺寸的最长边超过限制:" + strconv.Itoa(width) + strconv.Itoa(height) + err = errors.New(str) + return + } + + // Base64编码图像数据 + encodedStr := base64.StdEncoding.EncodeToString(imgData) + + // URL编码 + //urlEncodedStr := url.QueryEscape(encodedStr) + + //fmt.Println("Base64编码并URL编码后的图像数据:", urlEncodedStr) + return err, encodedStr +} + +/* +EncodeAndUrlEncodeImage 图片文件的绝对路径 + + 功能: + 图像数据,base64编码后进行urlencode,需去掉编码头(data:image/jpeg;base64, )要求base64编码和urlencode后大小不超过N兆,最短边至少15px,最长边最大4096px,支持jpg/jpeg/png/bmp格式 +*/ +func EncodeAndUrlEncodeImage(filePath string, size int64) (string, error) { + // 检查文件是否存在 + _, err := os.Stat(filePath) + if os.IsNotExist(err) { + return "", fmt.Errorf("文件 %s 不存在", filePath) + } + + // 检查文件大小 + fileSize := getFileSize(filePath) + if fileSize > (size * MaxSize) { + return "", fmt.Errorf("文件大小超过限制") + } + + // 检查图像尺寸 + img, err := loadImage(filePath) + if err != nil { + return "", fmt.Errorf("无法加载图像: %s", err) + } + + bounds := img.Bounds() + if !isValidSize(bounds) { + return "", fmt.Errorf("图像尺寸不符合要求") + } + + // 读取文件 + fileData, err := ioutil.ReadFile(filePath) + if err != nil { + return "", fmt.Errorf("无法读取文件: %s", err) + } + + // 获取文件后缀名 + ext := filepath.Ext(filePath) + + // 检查是否支持的文件格式 + if !isSupportedFormat(ext) { + return "", fmt.Errorf("不支持的文件格式") + } + + // 将图像数据进行 base64 编码 + encodedData := base64.StdEncoding.EncodeToString(fileData) + + // 去掉编码头(如:"data:image/jpeg;base64,") + encodedData = removeEncodingHeader(encodedData, ext) + + //// 对 base64 编码后的数据进行 URL 编码 + //encodedData = urlEncode(encodedData) + + return encodedData, nil +} + +func getFileSize(filePath string) int64 { + fileInfo, err := os.Stat(filePath) + if err != nil { + return 0 + } + return fileInfo.Size() +} + +func loadImage(filePath string) (image.Image, error) { + file, err := os.Open(filePath) + if err != nil { + return nil, err + } + defer file.Close() + + img, _, err := image.Decode(file) + if err != nil { + return nil, err + } + return img, nil +} + +func isValidSize(bounds image.Rectangle) bool { + width := bounds.Dx() + height := bounds.Dy() + if width < MinShortEdge || height < MinShortEdge { + return false + } + if width > MaxLongEdge || height > MaxLongEdge { + return false + } + return true +} + +func isSupportedFormat(ext string) bool { + ext = strings.ToLower(ext) + return strings.Contains(SupportedExts, ext) +} + +func removeEncodingHeader(encodedData string, ext string) string { + header := fmt.Sprintf("data:image/%s;base64,", ext[1:]) + + if strings.HasPrefix(encodedData, header) { + encodedData = strings.TrimPrefix(encodedData, header) + } + + return encodedData +} + +func urlEncode(data string) string { + return url.PathEscape(data) +} diff --git a/api/v1/common/coryCommon/largeNumber.go b/api/v1/common/coryCommon/largeNumber.go new file mode 100644 index 0000000..37c96f2 --- /dev/null +++ b/api/v1/common/coryCommon/largeNumber.go @@ -0,0 +1,38 @@ +package coryCommon + +import ( + "errors" + "math/big" +) + +// PercentageFunc 百分比计算(精度很高:比如说总数100,完成100,最终得到结果为99.99999999%,那么会直接操作成100) +// precision:设置精度 +// total:总数据量 +// finish:完成度 +func PercentageFunc(precision uint, total, finish float64) (consequence float64, err error) { + if total == 0 { + err = errors.New("总数据不能为初始值") + return 0, err + } + if precision == 0 { + err = errors.New("精度不能为初始值") + return 0, err + } + consequence = 0 + // 定义大浮点数 + numerator := big.NewFloat(100) + denominator := big.NewFloat(total) + result := big.NewFloat(finish) + // 设置精度 + //var precision uint = 100 // 设置为你需要的精度 + numerator.SetPrec(precision) + denominator.SetPrec(precision) + result.SetPrec(precision) + // 计算结果 + result.Quo(result, denominator) + result.Mul(result, numerator) + // 截取到两位小数 + resultRounded, _ := result.Float64() + consequence = float64(int(resultRounded*100)) / 100 // 保留两位小数 + return +} diff --git a/api/v1/common/coryCommon/map.go b/api/v1/common/coryCommon/map.go new file mode 100644 index 0000000..7d6fd9e --- /dev/null +++ b/api/v1/common/coryCommon/map.go @@ -0,0 +1,111 @@ +package coryCommon + +import ( + "fmt" + "github.com/golang/geo/s2" + toolTurf "github.com/tiger1103/gfast/v3/api/v1/common/tool/turf" + "github.com/tomchavakis/geojson/geometry" + "github.com/tomchavakis/turf-go" +) + +// DetailedMap shp文件数据 +type DetailedMap struct { + Positions []struct { + Lng float64 `json:"lng"` + Lat float64 `json:"lat"` + Alt float64 `json:"alt"` + } `json:"positions"` + Width string `json:"width"` + Color string `json:"color"` + Alpha string `json:"alpha"` + Name string `json:"name"` + Property string `json:"property"` + TxtMemo string `json:"TxtMemo"` + ShapeLeng string `json:"Shape_Leng"` + ShapeArea string `json:"Shape_Area"` + Range struct { + MinX float64 `json:"min_x"` + MinY float64 `json:"min_y"` + MaxX float64 `json:"max_x"` + MaxY float64 `json:"max_y"` + } `json:"range"` +} + +// RectangularFrameRange 是否在矩形框范围内,是否在打卡范围内 +func RectangularFrameRange(dataInfo DetailedMap, locationLng float64, locationLat float64) (flag bool) { + //1、组装数据 84坐标 + polygon := [][]float64{} + for _, data := range dataInfo.Positions { + polygon = append(polygon, []float64{data.Lng, data.Lat}) + } + //3、判断位置 + distance := toolTurf.BooleanPointInPolygon([]float64{locationLng, locationLat}, polygon) + if distance { + fmt.Println("点在矩形框内") + return true + } else { + fmt.Println("点在矩形框外") + return false + } +} + +// FEIQI_RectangularFrameRange 是否在矩形框范围内,是否在打卡范围内 !!!!!!!!!!!!!!!!!有问题 +func FEIQI_RectangularFrameRange(dataInfo DetailedMap, locationLng float64, locationLat float64) (flag bool) { + //1、组装数据 + var pl geometry.Polygon + var ls []geometry.LineString + var pt []geometry.Point + for _, data := range dataInfo.Positions { + wgs84 := LatLng{Latitude: data.Lat, Longitude: data.Lng} + t1 := WGS84ToEPSG900913(wgs84) + var p geometry.Point + p.Lng = t1.Latitude + p.Lat = t1.Longitude + pt = append(pt, p) + } + var lsTwo geometry.LineString + lsTwo.Coordinates = pt + ls = append(ls, lsTwo) + pl.Coordinates = append(pl.Coordinates, lsTwo) + //2、当前人所在位置 + locationLng, locationLat = GCJ02toWGS84(locationLng, locationLat) + wgs84 := LatLng{Latitude: locationLng, Longitude: locationLat} + t1 := WGS84ToEPSG900913(wgs84) + myPoint := geometry.Point{ + Lng: t1.Longitude, + Lat: t1.Latitude, + } + //3、判断myPoint是否在pl框内 + distance, _ := turf.PointInPolygon(myPoint, pl) + if distance { + fmt.Println("点在矩形框内") + return true + } else { + fmt.Println("点在矩形框外") + return false + } +} + +type LatLng struct { + Latitude float64 + Longitude float64 +} + +// WGS84ToEPSG900913 将WGS84坐标转换为EPSG-900913坐标 +func WGS84ToEPSG900913(wgs84 LatLng) LatLng { + // 将WGS84坐标转换为s2.LatLng + ll := s2.LatLngFromDegrees(wgs84.Latitude, wgs84.Longitude) + + // 创建s2.Point + p := s2.PointFromLatLng(ll) + + // 计算EPSG-900913坐标 + //epsgX, epsgY := p.Normalize() + normalize := p.Normalize() + + // 将坐标范围映射到EPSG-900913的范围 + epsgX := normalize.X * 20037508.34 / 180.0 + epsgY := normalize.Y * 20037508.34 / 180.0 + + return LatLng{Latitude: epsgY, Longitude: epsgX} +} diff --git a/api/v1/common/coryCommon/md5.go b/api/v1/common/coryCommon/md5.go new file mode 100644 index 0000000..94fe7e2 --- /dev/null +++ b/api/v1/common/coryCommon/md5.go @@ -0,0 +1,23 @@ +package coryCommon + +import ( + "crypto/md5" + "encoding/hex" + "strings" +) + +// MD5Hash 将字符串进行 MD5 加密,并返回 32 位长度的 MD5 散列值 +func MD5Hash(input string) string { + // 将输入字符串转换为小写,以确保不区分大小写 + input = strings.ToLower(input) + // 创建 MD5 散列对象 + md5Hash := md5.New() + // 将输入字符串转换为字节数组,并传递给 MD5 散列对象 + _, _ = md5Hash.Write([]byte(input)) + // 计算 MD5 散列值 + hashBytes := md5Hash.Sum(nil) + // 将散列值转换为 32 位的十六进制字符串 + md5HashString := hex.EncodeToString(hashBytes) + + return md5HashString +} diff --git a/api/v1/common/coryCommon/restapi.go b/api/v1/common/coryCommon/restapi.go new file mode 100644 index 0000000..2b6f7ee --- /dev/null +++ b/api/v1/common/coryCommon/restapi.go @@ -0,0 +1,69 @@ +package coryCommon + +import ( + "github.com/gogf/gf/v2/net/gclient" + "github.com/gogf/gf/v2/os/gctx" +) + +// 高德地图API https://lbs.amap.com/api/webservice/guide/api/georegeo + +// InverseGeocoding 逆地理编码 +func InverseGeocoding(location string) (we string) { + //请求路径 + key := "3bbede95174c607a1ed4c479d3f637cc" + requestURL := "https://restapi.amap.com/v3/geocode/regeo?location=" + location + "&key=" + key + + response, err := gclient.New().ContentJson().ContentType("application/x-www-form-urlencoded").Get(gctx.New(), requestURL) + if err != nil { + return + } + var dataInfo = "" + dataInfo = response.ReadAllString() + return dataInfo +} + +type InverseGeocodingRep struct { + Status string `json:"status"` + Regeocode Regeocode `json:"regeocode"` + Info string `json:"info"` + Infocode string `json:"infocode"` +} + +type Regeocode struct { + FormattedAddress string `json:"formatted_address"` + AddressComponent AddressComponent `json:"addressComponent"` +} + +type AddressComponent struct { + //City string `json:"city"` + Province string `json:"province"` + Adcode string `json:"adcode"` + District string `json:"district"` + Towncode string `json:"towncode"` + //StreetNumber StreetNumber `json:"streetNumber"` + Country string `json:"country"` + Township string `json:"township"` + //BusinessAreas []One `json:"businessAreas"` + //Building Two `json:"building"` + //Neighborhood Two `json:"neighborhood"` + Citycode string `json:"citycode"` +} + +type StreetNumber struct { + Number string `json:"number"` + Location string `json:"location"` + Direction string `json:"direction"` + Distance string `json:"distance"` + Street string `json:"street"` +} + +type One struct { + Location string `json:"location"` + Name string `json:"name"` + Id string `json:"id"` +} + +type Two struct { + Name []string `json:"name"` + Type []string `json:"type"` +} diff --git a/api/v1/common/coryCommon/uploadFile.go b/api/v1/common/coryCommon/uploadFile.go new file mode 100644 index 0000000..6891a2d --- /dev/null +++ b/api/v1/common/coryCommon/uploadFile.go @@ -0,0 +1,473 @@ +package coryCommon + +import ( + "bufio" + "context" + "fmt" + "io" + "log" + "net/url" + "os" + "path/filepath" + "strings" + "time" + + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/library/liberr" + "golang.org/x/exp/rand" +) + +func UploadFileS(ctx context.Context, fileHeader []*ghttp.UploadFile, fileUrl string, typeStr string) (pathStr string, err error) { + for i := range fileHeader { + var str string + if typeStr == "1" { + str, err = UploadFile(ctx, fileHeader[i], fileUrl) + } + if typeStr == "2" { + str, err = UploadFileTwo(ctx, fileHeader[i], fileUrl) + } + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + pathStr = pathStr + ResourcePublicToFunc("/"+str, 0) + "," + } + pathStr = pathStr[0 : len(pathStr)-1] + return +} + +// UploadFile [文件名称为原来的文件名称] 上传文件(流) 也可以将http图片上传 返回:resource/public/upload_file/2023-11-28/tmp_c7858f0fd98d74cbe2c095125871aaf19c749c209ae33f5f.png +func UploadFile(ctx context.Context, fileHeader *ghttp.UploadFile, fileUrl string) (str string, err error) { + // 获取上传的文件流 + if fileHeader == nil { + log.Println("Failed to get file") + liberr.ErrIsNil(ctx, err, "Failed to get file") + return "", err + } + ynr := Ynr(fileUrl) + // 在当前目录创建一个新文件用于保存上传的数据 + lj := "/" + ynr + fileHeader.Filename + destFilePath := filepath.Join(".", lj) + destFile, err := os.Create(destFilePath) + if err != nil { + log.Println("Failed to create destination file:", err) + liberr.ErrIsNil(ctx, err) + return "", err + } + defer destFile.Close() + + // 创建一个内存缓冲区作为文件数据的临时存储 + buffer := make([]byte, 4096) + + // 记录已接收的数据量,用于计算上传进度 + var totalReceived int64 + + // 获取文件上传的数据流 + file, err := fileHeader.Open() + if err != nil { + log.Println("Failed to open file:", err) + liberr.ErrIsNil(ctx, err) + return "", err + } + defer file.Close() + + // 循环读取文件流,直到读取完整个文件 + for { + // 从文件流中读取数据到缓冲区 + n, err := file.Read(buffer) + if err != nil && err != io.EOF { + log.Println("Failed to read file:", err) + liberr.ErrIsNil(ctx, err) + return "", err + } + + // 如果缓冲区没有数据,则表示已读取完整个文件 + if n == 0 { + break + } + + // 将缓冲区的数据写入目标文件 + _, err = destFile.Write(buffer[:n]) + if err != nil { + log.Println("Failed to write file:", err) + liberr.ErrIsNil(ctx, err) + return "", err + } + + // 更新已接收的数据量 + totalReceived += int64(n) + } + + //// 返回上传文件的路径给客户端 + //uploadPath, err := filepath.Abs(destFilePath) + //if err != nil { + // log.Println("Failed to get absolute file path:", err) + // liberr.ErrIsNil(ctx, err) + // return "", err + //} + //统一路径斜杠为/ + str = filepath.ToSlash(lj) + return str, err +} + +func UploadUniqueFile(ctx context.Context, fileHeader *ghttp.UploadFile, fileUrl string) (str string, err error) { + // 获取上传的文件流 + if fileHeader == nil { + return "", err + } + + ynr := Ynr(fileUrl) + + // 在当前目录创建一个新文件用于保存上传的数据 + // 在文件名中添加一个唯一的标识符,例如当前的时间戳 + lj := fmt.Sprintf("%s_%d_%s", ynr, time.Now().Unix(), fileHeader.Filename) + destFilePath := filepath.Join(".", lj) + destFile, err := os.Create(destFilePath) + if err != nil { + log.Println("Failed to create destination file:", err) + liberr.ErrIsNil(ctx, err) + return "", err + } + defer destFile.Close() + + // 创建一个内存缓冲区作为文件数据的临时存储 + buffer := make([]byte, 4096) + + // 记录已接收的数据量,用于计算上传进度 + var totalReceived int64 + + // 获取文件上传的数据流 + file, err := fileHeader.Open() + if err != nil { + log.Println("Failed to open file:", err) + liberr.ErrIsNil(ctx, err) + return "", err + } + defer file.Close() + + // 循环读取文件流,直到读取完整个文件 + for { + // 从文件流中读取数据到缓冲区 + n, err := file.Read(buffer) + if err != nil && err != io.EOF { + return "", err + } + + // 如果缓冲区没有数据,则表示已读取完整个文件 + if n == 0 { + break + } + + // 将缓冲区的数据写入目标文件 + _, err = destFile.Write(buffer[:n]) + if err != nil { + return "", err + } + + // 更新已接收的数据量 + totalReceived += int64(n) + } + + // 统一路径斜杠为/ + str = filepath.ToSlash(lj) + return str, err +} + +// UploadFileTwo [文件名称为时间戳] 上传文件(流) 也可以将http图片上传 返回:resource/public/upload_file/2023-11-28/tmp_c7858f0fd98d74cbe2c095125871aaf19c749c209ae33f5f.png +func UploadFileTwo(ctx context.Context, fileHeader *ghttp.UploadFile, fileUrl string) (str string, err error) { + // 获取上传的文件流 + if fileHeader == nil { + log.Println("Failed to get file") + liberr.ErrIsNil(ctx, err, "Failed to get file") + return "", err + } + ynr := Ynr(fileUrl) + // 在当前目录创建一个新文件用于保存上传的数据 + lj := /* "/" +*/ ynr + FileName("login") + filepath.Ext(fileHeader.Filename) + + destFilePath := filepath.Join(".", lj) + destFile, err := os.Create(destFilePath) + if err != nil { + log.Println("Failed to create destination file:", err) + liberr.ErrIsNil(ctx, err) + return "", err + } + defer destFile.Close() + + // 创建一个内存缓冲区作为文件数据的临时存储 + buffer := make([]byte, 4096) + + // 记录已接收的数据量,用于计算上传进度 + var totalReceived int64 + + // 获取文件上传的数据流 + file, err := fileHeader.Open() + if err != nil { + log.Println("Failed to open file:", err) + liberr.ErrIsNil(ctx, err) + return "", err + } + defer file.Close() + + // 循环读取文件流,直到读取完整个文件 + for { + // 从文件流中读取数据到缓冲区 + n, err := file.Read(buffer) + if err != nil && err != io.EOF { + log.Println("Failed to read file:", err) + liberr.ErrIsNil(ctx, err) + return "", err + } + + // 如果缓冲区没有数据,则表示已读取完整个文件 + if n == 0 { + break + } + + // 将缓冲区的数据写入目标文件 + _, err = destFile.Write(buffer[:n]) + if err != nil { + log.Println("Failed to write file:", err) + liberr.ErrIsNil(ctx, err) + return "", err + } + + // 更新已接收的数据量 + totalReceived += int64(n) + } + + //// 返回上传文件的路径给客户端 + //uploadPath, err := filepath.Abs(destFilePath) + //if err != nil { + // log.Println("Failed to get absolute file path:", err) + // liberr.ErrIsNil(ctx, err) + // return "", err + //} + //统一路径斜杠为/ + str = filepath.ToSlash(lj) + return str, err +} + +// Ynr 创建时间文件夹 传递相对路径/resource/public/ 返回相对路径resource/public/2023-11-12/ +func Ynr(baseDir string) (str string) { + // 获取当前时间 + currentTime := time.Now() + // 格式化为年月日的字符串格式 + dateString := currentTime.Format("2006-01-02") + dateString = baseDir + dateString + // 在相对路径上添加文件夹 + destFilePath := filepath.Join(".", dateString) + dateString = destFilePath + // 检查文件夹是否已存在 + _, err := os.Stat(dateString) + if os.IsNotExist(err) { + // 文件夹不存在,创建文件夹 + err := os.MkdirAll(dateString, os.ModePerm) + if err != nil { + fmt.Println("创建文件夹失败:", err) + return + } + // fmt.Println("文件夹创建成功:", dateString) + } else { + // fmt.Println("文件夹已存在:", dateString) + } + return dateString + "/" +} + +// FileName 【前缀】+获取当前时间+随机数得到文件名 +func FileName(prefix string) (uniqueFileName string) { + currentTime := time.Now() + timestamp := currentTime.UnixNano() / int64(time.Millisecond) + randomNum := rand.Intn(1000) + uniqueFileName = fmt.Sprintf("%d_%d", timestamp, randomNum) + if prefix != "" { + uniqueFileName = prefix + uniqueFileName + } + return uniqueFileName +} + +// FileInfo 传参:相对路径 获取文件信息(文件名称、文件后缀、文件大小(字节)) +func FileInfo(filePath string) (name string, ext string, size int64) { + newPath := "" + if strings.Contains(filePath, "wxfile") { + newPath = strings.ReplaceAll(filePath, "/wxfile", GetCWD()+"/resource/public") + } else { + newPath = strings.ReplaceAll(filePath, "/file", GetCWD()+"/resource/public") + } + newPath = strings.ReplaceAll(newPath, "\\", "/") + filePath = newPath + // filePath = "D:\\Cory\\go\\中煤\\zmkg-back\\resource\\public\\upload_file\\2023-08-31\\cv6kxb89pd984rt5ze.png" + // 获取文件的基本名称(包括扩展名) + fileName := filepath.Base(filePath) + // 分割文件名和扩展名 + nameParts := strings.Split(fileName, ".") + fileNameWithoutExt := nameParts[0] + fileExt := nameParts[1] + // 获取文件大小 + fileInfo, err := os.Stat(filePath) + if err != nil { + fmt.Println("无法获取文件信息:", err) + return + } + fileSize := fileInfo.Size() + // 文件名称、文件后缀、文件大小(字节) + name = fileNameWithoutExt + ext = fileExt + size = fileSize + return +} + +// OutJson 创建txt写入数据,jsonData数据、absPath 绝对路径(带文件名和后缀) +func OutJson(jsonData []byte, absPath string) (flag bool, err error) { + absPath = strings.ReplaceAll(absPath, "\\", "/") + absPath = strings.ReplaceAll(absPath, "/file", GetCWD()+"/resource/public") + flag = false + // 创建要写入的文件 + file, err := os.Create(absPath) + if err != nil { + fmt.Println("无法创建文件:", err) + return + } + defer file.Close() + // 将 JSON 数据写入文件 + _, err = file.Write(jsonData) + if err != nil { + fmt.Println("无法写入文件:", err) + return + } + return true, err +} + +// PutJson 读取文件 +func PutJson(filePath string) (jsonData string, err error) { + filePath = strings.ReplaceAll(filePath, "/file", GetCWD()+"/resource/public") + filePath = strings.ReplaceAll(filePath, "\\", "/") + // filePath := "relative/path/to/file.txt" + file, err := os.Open(filePath) + if err != nil { + fmt.Println("打开文件错误:", err) + return + } + defer file.Close() + + scanner := bufio.NewScanner(file) + // 设置一个足够大的缓冲区 + const maxScanTokenSize = 128 * 1024 + buf := make([]byte, maxScanTokenSize) + scanner.Buffer(buf, maxScanTokenSize) + + for scanner.Scan() { + line := scanner.Text() + jsonData = jsonData + line + } + if scanner.Err() != nil { + fmt.Println("读取文件错误:", scanner.Err()) + err = scanner.Err() + return + } + return +} + +/* +BatchFile 批量刪除文件 +filePath 相对路径 +*/ +func BatchFile(filePath []string) { + for _, data := range filePath { + // if strings.Contains(data, "file") || strings.Contains(data, "wxfile"){ + newPath := "" + if strings.Contains(data, "/file") { + newPath = strings.Replace(data, "/file", GetCWD()+"/resource/public", 1) + } else if strings.Contains(data, "/wxfile") { + newPath = strings.Replace(data, "/wxfile", GetCWD()+"/resource/public", 1) + } + os.Remove(strings.ReplaceAll(newPath, "\\", "/")) + } +} + +// FlagImg 判斷是否是圖片 +func FlagImg(filePath string) (flag bool) { + filePathLower := strings.ToLower(filePath) + isImage := strings.HasSuffix(filePathLower, ".png") || strings.HasSuffix(filePathLower, ".jpg") || strings.HasSuffix(filePathLower, ".jpeg") || strings.HasSuffix(filePathLower, ".gif") || strings.HasSuffix(filePathLower, ".bmp") + if isImage { + flag = true + } else { + flag = false + } + return flag +} + +// CreateDirectory 判断文件夹是否存在,不存在则创建文件夹 +func CreateDirectory(folderName string) error { + // 检查文件夹是否已经存在 + _, err := os.Stat(folderName) + if err == nil { + return nil + } + // 创建文件夹 + err = os.Mkdir(folderName, 0o755) + if err != nil { + return err + } + + return nil +} + +// FileToFunc file转resource/public +func FileToFunc(path string, num int) (rpath string) { + if num == 1 { + rpath = strings.Replace(path, GetCWD()+"/file/", "/resource/public/", 1) + } else if num == 2 { + rpath = strings.Replace(path, "/file/", GetCWD()+"/resource/public/", 1) + } else if num == 3 { + rpath = strings.Replace(path, "/file/", "/wxfile/", 1) + } else if num == 4 { + rpath = strings.Replace(path, "/wxfile/", GetCWD()+"/resource/public/", 1) + } else if num == 5 { + rpath = strings.Replace(path, "/wxfile/", "/file/", 1) + } else { + rpath = strings.Replace(path, "/file/", "/resource/public/", 1) + } + rpath = filepath.ToSlash(rpath) + return +} + +// ResourcePublicToFunc resource/public转file +func ResourcePublicToFunc(path string, num int) (rpath string) { + if num == 1 { + rpath = strings.Replace(path, GetCWD()+"/resource/public/", "/file/", 1) + } else if num == 2 { + rpath = strings.Replace(path, "/resource/public/", GetCWD()+"/resource/public/", 1) + } else if num == 3 { + rpath = strings.Replace(path, "/resource/public/", "/wxfile/", 1) + } else { + rpath = strings.Replace(path, "/resource/public/", "/file/", 1) + } + rpath = filepath.ToSlash(rpath) + return +} + +// FormatRestrictionFunc 判断文件后缀是否匹配 +func FormatRestrictionFunc(path, suffix string) (flag bool) { + split := strings.Split(suffix, ",") + for _, data := range split { + extension := filepath.Ext(path) + if extension == data { + return true + } + } + return false +} + +// URLCoding 对url的特俗符号进行编码,不对/进行编码(定制编码,将"/file/networkDisk/completion/admin37/2.jpg"的"networkDisk/completion/admin37/2.jpg"进行编码) +func URLCoding(path string) (filenPathCoding string) { + s2 := path[6 : len(path)-1] + split := strings.Split(s2, "/") + p := "" + for i2 := range split { + p = p + url.PathEscape(split[i2]) + "/" + } + p = p[0 : len(p)-1] + filenPathCoding = strings.ReplaceAll(path, s2, p) + return +} diff --git a/api/v1/common/coryCommon/watermark.go b/api/v1/common/coryCommon/watermark.go new file mode 100644 index 0000000..237e913 --- /dev/null +++ b/api/v1/common/coryCommon/watermark.go @@ -0,0 +1,199 @@ +package coryCommon + +import ( + "fmt" + "github.com/fogleman/gg" + "github.com/nfnt/resize" + "image/color" + "log" + "os" + "path/filepath" + "strings" +) + +func GetCWD() string { + cwd, _ := os.Getwd() + return filepath.ToSlash(cwd) +} + +func MultiPicture(pictureList string, compere string, meetingDate string, site string, teamName string, labourserviceName string) { + //1、分割字符串 + split := strings.Split(pictureList, ",") + //2、循环添加水印 + for i := range split { + filePath := split[i] + newPath := strings.ReplaceAll(filePath, "/wxfile", GetCWD()+"/resource/public") + newPath = strings.ReplaceAll(newPath, "\\", "/") + WatermarkFunc(newPath, compere, meetingDate, site, teamName, labourserviceName) + } + +} + +// WatermarkFunc 给图片设置水印和logo +func WatermarkFunc(filePath string, compere string, meetingDate string, site string, teamName string, labourserviceName string) { + + // 检查文件是否存在 + _, err := os.Stat(filePath) + if err != nil { + if os.IsNotExist(err) { + fmt.Println("文件不存在") + } else { + fmt.Println("发生错误:", err) + } + return + } + //// 获取文件名和后缀 + //fileName := filepath.Base(filePath) + //fileExt := filepath.Ext(filePath) + + //1、加载图片 + srcImage, err := gg.LoadImage(filePath) + if err != nil { + log.Fatalf("打开图片失败: %v", err) + } + //2、加载logo水印 + dc := gg.NewContextForImage(srcImage) + dc.SetRGB(1, 1, 1) + logoImage, err := gg.LoadImage(GetCWD() + "/resource/cory/zmlogo.jpg") + if err != nil { + log.Fatalf("打开 logo 图片失败: %v", err) + } + logoWidth := 80.0 + logoHeight := float64(logoImage.Bounds().Dy()) * (logoWidth / float64(logoImage.Bounds().Dx())) + logoImage = resize.Resize(uint(logoWidth), uint(logoHeight), logoImage, resize.Lanczos3) + x := float64(logoWidth) + 10.0 + y := float64(dc.Height()/2) + 96.0 + dc.DrawImageAnchored(logoImage, int(x), int(y), 1.0, 1.0) + //3、设置字体 + fontPath := GetCWD() + "/resource/cory/msyh.ttc" + if err != nil { + log.Fatalf("加载字体失败: %v", err) + } + dc.SetRGB(0, 0, 0) + //4、创建矩形框 背景透明 + boxText := teamName + dc.SetRGBA255(0, 99, 175, 100) + rectangleX := x + rectangleY := y - logoHeight + 1 + rectangleWidth := len(boxText) * 8 + rectangleHeight := logoHeight - 1 + dc.DrawRectangle(rectangleX, rectangleY, float64(rectangleWidth), rectangleHeight) + dc.Fill() + textFunc(dc, boxText, fontPath, 18.0, rectangleX, rectangleY, float64(rectangleWidth), rectangleHeight, 1) + //5、添加文字水印 + text := "开会宣讲人:" + compere + "\n \n" + + "开 会 时 间:" + meetingDate + "\n \n" + + //"天 气:多云转晴\n \n" + + "地 点:" + site + "\n \n" + textX := x - logoWidth + textY := y + 10 + err = dc.LoadFontFace(fontPath, 12) + dc.DrawStringWrapped(text, textX, textY, 0.0, 0.0, float64(dc.Width())-textX, 1.2, gg.AlignLeft) + //6、创建矩形框 渐变透明 + boxText = labourserviceName + width := len(boxText) * 8 + height := 30 + fromAlpha := 0.6 + toAlpha := 0 + for x := 0; x <= width; x++ { + alpha := fromAlpha - (fromAlpha-float64(toAlpha))*(float64(x)/float64(width)) + rgba := color.RGBA{G: 99, B: 175, A: uint8(alpha * 255)} + dc.SetRGBA255(int(rgba.R), int(rgba.G), int(rgba.B), int(rgba.A)) + dc.DrawLine(float64(x)+10, y+96, float64(x)+10, y+96+float64(height)) + dc.StrokePreserve() + dc.Fill() + } + textFunc(dc, boxText, fontPath, 16.0, 10.0, y+96, float64(width), float64(height), 2) + //7、保存图片 + err = dc.SavePNG(filePath) + if err != nil { + log.Fatalf("保存带水印的图片失败: %v", err) + } +} + +func textFunc(dc *gg.Context, boxText string, fontPath string, boxTextSize, rectangleX, rectangleY, rectangleWidth, rectangleHeight float64, num int) { + err := dc.LoadFontFace(fontPath, boxTextSize) + if err != nil { + log.Fatalf("加载字体失败: %v", err) + } + dc.SetRGB(1, 1, 1) + boxTextWidth, boxTextHeight := dc.MeasureString(boxText) + boxTextX := 0.00 + if num == 1 { + boxTextX = rectangleX + (rectangleWidth-boxTextWidth)/2 + } else if num == 2 { + boxTextX = 10 + } else { + log.Fatalf("对齐方式错误") + } + boxTextY := rectangleY + (rectangleHeight-boxTextHeight)/2 + boxTextHeight + dc.DrawStringAnchored(boxText, boxTextX, boxTextY, 0.0, 0.0) +} + +// 绘制矩形框 +func Test_draw_rect_text(im_path string, x, y, w, h float64) { + // Load image + //font_path := GetCWD() + "/resource/cory/msyh.ttc" + im, err := gg.LoadImage(im_path) + if err != nil { + log.Fatal(err) + } + + // 2 method + dc := gg.NewContextForImage(im) + + // Set color and line width + dc.SetHexColor("#FF0000") + dc.SetLineWidth(4) + + // DrawRoundedRectangle 使用 DrawRoundedRectangle 方法在图像上绘制一个带有圆角的矩形。这里 x, y 是矩形左上角的坐标,w, h 是矩形的宽度和高度,最后的 0 表示圆角的半径为0。 + dc.DrawRoundedRectangle(x, y, w, h, 0) + // Store set + dc.Stroke() + + dc.DrawRectangle(x, y, w, h) + dc.Clip() + + // Save png image + dc.SavePNG(im_path) +} + +type TestDrawRectTextEntity struct { + ImPath string `json:"im_path"` + Coordinates []*CoordinatesListEntity `json:"coordinates"` +} + +type CoordinatesListEntity struct { + X float64 `json:"x"` + Y float64 `json:"y"` + W float64 `json:"w"` + H float64 `json:"h"` +} + +// TestDrawRectTextFunc 同一文件多次绘制矩形框 +func TestDrawRectTextFunc(entity *TestDrawRectTextEntity) { + if entity == nil { + return + } + if len(entity.Coordinates) == 0 { + return + } + // 加载图像 + im, err := gg.LoadImage(entity.ImPath) // 加载图像一次 + if err != nil { + log.Fatal(err) + } + // 创建上下文 + dc := gg.NewContextForImage(im) + // 设置颜色和线宽 + dc.SetHexColor("#FF0000") + dc.SetLineWidth(4) + //绘制和保存矩形 + for _, zuobiao := range entity.Coordinates { + // 绘制矩形 + dc.DrawRoundedRectangle(zuobiao.X, zuobiao.Y, zuobiao.W, zuobiao.H, 0) + } + dc.Stroke() + // 保存图像 + dc.SavePNG(entity.ImPath) +} diff --git a/api/v1/common/coryCommon/weChatNewsFeeds.go b/api/v1/common/coryCommon/weChatNewsFeeds.go new file mode 100644 index 0000000..dd0b6b5 --- /dev/null +++ b/api/v1/common/coryCommon/weChatNewsFeeds.go @@ -0,0 +1,166 @@ +package coryCommon + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gctx" + commonService "github.com/tiger1103/gfast/v3/internal/app/common/service" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + wxModel "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" + "strconv" + "strings" + "time" +) + +// 微信小程序的消息订阅 https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-message-management/subscribe-message/sendMessage.html + +type TokenEntity struct { + AccessToken string `json:"accessToken"` + ExpiresIn string `json:"expiresIn"` +} + +func GetAccessToken() (token string, err error) { + var te *TokenEntity + appId, _ := g.Cfg().Get(gctx.New(), "wx.appId") + appSecret, _ := g.Cfg().Get(gctx.New(), "wx.appSecret") + key := "weChatAccessToken" + //从缓存捞取key + ctx := gctx.New() + get := commonService.Cache().Get(ctx, key) + if get != nil && get.String() != "" { + token = get.String() + return "", err + } else { + uri := "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId.String() + "&secret=" + appSecret.String() + response, err := g.Client().Get(gctx.New(), uri) + if err != nil { + return "", err + } else { + allString := response.ReadAllString() + err := json.Unmarshal([]byte(allString), &te) + if err != nil { + return "", err + } else { + //将token存储到redis中,tiken默认时间为秒,实际计算为2小时,(这里少100秒,防止token过期还存在redis中) + num, err := strconv.Atoi(te.ExpiresIn) + if err != nil { + err = errors.New("过期时间转换失败!") + return "", err + } + commonService.Cache().Set(ctx, key, te.AccessToken, time.Duration(num-100)*time.Second) + token = te.AccessToken + return token, err + } + } + } +} + +type AppletSubscription struct { + Touser string `json:"touser"` + TemplateId string `json:"template_id"` + MiniprogramState string `json:"MiniprogramState"` + Data DataEntity `json:"data"` +} + +type DataEntity struct { + Date1 ValueEntity `json:"date1"` + Thing2 ValueEntity `json:"thing2"` + Thing3 ValueEntity `json:"thing3"` +} + +type ValueEntity struct { + Value string `json:"value"` +} + +type MsgEntity struct { + ErrCode int `json:"errcode"` + ErrMsg int64 `json:"errmsg"` + MsgId string `json:"msgid"` +} + +// Subscription 微信服务通知(消息订阅) +func Subscription(openid string) (msgEntity *MsgEntity, err error) { + //1、获取token + token, err := GetAccessToken() + if err != nil { + fmt.Println("获取微信凭证错误!") + return + } + //2、组装数据 + //now := time.Now() + var entity = new(AppletSubscription) + entity.Touser = openid + entity.TemplateId = "EyBO6gWizF5HwUThYSSm_HuQWgfMrwEkVHPXeEq1Me8" + entity.MiniprogramState = "trial" + var dataEntity = DataEntity{} + dataEntity.Date1 = ValueEntity{Value: time.Now().Format("2006-01-02 15:04:05")} + dataEntity.Thing2 = ValueEntity{Value: "您今日还有打卡未完成!"} + dataEntity.Thing3 = ValueEntity{Value: "请登录中煤小程序进行打卡操作!"} + entity.Data = dataEntity + marshal, _ := json.Marshal(entity) + + //3、发起请求 + msgEntity = new(MsgEntity) + uri := "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + token + post, err := g.Client().Post(gctx.New(), uri, marshal) + + postBytes, err := json.Marshal(post) + if err != nil { + fmt.Println("JSON marshaling error:", err) + return + } + if err := json.Unmarshal(postBytes, &msgEntity); err != nil { + fmt.Println("解析JSON错误:", err) + return nil, err + } + return +} + +func ServiceNoticeFunc(ctx context.Context) { + //1、获取所有项目的打卡范围 + var projectEntity []*model.SysProjectListRes + err := dao.SysProject.Ctx(ctx). + Where("status", 0). + Where("show_hidden", 1). + Fields("id,project_name,punch_range").Scan(&projectEntity) + if err != nil { + fmt.Println("获取项目失败!") + } + //2、遍历项目获取打卡范围 + for _, pData := range projectEntity { + // 3、每个项目都有两个临时触发器 + punchRange := pData.PunchRange + split := strings.Split(punchRange, ",") + for _, cfq := range split { + dn, err := tool.TimeStr(cfq) + if err != nil { + fmt.Println(err) + } + //创建临时定时器 + if dn > 0 { + tempTimer := time.NewTimer(dn) + // 在新的 goroutine 中等待临时定时器触发 + go func() { + <-tempTimer.C + //4、就获取当前项目下面的所有成员(条件为subscription为1的数据) 下发数据,并存储下发数据的状态 + var openidList []*wxModel.BusConstructionUserListRes + dao.BusConstructionUser.Ctx(ctx). + Fields("openid"). + Where("subscription", "1"). + Where("status = 0"). + Where("entry_date is not null and entry_date!='' and (leave_date is null or leave_date = '')"). + Where("project_id", pData.Id). + Scan(&openidList) + for _, oi := range openidList { + Subscription(oi.Openid) + } + }() + } + } + } +} diff --git a/api/v1/common/coryCommon/weather.go b/api/v1/common/coryCommon/weather.go new file mode 100644 index 0000000..fa8de2a --- /dev/null +++ b/api/v1/common/coryCommon/weather.go @@ -0,0 +1,110 @@ +package coryCommon + +import ( + "encoding/json" + "fmt" + "github.com/gogf/gf/v2/net/gclient" + "github.com/gogf/gf/v2/os/gctx" +) + +var key = "00b60ebda96849e694cb570e3d4f5c89" + +// WeatherRep 返回参数 免费天气查询 https://dev.qweather.com/docs/api/weather/weather-daily-forecast/ +type WeatherRep struct { + Code string `json:"code"` + UpdateTime string `json:"updateTime"` + FxLink string `json:"fxLink"` + Daily []struct { + FxDate string `json:"fxDate"` + Sunrise string `json:"sunrise"` + Sunset string `json:"sunset"` + Moonrise string `json:"moonrise"` + Moonset string `json:"moonset"` + MoonPhase string `json:"moonPhase"` + MoonPhaseIcon string `json:"moonPhaseIcon"` + TempMax string `json:"tempMax"` + TempMin string `json:"tempMin"` + IconDay string `json:"iconDay"` + TextDay string `json:"textDay"` + IconNight string `json:"iconNight"` + TextNight string `json:"textNight"` + Wind360Day string `json:"wind360Day"` + WindDirDay string `json:"windDirDay"` + WindScaleDay string `json:"windScaleDay"` + WindSpeedDay string `json:"windSpeedDay"` + Wind360Night string `json:"wind360Night"` + WindDirNight string `json:"windDirNight"` + WindScaleNight string `json:"windScaleNight"` + WindSpeedNight string `json:"windSpeedNight"` + Humidity string `json:"humidity"` + Precip string `json:"precip"` + Pressure string `json:"pressure"` + Vis string `json:"vis"` + Cloud string `json:"cloud"` + UvIndex string `json:"uvIndex"` + } `json:"daily"` + Refer struct { + Sources []string `json:"sources"` + License []string `json:"license"` + } `json:"refer"` +} + +// Weather 传递经纬度 location := "116.41,39.92" +func Weather(location string) (we string) { + //请求路径 + //key := "" + requestURL := "https://devapi.qweather.com/v7/weather/3d?location=" + location + "&key=" + key + + response, err := gclient.New().ContentJson().ContentType("application/x-www-form-urlencoded").Get(gctx.New(), requestURL) + if err != nil { + return + } + var dataInfo = "" + dataInfo = response.ReadAllString() + return dataInfo +} + +type GridPointRes struct { + Code string `json:"code"` + UpdateTime string `json:"updateTime"` + FxLink string `json:"fxLink"` + Now struct { + ObsTime string `json:"obsTime"` + Temp string `json:"temp"` + Icon string `json:"icon"` + Text string `json:"text"` + Wind360 string `json:"wind360"` + WindDir string `json:"windDir"` + WindScale string `json:"windScale"` + WindSpeed string `json:"windSpeed"` + Humidity string `json:"humidity"` + Precip string `json:"precip"` + Pressure string `json:"pressure"` + Cloud string `json:"cloud"` + Dew string `json:"dew"` + } `json:"now"` + Refer struct { + Sources []string `json:"sources"` + License []string `json:"license"` + } `json:"refer"` +} + +// 格点天气 GridPoint +func GridPoint(location string) (gp *GridPointRes, err error) { + //请求路径 + //key := "00b60ebda96849e694cb570e3d4f5c89" + requestURL := "https://devapi.qweather.com/v7/grid-weather/now?location=" + location + "&key=" + key + + response, err := gclient.New().ContentJson().ContentType("application/x-www-form-urlencoded").Get(gctx.New(), requestURL) + if err != nil { + return + } + var dataInfo = "" + dataInfo = response.ReadAllString() + + gp = new(GridPointRes) + err = json.Unmarshal([]byte(dataInfo), &gp) + + fmt.Println(gp.Now.Icon) + return +} diff --git a/api/v1/common/coryCommon/zip.go b/api/v1/common/coryCommon/zip.go new file mode 100644 index 0000000..312c787 --- /dev/null +++ b/api/v1/common/coryCommon/zip.go @@ -0,0 +1,621 @@ +package coryCommon + +import ( + "archive/zip" + "bytes" + "context" + "crypto/sha256" + "encoding/hex" + "errors" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + "golang.org/x/text/encoding/simplifiedchinese" + "golang.org/x/text/transform" + "io" + "io/ioutil" + "os" + "path/filepath" + "strings" +) + +//解压文件、文件夹复制 + +// FileZipFunc 对文件进行解压 +func FileZipFunc(relativePath string, filenPath string, template string) (fileName string, err error) { + // 打开压缩文件 + zipFile, err := zip.OpenReader(relativePath) + if err != nil { + fmt.Println("无法打开压缩文件(只支持ZIP):", err) + return + } + var i = 0 + var name = "" + //进入的压缩文件,判断压缩文件中的第一层是否包含文件,如果有就在当前随机产生一个文件夹,返回就返回到随机文件夹的位置 + randomFolder := "" + // 遍历压缩文件中的文件头信息 + for _, f := range zipFile.File { + //path, _ := gbkDecode(f.Name) + fmt.Println("头? ", f.Name) + path, _ := IsGB18030(f.Name) + // 判断是否为顶层文件夹 + if !hasSlash(path) { + randomFolder = FileName("/randomFolder") + template = template + randomFolder + filenPath = filenPath + randomFolder + break + } + } + // 遍历压缩文件中的文件 + for _, file := range zipFile.File { + fmt.Println("ti ? ", file.Name) + // 解决文件名编码问题 + if i == 0 { + gb18030, _ := IsGB18030(file.Name) + if err != nil { + return "", err + } + name = gb18030 + } + file.Name, err = IsGB18030(file.Name) + if err != nil { + return "", err + } + //对所有文件的名称进行空格替换 + file.Name = strings.Replace(file.Name, " ", "", -1) + if err != nil { + return file.Name, err + } + // 获取文件的相对路径,根据原本路径来操作还是根据新路径来(filenPath) + extractedFilePath := "" + extractedFilePathTwo := "" + if filenPath != "" { + extractedFilePath = filepath.Join(FileToFunc(filenPath, 2), "/"+file.Name) + split := strings.Split(filenPath, "/") + extractedFilePathTwo = extractedFilePath + "/" + split[len(split)-1] + } else { + extractedFilePath = filepath.ToSlash(filepath.Join(GetCWD()+template+"/"+".", file.Name)) + extractedFilePathTwo = extractedFilePath + "/" + } + //判断文件夹是否存在,存在就退出(i==0 是为了只判断最外层那一文件夹路径) + _, err := os.Stat(filepath.Dir(extractedFilePathTwo)) + if err == nil && i == 0 { + zipFile.Close() + // 删除压缩文件 + err = os.Remove(relativePath) + err = errors.New("当前文件夹已经存在,导入无效!") + return "", err + } + i = i + 1 + // 检查是否为文件 + if !file.FileInfo().IsDir() { + // 创建文件的目录结构 + err = os.MkdirAll(filepath.Dir(extractedFilePath), os.ModePerm) + if err != nil { + fmt.Println("无法创建目录:", err) + return "", err + } + + // 打开压缩文件中的文件 + zippedFile, err := file.Open() + if err != nil { + fmt.Println("无法打开压缩文件中的文件:", err) + return "", err + } + defer zippedFile.Close() + + // 创建目标文件 + extractedFile, err := os.Create(extractedFilePath) + + if err != nil { + fmt.Println("无法创建目标文件:", err) + return "", err + } + defer extractedFile.Close() + + // 将压缩文件中的内容复制到目标文件 + _, err = io.Copy(extractedFile, zippedFile) + if err != nil { + fmt.Println("无法解压缩文件:", err) + return "", err + } + } + } + + zipFile.Close() + + // 删除压缩文件 + err = os.Remove(relativePath) + if err != nil { + fmt.Println("无法删除压缩文件:", err) + return + } + fileName = strings.Split(name, "/")[0] + if randomFolder != "" { + fileName = "" + } else { + fileName = "/" + fileName + } + if filenPath != "" { + return FileToFunc(filenPath, 2) + fileName, err + } else { + return GetCWD() + template + fileName, err + } +} + +// IsGB18030 判断字符串是否是 GB18030 编码 +func IsGB18030(name string) (string, error) { + // 创建 GB18030 解码器 + decoder := simplifiedchinese.GB18030.NewDecoder() + // 使用 transform 解码数据 + _, err := io.ReadAll(transform.NewReader(bytes.NewReader([]byte(name)), decoder)) + if err == nil { + return name, nil + } else { + fileName, errName := simplifiedchinese.GB18030.NewDecoder().String(name) + return fileName, errName + } +} + +// gbkDecode 解决文件名乱码 +func gbkDecode(s string) (string, error) { + gbkDecoder := simplifiedchinese.GBK.NewDecoder() + decodedName, _, err := transform.String(gbkDecoder, s) + return decodedName, err +} + +type DocumentListPublicRes struct { + Id int64 `json:"id"` + IdStr string `json:"idStr"` + Pid string `json:"pid"` + Name string `json:"name"` + FilenPath string `json:"filenPath"` + FilenPathCoding string `json:"filenPathCoding"` + Suffix string `json:"suffix"` + Type string `json:"type"` + CreateBy string `json:"createBy"` + CreatedAt *gtime.Time `json:"createdAt"` + IsDuplicate bool `json:"isDuplicate"` + ProjectId int64 `json:"projectId"` +} + +// Traversal 遍历文件夹 ctx,绝对路径,上级文件夹(可有可无),表名,存储位置,项目id,模板1or资料2 +// +// one, err := coryCommon.Traversal(ctx, path, req.Pid, dao.DocumentCompletion.Table(), dataFolder, req.ProjectId, "2") //遍历解压后的文件,插入数据 +// if err != nil { +// liberr.ErrIsNil(ctx, err) +// return +// } +// _, err = g.DB().Model(dao.DocumentCompletion.Table()).Ctx(ctx).Insert(one) +// liberr.ErrIsNil(ctx, err, "新增失败!") +func Traversal(ctx context.Context, root string, pidstr string, tableName string, templatePath string, projectId int64, num string) (dataOne []*DocumentListPublicRes, err error) { + + template := strings.Replace(templatePath, "/resource/public", "/file", 1) + err = filepath.Walk(root, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + // 获取相对路径 + relativePath, err := filepath.Rel(root, path) + if err != nil { + return err + } + // 根目录下创建,还是指定文件夹下面创建? + p := "" + if pidstr != "" { + value, _ := g.DB().Model(tableName).Ctx(ctx).Where("id_str", pidstr).Fields("filen_path").Value() + split := strings.Split(root, "/") + p = value.String() + "/" + split[len(split)-1] + "/" + relativePath + } else { + p = template + "/" + relativePath + } + p = strings.ReplaceAll(p, "\\", "/") + // 获取当前项的深度 + depth := strings.Count(relativePath, string(filepath.Separator)) + // 判断父子关系并打印结果 + if depth == 0 && info.IsDir() { + if relativePath == "." { + split := strings.Split(root, "/") + n := split[len(split)-1] + // 根目录下创建,还是指定文件夹下面创建? + p := "" + if pidstr != "" { + value, _ := g.DB().Model(tableName).Ctx(ctx).Where("id_str", pidstr).Fields("filen_path").Value() + p = value.String() + "/" + n + } else { + p = template + "/" + n + } + p = strings.ReplaceAll(p, "\\", "/") + template = template + "/" + n + var dataTwo = new(DocumentListPublicRes) + dataTwo.IdStr = SHA256(p) + if pidstr != "" { + dataTwo.Pid = pidstr + } else { + dataTwo.Pid = "0" + } + dataTwo.Name = n + dataTwo.FilenPath = p + ////如果文件夹路径重复,就提示 解压文件夹的时候就已经判断了,这里就不需要了 + //err := IsFolderExist(ctx, p) + //if err != nil { + // return err + //} + dataTwo.Type = "2" + dataOne = append(dataOne, dataTwo) + } else { + dir, n := filepath.Split(p) + dir = strings.TrimSuffix(dir, "/") + var dataTwo = new(DocumentListPublicRes) + dataTwo.IdStr = SHA256(p) + dataTwo.Pid = SHA256(dir) + dataTwo.Name = n + dataTwo.FilenPath = p + ////如果文件夹路径重复,就提示 + //err := IsFolderExist(ctx, p) + //if err != nil { + // return err + //} + dataTwo.Type = "2" + dataOne = append(dataOne, dataTwo) + } + } else if info.IsDir() { + // 子文件夹 + dir, n := filepath.Split(p) + dir = strings.TrimSuffix(dir, "/") + var dataTwo = new(DocumentListPublicRes) + dataTwo.IdStr = SHA256(p) + dataTwo.Pid = SHA256(dir) + dataTwo.Name = n + dataTwo.FilenPath = p + dataTwo.Type = "2" + dataOne = append(dataOne, dataTwo) + } else { + dir, n := filepath.Split(p) + dir = strings.TrimSuffix(dir, "/") + var dataTwo = new(DocumentListPublicRes) + dataTwo.Pid = SHA256(dir) + lastDotIndex := strings.LastIndex(n, ".") + if lastDotIndex == -1 || lastDotIndex == 0 { + dataTwo.Name = strings.Split(n, ".")[0] + } else { + dataTwo.Name = n[:lastDotIndex] + } + dataTwo.Suffix = n[lastDotIndex:] + dataTwo.FilenPath = p + dataTwo.Type = "1" + //文件只能是这三种类型,其他类型进不来 + s := n[lastDotIndex:] + if num == "1" { //资料有格式限制 + if strings.EqualFold(s, ".xls") || strings.EqualFold(s, ".xlsx") || strings.EqualFold(s, ".docx") || strings.EqualFold(s, ".doc") || strings.EqualFold(s, ".pptx") || strings.EqualFold(s, ".ppt") { + dataOne = append(dataOne, dataTwo) + } + } else { + dataOne = append(dataOne, dataTwo) + } + } + return err + }) + + if err != nil { + //fmt.Println("遍历文件夹时发生错误:", err) + return nil, err + } + // 有项目id表示资料 无表模板 + if projectId > 0 { + for i := range dataOne { + dataOne[i].ProjectId = projectId + } + } + return +} + +func SHA256(str string) (hx string) { + // 创建 SHA-256 哈希对象 + hash := sha256.New() + // 将字符串转换为字节数组并进行哈希计算 + hash.Write([]byte(str)) + // 计算 SHA-256 哈希值 + hashedBytes := hash.Sum(nil) + // 将哈希值转换为十六进制字符串 + hashStr := hex.EncodeToString(hashedBytes) + return hashStr +} + +// CopyFile 文件复制 +func CopyFile(src, dst string) error { + // 打开源文件 + inputFile, err := os.Open(src) + if err != nil { + return err + } + defer inputFile.Close() + + // 创建目标文件 + outputFile, err := os.Create(dst) + if err != nil { + return err + } + defer outputFile.Close() + + // 通过 Copy 函数实现拷贝功能 + _, err = io.Copy(outputFile, inputFile) + if err != nil { + return err + } + + // 确保文件内容被刷新到磁盘上 + err = outputFile.Sync() + if err != nil { + return err + } + + return nil +} + +// CopyDirectory 文件夹复制 +func CopyDirectory(src string, dest string) error { + // 检查源文件夹是否存在 + _, err := os.Stat(src) + if err != nil { + return err + } + // 检查目标文件夹是否存在,不存在则创建 + err = os.MkdirAll(dest, 0755) + if err != nil { + return err + } + + // 遍历源文件夹 + files, err := os.ReadDir(src) + if err != nil { + return err + } + for _, file := range files { + srcPath := src + "/" + file.Name() + destPath := dest + "/" + file.Name() + + // 判断文件类型 + if file.IsDir() { + // 如果是文件夹,则递归调用 copyDirectory 函数复制文件夹及其子文件 + err = CopyDirectory(srcPath, destPath) + if err != nil { + return err + } + } else { + // 如果是文件,则复制文件到目标文件夹 + inputFile, err := os.Open(srcPath) + if err != nil { + return err + } + defer inputFile.Close() + + outputFile, err := os.Create(destPath) + if err != nil { + return err + } + defer outputFile.Close() + + _, err = io.Copy(outputFile, inputFile) + if err != nil { + return err + } + } + } + return nil +} + +// MoveFile 文件移动 +func MoveFile(source, destination string) (err error) { + // 执行移动操作 + err = os.Rename(source, destination) + if err != nil { + fmt.Println("Error:", err) + } else { + fmt.Println("File moved successfully!") + } + return err +} + +// MoveFolder 文件夹下面的文件及子文件全部移动到新文件夹下 +func MoveFolder(srcPath, destPath string) error { + // 获取源文件夹下的所有文件和子文件夹 + fileList := []string{} + err := filepath.Walk(srcPath, func(path string, info os.FileInfo, err error) error { + fileList = append(fileList, path) + return nil + }) + if err != nil { + return err + } + + // 移动每个文件和子文件夹 + for _, file := range fileList { + // 获取相对路径 + relPath, err := filepath.Rel(srcPath, file) + if err != nil { + return err + } + + // 构建目标路径 + destFile := filepath.Join(destPath, relPath) + // 判断是文件还是文件夹 + if fileInfo, err := os.Stat(file); err == nil && fileInfo.IsDir() { + // 如果是文件夹,创建目标文件夹 + err := os.MkdirAll(destFile, os.ModePerm) + if err != nil { + return err + } + } else { + // 如果是文件,复制文件 + err := copyFile(file, destFile) + if err != nil { + return err + } + } + } + + // 移动完成后删除源文件夹 + return os.RemoveAll(srcPath) +} + +func copyFile(src, dest string) error { + srcFile, err := os.Open(src) + if err != nil { + return err + } + defer srcFile.Close() + + destFile, err := os.Create(dest) + if err != nil { + return err + } + defer destFile.Close() + + _, err = io.Copy(destFile, srcFile) + return err +} + +// FolderToZip 将给定文件夹压缩成压缩包存储到另外一个路径(参数:源数据、目标路径) +func FolderToZip(folderToZip, zipFile string) (err error) { + // 创建一个新的压缩包文件 + newZipFile, err := os.Create(zipFile) + if err != nil { + return err + } + defer newZipFile.Close() + // 创建一个 zip.Writer 来向压缩包中写入内容 + zipWriter := zip.NewWriter(newZipFile) + defer zipWriter.Close() + + // 递归遍历文件夹并将其中的文件和目录添加到压缩包中 + err = filepath.Walk(folderToZip, func(filePath string, info os.FileInfo, err error) error { + if err != nil { + return err + } + // 获取当前文件的相对路径 + relativePath, err := filepath.Rel(folderToZip, filePath) + if err != nil { + return err + } + // 如果是目录,则创建一个目录项 + if info.IsDir() { + _, err = zipWriter.Create(relativePath + "/") + if err != nil { + return err + } + return nil + } + // 如果是文件,则创建一个文件项并写入文件内容 + fileData, err := ioutil.ReadFile(filePath) + if err != nil { + return err + } + file, err := zipWriter.Create(relativePath) + if err != nil { + return err + } + _, err = file.Write(fileData) + if err != nil { + return err + } + return nil + }) + return +} + +// zipDirFiles 压缩文件 +func ZipDirFiles(src_dir string, zip_file_name string) error { + // 检查并创建目标目录 + err := os.MkdirAll(filepath.Dir(zip_file_name), os.ModePerm) + if err != nil { + return err + } + + // 删除空的zip,而不是直接使用os.RemoveAll,以提高安全性 + err = os.Remove(zip_file_name) + if err != nil && !os.IsNotExist(err) { + return err + } + + // 创建新的zip文件 + zipfile, err := os.Create(zip_file_name) + if err != nil { + return err + } + defer zipfile.Close() + + // 初始化zip写入器 + archive := zip.NewWriter(zipfile) + defer archive.Close() + + // 遍历源目录下的文件和子目录 + return filepath.Walk(src_dir, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + // 计算相对于源目录的路径 + relPath, _ := filepath.Rel(src_dir, path) + if path == src_dir { + // 如果是源目录本身,跳过 + return nil + } + + // 创建zip文件头 + header, err := zip.FileInfoHeader(info) + if err != nil { + return err + } + header.Name = filepath.ToSlash(relPath) + + // 标记目录 + if info.IsDir() { + header.Name += "/" + return nil + } + + // 处理文件 + file, err := os.Open(path) + if err != nil { + return err + } + defer file.Close() + + writer, err := archive.CreateHeader(header) + if err != nil { + return err + } + + _, err = io.Copy(writer, file) + return err + }) + +} + +// 压缩后删除源文件 +func DeleteFolderToZip(srcpath, destpathzip string) (err error) { + //srcpath := filepath.ToSlash(`D:\GiteeProject\gsproject\zmkg-back\resource\public\temporary\del`) + //destpathzip := filepath.ToSlash(`D:\GiteeProject\gsproject\zmkg-back\resource\public\temporary\yy.zip`) + err = ZipDirFiles(srcpath, destpathzip) // 文件压缩 压缩文件目录 和压缩文件zip + if err != nil { + return err + } + // 删除原文件 + if err := os.RemoveAll(srcpath); err != nil { + if !os.IsNotExist(err) { + fmt.Printf("Error removing existing file %s: %v\n", srcpath, err) + return err + } + } + return err +} + +// 判断字符串中是否包含斜杠 +func hasSlash(s string) bool { + for _, c := range s { + if c == '/' || c == '\\' { + return true + } + } + return false +} diff --git a/api/v1/common/fileUpload/upload.go b/api/v1/common/fileUpload/upload.go new file mode 100644 index 0000000..fdbcdec --- /dev/null +++ b/api/v1/common/fileUpload/upload.go @@ -0,0 +1,278 @@ +package fileUpload + +import ( + "bytes" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/api/v1/common/globe" + "io" + "log" + "os" + "path" + "strconv" + "strings" +) + +func InitUploadApi(group *ghttp.RouterGroup) { + group.POST("/source/upload", SourceUploadFunc) + //group.Bind(new(SourceUpload)) +} + +type SourceUpload struct { +} +type SourceUploadReq struct { + g.Meta `path:"source/upload" dc:"上传资源" method:"post" tags:"资源相关" ` +} +type SourceUploadRes struct { +} + +/*func (SourceUpload) UploadFile(ctx context.Context, req *SourceUploadReq) (res *SourceUploadRes, err error) { + err = startSaveFile(g.RequestFromCtx(ctx)) + return +}*/ + +func SourceUploadFunc(request *ghttp.Request) { + projectId := request.Get("projectId") + fmt.Println("projectId", projectId) + startSaveFile(request) +} + +func startSaveFile(request *ghttp.Request) error { + err, filename := Upload(request, globe.SOURCE) + fmt.Println("结束了") + fmt.Println(err) + if err != nil { + return err + } + fmt.Println(filename) + /* arr := strings.Split(filename, ".") + arr = arr[:len(arr)-1] + suffix := path.Ext(filename) + var SourceType = "" + switch suffix { + case globe.CLT: + SourceType = globe.TILESET + break + case globe.JCT: + SourceType = globe.TILESET + break + case globe.MBTILES: + SourceType = globe.LAYER + break + case globe.PAK: + //此时需要判断是地形还是正射 + SourceType = globe.LAYER + break + }*/ + //source := database.SOURCE{ + // SourceID: tool.GetUuid(), + // SourceName: strings.Join(arr, "."), + // SourceType: SourceType, + // SourcePath: filename, + //} + //database.GetORMDBInstance().Model(&database.SOURCE{}).Create(&source) + return err +} + +func Upload(r *ghttp.Request, dir string) (error, string) { + var contentLength int64 + contentLength = r.Request.ContentLength + if contentLength <= 0 { + return globe.GetErrors("content_length error"), "" + } + content_type_, has_key := r.Request.Header["Content-Type"] + if !has_key { + return globe.GetErrors("Content-Type error"), "" + } + if len(content_type_) != 1 { + return globe.GetErrors("Content-Type count error"), "" + } + contentType := content_type_[0] + const BOUNDARY string = "; boundary=" + loc := strings.Index(contentType, BOUNDARY) + if -1 == loc { + return globe.GetErrors("Content-Type error, no boundary"), "" + } + boundary := []byte(contentType[(loc + len(BOUNDARY)):]) + readData := make([]byte, 1024*12) + var readTotal = 0 + var des = "" + var filename = "" + for { + fileHeader, fileData, err := ParseFromHead(readData, readTotal, append(boundary, []byte("\r\n")...), r.Request.Body) + if err != nil { + return err, "" + } + filename = fileHeader.FileName + des = path.Join(dir, filename) + f, err := os.Create(des) + if err != nil { + return err, "" + } + f.Write(fileData) + fileData = nil + //需要反复搜索boundary + tempData, reachEnd, err := ReadToBoundary(boundary, r.Request.Body, f) + f.Close() + if err != nil { + return err, "" + } + if reachEnd { + break + } else { + copy(readData[0:], tempData) + readTotal = len(tempData) + continue + } + } + return nil, filename +} + +// / 解析多个文件上传中,每个具体的文件的信息 +type FileHeader struct { + ContentDisposition string + Name string + FileName string ///< 文件名 + ContentType string + ContentLength int64 +} + +// / 解析描述文件信息的头部 +// / @return FileHeader 文件名等信息的结构体 +// / @return bool 解析成功还是失败 +func ParseFileHeader(h []byte) (FileHeader, bool) { + arr := bytes.Split(h, []byte("\r\n")) + var out_header FileHeader + out_header.ContentLength = -1 + const ( + CONTENT_DISPOSITION = "Content-Disposition: " + NAME = "name=\"" + FILENAME = "filename=\"" + CONTENT_TYPE = "Content-Type: " + CONTENT_LENGTH = "Content-Length: " + ) + for _, item := range arr { + if bytes.HasPrefix(item, []byte(CONTENT_DISPOSITION)) { + l := len(CONTENT_DISPOSITION) + arr1 := bytes.Split(item[l:], []byte("; ")) + out_header.ContentDisposition = string(arr1[0]) + if bytes.HasPrefix(arr1[1], []byte(NAME)) { + out_header.Name = string(arr1[1][len(NAME) : len(arr1[1])-1]) + } + fmt.Println(arr1) + l = len(arr1[2]) + if bytes.HasPrefix(arr1[2], []byte(FILENAME)) && arr1[2][l-1] == 0x22 { + out_header.FileName = string(arr1[2][len(FILENAME) : l-1]) + } + } else if bytes.HasPrefix(item, []byte(CONTENT_TYPE)) { + l := len(CONTENT_TYPE) + out_header.ContentType = string(item[l:]) + } else if bytes.HasPrefix(item, []byte(CONTENT_LENGTH)) { + l := len(CONTENT_LENGTH) + s := string(item[l:]) + content_length, err := strconv.ParseInt(s, 10, 64) + if err != nil { + log.Printf("content length error:%s", string(item)) + return out_header, false + } else { + out_header.ContentLength = content_length + } + } else { + log.Printf("unknown:%s\n", string(item)) + } + } + if len(out_header.FileName) == 0 { + return out_header, false + } + return out_header, true +} + +// / 从流中一直读到文件的末位 +// / @return []byte 没有写到文件且又属于下一个文件的数据 +// / @return bool 是否已经读到流的末位了 +// / @return error 是否发生错误 +func ReadToBoundary(boundary []byte, stream io.ReadCloser, target io.WriteCloser) ([]byte, bool, error) { + read_data := make([]byte, 1024*8) + read_data_len := 0 + buf := make([]byte, 1024*4) + b_len := len(boundary) + reach_end := false + for !reach_end { + read_len, err := stream.Read(buf) + if err != nil { + if err != io.EOF && read_len <= 0 { + return nil, true, err + } + reach_end = true + } + //todo: 下面这一句很蠢,值得优化 + copy(read_data[read_data_len:], buf[:read_len]) //追加到另一块buffer,仅仅只是为了搜索方便 + read_data_len += read_len + if read_data_len < b_len+4 { + continue + } + loc := bytes.Index(read_data[:read_data_len], boundary) + if loc >= 0 { + //找到了结束位置 + target.Write(read_data[:loc-4]) + return read_data[loc:read_data_len], reach_end, nil + } + + target.Write(read_data[:read_data_len-b_len-4]) + copy(read_data[0:], read_data[read_data_len-b_len-4:]) + read_data_len = b_len + 4 + } + target.Write(read_data[:read_data_len]) + return nil, reach_end, nil +} + +// / 解析表单的头部 +// / @param read_data 已经从流中读到的数据 +// / @param read_total 已经从流中读到的数据长度 +// / @param boundary 表单的分割字符串 +// / @param stream 输入流 +// / @return FileHeader 文件名等信息头 +// / []byte 已经从流中读到的部分 +// / error 是否发生错误 +func ParseFromHead(read_data []byte, readTotal int, boundary []byte, stream io.ReadCloser) (FileHeader, []byte, error) { + buf := make([]byte, 1024*4) + foundBoundary := false + boundaryLoc := -1 + var file_header FileHeader + for { + read_len, err := stream.Read(buf) + fmt.Println("read_len", read_len) + if err != nil { + if err != io.EOF { + return file_header, nil, err + } + break + } + if readTotal+read_len > cap(read_data) { + return file_header, nil, fmt.Errorf("not found boundary") + } + copy(read_data[readTotal:], buf[:read_len]) + readTotal += read_len + if !foundBoundary { + boundaryLoc = bytes.Index(read_data[:readTotal], boundary) + if -1 == boundaryLoc { + continue + } + foundBoundary = true + } + start_loc := boundaryLoc + len(boundary) + file_head_loc := bytes.Index(read_data[start_loc:readTotal], []byte("\r\n\r\n")) + if -1 == file_head_loc { + continue + } + file_head_loc += start_loc + ret := false + file_header, ret = ParseFileHeader(read_data[start_loc:file_head_loc]) + if !ret { + return file_header, nil, fmt.Errorf("ParseFileHeader fail:%s", string(read_data[start_loc:file_head_loc])) + } + return file_header, read_data[file_head_loc+4 : readTotal], nil + } + return file_header, nil, fmt.Errorf("reach to stream EOF") +} diff --git a/api/v1/common/globe/globe.go b/api/v1/common/globe/globe.go new file mode 100644 index 0000000..3334d26 --- /dev/null +++ b/api/v1/common/globe/globe.go @@ -0,0 +1,96 @@ +package globe + +import ( + "errors" + "github.com/gogf/gf/v2/net/ghttp" + "gorm.io/gorm" + "net/http" + "strconv" +) + +const ( + ALL = -1 //所有 + ENABLE = 1 + DISABLE = 0 + DESC = "desc" + ASC = "asc" + PAGE = 1 + PAGESIZE = 10 + ONLINE = 1 + OFFLINE = 0 + PREFFIX = "yjearth4.0" +) + +var IS_OFFLINE_VERSION = true //是否为单机版本 +const SOURCE = "resource/public/clt/" + +const ( + TILESET = "tileset" + BIM = "bim" + LAYER = "layer" + TERRAIN = "terrain" + POINT = "point" + LINE = "line" + AREA = "area" + MODEL = "model" + KML = "kml" + GEOJSON = "geojson" + DIRECTORY = "directory" + SHP = "shp" +) + +const ( + PAK = ".pak" + MBTILES = ".mbtiles" + CLT = ".clt" + JCT = ".jct" + DOTGEOJSON = ".geojson" + DOTSHP = ".shp" +) + +var ( + PORT = "80" + HOST = "" + PROTOCOL = "" + KEY = "" + CRT = "" +) + +const ( + HTTP = "http" + HTTPS = "https" +) + +func GetErrors(msg string) error { + return errors.New(msg) +} + +func GetAddr() string { + //单机版本时 无代理,需要补全地址 + //if IS_OFFLINE_VERSION { + // return PROTOCOL + "://" + HOST + ":" + PORT + "/" + PREFFIX + //} + //网络版时 有代理 不需要补全地址 + return PREFFIX +} + +/*clt数据包*/ +type Tile struct { + MD5 string `json:"md5"` + PATH string `json:"path"` + Tile []byte `json:"tile"` + Type string `json:"type"` +} + +func RenderData(request *ghttp.Request, data []byte) { + request.Response.Header().Set("Cache-Control", "private,max-age="+strconv.Itoa(60*60)) + request.Response.WriteHeader(http.StatusOK) + request.Response.Writer.Write(data) +} +func CloseDB(db *gorm.DB) { + s, err := db.DB() + if err != nil { + return + } + s.Close() +} diff --git a/api/v1/common/req.go b/api/v1/common/req.go new file mode 100644 index 0000000..fe33dd4 --- /dev/null +++ b/api/v1/common/req.go @@ -0,0 +1,25 @@ +/* +* @desc:公共接口相关 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/30 9:28 + */ + +package common + +// PageReq 公共请求参数 +type PageReq struct { + DateRange []string `p:"dateRange"` //日期范围 + PageNum int `p:"pageNum"` //当前页码 + PageSize int `p:"pageSize"` //每页数 + OrderBy string //排序方式 + NotInPlan bool `p:"notInPlan"` //是否过滤周计划中的id +} + +type Author struct { + Authorization string `p:"Authorization" in:"header" dc:"Bearer {{token}}"` +} + +type Paging struct { + IsPaging string `json:"isPaging" dc:"是否开启分页功能 YES开启 NO不开启(空字符串也不开启分页;默认)"` //是否开启分页功能 YES开启 NO不开启(空字符串也不开启分页;默认) +} diff --git a/api/v1/common/res.go b/api/v1/common/res.go new file mode 100644 index 0000000..ef9a877 --- /dev/null +++ b/api/v1/common/res.go @@ -0,0 +1,21 @@ +/* +* @desc:返回响应公共参数 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/10/27 16:30 + */ + +package common + +import "github.com/gogf/gf/v2/frame/g" + +// EmptyRes 不响应任何数据 +type EmptyRes struct { + g.Meta `mime:"application/json"` +} + +// ListRes 列表公共返回 +type ListRes struct { + CurrentPage int `json:"currentPage"` + Total interface{} `json:"total"` +} diff --git a/api/v1/common/shp/shp.go b/api/v1/common/shp/shp.go new file mode 100644 index 0000000..e3b4bdd --- /dev/null +++ b/api/v1/common/shp/shp.go @@ -0,0 +1,254 @@ +package shp + +import ( + "fmt" + "github.com/tomchavakis/turf-go" + + "github.com/tiger1103/gfast/v3/api/v1/common/globe" + "github.com/tiger1103/gfast/v3/api/v1/common/tool" + "github.com/tiger1103/gfast/v3/api/v1/common/tool/shp" + "github.com/tomchavakis/geojson/geometry" +) + +const ( + DefaultColor = "#12f6f6" + DefaultWidth = "2" +) + +type Point struct { + Lng float64 `json:"lng"` + Lat float64 `json:"lat"` + Alt float64 `json:"alt"` // 裝點更新 只更新這一個,更新立柱的高程時 這個字段不動 + Width float64 `json:"width"` + Property +} + +type Polyline struct { + Positions []Point `json:"positions"` + Width string `json:"width"` + Color string `json:"color"` + Alpha string `json:"alpha"` + Degree string `json:"degree"` + // Name string `json:"name"` // text + // Property string `json:"property"` + Range Box `json:"range"` + Property +} + +type Polygon struct { + Positions []Point `json:"positions"` + Color string `json:"color"` + Range Box `json:"range"` +} + +type Box struct { + MinX float64 `json:"min_x"` + MinY float64 `json:"min_y"` + MaxX float64 `json:"max_x"` + MaxY float64 `json:"max_y"` +} +type ShpObj struct { + Points []Point `json:"points"` + Polylines []Polyline `json:"polylines"` + Polygons []Polygon `json:"polygons"` +} + +type Detail struct { + // Rotation []interfac e{} `json:"rotation"` + Position Point `json:"position"` +} + +type Degree struct { + Position PointDegree `json:"position"` +} + +type PointDegree struct { + Lng float64 `json:"lng"` + Lat float64 `json:"lat"` + Alt float64 `json:"alt"` // 裝點更新 只更新這一個,更新立柱的高程時 這個字段不動 + Degree string `json:"degree"` +} + +type Property struct { + Name string `json:"name"` + Beizhu string `json:"beizhu"` + Tishi string `json:"tishi"` + Height float64 `json:"height"` // 更新立柱的時 更新這個字段 + Difference float64 `json:"difference"` // height - alt + SourceId string `json:"sourceId"` +} + +/*读取shp数据*/ +func ReadShp(file string) (error, *ShpObj) { + //if !globe.IS_OFFLINE_VERSION { + // file = globe.SOURCE + file + //} + if !tool.PathExists(file) { + return globe.GetErrors("资源不存在," + file), nil + } + shape, err := shp.Open(file) + if err != nil { + return err, nil + } + defer shape.Close() + + obj := ShpObj{ + Polygons: []Polygon{}, + Polylines: []Polyline{}, + Points: []Point{}, + } + + fields := shape.Fields() + for shape.Next() { + n, p := shape.Shape() + + name := "" + beizhu := "" + tishi := "" + + var O_LClr, O_LWidth, O_LAlpha /*, O_LType, O_SType, O_TType, O_Name, O_Comment*/ string + O_LClr = DefaultColor + O_LWidth = DefaultWidth + // Text := "" + for k, f := range fields { + val := shape.ReadAttribute(n, k) + + bb := f.String() + + // // 记录本次判断开始前的名字 + // temp := name + + switch bb { + // case "名称": // 方阵的名称 + // if len(name) == 0 { + // name = val + // } + // case "TxtMemo": // 方阵的名称 + // if len(name) == 0 { + // name = val + // } + case "name": // 方阵的名称 + if len(name) == 0 { + name = val + } + + // case "O_Name": // 方阵的名称 + // if len(name) == 0 { + // name = val + // } + case "Text": // 方阵的名称 + if len(name) == 0 { + name = val + } + case "备注": // 方阵的名称 + beizhu = val + case "提示": // 方阵的名称 + tishi = val + } + + // 如果本次循环后名字被清空,则替换为原本的名字 + // if name == "" { + // name = temp + // } + + // fmt.Printf("\t%v: %v\n", f, val) + } + + // fmt.Println(O_Name, O_Comment, O_LClr, O_LWidth, O_LAlpha, O_LType, O_SType, O_TType, Shape_Leng, Text, TxtMemo) + // fmt.Println("Text", Text) + // fmt.Println("O_Name", O_Name) + // fmt.Println("O_Comment", O_Comment) + // fmt.Println("O_LType", O_LType) + // fmt.Println("O_SType", O_SType) + // fmt.Println("O_TType", O_TType) + if p2, ok := p.(*shp.PolyLine); ok { + polyline := Polyline{} + polyline.Alpha = O_LAlpha + polyline.Color = O_LClr + polyline.Width = O_LWidth + polyline.Name = name + polyline.Range.MinX = p.BBox().MinX + polyline.Range.MinY = p.BBox().MinY + polyline.Range.MaxX = p.BBox().MaxX + polyline.Range.MaxY = p.BBox().MaxX + for _, po := range p2.Points { + point := Point{Lng: po.X, Lat: po.Y} + polyline.Positions = append(polyline.Positions, point) + } + obj.Polylines = append(obj.Polylines, polyline) + } else if p3, ok2 := p.(*shp.Polygon); ok2 { + polyline := Polyline{} + polyline.Alpha = O_LAlpha + polyline.Color = O_LClr + polyline.Width = O_LWidth + polyline.Name = name + polyline.Beizhu = beizhu + polyline.Tishi = tishi + // polyline.Property = Property + polyline.Range.MinX = p.BBox().MinX + polyline.Range.MinY = p.BBox().MinY + polyline.Range.MaxX = p.BBox().MaxX + polyline.Range.MaxY = p.BBox().MaxX + for _, po := range p3.Points { + point := Point{Lng: po.X, Lat: po.Y} + polyline.Positions = append(polyline.Positions, point) + } + obj.Polylines = append(obj.Polylines, polyline) + // fmt.Println(p3.Points) + } else if p3, ok3 := p.(*shp.Point); ok3 { + point := Point{Lng: p3.X, Lat: p3.Y} + point.Name = name + point.Tishi = tishi + point.Beizhu = beizhu + obj.Points = append(obj.Points, point) + } else if p3, ok2 := p.(*shp.PolygonZ); ok2 { + polyline := Polyline{} + polyline.Alpha = O_LAlpha + polyline.Color = O_LClr + polyline.Width = O_LWidth + polyline.Name = name + polyline.Beizhu = beizhu + polyline.Tishi = tishi + // polyline.Property = Property + polyline.Range.MinX = p.BBox().MinX + polyline.Range.MinY = p.BBox().MinY + polyline.Range.MaxX = p.BBox().MaxX + polyline.Range.MaxY = p.BBox().MaxX + for _, po := range p3.Points { + + point := Point{Lng: po.X, Lat: po.Y} + polyline.Positions = append(polyline.Positions, point) + } + obj.Polylines = append(obj.Polylines, polyline) + // fmt.Println(p3.Points) + } else if p3, ok3 := p.(*shp.PointZ); ok3 { + point := Point{Lng: p3.X, Lat: p3.Y} + point.Name = name + point.Tishi = tishi + point.Beizhu = beizhu + obj.Points = append(obj.Points, point) + } else { + fmt.Println("其他类型") + } + } + return nil, &obj +} + +/*判断点是否被区域包含*/ +func PointInPolygon(point Point, positions []Point) (bool, error) { + if len(positions) < 3 { + return false, globe.GetErrors("坐标点数量不能小于3") + } + polygon := geometry.Polygon{} + var pts []geometry.Point + for _, position := range positions { + pts = append(pts, geometry.Point{Lat: position.Lat, Lng: point.Lng}) + } + // pts = append(pts, pts[len(pts)-1]) + + LineString := geometry.LineString{} + LineString.Coordinates = pts + polygon.Coordinates = []geometry.LineString{LineString} + + return turf.PointInPolygon(geometry.Point{Lat: point.Lat, Lng: point.Lng}, polygon) +} diff --git a/api/v1/common/source/clt/clt.go b/api/v1/common/source/clt/clt.go new file mode 100644 index 0000000..d321ea3 --- /dev/null +++ b/api/v1/common/source/clt/clt.go @@ -0,0 +1,133 @@ +package clt + +import ( + "bytes" + "compress/gzip" + "encoding/json" + "fmt" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/api/v1/common/globe" + "github.com/tiger1103/gfast/v3/api/v1/common/tool" + "github.com/tiger1103/gfast/v3/database" + "github.com/tiger1103/gfast/v3/database/sqlite" + "io" + "net/http" + "os" + "path" + "strings" +) + +func InitCltData(group *ghttp.RouterGroup) { + group.GET("/data/tileset/{source_id}/*.action", cltCallback) + group.GET("/data/bim/{source_id}/*.action", cltCallback) +} + +func GetTile(sourceid, p string) []byte { + md5 := tool.Md5V(p) + tile := globe.Tile{} + database.GetSourceDB(sourceid).DB.Select("tile").Where("md5=?", md5).First(&tile) + + // 创建一个字节缓冲区,并将压缩数据写入其中 + buf := bytes.NewBuffer(tile.Tile) + // 创建一个gzip.Reader对象,用于解压缩数据 + reader, _ := gzip.NewReader(buf) + defer reader.Close() + // 读取解压缩后的数据 + decompressedData, _ := io.ReadAll(reader) + return decompressedData +} +func cltCallback(request *ghttp.Request) { + sourceId := request.Get("source_id").String() + cltObj := database.GetSourceDB(sourceId) + if cltObj.DB == nil { + request.Response.WriteStatus(http.StatusNotFound) + return + } + argcs := strings.Split(request.RequestURI, "/") + argcs = argcs[7:] + md5 := tool.Md5V(strings.Join(argcs, "/")) + tile := globe.Tile{} + RowsAffected := cltObj.DB.Select("tile").Where("md5=?", md5).Find(&tile).RowsAffected + if RowsAffected == 0 { + request.Response.WriteStatus(http.StatusNotFound) + return + } + suffix := path.Ext(request.RequestURI) + if suffix == ".json" { + request.Response.Header().Set("content-type", "application/json") + } else { + request.Response.Header().Set("content-type", "application/octet-stream") + } + if cltObj.Gzip { + request.Response.Header().Set("Content-Encoding", "gzip") + } + globe.RenderData(request, tile.Tile) +} + +type Info struct { + Params string `json:"params"` +} + +type parseIsZip struct { + Zip bool `json:"zip"` +} +type IsJct struct { + Jct bool `json:"jct"` +} + +func OpenClt(cltPath string, sourceID string) (error, *database.SourceObj) { + //if !globe.IS_OFFLINE_VERSION { + // //网络版事 需要拼接数据地址,方便服务器迁移 + + if !tool.PathExists(cltPath) { + getwd, err := os.Getwd() + if err != nil { + return err, nil + } + cltPath = path.Join(getwd, cltPath) + } + + //} + fmt.Println(cltPath) + if tool.PathExists(cltPath) { + db, err := sqlite.OpenDB(cltPath) + if err != nil { + return err, nil + } + var obj database.SourceObj + obj.DB = db + var info []Info + db.Model(&Info{}).Find(&info) + p := parseIsZip{} + errs := json.Unmarshal([]byte(info[0].Params), &p) + if errs == nil { + obj.Gzip = p.Zip + } + suffix := path.Ext(cltPath) + if suffix == globe.CLT { + obj.Type = globe.TILESET + obj.Url = "/zm/api/v1/data/tileset/" + sourceID + "/tileset.json" + + } else { + obj.Type = globe.BIM + obj.Url = "/zm/api/v1/data/bim/" + sourceID + "/tileset.json" + if len(info) < 2 { + //非jct资源 + globe.CloseDB(db) + return globe.GetErrors("非jct资源"), nil + } + isjct := IsJct{} + errs := json.Unmarshal([]byte(info[1].Params), &isjct) + if errs != nil { + globe.CloseDB(db) + return globe.GetErrors("jct资源检测失败"), nil + } + } + + database.SetSourceDB(sourceID, obj) + return err, &obj + } + fmt.Println("资源不存在:" + cltPath) + return globe.GetErrors("资源不存在:" + cltPath), nil + +} diff --git a/api/v1/common/source/mbt/mbt.go b/api/v1/common/source/mbt/mbt.go new file mode 100644 index 0000000..215cc5a --- /dev/null +++ b/api/v1/common/source/mbt/mbt.go @@ -0,0 +1,123 @@ +package mbt + +import ( + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/api/v1/common/globe" + "github.com/tiger1103/gfast/v3/api/v1/common/tool" + "github.com/tiger1103/gfast/v3/database" + "github.com/tiger1103/gfast/v3/database/sqlite" + "gorm.io/gorm" + "math" + "net/http" + "os" + "path" + "strings" +) + +func InitMbtData(group *ghttp.RouterGroup) { + group.GET("/data/mbt/{source_id}/{z}/{x}/{y}.*", mbtCallback) +} + +func mbtCallback(request *ghttp.Request) { + sourceId := request.Get("source_id").String() + mbtobj := database.GetSourceDB(sourceId) + if mbtobj.DB == nil { + request.Response.WriteStatus(http.StatusNotFound) + return + } + z := request.Get("z").Int() + x := request.Get("x").Int() + y := request.Get("y").Int() + y = int(math.Pow(2, float64(z))) - 1 - y + tile := Tile{} + RowsAffected := mbtobj.DB.Model(&Tile{}). + Select("tile_data"). + Where(&Tile{ZoomLevel: z, TileColumn: x, TileRow: y}).First(&tile).RowsAffected + if RowsAffected > 0 { + request.Response.Header().Set("content-type", mbtobj.ContentType) + globe.RenderData(request, tile.TileData) + return + } else { + request.Response.WriteStatus(http.StatusNotFound) + } +} + +type Tile struct { + TileData []byte `json:"tile_data"` + ZoomLevel int `json:"zoom_level"` + TileColumn int `json:"tile_column"` + TileRow int `json:"tile_row"` +} + +type Metadata struct { + Name string + Value string +} + +func OpenMbt(mbtPath string, sourceID string) (error, *database.SourceObj) { + //if !globe.IS_OFFLINE_VERSION { + // //网络版事 需要拼接数据地址,方便服务器迁移 + // mbtPath = path.Join(globe.SOURCE, mbtPath) + //} + getwd, err := os.Getwd() + if err != nil { + return err, nil + } + mbtPath = path.Join(getwd, mbtPath) + if !tool.PathExists(mbtPath) { + return globe.GetErrors("资源不存在," + mbtPath), nil + } + db, err := sqlite.OpenDB(mbtPath) + if err != nil { + return err, nil + } + var obj database.SourceObj + obj.DB = db + obj.Type = globe.LAYER + var meta []Metadata + db.Model(&Metadata{}).Find(&meta) + obj.Info.MinLevel, obj.Info.MaxLevel = startQueryLevel(db) + var format = "png" + for _, v := range meta { + if v.Name == "format" { + format = v.Value + } + if v.Name == "bounds" { + arr := strings.Split(v.Value, ",") + obj.Info.West = arr[0] + obj.Info.South = arr[1] + obj.Info.East = arr[2] + obj.Info.North = arr[3] + } + if v.Name == "profile" { + obj.Info.ProFile = v.Value + } + if v.Name == "description" { + //lsv下载的 自带投影,此时不需要加 + if strings.Contains(v.Value, "LSV") { + obj.Info.TilingScheme = 0 + } else { + obj.Info.TilingScheme = 1 + } + } + } + obj.ContentType = "image/" + format + obj.Url = "/zm/api/v1/data/mbt/" + sourceID + "/{z}/{x}/{y}." + format + database.SetSourceDB(sourceID, obj) + return err, &obj +} +func startQueryLevel(db *gorm.DB) (min, max int) { + zoom_level := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22} + var existsLevels []int + for i := 0; i < len(zoom_level); i++ { + RowsAffected := db.Model(&Tile{}).Select("zoom_level").Where(&Tile{ZoomLevel: i}).Find(&Tile{}).RowsAffected + if RowsAffected > 0 { + existsLevels = append(existsLevels, i) + } + } + if len(existsLevels) > 0 { + min = existsLevels[0] + max = existsLevels[len(existsLevels)-1] + } + return +} diff --git a/api/v1/common/source/pak/pak.go b/api/v1/common/source/pak/pak.go new file mode 100644 index 0000000..dabcce2 --- /dev/null +++ b/api/v1/common/source/pak/pak.go @@ -0,0 +1,148 @@ +package pak + +import ( + "fmt" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/api/v1/common/globe" + "github.com/tiger1103/gfast/v3/api/v1/common/tool" + "github.com/tiger1103/gfast/v3/database" + "github.com/tiger1103/gfast/v3/database/sqlite" + "math" + "net/http" + "os" + "path" + "strconv" + "strings" +) + +const ( + image = "image" + terrain = "terrain" +) + +func InitPakData(group *ghttp.RouterGroup) { + //group.GET("/data/pak/{source_id}/{z}/{x}/{y}.*", pakCallback) + //group.GET("/data/pak/{source_id}/layer.json", pakCallback) + group.GET("/data/pak/{source_id}/*.action", pakCallback) +} + +type Json struct { + Layerjson []byte `json:"layerjson"` +} + +// 获取pak文件中的表名 +func gettablename(x int, y int, z int) string { + if z < 10 { + return "blocks" + } else { + tx := math.Ceil(float64(x / 512)) + ty := math.Ceil(float64(y / 512)) + return "blocks_" + strconv.Itoa(z) + "_" + strconv.Itoa(int(tx)) + "_" + strconv.Itoa(int(ty)) + } +} + +type Tile struct { + Tile []byte `json:"tile"` + Z int `json:"z"` + X int `json:"x"` + Y int `json:"y"` +} + +func pakCallback(request *ghttp.Request) { + sourceId := request.Get("source_id").String() + pakobj := database.GetSourceDB(sourceId) + if pakobj.DB == nil { + request.Response.WriteStatus(http.StatusNotFound) + return + } + suffix := path.Ext(request.RequestURI) + if suffix == ".json" { + json := Json{} + pakobj.DB.Model(&Info{}).First(&json) + request.Response.Header().Set("content-type", "application/json") + globe.RenderData(request, json.Layerjson) + return + } else { + uri := request.RequestURI + arr := strings.Split(uri, "/") + //z := request.Get("z").Int() + //x := request.Get("x").Int() + //y := request.Get("y").Int() + z, _ := strconv.Atoi(arr[7]) + x, _ := strconv.Atoi(arr[8]) + y, _ := strconv.Atoi(strings.Split(arr[9], ".")[0]) + //y = int(math.Pow(2, float64(z))) - 1 - y + tile := Tile{} + RowsAffected := pakobj.DB.Table(gettablename(x, y, z)).Select("tile").Where(&Tile{Z: z, X: x, Y: y}).First(&tile).RowsAffected + if RowsAffected > 0 { + request.Response.Header().Set("content-type", pakobj.ContentType) + if pakobj.Gzip { + request.Response.Header().Set("Content-Encoding", "gzip") + } + globe.RenderData(request, tile.Tile) + return + } else { + request.Response.WriteStatus(http.StatusNotFound) + } + } +} + +type Info struct { + Minx float64 `json:"minx"` + Miny float64 `json:"miny"` + Maxx float64 `json:"maxx"` + Maxy float64 `json:"maxy"` + Minlevel int `json:"minlevel"` + Maxlevel int `json:"maxlevel"` + Type string `json:"type"` + Zip int `json:"zip"` + //Layerjson []byte `json:"layerjson"` + Contenttype string `json:"contenttype"` +} + +func OpenPak(pakPath string, sourceID string) (error, *database.SourceObj) { + //if !globe.IS_OFFLINE_VERSION { + // //网络版事 需要拼接数据地址,方便服务器迁移 + // pakPath = path.Join(globe.SOURCE, pakPath) + //} + getwd, err := os.Getwd() + if err != nil { + return err, nil + } + pakPath = path.Join(getwd, pakPath) + + if !tool.PathExists(pakPath) { + return globe.GetErrors("资源不存在," + pakPath), nil + } + fmt.Println("资源存在") + db, err := sqlite.OpenDB(pakPath) + if err != nil { + fmt.Println(err) + return err, nil + } + var obj database.SourceObj + obj.DB = db + info := Info{} + db.Model(&Info{}).First(&info) + if info.Type == image { + obj.Type = globe.LAYER + obj.ContentType = info.Contenttype + obj.Url = "/zm/api/v1/data/pak/" + sourceID + "/{z}/{x}/{y}." + strings.Split(obj.ContentType, "/")[1] + } + if info.Type == terrain { + obj.Type = globe.TERRAIN + obj.ContentType = "application/octet-stream" + obj.Url = "/zm/api/v1/data/pak/" + sourceID + "/" + } + if info.Zip > 0 { + obj.Gzip = true + } + obj.Info.MaxLevel = info.Maxlevel + obj.Info.MinLevel = info.Minlevel + obj.Info.West = strconv.FormatFloat(info.Minx, 'f', -1, 64) + obj.Info.South = strconv.FormatFloat(info.Miny, 'f', -1, 64) + obj.Info.East = strconv.FormatFloat(info.Maxx, 'f', -1, 64) + obj.Info.North = strconv.FormatFloat(info.Maxy, 'f', -1, 64) + database.SetSourceDB(sourceID, obj) + return err, &obj +} diff --git a/api/v1/common/source/shp/shp.go b/api/v1/common/source/shp/shp.go new file mode 100644 index 0000000..3d95eb5 --- /dev/null +++ b/api/v1/common/source/shp/shp.go @@ -0,0 +1,295 @@ +package shp + +import ( + "context" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tidwall/gjson" + shp2 "github.com/tiger1103/gfast/v3/api/v1/common/shp" + "io" + "net/http" + "regexp" + "strings" +) + +const MaxNeighborsLen = 8 //最大邻居个数 +const SOURCE = "static/source/" +const Gisfile = "gisfile/" + +// 84的投影文件 +const WGS84_PRJ = "GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]]" + +func InitShp(group *ghttp.RouterGroup) { + group.Group("/shp", func(group *ghttp.RouterGroup) { + group.Bind(new(SHP)) + }) +} + +type SHP struct { +} + +type SHPLoadReq struct { + g.Meta `path:"load" summary:"cesium加载shp" method:"get" tags:"shp相关" ` + //SourceID string `json:"source_id" dc:"资源id" v:"required"` + Path string `json:"path" dc:"路径" v:"required"` +} + +type SHPLoadRes struct { + shp2.ShpObj +} + +//func (receiver SHP) LoadSHP(ctx context.Context, req *SHPLoadReq) (res *SHPLoadRes, err error) { +// err, obj := shp2.ReadShp(req.Path) +// if err != nil { +// return nil, err +// } +// res = &SHPLoadRes{} +// res.Points = obj.Points +// res.Polylines = obj.Polylines +// res.Polygons = obj.Polygons +// return res, err +//} + +type Range struct { + MinX float64 `json:"min_x"` + MinY float64 `json:"min_y"` + MaxX float64 `json:"max_x"` + MaxY float64 `json:"max_y"` +} + +type Position struct { + X float64 `json:"x"` + Y float64 `json:"y"` + Z float64 `json:"z"` + Attr map[string]interface{} `json:"attr"` +} + +type Text struct { + X float64 `json:"x"` + Y float64 `json:"y"` + Text string `json:"text"` +} + +type Circle struct { + X float64 `json:"x"` + Y float64 `json:"y"` + Z float64 `json:"z"` + Radius float64 `json:"radius"` +} + +type Polyline struct { + Positions []Position `json:"positions"` + Attr map[string]interface{} `json:"attr"` + Range Range `json:"range"` +} + +type Polygon struct { + Positions []Position `json:"positions"` + Attr map[string]interface{} `json:"attr"` + Range Range `json:"range"` +} + +type MultiPolygon struct { + Polygons []Polygon `json:"polygons"` + Attr map[string]interface{} `json:"attr"` + Range Range `json:"range"` +} + +type MultiPolyline struct { + Polylines []Polyline `json:"polylines"` + Attr map[string]interface{} `json:"attr"` + Range Range `json:"range"` +} + +type LayerData struct { + LayerName string `json:"layer_name"` + Proj4 string `json:"proj4"` + Texts []Text `json:"texts"` + Circles []Circle `json:"circles"` + Points []Position `json:"points"` + Polylines []Polyline `json:"polylines"` + Polygons []Polygon `json:"polygons"` + MultiPolygons []MultiPolygon `json:"multi_polygons"` + MultiPolylines []MultiPolyline `json:"multi_polylines"` +} + +type Directory struct { + Name string `json:"name"` + IsDir bool `json:"is_dir"` + Data []LayerData `json:"data"` + Children []Directory `json:"children"` +} + +type Response struct { + Code int `json:"code"` + Data Directory `json:"data"` +} + +// JoinLoadSHP 原本的LoadSHP有问题,直接调用远程的接口 +func (receiver SHP) JoinLoadSHP(ctx context.Context, req *SHPLoadReq) (res *SHPLoadRes, err error) { + res = new(SHPLoadRes) + if req.Path[0] == '/' { + req.Path = req.Path[1:] + } + + url := "http://192.168.1.177:8921/yjearth5/api/v1/vector/load?path=/project/zmkg/" + req.Path + + reqs, err := http.Get(url) + if err != nil { + return nil, err + } + defer reqs.Body.Close() + + body, err := io.ReadAll(reqs.Body) + if err != nil { + return nil, err + } + + if gjson.Get(string(body), "message").String() == "资源不存在" { + return nil, fmt.Errorf("资源不存在") + } + + var list shp2.ShpObj + processShapes(body, "data.children.0.data.0.polylines", &list) + processShapes(body, "data.children.0.data.0.polygons", &list) + processShapes(body, "data.children.0.data", &list) + + if list.Polylines == nil { + list.Polylines = []shp2.Polyline{} + } + + if list.Polygons == nil { + list.Polygons = []shp2.Polygon{} + } + + if list.Points == nil { + list.Points = []shp2.Point{} + } + + res.Polygons = list.Polygons + res.Polylines = list.Polylines + res.Points = list.Points + + return res, err +} + +func Adasda(path string) (res *SHPLoadRes) { + fmt.Println("加载shp文件", path) + res = new(SHPLoadRes) + if path[0] == '/' { + path = path[1:] + } + + url := "http://192.168.1.177:8921/yjearth5/api/v1/vector/load?path=/project/zmkg/" + path + + reqs, err := http.Get(url) + if err != nil { + fmt.Println("请求数据失败") + } + defer reqs.Body.Close() + + body, err := io.ReadAll(reqs.Body) + if err != nil { + fmt.Errorf("读取资源失败") + } + + if gjson.Get(string(body), "message").String() == "资源不存在" { + fmt.Errorf("资源不存在") + } + + var list = shp2.ShpObj{ + Polylines: []shp2.Polyline{}, + Polygons: []shp2.Polygon{}, + Points: []shp2.Point{}, + } + processShapes(body, "data.children.0.data.0.polylines", &list) + processShapes(body, "data.children.0.data.0.polygons", &list) + processShapes(body, "data.children.0.data", &list) + + res.Polygons = list.Polygons + res.Polylines = list.Polylines + res.Points = list.Points + return +} + +func processShapes(data []byte, path string, shapes *shp2.ShpObj) { + gjson.GetBytes(data, path).ForEach(func(key, shape gjson.Result) bool { + // 面 + var pointsList []shp2.Point + psGet := shape.Get("positions") + if psGet.Exists() { + psGet.ForEach(func(posKey, value gjson.Result) bool { + longitude := value.Get("x").Float() + latitude := value.Get("y").Float() + altitude := value.Get("z").Float() + + pointsList = append(pointsList, shp2.Point{ + Lng: longitude, + Lat: latitude, + Alt: altitude, + }) + return true + }) + if len(pointsList) > 0 { + shapes.Polylines = append(shapes.Polylines, shp2.Polyline{ + Positions: pointsList, + Width: "5", + Color: "#f00", + }) + } + if shape.Get("attr").Exists() { + aName := shape.Get("attr.NAME").String() + fmt.Println("!!! ", aName) + shapes.Polylines[len(shapes.Polylines)-1].Property = shp2.Property{ + Name: aName, + } + } + if shape.Get("range").Exists() { + minX := shape.Get("range.min_x").Float() + minY := shape.Get("range.min_y").Float() + maxX := shape.Get("range.max_x").Float() + maxY := shape.Get("range.max_y").Float() + shapes.Polylines[len(shapes.Polylines)-1].Range = shp2.Box{ + MinX: minX, + MinY: minY, + MaxX: maxX, + MaxY: maxY, + } + } + } else { + //fmt.Println("!!! ", shape.Get("points")) + // 点 + var point []shp2.Point + shape.Get("points").ForEach(func(posKey, value gjson.Result) bool { + aName := value.Get("attr.NAME") + if value.Get("attr.NAME").Exists() { + //排除nc 和 空 + isPureNumber, _ := regexp.MatchString(`^\d+$`, aName.String()) + if strings.Contains(aName.String(), "NC") || strings.TrimSpace(aName.String()) == "" || isPureNumber { + return true + } + longitude := value.Get("x").Float() + latitude := value.Get("y").Float() + altitude := value.Get("z").Float() + + point = append(point, shp2.Point{ + Lng: longitude, + Lat: latitude, + Alt: altitude, + Property: shp2.Property{ + Name: aName.String(), + }, + }) + + } + return true + }) + if len(point) > 0 { + shapes.Points = append(shapes.Points, point...) + } + } + + return true + }) +} diff --git a/api/v1/common/source/source.go b/api/v1/common/source/source.go new file mode 100644 index 0000000..e9c64fc --- /dev/null +++ b/api/v1/common/source/source.go @@ -0,0 +1,85 @@ +package source + +import ( + "context" + "encoding/json" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/os/gctx" + "github.com/tiger1103/gfast/v3/api/v1/common/globe" + "github.com/tiger1103/gfast/v3/api/v1/common/source/clt" + "github.com/tiger1103/gfast/v3/api/v1/common/source/pak" + "github.com/tiger1103/gfast/v3/database" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "path" +) + +func InitSource(group *ghttp.RouterGroup) { + ReadAllSourceFromDB() + group.Group("/data/service", func(group *ghttp.RouterGroup) { + group.Bind(new(LoadSource)) + }) +} + +type LoadSource struct { +} +type LoadSourceReq struct { + g.Meta `path:"load-compact-service" summary:"引擎加载资源" method:"post" tags:"资源相关" ` + SourceID string `json:"source_id" v:"required" dc:"资源id"` +} +type LoadSourceRes struct { + Type string `json:"type"` + Url string `json:"url"` + database.SourceInfo +} + +func (LoadSource) LoadCompactService(ctx context.Context, req *LoadSourceReq) (res *LoadSourceRes, err error) { + obj := database.GetSourceDB(req.SourceID) + res = &LoadSourceRes{ + Url: obj.Url, + Type: obj.Type, + } + res.North = obj.Info.North + res.West = obj.Info.West + res.East = obj.Info.East + res.South = obj.Info.South + res.ProFile = obj.Info.ProFile + res.TilingScheme = obj.Info.TilingScheme + res.MaxLevel = obj.Info.MaxLevel + res.MinLevel = obj.Info.MinLevel + return +} + +func ReadAllSourceFromDB() { + var sources []database.SOURCE + var gfb []database.SOURCE + g.DB().Model(&database.SOURCE{}) + ctx := gctx.New() + //模型 + dao.QianqiMoxing.Ctx(ctx).Scan(&sources) + //光伏板 + dao.QianqiGuangfuban.Ctx(ctx).Scan(&gfb) + sources = append(sources, gfb...) + for _, v := range sources { + suffix := path.Ext(v.SourcePath) + switch suffix { + case globe.CLT: + err, obj := clt.OpenClt(v.SourcePath, v.SourceID) + if err != nil { + fmt.Println(err) + } + marshal, _ := json.Marshal(obj) + fmt.Println(string(marshal), v.SourceID) + break + case globe.PAK: + err, obj := pak.OpenPak(v.SourcePath, v.SourceID) + if err != nil { + fmt.Println(err) + } + marshal, _ := json.Marshal(obj) + fmt.Println(string(marshal), v.SourceID) + break + } + } +} diff --git a/api/v1/common/tool/excel/excel.go b/api/v1/common/tool/excel/excel.go new file mode 100644 index 0000000..e4b1222 --- /dev/null +++ b/api/v1/common/tool/excel/excel.go @@ -0,0 +1,49 @@ +package excel + +import ( + "errors" + "fmt" + "github.com/tiger1103/gfast/v3/api/v1/common/tool" + "github.com/xuri/excelize/v2" +) + +type Sheet struct { + Name string `json:"name"` + Rows [][]string `json:"rows"` +} + +func ReadXlsx(xlsx string) (err error, sheet []Sheet) { + if !tool.PathExists(xlsx) { + return errors.New("文件不存在:" + xlsx), sheet + } + f, err := excelize.OpenFile(xlsx) + if err != nil { + fmt.Println(err) + return err, sheet + } + defer func() { + // 关闭工作簿 + if err := f.Close(); err != nil { + fmt.Println(err) + } + }() + list := f.GetSheetList() + // 获取 Sheet1 上所有单元格 + for _, sheetName := range list { + result, err := f.GetRows(sheetName) + if err != nil { + fmt.Println(err) + continue + } + sheet = append(sheet, Sheet{sheetName, result}) + //rows = append(rows, result...) + } + + //for _, row := range rows { + // for _, colCell := range row { + // fmt.Print(colCell, "\t") + // } + // fmt.Println() + //} + return nil, sheet +} diff --git a/api/v1/common/tool/proj/proj.go b/api/v1/common/tool/proj/proj.go new file mode 100644 index 0000000..ce948db --- /dev/null +++ b/api/v1/common/tool/proj/proj.go @@ -0,0 +1,25 @@ +package proj + +import ( + _ "embed" + "github.com/dop251/goja" +) + +//go:embed proj4.js +var proj4 string + +var CGCS2000_to_WGS84 func(degrees int, cscs2000 [][]string) string +var WGS84_to_CGCS2000 func(degrees int, wgs84 [][]string) string + +func InitProj() { + vm := goja.New() + vm.RunString(proj4) + vm.ExportTo(vm.Get("CGCS2000_to_WGS84"), &CGCS2000_to_WGS84) + vm.ExportTo(vm.Get("WGS84_to_CGCS2000"), &WGS84_to_CGCS2000) + //var ss [][]string + //ss = append(ss, []string{ + // "106.545463204423", "23.467020901621", "805.6832", + //}) + //s := WGS84_to_CGCS2000(108, ss) + //fmt.Println(s) +} diff --git a/api/v1/common/tool/proj/proj4.js b/api/v1/common/tool/proj/proj4.js new file mode 100644 index 0000000..7849d88 --- /dev/null +++ b/api/v1/common/tool/proj/proj4.js @@ -0,0 +1,1994 @@ +!function (t, s) { + "object" == typeof exports && "undefined" != typeof module ? module.exports = s() : "function" == typeof define && define.amd ? define(s) : t.proj4 = s() +}(this, function () { + "use strict"; + + function t(t, s) { + if (t[s]) return t[s]; + for (var i, a = Object.keys(t), h = s.toLowerCase().replace(Ot, ""), e = -1; ++e < a.length;) if (i = a[e], i.toLowerCase().replace(Ot, "") === h) return t[i] + } + + function s(t) { + if ("string" != typeof t) throw new Error("not a string"); + this.text = t.trim(), this.level = 0, this.place = 0, this.root = null, this.stack = [], this.currentObject = null, this.state = qt + } + + function i(t) { + return new s(t).output() + } + + function a(t, s, i) { + Array.isArray(s) && (i.unshift(s), s = null); + var a = s ? {} : t, e = i.reduce(function (t, s) { + return h(s, t), t + }, a); + s && (t[s] = e) + } + + function h(t, s) { + if (Array.isArray(t)) { + var i = t.shift(); + if ("PARAMETER" === i && (i = t.shift()), 1 === t.length) return Array.isArray(t[0]) ? (s[i] = {}, void h(t[0], s[i])) : void (s[i] = t[0]); + if (t.length) if ("TOWGS84" !== i) { + if ("AXIS" === i) return i in s || (s[i] = []), void s[i].push(t); + Array.isArray(i) || (s[i] = {}); + var e; + switch (i) { + case"UNIT": + case"PRIMEM": + case"VERT_DATUM": + return s[i] = {name: t[0].toLowerCase(), convert: t[1]}, void (3 === t.length && h(t[2], s[i])); + case"SPHEROID": + case"ELLIPSOID": + return s[i] = {name: t[0], a: t[1], rf: t[2]}, void (4 === t.length && h(t[3], s[i])); + case"PROJECTEDCRS": + case"PROJCRS": + case"GEOGCS": + case"GEOCCS": + case"PROJCS": + case"LOCAL_CS": + case"GEODCRS": + case"GEODETICCRS": + case"GEODETICDATUM": + case"EDATUM": + case"ENGINEERINGDATUM": + case"VERT_CS": + case"VERTCRS": + case"VERTICALCRS": + case"COMPD_CS": + case"COMPOUNDCRS": + case"ENGINEERINGCRS": + case"ENGCRS": + case"FITTED_CS": + case"LOCAL_DATUM": + case"DATUM": + return t[0] = ["name", t[0]], void a(s, i, t); + default: + for (e = -1; ++e < t.length;) if (!Array.isArray(t[e])) return h(t, s[i]); + return a(s, i, t) + } + } else s[i] = t; else s[i] = !0 + } else s[t] = !0 + } + + function e(t, s) { + var i = s[0], a = s[1]; + !(i in t) && a in t && (t[i] = t[a], 3 === s.length && (t[i] = s[2](t[i]))) + } + + function n(t) { + return t * Bt + } + + function r(t) { + function s(s) { + return s * (t.to_meter || 1) + } + + if ("GEOGCS" === t.type ? t.projName = "longlat" : "LOCAL_CS" === t.type ? (t.projName = "identity", t.local = !0) : "object" == typeof t.PROJECTION ? t.projName = Object.keys(t.PROJECTION)[0] : t.projName = t.PROJECTION, t.AXIS) { + for (var i = "", a = 0, h = t.AXIS.length; a < h; ++a) { + var r = t.AXIS[a][0].toLowerCase(); + -1 !== r.indexOf("north") ? i += "n" : -1 !== r.indexOf("south") ? i += "s" : -1 !== r.indexOf("east") ? i += "e" : -1 !== r.indexOf("west") && (i += "w") + } + 2 === i.length && (i += "u"), 3 === i.length && (t.axis = i) + } + t.UNIT && (t.units = t.UNIT.name.toLowerCase(), "metre" === t.units && (t.units = "meter"), t.UNIT.convert && ("GEOGCS" === t.type ? t.DATUM && t.DATUM.SPHEROID && (t.to_meter = t.UNIT.convert * t.DATUM.SPHEROID.a) : t.to_meter = t.UNIT.convert)); + var o = t.GEOGCS; + "GEOGCS" === t.type && (o = t), o && (o.DATUM ? t.datumCode = o.DATUM.name.toLowerCase() : t.datumCode = o.name.toLowerCase(), "d_" === t.datumCode.slice(0, 2) && (t.datumCode = t.datumCode.slice(2)), "new_zealand_geodetic_datum_1949" !== t.datumCode && "new_zealand_1949" !== t.datumCode || (t.datumCode = "nzgd49"), "wgs_1984" !== t.datumCode && "world_geodetic_system_1984" !== t.datumCode || ("Mercator_Auxiliary_Sphere" === t.PROJECTION && (t.sphere = !0), t.datumCode = "wgs84"), "_ferro" === t.datumCode.slice(-6) && (t.datumCode = t.datumCode.slice(0, -6)), "_jakarta" === t.datumCode.slice(-8) && (t.datumCode = t.datumCode.slice(0, -8)), ~t.datumCode.indexOf("belge") && (t.datumCode = "rnb72"), o.DATUM && o.DATUM.SPHEROID && (t.ellps = o.DATUM.SPHEROID.name.replace("_19", "").replace(/[Cc]larke\_18/, "clrk"), "international" === t.ellps.toLowerCase().slice(0, 13) && (t.ellps = "intl"), t.a = o.DATUM.SPHEROID.a, t.rf = parseFloat(o.DATUM.SPHEROID.rf, 10)), o.DATUM && o.DATUM.TOWGS84 && (t.datum_params = o.DATUM.TOWGS84), ~t.datumCode.indexOf("osgb_1936") && (t.datumCode = "osgb36"), ~t.datumCode.indexOf("osni_1952") && (t.datumCode = "osni52"), (~t.datumCode.indexOf("tm65") || ~t.datumCode.indexOf("geodetic_datum_of_1965")) && (t.datumCode = "ire65"), "ch1903+" === t.datumCode && (t.datumCode = "ch1903"), ~t.datumCode.indexOf("israel") && (t.datumCode = "isr93")), t.b && !isFinite(t.b) && (t.b = t.a); + [["standard_parallel_1", "Standard_Parallel_1"], ["standard_parallel_2", "Standard_Parallel_2"], ["false_easting", "False_Easting"], ["false_northing", "False_Northing"], ["central_meridian", "Central_Meridian"], ["latitude_of_origin", "Latitude_Of_Origin"], ["latitude_of_origin", "Central_Parallel"], ["scale_factor", "Scale_Factor"], ["k0", "scale_factor"], ["latitude_of_center", "Latitude_Of_Center"], ["latitude_of_center", "Latitude_of_center"], ["lat0", "latitude_of_center", n], ["longitude_of_center", "Longitude_Of_Center"], ["longitude_of_center", "Longitude_of_center"], ["longc", "longitude_of_center", n], ["x0", "false_easting", s], ["y0", "false_northing", s], ["long0", "central_meridian", n], ["lat0", "latitude_of_origin", n], ["lat0", "standard_parallel_1", n], ["lat1", "standard_parallel_1", n], ["lat2", "standard_parallel_2", n], ["azimuth", "Azimuth"], ["alpha", "azimuth", n], ["srsCode", "name"]].forEach(function (s) { + return e(t, s) + }), t.long0 || !t.longc || "Albers_Conic_Equal_Area" !== t.projName && "Lambert_Azimuthal_Equal_Area" !== t.projName || (t.long0 = t.longc), t.lat_ts || !t.lat1 || "Stereographic_South_Pole" !== t.projName && "Polar Stereographic (variant B)" !== t.projName || (t.lat0 = n(t.lat1 > 0 ? 90 : -90), t.lat_ts = t.lat1) + } + + function o(t) { + var s = this; + if (2 === arguments.length) { + var i = arguments[1]; + "string" == typeof i ? "+" === i.charAt(0) ? o[t] = kt(arguments[1]) : o[t] = zt(arguments[1]) : o[t] = i + } else if (1 === arguments.length) { + if (Array.isArray(t)) return t.map(function (t) { + Array.isArray(t) ? o.apply(s, t) : o(t) + }); + if ("string" == typeof t) { + if (t in o) return o[t] + } else "EPSG" in t ? o["EPSG:" + t.EPSG] = t : "ESRI" in t ? o["ESRI:" + t.ESRI] = t : "IAU2000" in t ? o["IAU2000:" + t.IAU2000] = t : console.log(t); + return + } + } + + function l(t) { + return "string" == typeof t + } + + function c(t) { + return t in o + } + + function u(t) { + return Ft.some(function (s) { + return t.indexOf(s) > -1 + }) + } + + function M(s) { + var i = t(s, "authority"); + if (i) { + var a = t(i, "epsg"); + return a && Dt.indexOf(a) > -1 + } + } + + function f(s) { + var i = t(s, "extension"); + if (i) return t(i, "proj4") + } + + function d(t) { + return "+" === t[0] + } + + function m(t) { + if (!l(t)) return t; + if (c(t)) return o[t]; + if (u(t)) { + var s = zt(t); + if (M(s)) return o["EPSG:3857"]; + var i = f(s); + return i ? kt(i) : s + } + return d(t) ? kt(t) : void 0 + } + + function p(t) { + return t + } + + function y(t, s) { + var i = Zt.length; + return t.names ? (Zt[i] = t, t.names.forEach(function (t) { + Vt[t.toLowerCase()] = i + }), this) : (console.log(s), !0) + } + + function _(t, s, i, a) { + var h = t * t, e = s * s, n = (h - e) / h, r = 0; + return a ? (h = (t *= 1 - n * (gt + n * (vt + n * bt))) * t, n = 0) : r = Math.sqrt(n), { + es: n, + e: r, + ep2: (h - e) / e + } + } + + function x(s, i, a, h, e) { + if (!s) { + var n = t($t, h); + n || (n = ts), s = n.a, i = n.b, a = n.rf + } + return a && !i && (i = (1 - 1 / a) * s), (0 === a || Math.abs(s - i) < wt) && (e = !0, i = s), { + a: s, + b: i, + rf: a, + sphere: e + } + } + + function g(t, s, i, a, h, e, n) { + var r = {}; + return r.datum_type = void 0 === t || "none" === t ? yt : pt, s && (r.datum_params = s.map(parseFloat), 0 === r.datum_params[0] && 0 === r.datum_params[1] && 0 === r.datum_params[2] || (r.datum_type = ft), r.datum_params.length > 3 && (0 === r.datum_params[3] && 0 === r.datum_params[4] && 0 === r.datum_params[5] && 0 === r.datum_params[6] || (r.datum_type = dt, r.datum_params[3] *= _t, r.datum_params[4] *= _t, r.datum_params[5] *= _t, r.datum_params[6] = r.datum_params[6] / 1e6 + 1))), n && (r.datum_type = mt, r.grids = n), r.a = i, r.b = a, r.es = h, r.ep2 = e, r + } + + function v(t) { + return void 0 === t ? null : t.split(",").map(b) + } + + function b(t) { + if (0 === t.length) return null; + var s = "@" === t[0]; + return s && (t = t.slice(1)), "null" === t ? {name: "null", mandatory: !s, grid: null, isNull: !0} : { + name: t, + mandatory: !s, + grid: is[t] || null, + isNull: !1 + } + } + + function w(t) { + return t / 3600 * Math.PI / 180 + } + + function A(t) { + var s = t.getInt32(8, !1); + return 11 !== s && (11 !== (s = t.getInt32(8, !0)) && console.warn("Failed to detect nadgrid endian-ness, defaulting to little-endian"), !0) + } + + function E(t, s) { + return { + nFields: t.getInt32(8, s), + nSubgridFields: t.getInt32(24, s), + nSubgrids: t.getInt32(40, s), + shiftType: N(t, 56, 64).trim(), + fromSemiMajorAxis: t.getFloat64(120, s), + fromSemiMinorAxis: t.getFloat64(136, s), + toSemiMajorAxis: t.getFloat64(152, s), + toSemiMinorAxis: t.getFloat64(168, s) + } + } + + function N(t, s, i) { + return String.fromCharCode.apply(null, new Uint8Array(t.buffer.slice(s, i))) + } + + function C(t, s, i) { + for (var a = [], h = 0; h < s.nSubgrids; h++) { + var e = S(t, 176, i), n = I(t, 176, e, i), + r = Math.round(1 + (e.upperLongitude - e.lowerLongitude) / e.longitudeInterval), + o = Math.round(1 + (e.upperLatitude - e.lowerLatitude) / e.latitudeInterval); + a.push({ + ll: [w(e.lowerLongitude), w(e.lowerLatitude)], + del: [w(e.longitudeInterval), w(e.latitudeInterval)], + lim: [r, o], + count: e.gridNodeCount, + cvs: P(n) + }) + } + return a + } + + function P(t) { + return t.map(function (t) { + return [w(t.longitudeShift), w(t.latitudeShift)] + }) + } + + function S(t, s, i) { + return { + name: N(t, s + 8, s + 16).trim(), + parent: N(t, s + 24, s + 24 + 8).trim(), + lowerLatitude: t.getFloat64(s + 72, i), + upperLatitude: t.getFloat64(s + 88, i), + lowerLongitude: t.getFloat64(s + 104, i), + upperLongitude: t.getFloat64(s + 120, i), + latitudeInterval: t.getFloat64(s + 136, i), + longitudeInterval: t.getFloat64(s + 152, i), + gridNodeCount: t.getInt32(s + 168, i) + } + } + + function I(t, s, i, a) { + for (var h = s + 176, e = [], n = 0; n < i.gridNodeCount; n++) { + var r = { + latitudeShift: t.getFloat32(h + 16 * n, a), + longitudeShift: t.getFloat32(h + 16 * n + 4, a), + latitudeAccuracy: t.getFloat32(h + 16 * n + 8, a), + longitudeAccuracy: t.getFloat32(h + 16 * n + 12, a) + }; + e.push(r) + } + return e + } + + function Projection(s, i) { + if (!(this instanceof Projection)) return new Projection(s); + i = i || function (t) { + if (t) throw t + }; + var a = m(s); + if ("object" == typeof a) { + var h = Projection.projections.get(a.projName); + if (h) { + if (a.datumCode && "none" !== a.datumCode) { + var e = t(ss, a.datumCode); + e && (a.datum_params = a.datum_params || (e.towgs84 ? e.towgs84.split(",") : null), a.ellps = e.ellipse, a.datumName = e.datumName ? e.datumName : a.datumCode) + } + a.k0 = a.k0 || 1, a.axis = a.axis || "enu", a.ellps = a.ellps || "wgs84", a.lat1 = a.lat1 || a.lat0; + var n = x(a.a, a.b, a.rf, a.ellps, a.sphere), r = _(n.a, n.b, n.rf, a.R_A), o = v(a.nadgrids), + l = a.datum || g(a.datumCode, a.datum_params, n.a, n.b, r.es, r.ep2, o); + Ut(this, a), Ut(this, h), this.a = n.a, this.b = n.b, this.rf = n.rf, this.sphere = n.sphere, this.es = r.es, this.e = r.e, this.ep2 = r.ep2, this.datum = l, this.init(), i(null, this) + } else i(s) + } else i(s) + } + + function O(t, s) { + return t.datum_type === s.datum_type && (!(t.a !== s.a || Math.abs(t.es - s.es) > 5e-11) && (t.datum_type === ft ? t.datum_params[0] === s.datum_params[0] && t.datum_params[1] === s.datum_params[1] && t.datum_params[2] === s.datum_params[2] : t.datum_type !== dt || t.datum_params[0] === s.datum_params[0] && t.datum_params[1] === s.datum_params[1] && t.datum_params[2] === s.datum_params[2] && t.datum_params[3] === s.datum_params[3] && t.datum_params[4] === s.datum_params[4] && t.datum_params[5] === s.datum_params[5] && t.datum_params[6] === s.datum_params[6])) + } + + function k(t, s, i) { + var a, h, e, n, r = t.x, o = t.y, l = t.z ? t.z : 0; + if (o < -xt && o > -1.001 * xt) o = -xt; else if (o > xt && o < 1.001 * xt) o = xt; else { + if (o < -xt) return {x: -1 / 0, y: -1 / 0, z: t.z}; + if (o > xt) return {x: 1 / 0, y: 1 / 0, z: t.z} + } + return r > Math.PI && (r -= 2 * Math.PI), h = Math.sin(o), n = Math.cos(o), e = h * h, a = i / Math.sqrt(1 - s * e), { + x: (a + l) * n * Math.cos(r), + y: (a + l) * n * Math.sin(r), + z: (a * (1 - s) + l) * h + } + } + + function q(t, s, i, a) { + var h, e, n, r, o, l, c, u, M, f, d, m, p, y, _, x, g = t.x, v = t.y, b = t.z ? t.z : 0; + if (h = Math.sqrt(g * g + v * v), e = Math.sqrt(g * g + v * v + b * b), h / i < 1e-12) { + if (y = 0, e / i < 1e-12) return _ = xt, x = -a, {x: t.x, y: t.y, z: t.z} + } else y = Math.atan2(v, g); + n = b / e, u = (r = h / e) * (1 - s) * (o = 1 / Math.sqrt(1 - s * (2 - s) * r * r)), M = n * o, p = 0; + do { + p++, l = s * (c = i / Math.sqrt(1 - s * M * M)) / (c + (x = h * u + b * M - c * (1 - s * M * M))), m = (d = n * (o = 1 / Math.sqrt(1 - l * (2 - l) * r * r))) * u - (f = r * (1 - l) * o) * M, u = f, M = d + } while (m * m > 1e-24 && p < 30); + return _ = Math.atan(d / Math.abs(f)), {x: y, y: _, z: x} + } + + function R(t, s, i) { + if (s === ft) return {x: t.x + i[0], y: t.y + i[1], z: t.z + i[2]}; + if (s === dt) { + var a = i[0], h = i[1], e = i[2], n = i[3], r = i[4], o = i[5], l = i[6]; + return { + x: l * (t.x - o * t.y + r * t.z) + a, + y: l * (o * t.x + t.y - n * t.z) + h, + z: l * (-r * t.x + n * t.y + t.z) + e + } + } + } + + function T(t, s, i) { + if (s === ft) return {x: t.x - i[0], y: t.y - i[1], z: t.z - i[2]}; + if (s === dt) { + var a = i[0], h = i[1], e = i[2], n = i[3], r = i[4], o = i[5], l = i[6], c = (t.x - a) / l, + u = (t.y - h) / l, M = (t.z - e) / l; + return {x: c + o * u - r * M, y: -o * c + u + n * M, z: r * c - n * u + M} + } + } + + function L(t) { + return t === ft || t === dt + } + + function G(t, s, i) { + if (null === t.grids || 0 === t.grids.length) return console.log("Grid shift grids not found"), -1; + for (var a = {x: -i.x, y: i.y}, h = {x: Number.NaN, y: Number.NaN}, e = [], n = 0; n < t.grids.length; n++) { + var r = t.grids[n]; + if (e.push(r.name), r.isNull) { + h = a; + break + } + if (null !== r.grid) { + var o = r.grid.subgrids[0], l = (Math.abs(o.del[1]) + Math.abs(o.del[0])) / 1e4, c = o.ll[0] - l, + u = o.ll[1] - l, M = o.ll[0] + (o.lim[0] - 1) * o.del[0] + l, + f = o.ll[1] + (o.lim[1] - 1) * o.del[1] + l; + if (!(u > a.y || c > a.x || f < a.y || M < a.x || (h = j(a, s, o), isNaN(h.x)))) break + } else if (r.mandatory) return console.log("Unable to find mandatory grid '" + r.name + "'"), -1 + } + return isNaN(h.x) ? (console.log("Failed to find a grid shift table for location '" + -a.x * Et + " " + a.y * Et + " tried: '" + e + "'"), -1) : (i.x = -h.x, i.y = h.y, 0) + } + + function j(t, s, i) { + var a = {x: Number.NaN, y: Number.NaN}; + if (isNaN(t.x)) return a; + var h = {x: t.x, y: t.y}; + h.x -= i.ll[0], h.y -= i.ll[1], h.x = Ht(h.x - Math.PI) + Math.PI; + var e = B(h, i); + if (s) { + if (isNaN(e.x)) return a; + e.x = h.x - e.x, e.y = h.y - e.y; + var n, r, o = 9; + do { + if (r = B(e, i), isNaN(r.x)) { + console.log("Inverse grid shift iteration failed, presumably at grid edge. Using first approximation."); + break + } + n = {x: h.x - (r.x + e.x), y: h.y - (r.y + e.y)}, e.x += n.x, e.y += n.y + } while (o-- && Math.abs(n.x) > 1e-12 && Math.abs(n.y) > 1e-12); + if (o < 0) return console.log("Inverse grid shift iterator failed to converge."), a; + a.x = Ht(e.x + i.ll[0]), a.y = e.y + i.ll[1] + } else isNaN(e.x) || (a.x = t.x + e.x, a.y = t.y + e.y); + return a + } + + function B(t, s) { + var i, a = {x: t.x / s.del[0], y: t.y / s.del[1]}, h = {x: Math.floor(a.x), y: Math.floor(a.y)}, + e = {x: a.x - 1 * h.x, y: a.y - 1 * h.y}, n = {x: Number.NaN, y: Number.NaN}; + if (h.x < 0 || h.x >= s.lim[0]) return n; + if (h.y < 0 || h.y >= s.lim[1]) return n; + i = h.y * s.lim[0] + h.x; + var r = {x: s.cvs[i][0], y: s.cvs[i][1]}; + i++; + var o = {x: s.cvs[i][0], y: s.cvs[i][1]}; + i += s.lim[0]; + var l = {x: s.cvs[i][0], y: s.cvs[i][1]}; + i--; + var c = {x: s.cvs[i][0], y: s.cvs[i][1]}, u = e.x * e.y, M = e.x * (1 - e.y), f = (1 - e.x) * (1 - e.y), + d = (1 - e.x) * e.y; + return n.x = f * r.x + M * o.x + d * c.x + u * l.x, n.y = f * r.y + M * o.y + d * c.y + u * l.y, n + } + + function z(t) { + if ("function" == typeof Number.isFinite) { + if (Number.isFinite(t)) return; + throw new TypeError("coordinates must be finite numbers") + } + if ("number" != typeof t || t !== t || !isFinite(t)) throw new TypeError("coordinates must be finite numbers") + } + + function F(t, s) { + return (t.datum.datum_type === ft || t.datum.datum_type === dt) && "WGS84" !== s.datumCode || (s.datum.datum_type === ft || s.datum.datum_type === dt) && "WGS84" !== t.datumCode + } + + function D(t, s, i) { + var a; + if (Array.isArray(i) && (i = es(i)), ns(i), t.datum && s.datum && F(t, s) && (i = D(t, a = new Projection("WGS84"), i), t = a), "enu" !== t.axis && (i = hs(t, !1, i)), "longlat" === t.projName) i = { + x: i.x * At, + y: i.y * At, + z: i.z || 0 + }; else if (t.to_meter && (i = { + x: i.x * t.to_meter, + y: i.y * t.to_meter, + z: i.z || 0 + }), !(i = t.inverse(i))) return; + if (t.from_greenwich && (i.x += t.from_greenwich), i = as(t.datum, s.datum, i)) return s.from_greenwich && (i = { + x: i.x - s.from_greenwich, + y: i.y, + z: i.z || 0 + }), "longlat" === s.projName ? i = { + x: i.x * Et, + y: i.y * Et, + z: i.z || 0 + } : (i = s.forward(i), s.to_meter && (i = { + x: i.x / s.to_meter, + y: i.y / s.to_meter, + z: i.z || 0 + })), "enu" !== s.axis ? hs(s, !0, i) : i + } + + function U(t, s, i) { + var a, h, e; + return Array.isArray(i) ? (a = D(t, s, i) || { + x: NaN, + y: NaN + }, i.length > 2 ? void 0 !== t.name && "geocent" === t.name || void 0 !== s.name && "geocent" === s.name ? "number" == typeof a.z ? [a.x, a.y, a.z].concat(i.splice(3)) : [a.x, a.y, i[2]].concat(i.splice(3)) : [a.x, a.y].concat(i.splice(2)) : [a.x, a.y]) : (h = D(t, s, i), 2 === (e = Object.keys(i)).length ? h : (e.forEach(function (a) { + if (void 0 !== t.name && "geocent" === t.name || void 0 !== s.name && "geocent" === s.name) { + if ("x" === a || "y" === a || "z" === a) return + } else if ("x" === a || "y" === a) return; + h[a] = i[a] + }), h)) + } + + function Q(t) { + return t instanceof Projection ? t : t.oProj ? t.oProj : Projection(t) + } + + function W(t, s, i) { + t = Q(t); + var a, h = !1; + return void 0 === s ? (s = t, t = rs, h = !0) : (void 0 !== s.x || Array.isArray(s)) && (i = s, s = t, t = rs, h = !0), s = Q(s), i ? U(t, s, i) : (a = { + forward: function (i) { + return U(t, s, i) + }, inverse: function (i) { + return U(s, t, i) + } + }, h && (a.oProj = s), a) + } + + function H(t, s) { + return s = s || 5, $(V({lat: t[1], lon: t[0]}), s) + } + + function X(t) { + var s = Z(at(t.toUpperCase())); + return s.lat && s.lon ? [s.lon, s.lat] : [(s.left + s.right) / 2, (s.top + s.bottom) / 2] + } + + function J(t) { + return t * (Math.PI / 180) + } + + function K(t) { + return t / Math.PI * 180 + } + + function V(t) { + var s, i, a, h, e, n, r, o = t.lat, l = t.lon, c = 6378137, u = J(o), M = J(l); + r = Math.floor((l + 180) / 6) + 1, 180 === l && (r = 60), o >= 56 && o < 64 && l >= 3 && l < 12 && (r = 32), o >= 72 && o < 84 && (l >= 0 && l < 9 ? r = 31 : l >= 9 && l < 21 ? r = 33 : l >= 21 && l < 33 ? r = 35 : l >= 33 && l < 42 && (r = 37)), n = J(6 * (r - 1) - 180 + 3), s = c / Math.sqrt(1 - .00669438 * Math.sin(u) * Math.sin(u)), i = Math.tan(u) * Math.tan(u), a = .006739496752268451 * Math.cos(u) * Math.cos(u); + var f = .9996 * s * ((h = Math.cos(u) * (M - n)) + (1 - i + a) * h * h * h / 6 + (5 - 18 * i + i * i + 72 * a - .39089081163157013) * h * h * h * h * h / 120) + 5e5, + d = .9996 * ((e = c * (.9983242984503243 * u - .002514607064228144 * Math.sin(2 * u) + 2639046602129982e-21 * Math.sin(4 * u) - 3.418046101696858e-9 * Math.sin(6 * u))) + s * Math.tan(u) * (h * h / 2 + (5 - i + 9 * a + 4 * a * a) * h * h * h * h / 24 + (61 - 58 * i + i * i + 600 * a - 2.2240339282485886) * h * h * h * h * h * h / 720)); + return o < 0 && (d += 1e7), {northing: Math.round(d), easting: Math.round(f), zoneNumber: r, zoneLetter: Y(o)} + } + + function Z(t) { + var s = t.northing, i = t.easting, a = t.zoneLetter, h = t.zoneNumber; + if (h < 0 || h > 60) return null; + var e, n, r, o, l, c, u, M, f = 6378137, d = (1 - Math.sqrt(.99330562)) / (1 + Math.sqrt(.99330562)), + m = i - 5e5, p = s; + a < "N" && (p -= 1e7), c = 6 * (h - 1) - 180 + 3, M = (u = p / .9996 / 6367449.145945056) + (3 * d / 2 - 27 * d * d * d / 32) * Math.sin(2 * u) + (21 * d * d / 16 - 55 * d * d * d * d / 32) * Math.sin(4 * u) + 151 * d * d * d / 96 * Math.sin(6 * u), e = f / Math.sqrt(1 - .00669438 * Math.sin(M) * Math.sin(M)), n = Math.tan(M) * Math.tan(M), r = .006739496752268451 * Math.cos(M) * Math.cos(M), o = .99330562 * f / Math.pow(1 - .00669438 * Math.sin(M) * Math.sin(M), 1.5), l = m / (.9996 * e); + var y = M - e * Math.tan(M) / o * (l * l / 2 - (5 + 3 * n + 10 * r - 4 * r * r - .06065547077041606) * l * l * l * l / 24 + (61 + 90 * n + 298 * r + 45 * n * n - 1.6983531815716497 - 3 * r * r) * l * l * l * l * l * l / 720); + y = K(y); + var _ = (l - (1 + 2 * n + r) * l * l * l / 6 + (5 - 2 * r + 28 * n - 3 * r * r + .05391597401814761 + 24 * n * n) * l * l * l * l * l / 120) / Math.cos(M); + _ = c + K(_); + var x; + if (t.accuracy) { + var g = Z({ + northing: t.northing + t.accuracy, + easting: t.easting + t.accuracy, + zoneLetter: t.zoneLetter, + zoneNumber: t.zoneNumber + }); + x = {top: g.lat, right: g.lon, bottom: y, left: _} + } else x = {lat: y, lon: _}; + return x + } + + function Y(t) { + var s = "Z"; + return 84 >= t && t >= 72 ? s = "X" : 72 > t && t >= 64 ? s = "W" : 64 > t && t >= 56 ? s = "V" : 56 > t && t >= 48 ? s = "U" : 48 > t && t >= 40 ? s = "T" : 40 > t && t >= 32 ? s = "S" : 32 > t && t >= 24 ? s = "R" : 24 > t && t >= 16 ? s = "Q" : 16 > t && t >= 8 ? s = "P" : 8 > t && t >= 0 ? s = "N" : 0 > t && t >= -8 ? s = "M" : -8 > t && t >= -16 ? s = "L" : -16 > t && t >= -24 ? s = "K" : -24 > t && t >= -32 ? s = "J" : -32 > t && t >= -40 ? s = "H" : -40 > t && t >= -48 ? s = "G" : -48 > t && t >= -56 ? s = "F" : -56 > t && t >= -64 ? s = "E" : -64 > t && t >= -72 ? s = "D" : -72 > t && t >= -80 && (s = "C"), s + } + + function $(t, s) { + var i = "00000" + t.easting, a = "00000" + t.northing; + return t.zoneNumber + t.zoneLetter + tt(t.easting, t.northing, t.zoneNumber) + i.substr(i.length - 5, s) + a.substr(a.length - 5, s) + } + + function tt(t, s, i) { + var a = st(i); + return it(Math.floor(t / 1e5), Math.floor(s / 1e5) % 20, a) + } + + function st(t) { + var s = t % os; + return 0 === s && (s = os), s + } + + function it(t, s, i) { + var a = i - 1, h = ls.charCodeAt(a), e = cs.charCodeAt(a), n = h + t - 1, r = e + s, o = !1; + return n > ms && (n = n - ms + us - 1, o = !0), (n === Ms || h < Ms && n > Ms || (n > Ms || h < Ms) && o) && n++, (n === fs || h < fs && n > fs || (n > fs || h < fs) && o) && ++n === Ms && n++, n > ms && (n = n - ms + us - 1), r > ds ? (r = r - ds + us - 1, o = !0) : o = !1, (r === Ms || e < Ms && r > Ms || (r > Ms || e < Ms) && o) && r++, (r === fs || e < fs && r > fs || (r > fs || e < fs) && o) && ++r === Ms && r++, r > ds && (r = r - ds + us - 1), String.fromCharCode(n) + String.fromCharCode(r) + } + + function at(t) { + if (t && 0 === t.length) throw"MGRSPoint coverting from nothing"; + for (var s, i = t.length, a = null, h = "", e = 0; !/[A-Z]/.test(s = t.charAt(e));) { + if (e >= 2) throw"MGRSPoint bad conversion from: " + t; + h += s, e++ + } + var n = parseInt(h, 10); + if (0 === e || e + 3 > i) throw"MGRSPoint bad conversion from: " + t; + var r = t.charAt(e++); + if (r <= "A" || "B" === r || "Y" === r || r >= "Z" || "I" === r || "O" === r) throw"MGRSPoint zone letter " + r + " not handled: " + t; + a = t.substring(e, e += 2); + for (var o = st(n), l = ht(a.charAt(0), o), c = et(a.charAt(1), o); c < nt(r);) c += 2e6; + var u = i - e; + if (u % 2 != 0) throw"MGRSPoint has to have an even number \nof digits after the zone letter and two 100km letters - front \nhalf for easting meters, second half for \nnorthing meters" + t; + var M, f, d, m, p, y = u / 2, _ = 0, x = 0; + return y > 0 && (M = 1e5 / Math.pow(10, y), f = t.substring(e, e + y), _ = parseFloat(f) * M, d = t.substring(e + y), x = parseFloat(d) * M), m = _ + l, p = x + c, { + easting: m, + northing: p, + zoneLetter: r, + zoneNumber: n, + accuracy: M + } + } + + function ht(t, s) { + for (var i = ls.charCodeAt(s - 1), a = 1e5, h = !1; i !== t.charCodeAt(0);) { + if (++i === Ms && i++, i === fs && i++, i > ms) { + if (h) throw"Bad character: " + t; + i = us, h = !0 + } + a += 1e5 + } + return a + } + + function et(t, s) { + if (t > "V") throw"MGRSPoint given invalid Northing " + t; + for (var i = cs.charCodeAt(s - 1), a = 0, h = !1; i !== t.charCodeAt(0);) { + if (++i === Ms && i++, i === fs && i++, i > ds) { + if (h) throw"Bad character: " + t; + i = us, h = !0 + } + a += 1e5 + } + return a + } + + function nt(t) { + var s; + switch (t) { + case"C": + s = 11e5; + break; + case"D": + s = 2e6; + break; + case"E": + s = 28e5; + break; + case"F": + s = 37e5; + break; + case"G": + s = 46e5; + break; + case"H": + s = 55e5; + break; + case"J": + s = 64e5; + break; + case"K": + s = 73e5; + break; + case"L": + s = 82e5; + break; + case"M": + s = 91e5; + break; + case"N": + s = 0; + break; + case"P": + s = 8e5; + break; + case"Q": + s = 17e5; + break; + case"R": + s = 26e5; + break; + case"S": + s = 35e5; + break; + case"T": + s = 44e5; + break; + case"U": + s = 53e5; + break; + case"V": + s = 62e5; + break; + case"W": + s = 7e6; + break; + case"X": + s = 79e5; + break; + default: + s = -1 + } + if (s >= 0) return s; + throw"Invalid zone letter: " + t + } + + function Point(t, s, i) { + if (!(this instanceof Point)) return new Point(t, s, i); + if (Array.isArray(t)) this.x = t[0], this.y = t[1], this.z = t[2] || 0; else if ("object" == typeof t) this.x = t.x, this.y = t.y, this.z = t.z || 0; else if ("string" == typeof t && void 0 === s) { + var a = t.split(","); + this.x = parseFloat(a[0], 10), this.y = parseFloat(a[1], 10), this.z = parseFloat(a[2], 10) || 0 + } else this.x = t, this.y = s, this.z = i || 0; + console.warn("proj4.Point will be removed in version 3, use proj4.toPoint") + } + + function rt(t) { + var s = ["Hotine_Oblique_Mercator", "Hotine_Oblique_Mercator_Azimuth_Natural_Origin"], + i = "object" == typeof t.PROJECTION ? Object.keys(t.PROJECTION)[0] : t.PROJECTION; + return "no_uoff" in t || "no_off" in t || -1 !== s.indexOf(i) + } + + function ot(t) { + var s, i = []; + return i[0] = t * $s, s = t * t, i[0] += s * ti, i[1] = s * ii, s *= t, i[0] += s * si, i[1] += s * ai, i[2] = s * hi, i + } + + function lt(t, s) { + var i = t + t; + return t + s[0] * Math.sin(i) + s[1] * Math.sin(i + i) + s[2] * Math.sin(i + i + i) + } + + function ct(t, s, i, a) { + var h; + return t < wt ? (a.value = Ai.AREA_0, h = 0) : (h = Math.atan2(s, i), Math.abs(h) <= Nt ? a.value = Ai.AREA_0 : h > Nt && h <= xt + Nt ? (a.value = Ai.AREA_1, h -= xt) : h > xt + Nt || h <= -(xt + Nt) ? (a.value = Ai.AREA_2, h = h >= 0 ? h - Pt : h + Pt) : (a.value = Ai.AREA_3, h += xt)), h + } + + function ut(t, s) { + var i = t + s; + return i < -Pt ? i += Ct : i > +Pt && (i -= Ct), i + } + + function Mt(t, s, i, a) { + for (var h = s; a; --a) { + var e = t(h); + if (h -= e, Math.abs(e) < i) break + } + return h + } + + var ft = 1, dt = 2, mt = 3, pt = 4, yt = 5, _t = 484813681109536e-20, xt = Math.PI / 2, gt = .16666666666666666, + vt = .04722222222222222, bt = .022156084656084655, wt = 1e-10, At = .017453292519943295, Et = 57.29577951308232, + Nt = Math.PI / 4, Ct = 2 * Math.PI, Pt = 3.14159265359, St = {}; + St.greenwich = 0, St.lisbon = -9.131906111111, St.paris = 2.337229166667, St.bogota = -74.080916666667, St.madrid = -3.687938888889, St.rome = 12.452333333333, St.bern = 7.439583333333, St.jakarta = 106.807719444444, St.ferro = -17.666666666667, St.brussels = 4.367975, St.stockholm = 18.058277777778, St.athens = 23.7163375, St.oslo = 10.722916666667; + var It = {ft: {to_meter: .3048}, "us-ft": {to_meter: 1200 / 3937}}, Ot = /[\s_\-\/\(\)]/g, kt = function (s) { + var i, a, h, e = {}, n = s.split("+").map(function (t) { + return t.trim() + }).filter(function (t) { + return t + }).reduce(function (t, s) { + var i = s.split("="); + return i.push(!0), t[i[0].toLowerCase()] = i[1], t + }, {}), r = { + proj: "projName", datum: "datumCode", rf: function (t) { + e.rf = parseFloat(t) + }, lat_0: function (t) { + e.lat0 = t * At + }, lat_1: function (t) { + e.lat1 = t * At + }, lat_2: function (t) { + e.lat2 = t * At + }, lat_ts: function (t) { + e.lat_ts = t * At + }, lon_0: function (t) { + e.long0 = t * At + }, lon_1: function (t) { + e.long1 = t * At + }, lon_2: function (t) { + e.long2 = t * At + }, alpha: function (t) { + e.alpha = parseFloat(t) * At + }, gamma: function (t) { + e.rectified_grid_angle = parseFloat(t) + }, lonc: function (t) { + e.longc = t * At + }, x_0: function (t) { + e.x0 = parseFloat(t) + }, y_0: function (t) { + e.y0 = parseFloat(t) + }, k_0: function (t) { + e.k0 = parseFloat(t) + }, k: function (t) { + e.k0 = parseFloat(t) + }, a: function (t) { + e.a = parseFloat(t) + }, b: function (t) { + e.b = parseFloat(t) + }, r_a: function () { + e.R_A = !0 + }, zone: function (t) { + e.zone = parseInt(t, 10) + }, south: function () { + e.utmSouth = !0 + }, towgs84: function (t) { + e.datum_params = t.split(",").map(function (t) { + return parseFloat(t) + }) + }, to_meter: function (t) { + e.to_meter = parseFloat(t) + }, units: function (s) { + e.units = s; + var i = t(It, s); + i && (e.to_meter = i.to_meter) + }, from_greenwich: function (t) { + e.from_greenwich = t * At + }, pm: function (s) { + var i = t(St, s); + e.from_greenwich = (i || parseFloat(s)) * At + }, nadgrids: function (t) { + "@null" === t ? e.datumCode = "none" : e.nadgrids = t + }, axis: function (t) { + 3 === t.length && -1 !== "ewnsud".indexOf(t.substr(0, 1)) && -1 !== "ewnsud".indexOf(t.substr(1, 1)) && -1 !== "ewnsud".indexOf(t.substr(2, 1)) && (e.axis = t) + }, approx: function () { + e.approx = !0 + } + }; + for (i in n) a = n[i], i in r ? "function" == typeof (h = r[i]) ? h(a) : e[h] = a : e[i] = a; + return "string" == typeof e.datumCode && "WGS84" !== e.datumCode && (e.datumCode = e.datumCode.toLowerCase()), e + }, qt = 1, Rt = /\s/, Tt = /[A-Za-z]/, Lt = /[A-Za-z84]/, Gt = /[,\]]/, jt = /[\d\.E\-\+]/; + s.prototype.readCharicter = function () { + var t = this.text[this.place++]; + if (4 !== this.state) for (; Rt.test(t);) { + if (this.place >= this.text.length) return; + t = this.text[this.place++] + } + switch (this.state) { + case qt: + return this.neutral(t); + case 2: + return this.keyword(t); + case 4: + return this.quoted(t); + case 5: + return this.afterquote(t); + case 3: + return this.number(t); + case-1: + return + } + }, s.prototype.afterquote = function (t) { + if ('"' === t) return this.word += '"', void (this.state = 4); + if (Gt.test(t)) return this.word = this.word.trim(), void this.afterItem(t); + throw new Error("havn't handled \"" + t + '" in afterquote yet, index ' + this.place) + }, s.prototype.afterItem = function (t) { + return "," === t ? (null !== this.word && this.currentObject.push(this.word), this.word = null, void (this.state = qt)) : "]" === t ? (this.level--, null !== this.word && (this.currentObject.push(this.word), this.word = null), this.state = qt, this.currentObject = this.stack.pop(), void (this.currentObject || (this.state = -1))) : void 0 + }, s.prototype.number = function (t) { + if (!jt.test(t)) { + if (Gt.test(t)) return this.word = parseFloat(this.word), void this.afterItem(t); + throw new Error("havn't handled \"" + t + '" in number yet, index ' + this.place) + } + this.word += t + }, s.prototype.quoted = function (t) { + '"' !== t ? this.word += t : this.state = 5 + }, s.prototype.keyword = function (t) { + if (Lt.test(t)) this.word += t; else { + if ("[" === t) { + var s = []; + return s.push(this.word), this.level++, null === this.root ? this.root = s : this.currentObject.push(s), this.stack.push(this.currentObject), this.currentObject = s, void (this.state = qt) + } + if (!Gt.test(t)) throw new Error("havn't handled \"" + t + '" in keyword yet, index ' + this.place); + this.afterItem(t) + } + }, s.prototype.neutral = function (t) { + if (Tt.test(t)) return this.word = t, void (this.state = 2); + if ('"' === t) return this.word = "", void (this.state = 4); + if (jt.test(t)) return this.word = t, void (this.state = 3); + { + if (!Gt.test(t)) throw new Error("havn't handled \"" + t + '" in neutral yet, index ' + this.place); + this.afterItem(t) + } + }, s.prototype.output = function () { + for (; this.place < this.text.length;) this.readCharicter(); + if (-1 === this.state) return this.root; + throw new Error('unable to parse string "' + this.text + '". State is ' + this.state) + }; + var Bt = .017453292519943295, zt = function (t) { + var s = i(t), a = s.shift(), e = s.shift(); + s.unshift(["name", e]), s.unshift(["type", a]); + var n = {}; + return h(s, n), r(n), n + }; + !function (t) { + t("EPSG:4326", "+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"), t("EPSG:4269", "+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"), t("EPSG:3857", "+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"), t.WGS84 = t["EPSG:4326"], t["EPSG:3785"] = t["EPSG:3857"], t.GOOGLE = t["EPSG:3857"], t["EPSG:900913"] = t["EPSG:3857"], t["EPSG:102113"] = t["EPSG:3857"] + }(o); + var Ft = ["PROJECTEDCRS", "PROJCRS", "GEOGCS", "GEOCCS", "PROJCS", "LOCAL_CS", "GEODCRS", "GEODETICCRS", "GEODETICDATUM", "ENGCRS", "ENGINEERINGCRS"], + Dt = ["3857", "900913", "3785", "102113"], Ut = function (t, s) { + t = t || {}; + var i, a; + if (!s) return t; + for (a in s) void 0 !== (i = s[a]) && (t[a] = i); + return t + }, Qt = function (t, s, i) { + var a = t * s; + return i / Math.sqrt(1 - a * a) + }, Wt = function (t) { + return t < 0 ? -1 : 1 + }, Ht = function (t) { + return Math.abs(t) <= Pt ? t : t - Wt(t) * Ct + }, Xt = function (t, s, i) { + var a = t * i, h = .5 * t; + return a = Math.pow((1 - a) / (1 + a), h), Math.tan(.5 * (xt - s)) / a + }, Jt = function (t, s) { + for (var i, a, h = .5 * t, e = xt - 2 * Math.atan(s), n = 0; n <= 15; n++) if (i = t * Math.sin(e), a = xt - 2 * Math.atan(s * Math.pow((1 - i) / (1 + i), h)) - e, e += a, Math.abs(a) <= 1e-10) return e; + return -9999 + }, Kt = [{ + init: function () { + var t = this.b / this.a; + this.es = 1 - t * t, "x0" in this || (this.x0 = 0), "y0" in this || (this.y0 = 0), this.e = Math.sqrt(this.es), this.lat_ts ? this.sphere ? this.k0 = Math.cos(this.lat_ts) : this.k0 = Qt(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)) : this.k0 || (this.k ? this.k0 = this.k : this.k0 = 1) + }, + forward: function (t) { + var s = t.x, i = t.y; + if (i * Et > 90 && i * Et < -90 && s * Et > 180 && s * Et < -180) return null; + var a, h; + if (Math.abs(Math.abs(i) - xt) <= wt) return null; + if (this.sphere) a = this.x0 + this.a * this.k0 * Ht(s - this.long0), h = this.y0 + this.a * this.k0 * Math.log(Math.tan(Nt + .5 * i)); else { + var e = Math.sin(i), n = Xt(this.e, i, e); + a = this.x0 + this.a * this.k0 * Ht(s - this.long0), h = this.y0 - this.a * this.k0 * Math.log(n) + } + return t.x = a, t.y = h, t + }, + inverse: function (t) { + var s, i, a = t.x - this.x0, h = t.y - this.y0; + if (this.sphere) i = xt - 2 * Math.atan(Math.exp(-h / (this.a * this.k0))); else { + var e = Math.exp(-h / (this.a * this.k0)); + if (-9999 === (i = Jt(this.e, e))) return null + } + return s = Ht(this.long0 + a / (this.a * this.k0)), t.x = s, t.y = i, t + }, + names: ["Mercator", "Popular Visualisation Pseudo Mercator", "Mercator_1SP", "Mercator_Auxiliary_Sphere", "merc"] + }, { + init: function () { + }, forward: p, inverse: p, names: ["longlat", "identity"] + }], Vt = {}, Zt = [], Yt = { + start: function () { + Kt.forEach(y) + }, add: y, get: function (t) { + if (!t) return !1; + var s = t.toLowerCase(); + return void 0 !== Vt[s] && Zt[Vt[s]] ? Zt[Vt[s]] : void 0 + } + }, $t = {}; + $t.MERIT = {a: 6378137, rf: 298.257, ellipseName: "MERIT 1983"}, $t.SGS85 = { + a: 6378136, + rf: 298.257, + ellipseName: "Soviet Geodetic System 85" + }, $t.GRS80 = {a: 6378137, rf: 298.257222101, ellipseName: "GRS 1980(IUGG, 1980)"}, $t.IAU76 = { + a: 6378140, + rf: 298.257, + ellipseName: "IAU 1976" + }, $t.airy = {a: 6377563.396, b: 6356256.91, ellipseName: "Airy 1830"}, $t.APL4 = { + a: 6378137, + rf: 298.25, + ellipseName: "Appl. Physics. 1965" + }, $t.NWL9D = {a: 6378145, rf: 298.25, ellipseName: "Naval Weapons Lab., 1965"}, $t.mod_airy = { + a: 6377340.189, + b: 6356034.446, + ellipseName: "Modified Airy" + }, $t.andrae = {a: 6377104.43, rf: 300, ellipseName: "Andrae 1876 (Den., Iclnd.)"}, $t.aust_SA = { + a: 6378160, + rf: 298.25, + ellipseName: "Australian Natl & S. Amer. 1969" + }, $t.GRS67 = {a: 6378160, rf: 298.247167427, ellipseName: "GRS 67(IUGG 1967)"}, $t.bessel = { + a: 6377397.155, + rf: 299.1528128, + ellipseName: "Bessel 1841" + }, $t.bess_nam = {a: 6377483.865, rf: 299.1528128, ellipseName: "Bessel 1841 (Namibia)"}, $t.clrk66 = { + a: 6378206.4, + b: 6356583.8, + ellipseName: "Clarke 1866" + }, $t.clrk80 = {a: 6378249.145, rf: 293.4663, ellipseName: "Clarke 1880 mod."}, $t.clrk58 = { + a: 6378293.645208759, + rf: 294.2606763692654, + ellipseName: "Clarke 1858" + }, $t.CPM = {a: 6375738.7, rf: 334.29, ellipseName: "Comm. des Poids et Mesures 1799"}, $t.delmbr = { + a: 6376428, + rf: 311.5, + ellipseName: "Delambre 1810 (Belgium)" + }, $t.engelis = {a: 6378136.05, rf: 298.2566, ellipseName: "Engelis 1985"}, $t.evrst30 = { + a: 6377276.345, + rf: 300.8017, + ellipseName: "Everest 1830" + }, $t.evrst48 = {a: 6377304.063, rf: 300.8017, ellipseName: "Everest 1948"}, $t.evrst56 = { + a: 6377301.243, + rf: 300.8017, + ellipseName: "Everest 1956" + }, $t.evrst69 = {a: 6377295.664, rf: 300.8017, ellipseName: "Everest 1969"}, $t.evrstSS = { + a: 6377298.556, + rf: 300.8017, + ellipseName: "Everest (Sabah & Sarawak)" + }, $t.fschr60 = {a: 6378166, rf: 298.3, ellipseName: "Fischer (Mercury Datum) 1960"}, $t.fschr60m = { + a: 6378155, + rf: 298.3, + ellipseName: "Fischer 1960" + }, $t.fschr68 = {a: 6378150, rf: 298.3, ellipseName: "Fischer 1968"}, $t.helmert = { + a: 6378200, + rf: 298.3, + ellipseName: "Helmert 1906" + }, $t.hough = {a: 6378270, rf: 297, ellipseName: "Hough"}, $t.intl = { + a: 6378388, + rf: 297, + ellipseName: "International 1909 (Hayford)" + }, $t.kaula = {a: 6378163, rf: 298.24, ellipseName: "Kaula 1961"}, $t.lerch = { + a: 6378139, + rf: 298.257, + ellipseName: "Lerch 1979" + }, $t.mprts = {a: 6397300, rf: 191, ellipseName: "Maupertius 1738"}, $t.new_intl = { + a: 6378157.5, + b: 6356772.2, + ellipseName: "New International 1967" + }, $t.plessis = {a: 6376523, rf: 6355863, ellipseName: "Plessis 1817 (France)"}, $t.krass = { + a: 6378245, + rf: 298.3, + ellipseName: "Krassovsky, 1942" + }, $t.SEasia = {a: 6378155, b: 6356773.3205, ellipseName: "Southeast Asia"}, $t.walbeck = { + a: 6376896, + b: 6355834.8467, + ellipseName: "Walbeck" + }, $t.WGS60 = {a: 6378165, rf: 298.3, ellipseName: "WGS 60"}, $t.WGS66 = { + a: 6378145, + rf: 298.25, + ellipseName: "WGS 66" + }, $t.WGS7 = {a: 6378135, rf: 298.26, ellipseName: "WGS 72"}; + var ts = $t.WGS84 = {a: 6378137, rf: 298.257223563, ellipseName: "WGS 84"}; + $t.sphere = {a: 6370997, b: 6370997, ellipseName: "Normal Sphere (r=6370997)"}; + var ss = {}; + ss.wgs84 = {towgs84: "0,0,0", ellipse: "WGS84", datumName: "WGS84"}, ss.ch1903 = { + towgs84: "674.374,15.056,405.346", + ellipse: "bessel", + datumName: "swiss" + }, ss.ggrs87 = { + towgs84: "-199.87,74.79,246.62", + ellipse: "GRS80", + datumName: "Greek_Geodetic_Reference_System_1987" + }, ss.nad83 = { + towgs84: "0,0,0", + ellipse: "GRS80", + datumName: "North_American_Datum_1983" + }, ss.nad27 = { + nadgrids: "@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat", + ellipse: "clrk66", + datumName: "North_American_Datum_1927" + }, ss.potsdam = { + towgs84: "606.0,23.0,413.0", + ellipse: "bessel", + datumName: "Potsdam Rauenberg 1950 DHDN" + }, ss.carthage = { + towgs84: "-263.0,6.0,431.0", + ellipse: "clark80", + datumName: "Carthage 1934 Tunisia" + }, ss.hermannskogel = { + towgs84: "653.0,-212.0,449.0", + ellipse: "bessel", + datumName: "Hermannskogel" + }, ss.osni52 = { + towgs84: "482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15", + ellipse: "airy", + datumName: "Irish National" + }, ss.ire65 = { + towgs84: "482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15", + ellipse: "mod_airy", + datumName: "Ireland 1965" + }, ss.rassadiran = { + towgs84: "-133.63,-157.5,-158.62", + ellipse: "intl", + datumName: "Rassadiran" + }, ss.nzgd49 = { + towgs84: "59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993", + ellipse: "intl", + datumName: "New Zealand Geodetic Datum 1949" + }, ss.osgb36 = { + towgs84: "446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894", + ellipse: "airy", + datumName: "Airy 1830" + }, ss.s_jtsk = { + towgs84: "589,76,480", + ellipse: "bessel", + datumName: "S-JTSK (Ferro)" + }, ss.beduaram = { + towgs84: "-106,-87,188", + ellipse: "clrk80", + datumName: "Beduaram" + }, ss.gunung_segara = { + towgs84: "-403,684,41", + ellipse: "bessel", + datumName: "Gunung Segara Jakarta" + }, ss.rnb72 = { + towgs84: "106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1", + ellipse: "intl", + datumName: "Reseau National Belge 1972" + }; + var is = {}; + Projection.projections = Yt, Projection.projections.start(); + var as = function (t, s, i) { + if (O(t, s)) return i; + if (t.datum_type === yt || s.datum_type === yt) return i; + var a = t.a, h = t.es; + if (t.datum_type === mt) { + if (0 !== G(t, !1, i)) return; + a = 6378137, h = .0066943799901413165 + } + var e = s.a, n = s.b, r = s.es; + return s.datum_type === mt && (e = 6378137, n = 6356752.314, r = .0066943799901413165), h !== r || a !== e || L(t.datum_type) || L(s.datum_type) ? (i = k(i, h, a), L(t.datum_type) && (i = R(i, t.datum_type, t.datum_params)), L(s.datum_type) && (i = T(i, s.datum_type, s.datum_params)), i = q(i, r, e, n), s.datum_type !== mt || 0 === G(s, !0, i) ? i : void 0) : i + }, hs = function (t, s, i) { + var a, h, e, n = i.x, r = i.y, o = i.z || 0, l = {}; + for (e = 0; e < 3; e++) if (!s || 2 !== e || void 0 !== i.z) switch (0 === e ? (a = n, h = -1 !== "ew".indexOf(t.axis[e]) ? "x" : "y") : 1 === e ? (a = r, h = -1 !== "ns".indexOf(t.axis[e]) ? "y" : "x") : (a = o, h = "z"), t.axis[e]) { + case"e": + l[h] = a; + break; + case"w": + l[h] = -a; + break; + case"n": + l[h] = a; + break; + case"s": + l[h] = -a; + break; + case"u": + void 0 !== i[h] && (l.z = a); + break; + case"d": + void 0 !== i[h] && (l.z = -a); + break; + default: + return null + } + return l + }, es = function (t) { + var s = {x: t[0], y: t[1]}; + return t.length > 2 && (s.z = t[2]), t.length > 3 && (s.m = t[3]), s + }, ns = function (t) { + z(t.x), z(t.y) + }, rs = Projection("WGS84"), os = 6, ls = "AJSAJS", cs = "AFAFAF", us = 65, Ms = 73, fs = 79, ds = 86, ms = 90, + ps = { + forward: H, inverse: function (t) { + var s = Z(at(t.toUpperCase())); + return s.lat && s.lon ? [s.lon, s.lat, s.lon, s.lat] : [s.left, s.bottom, s.right, s.top] + }, toPoint: X + }; + Point.fromMGRS = function (t) { + return new Point(X(t)) + }, Point.prototype.toMGRS = function (t) { + return H([this.x, this.y], t) + }; + var ys = .01068115234375, _s = function (t) { + var s = []; + s[0] = 1 - t * (.25 + t * (.046875 + t * (.01953125 + t * ys))), s[1] = t * (.75 - t * (.046875 + t * (.01953125 + t * ys))); + var i = t * t; + return s[2] = i * (.46875 - t * (.013020833333333334 + .007120768229166667 * t)), i *= t, s[3] = i * (.3645833333333333 - .005696614583333333 * t), s[4] = i * t * .3076171875, s + }, xs = function (t, s, i, a) { + return i *= s, s *= s, a[0] * t - i * (a[1] + s * (a[2] + s * (a[3] + s * a[4]))) + }, gs = function (t, s, i) { + for (var a = 1 / (1 - s), h = t, e = 20; e; --e) { + var n = Math.sin(h), r = 1 - s * n * n; + if (r = (xs(h, n, Math.cos(h), i) - t) * (r * Math.sqrt(r)) * a, h -= r, Math.abs(r) < wt) return h + } + return h + }, vs = { + init: function () { + this.x0 = void 0 !== this.x0 ? this.x0 : 0, this.y0 = void 0 !== this.y0 ? this.y0 : 0, this.long0 = void 0 !== this.long0 ? this.long0 : 0, this.lat0 = void 0 !== this.lat0 ? this.lat0 : 0, this.es && (this.en = _s(this.es), this.ml0 = xs(this.lat0, Math.sin(this.lat0), Math.cos(this.lat0), this.en)) + }, forward: function (t) { + var s, i, a, h = t.x, e = t.y, n = Ht(h - this.long0), r = Math.sin(e), o = Math.cos(e); + if (this.es) { + var l = o * n, c = Math.pow(l, 2), u = this.ep2 * Math.pow(o, 2), M = Math.pow(u, 2), + f = Math.abs(o) > wt ? Math.tan(e) : 0, d = Math.pow(f, 2), m = Math.pow(d, 2); + s = 1 - this.es * Math.pow(r, 2), l /= Math.sqrt(s); + var p = xs(e, r, o, this.en); + i = this.a * (this.k0 * l * (1 + c / 6 * (1 - d + u + c / 20 * (5 - 18 * d + m + 14 * u - 58 * d * u + c / 42 * (61 + 179 * m - m * d - 479 * d))))) + this.x0, a = this.a * (this.k0 * (p - this.ml0 + r * n * l / 2 * (1 + c / 12 * (5 - d + 9 * u + 4 * M + c / 30 * (61 + m - 58 * d + 270 * u - 330 * d * u + c / 56 * (1385 + 543 * m - m * d - 3111 * d)))))) + this.y0 + } else { + var y = o * Math.sin(n); + if (Math.abs(Math.abs(y) - 1) < wt) return 93; + if (i = .5 * this.a * this.k0 * Math.log((1 + y) / (1 - y)) + this.x0, a = o * Math.cos(n) / Math.sqrt(1 - Math.pow(y, 2)), (y = Math.abs(a)) >= 1) { + if (y - 1 > wt) return 93; + a = 0 + } else a = Math.acos(a); + e < 0 && (a = -a), a = this.a * this.k0 * (a - this.lat0) + this.y0 + } + return t.x = i, t.y = a, t + }, inverse: function (t) { + var s, i, a, h, e = (t.x - this.x0) * (1 / this.a), n = (t.y - this.y0) * (1 / this.a); + if (this.es) if (s = this.ml0 + n / this.k0, i = gs(s, this.es, this.en), Math.abs(i) < xt) { + var r = Math.sin(i), o = Math.cos(i), l = Math.abs(o) > wt ? Math.tan(i) : 0, + c = this.ep2 * Math.pow(o, 2), u = Math.pow(c, 2), M = Math.pow(l, 2), f = Math.pow(M, 2); + s = 1 - this.es * Math.pow(r, 2); + var d = e * Math.sqrt(s) / this.k0, m = Math.pow(d, 2); + a = i - (s *= l) * m / (1 - this.es) * .5 * (1 - m / 12 * (5 + 3 * M - 9 * c * M + c - 4 * u - m / 30 * (61 + 90 * M - 252 * c * M + 45 * f + 46 * c - m / 56 * (1385 + 3633 * M + 4095 * f + 1574 * f * M)))), h = Ht(this.long0 + d * (1 - m / 6 * (1 + 2 * M + c - m / 20 * (5 + 28 * M + 24 * f + 8 * c * M + 6 * c - m / 42 * (61 + 662 * M + 1320 * f + 720 * f * M)))) / o) + } else a = xt * Wt(n), h = 0; else { + var p = Math.exp(e / this.k0), y = .5 * (p - 1 / p), _ = this.lat0 + n / this.k0, x = Math.cos(_); + s = Math.sqrt((1 - Math.pow(x, 2)) / (1 + Math.pow(y, 2))), a = Math.asin(s), n < 0 && (a = -a), h = 0 === y && 0 === x ? 0 : Ht(Math.atan2(y, x) + this.long0) + } + return t.x = h, t.y = a, t + }, names: ["Fast_Transverse_Mercator", "Fast Transverse Mercator"] + }, bs = function (t) { + var s = Math.exp(t); + return s = (s - 1 / s) / 2 + }, ws = function (t, s) { + t = Math.abs(t), s = Math.abs(s); + var i = Math.max(t, s), a = Math.min(t, s) / (i || 1); + return i * Math.sqrt(1 + Math.pow(a, 2)) + }, As = function (t) { + var s = 1 + t, i = s - 1; + return 0 === i ? t : t * Math.log(s) / i + }, Es = function (t) { + var s = Math.abs(t); + return s = As(s * (1 + s / (ws(1, s) + 1))), t < 0 ? -s : s + }, Ns = function (t, s) { + for (var i, a = 2 * Math.cos(2 * s), h = t.length - 1, e = t[h], n = 0; --h >= 0;) i = a * e - n + t[h], n = e, e = i; + return s + i * Math.sin(2 * s) + }, Cs = function (t, s) { + for (var i, a = 2 * Math.cos(s), h = t.length - 1, e = t[h], n = 0; --h >= 0;) i = a * e - n + t[h], n = e, e = i; + return Math.sin(s) * i + }, Ps = function (t) { + var s = Math.exp(t); + return s = (s + 1 / s) / 2 + }, Ss = function (t, s, i) { + for (var a, h, e = Math.sin(s), n = Math.cos(s), r = bs(i), o = Ps(i), l = 2 * n * o, c = -2 * e * r, u = t.length - 1, M = t[u], f = 0, d = 0, m = 0; --u >= 0;) a = d, h = f, M = l * (d = M) - a - c * (f = m) + t[u], m = c * d - h + l * f; + return l = e * o, c = n * r, [l * M - c * m, l * m + c * M] + }, Is = { + init: function () { + if (!this.approx && (isNaN(this.es) || this.es <= 0)) throw new Error('Incorrect elliptical usage. Try using the +approx option in the proj string, or PROJECTION["Fast_Transverse_Mercator"] in the WKT.'); + this.approx && (vs.init.apply(this), this.forward = vs.forward, this.inverse = vs.inverse), this.x0 = void 0 !== this.x0 ? this.x0 : 0, this.y0 = void 0 !== this.y0 ? this.y0 : 0, this.long0 = void 0 !== this.long0 ? this.long0 : 0, this.lat0 = void 0 !== this.lat0 ? this.lat0 : 0, this.cgb = [], this.cbg = [], this.utg = [], this.gtu = []; + var t = this.es / (1 + Math.sqrt(1 - this.es)), s = t / (2 - t), i = s; + this.cgb[0] = s * (2 + s * (-2 / 3 + s * (s * (116 / 45 + s * (26 / 45 + s * (-2854 / 675))) - 2))), this.cbg[0] = s * (s * (2 / 3 + s * (4 / 3 + s * (-82 / 45 + s * (32 / 45 + s * (4642 / 4725))))) - 2), i *= s, this.cgb[1] = i * (7 / 3 + s * (s * (-227 / 45 + s * (2704 / 315 + s * (2323 / 945))) - 1.6)), this.cbg[1] = i * (5 / 3 + s * (-16 / 15 + s * (-13 / 9 + s * (904 / 315 + s * (-1522 / 945))))), i *= s, this.cgb[2] = i * (56 / 15 + s * (-136 / 35 + s * (-1262 / 105 + s * (73814 / 2835)))), this.cbg[2] = i * (-26 / 15 + s * (34 / 21 + s * (1.6 + s * (-12686 / 2835)))), i *= s, this.cgb[3] = i * (4279 / 630 + s * (-332 / 35 + s * (-399572 / 14175))), this.cbg[3] = i * (1237 / 630 + s * (s * (-24832 / 14175) - 2.4)), i *= s, this.cgb[4] = i * (4174 / 315 + s * (-144838 / 6237)), this.cbg[4] = i * (-734 / 315 + s * (109598 / 31185)), i *= s, this.cgb[5] = i * (601676 / 22275), this.cbg[5] = i * (444337 / 155925), i = Math.pow(s, 2), this.Qn = this.k0 / (1 + s) * (1 + i * (.25 + i * (1 / 64 + i / 256))), this.utg[0] = s * (s * (2 / 3 + s * (-37 / 96 + s * (1 / 360 + s * (81 / 512 + s * (-96199 / 604800))))) - .5), this.gtu[0] = s * (.5 + s * (-2 / 3 + s * (5 / 16 + s * (41 / 180 + s * (-127 / 288 + s * (7891 / 37800)))))), this.utg[1] = i * (-1 / 48 + s * (-1 / 15 + s * (437 / 1440 + s * (-46 / 105 + s * (1118711 / 3870720))))), this.gtu[1] = i * (13 / 48 + s * (s * (557 / 1440 + s * (281 / 630 + s * (-1983433 / 1935360))) - .6)), i *= s, this.utg[2] = i * (-17 / 480 + s * (37 / 840 + s * (209 / 4480 + s * (-5569 / 90720)))), this.gtu[2] = i * (61 / 240 + s * (-103 / 140 + s * (15061 / 26880 + s * (167603 / 181440)))), i *= s, this.utg[3] = i * (-4397 / 161280 + s * (11 / 504 + s * (830251 / 7257600))), this.gtu[3] = i * (49561 / 161280 + s * (-179 / 168 + s * (6601661 / 7257600))), i *= s, this.utg[4] = i * (-4583 / 161280 + s * (108847 / 3991680)), this.gtu[4] = i * (34729 / 80640 + s * (-3418889 / 1995840)), i *= s, this.utg[5] = -.03233083094085698 * i, this.gtu[5] = .6650675310896665 * i; + var a = Ns(this.cbg, this.lat0); + this.Zb = -this.Qn * (a + Cs(this.gtu, 2 * a)) + }, + forward: function (t) { + var s = Ht(t.x - this.long0), i = t.y; + i = Ns(this.cbg, i); + var a = Math.sin(i), h = Math.cos(i), e = Math.sin(s), n = Math.cos(s); + i = Math.atan2(a, n * h), s = Math.atan2(e * h, ws(a, h * n)), s = Es(Math.tan(s)); + var r = Ss(this.gtu, 2 * i, 2 * s); + i += r[0], s += r[1]; + var o, l; + return Math.abs(s) <= 2.623395162778 ? (o = this.a * (this.Qn * s) + this.x0, l = this.a * (this.Qn * i + this.Zb) + this.y0) : (o = 1 / 0, l = 1 / 0), t.x = o, t.y = l, t + }, + inverse: function (t) { + var s = (t.x - this.x0) * (1 / this.a), i = (t.y - this.y0) * (1 / this.a); + i = (i - this.Zb) / this.Qn, s /= this.Qn; + var a, h; + if (Math.abs(s) <= 2.623395162778) { + var e = Ss(this.utg, 2 * i, 2 * s); + i += e[0], s += e[1], s = Math.atan(bs(s)); + var n = Math.sin(i), r = Math.cos(i), o = Math.sin(s), l = Math.cos(s); + i = Math.atan2(n * l, ws(o, l * r)), s = Math.atan2(o, l * r), a = Ht(s + this.long0), h = Ns(this.cgb, i) + } else a = 1 / 0, h = 1 / 0; + return t.x = a, t.y = h, t + }, + names: ["Extended_Transverse_Mercator", "Extended Transverse Mercator", "etmerc", "Transverse_Mercator", "Transverse Mercator", "tmerc"] + }, Os = function (t, s) { + if (void 0 === t) { + if ((t = Math.floor(30 * (Ht(s) + Math.PI) / Math.PI) + 1) < 0) return 0; + if (t > 60) return 60 + } + return t + }, ks = { + init: function () { + var t = Os(this.zone, this.long0); + if (void 0 === t) throw new Error("unknown utm zone"); + this.lat0 = 0, this.long0 = (6 * Math.abs(t) - 183) * At, this.x0 = 5e5, this.y0 = this.utmSouth ? 1e7 : 0, this.k0 = .9996, Is.init.apply(this), this.forward = Is.forward, this.inverse = Is.inverse + }, names: ["Universal Transverse Mercator System", "utm"], dependsOn: "etmerc" + }, qs = function (t, s) { + return Math.pow((1 - t) / (1 + t), s) + }, Rs = 20, Ts = { + init: function () { + var t = Math.sin(this.lat0), s = Math.cos(this.lat0); + s *= s, this.rc = Math.sqrt(1 - this.es) / (1 - this.es * t * t), this.C = Math.sqrt(1 + this.es * s * s / (1 - this.es)), this.phic0 = Math.asin(t / this.C), this.ratexp = .5 * this.C * this.e, this.K = Math.tan(.5 * this.phic0 + Nt) / (Math.pow(Math.tan(.5 * this.lat0 + Nt), this.C) * qs(this.e * t, this.ratexp)) + }, forward: function (t) { + var s = t.x, i = t.y; + return t.y = 2 * Math.atan(this.K * Math.pow(Math.tan(.5 * i + Nt), this.C) * qs(this.e * Math.sin(i), this.ratexp)) - xt, t.x = this.C * s, t + }, inverse: function (t) { + for (var s = t.x / this.C, i = t.y, a = Math.pow(Math.tan(.5 * i + Nt) / this.K, 1 / this.C), h = Rs; h > 0 && (i = 2 * Math.atan(a * qs(this.e * Math.sin(t.y), -.5 * this.e)) - xt, !(Math.abs(i - t.y) < 1e-14)); --h) t.y = i; + return h ? (t.x = s, t.y = i, t) : null + }, names: ["gauss"] + }, Ls = { + init: function () { + Ts.init.apply(this), this.rc && (this.sinc0 = Math.sin(this.phic0), this.cosc0 = Math.cos(this.phic0), this.R2 = 2 * this.rc, this.title || (this.title = "Oblique Stereographic Alternative")) + }, + forward: function (t) { + var s, i, a, h; + return t.x = Ht(t.x - this.long0), Ts.forward.apply(this, [t]), s = Math.sin(t.y), i = Math.cos(t.y), a = Math.cos(t.x), h = this.k0 * this.R2 / (1 + this.sinc0 * s + this.cosc0 * i * a), t.x = h * i * Math.sin(t.x), t.y = h * (this.cosc0 * s - this.sinc0 * i * a), t.x = this.a * t.x + this.x0, t.y = this.a * t.y + this.y0, t + }, + inverse: function (t) { + var s, i, a, h, e; + if (t.x = (t.x - this.x0) / this.a, t.y = (t.y - this.y0) / this.a, t.x /= this.k0, t.y /= this.k0, e = Math.sqrt(t.x * t.x + t.y * t.y)) { + var n = 2 * Math.atan2(e, this.R2); + s = Math.sin(n), i = Math.cos(n), h = Math.asin(i * this.sinc0 + t.y * s * this.cosc0 / e), a = Math.atan2(t.x * s, e * this.cosc0 * i - t.y * this.sinc0 * s) + } else h = this.phic0, a = 0; + return t.x = a, t.y = h, Ts.inverse.apply(this, [t]), t.x = Ht(t.x + this.long0), t + }, + names: ["Stereographic_North_Pole", "Oblique_Stereographic", "Polar_Stereographic", "sterea", "Oblique Stereographic Alternative", "Double_Stereographic"] + }, Gs = { + init: function () { + this.coslat0 = Math.cos(this.lat0), this.sinlat0 = Math.sin(this.lat0), this.sphere ? 1 === this.k0 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= wt && (this.k0 = .5 * (1 + Wt(this.lat0) * Math.sin(this.lat_ts))) : (Math.abs(this.coslat0) <= wt && (this.lat0 > 0 ? this.con = 1 : this.con = -1), this.cons = Math.sqrt(Math.pow(1 + this.e, 1 + this.e) * Math.pow(1 - this.e, 1 - this.e)), 1 === this.k0 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= wt && (this.k0 = .5 * this.cons * Qt(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)) / Xt(this.e, this.con * this.lat_ts, this.con * Math.sin(this.lat_ts))), this.ms1 = Qt(this.e, this.sinlat0, this.coslat0), this.X0 = 2 * Math.atan(this.ssfn_(this.lat0, this.sinlat0, this.e)) - xt, this.cosX0 = Math.cos(this.X0), this.sinX0 = Math.sin(this.X0)) + }, forward: function (t) { + var s, i, a, h, e, n, r = t.x, o = t.y, l = Math.sin(o), c = Math.cos(o), u = Ht(r - this.long0); + return Math.abs(Math.abs(r - this.long0) - Math.PI) <= wt && Math.abs(o + this.lat0) <= wt ? (t.x = NaN, t.y = NaN, t) : this.sphere ? (s = 2 * this.k0 / (1 + this.sinlat0 * l + this.coslat0 * c * Math.cos(u)), t.x = this.a * s * c * Math.sin(u) + this.x0, t.y = this.a * s * (this.coslat0 * l - this.sinlat0 * c * Math.cos(u)) + this.y0, t) : (i = 2 * Math.atan(this.ssfn_(o, l, this.e)) - xt, h = Math.cos(i), a = Math.sin(i), Math.abs(this.coslat0) <= wt ? (e = Xt(this.e, o * this.con, this.con * l), n = 2 * this.a * this.k0 * e / this.cons, t.x = this.x0 + n * Math.sin(r - this.long0), t.y = this.y0 - this.con * n * Math.cos(r - this.long0), t) : (Math.abs(this.sinlat0) < wt ? (s = 2 * this.a * this.k0 / (1 + h * Math.cos(u)), t.y = s * a) : (s = 2 * this.a * this.k0 * this.ms1 / (this.cosX0 * (1 + this.sinX0 * a + this.cosX0 * h * Math.cos(u))), t.y = s * (this.cosX0 * a - this.sinX0 * h * Math.cos(u)) + this.y0), t.x = s * h * Math.sin(u) + this.x0, t)) + }, inverse: function (t) { + t.x -= this.x0, t.y -= this.y0; + var s, i, a, h, e, n = Math.sqrt(t.x * t.x + t.y * t.y); + if (this.sphere) { + var r = 2 * Math.atan(n / (2 * this.a * this.k0)); + return s = this.long0, i = this.lat0, n <= wt ? (t.x = s, t.y = i, t) : (i = Math.asin(Math.cos(r) * this.sinlat0 + t.y * Math.sin(r) * this.coslat0 / n), s = Ht(Math.abs(this.coslat0) < wt ? this.lat0 > 0 ? this.long0 + Math.atan2(t.x, -1 * t.y) : this.long0 + Math.atan2(t.x, t.y) : this.long0 + Math.atan2(t.x * Math.sin(r), n * this.coslat0 * Math.cos(r) - t.y * this.sinlat0 * Math.sin(r))), t.x = s, t.y = i, t) + } + if (Math.abs(this.coslat0) <= wt) { + if (n <= wt) return i = this.lat0, s = this.long0, t.x = s, t.y = i, t; + t.x *= this.con, t.y *= this.con, a = n * this.cons / (2 * this.a * this.k0), i = this.con * Jt(this.e, a), s = this.con * Ht(this.con * this.long0 + Math.atan2(t.x, -1 * t.y)) + } else h = 2 * Math.atan(n * this.cosX0 / (2 * this.a * this.k0 * this.ms1)), s = this.long0, n <= wt ? e = this.X0 : (e = Math.asin(Math.cos(h) * this.sinX0 + t.y * Math.sin(h) * this.cosX0 / n), s = Ht(this.long0 + Math.atan2(t.x * Math.sin(h), n * this.cosX0 * Math.cos(h) - t.y * this.sinX0 * Math.sin(h)))), i = -1 * Jt(this.e, Math.tan(.5 * (xt + e))); + return t.x = s, t.y = i, t + }, names: ["stere", "Stereographic_South_Pole", "Polar Stereographic (variant B)"], ssfn_: function (t, s, i) { + return s *= i, Math.tan(.5 * (xt + t)) * Math.pow((1 - s) / (1 + s), .5 * i) + } + }, js = { + init: function () { + var t = this.lat0; + this.lambda0 = this.long0; + var s = Math.sin(t), i = this.a, a = 1 / this.rf, h = 2 * a - Math.pow(a, 2), e = this.e = Math.sqrt(h); + this.R = this.k0 * i * Math.sqrt(1 - h) / (1 - h * Math.pow(s, 2)), this.alpha = Math.sqrt(1 + h / (1 - h) * Math.pow(Math.cos(t), 4)), this.b0 = Math.asin(s / this.alpha); + var n = Math.log(Math.tan(Math.PI / 4 + this.b0 / 2)), r = Math.log(Math.tan(Math.PI / 4 + t / 2)), + o = Math.log((1 + e * s) / (1 - e * s)); + this.K = n - this.alpha * r + this.alpha * e / 2 * o + }, forward: function (t) { + var s = Math.log(Math.tan(Math.PI / 4 - t.y / 2)), + i = this.e / 2 * Math.log((1 + this.e * Math.sin(t.y)) / (1 - this.e * Math.sin(t.y))), + a = -this.alpha * (s + i) + this.K, h = 2 * (Math.atan(Math.exp(a)) - Math.PI / 4), + e = this.alpha * (t.x - this.lambda0), + n = Math.atan(Math.sin(e) / (Math.sin(this.b0) * Math.tan(h) + Math.cos(this.b0) * Math.cos(e))), + r = Math.asin(Math.cos(this.b0) * Math.sin(h) - Math.sin(this.b0) * Math.cos(h) * Math.cos(e)); + return t.y = this.R / 2 * Math.log((1 + Math.sin(r)) / (1 - Math.sin(r))) + this.y0, t.x = this.R * n + this.x0, t + }, inverse: function (t) { + for (var s = t.x - this.x0, i = t.y - this.y0, a = s / this.R, h = 2 * (Math.atan(Math.exp(i / this.R)) - Math.PI / 4), e = Math.asin(Math.cos(this.b0) * Math.sin(h) + Math.sin(this.b0) * Math.cos(h) * Math.cos(a)), n = Math.atan(Math.sin(a) / (Math.cos(this.b0) * Math.cos(a) - Math.sin(this.b0) * Math.tan(h))), r = this.lambda0 + n / this.alpha, o = 0, l = e, c = -1e3, u = 0; Math.abs(l - c) > 1e-7;) { + if (++u > 20) return; + o = 1 / this.alpha * (Math.log(Math.tan(Math.PI / 4 + e / 2)) - this.K) + this.e * Math.log(Math.tan(Math.PI / 4 + Math.asin(this.e * Math.sin(l)) / 2)), c = l, l = 2 * Math.atan(Math.exp(o)) - Math.PI / 2 + } + return t.x = r, t.y = l, t + }, names: ["somerc"] + }, Bs = 1e-7, zs = { + init: function () { + var t, s, i, a, h, e, n, r, o, l, c, u = 0, M = 0, f = 0, d = 0, m = 0, p = 0, y = 0; + this.no_off = rt(this), this.no_rot = "no_rot" in this; + var _ = !1; + "alpha" in this && (_ = !0); + var x = !1; + if ("rectified_grid_angle" in this && (x = !0), _ && (y = this.alpha), x && (u = this.rectified_grid_angle * At), _ || x) M = this.longc; else if (f = this.long1, m = this.lat1, d = this.long2, p = this.lat2, Math.abs(m - p) <= Bs || (t = Math.abs(m)) <= Bs || Math.abs(t - xt) <= Bs || Math.abs(Math.abs(this.lat0) - xt) <= Bs || Math.abs(Math.abs(p) - xt) <= Bs) throw new Error; + var g = 1 - this.es; + s = Math.sqrt(g), Math.abs(this.lat0) > wt ? (r = Math.sin(this.lat0), i = Math.cos(this.lat0), t = 1 - this.es * r * r, this.B = i * i, this.B = Math.sqrt(1 + this.es * this.B * this.B / g), this.A = this.B * this.k0 * s / t, (h = (a = this.B * s / (i * Math.sqrt(t))) * a - 1) <= 0 ? h = 0 : (h = Math.sqrt(h), this.lat0 < 0 && (h = -h)), this.E = h += a, this.E *= Math.pow(Xt(this.e, this.lat0, r), this.B)) : (this.B = 1 / s, this.A = this.k0, this.E = a = h = 1), _ || x ? (_ ? (c = Math.asin(Math.sin(y) / a), x || (u = y)) : (c = u, y = Math.asin(a * Math.sin(c))), this.lam0 = M - Math.asin(.5 * (h - 1 / h) * Math.tan(c)) / this.B) : (e = Math.pow(Xt(this.e, m, Math.sin(m)), this.B), n = Math.pow(Xt(this.e, p, Math.sin(p)), this.B), h = this.E / e, o = (n - e) / (n + e), l = ((l = this.E * this.E) - n * e) / (l + n * e), (t = f - d) < -Math.pi ? d -= Ct : t > Math.pi && (d += Ct), this.lam0 = Ht(.5 * (f + d) - Math.atan(l * Math.tan(.5 * this.B * (f - d)) / o) / this.B), c = Math.atan(2 * Math.sin(this.B * Ht(f - this.lam0)) / (h - 1 / h)), u = y = Math.asin(a * Math.sin(c))), this.singam = Math.sin(c), this.cosgam = Math.cos(c), this.sinrot = Math.sin(u), this.cosrot = Math.cos(u), this.rB = 1 / this.B, this.ArB = this.A * this.rB, this.BrA = 1 / this.ArB, this.no_off ? this.u_0 = 0 : (this.u_0 = Math.abs(this.ArB * Math.atan(Math.sqrt(a * a - 1) / Math.cos(y))), this.lat0 < 0 && (this.u_0 = -this.u_0)), h = .5 * c, this.v_pole_n = this.ArB * Math.log(Math.tan(Nt - h)), this.v_pole_s = this.ArB * Math.log(Math.tan(Nt + h)) + }, + forward: function (t) { + var s, i, a, h, e, n, r, o, l = {}; + if (t.x = t.x - this.lam0, Math.abs(Math.abs(t.y) - xt) > wt) { + if (e = this.E / Math.pow(Xt(this.e, t.y, Math.sin(t.y)), this.B), n = 1 / e, s = .5 * (e - n), i = .5 * (e + n), h = Math.sin(this.B * t.x), a = (s * this.singam - h * this.cosgam) / i, Math.abs(Math.abs(a) - 1) < wt) throw new Error; + o = .5 * this.ArB * Math.log((1 - a) / (1 + a)), n = Math.cos(this.B * t.x), r = Math.abs(n) < Bs ? this.A * t.x : this.ArB * Math.atan2(s * this.cosgam + h * this.singam, n) + } else o = t.y > 0 ? this.v_pole_n : this.v_pole_s, r = this.ArB * t.y; + return this.no_rot ? (l.x = r, l.y = o) : (r -= this.u_0, l.x = o * this.cosrot + r * this.sinrot, l.y = r * this.cosrot - o * this.sinrot), l.x = this.a * l.x + this.x0, l.y = this.a * l.y + this.y0, l + }, + inverse: function (t) { + var s, i, a, h, e, n, r, o = {}; + if (t.x = (t.x - this.x0) * (1 / this.a), t.y = (t.y - this.y0) * (1 / this.a), this.no_rot ? (i = t.y, s = t.x) : (i = t.x * this.cosrot - t.y * this.sinrot, s = t.y * this.cosrot + t.x * this.sinrot + this.u_0), a = Math.exp(-this.BrA * i), h = .5 * (a - 1 / a), e = .5 * (a + 1 / a), n = Math.sin(this.BrA * s), r = (n * this.cosgam + h * this.singam) / e, Math.abs(Math.abs(r) - 1) < wt) o.x = 0, o.y = r < 0 ? -xt : xt; else { + if (o.y = this.E / Math.sqrt((1 + r) / (1 - r)), o.y = Jt(this.e, Math.pow(o.y, 1 / this.B)), o.y === 1 / 0) throw new Error; + o.x = -this.rB * Math.atan2(h * this.cosgam - n * this.singam, Math.cos(this.BrA * s)) + } + return o.x += this.lam0, o + }, + names: ["Hotine_Oblique_Mercator", "Hotine Oblique Mercator", "Hotine_Oblique_Mercator_Azimuth_Natural_Origin", "Hotine_Oblique_Mercator_Two_Point_Natural_Origin", "Hotine_Oblique_Mercator_Azimuth_Center", "Oblique_Mercator", "omerc"] + }, Fs = { + init: function () { + if (this.lat2 || (this.lat2 = this.lat1), this.k0 || (this.k0 = 1), this.x0 = this.x0 || 0, this.y0 = this.y0 || 0, !(Math.abs(this.lat1 + this.lat2) < wt)) { + var t = this.b / this.a; + this.e = Math.sqrt(1 - t * t); + var s = Math.sin(this.lat1), i = Math.cos(this.lat1), a = Qt(this.e, s, i), + h = Xt(this.e, this.lat1, s), e = Math.sin(this.lat2), n = Math.cos(this.lat2), + r = Qt(this.e, e, n), o = Xt(this.e, this.lat2, e), l = Xt(this.e, this.lat0, Math.sin(this.lat0)); + Math.abs(this.lat1 - this.lat2) > wt ? this.ns = Math.log(a / r) / Math.log(h / o) : this.ns = s, isNaN(this.ns) && (this.ns = s), this.f0 = a / (this.ns * Math.pow(h, this.ns)), this.rh = this.a * this.f0 * Math.pow(l, this.ns), this.title || (this.title = "Lambert Conformal Conic") + } + }, + forward: function (t) { + var s = t.x, i = t.y; + Math.abs(2 * Math.abs(i) - Math.PI) <= wt && (i = Wt(i) * (xt - 2 * wt)); + var a, h, e = Math.abs(Math.abs(i) - xt); + if (e > wt) a = Xt(this.e, i, Math.sin(i)), h = this.a * this.f0 * Math.pow(a, this.ns); else { + if ((e = i * this.ns) <= 0) return null; + h = 0 + } + var n = this.ns * Ht(s - this.long0); + return t.x = this.k0 * (h * Math.sin(n)) + this.x0, t.y = this.k0 * (this.rh - h * Math.cos(n)) + this.y0, t + }, + inverse: function (t) { + var s, i, a, h, e, n = (t.x - this.x0) / this.k0, r = this.rh - (t.y - this.y0) / this.k0; + this.ns > 0 ? (s = Math.sqrt(n * n + r * r), i = 1) : (s = -Math.sqrt(n * n + r * r), i = -1); + var o = 0; + if (0 !== s && (o = Math.atan2(i * n, i * r)), 0 !== s || this.ns > 0) { + if (i = 1 / this.ns, a = Math.pow(s / (this.a * this.f0), i), -9999 === (h = Jt(this.e, a))) return null + } else h = -xt; + return e = Ht(o / this.ns + this.long0), t.x = e, t.y = h, t + }, + names: ["Lambert Tangential Conformal Conic Projection", "Lambert_Conformal_Conic", "Lambert_Conformal_Conic_1SP", "Lambert_Conformal_Conic_2SP", "lcc"] + }, Ds = { + init: function () { + this.a = 6377397.155, this.es = .006674372230614, this.e = Math.sqrt(this.es), this.lat0 || (this.lat0 = .863937979737193), this.long0 || (this.long0 = .4334234309119251), this.k0 || (this.k0 = .9999), this.s45 = .785398163397448, this.s90 = 2 * this.s45, this.fi0 = this.lat0, this.e2 = this.es, this.e = Math.sqrt(this.e2), this.alfa = Math.sqrt(1 + this.e2 * Math.pow(Math.cos(this.fi0), 4) / (1 - this.e2)), this.uq = 1.04216856380474, this.u0 = Math.asin(Math.sin(this.fi0) / this.alfa), this.g = Math.pow((1 + this.e * Math.sin(this.fi0)) / (1 - this.e * Math.sin(this.fi0)), this.alfa * this.e / 2), this.k = Math.tan(this.u0 / 2 + this.s45) / Math.pow(Math.tan(this.fi0 / 2 + this.s45), this.alfa) * this.g, this.k1 = this.k0, this.n0 = this.a * Math.sqrt(1 - this.e2) / (1 - this.e2 * Math.pow(Math.sin(this.fi0), 2)), this.s0 = 1.37008346281555, this.n = Math.sin(this.s0), this.ro0 = this.k1 * this.n0 / Math.tan(this.s0), this.ad = this.s90 - this.uq + }, forward: function (t) { + var s, i, a, h, e, n, r, o = t.x, l = t.y, c = Ht(o - this.long0); + return s = Math.pow((1 + this.e * Math.sin(l)) / (1 - this.e * Math.sin(l)), this.alfa * this.e / 2), i = 2 * (Math.atan(this.k * Math.pow(Math.tan(l / 2 + this.s45), this.alfa) / s) - this.s45), a = -c * this.alfa, h = Math.asin(Math.cos(this.ad) * Math.sin(i) + Math.sin(this.ad) * Math.cos(i) * Math.cos(a)), e = Math.asin(Math.cos(i) * Math.sin(a) / Math.cos(h)), n = this.n * e, r = this.ro0 * Math.pow(Math.tan(this.s0 / 2 + this.s45), this.n) / Math.pow(Math.tan(h / 2 + this.s45), this.n), t.y = r * Math.cos(n) / 1, t.x = r * Math.sin(n) / 1, this.czech || (t.y *= -1, t.x *= -1), t + }, inverse: function (t) { + var s, i, a, h, e, n, r, o = t.x; + t.x = t.y, t.y = o, this.czech || (t.y *= -1, t.x *= -1), e = Math.sqrt(t.x * t.x + t.y * t.y), h = Math.atan2(t.y, t.x) / Math.sin(this.s0), a = 2 * (Math.atan(Math.pow(this.ro0 / e, 1 / this.n) * Math.tan(this.s0 / 2 + this.s45)) - this.s45), s = Math.asin(Math.cos(this.ad) * Math.sin(a) - Math.sin(this.ad) * Math.cos(a) * Math.cos(h)), i = Math.asin(Math.cos(a) * Math.sin(h) / Math.cos(s)), t.x = this.long0 - i / this.alfa, n = s, r = 0; + var l = 0; + do { + t.y = 2 * (Math.atan(Math.pow(this.k, -1 / this.alfa) * Math.pow(Math.tan(s / 2 + this.s45), 1 / this.alfa) * Math.pow((1 + this.e * Math.sin(n)) / (1 - this.e * Math.sin(n)), this.e / 2)) - this.s45), Math.abs(n - t.y) < 1e-10 && (r = 1), n = t.y, l += 1 + } while (0 === r && l < 15); + return l >= 15 ? null : t + }, names: ["Krovak", "krovak"] + }, Us = function (t, s, i, a, h) { + return t * h - s * Math.sin(2 * h) + i * Math.sin(4 * h) - a * Math.sin(6 * h) + }, Qs = function (t) { + return 1 - .25 * t * (1 + t / 16 * (3 + 1.25 * t)) + }, Ws = function (t) { + return .375 * t * (1 + .25 * t * (1 + .46875 * t)) + }, Hs = function (t) { + return .05859375 * t * t * (1 + .75 * t) + }, Xs = function (t) { + return t * t * t * (35 / 3072) + }, Js = function (t, s, i) { + var a = s * i; + return t / Math.sqrt(1 - a * a) + }, Ks = function (t) { + return Math.abs(t) < xt ? t : t - Wt(t) * Math.PI + }, Vs = function (t, s, i, a, h) { + var e, n; + e = t / s; + for (var r = 0; r < 15; r++) if (n = (t - (s * e - i * Math.sin(2 * e) + a * Math.sin(4 * e) - h * Math.sin(6 * e))) / (s - 2 * i * Math.cos(2 * e) + 4 * a * Math.cos(4 * e) - 6 * h * Math.cos(6 * e)), e += n, Math.abs(n) <= 1e-10) return e; + return NaN + }, Zs = { + init: function () { + this.sphere || (this.e0 = Qs(this.es), this.e1 = Ws(this.es), this.e2 = Hs(this.es), this.e3 = Xs(this.es), this.ml0 = this.a * Us(this.e0, this.e1, this.e2, this.e3, this.lat0)) + }, forward: function (t) { + var s, i, a = t.x, h = t.y; + if (a = Ht(a - this.long0), this.sphere) s = this.a * Math.asin(Math.cos(h) * Math.sin(a)), i = this.a * (Math.atan2(Math.tan(h), Math.cos(a)) - this.lat0); else { + var e = Math.sin(h), n = Math.cos(h), r = Js(this.a, this.e, e), o = Math.tan(h) * Math.tan(h), + l = a * Math.cos(h), c = l * l, u = this.es * n * n / (1 - this.es); + s = r * l * (1 - c * o * (1 / 6 - (8 - o + 8 * u) * c / 120)), i = this.a * Us(this.e0, this.e1, this.e2, this.e3, h) - this.ml0 + r * e / n * c * (.5 + (5 - o + 6 * u) * c / 24) + } + return t.x = s + this.x0, t.y = i + this.y0, t + }, inverse: function (t) { + t.x -= this.x0, t.y -= this.y0; + var s, i, a = t.x / this.a, h = t.y / this.a; + if (this.sphere) { + var e = h + this.lat0; + s = Math.asin(Math.sin(e) * Math.cos(a)), i = Math.atan2(Math.tan(a), Math.cos(e)) + } else { + var n = this.ml0 / this.a + h, r = Vs(n, this.e0, this.e1, this.e2, this.e3); + if (Math.abs(Math.abs(r) - xt) <= wt) return t.x = this.long0, t.y = xt, h < 0 && (t.y *= -1), t; + var o = Js(this.a, this.e, Math.sin(r)), l = o * o * o / this.a / this.a * (1 - this.es), + c = Math.pow(Math.tan(r), 2), u = a * this.a / o, M = u * u; + s = r - o * Math.tan(r) / l * u * u * (.5 - (1 + 3 * c) * u * u / 24), i = u * (1 - M * (c / 3 + (1 + 3 * c) * c * M / 15)) / Math.cos(r) + } + return t.x = Ht(i + this.long0), t.y = Ks(s), t + }, names: ["Cassini", "Cassini_Soldner", "cass"] + }, Ys = function (t, s) { + var i; + return t > 1e-7 ? (i = t * s, (1 - t * t) * (s / (1 - i * i) - .5 / t * Math.log((1 - i) / (1 + i)))) : 2 * s + }, $s = .3333333333333333, ti = .17222222222222222, si = .10257936507936508, ii = .06388888888888888, + ai = .0664021164021164, hi = .016415012942191543, ei = { + init: function () { + var t = Math.abs(this.lat0); + if (Math.abs(t - xt) < wt ? this.mode = this.lat0 < 0 ? this.S_POLE : this.N_POLE : Math.abs(t) < wt ? this.mode = this.EQUIT : this.mode = this.OBLIQ, this.es > 0) { + var s; + switch (this.qp = Ys(this.e, 1), this.mmf = .5 / (1 - this.es), this.apa = ot(this.es), this.mode) { + case this.N_POLE: + case this.S_POLE: + this.dd = 1; + break; + case this.EQUIT: + this.rq = Math.sqrt(.5 * this.qp), this.dd = 1 / this.rq, this.xmf = 1, this.ymf = .5 * this.qp; + break; + case this.OBLIQ: + this.rq = Math.sqrt(.5 * this.qp), s = Math.sin(this.lat0), this.sinb1 = Ys(this.e, s) / this.qp, this.cosb1 = Math.sqrt(1 - this.sinb1 * this.sinb1), this.dd = Math.cos(this.lat0) / (Math.sqrt(1 - this.es * s * s) * this.rq * this.cosb1), this.ymf = (this.xmf = this.rq) / this.dd, this.xmf *= this.dd + } + } else this.mode === this.OBLIQ && (this.sinph0 = Math.sin(this.lat0), this.cosph0 = Math.cos(this.lat0)) + }, + forward: function (t) { + var s, i, a, h, e, n, r, o, l, c, u = t.x, M = t.y; + if (u = Ht(u - this.long0), this.sphere) { + if (e = Math.sin(M), c = Math.cos(M), a = Math.cos(u), this.mode === this.OBLIQ || this.mode === this.EQUIT) { + if ((i = this.mode === this.EQUIT ? 1 + c * a : 1 + this.sinph0 * e + this.cosph0 * c * a) <= wt) return null; + s = (i = Math.sqrt(2 / i)) * c * Math.sin(u), i *= this.mode === this.EQUIT ? e : this.cosph0 * e - this.sinph0 * c * a + } else if (this.mode === this.N_POLE || this.mode === this.S_POLE) { + if (this.mode === this.N_POLE && (a = -a), Math.abs(M + this.lat0) < wt) return null; + i = Nt - .5 * M, s = (i = 2 * (this.mode === this.S_POLE ? Math.cos(i) : Math.sin(i))) * Math.sin(u), i *= a + } + } else { + switch (r = 0, o = 0, l = 0, a = Math.cos(u), h = Math.sin(u), e = Math.sin(M), n = Ys(this.e, e), this.mode !== this.OBLIQ && this.mode !== this.EQUIT || (r = n / this.qp, o = Math.sqrt(1 - r * r)), this.mode) { + case this.OBLIQ: + l = 1 + this.sinb1 * r + this.cosb1 * o * a; + break; + case this.EQUIT: + l = 1 + o * a; + break; + case this.N_POLE: + l = xt + M, n = this.qp - n; + break; + case this.S_POLE: + l = M - xt, n = this.qp + n + } + if (Math.abs(l) < wt) return null; + switch (this.mode) { + case this.OBLIQ: + case this.EQUIT: + l = Math.sqrt(2 / l), i = this.mode === this.OBLIQ ? this.ymf * l * (this.cosb1 * r - this.sinb1 * o * a) : (l = Math.sqrt(2 / (1 + o * a))) * r * this.ymf, s = this.xmf * l * o * h; + break; + case this.N_POLE: + case this.S_POLE: + n >= 0 ? (s = (l = Math.sqrt(n)) * h, i = a * (this.mode === this.S_POLE ? l : -l)) : s = i = 0 + } + } + return t.x = this.a * s + this.x0, t.y = this.a * i + this.y0, t + }, + inverse: function (t) { + t.x -= this.x0, t.y -= this.y0; + var s, i, a, h, e, n, r, o = t.x / this.a, l = t.y / this.a; + if (this.sphere) { + var c, u = 0, M = 0; + if (c = Math.sqrt(o * o + l * l), (i = .5 * c) > 1) return null; + switch (i = 2 * Math.asin(i), this.mode !== this.OBLIQ && this.mode !== this.EQUIT || (M = Math.sin(i), u = Math.cos(i)), this.mode) { + case this.EQUIT: + i = Math.abs(c) <= wt ? 0 : Math.asin(l * M / c), o *= M, l = u * c; + break; + case this.OBLIQ: + i = Math.abs(c) <= wt ? this.lat0 : Math.asin(u * this.sinph0 + l * M * this.cosph0 / c), o *= M * this.cosph0, l = (u - Math.sin(i) * this.sinph0) * c; + break; + case this.N_POLE: + l = -l, i = xt - i; + break; + case this.S_POLE: + i -= xt + } + s = 0 !== l || this.mode !== this.EQUIT && this.mode !== this.OBLIQ ? Math.atan2(o, l) : 0 + } else { + if (r = 0, this.mode === this.OBLIQ || this.mode === this.EQUIT) { + if (o /= this.dd, l *= this.dd, (n = Math.sqrt(o * o + l * l)) < wt) return t.x = this.long0, t.y = this.lat0, t; + h = 2 * Math.asin(.5 * n / this.rq), a = Math.cos(h), o *= h = Math.sin(h), this.mode === this.OBLIQ ? (r = a * this.sinb1 + l * h * this.cosb1 / n, e = this.qp * r, l = n * this.cosb1 * a - l * this.sinb1 * h) : (r = l * h / n, e = this.qp * r, l = n * a) + } else if (this.mode === this.N_POLE || this.mode === this.S_POLE) { + if (this.mode === this.N_POLE && (l = -l), !(e = o * o + l * l)) return t.x = this.long0, t.y = this.lat0, t; + r = 1 - e / this.qp, this.mode === this.S_POLE && (r = -r) + } + s = Math.atan2(o, l), i = lt(Math.asin(r), this.apa) + } + return t.x = Ht(this.long0 + s), t.y = i, t + }, + names: ["Lambert Azimuthal Equal Area", "Lambert_Azimuthal_Equal_Area", "laea"], + S_POLE: 1, + N_POLE: 2, + EQUIT: 3, + OBLIQ: 4 + }, ni = function (t) { + return Math.abs(t) > 1 && (t = t > 1 ? 1 : -1), Math.asin(t) + }, ri = { + init: function () { + Math.abs(this.lat1 + this.lat2) < wt || (this.temp = this.b / this.a, this.es = 1 - Math.pow(this.temp, 2), this.e3 = Math.sqrt(this.es), this.sin_po = Math.sin(this.lat1), this.cos_po = Math.cos(this.lat1), this.t1 = this.sin_po, this.con = this.sin_po, this.ms1 = Qt(this.e3, this.sin_po, this.cos_po), this.qs1 = Ys(this.e3, this.sin_po, this.cos_po), this.sin_po = Math.sin(this.lat2), this.cos_po = Math.cos(this.lat2), this.t2 = this.sin_po, this.ms2 = Qt(this.e3, this.sin_po, this.cos_po), this.qs2 = Ys(this.e3, this.sin_po, this.cos_po), this.sin_po = Math.sin(this.lat0), this.cos_po = Math.cos(this.lat0), this.t3 = this.sin_po, this.qs0 = Ys(this.e3, this.sin_po, this.cos_po), Math.abs(this.lat1 - this.lat2) > wt ? this.ns0 = (this.ms1 * this.ms1 - this.ms2 * this.ms2) / (this.qs2 - this.qs1) : this.ns0 = this.con, this.c = this.ms1 * this.ms1 + this.ns0 * this.qs1, this.rh = this.a * Math.sqrt(this.c - this.ns0 * this.qs0) / this.ns0) + }, forward: function (t) { + var s = t.x, i = t.y; + this.sin_phi = Math.sin(i), this.cos_phi = Math.cos(i); + var a = Ys(this.e3, this.sin_phi, this.cos_phi), h = this.a * Math.sqrt(this.c - this.ns0 * a) / this.ns0, + e = this.ns0 * Ht(s - this.long0), n = h * Math.sin(e) + this.x0, + r = this.rh - h * Math.cos(e) + this.y0; + return t.x = n, t.y = r, t + }, inverse: function (t) { + var s, i, a, h, e, n; + return t.x -= this.x0, t.y = this.rh - t.y + this.y0, this.ns0 >= 0 ? (s = Math.sqrt(t.x * t.x + t.y * t.y), a = 1) : (s = -Math.sqrt(t.x * t.x + t.y * t.y), a = -1), h = 0, 0 !== s && (h = Math.atan2(a * t.x, a * t.y)), a = s * this.ns0 / this.a, this.sphere ? n = Math.asin((this.c - a * a) / (2 * this.ns0)) : (i = (this.c - a * a) / this.ns0, n = this.phi1z(this.e3, i)), e = Ht(h / this.ns0 + this.long0), t.x = e, t.y = n, t + }, names: ["Albers_Conic_Equal_Area", "Albers", "aea"], phi1z: function (t, s) { + var i, a, h, e, n, r = ni(.5 * s); + if (t < wt) return r; + for (var o = t * t, l = 1; l <= 25; l++) if (i = Math.sin(r), a = Math.cos(r), h = t * i, e = 1 - h * h, n = .5 * e * e / a * (s / (1 - o) - i / e + .5 / t * Math.log((1 - h) / (1 + h))), r += n, Math.abs(n) <= 1e-7) return r; + return null + } + }, oi = { + init: function () { + this.sin_p14 = Math.sin(this.lat0), this.cos_p14 = Math.cos(this.lat0), this.infinity_dist = 1e3 * this.a, this.rc = 1 + }, forward: function (t) { + var s, i, a, h, e, n, r, o = t.x, l = t.y; + return a = Ht(o - this.long0), s = Math.sin(l), i = Math.cos(l), h = Math.cos(a), (e = this.sin_p14 * s + this.cos_p14 * i * h) > 0 || Math.abs(e) <= wt ? (n = this.x0 + 1 * this.a * i * Math.sin(a) / e, r = this.y0 + 1 * this.a * (this.cos_p14 * s - this.sin_p14 * i * h) / e) : (n = this.x0 + this.infinity_dist * i * Math.sin(a), r = this.y0 + this.infinity_dist * (this.cos_p14 * s - this.sin_p14 * i * h)), t.x = n, t.y = r, t + }, inverse: function (t) { + var s, i, a, h, e, n; + return t.x = (t.x - this.x0) / this.a, t.y = (t.y - this.y0) / this.a, t.x /= this.k0, t.y /= this.k0, (s = Math.sqrt(t.x * t.x + t.y * t.y)) ? (h = Math.atan2(s, this.rc), i = Math.sin(h), a = Math.cos(h), n = ni(a * this.sin_p14 + t.y * i * this.cos_p14 / s), e = Math.atan2(t.x * i, s * this.cos_p14 * a - t.y * this.sin_p14 * i), e = Ht(this.long0 + e)) : (n = this.phic0, e = 0), t.x = e, t.y = n, t + }, names: ["gnom"] + }, li = function (t, s) { + var i = 1 - (1 - t * t) / (2 * t) * Math.log((1 - t) / (1 + t)); + if (Math.abs(Math.abs(s) - i) < 1e-6) return s < 0 ? -1 * xt : xt; + for (var a, h, e, n, r = Math.asin(.5 * s), o = 0; o < 30; o++) if (h = Math.sin(r), e = Math.cos(r), n = t * h, a = Math.pow(1 - n * n, 2) / (2 * e) * (s / (1 - t * t) - h / (1 - n * n) + .5 / t * Math.log((1 - n) / (1 + n))), r += a, Math.abs(a) <= 1e-10) return r; + return NaN + }, ci = { + init: function () { + this.sphere || (this.k0 = Qt(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts))) + }, forward: function (t) { + var s, i, a = t.x, h = t.y, e = Ht(a - this.long0); + if (this.sphere) s = this.x0 + this.a * e * Math.cos(this.lat_ts), i = this.y0 + this.a * Math.sin(h) / Math.cos(this.lat_ts); else { + var n = Ys(this.e, Math.sin(h)); + s = this.x0 + this.a * this.k0 * e, i = this.y0 + this.a * n * .5 / this.k0 + } + return t.x = s, t.y = i, t + }, inverse: function (t) { + t.x -= this.x0, t.y -= this.y0; + var s, i; + return this.sphere ? (s = Ht(this.long0 + t.x / this.a / Math.cos(this.lat_ts)), i = Math.asin(t.y / this.a * Math.cos(this.lat_ts))) : (i = li(this.e, 2 * t.y * this.k0 / this.a), s = Ht(this.long0 + t.x / (this.a * this.k0))), t.x = s, t.y = i, t + }, names: ["cea"] + }, ui = { + init: function () { + this.x0 = this.x0 || 0, this.y0 = this.y0 || 0, this.lat0 = this.lat0 || 0, this.long0 = this.long0 || 0, this.lat_ts = this.lat_ts || 0, this.title = this.title || "Equidistant Cylindrical (Plate Carre)", this.rc = Math.cos(this.lat_ts) + }, forward: function (t) { + var s = t.x, i = t.y, a = Ht(s - this.long0), h = Ks(i - this.lat0); + return t.x = this.x0 + this.a * a * this.rc, t.y = this.y0 + this.a * h, t + }, inverse: function (t) { + var s = t.x, i = t.y; + return t.x = Ht(this.long0 + (s - this.x0) / (this.a * this.rc)), t.y = Ks(this.lat0 + (i - this.y0) / this.a), t + }, names: ["Equirectangular", "Equidistant_Cylindrical", "eqc"] + }, Mi = 20, fi = { + init: function () { + this.temp = this.b / this.a, this.es = 1 - Math.pow(this.temp, 2), this.e = Math.sqrt(this.es), this.e0 = Qs(this.es), this.e1 = Ws(this.es), this.e2 = Hs(this.es), this.e3 = Xs(this.es), this.ml0 = this.a * Us(this.e0, this.e1, this.e2, this.e3, this.lat0) + }, forward: function (t) { + var s, i, a, h = t.x, e = t.y, n = Ht(h - this.long0); + if (a = n * Math.sin(e), this.sphere) Math.abs(e) <= wt ? (s = this.a * n, i = -1 * this.a * this.lat0) : (s = this.a * Math.sin(a) / Math.tan(e), i = this.a * (Ks(e - this.lat0) + (1 - Math.cos(a)) / Math.tan(e))); else if (Math.abs(e) <= wt) s = this.a * n, i = -1 * this.ml0; else { + var r = Js(this.a, this.e, Math.sin(e)) / Math.tan(e); + s = r * Math.sin(a), i = this.a * Us(this.e0, this.e1, this.e2, this.e3, e) - this.ml0 + r * (1 - Math.cos(a)) + } + return t.x = s + this.x0, t.y = i + this.y0, t + }, inverse: function (t) { + var s, i, a, h, e, n, r, o, l; + if (a = t.x - this.x0, h = t.y - this.y0, this.sphere) if (Math.abs(h + this.a * this.lat0) <= wt) s = Ht(a / this.a + this.long0), i = 0; else { + n = this.lat0 + h / this.a, r = a * a / this.a / this.a + n * n, o = n; + var c; + for (e = Mi; e; --e) if (c = Math.tan(o), l = -1 * (n * (o * c + 1) - o - .5 * (o * o + r) * c) / ((o - n) / c - 1), o += l, Math.abs(l) <= wt) { + i = o; + break + } + s = Ht(this.long0 + Math.asin(a * Math.tan(o) / this.a) / Math.sin(i)) + } else if (Math.abs(h + this.ml0) <= wt) i = 0, s = Ht(this.long0 + a / this.a); else { + n = (this.ml0 + h) / this.a, r = a * a / this.a / this.a + n * n, o = n; + var u, M, f, d, m; + for (e = Mi; e; --e) if (m = this.e * Math.sin(o), u = Math.sqrt(1 - m * m) * Math.tan(o), M = this.a * Us(this.e0, this.e1, this.e2, this.e3, o), f = this.e0 - 2 * this.e1 * Math.cos(2 * o) + 4 * this.e2 * Math.cos(4 * o) - 6 * this.e3 * Math.cos(6 * o), d = M / this.a, l = (n * (u * d + 1) - d - .5 * u * (d * d + r)) / (this.es * Math.sin(2 * o) * (d * d + r - 2 * n * d) / (4 * u) + (n - d) * (u * f - 2 / Math.sin(2 * o)) - f), o -= l, Math.abs(l) <= wt) { + i = o; + break + } + u = Math.sqrt(1 - this.es * Math.pow(Math.sin(i), 2)) * Math.tan(i), s = Ht(this.long0 + Math.asin(a * u / this.a) / Math.sin(i)) + } + return t.x = s, t.y = i, t + }, names: ["Polyconic", "poly"] + }, di = { + init: function () { + this.A = [], this.A[1] = .6399175073, this.A[2] = -.1358797613, this.A[3] = .063294409, this.A[4] = -.02526853, this.A[5] = .0117879, this.A[6] = -.0055161, this.A[7] = .0026906, this.A[8] = -.001333, this.A[9] = 67e-5, this.A[10] = -34e-5, this.B_re = [], this.B_im = [], this.B_re[1] = .7557853228, this.B_im[1] = 0, this.B_re[2] = .249204646, this.B_im[2] = .003371507, this.B_re[3] = -.001541739, this.B_im[3] = .04105856, this.B_re[4] = -.10162907, this.B_im[4] = .01727609, this.B_re[5] = -.26623489, this.B_im[5] = -.36249218, this.B_re[6] = -.6870983, this.B_im[6] = -1.1651967, this.C_re = [], this.C_im = [], this.C_re[1] = 1.3231270439, this.C_im[1] = 0, this.C_re[2] = -.577245789, this.C_im[2] = -.007809598, this.C_re[3] = .508307513, this.C_im[3] = -.112208952, this.C_re[4] = -.15094762, this.C_im[4] = .18200602, this.C_re[5] = 1.01418179, this.C_im[5] = 1.64497696, this.C_re[6] = 1.9660549, this.C_im[6] = 2.5127645, this.D = [], this.D[1] = 1.5627014243, this.D[2] = .5185406398, this.D[3] = -.03333098, this.D[4] = -.1052906, this.D[5] = -.0368594, this.D[6] = .007317, this.D[7] = .0122, this.D[8] = .00394, this.D[9] = -.0013 + }, forward: function (t) { + var s, i = t.x, a = t.y - this.lat0, h = i - this.long0, e = a / _t * 1e-5, n = h, r = 1, o = 0; + for (s = 1; s <= 10; s++) r *= e, o += this.A[s] * r; + var l, c = o, u = n, M = 1, f = 0, d = 0, m = 0; + for (s = 1; s <= 6; s++) l = f * c + M * u, M = M * c - f * u, f = l, d = d + this.B_re[s] * M - this.B_im[s] * f, m = m + this.B_im[s] * M + this.B_re[s] * f; + return t.x = m * this.a + this.x0, t.y = d * this.a + this.y0, t + }, inverse: function (t) { + var s, i, a = t.x, h = t.y, e = a - this.x0, n = (h - this.y0) / this.a, r = e / this.a, o = 1, l = 0, + c = 0, u = 0; + for (s = 1; s <= 6; s++) i = l * n + o * r, o = o * n - l * r, l = i, c = c + this.C_re[s] * o - this.C_im[s] * l, u = u + this.C_im[s] * o + this.C_re[s] * l; + for (var M = 0; M < this.iterations; M++) { + var f, d = c, m = u, p = n, y = r; + for (s = 2; s <= 6; s++) f = m * c + d * u, d = d * c - m * u, m = f, p += (s - 1) * (this.B_re[s] * d - this.B_im[s] * m), y += (s - 1) * (this.B_im[s] * d + this.B_re[s] * m); + d = 1, m = 0; + var _ = this.B_re[1], x = this.B_im[1]; + for (s = 2; s <= 6; s++) f = m * c + d * u, d = d * c - m * u, m = f, _ += s * (this.B_re[s] * d - this.B_im[s] * m), x += s * (this.B_im[s] * d + this.B_re[s] * m); + var g = _ * _ + x * x; + c = (p * _ + y * x) / g, u = (y * _ - p * x) / g + } + var v = c, b = u, w = 1, A = 0; + for (s = 1; s <= 9; s++) w *= v, A += this.D[s] * w; + var E = this.lat0 + A * _t * 1e5, N = this.long0 + b; + return t.x = N, t.y = E, t + }, names: ["New_Zealand_Map_Grid", "nzmg"] + }, mi = { + init: function () { + }, forward: function (t) { + var s = t.x, i = t.y, a = Ht(s - this.long0), h = this.x0 + this.a * a, + e = this.y0 + this.a * Math.log(Math.tan(Math.PI / 4 + i / 2.5)) * 1.25; + return t.x = h, t.y = e, t + }, inverse: function (t) { + t.x -= this.x0, t.y -= this.y0; + var s = Ht(this.long0 + t.x / this.a), i = 2.5 * (Math.atan(Math.exp(.8 * t.y / this.a)) - Math.PI / 4); + return t.x = s, t.y = i, t + }, names: ["Miller_Cylindrical", "mill"] + }, pi = 20, yi = { + init: function () { + this.sphere ? (this.n = 1, this.m = 0, this.es = 0, this.C_y = Math.sqrt((this.m + 1) / this.n), this.C_x = this.C_y / (this.m + 1)) : this.en = _s(this.es) + }, forward: function (t) { + var s, i, a = t.x, h = t.y; + if (a = Ht(a - this.long0), this.sphere) { + if (this.m) for (var e = this.n * Math.sin(h), n = pi; n; --n) { + var r = (this.m * h + Math.sin(h) - e) / (this.m + Math.cos(h)); + if (h -= r, Math.abs(r) < wt) break + } else h = 1 !== this.n ? Math.asin(this.n * Math.sin(h)) : h; + s = this.a * this.C_x * a * (this.m + Math.cos(h)), i = this.a * this.C_y * h + } else { + var o = Math.sin(h), l = Math.cos(h); + i = this.a * xs(h, o, l, this.en), s = this.a * a * l / Math.sqrt(1 - this.es * o * o) + } + return t.x = s, t.y = i, t + }, inverse: function (t) { + var s, i, a, h; + return t.x -= this.x0, a = t.x / this.a, t.y -= this.y0, s = t.y / this.a, this.sphere ? (s /= this.C_y, a /= this.C_x * (this.m + Math.cos(s)), this.m ? s = ni((this.m * s + Math.sin(s)) / this.n) : 1 !== this.n && (s = ni(Math.sin(s) / this.n)), a = Ht(a + this.long0), s = Ks(s)) : (s = gs(t.y / this.a, this.es, this.en), (h = Math.abs(s)) < xt ? (h = Math.sin(s), i = this.long0 + t.x * Math.sqrt(1 - this.es * h * h) / (this.a * Math.cos(s)), a = Ht(i)) : h - wt < xt && (a = this.long0)), t.x = a, t.y = s, t + }, names: ["Sinusoidal", "sinu"] + }, _i = { + init: function () { + }, forward: function (t) { + for (var s = t.x, i = t.y, a = Ht(s - this.long0), h = i, e = Math.PI * Math.sin(i); ;) { + var n = -(h + Math.sin(h) - e) / (1 + Math.cos(h)); + if (h += n, Math.abs(n) < wt) break + } + h /= 2, Math.PI / 2 - Math.abs(i) < wt && (a = 0); + var r = .900316316158 * this.a * a * Math.cos(h) + this.x0, + o = 1.4142135623731 * this.a * Math.sin(h) + this.y0; + return t.x = r, t.y = o, t + }, inverse: function (t) { + var s, i; + t.x -= this.x0, t.y -= this.y0, i = t.y / (1.4142135623731 * this.a), Math.abs(i) > .999999999999 && (i = .999999999999), s = Math.asin(i); + var a = Ht(this.long0 + t.x / (.900316316158 * this.a * Math.cos(s))); + a < -Math.PI && (a = -Math.PI), a > Math.PI && (a = Math.PI), i = (2 * s + Math.sin(2 * s)) / Math.PI, Math.abs(i) > 1 && (i = 1); + var h = Math.asin(i); + return t.x = a, t.y = h, t + }, names: ["Mollweide", "moll"] + }, xi = { + init: function () { + Math.abs(this.lat1 + this.lat2) < wt || (this.lat2 = this.lat2 || this.lat1, this.temp = this.b / this.a, this.es = 1 - Math.pow(this.temp, 2), this.e = Math.sqrt(this.es), this.e0 = Qs(this.es), this.e1 = Ws(this.es), this.e2 = Hs(this.es), this.e3 = Xs(this.es), this.sinphi = Math.sin(this.lat1), this.cosphi = Math.cos(this.lat1), this.ms1 = Qt(this.e, this.sinphi, this.cosphi), this.ml1 = Us(this.e0, this.e1, this.e2, this.e3, this.lat1), Math.abs(this.lat1 - this.lat2) < wt ? this.ns = this.sinphi : (this.sinphi = Math.sin(this.lat2), this.cosphi = Math.cos(this.lat2), this.ms2 = Qt(this.e, this.sinphi, this.cosphi), this.ml2 = Us(this.e0, this.e1, this.e2, this.e3, this.lat2), this.ns = (this.ms1 - this.ms2) / (this.ml2 - this.ml1)), this.g = this.ml1 + this.ms1 / this.ns, this.ml0 = Us(this.e0, this.e1, this.e2, this.e3, this.lat0), this.rh = this.a * (this.g - this.ml0)) + }, forward: function (t) { + var s, i = t.x, a = t.y; + if (this.sphere) s = this.a * (this.g - a); else { + var h = Us(this.e0, this.e1, this.e2, this.e3, a); + s = this.a * (this.g - h) + } + var e = this.ns * Ht(i - this.long0), n = this.x0 + s * Math.sin(e), + r = this.y0 + this.rh - s * Math.cos(e); + return t.x = n, t.y = r, t + }, inverse: function (t) { + t.x -= this.x0, t.y = this.rh - t.y + this.y0; + var s, i, a, h; + this.ns >= 0 ? (i = Math.sqrt(t.x * t.x + t.y * t.y), s = 1) : (i = -Math.sqrt(t.x * t.x + t.y * t.y), s = -1); + var e = 0; + if (0 !== i && (e = Math.atan2(s * t.x, s * t.y)), this.sphere) return h = Ht(this.long0 + e / this.ns), a = Ks(this.g - i / this.a), t.x = h, t.y = a, t; + var n = this.g - i / this.a; + return a = Vs(n, this.e0, this.e1, this.e2, this.e3), h = Ht(this.long0 + e / this.ns), t.x = h, t.y = a, t + }, names: ["Equidistant_Conic", "eqdc"] + }, gi = { + init: function () { + this.R = this.a + }, forward: function (t) { + var s, i, a = t.x, h = t.y, e = Ht(a - this.long0); + Math.abs(h) <= wt && (s = this.x0 + this.R * e, i = this.y0); + var n = ni(2 * Math.abs(h / Math.PI)); + (Math.abs(e) <= wt || Math.abs(Math.abs(h) - xt) <= wt) && (s = this.x0, i = h >= 0 ? this.y0 + Math.PI * this.R * Math.tan(.5 * n) : this.y0 + Math.PI * this.R * -Math.tan(.5 * n)); + var r = .5 * Math.abs(Math.PI / e - e / Math.PI), o = r * r, l = Math.sin(n), c = Math.cos(n), + u = c / (l + c - 1), M = u * u, f = u * (2 / l - 1), d = f * f, + m = Math.PI * this.R * (r * (u - d) + Math.sqrt(o * (u - d) * (u - d) - (d + o) * (M - d))) / (d + o); + e < 0 && (m = -m), s = this.x0 + m; + var p = o + u; + return m = Math.PI * this.R * (f * p - r * Math.sqrt((d + o) * (o + 1) - p * p)) / (d + o), i = h >= 0 ? this.y0 + m : this.y0 - m, t.x = s, t.y = i, t + }, inverse: function (t) { + var s, i, a, h, e, n, r, o, l, c, u, M, f; + return t.x -= this.x0, t.y -= this.y0, u = Math.PI * this.R, a = t.x / u, h = t.y / u, e = a * a + h * h, n = -Math.abs(h) * (1 + e), r = n - 2 * h * h + a * a, o = -2 * n + 1 + 2 * h * h + e * e, f = h * h / o + (2 * r * r * r / o / o / o - 9 * n * r / o / o) / 27, l = (n - r * r / 3 / o) / o, c = 2 * Math.sqrt(-l / 3), u = 3 * f / l / c, Math.abs(u) > 1 && (u = u >= 0 ? 1 : -1), M = Math.acos(u) / 3, i = t.y >= 0 ? (-c * Math.cos(M + Math.PI / 3) - r / 3 / o) * Math.PI : -(-c * Math.cos(M + Math.PI / 3) - r / 3 / o) * Math.PI, s = Math.abs(a) < wt ? this.long0 : Ht(this.long0 + Math.PI * (e - 1 + Math.sqrt(1 + 2 * (a * a - h * h) + e * e)) / 2 / a), t.x = s, t.y = i, t + }, names: ["Van_der_Grinten_I", "VanDerGrinten", "vandg"] + }, vi = { + init: function () { + this.sin_p12 = Math.sin(this.lat0), this.cos_p12 = Math.cos(this.lat0) + }, forward: function (t) { + var s, i, a, h, e, n, r, o, l, c, u, M, f, d, m, p, y, _, x, g, v, b, w, A = t.x, E = t.y, + N = Math.sin(t.y), C = Math.cos(t.y), P = Ht(A - this.long0); + return this.sphere ? Math.abs(this.sin_p12 - 1) <= wt ? (t.x = this.x0 + this.a * (xt - E) * Math.sin(P), t.y = this.y0 - this.a * (xt - E) * Math.cos(P), t) : Math.abs(this.sin_p12 + 1) <= wt ? (t.x = this.x0 + this.a * (xt + E) * Math.sin(P), t.y = this.y0 + this.a * (xt + E) * Math.cos(P), t) : (_ = this.sin_p12 * N + this.cos_p12 * C * Math.cos(P), p = Math.acos(_), y = p ? p / Math.sin(p) : 1, t.x = this.x0 + this.a * y * C * Math.sin(P), t.y = this.y0 + this.a * y * (this.cos_p12 * N - this.sin_p12 * C * Math.cos(P)), t) : (s = Qs(this.es), i = Ws(this.es), a = Hs(this.es), h = Xs(this.es), Math.abs(this.sin_p12 - 1) <= wt ? (e = this.a * Us(s, i, a, h, xt), n = this.a * Us(s, i, a, h, E), t.x = this.x0 + (e - n) * Math.sin(P), t.y = this.y0 - (e - n) * Math.cos(P), t) : Math.abs(this.sin_p12 + 1) <= wt ? (e = this.a * Us(s, i, a, h, xt), n = this.a * Us(s, i, a, h, E), t.x = this.x0 + (e + n) * Math.sin(P), t.y = this.y0 + (e + n) * Math.cos(P), t) : (r = N / C, o = Js(this.a, this.e, this.sin_p12), l = Js(this.a, this.e, N), c = Math.atan((1 - this.es) * r + this.es * o * this.sin_p12 / (l * C)), u = Math.atan2(Math.sin(P), this.cos_p12 * Math.tan(c) - this.sin_p12 * Math.cos(P)), x = 0 === u ? Math.asin(this.cos_p12 * Math.sin(c) - this.sin_p12 * Math.cos(c)) : Math.abs(Math.abs(u) - Math.PI) <= wt ? -Math.asin(this.cos_p12 * Math.sin(c) - this.sin_p12 * Math.cos(c)) : Math.asin(Math.sin(P) * Math.cos(c) / Math.sin(u)), M = this.e * this.sin_p12 / Math.sqrt(1 - this.es), f = this.e * this.cos_p12 * Math.cos(u) / Math.sqrt(1 - this.es), d = M * f, m = f * f, g = x * x, v = g * x, b = v * x, w = b * x, p = o * x * (1 - g * m * (1 - m) / 6 + v / 8 * d * (1 - 2 * m) + b / 120 * (m * (4 - 7 * m) - 3 * M * M * (1 - 7 * m)) - w / 48 * d), t.x = this.x0 + p * Math.sin(u), t.y = this.y0 + p * Math.cos(u), t)) + }, inverse: function (t) { + t.x -= this.x0, t.y -= this.y0; + var s, i, a, h, e, n, r, o, l, c, u, M, f, d, m, p, y, _, x, g, v, b, w, A; + if (this.sphere) { + if ((s = Math.sqrt(t.x * t.x + t.y * t.y)) > 2 * xt * this.a) return; + return i = s / this.a, a = Math.sin(i), h = Math.cos(i), e = this.long0, Math.abs(s) <= wt ? n = this.lat0 : (n = ni(h * this.sin_p12 + t.y * a * this.cos_p12 / s), r = Math.abs(this.lat0) - xt, e = Ht(Math.abs(r) <= wt ? this.lat0 >= 0 ? this.long0 + Math.atan2(t.x, -t.y) : this.long0 - Math.atan2(-t.x, t.y) : this.long0 + Math.atan2(t.x * a, s * this.cos_p12 * h - t.y * this.sin_p12 * a))), t.x = e, t.y = n, t + } + return o = Qs(this.es), l = Ws(this.es), c = Hs(this.es), u = Xs(this.es), Math.abs(this.sin_p12 - 1) <= wt ? (M = this.a * Us(o, l, c, u, xt), s = Math.sqrt(t.x * t.x + t.y * t.y), f = M - s, n = Vs(f / this.a, o, l, c, u), e = Ht(this.long0 + Math.atan2(t.x, -1 * t.y)), t.x = e, t.y = n, t) : Math.abs(this.sin_p12 + 1) <= wt ? (M = this.a * Us(o, l, c, u, xt), s = Math.sqrt(t.x * t.x + t.y * t.y), f = s - M, n = Vs(f / this.a, o, l, c, u), e = Ht(this.long0 + Math.atan2(t.x, t.y)), t.x = e, t.y = n, t) : (s = Math.sqrt(t.x * t.x + t.y * t.y), p = Math.atan2(t.x, t.y), d = Js(this.a, this.e, this.sin_p12), y = Math.cos(p), _ = this.e * this.cos_p12 * y, x = -_ * _ / (1 - this.es), g = 3 * this.es * (1 - x) * this.sin_p12 * this.cos_p12 * y / (1 - this.es), v = s / d, b = v - x * (1 + x) * Math.pow(v, 3) / 6 - g * (1 + 3 * x) * Math.pow(v, 4) / 24, w = 1 - x * b * b / 2 - v * b * b * b / 6, m = Math.asin(this.sin_p12 * Math.cos(b) + this.cos_p12 * Math.sin(b) * y), e = Ht(this.long0 + Math.asin(Math.sin(p) * Math.sin(b) / Math.cos(m))), A = Math.sin(m), n = Math.atan2((A - this.es * w * this.sin_p12) * Math.tan(m), A * (1 - this.es)), t.x = e, t.y = n, t) + }, names: ["Azimuthal_Equidistant", "aeqd"] + }, bi = { + init: function () { + this.sin_p14 = Math.sin(this.lat0), this.cos_p14 = Math.cos(this.lat0) + }, forward: function (t) { + var s, i, a, h, e, n, r, o = t.x, l = t.y; + return a = Ht(o - this.long0), s = Math.sin(l), i = Math.cos(l), h = Math.cos(a), ((e = this.sin_p14 * s + this.cos_p14 * i * h) > 0 || Math.abs(e) <= wt) && (n = 1 * this.a * i * Math.sin(a), r = this.y0 + 1 * this.a * (this.cos_p14 * s - this.sin_p14 * i * h)), t.x = n, t.y = r, t + }, inverse: function (t) { + var s, i, a, h, e, n, r; + return t.x -= this.x0, t.y -= this.y0, s = Math.sqrt(t.x * t.x + t.y * t.y), i = ni(s / this.a), a = Math.sin(i), h = Math.cos(i), n = this.long0, Math.abs(s) <= wt ? (r = this.lat0, t.x = n, t.y = r, t) : (r = ni(h * this.sin_p14 + t.y * a * this.cos_p14 / s), e = Math.abs(this.lat0) - xt, Math.abs(e) <= wt ? (n = Ht(this.lat0 >= 0 ? this.long0 + Math.atan2(t.x, -t.y) : this.long0 - Math.atan2(-t.x, t.y)), t.x = n, t.y = r, t) : (n = Ht(this.long0 + Math.atan2(t.x * a, s * this.cos_p14 * h - t.y * this.sin_p14 * a)), t.x = n, t.y = r, t)) + }, names: ["ortho"] + }, wi = {FRONT: 1, RIGHT: 2, BACK: 3, LEFT: 4, TOP: 5, BOTTOM: 6}, + Ai = {AREA_0: 1, AREA_1: 2, AREA_2: 3, AREA_3: 4}, Ei = { + init: function () { + this.x0 = this.x0 || 0, this.y0 = this.y0 || 0, this.lat0 = this.lat0 || 0, this.long0 = this.long0 || 0, this.lat_ts = this.lat_ts || 0, this.title = this.title || "Quadrilateralized Spherical Cube", this.lat0 >= xt - Nt / 2 ? this.face = wi.TOP : this.lat0 <= -(xt - Nt / 2) ? this.face = wi.BOTTOM : Math.abs(this.long0) <= Nt ? this.face = wi.FRONT : Math.abs(this.long0) <= xt + Nt ? this.face = this.long0 > 0 ? wi.RIGHT : wi.LEFT : this.face = wi.BACK, 0 !== this.es && (this.one_minus_f = 1 - (this.a - this.b) / this.a, this.one_minus_f_squared = this.one_minus_f * this.one_minus_f) + }, forward: function (t) { + var s, i, a, h, e, n, r = {x: 0, y: 0}, o = {value: 0}; + if (t.x -= this.long0, s = 0 !== this.es ? Math.atan(this.one_minus_f_squared * Math.tan(t.y)) : t.y, i = t.x, this.face === wi.TOP) h = xt - s, i >= Nt && i <= xt + Nt ? (o.value = Ai.AREA_0, a = i - xt) : i > xt + Nt || i <= -(xt + Nt) ? (o.value = Ai.AREA_1, a = i > 0 ? i - Pt : i + Pt) : i > -(xt + Nt) && i <= -Nt ? (o.value = Ai.AREA_2, a = i + xt) : (o.value = Ai.AREA_3, a = i); else if (this.face === wi.BOTTOM) h = xt + s, i >= Nt && i <= xt + Nt ? (o.value = Ai.AREA_0, a = -i + xt) : i < Nt && i >= -Nt ? (o.value = Ai.AREA_1, a = -i) : i < -Nt && i >= -(xt + Nt) ? (o.value = Ai.AREA_2, a = -i - xt) : (o.value = Ai.AREA_3, a = i > 0 ? -i + Pt : -i - Pt); else { + var l, c, u, M, f, d; + this.face === wi.RIGHT ? i = ut(i, +xt) : this.face === wi.BACK ? i = ut(i, +Pt) : this.face === wi.LEFT && (i = ut(i, -xt)), M = Math.sin(s), f = Math.cos(s), d = Math.sin(i), l = f * Math.cos(i), c = f * d, u = M, this.face === wi.FRONT ? a = ct(h = Math.acos(l), u, c, o) : this.face === wi.RIGHT ? a = ct(h = Math.acos(c), u, -l, o) : this.face === wi.BACK ? a = ct(h = Math.acos(-l), u, -c, o) : this.face === wi.LEFT ? a = ct(h = Math.acos(-c), u, l, o) : (h = a = 0, o.value = Ai.AREA_0) + } + return n = Math.atan(12 / Pt * (a + Math.acos(Math.sin(a) * Math.cos(Nt)) - xt)), e = Math.sqrt((1 - Math.cos(h)) / (Math.cos(n) * Math.cos(n)) / (1 - Math.cos(Math.atan(1 / Math.cos(a))))), o.value === Ai.AREA_1 ? n += xt : o.value === Ai.AREA_2 ? n += Pt : o.value === Ai.AREA_3 && (n += 1.5 * Pt), r.x = e * Math.cos(n), r.y = e * Math.sin(n), r.x = r.x * this.a + this.x0, r.y = r.y * this.a + this.y0, t.x = r.x, t.y = r.y, t + }, inverse: function (t) { + var s, i, a, h, e, n, r, o, l, c = {lam: 0, phi: 0}, u = {value: 0}; + if (t.x = (t.x - this.x0) / this.a, t.y = (t.y - this.y0) / this.a, i = Math.atan(Math.sqrt(t.x * t.x + t.y * t.y)), s = Math.atan2(t.y, t.x), t.x >= 0 && t.x >= Math.abs(t.y) ? u.value = Ai.AREA_0 : t.y >= 0 && t.y >= Math.abs(t.x) ? (u.value = Ai.AREA_1, s -= xt) : t.x < 0 && -t.x >= Math.abs(t.y) ? (u.value = Ai.AREA_2, s = s < 0 ? s + Pt : s - Pt) : (u.value = Ai.AREA_3, s += xt), l = Pt / 12 * Math.tan(s), e = Math.sin(l) / (Math.cos(l) - 1 / Math.sqrt(2)), n = Math.atan(e), a = Math.cos(s), h = Math.tan(i), (r = 1 - a * a * h * h * (1 - Math.cos(Math.atan(1 / Math.cos(n))))) < -1 ? r = -1 : r > 1 && (r = 1), this.face === wi.TOP) o = Math.acos(r), c.phi = xt - o, u.value === Ai.AREA_0 ? c.lam = n + xt : u.value === Ai.AREA_1 ? c.lam = n < 0 ? n + Pt : n - Pt : u.value === Ai.AREA_2 ? c.lam = n - xt : c.lam = n; else if (this.face === wi.BOTTOM) o = Math.acos(r), c.phi = o - xt, u.value === Ai.AREA_0 ? c.lam = -n + xt : u.value === Ai.AREA_1 ? c.lam = -n : u.value === Ai.AREA_2 ? c.lam = -n - xt : c.lam = n < 0 ? -n - Pt : -n + Pt; else { + var M, f, d; + l = (M = r) * M, f = (l += (d = l >= 1 ? 0 : Math.sqrt(1 - l) * Math.sin(n)) * d) >= 1 ? 0 : Math.sqrt(1 - l), u.value === Ai.AREA_1 ? (l = f, f = -d, d = l) : u.value === Ai.AREA_2 ? (f = -f, d = -d) : u.value === Ai.AREA_3 && (l = f, f = d, d = -l), this.face === wi.RIGHT ? (l = M, M = -f, f = l) : this.face === wi.BACK ? (M = -M, f = -f) : this.face === wi.LEFT && (l = M, M = f, f = -l), c.phi = Math.acos(-d) - xt, c.lam = Math.atan2(f, M), this.face === wi.RIGHT ? c.lam = ut(c.lam, -xt) : this.face === wi.BACK ? c.lam = ut(c.lam, -Pt) : this.face === wi.LEFT && (c.lam = ut(c.lam, +xt)) + } + if (0 !== this.es) { + var m, p, y; + m = c.phi < 0 ? 1 : 0, p = Math.tan(c.phi), y = this.b / Math.sqrt(p * p + this.one_minus_f_squared), c.phi = Math.atan(Math.sqrt(this.a * this.a - y * y) / (this.one_minus_f * y)), m && (c.phi = -c.phi) + } + return c.lam += this.long0, t.x = c.lam, t.y = c.phi, t + }, names: ["Quadrilateralized Spherical Cube", "Quadrilateralized_Spherical_Cube", "qsc"] + }, + Ni = [[1, 2.2199e-17, -715515e-10, 31103e-10], [.9986, -482243e-9, -24897e-9, -13309e-10], [.9954, -83103e-8, -448605e-10, -9.86701e-7], [.99, -.00135364, -59661e-9, 36777e-10], [.9822, -.00167442, -449547e-11, -572411e-11], [.973, -.00214868, -903571e-10, 1.8736e-8], [.96, -.00305085, -900761e-10, 164917e-11], [.9427, -.00382792, -653386e-10, -26154e-10], [.9216, -.00467746, -10457e-8, 481243e-11], [.8962, -.00536223, -323831e-10, -543432e-11], [.8679, -.00609363, -113898e-9, 332484e-11], [.835, -.00698325, -640253e-10, 9.34959e-7], [.7986, -.00755338, -500009e-10, 9.35324e-7], [.7597, -.00798324, -35971e-9, -227626e-11], [.7186, -.00851367, -701149e-10, -86303e-10], [.6732, -.00986209, -199569e-9, 191974e-10], [.6213, -.010418, 883923e-10, 624051e-11], [.5722, -.00906601, 182e-6, 624051e-11], [.5322, -.00677797, 275608e-9, 624051e-11]], + Ci = [[-5.20417e-18, .0124, 1.21431e-18, -8.45284e-11], [.062, .0124, -1.26793e-9, 4.22642e-10], [.124, .0124, 5.07171e-9, -1.60604e-9], [.186, .0123999, -1.90189e-8, 6.00152e-9], [.248, .0124002, 7.10039e-8, -2.24e-8], [.31, .0123992, -2.64997e-7, 8.35986e-8], [.372, .0124029, 9.88983e-7, -3.11994e-7], [.434, .0123893, -369093e-11, -4.35621e-7], [.4958, .0123198, -102252e-10, -3.45523e-7], [.5571, .0121916, -154081e-10, -5.82288e-7], [.6176, .0119938, -241424e-10, -5.25327e-7], [.6769, .011713, -320223e-10, -5.16405e-7], [.7346, .0113541, -397684e-10, -6.09052e-7], [.7903, .0109107, -489042e-10, -104739e-11], [.8435, .0103431, -64615e-9, -1.40374e-9], [.8936, .00969686, -64636e-9, -8547e-9], [.9394, .00840947, -192841e-9, -42106e-10], [.9761, .00616527, -256e-6, -42106e-10], [1, .00328947, -319159e-9, -42106e-10]], + Pi = .8487, Si = 1.3523, Ii = Et / 5, Oi = 1 / Ii, ki = 18, qi = function (t, s) { + return t[0] + s * (t[1] + s * (t[2] + s * t[3])) + }, Ri = function (t, s) { + return t[1] + s * (2 * t[2] + 3 * s * t[3]) + }, Ti = { + init: function () { + this.x0 = this.x0 || 0, this.y0 = this.y0 || 0, this.long0 = this.long0 || 0, this.es = 0, this.title = this.title || "Robinson" + }, forward: function (t) { + var s = Ht(t.x - this.long0), i = Math.abs(t.y), a = Math.floor(i * Ii); + a < 0 ? a = 0 : a >= ki && (a = ki - 1), i = Et * (i - Oi * a); + var h = {x: qi(Ni[a], i) * s, y: qi(Ci[a], i)}; + return t.y < 0 && (h.y = -h.y), h.x = h.x * this.a * Pi + this.x0, h.y = h.y * this.a * Si + this.y0, h + }, inverse: function (t) { + var s = {x: (t.x - this.x0) / (this.a * Pi), y: Math.abs(t.y - this.y0) / (this.a * Si)}; + if (s.y >= 1) s.x /= Ni[ki][0], s.y = t.y < 0 ? -xt : xt; else { + var i = Math.floor(s.y * ki); + for (i < 0 ? i = 0 : i >= ki && (i = ki - 1); ;) if (Ci[i][0] > s.y) --i; else { + if (!(Ci[i + 1][0] <= s.y)) break; + ++i + } + var a = Ci[i], h = 5 * (s.y - a[0]) / (Ci[i + 1][0] - a[0]); + h = Mt(function (t) { + return (qi(a, t) - s.y) / Ri(a, t) + }, h, wt, 100), s.x /= qi(Ni[i], h), s.y = (5 * i + h) * At, t.y < 0 && (s.y = -s.y) + } + return s.x = Ht(s.x + this.long0), s + }, names: ["Robinson", "robin"] + }, Li = { + init: function () { + this.name = "geocent" + }, forward: function (t) { + return k(t, this.es, this.a) + }, inverse: function (t) { + return q(t, this.es, this.a, this.b) + }, names: ["Geocentric", "geocentric", "geocent", "Geocent"] + }, Gi = {N_POLE: 0, S_POLE: 1, EQUIT: 2, OBLIQ: 3}, ji = { + h: {def: 1e5, num: !0}, + azi: {def: 0, num: !0, degrees: !0}, + tilt: {def: 0, num: !0, degrees: !0}, + long0: {def: 0, num: !0}, + lat0: {def: 0, num: !0} + }, Bi = { + init: function () { + if (Object.keys(ji).forEach(function (t) { + if (void 0 === this[t]) this[t] = ji[t].def; else { + if (ji[t].num && isNaN(this[t])) throw new Error("Invalid parameter value, must be numeric " + t + " = " + this[t]); + ji[t].num && (this[t] = parseFloat(this[t])) + } + ji[t].degrees && (this[t] = this[t] * At) + }.bind(this)), Math.abs(Math.abs(this.lat0) - xt) < wt ? this.mode = this.lat0 < 0 ? Gi.S_POLE : Gi.N_POLE : Math.abs(this.lat0) < wt ? this.mode = Gi.EQUIT : (this.mode = Gi.OBLIQ, this.sinph0 = Math.sin(this.lat0), this.cosph0 = Math.cos(this.lat0)), this.pn1 = this.h / this.a, this.pn1 <= 0 || this.pn1 > 1e10) throw new Error("Invalid height"); + this.p = 1 + this.pn1, this.rp = 1 / this.p, this.h1 = 1 / this.pn1, this.pfact = (this.p + 1) * this.h1, this.es = 0; + var t = this.tilt, s = this.azi; + this.cg = Math.cos(s), this.sg = Math.sin(s), this.cw = Math.cos(t), this.sw = Math.sin(t) + }, forward: function (t) { + t.x -= this.long0; + var s, i, a = Math.sin(t.y), h = Math.cos(t.y), e = Math.cos(t.x); + switch (this.mode) { + case Gi.OBLIQ: + i = this.sinph0 * a + this.cosph0 * h * e; + break; + case Gi.EQUIT: + i = h * e; + break; + case Gi.S_POLE: + i = -a; + break; + case Gi.N_POLE: + i = a + } + switch (i = this.pn1 / (this.p - i), s = i * h * Math.sin(t.x), this.mode) { + case Gi.OBLIQ: + i *= this.cosph0 * a - this.sinph0 * h * e; + break; + case Gi.EQUIT: + i *= a; + break; + case Gi.N_POLE: + i *= -h * e; + break; + case Gi.S_POLE: + i *= h * e + } + var n, r; + return n = i * this.cg + s * this.sg, r = 1 / (n * this.sw * this.h1 + this.cw), s = (s * this.cg - i * this.sg) * this.cw * r, i = n * r, t.x = s * this.a, t.y = i * this.a, t + }, inverse: function (t) { + t.x /= this.a, t.y /= this.a; + var s, i, a, h = {x: t.x, y: t.y}; + a = 1 / (this.pn1 - t.y * this.sw), s = this.pn1 * t.x * a, i = this.pn1 * t.y * this.cw * a, t.x = s * this.cg + i * this.sg, t.y = i * this.cg - s * this.sg; + var e = ws(t.x, t.y); + if (Math.abs(e) < wt) h.x = 0, h.y = t.y; else { + var n, r; + switch (r = 1 - e * e * this.pfact, r = (this.p - Math.sqrt(r)) / (this.pn1 / e + e / this.pn1), n = Math.sqrt(1 - r * r), this.mode) { + case Gi.OBLIQ: + h.y = Math.asin(n * this.sinph0 + t.y * r * this.cosph0 / e), t.y = (n - this.sinph0 * Math.sin(h.y)) * e, t.x *= r * this.cosph0; + break; + case Gi.EQUIT: + h.y = Math.asin(t.y * r / e), t.y = n * e, t.x *= r; + break; + case Gi.N_POLE: + h.y = Math.asin(n), t.y = -t.y; + break; + case Gi.S_POLE: + h.y = -Math.asin(n) + } + h.x = Math.atan2(t.x, t.y) + } + return t.x = h.x + this.long0, t.y = h.y, t + }, names: ["Tilted_Perspective", "tpers"] + }; + return W.defaultDatum = "WGS84", W.Proj = Projection, W.WGS84 = new W.Proj("WGS84"), + W.Point = Point, W.toPoint = es, W.defs = o, W.nadgrid = function (t, s) { + var i = new DataView(s), a = A(i), h = E(i, a); + h.nSubgrids > 1 && console.log("Only single NTv2 subgrids are currently supported, subsequent sub grids are ignored"); + var e = {header: h, subgrids: C(i, h, a)}; + return is[t] = e, e + }, + W.transform = D, W.mgrs = ps, W.version = "2.7.2", function (proj4) { + proj4.Proj.projections.add(vs), + proj4.Proj.projections.add(Is), + proj4.Proj.projections.add(ks), + proj4.Proj.projections.add(Ls), + proj4.Proj.projections.add(Gs), + proj4.Proj.projections.add(js), proj4.Proj.projections.add(zs), proj4.Proj.projections.add(Fs), proj4.Proj.projections.add(Ds), proj4.Proj.projections.add(Zs), proj4.Proj.projections.add(ei), proj4.Proj.projections.add(ri), proj4.Proj.projections.add(oi), proj4.Proj.projections.add(ci), proj4.Proj.projections.add(ui), proj4.Proj.projections.add(fi), proj4.Proj.projections.add(di), proj4.Proj.projections.add(mi), proj4.Proj.projections.add(yi), proj4.Proj.projections.add(_i), proj4.Proj.projections.add(xi), proj4.Proj.projections.add(gi), proj4.Proj.projections.add(vi), proj4.Proj.projections.add(bi), proj4.Proj.projections.add(Ei), proj4.Proj.projections.add(Ti), proj4.Proj.projections.add(Li), proj4.Proj.projections.add(Bi) + }(W), W +}); + +let defs_map = new Map([ + [75, "EPSG:4534"], + [78, "EPSG:4535"], + [81, "EPSG:4536"], + [84, "EPSG:4537"], + [87, "EPSG:4538"], + [90, "EPSG:4539"], + [93, "EPSG:4540"], + [96, "EPSG:4541"], + [99, "EPSG:4542"], + [102, "EPSG:4543"], + [105, "EPSG:4544"], + [108, "EPSG:4545"], + [111, "EPSG:4546"], + [114, "EPSG:4547"], + [117, "EPSG:4548"], + [120, "EPSG:4549"], + [123, "EPSG:4550"], + [126, "EPSG:4551"], + [129, "EPSG:4552"], + [132, "EPSG:4553"], + [135, "EPSG:4554"], +]) + +function defs() { + proj4.defs("EPSG:4326", "+proj=longlat +datum=WGS84 +no_defs"); + defs_map.forEach((t, degrees) => { + proj4.defs( + t, + "+proj=tmerc +lat_0=0 +lon_0=" + degrees + " +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs" + ); + }) + // CGCS2000_to_WGS84(degrees,cscs2000) +} + +function CGCS2000_to_WGS84(degrees, cscs2000=[]) { + defs() + // return cscs2000.length + var wgs84 = proj4.defs("EPSG:4326"); + var cgcs = proj4.defs(defs_map.get(degrees)); + let result=[] + cscs2000.forEach(point=>{ + var east = parseFloat(point[0]); + var north = parseFloat(point[1]); + if (isNaN(east) || !isFinite(east) || isNaN(north) || !isFinite(north)) { + return null; + } + var res = proj4(cgcs, wgs84, [east, north]); + res.push(point[2]) + result.push( + {"lng":Number(res[0].toFixed(12)), + "lat":Number(res[1].toFixed(12)), + "alt":Number(point[2])}) + }) + return JSON.stringify(result) + +} + +function WGS84_to_CGCS2000(degrees, wgs84=[]) { + defs() + var _84 = proj4.defs("EPSG:4326"); + var cgcs = proj4.defs(defs_map.get(degrees)); + let result=[] + wgs84.forEach(point=>{ + let res = proj4(_84, cgcs, [parseFloat(point[0]), parseFloat(point[1])]); + result.push({ + "x":Number(res[0].toFixed(5)), + "y":Number(res[1].toFixed(5)), + "z":Number(point[2]), + }) + }) + return JSON.stringify(result) +} \ No newline at end of file diff --git a/api/v1/common/tool/shp/.hound.yml b/api/v1/common/tool/shp/.hound.yml new file mode 100644 index 0000000..e5c719d --- /dev/null +++ b/api/v1/common/tool/shp/.hound.yml @@ -0,0 +1,2 @@ +go: + enabled: true diff --git a/api/v1/common/tool/shp/.travis.yml b/api/v1/common/tool/shp/.travis.yml new file mode 100644 index 0000000..56d875b --- /dev/null +++ b/api/v1/common/tool/shp/.travis.yml @@ -0,0 +1,19 @@ +language: go +sudo: false + +go: + - 1.8.x + - 1.9.x + - master + +os: + - linux + +before_install: + - go get -t -v ./... + +script: + - go test -race -coverprofile=coverage.txt -covermode=atomic + +after_success: + - bash <(curl -s https://codecov.io/bash) diff --git a/api/v1/common/tool/shp/LICENSE b/api/v1/common/tool/shp/LICENSE new file mode 100644 index 0000000..85c8efe --- /dev/null +++ b/api/v1/common/tool/shp/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Jonas Palm + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/api/v1/common/tool/shp/README.md b/api/v1/common/tool/shp/README.md new file mode 100644 index 0000000..6ce7a30 --- /dev/null +++ b/api/v1/common/tool/shp/README.md @@ -0,0 +1,87 @@ +go-shp +====== + +[![Build Status](https://travis-ci.org/jonas-p/go-shp.svg?branch=master)](https://travis-ci.org/jonas-p/go-shp) +[![Build status](https://ci.appveyor.com/api/projects/status/b64sntax4kxlouxa?svg=true)](https://ci.appveyor.com/project/fawick/go-shp) +[![Go Report Card](https://goreportcard.com/badge/github.com/jonas-p/go-shp)](https://goreportcard.com/report/github.com/jonas-p/go-shp) +[![Codevov](https://codecov.io/gh/jonas-p/go-shp/branch/master/graphs/badge.svg)](https://codecov.io/gh/jonas-p/go-shp) + +Go library for reading and writing ESRI Shapefiles. This is a pure Golang implementation based on the ESRI Shapefile technical description. + +### Usage +#### Installation + + go get github.com/jonas-p/go-shp + +#### Importing + +```go +import "github.com/jonas-p/go-shp" +``` + +### Examples +#### Reading a shapefile + +```go +// open a shapefile for reading +shape, err := shp.Open("points.shp") +if err != nil { log.Fatal(err) } +defer shape.Close() + +// fields from the attribute table (DBF) +fields := shape.Fields() + +// loop through all features in the shapefile +for shape.Next() { + n, p := shape.Shape() + + // print feature + fmt.Println(reflect.TypeOf(p).Elem(), p.BBox()) + + // print attributes + for k, f := range fields { + val := shape.ReadAttribute(n, k) + fmt.Printf("\t%v: %v\n", f, val) + } + fmt.Println() +} +``` + +#### Creating a shapefile + +```go +// points to write +points := []shp.Point{ + shp.Point{10.0, 10.0}, + shp.Point{10.0, 15.0}, + shp.Point{15.0, 15.0}, + shp.Point{15.0, 10.0}, +} + +// fields to write +fields := []shp.Field{ + // String attribute field with length 25 + shp.StringField("NAME", 25), +} + +// create and open a shapefile for writing points +shape, err := shp.Create("points.shp", shp.POINT) +if err != nil { log.Fatal(err) } +defer shape.Close() + +// setup fields for attributes +shape.SetFields(fields) + +// write points and attributes +for n, point := range points { + shape.Write(&point) + + // write attribute for object n for field 0 (NAME) + shape.WriteAttribute(n, 0, "Point " + strconv.Itoa(n + 1)) +} +``` + +### Resources + +- [Documentation on godoc.org](http://godoc.org/github.com/jonas-p/go-shp) +- [ESRI Shapefile Technical Description](http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf) diff --git a/api/v1/common/tool/shp/appveyor.yml b/api/v1/common/tool/shp/appveyor.yml new file mode 100644 index 0000000..9bdc1c6 --- /dev/null +++ b/api/v1/common/tool/shp/appveyor.yml @@ -0,0 +1,26 @@ +clone_folder: c:\go-shp + +environment: + GOPATH: c:\gopath + +branches: + only: + - master + +init: + - ps: >- + $app = Get-WmiObject -Class Win32_Product -Filter "Vendor = 'http://golang.org'" + + if ($app) { + $app.Uninstall() + } + +install: + - rmdir c:\go /s /q + - appveyor DownloadFile https://storage.googleapis.com/golang/go1.9.windows-amd64.msi + - msiexec /i go1.9.windows-amd64.msi /q + - go version + - go env + +build_script: + - go test ./... diff --git a/api/v1/common/tool/shp/errreader.go b/api/v1/common/tool/shp/errreader.go new file mode 100644 index 0000000..4f2d63c --- /dev/null +++ b/api/v1/common/tool/shp/errreader.go @@ -0,0 +1,27 @@ +package shp + +import ( + "fmt" + "io" +) + +// errReader is a helper to perform multiple successive read from another reader +// and do the error checking only once afterwards. It will not perform any new +// reads in case there was an error encountered earlier. +type errReader struct { + io.Reader + e error + n int64 +} + +func (er *errReader) Read(p []byte) (n int, err error) { + if er.e != nil { + return 0, fmt.Errorf("unable to read after previous error: %v", er.e) + } + n, err = er.Reader.Read(p) + if n < len(p) && err != nil { + er.e = err + } + er.n += int64(n) + return n, er.e +} diff --git a/api/v1/common/tool/shp/reader.go b/api/v1/common/tool/shp/reader.go new file mode 100644 index 0000000..951eb17 --- /dev/null +++ b/api/v1/common/tool/shp/reader.go @@ -0,0 +1,253 @@ +package shp + +import ( + "encoding/binary" + "fmt" + "io" + "math" + "os" + "path/filepath" + "strings" +) + +// Reader provides a interface for reading Shapefiles. Calls +// to the Next method will iterate through the objects in the +// Shapefile. After a call to Next the object will be available +// through the Shape method. +type Reader struct { + GeometryType ShapeType + bbox Box + err error + + shp readSeekCloser + shape Shape + num int32 + filename string + filelength int64 + + dbf readSeekCloser + dbfFields []Field + dbfNumRecords int32 + dbfHeaderLength int16 + dbfRecordLength int16 +} + +type readSeekCloser interface { + io.Reader + io.Seeker + io.Closer +} + +// Open opens a Shapefile for reading. +func Open(filename string) (*Reader, error) { + ext := filepath.Ext(filename) + if strings.ToLower(ext) != ".shp" { + return nil, fmt.Errorf("Invalid file extension: %s", filename) + } + shp, err := os.Open(filename) + if err != nil { + return nil, err + } + s := &Reader{filename: strings.TrimSuffix(filename, ext), shp: shp} + return s, s.readHeaders() +} + +// BBox returns the bounding box of the shapefile. +func (r *Reader) BBox() Box { + return r.bbox +} + +// Read and parse headers in the Shapefile. This will +// fill out GeometryType, filelength and bbox. +func (r *Reader) readHeaders() error { + er := &errReader{Reader: r.shp} + // don't trust the the filelength in the header + r.filelength, _ = r.shp.Seek(0, io.SeekEnd) + + var filelength int32 + r.shp.Seek(24, 0) + // file length + binary.Read(er, binary.BigEndian, &filelength) + r.shp.Seek(32, 0) + binary.Read(er, binary.LittleEndian, &r.GeometryType) + r.bbox.MinX = readFloat64(er) + r.bbox.MinY = readFloat64(er) + r.bbox.MaxX = readFloat64(er) + r.bbox.MaxY = readFloat64(er) + r.shp.Seek(100, 0) + return er.e +} + +func readFloat64(r io.Reader) float64 { + var bits uint64 + binary.Read(r, binary.LittleEndian, &bits) + return math.Float64frombits(bits) +} + +// Close closes the Shapefile. +func (r *Reader) Close() error { + if r.err == nil { + r.err = r.shp.Close() + if r.dbf != nil { + r.dbf.Close() + } + } + return r.err +} + +// Shape returns the most recent feature that was read by +// a call to Next. It returns two values, the int is the +// object index starting from zero in the shapefile which +// can be used as row in ReadAttribute, and the Shape is the object. +func (r *Reader) Shape() (int, Shape) { + return int(r.num) - 1, r.shape +} + +// Attribute returns value of the n-th attribute of the most recent feature +// that was read by a call to Next. +func (r *Reader) Attribute(n int) string { + return r.ReadAttribute(int(r.num)-1, n) +} + +// newShape creates a new shape with a given type. +func newShape(shapetype ShapeType) (Shape, error) { + switch shapetype { + case NULL: + return new(Null), nil + case POINT: + return new(Point), nil + case POLYLINE: + return new(PolyLine), nil + case POLYGON: + return new(Polygon), nil + case MULTIPOINT: + return new(MultiPoint), nil + case POINTZ: + return new(PointZ), nil + case POLYLINEZ: + return new(PolyLineZ), nil + case POLYGONZ: + return new(PolygonZ), nil + case MULTIPOINTZ: + return new(MultiPointZ), nil + case POINTM: + return new(PointM), nil + case POLYLINEM: + return new(PolyLineM), nil + case POLYGONM: + return new(PolygonM), nil + case MULTIPOINTM: + return new(MultiPointM), nil + case MULTIPATCH: + return new(MultiPatch), nil + default: + return nil, fmt.Errorf("Unsupported shape type: %v", shapetype) + } +} + +// Next reads in the next Shape in the Shapefile, which +// will then be available through the Shape method. It +// returns false when the reader has reached the end of the +// file or encounters an error. +func (r *Reader) Next() bool { + cur, _ := r.shp.Seek(0, io.SeekCurrent) + if cur >= r.filelength { + return false + } + + var size int32 + var shapetype ShapeType + er := &errReader{Reader: r.shp} + binary.Read(er, binary.BigEndian, &r.num) + binary.Read(er, binary.BigEndian, &size) + binary.Read(er, binary.LittleEndian, &shapetype) + if er.e != nil { + if er.e != io.EOF { + r.err = fmt.Errorf("Error when reading metadata of next shape: %v", er.e) + } else { + r.err = io.EOF + } + return false + } + + var err error + r.shape, err = newShape(shapetype) + if err != nil { + r.err = fmt.Errorf("Error decoding shape type: %v", err) + return false + } + r.shape.read(er) + if er.e != nil { + r.err = fmt.Errorf("Error while reading next shape: %v", er.e) + return false + } + + // move to next object + r.shp.Seek(int64(size)*2+cur+8, 0) + return true +} + +// Opens DBF file using r.filename + "dbf". This method +// will parse the header and fill out all dbf* values int +// the f object. +func (r *Reader) openDbf() (err error) { + if r.dbf != nil { + return + } + + r.dbf, err = os.Open(r.filename + ".dbf") + if err != nil { + return + } + + // read header + r.dbf.Seek(4, io.SeekStart) + binary.Read(r.dbf, binary.LittleEndian, &r.dbfNumRecords) + binary.Read(r.dbf, binary.LittleEndian, &r.dbfHeaderLength) + binary.Read(r.dbf, binary.LittleEndian, &r.dbfRecordLength) + + r.dbf.Seek(20, io.SeekCurrent) // skip padding + numFields := int(math.Floor(float64(r.dbfHeaderLength-33) / 32.0)) + r.dbfFields = make([]Field, numFields) + binary.Read(r.dbf, binary.LittleEndian, &r.dbfFields) + return +} + +// Fields returns a slice of Fields that are present in the +// DBF table. +func (r *Reader) Fields() []Field { + err := r.openDbf() + fmt.Println(err) + if err != nil { + return nil + } // make sure we have dbf file to read from + return r.dbfFields +} + +// Err returns the last non-EOF error encountered. +func (r *Reader) Err() error { + if r.err == io.EOF { + return nil + } + return r.err +} + +// AttributeCount returns number of records in the DBF table. +func (r *Reader) AttributeCount() int { + r.openDbf() // make sure we have a dbf file to read from + return int(r.dbfNumRecords) +} + +// ReadAttribute returns the attribute value at row for field in +// the DBF table as a string. Both values starts at 0. +func (r *Reader) ReadAttribute(row int, field int) string { + r.openDbf() // make sure we have a dbf file to read from + seekTo := 1 + int64(r.dbfHeaderLength) + (int64(row) * int64(r.dbfRecordLength)) + for n := 0; n < field; n++ { + seekTo += int64(r.dbfFields[n].Size) + } + r.dbf.Seek(seekTo, io.SeekStart) + buf := make([]byte, r.dbfFields[field].Size) + r.dbf.Read(buf) + return strings.Trim(string(buf[:]), " ") +} diff --git a/api/v1/common/tool/shp/reader_test.go b/api/v1/common/tool/shp/reader_test.go new file mode 100644 index 0000000..6314029 --- /dev/null +++ b/api/v1/common/tool/shp/reader_test.go @@ -0,0 +1,527 @@ +package shp + +import ( + "bytes" + "io" + "io/ioutil" + "testing" +) + +func pointsEqual(a, b []float64) bool { + if len(a) != len(b) { + return false + } + for k, v := range a { + if v != b[k] { + return false + } + } + return true +} + +func getShapesFromFile(prefix string, t *testing.T) (shapes []Shape) { + filename := prefix + ".shp" + file, err := Open(filename) + if err != nil { + t.Fatal("Failed to open shapefile: " + filename + " (" + err.Error() + ")") + } + defer file.Close() + + for file.Next() { + _, shape := file.Shape() + shapes = append(shapes, shape) + } + if file.Err() != nil { + t.Errorf("Error while getting shapes for %s: %v", prefix, file.Err()) + } + + return shapes +} + +type shapeGetterFunc func(string, *testing.T) []Shape + +type identityTestFunc func(*testing.T, [][]float64, []Shape) + +func testPoint(t *testing.T, points [][]float64, shapes []Shape) { + for n, s := range shapes { + p, ok := s.(*Point) + if !ok { + t.Fatal("Failed to type assert.") + } + if !pointsEqual([]float64{p.X, p.Y}, points[n]) { + t.Error("Points did not match.") + } + } +} + +func testPolyLine(t *testing.T, points [][]float64, shapes []Shape) { + for n, s := range shapes { + p, ok := s.(*PolyLine) + if !ok { + t.Fatal("Failed to type assert.") + } + for k, point := range p.Points { + if !pointsEqual(points[n*3+k], []float64{point.X, point.Y}) { + t.Error("Points did not match.") + } + } + } +} + +func testPolygon(t *testing.T, points [][]float64, shapes []Shape) { + for n, s := range shapes { + p, ok := s.(*Polygon) + if !ok { + t.Fatal("Failed to type assert.") + } + for k, point := range p.Points { + if !pointsEqual(points[n*3+k], []float64{point.X, point.Y}) { + t.Error("Points did not match.") + } + } + } +} + +func testMultiPoint(t *testing.T, points [][]float64, shapes []Shape) { + for n, s := range shapes { + p, ok := s.(*MultiPoint) + if !ok { + t.Fatal("Failed to type assert.") + } + for k, point := range p.Points { + if !pointsEqual(points[n*3+k], []float64{point.X, point.Y}) { + t.Error("Points did not match.") + } + } + } +} + +func testPointZ(t *testing.T, points [][]float64, shapes []Shape) { + for n, s := range shapes { + p, ok := s.(*PointZ) + if !ok { + t.Fatal("Failed to type assert.") + } + if !pointsEqual([]float64{p.X, p.Y, p.Z}, points[n]) { + t.Error("Points did not match.") + } + } +} + +func testPolyLineZ(t *testing.T, points [][]float64, shapes []Shape) { + for n, s := range shapes { + p, ok := s.(*PolyLineZ) + if !ok { + t.Fatal("Failed to type assert.") + } + for k, point := range p.Points { + if !pointsEqual(points[n*3+k], []float64{point.X, point.Y, p.ZArray[k]}) { + t.Error("Points did not match.") + } + } + } +} + +func testPolygonZ(t *testing.T, points [][]float64, shapes []Shape) { + for n, s := range shapes { + p, ok := s.(*PolygonZ) + if !ok { + t.Fatal("Failed to type assert.") + } + for k, point := range p.Points { + if !pointsEqual(points[n*3+k], []float64{point.X, point.Y, p.ZArray[k]}) { + t.Error("Points did not match.") + } + } + } +} + +func testMultiPointZ(t *testing.T, points [][]float64, shapes []Shape) { + for n, s := range shapes { + p, ok := s.(*MultiPointZ) + if !ok { + t.Fatal("Failed to type assert.") + } + for k, point := range p.Points { + if !pointsEqual(points[n*3+k], []float64{point.X, point.Y, p.ZArray[k]}) { + t.Error("Points did not match.") + } + } + } +} + +func testPointM(t *testing.T, points [][]float64, shapes []Shape) { + for n, s := range shapes { + p, ok := s.(*PointM) + if !ok { + t.Fatal("Failed to type assert.") + } + if !pointsEqual([]float64{p.X, p.Y, p.M}, points[n]) { + t.Error("Points did not match.") + } + } +} + +func testPolyLineM(t *testing.T, points [][]float64, shapes []Shape) { + for n, s := range shapes { + p, ok := s.(*PolyLineM) + if !ok { + t.Fatal("Failed to type assert.") + } + for k, point := range p.Points { + if !pointsEqual(points[n*3+k], []float64{point.X, point.Y, p.MArray[k]}) { + t.Error("Points did not match.") + } + } + } +} + +func testPolygonM(t *testing.T, points [][]float64, shapes []Shape) { + for n, s := range shapes { + p, ok := s.(*PolygonM) + if !ok { + t.Fatal("Failed to type assert.") + } + for k, point := range p.Points { + if !pointsEqual(points[n*3+k], []float64{point.X, point.Y, p.MArray[k]}) { + t.Error("Points did not match.") + } + } + } +} + +func testMultiPointM(t *testing.T, points [][]float64, shapes []Shape) { + for n, s := range shapes { + p, ok := s.(*MultiPointM) + if !ok { + t.Fatal("Failed to type assert.") + } + for k, point := range p.Points { + if !pointsEqual(points[n*3+k], []float64{point.X, point.Y, p.MArray[k]}) { + t.Error("Points did not match.") + } + } + } +} + +func testMultiPatch(t *testing.T, points [][]float64, shapes []Shape) { + for n, s := range shapes { + p, ok := s.(*MultiPatch) + if !ok { + t.Fatal("Failed to type assert.") + } + for k, point := range p.Points { + if !pointsEqual(points[n*3+k], []float64{point.X, point.Y, p.ZArray[k]}) { + t.Error("Points did not match.") + } + } + } +} + +func testshapeIdentity(t *testing.T, prefix string, getter shapeGetterFunc) { + shapes := getter(prefix, t) + d := dataForReadTests[prefix] + if len(shapes) != d.count { + t.Errorf("Number of shapes for %s read was wrong. Wanted %d, got %d.", prefix, d.count, len(shapes)) + } + d.tester(t, d.points, shapes) +} + +func TestReadBBox(t *testing.T) { + tests := []struct { + filename string + want Box + }{ + {"test_files/multipatch.shp", Box{0, 0, 10, 10}}, + {"test_files/multipoint.shp", Box{0, 5, 10, 10}}, + {"test_files/multipointm.shp", Box{0, 5, 10, 10}}, + {"test_files/multipointz.shp", Box{0, 5, 10, 10}}, + {"test_files/point.shp", Box{0, 5, 10, 10}}, + {"test_files/pointm.shp", Box{0, 5, 10, 10}}, + {"test_files/pointz.shp", Box{0, 5, 10, 10}}, + {"test_files/polygon.shp", Box{0, 0, 5, 5}}, + {"test_files/polygonm.shp", Box{0, 0, 5, 5}}, + {"test_files/polygonz.shp", Box{0, 0, 5, 5}}, + {"test_files/polyline.shp", Box{0, 0, 25, 25}}, + {"test_files/polylinem.shp", Box{0, 0, 25, 25}}, + {"test_files/polylinez.shp", Box{0, 0, 25, 25}}, + } + for _, tt := range tests { + r, err := Open(tt.filename) + if err != nil { + t.Fatalf("%v", err) + } + if got := r.BBox().MinX; got != tt.want.MinX { + t.Errorf("got MinX = %v, want %v", got, tt.want.MinX) + } + if got := r.BBox().MinY; got != tt.want.MinY { + t.Errorf("got MinY = %v, want %v", got, tt.want.MinY) + } + if got := r.BBox().MaxX; got != tt.want.MaxX { + t.Errorf("got MaxX = %v, want %v", got, tt.want.MaxX) + } + if got := r.BBox().MaxY; got != tt.want.MaxY { + t.Errorf("got MaxY = %v, want %v", got, tt.want.MaxY) + } + } +} + +type testCaseData struct { + points [][]float64 + tester identityTestFunc + count int +} + +var dataForReadTests = map[string]testCaseData{ + "test_files/polygonm": { + points: [][]float64{ + {0, 0, 0}, + {0, 5, 5}, + {5, 5, 10}, + {5, 0, 15}, + {0, 0, 0}, + }, + tester: testPolygonM, + count: 1, + }, + "test_files/multipointm": { + points: [][]float64{ + {10, 10, 100}, + {5, 5, 50}, + {0, 10, 75}, + }, + tester: testMultiPointM, + count: 1, + }, + "test_files/multipatch": { + points: [][]float64{ + {0, 0, 0}, + {10, 0, 0}, + {10, 10, 0}, + {0, 10, 0}, + {0, 0, 0}, + {0, 10, 0}, + {0, 10, 10}, + {0, 0, 10}, + {0, 0, 0}, + {0, 10, 0}, + {10, 0, 0}, + {10, 0, 10}, + {10, 10, 10}, + {10, 10, 0}, + {10, 0, 0}, + {0, 0, 0}, + {0, 0, 10}, + {10, 0, 10}, + {10, 0, 0}, + {0, 0, 0}, + {10, 10, 0}, + {10, 10, 10}, + {0, 10, 10}, + {0, 10, 0}, + {10, 10, 0}, + {0, 0, 10}, + {0, 10, 10}, + {10, 10, 10}, + {10, 0, 10}, + {0, 0, 10}, + }, + tester: testMultiPatch, + count: 1, + }, + "test_files/point": { + points: [][]float64{ + {10, 10}, + {5, 5}, + {0, 10}, + }, + tester: testPoint, + count: 3, + }, + "test_files/polyline": { + points: [][]float64{ + {0, 0}, + {5, 5}, + {10, 10}, + {15, 15}, + {20, 20}, + {25, 25}, + }, + tester: testPolyLine, + count: 2, + }, + "test_files/polygon": { + points: [][]float64{ + {0, 0}, + {0, 5}, + {5, 5}, + {5, 0}, + {0, 0}, + }, + tester: testPolygon, + count: 1, + }, + "test_files/multipoint": { + points: [][]float64{ + {10, 10}, + {5, 5}, + {0, 10}, + }, + tester: testMultiPoint, + count: 1, + }, + "test_files/pointz": { + points: [][]float64{ + {10, 10, 100}, + {5, 5, 50}, + {0, 10, 75}, + }, + tester: testPointZ, + count: 3, + }, + "test_files/polylinez": { + points: [][]float64{ + {0, 0, 0}, + {5, 5, 5}, + {10, 10, 10}, + {15, 15, 15}, + {20, 20, 20}, + {25, 25, 25}, + }, + tester: testPolyLineZ, + count: 2, + }, + "test_files/polygonz": { + points: [][]float64{ + {0, 0, 0}, + {0, 5, 5}, + {5, 5, 10}, + {5, 0, 15}, + {0, 0, 0}, + }, + tester: testPolygonZ, + count: 1, + }, + "test_files/multipointz": { + points: [][]float64{ + {10, 10, 100}, + {5, 5, 50}, + {0, 10, 75}, + }, + tester: testMultiPointZ, + count: 1, + }, + "test_files/pointm": { + points: [][]float64{ + {10, 10, 100}, + {5, 5, 50}, + {0, 10, 75}, + }, + tester: testPointM, + count: 3, + }, + "test_files/polylinem": { + points: [][]float64{ + {0, 0, 0}, + {5, 5, 5}, + {10, 10, 10}, + {15, 15, 15}, + {20, 20, 20}, + {25, 25, 25}, + }, + tester: testPolyLineM, + count: 2, + }, +} + +func TestReadPoint(t *testing.T) { + testshapeIdentity(t, "test_files/point", getShapesFromFile) +} + +func TestReadPolyLine(t *testing.T) { + testshapeIdentity(t, "test_files/polyline", getShapesFromFile) +} + +func TestReadPolygon(t *testing.T) { + testshapeIdentity(t, "test_files/polygon", getShapesFromFile) +} + +func TestReadMultiPoint(t *testing.T) { + testshapeIdentity(t, "test_files/multipoint", getShapesFromFile) +} + +func TestReadPointZ(t *testing.T) { + testshapeIdentity(t, "test_files/pointz", getShapesFromFile) +} + +func TestReadPolyLineZ(t *testing.T) { + testshapeIdentity(t, "test_files/polylinez", getShapesFromFile) +} + +func TestReadPolygonZ(t *testing.T) { + testshapeIdentity(t, "test_files/polygonz", getShapesFromFile) +} + +func TestReadMultiPointZ(t *testing.T) { + testshapeIdentity(t, "test_files/multipointz", getShapesFromFile) +} + +func TestReadPointM(t *testing.T) { + testshapeIdentity(t, "test_files/pointm", getShapesFromFile) +} + +func TestReadPolyLineM(t *testing.T) { + testshapeIdentity(t, "test_files/polylinem", getShapesFromFile) +} + +func TestReadPolygonM(t *testing.T) { + testshapeIdentity(t, "test_files/polygonm", getShapesFromFile) +} + +func TestReadMultiPointM(t *testing.T) { + testshapeIdentity(t, "test_files/multipointm", getShapesFromFile) +} + +func TestReadMultiPatch(t *testing.T) { + testshapeIdentity(t, "test_files/multipatch", getShapesFromFile) +} + +func newReadSeekCloser(b []byte) readSeekCloser { + return struct { + io.Closer + io.ReadSeeker + }{ + ioutil.NopCloser(nil), + bytes.NewReader(b), + } +} + +func TestReadInvalidShapeType(t *testing.T) { + record := []byte{ + 0, 0, 0, 0, + 0, 0, 0, 0, + 255, 255, 255, 255, // shape type + } + + tests := []struct { + r interface { + Next() bool + Err() error + } + name string + }{ + {&Reader{shp: newReadSeekCloser(record), filelength: int64(len(record))}, "reader"}, + {&seqReader{shp: newReadSeekCloser(record), filelength: int64(len(record))}, "seqReader"}, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + if test.r.Next() { + t.Fatal("read unsupported shape type without stopping") + } + if test.r.Err() == nil { + t.Fatal("read unsupported shape type without error") + } + }) + } +} diff --git a/api/v1/common/tool/shp/sequentialreader.go b/api/v1/common/tool/shp/sequentialreader.go new file mode 100644 index 0000000..49c9632 --- /dev/null +++ b/api/v1/common/tool/shp/sequentialreader.go @@ -0,0 +1,235 @@ +package shp + +import ( + "encoding/binary" + "fmt" + "io" + "io/ioutil" + "math" + "strings" +) + +// SequentialReader is the interface that allows reading shapes and attributes one after another. It also embeds io.Closer. +type SequentialReader interface { + // Close() frees the resources allocated by the SequentialReader. + io.Closer + + // Next() tries to advance the reading by one shape and one attribute row + // and returns true if the read operation could be performed without any + // error. + Next() bool + + // Shape returns the index and the last read shape. If the SequentialReader + // encountered any errors, nil is returned for the Shape. + Shape() (int, Shape) + + // Attribute returns the value of the n-th attribute in the current row. If + // the SequentialReader encountered any errors, the empty string is + // returned. + Attribute(n int) string + + // Fields returns the fields of the database. If the SequentialReader + // encountered any errors, nil is returned. + Fields() []Field + + // Err returns the last non-EOF error encountered. + Err() error +} + +// Attributes returns all attributes of the shape that sr was last advanced to. +func Attributes(sr SequentialReader) []string { + if sr.Err() != nil { + return nil + } + s := make([]string, len(sr.Fields())) + for i := range s { + s[i] = sr.Attribute(i) + } + return s +} + +// AttributeCount returns the number of fields of the database. +func AttributeCount(sr SequentialReader) int { + return len(sr.Fields()) +} + +// seqReader implements SequentialReader based on external io.ReadCloser +// instances +type seqReader struct { + shp, dbf io.ReadCloser + err error + + geometryType ShapeType + bbox Box + + shape Shape + num int32 + filelength int64 + + dbfFields []Field + dbfNumRecords int32 + dbfHeaderLength int16 + dbfRecordLength int16 + dbfRow []byte +} + +// Read and parse headers in the Shapefile. This will fill out GeometryType, +// filelength and bbox. +func (sr *seqReader) readHeaders() { + // contrary to Reader.readHeaders we cannot seek with the ReadCloser, so we + // need to trust the filelength in the header + + er := &errReader{Reader: sr.shp} + // shp headers + io.CopyN(ioutil.Discard, er, 24) + var l int32 + binary.Read(er, binary.BigEndian, &l) + sr.filelength = int64(l) * 2 + io.CopyN(ioutil.Discard, er, 4) + binary.Read(er, binary.LittleEndian, &sr.geometryType) + sr.bbox.MinX = readFloat64(er) + sr.bbox.MinY = readFloat64(er) + sr.bbox.MaxX = readFloat64(er) + sr.bbox.MaxY = readFloat64(er) + io.CopyN(ioutil.Discard, er, 32) // skip four float64: Zmin, Zmax, Mmin, Max + if er.e != nil { + sr.err = fmt.Errorf("Error when reading SHP header: %v", er.e) + return + } + + // dbf header + er = &errReader{Reader: sr.dbf} + if sr.dbf == nil { + return + } + io.CopyN(ioutil.Discard, er, 4) + binary.Read(er, binary.LittleEndian, &sr.dbfNumRecords) + binary.Read(er, binary.LittleEndian, &sr.dbfHeaderLength) + binary.Read(er, binary.LittleEndian, &sr.dbfRecordLength) + io.CopyN(ioutil.Discard, er, 20) // skip padding + numFields := int(math.Floor(float64(sr.dbfHeaderLength-33) / 32.0)) + sr.dbfFields = make([]Field, numFields) + binary.Read(er, binary.LittleEndian, &sr.dbfFields) + buf := make([]byte, 1) + er.Read(buf[:]) + if er.e != nil { + sr.err = fmt.Errorf("Error when reading DBF header: %v", er.e) + return + } + if buf[0] != 0x0d { + sr.err = fmt.Errorf("Field descriptor array terminator not found") + return + } + sr.dbfRow = make([]byte, sr.dbfRecordLength) +} + +// Next implements a method of interface SequentialReader for seqReader. +func (sr *seqReader) Next() bool { + if sr.err != nil { + return false + } + var num, size int32 + var shapetype ShapeType + + // read shape + er := &errReader{Reader: sr.shp} + binary.Read(er, binary.BigEndian, &num) + binary.Read(er, binary.BigEndian, &size) + binary.Read(er, binary.LittleEndian, &shapetype) + + if er.e != nil { + if er.e != io.EOF { + sr.err = fmt.Errorf("Error when reading shapefile header: %v", er.e) + } else { + sr.err = io.EOF + } + return false + } + sr.num = num + var err error + sr.shape, err = newShape(shapetype) + if err != nil { + sr.err = fmt.Errorf("Error decoding shape type: %v", err) + return false + } + sr.shape.read(er) + switch { + case er.e == io.EOF: + // io.EOF means end-of-file was reached gracefully after all + // shape-internal reads succeeded, so it's not a reason stop + // iterating over all shapes. + er.e = nil + case er.e != nil: + sr.err = fmt.Errorf("Error while reading next shape: %v", er.e) + return false + } + skipBytes := int64(size)*2 + 8 - er.n + _, ce := io.CopyN(ioutil.Discard, er, skipBytes) + if er.e != nil { + sr.err = er.e + return false + } + if ce != nil { + sr.err = fmt.Errorf("Error when discarding bytes on sequential read: %v", ce) + return false + } + if _, err := io.ReadFull(sr.dbf, sr.dbfRow); err != nil { + sr.err = fmt.Errorf("Error when reading DBF row: %v", err) + return false + } + if sr.dbfRow[0] != 0x20 && sr.dbfRow[0] != 0x2a { + sr.err = fmt.Errorf("Attribute row %d starts with incorrect deletion indicator", num) + } + return sr.err == nil +} + +// Shape implements a method of interface SequentialReader for seqReader. +func (sr *seqReader) Shape() (int, Shape) { + return int(sr.num) - 1, sr.shape +} + +// Attribute implements a method of interface SequentialReader for seqReader. +func (sr *seqReader) Attribute(n int) string { + if sr.err != nil { + return "" + } + start := 1 + f := 0 + for ; f < n; f++ { + start += int(sr.dbfFields[f].Size) + } + s := string(sr.dbfRow[start : start+int(sr.dbfFields[f].Size)]) + return strings.Trim(s, " ") +} + +// Err returns the first non-EOF error that was encountered. +func (sr *seqReader) Err() error { + if sr.err == io.EOF { + return nil + } + return sr.err +} + +// Close closes the seqReader and free all the allocated resources. +func (sr *seqReader) Close() error { + if err := sr.shp.Close(); err != nil { + return err + } + if err := sr.dbf.Close(); err != nil { + return err + } + return nil +} + +// Fields returns a slice of the fields that are present in the DBF table. +func (sr *seqReader) Fields() []Field { + return sr.dbfFields +} + +// SequentialReaderFromExt returns a new SequentialReader that interprets shp +// as a source of shapes whose attributes can be retrieved from dbf. +func SequentialReaderFromExt(shp, dbf io.ReadCloser) SequentialReader { + sr := &seqReader{shp: shp, dbf: dbf} + sr.readHeaders() + return sr +} diff --git a/api/v1/common/tool/shp/sequentialreader_test.go b/api/v1/common/tool/shp/sequentialreader_test.go new file mode 100644 index 0000000..5f26370 --- /dev/null +++ b/api/v1/common/tool/shp/sequentialreader_test.go @@ -0,0 +1,43 @@ +package shp + +import ( + "os" + "testing" +) + +func openFile(name string, t *testing.T) *os.File { + f, err := os.Open(name) + if err != nil { + t.Fatalf("Failed to open %s: %v", name, err) + } + return f +} + +func getShapesSequentially(prefix string, t *testing.T) (shapes []Shape) { + shp := openFile(prefix+".shp", t) + dbf := openFile(prefix+".dbf", t) + + sr := SequentialReaderFromExt(shp, dbf) + if err := sr.Err(); err != nil { + t.Fatalf("Error when iterating over the shapefile header: %v", err) + } + for sr.Next() { + _, shape := sr.Shape() + shapes = append(shapes, shape) + } + if err := sr.Err(); err != nil { + t.Errorf("Error when iterating over the shapes: %v", err) + } + + if err := sr.Close(); err != nil { + t.Errorf("Could not close sequential reader: %v", err) + } + return shapes +} + +func TestSequentialReader(t *testing.T) { + for prefix := range dataForReadTests { + t.Logf("Testing sequential read for %s", prefix) + testshapeIdentity(t, prefix, getShapesSequentially) + } +} diff --git a/api/v1/common/tool/shp/shapefile.go b/api/v1/common/tool/shp/shapefile.go new file mode 100644 index 0000000..0da0adf --- /dev/null +++ b/api/v1/common/tool/shp/shapefile.go @@ -0,0 +1,612 @@ +package shp + +import ( + "encoding/binary" + "io" + "strings" +) + +//go:generate stringer -type=ShapeType + +// ShapeType is a identifier for the the type of shapes. +type ShapeType int32 + +// These are the possible shape types. +const ( + NULL ShapeType = 0 + POINT ShapeType = 1 + POLYLINE ShapeType = 3 + POLYGON ShapeType = 5 + MULTIPOINT ShapeType = 8 + POINTZ ShapeType = 11 + POLYLINEZ ShapeType = 13 + POLYGONZ ShapeType = 15 + MULTIPOINTZ ShapeType = 18 + POINTM ShapeType = 21 + POLYLINEM ShapeType = 23 + POLYGONM ShapeType = 25 + MULTIPOINTM ShapeType = 28 + MULTIPATCH ShapeType = 31 +) + +// Box structure made up from four coordinates. This type +// is used to represent bounding boxes +type Box struct { + MinX, MinY, MaxX, MaxY float64 +} + +// Extend extends the box with coordinates from the provided +// box. This method calls Box.ExtendWithPoint twice with +// {MinX, MinY} and {MaxX, MaxY} +func (b *Box) Extend(box Box) { + b.ExtendWithPoint(Point{box.MinX, box.MinY}) + b.ExtendWithPoint(Point{box.MaxX, box.MaxY}) +} + +// ExtendWithPoint extends box with coordinates from point +// if they are outside the range of the current box. +func (b *Box) ExtendWithPoint(p Point) { + if p.X < b.MinX { + b.MinX = p.X + } + if p.Y < b.MinY { + b.MinY = p.Y + } + if p.X > b.MaxX { + b.MaxX = p.X + } + if p.Y > b.MaxY { + b.MaxY = p.Y + } +} + +// BBoxFromPoints returns the bounding box calculated +// from points. +func BBoxFromPoints(points []Point) (box Box) { + for k, p := range points { + if k == 0 { + box = Box{p.X, p.Y, p.X, p.Y} + } else { + box.ExtendWithPoint(p) + } + } + return +} + +// Shape interface +type Shape interface { + BBox() Box + + read(io.Reader) + write(io.Writer) +} + +// Null is an empty shape. +type Null struct { +} + +// BBox Returns an empty BBox at the geometry origin. +func (n Null) BBox() Box { + return Box{0.0, 0.0, 0.0, 0.0} +} + +func (n *Null) read(file io.Reader) { + binary.Read(file, binary.LittleEndian, n) +} + +func (n *Null) write(file io.Writer) { + binary.Write(file, binary.LittleEndian, n) +} + +// Point is the shape that consists of single a geometry point. +type Point struct { + X, Y float64 +} + +// BBox returns the bounding box of the Point feature, i.e. an empty area at +// the point location itself. +func (p Point) BBox() Box { + return Box{p.X, p.Y, p.X, p.Y} +} + +func (p *Point) read(file io.Reader) { + binary.Read(file, binary.LittleEndian, p) +} + +func (p *Point) write(file io.Writer) { + binary.Write(file, binary.LittleEndian, p) +} + +func flatten(points [][]Point) []Point { + n, i := 0, 0 + for _, v := range points { + n += len(v) + } + r := make([]Point, n) + for _, v := range points { + for _, p := range v { + r[i] = p + i++ + } + } + return r +} + +// PolyLine is a shape type that consists of an ordered set of vertices that +// consists of one or more parts. A part is a connected sequence of two ore +// more points. Parts may or may not be connected to another and may or may not +// intersect each other. +type PolyLine struct { + Box + NumParts int32 + NumPoints int32 + Parts []int32 + Points []Point +} + +// NewPolyLine returns a pointer a new PolyLine created +// with the provided points. The inner slice should be +// the points that the parent part consists of. +func NewPolyLine(parts [][]Point) *PolyLine { + points := flatten(parts) + + p := &PolyLine{} + p.NumParts = int32(len(parts)) + p.NumPoints = int32(len(points)) + p.Parts = make([]int32, len(parts)) + var marker int32 + for i, part := range parts { + p.Parts[i] = marker + marker += int32(len(part)) + } + p.Points = points + p.Box = p.BBox() + + return p +} + +// BBox returns the bounding box of the PolyLine feature +func (p PolyLine) BBox() Box { + return BBoxFromPoints(p.Points) +} + +func (p *PolyLine) read(file io.Reader) { + binary.Read(file, binary.LittleEndian, &p.Box) + binary.Read(file, binary.LittleEndian, &p.NumParts) + binary.Read(file, binary.LittleEndian, &p.NumPoints) + p.Parts = make([]int32, p.NumParts) + p.Points = make([]Point, p.NumPoints) + binary.Read(file, binary.LittleEndian, &p.Parts) + binary.Read(file, binary.LittleEndian, &p.Points) +} + +func (p *PolyLine) write(file io.Writer) { + binary.Write(file, binary.LittleEndian, p.Box) + binary.Write(file, binary.LittleEndian, p.NumParts) + binary.Write(file, binary.LittleEndian, p.NumPoints) + binary.Write(file, binary.LittleEndian, p.Parts) + binary.Write(file, binary.LittleEndian, p.Points) +} + +// Polygon is identical to the PolyLine struct. However the parts must form +// rings that may not intersect. +type Polygon PolyLine + +// BBox returns the bounding box of the Polygon feature +func (p Polygon) BBox() Box { + return BBoxFromPoints(p.Points) +} + +func (p *Polygon) read(file io.Reader) { + binary.Read(file, binary.LittleEndian, &p.Box) + binary.Read(file, binary.LittleEndian, &p.NumParts) + binary.Read(file, binary.LittleEndian, &p.NumPoints) + p.Parts = make([]int32, p.NumParts) + p.Points = make([]Point, p.NumPoints) + binary.Read(file, binary.LittleEndian, &p.Parts) + binary.Read(file, binary.LittleEndian, &p.Points) +} + +func (p *Polygon) write(file io.Writer) { + binary.Write(file, binary.LittleEndian, p.Box) + binary.Write(file, binary.LittleEndian, p.NumParts) + binary.Write(file, binary.LittleEndian, p.NumPoints) + binary.Write(file, binary.LittleEndian, p.Parts) + binary.Write(file, binary.LittleEndian, p.Points) +} + +// MultiPoint is the shape that consists of multiple points. +type MultiPoint struct { + Box Box + NumPoints int32 + Points []Point +} + +// BBox returns the bounding box of the MultiPoint feature +func (p MultiPoint) BBox() Box { + return BBoxFromPoints(p.Points) +} + +func (p *MultiPoint) read(file io.Reader) { + binary.Read(file, binary.LittleEndian, &p.Box) + binary.Read(file, binary.LittleEndian, &p.NumPoints) + p.Points = make([]Point, p.NumPoints) + binary.Read(file, binary.LittleEndian, &p.Points) +} + +func (p *MultiPoint) write(file io.Writer) { + binary.Write(file, binary.LittleEndian, p.Box) + binary.Write(file, binary.LittleEndian, p.NumPoints) + binary.Write(file, binary.LittleEndian, p.Points) +} + +// PointZ is a triplet of double precision coordinates plus a measure. +type PointZ struct { + X float64 + Y float64 + Z float64 + M float64 +} + +// BBox eturns the bounding box of the PointZ feature which is an zero-sized area +// at the X and Y coordinates of the feature. +func (p PointZ) BBox() Box { + return Box{p.X, p.Y, p.X, p.Y} +} + +func (p *PointZ) read(file io.Reader) { + binary.Read(file, binary.LittleEndian, p) +} + +func (p *PointZ) write(file io.Writer) { + binary.Write(file, binary.LittleEndian, p) +} + +// PolyLineZ is a shape which consists of one or more parts. A part is a +// connected sequence of two or more points. Parts may or may not be connected +// and may or may not intersect one another. +type PolyLineZ struct { + Box Box + NumParts int32 + NumPoints int32 + Parts []int32 + Points []Point + ZRange [2]float64 + ZArray []float64 + MRange [2]float64 + MArray []float64 +} + +// BBox eturns the bounding box of the PolyLineZ feature. +func (p PolyLineZ) BBox() Box { + return BBoxFromPoints(p.Points) +} + +func (p *PolyLineZ) read(file io.Reader) { + binary.Read(file, binary.LittleEndian, &p.Box) + binary.Read(file, binary.LittleEndian, &p.NumParts) + binary.Read(file, binary.LittleEndian, &p.NumPoints) + p.Parts = make([]int32, p.NumParts) + p.Points = make([]Point, p.NumPoints) + p.ZArray = make([]float64, p.NumPoints) + p.MArray = make([]float64, p.NumPoints) + binary.Read(file, binary.LittleEndian, &p.Parts) + binary.Read(file, binary.LittleEndian, &p.Points) + binary.Read(file, binary.LittleEndian, &p.ZRange) + binary.Read(file, binary.LittleEndian, &p.ZArray) + binary.Read(file, binary.LittleEndian, &p.MRange) + binary.Read(file, binary.LittleEndian, &p.MArray) +} + +func (p *PolyLineZ) write(file io.Writer) { + binary.Write(file, binary.LittleEndian, p.Box) + binary.Write(file, binary.LittleEndian, p.NumParts) + binary.Write(file, binary.LittleEndian, p.NumPoints) + binary.Write(file, binary.LittleEndian, p.Parts) + binary.Write(file, binary.LittleEndian, p.Points) + binary.Write(file, binary.LittleEndian, p.ZRange) + binary.Write(file, binary.LittleEndian, p.ZArray) + binary.Write(file, binary.LittleEndian, p.MRange) + binary.Write(file, binary.LittleEndian, p.MArray) +} + +// PolygonZ structure is identical to the PolyLineZ structure. +type PolygonZ PolyLineZ + +// BBox returns the bounding box of the PolygonZ feature +func (p PolygonZ) BBox() Box { + return BBoxFromPoints(p.Points) +} + +func (p *PolygonZ) read(file io.Reader) { + binary.Read(file, binary.LittleEndian, &p.Box) + binary.Read(file, binary.LittleEndian, &p.NumParts) + binary.Read(file, binary.LittleEndian, &p.NumPoints) + p.Parts = make([]int32, p.NumParts) + p.Points = make([]Point, p.NumPoints) + p.ZArray = make([]float64, p.NumPoints) + p.MArray = make([]float64, p.NumPoints) + binary.Read(file, binary.LittleEndian, &p.Parts) + binary.Read(file, binary.LittleEndian, &p.Points) + binary.Read(file, binary.LittleEndian, &p.ZRange) + binary.Read(file, binary.LittleEndian, &p.ZArray) + binary.Read(file, binary.LittleEndian, &p.MRange) + binary.Read(file, binary.LittleEndian, &p.MArray) +} + +func (p *PolygonZ) write(file io.Writer) { + binary.Write(file, binary.LittleEndian, p.Box) + binary.Write(file, binary.LittleEndian, p.NumParts) + binary.Write(file, binary.LittleEndian, p.NumPoints) + binary.Write(file, binary.LittleEndian, p.Parts) + binary.Write(file, binary.LittleEndian, p.Points) + binary.Write(file, binary.LittleEndian, p.ZRange) + binary.Write(file, binary.LittleEndian, p.ZArray) + binary.Write(file, binary.LittleEndian, p.MRange) + binary.Write(file, binary.LittleEndian, p.MArray) +} + +// MultiPointZ consists of one ore more PointZ. +type MultiPointZ struct { + Box Box + NumPoints int32 + Points []Point + ZRange [2]float64 + ZArray []float64 + MRange [2]float64 + MArray []float64 +} + +// BBox eturns the bounding box of the MultiPointZ feature. +func (p MultiPointZ) BBox() Box { + return BBoxFromPoints(p.Points) +} + +func (p *MultiPointZ) read(file io.Reader) { + binary.Read(file, binary.LittleEndian, &p.Box) + binary.Read(file, binary.LittleEndian, &p.NumPoints) + p.Points = make([]Point, p.NumPoints) + p.ZArray = make([]float64, p.NumPoints) + p.MArray = make([]float64, p.NumPoints) + binary.Read(file, binary.LittleEndian, &p.Points) + binary.Read(file, binary.LittleEndian, &p.ZRange) + binary.Read(file, binary.LittleEndian, &p.ZArray) + binary.Read(file, binary.LittleEndian, &p.MRange) + binary.Read(file, binary.LittleEndian, &p.MArray) +} + +func (p *MultiPointZ) write(file io.Writer) { + binary.Write(file, binary.LittleEndian, p.Box) + binary.Write(file, binary.LittleEndian, p.NumPoints) + binary.Write(file, binary.LittleEndian, p.Points) + binary.Write(file, binary.LittleEndian, p.ZRange) + binary.Write(file, binary.LittleEndian, p.ZArray) + binary.Write(file, binary.LittleEndian, p.MRange) + binary.Write(file, binary.LittleEndian, p.MArray) +} + +// PointM is a point with a measure. +type PointM struct { + X float64 + Y float64 + M float64 +} + +// BBox returns the bounding box of the PointM feature which is a zero-sized +// area at the X- and Y-coordinates of the point. +func (p PointM) BBox() Box { + return Box{p.X, p.Y, p.X, p.Y} +} + +func (p *PointM) read(file io.Reader) { + binary.Read(file, binary.LittleEndian, p) +} + +func (p *PointM) write(file io.Writer) { + binary.Write(file, binary.LittleEndian, p) +} + +// PolyLineM is the polyline in which each point also has a measure. +type PolyLineM struct { + Box Box + NumParts int32 + NumPoints int32 + Parts []int32 + Points []Point + MRange [2]float64 + MArray []float64 +} + +// BBox returns the bounding box of the PolyLineM feature. +func (p PolyLineM) BBox() Box { + return BBoxFromPoints(p.Points) +} + +func (p *PolyLineM) read(file io.Reader) { + binary.Read(file, binary.LittleEndian, &p.Box) + binary.Read(file, binary.LittleEndian, &p.NumParts) + binary.Read(file, binary.LittleEndian, &p.NumPoints) + p.Parts = make([]int32, p.NumParts) + p.Points = make([]Point, p.NumPoints) + p.MArray = make([]float64, p.NumPoints) + binary.Read(file, binary.LittleEndian, &p.Parts) + binary.Read(file, binary.LittleEndian, &p.Points) + binary.Read(file, binary.LittleEndian, &p.MRange) + binary.Read(file, binary.LittleEndian, &p.MArray) +} + +func (p *PolyLineM) write(file io.Writer) { + binary.Write(file, binary.LittleEndian, p.Box) + binary.Write(file, binary.LittleEndian, p.NumParts) + binary.Write(file, binary.LittleEndian, p.NumPoints) + binary.Write(file, binary.LittleEndian, p.Parts) + binary.Write(file, binary.LittleEndian, p.Points) + binary.Write(file, binary.LittleEndian, p.MRange) + binary.Write(file, binary.LittleEndian, p.MArray) +} + +// PolygonM structure is identical to the PolyLineZ structure. +type PolygonM PolyLineZ + +// BBox returns the bounding box of the PolygonM feature. +func (p PolygonM) BBox() Box { + return BBoxFromPoints(p.Points) +} + +func (p *PolygonM) read(file io.Reader) { + binary.Read(file, binary.LittleEndian, &p.Box) + binary.Read(file, binary.LittleEndian, &p.NumParts) + binary.Read(file, binary.LittleEndian, &p.NumPoints) + p.Parts = make([]int32, p.NumParts) + p.Points = make([]Point, p.NumPoints) + p.MArray = make([]float64, p.NumPoints) + binary.Read(file, binary.LittleEndian, &p.Parts) + binary.Read(file, binary.LittleEndian, &p.Points) + binary.Read(file, binary.LittleEndian, &p.MRange) + binary.Read(file, binary.LittleEndian, &p.MArray) +} + +func (p *PolygonM) write(file io.Writer) { + binary.Write(file, binary.LittleEndian, p.Box) + binary.Write(file, binary.LittleEndian, p.NumParts) + binary.Write(file, binary.LittleEndian, p.NumPoints) + binary.Write(file, binary.LittleEndian, p.Parts) + binary.Write(file, binary.LittleEndian, p.Points) + binary.Write(file, binary.LittleEndian, p.MRange) + binary.Write(file, binary.LittleEndian, p.MArray) +} + +// MultiPointM is the collection of multiple points with measures. +type MultiPointM struct { + Box Box + NumPoints int32 + Points []Point + MRange [2]float64 + MArray []float64 +} + +// BBox eturns the bounding box of the MultiPointM feature +func (p MultiPointM) BBox() Box { + return BBoxFromPoints(p.Points) +} + +func (p *MultiPointM) read(file io.Reader) { + binary.Read(file, binary.LittleEndian, &p.Box) + binary.Read(file, binary.LittleEndian, &p.NumPoints) + p.Points = make([]Point, p.NumPoints) + p.MArray = make([]float64, p.NumPoints) + binary.Read(file, binary.LittleEndian, &p.Points) + binary.Read(file, binary.LittleEndian, &p.MRange) + binary.Read(file, binary.LittleEndian, &p.MArray) +} + +func (p *MultiPointM) write(file io.Writer) { + binary.Write(file, binary.LittleEndian, p.Box) + binary.Write(file, binary.LittleEndian, p.NumPoints) + binary.Write(file, binary.LittleEndian, p.Points) + binary.Write(file, binary.LittleEndian, p.MRange) + binary.Write(file, binary.LittleEndian, p.MArray) +} + +// MultiPatch consists of a number of surfaces patches. Each surface path +// descries a surface. The surface patches of a MultiPatch are referred to as +// its parts, and the type of part controls how the order of vertices of an +// MultiPatch part is interpreted. +type MultiPatch struct { + Box Box + NumParts int32 + NumPoints int32 + Parts []int32 + PartTypes []int32 + Points []Point + ZRange [2]float64 + ZArray []float64 + MRange [2]float64 + MArray []float64 +} + +// BBox returns the bounding box of the MultiPatch feature +func (p MultiPatch) BBox() Box { + return BBoxFromPoints(p.Points) +} + +func (p *MultiPatch) read(file io.Reader) { + binary.Read(file, binary.LittleEndian, &p.Box) + binary.Read(file, binary.LittleEndian, &p.NumParts) + binary.Read(file, binary.LittleEndian, &p.NumPoints) + p.Parts = make([]int32, p.NumParts) + p.PartTypes = make([]int32, p.NumParts) + p.Points = make([]Point, p.NumPoints) + p.ZArray = make([]float64, p.NumPoints) + p.MArray = make([]float64, p.NumPoints) + binary.Read(file, binary.LittleEndian, &p.Parts) + binary.Read(file, binary.LittleEndian, &p.PartTypes) + binary.Read(file, binary.LittleEndian, &p.Points) + binary.Read(file, binary.LittleEndian, &p.ZRange) + binary.Read(file, binary.LittleEndian, &p.ZArray) + binary.Read(file, binary.LittleEndian, &p.MRange) + binary.Read(file, binary.LittleEndian, &p.MArray) +} + +func (p *MultiPatch) write(file io.Writer) { + binary.Write(file, binary.LittleEndian, p.Box) + binary.Write(file, binary.LittleEndian, p.NumParts) + binary.Write(file, binary.LittleEndian, p.NumPoints) + binary.Write(file, binary.LittleEndian, p.Parts) + binary.Write(file, binary.LittleEndian, p.PartTypes) + binary.Write(file, binary.LittleEndian, p.Points) + binary.Write(file, binary.LittleEndian, p.ZRange) + binary.Write(file, binary.LittleEndian, p.ZArray) + binary.Write(file, binary.LittleEndian, p.MRange) + binary.Write(file, binary.LittleEndian, p.MArray) +} + +// Field representation of a field object in the DBF file +type Field struct { + Name [11]byte + Fieldtype byte + Addr [4]byte // not used + Size uint8 + Precision uint8 + Padding [14]byte +} + +// Returns a string representation of the Field. Currently +// this only returns field name. +func (f Field) String() string { + return strings.TrimRight(string(f.Name[:]), "\x00") +} + +// StringField returns a Field that can be used in SetFields to initialize the +// DBF file. +func StringField(name string, length uint8) Field { + // TODO: Error checking + field := Field{Fieldtype: 'C', Size: length} + copy(field.Name[:], []byte(name)) + return field +} + +// NumberField returns a Field that can be used in SetFields to initialize the +// DBF file. +func NumberField(name string, length uint8) Field { + field := Field{Fieldtype: 'N', Size: length} + copy(field.Name[:], []byte(name)) + return field +} + +// FloatField returns a Field that can be used in SetFields to initialize the +// DBF file. Used to store floating points with precision in the DBF. +func FloatField(name string, length uint8, precision uint8) Field { + field := Field{Fieldtype: 'F', Size: length, Precision: precision} + copy(field.Name[:], []byte(name)) + return field +} + +// DateField feturns a Field that can be used in SetFields to initialize the +// DBF file. Used to store Date strings formatted as YYYYMMDD. Data wise this +// is the same as a StringField with length 8. +func DateField(name string) Field { + field := Field{Fieldtype: 'D', Size: 8} + copy(field.Name[:], []byte(name)) + return field +} diff --git a/api/v1/common/tool/shp/shapefile_test.go b/api/v1/common/tool/shp/shapefile_test.go new file mode 100644 index 0000000..12dbfea --- /dev/null +++ b/api/v1/common/tool/shp/shapefile_test.go @@ -0,0 +1,22 @@ +package shp + +import "testing" + +func TestBoxExtend(t *testing.T) { + a := Box{-124.763068, 45.543541, -116.915989, 49.002494} + b := Box{-92.888114, 42.49192, -86.805415, 47.080621} + a.Extend(b) + c := Box{-124.763068, 42.49192, -86.805415, 49.002494} + if a.MinX != c.MinX { + t.Errorf("a.MinX = %v, want %v", a.MinX, c.MinX) + } + if a.MinY != c.MinY { + t.Errorf("a.MinY = %v, want %v", a.MinY, c.MinY) + } + if a.MaxX != c.MaxX { + t.Errorf("a.MaxX = %v, want %v", a.MaxX, c.MaxX) + } + if a.MaxY != c.MaxY { + t.Errorf("a.MaxY = %v, want %v", a.MaxY, c.MaxY) + } +} diff --git a/api/v1/common/tool/shp/shapetype_string.go b/api/v1/common/tool/shp/shapetype_string.go new file mode 100644 index 0000000..e32ecea --- /dev/null +++ b/api/v1/common/tool/shp/shapetype_string.go @@ -0,0 +1,31 @@ +// Code generated by "stringer -type=ShapeType"; DO NOT EDIT. + +package shp + +import "strconv" + +const _ShapeType_name = "NULLPOINTPOLYLINEPOLYGONMULTIPOINTPOINTZPOLYLINEZPOLYGONZMULTIPOINTZPOINTMPOLYLINEMPOLYGONMMULTIPOINTMMULTIPATCH" + +var _ShapeType_map = map[ShapeType]string{ + 0: _ShapeType_name[0:4], + 1: _ShapeType_name[4:9], + 3: _ShapeType_name[9:17], + 5: _ShapeType_name[17:24], + 8: _ShapeType_name[24:34], + 11: _ShapeType_name[34:40], + 13: _ShapeType_name[40:49], + 15: _ShapeType_name[49:57], + 18: _ShapeType_name[57:68], + 21: _ShapeType_name[68:74], + 23: _ShapeType_name[74:83], + 25: _ShapeType_name[83:91], + 28: _ShapeType_name[91:102], + 31: _ShapeType_name[102:112], +} + +func (i ShapeType) String() string { + if str, ok := _ShapeType_map[i]; ok { + return str + } + return "ShapeType(" + strconv.FormatInt(int64(i), 10) + ")" +} diff --git a/api/v1/common/tool/shp/test_files/multipatch.dbf b/api/v1/common/tool/shp/test_files/multipatch.dbf new file mode 100644 index 0000000..e074a0b Binary files /dev/null and b/api/v1/common/tool/shp/test_files/multipatch.dbf differ diff --git a/api/v1/common/tool/shp/test_files/multipatch.shp b/api/v1/common/tool/shp/test_files/multipatch.shp new file mode 100644 index 0000000..0e6c58d Binary files /dev/null and b/api/v1/common/tool/shp/test_files/multipatch.shp differ diff --git a/api/v1/common/tool/shp/test_files/multipatch.shx b/api/v1/common/tool/shp/test_files/multipatch.shx new file mode 100644 index 0000000..ec5c20a Binary files /dev/null and b/api/v1/common/tool/shp/test_files/multipatch.shx differ diff --git a/api/v1/common/tool/shp/test_files/multipoint.dbf b/api/v1/common/tool/shp/test_files/multipoint.dbf new file mode 100644 index 0000000..d70eafd Binary files /dev/null and b/api/v1/common/tool/shp/test_files/multipoint.dbf differ diff --git a/api/v1/common/tool/shp/test_files/multipoint.shp b/api/v1/common/tool/shp/test_files/multipoint.shp new file mode 100644 index 0000000..ee30de9 Binary files /dev/null and b/api/v1/common/tool/shp/test_files/multipoint.shp differ diff --git a/api/v1/common/tool/shp/test_files/multipoint.shx b/api/v1/common/tool/shp/test_files/multipoint.shx new file mode 100644 index 0000000..2d66893 Binary files /dev/null and b/api/v1/common/tool/shp/test_files/multipoint.shx differ diff --git a/api/v1/common/tool/shp/test_files/multipointm.dbf b/api/v1/common/tool/shp/test_files/multipointm.dbf new file mode 100644 index 0000000..d70eafd Binary files /dev/null and b/api/v1/common/tool/shp/test_files/multipointm.dbf differ diff --git a/api/v1/common/tool/shp/test_files/multipointm.shp b/api/v1/common/tool/shp/test_files/multipointm.shp new file mode 100644 index 0000000..232f560 Binary files /dev/null and b/api/v1/common/tool/shp/test_files/multipointm.shp differ diff --git a/api/v1/common/tool/shp/test_files/multipointm.shx b/api/v1/common/tool/shp/test_files/multipointm.shx new file mode 100644 index 0000000..4228203 Binary files /dev/null and b/api/v1/common/tool/shp/test_files/multipointm.shx differ diff --git a/api/v1/common/tool/shp/test_files/multipointz.dbf b/api/v1/common/tool/shp/test_files/multipointz.dbf new file mode 100644 index 0000000..d70eafd Binary files /dev/null and b/api/v1/common/tool/shp/test_files/multipointz.dbf differ diff --git a/api/v1/common/tool/shp/test_files/multipointz.shp b/api/v1/common/tool/shp/test_files/multipointz.shp new file mode 100644 index 0000000..e696e68 Binary files /dev/null and b/api/v1/common/tool/shp/test_files/multipointz.shp differ diff --git a/api/v1/common/tool/shp/test_files/multipointz.shx b/api/v1/common/tool/shp/test_files/multipointz.shx new file mode 100644 index 0000000..e997874 Binary files /dev/null and b/api/v1/common/tool/shp/test_files/multipointz.shx differ diff --git a/api/v1/common/tool/shp/test_files/point.dbf b/api/v1/common/tool/shp/test_files/point.dbf new file mode 100644 index 0000000..a3940c0 Binary files /dev/null and b/api/v1/common/tool/shp/test_files/point.dbf differ diff --git a/api/v1/common/tool/shp/test_files/point.shp b/api/v1/common/tool/shp/test_files/point.shp new file mode 100644 index 0000000..310419c Binary files /dev/null and b/api/v1/common/tool/shp/test_files/point.shp differ diff --git a/api/v1/common/tool/shp/test_files/point.shx b/api/v1/common/tool/shp/test_files/point.shx new file mode 100644 index 0000000..9e80aee Binary files /dev/null and b/api/v1/common/tool/shp/test_files/point.shx differ diff --git a/api/v1/common/tool/shp/test_files/pointm.dbf b/api/v1/common/tool/shp/test_files/pointm.dbf new file mode 100644 index 0000000..8337f91 Binary files /dev/null and b/api/v1/common/tool/shp/test_files/pointm.dbf differ diff --git a/api/v1/common/tool/shp/test_files/pointm.shp b/api/v1/common/tool/shp/test_files/pointm.shp new file mode 100644 index 0000000..7f6216e Binary files /dev/null and b/api/v1/common/tool/shp/test_files/pointm.shp differ diff --git a/api/v1/common/tool/shp/test_files/pointm.shx b/api/v1/common/tool/shp/test_files/pointm.shx new file mode 100644 index 0000000..7236a79 Binary files /dev/null and b/api/v1/common/tool/shp/test_files/pointm.shx differ diff --git a/api/v1/common/tool/shp/test_files/pointz.dbf b/api/v1/common/tool/shp/test_files/pointz.dbf new file mode 100644 index 0000000..1075eec Binary files /dev/null and b/api/v1/common/tool/shp/test_files/pointz.dbf differ diff --git a/api/v1/common/tool/shp/test_files/pointz.shp b/api/v1/common/tool/shp/test_files/pointz.shp new file mode 100644 index 0000000..9e7ec16 Binary files /dev/null and b/api/v1/common/tool/shp/test_files/pointz.shp differ diff --git a/api/v1/common/tool/shp/test_files/pointz.shx b/api/v1/common/tool/shp/test_files/pointz.shx new file mode 100644 index 0000000..f48d47e Binary files /dev/null and b/api/v1/common/tool/shp/test_files/pointz.shx differ diff --git a/api/v1/common/tool/shp/test_files/polygon.dbf b/api/v1/common/tool/shp/test_files/polygon.dbf new file mode 100644 index 0000000..ab61afd Binary files /dev/null and b/api/v1/common/tool/shp/test_files/polygon.dbf differ diff --git a/api/v1/common/tool/shp/test_files/polygon.shp b/api/v1/common/tool/shp/test_files/polygon.shp new file mode 100644 index 0000000..624a9db Binary files /dev/null and b/api/v1/common/tool/shp/test_files/polygon.shp differ diff --git a/api/v1/common/tool/shp/test_files/polygon.shx b/api/v1/common/tool/shp/test_files/polygon.shx new file mode 100644 index 0000000..f95d0e0 Binary files /dev/null and b/api/v1/common/tool/shp/test_files/polygon.shx differ diff --git a/api/v1/common/tool/shp/test_files/polygonm.dbf b/api/v1/common/tool/shp/test_files/polygonm.dbf new file mode 100644 index 0000000..dec0173 Binary files /dev/null and b/api/v1/common/tool/shp/test_files/polygonm.dbf differ diff --git a/api/v1/common/tool/shp/test_files/polygonm.shp b/api/v1/common/tool/shp/test_files/polygonm.shp new file mode 100644 index 0000000..f3a22d1 Binary files /dev/null and b/api/v1/common/tool/shp/test_files/polygonm.shp differ diff --git a/api/v1/common/tool/shp/test_files/polygonm.shx b/api/v1/common/tool/shp/test_files/polygonm.shx new file mode 100644 index 0000000..5d54f32 Binary files /dev/null and b/api/v1/common/tool/shp/test_files/polygonm.shx differ diff --git a/api/v1/common/tool/shp/test_files/polygonz.dbf b/api/v1/common/tool/shp/test_files/polygonz.dbf new file mode 100644 index 0000000..dec0173 Binary files /dev/null and b/api/v1/common/tool/shp/test_files/polygonz.dbf differ diff --git a/api/v1/common/tool/shp/test_files/polygonz.shp b/api/v1/common/tool/shp/test_files/polygonz.shp new file mode 100644 index 0000000..dcb5f30 Binary files /dev/null and b/api/v1/common/tool/shp/test_files/polygonz.shp differ diff --git a/api/v1/common/tool/shp/test_files/polygonz.shx b/api/v1/common/tool/shp/test_files/polygonz.shx new file mode 100644 index 0000000..2927ba5 Binary files /dev/null and b/api/v1/common/tool/shp/test_files/polygonz.shx differ diff --git a/api/v1/common/tool/shp/test_files/polyline.dbf b/api/v1/common/tool/shp/test_files/polyline.dbf new file mode 100644 index 0000000..454e05b Binary files /dev/null and b/api/v1/common/tool/shp/test_files/polyline.dbf differ diff --git a/api/v1/common/tool/shp/test_files/polyline.shp b/api/v1/common/tool/shp/test_files/polyline.shp new file mode 100644 index 0000000..938bc5a Binary files /dev/null and b/api/v1/common/tool/shp/test_files/polyline.shp differ diff --git a/api/v1/common/tool/shp/test_files/polyline.shx b/api/v1/common/tool/shp/test_files/polyline.shx new file mode 100644 index 0000000..4b67ef0 Binary files /dev/null and b/api/v1/common/tool/shp/test_files/polyline.shx differ diff --git a/api/v1/common/tool/shp/test_files/polylinem.dbf b/api/v1/common/tool/shp/test_files/polylinem.dbf new file mode 100644 index 0000000..454e05b Binary files /dev/null and b/api/v1/common/tool/shp/test_files/polylinem.dbf differ diff --git a/api/v1/common/tool/shp/test_files/polylinem.shp b/api/v1/common/tool/shp/test_files/polylinem.shp new file mode 100644 index 0000000..19a685c Binary files /dev/null and b/api/v1/common/tool/shp/test_files/polylinem.shp differ diff --git a/api/v1/common/tool/shp/test_files/polylinem.shx b/api/v1/common/tool/shp/test_files/polylinem.shx new file mode 100644 index 0000000..43158b6 Binary files /dev/null and b/api/v1/common/tool/shp/test_files/polylinem.shx differ diff --git a/api/v1/common/tool/shp/test_files/polylinez.dbf b/api/v1/common/tool/shp/test_files/polylinez.dbf new file mode 100644 index 0000000..454e05b Binary files /dev/null and b/api/v1/common/tool/shp/test_files/polylinez.dbf differ diff --git a/api/v1/common/tool/shp/test_files/polylinez.shp b/api/v1/common/tool/shp/test_files/polylinez.shp new file mode 100644 index 0000000..9727232 Binary files /dev/null and b/api/v1/common/tool/shp/test_files/polylinez.shp differ diff --git a/api/v1/common/tool/shp/test_files/polylinez.shx b/api/v1/common/tool/shp/test_files/polylinez.shx new file mode 100644 index 0000000..1a9c9a6 Binary files /dev/null and b/api/v1/common/tool/shp/test_files/polylinez.shx differ diff --git a/api/v1/common/tool/shp/writer.go b/api/v1/common/tool/shp/writer.go new file mode 100644 index 0000000..265f388 --- /dev/null +++ b/api/v1/common/tool/shp/writer.go @@ -0,0 +1,345 @@ +package shp + +import ( + "encoding/binary" + "errors" + "fmt" + "io" + "math" + "os" + "path/filepath" + "strconv" + "strings" +) + +// Writer is the type that is used to write a new shapefile. +type Writer struct { + filename string + shp writeSeekCloser + shx writeSeekCloser + GeometryType ShapeType + num int32 + bbox Box + + dbf writeSeekCloser + dbfFields []Field + dbfHeaderLength int16 + dbfRecordLength int16 +} + +type writeSeekCloser interface { + io.Writer + io.Seeker + io.Closer +} + +// Create returns a point to new Writer and the first error that was +// encountered. In case an error occurred the returned Writer point will be nil +// This also creates a corresponding SHX file. It is important to use Close() +// when done because that method writes all the headers for each file (SHP, SHX +// and DBF). +// If filename does not end on ".shp" already, it will be treated as the basename +// for the file and the ".shp" extension will be appended to that name. +func Create(filename string, t ShapeType) (*Writer, error) { + if strings.HasSuffix(strings.ToLower(filename), ".shp") { + filename = filename[0 : len(filename)-4] + } + shp, err := os.Create(filename + ".shp") + if err != nil { + return nil, err + } + shx, err := os.Create(filename + ".shx") + if err != nil { + return nil, err + } + shp.Seek(100, io.SeekStart) + shx.Seek(100, io.SeekStart) + w := &Writer{ + filename: filename, + shp: shp, + shx: shx, + GeometryType: t, + } + return w, nil +} + +// Append returns a Writer pointer that will append to the given shapefile and +// the first error that was encounted during creation of that Writer. The +// shapefile must have a valid index file. +func Append(filename string) (*Writer, error) { + shp, err := os.OpenFile(filename, os.O_RDWR, 0666) + if err != nil { + return nil, err + } + ext := filepath.Ext(filename) + basename := filename[:len(filename)-len(ext)] + w := &Writer{ + filename: basename, + shp: shp, + } + _, err = shp.Seek(32, io.SeekStart) + if err != nil { + return nil, fmt.Errorf("cannot seek to SHP geometry type: %v", err) + } + err = binary.Read(shp, binary.LittleEndian, &w.GeometryType) + if err != nil { + return nil, fmt.Errorf("cannot read geometry type: %v", err) + } + er := &errReader{Reader: shp} + w.bbox.MinX = readFloat64(er) + w.bbox.MinY = readFloat64(er) + w.bbox.MaxX = readFloat64(er) + w.bbox.MaxY = readFloat64(er) + if er.e != nil { + return nil, fmt.Errorf("cannot read bounding box: %v", er.e) + } + + shx, err := os.OpenFile(basename+".shx", os.O_RDWR, 0666) + if os.IsNotExist(err) { + // TODO allow index file to not exist, in that case just + // read through all the shapes and create it on the fly + } + if err != nil { + return nil, fmt.Errorf("cannot open shapefile index: %v", err) + } + _, err = shx.Seek(-8, io.SeekEnd) + if err != nil { + return nil, fmt.Errorf("cannot seek to last shape index: %v", err) + } + var offset int32 + err = binary.Read(shx, binary.BigEndian, &offset) + if err != nil { + return nil, fmt.Errorf("cannot read last shape index: %v", err) + } + offset = offset * 2 + _, err = shp.Seek(int64(offset), io.SeekStart) + if err != nil { + return nil, fmt.Errorf("cannot seek to last shape: %v", err) + } + err = binary.Read(shp, binary.BigEndian, &w.num) + if err != nil { + return nil, fmt.Errorf("cannot read number of last shape: %v", err) + } + _, err = shp.Seek(0, io.SeekEnd) + if err != nil { + return nil, fmt.Errorf("cannot seek to SHP end: %v", err) + } + _, err = shx.Seek(0, io.SeekEnd) + if err != nil { + return nil, fmt.Errorf("cannot seek to SHX end: %v", err) + } + w.shx = shx + + dbf, err := os.Open(basename + ".dbf") + if os.IsNotExist(err) { + return w, nil // it's okay if the DBF does not exist + } + if err != nil { + return nil, fmt.Errorf("cannot open DBF: %v", err) + } + + _, err = dbf.Seek(8, io.SeekStart) + if err != nil { + return nil, fmt.Errorf("cannot seek in DBF: %v", err) + } + err = binary.Read(dbf, binary.LittleEndian, &w.dbfHeaderLength) + if err != nil { + return nil, fmt.Errorf("cannot read header length from DBF: %v", err) + } + err = binary.Read(dbf, binary.LittleEndian, &w.dbfRecordLength) + if err != nil { + return nil, fmt.Errorf("cannot read record length from DBF: %v", err) + } + + _, err = dbf.Seek(20, io.SeekCurrent) // skip padding + if err != nil { + return nil, fmt.Errorf("cannot seek in DBF: %v", err) + } + numFields := int(math.Floor(float64(w.dbfHeaderLength-33) / 32.0)) + w.dbfFields = make([]Field, numFields) + err = binary.Read(dbf, binary.LittleEndian, &w.dbfFields) + if err != nil { + return nil, fmt.Errorf("cannot read number of fields from DBF: %v", err) + } + _, err = dbf.Seek(0, io.SeekEnd) // skip padding + if err != nil { + return nil, fmt.Errorf("cannot seek to DBF end: %v", err) + } + w.dbf = dbf + + return w, nil +} + +// Write shape to the Shapefile. This also creates +// a record in the SHX file and DBF file (if it is +// initialized). Returns the index of the written object +// which can be used in WriteAttribute. +func (w *Writer) Write(shape Shape) int32 { + // increate bbox + if w.num == 0 { + w.bbox = shape.BBox() + } else { + w.bbox.Extend(shape.BBox()) + } + + w.num++ + binary.Write(w.shp, binary.BigEndian, w.num) + w.shp.Seek(4, io.SeekCurrent) + start, _ := w.shp.Seek(0, io.SeekCurrent) + binary.Write(w.shp, binary.LittleEndian, w.GeometryType) + shape.write(w.shp) + finish, _ := w.shp.Seek(0, io.SeekCurrent) + length := int32(math.Floor((float64(finish) - float64(start)) / 2.0)) + w.shp.Seek(start-4, io.SeekStart) + binary.Write(w.shp, binary.BigEndian, length) + w.shp.Seek(finish, io.SeekStart) + + // write shx + binary.Write(w.shx, binary.BigEndian, int32((start-8)/2)) + binary.Write(w.shx, binary.BigEndian, length) + + // write empty record to dbf + if w.dbf != nil { + w.writeEmptyRecord() + } + + return w.num - 1 +} + +// Close closes the Writer. This must be used at the end of +// the transaction because it writes the correct headers +// to the SHP/SHX and DBF files before closing. +func (w *Writer) Close() { + w.writeHeader(w.shx) + w.writeHeader(w.shp) + w.shp.Close() + w.shx.Close() + + if w.dbf == nil { + w.SetFields([]Field{}) + } + w.writeDbfHeader(w.dbf) + w.dbf.Close() +} + +// writeHeader wrires SHP/SHX headers to ws. +func (w *Writer) writeHeader(ws io.WriteSeeker) { + filelength, _ := ws.Seek(0, io.SeekEnd) + if filelength == 0 { + filelength = 100 + } + ws.Seek(0, io.SeekStart) + // file code + binary.Write(ws, binary.BigEndian, []int32{9994, 0, 0, 0, 0, 0}) + // file length + binary.Write(ws, binary.BigEndian, int32(filelength/2)) + // version and shape type + binary.Write(ws, binary.LittleEndian, []int32{1000, int32(w.GeometryType)}) + // bounding box + binary.Write(ws, binary.LittleEndian, w.bbox) + // elevation, measure + binary.Write(ws, binary.LittleEndian, []float64{0.0, 0.0, 0.0, 0.0}) +} + +// writeDbfHeader writes a DBF header to ws. +func (w *Writer) writeDbfHeader(ws io.WriteSeeker) { + ws.Seek(0, 0) + // version, year (YEAR-1990), month, day + binary.Write(ws, binary.LittleEndian, []byte{3, 24, 5, 3}) + // number of records + binary.Write(ws, binary.LittleEndian, w.num) + // header length, record length + binary.Write(ws, binary.LittleEndian, []int16{w.dbfHeaderLength, w.dbfRecordLength}) + // padding + binary.Write(ws, binary.LittleEndian, make([]byte, 20)) + + for _, field := range w.dbfFields { + binary.Write(ws, binary.LittleEndian, field) + } + + // end with return + ws.Write([]byte("\r")) +} + +// SetFields sets field values in the DBF. This initializes the DBF file and +// should be used prior to writing any attributes. +func (w *Writer) SetFields(fields []Field) error { + if w.dbf != nil { + return errors.New("Cannot set fields in existing dbf") + } + + var err error + w.dbf, err = os.Create(w.filename + ".dbf") + if err != nil { + return fmt.Errorf("Failed to open %s.dbf: %v", w.filename, err) + } + w.dbfFields = fields + + // calculate record length + w.dbfRecordLength = int16(1) + for _, field := range w.dbfFields { + w.dbfRecordLength += int16(field.Size) + } + + // header lengh + w.dbfHeaderLength = int16(len(w.dbfFields)*32 + 33) + + // fill header space with empty bytes for now + buf := make([]byte, w.dbfHeaderLength) + binary.Write(w.dbf, binary.LittleEndian, buf) + + // write empty records + for n := int32(0); n < w.num; n++ { + w.writeEmptyRecord() + } + return nil +} + +// Writes an empty record to the end of the DBF. This +// works by seeking to the end of the file and writing +// dbfRecordLength number of bytes. The first byte is a +// space that indicates a new record. +func (w *Writer) writeEmptyRecord() { + w.dbf.Seek(0, io.SeekEnd) + buf := make([]byte, w.dbfRecordLength) + buf[0] = ' ' + binary.Write(w.dbf, binary.LittleEndian, buf) +} + +// WriteAttribute writes value for field into the given row in the DBF. Row +// number should be the same as the order the Shape was written to the +// Shapefile. The field value corresponds to the field in the slice used in +// SetFields. +func (w *Writer) WriteAttribute(row int, field int, value interface{}) error { + var buf []byte + switch v := value.(type) { + case int: + buf = []byte(strconv.Itoa(v)) + case float64: + precision := w.dbfFields[field].Precision + buf = []byte(strconv.FormatFloat(v, 'f', int(precision), 64)) + case string: + buf = []byte(v) + default: + return fmt.Errorf("Unsupported value type: %T", v) + } + + if w.dbf == nil { + return errors.New("Initialize DBF by using SetFields first") + } + if sz := int(w.dbfFields[field].Size); len(buf) > sz { + return fmt.Errorf("Unable to write field %v: %q exceeds field length %v", field, buf, sz) + } + + seekTo := 1 + int64(w.dbfHeaderLength) + (int64(row) * int64(w.dbfRecordLength)) + for n := 0; n < field; n++ { + seekTo += int64(w.dbfFields[n].Size) + } + w.dbf.Seek(seekTo, io.SeekStart) + return binary.Write(w.dbf, binary.LittleEndian, buf) +} + +// BBox returns the bounding box of the Writer. +func (w *Writer) BBox() Box { + return w.bbox +} diff --git a/api/v1/common/tool/shp/writer_test.go b/api/v1/common/tool/shp/writer_test.go new file mode 100644 index 0000000..aec8205 --- /dev/null +++ b/api/v1/common/tool/shp/writer_test.go @@ -0,0 +1,209 @@ +package shp + +import ( + "bytes" + "io" + "os" + "reflect" + "testing" +) + +var filenamePrefix = "test_files/write_" + +func removeShapefile(filename string) { + os.Remove(filename + ".shp") + os.Remove(filename + ".shx") + os.Remove(filename + ".dbf") +} + +func pointsToFloats(points []Point) [][]float64 { + floats := make([][]float64, len(points)) + for k, v := range points { + floats[k] = make([]float64, 2) + floats[k][0] = v.X + floats[k][1] = v.Y + } + return floats +} + +func TestAppend(t *testing.T) { + filename := filenamePrefix + "point" + defer removeShapefile(filename) + points := [][]float64{ + {0.0, 0.0}, + {5.0, 5.0}, + {10.0, 10.0}, + } + + shape, err := Create(filename+".shp", POINT) + if err != nil { + t.Fatal(err) + } + for _, p := range points { + shape.Write(&Point{p[0], p[1]}) + } + wantNum := shape.num + shape.Close() + + newPoints := [][]float64{ + {15.0, 15.0}, + {20.0, 20.0}, + {25.0, 25.0}, + } + shape, err = Append(filename + ".shp") + if err != nil { + t.Fatal(err) + } + if shape.GeometryType != POINT { + t.Fatalf("wanted geo type %d, got %d", POINT, shape.GeometryType) + } + if shape.num != wantNum { + t.Fatalf("wrong 'num', wanted type %d, got %d", wantNum, shape.num) + } + + for _, p := range newPoints { + shape.Write(&Point{p[0], p[1]}) + } + + points = append(points, newPoints...) + + shapes := getShapesFromFile(filename, t) + if len(shapes) != len(points) { + t.Error("Number of shapes read was wrong") + } + testPoint(t, points, shapes) +} + +func TestWritePoint(t *testing.T) { + filename := filenamePrefix + "point" + defer removeShapefile(filename) + + points := [][]float64{ + {0.0, 0.0}, + {5.0, 5.0}, + {10.0, 10.0}, + } + + shape, err := Create(filename+".shp", POINT) + if err != nil { + t.Fatal(err) + } + for _, p := range points { + shape.Write(&Point{p[0], p[1]}) + } + shape.Close() + + shapes := getShapesFromFile(filename, t) + if len(shapes) != len(points) { + t.Error("Number of shapes read was wrong") + } + testPoint(t, points, shapes) +} + +func TestWritePolyLine(t *testing.T) { + filename := filenamePrefix + "polyline" + defer removeShapefile(filename) + + points := [][]Point{ + {Point{0.0, 0.0}, Point{5.0, 5.0}}, + {Point{10.0, 10.0}, Point{15.0, 15.0}}, + } + + shape, err := Create(filename+".shp", POLYLINE) + if err != nil { + t.Log(shape, err) + } + + l := NewPolyLine(points) + + lWant := &PolyLine{ + Box: Box{MinX: 0, MinY: 0, MaxX: 15, MaxY: 15}, + NumParts: 2, + NumPoints: 4, + Parts: []int32{0, 2}, + Points: []Point{{X: 0, Y: 0}, + {X: 5, Y: 5}, + {X: 10, Y: 10}, + {X: 15, Y: 15}, + }, + } + if !reflect.DeepEqual(l, lWant) { + t.Errorf("incorrect NewLine: have: %+v; want: %+v", l, lWant) + } + + shape.Write(l) + shape.Close() + + shapes := getShapesFromFile(filename, t) + if len(shapes) != 1 { + t.Error("Number of shapes read was wrong") + } + testPolyLine(t, pointsToFloats(flatten(points)), shapes) +} + +type seekTracker struct { + io.Writer + offset int64 +} + +func (s *seekTracker) Seek(offset int64, whence int) (int64, error) { + s.offset = offset + return s.offset, nil +} + +func (s *seekTracker) Close() error { + return nil +} + +func TestWriteAttribute(t *testing.T) { + buf := new(bytes.Buffer) + s := &seekTracker{Writer: buf} + w := Writer{ + dbf: s, + dbfFields: []Field{ + StringField("A_STRING", 6), + FloatField("A_FLOAT", 8, 4), + NumberField("AN_INT", 4), + }, + dbfRecordLength: 100, + } + + tests := []struct { + name string + row int + field int + data interface{} + wantOffset int64 + wantData string + }{ + {"string-0", 0, 0, "test", 1, "test"}, + {"string-0-overflow-1", 0, 0, "overflo", 0, ""}, + {"string-0-overflow-n", 0, 0, "overflowing", 0, ""}, + {"string-3", 3, 0, "things", 301, "things"}, + {"float-0", 0, 1, 123.44, 7, "123.4400"}, + {"float-0-overflow-1", 0, 1, 1234.0, 0, ""}, + {"float-0-overflow-n", 0, 1, 123456789.0, 0, ""}, + {"int-0", 0, 2, 4242, 15, "4242"}, + {"int-0-overflow-1", 0, 2, 42424, 0, ""}, + {"int-0-overflow-n", 0, 2, 42424343, 0, ""}, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + buf.Reset() + s.offset = 0 + + err := w.WriteAttribute(test.row, test.field, test.data) + + if buf.String() != test.wantData { + t.Errorf("got data: %v, want: %v", buf.String(), test.wantData) + } + if s.offset != test.wantOffset { + t.Errorf("got seek offset: %v, want: %v", s.offset, test.wantOffset) + } + if err == nil && test.wantData == "" { + t.Error("got no data and no error") + } + }) + } +} diff --git a/api/v1/common/tool/shp/zipreader.go b/api/v1/common/tool/shp/zipreader.go new file mode 100644 index 0000000..5c948dc --- /dev/null +++ b/api/v1/common/tool/shp/zipreader.go @@ -0,0 +1,151 @@ +package shp + +import ( + "archive/zip" + "fmt" + "io" + "path" + "strings" +) + +// ZipReader provides an interface for reading Shapefiles that are compressed in a ZIP archive. +type ZipReader struct { + sr SequentialReader + z *zip.ReadCloser +} + +// openFromZIP is convenience function for opening the file called name that is +// compressed in z for reading. +func openFromZIP(z *zip.ReadCloser, name string) (io.ReadCloser, error) { + for _, f := range z.File { + if f.Name == name { + return f.Open() + + } + } + return nil, fmt.Errorf("No such file in archive: %s", name) +} + +// OpenZip opens a ZIP file that contains a single shapefile. +func OpenZip(zipFilePath string) (*ZipReader, error) { + z, err := zip.OpenReader(zipFilePath) + if err != nil { + return nil, err + } + zr := &ZipReader{ + z: z, + } + shapeFiles := shapesInZip(z) + if len(shapeFiles) == 0 { + return nil, fmt.Errorf("archive does not contain a .shp file") + } + if len(shapeFiles) > 1 { + return nil, fmt.Errorf("archive does contain multiple .shp files") + } + + shp, err := openFromZIP(zr.z, shapeFiles[0].Name) + if err != nil { + return nil, err + } + withoutExt := strings.TrimSuffix(shapeFiles[0].Name, ".shp") + // dbf is optional, so no error checking here + dbf, _ := openFromZIP(zr.z, withoutExt+".dbf") + zr.sr = SequentialReaderFromExt(shp, dbf) + return zr, nil +} + +// ShapesInZip returns a string-slice with the names (i.e. relatives paths in +// archive file tree) of all shapes that are in the ZIP archive at zipFilePath. +func ShapesInZip(zipFilePath string) ([]string, error) { + var names []string + z, err := zip.OpenReader(zipFilePath) + if err != nil { + return nil, err + } + shapeFiles := shapesInZip(z) + for i := range shapeFiles { + names = append(names, shapeFiles[i].Name) + } + return names, nil +} + +func shapesInZip(z *zip.ReadCloser) []*zip.File { + var shapeFiles []*zip.File + for _, f := range z.File { + if strings.HasSuffix(f.Name, ".shp") { + shapeFiles = append(shapeFiles, f) + } + } + return shapeFiles +} + +// OpenShapeFromZip opens a shape file that is contained in a ZIP archive. The +// parameter name is name of the shape file. +// The name of the shapefile must be a relative path: it must not start with a +// drive letter (e.g. C:) or leading slash, and only forward slashes are +// allowed. These rules are the same as in +// https://golang.org/pkg/archive/zip/#FileHeader. +func OpenShapeFromZip(zipFilePath string, name string) (*ZipReader, error) { + z, err := zip.OpenReader(zipFilePath) + if err != nil { + return nil, err + } + zr := &ZipReader{ + z: z, + } + + shp, err := openFromZIP(zr.z, name) + if err != nil { + return nil, err + } + // dbf is optional, so no error checking here + prefix := strings.TrimSuffix(name, path.Ext(name)) + dbf, _ := openFromZIP(zr.z, prefix+".dbf") + zr.sr = SequentialReaderFromExt(shp, dbf) + return zr, nil +} + +// Close closes the ZipReader and frees the allocated resources. +func (zr *ZipReader) Close() error { + s := "" + err := zr.sr.Close() + if err != nil { + s += err.Error() + ". " + } + err = zr.z.Close() + if err != nil { + s += err.Error() + ". " + } + if s != "" { + return fmt.Errorf(s) + } + return nil +} + +// Next reads the next shape in the shapefile and the next row in the DBF. Call +// Shape() and Attribute() to access the values. +func (zr *ZipReader) Next() bool { + return zr.sr.Next() +} + +// Shape returns the shape that was last read as well as the current index. +func (zr *ZipReader) Shape() (int, Shape) { + return zr.sr.Shape() +} + +// Attribute returns the n-th field of the last row that was read. If there +// were any errors before, the empty string is returned. +func (zr *ZipReader) Attribute(n int) string { + return zr.sr.Attribute(n) +} + +// Fields returns a slice of Fields that are present in the +// DBF table. +func (zr *ZipReader) Fields() []Field { + return zr.sr.Fields() +} + +// Err returns the last non-EOF error that was encountered by this ZipReader. +func (zr *ZipReader) Err() error { + return zr.sr.Err() +} diff --git a/api/v1/common/tool/shp/zipreader_test.go b/api/v1/common/tool/shp/zipreader_test.go new file mode 100644 index 0000000..22a3858 --- /dev/null +++ b/api/v1/common/tool/shp/zipreader_test.go @@ -0,0 +1,236 @@ +package shp + +import ( + "archive/zip" + "io" + "io/ioutil" + "net/http" + "os" + "path" + "path/filepath" + "testing" +) + +func compressFileToZIP(zw *zip.Writer, src, tgt string, t *testing.T) { + r, err := os.Open(src) + if err != nil { + t.Fatalf("Could not open for compression %s: %v", src, err) + } + w, err := zw.Create(tgt) + if err != nil { + t.Fatalf("Could not start to compress %s: %v", tgt, err) + } + _, err = io.Copy(w, r) + if err != nil { + t.Fatalf("Could not compress contents for %s: %v", tgt, err) + } +} + +// createTempZIP packs the SHP, SHX, and DBF into a ZIP in a temporary +// directory +func createTempZIP(prefix string, t *testing.T) (dir, filename string) { + dir, err := ioutil.TempDir("", "go-shp-test") + if err != nil { + t.Fatalf("Could not create temporary directory: %v", err) + } + base := filepath.Base(prefix) + zipName := base + ".zip" + w, err := os.Create(filepath.Join(dir, zipName)) + if err != nil { + t.Fatalf("Could not create temporary zip file: %v", err) + } + zw := zip.NewWriter(w) + for _, suffix := range []string{".shp", ".shx", ".dbf"} { + compressFileToZIP(zw, prefix+suffix, base+suffix, t) + } + if err := zw.Close(); err != nil { + t.Fatalf("Could not close the written zip: %v", err) + } + return dir, zipName +} + +func getShapesZipped(prefix string, t *testing.T) (shapes []Shape) { + dir, filename := createTempZIP(prefix, t) + defer os.RemoveAll(dir) + zr, err := OpenZip(filepath.Join(dir, filename)) + if err != nil { + t.Errorf("Error when opening zip file: %v", err) + } + for zr.Next() { + _, shape := zr.Shape() + shapes = append(shapes, shape) + } + if err := zr.Err(); err != nil { + t.Errorf("Error when iterating over the shapes: %v", err) + } + + if err := zr.Close(); err != nil { + t.Errorf("Could not close zipreader: %v", err) + } + return shapes +} + +func TestZipReader(t *testing.T) { + for prefix := range dataForReadTests { + t.Logf("Testing zipped reading for %s", prefix) + testshapeIdentity(t, prefix, getShapesZipped) + } +} + +func unzipToTempDir(t *testing.T, p string) string { + td, err := ioutil.TempDir("", "") + if err != nil { + t.Fatalf("%v", err) + } + zip, err := zip.OpenReader(p) + if err != nil { + t.Fatalf("%v", err) + } + defer zip.Close() + for _, f := range zip.File { + _, fn := path.Split(f.Name) + pn := filepath.Join(td, fn) + t.Logf("Uncompress: %s -> %s", f.Name, pn) + w, err := os.Create(pn) + if err != nil { + t.Fatalf("Cannot unzip %s: %v", p, err) + } + defer w.Close() + r, err := f.Open() + if err != nil { + t.Fatalf("Cannot unzip %s: %v", p, err) + } + defer r.Close() + _, err = io.Copy(w, r) + if err != nil { + t.Fatalf("Cannot unzip %s: %v", p, err) + } + } + return td +} + +// TestZipReaderAttributes reads the same shapesfile twice, first directly from +// the Shp with a Reader, and, second, from a zip. It compares the fields as +// well as the shapes and the attributes. For this test, the Shapes are +// considered to be equal if their bounding boxes are equal. +func TestZipReaderAttribute(t *testing.T) { + b := "ne_110m_admin_0_countries" + skipOrDownloadNaturalEarth(t, b+".zip") + d := unzipToTempDir(t, b+".zip") + defer os.RemoveAll(d) + lr, err := Open(filepath.Join(d, b+".shp")) + if err != nil { + t.Fatal(err) + } + defer lr.Close() + zr, err := OpenZip(b + ".zip") + if os.IsNotExist(err) { + t.Skipf("Skipping test, as Natural Earth dataset wasn't found") + } + if err != nil { + t.Fatal(err) + } + defer zr.Close() + fsl := lr.Fields() + fsz := zr.Fields() + if len(fsl) != len(fsz) { + t.Fatalf("Number of attributes do not match: Wanted %d, got %d", len(fsl), len(fsz)) + } + for i := range fsl { + if fsl[i] != fsz[i] { + t.Fatalf("Attribute %d (%s) does not match (%s)", i, fsl[i], fsz[i]) + } + } + for zr.Next() && lr.Next() { + ln, ls := lr.Shape() + zn, zs := zr.Shape() + if ln != zn { + t.Fatalf("Sequence number wrong: Wanted %d, got %d", ln, zn) + } + if ls.BBox() != zs.BBox() { + t.Fatalf("Bounding boxes for shape #%d do not match", ln+1) + } + for i := range fsl { + la := lr.Attribute(i) + za := zr.Attribute(i) + if la != za { + t.Fatalf("Shape %d: Attribute %d (%s) are unequal: '%s' vs '%s'", + ln+1, i, fsl[i].String(), la, za) + } + } + } + if lr.Err() != nil { + t.Logf("Reader error: %v / ZipReader error: %v", lr.Err(), zr.Err()) + t.FailNow() + } +} + +func skipOrDownloadNaturalEarth(t *testing.T, p string) { + if _, err := os.Stat(p); os.IsNotExist(err) { + dl := false + for _, a := range os.Args { + if a == "download" { + dl = true + break + } + } + u := "http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_0_countries.zip" + if !dl { + t.Skipf("Skipped, as %s does not exist. Consider calling tests with '-args download` "+ + "or download manually from '%s'", p, u) + } else { + t.Logf("Downloading %s", u) + w, err := os.Create(p) + if err != nil { + t.Fatalf("Could not create %q: %v", p, err) + } + defer w.Close() + resp, err := http.Get(u) + if err != nil { + t.Fatalf("Could not download %q: %v", u, err) + } + defer resp.Body.Close() + _, err = io.Copy(w, resp.Body) + if err != nil { + t.Fatalf("Could not download %q: %v", u, err) + } + t.Logf("Download complete") + } + } +} + +func TestNaturalEarthZip(t *testing.T) { + type metaShape struct { + Attributes map[string]string + Shape + } + p := "ne_110m_admin_0_countries.zip" + skipOrDownloadNaturalEarth(t, p) + zr, err := OpenZip(p) + if err != nil { + t.Fatal(err) + } + defer zr.Close() + + fs := zr.Fields() + if len(fs) != 63 { + t.Fatalf("Expected 63 columns in Natural Earth dataset, got %d", len(fs)) + } + var metas []metaShape + for zr.Next() { + m := metaShape{ + Attributes: make(map[string]string), + } + _, m.Shape = zr.Shape() + for n := range fs { + m.Attributes[fs[n].String()] = zr.Attribute(n) + } + metas = append(metas, m) + } + if zr.Err() != nil { + t.Fatal(zr.Err()) + } + for _, m := range metas { + t.Log(m.Attributes["name"]) + } +} diff --git a/api/v1/common/tool/tool.go b/api/v1/common/tool/tool.go new file mode 100644 index 0000000..99a9825 --- /dev/null +++ b/api/v1/common/tool/tool.go @@ -0,0 +1,308 @@ +package tool + +import ( + "bytes" + "crypto/md5" + "encoding/base64" + "encoding/hex" + "fmt" + "io" + "io/ioutil" + "log" + "math/rand" + "net/http" + "os" + "os/exec" + "path/filepath" + "reflect" + "regexp" + "runtime" + "sort" + "strconv" + "strings" + "time" +) + +/* +判断文件或文件夹是否存在 +如果返回的错误为nil,说明文件或文件夹存在 +如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或文件夹不存在 +如果返回的错误为其它类型,则不确定是否在存在 +*/ +func PathExists(path string) bool { + + _, err := os.Stat(path) + if err == nil { + return true + } + if os.IsNotExist(err) { + return false + } + return false +} + +/* +检查字符串是否在某一数组中 +*/ +func IsContainStr(items []string, item string) bool { + for _, eachItem := range items { + if eachItem == item { + return true + } + } + return false +} + +// 调用os.MkdirAll递归创建文件夹 +func CreateDir(dirPath string) { + if !isExist(dirPath) { + fmt.Println("路径不存在,创建路径", dirPath) + _ = os.MkdirAll(dirPath, os.ModePerm) + } +} + +// 判断所给路径文件/文件夹是否存在(返回true是存在) +func isExist(path string) bool { + _, err := os.Stat(path) //os.Stat获取文件信息 + if err != nil { + if os.IsExist(err) { + return true + } + return false + } + return true +} + +/*获取uuid*/ +func GetUuid() string { + str := GetRandstring(32) + time.Sleep(time.Nanosecond) + return strings.ToLower(Md5V(str)) +} + +// #取得随机字符串:使用字符串拼接 +func GetRandstring(lenNum int) string { + var CHARS = []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", + "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", + "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"} + str := strings.Builder{} + length := len(CHARS) + for i := 0; i < lenNum; i++ { + l := CHARS[rand.Intn(length)] + str.WriteString(l) + } + return str.String() + +} + +// 获取当前执行程序所在的绝对路径 +func GetCurrentAbPathByExecutable() string { + exePath, err := os.Executable() + if err != nil { + log.Fatal(err) + } + res, _ := filepath.EvalSymlinks(filepath.Dir(exePath)) + return res +} + +/*结构体转map且首字母小写*/ +func Struct2Map(obj interface{}) map[string]interface{} { + t := reflect.TypeOf(obj) + v := reflect.ValueOf(obj) + var data = make(map[string]interface{}) + for i := 0; i < t.NumField(); i++ { + data[strings.ToLower(string(t.Field(i).Name[0]))+t.Field(i).Name[1:]] = v.Field(i).Interface() + //data[t.Field(i).Name] = v.Field(i).Interface() + } + return data +} +func PortInUse(port int) int { + checkStatement := fmt.Sprintf("lsof -i:%d ", port) + output, _ := exec.Command("sh", "-c", checkStatement).CombinedOutput() + fmt.Println(output) + if len(output) > 0 { + return 1 + } + return -1 +} + +/*检测端口是否在使用中*/ +// 传入查询的端口号 +// 返回端口号对应的进程PID,若没有找到相关进程,返回-1 +func portInUse(portNumber int) int { + res := -1 + var outBytes bytes.Buffer + sysType := runtime.GOOS + fmt.Println(sysType) + var cmdStr = "" + if sysType == "linux" { + cmdStr = fmt.Sprintf("lsof -i:%d ", portNumber) + } + // + if sysType == "windows" { + cmdStr = fmt.Sprintf("netstat -ano -p tcp | findstr %d", portNumber) + } + //checkStatement := fmt.Sprintf("lsof -i:%d ", portNumber) + fmt.Println(cmdStr) + cmd := exec.Command("cmd", "/c", cmdStr) + cmd.Stdout = &outBytes + cmd.Run() + resStr := outBytes.String() + fmt.Println(resStr) + r := regexp.MustCompile(`\s\d+\s`).FindAllString(resStr, -1) + if len(r) > 0 { + pid, err := strconv.Atoi(strings.TrimSpace(r[0])) + if err != nil { + res = -1 + } else { + res = pid + } + } + return res +} + +func GetUnUsePort(port int) int { + isInUse := PortInUse(port) + if isInUse != -1 { + fmt.Println("端口:" + strconv.Itoa(port) + " 被占用") + port++ + port = GetUnUsePort(port) + return port + } else { + return port + } +} + +// WeekIntervalTime 获取某周的开始和结束时间,week为0本周,-1上周,1下周以此类推 +func WeekIntervalTime(week int) (startTime, endTime string) { + now := time.Now() + offset := int(time.Monday - now.Weekday()) + //周日做特殊判断 因为time.Monday = 0 + if offset > 0 { + offset = -6 + } + + year, month, day := now.Date() + thisWeek := time.Date(year, month, day, 0, 0, 0, 0, time.Local) + startTime = thisWeek.AddDate(0, 0, offset+7*week).Format("2006-01-02") + " 00:00:00" + endTime = thisWeek.AddDate(0, 0, offset+6+7*week).Format("2006-01-02") + " 23:59:59" + + return startTime, endTime +} + +// GetCurrentTime 获取当前系统时间 +func GetCurrentTime() string { + return time.Now().Format("2006-01-02 15:04:05") +} + +/*删除文件或文件夹*/ +func RemoveFile(path string) { + if isExist(path) { + err := os.Remove(path) + if err != nil { + return + } + } +} + +// 检查参数 +func Md5V(str string) string { + h := md5.New() + h.Write([]byte(str)) + return hex.EncodeToString(h.Sum(nil)) +} + +// download file会将url下载到本地文件,它会在下载时写入,而不是将整个文件加载到内存中。 +func DownloadFile(filepath string, url string) error { + + // Get the data + resp, err := http.Get(url) + if err != nil { + return err + } + defer resp.Body.Close() + // Create the file + out, err := os.Create(filepath) + if err != nil { + return err + } + defer out.Close() + + // Write the body to file + _, err = io.Copy(out, resp.Body) + return err +} + +// 通用排序 +// 结构体排序,必须重写数组Len() Swap() Less()函数 +type body_wrapper struct { + Bodys []interface{} + by func(p, q *interface{}) bool //内部Less()函数会用到 +} +type SortBodyBy func(p, q *interface{}) bool //定义一个函数类型 + +// 数组长度Len() +func (acw body_wrapper) Len() int { + return len(acw.Bodys) +} + +// 元素交换 +func (acw body_wrapper) Swap(i, j int) { + acw.Bodys[i], acw.Bodys[j] = acw.Bodys[j], acw.Bodys[i] +} + +// 比较函数,使用外部传入的by比较函数 +func (acw body_wrapper) Less(i, j int) bool { + return acw.by(&acw.Bodys[i], &acw.Bodys[j]) +} + +// 自定义排序字段,参考SortBodyByCreateTime中的传入函数 +func SortBody(bodys []interface{}, by SortBodyBy) { + sort.Sort(body_wrapper{bodys, by}) +} + +// 格式化时间 +type LocalTime time.Time + +func (t *LocalTime) MarshalJSON() ([]byte, error) { + tTime := time.Time(*t) + return []byte(fmt.Sprintf("\"%v\"", tTime.Format("2006-01-02 15:04:05"))), nil +} + +// 写入文件,保存 +func WriteFile(path string, base64_image_content string) (error, string) { + + //b, _ := regexp.MatchString(`^data:\s*image\/(\w+);base64,`, base64_image_content) + //if !b { + // return errors.New(""), "" + //} + base64_image_content = "data:image/png;base64," + base64_image_content + re, _ := regexp.Compile(`^data:\s*image\/(\w+);base64,`) + allData := re.FindAllSubmatch([]byte(base64_image_content), 2) + fileType := string(allData[0][1]) //png ,jpeg 后缀获取 + + base64Str := re.ReplaceAllString(base64_image_content, "") + + //date := time.Now().Format("2006-01-02") + //if ok := IsFileExist(path + "/" + date); !ok { + // os.Mkdir(path+"/"+date, 0666) + //} + + curFileStr := strconv.FormatInt(time.Now().UnixNano(), 10) + + r := rand.New(rand.NewSource(time.Now().UnixNano())) + n := r.Intn(99999) + var filename = curFileStr + strconv.Itoa(n) + "." + fileType + var file = path + "/" + filename + byte, _ := base64.StdEncoding.DecodeString(base64Str) + + err := ioutil.WriteFile(file, byte, 0666) + if err != nil { + log.Println(err) + } + return err, filename +} + +func UploadsFile() { + +} diff --git a/api/v1/common/tool/turf/turf.go b/api/v1/common/tool/turf/turf.go new file mode 100644 index 0000000..b6f49d8 --- /dev/null +++ b/api/v1/common/tool/turf/turf.go @@ -0,0 +1,26 @@ +package turf + +import ( + _ "embed" + "github.com/dop251/goja" +) + +//go:embed turf.min.js +var turf_min string + +//go:embed turf.js +var turf string +var Tin func(wgs84 [][]string) [][]string +var BooleanPointInPolygon func(point []float64, polygon [][]float64) bool + +//// 初始化 +//func init() { +// InitTurfjs() +//} + +func InitTurfjs() { + vm := goja.New() + vm.RunString(turf_min + turf) + vm.ExportTo(vm.Get("Tin"), &Tin) + vm.ExportTo(vm.Get("BooleanPointInPolygon"), &BooleanPointInPolygon) +} diff --git a/api/v1/common/tool/turf/turf.js b/api/v1/common/tool/turf/turf.js new file mode 100644 index 0000000..665d3c9 --- /dev/null +++ b/api/v1/common/tool/turf/turf.js @@ -0,0 +1,26 @@ +function Tin(points=[]) { + let arr = [] + points.forEach(p=>{ + arr.push(turf.point( [parseFloat(p[0]), parseFloat(p[1])])) + }) + var tin = turf.tin(turf.featureCollection(arr)); + let polylines=[] + tin.features.forEach((feature, index) => { + feature.geometry.coordinates.forEach((coordinate,) => { + polylines.push([ + coordinate[0], + coordinate[1], + coordinate[2], + ]) + }) + }) + return polylines + return JSON.stringify(polylines) +} + +function BooleanPointInPolygon(point,polygon=[]) { + var pt = turf.point([point[0],point[1]]); + var poly = turf.polygon([polygon]); + var scaledPoly = turf.transformScale(poly, 2); + return turf.booleanPointInPolygon(pt, poly) +} \ No newline at end of file diff --git a/api/v1/common/tool/turf/turf.min.js b/api/v1/common/tool/turf/turf.min.js new file mode 100644 index 0000000..60f4f82 --- /dev/null +++ b/api/v1/common/tool/turf/turf.min.js @@ -0,0 +1,91 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).turf={})}(this,(function(t){"use strict";var e=6371008.8,n={centimeters:637100880,centimetres:637100880,degrees:57.22891354143274,feet:20902260.511392,inches:39.37*e,kilometers:6371.0088,kilometres:6371.0088,meters:e,metres:e,miles:3958.761333810546,millimeters:6371008800,millimetres:6371008800,nauticalmiles:e/1852,radians:1,yards:6967335.223679999},r={centimeters:100,centimetres:100,degrees:1/111325,feet:3.28084,inches:39.37,kilometers:.001,kilometres:.001,meters:1,metres:1,miles:1/1609.344,millimeters:1e3,millimetres:1e3,nauticalmiles:1/1852,radians:1/e,yards:1.0936133},i={acres:247105e-9,centimeters:1e4,centimetres:1e4,feet:10.763910417,hectares:1e-4,inches:1550.003100006,kilometers:1e-6,kilometres:1e-6,meters:1,metres:1,miles:386e-9,millimeters:1e6,millimetres:1e6,yards:1.195990046};function o(t,e,n){void 0===n&&(n={});var r={type:"Feature"};return(0===n.id||n.id)&&(r.id=n.id),n.bbox&&(r.bbox=n.bbox),r.properties=e||{},r.geometry=t,r}function s(t,e,n){switch(t){case"Point":return a(e).geometry;case"LineString":return h(e).geometry;case"Polygon":return l(e).geometry;case"MultiPoint":return d(e).geometry;case"MultiLineString":return g(e).geometry;case"MultiPolygon":return y(e).geometry;default:throw new Error(t+" is invalid")}}function a(t,e,n){if(void 0===n&&(n={}),!t)throw new Error("coordinates is required");if(!Array.isArray(t))throw new Error("coordinates must be an Array");if(t.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!C(t[0])||!C(t[1]))throw new Error("coordinates must contain numbers");return o({type:"Point",coordinates:t},e,n)}function u(t,e,n){return void 0===n&&(n={}),f(t.map((function(t){return a(t,e)})),n)}function l(t,e,n){void 0===n&&(n={});for(var r=0,i=t;r=0))throw new Error("precision must be a positive number");var n=Math.pow(10,e||0);return Math.round(t*n)/n}function m(t,e){void 0===e&&(e="kilometers");var r=n[e];if(!r)throw new Error(e+" units is invalid");return t*r}function x(t,e){void 0===e&&(e="kilometers");var r=n[e];if(!r)throw new Error(e+" units is invalid");return t/r}function E(t,e){return w(x(t,e))}function b(t){var e=t%360;return e<0&&(e+=360),e}function w(t){return 180*(t%(2*Math.PI))/Math.PI}function I(t){return t%360*Math.PI/180}function N(t,e,n){if(void 0===e&&(e="kilometers"),void 0===n&&(n="kilometers"),!(t>=0))throw new Error("length must be a positive number");return m(x(t,e),n)}function S(t,e,n){if(void 0===e&&(e="meters"),void 0===n&&(n="kilometers"),!(t>=0))throw new Error("area must be a positive number");var r=i[e];if(!r)throw new Error("invalid original units");var o=i[n];if(!o)throw new Error("invalid final units");return t/r*o}function C(t){return!isNaN(t)&&null!==t&&!Array.isArray(t)}function P(t){return!!t&&t.constructor===Object}function M(t){if(!t)throw new Error("bbox is required");if(!Array.isArray(t))throw new Error("bbox must be an Array");if(4!==t.length&&6!==t.length)throw new Error("bbox must be an Array of 4 or 6 numbers");t.forEach((function(t){if(!C(t))throw new Error("bbox must only contain numbers")}))}function L(t){if(!t)throw new Error("id is required");if(-1===["string","number"].indexOf(typeof t))throw new Error("id must be a number or a string")}var O=Object.freeze({__proto__:null,earthRadius:e,factors:n,unitsFactors:r,areaFactors:i,feature:o,geometry:s,point:a,points:u,polygon:l,polygons:c,lineString:h,lineStrings:p,featureCollection:f,multiLineString:g,multiPoint:d,multiPolygon:y,geometryCollection:v,round:_,radiansToLength:m,lengthToRadians:x,lengthToDegrees:E,bearingToAzimuth:b,radiansToDegrees:w,degreesToRadians:I,convertLength:N,convertArea:S,isNumber:C,isObject:P,validateBBox:M,validateId:L});function R(t,e,n){if(null!==t)for(var r,i,o,s,a,u,l,c,h=0,p=0,f=t.type,g="FeatureCollection"===f,d="Feature"===f,y=g?t.features.length:1,v=0;va||f>u||g>l)return s=o,a=n,u=f,l=g,void(i=0);var d=h([s,o],t.properties);if(!1===e(d,n,r,g,i))return!1;i++,s=o}))&&void 0}}}))}function V(t,e,n){var r=n,i=!1;return U(t,(function(t,o,s,a,u){r=!1===i&&void 0===n?t:e(r,t,o,s,a,u),i=!0})),r}function X(t,e){if(!t)throw new Error("geojson is required");z(t,(function(t,n,r){if(null!==t.geometry){var i=t.geometry.type,o=t.geometry.coordinates;switch(i){case"LineString":if(!1===e(t,n,r,0,0))return!1;break;case"Polygon":for(var s=0;st[0]&&(e[0]=t[0]),e[1]>t[1]&&(e[1]=t[1]),e[2]=2&&!Array.isArray(t[0])&&!Array.isArray(t[1]))return t;throw new Error("coord must be GeoJSON Point or an Array of numbers")}function Q(t){if(Array.isArray(t))return t;if("Feature"===t.type){if(null!==t.geometry)return t.geometry.coordinates}else if(t.coordinates)return t.coordinates;throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array")}function $(t){if(t.length>1&&C(t[0])&&C(t[1]))return!0;if(Array.isArray(t[0])&&t[0].length)return $(t[0]);throw new Error("coordinates must only contain numbers")}function tt(t,e,n){if(!e||!n)throw new Error("type and name required");if(!t||t.type!==e)throw new Error("Invalid input to "+n+": must be a "+e+", given "+t.type)}function et(t,e,n){if(!t)throw new Error("No feature passed");if(!n)throw new Error(".featureOf() requires a name");if(!t||"Feature"!==t.type||!t.geometry)throw new Error("Invalid input to "+n+", Feature with geometry required");if(!t.geometry||t.geometry.type!==e)throw new Error("Invalid input to "+n+": must be a "+e+", given "+t.geometry.type)}function nt(t,e,n){if(!t)throw new Error("No featureCollection passed");if(!n)throw new Error(".collectionOf() requires a name");if(!t||"FeatureCollection"!==t.type)throw new Error("Invalid input to "+n+", FeatureCollection required");for(var r=0,i=t.features;r + * v. 1.2.0 + * https://github.com/RaumZeit/MarchingSquares.js + * + * MarchingSquaresJS is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MarchingSquaresJS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * As additional permission under GNU Affero General Public License version 3 + * section 7, third-party projects (personal or commercial) may distribute, + * include, or link against UNMODIFIED VERSIONS of MarchingSquaresJS without the + * requirement that said third-party project for that reason alone becomes + * subject to any requirement of the GNU Affero General Public License version 3. + * Any modifications to MarchingSquaresJS, however, must be shared with the public + * and made available. + * + * In summary this: + * - allows you to use MarchingSquaresJS at no cost + * - allows you to use MarchingSquaresJS for both personal and commercial purposes + * - allows you to distribute UNMODIFIED VERSIONS of MarchingSquaresJS under any + * license as long as this license notice is included + * - enables you to keep the source code of your program that uses MarchingSquaresJS + * undisclosed + * - forces you to share any modifications you have made to MarchingSquaresJS, + * e.g. bug-fixes + * + * You should have received a copy of the GNU Affero General Public License + * along with MarchingSquaresJS. If not, see . + */function ft(t,e,n){n=n||{};for(var r=Object.keys(ht),i=0;i=0&&y>=0&&y=0;h--)if(Math.abs(e[h][0][0]-l)<=r&&Math.abs(e[h][0][1]-c)<=r){for(var p=a.path.length-2;p>=0;--p)e[h].unshift(a.path[p]);u=!0;break}u||(e[n++]=a.path)}var f}))})),e}(function(t,e){for(var n=t.length-1,r=t[0].length-1,i={rows:n,cols:r,cells:[]},o=0;o=e?8:0,a|=l>=e?4:0,a|=c>=e?2:0;var p,f,g,d,y=!1;if(5===(a|=h>=e?1:0)||10===a){var v=(u+l+c+h)/4;5===a&&vn;){if(r-n>600){var o=r-n+1,s=e-n+1,a=Math.log(o),u=.5*Math.exp(2*a/3),l=.5*Math.sqrt(a*u*(o-u)/o)*(s-o/2<0?-1:1);bt(t,e,Math.max(n,Math.floor(e-s*u/o+l)),Math.min(r,Math.floor(e+(o-s)*u/o+l)),i)}var c=t[e],h=n,p=r;for(wt(t,n,e),i(t[r],c)>0&&wt(t,n,r);h0;)p--}0===i(t[n],c)?wt(t,n,p):wt(t,++p,r),p<=e&&(n=p+1),e<=p&&(r=p-1)}}function wt(t,e,n){var r=t[e];t[e]=t[n],t[n]=r}function It(t,e){return te?1:0}mt.default=xt;var Nt=Ct,St=Ct;function Ct(t,e){if(!(this instanceof Ct))return new Ct(t,e);this._maxEntries=Math.max(4,t||9),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),e&&this._initFormat(e),this.clear()}function Pt(t,e,n){if(!n)return e.indexOf(t);for(var r=0;r=t.minX&&e.maxY>=t.minY}function Gt(t){return{children:t,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function qt(t,e,n,r,i){for(var o,s=[e,n];s.length;)(n=s.pop())-(e=s.pop())<=r||(o=e+Math.ceil((n-e)/r/2)*r,mt(t,o,e,n,i),s.push(e,o,o,n))}function Bt(t){var e={exports:{}};return t(e,e.exports),e.exports}Ct.prototype={all:function(){return this._all(this.data,[])},search:function(t){var e=this.data,n=[],r=this.toBBox;if(!kt(t,e))return n;for(var i,o,s,a,u=[];e;){for(i=0,o=e.children.length;i=0&&o[e].children.length>this._maxEntries;)this._split(o,e),e--;this._adjustParentBBoxes(i,o,e)},_split:function(t,e){var n=t[e],r=n.children.length,i=this._minEntries;this._chooseSplitAxis(n,i,r);var o=this._chooseSplitIndex(n,i,r),s=Gt(n.children.splice(o,n.children.length-o));s.height=n.height,s.leaf=n.leaf,Mt(n,this.toBBox),Mt(s,this.toBBox),e?t[e-1].children.push(s):this._splitRoot(n,s)},_splitRoot:function(t,e){this.data=Gt([t,e]),this.data.height=t.height+1,this.data.leaf=!1,Mt(this.data,this.toBBox)},_chooseSplitIndex:function(t,e,n){var r,i,o,s,a,u,l,c,h,p,f,g,d,y;for(u=l=1/0,r=e;r<=n-e;r++)i=Lt(t,0,r,this.toBBox),o=Lt(t,r,n,this.toBBox),h=i,p=o,f=void 0,g=void 0,d=void 0,y=void 0,f=Math.max(h.minX,p.minX),g=Math.max(h.minY,p.minY),d=Math.min(h.maxX,p.maxX),y=Math.min(h.maxY,p.maxY),s=Math.max(0,d-f)*Math.max(0,y-g),a=At(i)+At(o),s=e;i--)o=t.children[i],Ot(u,t.leaf?s(o):o),l+=Dt(u);return l},_adjustParentBBoxes:function(t,e,n){for(var r=n;r>=0;r--)Ot(e[r],t)},_condense:function(t){for(var e,n=t.length-1;n>=0;n--)0===t[n].children.length?n>0?(e=t[n-1].children).splice(e.indexOf(t[n]),1):this.clear():Mt(t[n],this.toBBox)},_initFormat:function(t){var e=["return a"," - b",";"];this.compareMinX=new Function("a","b",e.join(t[0])),this.compareMinY=new Function("a","b",e.join(t[1])),this.toBBox=new Function("a","return {minX: a"+t[0]+", minY: a"+t[1]+", maxX: a"+t[2]+", maxY: a"+t[3]+"};")}},Nt.default=St;var zt=function(t,e,n){var r=t*e,i=jt*t,o=i-(i-t),s=t-o,a=jt*e,u=a-(a-e),l=e-u,c=s*l-(r-o*u-s*u-o*l);if(n)return n[0]=c,n[1]=r,n;return[c,r]},jt=+(Math.pow(2,27)+1);var Ut=function(t,e){var n=0|t.length,r=0|e.length;if(1===n&&1===r)return function(t,e){var n=t+e,r=n-t,i=t-(n-r)+(e-r);if(i)return[i,n];return[n]}(t[0],e[0]);var i,o,s=new Array(n+r),a=0,u=0,l=0,c=Math.abs,h=t[u],p=c(h),f=e[l],g=c(f);p=r?(i=h,(u+=1)=r?(i=h,(u+=1)>1;return["sum(",n(t.slice(0,e)),",",n(t.slice(e)),")"].join("")}function r(t){if(2===t.length)return[["sum(prod(",t[0][0],",",t[1][1],"),prod(-",t[0][1],",",t[1][0],"))"].join("")];for(var i=[],o=0;o0){if(s<=0)return a;r=i+s}else{if(!(i<0))return a;if(s>=0)return a;r=-(i+s)}var u=33306690738754716e-32*r;return a>=u||a<=-u?a:o(t,e,n)},function(t,e,n,r){var i=t[0]-r[0],o=e[0]-r[0],a=n[0]-r[0],u=t[1]-r[1],l=e[1]-r[1],c=n[1]-r[1],h=t[2]-r[2],p=e[2]-r[2],f=n[2]-r[2],g=o*c,d=a*l,y=a*u,v=i*c,_=i*l,m=o*u,x=h*(g-d)+p*(y-v)+f*(_-m),E=7771561172376103e-31*((Math.abs(g)+Math.abs(d))*Math.abs(h)+(Math.abs(y)+Math.abs(v))*Math.abs(p)+(Math.abs(_)+Math.abs(m))*Math.abs(f));return x>E||-x>E?x:s(t,e,n,r)}];function u(t){var e=a[t.length];return e||(e=a[t.length]=i(t.length)),e.apply(void 0,t)}!function(){for(;a.length<=5;)a.push(i(a.length));for(var e=[],n=["slow"],r=0;r<=5;++r)e.push("a"+r),n.push("o"+r);var o=["function getOrientation(",e.join(),"){switch(arguments.length){case 0:case 1:return 0;"];for(r=2;r<=5;++r)o.push("case ",r,":return o",r,"(",e.slice(0,r).join(),");");o.push("}var s=new Array(arguments.length);for(var i=0;i1&&Jt(t[o[l-2]],t[o[l-1]],u)<=0;)l-=1,o.pop();for(o.push(a),l=s.length;l>1&&Jt(t[s[l-2]],t[s[l-1]],u)>=0;)l-=1,s.pop();s.push(a)}n=new Array(s.length+o.length-2);for(var c=0,h=(r=0,o.length);r0;--p)n[c++]=s[p];return n},Jt=Ht[3];var Zt=Qt,Kt=Qt;function Qt(t,e){if(!(this instanceof Qt))return new Qt(t,e);if(this.data=t||[],this.length=this.data.length,this.compare=e||$t,this.length>0)for(var n=(this.length>>1)-1;n>=0;n--)this._down(n)}function $t(t,e){return te?1:0}Qt.prototype={push:function(t){this.data.push(t),this.length++,this._up(this.length-1)},pop:function(){if(0!==this.length){var t=this.data[0];return this.length--,this.length>0&&(this.data[0]=this.data[this.length],this._down(0)),this.data.pop(),t}},peek:function(){return this.data[0]},_up:function(t){for(var e=this.data,n=this.compare,r=e[t];t>0;){var i=t-1>>1,o=e[i];if(n(r,o)>=0)break;e[t]=o,t=i}e[t]=r},_down:function(t){for(var e=this.data,n=this.compare,r=this.length>>1,i=e[t];t=0)break;e[t]=a,t=o}e[t]=i}},Zt.default=Kt;var te=function(t,e){for(var n=t[0],r=t[1],i=!1,o=0,s=e.length-1;or!=c>r&&n<(l-a)*(r-u)/(c-u)+a&&(i=!i)}return i},ee=Ht[3],ne=ie,re=ie;function ie(t,e,n){e=Math.max(0,void 0===e?2:e),n=n||0;for(var r,i=function(t){for(var e=t[0],n=t[0],r=t[0],i=t[0],o=0;or[0]&&(r=s),s[1]i[1]&&(i=s)}var a=[e,n,r,i],u=a.slice();for(o=0;oo||a.push({node:c,dist:h})}for(;a.length&&!a.peek().node.children;){var p=a.pop(),f=p.node,g=fe(f,e,n),d=fe(f,r,i);if(p.dist=e.minX&&t[0]<=e.maxX&&t[1]>=e.minY&&t[1]<=e.maxY}function le(t,e,n){for(var r,i,o,s,a=Math.min(t[0],e[0]),u=Math.min(t[1],e[1]),l=Math.max(t[0],e[0]),c=Math.max(t[1],e[1]),h=n.search({minX:a,minY:u,maxX:l,maxY:c}),p=0;p0!=ee(r,i,s)>0&&ee(o,s,r)>0!=ee(o,s,i)>0)return!1;return!0}function ce(t){var e=t.p,n=t.next.p;return t.minX=Math.min(e[0],n[0]),t.minY=Math.min(e[1],n[1]),t.maxX=Math.max(e[0],n[0]),t.maxY=Math.max(e[1],n[1]),t}function he(t,e){var n={p:t,prev:null,next:null,minX:0,minY:0,maxX:0,maxY:0};return e?(n.next=e.next,n.prev=e,e.next.prev=n,e.next=n):(n.prev=n,n.next=n),n}function pe(t,e){var n=t[0]-e[0],r=t[1]-e[1];return n*n+r*r}function fe(t,e,n){var r=e[0],i=e[1],o=n[0]-r,s=n[1]-i;if(0!==o||0!==s){var a=((t[0]-r)*o+(t[1]-i)*s)/(o*o+s*s);a>1?(r=n[0],i=n[1]):a>0&&(r+=o*a,i+=s*a)}return(o=t[0]-r)*o+(s=t[1]-i)*s}function ge(t,e,n,r,i,o,s,a){var u,l,c,h,p=n-t,f=r-e,g=s-i,d=a-o,y=t-i,v=e-o,_=p*p+f*f,m=p*g+f*d,x=g*g+d*d,E=p*y+f*v,b=g*y+d*v,w=_*x-m*m,I=w,N=w;0===w?(l=0,I=1,h=b,N=x):(h=_*b-m*E,(l=m*b-x*E)<0?(l=0,h=b,N=x):l>I&&(l=I,h=b+m,N=x)),h<0?(h=0,-E<0?l=0:-E>_?l=I:(l=-E,I=_)):h>N&&(h=N,-E+m<0?l=0:-E+m>_?l=I:(l=-E+m,I=_));var S=(1-(c=0===h?0:h/N))*i+c*s-((1-(u=0===l?0:l/I))*t+u*n),C=(1-c)*o+c*a-((1-u)*e+u*r);return S*S+C*C}function de(t,e){void 0===e&&(e={}),e.concavity=e.concavity||1/0;var n=[];if(R(t,(function(t){n.push([t[0],t[1]])})),!n.length)return null;var r=ne(n,e.concavity);return r.length>3?l([r]):null}function ye(t,e,n){if(void 0===n&&(n={}),!t)throw new Error("point is required");if(!e)throw new Error("polygon is required");var r=K(t),i=rt(e),o=i.type,s=e.bbox,a=i.coordinates;if(s&&!1===function(t,e){return e[0]<=t[0]&&e[1]<=t[1]&&e[2]>=t[0]&&e[3]>=t[1]}(r,s))return!1;"Polygon"===o&&(a=[a]);for(var u=!1,l=0;lt[1]!=l>t[1]&&t[0]<(u-s)*(t[1]-a)/(l-a)+s&&(r=!r)}return r}function _e(t,e){var n=[];return F(t,(function(t){var r=!1;if("Point"===t.geometry.type)q(e,(function(e){ye(t,e)&&(r=!0)})),r&&n.push(t);else{if("MultiPoint"!==t.geometry.type)throw new Error("Input geometry must be a Point or MultiPoint");var i=[];q(e,(function(e){R(t,(function(t){ye(t,e)&&(r=!0,i.push(t))}))})),r&&n.push(d(i))}})),f(n)}function me(t,e,n){void 0===n&&(n={});var r=K(t),i=K(e),o=I(i[1]-r[1]),s=I(i[0]-r[0]),a=I(r[1]),u=I(i[1]),l=Math.pow(Math.sin(o/2),2)+Math.pow(Math.sin(s/2),2)*Math.cos(a)*Math.cos(u);return m(2*Math.atan2(Math.sqrt(l),Math.sqrt(1-l)),n.units)}function xe(t,e){var n=!1;return f(function(t){if(t.length<3)return[];t.sort(be);var e,n,r,i,o,s,a=t.length-1,u=t[a].x,l=t[0].x,c=t[a].y,h=c,p=1e-12;for(;a--;)t[a].yh&&(h=t[a].y);var f,g=l-u,d=h-c,y=g>d?g:d,v=.5*(l+u),_=.5*(h+c),m=[new Ee({__sentinel:!0,x:v-20*y,y:_-y},{__sentinel:!0,x:v,y:_+20*y},{__sentinel:!0,x:v+20*y,y:_-y})],x=[],E=[];a=t.length;for(;a--;){for(E.length=0,f=m.length;f--;)(g=t[a].x-m[f].x)>0&&g*g>m[f].r?(x.push(m[f]),m.splice(f,1)):g*g+(d=t[a].y-m[f].y)*d>m[f].r||(E.push(m[f].a,m[f].b,m[f].b,m[f].c,m[f].c,m[f].a),m.splice(f,1));for(we(E),f=E.length;f;)n=E[--f],e=E[--f],r=t[a],i=n.x-e.x,o=n.y-e.y,s=2*(i*(r.y-n.y)-o*(r.x-n.x)),Math.abs(s)>p&&m.push(new Ee(e,n,r))}Array.prototype.push.apply(x,m),a=x.length;for(;a--;)(x[a].a.__sentinel||x[a].b.__sentinel||x[a].c.__sentinel)&&x.splice(a,1);return x}(t.features.map((function(t){var r={x:t.geometry.coordinates[0],y:t.geometry.coordinates[1]};return e?r.z=t.properties[e]:3===t.geometry.coordinates.length&&(n=!0,r.z=t.geometry.coordinates[2]),r}))).map((function(t){var e=[t.a.x,t.a.y],r=[t.b.x,t.b.y],i=[t.c.x,t.c.y],o={};return n?(e.push(t.a.z),r.push(t.b.z),i.push(t.c.z)):o={a:t.a.z,b:t.b.z,c:t.c.z},l([[e,r,i,e]],o)})))}ne.default=re;var Ee=function(t,e,n){this.a=t,this.b=e,this.c=n;var r,i,o=e.x-t.x,s=e.y-t.y,a=n.x-t.x,u=n.y-t.y,l=o*(t.x+e.x)+s*(t.y+e.y),c=a*(t.x+n.x)+u*(t.y+n.y),h=2*(o*(n.y-e.y)-s*(n.x-e.x));this.x=(u*l-s*c)/h,this.y=(o*c-a*l)/h,r=this.x-t.x,i=this.y-t.y,this.r=r*r+i*i};function be(t,e){return e.x-t.x}function we(t){var e,n,r,i,o,s=t.length;t:for(;s;)for(n=t[--s],e=t[--s],r=s;r;)if(o=t[--r],e===(i=t[--r])&&n===o||e===o&&n===i){t.splice(s,2),t.splice(r,2),s-=2;continue t}}function Ie(t){if(!t)throw new Error("geojson is required");switch(t.type){case"Feature":return Ne(t);case"FeatureCollection":return function(t){var e={type:"FeatureCollection"};return Object.keys(t).forEach((function(n){switch(n){case"type":case"features":return;default:e[n]=t[n]}})),e.features=t.features.map((function(t){return Ne(t)})),e}(t);case"Point":case"LineString":case"Polygon":case"MultiPoint":case"MultiLineString":case"MultiPolygon":case"GeometryCollection":return Ce(t);default:throw new Error("unknown GeoJSON type")}}function Ne(t){var e={type:"Feature"};return Object.keys(t).forEach((function(n){switch(n){case"type":case"properties":case"geometry":return;default:e[n]=t[n]}})),e.properties=Se(t.properties),e.geometry=Ce(t.geometry),e}function Se(t){var e={};return t?(Object.keys(t).forEach((function(n){var r=t[n];"object"==typeof r?null===r?e[n]=null:Array.isArray(r)?e[n]=r.map((function(t){return t})):e[n]=Se(r):e[n]=r})),e):e}function Ce(t){var e={type:t.type};return t.bbox&&(e.bbox=t.bbox),"GeometryCollection"===t.type?(e.geometries=t.geometries.map((function(t){return Ce(t)})),e):(e.coordinates=Pe(t.coordinates),e)}function Pe(t){var e=t;return"object"!=typeof e[0]?e.slice():e.map((function(t){return Pe(t)}))}function Me(t,e){if(void 0===e&&(e={}),!P(e=e||{}))throw new Error("options is invalid");var n=e.mutate;if("FeatureCollection"!==it(t))throw new Error("geojson must be a FeatureCollection");if(!t.features.length)throw new Error("geojson is empty");!1!==n&&void 0!==n||(t=Ie(t));var r=[],i=Y(t,(function(t,e){var n=function(t,e){var n,r=t.geometry.coordinates,i=e.geometry.coordinates,o=Le(r[0]),s=Le(r[r.length-1]),a=Le(i[0]),u=Le(i[i.length-1]);if(o===u)n=i.concat(r.slice(1));else if(a===s)n=r.concat(i.slice(1));else if(o===a)n=r.slice(1).reverse().concat(i);else{if(s!==u)return null;n=r.concat(i.reverse().slice(1))}return h(n)}(t,e);return n||(r.push(t),e)}));return i&&r.push(i),r.length?1===r.length?r[0]:g(r.map((function(t){return t.coordinates}))):null}function Le(t){return t[0].toString()+","+t[1].toString()}function Oe(t){return t}function Re(t,e){var n=function(t){if(null==t)return Oe;var e,n,r=t.scale[0],i=t.scale[1],o=t.translate[0],s=t.translate[1];return function(t,a){a||(e=n=0);var u=2,l=t.length,c=new Array(l);for(c[0]=(e+=t[0])*r+o,c[1]=(n+=t[1])*i+s;u1)for(var o,a,u=1,l=s(i[0]);ul&&(a=i[0],i[0]=i[u],i[u]=a,l=o);return i})).filter((function(t){return t.length>0}))}}var De=Object.prototype.hasOwnProperty;function Fe(t,e,n,r,i,o){3===arguments.length&&(r=o=Array,i=null);for(var s=new r(t=1<=t)throw new Error("full hashmap");c=s[l=l+1&u]}return s[l]=r,a[l]=o,o}function h(r,o){for(var l=e(r)&u,c=s[l],h=0;c!=i;){if(n(c,r))return a[l];if(++h>=t)throw new Error("full hashmap");c=s[l=l+1&u]}return s[l]=r,a[l]=o,o}function p(r,o){for(var l=e(r)&u,c=s[l],h=0;c!=i;){if(n(c,r))return a[l];if(++h>=t)break;c=s[l=l+1&u]}return o}function f(){for(var t=[],e=0,n=s.length;e>7^Be[2]^Be[3])}function je(t){var e,n,r,i,o=t.coordinates,s=t.lines,a=t.rings,u=function(){for(var t=Fe(1.4*o.length,E,b,Int32Array,-1,Int32Array),e=new Int32Array(o.length),n=0,r=o.length;n=0){var o=h[n];i===e&&o===r||i===r&&o===e||(++f,p[n]=1)}else c[n]=e,h[n]=r}}function E(t){return ze(o[t])}function b(t,e){return ke(o[t],o[e])}l=c=h=null;var w,I=function(t,e,n,r,i){3===arguments.length&&(r=Array,i=null);for(var o=new r(t=1<=t)throw new Error("full hashset");u=o[a=a+1&s]}return o[a]=r,!0}function l(r){for(var a=e(r)&s,u=o[a],l=0;u!=i;){if(n(u,r))return!0;if(++l>=t)break;u=o[a=a+1&s]}return!1}function c(){for(var t=[],e=0,n=o.length;e>1);er&&(r=o),si&&(i=s)}function u(t){t.forEach(a)}function l(t){t.forEach(u)}for(var c in t)o(t[c]);return r>=e&&i>=n?[e,n,r,i]:void 0}(t=Xe(t)),r=e>0&&n&&function(t,e,n){var r=e[0],i=e[1],o=e[2],s=e[3],a=o-r?(n-1)/(o-r):1,u=s-i?(n-1)/(s-i):1;function l(t){return[Math.round((t[0]-r)*a),Math.round((t[1]-i)*u)]}function c(t,e){for(var n,o,s,l,c,h=-1,p=0,f=t.length,g=new Array(f);++h2&&rn(n[i-3],n[i-1],n[i-2])&&n.splice(n.length-2,1))}if(n.push(e[e.length-1]),i=n.length,nn(e[0],e[e.length-1])&&i<4)throw new Error("invalid polygon");return rn(n[i-3],n[i-1],n[i-2])&&n.splice(n.length-2,1),n}function nn(t,e){return t[0]===e[0]&&t[1]===e[1]}function rn(t,e,n){var r=n[0],i=n[1],o=t[0],s=t[1],a=e[0],u=e[1],l=a-o,c=u-s;return 0===(r-o)*c-(i-s)*l&&(Math.abs(l)>=Math.abs(c)?l>0?o<=r&&r<=a:a<=r&&r<=o:c>0?s<=i&&i<=u:u<=i&&i<=s)}function on(t,e,n){var r=e.x,i=e.y,o=n.x-r,s=n.y-i;if(0!==o||0!==s){var a=((t.x-r)*o+(t.y-i)*s)/(o*o+s*s);a>1?(r=n.x,i=n.y):a>0&&(r+=o*a,i+=s*a)}return(o=t.x-r)*o+(s=t.y-i)*s}function sn(t,e,n,r,i){for(var o,s=r,a=e+1;as&&(o=a,s=u)}s>r&&(o-e>1&&sn(t,e,o,r,i),i.push(t[o]),n-o>1&&sn(t,o,n,r,i))}function an(t,e){var n=t.length-1,r=[t[0]];return sn(t,0,n,e,r),r.push(t[n]),r}function un(t,e,n){if(t.length<=2)return t;var r=void 0!==e?e*e:1;return t=an(t=n?t:function(t,e){for(var n,r,i,o,s,a=t[0],u=[a],l=1,c=t.length;le&&(u.push(n),a=n);return a!==n&&u.push(n),u}(t,r),r)}function ln(t,e,n){return un(t.map((function(t){return{x:t[0],y:t[1],z:t[2]}})),e,n).map((function(t){return t.z?[t.x,t.y,t.z]:[t.x,t.y]}))}function cn(t,e,n){return t.map((function(t){var r=t.map((function(t){return{x:t[0],y:t[1]}}));if(r.length<4)throw new Error("invalid polygon");for(var i=un(r,e,n).map((function(t){return[t.x,t.y]}));!hn(i);)i=un(r,e-=.01*e,n).map((function(t){return[t.x,t.y]}));return i[i.length-1][0]===i[0][0]&&i[i.length-1][1]===i[0][1]||i.push(i[0]),i}))}function hn(t){return!(t.length<3)&&!(3===t.length&&t[2][0]===t[0][0]&&t[2][1]===t[0][1])}var pn=function(){function t(t){this.points=t.points||[],this.duration=t.duration||1e4,this.sharpness=t.sharpness||.85,this.centers=[],this.controls=[],this.stepLength=t.stepLength||60,this.length=this.points.length,this.delay=0;for(var e=0;et&&(e.push(r),n=i)}return e},t.prototype.vector=function(t){var e=this.pos(t+10),n=this.pos(t-10);return{angle:180*Math.atan2(e.y-n.y,e.x-n.x)/3.14,speed:Math.sqrt((n.x-e.x)*(n.x-e.x)+(n.y-e.y)*(n.y-e.y)+(n.z-e.z)*(n.z-e.z))}},t.prototype.pos=function(t){var e=t-this.delay;e<0&&(e=0),e>this.duration&&(e=this.duration-1);var n=e/this.duration;if(n>=1)return this.points[this.length-1];var r=Math.floor((this.points.length-1)*n);return function(t,e,n,r,i){var o=function(t){var e=t*t;return[e*t,3*e*(1-t),3*t*(1-t)*(1-t),(1-t)*(1-t)*(1-t)]}(t);return{x:i.x*o[0]+r.x*o[1]+n.x*o[2]+e.x*o[3],y:i.y*o[0]+r.y*o[1]+n.y*o[2]+e.y*o[3],z:i.z*o[0]+r.z*o[1]+n.z*o[2]+e.z*o[3]}}((this.length-1)*n-r,this.points[r],this.controls[r][1],this.controls[r+1][0],this.points[r+1])},t}();function fn(t,e){void 0===e&&(e={});for(var n=e.resolution||1e4,r=e.sharpness||.85,i=[],o=rt(t).coordinates.map((function(t){return{x:t[0],y:t[1]}})),s=new pn({duration:n,points:o,sharpness:r}),a=function(t){var e=s.pos(t);Math.floor(t/100)%2==0&&i.push([e.x,e.y])},u=0;u=me(t.slice(0,2),[e,i])){var o=(n+i)/2;return[e,o-(r-e)/2,r,o+(r-e)/2]}var s=(e+r)/2;return[s-(i-n)/2,n,s+(i-n)/2,i]}function vn(t,e,n,r){void 0===r&&(r={});var i=K(t),o=I(i[0]),s=I(i[1]),u=I(n),l=x(e,r.units),c=Math.asin(Math.sin(s)*Math.cos(l)+Math.cos(s)*Math.sin(l)*Math.cos(u));return a([w(o+Math.atan2(Math.sin(u)*Math.sin(l)*Math.cos(s),Math.cos(l)-Math.sin(s)*Math.sin(c))),w(c)],r.properties)}function _n(t,e,n){void 0===n&&(n={});for(var r=n.steps||64,i=n.properties?n.properties:!Array.isArray(t)&&"Feature"===t.type&&t.properties?t.properties:{},o=[],s=0;s80*n){r=o=t[0],i=s=t[1];for(var g=n;go&&(o=a),u>s&&(s=u);l=0!==(l=Math.max(o-r,s-i))?1/l:0}return Pn(p,f,n,r,i,l),f}function Sn(t,e,n,r,i){var o,s;if(i===Hn(t,e,n,r)>0)for(o=e;o=e;o-=r)s=Vn(o,t[o],t[o+1],s);return s&&Bn(s,s.next)&&(Xn(s),s=s.next),s}function Cn(t,e){if(!t)return t;e||(e=t);var n,r=t;do{if(n=!1,r.steiner||!Bn(r,r.next)&&0!==qn(r.prev,r,r.next))r=r.next;else{if(Xn(r),(r=e=r.prev)===r.next)break;n=!0}}while(n||r!==e);return e}function Pn(t,e,n,r,i,o,s){if(t){!s&&o&&function(t,e,n,r){var i=t;do{null===i.z&&(i.z=Dn(i.x,i.y,e,n,r)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,function(t){var e,n,r,i,o,s,a,u,l=1;do{for(n=t,t=null,o=null,s=0;n;){for(s++,r=n,a=0,e=0;e0||u>0&&r;)0!==a&&(0===u||!r||n.z<=r.z)?(i=n,n=n.nextZ,a--):(i=r,r=r.nextZ,u--),o?o.nextZ=i:t=i,i.prevZ=o,o=i;n=r}o.nextZ=null,l*=2}while(s>1)}(i)}(t,r,i,o);for(var a,u,l=t;t.prev!==t.next;)if(a=t.prev,u=t.next,o?Ln(t,r,i,o):Mn(t))e.push(a.i/n),e.push(t.i/n),e.push(u.i/n),Xn(t),t=u.next,l=u.next;else if((t=u)===l){s?1===s?Pn(t=On(t,e,n),e,n,r,i,o,2):2===s&&Rn(t,e,n,r,i,o):Pn(Cn(t),e,n,r,i,o,1);break}}}function Mn(t){var e=t.prev,n=t,r=t.next;if(qn(e,n,r)>=0)return!1;for(var i=t.next.next;i!==t.prev;){if(kn(e.x,e.y,n.x,n.y,r.x,r.y,i.x,i.y)&&qn(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function Ln(t,e,n,r){var i=t.prev,o=t,s=t.next;if(qn(i,o,s)>=0)return!1;for(var a=i.xo.x?i.x>s.x?i.x:s.x:o.x>s.x?o.x:s.x,c=i.y>o.y?i.y>s.y?i.y:s.y:o.y>s.y?o.y:s.y,h=Dn(a,u,e,n,r),p=Dn(l,c,e,n,r),f=t.prevZ,g=t.nextZ;f&&f.z>=h&&g&&g.z<=p;){if(f!==t.prev&&f!==t.next&&kn(i.x,i.y,o.x,o.y,s.x,s.y,f.x,f.y)&&qn(f.prev,f,f.next)>=0)return!1;if(f=f.prevZ,g!==t.prev&&g!==t.next&&kn(i.x,i.y,o.x,o.y,s.x,s.y,g.x,g.y)&&qn(g.prev,g,g.next)>=0)return!1;g=g.nextZ}for(;f&&f.z>=h;){if(f!==t.prev&&f!==t.next&&kn(i.x,i.y,o.x,o.y,s.x,s.y,f.x,f.y)&&qn(f.prev,f,f.next)>=0)return!1;f=f.prevZ}for(;g&&g.z<=p;){if(g!==t.prev&&g!==t.next&&kn(i.x,i.y,o.x,o.y,s.x,s.y,g.x,g.y)&&qn(g.prev,g,g.next)>=0)return!1;g=g.nextZ}return!0}function On(t,e,n){var r=t;do{var i=r.prev,o=r.next.next;!Bn(i,o)&&zn(i,r,r.next,o)&&jn(i,o)&&jn(o,i)&&(e.push(i.i/n),e.push(r.i/n),e.push(o.i/n),Xn(r),Xn(r.next),r=t=o),r=r.next}while(r!==t);return r}function Rn(t,e,n,r,i,o){var s=t;do{for(var a=s.next.next;a!==s.prev;){if(s.i!==a.i&&Gn(s,a)){var u=Un(s,a);return s=Cn(s,s.next),u=Cn(u,u.next),Pn(s,e,n,r,i,o),void Pn(u,e,n,r,i,o)}a=a.next}s=s.next}while(s!==t)}function Tn(t,e){return t.x-e.x}function An(t,e){if(e=function(t,e){var n,r=e,i=t.x,o=t.y,s=-1/0;do{if(o<=r.y&&o>=r.next.y&&r.next.y!==r.y){var a=r.x+(o-r.y)*(r.next.x-r.x)/(r.next.y-r.y);if(a<=i&&a>s){if(s=a,a===i){if(o===r.y)return r;if(o===r.next.y)return r.next}n=r.x=r.x&&r.x>=c&&i!==r.x&&kn(on.x)&&jn(r,t)&&(n=r,p=u),r=r.next;return n}(t,e)){var n=Un(e,t);Cn(n,n.next)}}function Dn(t,e,n,r,i){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-n)*i)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-r)*i)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function Fn(t){var e=t,n=t;do{e.x=0&&(t-s)*(r-a)-(n-s)*(e-a)>=0&&(n-s)*(o-a)-(i-s)*(r-a)>=0}function Gn(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){var n=t;do{if(n.i!==t.i&&n.next.i!==t.i&&n.i!==e.i&&n.next.i!==e.i&&zn(n,n.next,t,e))return!0;n=n.next}while(n!==t);return!1}(t,e)&&jn(t,e)&&jn(e,t)&&function(t,e){var n=t,r=!1,i=(t.x+e.x)/2,o=(t.y+e.y)/2;do{n.y>o!=n.next.y>o&&n.next.y!==n.y&&i<(n.next.x-n.x)*(o-n.y)/(n.next.y-n.y)+n.x&&(r=!r),n=n.next}while(n!==t);return r}(t,e)}function qn(t,e,n){return(e.y-t.y)*(n.x-e.x)-(e.x-t.x)*(n.y-e.y)}function Bn(t,e){return t.x===e.x&&t.y===e.y}function zn(t,e,n,r){return!!(Bn(t,e)&&Bn(n,r)||Bn(t,r)&&Bn(n,e))||qn(t,e,n)>0!=qn(t,e,r)>0&&qn(n,r,t)>0!=qn(n,r,e)>0}function jn(t,e){return qn(t.prev,t,t.next)<0?qn(t,e,t.next)>=0&&qn(t,t.prev,e)>=0:qn(t,e,t.prev)<0||qn(t,t.next,e)<0}function Un(t,e){var n=new Yn(t.i,t.x,t.y),r=new Yn(e.i,e.x,e.y),i=t.next,o=e.prev;return t.next=e,e.prev=t,n.next=i,i.prev=n,r.next=n,n.prev=r,o.next=r,r.prev=o,r}function Vn(t,e,n,r){var i=new Yn(t,e,n);return r?(i.next=r.next,i.prev=r,r.next.prev=i,r.next=i):(i.prev=i,i.next=i),i}function Xn(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function Yn(t,e,n){this.i=t,this.x=e,this.y=n,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function Hn(t,e,n,r){for(var i=0,o=e,s=n-r;o0&&(r+=t[i-1].length,n.holes.push(r))}return n}(t),n=wn(e.vertices,e.holes,2),r=[],i=[];n.forEach((function(t,r){var o=n[r];i.push([e.vertices[2*o],e.vertices[2*o+1]])}));for(var o=0;oi?n:i,r>o?r:o]}(t,r),n.push(i),r})),n})(n,t.properties).forEach((function(t){t.id=e.length,e.push(t)}))}))}}(t,e)})),f(e)}Nn.deviation=function(t,e,n,r){var i=e&&e.length,o=i?e[0]*n:t.length,s=Math.abs(Hn(t,0,o,n));if(i)for(var a=0,u=e.length;a0&&(r+=t[i-1].length,n.holes.push(r))}return n},wn.default=In;var Kn=Bt((function(t,e){function n(t,e,n){void 0===n&&(n={});var r={type:"Feature"};return(0===n.id||n.id)&&(r.id=n.id),n.bbox&&(r.bbox=n.bbox),r.properties=e||{},r.geometry=t,r}function r(t,e,r){if(void 0===r&&(r={}),!t)throw new Error("coordinates is required");if(!Array.isArray(t))throw new Error("coordinates must be an Array");if(t.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!f(t[0])||!f(t[1]))throw new Error("coordinates must contain numbers");return n({type:"Point",coordinates:t},e,r)}function i(t,e,r){void 0===r&&(r={});for(var i=0,o=t;i=0))throw new Error("precision must be a positive number");var n=Math.pow(10,e||0);return Math.round(t*n)/n},e.radiansToLength=c,e.lengthToRadians=h,e.lengthToDegrees=function(t,e){return p(h(t,e))},e.bearingToAzimuth=function(t){var e=t%360;return e<0&&(e+=360),e},e.radiansToDegrees=p,e.degreesToRadians=function(t){return t%360*Math.PI/180},e.convertLength=function(t,e,n){if(void 0===e&&(e="kilometers"),void 0===n&&(n="kilometers"),!(t>=0))throw new Error("length must be a positive number");return c(h(t,e),n)},e.convertArea=function(t,n,r){if(void 0===n&&(n="meters"),void 0===r&&(r="kilometers"),!(t>=0))throw new Error("area must be a positive number");var i=e.areaFactors[n];if(!i)throw new Error("invalid original units");var o=e.areaFactors[r];if(!o)throw new Error("invalid final units");return t/i*o},e.isNumber=f,e.isObject=function(t){return!!t&&t.constructor===Object},e.validateBBox=function(t){if(!t)throw new Error("bbox is required");if(!Array.isArray(t))throw new Error("bbox must be an Array");if(4!==t.length&&6!==t.length)throw new Error("bbox must be an Array of 4 or 6 numbers");t.forEach((function(t){if(!f(t))throw new Error("bbox must only contain numbers")}))},e.validateId=function(t){if(!t)throw new Error("id is required");if(-1===["string","number"].indexOf(typeof t))throw new Error("id must be a number or a string")}}));function Qn(t,e,n){if(null!==t)for(var r,i,o,s,a,u,l,c,h=0,p=0,f=t.type,g="FeatureCollection"===f,d="Feature"===f,y=g?t.features.length:1,v=0;va||p>u||f>l)return s=o,a=n,u=p,l=f,void(i=0);var g=Kn.lineString([s,o],t.properties);if(!1===e(g,n,r,f,i))return!1;i++,s=o}))&&void 0}}}))}function ir(t,e){if(!t)throw new Error("geojson is required");nr(t,(function(t,n,r){if(null!==t.geometry){var i=t.geometry.type,o=t.geometry.coordinates;switch(i){case"LineString":if(!1===e(t,n,r,0,0))return!1;break;case"Polygon":for(var s=0;st[0]&&(e[0]=t[0]),e[1]>t[1]&&(e[1]=t[1]),e[2] line1 must only contain 2 coordinates");if(2!==r.length)throw new Error(" line2 must only contain 2 coordinates");var i=n[0][0],o=n[0][1],s=n[1][0],u=n[1][1],l=r[0][0],c=r[0][1],h=r[1][0],p=r[1][1],f=(p-c)*(s-i)-(h-l)*(u-o),g=(h-l)*(o-c)-(p-c)*(i-l),d=(s-i)*(o-c)-(u-o)*(i-l);if(0===f)return null;var y=g/f,v=d/f;return y>=0&&y<=1&&v>=0&&v<=1?a([i+y*(s-i),o+y*(u-o)]):null}function Tr(t,e,n){void 0===n&&(n={});var r=a([1/0,1/0],{dist:1/0}),i=0;return z(t,(function(t){for(var o=Q(t),s=0;s0&&((v=y.features[0]).properties.dist=me(e,v,n),v.properties.location=i+me(u,v,n)),u.properties.dist180?-360:i[0]-o[0]>180?360:0,N(function(t,n,r){var i=r=void 0===r?e:Number(r),o=t[1]*Math.PI/180,s=n[1]*Math.PI/180,a=s-o,u=Math.abs(n[0]-t[0])*Math.PI/180;u>Math.PI&&(u-=2*Math.PI);var l=Math.log(Math.tan(s/2+Math.PI/4)/Math.tan(o/2+Math.PI/4)),c=Math.abs(l)>1e-11?a/l:Math.cos(o);return Math.sqrt(a*a+c*c*u*u)*i}(i,o),"meters",r.units)}function Dr(t,e,n){if(void 0===n&&(n={}),n.method||(n.method="geodesic"),n.units||(n.units="kilometers"),!t)throw new Error("pt is required");if(Array.isArray(t)?t=a(t):"Point"===t.type?t=o(t):et(t,"Point","point"),!e)throw new Error("line is required");Array.isArray(e)?e=h(e):"LineString"===e.type?e=o(e):et(e,"LineString","line");var r=1/0,i=t.geometry.coordinates;return U(e,(function(t){var e=t.geometry.coordinates[0],o=t.geometry.coordinates[1],s=function(t,e,n,r){var i=[n[0]-e[0],n[1]-e[1]],o=Fr([t[0]-e[0],t[1]-e[1]],i);if(o<=0)return kr(t,e,{method:r.method,units:"degrees"});var s=Fr(i,i);if(s<=o)return kr(t,n,{method:r.method,units:"degrees"});var a=o/s,u=[e[0]+a*i[0],e[1]+a*i[1]];return kr(t,u,{method:r.method,units:"degrees"})}(i,e,o,n);s=0&&l<=1&&(p.onLine1=!0),c>=0&&c<=1&&(p.onLine2=!0),!(!p.onLine1||!p.onLine2)&&[p.x,p.y])}function qr(t){for(var e=function(t){if("FeatureCollection"!==t.type)return"Feature"!==t.type?f([o(t)]):f([t]);return t}(t),n=xn(e),r=!1,i=0;!r&&i0){e+=Math.abs(Vr(t[0]));for(var n=1;n2){for(s=0;s=c&&p===i.length-1);p++){if(c>e&&0===o.length){if(!(s=e-c))return o.push(i[p]),h(o);a=mn(i[p],i[p-1])-180,u=vn(i[p],s,a,r),o.push(u.geometry.coordinates)}if(c>=n)return(s=n-c)?(a=mn(i[p],i[p-1])-180,u=vn(i[p],s,a,r),o.push(u.geometry.coordinates),h(o)):(o.push(i[p]),h(o));if(c>=e&&o.push(i[p]),p===i.length-1)return h(o);c+=me(i[p],i[p+1],r)}if(ci)return!1}else if(0!==f)return!1;return r?"start"===r?Math.abs(h)>=Math.abs(p)?h>0?a0?u=Math.abs(p)?h>0?a<=o&&o0?u<=s&&s=Math.abs(p)?h>0?a0?u=Math.abs(p)?h>0?a<=o&&o<=l:l<=o&&o<=a:p>0?u<=s&&s<=c:c<=s&&s<=u}function Zr(t,e){var n=rt(t),r=rt(e),i=n.type,o=r.type;switch(i){case"Point":switch(o){case"MultiPoint":return function(t,e){var n,r=!1;for(n=0;ne[0])&&(!(t[2]e[1])&&!(t[3] is required");if("number"!=typeof n)throw new Error(" must be a number");if("number"!=typeof r)throw new Error(" must be a number");!1!==i&&void 0!==i||(t=JSON.parse(JSON.stringify(t)));var o=Math.pow(10,n);return R(t,(function(t){!function(t,e,n){t.length>n&&t.splice(n,t.length);for(var r=0;r=1||u<=0||l>=1||l<=0))){var d=g,y=!o[d];y&&(o[d]=!0),e?i.push(e(g,t,n,c,h,u,s,a,p,f,l,y)):i.push(g)}}function d(t,e){var n,i,o,s,a=r[t][e],u=r[t][e+1];return a[0]p[e.isect].coord?-1:1}));for(u=[];b.length>0;){var C=b.pop(),P=C.isect,M=C.parent,L=C.winding,O=u.length,R=[p[P].coord],T=P;if(p[P].ringAndEdge1Walkable)var A=p[P].ringAndEdge1,D=p[P].nxtIsectAlongRingAndEdge1;else A=p[P].ringAndEdge2,D=p[P].nxtIsectAlongRingAndEdge2;for(;!ci(p[P].coord,p[D].coord);){R.push(p[D].coord);var F=void 0;for(r=0;r1)for(e=0;e=0==e}function li(t){for(var e=0,n=0;n1&&n.push(h(l)),f(n)}function xi(t,e){if(!e.features.length)throw new Error("lines must contain features");if(1===e.features.length)return e.features[0];var n,r=1/0;return F(e,(function(e){var i=Tr(e,t).properties.dist;ic&&f.push(vn(t,e,c,i).geometry.coordinates),h(f,u)}function wi(t){var e=t%360;return e<0&&(e+=360),e}function Ii(t,e){void 0===e&&(e={});var n=rt(t);switch(e.properties||"Feature"!==t.type||(e.properties=t.properties),n.type){case"Polygon":return Ni(n,e);case"MultiPolygon":return function(t,e){void 0===e&&(e={});var n=rt(t).coordinates,r=e.properties?e.properties:"Feature"===t.type?t.properties:{},i=[];return n.forEach((function(t){i.push(Si(t,r))})),f(i)}(n,e);default:throw new Error("invalid poly")}}function Ni(t,e){return void 0===e&&(e={}),Si(rt(t).coordinates,e.properties?e.properties:"Feature"===t.type?t.properties:{})}function Si(t,e){return t.length>1?g(t,e):h(t[0],e)}function Ci(t,e){var n,r,i;void 0===e&&(e={});var o=e.properties,s=null===(n=e.autoComplete)||void 0===n||n,a=null===(r=e.orderCoords)||void 0===r||r;switch(null!==(i=e.mutate)&&void 0!==i&&i||(t=Ie(t)),t.type){case"FeatureCollection":var u=[];return t.features.forEach((function(t){u.push(Q(Pi(t,{},s,a)))})),y(u,o);default:return Pi(t,o,s,a)}}function Pi(t,e,n,r){e=e||("Feature"===t.type?t.properties:{});var i=rt(t),o=i.coordinates,s=i.type;if(!o.length)throw new Error("line must contain coordinates");switch(s){case"LineString":return n&&(o=Mi(o)),l([o],e);case"MultiLineString":var a=[],u=0;return o.forEach((function(t){if(n&&(t=Mi(t)),r){var e=function(t){var e=t[0],n=t[1],r=t[2],i=t[3];return Math.abs(e-r)*Math.abs(n-i)}(Z(h(t)));e>u?(a.unshift(t),u=e):a.push(t)}else a.push(t)})),l(a,e);default:throw new Error("geometry type "+s+" is not supported")}}function Mi(t){var e=t[0],n=e[0],r=e[1],i=t[t.length-1],o=i[0],s=i[1];return n===o&&r===s||t.push(e),t}function Li(t,e){var n,r,i,o,s,a,u;for(r=1;r<=8;r*=2){for(n=[],o=!(Ri(i=t[t.length-1],e)&r),s=0;se[2]&&(n|=2),t[1]e[3]&&(n|=8),n}function Ti(t,e){for(var n=[],r=0,i=t;r0&&(o[0][0]===o[o.length-1][0]&&o[0][1]===o[o.length-1][1]||o.push(o[0]),o.length>=4&&n.push(o))}return n}vi.prototype.interpolate=function(t){var e=Math.sin((1-t)*this.g)/Math.sin(this.g),n=Math.sin(t*this.g)/Math.sin(this.g),r=e*Math.cos(this.start.y)*Math.cos(this.start.x)+n*Math.cos(this.end.y)*Math.cos(this.end.x),i=e*Math.cos(this.start.y)*Math.sin(this.start.x)+n*Math.cos(this.end.y)*Math.sin(this.end.x),o=e*Math.sin(this.start.y)+n*Math.sin(this.end.y),s=fi*Math.atan2(o,Math.sqrt(Math.pow(r,2)+Math.pow(i,2)));return[fi*Math.atan2(i,r),s]},vi.prototype.Arc=function(t,e){var n=[];if(!t||t<=2)n.push([this.start.lon,this.start.lat]),n.push([this.end.lon,this.end.lat]);else for(var r=1/(t-1),i=0;ip&&(d>c&&gc&&du&&(u=y)}var v=[];if(a&&u0&&Math.abs(x-n[m-1][0])>p){var E=parseFloat(n[m-1][0]),b=parseFloat(n[m-1][1]),w=parseFloat(n[m][0]),I=parseFloat(n[m][1]);if(E>-180&&E-180&&n[m-1][0]c&&E<180&&-180===w&&m+1c&&n[m-1][0]<180){_.push([180,n[m][1]]),m++,_.push([n[m][0],n[m][1]]);continue}if(Ec){var N=E;E=w,w=N;var S=b;b=I,I=S}if(E>c&&w=180&&Ec?180:-180,P]),(_=[]).push([n[m-1][0]>c?-180:180,P]),v.push(_)}else _=[],v.push(_);_.push([x,n[m][1]])}else _.push([n[m][0],n[m][1]])}}else{var M=[];v.push(M);for(var L=0;L=0;a--)if(l[a]!=c[a])return!1;for(a=l.length-1;a>=0;a--)if(u=l[a],!n(t[u],o[u],s))return!1;return typeof t==typeof o}(t,o,s))};function r(t){return null==t}function i(t){return!(!t||"object"!=typeof t||"number"!=typeof t.length)&&("function"==typeof t.copy&&"function"==typeof t.slice&&!(t.length>0&&"number"!=typeof t[0]))}}));function ki(t,e,n){if(void 0===n&&(n={}),!P(n=n||{}))throw new Error("options is invalid");var r,i=n.tolerance||0,o=[],s=Mr(),a=Zn(t);return s.load(a),U(e,(function(t){var e=!1;t&&(F(s.search(t),(function(n){if(!1===e){var o=Q(t).sort(),s=Q(n).sort();Fi(o,s)||(0===i?Wr(o[0],n)&&Wr(o[1],n):Tr(n,o[0]).properties.dist<=i&&Tr(n,o[1]).properties.dist<=i)?(e=!0,r=r?Gi(r,t):t):(0===i?Wr(s[0],t)&&Wr(s[1],t):Tr(t,s[0]).properties.dist<=i&&Tr(t,s[1]).properties.dist<=i)&&(r=r?Gi(r,n):n)}})),!1===e&&r&&(o.push(r),r=void 0))})),r&&o.push(r),f(o)}function Gi(t,e){var n=Q(e),r=Q(t),i=r[0],o=r[r.length-1],s=t.geometry.coordinates;return Fi(n[0],i)?s.unshift(n[1]):Fi(n[0],o)?s.push(n[1]):Fi(n[1],i)?s.unshift(n[0]):Fi(n[1],o)&&s.push(n[0]),t}function qi(t){var e=t%360;return e<0&&(e+=360),e}function Bi(t,e,n){var r;return void 0===n&&(n={}),(r=n.final?zi(K(e),K(t)):zi(K(t),K(e)))>180?-(360-r):r}function zi(t,e){var n=I(t[1]),r=I(e[1]),i=I(e[0]-t[0]);i>Math.PI&&(i-=2*Math.PI),i<-Math.PI&&(i+=2*Math.PI);var o=Math.log(Math.tan(r/2+Math.PI/4)/Math.tan(n/2+Math.PI/4));return(w(Math.atan2(i,o))+360)%360}function ji(t,n,r,i){void 0===i&&(i={});var o=n<0,s=N(Math.abs(n),i.units,"meters");o&&(s=-Math.abs(s));var u=K(t),l=function(t,n,r,i){i=void 0===i?e:Number(i);var o=n/i,s=t[0]*Math.PI/180,a=I(t[1]),u=I(r),l=o*Math.cos(u),c=a+l;Math.abs(c)>Math.PI/2&&(c=c>0?Math.PI-c:-Math.PI-c);var h=Math.log(Math.tan(c/2+Math.PI/4)/Math.tan(a/2+Math.PI/4)),p=Math.abs(h)>1e-11?l/h:Math.cos(a),f=o*Math.sin(u)/p;return[(180*(s+f)/Math.PI+540)%360-180,180*c/Math.PI]}(u,s,r);return l[0]+=l[0]-u[0]>180?-360:u[0]-l[0]>180?360:0,a(l,i.properties)}function Ui(t,e,n,r,i,o){for(var s=0;s0?Xi(e,a,i)<0||(i=a):n>0&&r<=0&&(Vi(e,a,o)||(o=a)),n=r}return[i,o]}function Vi(t,e,n){return Xi(t,e,n)>0}function Xi(t,e,n){return(e[0]-t[0])*(n[1]-t[1])-(n[0]-t[0])*(e[1]-t[1])}function Yi(t){for(var e,n,r=Q(t),i=0,o=1;o0}function Hi(t,e){switch("Feature"===t.type?t.geometry.type:t.type){case"GeometryCollection":return q(t,(function(t){Hi(t,e)})),t;case"LineString":return Wi(Q(t),e),t;case"Polygon":return Ji(Q(t),e),t;case"MultiLineString":return Q(t).forEach((function(t){Wi(t,e)})),t;case"MultiPolygon":return Q(t).forEach((function(t){Ji(t,e)})),t;case"Point":case"MultiPoint":return t}}function Wi(t,e){Yi(t)===e&&t.reverse()}function Ji(t,e){Yi(t[0])!==e&&t[0].reverse();for(var n=1;n + * v. 1.2.0 + * https://github.com/RaumZeit/MarchingSquares.js + * + * MarchingSquaresJS is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MarchingSquaresJS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * As additional permission under GNU Affero General Public License version 3 + * section 7, third-party projects (personal or commercial) may distribute, + * include, or link against UNMODIFIED VERSIONS of MarchingSquaresJS without the + * requirement that said third-party project for that reason alone becomes + * subject to any requirement of the GNU Affero General Public License version 3. + * Any modifications to MarchingSquaresJS, however, must be shared with the public + * and made available. + * + * In summary this: + * - allows you to use MarchingSquaresJS at no cost + * - allows you to use MarchingSquaresJS for both personal and commercial purposes + * - allows you to distribute UNMODIFIED VERSIONS of MarchingSquaresJS under any + * license as long as this license notice is included + * - enables you to keep the source code of your program that uses MarchingSquaresJS + * undisclosed + * - forces you to share any modifications you have made to MarchingSquaresJS, + * e.g. bug-fixes + * + * You should have received a copy of the GNU Affero General Public License + * along with MarchingSquaresJS. If not, see . + */(t,r),s=[],a=0;as?128:64,l|=hs?32:16,l|=ps?8:4;var g=+(l|=fs?2:1),d=0;if(17===l||18===l||33===l||34===l||38===l||68===l||72===l||98===l||102===l||132===l||136===l||137===l||152===l||153===l){var y=(c+h+p+f)/4;d=y>s?2:y0?(l=156,d=4):l=152:33===l?d>0?(l=139,d=4):l=137:72===l?d>0?(l=99,d=4):l=98:132===l&&(d>0?(l=39,d=4):l=38)}if(0!=l&&170!=l){var v,_,m,x,E,b,w,I;v=_=m=x=E=b=w=I=.5;var N=[];1===l?(m=1-Vo(e,p,f),I=1-Vo(e,c,f),N.push(Go[l])):169===l?(m=Vo(s,f,p),I=Vo(s,f,c),N.push(Go[l])):4===l?(b=1-Vo(e,h,p),x=Vo(e,f,p),N.push(Fo[l])):166===l?(b=Vo(s,p,h),x=1-Vo(s,p,f),N.push(Fo[l])):16===l?(E=Vo(e,p,h),_=Vo(e,c,h),N.push(Do[l])):154===l?(E=1-Vo(s,h,p),_=1-Vo(s,h,c),N.push(Do[l])):64===l?(w=Vo(e,f,c),v=1-Vo(e,h,c),N.push(Bo[l])):106===l?(w=1-Vo(s,c,f),v=Vo(s,c,h),N.push(Bo[l])):168===l?(x=Vo(s,f,p),m=Vo(e,f,p),I=Vo(e,f,c),w=Vo(s,f,c),N.push(ko[l]),N.push(Go[l])):2===l?(x=1-Vo(e,p,f),m=1-Vo(s,p,f),I=1-Vo(s,c,f),w=1-Vo(e,c,f),N.push(ko[l]),N.push(Go[l])):162===l?(E=Vo(s,p,h),b=Vo(e,p,h),x=1-Vo(e,p,f),m=1-Vo(s,p,f),N.push(ko[l]),N.push(Go[l])):8===l?(E=1-Vo(e,h,p),b=1-Vo(s,h,p),x=Vo(s,f,p),m=Vo(e,f,p),N.push(Do[l]),N.push(Fo[l])):138===l?(E=1-Vo(e,h,p),b=1-Vo(s,h,p),v=1-Vo(s,h,c),_=1-Vo(e,h,c),N.push(Do[l]),N.push(Fo[l])):32===l?(E=Vo(s,p,h),b=Vo(e,p,h),v=Vo(e,c,h),_=Vo(s,c,h),N.push(Do[l]),N.push(Fo[l])):42===l?(I=1-Vo(s,c,f),w=1-Vo(e,c,f),v=Vo(e,c,h),_=Vo(s,c,h),N.push(qo[l]),N.push(Bo[l])):128===l&&(I=Vo(e,f,c),w=Vo(s,f,c),v=1-Vo(s,h,c),_=1-Vo(e,h,c),N.push(qo[l]),N.push(Bo[l])),5===l?(b=1-Vo(e,h,p),I=1-Vo(e,c,f),N.push(Fo[l])):165===l?(b=Vo(s,p,h),I=Vo(s,f,c),N.push(Fo[l])):20===l?(x=Vo(e,f,p),_=Vo(e,c,h),N.push(ko[l])):150===l?(x=1-Vo(s,p,f),_=1-Vo(s,h,c),N.push(ko[l])):80===l?(E=Vo(e,p,h),w=Vo(e,f,c),N.push(Do[l])):90===l?(E=1-Vo(s,h,p),w=1-Vo(s,c,f),N.push(Do[l])):65===l?(m=1-Vo(e,p,f),v=1-Vo(e,h,c),N.push(Go[l])):105===l?(m=Vo(s,f,p),v=Vo(s,c,h),N.push(Go[l])):160===l?(E=Vo(s,p,h),b=Vo(e,p,h),I=Vo(e,f,c),w=Vo(s,f,c),N.push(Do[l]),N.push(Fo[l])):10===l?(E=1-Vo(e,h,p),b=1-Vo(s,h,p),I=1-Vo(s,c,f),w=1-Vo(e,c,f),N.push(Do[l]),N.push(Fo[l])):130===l?(x=1-Vo(e,p,f),m=1-Vo(s,p,f),v=1-Vo(s,h,c),_=1-Vo(e,h,c),N.push(ko[l]),N.push(Go[l])):40===l?(x=Vo(s,f,p),m=Vo(e,f,p),v=Vo(e,c,h),_=Vo(s,c,h),N.push(ko[l]),N.push(Go[l])):101===l?(b=Vo(s,p,h),v=Vo(s,c,h),N.push(Fo[l])):69===l?(b=1-Vo(e,h,p),v=1-Vo(e,h,c),N.push(Fo[l])):149===l?(I=Vo(s,f,c),_=1-Vo(s,h,c),N.push(qo[l])):21===l?(I=1-Vo(e,c,f),_=Vo(e,c,h),N.push(qo[l])):86===l?(x=1-Vo(s,p,f),w=1-Vo(s,c,f),N.push(ko[l])):84===l?(x=Vo(e,f,p),w=Vo(e,f,c),N.push(ko[l])):89===l?(E=1-Vo(s,h,p),m=Vo(s,f,p),N.push(Go[l])):81===l?(E=Vo(e,p,h),m=1-Vo(e,p,f),N.push(Go[l])):96===l?(E=Vo(s,p,h),b=Vo(e,p,h),w=Vo(e,f,c),v=Vo(s,c,h),N.push(Do[l]),N.push(Fo[l])):74===l?(E=1-Vo(e,h,p),b=1-Vo(s,h,p),w=1-Vo(s,c,f),v=1-Vo(e,h,c),N.push(Do[l]),N.push(Fo[l])):24===l?(E=1-Vo(s,h,p),x=Vo(s,f,p),m=Vo(e,f,p),_=Vo(e,c,h),N.push(Do[l]),N.push(Go[l])):146===l?(E=Vo(e,p,h),x=1-Vo(e,p,f),m=1-Vo(s,p,f),_=1-Vo(s,h,c),N.push(Do[l]),N.push(Go[l])):6===l?(b=1-Vo(e,h,p),x=1-Vo(s,p,f),I=1-Vo(s,c,f),w=1-Vo(e,c,f),N.push(Fo[l]),N.push(ko[l])):164===l?(b=Vo(s,p,h),x=Vo(e,f,p),I=Vo(e,f,c),w=Vo(s,f,c),N.push(Fo[l]),N.push(ko[l])):129===l?(m=1-Vo(e,p,f),I=Vo(s,f,c),v=1-Vo(s,h,c),_=1-Vo(e,h,c),N.push(Go[l]),N.push(qo[l])):41===l?(m=Vo(s,f,p),I=1-Vo(e,c,f),v=Vo(e,c,h),_=Vo(s,c,h),N.push(Go[l]),N.push(qo[l])):66===l?(x=1-Vo(e,p,f),m=1-Vo(s,p,f),w=1-Vo(s,c,f),v=1-Vo(e,h,c),N.push(ko[l]),N.push(Go[l])):104===l?(x=Vo(s,f,p),m=Vo(e,f,p),w=Vo(e,f,c),v=Vo(s,c,h),N.push(Go[l]),N.push(zo[l])):144===l?(E=Vo(e,p,h),I=Vo(e,f,c),w=Vo(s,f,c),_=1-Vo(s,h,c),N.push(Do[l]),N.push(Bo[l])):26===l?(E=1-Vo(s,h,p),I=1-Vo(s,c,f),w=1-Vo(e,c,f),_=Vo(e,c,h),N.push(Do[l]),N.push(Bo[l])):36===l?(b=Vo(s,p,h),x=Vo(e,f,p),v=Vo(e,c,h),_=Vo(s,c,h),N.push(Fo[l]),N.push(ko[l])):134===l?(b=1-Vo(e,h,p),x=1-Vo(s,p,f),v=1-Vo(s,h,c),_=1-Vo(e,h,c),N.push(Fo[l]),N.push(ko[l])):9===l?(E=1-Vo(e,h,p),b=1-Vo(s,h,p),m=Vo(s,f,p),I=1-Vo(e,c,f),N.push(Do[l]),N.push(Fo[l])):161===l?(E=Vo(s,p,h),b=Vo(e,p,h),m=1-Vo(e,p,f),I=Vo(s,f,c),N.push(Do[l]),N.push(Fo[l])):37===l?(b=Vo(s,p,h),I=1-Vo(e,c,f),v=Vo(e,c,h),_=Vo(s,c,h),N.push(Fo[l]),N.push(qo[l])):133===l?(b=1-Vo(e,h,p),I=Vo(s,f,c),v=1-Vo(s,h,c),_=1-Vo(e,h,c),N.push(Fo[l]),N.push(qo[l])):148===l?(x=Vo(e,f,p),I=Vo(e,f,c),w=Vo(s,f,c),_=1-Vo(s,h,c),N.push(ko[l]),N.push(Bo[l])):22===l?(x=1-Vo(s,p,f),I=1-Vo(s,c,f),w=1-Vo(e,c,f),_=Vo(e,c,h),N.push(ko[l]),N.push(Bo[l])):82===l?(E=Vo(e,p,h),x=1-Vo(e,p,f),m=1-Vo(s,p,f),w=1-Vo(s,c,f),N.push(Do[l]),N.push(Go[l])):88===l?(E=1-Vo(s,h,p),x=Vo(s,f,p),m=Vo(e,f,p),w=Vo(e,f,c),N.push(Do[l]),N.push(Go[l])):73===l?(E=1-Vo(e,h,p),b=1-Vo(s,h,p),m=Vo(s,f,p),v=1-Vo(e,h,c),N.push(Do[l]),N.push(Fo[l])):97===l?(E=Vo(s,p,h),b=Vo(e,p,h),m=1-Vo(e,p,f),v=Vo(s,c,h),N.push(Do[l]),N.push(Fo[l])):145===l?(E=Vo(e,p,h),m=1-Vo(e,p,f),I=Vo(s,f,c),_=1-Vo(s,h,c),N.push(Do[l]),N.push(qo[l])):25===l?(E=1-Vo(s,h,p),m=Vo(s,f,p),I=1-Vo(e,c,f),_=Vo(e,c,h),N.push(Do[l]),N.push(qo[l])):70===l?(b=1-Vo(e,h,p),x=1-Vo(s,p,f),w=1-Vo(s,c,f),v=1-Vo(e,h,c),N.push(Fo[l]),N.push(ko[l])):100===l?(b=Vo(s,p,h),x=Vo(e,f,p),w=Vo(e,f,c),v=Vo(s,c,h),N.push(Fo[l]),N.push(ko[l])):34===l?(0===d?(E=1-Vo(e,h,p),b=1-Vo(s,h,p),x=Vo(s,f,p),m=Vo(e,f,p),I=Vo(e,f,c),w=Vo(s,f,c),v=1-Vo(s,h,c),_=1-Vo(e,h,c)):(E=Vo(s,p,h),b=Vo(e,p,h),x=1-Vo(e,p,f),m=1-Vo(s,p,f),I=1-Vo(s,c,f),w=1-Vo(e,c,f),v=Vo(e,c,h),_=Vo(s,c,h)),N.push(Do[l]),N.push(Fo[l]),N.push(qo[l]),N.push(Bo[l])):35===l?(4===d?(E=1-Vo(e,h,p),b=1-Vo(s,h,p),x=Vo(s,f,p),m=Vo(e,f,p),I=Vo(e,f,c),w=Vo(s,f,c),v=1-Vo(s,h,c),_=1-Vo(e,h,c)):(E=Vo(s,p,h),b=Vo(e,p,h),x=1-Vo(e,p,f),m=1-Vo(s,p,f),I=1-Vo(s,c,f),w=1-Vo(e,c,f),v=Vo(e,c,h),_=Vo(s,c,h)),N.push(Do[l]),N.push(Fo[l]),N.push(Go[l]),N.push(Bo[l])):136===l?(0===d?(E=Vo(s,p,h),b=Vo(e,p,h),x=1-Vo(e,p,f),m=1-Vo(s,p,f),I=1-Vo(s,c,f),w=1-Vo(e,c,f),v=Vo(e,c,h),_=Vo(s,c,h)):(E=1-Vo(e,h,p),b=1-Vo(s,h,p),x=Vo(s,f,p),m=Vo(e,f,p),I=Vo(e,f,c),w=Vo(s,f,c),v=1-Vo(s,h,c),_=1-Vo(e,h,c)),N.push(Do[l]),N.push(Fo[l]),N.push(qo[l]),N.push(Bo[l])):153===l?(0===d?(E=Vo(e,p,h),m=1-Vo(e,p,f),I=1-Vo(e,c,f),_=Vo(e,c,h)):(E=1-Vo(s,h,p),m=Vo(s,f,p),I=Vo(s,f,c),_=1-Vo(s,h,c)),N.push(Do[l]),N.push(Go[l])):102===l?(0===d?(b=1-Vo(e,h,p),x=Vo(e,f,p),w=Vo(e,f,c),v=1-Vo(e,h,c)):(b=Vo(s,p,h),x=1-Vo(s,p,f),w=1-Vo(s,c,f),v=Vo(s,c,h)),N.push(Fo[l]),N.push(Bo[l])):155===l?(4===d?(E=Vo(e,p,h),m=1-Vo(e,p,f),I=1-Vo(e,c,f),_=Vo(e,c,h)):(E=1-Vo(s,h,p),m=Vo(s,f,p),I=Vo(s,f,c),_=1-Vo(s,h,c)),N.push(Do[l]),N.push(qo[l])):103===l?(4===d?(b=1-Vo(e,h,p),x=Vo(e,f,p),w=Vo(e,f,c),v=1-Vo(e,h,c)):(b=Vo(s,p,h),x=1-Vo(s,p,f),w=1-Vo(s,c,f),v=Vo(s,c,h)),N.push(Fo[l]),N.push(ko[l])):152===l?(0===d?(E=Vo(e,p,h),x=1-Vo(e,p,f),m=1-Vo(s,p,f),I=1-Vo(s,c,f),w=1-Vo(e,c,f),_=Vo(e,c,h)):(E=1-Vo(s,h,p),x=Vo(s,f,p),m=Vo(e,f,p),I=Vo(e,f,c),w=Vo(s,f,c),_=1-Vo(s,h,c)),N.push(Do[l]),N.push(ko[l]),N.push(Go[l])):156===l?(4===d?(E=Vo(e,p,h),x=1-Vo(e,p,f),m=1-Vo(s,p,f),I=1-Vo(s,c,f),w=1-Vo(e,c,f),_=Vo(e,c,h)):(E=1-Vo(s,h,p),x=Vo(s,f,p),m=Vo(e,f,p),I=Vo(e,f,c),w=Vo(s,f,c),_=1-Vo(s,h,c)),N.push(Do[l]),N.push(Go[l]),N.push(Bo[l])):137===l?(0===d?(E=Vo(s,p,h),b=Vo(e,p,h),m=1-Vo(e,p,f),I=1-Vo(e,c,f),v=Vo(e,c,h),_=Vo(s,c,h)):(E=1-Vo(e,h,p),b=1-Vo(s,h,p),m=Vo(s,f,p),I=Vo(s,f,c),v=1-Vo(s,h,c),_=1-Vo(e,h,c)),N.push(Do[l]),N.push(Fo[l]),N.push(Go[l])):139===l?(4===d?(E=Vo(s,p,h),b=Vo(e,p,h),m=1-Vo(e,p,f),I=1-Vo(e,c,f),v=Vo(e,c,h),_=Vo(s,c,h)):(E=1-Vo(e,h,p),b=1-Vo(s,h,p),m=Vo(s,f,p),I=Vo(s,f,c),v=1-Vo(s,h,c),_=1-Vo(e,h,c)),N.push(Do[l]),N.push(Fo[l]),N.push(qo[l])):98===l?(0===d?(E=1-Vo(e,h,p),b=1-Vo(s,h,p),x=Vo(s,f,p),m=Vo(e,f,p),w=Vo(e,f,c),v=1-Vo(e,h,c)):(E=Vo(s,p,h),b=Vo(e,p,h),x=1-Vo(e,p,f),m=1-Vo(s,p,f),w=1-Vo(s,c,f),v=Vo(s,c,h)),N.push(Do[l]),N.push(Fo[l]),N.push(Bo[l])):99===l?(4===d?(E=1-Vo(e,h,p),b=1-Vo(s,h,p),x=Vo(s,f,p),m=Vo(e,f,p),w=Vo(e,f,c),v=1-Vo(e,h,c)):(E=Vo(s,p,h),b=Vo(e,p,h),x=1-Vo(e,p,f),m=1-Vo(s,p,f),w=1-Vo(s,c,f),v=Vo(s,c,h)),N.push(Do[l]),N.push(Fo[l]),N.push(Go[l])):38===l?(0===d?(b=1-Vo(e,h,p),x=Vo(e,f,p),I=Vo(e,f,c),w=Vo(s,f,c),v=1-Vo(s,h,c),_=1-Vo(e,h,c)):(b=Vo(s,p,h),x=1-Vo(s,p,f),I=1-Vo(s,c,f),w=1-Vo(e,c,f),v=Vo(e,c,h),_=Vo(s,c,h)),N.push(Fo[l]),N.push(qo[l]),N.push(Bo[l])):39===l?(4===d?(b=1-Vo(e,h,p),x=Vo(e,f,p),I=Vo(e,f,c),w=Vo(s,f,c),v=1-Vo(s,h,c),_=1-Vo(e,h,c)):(b=Vo(s,p,h),x=1-Vo(s,p,f),I=1-Vo(s,c,f),w=1-Vo(e,c,f),v=Vo(e,c,h),_=Vo(s,c,h)),N.push(Fo[l]),N.push(ko[l]),N.push(Bo[l])):85===l&&(E=1,b=0,x=1,m=0,I=0,w=1,v=0,_=1),(v<0||v>1||_<0||_>1||E<0||E>1||x<0||x>1||I<0||I>1||w<0||w>1)&&console.log("MarchingSquaresJS-isoBands: "+l+" "+g+" "+c+","+h+","+p+","+f+" "+d+" "+v+" "+_+" "+E+" "+b+" "+x+" "+m+" "+I+" "+w),o.cells[a][u]={cval:l,cval_real:g,flipped:d,topleft:v,topright:_,righttop:E,rightbottom:b,bottomright:x,bottomleft:m,leftbottom:I,lefttop:w,edges:N}}}}}return o}(t,e,n);return Qi.polygons?(Qi.verbose&&console.log("MarchingSquaresJS-isoBands: returning single polygons for each grid cell"),u=function(t){var e=[],n=0;return t.cells.forEach((function(t,r){t.forEach((function(t,i){if(void 0!==t){var o=Uo[t.cval](t);"object"==typeof o&&Xo(o)?"object"==typeof o[0]&&Xo(o[0])?"object"==typeof o[0][0]&&Xo(o[0][0])?o.forEach((function(t){t.forEach((function(t){t[0]+=i,t[1]+=r})),e[n++]=t})):(o.forEach((function(t){t[0]+=i,t[1]+=r})),e[n++]=o):console.log("MarchingSquaresJS-isoBands: bandcell polygon with malformed coordinates"):console.log("MarchingSquaresJS-isoBands: bandcell polygon with null coordinates")}}))})),e}(l)):(Qi.verbose&&console.log("MarchingSquaresJS-isoBands: returning polygon paths for entire data grid"),u=function(t){for(var e=[],n=t.rows,r=t.cols,i=[],o=0;o0){var a=Ho(t.cells[o][s]),u=null,l=s,c=o;null!==a&&i.push([a.p[0]+l,a.p[1]+c]);do{if(null===(u=Wo(t.cells[c][l],a.x,a.y,a.o)))break;if(i.push([u.p[0]+l,u.p[1]+c]),l+=u.x,a=u,(c+=u.y)<0||c>=n||l<0||l>=r||void 0===t.cells[c][l]){var h=Yo(t,l-=u.x,c-=u.y,u.x,u.y,u.o);if(null===h)break;h.path.forEach((function(t){i.push(t)})),l=h.i,c=h.j,a=h}}while(void 0!==t.cells[c][l]&&t.cells[c][l].edges.length>0);e.push(i),i=[],t.cells[o][s].edges.length>0&&s--}return e}(l)),"function"==typeof Qi.successCallback&&Qi.successCallback(u),u}var to=64,eo=16,no=[],ro=[],io=[],oo=[],so=[],ao=[],uo=[],lo=[],co=[],ho=[],po=[],fo=[],go=[],yo=[],vo=[],_o=[],mo=[],xo=[],Eo=[],bo=[],wo=[],Io=[],No=[],So=[];uo[85]=ho[85]=-1,lo[85]=po[85]=0,co[85]=fo[85]=1,Eo[85]=Io[85]=1,bo[85]=No[85]=0,wo[85]=So[85]=1,no[85]=oo[85]=0,ro[85]=so[85]=-1,io[85]=vo[85]=0,_o[85]=go[85]=0,mo[85]=yo[85]=1,ao[85]=xo[85]=1,Io[1]=Io[169]=0,No[1]=No[169]=-1,So[1]=So[169]=0,go[1]=go[169]=-1,yo[1]=yo[169]=0,vo[1]=vo[169]=0,ho[4]=ho[166]=0,po[4]=po[166]=-1,fo[4]=fo[166]=1,_o[4]=_o[166]=1,mo[4]=mo[166]=0,xo[4]=xo[166]=0,uo[16]=uo[154]=0,lo[16]=lo[154]=1,co[16]=co[154]=1,oo[16]=oo[154]=1,so[16]=so[154]=0,ao[16]=ao[154]=1,Eo[64]=Eo[106]=0,bo[64]=bo[106]=1,wo[64]=wo[106]=0,no[64]=no[106]=-1,ro[64]=ro[106]=0,io[64]=io[106]=1,Eo[2]=Eo[168]=0,bo[2]=bo[168]=-1,wo[2]=wo[168]=1,Io[2]=Io[168]=0,No[2]=No[168]=-1,So[2]=So[168]=0,go[2]=go[168]=-1,yo[2]=yo[168]=0,vo[2]=vo[168]=0,_o[2]=_o[168]=-1,mo[2]=mo[168]=0,xo[2]=xo[168]=1,uo[8]=uo[162]=0,lo[8]=lo[162]=-1,co[8]=co[162]=0,ho[8]=ho[162]=0,po[8]=po[162]=-1,fo[8]=fo[162]=1,go[8]=go[162]=1,yo[8]=yo[162]=0,vo[8]=vo[162]=1,_o[8]=_o[162]=1,mo[8]=mo[162]=0,xo[8]=xo[162]=0,uo[32]=uo[138]=0,lo[32]=lo[138]=1,co[32]=co[138]=1,ho[32]=ho[138]=0,po[32]=po[138]=1,fo[32]=fo[138]=0,no[32]=no[138]=1,ro[32]=ro[138]=0,io[32]=io[138]=0,oo[32]=oo[138]=1,so[32]=so[138]=0,ao[32]=ao[138]=1,Io[128]=Io[42]=0,No[128]=No[42]=1,So[128]=So[42]=1,Eo[128]=Eo[42]=0,bo[128]=bo[42]=1,wo[128]=wo[42]=0,no[128]=no[42]=-1,ro[128]=ro[42]=0,io[128]=io[42]=1,oo[128]=oo[42]=-1,so[128]=so[42]=0,ao[128]=ao[42]=0,ho[5]=ho[165]=-1,po[5]=po[165]=0,fo[5]=fo[165]=0,Io[5]=Io[165]=1,No[5]=No[165]=0,So[5]=So[165]=0,_o[20]=_o[150]=0,mo[20]=mo[150]=1,xo[20]=xo[150]=1,oo[20]=oo[150]=0,so[20]=so[150]=-1,ao[20]=ao[150]=1,uo[80]=uo[90]=-1,lo[80]=lo[90]=0,co[80]=co[90]=1,Eo[80]=Eo[90]=1,bo[80]=bo[90]=0,wo[80]=wo[90]=1,go[65]=go[105]=0,yo[65]=yo[105]=1,vo[65]=vo[105]=0,no[65]=no[105]=0,ro[65]=ro[105]=-1,io[65]=io[105]=0,uo[160]=uo[10]=-1,lo[160]=lo[10]=0,co[160]=co[10]=1,ho[160]=ho[10]=-1,po[160]=po[10]=0,fo[160]=fo[10]=0,Io[160]=Io[10]=1,No[160]=No[10]=0,So[160]=So[10]=0,Eo[160]=Eo[10]=1,bo[160]=bo[10]=0,wo[160]=wo[10]=1,_o[130]=_o[40]=0,mo[130]=mo[40]=1,xo[130]=xo[40]=1,go[130]=go[40]=0,yo[130]=yo[40]=1,vo[130]=vo[40]=0,no[130]=no[40]=0,ro[130]=ro[40]=-1,io[130]=io[40]=0,oo[130]=oo[40]=0,so[130]=so[40]=-1,ao[130]=ao[40]=1,ho[37]=ho[133]=0,po[37]=po[133]=1,fo[37]=fo[133]=1,Io[37]=Io[133]=0,No[37]=No[133]=1,So[37]=So[133]=0,no[37]=no[133]=-1,ro[37]=ro[133]=0,io[37]=io[133]=0,oo[37]=oo[133]=1,so[37]=so[133]=0,ao[37]=ao[133]=0,_o[148]=_o[22]=-1,mo[148]=mo[22]=0,xo[148]=xo[22]=0,Io[148]=Io[22]=0,No[148]=No[22]=-1,So[148]=So[22]=1,Eo[148]=Eo[22]=0,bo[148]=bo[22]=1,wo[148]=wo[22]=1,oo[148]=oo[22]=-1,so[148]=so[22]=0,ao[148]=ao[22]=1,uo[82]=uo[88]=0,lo[82]=lo[88]=-1,co[82]=co[88]=1,_o[82]=_o[88]=1,mo[82]=mo[88]=0,xo[82]=xo[88]=1,go[82]=go[88]=-1,yo[82]=yo[88]=0,vo[82]=vo[88]=1,Eo[82]=Eo[88]=0,bo[82]=bo[88]=-1,wo[82]=wo[88]=0,uo[73]=uo[97]=0,lo[73]=lo[97]=1,co[73]=co[97]=0,ho[73]=ho[97]=0,po[73]=po[97]=-1,fo[73]=fo[97]=0,go[73]=go[97]=1,yo[73]=yo[97]=0,vo[73]=vo[97]=0,no[73]=no[97]=1,ro[73]=ro[97]=0,io[73]=io[97]=1,uo[145]=uo[25]=0,lo[145]=lo[25]=-1,co[145]=co[25]=0,go[145]=go[25]=1,yo[145]=yo[25]=0,vo[145]=vo[25]=1,Io[145]=Io[25]=0,No[145]=No[25]=1,So[145]=So[25]=1,oo[145]=oo[25]=-1,so[145]=so[25]=0,ao[145]=ao[25]=0,ho[70]=ho[100]=0,po[70]=po[100]=1,fo[70]=fo[100]=0,_o[70]=_o[100]=-1,mo[70]=mo[100]=0,xo[70]=xo[100]=1,Eo[70]=Eo[100]=0,bo[70]=bo[100]=-1,wo[70]=wo[100]=1,no[70]=no[100]=1,ro[70]=ro[100]=0,io[70]=io[100]=0,ho[101]=ho[69]=0,po[101]=po[69]=1,fo[101]=fo[69]=0,no[101]=no[69]=1,ro[101]=ro[69]=0,io[101]=io[69]=0,Io[149]=Io[21]=0,No[149]=No[21]=1,So[149]=So[21]=1,oo[149]=oo[21]=-1,so[149]=so[21]=0,ao[149]=ao[21]=0,_o[86]=_o[84]=-1,mo[86]=mo[84]=0,xo[86]=xo[84]=1,Eo[86]=Eo[84]=0,bo[86]=bo[84]=-1,wo[86]=wo[84]=1,uo[89]=uo[81]=0,lo[89]=lo[81]=-1,co[89]=co[81]=0,go[89]=go[81]=1,yo[89]=yo[81]=0,vo[89]=vo[81]=1,uo[96]=uo[74]=0,lo[96]=lo[74]=1,co[96]=co[74]=0,ho[96]=ho[74]=-1,po[96]=po[74]=0,fo[96]=fo[74]=1,Eo[96]=Eo[74]=1,bo[96]=bo[74]=0,wo[96]=wo[74]=0,no[96]=no[74]=1,ro[96]=ro[74]=0,io[96]=io[74]=1,uo[24]=uo[146]=0,lo[24]=lo[146]=-1,co[24]=co[146]=1,_o[24]=_o[146]=1,mo[24]=mo[146]=0,xo[24]=xo[146]=1,go[24]=go[146]=0,yo[24]=yo[146]=1,vo[24]=vo[146]=1,oo[24]=oo[146]=0,so[24]=so[146]=-1,ao[24]=ao[146]=0,ho[6]=ho[164]=-1,po[6]=po[164]=0,fo[6]=fo[164]=1,_o[6]=_o[164]=-1,mo[6]=mo[164]=0,xo[6]=xo[164]=0,Io[6]=Io[164]=0,No[6]=No[164]=-1,So[6]=So[164]=1,Eo[6]=Eo[164]=1,bo[6]=bo[164]=0,wo[6]=wo[164]=0,go[129]=go[41]=0,yo[129]=yo[41]=1,vo[129]=vo[41]=1,Io[129]=Io[41]=0,No[129]=No[41]=1,So[129]=So[41]=0,no[129]=no[41]=-1,ro[129]=ro[41]=0,io[129]=io[41]=0,oo[129]=oo[41]=0,so[129]=so[41]=-1,ao[129]=ao[41]=0,_o[66]=_o[104]=0,mo[66]=mo[104]=1,xo[66]=xo[104]=0,go[66]=go[104]=-1,yo[66]=yo[104]=0,vo[66]=vo[104]=1,Eo[66]=Eo[104]=0,bo[66]=bo[104]=-1,wo[66]=wo[104]=0,no[66]=no[104]=0,ro[66]=ro[104]=-1,io[66]=io[104]=1,uo[144]=uo[26]=-1,lo[144]=lo[26]=0,co[144]=co[26]=0,Io[144]=Io[26]=1,No[144]=No[26]=0,So[144]=So[26]=1,Eo[144]=Eo[26]=0,bo[144]=bo[26]=1,wo[144]=wo[26]=1,oo[144]=oo[26]=-1,so[144]=so[26]=0,ao[144]=ao[26]=1,ho[36]=ho[134]=0,po[36]=po[134]=1,fo[36]=fo[134]=1,_o[36]=_o[134]=0,mo[36]=mo[134]=1,xo[36]=xo[134]=0,no[36]=no[134]=0,ro[36]=ro[134]=-1,io[36]=io[134]=1,oo[36]=oo[134]=1,so[36]=so[134]=0,ao[36]=ao[134]=0,uo[9]=uo[161]=-1,lo[9]=lo[161]=0,co[9]=co[161]=0,ho[9]=ho[161]=0,po[9]=po[161]=-1,fo[9]=fo[161]=0,go[9]=go[161]=1,yo[9]=yo[161]=0,vo[9]=vo[161]=0,Io[9]=Io[161]=1,No[9]=No[161]=0,So[9]=So[161]=1,uo[136]=0,lo[136]=1,co[136]=1,ho[136]=0,po[136]=1,fo[136]=0,_o[136]=-1,mo[136]=0,xo[136]=1,go[136]=-1,yo[136]=0,vo[136]=0,Io[136]=0,No[136]=-1,So[136]=0,Eo[136]=0,bo[136]=-1,wo[136]=1,no[136]=1,ro[136]=0,io[136]=0,oo[136]=1,so[136]=0,ao[136]=1,uo[34]=0,lo[34]=-1,co[34]=0,ho[34]=0,po[34]=-1,fo[34]=1,_o[34]=1,mo[34]=0,xo[34]=0,go[34]=1,yo[34]=0,vo[34]=1,Io[34]=0,No[34]=1,So[34]=1,Eo[34]=0,bo[34]=1,wo[34]=0,no[34]=-1,ro[34]=0,io[34]=1,oo[34]=-1,so[34]=0,ao[34]=0,uo[35]=0,lo[35]=1,co[35]=1,ho[35]=0,po[35]=-1,fo[35]=1,_o[35]=1,mo[35]=0,xo[35]=0,go[35]=-1,yo[35]=0,vo[35]=0,Io[35]=0,No[35]=-1,So[35]=0,Eo[35]=0,bo[35]=1,wo[35]=0,no[35]=-1,ro[35]=0,io[35]=1,oo[35]=1,so[35]=0,ao[35]=1,uo[153]=0,lo[153]=1,co[153]=1,go[153]=-1,yo[153]=0,vo[153]=0,Io[153]=0,No[153]=-1,So[153]=0,oo[153]=1,so[153]=0,ao[153]=1,ho[102]=0,po[102]=-1,fo[102]=1,_o[102]=1,mo[102]=0,xo[102]=0,Eo[102]=0,bo[102]=1,wo[102]=0,no[102]=-1,ro[102]=0,io[102]=1,uo[155]=0,lo[155]=-1,co[155]=0,go[155]=1,yo[155]=0,vo[155]=1,Io[155]=0,No[155]=1,So[155]=1,oo[155]=-1,so[155]=0,ao[155]=0,ho[103]=0,po[103]=1,fo[103]=0,_o[103]=-1,mo[103]=0,xo[103]=1,Eo[103]=0,bo[103]=-1,wo[103]=1,no[103]=1,ro[103]=0,io[103]=0,uo[152]=0,lo[152]=1,co[152]=1,_o[152]=-1,mo[152]=0,xo[152]=1,go[152]=-1,yo[152]=0,vo[152]=0,Io[152]=0,No[152]=-1,So[152]=0,Eo[152]=0,bo[152]=-1,wo[152]=1,oo[152]=1,so[152]=0,ao[152]=1,uo[156]=0,lo[156]=-1,co[156]=1,_o[156]=1,mo[156]=0,xo[156]=1,go[156]=-1,yo[156]=0,vo[156]=0,Io[156]=0,No[156]=-1,So[156]=0,Eo[156]=0,bo[156]=1,wo[156]=1,oo[156]=-1,so[156]=0,ao[156]=1,uo[137]=0,lo[137]=1,co[137]=1,ho[137]=0,po[137]=1,fo[137]=0,go[137]=-1,yo[137]=0,vo[137]=0,Io[137]=0,No[137]=-1,So[137]=0,no[137]=1,ro[137]=0,io[137]=0,oo[137]=1,so[137]=0,ao[137]=1,uo[139]=0,lo[139]=1,co[139]=1,ho[139]=0,po[139]=-1,fo[139]=0,go[139]=1,yo[139]=0,vo[139]=0,Io[139]=0,No[139]=1,So[139]=0,no[139]=-1,ro[139]=0,io[139]=0,oo[139]=1,so[139]=0,ao[139]=1,uo[98]=0,lo[98]=-1,co[98]=0,ho[98]=0,po[98]=-1,fo[98]=1,_o[98]=1,mo[98]=0,xo[98]=0,go[98]=1,yo[98]=0,vo[98]=1,Eo[98]=0,bo[98]=1,wo[98]=0,no[98]=-1,ro[98]=0,io[98]=1,uo[99]=0,lo[99]=1,co[99]=0,ho[99]=0,po[99]=-1,fo[99]=1,_o[99]=1,mo[99]=0,xo[99]=0,go[99]=-1,yo[99]=0,vo[99]=1,Eo[99]=0,bo[99]=-1,wo[99]=0,no[99]=1,ro[99]=0,io[99]=1,ho[38]=0,po[38]=-1,fo[38]=1,_o[38]=1,mo[38]=0,xo[38]=0,Io[38]=0,No[38]=1,So[38]=1,Eo[38]=0,bo[38]=1,wo[38]=0,no[38]=-1,ro[38]=0,io[38]=1,oo[38]=-1,so[38]=0,ao[38]=0,ho[39]=0,po[39]=1,fo[39]=1,_o[39]=-1,mo[39]=0,xo[39]=0,Io[39]=0,No[39]=-1,So[39]=1,Eo[39]=0,bo[39]=1,wo[39]=0,no[39]=-1,ro[39]=0,io[39]=1,oo[39]=1,so[39]=0,ao[39]=0;var Co=function(t){return[[t.bottomleft,0],[0,0],[0,t.leftbottom]]},Po=function(t){return[[1,t.rightbottom],[1,0],[t.bottomright,0]]},Mo=function(t){return[[t.topright,1],[1,1],[1,t.righttop]]},Lo=function(t){return[[0,t.lefttop],[0,1],[t.topleft,1]]},Oo=function(t){return[[t.bottomright,0],[t.bottomleft,0],[0,t.leftbottom],[0,t.lefttop]]},Ro=function(t){return[[t.bottomright,0],[t.bottomleft,0],[1,t.righttop],[1,t.rightbottom]]},To=function(t){return[[1,t.righttop],[1,t.rightbottom],[t.topleft,1],[t.topright,1]]},Ao=function(t){return[[0,t.leftbottom],[0,t.lefttop],[t.topleft,1],[t.topright,1]]},Do=[],Fo=[],ko=[],Go=[],qo=[],Bo=[],zo=[],jo=[];Go[1]=qo[1]=18,Go[169]=qo[169]=18,ko[4]=Fo[4]=12,ko[166]=Fo[166]=12,Do[16]=jo[16]=4,Do[154]=jo[154]=4,Bo[64]=zo[64]=22,Bo[106]=zo[106]=22,ko[2]=Bo[2]=17,Go[2]=qo[2]=18,ko[168]=Bo[168]=17,Go[168]=qo[168]=18,Do[8]=Go[8]=9,Fo[8]=ko[8]=12,Do[162]=Go[162]=9,Fo[162]=ko[162]=12,Do[32]=jo[32]=4,Fo[32]=zo[32]=1,Do[138]=jo[138]=4,Fo[138]=zo[138]=1,qo[128]=jo[128]=21,Bo[128]=zo[128]=22,qo[42]=jo[42]=21,Bo[42]=zo[42]=22,Fo[5]=qo[5]=14,Fo[165]=qo[165]=14,ko[20]=jo[20]=6,ko[150]=jo[150]=6,Do[80]=Bo[80]=11,Do[90]=Bo[90]=11,Go[65]=zo[65]=3,Go[105]=zo[105]=3,Do[160]=Bo[160]=11,Fo[160]=qo[160]=14,Do[10]=Bo[10]=11,Fo[10]=qo[10]=14,ko[130]=jo[130]=6,Go[130]=zo[130]=3,ko[40]=jo[40]=6,Go[40]=zo[40]=3,Fo[101]=zo[101]=1,Fo[69]=zo[69]=1,qo[149]=jo[149]=21,qo[21]=jo[21]=21,ko[86]=Bo[86]=17,ko[84]=Bo[84]=17,Do[89]=Go[89]=9,Do[81]=Go[81]=9,Do[96]=zo[96]=0,Fo[96]=Bo[96]=15,Do[74]=zo[74]=0,Fo[74]=Bo[74]=15,Do[24]=ko[24]=8,Go[24]=jo[24]=7,Do[146]=ko[146]=8,Go[146]=jo[146]=7,Fo[6]=Bo[6]=15,ko[6]=qo[6]=16,Fo[164]=Bo[164]=15,ko[164]=qo[164]=16,Go[129]=jo[129]=7,qo[129]=zo[129]=20,Go[41]=jo[41]=7,qo[41]=zo[41]=20,ko[66]=zo[66]=2,Go[66]=Bo[66]=19,ko[104]=zo[104]=2,Go[104]=Bo[104]=19,Do[144]=qo[144]=10,Bo[144]=jo[144]=23,Do[26]=qo[26]=10,Bo[26]=jo[26]=23,Fo[36]=jo[36]=5,ko[36]=zo[36]=2,Fo[134]=jo[134]=5,ko[134]=zo[134]=2,Do[9]=qo[9]=10,Fo[9]=Go[9]=13,Do[161]=qo[161]=10,Fo[161]=Go[161]=13,Fo[37]=jo[37]=5,qo[37]=zo[37]=20,Fo[133]=jo[133]=5,qo[133]=zo[133]=20,ko[148]=qo[148]=16,Bo[148]=jo[148]=23,ko[22]=qo[22]=16,Bo[22]=jo[22]=23,Do[82]=ko[82]=8,Go[82]=Bo[82]=19,Do[88]=ko[88]=8,Go[88]=Bo[88]=19,Do[73]=zo[73]=0,Fo[73]=Go[73]=13,Do[97]=zo[97]=0,Fo[97]=Go[97]=13,Do[145]=Go[145]=9,qo[145]=jo[145]=21,Do[25]=Go[25]=9,qo[25]=jo[25]=21,Fo[70]=zo[70]=1,ko[70]=Bo[70]=17,Fo[100]=zo[100]=1,ko[100]=Bo[100]=17,Do[34]=Go[34]=9,Fo[34]=ko[34]=12,qo[34]=jo[34]=21,Bo[34]=zo[34]=22,Do[136]=jo[136]=4,Fo[136]=zo[136]=1,ko[136]=Bo[136]=17,Go[136]=qo[136]=18,Do[35]=jo[35]=4,Fo[35]=ko[35]=12,Go[35]=qo[35]=18,Bo[35]=zo[35]=22,Do[153]=jo[153]=4,Go[153]=qo[153]=18,Fo[102]=ko[102]=12,Bo[102]=zo[102]=22,Do[155]=Go[155]=9,qo[155]=jo[155]=23,Fo[103]=zo[103]=1,ko[103]=Bo[103]=17,Do[152]=jo[152]=4,ko[152]=Bo[152]=17,Go[152]=qo[152]=18,Do[156]=ko[156]=8,Go[156]=qo[156]=18,Bo[156]=jo[156]=23,Do[137]=jo[137]=4,Fo[137]=zo[137]=1,Go[137]=qo[137]=18,Do[139]=jo[139]=4,Fo[139]=Go[139]=13,qo[139]=zo[139]=20,Do[98]=Go[98]=9,Fo[98]=ko[98]=12,Bo[98]=zo[98]=22,Do[99]=zo[99]=0,Fo[99]=ko[99]=12,Go[99]=Bo[99]=19,Fo[38]=ko[38]=12,qo[38]=jo[38]=21,Bo[38]=zo[38]=22,Fo[39]=jo[39]=5,ko[39]=qo[39]=16,Bo[39]=zo[39]=22;var Uo=[];function Vo(t,e,n){return(t-e)/(n-e)}function Xo(t){return t.constructor.toString().indexOf("Array")>-1}function Yo(t,e,n,r,i,o){for(var s=t.cells[n][e],a=s.cval_real,u=e+r,l=n+i,c=[],h=!1;!h;){if(void 0===t.cells[l]||void 0===t.cells[l][u])if(l-=i,u-=r,a=(s=t.cells[l][u]).cval_real,-1===i)if(0===o)if(1&a)c.push([u,l]),r=-1,i=0,o=0;else{if(!(4&a)){c.push([u+s.bottomright,l]),r=0,i=1,o=1,h=!0;break}c.push([u+1,l]),r=1,i=0,o=0}else{if(!(1&a)){if(4&a){c.push([u+s.bottomright,l]),r=0,i=1,o=1,h=!0;break}c.push([u+s.bottomleft,l]),r=0,i=1,o=0,h=!0;break}c.push([u,l]),r=-1,i=0,o=0}else if(1===i)if(0===o){if(!(a&eo)){if(a&to){c.push([u+s.topleft,l+1]),r=0,i=-1,o=0,h=!0;break}c.push([u+s.topright,l+1]),r=0,i=-1,o=1,h=!0;break}c.push([u+1,l+1]),r=1,i=0,o=1}else c.push([u+1,l+1]),r=1,i=0,o=1;else if(-1===r)if(0===o){if(!(a&to)){if(1&a){c.push([u,l+s.leftbottom]),r=1,i=0,o=0,h=!0;break}c.push([u,l+s.lefttop]),r=1,i=0,o=1,h=!0;break}c.push([u,l+1]),r=0,i=1,o=0}else{if(!(a&to)){console.log("MarchingSquaresJS-isoBands: wtf");break}c.push([u,l+1]),r=0,i=1,o=0}else{if(1!==r){console.log("MarchingSquaresJS-isoBands: we came from nowhere!");break}if(0===o){if(!(4&a)){c.push([u+1,l+s.rightbottom]),r=-1,i=0,o=0,h=!0;break}c.push([u+1,l]),r=0,i=-1,o=1}else{if(!(4&a)){if(a&eo){c.push([u+1,l+s.righttop]),r=-1,i=0,o=1;break}c.push([u+1,l+s.rightbottom]),r=-1,i=0,o=0,h=!0;break}c.push([u+1,l]),r=0,i=-1,o=1}}else if(a=(s=t.cells[l][u]).cval_real,-1===r)if(0===o)if(void 0!==t.cells[l-1]&&void 0!==t.cells[l-1][u])r=0,i=-1,o=1;else{if(!(1&a)){c.push([u+s.bottomright,l]),r=0,i=1,o=1,h=!0;break}c.push([u,l])}else{if(!(a&to)){console.log("MarchingSquaresJS-isoBands: found entry from top at "+u+","+l);break}console.log("MarchingSquaresJS-isoBands: proceeding in x-direction!")}else if(1===r){if(0===o){console.log("MarchingSquaresJS-isoBands: wtf");break}if(void 0!==t.cells[l+1]&&void 0!==t.cells[l+1][u])r=0,i=1,o=0;else{if(!(a&eo)){c.push([u+s.topleft,l+1]),r=0,i=-1,o=0,h=!0;break}c.push([u+1,l+1]),r=1,i=0,o=1}}else if(-1===i){if(1!==o){console.log("MarchingSquaresJS-isoBands: wtf");break}if(void 0!==t.cells[l][u+1])r=1,i=0,o=1;else{if(!(4&a)){c.push([u+1,l+s.righttop]),r=-1,i=0,o=1,h=!0;break}c.push([u+1,l]),r=0,i=-1,o=1}}else{if(1!==i){console.log("MarchingSquaresJS-isoBands: where did we came from???");break}if(0!==o){console.log("MarchingSquaresJS-isoBands: wtf");break}if(void 0!==t.cells[l][u-1])r=-1,i=0,o=0;else{if(!(a&to)){c.push([u,l+s.leftbottom]),r=1,i=0,o=0,h=!0;break}c.push([u,l+1]),r=0,i=1,o=0}}if(l+=i,(u+=r)===e&&l===n)break}return{path:c,i:u,j:l,x:r,y:i,o:o}}function Ho(t){if(t.edges.length>0){var e=t.edges[t.edges.length-1],n=t.cval_real;switch(e){case 0:return n&eo?{p:[1,t.righttop],x:-1,y:0,o:1}:{p:[t.topleft,1],x:0,y:-1,o:0};case 1:return 4&n?{p:[t.topleft,1],x:0,y:-1,o:0}:{p:[1,t.rightbottom],x:-1,y:0,o:0};case 2:return 4&n?{p:[t.bottomright,0],x:0,y:1,o:1}:{p:[t.topleft,1],x:0,y:-1,o:0};case 3:return 1&n?{p:[t.topleft,1],x:0,y:-1,o:0}:{p:[t.bottomleft,0],x:0,y:1,o:0};case 4:return n&eo?{p:[1,t.righttop],x:-1,y:0,o:1}:{p:[t.topright,1],x:0,y:-1,o:1};case 5:return 4&n?{p:[t.topright,1],x:0,y:-1,o:1}:{p:[1,t.rightbottom],x:-1,y:0,o:0};case 6:return 4&n?{p:[t.bottomright,0],x:0,y:1,o:1}:{p:[t.topright,1],x:0,y:-1,o:1};case 7:return 1&n?{p:[t.topright,1],x:0,y:-1,o:1}:{p:[t.bottomleft,0],x:0,y:1,o:0};case 8:return 4&n?{p:[t.bottomright,0],x:0,y:1,o:1}:{p:[1,t.righttop],x:-1,y:0,o:1};case 9:return 1&n?{p:[1,t.righttop],x:-1,y:0,o:1}:{p:[t.bottomleft,0],x:0,y:1,o:0};case 10:return 1&n?{p:[0,t.leftbottom],x:1,y:0,o:0}:{p:[1,t.righttop],x:-1,y:0,o:1};case 11:return n&to?{p:[1,t.righttop],x:-1,y:0,o:1}:{p:[0,t.lefttop],x:1,y:0,o:1};case 12:return 4&n?{p:[t.bottomright,0],x:0,y:1,o:1}:{p:[1,t.rightbottom],x:-1,y:0,o:0};case 13:return 1&n?{p:[1,t.rightbottom],x:-1,y:0,o:0}:{p:[t.bottomleft,0],x:0,y:1,o:0};case 14:return 1&n?{p:[0,t.leftbottom],x:1,y:0,o:0}:{p:[1,t.rightbottom],x:-1,y:0,o:0};case 15:return n&to?{p:[1,t.rightbottom],x:-1,y:0,o:0}:{p:[0,t.lefttop],x:1,y:0,o:1};case 16:return 4&n?{p:[t.bottomright,0],x:0,y:1,o:1}:{p:[0,t.leftbottom],x:1,y:0,o:0};case 17:return n&to?{p:[t.bottomright,0],x:0,y:1,o:1}:{p:[0,t.lefttop],x:1,y:0,o:1};case 18:return 1&n?{p:[0,t.leftbottom],x:1,y:0,o:0}:{p:[t.bottomleft,0],x:0,y:1,o:0};case 19:return n&to?{p:[t.bottomleft,0],x:0,y:1,o:0}:{p:[0,t.lefttop],x:1,y:0,o:1};case 20:return n&to?{p:[t.topleft,1],x:0,y:-1,o:0}:{p:[0,t.leftbottom],x:1,y:0,o:0};case 21:return n&eo?{p:[0,t.leftbottom],x:1,y:0,o:0}:{p:[t.topright,1],x:0,y:-1,o:1};case 22:return n&to?{p:[t.topleft,1],x:0,y:-1,o:0}:{p:[0,t.lefttop],x:1,y:0,o:1};case 23:return n&eo?{p:[0,t.lefttop],x:1,y:0,o:1}:{p:[t.topright,1],x:0,y:-1,o:1};default:console.log("MarchingSquaresJS-isoBands: edge index out of range!"),console.log(t)}}return null}function Wo(t,e,n,r){var i,o,s,a,u,l=t.cval;switch(e){case-1:switch(r){case 0:i=Fo[l],s=ho[l],a=po[l],u=fo[l];break;default:i=Do[l],s=uo[l],a=lo[l],u=co[l]}break;case 1:switch(r){case 0:i=qo[l],s=Io[l],a=No[l],u=So[l];break;default:i=Bo[l],s=Eo[l],a=bo[l],u=wo[l]}break;default:switch(n){case-1:switch(r){case 0:i=zo[l],s=no[l],a=ro[l],u=io[l];break;default:i=jo[l],s=oo[l],a=so[l],u=ao[l]}break;case 1:switch(r){case 0:i=Go[l],s=go[l],a=yo[l],u=vo[l];break;default:i=ko[l],s=_o[l],a=mo[l],u=xo[l]}}}if(o=t.edges.indexOf(i),void 0===t.edges[o])return null;switch(function(t,e){delete t.edges[e];for(var n=e+1;n0){var a=r[e-1],u=is(n,a);!1!==u&&(a[1]=u,n[0]=u),s.push(a[0]),e===o.length-2&&(s.push(n[0]),s.push(n[1]))}2===o.length&&(s.push(n[0]),s.push(n[1]))}var l,c,h,p,f,g,d,y})),h(s,t.properties)}function ss(t,e,n){var r=e[0]-t[0],i=e[1]-t[1],o=n[0]-e[0];return function(t){return(t>0)-(t<0)||+t}(r*(n[1]-e[1])-o*i)}function as(t,e){return e.geometry.coordinates[0].every((function(e){return ye(a(e),t)}))}Uo[1]=Uo[169]=Co,Uo[4]=Uo[166]=Po,Uo[16]=Uo[154]=Mo,Uo[64]=Uo[106]=Lo,Uo[168]=Uo[2]=Oo,Uo[162]=Uo[8]=Ro,Uo[138]=Uo[32]=To,Uo[42]=Uo[128]=Ao,Uo[5]=Uo[165]=function(t){return[[0,0],[0,t.leftbottom],[1,t.rightbottom],[1,0]]},Uo[20]=Uo[150]=function(t){return[[1,0],[t.bottomright,0],[t.topright,1],[1,1]]},Uo[80]=Uo[90]=function(t){return[[1,1],[1,t.righttop],[0,t.lefttop],[0,1]]},Uo[65]=Uo[105]=function(t){return[[t.bottomleft,0],[0,0],[0,1],[t.topleft,1]]},Uo[160]=Uo[10]=function(t){return[[1,t.righttop],[1,t.rightbottom],[0,t.leftbottom],[0,t.lefttop]]},Uo[130]=Uo[40]=function(t){return[[t.topleft,1],[t.topright,1],[t.bottomright,0],[t.bottomleft,0]]},Uo[85]=function(){return[[0,0],[0,1],[1,1],[1,0]]},Uo[101]=Uo[69]=function(t){return[[1,t.rightbottom],[1,0],[0,0],[0,1],[t.topleft,1]]},Uo[149]=Uo[21]=function(t){return[[t.topright,1],[1,1],[1,0],[0,0],[0,t.leftbottom]]},Uo[86]=Uo[84]=function(t){return[[1,0],[t.bottomright,0],[0,t.lefttop],[0,1],[1,1]]},Uo[89]=Uo[81]=function(t){return[[1,1],[1,t.righttop],[t.bottomleft,0],[0,0],[0,1]]},Uo[96]=Uo[74]=function(t){return[[1,t.righttop],[1,t.rightbottom],[0,t.lefttop],[0,1],[t.topleft,1]]},Uo[24]=Uo[146]=function(t){return[[1,1],[1,t.righttop],[t.bottomright,0],[t.bottomleft,0],[t.topright,1]]},Uo[6]=Uo[164]=function(t){return[[1,t.rightbottom],[1,0],[t.bottomright,0],[0,t.leftbottom],[0,t.lefttop]]},Uo[129]=Uo[41]=function(t){return[[t.topright,1],[t.bottomleft,0],[0,0],[0,t.leftbottom],[t.topleft,1]]},Uo[66]=Uo[104]=function(t){return[[t.bottomright,0],[t.bottomleft,0],[0,t.lefttop],[0,1],[t.topleft,1]]},Uo[144]=Uo[26]=function(t){return[[1,1],[1,t.righttop],[0,t.leftbottom],[0,t.lefttop],[t.topright,1]]},Uo[36]=Uo[134]=function(t){return[[1,t.rightbottom],[1,0],[t.bottomright,0],[t.topleft,1],[t.topright,1]]},Uo[9]=Uo[161]=function(t){return[[1,t.righttop],[1,t.rightbottom],[t.bottomleft,0],[0,0],[0,t.leftbottom]]},Uo[37]=Uo[133]=function(t){return[[1,t.rightbottom],[1,0],[0,0],[0,t.leftbottom],[t.topleft,1],[t.topright,1]]},Uo[148]=Uo[22]=function(t){return[[1,1],[1,0],[t.bottomright,0],[0,t.leftbottom],[0,t.lefttop],[t.topright,1]]},Uo[82]=Uo[88]=function(t){return[[1,1],[1,t.righttop],[t.bottomright,0],[t.bottomleft,0],[0,t.lefttop],[0,1]]},Uo[73]=Uo[97]=function(t){return[[1,t.righttop],[1,t.rightbottom],[t.bottomleft,0],[0,0],[0,1],[t.topleft,1]]},Uo[145]=Uo[25]=function(t){return[[1,1],[1,t.righttop],[t.bottomleft,0],[0,0],[0,t.leftbottom],[t.topright,1]]},Uo[70]=Uo[100]=function(t){return[[1,t.rightbottom],[1,0],[t.bottomright,0],[0,t.lefttop],[0,1],[t.topleft,1]]},Uo[34]=function(t){return[Ao(t),Ro(t)]},Uo[35]=function(t){return[[1,t.righttop],[1,t.rightbottom],[t.bottomright,0],[t.bottomleft,0],[0,t.leftbottom],[0,t.lefttop],[t.topleft,1],[t.topright,1]]},Uo[136]=function(t){return[To(t),Oo(t)]},Uo[153]=function(t){return[Mo(t),Co(t)]},Uo[102]=function(t){return[Po(t),Lo(t)]},Uo[155]=function(t){return[[1,1],[1,t.righttop],[t.bottomleft,0],[0,0],[0,t.leftbottom],[t.topright,1]]},Uo[103]=function(t){return[[1,t.rightbottom],[1,0],[t.bottomright,0],[0,t.lefttop],[0,1],[t.topleft,1]]},Uo[152]=function(t){return[Mo(t),Oo(t)]},Uo[156]=function(t){return[[1,1],[1,t.righttop],[t.bottomright,0],[t.bottomleft,0],[0,t.leftbottom],[0,t.lefttop],[t.topright,1]]},Uo[137]=function(t){return[To(t),Co(t)]},Uo[139]=function(t){return[[1,t.righttop],[1,t.rightbottom],[t.bottomleft,0],[0,0],[0,t.leftbottom],[t.topleft,1],[t.topright,1]]},Uo[98]=function(t){return[Ro(t),Lo(t)]},Uo[99]=function(t){return[[1,t.righttop],[1,t.rightbottom],[t.bottomright,0],[t.bottomleft,0],[0,t.lefttop],[0,1],[t.topleft,1]]},Uo[38]=function(t){return[Po(t),Ao(t)]},Uo[39]=function(t){return[[1,t.rightbottom],[1,0],[t.bottomright,0],[0,t.leftbottom],[0,t.lefttop],[t.topleft,1],[t.topright,1]]};var us=function(){function t(e){this.id=t.buildId(e),this.coordinates=e,this.innerEdges=[],this.outerEdges=[],this.outerEdgesSorted=!1}return t.buildId=function(t){return t.join(",")},t.prototype.removeInnerEdge=function(t){this.innerEdges=this.innerEdges.filter((function(e){return e.from.id!==t.from.id}))},t.prototype.removeOuterEdge=function(t){this.outerEdges=this.outerEdges.filter((function(e){return e.to.id!==t.to.id}))},t.prototype.addOuterEdge=function(t){this.outerEdges.push(t),this.outerEdgesSorted=!1},t.prototype.sortOuterEdges=function(){var t=this;this.outerEdgesSorted||(this.outerEdges.sort((function(e,n){var r=e.to,i=n.to;if(r.coordinates[0]-t.coordinates[0]>=0&&i.coordinates[0]-t.coordinates[0]<0)return 1;if(r.coordinates[0]-t.coordinates[0]<0&&i.coordinates[0]-t.coordinates[0]>=0)return-1;if(r.coordinates[0]-t.coordinates[0]==0&&i.coordinates[0]-t.coordinates[0]==0)return r.coordinates[1]-t.coordinates[1]>=0||i.coordinates[1]-t.coordinates[1]>=0?r.coordinates[1]-i.coordinates[1]:i.coordinates[1]-r.coordinates[1];var o=ss(t.coordinates,r.coordinates,i.coordinates);return o<0?1:o>0?-1:Math.pow(r.coordinates[0]-t.coordinates[0],2)+Math.pow(r.coordinates[1]-t.coordinates[1],2)-(Math.pow(i.coordinates[0]-t.coordinates[0],2)+Math.pow(i.coordinates[1]-t.coordinates[1],2))})),this.outerEdgesSorted=!0)},t.prototype.getOuterEdges=function(){return this.sortOuterEdges(),this.outerEdges},t.prototype.getOuterEdge=function(t){return this.sortOuterEdges(),this.outerEdges[t]},t.prototype.addInnerEdge=function(t){this.innerEdges.push(t)},t}(),ls=function(){function t(t,e){this.from=t,this.to=e,this.next=void 0,this.label=void 0,this.symetric=void 0,this.ring=void 0,this.from.addOuterEdge(this),this.to.addInnerEdge(this)}return t.prototype.getSymetric=function(){return this.symetric||(this.symetric=new t(this.to,this.from),this.symetric.symetric=this),this.symetric},t.prototype.deleteEdge=function(){this.from.removeOuterEdge(this),this.to.removeInnerEdge(this)},t.prototype.isEqual=function(t){return this.from.id===t.from.id&&this.to.id===t.to.id},t.prototype.toString=function(){return"Edge { "+this.from.id+" -> "+this.to.id+" }"},t.prototype.toLineString=function(){return h([this.from.coordinates,this.to.coordinates])},t.prototype.compareTo=function(t){return ss(t.from.coordinates,t.to.coordinates,this.to.coordinates)},t}(),cs=function(){function t(){this.edges=[],this.polygon=void 0,this.envelope=void 0}return t.prototype.push=function(t){this.edges.push(t),this.polygon=this.envelope=void 0},t.prototype.get=function(t){return this.edges[t]},Object.defineProperty(t.prototype,"length",{get:function(){return this.edges.length},enumerable:!0,configurable:!0}),t.prototype.forEach=function(t){this.edges.forEach(t)},t.prototype.map=function(t){return this.edges.map(t)},t.prototype.some=function(t){return this.edges.some(t)},t.prototype.isValid=function(){return!0},t.prototype.isHole=function(){var t=this,e=this.edges.reduce((function(e,n,r){return n.from.coordinates[1]>t.edges[e].from.coordinates[1]&&(e=r),e}),0),n=(0===e?this.length:e)-1,r=(e+1)%this.length,i=ss(this.edges[n].from.coordinates,this.edges[e].from.coordinates,this.edges[r].from.coordinates);return 0===i?this.edges[n].from.coordinates[0]>this.edges[r].from.coordinates[0]:i>0},t.prototype.toMultiPoint=function(){return d(this.edges.map((function(t){return t.from.coordinates})))},t.prototype.toPolygon=function(){if(this.polygon)return this.polygon;var t=this.edges.map((function(t){return t.from.coordinates}));return t.push(this.edges[0].from.coordinates),this.polygon=l([t])},t.prototype.getEnvelope=function(){return this.envelope?this.envelope:this.envelope=dn(this.toPolygon())},t.findEdgeRingContaining=function(t,e){var n,r,i=t.getEnvelope();return e.forEach((function(e){var o,s,u,l,c,h,p=e.getEnvelope();if((r&&(n=r.getEnvelope()),s=i,u=(o=p).geometry.coordinates[0].map((function(t){return t[0]})),l=o.geometry.coordinates[0].map((function(t){return t[1]})),c=s.geometry.coordinates[0].map((function(t){return t[0]})),h=s.geometry.coordinates[0].map((function(t){return t[1]})),Math.max.apply(null,u)!==Math.max.apply(null,c)||Math.max.apply(null,l)!==Math.max.apply(null,h)||Math.min.apply(null,u)!==Math.min.apply(null,c)||Math.min.apply(null,l)!==Math.min.apply(null,h))&&as(p,i)){for(var f=t.map((function(t){return t.from.coordinates})),g=void 0,d=function(t){e.some((function(e){return n=t,r=e.from.coordinates,n[0]===r[0]&&n[1]===r[1];var n,r}))||(g=t)},y=0,v=f;y=0;--o){var s=i[o],a=s.symetric,u=void 0,l=void 0;s.label===e&&(u=s),a.label===e&&(l=a),u&&l&&(l&&(r=l),u&&(r&&(r.next=u,r=void 0),n||(n=u)))}r&&(r.next=n)},t.prototype._findLabeledEdgeRings=function(){var t=[],e=0;return this.edges.forEach((function(n){if(!(n.label>=0)){t.push(n);var r=n;do{r.label=e,r=r.next}while(!n.isEqual(r));e++}})),t},t.prototype.getEdgeRings=function(){var t=this;this._computeNextCWEdges(),this.edges.forEach((function(t){t.label=void 0})),this._findLabeledEdgeRings().forEach((function(e){t._findIntersectionNodes(e).forEach((function(n){t._computeNextCCWEdges(n,e.label)}))}));var e=[];return this.edges.forEach((function(n){n.ring||e.push(t._findEdgeRing(n))})),e},t.prototype._findIntersectionNodes=function(t){var e=[],n=t,r=function(){var r=0;n.from.getOuterEdges().forEach((function(e){e.label===t.label&&++r})),r>1&&e.push(n.from),n=n.next};do{r()}while(!t.isEqual(n));return e},t.prototype._findEdgeRing=function(t){var e=t,n=new cs;do{n.push(e),e.ring=n,e=e.next}while(!t.isEqual(e));return n},t.prototype.removeNode=function(t){var e=this;t.getOuterEdges().forEach((function(t){return e.removeEdge(t)})),t.innerEdges.forEach((function(t){return e.removeEdge(t)})),delete this.nodes[t.id]},t.prototype.removeEdge=function(t){this.edges=this.edges.filter((function(e){return!e.isEqual(t)})),t.deleteEdge()},t}();function ps(t,e){var n=!0;return z(t,(function(t){z(e,(function(e){if(!1===n)return!1;n=function(t,e){switch(t.type){case"Point":switch(e.type){case"Point":return n=t.coordinates,r=e.coordinates,!(n[0]===r[0]&&n[1]===r[1]);case"LineString":return!fs(e,t);case"Polygon":return!ye(t,e)}break;case"LineString":switch(e.type){case"Point":return!fs(t,e);case"LineString":return!function(t,e){if(Or(t,e).features.length>0)return!0;return!1}(t,e);case"Polygon":return!gs(e,t)}break;case"Polygon":switch(e.type){case"Point":return!ye(e,t);case"LineString":return!gs(t,e);case"Polygon":return!function(t,e){for(var n=0,r=t.coordinates[0];n0)return!0;return!1}(e,t)}}var n,r;return!1}(t.geometry,e.geometry)}))})),n}function fs(t,e){for(var n=0;n0}function ds(t,e,n){var r=n[0]-t[0],i=n[1]-t[1],o=e[0]-t[0],s=e[1]-t[1];return 0==r*s-i*o&&(Math.abs(o)>=Math.abs(s)?o>0?t[0]<=n[0]&&n[0]<=e[0]:e[0]<=n[0]&&n[0]<=t[0]:s>0?t[1]<=n[1]&&n[1]<=e[1]:e[1]<=n[1]&&n[1]<=t[1])}function ys(t,e){return!(t[0]>e[0])&&(!(t[2]e[1])&&!(t[3]0}function Es(t,e){for(var n=!1,r=!1,i=t.coordinates.length,o=0;o=Math.abs(a)?s>0?t[0]<=n[0]&&n[0]<=e[0]:e[0]<=n[0]&&n[0]<=t[0]:a>0?t[1]<=n[1]&&n[1]<=e[1]:e[1]<=n[1]&&n[1]<=t[1]:Math.abs(s)>=Math.abs(a)?s>0?t[0]0?t[1]=0&&(n=[].concat(t.slice(r,t.length),t.slice(1,r+1))),n},ws.prototype.comparePath=function(t,e){var n=this;return t.every((function(t,e){return n.compareCoord(t,this[e])}),e)},ws.prototype.comparePolygon=function(t,e){if(this.compareLine(t.coordinates[0],e.coordinates[0],1,!0)){var n=t.coordinates.slice(1,t.coordinates.length),r=e.coordinates.slice(1,e.coordinates.length),i=this;return n.every((function(t){return this.some((function(e){return i.compareLine(t,e,1,!0)}))}),r)}return!1},ws.prototype.compareFeature=function(t,e){return!(t.id!==e.id||!this.objectComparator(t.properties,e.properties)||!this.compareBBox(t,e))&&this.compare(t.geometry,e.geometry)},ws.prototype.compareBBox=function(t,e){return!!(!t.bbox&&!e.bbox||t.bbox&&e.bbox&&this.compareCoord(t.bbox,e.bbox))},ws.prototype.removePseudo=function(t){return t};var Cs=ws;function Ps(t,e){var n=!1;return z(t,(function(t){z(e,(function(e){if(!0===n)return!0;n=!ps(t.geometry,e.geometry)}))})),n}var Ms=Bt((function(t){function e(t,e,n,r){this.dataset=[],this.epsilon=1,this.minPts=2,this.distance=this._euclideanDistance,this.clusters=[],this.noise=[],this._visited=[],this._assigned=[],this._datasetLength=0,this._init(t,e,n,r)}e.prototype.run=function(t,e,n,r){this._init(t,e,n,r);for(var i=0;i=this.minPts&&(e=this._mergeArrays(e,i))}1!==this._assigned[r]&&this._addToCluster(r,t)}},e.prototype._addToCluster=function(t,e){this.clusters[e].push(t),this._assigned[t]=1},e.prototype._regionQuery=function(t){for(var e=[],n=0;n0){for(u=0;u=0);return t},e.prototype.assign=function(){for(var t,e=!1,n=this.dataset.length,r=0;ri&&(n=r):e=this.minPts)return n}},n.prototype._regionQuery=function(t,e){e=e||this.epsilon;for(var n=[],r=0,i=this.dataset.length;r0;r.length0;){var a=t[Math.floor(Math.random()*o)],u=s?a.join("_"):""+a;n[u]||(n[u]=!0,r.push(a))}if(r.length0,s=t[Math.floor(Math.random()*i)];o&&s.join("_");for(r.push(s);r.length0,f=[];if(n)i="kmrand"==n?Gs(t,e):"kmpp"==n?qs(t,e):n;else for(var g={};i.length0;){var u=s.pop();if(u===n)return Vs(u);u.closed=!0;for(var l=t.neighbors(u),c=0,h=l.length;c0)){if(o/=p,p<0){if(o0){if(o>h)return;o>c&&(c=o)}if(o=r-u,p||!(o<0)){if(o/=p,p<0){if(o>h)return;o>c&&(c=o)}else if(p>0){if(o0)){if(o/=f,f<0){if(o0){if(o>h)return;o>c&&(c=o)}if(o=i-l,f||!(o<0)){if(o/=f,f<0){if(o>h)return;o>c&&(c=o)}else if(f>0){if(o0||h<1)||(c>0&&(t[0]=[u+c*p,l+c*f]),h<1&&(t[1]=[u+h*p,l+h*f]),!0)}}}}}function ua(t,e,n,r,i){var o=t[1];if(o)return!0;var s,a,u=t[0],l=t.left,c=t.right,h=l[0],p=l[1],f=c[0],g=c[1],d=(h+f)/2,y=(p+g)/2;if(g===p){if(d=r)return;if(h>f){if(u){if(u[1]>=i)return}else u=[d,n];o=[d,i]}else{if(u){if(u[1]1)if(h>f){if(u){if(u[1]>=i)return}else u=[(n-a)/s,n];o=[(i-a)/s,i]}else{if(u){if(u[1]=r)return}else u=[e,s*e+a];o=[r,s*r+a]}else{if(u){if(u[0]0&&(this.content[0]=e,this.bubbleUp(0)),t},remove:function(t){var e=this.content.indexOf(t),n=this.content.pop();e!==this.content.length-1&&(this.content[e]=n,this.scoreFunction(n)0;){var n=(t+1>>1)-1,r=this.content[n];if(!(this.scoreFunction(e)=-La)){var f=u*u+l*l,g=c*c+h*h,d=(h*f-l*g)/p,y=(u*g-c*f)/p,v=fa.pop()||new ga;v.arc=t,v.site=i,v.x=d+s,v.y=(v.cy=y+a)+Math.sqrt(d*d+y*y),t.circle=v;for(var _=null,m=Ca._;m;)if(v.yMa)a=a.L;else{if(!((i=o-Ia(a,s))>Ma)){r>-Ma?(e=a.P,n=a):i>-Ma?(e=a,n=a.N):e=n=a;break}if(!a.R){e=a;break}a=a.R}!function(t){Sa[t.index]={site:t,halfedges:[]}}(t);var u=ma(t);if(Na.insert(e,u),e||n){if(e===n)return ya(e),n=ma(e.site),Na.insert(u,n),u.edge=n.edge=ia(e.site,u.site),da(e),void da(n);if(n){ya(e),ya(n);var l=e.site,c=l[0],h=l[1],p=t[0]-c,f=t[1]-h,g=n.site,d=g[0]-c,y=g[1]-h,v=2*(p*y-f*d),_=p*p+f*f,m=d*d+y*y,x=[(y*_-f*m)/v+c,(p*m-d*_)/v+h];sa(n.edge,l,g,x),u.edge=ia(l,t,null,x),n.edge=ia(t,g,null,x),da(e),da(n)}else u.edge=ia(e.site,u.site)}}function wa(t,e){var n=t.site,r=n[0],i=n[1],o=i-e;if(!o)return r;var s=t.P;if(!s)return-1/0;var a=(n=s.site)[0],u=n[1],l=u-e;if(!l)return a;var c=a-r,h=1/o-1/l,p=c/l;return h?(-p+Math.sqrt(p*p-2*h*(c*c/(-2*l)-u+l/2+i-o/2)))/h+r:(r+a)/2}function Ia(t,e){var n=t.N;if(n)return wa(n,e);var r=t.site;return r[1]===e?r[0]:1/0}var Na,Sa,Ca,Pa,Ma=1e-6,La=1e-12;function Oa(t,e){return e[1]-t[1]||e[0]-t[0]}function Ra(t,e){var n,r,i,o=t.sort(Oa).pop();for(Pa=[],Sa=new Array(t.length),Na=new $s,Ca=new $s;;)if(i=pa,o&&(!i||o[1]Ma||Math.abs(i[0][1]-i[1][1])>Ma)||delete Pa[o]}(s,a,u,l),function(t,e,n,r){var i,o,s,a,u,l,c,h,p,f,g,d,y=Sa.length,v=!0;for(i=0;iMa||Math.abs(d-p)>Ma)&&(u.splice(a,0,Pa.push(oa(s,f,Math.abs(g-t)Ma?[t,Math.abs(h-t)Ma?[Math.abs(p-r)Ma?[n,Math.abs(h-n)Ma?[Math.abs(p-e)=-270&&(d=-d),g<-180&&g>=-360&&(y=-y),"degrees"===o){var v=d*Math.cos(h)+y*Math.sin(h),_=y*Math.cos(h)-d*Math.sin(h);d=v,y=_}p.push([d+c[0],y+c[1]])}return p.push(p[0]),"degrees"===o?l([p],u):$o(l([p],u),s,{pivot:a})}function Da(t){var e=t*Math.PI/180;return Math.tan(e)}function Fa(t,e){void 0===e&&(e={});var n=0,r=0,i=0;return q(t,(function(t,o,s){var a=e.weight?null==s?void 0:s[e.weight]:void 0;if(!C(a=null==a?1:a))throw new Error("weight value must be a number for feature index "+o);(a=Number(a))>0&&R(t,(function(t){n+=t[0]*a,r+=t[1]*a,i+=a}))})),a([n/i,r/i],e.properties,e)}function ka(t,e,n,r,i){var o=r.tolerance||.001,s=0,u=0,l=0,c=0;if(F(n,(function(e){var n,r=null===(n=e.properties)||void 0===n?void 0:n.weight,i=null==r?1:r;if(!C(i=Number(i)))throw new Error("weight value must be a number");if(i>0){c+=1;var o=i*me(e,t);0===o&&(o=1);var a=i/o;s+=e.geometry.coordinates[0]*a,u+=e.geometry.coordinates[1]*a,l+=a}})),c<1)throw new Error("no features to measure");var h=s/l,p=u/l;return 1===c||0===i||Math.abs(h-e[0])n&&(n=u,r=o,e.push([]));var l=o-r,c=t.coordinates[u][l+1],h=i[0],p=i[1],f=c[0],g=c[1];e[u].push([.75*h+.25*f,.75*p+.25*g]),e[u].push([.25*h+.75*f,.25*p+.75*g])}),!0),e.forEach((function(t){t.push(t[0])}))}function Ba(t,e){var n=0,r=0,i=0;R(t,(function(o,s,a,u,l){u>i&&(i=u,r=s,e.push([[]])),l>n&&(n=l,r=s,e[u].push([]));var c=s-r,h=t.coordinates[u][l][c+1],p=o[0],f=o[1],g=h[0],d=h[1];e[u][l].push([.75*p+.25*g,.75*f+.25*d]),e[u][l].push([.25*p+.75*g,.25*f+.75*d])}),!0),e.forEach((function(t){t.forEach((function(t){t.push(t[0])}))}))}function za(t,e,n){void 0===n&&(n=2);var r=K(t),i=K(e),o=r[0]-i[0],s=r[1]-i[1];return 1===n?Math.abs(o)+Math.abs(s):Math.pow(Math.pow(o,n)+Math.pow(s,n),1/n)}function ja(t,e){var n=(e=e||{}).threshold||1e4,r=e.p||2,i=e.binary||!1,o=e.alpha||-1,s=e.standardization||!1,a=[];F(t,(function(t){a.push(En(t))}));for(var u=[],l=0;l0?1:0}(t[0]))*e,n*Math.log(Math.tan(.25*Math.PI+.5*t[1]*e))];return i[0]>r&&(i[0]=r),i[0]<-r&&(i[0]=-r),i[1]>r&&(i[1]=r),i[1]<-r&&(i[1]=-r),i}function Wa(t){var e=180/Math.PI,n=6378137;return[t[0]*e/n,(.5*Math.PI-2*Math.atan(Math.exp(-t[1]/n)))*e]}Ra.prototype={constructor:Ra,polygons:function(){var t=this.edges;return this.cells.map((function(e){var n=e.halfedges.map((function(n){return ca(e,t[n])}));return n.data=e.site.data,n}))},triangles:function(){var t=[],e=this.edges;return this.cells.forEach((function(n,r){if(o=(i=n.halfedges).length)for(var i,o,s,a,u,l,c=n.site,h=-1,p=e[i[o-1]],f=p.left===c?p.right:p.left;++h=a)return null;var u=t-i.site[0],l=e-i.site[1],c=u*u+l*l;do{i=o.cells[r=s],s=null,i.halfedges.forEach((function(n){var r=o.edges[n],a=r.left;if(a!==i.site&&a||(a=r.right)){var u=t-a[0],l=e-a[1],h=u*u+l*l;h0?t+n[e-1]:t})),o.forEach((function(t){t=2*t*Math.PI/o[o.length-1];var n=Math.random();i.push([n*(e.max_radial_length||10)*Math.sin(t),n*(e.max_radial_length||10)*Math.cos(t)])})),i[i.length-1]=i[0],i=i.map((r=Ka(e.bbox),function(t){return[t[0]+r[0],t[1]+r[1]]})),n.push(l([i]))},i=0;i + * @license MIT + * @preserve + */function fu(t,e){return t>e?1:t0))break;if(null===e.right)break;if(n(t,e.right.key)>0){a=e.right;if(e.right=a.left,a.left=e,null===(e=a).right)break}i.right=e,i=e,e=e.right}}return i.right=e.left,o.left=e.right,e.left=r.right,e.right=r.left,e}function du(t,e,n,r){var i=new pu(t,e);if(null===n)return i.left=i.right=null,i;var o=r(t,(n=gu(t,n,r)).key);return o<0?(i.left=n.left,i.right=n,n.left=null):o>=0&&(i.right=n.right,i.left=n,n.right=null),i}function yu(t,e,n){var r=null,i=null;if(e){var o=n((e=gu(t,e,n)).key,t);0===o?(r=e.left,i=e.right):o<0?(i=e.right,e.right=null,r=e):(r=e.left,e.left=null,i=e)}return{left:r,right:i}}function vu(t,e,n,r,i){if(t){r(e+(n?"└── ":"├── ")+i(t)+"\n");var o=e+(n?" ":"│ ");t.left&&vu(t.left,o,!1,r,i),t.right&&vu(t.right,o,!0,r,i)}}var _u=function(){function t(t){void 0===t&&(t=fu),this._root=null,this._size=0,this._comparator=t}return t.prototype.insert=function(t,e){return this._size++,this._root=du(t,e,this._root,this._comparator)},t.prototype.add=function(t,e){var n=new pu(t,e);null===this._root&&(n.left=n.right=null,this._size++,this._root=n);var r=this._comparator,i=gu(t,this._root,r),o=r(t,i.key);return 0===o?this._root=i:(o<0?(n.left=i.left,n.right=i,i.left=null):o>0&&(n.right=i.right,n.left=i,i.right=null),this._size++,this._root=n),this._root},t.prototype.remove=function(t){this._root=this._remove(t,this._root,this._comparator)},t.prototype._remove=function(t,e,n){var r;return null===e?null:0===n(t,(e=gu(t,e,n)).key)?(null===e.left?r=e.right:(r=gu(t,e.left,n)).right=e.right,this._size--,r):e},t.prototype.pop=function(){var t=this._root;if(t){for(;t.left;)t=t.left;return this._root=gu(t.key,this._root,this._comparator),this._root=this._remove(t.key,this._root,this._comparator),{key:t.key,data:t.data}}return null},t.prototype.findStatic=function(t){for(var e=this._root,n=this._comparator;e;){var r=n(t,e.key);if(0===r)return e;e=r<0?e.left:e.right}return null},t.prototype.find=function(t){return this._root&&(this._root=gu(t,this._root,this._comparator),0!==this._comparator(t,this._root.key))?null:this._root},t.prototype.contains=function(t){for(var e=this._root,n=this._comparator;e;){var r=n(t,e.key);if(0===r)return!0;e=r<0?e.left:e.right}return!1},t.prototype.forEach=function(t,e){for(var n=this._root,r=[],i=!1;!i;)null!==n?(r.push(n),n=n.left):0!==r.length?(n=r.pop(),t.call(e,n),n=n.right):i=!0;return this},t.prototype.range=function(t,e,n,r){for(var i=[],o=this._comparator,s=this._root;0!==i.length||s;)if(s)i.push(s),s=s.left;else{if(o((s=i.pop()).key,e)>0)break;if(o(s.key,t)>=0&&n.call(r,s))return this;s=s.right}return this},t.prototype.keys=function(){var t=[];return this.forEach((function(e){var n=e.key;return t.push(n)})),t},t.prototype.values=function(){var t=[];return this.forEach((function(e){var n=e.data;return t.push(n)})),t},t.prototype.min=function(){return this._root?this.minNode(this._root).key:null},t.prototype.max=function(){return this._root?this.maxNode(this._root).key:null},t.prototype.minNode=function(t){if(void 0===t&&(t=this._root),t)for(;t.left;)t=t.left;return t},t.prototype.maxNode=function(t){if(void 0===t&&(t=this._root),t)for(;t.right;)t=t.right;return t},t.prototype.at=function(t){for(var e=this._root,n=!1,r=0,i=[];!n;)if(e)i.push(e),e=e.left;else if(i.length>0){if(e=i.pop(),r===t)return e;r++,e=e.right}else n=!0;return null},t.prototype.next=function(t){var e=this._root,n=null;if(t.right){for(n=t.right;n.left;)n=n.left;return n}for(var r=this._comparator;e;){var i=r(t.key,e.key);if(0===i)break;i<0?(n=e,e=e.left):e=e.right}return n},t.prototype.prev=function(t){var e=this._root,n=null;if(null!==t.left){for(n=t.left;n.right;)n=n.right;return n}for(var r=this._comparator;e;){var i=r(t.key,e.key);if(0===i)break;i<0?e=e.left:(n=e,e=e.right)}return n},t.prototype.clear=function(){return this._root=null,this._size=0,this},t.prototype.toList=function(){return function(t){var e=t,n=[],r=!1,i=new pu(null,null),o=i;for(;!r;)e?(n.push(e),e=e.left):n.length>0?e=(e=o=o.next=n.pop()).right:r=!0;return o.next=null,i.next}(this._root)},t.prototype.load=function(t,e,n){void 0===e&&(e=[]),void 0===n&&(n=!1);var r=t.length,i=this._comparator;if(n&&Eu(t,e,0,r-1,i),null===this._root)this._root=mu(t,e,0,r),this._size=r;else{var o=function(t,e,n){var r=new pu(null,null),i=r,o=t,s=e;for(;null!==o&&null!==s;)n(o.key,s.key)<0?(i.next=o,o=o.next):(i.next=s,s=s.next),i=i.next;null!==o?i.next=o:null!==s&&(i.next=s);return r.next}(this.toList(),function(t,e){for(var n=new pu(null,null),r=n,i=0;i0){var o=n+Math.floor(i/2),s=t[o],a=e[o],u=new pu(s,a);return u.left=mu(t,e,n,o),u.right=mu(t,e,o+1,r),u}return null}function xu(t,e,n){var r=n-e;if(r>0){var i=e+Math.floor(r/2),o=xu(t,e,i),s=t.head;return s.left=o,t.head=t.head.next,s.right=xu(t,i+1,n),s}return null}function Eu(t,e,n,r,i){if(!(n>=r)){for(var o=t[n+r>>1],s=n-1,a=r+1;;){do{s++}while(i(t[s],o)<0);do{a--}while(i(t[a],o)>0);if(s>=a)break;var u=t[s];t[s]=t[a],t[a]=u,u=e[s],e[s]=e[a],e[a]=u}Eu(t,e,n,a,i),Eu(t,e,a+1,r,i)}}function bu(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function wu(t,e){for(var n=0;ne.x?1:t.ye.y?1:0}}]),Iu(t,[{key:"link",value:function(t){if(t.point===this.point)throw new Error("Tried to link already linked events");for(var e=t.point.events,n=0,r=e.length;n=0&&u>=0?sl?-1:0:o<0&&u<0?sl?1:0:uo?1:0}}}]),t}(),zu=0,ju=function(){function t(e,n,r,i){bu(this,t),this.id=++zu,this.leftSE=e,e.segment=this,e.otherSE=n,this.rightSE=n,n.segment=this,n.otherSE=e,this.rings=r,this.windings=i}return Iu(t,null,[{key:"compare",value:function(t,e){var n=t.leftSE.point.x,r=e.leftSE.point.x,i=t.rightSE.point.x,o=e.rightSE.point.x;if(os&&a>u)return-1;var c=t.comparePoint(e.leftSE.point);if(c<0)return 1;if(c>0)return-1;var h=e.comparePoint(t.rightSE.point);return 0!==h?h:-1}if(n>r){if(sa&&s>l)return 1;var p=e.comparePoint(t.leftSE.point);if(0!==p)return p;var f=t.comparePoint(e.rightSE.point);return f<0?1:f>0?-1:1}if(sa)return 1;if(io){var d=t.comparePoint(e.rightSE.point);if(d<0)return 1;if(d>0)return-1}if(i!==o){var y=u-s,v=i-n,_=l-a,m=o-r;if(y>v&&_m)return-1}return i>o?1:il?1:t.ide.id?1:0}}]),Iu(t,[{key:"replaceRightSE",value:function(t){this.rightSE=t,this.rightSE.segment=this,this.rightSE.otherSE=this.leftSE,this.leftSE.otherSE=this.rightSE}},{key:"bbox",value:function(){var t=this.leftSE.point.y,e=this.rightSE.point.y;return{ll:{x:this.leftSE.point.x,y:te?t:e}}}},{key:"vector",value:function(){return{x:this.rightSE.point.x-this.leftSE.point.x,y:this.rightSE.point.y-this.leftSE.point.y}}},{key:"isAnEndpoint",value:function(t){return t.x===this.leftSE.point.x&&t.y===this.leftSE.point.y||t.x===this.rightSE.point.x&&t.y===this.rightSE.point.y}},{key:"comparePoint",value:function(t){if(this.isAnEndpoint(t))return 0;var e=this.leftSE.point,n=this.rightSE.point,r=this.vector();if(e.x===n.x)return t.x===e.x?0:t.x0&&a.swapEvents(),Bu.comparePoints(this.leftSE.point,this.rightSE.point)>0&&this.swapEvents(),r&&(i.checkForConsuming(),o.checkForConsuming()),n}},{key:"swapEvents",value:function(){var t=this.rightSE;this.rightSE=this.leftSE,this.leftSE=t,this.leftSE.isLeft=!0,this.rightSE.isLeft=!1;for(var e=0,n=this.windings.length;e0){var o=n;n=r,r=o}if(n.prev===r){var s=n;n=r,r=s}for(var a=0,u=r.rings.length;a0))throw new Error("Tried to create degenerate segment at [".concat(e.x,", ").concat(e.y,"]"));i=n,o=e,s=-1}return new t(new Bu(i,!0),new Bu(o,!1),[r],[s])}}]),t}(),Uu=function(){function t(e,n,r){if(bu(this,t),!Array.isArray(e)||0===e.length)throw new Error("Input geometry is not a valid Polygon or MultiPolygon");if(this.poly=n,this.isExterior=r,this.segments=[],"number"!=typeof e[0][0]||"number"!=typeof e[0][1])throw new Error("Input geometry is not a valid Polygon or MultiPolygon");var i=Ru.round(e[0][0],e[0][1]);this.bbox={ll:{x:i.x,y:i.y},ur:{x:i.x,y:i.y}};for(var o=i,s=1,a=e.length;sthis.bbox.ur.x&&(this.bbox.ur.x=u.x),u.y>this.bbox.ur.y&&(this.bbox.ur.y=u.y),o=u)}i.x===o.x&&i.y===o.y||this.segments.push(ju.fromRing(o,i,this))}return Iu(t,[{key:"getSweepEvents",value:function(){for(var t=[],e=0,n=this.segments.length;ethis.bbox.ur.x&&(this.bbox.ur.x=o.bbox.ur.x),o.bbox.ur.y>this.bbox.ur.y&&(this.bbox.ur.y=o.bbox.ur.y),this.interiorRings.push(o)}this.multiPoly=n}return Iu(t,[{key:"getSweepEvents",value:function(){for(var t=this.exteriorRing.getSweepEvents(),e=0,n=this.interiorRings.length;ethis.bbox.ur.x&&(this.bbox.ur.x=o.bbox.ur.x),o.bbox.ur.y>this.bbox.ur.y&&(this.bbox.ur.y=o.bbox.ur.y),this.polys.push(o)}this.isSubject=n}return Iu(t,[{key:"getSweepEvents",value:function(){for(var t=[],e=0,n=this.polys.length;e0&&(t=r)}for(var i=t.segment.prevInResult(),o=i?i.prevInResult():null;;){if(!i)return null;if(!o)return i.ringOut;if(o.ringOut!==i.ringOut)return o.ringOut.enclosingRing()!==i.ringOut?i.ringOut:i.ringOut.enclosingRing();i=o.prevInResult(),o=i?i.prevInResult():null}}}]),t}(),Hu=function(){function t(e){bu(this,t),this.exteriorRing=e,e.poly=this,this.interiorRings=[]}return Iu(t,[{key:"addInterior",value:function(t){this.interiorRings.push(t),t.poly=this}},{key:"getGeom",value:function(){var t=[this.exteriorRing.getGeom()];if(null===t[0])return null;for(var e=0,n=this.interiorRings.length;e1&&void 0!==arguments[1]?arguments[1]:ju.compare;bu(this,t),this.queue=e,this.tree=new _u(n),this.segments=[]}return Iu(t,[{key:"process",value:function(t){var e=t.segment,n=[];if(t.consumedBy)return t.isLeft?this.queue.remove(t.otherSE):this.tree.remove(e),n;var r=t.isLeft?this.tree.insert(e):this.tree.find(e);if(!r)throw new Error("Unable to find segment #".concat(e.id," ")+"[".concat(e.leftSE.point.x,", ").concat(e.leftSE.point.y,"] -> ")+"[".concat(e.rightSE.point.x,", ").concat(e.rightSE.point.y,"] ")+"in SweepLine tree. Please submit a bug report.");for(var i=r,o=r,s=void 0,a=void 0;void 0===s;)null===(i=this.tree.prev(i))?s=null:void 0===i.key.consumedBy&&(s=i.key);for(;void 0===a;)null===(o=this.tree.next(o))?a=null:void 0===o.key.consumedBy&&(a=o.key);if(t.isLeft){var u=null;if(s){var l=s.getIntersection(e);if(null!==l&&(e.isAnEndpoint(l)||(u=l),!s.isAnEndpoint(l)))for(var c=this._splitSafely(s,l),h=0,p=c.length;h0?(this.tree.remove(e),n.push(t)):(this.segments.push(e),e.prev=s)}else{if(s&&a){var b=s.getIntersection(a);if(null!==b){if(!s.isAnEndpoint(b))for(var w=this._splitSafely(s,b),I=0,N=w.length;IZu)throw new Error("Infinite loop when putting segment endpoints in a priority queue (queue size too big). Please file a bug report.");for(var m=new Ju(f),x=f.size,E=f.pop();E;){var b=E.key;if(f.size===x){var w=b.segment;throw new Error("Unable to pop() ".concat(b.isLeft?"left":"right"," SweepEvent ")+"[".concat(b.point.x,", ").concat(b.point.y,"] from segment #").concat(w.id," ")+"[".concat(w.leftSE.point.x,", ").concat(w.leftSE.point.y,"] -> ")+"[".concat(w.rightSE.point.x,", ").concat(w.rightSE.point.y,"] from queue. ")+"Please file a bug report.")}if(f.size>Zu)throw new Error("Infinite loop when passing sweep line over endpoints (queue size too big). Please file a bug report.");if(m.segments.length>Ku)throw new Error("Infinite loop when passing sweep line over endpoints (too many sweep line segments). Please file a bug report.");for(var I=m.process(b),N=0,S=I.length;N1?e-1:0),r=1;r1?e-1:0),r=1;r1?e-1:0),r=1;r1?e-1:0),r=1;re.x?1:this.ye.y?1:0},ul.prototype.clone=function(){},ul.prototype.copy=function(){return new ul(this)},ul.prototype.toString=function(){return"("+this.x+", "+this.y+", "+this.z+")"},ul.prototype.distance3D=function(t){var e=this.x-t.x,n=this.y-t.y,r=this.z-t.z;return Math.sqrt(e*e+n*n+r*r)},ul.prototype.distance=function(t){var e=this.x-t.x,n=this.y-t.y;return Math.sqrt(e*e+n*n)},ul.prototype.hashCode=function(){var t=17;return t=37*(t=37*t+ul.hashCode(this.x))+ul.hashCode(this.y)},ul.prototype.setCoordinate=function(t){this.x=t.x,this.y=t.y,this.z=t.z},ul.prototype.interfaces_=function(){return[il,ol,al]},ul.prototype.getClass=function(){return ul},ul.hashCode=function(){if(1===arguments.length){var t=arguments[0],e=nl.doubleToLongBits(t);return Math.trunc((e^e)>>>32)}},ll.DimensionalComparator.get=function(){return cl},ll.serialVersionUID.get=function(){return 0x5cbf2c235c7e5800},ll.NULL_ORDINATE.get=function(){return nl.NaN},ll.X.get=function(){return 0},ll.Y.get=function(){return 1},ll.Z.get=function(){return 2},Object.defineProperties(ul,ll);var cl=function(t){if(this._dimensionsToTest=2,0===arguments.length);else if(1===arguments.length){var e=arguments[0];if(2!==e&&3!==e)throw new el("only 2 or 3 dimensions may be specified");this._dimensionsToTest=e}};cl.prototype.compare=function(t,e){var n=t,r=e,i=cl.compare(n.x,r.x);if(0!==i)return i;var o=cl.compare(n.y,r.y);return 0!==o?o:this._dimensionsToTest<=2?0:cl.compare(n.z,r.z)},cl.prototype.interfaces_=function(){return[sl]},cl.prototype.getClass=function(){return cl},cl.compare=function(t,e){return te?1:nl.isNaN(t)?nl.isNaN(e)?0:-1:nl.isNaN(e)?1:0};var hl=function(){};hl.prototype.create=function(){},hl.prototype.interfaces_=function(){return[]},hl.prototype.getClass=function(){return hl};var pl=function(){},fl={INTERIOR:{configurable:!0},BOUNDARY:{configurable:!0},EXTERIOR:{configurable:!0},NONE:{configurable:!0}};pl.prototype.interfaces_=function(){return[]},pl.prototype.getClass=function(){return pl},pl.toLocationSymbol=function(t){switch(t){case pl.EXTERIOR:return"e";case pl.BOUNDARY:return"b";case pl.INTERIOR:return"i";case pl.NONE:return"-"}throw new el("Unknown location value: "+t)},fl.INTERIOR.get=function(){return 0},fl.BOUNDARY.get=function(){return 1},fl.EXTERIOR.get=function(){return 2},fl.NONE.get=function(){return-1},Object.defineProperties(pl,fl);var gl=function(t,e){return t.interfaces_&&t.interfaces_().indexOf(e)>-1},dl=function(){},yl={LOG_10:{configurable:!0}};dl.prototype.interfaces_=function(){return[]},dl.prototype.getClass=function(){return dl},dl.log10=function(t){var e=Math.log(t);return nl.isInfinite(e)||nl.isNaN(e)?e:e/dl.LOG_10},dl.min=function(t,e,n,r){var i=t;return en?n:t}if(Number.isInteger(arguments[2])&&Number.isInteger(arguments[0])&&Number.isInteger(arguments[1])){var r=arguments[0],i=arguments[1],o=arguments[2];return ro?o:r}},dl.wrap=function(t,e){return t<0?e- -t%e:t%e},dl.max=function(){if(3===arguments.length){var t=arguments[0],e=arguments[1],n=arguments[2],r=t;return e>r&&(r=e),n>r&&(r=n),r}if(4===arguments.length){var i=arguments[0],o=arguments[1],s=arguments[2],a=arguments[3],u=i;return o>u&&(u=o),s>u&&(u=s),a>u&&(u=a),u}},dl.average=function(t,e){return(t+e)/2},yl.LOG_10.get=function(){return Math.log(10)},Object.defineProperties(dl,yl);var vl=function(t){this.str=t};vl.prototype.append=function(t){this.str+=t},vl.prototype.setCharAt=function(t,e){this.str=this.str.substr(0,t)+e+this.str.substr(t+1)},vl.prototype.toString=function(t){return this.str};var _l=function(t){this.value=t};_l.prototype.intValue=function(){return this.value},_l.prototype.compareTo=function(t){return this.valuet?1:0},_l.isNaN=function(t){return Number.isNaN(t)};var ml=function(){};ml.isWhitespace=function(t){return t<=32&&t>=0||127===t},ml.toUpperCase=function(t){return t.toUpperCase()};var xl=function t(){if(this._hi=0,this._lo=0,0===arguments.length)this.init(0);else if(1===arguments.length){if("number"==typeof arguments[0]){var e=arguments[0];this.init(e)}else if(arguments[0]instanceof t){var n=arguments[0];this.init(n)}else if("string"==typeof arguments[0]){var r=arguments[0];t.call(this,t.parse(r))}}else if(2===arguments.length){var i=arguments[0],o=arguments[1];this.init(i,o)}},El={PI:{configurable:!0},TWO_PI:{configurable:!0},PI_2:{configurable:!0},E:{configurable:!0},NaN:{configurable:!0},EPS:{configurable:!0},SPLIT:{configurable:!0},MAX_PRINT_DIGITS:{configurable:!0},TEN:{configurable:!0},ONE:{configurable:!0},SCI_NOT_EXPONENT_CHAR:{configurable:!0},SCI_NOT_ZERO:{configurable:!0}};xl.prototype.le=function(t){return(this._hi9?(c=!0,h="9"):h="0"+l,s.append(h),n=n.subtract(xl.valueOf(l)).multiply(xl.TEN),c&&n.selfAdd(xl.TEN);var p=!0,f=xl.magnitude(n._hi);if(f<0&&Math.abs(f)>=a-u&&(p=!1),!p)break}return e[0]=r,s.toString()},xl.prototype.sqr=function(){return this.multiply(this)},xl.prototype.doubleValue=function(){return this._hi+this._lo},xl.prototype.subtract=function(){if(arguments[0]instanceof xl){var t=arguments[0];return this.add(t.negate())}if("number"==typeof arguments[0]){var e=arguments[0];return this.add(-e)}},xl.prototype.equals=function(){if(1===arguments.length){var t=arguments[0];return this._hi===t._hi&&this._lo===t._lo}},xl.prototype.isZero=function(){return 0===this._hi&&0===this._lo},xl.prototype.selfSubtract=function(){if(arguments[0]instanceof xl){var t=arguments[0];return this.isNaN()?this:this.selfAdd(-t._hi,-t._lo)}if("number"==typeof arguments[0]){var e=arguments[0];return this.isNaN()?this:this.selfAdd(-e,0)}},xl.prototype.getSpecialNumberString=function(){return this.isZero()?"0.0":this.isNaN()?"NaN ":null},xl.prototype.min=function(t){return this.le(t)?this:t},xl.prototype.selfDivide=function(){if(1===arguments.length){if(arguments[0]instanceof xl){var t=arguments[0];return this.selfDivide(t._hi,t._lo)}if("number"==typeof arguments[0]){var e=arguments[0];return this.selfDivide(e,0)}}else if(2===arguments.length){var n=arguments[0],r=arguments[1],i=null,o=null,s=null,a=null,u=null,l=null,c=null,h=null;return u=this._hi/n,h=(i=(l=xl.SPLIT*u)-(i=l-u))*(s=(h=xl.SPLIT*n)-(s=h-n))-(c=u*n)+i*(a=n-s)+(o=u-i)*s+o*a,h=u+(l=(this._hi-c-h+this._lo-u*r)/n),this._hi=h,this._lo=u-h+l,this}},xl.prototype.dump=function(){return"DD<"+this._hi+", "+this._lo+">"},xl.prototype.divide=function(){if(arguments[0]instanceof xl){var t=arguments[0],e=null,n=null,r=null,i=null,o=null,s=null,a=null,u=null;n=(o=this._hi/t._hi)-(e=(s=xl.SPLIT*o)-(e=s-o)),u=e*(r=(u=xl.SPLIT*t._hi)-(r=u-t._hi))-(a=o*t._hi)+e*(i=t._hi-r)+n*r+n*i;var l=u=o+(s=(this._hi-a-u+this._lo-o*t._lo)/t._hi),c=o-u+s;return new xl(l,c)}if("number"==typeof arguments[0]){var h=arguments[0];return nl.isNaN(h)?xl.createNaN():xl.copy(this).selfDivide(h,0)}},xl.prototype.ge=function(t){return(this._hi>t._hi||this._hi===t._hi)&&this._lo>=t._lo},xl.prototype.pow=function(t){if(0===t)return xl.valueOf(1);var e=new xl(this),n=xl.valueOf(1),r=Math.abs(t);if(r>1)for(;r>0;)r%2==1&&n.selfMultiply(e),(r/=2)>0&&(e=e.sqr());else n=e;return t<0?n.reciprocal():n},xl.prototype.ceil=function(){if(this.isNaN())return xl.NaN;var t=Math.ceil(this._hi),e=0;return t===this._hi&&(e=Math.ceil(this._lo)),new xl(t,e)},xl.prototype.compareTo=function(t){var e=t;return this._hie._hi?1:this._loe._lo?1:0},xl.prototype.rint=function(){return this.isNaN()?this:this.add(.5).floor()},xl.prototype.setValue=function(){if(arguments[0]instanceof xl){var t=arguments[0];return this.init(t),this}if("number"==typeof arguments[0]){var e=arguments[0];return this.init(e),this}},xl.prototype.max=function(t){return this.ge(t)?this:t},xl.prototype.sqrt=function(){if(this.isZero())return xl.valueOf(0);if(this.isNegative())return xl.NaN;var t=1/Math.sqrt(this._hi),e=this._hi*t,n=xl.valueOf(e),r=this.subtract(n.sqr())._hi*(.5*t);return n.add(r)},xl.prototype.selfAdd=function(){if(1===arguments.length){if(arguments[0]instanceof xl){var t=arguments[0];return this.selfAdd(t._hi,t._lo)}if("number"==typeof arguments[0]){var e=arguments[0],n=null,r=null,i=null,o=null,s=null,a=null;return o=(i=this._hi+e)-(s=i-this._hi),r=(a=(o=e-s+(this._hi-o))+this._lo)+(i-(n=i+a)),this._hi=n+r,this._lo=r+(n-this._hi),this}}else if(2===arguments.length){var u=arguments[0],l=arguments[1],c=null,h=null,p=null,f=null,g=null,d=null,y=null;f=this._hi+u,h=this._lo+l,g=f-(d=f-this._hi),p=h-(y=h-this._lo);var v=(c=f+(d=(g=u-d+(this._hi-g))+h))+(d=(p=l-y+(this._lo-p))+(d+(f-c))),_=d+(c-v);return this._hi=v,this._lo=_,this}},xl.prototype.selfMultiply=function(){if(1===arguments.length){if(arguments[0]instanceof xl){var t=arguments[0];return this.selfMultiply(t._hi,t._lo)}if("number"==typeof arguments[0]){var e=arguments[0];return this.selfMultiply(e,0)}}else if(2===arguments.length){var n=arguments[0],r=arguments[1],i=null,o=null,s=null,a=null,u=null,l=null;i=(u=xl.SPLIT*this._hi)-this._hi,l=xl.SPLIT*n,i=u-i,o=this._hi-i,s=l-n;var c=(u=this._hi*n)+(l=i*(s=l-s)-u+i*(a=n-s)+o*s+o*a+(this._hi*r+this._lo*n)),h=l+(i=u-c);return this._hi=c,this._lo=h,this}},xl.prototype.selfSqr=function(){return this.selfMultiply(this)},xl.prototype.floor=function(){if(this.isNaN())return xl.NaN;var t=Math.floor(this._hi),e=0;return t===this._hi&&(e=Math.floor(this._lo)),new xl(t,e)},xl.prototype.negate=function(){return this.isNaN()?this:new xl(-this._hi,-this._lo)},xl.prototype.clone=function(){},xl.prototype.multiply=function(){if(arguments[0]instanceof xl){var t=arguments[0];return t.isNaN()?xl.createNaN():xl.copy(this).selfMultiply(t)}if("number"==typeof arguments[0]){var e=arguments[0];return nl.isNaN(e)?xl.createNaN():xl.copy(this).selfMultiply(e,0)}},xl.prototype.isNaN=function(){return nl.isNaN(this._hi)},xl.prototype.intValue=function(){return Math.trunc(this._hi)},xl.prototype.toString=function(){var t=xl.magnitude(this._hi);return t>=-3&&t<=20?this.toStandardNotation():this.toSciNotation()},xl.prototype.toStandardNotation=function(){var t=this.getSpecialNumberString();if(null!==t)return t;var e=new Array(1).fill(null),n=this.extractSignificantDigits(!0,e),r=e[0]+1,i=n;if("."===n.charAt(0))i="0"+n;else if(r<0)i="0."+xl.stringOfChar("0",-r)+n;else if(-1===n.indexOf(".")){var o=r-n.length;i=n+xl.stringOfChar("0",o)+".0"}return this.isNegative()?"-"+i:i},xl.prototype.reciprocal=function(){var t,e,n,r,i=null,o=null,s=null,a=null;t=(n=1/this._hi)-(i=(s=xl.SPLIT*n)-(i=s-n)),o=(a=xl.SPLIT*this._hi)-this._hi;var u=n+(s=(1-(r=n*this._hi)-(a=i*(o=a-o)-r+i*(e=this._hi-o)+t*o+t*e)-n*this._lo)/this._hi);return new xl(u,n-u+s)},xl.prototype.toSciNotation=function(){if(this.isZero())return xl.SCI_NOT_ZERO;var t=this.getSpecialNumberString();if(null!==t)return t;var e=new Array(1).fill(null),n=this.extractSignificantDigits(!1,e),r=xl.SCI_NOT_EXPONENT_CHAR+e[0];if("0"===n.charAt(0))throw new Error("Found leading zero: "+n);var i="";n.length>1&&(i=n.substring(1));var o=n.charAt(0)+"."+i;return this.isNegative()?"-"+o+r:o+r},xl.prototype.abs=function(){return this.isNaN()?xl.NaN:this.isNegative()?this.negate():new xl(this)},xl.prototype.isPositive=function(){return(this._hi>0||0===this._hi)&&this._lo>0},xl.prototype.lt=function(t){return(this._hit._hi||this._hi===t._hi)&&this._lo>t._lo},xl.prototype.isNegative=function(){return(this._hi<0||0===this._hi)&&this._lo<0},xl.prototype.trunc=function(){return this.isNaN()?xl.NaN:this.isPositive()?this.floor():this.ceil()},xl.prototype.signum=function(){return this._hi>0?1:this._hi<0?-1:this._lo>0?1:this._lo<0?-1:0},xl.prototype.interfaces_=function(){return[al,il,ol]},xl.prototype.getClass=function(){return xl},xl.sqr=function(t){return xl.valueOf(t).selfMultiply(t)},xl.valueOf=function(){if("string"==typeof arguments[0]){var t=arguments[0];return xl.parse(t)}if("number"==typeof arguments[0]){var e=arguments[0];return new xl(e)}},xl.sqrt=function(t){return xl.valueOf(t).sqrt()},xl.parse=function(t){for(var e=0,n=t.length;ml.isWhitespace(t.charAt(e));)e++;var r=!1;if(e=n);){var l=t.charAt(e);if(e++,ml.isDigit(l)){var c=l-"0";o.selfMultiply(xl.TEN),o.selfAdd(c),s++}else{if("."!==l){if("e"===l||"E"===l){var h=t.substring(e);try{u=_l.parseInt(h)}catch(e){throw e instanceof Error?new Error("Invalid exponent "+h+" in string "+t):e}break}throw new Error("Unexpected character '"+l+"' at position "+e+" in string "+t)}a=s}}var p=o,f=s-a-u;if(0===f)p=o;else if(f>0){var g=xl.TEN.pow(f);p=o.divide(g)}else if(f<0){var d=xl.TEN.pow(-f);p=o.multiply(d)}return r?p.negate():p},xl.createNaN=function(){return new xl(nl.NaN,nl.NaN)},xl.copy=function(t){return new xl(t)},xl.magnitude=function(t){var e=Math.abs(t),n=Math.log(e)/Math.log(10),r=Math.trunc(Math.floor(n));return 10*Math.pow(10,r)<=e&&(r+=1),r},xl.stringOfChar=function(t,e){for(var n=new vl,r=0;r0){if(o<=0)return bl.signum(s);r=i+o}else{if(!(i<0))return bl.signum(s);if(o>=0)return bl.signum(s);r=-i-o}var a=bl.DP_SAFE_EPSILON*r;return s>=a||-s>=a?bl.signum(s):2},bl.signum=function(t){return t>0?1:t<0?-1:0},wl.DP_SAFE_EPSILON.get=function(){return 1e-15},Object.defineProperties(bl,wl);var Il=function(){},Nl={X:{configurable:!0},Y:{configurable:!0},Z:{configurable:!0},M:{configurable:!0}};Nl.X.get=function(){return 0},Nl.Y.get=function(){return 1},Nl.Z.get=function(){return 2},Nl.M.get=function(){return 3},Il.prototype.setOrdinate=function(t,e,n){},Il.prototype.size=function(){},Il.prototype.getOrdinate=function(t,e){},Il.prototype.getCoordinate=function(){},Il.prototype.getCoordinateCopy=function(t){},Il.prototype.getDimension=function(){},Il.prototype.getX=function(t){},Il.prototype.clone=function(){},Il.prototype.expandEnvelope=function(t){},Il.prototype.copy=function(){},Il.prototype.getY=function(t){},Il.prototype.toCoordinateArray=function(){},Il.prototype.interfaces_=function(){return[ol]},Il.prototype.getClass=function(){return Il},Object.defineProperties(Il,Nl);var Sl=function(){},Cl=function(t){function e(){t.call(this,"Projective point not representable on the Cartesian plane.")}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(Sl),Pl=function(){};Pl.arraycopy=function(t,e,n,r,i){for(var o=0,s=e;st._minx?this._minx:t._minx,n=this._miny>t._miny?this._miny:t._miny,r=this._maxx=this._minx&&e.getMaxX()<=this._maxx&&e.getMinY()>=this._miny&&e.getMaxY()<=this._maxy)}}else if(2===arguments.length){var n=arguments[0],r=arguments[1];return!this.isNull()&&(n>=this._minx&&n<=this._maxx&&r>=this._miny&&r<=this._maxy)}},Ll.prototype.intersects=function(){if(1===arguments.length){if(arguments[0]instanceof Ll){var t=arguments[0];return!this.isNull()&&!t.isNull()&&!(t._minx>this._maxx||t._maxxthis._maxy||t._maxythis._maxx||nthis._maxy||rthis._maxx&&(this._maxx=e._maxx),e._minythis._maxy&&(this._maxy=e._maxy))}}else if(2===arguments.length){var n=arguments[0],r=arguments[1];this.isNull()?(this._minx=n,this._maxx=n,this._miny=r,this._maxy=r):(nthis._maxx&&(this._maxx=n),rthis._maxy&&(this._maxy=r))}},Ll.prototype.minExtent=function(){if(this.isNull())return 0;var t=this.getWidth(),e=this.getHeight();return te._minx?1:this._minye._miny?1:this._maxxe._maxx?1:this._maxye._maxy?1:0},Ll.prototype.translate=function(t,e){if(this.isNull())return null;this.init(this.getMinX()+t,this.getMaxX()+t,this.getMinY()+e,this.getMaxY()+e)},Ll.prototype.toString=function(){return"Env["+this._minx+" : "+this._maxx+", "+this._miny+" : "+this._maxy+"]"},Ll.prototype.setToNull=function(){this._minx=0,this._maxx=-1,this._miny=0,this._maxy=-1},Ll.prototype.getHeight=function(){return this.isNull()?0:this._maxy-this._miny},Ll.prototype.maxExtent=function(){if(this.isNull())return 0;var t=this.getWidth(),e=this.getHeight();return t>e?t:e},Ll.prototype.expandBy=function(){if(1===arguments.length){var t=arguments[0];this.expandBy(t,t)}else if(2===arguments.length){var e=arguments[0],n=arguments[1];if(this.isNull())return null;this._minx-=e,this._maxx+=e,this._miny-=n,this._maxy+=n,(this._minx>this._maxx||this._miny>this._maxy)&&this.setToNull()}},Ll.prototype.contains=function(){if(1===arguments.length){if(arguments[0]instanceof Ll){var t=arguments[0];return this.covers(t)}if(arguments[0]instanceof ul){var e=arguments[0];return this.covers(e)}}else if(2===arguments.length){var n=arguments[0],r=arguments[1];return this.covers(n,r)}},Ll.prototype.centre=function(){return this.isNull()?null:new ul((this.getMinX()+this.getMaxX())/2,(this.getMinY()+this.getMaxY())/2)},Ll.prototype.init=function(){if(0===arguments.length)this.setToNull();else if(1===arguments.length){if(arguments[0]instanceof ul){var t=arguments[0];this.init(t.x,t.x,t.y,t.y)}else if(arguments[0]instanceof Ll){var e=arguments[0];this._minx=e._minx,this._maxx=e._maxx,this._miny=e._miny,this._maxy=e._maxy}}else if(2===arguments.length){var n=arguments[0],r=arguments[1];this.init(n.x,r.x,n.y,r.y)}else if(4===arguments.length){var i=arguments[0],o=arguments[1],s=arguments[2],a=arguments[3];it._maxx&&(e=this._minx-t._maxx);var n=0;return this._maxyt._maxy&&(n=this._miny-t._maxy),0===e?n:0===n?e:Math.sqrt(e*e+n*n)},Ll.prototype.hashCode=function(){var t=17;return t=37*(t=37*(t=37*(t=37*t+ul.hashCode(this._minx))+ul.hashCode(this._maxx))+ul.hashCode(this._miny))+ul.hashCode(this._maxy)},Ll.prototype.interfaces_=function(){return[il,al]},Ll.prototype.getClass=function(){return Ll},Ll.intersects=function(){if(3===arguments.length){var t=arguments[0],e=arguments[1],n=arguments[2];return n.x>=(t.xe.x?t.x:e.x)&&n.y>=(t.ye.y?t.y:e.y)}if(4===arguments.length){var r=arguments[0],i=arguments[1],o=arguments[2],s=arguments[3],a=Math.min(o.x,s.x),u=Math.max(o.x,s.x),l=Math.min(r.x,i.x),c=Math.max(r.x,i.x);return!(l>u)&&(!(cu)&&!(cn?(this._intLineIndex[t][0]=0,this._intLineIndex[t][1]=1):(this._intLineIndex[t][0]=1,this._intLineIndex[t][1]=0)}},Bl.prototype.isProper=function(){return this.hasIntersection()&&this._isProper},Bl.prototype.setPrecisionModel=function(t){this._precisionModel=t},Bl.prototype.isInteriorIntersection=function(){var t=this;if(0===arguments.length)return!!this.isInteriorIntersection(0)||!!this.isInteriorIntersection(1);if(1===arguments.length){for(var e=arguments[0],n=0;ni?r:i;else{var s=Math.abs(t.x-e.x),a=Math.abs(t.y-e.y);0!==(o=r>i?s:a)||t.equals(e)||(o=Math.max(s,a))}return ql.isTrue(!(0===o&&!t.equals(e)),"Bad distance calculation"),o},Bl.nonRobustComputeEdgeDistance=function(t,e,n){var r=t.x-e.x,i=t.y-e.y,o=Math.sqrt(r*r+i*i);return ql.isTrue(!(0===o&&!t.equals(e)),"Invalid distance calculation"),o},zl.DONT_INTERSECT.get=function(){return 0},zl.DO_INTERSECT.get=function(){return 1},zl.COLLINEAR.get=function(){return 2},zl.NO_INTERSECTION.get=function(){return 0},zl.POINT_INTERSECTION.get=function(){return 1},zl.COLLINEAR_INTERSECTION.get=function(){return 2},Object.defineProperties(Bl,zl);var jl=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.isInSegmentEnvelopes=function(t){var e=new Ll(this._inputLines[0][0],this._inputLines[0][1]),n=new Ll(this._inputLines[1][0],this._inputLines[1][1]);return e.contains(t)&&n.contains(t)},e.prototype.computeIntersection=function(){if(3!==arguments.length)return t.prototype.computeIntersection.apply(this,arguments);var e=arguments[0],n=arguments[1],r=arguments[2];if(this._isProper=!1,Ll.intersects(n,r,e)&&0===Xl.orientationIndex(n,r,e)&&0===Xl.orientationIndex(r,n,e))return this._isProper=!0,(e.equals(n)||e.equals(r))&&(this._isProper=!1),this._result=t.POINT_INTERSECTION,null;this._result=t.NO_INTERSECTION},e.prototype.normalizeToMinimum=function(t,e,n,r,i){i.x=this.smallestInAbsValue(t.x,e.x,n.x,r.x),i.y=this.smallestInAbsValue(t.y,e.y,n.y,r.y),t.x-=i.x,t.y-=i.y,e.x-=i.x,e.y-=i.y,n.x-=i.x,n.y-=i.y,r.x-=i.x,r.y-=i.y},e.prototype.safeHCoordinateIntersection=function(t,n,r,i){var o=null;try{o=Ml.intersection(t,n,r,i)}catch(s){if(!(s instanceof Cl))throw s;o=e.nearestEndpoint(t,n,r,i)}return o},e.prototype.intersection=function(t,n,r,i){var o=this.intersectionWithNormalization(t,n,r,i);return this.isInSegmentEnvelopes(o)||(o=new ul(e.nearestEndpoint(t,n,r,i))),null!==this._precisionModel&&this._precisionModel.makePrecise(o),o},e.prototype.smallestInAbsValue=function(t,e,n,r){var i=t,o=Math.abs(i);return Math.abs(e)1e-4&&Pl.out.println("Distance = "+i.distance(o))},e.prototype.intersectionWithNormalization=function(t,e,n,r){var i=new ul(t),o=new ul(e),s=new ul(n),a=new ul(r),u=new ul;this.normalizeToEnvCentre(i,o,s,a,u);var l=this.safeHCoordinateIntersection(i,o,s,a);return l.x+=u.x,l.y+=u.y,l},e.prototype.computeCollinearIntersection=function(e,n,r,i){var o=Ll.intersects(e,n,r),s=Ll.intersects(e,n,i),a=Ll.intersects(r,i,e),u=Ll.intersects(r,i,n);return o&&s?(this._intPt[0]=r,this._intPt[1]=i,t.COLLINEAR_INTERSECTION):a&&u?(this._intPt[0]=e,this._intPt[1]=n,t.COLLINEAR_INTERSECTION):o&&a?(this._intPt[0]=r,this._intPt[1]=e,!r.equals(e)||s||u?t.COLLINEAR_INTERSECTION:t.POINT_INTERSECTION):o&&u?(this._intPt[0]=r,this._intPt[1]=n,!r.equals(n)||s||a?t.COLLINEAR_INTERSECTION:t.POINT_INTERSECTION):s&&a?(this._intPt[0]=i,this._intPt[1]=e,!i.equals(e)||o||u?t.COLLINEAR_INTERSECTION:t.POINT_INTERSECTION):s&&u?(this._intPt[0]=i,this._intPt[1]=n,!i.equals(n)||o||a?t.COLLINEAR_INTERSECTION:t.POINT_INTERSECTION):t.NO_INTERSECTION},e.prototype.normalizeToEnvCentre=function(t,e,n,r,i){var o=t.xe.x?t.x:e.x,u=t.y>e.y?t.y:e.y,l=n.xr.x?n.x:r.x,p=n.y>r.y?n.y:r.y,f=((o>l?o:l)+(ac?s:c)+(u0&&s>0||o<0&&s<0)return t.NO_INTERSECTION;var a=Xl.orientationIndex(r,i,e),u=Xl.orientationIndex(r,i,n);return a>0&&u>0||a<0&&u<0?t.NO_INTERSECTION:0===o&&0===s&&0===a&&0===u?this.computeCollinearIntersection(e,n,r,i):(0===o||0===s||0===a||0===u?(this._isProper=!1,e.equals2D(r)||e.equals2D(i)?this._intPt[0]=e:n.equals2D(r)||n.equals2D(i)?this._intPt[0]=n:0===o?this._intPt[0]=new ul(r):0===s?this._intPt[0]=new ul(i):0===a?this._intPt[0]=new ul(e):0===u&&(this._intPt[0]=new ul(n))):(this._isProper=!0,this._intPt[0]=this.intersection(e,n,r,i)),t.POINT_INTERSECTION)},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e.nearestEndpoint=function(t,e,n,r){var i=t,o=Xl.distancePointLine(t,n,r),s=Xl.distancePointLine(e,n,r);return s0?n>0?-i:i:n>0?i:-i;if(0===e||0===n)return r>0?t>0?i:-i:t>0?-i:i;if(e>0?r>0?e<=r||(i=-i,o=t,t=n,n=o,o=e,e=r,r=o):e<=-r?(i=-i,n=-n,r=-r):(o=t,t=-n,n=o,o=e,e=-r,r=o):r>0?-e<=r?(i=-i,t=-t,e=-e):(o=-t,t=n,n=o,o=-e,e=r,r=o):e>=r?(t=-t,e=-e,n=-n,r=-r):(i=-i,o=-t,t=-n,n=o,o=-e,e=-r,r=o),t>0){if(!(n>0))return i;if(!(t<=n))return i}else{if(n>0)return-i;if(!(t>=n))return-i;i=-i,t=-t,n=-n}for(;;){if((r-=(s=Math.floor(n/t))*e)<0)return-i;if(r>e)return i;if(t>(n-=s*t)+n){if(er+r)return-i;n=t-n,r=e-r,i=-i}if(0===r)return 0===n?0:-i;if(0===n)return i;if((e-=(s=Math.floor(t/n))*r)<0)return i;if(e>r)return-i;if(n>(t-=s*n)+t){if(re+e)return i;t=n-t,e=r-e,i=-i}if(0===e)return 0===t?0:i;if(0===t)return-i}};var Vl=function(){this._p=null,this._crossingCount=0,this._isPointOnSegment=!1;var t=arguments[0];this._p=t};Vl.prototype.countSegment=function(t,e){if(t.xr&&(n=e.x,r=t.x),this._p.x>=n&&this._p.x<=r&&(this._isPointOnSegment=!0),null}if(t.y>this._p.y&&e.y<=this._p.y||e.y>this._p.y&&t.y<=this._p.y){var i=t.x-this._p.x,o=t.y-this._p.y,s=e.x-this._p.x,a=e.y-this._p.y,u=Ul.signOfDet2x2(i,o,s,a);if(0===u)return this._isPointOnSegment=!0,null;a0&&this._crossingCount++}},Vl.prototype.isPointInPolygon=function(){return this.getLocation()!==pl.EXTERIOR},Vl.prototype.getLocation=function(){return this._isPointOnSegment?pl.BOUNDARY:this._crossingCount%2==1?pl.INTERIOR:pl.EXTERIOR},Vl.prototype.isOnSegment=function(){return this._isPointOnSegment},Vl.prototype.interfaces_=function(){return[]},Vl.prototype.getClass=function(){return Vl},Vl.locatePointInRing=function(){if(arguments[0]instanceof ul&&gl(arguments[1],Il)){for(var t=arguments[0],e=arguments[1],n=new Vl(t),r=new ul,i=new ul,o=1;o1||a<0||a>1)&&(i=!0)}}else i=!0;return i?dl.min(Xl.distancePointLine(t,n,r),Xl.distancePointLine(e,n,r),Xl.distancePointLine(n,t,e),Xl.distancePointLine(r,t,e)):0},Xl.isPointInRing=function(t,e){return Xl.locatePointInRing(t,e)!==pl.EXTERIOR},Xl.computeLength=function(t){var e=t.size();if(e<=1)return 0;var n=0,r=new ul;t.getCoordinate(0,r);for(var i=r.x,o=r.y,s=1;sn.y&&(n=o,r=i)}var s=r;do{(s-=1)<0&&(s=e)}while(t[s].equals2D(n)&&s!==r);var a=r;do{a=(a+1)%e}while(t[a].equals2D(n)&&a!==r);var u=t[s],l=t[a];if(u.equals2D(n)||l.equals2D(n)||u.equals2D(l))return!1;var c=Xl.computeOrientation(u,n,l),h=!1;return h=0===c?u.x>l.x:c>0,h},Xl.locatePointInRing=function(t,e){return Vl.locatePointInRing(t,e)},Xl.distancePointLinePerpendicular=function(t,e,n){var r=(n.x-e.x)*(n.x-e.x)+(n.y-e.y)*(n.y-e.y),i=((e.y-t.y)*(n.x-e.x)-(e.x-t.x)*(n.y-e.y))/r;return Math.abs(i)*Math.sqrt(r)},Xl.computeOrientation=function(t,e,n){return Xl.orientationIndex(t,e,n)},Xl.distancePointLine=function(){if(2===arguments.length){var t=arguments[0],e=arguments[1];if(0===e.length)throw new el("Line array must contain at least one vertex");for(var n=t.distance(e[0]),r=0;r=1)return o.distance(a);var c=((s.y-o.y)*(a.x-s.x)-(s.x-o.x)*(a.y-s.y))/u;return Math.abs(c)*Math.sqrt(u)}},Xl.isOnLine=function(t,e){for(var n=new jl,r=1;r0},ec.prototype.interfaces_=function(){return[Ql]},ec.prototype.getClass=function(){return ec};var nc=function(){};nc.prototype.isInBoundary=function(t){return t>1},nc.prototype.interfaces_=function(){return[Ql]},nc.prototype.getClass=function(){return nc};var rc=function(){};rc.prototype.isInBoundary=function(t){return 1===t},rc.prototype.interfaces_=function(){return[Ql]},rc.prototype.getClass=function(){return rc};var ic=function(){};function oc(t){this.message=t||""}ic.prototype.add=function(){},ic.prototype.addAll=function(){},ic.prototype.isEmpty=function(){},ic.prototype.iterator=function(){},ic.prototype.size=function(){},ic.prototype.toArray=function(){},ic.prototype.remove=function(){},oc.prototype=new Error,oc.prototype.name="IndexOutOfBoundsException";var sc=function(){};sc.prototype.hasNext=function(){},sc.prototype.next=function(){},sc.prototype.remove=function(){};var ac=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.get=function(){},e.prototype.set=function(){},e.prototype.isEmpty=function(){},e}(ic);function uc(t){this.message=t||""}uc.prototype=new Error,uc.prototype.name="NoSuchElementException";var lc=function(t){function e(){t.call(this),this.array_=[],arguments[0]instanceof ic&&this.addAll(arguments[0])}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.ensureCapacity=function(){},e.prototype.interfaces_=function(){return[t,ic]},e.prototype.add=function(t){return 1===arguments.length?this.array_.push(t):this.array_.splice(arguments[0],arguments[1]),!0},e.prototype.clear=function(){this.array_=[]},e.prototype.addAll=function(t){for(var e=t.iterator();e.hasNext();)this.add(e.next());return!0},e.prototype.set=function(t,e){var n=this.array_[t];return this.array_[t]=e,n},e.prototype.iterator=function(){return new cc(this)},e.prototype.get=function(t){if(t<0||t>=this.size())throw new oc;return this.array_[t]},e.prototype.isEmpty=function(){return 0===this.array_.length},e.prototype.size=function(){return this.array_.length},e.prototype.toArray=function(){for(var t=[],e=0,n=this.array_.length;e=1){var a=this.get(this.size()-1);if(a.equals2D(o))return null}t.prototype.add.call(this,o)}else if(arguments[0]instanceof Object&&"boolean"==typeof arguments[1]){var u=arguments[0],l=arguments[1];return this.add(u,l),!0}}else if(3===arguments.length){if("boolean"==typeof arguments[2]&&arguments[0]instanceof Array&&"boolean"==typeof arguments[1]){var c=arguments[0],h=arguments[1],p=arguments[2];if(p)for(var f=0;f=0;g--)e.add(c[g],h);return!0}if("boolean"==typeof arguments[2]&&Number.isInteger(arguments[0])&&arguments[1]instanceof ul){var d=arguments[0],y=arguments[1],v=arguments[2];if(!v){var _=this.size();if(_>0){if(d>0){var m=this.get(d-1);if(m.equals2D(y))return null}if(d<_){var x=this.get(d);if(x.equals2D(y))return null}}}t.prototype.add.call(this,d,y)}}else if(4===arguments.length){var E=arguments[0],b=arguments[1],w=arguments[2],I=arguments[3],N=1;w>I&&(N=-1);for(var S=w;S!==I;S+=N)e.add(E[S],b);return!0}},e.prototype.closeRing=function(){this.size()>0&&this.add(new ul(this.get(0)),!1)},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},Object.defineProperties(e,n),e}(lc),pc=function(){},fc={ForwardComparator:{configurable:!0},BidirectionalComparator:{configurable:!0},coordArrayType:{configurable:!0}};fc.ForwardComparator.get=function(){return gc},fc.BidirectionalComparator.get=function(){return dc},fc.coordArrayType.get=function(){return new Array(0).fill(null)},pc.prototype.interfaces_=function(){return[]},pc.prototype.getClass=function(){return pc},pc.isRing=function(t){return!(t.length<4)&&!!t[0].equals2D(t[t.length-1])},pc.ptNotInList=function(t,e){for(var n=0;n=t?e:[]},pc.indexOf=function(t,e){for(var n=0;n0)&&(e=t[n]);return e},pc.extract=function(t,e,n){e=dl.clamp(e,0,t.length);var r=(n=dl.clamp(n,-1,t.length))-e+1;n<0&&(r=0),e>=t.length&&(r=0),nr.length)return 1;if(0===n.length)return 0;var i=pc.compare(n,r);return pc.isEqualReversed(n,r)?0:i},dc.prototype.OLDcompare=function(t,e){var n=t,r=e;if(n.lengthr.length)return 1;if(0===n.length)return 0;for(var i=pc.increasingDirection(n),o=pc.increasingDirection(r),s=i>0?0:n.length-1,a=o>0?0:n.length-1,u=0;u0))return e.value;e=e.right}}return null},Cc.prototype.put=function(t,e){if(null===this.root_)return this.root_={key:t,value:e,left:null,right:null,parent:null,color:0,getValue:function(){return this.value},getKey:function(){return this.key}},this.size_=1,null;var n,r,i=this.root_;do{if(n=i,(r=t.compareTo(i.key))<0)i=i.left;else{if(!(r>0)){var o=i.value;return i.value=e,o}i=i.right}}while(null!==i);var s={key:t,left:null,right:null,value:e,parent:n,color:0,getValue:function(){return this.value},getKey:function(){return this.key}};return r<0?n.left=s:n.right=s,this.fixAfterInsertion(s),this.size_++,null},Cc.prototype.fixAfterInsertion=function(t){var e=this;for(t.color=1;null!=t&&t!==this.root_&&1===t.parent.color;)if(wc(t)===Nc(wc(wc(t)))){var n=Sc(wc(wc(t)));1===bc(n)?(Ic(wc(t),0),Ic(n,0),Ic(wc(wc(t)),1),t=wc(wc(t))):(t===Sc(wc(t))&&(t=wc(t),e.rotateLeft(t)),Ic(wc(t),0),Ic(wc(wc(t)),1),e.rotateRight(wc(wc(t))))}else{var r=Nc(wc(wc(t)));1===bc(r)?(Ic(wc(t),0),Ic(r,0),Ic(wc(wc(t)),1),t=wc(wc(t))):(t===Nc(wc(t))&&(t=wc(t),e.rotateRight(t)),Ic(wc(t),0),Ic(wc(wc(t)),1),e.rotateLeft(wc(wc(t))))}this.root_.color=0},Cc.prototype.values=function(){var t=new lc,e=this.getFirstEntry();if(null!==e)for(t.add(e.value);null!==(e=Cc.successor(e));)t.add(e.value);return t},Cc.prototype.entrySet=function(){var t=new xc,e=this.getFirstEntry();if(null!==e)for(t.add(e);null!==(e=Cc.successor(e));)t.add(e);return t},Cc.prototype.rotateLeft=function(t){if(null!=t){var e=t.right;t.right=e.left,null!=e.left&&(e.left.parent=t),e.parent=t.parent,null===t.parent?this.root_=e:t.parent.left===t?t.parent.left=e:t.parent.right=e,e.left=t,t.parent=e}},Cc.prototype.rotateRight=function(t){if(null!=t){var e=t.left;t.left=e.right,null!=e.right&&(e.right.parent=t),e.parent=t.parent,null===t.parent?this.root_=e:t.parent.right===t?t.parent.right=e:t.parent.left=e,e.right=t,t.parent=e}},Cc.prototype.getFirstEntry=function(){var t=this.root_;if(null!=t)for(;null!=t.left;)t=t.left;return t},Cc.successor=function(t){if(null===t)return null;if(null!==t.right){for(var e=t.right;null!==e.left;)e=e.left;return e}for(var n=t.parent,r=t;null!==n&&r===n.right;)r=n,n=n.parent;return n},Cc.prototype.size=function(){return this.size_};var Pc=function(){};function Mc(){}function Lc(){this.array_=[],arguments[0]instanceof ic&&this.addAll(arguments[0])}Pc.prototype.interfaces_=function(){return[]},Pc.prototype.getClass=function(){return Pc},Mc.prototype=new mc,Lc.prototype=new Mc,Lc.prototype.contains=function(t){for(var e=0,n=this.array_.length;e=0;){var s=i.substring(0,o);r.add(s),o=(i=i.substring(o+n)).indexOf(e)}i.length>0&&r.add(i);for(var a=new Array(r.size()).fill(null),u=0;u0)for(var o=i;o0&&r.append(" ");for(var o=0;o0&&r.append(","),r.append(Hc.toString(t.getOrdinate(i,o)))}return r.append(")"),r.toString()}},Jc.ensureValidRing=function(t,e){var n=e.size();return 0===n?e:n<=3?Jc.createClosedRing(t,e,4):e.getOrdinate(0,Il.X)===e.getOrdinate(n-1,Il.X)&&e.getOrdinate(0,Il.Y)===e.getOrdinate(n-1,Il.Y)?e:Jc.createClosedRing(t,e,n+1)},Jc.createClosedRing=function(t,e,n){var r=t.create(n,e.getDimension()),i=e.size();Jc.copy(e,0,r,0,i);for(var o=i;o0&&Jc.reverse(t._points),null}},e.prototype.getCoordinate=function(){return this.isEmpty()?null:this._points.getCoordinate(0)},e.prototype.getBoundaryDimension=function(){return this.isClosed()?Tc.FALSE:0},e.prototype.isClosed=function(){return!this.isEmpty()&&this.getCoordinateN(0).equals2D(this.getCoordinateN(this.getNumPoints()-1))},e.prototype.getEndPoint=function(){return this.isEmpty()?null:this.getPointN(this.getNumPoints()-1)},e.prototype.getDimension=function(){return 1},e.prototype.getLength=function(){return Xl.computeLength(this._points)},e.prototype.getNumPoints=function(){return this._points.size()},e.prototype.reverse=function(){var t=this._points.copy();return Jc.reverse(t),this.getFactory().createLineString(t)},e.prototype.compareToSameClass=function(){var t=this;if(1===arguments.length){for(var e=arguments[0],n=e,r=0,i=0;r= 2)");this._points=t},e.prototype.isCoordinate=function(t){for(var e=0;e=1&&this.getCoordinateSequence().size()= 4)")},e.prototype.getGeometryType=function(){return"LinearRing"},e.prototype.copy=function(){return new e(this._points.copy(),this._factory)},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},n.MINIMUM_VALID_SIZE.get=function(){return 4},n.serialVersionUID.get=function(){return-0x3b229e262367a600},Object.defineProperties(e,n),e}(Zc),rh=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var n={serialVersionUID:{configurable:!0}};return e.prototype.getSortIndex=function(){return Wl.SORTINDEX_MULTIPOLYGON},e.prototype.equalsExact=function(){if(2===arguments.length){var e=arguments[0],n=arguments[1];return!!this.isEquivalentClass(e)&&t.prototype.equalsExact.call(this,e,n)}return t.prototype.equalsExact.apply(this,arguments)},e.prototype.getBoundaryDimension=function(){return 1},e.prototype.getDimension=function(){return 2},e.prototype.reverse=function(){for(var t=this._geometries.length,e=new Array(t).fill(null),n=0;n0?e.createPoint(n[0]):e.createPoint():t},ah.prototype.interfaces_=function(){return[ih.GeometryEditorOperation]},ah.prototype.getClass=function(){return ah};var uh=function(){};uh.prototype.edit=function(t,e){return t instanceof nh?e.createLinearRing(this.edit(t.getCoordinateSequence(),t)):t instanceof Zc?e.createLineString(this.edit(t.getCoordinateSequence(),t)):t instanceof Qc?e.createPoint(this.edit(t.getCoordinateSequence(),t)):t},uh.prototype.interfaces_=function(){return[ih.GeometryEditorOperation]},uh.prototype.getClass=function(){return uh};var lh=function(){var t=this;if(this._dimension=3,this._coordinates=null,1===arguments.length){if(arguments[0]instanceof Array)this._coordinates=arguments[0],this._dimension=3;else if(Number.isInteger(arguments[0])){var e=arguments[0];this._coordinates=new Array(e).fill(null);for(var n=0;n0){var t=new vl(17*this._coordinates.length);t.append("("),t.append(this._coordinates[0]);for(var e=1;e3&&(r=3),r<2?new lh(n):new lh(n,r)}},hh.prototype.interfaces_=function(){return[hl,al]},hh.prototype.getClass=function(){return hh},hh.instance=function(){return hh.instanceObject},ph.serialVersionUID.get=function(){return-0x38e49fa6cf6f2e00},ph.instanceObject.get=function(){return new hh},Object.defineProperties(hh,ph);var fh=function(t){function e(){t.call(this),this.map_=new Map}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.get=function(t){return this.map_.get(t)||null},e.prototype.put=function(t,e){return this.map_.set(t,e),e},e.prototype.values=function(){for(var t=new lc,e=this.map_.values(),n=e.next();!n.done;)t.add(n.value),n=e.next();return t},e.prototype.entrySet=function(){var t=new xc;return this.map_.entries().forEach((function(e){return t.add(e)})),t},e.prototype.size=function(){return this.map_.size()},e}(yc),gh=function t(){if(this._modelType=null,this._scale=null,0===arguments.length)this._modelType=t.FLOATING;else if(1===arguments.length)if(arguments[0]instanceof yh){var e=arguments[0];this._modelType=e,e===t.FIXED&&this.setScale(1)}else if("number"==typeof arguments[0]){var n=arguments[0];this._modelType=t.FIXED,this.setScale(n)}else if(arguments[0]instanceof t){var r=arguments[0];this._modelType=r._modelType,this._scale=r._scale}},dh={serialVersionUID:{configurable:!0},maximumPreciseValue:{configurable:!0}};gh.prototype.equals=function(t){if(!(t instanceof gh))return!1;var e=t;return this._modelType===e._modelType&&this._scale===e._scale},gh.prototype.compareTo=function(t){var e=t,n=this.getMaximumSignificantDigits(),r=e.getMaximumSignificantDigits();return new _l(n).compareTo(new _l(r))},gh.prototype.getScale=function(){return this._scale},gh.prototype.isFloating=function(){return this._modelType===gh.FLOATING||this._modelType===gh.FLOATING_SINGLE},gh.prototype.getType=function(){return this._modelType},gh.prototype.toString=function(){var t="UNKNOWN";return this._modelType===gh.FLOATING?t="Floating":this._modelType===gh.FLOATING_SINGLE?t="Floating-Single":this._modelType===gh.FIXED&&(t="Fixed (Scale="+this.getScale()+")"),t},gh.prototype.makePrecise=function(){if("number"==typeof arguments[0]){var t=arguments[0];if(nl.isNaN(t))return t;if(this._modelType===gh.FLOATING_SINGLE){return t}return this._modelType===gh.FIXED?Math.round(t*this._scale)/this._scale:t}if(arguments[0]instanceof ul){var e=arguments[0];if(this._modelType===gh.FLOATING)return null;e.x=this.makePrecise(e.x),e.y=this.makePrecise(e.y)}},gh.prototype.getMaximumSignificantDigits=function(){var t=16;return this._modelType===gh.FLOATING?t=16:this._modelType===gh.FLOATING_SINGLE?t=6:this._modelType===gh.FIXED&&(t=1+Math.trunc(Math.ceil(Math.log(this.getScale())/Math.log(10)))),t},gh.prototype.setScale=function(t){this._scale=Math.abs(t)},gh.prototype.interfaces_=function(){return[al,il]},gh.prototype.getClass=function(){return gh},gh.mostPrecise=function(t,e){return t.compareTo(e)>=0?t:e},dh.serialVersionUID.get=function(){return 0x6bee6404e9a25c00},dh.maximumPreciseValue.get=function(){return 9007199254740992},Object.defineProperties(gh,dh);var yh=function t(e){this._name=e||null,t.nameToTypeMap.put(e,this)},vh={serialVersionUID:{configurable:!0},nameToTypeMap:{configurable:!0}};yh.prototype.readResolve=function(){return yh.nameToTypeMap.get(this._name)},yh.prototype.toString=function(){return this._name},yh.prototype.interfaces_=function(){return[al]},yh.prototype.getClass=function(){return yh},vh.serialVersionUID.get=function(){return-552860263173159e4},vh.nameToTypeMap.get=function(){return new fh},Object.defineProperties(yh,vh),gh.Type=yh,gh.FIXED=new yh("FIXED"),gh.FLOATING=new yh("FLOATING"),gh.FLOATING_SINGLE=new yh("FLOATING SINGLE");var _h=function t(){this._precisionModel=new gh,this._SRID=0,this._coordinateSequenceFactory=t.getDefaultCoordinateSequenceFactory(),0===arguments.length||(1===arguments.length?gl(arguments[0],hl)?this._coordinateSequenceFactory=arguments[0]:arguments[0]instanceof gh&&(this._precisionModel=arguments[0]):2===arguments.length?(this._precisionModel=arguments[0],this._SRID=arguments[1]):3===arguments.length&&(this._precisionModel=arguments[0],this._SRID=arguments[1],this._coordinateSequenceFactory=arguments[2]))},mh={serialVersionUID:{configurable:!0}};_h.prototype.toGeometry=function(t){return t.isNull()?this.createPoint(null):t.getMinX()===t.getMaxX()&&t.getMinY()===t.getMaxY()?this.createPoint(new ul(t.getMinX(),t.getMinY())):t.getMinX()===t.getMaxX()||t.getMinY()===t.getMaxY()?this.createLineString([new ul(t.getMinX(),t.getMinY()),new ul(t.getMaxX(),t.getMaxY())]):this.createPolygon(this.createLinearRing([new ul(t.getMinX(),t.getMinY()),new ul(t.getMinX(),t.getMaxY()),new ul(t.getMaxX(),t.getMaxY()),new ul(t.getMaxX(),t.getMinY()),new ul(t.getMinX(),t.getMinY())]),null)},_h.prototype.createLineString=function(t){return t?t instanceof Array?new Zc(this.getCoordinateSequenceFactory().create(t),this):gl(t,Il)?new Zc(t,this):void 0:new Zc(this.getCoordinateSequenceFactory().create([]),this)},_h.prototype.createMultiLineString=function(){if(0===arguments.length)return new Gc(null,this);if(1===arguments.length){var t=arguments[0];return new Gc(t,this)}},_h.prototype.buildGeometry=function(t){for(var e=null,n=!1,r=!1,i=t.iterator();i.hasNext();){var o=i.next(),s=o.getClass();null===e&&(e=s),s!==e&&(n=!0),o.isGeometryCollectionOrDerived()&&(r=!0)}if(null===e)return this.createGeometryCollection();if(n||r)return this.createGeometryCollection(_h.toGeometryArray(t));var a=t.iterator().next();if(t.size()>1){if(a instanceof th)return this.createMultiPolygon(_h.toPolygonArray(t));if(a instanceof Zc)return this.createMultiLineString(_h.toLineStringArray(t));if(a instanceof Qc)return this.createMultiPoint(_h.toPointArray(t));ql.shouldNeverReachHere("Unhandled class: "+a.getClass().getName())}return a},_h.prototype.createMultiPointFromCoords=function(t){return this.createMultiPoint(null!==t?this.getCoordinateSequenceFactory().create(t):null)},_h.prototype.createPoint=function(){if(0===arguments.length)return this.createPoint(this.getCoordinateSequenceFactory().create([]));if(1===arguments.length){if(arguments[0]instanceof ul){var t=arguments[0];return this.createPoint(null!==t?this.getCoordinateSequenceFactory().create([t]):null)}if(gl(arguments[0],Il)){var e=arguments[0];return new Qc(e,this)}}},_h.prototype.getCoordinateSequenceFactory=function(){return this._coordinateSequenceFactory},_h.prototype.createPolygon=function(){if(0===arguments.length)return new th(null,null,this);if(1===arguments.length){if(gl(arguments[0],Il)){var t=arguments[0];return this.createPolygon(this.createLinearRing(t))}if(arguments[0]instanceof Array){var e=arguments[0];return this.createPolygon(this.createLinearRing(e))}if(arguments[0]instanceof nh){var n=arguments[0];return this.createPolygon(n,null)}}else if(2===arguments.length){var r=arguments[0],i=arguments[1];return new th(r,i,this)}},_h.prototype.getSRID=function(){return this._SRID},_h.prototype.createGeometryCollection=function(){if(0===arguments.length)return new kc(null,this);if(1===arguments.length){var t=arguments[0];return new kc(t,this)}},_h.prototype.createGeometry=function(t){return new ih(this).edit(t,{edit:function(){if(2===arguments.length){var t=arguments[0];return this._coordinateSequenceFactory.create(t)}}})},_h.prototype.getPrecisionModel=function(){return this._precisionModel},_h.prototype.createLinearRing=function(){if(0===arguments.length)return this.createLinearRing(this.getCoordinateSequenceFactory().create([]));if(1===arguments.length){if(arguments[0]instanceof Array){var t=arguments[0];return this.createLinearRing(null!==t?this.getCoordinateSequenceFactory().create(t):null)}if(gl(arguments[0],Il)){var e=arguments[0];return new nh(e,this)}}},_h.prototype.createMultiPolygon=function(){if(0===arguments.length)return new rh(null,this);if(1===arguments.length){var t=arguments[0];return new rh(t,this)}},_h.prototype.createMultiPoint=function(){var t=this;if(0===arguments.length)return new eh(null,this);if(1===arguments.length){if(arguments[0]instanceof Array){var e=arguments[0];return new eh(e,this)}if(arguments[0]instanceof Array){var n=arguments[0];return this.createMultiPoint(null!==n?this.getCoordinateSequenceFactory().create(n):null)}if(gl(arguments[0],Il)){var r=arguments[0];if(null===r)return this.createMultiPoint(new Array(0).fill(null));for(var i=new Array(r.size()).fill(null),o=0;o=this.size())throw new Error;return this.array_[t]},Mh.prototype.push=function(t){return this.array_.push(t),t},Mh.prototype.pop=function(t){if(0===this.array_.length)throw new Ph;return this.array_.pop()},Mh.prototype.peek=function(){if(0===this.array_.length)throw new Ph;return this.array_[this.array_.length-1]},Mh.prototype.empty=function(){return 0===this.array_.length},Mh.prototype.isEmpty=function(){return this.empty()},Mh.prototype.search=function(t){return this.array_.indexOf(t)},Mh.prototype.size=function(){return this.array_.length},Mh.prototype.toArray=function(){for(var t=[],e=0,n=this.array_.length;e0&&this._minIndexthis._minCoord.y&&n.y>this._minCoord.y&&r===Xl.CLOCKWISE)&&(i=!0),i&&(this._minIndex=this._minIndex-1)},Lh.prototype.getRightmostSideOfSegment=function(t,e){var n=t.getEdge().getCoordinates();if(e<0||e+1>=n.length)return-1;if(n[e].y===n[e+1].y)return-1;var r=Sh.LEFT;return n[e].ye._minCoord.x)&&(e._minDe=t,e._minIndex=r,e._minCoord=n[r])},Lh.prototype.findRightmostEdgeAtNode=function(){var t=this._minDe.getNode().getEdges();this._minDe=t.getRightmostEdge(),this._minDe.isForward()||(this._minDe=this._minDe.getSym(),this._minIndex=this._minDe.getEdge().getCoordinates().length-1)},Lh.prototype.findEdge=function(t){for(var e=t.iterator();e.hasNext();){var n=e.next();n.isForward()&&this.checkForRightmostCoordinate(n)}ql.isTrue(0!==this._minIndex||this._minCoord.equals(this._minDe.getCoordinate()),"inconsistency in rightmost processing"),0===this._minIndex?this.findRightmostEdgeAtNode():this.findRightmostEdgeAtVertex(),this._orientedDe=this._minDe,this.getRightmostSide(this._minDe,this._minIndex)===Sh.LEFT&&(this._orientedDe=this._minDe.getSym())},Lh.prototype.interfaces_=function(){return[]},Lh.prototype.getClass=function(){return Lh};var Oh=function(t){function e(n,r){t.call(this,e.msgWithCoord(n,r)),this.pt=r?new ul(r):null,this.name="TopologyException"}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getCoordinate=function(){return this.pt},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e.msgWithCoord=function(t,e){return e?t:t+" [ "+e+" ]"},e}(kl),Rh=function(){this.array_=[]};Rh.prototype.addLast=function(t){this.array_.push(t)},Rh.prototype.removeFirst=function(){return this.array_.shift()},Rh.prototype.isEmpty=function(){return 0===this.array_.length};var Th=function(){this._finder=null,this._dirEdgeList=new lc,this._nodes=new lc,this._rightMostCoord=null,this._env=null,this._finder=new Lh};Th.prototype.clearVisitedEdges=function(){for(var t=this._dirEdgeList.iterator();t.hasNext();){t.next().setVisited(!1)}},Th.prototype.getRightmostCoordinate=function(){return this._rightMostCoord},Th.prototype.computeNodeDepth=function(t){for(var e=null,n=t.getEdges().iterator();n.hasNext();){var r=n.next();if(r.isVisited()||r.getSym().isVisited()){e=r;break}}if(null===e)throw new Oh("unable to find edge to compute depths at "+t.getCoordinate());t.getEdges().computeDepths(e);for(var i=t.getEdges().iterator();i.hasNext();){var o=i.next();o.setVisited(!0),this.copySymDepths(o)}},Th.prototype.computeDepth=function(t){this.clearVisitedEdges();var e=this._finder.getEdge();e.setEdgeDepths(Sh.RIGHT,t),this.copySymDepths(e),this.computeDepths(e)},Th.prototype.create=function(t){this.addReachable(t),this._finder.findEdge(this._dirEdgeList),this._rightMostCoord=this._finder.getCoordinate()},Th.prototype.findResultEdges=function(){for(var t=this._dirEdgeList.iterator();t.hasNext();){var e=t.next();e.getDepth(Sh.RIGHT)>=1&&e.getDepth(Sh.LEFT)<=0&&!e.isInteriorAreaEdge()&&e.setInResult(!0)}},Th.prototype.computeDepths=function(t){var e=new xc,n=new Rh,r=t.getNode();for(n.addLast(r),e.add(r),t.setVisited(!0);!n.isEmpty();){var i=n.removeFirst();e.add(i),this.computeNodeDepth(i);for(var o=i.getEdges().iterator();o.hasNext();){var s=o.next().getSym();if(!s.isVisited()){var a=s.getNode();e.contains(a)||(n.addLast(a),e.add(a))}}}},Th.prototype.compareTo=function(t){var e=t;return this._rightMostCoord.xe._rightMostCoord.x?1:0},Th.prototype.getEnvelope=function(){if(null===this._env){for(var t=new Ll,e=this._dirEdgeList.iterator();e.hasNext();)for(var n=e.next().getEdge().getCoordinates(),r=0;rthis.location.length){var e=new Array(3).fill(null);e[Sh.ON]=this.location[Sh.ON],e[Sh.LEFT]=pl.NONE,e[Sh.RIGHT]=pl.NONE,this.location=e}for(var n=0;n1&&t.append(pl.toLocationSymbol(this.location[Sh.LEFT])),t.append(pl.toLocationSymbol(this.location[Sh.ON])),this.location.length>1&&t.append(pl.toLocationSymbol(this.location[Sh.RIGHT])),t.toString()},Ah.prototype.setLocations=function(t,e,n){this.location[Sh.ON]=t,this.location[Sh.LEFT]=e,this.location[Sh.RIGHT]=n},Ah.prototype.get=function(t){return t1},Ah.prototype.isAnyNull=function(){for(var t=0;tt._maxNodeDegree&&(t._maxNodeDegree=n),e=t.getNext(e)}while(e!==this._startDe);this._maxNodeDegree*=2},Fh.prototype.addPoints=function(t,e,n){var r=t.getCoordinates();if(e){var i=1;n&&(i=0);for(var o=i;o=0;a--)this._pts.add(r[a])}},Fh.prototype.isHole=function(){return this._isHole},Fh.prototype.setInResult=function(){var t=this._startDe;do{t.getEdge().setInResult(!0),t=t.getNext()}while(t!==this._startDe)},Fh.prototype.containsPoint=function(t){var e=this.getLinearRing();if(!e.getEnvelopeInternal().contains(t))return!1;if(!Xl.isPointInRing(t,e.getCoordinates()))return!1;for(var n=this._holes.iterator();n.hasNext();){if(n.next().containsPoint(t))return!1}return!0},Fh.prototype.addHole=function(t){this._holes.add(t)},Fh.prototype.isShell=function(){return null===this._shell},Fh.prototype.getLabel=function(){return this._label},Fh.prototype.getEdges=function(){return this._edges},Fh.prototype.getMaxNodeDegree=function(){return this._maxNodeDegree<0&&this.computeMaxNodeDegree(),this._maxNodeDegree},Fh.prototype.getShell=function(){return this._shell},Fh.prototype.mergeLabel=function(){if(1===arguments.length){var t=arguments[0];this.mergeLabel(t,0),this.mergeLabel(t,1)}else if(2===arguments.length){var e=arguments[0],n=arguments[1],r=e.getLocation(n,Sh.RIGHT);if(r===pl.NONE)return null;if(this._label.getLocation(n)===pl.NONE)return this._label.setLocation(n,r),null}},Fh.prototype.setShell=function(t){this._shell=t,null!==t&&t.addHole(this)},Fh.prototype.toPolygon=function(t){for(var e=new Array(this._holes.size()).fill(null),n=0;n=2,"found partial label"),this.computeIM(t)},qh.prototype.isInResult=function(){return this._isInResult},qh.prototype.isVisited=function(){return this._isVisited},qh.prototype.interfaces_=function(){return[]},qh.prototype.getClass=function(){return qh};var Bh=function(t){function e(){t.call(this),this._coord=null,this._edges=null;var e=arguments[0],n=arguments[1];this._coord=e,this._edges=n,this._label=new Dh(0,pl.NONE)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.isIncidentEdgeInResult=function(){for(var t=this.getEdges().getEdges().iterator();t.hasNext();){if(t.next().getEdge().isInResult())return!0}return!1},e.prototype.isIsolated=function(){return 1===this._label.getGeometryCount()},e.prototype.getCoordinate=function(){return this._coord},e.prototype.print=function(t){t.println("node "+this._coord+" lbl: "+this._label)},e.prototype.computeIM=function(t){},e.prototype.computeMergedLocation=function(t,e){var n=pl.NONE;if(n=this._label.getLocation(e),!t.isNull(e)){var r=t.getLocation(e);n!==pl.BOUNDARY&&(n=r)}return n},e.prototype.setLabel=function(){if(2!==arguments.length)return t.prototype.setLabel.apply(this,arguments);var e=arguments[0],n=arguments[1];null===this._label?this._label=new Dh(e,n):this._label.setLocation(e,n)},e.prototype.getEdges=function(){return this._edges},e.prototype.mergeLabel=function(){var t=this;if(arguments[0]instanceof e){var n=arguments[0];this.mergeLabel(n._label)}else if(arguments[0]instanceof Dh)for(var r=arguments[0],i=0;i<2;i++){var o=t.computeMergedLocation(r,i),s=t._label.getLocation(i);s===pl.NONE&&t._label.setLocation(i,o)}},e.prototype.add=function(t){this._edges.insert(t),t.setNode(this)},e.prototype.setLabelBoundary=function(t){if(null===this._label)return null;var e=pl.NONE;null!==this._label&&(e=this._label.getLocation(t));var n=null;switch(e){case pl.BOUNDARY:n=pl.INTERIOR;break;case pl.INTERIOR:default:n=pl.BOUNDARY}this._label.setLocation(t,n)},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(qh),zh=function(){this.nodeMap=new Cc,this.nodeFact=null;var t=arguments[0];this.nodeFact=t};zh.prototype.find=function(t){return this.nodeMap.get(t)},zh.prototype.addNode=function(){if(arguments[0]instanceof ul){var t=arguments[0],e=this.nodeMap.get(t);return null===e&&(e=this.nodeFact.createNode(t),this.nodeMap.put(t,e)),e}if(arguments[0]instanceof Bh){var n=arguments[0],r=this.nodeMap.get(n.getCoordinate());return null===r?(this.nodeMap.put(n.getCoordinate(),n),n):(r.mergeLabel(n),r)}},zh.prototype.print=function(t){for(var e=this.iterator();e.hasNext();){e.next().print(t)}},zh.prototype.iterator=function(){return this.nodeMap.values().iterator()},zh.prototype.values=function(){return this.nodeMap.values()},zh.prototype.getBoundaryNodes=function(t){for(var e=new lc,n=this.iterator();n.hasNext();){var r=n.next();r.getLabel().getLocation(t)===pl.BOUNDARY&&e.add(r)}return e},zh.prototype.add=function(t){var e=t.getCoordinate();this.addNode(e).add(t)},zh.prototype.interfaces_=function(){return[]},zh.prototype.getClass=function(){return zh};var jh=function(){},Uh={NE:{configurable:!0},NW:{configurable:!0},SW:{configurable:!0},SE:{configurable:!0}};jh.prototype.interfaces_=function(){return[]},jh.prototype.getClass=function(){return jh},jh.isNorthern=function(t){return t===jh.NE||t===jh.NW},jh.isOpposite=function(t,e){return t!==e&&2===(t-e+4)%4},jh.commonHalfPlane=function(t,e){if(t===e)return t;if(2===(t-e+4)%4)return-1;var n=te?t:e)?3:n},jh.isInHalfPlane=function(t,e){return e===jh.SE?t===jh.SE||t===jh.SW:t===e||t===e+1},jh.quadrant=function(){if("number"==typeof arguments[0]&&"number"==typeof arguments[1]){var t=arguments[0],e=arguments[1];if(0===t&&0===e)throw new el("Cannot compute the quadrant for point ( "+t+", "+e+" )");return t>=0?e>=0?jh.NE:jh.SE:e>=0?jh.NW:jh.SW}if(arguments[0]instanceof ul&&arguments[1]instanceof ul){var n=arguments[0],r=arguments[1];if(r.x===n.x&&r.y===n.y)throw new el("Cannot compute the quadrant for two identical points "+n);return r.x>=n.x?r.y>=n.y?jh.NE:jh.SE:r.y>=n.y?jh.NW:jh.SW}},Uh.NE.get=function(){return 0},Uh.NW.get=function(){return 1},Uh.SW.get=function(){return 2},Uh.SE.get=function(){return 3},Object.defineProperties(jh,Uh);var Vh=function(){if(this._edge=null,this._label=null,this._node=null,this._p0=null,this._p1=null,this._dx=null,this._dy=null,this._quadrant=null,1===arguments.length){var t=arguments[0];this._edge=t}else if(3===arguments.length){var e=arguments[0],n=arguments[1],r=arguments[2],i=null;this._edge=e,this.init(n,r),this._label=i}else if(4===arguments.length){var o=arguments[0],s=arguments[1],a=arguments[2],u=arguments[3];this._edge=o,this.init(s,a),this._label=u}};Vh.prototype.compareDirection=function(t){return this._dx===t._dx&&this._dy===t._dy?0:this._quadrant>t._quadrant?1:this._quadrant2){o.linkDirectedEdgesForMinimalEdgeRings();var s=o.buildMinimalRings(),a=this.findShell(s);null!==a?(this.placePolygonHoles(a,s),e.add(a)):n.addAll(s)}else r.add(o)}return r},Wh.prototype.containsPoint=function(t){for(var e=this._shellList.iterator();e.hasNext();){if(e.next().containsPoint(t))return!0}return!1},Wh.prototype.buildMaximalEdgeRings=function(t){for(var e=new lc,n=t.iterator();n.hasNext();){var r=n.next();if(r.isInResult()&&r.getLabel().isArea()&&null===r.getEdgeRing()){var i=new Gh(r,this._geometryFactory);e.add(i),i.setInResult()}}return e},Wh.prototype.placePolygonHoles=function(t,e){for(var n=e.iterator();n.hasNext();){var r=n.next();r.isHole()&&r.setShell(t)}},Wh.prototype.getPolygons=function(){return this.computePolygons(this._shellList)},Wh.prototype.findEdgeRingContaining=function(t,e){for(var n=t.getLinearRing(),r=n.getEnvelopeInternal(),i=n.getCoordinateN(0),o=null,s=null,a=e.iterator();a.hasNext();){var u=a.next(),l=u.getLinearRing(),c=l.getEnvelopeInternal();null!==o&&(s=o.getLinearRing().getEnvelopeInternal());var h=!1;c.contains(r)&&Xl.isPointInRing(i,l.getCoordinates())&&(h=!0),h&&(null===o||s.contains(c))&&(o=u)}return o},Wh.prototype.findShell=function(t){for(var e=0,n=null,r=t.iterator();r.hasNext();){var i=r.next();i.isHole()||(n=i,e++)}return ql.isTrue(e<=1,"found two shells in MinimalEdgeRing list"),n},Wh.prototype.add=function(){if(1===arguments.length){var t=arguments[0];this.add(t.getEdgeEnds(),t.getNodes())}else if(2===arguments.length){var e=arguments[0],n=arguments[1];Hh.linkResultDirectedEdges(n);var r=this.buildMaximalEdgeRings(e),i=new lc,o=this.buildMinimalEdgeRings(r,this._shellList,i);this.sortShellsAndHoles(o,this._shellList,i),this.placeFreeHoles(this._shellList,i)}},Wh.prototype.interfaces_=function(){return[]},Wh.prototype.getClass=function(){return Wh};var Jh=function(){};Jh.prototype.getBounds=function(){},Jh.prototype.interfaces_=function(){return[]},Jh.prototype.getClass=function(){return Jh};var Zh=function(){this._bounds=null,this._item=null;var t=arguments[0],e=arguments[1];this._bounds=t,this._item=e};Zh.prototype.getItem=function(){return this._item},Zh.prototype.getBounds=function(){return this._bounds},Zh.prototype.interfaces_=function(){return[Jh,al]},Zh.prototype.getClass=function(){return Zh};var Kh=function(){this._size=null,this._items=null,this._size=0,this._items=new lc,this._items.add(null)};Kh.prototype.poll=function(){if(this.isEmpty())return null;var t=this._items.get(1);return this._items.set(1,this._items.get(this._size)),this._size-=1,this.reorder(1),t},Kh.prototype.size=function(){return this._size},Kh.prototype.reorder=function(t){for(var e=this,n=null,r=this._items.get(t);2*t<=this._size&&((n=2*t)!==e._size&&e._items.get(n+1).compareTo(e._items.get(n))<0&&n++,e._items.get(n).compareTo(r)<0);t=n)e._items.set(t,e._items.get(n));this._items.set(t,r)},Kh.prototype.clear=function(){this._size=0,this._items.clear()},Kh.prototype.isEmpty=function(){return 0===this._size},Kh.prototype.add=function(t){this._items.add(null),this._size+=1;var e=this._size;for(this._items.set(0,t);t.compareTo(this._items.get(Math.trunc(e/2)))<0;e/=2)this._items.set(e,this._items.get(Math.trunc(e/2)));this._items.set(e,t)},Kh.prototype.interfaces_=function(){return[]},Kh.prototype.getClass=function(){return Kh};var Qh=function(){};Qh.prototype.visitItem=function(t){},Qh.prototype.interfaces_=function(){return[]},Qh.prototype.getClass=function(){return Qh};var $h=function(){};$h.prototype.insert=function(t,e){},$h.prototype.remove=function(t,e){},$h.prototype.query=function(){},$h.prototype.interfaces_=function(){return[]},$h.prototype.getClass=function(){return $h};var tp=function(){if(this._childBoundables=new lc,this._bounds=null,this._level=null,0===arguments.length);else if(1===arguments.length){var t=arguments[0];this._level=t}},ep={serialVersionUID:{configurable:!0}};tp.prototype.getLevel=function(){return this._level},tp.prototype.size=function(){return this._childBoundables.size()},tp.prototype.getChildBoundables=function(){return this._childBoundables},tp.prototype.addChildBoundable=function(t){ql.isTrue(null===this._bounds),this._childBoundables.add(t)},tp.prototype.isEmpty=function(){return this._childBoundables.isEmpty()},tp.prototype.getBounds=function(){return null===this._bounds&&(this._bounds=this.computeBounds()),this._bounds},tp.prototype.interfaces_=function(){return[Jh,al]},tp.prototype.getClass=function(){return tp},ep.serialVersionUID.get=function(){return 0x5a1e55ec41369800},Object.defineProperties(tp,ep);var np=function(){};np.reverseOrder=function(){return{compare:function(t,e){return e.compareTo(t)}}},np.min=function(t){return np.sort(t),t.get(0)},np.sort=function(t,e){var n=t.toArray();e?Rc.sort(n,e):Rc.sort(n);for(var r=t.iterator(),i=0,o=n.length;irp.area(this._boundable2)?(this.expand(this._boundable1,this._boundable2,t,e),null):(this.expand(this._boundable2,this._boundable1,t,e),null);if(n)return this.expand(this._boundable1,this._boundable2,t,e),null;if(r)return this.expand(this._boundable2,this._boundable1,t,e),null;throw new el("neither boundable is composite")},rp.prototype.isLeaves=function(){return!(rp.isComposite(this._boundable1)||rp.isComposite(this._boundable2))},rp.prototype.compareTo=function(t){var e=t;return this._distancee._distance?1:0},rp.prototype.expand=function(t,e,n,r){for(var i=t.getChildBoundables().iterator();i.hasNext();){var o=i.next(),s=new rp(o,e,this._itemDistance);s.getDistance()1,"Node capacity must be greater than 1"),this._nodeCapacity=n}},op={IntersectsOp:{configurable:!0},serialVersionUID:{configurable:!0},DEFAULT_NODE_CAPACITY:{configurable:!0}};ip.prototype.getNodeCapacity=function(){return this._nodeCapacity},ip.prototype.lastNode=function(t){return t.get(t.size()-1)},ip.prototype.size=function(){var t=this;if(0===arguments.length)return this.isEmpty()?0:(this.build(),this.size(this._root));if(1===arguments.length){for(var e=arguments[0],n=0,r=e.getChildBoundables().iterator();r.hasNext();){var i=r.next();i instanceof tp?n+=t.size(i):i instanceof Zh&&(n+=1)}return n}},ip.prototype.removeItem=function(t,e){for(var n=null,r=t.getChildBoundables().iterator();r.hasNext();){var i=r.next();i instanceof Zh&&i.getItem()===e&&(n=i)}return null!==n&&(t.getChildBoundables().remove(n),!0)},ip.prototype.itemsTree=function(){var t=this;if(0===arguments.length){this.build();var e=this.itemsTree(this._root);return null===e?new lc:e}if(1===arguments.length){for(var n=arguments[0],r=new lc,i=n.getChildBoundables().iterator();i.hasNext();){var o=i.next();if(o instanceof tp){var s=t.itemsTree(o);null!==s&&r.add(s)}else o instanceof Zh?r.add(o.getItem()):ql.shouldNeverReachHere()}return r.size()<=0?null:r}},ip.prototype.insert=function(t,e){ql.isTrue(!this._built,"Cannot insert items into an STR packed R-tree after it has been built."),this._itemBoundables.add(new Zh(t,e))},ip.prototype.boundablesAtLevel=function(){var t=this;if(1===arguments.length){var e=arguments[0],n=new lc;return this.boundablesAtLevel(e,this._root,n),n}if(3===arguments.length){var r=arguments[0],i=arguments[1],o=arguments[2];if(ql.isTrue(r>-2),i.getLevel()===r)return o.add(i),null;for(var s=i.getChildBoundables().iterator();s.hasNext();){var a=s.next();a instanceof tp?t.boundablesAtLevel(r,a,o):(ql.isTrue(a instanceof Zh),-1===r&&o.add(a))}return null}},ip.prototype.query=function(){var t=this;if(1===arguments.length){var e=arguments[0];this.build();var n=new lc;return this.isEmpty()||this.getIntersectsOp().intersects(this._root.getBounds(),e)&&this.query(e,this._root,n),n}if(2===arguments.length){var r=arguments[0],i=arguments[1];if(this.build(),this.isEmpty())return null;this.getIntersectsOp().intersects(this._root.getBounds(),r)&&this.query(r,this._root,i)}else if(3===arguments.length)if(gl(arguments[2],Qh)&&arguments[0]instanceof Object&&arguments[1]instanceof tp)for(var o=arguments[0],s=arguments[1],a=arguments[2],u=s.getChildBoundables(),l=0;ln&&(n=o)}}return n+1}},ip.prototype.createParentBoundables=function(t,e){var n=this;ql.isTrue(!t.isEmpty());var r=new lc;r.add(this.createNode(e));var i=new lc(t);np.sort(i,this.getComparator());for(var o=i.iterator();o.hasNext();){var s=o.next();n.lastNode(r).getChildBoundables().size()===n.getNodeCapacity()&&r.add(n.createNode(e)),n.lastNode(r).addChildBoundable(s)}return r},ip.prototype.isEmpty=function(){return this._built?this._root.isEmpty():this._itemBoundables.isEmpty()},ip.prototype.interfaces_=function(){return[al]},ip.prototype.getClass=function(){return ip},ip.compareDoubles=function(t,e){return t>e?1:t0);for(var n=new lc,r=0;r0;){var p=h.poll(),f=p.getDistance();if(f>=l)break;p.isLeaves()?(l=f,c=p):p.expandToQueue(h,l)}return[c.getBoundable(0).getItem(),c.getBoundable(1).getItem()]}}else if(3===arguments.length){var g=arguments[0],d=arguments[1],y=arguments[2],v=new Zh(g,d),_=new rp(this.getRoot(),v,y);return this.nearestNeighbour(_)[0]}},e.prototype.interfaces_=function(){return[$h,al]},e.prototype.getClass=function(){return e},e.centreX=function(t){return e.avg(t.getMinX(),t.getMaxX())},e.avg=function(t,e){return(t+e)/2},e.centreY=function(t){return e.avg(t.getMinY(),t.getMaxY())},n.STRtreeNode.get=function(){return lp},n.serialVersionUID.get=function(){return 0x39920f7d5f261e0},n.xComparator.get=function(){return{interfaces_:function(){return[sl]},compare:function(n,r){return t.compareDoubles(e.centreX(n.getBounds()),e.centreX(r.getBounds()))}}},n.yComparator.get=function(){return{interfaces_:function(){return[sl]},compare:function(n,r){return t.compareDoubles(e.centreY(n.getBounds()),e.centreY(r.getBounds()))}}},n.intersectsOp.get=function(){return{interfaces_:function(){return[t.IntersectsOp]},intersects:function(t,e){return t.intersects(e)}}},n.DEFAULT_NODE_CAPACITY.get=function(){return 10},Object.defineProperties(e,n),e}(ip),lp=function(t){function e(){var e=arguments[0];t.call(this,e)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.computeBounds=function(){for(var t=null,e=this.getChildBoundables().iterator();e.hasNext();){var n=e.next();null===t?t=new Ll(n.getBounds()):t.expandToInclude(n.getBounds())}return t},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(tp),cp=function(){};cp.prototype.interfaces_=function(){return[]},cp.prototype.getClass=function(){return cp},cp.relativeSign=function(t,e){return te?1:0},cp.compare=function(t,e,n){if(e.equals2D(n))return 0;var r=cp.relativeSign(e.x,n.x),i=cp.relativeSign(e.y,n.y);switch(t){case 0:return cp.compareValue(r,i);case 1:return cp.compareValue(i,r);case 2:return cp.compareValue(i,-r);case 3:return cp.compareValue(-r,i);case 4:return cp.compareValue(-r,-i);case 5:return cp.compareValue(-i,-r);case 6:return cp.compareValue(-i,r);case 7:return cp.compareValue(r,-i)}return ql.shouldNeverReachHere("invalid octant value"),0},cp.compareValue=function(t,e){return t<0?-1:t>0?1:e<0?-1:e>0?1:0};var hp=function(){this._segString=null,this.coord=null,this.segmentIndex=null,this._segmentOctant=null,this._isInterior=null;var t=arguments[0],e=arguments[1],n=arguments[2],r=arguments[3];this._segString=t,this.coord=new ul(e),this.segmentIndex=n,this._segmentOctant=r,this._isInterior=!e.equals2D(t.getCoordinate(n))};hp.prototype.getCoordinate=function(){return this.coord},hp.prototype.print=function(t){t.print(this.coord),t.print(" seg # = "+this.segmentIndex)},hp.prototype.compareTo=function(t){var e=t;return this.segmentIndexe.segmentIndex?1:this.coord.equals2D(e.coord)?0:cp.compare(this._segmentOctant,this.coord,e.coord)},hp.prototype.isEndPoint=function(t){return 0===this.segmentIndex&&!this._isInterior||this.segmentIndex===t},hp.prototype.isInterior=function(){return this._isInterior},hp.prototype.interfaces_=function(){return[il]},hp.prototype.getClass=function(){return hp};var pp=function(){this._nodeMap=new Cc,this._edge=null;var t=arguments[0];this._edge=t};pp.prototype.getSplitCoordinates=function(){var t=new hc;this.addEndpoints();for(var e=this.iterator(),n=e.next();e.hasNext();){var r=e.next();this.addEdgeCoordinates(n,r,t),n=r}return t.toCoordinateArray()},pp.prototype.addCollapsedNodes=function(){var t=new lc;this.findCollapsesFromInsertedNodes(t),this.findCollapsesFromExistingVertices(t);for(var e=t.iterator();e.hasNext();){var n=e.next().intValue();this.add(this._edge.getCoordinate(n),n)}},pp.prototype.print=function(t){t.println("Intersections:");for(var e=this.iterator();e.hasNext();){e.next().print(t)}},pp.prototype.findCollapsesFromExistingVertices=function(t){for(var e=0;e=0?e>=0?n>=r?0:1:n>=r?7:6:e>=0?n>=r?3:2:n>=r?4:5}if(arguments[0]instanceof ul&&arguments[1]instanceof ul){var i=arguments[0],o=arguments[1],s=o.x-i.x,a=o.y-i.y;if(0===s&&0===a)throw new el("Cannot compute the octant for two identical points "+i);return fp.octant(s,a)}};var gp=function(){};gp.prototype.getCoordinates=function(){},gp.prototype.size=function(){},gp.prototype.getCoordinate=function(t){},gp.prototype.isClosed=function(){},gp.prototype.setData=function(t){},gp.prototype.getData=function(){},gp.prototype.interfaces_=function(){return[]},gp.prototype.getClass=function(){return gp};var dp=function(){};dp.prototype.addIntersection=function(t,e){},dp.prototype.interfaces_=function(){return[gp]},dp.prototype.getClass=function(){return dp};var yp=function(){this._nodeList=new pp(this),this._pts=null,this._data=null;var t=arguments[0],e=arguments[1];this._pts=t,this._data=e};yp.prototype.getCoordinates=function(){return this._pts},yp.prototype.size=function(){return this._pts.length},yp.prototype.getCoordinate=function(t){return this._pts[t]},yp.prototype.isClosed=function(){return this._pts[0].equals(this._pts[this._pts.length-1])},yp.prototype.getSegmentOctant=function(t){return t===this._pts.length-1?-1:this.safeOctant(this.getCoordinate(t),this.getCoordinate(t+1))},yp.prototype.setData=function(t){this._data=t},yp.prototype.safeOctant=function(t,e){return t.equals2D(e)?0:fp.octant(t,e)},yp.prototype.getData=function(){return this._data},yp.prototype.addIntersection=function(){if(2===arguments.length){var t=arguments[0],e=arguments[1];this.addIntersectionNode(t,e)}else if(4===arguments.length){var n=arguments[0],r=arguments[1],i=arguments[3],o=new ul(n.getIntersection(i));this.addIntersection(o,r)}},yp.prototype.toString=function(){return Fl.toLineString(new lh(this._pts))},yp.prototype.getNodeList=function(){return this._nodeList},yp.prototype.addIntersectionNode=function(t,e){var n=e,r=n+1;if(r=0&&n>=0||e<=0&&n<=0?Math.max(e,n):0}if(arguments[0]instanceof ul){var r=arguments[0];return Xl.orientationIndex(this.p0,this.p1,r)}},vp.prototype.toGeometry=function(t){return t.createLineString([this.p0,this.p1])},vp.prototype.isVertical=function(){return this.p0.x===this.p1.x},vp.prototype.equals=function(t){if(!(t instanceof vp))return!1;var e=t;return this.p0.equals(e.p0)&&this.p1.equals(e.p1)},vp.prototype.intersection=function(t){var e=new jl;return e.computeIntersection(this.p0,this.p1,t.p0,t.p1),e.hasIntersection()?e.getIntersection(0):null},vp.prototype.project=function(){if(arguments[0]instanceof ul){var t=arguments[0];if(t.equals(this.p0)||t.equals(this.p1))return new ul(t);var e=this.projectionFactor(t),n=new ul;return n.x=this.p0.x+e*(this.p1.x-this.p0.x),n.y=this.p0.y+e*(this.p1.y-this.p0.y),n}if(arguments[0]instanceof vp){var r=arguments[0],i=this.projectionFactor(r.p0),o=this.projectionFactor(r.p1);if(i>=1&&o>=1)return null;if(i<=0&&o<=0)return null;var s=this.project(r.p0);i<0&&(s=this.p0),i>1&&(s=this.p1);var a=this.project(r.p1);return o<0&&(a=this.p0),o>1&&(a=this.p1),new vp(s,a)}},vp.prototype.normalize=function(){this.p1.compareTo(this.p0)<0&&this.reverse()},vp.prototype.angle=function(){return Math.atan2(this.p1.y-this.p0.y,this.p1.x-this.p0.x)},vp.prototype.getCoordinate=function(t){return 0===t?this.p0:this.p1},vp.prototype.distancePerpendicular=function(t){return Xl.distancePointLinePerpendicular(t,this.p0,this.p1)},vp.prototype.minY=function(){return Math.min(this.p0.y,this.p1.y)},vp.prototype.midPoint=function(){return vp.midPoint(this.p0,this.p1)},vp.prototype.projectionFactor=function(t){if(t.equals(this.p0))return 0;if(t.equals(this.p1))return 1;var e=this.p1.x-this.p0.x,n=this.p1.y-this.p0.y,r=e*e+n*n;return r<=0?nl.NaN:((t.x-this.p0.x)*e+(t.y-this.p0.y)*n)/r},vp.prototype.closestPoints=function(t){var e=this.intersection(t);if(null!==e)return[e,e];var n=new Array(2).fill(null),r=nl.MAX_VALUE,i=null,o=this.closestPoint(t.p0);r=o.distance(t.p0),n[0]=o,n[1]=t.p0;var s=this.closestPoint(t.p1);(i=s.distance(t.p1))0&&e<1?this.project(t):this.p0.distance(t)1||nl.isNaN(e))&&(e=1),e},vp.prototype.toString=function(){return"LINESTRING( "+this.p0.x+" "+this.p0.y+", "+this.p1.x+" "+this.p1.y+")"},vp.prototype.isHorizontal=function(){return this.p0.y===this.p1.y},vp.prototype.distance=function(){if(arguments[0]instanceof vp){var t=arguments[0];return Xl.distanceLineLine(this.p0,this.p1,t.p0,t.p1)}if(arguments[0]instanceof ul){var e=arguments[0];return Xl.distancePointLine(e,this.p0,this.p1)}},vp.prototype.pointAlong=function(t){var e=new ul;return e.x=this.p0.x+t*(this.p1.x-this.p0.x),e.y=this.p0.y+t*(this.p1.y-this.p0.y),e},vp.prototype.hashCode=function(){var t=nl.doubleToLongBits(this.p0.x);t^=31*nl.doubleToLongBits(this.p0.y);var e=Math.trunc(t)^Math.trunc(t>>32),n=nl.doubleToLongBits(this.p1.x);return n^=31*nl.doubleToLongBits(this.p1.y),e^(Math.trunc(n)^Math.trunc(n>>32))},vp.prototype.interfaces_=function(){return[il,al]},vp.prototype.getClass=function(){return vp},vp.midPoint=function(t,e){return new ul((t.x+e.x)/2,(t.y+e.y)/2)},_p.serialVersionUID.get=function(){return 0x2d2172135f411c00},Object.defineProperties(vp,_p);var mp=function(){this.tempEnv1=new Ll,this.tempEnv2=new Ll,this._overlapSeg1=new vp,this._overlapSeg2=new vp};mp.prototype.overlap=function(){if(2===arguments.length);else if(4===arguments.length){var t=arguments[0],e=arguments[1],n=arguments[2],r=arguments[3];t.getLineSegment(e,this._overlapSeg1),n.getLineSegment(r,this._overlapSeg2),this.overlap(this._overlapSeg1,this._overlapSeg2)}},mp.prototype.interfaces_=function(){return[]},mp.prototype.getClass=function(){return mp};var xp=function(){this._pts=null,this._start=null,this._end=null,this._env=null,this._context=null,this._id=null;var t=arguments[0],e=arguments[1],n=arguments[2],r=arguments[3];this._pts=t,this._start=e,this._end=n,this._context=r};xp.prototype.getLineSegment=function(t,e){e.p0=this._pts[t],e.p1=this._pts[t+1]},xp.prototype.computeSelect=function(t,e,n,r){var i=this._pts[e],o=this._pts[n];if(r.tempEnv1.init(i,o),n-e==1)return r.select(this,e),null;if(!t.intersects(r.tempEnv1))return null;var s=Math.trunc((e+n)/2);e=t.length-1)return t.length-1;for(var r=jh.quadrant(t[n],t[n+1]),i=e+1;ir.getId()&&(r.computeOverlaps(o,e),t._nOverlaps++),t._segInt.isDone())return null}},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},n.SegmentOverlapAction.get=function(){return Np},Object.defineProperties(e,n),e}(wp),Np=function(t){function e(){t.call(this),this._si=null;var e=arguments[0];this._si=e}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.overlap=function(){if(4!==arguments.length)return t.prototype.overlap.apply(this,arguments);var e=arguments[0],n=arguments[1],r=arguments[2],i=arguments[3],o=e.getContext(),s=r.getContext();this._si.processIntersections(o,n,s,i)},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(mp),Sp=function t(){if(this._quadrantSegments=t.DEFAULT_QUADRANT_SEGMENTS,this._endCapStyle=t.CAP_ROUND,this._joinStyle=t.JOIN_ROUND,this._mitreLimit=t.DEFAULT_MITRE_LIMIT,this._isSingleSided=!1,this._simplifyFactor=t.DEFAULT_SIMPLIFY_FACTOR,0===arguments.length);else if(1===arguments.length){var e=arguments[0];this.setQuadrantSegments(e)}else if(2===arguments.length){var n=arguments[0],r=arguments[1];this.setQuadrantSegments(n),this.setEndCapStyle(r)}else if(4===arguments.length){var i=arguments[0],o=arguments[1],s=arguments[2],a=arguments[3];this.setQuadrantSegments(i),this.setEndCapStyle(o),this.setJoinStyle(s),this.setMitreLimit(a)}},Cp={CAP_ROUND:{configurable:!0},CAP_FLAT:{configurable:!0},CAP_SQUARE:{configurable:!0},JOIN_ROUND:{configurable:!0},JOIN_MITRE:{configurable:!0},JOIN_BEVEL:{configurable:!0},DEFAULT_QUADRANT_SEGMENTS:{configurable:!0},DEFAULT_MITRE_LIMIT:{configurable:!0},DEFAULT_SIMPLIFY_FACTOR:{configurable:!0}};Sp.prototype.getEndCapStyle=function(){return this._endCapStyle},Sp.prototype.isSingleSided=function(){return this._isSingleSided},Sp.prototype.setQuadrantSegments=function(t){this._quadrantSegments=t,0===this._quadrantSegments&&(this._joinStyle=Sp.JOIN_BEVEL),this._quadrantSegments<0&&(this._joinStyle=Sp.JOIN_MITRE,this._mitreLimit=Math.abs(this._quadrantSegments)),t<=0&&(this._quadrantSegments=1),this._joinStyle!==Sp.JOIN_ROUND&&(this._quadrantSegments=Sp.DEFAULT_QUADRANT_SEGMENTS)},Sp.prototype.getJoinStyle=function(){return this._joinStyle},Sp.prototype.setJoinStyle=function(t){this._joinStyle=t},Sp.prototype.setSimplifyFactor=function(t){this._simplifyFactor=t<0?0:t},Sp.prototype.getSimplifyFactor=function(){return this._simplifyFactor},Sp.prototype.getQuadrantSegments=function(){return this._quadrantSegments},Sp.prototype.setEndCapStyle=function(t){this._endCapStyle=t},Sp.prototype.getMitreLimit=function(){return this._mitreLimit},Sp.prototype.setMitreLimit=function(t){this._mitreLimit=t},Sp.prototype.setSingleSided=function(t){this._isSingleSided=t},Sp.prototype.interfaces_=function(){return[]},Sp.prototype.getClass=function(){return Sp},Sp.bufferDistanceError=function(t){var e=Math.PI/2/t;return 1-Math.cos(e/2)},Cp.CAP_ROUND.get=function(){return 1},Cp.CAP_FLAT.get=function(){return 2},Cp.CAP_SQUARE.get=function(){return 3},Cp.JOIN_ROUND.get=function(){return 1},Cp.JOIN_MITRE.get=function(){return 2},Cp.JOIN_BEVEL.get=function(){return 3},Cp.DEFAULT_QUADRANT_SEGMENTS.get=function(){return 8},Cp.DEFAULT_MITRE_LIMIT.get=function(){return 5},Cp.DEFAULT_SIMPLIFY_FACTOR.get=function(){return.01},Object.defineProperties(Sp,Cp);var Pp=function(t){this._distanceTol=null,this._isDeleted=null,this._angleOrientation=Xl.COUNTERCLOCKWISE,this._inputLine=t||null},Mp={INIT:{configurable:!0},DELETE:{configurable:!0},KEEP:{configurable:!0},NUM_PTS_TO_CHECK:{configurable:!0}};Pp.prototype.isDeletable=function(t,e,n,r){var i=this._inputLine[t],o=this._inputLine[e],s=this._inputLine[n];return!!this.isConcave(i,o,s)&&(!!this.isShallow(i,o,s,r)&&this.isShallowSampled(i,o,t,n,r))},Pp.prototype.deleteShallowConcavities=function(){for(var t=this,e=1,n=this.findNextNonDeletedIndex(e),r=this.findNextNonDeletedIndex(n),i=!1;r=0;r--)this.addPt(t[r])},Lp.prototype.isRedundant=function(t){if(this._ptList.size()<1)return!1;var e=this._ptList.get(this._ptList.size()-1);return t.distance(e)Math.PI;)t-=Rp.PI_TIMES_2;for(;t<=-Math.PI;)t+=Rp.PI_TIMES_2;return t},Rp.angle=function(){if(1===arguments.length){var t=arguments[0];return Math.atan2(t.y,t.x)}if(2===arguments.length){var e=arguments[0],n=arguments[1],r=n.x-e.x,i=n.y-e.y;return Math.atan2(i,r)}},Rp.isAcute=function(t,e,n){var r=t.x-e.x,i=t.y-e.y;return r*(n.x-e.x)+i*(n.y-e.y)>0},Rp.isObtuse=function(t,e,n){var r=t.x-e.x,i=t.y-e.y;return r*(n.x-e.x)+i*(n.y-e.y)<0},Rp.interiorAngle=function(t,e,n){var r=Rp.angle(e,t),i=Rp.angle(e,n);return Math.abs(i-r)},Rp.normalizePositive=function(t){if(t<0){for(;t<0;)t+=Rp.PI_TIMES_2;t>=Rp.PI_TIMES_2&&(t=0)}else{for(;t>=Rp.PI_TIMES_2;)t-=Rp.PI_TIMES_2;t<0&&(t=0)}return t},Rp.angleBetween=function(t,e,n){var r=Rp.angle(e,t),i=Rp.angle(e,n);return Rp.diff(r,i)},Rp.diff=function(t,e){var n=null;return(n=tMath.PI&&(n=2*Math.PI-n),n},Rp.toRadians=function(t){return t*Math.PI/180},Rp.getTurn=function(t,e){var n=Math.sin(e-t);return n>0?Rp.COUNTERCLOCKWISE:n<0?Rp.CLOCKWISE:Rp.NONE},Rp.angleBetweenOriented=function(t,e,n){var r=Rp.angle(e,t),i=Rp.angle(e,n)-r;return i<=-Math.PI?i+Rp.PI_TIMES_2:i>Math.PI?i-Rp.PI_TIMES_2:i},Tp.PI_TIMES_2.get=function(){return 2*Math.PI},Tp.PI_OVER_2.get=function(){return Math.PI/2},Tp.PI_OVER_4.get=function(){return Math.PI/4},Tp.COUNTERCLOCKWISE.get=function(){return Xl.COUNTERCLOCKWISE},Tp.CLOCKWISE.get=function(){return Xl.CLOCKWISE},Tp.NONE.get=function(){return Xl.COLLINEAR},Object.defineProperties(Rp,Tp);var Ap=function t(){this._maxCurveSegmentError=0,this._filletAngleQuantum=null,this._closingSegLengthFactor=1,this._segList=null,this._distance=0,this._precisionModel=null,this._bufParams=null,this._li=null,this._s0=null,this._s1=null,this._s2=null,this._seg0=new vp,this._seg1=new vp,this._offset0=new vp,this._offset1=new vp,this._side=0,this._hasNarrowConcaveAngle=!1;var e=arguments[0],n=arguments[1],r=arguments[2];this._precisionModel=e,this._bufParams=n,this._li=new jl,this._filletAngleQuantum=Math.PI/2/n.getQuadrantSegments(),n.getQuadrantSegments()>=8&&n.getJoinStyle()===Sp.JOIN_ROUND&&(this._closingSegLengthFactor=t.MAX_CLOSING_SEG_LEN_FACTOR),this.init(r)},Dp={OFFSET_SEGMENT_SEPARATION_FACTOR:{configurable:!0},INSIDE_TURN_VERTEX_SNAP_DISTANCE_FACTOR:{configurable:!0},CURVE_VERTEX_SNAP_DISTANCE_FACTOR:{configurable:!0},MAX_CLOSING_SEG_LEN_FACTOR:{configurable:!0}};Ap.prototype.addNextSegment=function(t,e){if(this._s0=this._s1,this._s1=this._s2,this._s2=t,this._seg0.setCoordinates(this._s0,this._s1),this.computeOffsetSegment(this._seg0,this._side,this._distance,this._offset0),this._seg1.setCoordinates(this._s1,this._s2),this.computeOffsetSegment(this._seg1,this._side,this._distance,this._offset1),this._s1.equals(this._s2))return null;var n=Xl.computeOrientation(this._s0,this._s1,this._s2),r=n===Xl.CLOCKWISE&&this._side===Sh.LEFT||n===Xl.COUNTERCLOCKWISE&&this._side===Sh.RIGHT;0===n?this.addCollinear(e):r?this.addOutsideTurn(n,e):this.addInsideTurn(n,e)},Ap.prototype.addLineEndCap=function(t,e){var n=new vp(t,e),r=new vp;this.computeOffsetSegment(n,Sh.LEFT,this._distance,r);var i=new vp;this.computeOffsetSegment(n,Sh.RIGHT,this._distance,i);var o=e.x-t.x,s=e.y-t.y,a=Math.atan2(s,o);switch(this._bufParams.getEndCapStyle()){case Sp.CAP_ROUND:this._segList.addPt(r.p1),this.addFilletArc(e,a+Math.PI/2,a-Math.PI/2,Xl.CLOCKWISE,this._distance),this._segList.addPt(i.p1);break;case Sp.CAP_FLAT:this._segList.addPt(r.p1),this._segList.addPt(i.p1);break;case Sp.CAP_SQUARE:var u=new ul;u.x=Math.abs(this._distance)*Math.cos(a),u.y=Math.abs(this._distance)*Math.sin(a);var l=new ul(r.p1.x+u.x,r.p1.y+u.y),c=new ul(i.p1.x+u.x,i.p1.y+u.y);this._segList.addPt(l),this._segList.addPt(c)}},Ap.prototype.getCoordinates=function(){return this._segList.getCoordinates()},Ap.prototype.addMitreJoin=function(t,e,n,r){var i=!0,o=null;try{o=Ml.intersection(e.p0,e.p1,n.p0,n.p1),(r<=0?1:o.distance(t)/Math.abs(r))>this._bufParams.getMitreLimit()&&(i=!1)}catch(t){if(!(t instanceof Cl))throw t;o=new ul(0,0),i=!1}i?this._segList.addPt(o):this.addLimitedMitreJoin(e,n,r,this._bufParams.getMitreLimit())},Ap.prototype.addFilletCorner=function(t,e,n,r,i){var o=e.x-t.x,s=e.y-t.y,a=Math.atan2(s,o),u=n.x-t.x,l=n.y-t.y,c=Math.atan2(l,u);r===Xl.CLOCKWISE?a<=c&&(a+=2*Math.PI):a>=c&&(a-=2*Math.PI),this._segList.addPt(e),this.addFilletArc(t,a,c,r,i),this._segList.addPt(n)},Ap.prototype.addOutsideTurn=function(t,e){if(this._offset0.p1.distance(this._offset1.p0)0){var n=new ul((this._closingSegLengthFactor*this._offset0.p1.x+this._s1.x)/(this._closingSegLengthFactor+1),(this._closingSegLengthFactor*this._offset0.p1.y+this._s1.y)/(this._closingSegLengthFactor+1));this._segList.addPt(n);var r=new ul((this._closingSegLengthFactor*this._offset1.p0.x+this._s1.x)/(this._closingSegLengthFactor+1),(this._closingSegLengthFactor*this._offset1.p0.y+this._s1.y)/(this._closingSegLengthFactor+1));this._segList.addPt(r)}else this._segList.addPt(this._s1);this._segList.addPt(this._offset1.p0)}},Ap.prototype.createCircle=function(t){var e=new ul(t.x+this._distance,t.y);this._segList.addPt(e),this.addFilletArc(t,0,2*Math.PI,-1,this._distance),this._segList.closeRing()},Ap.prototype.addBevelJoin=function(t,e){this._segList.addPt(t.p1),this._segList.addPt(e.p0)},Ap.prototype.init=function(t){this._distance=t,this._maxCurveSegmentError=t*(1-Math.cos(this._filletAngleQuantum/2)),this._segList=new Lp,this._segList.setPrecisionModel(this._precisionModel),this._segList.setMinimumVertexDistance(t*Ap.CURVE_VERTEX_SNAP_DISTANCE_FACTOR)},Ap.prototype.addCollinear=function(t){this._li.computeIntersection(this._s0,this._s1,this._s1,this._s2),this._li.getIntersectionNum()>=2&&(this._bufParams.getJoinStyle()===Sp.JOIN_BEVEL||this._bufParams.getJoinStyle()===Sp.JOIN_MITRE?(t&&this._segList.addPt(this._offset0.p1),this._segList.addPt(this._offset1.p0)):this.addFilletCorner(this._s1,this._offset0.p1,this._offset1.p0,Xl.CLOCKWISE,this._distance))},Ap.prototype.closeRing=function(){this._segList.closeRing()},Ap.prototype.hasNarrowConcaveAngle=function(){return this._hasNarrowConcaveAngle},Ap.prototype.interfaces_=function(){return[]},Ap.prototype.getClass=function(){return Ap},Dp.OFFSET_SEGMENT_SEPARATION_FACTOR.get=function(){return.001},Dp.INSIDE_TURN_VERTEX_SNAP_DISTANCE_FACTOR.get=function(){return.001},Dp.CURVE_VERTEX_SNAP_DISTANCE_FACTOR.get=function(){return 1e-6},Dp.MAX_CLOSING_SEG_LEN_FACTOR.get=function(){return 80},Object.defineProperties(Ap,Dp);var Fp=function(){this._distance=0,this._precisionModel=null,this._bufParams=null;var t=arguments[0],e=arguments[1];this._precisionModel=t,this._bufParams=e};Fp.prototype.getOffsetCurve=function(t,e){if(this._distance=e,0===e)return null;var n=e<0,r=Math.abs(e),i=this.getSegGen(r);t.length<=1?this.computePointCurve(t[0],i):this.computeOffsetCurve(t,n,i);var o=i.getCoordinates();return n&&pc.reverse(o),o},Fp.prototype.computeSingleSidedBufferCurve=function(t,e,n){var r=this.simplifyTolerance(this._distance);if(e){n.addSegments(t,!0);var i=Pp.simplify(t,-r),o=i.length-1;n.initSideSegments(i[o],i[o-1],Sh.LEFT),n.addFirstSegment();for(var s=o-2;s>=0;s--)n.addNextSegment(i[s],!0)}else{n.addSegments(t,!1);var a=Pp.simplify(t,r),u=a.length-1;n.initSideSegments(a[0],a[1],Sh.LEFT),n.addFirstSegment();for(var l=2;l<=u;l++)n.addNextSegment(a[l],!0)}n.addLastSegment(),n.closeRing()},Fp.prototype.computeRingBufferCurve=function(t,e,n){var r=this.simplifyTolerance(this._distance);e===Sh.RIGHT&&(r=-r);var i=Pp.simplify(t,r),o=i.length-1;n.initSideSegments(i[o-1],i[0],e);for(var s=1;s<=o;s++){var a=1!==s;n.addNextSegment(i[s],a)}n.closeRing()},Fp.prototype.computeLineBufferCurve=function(t,e){var n=this.simplifyTolerance(this._distance),r=Pp.simplify(t,n),i=r.length-1;e.initSideSegments(r[0],r[1],Sh.LEFT);for(var o=2;o<=i;o++)e.addNextSegment(r[o],!0);e.addLastSegment(),e.addLineEndCap(r[i-1],r[i]);var s=Pp.simplify(t,-n),a=s.length-1;e.initSideSegments(s[a],s[a-1],Sh.LEFT);for(var u=a-2;u>=0;u--)e.addNextSegment(s[u],!0);e.addLastSegment(),e.addLineEndCap(s[1],s[0]),e.closeRing()},Fp.prototype.computePointCurve=function(t,e){switch(this._bufParams.getEndCapStyle()){case Sp.CAP_ROUND:e.createCircle(t);break;case Sp.CAP_SQUARE:e.createSquare(t)}},Fp.prototype.getLineCurve=function(t,e){if(this._distance=e,e<0&&!this._bufParams.isSingleSided())return null;if(0===e)return null;var n=Math.abs(e),r=this.getSegGen(n);if(t.length<=1)this.computePointCurve(t[0],r);else if(this._bufParams.isSingleSided()){var i=e<0;this.computeSingleSidedBufferCurve(t,i,r)}else this.computeLineBufferCurve(t,r);return r.getCoordinates()},Fp.prototype.getBufferParameters=function(){return this._bufParams},Fp.prototype.simplifyTolerance=function(t){return t*this._bufParams.getSimplifyFactor()},Fp.prototype.getRingCurve=function(t,e,n){if(this._distance=n,t.length<=2)return this.getLineCurve(t,n);if(0===n)return Fp.copyCoordinates(t);var r=this.getSegGen(n);return this.computeRingBufferCurve(t,e,r),r.getCoordinates()},Fp.prototype.computeOffsetCurve=function(t,e,n){var r=this.simplifyTolerance(this._distance);if(e){var i=Pp.simplify(t,-r),o=i.length-1;n.initSideSegments(i[o],i[o-1],Sh.LEFT),n.addFirstSegment();for(var s=o-2;s>=0;s--)n.addNextSegment(i[s],!0)}else{var a=Pp.simplify(t,r),u=a.length-1;n.initSideSegments(a[0],a[1],Sh.LEFT),n.addFirstSegment();for(var l=2;l<=u;l++)n.addNextSegment(a[l],!0)}n.addLastSegment()},Fp.prototype.getSegGen=function(t){return new Ap(this._precisionModel,this._bufParams,t)},Fp.prototype.interfaces_=function(){return[]},Fp.prototype.getClass=function(){return Fp},Fp.copyCoordinates=function(t){for(var e=new Array(t.length).fill(null),n=0;no.getMaxY()||t.findStabbedSegments(e,i.getDirectedEdges(),n)}return n}if(3===arguments.length)if(gl(arguments[2],ac)&&arguments[0]instanceof ul&&arguments[1]instanceof Xh)for(var s=arguments[0],a=arguments[1],u=arguments[2],l=a.getEdge().getCoordinates(),c=0;ct._seg.p1.y&&t._seg.reverse();var h=Math.max(t._seg.p0.x,t._seg.p1.x);if(!(ht._seg.p1.y||Xl.computeOrientation(t._seg.p0,t._seg.p1,s)===Xl.RIGHT)){var p=a.getDepth(Sh.LEFT);t._seg.p0.equals(l[c])||(p=a.getDepth(Sh.RIGHT));var f=new qp(t._seg,p);u.add(f)}}else if(gl(arguments[2],ac)&&arguments[0]instanceof ul&&gl(arguments[1],ac))for(var g=arguments[0],d=arguments[1],y=arguments[2],v=d.iterator();v.hasNext();){var _=v.next();_.isForward()&&t.findStabbedSegments(g,_,y)}},kp.prototype.getDepth=function(t){var e=this.findStabbedSegments(t);return 0===e.size()?0:np.min(e)._leftDepth},kp.prototype.interfaces_=function(){return[]},kp.prototype.getClass=function(){return kp},Gp.DepthSegment.get=function(){return qp},Object.defineProperties(kp,Gp);var qp=function(){this._upwardSeg=null,this._leftDepth=null;var t=arguments[0],e=arguments[1];this._upwardSeg=new vp(t),this._leftDepth=e};qp.prototype.compareTo=function(t){var e=t;if(this._upwardSeg.minX()>=e._upwardSeg.maxX())return 1;if(this._upwardSeg.maxX()<=e._upwardSeg.minX())return-1;var n=this._upwardSeg.orientationIndex(e._upwardSeg);return 0!==n||0!==(n=-1*e._upwardSeg.orientationIndex(this._upwardSeg))?n:this._upwardSeg.compareTo(e._upwardSeg)},qp.prototype.compareX=function(t,e){var n=t.p0.compareTo(e.p0);return 0!==n?n:t.p1.compareTo(e.p1)},qp.prototype.toString=function(){return this._upwardSeg.toString()},qp.prototype.interfaces_=function(){return[il]},qp.prototype.getClass=function(){return qp};var Bp=function(t,e,n){this.p0=t||null,this.p1=e||null,this.p2=n||null};Bp.prototype.area=function(){return Bp.area(this.p0,this.p1,this.p2)},Bp.prototype.signedArea=function(){return Bp.signedArea(this.p0,this.p1,this.p2)},Bp.prototype.interpolateZ=function(t){if(null===t)throw new el("Supplied point is null.");return Bp.interpolateZ(t,this.p0,this.p1,this.p2)},Bp.prototype.longestSideLength=function(){return Bp.longestSideLength(this.p0,this.p1,this.p2)},Bp.prototype.isAcute=function(){return Bp.isAcute(this.p0,this.p1,this.p2)},Bp.prototype.circumcentre=function(){return Bp.circumcentre(this.p0,this.p1,this.p2)},Bp.prototype.area3D=function(){return Bp.area3D(this.p0,this.p1,this.p2)},Bp.prototype.centroid=function(){return Bp.centroid(this.p0,this.p1,this.p2)},Bp.prototype.inCentre=function(){return Bp.inCentre(this.p0,this.p1,this.p2)},Bp.prototype.interfaces_=function(){return[]},Bp.prototype.getClass=function(){return Bp},Bp.area=function(t,e,n){return Math.abs(((n.x-t.x)*(e.y-t.y)-(e.x-t.x)*(n.y-t.y))/2)},Bp.signedArea=function(t,e,n){return((n.x-t.x)*(e.y-t.y)-(e.x-t.x)*(n.y-t.y))/2},Bp.det=function(t,e,n,r){return t*r-e*n},Bp.interpolateZ=function(t,e,n,r){var i=e.x,o=e.y,s=n.x-i,a=r.x-i,u=n.y-o,l=r.y-o,c=s*l-a*u,h=t.x-i,p=t.y-o,f=(l*h-a*p)/c,g=(-u*h+s*p)/c;return e.z+f*(n.z-e.z)+g*(r.z-e.z)},Bp.longestSideLength=function(t,e,n){var r=t.distance(e),i=e.distance(n),o=n.distance(t),s=r;return i>s&&(s=i),o>s&&(s=o),s},Bp.isAcute=function(t,e,n){return!!Rp.isAcute(t,e,n)&&(!!Rp.isAcute(e,n,t)&&!!Rp.isAcute(n,t,e))},Bp.circumcentre=function(t,e,n){var r=n.x,i=n.y,o=t.x-r,s=t.y-i,a=e.x-r,u=e.y-i,l=2*Bp.det(o,s,a,u),c=Bp.det(s,o*o+s*s,u,a*a+u*u),h=Bp.det(o,o*o+s*s,a,a*a+u*u);return new ul(r-c/l,i+h/l)},Bp.perpendicularBisector=function(t,e){var n=e.x-t.x,r=e.y-t.y,i=new Ml(t.x+n/2,t.y+r/2,1),o=new Ml(t.x-r+n/2,t.y+n+r/2,1);return new Ml(i,o)},Bp.angleBisector=function(t,e,n){var r=e.distance(t),i=r/(r+e.distance(n)),o=n.x-t.x,s=n.y-t.y;return new ul(t.x+i*o,t.y+i*s)},Bp.area3D=function(t,e,n){var r=e.x-t.x,i=e.y-t.y,o=e.z-t.z,s=n.x-t.x,a=n.y-t.y,u=n.z-t.z,l=i*u-o*a,c=o*s-r*u,h=r*a-i*s,p=l*l+c*c+h*h,f=Math.sqrt(p)/2;return f},Bp.centroid=function(t,e,n){var r=(t.x+e.x+n.x)/3,i=(t.y+e.y+n.y)/3;return new ul(r,i)},Bp.inCentre=function(t,e,n){var r=e.distance(n),i=t.distance(n),o=t.distance(e),s=r+i+o,a=(r*t.x+i*e.x+o*n.x)/s,u=(r*t.y+i*e.y+o*n.y)/s;return new ul(a,u)};var zp=function(){this._inputGeom=null,this._distance=null,this._curveBuilder=null,this._curveList=new lc;var t=arguments[0],e=arguments[1],n=arguments[2];this._inputGeom=t,this._distance=e,this._curveBuilder=n};zp.prototype.addPoint=function(t){if(this._distance<=0)return null;var e=t.getCoordinates(),n=this._curveBuilder.getLineCurve(e,this._distance);this.addCurve(n,pl.EXTERIOR,pl.INTERIOR)},zp.prototype.addPolygon=function(t){var e=this,n=this._distance,r=Sh.LEFT;this._distance<0&&(n=-this._distance,r=Sh.RIGHT);var i=t.getExteriorRing(),o=pc.removeRepeatedPoints(i.getCoordinates());if(this._distance<0&&this.isErodedCompletely(i,this._distance))return null;if(this._distance<=0&&o.length<3)return null;this.addPolygonRing(o,n,r,pl.EXTERIOR,pl.INTERIOR);for(var s=0;s0&&e.isErodedCompletely(a,-e._distance)||e.addPolygonRing(u,n,Sh.opposite(r),pl.INTERIOR,pl.EXTERIOR)}},zp.prototype.isTriangleErodedCompletely=function(t,e){var n=new Bp(t[0],t[1],t[2]),r=n.inCentre();return Xl.distancePointLine(r,n.p0,n.p1)=nh.MINIMUM_VALID_SIZE&&Xl.isCCW(t)&&(o=i,s=r,n=Sh.opposite(n));var a=this._curveBuilder.getRingCurve(t,n,e);this.addCurve(a,o,s)},zp.prototype.add=function(t){if(t.isEmpty())return null;t instanceof th?this.addPolygon(t):t instanceof Zc?this.addLineString(t):t instanceof Qc?this.addPoint(t):(t instanceof eh||t instanceof Gc||t instanceof rh||t instanceof kc)&&this.addCollection(t)},zp.prototype.isErodedCompletely=function(t,e){var n=t.getCoordinates();if(n.length<4)return e<0;if(4===n.length)return this.isTriangleErodedCompletely(n,e);var r=t.getEnvelopeInternal(),i=Math.min(r.getHeight(),r.getWidth());return e<0&&2*Math.abs(e)>i},zp.prototype.addCollection=function(t){for(var e=0;e=this._max)throw new uc;var t=this._parent.getGeometryN(this._index++);return t instanceof kc?(this._subcollectionIterator=new Up(t),this._subcollectionIterator.next()):t},Up.prototype.remove=function(){throw new Error(this.getClass().getName())},Up.prototype.hasNext=function(){if(this._atStart)return!0;if(null!==this._subcollectionIterator){if(this._subcollectionIterator.hasNext())return!0;this._subcollectionIterator=null}return!(this._index>=this._max)},Up.prototype.interfaces_=function(){return[sc]},Up.prototype.getClass=function(){return Up},Up.isAtomic=function(t){return!(t instanceof kc)};var Vp=function(){this._geom=null;var t=arguments[0];this._geom=t};Vp.prototype.locate=function(t){return Vp.locate(t,this._geom)},Vp.prototype.interfaces_=function(){return[jp]},Vp.prototype.getClass=function(){return Vp},Vp.isPointInRing=function(t,e){return!!e.getEnvelopeInternal().intersects(t)&&Xl.isPointInRing(t,e.getCoordinates())},Vp.containsPointInPolygon=function(t,e){if(e.isEmpty())return!1;var n=e.getExteriorRing();if(!Vp.isPointInRing(t,n))return!1;for(var r=0;r=0;n--){var r=this._edgeList.get(n),i=r.getSym();null===e&&(e=i),null!==t&&i.setNext(t),t=r}e.setNext(t)},e.prototype.computeDepths=function(){var t=this;if(1===arguments.length){var e=arguments[0],n=this.findIndex(e),r=e.getDepth(Sh.LEFT),i=e.getDepth(Sh.RIGHT),o=this.computeDepths(n+1,this._edgeList.size(),r),s=this.computeDepths(0,n,o);if(s!==i)throw new Oh("depth mismatch at "+e.getCoordinate())}else if(3===arguments.length){for(var a=arguments[0],u=arguments[1],l=arguments[2],c=l,h=a;h=0;o--){var s=e._resultAreaEdgeList.get(o),a=s.getSym();switch(null===n&&s.getEdgeRing()===t&&(n=s),i){case e._SCANNING_FOR_INCOMING:if(a.getEdgeRing()!==t)continue;r=a,i=e._LINKING_TO_OUTGOING;break;case e._LINKING_TO_OUTGOING:if(s.getEdgeRing()!==t)continue;r.setNextMin(s),i=e._SCANNING_FOR_INCOMING}}i===this._LINKING_TO_OUTGOING&&(ql.isTrue(null!==n,"found null for first outgoing dirEdge"),ql.isTrue(n.getEdgeRing()===t,"unable to link last incoming dirEdge"),r.setNextMin(n))},e.prototype.getOutgoingDegree=function(){if(0===arguments.length){for(var t=0,e=this.iterator();e.hasNext();){var n=e.next();n.isInResult()&&t++}return t}if(1===arguments.length){for(var r=arguments[0],i=0,o=this.iterator();o.hasNext();){var s=o.next();s.getEdgeRing()===r&&i++}return i}},e.prototype.getLabel=function(){return this._label},e.prototype.findCoveredLineEdges=function(){for(var t=pl.NONE,e=this.iterator();e.hasNext();){var n=e.next(),r=n.getSym();if(!n.isLineEdge()){if(n.isInResult()){t=pl.INTERIOR;break}if(r.isInResult()){t=pl.EXTERIOR;break}}}if(t===pl.NONE)return null;for(var i=t,o=this.iterator();o.hasNext();){var s=o.next(),a=s.getSym();s.isLineEdge()?s.getEdge().setCovered(i===pl.INTERIOR):(s.isInResult()&&(i=pl.EXTERIOR),a.isInResult()&&(i=pl.INTERIOR))}},e.prototype.computeLabelling=function(e){t.prototype.computeLabelling.call(this,e),this._label=new Dh(pl.NONE);for(var n=this.iterator();n.hasNext();)for(var r=n.next().getEdge().getLabel(),i=0;i<2;i++){var o=r.getLocation(i);o!==pl.INTERIOR&&o!==pl.BOUNDARY||this._label.setLocation(i,pl.INTERIOR)}},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(Xp),Hp=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.createNode=function(t){return new Bh(t,new Yp)},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(Yh),Wp=function t(){this._pts=null,this._orientation=null;var e=arguments[0];this._pts=e,this._orientation=t.orientation(e)};Wp.prototype.compareTo=function(t){var e=t;return Wp.compareOriented(this._pts,this._orientation,e._pts,e._orientation)},Wp.prototype.interfaces_=function(){return[il]},Wp.prototype.getClass=function(){return Wp},Wp.orientation=function(t){return 1===pc.increasingDirection(t)},Wp.compareOriented=function(t,e,n,r){for(var i=e?1:-1,o=r?1:-1,s=e?t.length:-1,a=r?n.length:-1,u=e?0:t.length-1,l=r?0:n.length-1;;){var c=t[u].compareTo(n[l]);if(0!==c)return c;var h=(u+=i)===s,p=(l+=o)===a;if(h&&!p)return-1;if(!h&&p)return 1;if(h&&p)return 0}};var Jp=function(){this._edges=new lc,this._ocaMap=new Cc};Jp.prototype.print=function(t){t.print("MULTILINESTRING ( ");for(var e=0;e0&&t.print(","),t.print("(");for(var r=n.getCoordinates(),i=0;i0&&t.print(","),t.print(r[i].x+" "+r[i].y);t.println(")")}t.print(") ")},Jp.prototype.addAll=function(t){for(var e=t.iterator();e.hasNext();)this.add(e.next())},Jp.prototype.findEdgeIndex=function(t){for(var e=0;e0||!e.coord.equals2D(r);i||n--;var o=new Array(n).fill(null),s=0;o[s++]=new ul(t.coord);for(var a=t.segmentIndex+1;a<=e.segmentIndex;a++)o[s++]=this.edge.pts[a];return i&&(o[s]=e.coord),new of(o,new Dh(this.edge._label))},$p.prototype.add=function(t,e,n){var r=new Qp(t,e,n),i=this._nodeMap.get(r);return null!==i?i:(this._nodeMap.put(r,r),r)},$p.prototype.isIntersection=function(t){for(var e=this.iterator();e.hasNext();){if(e.next().coord.equals(t))return!0}return!1},$p.prototype.interfaces_=function(){return[]},$p.prototype.getClass=function(){return $p};var tf=function(){};tf.prototype.getChainStartIndices=function(t){var e=0,n=new lc;n.add(new _l(e));do{var r=this.findChainEnd(t,e);n.add(new _l(r)),e=r}while(en?e:n},ef.prototype.getMinX=function(t){var e=this.pts[this.startIndex[t]].x,n=this.pts[this.startIndex[t+1]].x;return en&&(i=1),t._depth[e][r]=i}}},nf.prototype.getDelta=function(t){return this._depth[t][Sh.RIGHT]-this._depth[t][Sh.LEFT]},nf.prototype.getLocation=function(t,e){return this._depth[t][e]<=0?pl.EXTERIOR:pl.INTERIOR},nf.prototype.toString=function(){return"A: "+this._depth[0][1]+","+this._depth[0][2]+" B: "+this._depth[1][1]+","+this._depth[1][2]},nf.prototype.add=function(){var t=this;if(1===arguments.length)for(var e=arguments[0],n=0;n<2;n++)for(var r=1;r<3;r++){var i=e.getLocation(n,r);i!==pl.EXTERIOR&&i!==pl.INTERIOR||(t.isNull(n,r)?t._depth[n][r]=nf.depthAtLocation(i):t._depth[n][r]+=nf.depthAtLocation(i))}else if(3===arguments.length){var o=arguments[0],s=arguments[1],a=arguments[2];a===pl.INTERIOR&&this._depth[o][s]++}},nf.prototype.interfaces_=function(){return[]},nf.prototype.getClass=function(){return nf},nf.depthAtLocation=function(t){return t===pl.EXTERIOR?0:t===pl.INTERIOR?1:nf.NULL_VALUE},rf.NULL_VALUE.get=function(){return-1},Object.defineProperties(nf,rf);var of=function(t){function e(){if(t.call(this),this.pts=null,this._env=null,this.eiList=new $p(this),this._name=null,this._mce=null,this._isIsolated=!0,this._depth=new nf,this._depthDelta=0,1===arguments.length){var n=arguments[0];e.call(this,n,null)}else if(2===arguments.length){var r=arguments[0],i=arguments[1];this.pts=r,this._label=i}}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getDepth=function(){return this._depth},e.prototype.getCollapsedEdge=function(){var t=new Array(2).fill(null);return t[0]=this.pts[0],t[1]=this.pts[1],new e(t,Dh.toLineLabel(this._label))},e.prototype.isIsolated=function(){return this._isIsolated},e.prototype.getCoordinates=function(){return this.pts},e.prototype.setIsolated=function(t){this._isIsolated=t},e.prototype.setName=function(t){this._name=t},e.prototype.equals=function(t){if(!(t instanceof e))return!1;var n=t;if(this.pts.length!==n.pts.length)return!1;for(var r=!0,i=!0,o=this.pts.length,s=0;s0?this.pts[0]:null;if(1===arguments.length){var t=arguments[0];return this.pts[t]}},e.prototype.print=function(t){t.print("edge "+this._name+": "),t.print("LINESTRING (");for(var e=0;e0&&t.print(","),t.print(this.pts[e].x+" "+this.pts[e].y);t.print(") "+this._label+" "+this._depthDelta)},e.prototype.computeIM=function(t){e.updateIM(this._label,t)},e.prototype.isCollapsed=function(){return!!this._label.isArea()&&(3===this.pts.length&&!!this.pts[0].equals(this.pts[2]))},e.prototype.isClosed=function(){return this.pts[0].equals(this.pts[this.pts.length-1])},e.prototype.getMaximumSegmentIndex=function(){return this.pts.length-1},e.prototype.getDepthDelta=function(){return this._depthDelta},e.prototype.getNumPoints=function(){return this.pts.length},e.prototype.printReverse=function(t){t.print("edge "+this._name+": ");for(var e=this.pts.length-1;e>=0;e--)t.print(this.pts[e]+" ");t.println("")},e.prototype.getMonotoneChainEdge=function(){return null===this._mce&&(this._mce=new ef(this)),this._mce},e.prototype.getEnvelope=function(){if(null===this._env){this._env=new Ll;for(var t=0;t0&&t.append(","),t.append(this.pts[e].x+" "+this.pts[e].y);return t.append(") "+this._label+" "+this._depthDelta),t.toString()},e.prototype.isPointwiseEqual=function(t){if(this.pts.length!==t.pts.length)return!1;for(var e=0;er||this._maxyo;if(s)return!1;var a=this.intersectsToleranceSquare(t,e);return ql.isTrue(!(s&&a),"Found bad envelope test"),a},cf.prototype.initCorners=function(t){var e=.5;this._minx=t.x-e,this._maxx=t.x+e,this._miny=t.y-e,this._maxy=t.y+e,this._corner[0]=new ul(this._maxx,this._maxy),this._corner[1]=new ul(this._minx,this._maxy),this._corner[2]=new ul(this._minx,this._miny),this._corner[3]=new ul(this._maxx,this._miny)},cf.prototype.intersects=function(t,e){return 1===this._scaleFactor?this.intersectsScaled(t,e):(this.copyScaled(t,this._p0Scaled),this.copyScaled(e,this._p1Scaled),this.intersectsScaled(this._p0Scaled,this._p1Scaled))},cf.prototype.scale=function(t){return Math.round(t*this._scaleFactor)},cf.prototype.getCoordinate=function(){return this._originalPt},cf.prototype.copyScaled=function(t,e){e.x=this.scale(t.x),e.y=this.scale(t.y)},cf.prototype.getSafeEnvelope=function(){if(null===this._safeEnv){var t=cf.SAFE_ENV_EXPANSION_FACTOR/this._scaleFactor;this._safeEnv=new Ll(this._originalPt.x-t,this._originalPt.x+t,this._originalPt.y-t,this._originalPt.y+t)}return this._safeEnv},cf.prototype.intersectsPixelClosure=function(t,e){return this._li.computeIntersection(t,e,this._corner[0],this._corner[1]),!!this._li.hasIntersection()||(this._li.computeIntersection(t,e,this._corner[1],this._corner[2]),!!this._li.hasIntersection()||(this._li.computeIntersection(t,e,this._corner[2],this._corner[3]),!!this._li.hasIntersection()||(this._li.computeIntersection(t,e,this._corner[3],this._corner[0]),!!this._li.hasIntersection())))},cf.prototype.intersectsToleranceSquare=function(t,e){var n=!1,r=!1;return this._li.computeIntersection(t,e,this._corner[0],this._corner[1]),!!this._li.isProper()||(this._li.computeIntersection(t,e,this._corner[1],this._corner[2]),!!this._li.isProper()||(this._li.hasIntersection()&&(n=!0),this._li.computeIntersection(t,e,this._corner[2],this._corner[3]),!!this._li.isProper()||(this._li.hasIntersection()&&(r=!0),this._li.computeIntersection(t,e,this._corner[3],this._corner[0]),!!this._li.isProper()||(!(!n||!r)||(!!t.equals(this._pt)||!!e.equals(this._pt))))))},cf.prototype.addSnappedNode=function(t,e){var n=t.getCoordinate(e),r=t.getCoordinate(e+1);return!!this.intersects(n,r)&&(t.addIntersection(this.getCoordinate(),e),!0)},cf.prototype.interfaces_=function(){return[]},cf.prototype.getClass=function(){return cf},hf.SAFE_ENV_EXPANSION_FACTOR.get=function(){return.75},Object.defineProperties(cf,hf);var pf=function(){this.tempEnv1=new Ll,this.selectedSegment=new vp};pf.prototype.select=function(){if(1===arguments.length);else if(2===arguments.length){var t=arguments[0],e=arguments[1];t.getLineSegment(e,this.selectedSegment),this.select(this.selectedSegment)}},pf.prototype.interfaces_=function(){return[]},pf.prototype.getClass=function(){return pf};var ff=function(){this._index=null;var t=arguments[0];this._index=t},gf={HotPixelSnapAction:{configurable:!0}};ff.prototype.snap=function(){if(1===arguments.length){var t=arguments[0];return this.snap(t,null,-1)}if(3===arguments.length){var e=arguments[0],n=arguments[1],r=arguments[2],i=e.getSafeEnvelope(),o=new df(e,n,r);return this._index.query(i,{interfaces_:function(){return[Qh]},visitItem:function(t){t.select(i,o)}}),o.isNodeAdded()}},ff.prototype.interfaces_=function(){return[]},ff.prototype.getClass=function(){return ff},gf.HotPixelSnapAction.get=function(){return df},Object.defineProperties(ff,gf);var df=function(t){function e(){t.call(this),this._hotPixel=null,this._parentEdge=null,this._hotPixelVertexIndex=null,this._isNodeAdded=!1;var e=arguments[0],n=arguments[1],r=arguments[2];this._hotPixel=e,this._parentEdge=n,this._hotPixelVertexIndex=r}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.isNodeAdded=function(){return this._isNodeAdded},e.prototype.select=function(){if(2!==arguments.length)return t.prototype.select.apply(this,arguments);var e=arguments[0],n=arguments[1],r=e.getContext();if(null!==this._parentEdge&&r===this._parentEdge&&n===this._hotPixelVertexIndex)return null;this._isNodeAdded=this._hotPixel.addSnappedNode(r,n)},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(pf),yf=function(){this._li=null,this._interiorIntersections=null;var t=arguments[0];this._li=t,this._interiorIntersections=new lc};yf.prototype.processIntersections=function(t,e,n,r){if(t===n&&e===r)return null;var i=t.getCoordinates()[e],o=t.getCoordinates()[e+1],s=n.getCoordinates()[r],a=n.getCoordinates()[r+1];if(this._li.computeIntersection(i,o,s,a),this._li.hasIntersection()&&this._li.isInteriorIntersection()){for(var u=0;u=0;e--){try{t.bufferReducedPrecision(e)}catch(e){if(!(e instanceof Oh))throw e;t._saveException=e}if(null!==t._resultGeometry)return null}throw this._saveException}if(1===arguments.length){var n=arguments[0],r=_f.precisionScaleFactor(this._argGeom,this._distance,n),i=new gh(r);this.bufferFixedPrecision(i)}},_f.prototype.computeGeometry=function(){if(this.bufferOriginalPrecision(),null!==this._resultGeometry)return null;var t=this._argGeom.getFactory().getPrecisionModel();t.getType()===gh.FIXED?this.bufferFixedPrecision(t):this.bufferReducedPrecision()},_f.prototype.setQuadrantSegments=function(t){this._bufParams.setQuadrantSegments(t)},_f.prototype.bufferOriginalPrecision=function(){try{var t=new sf(this._bufParams);this._resultGeometry=t.buffer(this._argGeom,this._distance)}catch(t){if(!(t instanceof kl))throw t;this._saveException=t}},_f.prototype.getResultGeometry=function(t){return this._distance=t,this.computeGeometry(),this._resultGeometry},_f.prototype.setEndCapStyle=function(t){this._bufParams.setEndCapStyle(t)},_f.prototype.interfaces_=function(){return[]},_f.prototype.getClass=function(){return _f},_f.bufferOp=function(){if(2===arguments.length){var t=arguments[0],e=arguments[1],n=new _f(t),r=n.getResultGeometry(e);return r}if(3===arguments.length){if(Number.isInteger(arguments[2])&&arguments[0]instanceof Wl&&"number"==typeof arguments[1]){var i=arguments[0],o=arguments[1],s=arguments[2],a=new _f(i);a.setQuadrantSegments(s);var u=a.getResultGeometry(o);return u}if(arguments[2]instanceof Sp&&arguments[0]instanceof Wl&&"number"==typeof arguments[1]){var l=arguments[0],c=arguments[1],h=arguments[2],p=new _f(l,h),f=p.getResultGeometry(c);return f}}else if(4===arguments.length){var g=arguments[0],d=arguments[1],y=arguments[2],v=arguments[3],_=new _f(g);_.setQuadrantSegments(y),_.setEndCapStyle(v);var m=_.getResultGeometry(d);return m}},_f.precisionScaleFactor=function(t,e,n){var r=t.getEnvelopeInternal(),i=dl.max(Math.abs(r.getMaxX()),Math.abs(r.getMaxY()),Math.abs(r.getMinX()),Math.abs(r.getMinY()))+2*(e>0?e:0),o=n-Math.trunc(Math.log(i)/Math.log(10)+1);return Math.pow(10,o)},mf.CAP_ROUND.get=function(){return Sp.CAP_ROUND},mf.CAP_BUTT.get=function(){return Sp.CAP_FLAT},mf.CAP_FLAT.get=function(){return Sp.CAP_FLAT},mf.CAP_SQUARE.get=function(){return Sp.CAP_SQUARE},mf.MAX_PRECISION_DIGITS.get=function(){return 12},Object.defineProperties(_f,mf);var xf=function(){this._pt=[new ul,new ul],this._distance=nl.NaN,this._isNull=!0};xf.prototype.getCoordinates=function(){return this._pt},xf.prototype.getCoordinate=function(t){return this._pt[t]},xf.prototype.setMinimum=function(){if(1===arguments.length){var t=arguments[0];this.setMinimum(t._pt[0],t._pt[1])}else if(2===arguments.length){var e=arguments[0],n=arguments[1];if(this._isNull)return this.initialize(e,n),null;var r=e.distance(n);rthis._distance&&this.initialize(e,n,r)}},xf.prototype.interfaces_=function(){return[]},xf.prototype.getClass=function(){return xf};var Ef=function(){};Ef.prototype.interfaces_=function(){return[]},Ef.prototype.getClass=function(){return Ef},Ef.computeDistance=function(){if(arguments[2]instanceof xf&&arguments[0]instanceof Zc&&arguments[1]instanceof ul)for(var t=arguments[0],e=arguments[1],n=arguments[2],r=t.getCoordinates(),i=new vp,o=0;o0||this._isIn?pl.INTERIOR:pl.EXTERIOR)},Pf.prototype.interfaces_=function(){return[]},Pf.prototype.getClass=function(){return Pf};var Mf=function t(){if(this._component=null,this._segIndex=null,this._pt=null,2===arguments.length){var e=arguments[0],n=arguments[1];t.call(this,e,t.INSIDE_AREA,n)}else if(3===arguments.length){var r=arguments[0],i=arguments[1],o=arguments[2];this._component=r,this._segIndex=i,this._pt=o}},Lf={INSIDE_AREA:{configurable:!0}};Mf.prototype.isInsideArea=function(){return this._segIndex===Mf.INSIDE_AREA},Mf.prototype.getCoordinate=function(){return this._pt},Mf.prototype.getGeometryComponent=function(){return this._component},Mf.prototype.getSegmentIndex=function(){return this._segIndex},Mf.prototype.interfaces_=function(){return[]},Mf.prototype.getClass=function(){return Mf},Lf.INSIDE_AREA.get=function(){return-1},Object.defineProperties(Mf,Lf);var Of=function(t){this._pts=t||null};Of.prototype.filter=function(t){t instanceof Qc&&this._pts.add(t)},Of.prototype.interfaces_=function(){return[Dc]},Of.prototype.getClass=function(){return Of},Of.getPoints=function(){if(1===arguments.length){var t=arguments[0];return t instanceof Qc?np.singletonList(t):Of.getPoints(t,new lc)}if(2===arguments.length){var e=arguments[0],n=arguments[1];return e instanceof Qc?n.add(e):e instanceof kc&&e.apply(new Of(n)),n}};var Rf=function(){this._locations=null;var t=arguments[0];this._locations=t};Rf.prototype.filter=function(t){(t instanceof Qc||t instanceof Zc||t instanceof th)&&this._locations.add(new Mf(t,0,t.getCoordinate()))},Rf.prototype.interfaces_=function(){return[Dc]},Rf.prototype.getClass=function(){return Rf},Rf.getLocations=function(t){var e=new lc;return t.apply(new Rf(e)),e};var Tf=function(){if(this._geom=null,this._terminateDistance=0,this._ptLocator=new Pf,this._minDistanceLocation=null,this._minDistance=nl.MAX_VALUE,2===arguments.length){var t=arguments[0],e=arguments[1];this._geom=[t,e],this._terminateDistance=0}else if(3===arguments.length){var n=arguments[0],r=arguments[1],i=arguments[2];this._geom=new Array(2).fill(null),this._geom[0]=n,this._geom[1]=r,this._terminateDistance=i}};Tf.prototype.computeContainmentDistance=function(){var t=this;if(0===arguments.length){var e=new Array(2).fill(null);if(this.computeContainmentDistance(0,e),this._minDistance<=this._terminateDistance)return null;this.computeContainmentDistance(1,e)}else if(2===arguments.length){var n=arguments[0],r=arguments[1],i=1-n,o=Sf.getPolygons(this._geom[n]);if(o.size()>0){var s=Rf.getLocations(this._geom[i]);if(this.computeContainmentDistance(s,o,r),this._minDistance<=this._terminateDistance)return this._minDistanceLocation[i]=r[0],this._minDistanceLocation[n]=r[1],null}}else if(3===arguments.length)if(arguments[2]instanceof Array&&gl(arguments[0],ac)&&gl(arguments[1],ac)){for(var a=arguments[0],u=arguments[1],l=arguments[2],c=0;cthis._minDistance)return null;for(var i=e.getCoordinates(),o=n.getCoordinate(),s=0;sthis._minDistance)return null;for(var f=c.getCoordinates(),g=h.getCoordinates(),d=0;dthis._distance&&this.initialize(e,n,r)}},Af.prototype.interfaces_=function(){return[]},Af.prototype.getClass=function(){return Af};var Df=function(){};Df.prototype.interfaces_=function(){return[]},Df.prototype.getClass=function(){return Df},Df.computeDistance=function(){if(arguments[2]instanceof Af&&arguments[0]instanceof Zc&&arguments[1]instanceof ul)for(var t=arguments[0],e=arguments[1],n=arguments[2],r=new vp,i=t.getCoordinates(),o=0;o1||t<=0)throw new el("Fraction is not in range (0.0 - 1.0]");this._densifyFrac=t},Ff.prototype.compute=function(t,e){this.computeOrientedDistance(t,e,this._ptDist),this.computeOrientedDistance(e,t,this._ptDist)},Ff.prototype.distance=function(){return this.compute(this._g0,this._g1),this._ptDist.getDistance()},Ff.prototype.computeOrientedDistance=function(t,e,n){var r=new Gf(e);if(t.apply(r),n.setMaximum(r.getMaxPointDistance()),this._densifyFrac>0){var i=new qf(e,this._densifyFrac);t.apply(i),n.setMaximum(i.getMaxPointDistance())}},Ff.prototype.orientedDistance=function(){return this.computeOrientedDistance(this._g0,this._g1,this._ptDist),this._ptDist.getDistance()},Ff.prototype.interfaces_=function(){return[]},Ff.prototype.getClass=function(){return Ff},Ff.distance=function(){if(2===arguments.length){var t=arguments[0],e=arguments[1],n=new Ff(t,e);return n.distance()}if(3===arguments.length){var r=arguments[0],i=arguments[1],o=arguments[2],s=new Ff(r,i);return s.setDensifyFraction(o),s.distance()}},kf.MaxPointDistanceFilter.get=function(){return Gf},kf.MaxDensifiedByFractionDistanceFilter.get=function(){return qf},Object.defineProperties(Ff,kf);var Gf=function(){this._maxPtDist=new Af,this._minPtDist=new Af,this._euclideanDist=new Df,this._geom=null;var t=arguments[0];this._geom=t};Gf.prototype.filter=function(t){this._minPtDist.initialize(),Df.computeDistance(this._geom,t,this._minPtDist),this._maxPtDist.setMaximum(this._minPtDist)},Gf.prototype.getMaxPointDistance=function(){return this._maxPtDist},Gf.prototype.interfaces_=function(){return[Kl]},Gf.prototype.getClass=function(){return Gf};var qf=function(){this._maxPtDist=new Af,this._minPtDist=new Af,this._geom=null,this._numSubSegs=0;var t=arguments[0],e=arguments[1];this._geom=t,this._numSubSegs=Math.trunc(Math.round(1/e))};qf.prototype.filter=function(t,e){var n=this;if(0===e)return null;for(var r=t.getCoordinate(e-1),i=t.getCoordinate(e),o=(i.x-r.x)/this._numSubSegs,s=(i.y-r.y)/this._numSubSegs,a=0;an){this._isValid=!1;var i=r.getCoordinates();this._errorLocation=i[1],this._errorIndicator=t.getFactory().createLineString(i),this._errMsg="Distance between buffer curve and input is too large ("+this._maxDistanceFound+" at "+Fl.toLineString(i[0],i[1])+")"}},Bf.prototype.isValid=function(){var t=Math.abs(this._bufDistance),e=Bf.MAX_DISTANCE_DIFF_FRAC*t;return this._minValidDistance=t-e,this._maxValidDistance=t+e,!(!this._input.isEmpty()&&!this._result.isEmpty())||(this._bufDistance>0?this.checkPositiveValid():this.checkNegativeValid(),Bf.VERBOSE&&Pl.out.println("Min Dist= "+this._minDistanceFound+" err= "+(1-this._minDistanceFound/this._bufDistance)+" Max Dist= "+this._maxDistanceFound+" err= "+(this._maxDistanceFound/this._bufDistance-1)),this._isValid)},Bf.prototype.checkNegativeValid=function(){if(!(this._input instanceof th||this._input instanceof rh||this._input instanceof kc))return null;var t=this.getPolygonLines(this._input);if(this.checkMinimumDistance(t,this._result,this._minValidDistance),!this._isValid)return null;this.checkMaximumDistance(t,this._result,this._maxValidDistance)},Bf.prototype.getErrorIndicator=function(){return this._errorIndicator},Bf.prototype.checkMinimumDistance=function(t,e,n){var r=new Tf(t,e,n);if(this._minDistanceFound=r.distance(),this._minDistanceFound0&&t>e&&(this._isValid=!1,this._errorMsg="Area of positive buffer is smaller than input",this._errorIndicator=this._result),this._distance<0&&t=2||this._distance>0?null:(this._result.isEmpty()||(this._isValid=!1,this._errorMsg="Result is non-empty",this._errorIndicator=this._result),void this.report("ExpectedEmpty"))},jf.prototype.report=function(t){if(!jf.VERBOSE)return null;Pl.out.println("Check "+t+": "+(this._isValid?"passed":"FAILED"))},jf.prototype.getErrorMessage=function(){return this._errorMsg},jf.prototype.interfaces_=function(){return[]},jf.prototype.getClass=function(){return jf},jf.isValidMsg=function(t,e,n){var r=new jf(t,e,n);return r.isValid()?null:r.getErrorMessage()},jf.isValid=function(t,e,n){return!!new jf(t,e,n).isValid()},Uf.VERBOSE.get=function(){return!1},Uf.MAX_ENV_DIFF_FRAC.get=function(){return.012},Object.defineProperties(jf,Uf);var Vf=function(){this._pts=null,this._data=null;var t=arguments[0],e=arguments[1];this._pts=t,this._data=e};Vf.prototype.getCoordinates=function(){return this._pts},Vf.prototype.size=function(){return this._pts.length},Vf.prototype.getCoordinate=function(t){return this._pts[t]},Vf.prototype.isClosed=function(){return this._pts[0].equals(this._pts[this._pts.length-1])},Vf.prototype.getSegmentOctant=function(t){return t===this._pts.length-1?-1:fp.octant(this.getCoordinate(t),this.getCoordinate(t+1))},Vf.prototype.setData=function(t){this._data=t},Vf.prototype.getData=function(){return this._data},Vf.prototype.toString=function(){return Fl.toLineString(new lh(this._pts))},Vf.prototype.interfaces_=function(){return[gp]},Vf.prototype.getClass=function(){return Vf};var Xf=function(){this._findAllIntersections=!1,this._isCheckEndSegmentsOnly=!1,this._li=null,this._interiorIntersection=null,this._intSegments=null,this._intersections=new lc,this._intersectionCount=0,this._keepIntersections=!0;var t=arguments[0];this._li=t,this._interiorIntersection=null};Xf.prototype.getInteriorIntersection=function(){return this._interiorIntersection},Xf.prototype.setCheckEndSegmentsOnly=function(t){this._isCheckEndSegmentsOnly=t},Xf.prototype.getIntersectionSegments=function(){return this._intSegments},Xf.prototype.count=function(){return this._intersectionCount},Xf.prototype.getIntersections=function(){return this._intersections},Xf.prototype.setFindAllIntersections=function(t){this._findAllIntersections=t},Xf.prototype.setKeepIntersections=function(t){this._keepIntersections=t},Xf.prototype.processIntersections=function(t,e,n,r){if(!this._findAllIntersections&&this.hasIntersection())return null;if(t===n&&e===r)return null;if(this._isCheckEndSegmentsOnly&&!(this.isEndSegment(t,e)||this.isEndSegment(n,r)))return null;var i=t.getCoordinates()[e],o=t.getCoordinates()[e+1],s=n.getCoordinates()[r],a=n.getCoordinates()[r+1];this._li.computeIntersection(i,o,s,a),this._li.hasIntersection()&&this._li.isInteriorIntersection()&&(this._intSegments=new Array(4).fill(null),this._intSegments[0]=i,this._intSegments[1]=o,this._intSegments[2]=s,this._intSegments[3]=a,this._interiorIntersection=this._li.getIntersection(0),this._keepIntersections&&this._intersections.add(this._interiorIntersection),this._intersectionCount++)},Xf.prototype.isEndSegment=function(t,e){return 0===e||e>=t.size()-2},Xf.prototype.hasIntersection=function(){return null!==this._interiorIntersection},Xf.prototype.isDone=function(){return!this._findAllIntersections&&null!==this._interiorIntersection},Xf.prototype.interfaces_=function(){return[Zp]},Xf.prototype.getClass=function(){return Xf},Xf.createAllIntersectionsFinder=function(t){var e=new Xf(t);return e.setFindAllIntersections(!0),e},Xf.createAnyIntersectionFinder=function(t){return new Xf(t)},Xf.createIntersectionCounter=function(t){var e=new Xf(t);return e.setFindAllIntersections(!0),e.setKeepIntersections(!1),e};var Yf=function(){this._li=new jl,this._segStrings=null,this._findAllIntersections=!1,this._segInt=null,this._isValid=!0;var t=arguments[0];this._segStrings=t};Yf.prototype.execute=function(){if(null!==this._segInt)return null;this.checkInteriorIntersections()},Yf.prototype.getIntersections=function(){return this._segInt.getIntersections()},Yf.prototype.isValid=function(){return this.execute(),this._isValid},Yf.prototype.setFindAllIntersections=function(t){this._findAllIntersections=t},Yf.prototype.checkInteriorIntersections=function(){this._isValid=!0,this._segInt=new Xf(this._li),this._segInt.setFindAllIntersections(this._findAllIntersections);var t=new Ip;if(t.setSegmentIntersector(this._segInt),t.computeNodes(this._segStrings),this._segInt.hasIntersection())return this._isValid=!1,null},Yf.prototype.checkValid=function(){if(this.execute(),!this._isValid)throw new Oh(this.getErrorMessage(),this._segInt.getInteriorIntersection())},Yf.prototype.getErrorMessage=function(){if(this._isValid)return"no intersections found";var t=this._segInt.getIntersectionSegments();return"found non-noded intersection between "+Fl.toLineString(t[0],t[1])+" and "+Fl.toLineString(t[2],t[3])},Yf.prototype.interfaces_=function(){return[]},Yf.prototype.getClass=function(){return Yf},Yf.computeIntersections=function(t){var e=new Yf(t);return e.setFindAllIntersections(!0),e.isValid(),e.getIntersections()};var Hf=function t(){this._nv=null;var e=arguments[0];this._nv=new Yf(t.toSegmentStrings(e))};Hf.prototype.checkValid=function(){this._nv.checkValid()},Hf.prototype.interfaces_=function(){return[]},Hf.prototype.getClass=function(){return Hf},Hf.toSegmentStrings=function(t){for(var e=new lc,n=t.iterator();n.hasNext();){var r=n.next();e.add(new Vf(r.getCoordinates(),r))}return e},Hf.checkValid=function(t){new Hf(t).checkValid()};var Wf=function(t){this._mapOp=t};Wf.prototype.map=function(t){for(var e=new lc,n=0;n0&&r<4&&!this._preserveType?this._factory.createLineString(n):this._factory.createLinearRing(n)},Kf.prototype.interfaces_=function(){return[]},Kf.prototype.getClass=function(){return Kf};var Qf=function t(){if(this._snapTolerance=0,this._srcPts=null,this._seg=new vp,this._allowSnappingToSourceVertices=!1,this._isClosed=!1,arguments[0]instanceof Zc&&"number"==typeof arguments[1]){var e=arguments[0],n=arguments[1];t.call(this,e.getCoordinates(),n)}else if(arguments[0]instanceof Array&&"number"==typeof arguments[1]){var r=arguments[0],i=arguments[1];this._srcPts=r,this._isClosed=t.isClosed(r),this._snapTolerance=i}};Qf.prototype.snapVertices=function(t,e){for(var n=this._isClosed?t.size()-1:t.size(),r=0;r=0&&t.add(o+1,new ul(i),!1)}},Qf.prototype.findSegmentIndexToSnap=function(t,e){for(var n=this,r=nl.MAX_VALUE,i=-1,o=0;oe&&(e=r)}return e}if(2===arguments.length){var i=arguments[0],o=arguments[1];return Math.min($f.computeOverlaySnapTolerance(i),$f.computeOverlaySnapTolerance(o))}},$f.computeSizeBasedSnapTolerance=function(t){var e=t.getEnvelopeInternal();return Math.min(e.getHeight(),e.getWidth())*$f.SNAP_PRECISION_FACTOR},$f.snapToSelf=function(t,e,n){return new $f(t).snapToSelf(e,n)},tg.SNAP_PRECISION_FACTOR.get=function(){return 1e-9},Object.defineProperties($f,tg);var eg=function(t){function e(e,n,r){t.call(this),this._snapTolerance=e||null,this._snapPts=n||null,this._isSelfSnap=void 0!==r&&r}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.snapLine=function(t,e){var n=new Qf(t,this._snapTolerance);return n.setAllowSnappingToSourceVertices(this._isSelfSnap),n.snapTo(e)},e.prototype.transformCoordinates=function(t,e){var n=t.toCoordinateArray(),r=this.snapLine(n,this._snapPts);return this._factory.getCoordinateSequenceFactory().create(r)},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(Kf),ng=function(){this._isFirst=!0,this._commonMantissaBitsCount=53,this._commonBits=0,this._commonSignExp=null};ng.prototype.getCommon=function(){return nl.longBitsToDouble(this._commonBits)},ng.prototype.add=function(t){var e=nl.doubleToLongBits(t);return this._isFirst?(this._commonBits=e,this._commonSignExp=ng.signExpBits(this._commonBits),this._isFirst=!1,null):ng.signExpBits(e)!==this._commonSignExp?(this._commonBits=0,null):(this._commonMantissaBitsCount=ng.numCommonMostSigMantissaBits(this._commonBits,e),void(this._commonBits=ng.zeroLowerBits(this._commonBits,64-(12+this._commonMantissaBitsCount))))},ng.prototype.toString=function(){if(1===arguments.length){var t=arguments[0],e=nl.longBitsToDouble(t),n=nl.toBinaryString(t),r="0000000000000000000000000000000000000000000000000000000000000000"+n,i=r.substring(r.length-64),o=i.substring(0,1)+" "+i.substring(1,12)+"(exp) "+i.substring(12)+" [ "+e+" ]";return o}},ng.prototype.interfaces_=function(){return[]},ng.prototype.getClass=function(){return ng},ng.getBit=function(t,e){return 0!=(t&1<>52},ng.zeroLowerBits=function(t,e){return t&~((1<=0;r--){if(ng.getBit(t,r)!==ng.getBit(e,r))return n;n++}return 52};var rg=function(){this._commonCoord=null,this._ccFilter=new og},ig={CommonCoordinateFilter:{configurable:!0},Translater:{configurable:!0}};rg.prototype.addCommonBits=function(t){var e=new sg(this._commonCoord);t.apply(e),t.geometryChanged()},rg.prototype.removeCommonBits=function(t){if(0===this._commonCoord.x&&0===this._commonCoord.y)return t;var e=new ul(this._commonCoord);e.x=-e.x,e.y=-e.y;var n=new sg(e);return t.apply(n),t.geometryChanged(),t},rg.prototype.getCommonCoordinate=function(){return this._commonCoord},rg.prototype.add=function(t){t.apply(this._ccFilter),this._commonCoord=this._ccFilter.getCommonCoordinate()},rg.prototype.interfaces_=function(){return[]},rg.prototype.getClass=function(){return rg},ig.CommonCoordinateFilter.get=function(){return og},ig.Translater.get=function(){return sg},Object.defineProperties(rg,ig);var og=function(){this._commonBitsX=new ng,this._commonBitsY=new ng};og.prototype.filter=function(t){this._commonBitsX.add(t.x),this._commonBitsY.add(t.y)},og.prototype.getCommonCoordinate=function(){return new ul(this._commonBitsX.getCommon(),this._commonBitsY.getCommon())},og.prototype.interfaces_=function(){return[Kl]},og.prototype.getClass=function(){return og};var sg=function(){this.trans=null;var t=arguments[0];this.trans=t};sg.prototype.filter=function(t,e){var n=t.getOrdinate(e,0)+this.trans.x,r=t.getOrdinate(e,1)+this.trans.y;t.setOrdinate(e,0,n),t.setOrdinate(e,1,r)},sg.prototype.isDone=function(){return!1},sg.prototype.isGeometryChanged=function(){return!0},sg.prototype.interfaces_=function(){return[Fc]},sg.prototype.getClass=function(){return sg};var ag=function(t,e){this._geom=new Array(2).fill(null),this._snapTolerance=null,this._cbr=null,this._geom[0]=t,this._geom[1]=e,this.computeSnapTolerance()};ag.prototype.selfSnap=function(t){return new $f(t).snapTo(t,this._snapTolerance)},ag.prototype.removeCommonBits=function(t){this._cbr=new rg,this._cbr.add(t[0]),this._cbr.add(t[1]);var e=new Array(2).fill(null);return e[0]=this._cbr.removeCommonBits(t[0].copy()),e[1]=this._cbr.removeCommonBits(t[1].copy()),e},ag.prototype.prepareResult=function(t){return this._cbr.addCommonBits(t),t},ag.prototype.getResultGeometry=function(t){var e=this.snap(this._geom),n=Mg.overlayOp(e[0],e[1],t);return this.prepareResult(n)},ag.prototype.checkValid=function(t){t.isValid()||Pl.out.println("Snapped geometry is invalid")},ag.prototype.computeSnapTolerance=function(){this._snapTolerance=$f.computeOverlaySnapTolerance(this._geom[0],this._geom[1])},ag.prototype.snap=function(t){var e=this.removeCommonBits(t);return $f.snap(e[0],e[1],this._snapTolerance)},ag.prototype.interfaces_=function(){return[]},ag.prototype.getClass=function(){return ag},ag.overlayOp=function(t,e,n){return new ag(t,e).getResultGeometry(n)},ag.union=function(t,e){return ag.overlayOp(t,e,Mg.UNION)},ag.intersection=function(t,e){return ag.overlayOp(t,e,Mg.INTERSECTION)},ag.symDifference=function(t,e){return ag.overlayOp(t,e,Mg.SYMDIFFERENCE)},ag.difference=function(t,e){return ag.overlayOp(t,e,Mg.DIFFERENCE)};var ug=function(t,e){this._geom=new Array(2).fill(null),this._geom[0]=t,this._geom[1]=e};ug.prototype.getResultGeometry=function(t){var e=null,n=!1,r=null;try{e=Mg.overlayOp(this._geom[0],this._geom[1],t);n=!0}catch(t){if(!(t instanceof kl))throw t;r=t}if(!n)try{e=ag.overlayOp(this._geom[0],this._geom[1],t)}catch(t){throw t instanceof kl?r:t}return e},ug.prototype.interfaces_=function(){return[]},ug.prototype.getClass=function(){return ug},ug.overlayOp=function(t,e,n){return new ug(t,e).getResultGeometry(n)},ug.union=function(t,e){return ug.overlayOp(t,e,Mg.UNION)},ug.intersection=function(t,e){return ug.overlayOp(t,e,Mg.INTERSECTION)},ug.symDifference=function(t,e){return ug.overlayOp(t,e,Mg.SYMDIFFERENCE)},ug.difference=function(t,e){return ug.overlayOp(t,e,Mg.DIFFERENCE)};var lg=function(){this.mce=null,this.chainIndex=null;var t=arguments[0],e=arguments[1];this.mce=t,this.chainIndex=e};lg.prototype.computeIntersections=function(t,e){this.mce.computeIntersectsForChain(this.chainIndex,t.mce,t.chainIndex,e)},lg.prototype.interfaces_=function(){return[]},lg.prototype.getClass=function(){return lg};var cg=function t(){if(this._label=null,this._xValue=null,this._eventType=null,this._insertEvent=null,this._deleteEventIndex=null,this._obj=null,2===arguments.length){var e=arguments[0],n=arguments[1];this._eventType=t.DELETE,this._xValue=e,this._insertEvent=n}else if(3===arguments.length){var r=arguments[0],i=arguments[1],o=arguments[2];this._eventType=t.INSERT,this._label=r,this._xValue=i,this._obj=o}},hg={INSERT:{configurable:!0},DELETE:{configurable:!0}};cg.prototype.isDelete=function(){return this._eventType===cg.DELETE},cg.prototype.setDeleteEventIndex=function(t){this._deleteEventIndex=t},cg.prototype.getObject=function(){return this._obj},cg.prototype.compareTo=function(t){var e=t;return this._xValuee._xValue?1:this._eventTypee._eventType?1:0},cg.prototype.getInsertEvent=function(){return this._insertEvent},cg.prototype.isInsert=function(){return this._eventType===cg.INSERT},cg.prototype.isSameLabel=function(t){return null!==this._label&&this._label===t._label},cg.prototype.getDeleteEventIndex=function(){return this._deleteEventIndex},cg.prototype.interfaces_=function(){return[il]},cg.prototype.getClass=function(){return cg},hg.INSERT.get=function(){return 1},hg.DELETE.get=function(){return 2},Object.defineProperties(cg,hg);var pg=function(){};pg.prototype.interfaces_=function(){return[]},pg.prototype.getClass=function(){return pg};var fg=function(){this._hasIntersection=!1,this._hasProper=!1,this._hasProperInterior=!1,this._properIntersectionPoint=null,this._li=null,this._includeProper=null,this._recordIsolated=null,this._isSelfIntersection=null,this._numIntersections=0,this.numTests=0,this._bdyNodes=null,this._isDone=!1,this._isDoneWhenProperInt=!1;var t=arguments[0],e=arguments[1],n=arguments[2];this._li=t,this._includeProper=e,this._recordIsolated=n};fg.prototype.isTrivialIntersection=function(t,e,n,r){if(t===n&&1===this._li.getIntersectionNum()){if(fg.isAdjacentSegments(e,r))return!0;if(t.isClosed()){var i=t.getNumPoints()-1;if(0===e&&r===i||0===r&&e===i)return!0}}return!1},fg.prototype.getProperIntersectionPoint=function(){return this._properIntersectionPoint},fg.prototype.setIsDoneIfProperInt=function(t){this._isDoneWhenProperInt=t},fg.prototype.hasProperInteriorIntersection=function(){return this._hasProperInterior},fg.prototype.isBoundaryPointInternal=function(t,e){for(var n=e.iterator();n.hasNext();){var r=n.next().getCoordinate();if(t.isIntersection(r))return!0}return!1},fg.prototype.hasProperIntersection=function(){return this._hasProper},fg.prototype.hasIntersection=function(){return this._hasIntersection},fg.prototype.isDone=function(){return this._isDone},fg.prototype.isBoundaryPoint=function(t,e){return null!==e&&(!!this.isBoundaryPointInternal(t,e[0])||!!this.isBoundaryPointInternal(t,e[1]))},fg.prototype.setBoundaryNodes=function(t,e){this._bdyNodes=new Array(2).fill(null),this._bdyNodes[0]=t,this._bdyNodes[1]=e},fg.prototype.addIntersections=function(t,e,n,r){if(t===n&&e===r)return null;this.numTests++;var i=t.getCoordinates()[e],o=t.getCoordinates()[e+1],s=n.getCoordinates()[r],a=n.getCoordinates()[r+1];this._li.computeIntersection(i,o,s,a),this._li.hasIntersection()&&(this._recordIsolated&&(t.setIsolated(!1),n.setIsolated(!1)),this._numIntersections++,this.isTrivialIntersection(t,e,n,r)||(this._hasIntersection=!0,!this._includeProper&&this._li.isProper()||(t.addIntersections(this._li,e,0),n.addIntersections(this._li,r,1)),this._li.isProper()&&(this._properIntersectionPoint=this._li.getIntersection(0).copy(),this._hasProper=!0,this._isDoneWhenProperInt&&(this._isDone=!0),this.isBoundaryPoint(this._li,this._bdyNodes)||(this._hasProperInterior=!0))))},fg.prototype.interfaces_=function(){return[]},fg.prototype.getClass=function(){return fg},fg.isAdjacentSegments=function(t,e){return 1===Math.abs(t-e)};var gg=function(t){function e(){t.call(this),this.events=new lc,this.nOverlaps=null}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.prepareEvents=function(){np.sort(this.events);for(var t=0;te||this._maxo?1:0},vg.prototype.interfaces_=function(){return[sl]},vg.prototype.getClass=function(){return vg};var _g=function(t){function e(){t.call(this),this._item=null;var e=arguments[0],n=arguments[1],r=arguments[2];this._min=e,this._max=n,this._item=r}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.query=function(t,e,n){if(!this.intersects(t,e))return null;n.visitItem(this._item)},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(dg),mg=function(t){function e(){t.call(this),this._node1=null,this._node2=null;var e=arguments[0],n=arguments[1];this._node1=e,this._node2=n,this.buildExtent(this._node1,this._node2)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.buildExtent=function(t,e){this._min=Math.min(t._min,e._min),this._max=Math.max(t._max,e._max)},e.prototype.query=function(t,e,n){if(!this.intersects(t,e))return null;null!==this._node1&&this._node1.query(t,e,n),null!==this._node2&&this._node2.query(t,e,n)},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e}(dg),xg=function(){this._leaves=new lc,this._root=null,this._level=0};xg.prototype.buildTree=function(){np.sort(this._leaves,new dg.NodeComparator);for(var t=this._leaves,e=null,n=new lc;;){if(this.buildLevel(t,n),1===n.size())return n.get(0);e=t,t=n,n=e}},xg.prototype.insert=function(t,e,n){if(null!==this._root)throw new Error("Index cannot be added to once it has been queried");this._leaves.add(new _g(t,e,n))},xg.prototype.query=function(t,e,n){this.init(),this._root.query(t,e,n)},xg.prototype.buildRoot=function(){if(null!==this._root)return null;this._root=this.buildTree()},xg.prototype.printNode=function(t){Pl.out.println(Fl.toLineString(new ul(t._min,this._level),new ul(t._max,this._level)))},xg.prototype.init=function(){if(null!==this._root)return null;this.buildRoot()},xg.prototype.buildLevel=function(t,e){this._level++,e.clear();for(var n=0;n=2,"found LineString with single point"),this.insertBoundaryPoint(this._argIndex,e[0]),this.insertBoundaryPoint(this._argIndex,e[e.length-1])},e.prototype.getInvalidPoint=function(){return this._invalidPoint},e.prototype.getBoundaryPoints=function(){for(var t=this.getBoundaryNodes(),e=new Array(t.size()).fill(null),n=0,r=t.iterator();r.hasNext();){var i=r.next();e[n++]=i.getCoordinate().copy()}return e},e.prototype.getBoundaryNodes=function(){return null===this._boundaryNodes&&(this._boundaryNodes=this._nodes.getBoundaryNodes(this._argIndex)),this._boundaryNodes},e.prototype.addSelfIntersectionNode=function(t,e,n){if(this.isBoundaryNode(t,e))return null;n===pl.BOUNDARY&&this._useBoundaryDeterminationRule?this.insertBoundaryPoint(t,e):this.insertPoint(t,e,n)},e.prototype.addPolygonRing=function(t,e,n){if(t.isEmpty())return null;var r=pc.removeRepeatedPoints(t.getCoordinates());if(r.length<4)return this._hasTooFewPoints=!0,this._invalidPoint=r[0],null;var i=e,o=n;Xl.isCCW(r)&&(i=n,o=e);var s=new of(r,new Dh(this._argIndex,pl.BOUNDARY,i,o));this._lineEdgeMap.put(t,s),this.insertEdge(s),this.insertPoint(this._argIndex,r[0],pl.BOUNDARY)},e.prototype.insertPoint=function(t,e,n){var r=this._nodes.addNode(e),i=r.getLabel();null===i?r._label=new Dh(t,n):i.setLocation(t,n)},e.prototype.createEdgeSetIntersector=function(){return new gg},e.prototype.addSelfIntersectionNodes=function(t){for(var e=this._edges.iterator();e.hasNext();)for(var n=e.next(),r=n.getLabel().getLocation(t),i=n.eiList.iterator();i.hasNext();){var o=i.next();this.addSelfIntersectionNode(t,o.coord,r)}},e.prototype.add=function(){if(1!==arguments.length)return t.prototype.add.apply(this,arguments);var e=arguments[0];if(e.isEmpty())return null;if(e instanceof rh&&(this._useBoundaryDeterminationRule=!1),e instanceof th)this.addPolygon(e);else if(e instanceof Zc)this.addLineString(e);else if(e instanceof Qc)this.addPoint(e);else if(e instanceof eh)this.addCollection(e);else if(e instanceof Gc)this.addCollection(e);else if(e instanceof rh)this.addCollection(e);else{if(!(e instanceof kc))throw new Error(e.getClass().getName());this.addCollection(e)}},e.prototype.addCollection=function(t){for(var e=0;e50?(null===this._areaPtLocator&&(this._areaPtLocator=new bg(this._parentGeom)),this._areaPtLocator.locate(t)):this._ptLocator.locate(t,this._parentGeom)},e.prototype.findEdge=function(){if(1===arguments.length){var e=arguments[0];return this._lineEdgeMap.get(e)}return t.prototype.findEdge.apply(this,arguments)},e.prototype.interfaces_=function(){return[]},e.prototype.getClass=function(){return e},e.determineBoundary=function(t,e){return t.isInBoundary(e)?pl.BOUNDARY:pl.INTERIOR},e}(Hh),Cg=function(){if(this._li=new jl,this._resultPrecisionModel=null,this._arg=null,1===arguments.length){var t=arguments[0];this.setComputationPrecision(t.getPrecisionModel()),this._arg=new Array(1).fill(null),this._arg[0]=new Sg(0,t)}else if(2===arguments.length){var e=arguments[0],n=arguments[1],r=Ql.OGC_SFS_BOUNDARY_RULE;e.getPrecisionModel().compareTo(n.getPrecisionModel())>=0?this.setComputationPrecision(e.getPrecisionModel()):this.setComputationPrecision(n.getPrecisionModel()),this._arg=new Array(2).fill(null),this._arg[0]=new Sg(0,e,r),this._arg[1]=new Sg(1,n,r)}else if(3===arguments.length){var i=arguments[0],o=arguments[1],s=arguments[2];i.getPrecisionModel().compareTo(o.getPrecisionModel())>=0?this.setComputationPrecision(i.getPrecisionModel()):this.setComputationPrecision(o.getPrecisionModel()),this._arg=new Array(2).fill(null),this._arg[0]=new Sg(0,i,s),this._arg[1]=new Sg(1,o,s)}};Cg.prototype.getArgGeometry=function(t){return this._arg[t].getGeometry()},Cg.prototype.setComputationPrecision=function(t){this._resultPrecisionModel=t,this._li.setPrecisionModel(this._resultPrecisionModel)},Cg.prototype.interfaces_=function(){return[]},Cg.prototype.getClass=function(){return Cg};var Pg=function(){};Pg.prototype.interfaces_=function(){return[]},Pg.prototype.getClass=function(){return Pg},Pg.map=function(){if(arguments[0]instanceof Wl&&gl(arguments[1],Pg.MapOp)){for(var t=arguments[0],e=arguments[1],n=new lc,r=0;r=t.size()?null:t.get(e)},Fg.union=function(t){return new Fg(t).union()},kg.STRTREE_NODE_CAPACITY.get=function(){return 4},Object.defineProperties(Fg,kg);var Gg=function(){};function qg(){return new Bg}function Bg(){this.reset()}Gg.prototype.interfaces_=function(){return[]},Gg.prototype.getClass=function(){return Gg},Gg.union=function(t,e){if(t.isEmpty()||e.isEmpty()){if(t.isEmpty()&&e.isEmpty())return Mg.createEmptyResult(Mg.UNION,t,e,t.getFactory());if(t.isEmpty())return e.copy();if(e.isEmpty())return t.copy()}return t.checkNotGeometryCollection(t),t.checkNotGeometryCollection(e),ug.overlayOp(t,e,Mg.UNION)},Bg.prototype={constructor:Bg,reset:function(){this.s=this.t=0},add:function(t){jg(zg,t,this.t),jg(this,zg.s,this.s),this.s?this.t+=zg.t:this.s=zg.t},valueOf:function(){return this.s}};var zg=new Bg;function jg(t,e,n){var r=t.s=e+n,i=r-e,o=r-i;t.t=e-o+(n-i)}var Ug=1e-6,Vg=Math.PI,Xg=Vg/2,Yg=Vg/4,Hg=2*Vg,Wg=180/Vg,Jg=Vg/180,Zg=Math.abs,Kg=Math.atan,Qg=Math.atan2,$g=Math.cos,td=Math.sin,ed=Math.sqrt;function nd(t){return t>1?0:t<-1?Vg:Math.acos(t)}function rd(t){return t>1?Xg:t<-1?-Xg:Math.asin(t)}function id(){}function od(t,e){t&&ad.hasOwnProperty(t.type)&&ad[t.type](t,e)}var sd={Feature:function(t,e){od(t.geometry,e)},FeatureCollection:function(t,e){for(var n=t.features,r=-1,i=n.length;++rVg?t-Hg:t<-Vg?t+Hg:t,e]}function md(t){return function(e,n){return[(e+=t)>Vg?e-Hg:e<-Vg?e+Hg:e,n]}}function xd(t){var e=md(t);return e.invert=md(-t),e}function Ed(t,e){var n=$g(t),r=td(t),i=$g(e),o=td(e);function s(t,e){var s=$g(e),a=$g(t)*s,u=td(t)*s,l=td(e),c=l*n+a*r;return[Qg(u*i-c*o,a*n-l*r),rd(c*i+u*o)]}return s.invert=function(t,e){var s=$g(e),a=$g(t)*s,u=td(t)*s,l=td(e),c=l*i-u*o;return[Qg(u*i+l*o,a*n+c*r),rd(c*n-a*r)]},s}function bd(t,e){(e=hd(e))[0]-=t,yd(e);var n=nd(-e[1]);return((-e[2]<0?-n:n)+Hg-Ug)%Hg}function wd(){var t,e=[];return{point:function(e,n){t.push([e,n])},lineStart:function(){e.push(t=[])},lineEnd:id,rejoin:function(){e.length>1&&e.push(e.pop().concat(e.shift()))},result:function(){var n=e;return e=[],t=null,n}}}function Id(t,e){return Zg(t[0]-e[0])=0;--o)i.point((c=l[o])[0],c[1]);else r(p.x,p.p.x,-1,i);p=p.p}l=(p=p.o).z,f=!f}while(!p.v);i.lineEnd()}}}function Cd(t){if(e=t.length){for(var e,n,r=0,i=t[0];++re?1:t>=e?0:NaN}_d.invert=_d;var Md,Ld;1===(Md=Pd).length&&(Ld=Md,Md=function(t,e){return Pd(Ld(t),e)});function Od(t){for(var e,n,r,i=t.length,o=-1,s=0;++o=0;)for(e=(r=t[i]).length;--e>=0;)n[--s]=r[e];return n}var Rd=1e9,Td=-Rd;function Ad(t,e,n,r){function i(i,o){return t<=i&&i<=n&&e<=o&&o<=r}function o(i,o,a,l){var c=0,h=0;if(null==i||(c=s(i,a))!==(h=s(o,a))||u(i,o)<0^a>0)do{l.point(0===c||3===c?t:n,c>1?r:e)}while((c=(c+a+4)%4)!==h);else l.point(o[0],o[1])}function s(r,i){return Zg(r[0]-t)0?0:3:Zg(r[0]-n)0?2:1:Zg(r[1]-e)0?1:0:i>0?3:2}function a(t,e){return u(t.x,e.x)}function u(t,e){var n=s(t,1),r=s(e,1);return n!==r?n-r:0===n?e[1]-t[1]:1===n?t[0]-e[0]:2===n?t[1]-e[1]:e[0]-t[0]}return function(s){var u,l,c,h,p,f,g,d,y,v,_,m=s,x=wd(),E={point:b,lineStart:function(){E.point=w,l&&l.push(c=[]);v=!0,y=!1,g=d=NaN},lineEnd:function(){u&&(w(h,p),f&&y&&x.rejoin(),u.push(x.result()));E.point=b,y&&m.lineEnd()},polygonStart:function(){m=x,u=[],l=[],_=!0},polygonEnd:function(){var e=function(){for(var e=0,n=0,i=l.length;nr&&(p-o)*(r-s)>(f-s)*(t-o)&&++e:f<=r&&(p-o)*(r-s)<(f-s)*(t-o)&&--e;return e}(),n=_&&e,i=(u=Od(u)).length;(n||i)&&(s.polygonStart(),n&&(s.lineStart(),o(null,null,1,s),s.lineEnd()),i&&Sd(u,a,e,o,s),s.polygonEnd());m=s,u=l=c=null}};function b(t,e){i(t,e)&&m.point(t,e)}function w(o,s){var a=i(o,s);if(l&&c.push([o,s]),v)h=o,p=s,f=a,v=!1,a&&(m.lineStart(),m.point(o,s));else if(a&&y)m.point(o,s);else{var u=[g=Math.max(Td,Math.min(Rd,g)),d=Math.max(Td,Math.min(Rd,d))],x=[o=Math.max(Td,Math.min(Rd,o)),s=Math.max(Td,Math.min(Rd,s))];!function(t,e,n,r,i,o){var s,a=t[0],u=t[1],l=0,c=1,h=e[0]-a,p=e[1]-u;if(s=n-a,h||!(s>0)){if(s/=h,h<0){if(s0){if(s>c)return;s>l&&(l=s)}if(s=i-a,h||!(s<0)){if(s/=h,h<0){if(s>c)return;s>l&&(l=s)}else if(h>0){if(s0)){if(s/=p,p<0){if(s0){if(s>c)return;s>l&&(l=s)}if(s=o-u,p||!(s<0)){if(s/=p,p<0){if(s>c)return;s>l&&(l=s)}else if(p>0){if(s0&&(t[0]=a+l*h,t[1]=u+l*p),c<1&&(e[0]=a+c*h,e[1]=u+c*p),!0}}}}}(u,x,t,e,n,r)?a&&(m.lineStart(),m.point(o,s),_=!1):(y||(m.lineStart(),m.point(u[0],u[1])),m.point(x[0],x[1]),a||m.lineEnd(),_=!1)}g=o,d=s,y=a}return E}}var Dd=qg();qg();function Fd(t){return t}qg(),qg();var kd=1/0,Gd=kd,qd=-kd,Bd=qd,zd={point:function(t,e){tqd&&(qd=t);eBd&&(Bd=e)},lineStart:id,lineEnd:id,polygonStart:id,polygonEnd:id,result:function(){var t=[[kd,Gd],[qd,Bd]];return qd=Bd=-(Gd=kd=1/0),t}};qg();function jd(t,e,n,r){return function(i,o){var s,a,u,l=e(o),c=i.invert(r[0],r[1]),h=wd(),p=e(h),f=!1,g={point:d,lineStart:v,lineEnd:_,polygonStart:function(){g.point=m,g.lineStart=x,g.lineEnd=E,a=[],s=[]},polygonEnd:function(){g.point=d,g.lineStart=v,g.lineEnd=_,a=Od(a);var t=function(t,e){var n=e[0],r=e[1],i=[td(n),-$g(n),0],o=0,s=0;Dd.reset();for(var a=0,u=t.length;a=0?1:-1,I=w*b,N=I>Vg,S=g*x;if(Dd.add(Qg(S*w*td(I),d*E+S*$g(I))),o+=N?b+w*Hg:b,N^p>=n^_>=n){var C=fd(hd(h),hd(v));yd(C);var P=fd(i,C);yd(P);var M=(N^b>=0?-1:1)*rd(P[2]);(r>M||r===M&&(C[0]||C[1]))&&(s+=N^b>=0?1:-1)}}return(o<-1e-6||o0){for(f||(o.polygonStart(),f=!0),o.lineStart(),t=0;t1&&2&i&&l.push(l.pop().concat(l.shift())),a.push(l.filter(Ud))}return g}}function Ud(t){return t.length>1}function Vd(t,e){return((t=t.x)[0]<0?t[1]-Xg-Ug:Xg-t[1])-((e=e.x)[0]<0?e[1]-Xg-Ug:Xg-e[1])}var Xd=jd((function(){return!0}),(function(t){var e,n=NaN,r=NaN,i=NaN;return{lineStart:function(){t.lineStart(),e=1},point:function(o,s){var a=o>0?Vg:-Vg,u=Zg(o-n);Zg(u-Vg)0?Xg:-Xg),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(a,r),t.point(o,r),e=0):i!==a&&u>=Vg&&(Zg(n-i)Ug?Kg((td(e)*(o=$g(r))*td(n)-td(r)*(i=$g(e))*td(t))/(i*o*s)):(e+r)/2}(n,r,o,s),t.point(i,r),t.lineEnd(),t.lineStart(),t.point(a,r),e=0),t.point(n=o,r=s),i=a},lineEnd:function(){t.lineEnd(),n=r=NaN},clean:function(){return 2-e}}}),(function(t,e,n,r){var i;if(null==t)i=n*Xg,r.point(-Vg,i),r.point(0,i),r.point(Vg,i),r.point(Vg,0),r.point(Vg,-i),r.point(0,-i),r.point(-Vg,-i),r.point(-Vg,0),r.point(-Vg,i);else if(Zg(t[0]-e[0])>Ug){var o=t[0]0,i=Zg(n)>Ug;function o(t,e){return $g(t)*$g(e)>n}function s(t,e,r){var i=[1,0,0],o=fd(hd(t),hd(e)),s=pd(o,o),a=o[0],u=s-a*a;if(!u)return!r&&t;var l=n*s/u,c=-n*a/u,h=fd(i,o),p=dd(i,l);gd(p,dd(o,c));var f=h,g=pd(p,f),d=pd(f,f),y=g*g-d*(pd(p,p)-1);if(!(y<0)){var v=ed(y),_=dd(f,(-g-v)/d);if(gd(_,p),_=cd(_),!r)return _;var m,x=t[0],E=e[0],b=t[1],w=e[1];E0^_[1]<(Zg(_[0]-x)Vg^(x<=_[0]&&_[0]<=E)){var S=dd(f,(-g+v)/d);return gd(S,p),[_,cd(S)]}}}function a(e,n){var i=r?t:Vg-t,o=0;return e<-i?o|=1:e>i&&(o|=2),n<-i?o|=4:n>i&&(o|=8),o}return jd(o,(function(t){var e,n,u,l,c;return{lineStart:function(){l=u=!1,c=1},point:function(h,p){var f,g=[h,p],d=o(h,p),y=r?d?0:a(h,p):d?a(h+(h<0?Vg:-Vg),p):0;if(!e&&(l=u=d)&&t.lineStart(),d!==u&&(!(f=s(e,g))||Id(e,f)||Id(g,f))&&(g[0]+=Ug,g[1]+=Ug,d=o(g[0],g[1])),d!==u)c=0,d?(t.lineStart(),f=s(g,e),t.point(f[0],f[1])):(f=s(e,g),t.point(f[0],f[1]),t.lineEnd()),e=f;else if(i&&e&&r^d){var v;y&n||!(v=s(g,e,!0))||(c=0,r?(t.lineStart(),t.point(v[0][0],v[0][1]),t.point(v[1][0],v[1][1]),t.lineEnd()):(t.point(v[1][0],v[1][1]),t.lineEnd(),t.lineStart(),t.point(v[0][0],v[0][1])))}!d||e&&Id(e,g)||t.point(g[0],g[1]),e=g,u=d,n=y},lineEnd:function(){u&&t.lineEnd(),e=null},clean:function(){return c|(l&&u)<<1}}}),(function(n,r,i,o){!function(t,e,n,r,i,o){if(n){var s=$g(e),a=td(e),u=r*n;null==i?(i=e+r*Hg,o=e-u/2):(i=bd(s,i),o=bd(s,o),(r>0?io)&&(i+=r*Hg));for(var l,c=i;r>0?c>o:c4*e&&d--){var x=s+p,E=a+f,b=u+g,w=ed(x*x+E*E+b*b),I=rd(b/=w),N=Zg(Zg(b)-1)e||Zg((v*M+_*L)/m-.5)>.3||s*p+a*f+u*g2?t[2]%360*Jg:0,P()):[y*Wg,v*Wg,_*Wg]},N.precision=function(t){return arguments.length?(I=Kd(C,w=t*t),M()):ed(w)},N.fitExtent=function(t,e){return Jd(N,t,e)},N.fitSize=function(t,e){return function(t,e,n){return Jd(t,[[0,0],e],n)}(N,t,e)},function(){return e=t.apply(this,arguments),N.invert=e.invert&&S,P()}}((function(){return t}))()}var ty=function(t){return function(e,n){var r=$g(e),i=$g(n),o=t(r*i);return[o*i*td(e),o*td(n)]}}((function(t){return(t=nd(t))&&t/td(t)}));function ey(){return $d(ty).scale(79.4188).clipAngle(179.999)}function ny(t,n,r,i){var s=t.properties||{},a="Feature"===t.type?t.geometry:t;if("GeometryCollection"===a.type){var u=[];return q(t,(function(t){var e=ny(t,n,r,i);e&&u.push(e)})),f(u)}var l=function(t){var n=xn(t).geometry.coordinates,r=[-n[0],-n[1]];return ey().rotate(r).scale(e)}(a),c={type:a.type,coordinates:iy(a.coordinates,l)},h=(new Ih).read(c),p=m(x(n,r),"meters"),g=_f.bufferOp(h,p,i);if(!ry((g=(new Nh).write(g)).coordinates))return o({type:g.type,coordinates:oy(g.coordinates,l)},s)}function ry(t){return Array.isArray(t[0])?ry(t[0]):isNaN(t[0])}function iy(t,e){return"object"!=typeof t[0]?e(t):t.map((function(t){return iy(t,e)}))}function oy(t,e){return"object"!=typeof t[0]?e.invert(t):t.map((function(t){return oy(t,e)}))}function sy(t,e,n){void 0===n&&(n={});var r=rt(t),i=rt(e),o=$u.intersection(r.coordinates,i.coordinates);return 0===o.length?null:1===o.length?l(o[0],n.properties):y(o,n.properties)}function ay(t,e,n){void 0===n&&(n={});var r=JSON.stringify(n.properties||{}),i=t[0],o=t[1],s=t[2],a=t[3],u=(o+a)/2,l=(i+s)/2,c=2*e/me([i,u],[s,u],n)*(s-i),h=2*e/me([l,o],[l,a],n)*(a-o),p=c/2,g=2*p,d=Math.sqrt(3)/2*h,y=s-i,v=a-o,_=3/4*g,m=d,x=(y-g)/(g-p/2),E=Math.floor(x),b=(E*_-p/2-y)/2-p/2+_/2,w=Math.floor((v-d)/d),I=(v-w*d)/2,N=w*d-v>d/2;N&&(I-=d/4);for(var S=[],C=[],P=0;P<6;P++){var M=2*Math.PI/6*P;S.push(Math.cos(M)),C.push(Math.sin(M))}for(var L=[],O=0;O<=E;O++)for(var R=0;R<=w;R++){var T=O%2==1;if((0!==R||!T)&&(0!==R||!N)){var A=O*_+i-b,D=R*m+o+I;if(T&&(D-=d/2),!0===n.triangles)ly([A,D],c/2,h/2,JSON.parse(r),S,C).forEach((function(t){n.mask?sy(n.mask,t)&&L.push(t):L.push(t)}));else{var F=uy([A,D],c/2,h/2,JSON.parse(r),S,C);n.mask?sy(n.mask,F)&&L.push(F):L.push(F)}}}return f(L)}function uy(t,e,n,r,i,o){for(var s=[],a=0;a<6;a++){var u=t[0]+e*i[a],c=t[1]+n*o[a];s.push([u,c])}return s.push(s[0].slice()),l([s],r)}function ly(t,e,n,r,i,o){for(var s=[],a=0;a<6;a++){var u=[];u.push(t),u.push([t[0]+e*i[a],t[1]+n*o[a]]),u.push([t[0]+e*i[(a+1)%6],t[1]+n*o[(a+1)%6]]),u.push(t),s.push(l([u],r))}return s}function cy(t){return y(t)}function hy(t){return l(t&&t.geometry.coordinates||[[[180,90],[-180,90],[-180,-90],[180,-90],[180,90]]])}function py(t,e,n){return void 0===n&&(n={}),function(t,e,n,r){void 0===r&&(r={});for(var i=[],o=t[0],s=t[1],a=t[2],u=t[3],c=e/me([o,s],[a,s],r)*(a-o),h=n/me([o,s],[o,u],r)*(u-s),p=a-o,g=u-s,d=Math.floor(p/c),y=Math.floor(g/h),v=(g-y*h)/2,_=o+(p-d*c)/2,m=0;m=i&&o===r.length-1);o++){if(i>=e){var s=e-i;if(s){var u=mn(r[o],r[o-1])-180;return vn(r[o],s,u,n)}return a(r[o])}i+=me(r[o],r[o+1],n)}return a(r[r.length-1])},t.angle=function(t,e,n,r){if(void 0===r&&(r={}),!P(r))throw new Error("options is invalid");if(!t)throw new Error("startPoint is required");if(!e)throw new Error("midPoint is required");if(!n)throw new Error("endPoint is required");var i=t,o=e,s=n,a=b(!0!==r.mercator?mn(i,o):Bi(i,o)),u=b(!0!==r.mercator?mn(s,o):Bi(s,o)),l=Math.abs(a-u);return!0===r.explementary?360-l:l},t.applyFilter=uu,t.area=jr,t.areaFactors=i,t.bbox=Z,t.bboxClip=function(t,e){var n=rt(t),r=n.type,i="Feature"===t.type?t.properties:{},o=n.coordinates;switch(r){case"LineString":case"MultiLineString":var s=[];return"LineString"===r&&(o=[o]),o.forEach((function(t){!function(t,e,n){var r,i,o,s,a,u=t.length,l=Ri(t[0],e),c=[];for(n||(n=[]),r=1;r0)for(var n=0;n0},t.booleanParallel=function(t,e){if(!t)throw new Error("line1 is required");if(!e)throw new Error("line2 is required");if("LineString"!==Us(t,"line1"))throw new Error("line1 must be a LineString");if("LineString"!==Us(e,"line2"))throw new Error("line2 must be a LineString");for(var n=Zn(tn(t)).features,r=Zn(tn(e)).features,i=0;in&&(e.numberOfClusters=n),!0!==e.mutate&&(t=Ie(t));var r=G(t),i=r.slice(0,e.numberOfClusters),o=zs(r,e.numberOfClusters,i),s={};return o.centroids.forEach((function(t,e){s[e]=t})),F(t,(function(t,e){var n=o.idxs[e];t.properties.cluster=n,t.properties.centroid=s[n]})),t},t.collect=function(t,e,n,r){var i=Nt(6),o=e.features.map((function(t){var e;return{minX:t.geometry.coordinates[0],minY:t.geometry.coordinates[1],maxX:t.geometry.coordinates[0],maxY:t.geometry.coordinates[1],property:null===(e=t.properties)||void 0===e?void 0:e[n]}}));return i.load(o),t.features.forEach((function(t){t.properties||(t.properties={});var e=Z(t),n=i.search({minX:e[0],minY:e[1],maxX:e[2],maxY:e[3]}),o=[];n.forEach((function(e){ye([e.minX,e.minY],t)&&o.push(e.property)})),t.properties[r]=o})),t},t.collectionOf=nt,t.combine=function(t){var e={MultiPoint:{coordinates:[],properties:[]},MultiLineString:{coordinates:[],properties:[]},MultiPolygon:{coordinates:[],properties:[]}};return F(t,(function(t){var n,r,i,o;switch(null===(o=t.geometry)||void 0===o?void 0:o.type){case"Point":e.MultiPoint.coordinates.push(t.geometry.coordinates),e.MultiPoint.properties.push(t.properties);break;case"MultiPoint":(n=e.MultiPoint.coordinates).push.apply(n,t.geometry.coordinates),e.MultiPoint.properties.push(t.properties);break;case"LineString":e.MultiLineString.coordinates.push(t.geometry.coordinates),e.MultiLineString.properties.push(t.properties);break;case"MultiLineString":(r=e.MultiLineString.coordinates).push.apply(r,t.geometry.coordinates),e.MultiLineString.properties.push(t.properties);break;case"Polygon":e.MultiPolygon.coordinates.push(t.geometry.coordinates),e.MultiPolygon.properties.push(t.properties);break;case"MultiPolygon":(i=e.MultiPolygon.coordinates).push.apply(i,t.geometry.coordinates),e.MultiPolygon.properties.push(t.properties)}})),f(Object.keys(e).filter((function(t){return e[t].coordinates.length})).sort().map((function(t){return o({type:t,coordinates:e[t].coordinates},{collectedProperties:e[t].properties})})))},t.concave=function(t,e){void 0===e&&(e={});var n=e.maxEdge||1/0,r=xe(function(t){var e=[],n={};return F(t,(function(t){if(t.geometry){var r=t.geometry.coordinates.join("-");Object.prototype.hasOwnProperty.call(n,r)||(e.push(t),n[r]=!0)}})),f(e)}(t));if(r.features=r.features.filter((function(t){var r=t.geometry.coordinates[0][0],i=t.geometry.coordinates[0][1],o=t.geometry.coordinates[0][2],s=me(r,i,e),a=me(i,o,e),u=me(r,o,e);return s<=n&&a<=n&&u<=n})),r.features.length<1)return null;var i=$e(r);return 1===i.coordinates.length&&(i.coordinates=i.coordinates[0],i.type="Polygon"),o(i)},t.containsNumber=$,t.convertArea=S,t.convertDistance=N,t.convertLength=N,t.convex=de,t.coordAll=G,t.coordEach=R,t.coordReduce=T,t.createBins=au,t.degrees2radians=I,t.degreesToRadians=I,t.destination=vn,t.difference=function(t,e){var n=rt(t),r=rt(e),i=t.properties||{},o=$u.difference(n.coordinates,r.coordinates);return 0===o.length?null:1===o.length?l(o[0],i):y(o,i)},t.dissolve=function(t,e){if(!P(e=e||{}))throw new Error("options is invalid");var n=e.propertyName;nt(t,"Polygon","dissolve");var r=[];if(!e.propertyName)return ni(y($u.union.apply(null,t.features.map((function(t){return t.geometry.coordinates})))));var i={};F(t,(function(t){Object.prototype.hasOwnProperty.call(i,t.properties[n])||(i[t.properties[n]]=[]),i[t.properties[n]].push(t)}));for(var o=Object.keys(i),s=0;s0&&(s=l(o).geometry),qa(s,a),o=a.slice(0);n.push(l(o,i));break;case"MultiPolygon":o=[[[]]];for(var c=0;c0&&(s=y(o).geometry),Ba(s,a),o=a.slice(0);n.push(y(o,i));break;default:throw new Error("geometry is invalid, must be Polygon or MultiPolygon")}})),f(n)},t.polygonTangents=function(t,e){var n,r,i,o,s=Q(t),u=Q(e),l=Z(e),c=0,h=null;switch(s[0]>l[0]&&s[0]l[1]&&s[1] is required");if("boolean"!=typeof n)throw new Error(" must be a boolean");if("boolean"!=typeof r)throw new Error(" must be a boolean");!1===r&&(t=Ie(t));var i=[];switch(t.type){case"GeometryCollection":return q(t,(function(t){Hi(t,n)})),t;case"FeatureCollection":return F(t,(function(t){F(Hi(t,n),(function(t){i.push(t)}))})),f(i)}return Hi(t,n)},t.rhumbBearing=Bi,t.rhumbDestination=ji,t.rhumbDistance=Ar,t.round=_,t.sample=function(t,e){if(!t)throw new Error("featurecollection is required");if(null==e)throw new Error("num is required");if("number"!=typeof e)throw new Error("num must be a number");return f(function(t,e){var n,r,i=t.slice(0),o=t.length,s=o-e;for(;o-- >s;)n=i[r=Math.floor((o+1)*Math.random())],i[r]=i[o],i[o]=n;return i.slice(s)}(t.features,e))},t.sector=function(t,e,n,r,i){if(!P(i=i||{}))throw new Error("options is invalid");var o=i.properties;if(!t)throw new Error("center is required");if(null==n)throw new Error("bearing1 is required");if(null==r)throw new Error("bearing2 is required");if(!e)throw new Error("radius is required");if("object"!=typeof i)throw new Error("options must be an object");if(qi(n)===qi(r))return _n(t,e,i);var s=Q(t),a=bi(t,e,n,r,i),u=[[s]];return R(a,(function(t){u[0].push(t)})),u[0].push(s),l(u,o)},t.segmentEach=U,t.segmentReduce=V,t.shortestPath=function(t,e,n){if(!P(n=n||{}))throw new Error("options is invalid");var r=n.resolution,i=n.minDistance,s=n.obstacles||f([]);if(!t)throw new Error("start is required");if(!e)throw new Error("end is required");if(r&&!C(r)||r<=0)throw new Error("options.resolution must be a number, greater than 0");if(i)throw new Error("options.minDistance is not yet implemented");var u=K(t),l=K(e);switch(t=a(u),e=a(l),it(s)){case"FeatureCollection":if(0===s.features.length)return h([u,l]);break;case"Polygon":s=f([o(rt(s))]);break;default:throw new Error("invalid obstacles")}var c=s;c.features.push(t),c.features.push(e);var p=Z(ts(gn(Z(c)),1.15));r||(r=me([p[0],p[1]],[p[2],p[1]],n)/100),c.features.pop(),c.features.pop();for(var g=p[0],d=p[1],y=p[2],v=p[3],_=r/me([g,d],[y,d],n)*(y-g),m=r/me([g,d],[g,v],n)*(v-d),x=y-g,E=v-d,b=Math.floor(x/_),w=Math.floor(E/m),I=(x-b*_)/2,N=[],S=[],M=[],L=[],O=1/0,R=1/0,T=v-(E-w*m)/2,A=0;T>=d;){for(var D=[],F=[],k=g+I,G=0;k<=y;){var q=a([k,T]),B=Js(q,s);D.push(B?0:1),F.push(k+"|"+T);var z=me(q,t);!B&&z 0 { + longitude = longitude + math.Pi + } + return radiansToDegrees(longitude), radiansToDegrees(latitude), altitude +} + +func getN(latitude float64) float64 { + var sinlatitude = math.Sin(latitude) + var denom = math.Sqrt(1 - e*e*sinlatitude*sinlatitude) + var N = a / denom + return N +} +func radiansToDegrees(radians float64) float64 { + return radians * 180 / math.Pi +} + +//106.54959740614493 23.47200769358978 diff --git a/api/v1/common/tool/zip/zip.go b/api/v1/common/tool/zip/zip.go new file mode 100644 index 0000000..f7e37e0 --- /dev/null +++ b/api/v1/common/tool/zip/zip.go @@ -0,0 +1,113 @@ +package zip + +import ( + "archive/zip" + "fmt" + "io" + "os" + "path" +) + +func ZipFiles(filename string, files []string) error { + fmt.Println("start zip file......") + //创建输出文件目录 + newZipFile, err := os.Create(filename) + if err != nil { + return err + } + defer newZipFile.Close() + //创建空的zip档案,可以理解为打开zip文件,准备写入 + zipWriter := zip.NewWriter(newZipFile) + defer zipWriter.Close() + // Add files to zip + for _, file := range files { + if err = AddFileToZip(zipWriter, file); err != nil { + return err + } + } + return nil +} + +func AddFileToZip(zipWriter *zip.Writer, filename string) error { + //打开要压缩的文件 + fileToZip, err := os.Open(filename) + if err != nil { + return err + } + defer fileToZip.Close() + //获取文件的描述 + info, err := fileToZip.Stat() + if err != nil { + return err + } + //FileInfoHeader返回一个根据fi填写了部分字段的Header,可以理解成是将fileinfo转换成zip格式的文件信息 + header, err := zip.FileInfoHeader(info) + if err != nil { + return err + } + header.Name = filename + /* + 预定义压缩算法。 + archive/zip包中预定义的有两种压缩方式。一个是仅把文件写入到zip中。不做压缩。一种是压缩文件然后写入到zip中。默认的Store模式。就是只保存不压缩的模式。 + Store unit16 = 0 //仅存储文件 + Deflate unit16 = 8 //压缩文件 + */ + header.Method = zip.Store + //创建压缩包头部信息 + writer, err := zipWriter.CreateHeader(header) + if err != nil { + return err + } + //将源复制到目标,将fileToZip 写入writer 是按默认的缓冲区32k循环操作的,不会将内容一次性全写入内存中,这样就能解决大文件的问题 + _, err = io.Copy(writer, fileToZip) + return err +} + +// Decompressor 解压 +func Decompressor(zipFilePath string, targetDir string, filename string) error { + reader, err := zip.OpenReader(zipFilePath) + if nil != err { + fmt.Println(err) + return err + } + defer reader.Close() + + _ = os.MkdirAll(targetDir, 0777) + names := []string{} + for _, f := range reader.File { + err := func() error { + if f.FileInfo().IsDir() { + _ = os.MkdirAll(path.Join(targetDir, f.Name), f.Mode()) + return nil + } + suffix := path.Ext(f.Name) + //fmt.Println(f.Name) + //fmt.Println(path.Join(targetDir, f.Name)) + writeFile, err := os.OpenFile(path.Join(targetDir, filename+suffix), os.O_WRONLY|os.O_CREATE, f.Mode()) + if nil != err { + return err + } + defer writeFile.Close() + + readFile, err := f.Open() + if nil != err { + return err + } + defer readFile.Close() + + n, err := io.Copy(writeFile, readFile) + if nil != err { + return err + } + if false { + names = append(names, f.Name) + fmt.Printf("解压文件: %s 大小: %v", f.Name, n) + } + return nil + }() + if nil != err { + return err + } + } + return nil +} diff --git a/api/v1/system/app_menus.go b/api/v1/system/app_menus.go new file mode 100644 index 0000000..49c6d1c --- /dev/null +++ b/api/v1/system/app_menus.go @@ -0,0 +1,83 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-05-28 15:09:13 +// 生成路径: api/v1/system/app_menus.go +// 生成人:gfast +// desc:app菜单相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// AppMenusSearchReq 分页请求参数 +type AppMenusSearchReq struct { + g.Meta `path:"/list" tags:"app菜单" method:"get" summary:"app菜单列表"` + MenuId string `p:"menuId"` // + MenuName string `p:"menuName"` //菜单名 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // + commonApi.PageReq + commonApi.Author +} + +// AppMenusSearchRes 列表返回结果 +type AppMenusSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.AppMenusListRes `json:"list"` +} + +// AppMenusAddReq 添加操作请求参数 +type AppMenusAddReq struct { + g.Meta `path:"/add" tags:"app菜单" method:"post" summary:"app菜单添加"` + commonApi.Author + MenuName string `p:"menuName" v:"required#菜单名不能为空"` +} + +// AppMenusAddRes 添加操作返回结果 +type AppMenusAddRes struct { + commonApi.EmptyRes +} + +// AppMenusEditReq 修改操作请求参数 +type AppMenusEditReq struct { + g.Meta `path:"/edit" tags:"app菜单" method:"put" summary:"app菜单修改"` + commonApi.Author + MenuId uint `p:"menuId" v:"required#主键ID不能为空"` + MenuName string `p:"menuName" v:"required#菜单名不能为空"` +} + +// AppMenusEditRes 修改操作返回结果 +type AppMenusEditRes struct { + commonApi.EmptyRes +} + +// AppMenusGetReq 获取一条数据请求 +type AppMenusGetReq struct { + g.Meta `path:"/get" tags:"app菜单" method:"get" summary:"获取app菜单信息"` + commonApi.Author + MenuId uint `p:"menuId" v:"required#主键必须"` //通过主键获取 +} + +// AppMenusGetRes 获取一条数据结果 +type AppMenusGetRes struct { + g.Meta `mime:"application/json"` + *model.AppMenusInfoRes +} + +// AppMenusDeleteReq 删除数据请求 +type AppMenusDeleteReq struct { + g.Meta `path:"/delete" tags:"app菜单" method:"delete" summary:"删除app菜单"` + commonApi.Author + MenuIds []uint `p:"menuIds" v:"required#主键必须"` //通过主键删除 +} + +// AppMenusDeleteRes 删除数据返回 +type AppMenusDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/app_role_menus.go b/api/v1/system/app_role_menus.go new file mode 100644 index 0000000..220fb29 --- /dev/null +++ b/api/v1/system/app_role_menus.go @@ -0,0 +1,86 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-05-28 15:11:14 +// 生成路径: api/v1/system/app_role_menus.go +// 生成人:gfast +// desc:app角色绑定菜单相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// AppRoleMenusSearchReq 分页请求参数 +type AppRoleMenusSearchReq struct { + g.Meta `path:"/list" tags:"app角色绑定菜单" method:"get" summary:"app角色绑定菜单列表"` + Id string `p:"id"` // + RoleId string `p:"roleId" v:"roleId@integer#角色ID需为整数"` //角色ID + MenuId string `p:"menuId" v:"menuId@integer#菜单ID需为整数"` //菜单ID + CreatedAt string `p:"createdAt" v:"createdAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // + commonApi.PageReq + commonApi.Author +} + +// AppRoleMenusSearchRes 列表返回结果 +type AppRoleMenusSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.AppRoleMenusListRes `json:"list"` +} + +// AppRoleMenusAddReq 添加操作请求参数 +type AppRoleMenusAddReq struct { + g.Meta `path:"/add" tags:"app角色绑定菜单" method:"post" summary:"app角色绑定菜单添加"` + commonApi.Author + RoleId int `p:"roleId" ` + MenuId int `p:"menuId" ` +} + +// AppRoleMenusAddRes 添加操作返回结果 +type AppRoleMenusAddRes struct { + commonApi.EmptyRes +} + +// AppRoleMenusEditReq 修改操作请求参数 +type AppRoleMenusEditReq struct { + g.Meta `path:"/edit" tags:"app角色绑定菜单" method:"put" summary:"app角色绑定菜单修改"` + commonApi.Author + Id uint `p:"id" v:"required#主键ID不能为空"` + RoleId int `p:"roleId" ` + MenuId int `p:"menuId" ` +} + +// AppRoleMenusEditRes 修改操作返回结果 +type AppRoleMenusEditRes struct { + commonApi.EmptyRes +} + +// AppRoleMenusGetReq 获取一条数据请求 +type AppRoleMenusGetReq struct { + g.Meta `path:"/get" tags:"app角色绑定菜单" method:"get" summary:"获取app角色绑定菜单信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// AppRoleMenusGetRes 获取一条数据结果 +type AppRoleMenusGetRes struct { + g.Meta `mime:"application/json"` + *model.AppRoleMenusInfoRes +} + +// AppRoleMenusDeleteReq 删除数据请求 +type AppRoleMenusDeleteReq struct { + g.Meta `path:"/delete" tags:"app角色绑定菜单" method:"delete" summary:"删除app角色绑定菜单"` + commonApi.Author + Ids []uint `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// AppRoleMenusDeleteRes 删除数据返回 +type AppRoleMenusDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/app_roles.go b/api/v1/system/app_roles.go new file mode 100644 index 0000000..7410ea6 --- /dev/null +++ b/api/v1/system/app_roles.go @@ -0,0 +1,108 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-05-28 15:11:36 +// 生成路径: api/v1/system/app_roles.go +// 生成人:gfast +// desc:app角色相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// AppRolesSearchReq 分页请求参数 +type AppRolesSearchReq struct { + g.Meta `path:"/list" tags:"app角色" method:"get" summary:"app角色列表"` + RoleId string `p:"roleId"` // + RoleName string `p:"roleName"` // 角色名 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // + commonApi.PageReq + commonApi.Author +} + +// AppRolesSearchRes 列表返回结果 +type AppRolesSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.AppRolesListRes `json:"list"` +} + +// AppRolesAddReq 添加操作请求参数 +type AppRolesAddReq struct { + g.Meta `path:"/add" tags:"app角色" method:"post" summary:"app角色添加"` + commonApi.Author + RoleName string `p:"roleName" v:"required#角色名不能为空"` +} + +// AppRolesAddRes 添加操作返回结果 +type AppRolesAddRes struct { + commonApi.EmptyRes +} + +// AppRolesAddMenuReq 添加角色时绑定菜单 +type AppRolesAddMenuReq struct { + g.Meta `path:"/addMenu" tags:"app角色" method:"post" summary:"app添加角色的同时绑定菜单"` + RoleName string `p:"roleName" v:"required#角色名不能为空" dc:"角色名"` // 角色名字 + MenuIds []int `p:"menuIds" v:"required#菜单ID不能为空" dc:"菜单ID 数组"` // 菜单ID + commonApi.Author +} + +type AppRolesAddMenuRes struct { + commonApi.EmptyRes +} + +// AppRolesEditReq 修改操作请求参数 +type AppRolesEditReq struct { + g.Meta `path:"/edit" tags:"app角色" method:"put" summary:"app角色修改"` + commonApi.Author + RoleId uint `p:"roleId" v:"required#主键ID不能为空"` + RoleName string `p:"roleName" v:"required#角色名不能为空"` + MenuIds []int `p:"menuIds" dc:"菜单列表"` // 菜单列表 +} + +// AppRolesEditRes 修改操作返回结果 +type AppRolesEditRes struct { + commonApi.EmptyRes +} + +// AppRolesGetReq 获取一条数据请求 +type AppRolesGetReq struct { + g.Meta `path:"/get" tags:"app角色" method:"get" summary:"获取app角色信息"` + commonApi.Author + RoleId uint `p:"roleId" v:"required#主键必须"` // 通过主键获取 +} + +// AppRolesGetRes 获取一条数据结果 +type AppRolesGetRes struct { + g.Meta `mime:"application/json"` + *model.AppRolesInfoRes +} + +// AppRolesDeleteReq 删除数据请求 +type AppRolesDeleteReq struct { + g.Meta `path:"/delete" tags:"app角色" method:"delete" summary:"删除app角色"` + commonApi.Author + RoleIds []uint `p:"roleIds" v:"required#主键必须"` // 通过主键删除 +} + +// AppRolesDeleteRes 删除数据返回 +type AppRolesDeleteRes struct { + commonApi.EmptyRes +} + +// 获取一个角色的菜单 +type AppRolesGetMenuReq struct { + g.Meta `path:"/getMenu" tags:"app角色" method:"get" summary:"获取角色的菜单"` + commonApi.Author + RoleId uint `p:"roleId" v:"required#角色ID不能为空"` +} + +type AppRolesGetMenuRes struct { + g.Meta `mime:"application/json"` + List model.AppRoleDetails +} diff --git a/api/v1/system/app_user_disable_menus.go b/api/v1/system/app_user_disable_menus.go new file mode 100644 index 0000000..adaaf1d --- /dev/null +++ b/api/v1/system/app_user_disable_menus.go @@ -0,0 +1,86 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-05-28 15:11:37 +// 生成路径: api/v1/system/app_user_disable_menus.go +// 生成人:gfast +// desc:app用户禁用菜单关联相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// AppUserDisableMenusSearchReq 分页请求参数 +type AppUserDisableMenusSearchReq struct { + g.Meta `path:"/list" tags:"app用户禁用菜单关联" method:"get" summary:"app用户禁用菜单关联列表"` + UserDisabledMenuId string `p:"userDisabledMenuId"` // + UserId string `p:"userId" v:"userId@integer#用户ID需为整数"` //用户ID + MenuId string `p:"menuId" v:"menuId@integer#菜单ID需为整数"` //菜单ID + CreatedAt string `p:"createdAt" v:"createdAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // + commonApi.PageReq + commonApi.Author +} + +// AppUserDisableMenusSearchRes 列表返回结果 +type AppUserDisableMenusSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.AppUserDisableMenusListRes `json:"list"` +} + +// AppUserDisableMenusAddReq 添加操作请求参数 +type AppUserDisableMenusAddReq struct { + g.Meta `path:"/add" tags:"app用户禁用菜单关联" method:"post" summary:"app用户禁用菜单关联添加"` + commonApi.Author + UserId int `p:"userId" ` + MenuId int `p:"menuId" ` +} + +// AppUserDisableMenusAddRes 添加操作返回结果 +type AppUserDisableMenusAddRes struct { + commonApi.EmptyRes +} + +// AppUserDisableMenusEditReq 修改操作请求参数 +type AppUserDisableMenusEditReq struct { + g.Meta `path:"/edit" tags:"app用户禁用菜单关联" method:"put" summary:"app用户禁用菜单关联修改"` + commonApi.Author + UserDisabledMenuId uint `p:"userDisabledMenuId" v:"required#主键ID不能为空"` + UserId int `p:"userId" ` + MenuId int `p:"menuId" ` +} + +// AppUserDisableMenusEditRes 修改操作返回结果 +type AppUserDisableMenusEditRes struct { + commonApi.EmptyRes +} + +// AppUserDisableMenusGetReq 获取一条数据请求 +type AppUserDisableMenusGetReq struct { + g.Meta `path:"/get" tags:"app用户禁用菜单关联" method:"get" summary:"获取app用户禁用菜单关联信息"` + commonApi.Author + UserDisabledMenuId uint `p:"userDisabledMenuId" v:"required#主键必须"` //通过主键获取 +} + +// AppUserDisableMenusGetRes 获取一条数据结果 +type AppUserDisableMenusGetRes struct { + g.Meta `mime:"application/json"` + *model.AppUserDisableMenusInfoRes +} + +// AppUserDisableMenusDeleteReq 删除数据请求 +type AppUserDisableMenusDeleteReq struct { + g.Meta `path:"/delete" tags:"app用户禁用菜单关联" method:"delete" summary:"删除app用户禁用菜单关联"` + commonApi.Author + UserDisabledMenuIds []uint `p:"userDisabledMenuIds" v:"required#主键必须"` //通过主键删除 +} + +// AppUserDisableMenusDeleteRes 删除数据返回 +type AppUserDisableMenusDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/app_user_menus.go b/api/v1/system/app_user_menus.go new file mode 100644 index 0000000..f0e9852 --- /dev/null +++ b/api/v1/system/app_user_menus.go @@ -0,0 +1,86 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-05-28 15:11:37 +// 生成路径: api/v1/system/app_user_menus.go +// 生成人:gfast +// desc:app用户菜单关联相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// AppUserMenusSearchReq 分页请求参数 +type AppUserMenusSearchReq struct { + g.Meta `path:"/list" tags:"app用户菜单关联" method:"get" summary:"app用户菜单关联列表"` + UserMenuId string `p:"userMenuId"` // + UserId string `p:"userId" v:"userId@integer#用户ID需为整数"` //用户ID + MenuId string `p:"menuId" v:"menuId@integer#菜单ID需为整数"` //菜单ID + CreatedAt string `p:"createdAt" v:"createdAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // + commonApi.PageReq + commonApi.Author +} + +// AppUserMenusSearchRes 列表返回结果 +type AppUserMenusSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.AppUserMenusListRes `json:"list"` +} + +// AppUserMenusAddReq 添加操作请求参数 +type AppUserMenusAddReq struct { + g.Meta `path:"/add" tags:"app用户菜单关联" method:"post" summary:"app用户菜单关联添加"` + commonApi.Author + UserId int `p:"userId" ` + MenuId int `p:"menuId" ` +} + +// AppUserMenusAddRes 添加操作返回结果 +type AppUserMenusAddRes struct { + commonApi.EmptyRes +} + +// AppUserMenusEditReq 修改操作请求参数 +type AppUserMenusEditReq struct { + g.Meta `path:"/edit" tags:"app用户菜单关联" method:"put" summary:"app用户菜单关联修改"` + commonApi.Author + UserMenuId uint `p:"userMenuId" v:"required#主键ID不能为空"` + UserId int `p:"userId" ` + MenuId int `p:"menuId" ` +} + +// AppUserMenusEditRes 修改操作返回结果 +type AppUserMenusEditRes struct { + commonApi.EmptyRes +} + +// AppUserMenusGetReq 获取一条数据请求 +type AppUserMenusGetReq struct { + g.Meta `path:"/get" tags:"app用户菜单关联" method:"get" summary:"获取app用户菜单关联信息"` + commonApi.Author + UserMenuId uint `p:"userMenuId" v:"required#主键必须"` //通过主键获取 +} + +// AppUserMenusGetRes 获取一条数据结果 +type AppUserMenusGetRes struct { + g.Meta `mime:"application/json"` + *model.AppUserMenusInfoRes +} + +// AppUserMenusDeleteReq 删除数据请求 +type AppUserMenusDeleteReq struct { + g.Meta `path:"/delete" tags:"app用户菜单关联" method:"delete" summary:"删除app用户菜单关联"` + commonApi.Author + UserMenuIds []uint `p:"userMenuIds" v:"required#主键必须"` //通过主键删除 +} + +// AppUserMenusDeleteRes 删除数据返回 +type AppUserMenusDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/app_user_roles.go b/api/v1/system/app_user_roles.go new file mode 100644 index 0000000..d54a245 --- /dev/null +++ b/api/v1/system/app_user_roles.go @@ -0,0 +1,130 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-05-28 15:11:37 +// 生成路径: api/v1/system/app_user_roles.go +// 生成人:gfast +// desc:app用户角色关联相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// AppUserRolesSearchReq 分页请求参数 +type AppUserRolesSearchReq struct { + g.Meta `path:"/list" tags:"app用户角色关联" method:"get" summary:"app用户角色关联列表"` + Id string `p:"id"` // + UserId string `p:"userId" v:"userId@integer#用户ID需为整数"` // 用户ID + RoleId string `p:"roleId" v:"roleId@integer#关联的角色ID需为整数"` // 关联的角色ID + CreatedAt string `p:"createdAt" v:"createdAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // + commonApi.PageReq + commonApi.Author +} + +// AppUserRolesSearchRes 列表返回结果 +type AppUserRolesSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.AppUserRolesListRes `json:"list"` +} + +// AppUserRolesAddReq 添加操作请求参数 +type AppUserRolesAddReq struct { + g.Meta `path:"/add" tags:"app用户角色关联" method:"post" summary:"app用户角色关联添加"` + commonApi.Author + UserId int `p:"userId" ` + RoleId int `p:"roleId" ` +} + +// AppUserRolesAddRes 添加操作返回结果 +type AppUserRolesAddRes struct { + commonApi.EmptyRes +} + +// AppUserRolesEditReq 修改操作请求参数 +type AppUserRolesEditReq struct { + g.Meta `path:"/edit" tags:"app用户角色关联" method:"put" summary:"app用户角色关联修改"` + commonApi.Author + Id uint `p:"id"` + UserId int `p:"userId" ` + RoleId int `p:"roleId" ` +} + +// AppUserRolesEditRes 修改操作返回结果 +type AppUserRolesEditRes struct { + commonApi.EmptyRes +} + +// AppUserRolesGetReq 获取一条数据请求 +type AppUserRolesGetReq struct { + g.Meta `path:"/get" tags:"app用户角色关联" method:"get" summary:"获取app用户角色关联信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// AppUserRolesGetRes 获取一条数据结果 +type AppUserRolesGetRes struct { + g.Meta `mime:"application/json"` + *model.AppUserRolesInfoRes +} + +// AppUserRolesDeleteReq 删除数据请求 +type AppUserRolesDeleteReq struct { + g.Meta `path:"/delete" tags:"app用户角色关联" method:"delete" summary:"删除app用户角色关联"` + commonApi.Author + Ids []uint `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// AppUserRolesDeleteRes 删除数据返回 +type AppUserRolesDeleteRes struct { + commonApi.EmptyRes +} + +// AppUserRolesBindReq 给用户绑定角色 +type AppUserRolesBindReq struct { + g.Meta `path:"/bindRole" tags:"app用户角色关联" method:"post" summary:"给用户绑定角色"` + commonApi.Author + UserId int `p:"userId" v:"required#用户ID必须"` + AdminRole []int `p:"adminRole" dc:"管理员所绑定的角色 [1,2]"` // 管理员角色 + ConstructionRole []int `p:"constructionRole" dc:"施工人员所绑定的角色 [7,8]"` // 施工人员角色 +} + +// AppUserRolesBindRes 给用户绑定角色返回 +type AppUserRolesBindRes struct { + commonApi.EmptyRes +} + +// AppUserRolesGetRolesReq 获取用户的角色 +type AppUserRolesGetRolesReq struct { + g.Meta `path:"/getUserRoles" tags:"app用户角色关联" method:"get" summary:"获取用户的角色"` + UserID int `p:"userId" v:"required#用户ID必须"` + commonApi.Author +} + +// AppUserRolesGetRolesRes 获取用户的角色返回 +type AppUserRolesGetRolesRes struct { + g.Meta `mime:"application/json"` + // 管理员角色 + AdminRole []model.Ruler `json:"adminRole"` + // 施工人员角色 + ConstructionRole []model.Ruler `json:"constructionRole"` +} + +// 返回所有管理员角色和施工人员角色 +type AppUserRolesGetAllRolesReq struct { + g.Meta `path:"/getAllRoles" tags:"app用户角色关联" method:"get" summary:"获取所有角色"` + commonApi.Author +} + +type AppUserRolesGetAllRolesRes struct { + g.Meta `mime:"application/json"` + // 管理员角色 + AdminRole []model.AppRoles `json:"adminRole"` + // 施工人员角色 + ConstructionRole []model.AppRoles `json:"constructionRole"` +} diff --git a/api/v1/system/big_upload.go b/api/v1/system/big_upload.go new file mode 100644 index 0000000..6a789ec --- /dev/null +++ b/api/v1/system/big_upload.go @@ -0,0 +1,38 @@ +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/library/upload_chunk" +) + +// 上传文件 +type BigUploadReq struct { + g.Meta `path:"/bigUpload/upload" tags:"后台大文件上传" method:"post" summary:"上传文件"` + upload_chunk.UploadReq +} + +type BigUploadRes struct { + upload_chunk.UpLoadRes +} + +// 上传文件检查 +type BigUploadCheckReq struct { + g.Meta `path:"/bigUpload/upload" tags:"后台大文件上传" method:"get" summary:"上传文件检查"` + upload_chunk.UploadReq +} + +type BigUploadCheckRes struct { + upload_chunk.CheckRes + Identifier string `json:"identifier"` // 标识 + TotalChunks int `json:"totalChunks"` // 分片总数 +} + +// 上传文件合并 +type BigUploadMergeReq struct { + g.Meta `path:"/bigUpload/uploadMerge" tags:"后台大文件上传" method:"post" summary:"上传文件合并"` + upload_chunk.UploadReq +} + +type BigUploadMergeRes struct { + upload_chunk.MergeRes +} diff --git a/api/v1/system/bus_attendance_machine.go b/api/v1/system/bus_attendance_machine.go new file mode 100644 index 0000000..6bc70d8 --- /dev/null +++ b/api/v1/system/bus_attendance_machine.go @@ -0,0 +1,183 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2025-03-03 10:32:47 +// 生成路径: api/v1/system/bus_attendance_machine.go +// 生成人:gfast +// desc:考勤机相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusAttendanceMachineSearchReq 分页请求参数 +type BusAttendanceMachineSearchReq struct { + g.Meta `path:"/list" tags:"考勤机" method:"get" summary:"考勤机列表"` + ProjectId string `p:"projectId" dc:"项目ID"` + Sn string `p:"sn" dc:"设备sn"` + commonApi.PageReq + commonApi.Author +} + +// BusAttendanceMachineSearchRes 列表返回结果 +type BusAttendanceMachineSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusAttendanceMachineExtendRes `json:"list"` +} + +// BusAttendanceMachineAddReq 添加操作请求参数 +type BusAttendanceMachineAddReq struct { + g.Meta `path:"/add" tags:"考勤机" method:"post" summary:"考勤机添加"` + commonApi.Author + ProjectId uint64 `p:"projectId" v:"required#项目ID不能为空"` + Sn string `p:"sn" v:"required#设备sn不能为空"` + Teams string `p:"teams" ` + CreateBy string `p:"createBy" ` + Remark string `p:"remark" ` +} + +// BusAttendanceMachineAddRes 添加操作返回结果 +type BusAttendanceMachineAddRes struct { + commonApi.EmptyRes +} + +// BusAttendanceMachineEditReq 修改操作请求参数 +type BusAttendanceMachineEditReq struct { + g.Meta `path:"/edit" tags:"考勤机" method:"put" summary:"考勤机修改"` + commonApi.Author + Sn string `p:"sn" v:"required#设备sn不能为空"` + Id uint64 `p:"id" v:"required#主键ID不能为空"` + ProjectId uint64 `p:"projectId" v:"required#项目ID不能为空"` + Teams string `p:"teams" dc:"班组ID(多个逗号分割)" v:"required#班组ID不能为空"` + Remark string `p:"remark" dc:"备注"` +} + +// BusAttendanceMachineEditRes 修改操作返回结果 +type BusAttendanceMachineEditRes struct { + commonApi.EmptyRes +} + +// BusAttendanceMachineGetReq 获取一条数据请求 +type BusAttendanceMachineGetReq struct { + g.Meta `path:"/get" tags:"考勤机" method:"get" summary:"获取考勤机信息"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusAttendanceMachineGetRes 获取一条数据结果 +type BusAttendanceMachineGetRes struct { + g.Meta `mime:"application/json"` + *model.BusAttendanceMachineExtendRes +} + +// BusAttendanceMachineDeleteReq 删除数据请求 +type BusAttendanceMachineDeleteReq struct { + g.Meta `path:"/delete" tags:"考勤机" method:"delete" summary:"删除考勤机"` + commonApi.Author + Ids []uint64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusAttendanceMachineDeleteRes 删除数据返回 +type BusAttendanceMachineDeleteRes struct { + commonApi.EmptyRes +} + +/** +=============================================================== +=============================================================== +=============================================================== +*/ + +type BusAttendanceMachineRegisterReq struct { + g.Meta `path:"/busAttendanceMachineRegister" tags:"考勤机" method:"post" summary:"考勤机注册"` + commonApi.Author + Sn string `p:"sn" v:"required#设备sn不能为空"` + Remark string `p:"remark" ` +} +type BusAttendanceMachineRegisterRes struct { + commonApi.EmptyRes +} + +type BusAttendanceMachineChangeReq struct { + g.Meta `path:"/busAttendanceMachineChange" tags:"考勤机" method:"post" summary:"变更考勤机状态"` + commonApi.Author + Sn string `p:"sn" v:"required#设备sn不能为空"` + Status string `p:"status" dc:"考勤机在线状态"` +} +type BusAttendanceMachineChangeRes struct { + commonApi.EmptyRes +} + +type BindUserInformationToDevicesInBatchesReq struct { + g.Meta `path:"/bindUserInformationToDevicesInBatches" tags:"考勤机" method:"post" summary:"将用户信息与考勤机绑定"` + commonApi.Author + Bind []BindUserInformationToDevicesInBatchesTwoReq `p:"bind" v:"required#用户信息"` +} + +type BindUserInformationToDevicesInBatchesTwoReq struct { + MachineId int64 `p:"machineId" v:"required#考勤机ID不能为空"` + TeamId int64 `p:"teamId" v:"required#班组ID不能为空"` + UserId string `p:"userId" v:"required#用户ID不能为空"` +} + +type BindUserInformationToDevicesInBatchesRes struct { + commonApi.EmptyRes +} + +type SendTheUserInformationToTheAttendanceMachineReq struct { + g.Meta `path:"/sendTheUserInformationToTheAttendanceMachine" tags:"考勤机" method:"post" summary:"将用户信息下发到考勤机上"` + commonApi.Author + Sn string `p:"sn" dc:"设备唯一标识" v:"required#sn不能为空"` + MachineId string `p:"machineId" dc:"自增id" v:"required#machineIdsn不能为空"` + Type int `p:"type" dc:"1全部 2批量 3指定" v:"between:1,3#参数传递为1~3"` + UserId []string `p:"userId" dc:"type为1不传递 2传递部分 3传递一个"` +} + +type SendTheUserInformationToTheAttendanceMachineRes struct { + commonApi.EmptyRes +} + +type DeleteTheUserBoundToTheAttendanceMachineAndDeviceReq struct { + g.Meta `path:"/deleteTheUserBoundToTheAttendanceMachineAndDevice" tags:"考勤机" method:"post" summary:"将考勤机和设备绑定的用户删除掉"` + commonApi.Author + Sn string `p:"sn" dc:"设备唯一标识" v:"required#sn不能为空"` + MachineId string `p:"machineId" dc:"自增id" v:"required#machineIdsn不能为空"` + TeamId int64 `p:"teamId" v:"required#班组ID不能为空"` + UserId string `p:"userId" dc:"用户openid" v:"required#用户openid不能为空"` +} + +type DeleteTheUserBoundToTheAttendanceMachineAndDeviceRes struct { + commonApi.EmptyRes +} + +type ObtainInformationAboutPersonnelAssociatedWithTheAttendanceDeviceReq struct { + g.Meta `path:"/obtainInformationAboutPersonnelAssociatedWithTheAttendanceDevice" tags:"考勤机" method:"get" summary:"获取考勤设备关联的人员信息"` + Sn string `p:"sn" dc:"设备唯一标识" v:"required#sn不能为空"` + MachineId string `p:"machineId" dc:"自增id" v:"required#machineIdsn不能为空"` + TeamId string `p:"teamId" dc:"班组ID" v:"required#班组ID不能为空"` + UserName string `p:"name" dc:"用户名称"` + commonApi.Paging + commonApi.PageReq + commonApi.Author +} + +type ObtainInformationAboutPersonnelAssociatedWithTheAttendanceDeviceRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + UserList []*ObtainInformationAboutPersonnelAssociatedWithTheAttendanceDeviceTwo `p:"userList" dc:"用户信息列表"` +} + +type ObtainInformationAboutPersonnelAssociatedWithTheAttendanceDeviceTwo struct { + Openid string `p:"openid" dc:"用户openId"` + UserName string `p:"userName" dc:"用户名称"` + TeamId string `p:"teamId" dc:"班组ID"` + PacePhoto string `p:"pacePhoto" dc:"人脸照"` + XFStatus string `p:"xFStatus" dc:"是否已绑定设备(1绑定 0未绑定)"` + Status string `p:"status" dc:"是否存在考勤设备中(1存在 0不存在)"` +} diff --git a/api/v1/system/bus_attendance_machine_user.go b/api/v1/system/bus_attendance_machine_user.go new file mode 100644 index 0000000..3f9142a --- /dev/null +++ b/api/v1/system/bus_attendance_machine_user.go @@ -0,0 +1,92 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2025-03-03 10:33:17 +// 生成路径: api/v1/system/bus_attendance_machine_user.go +// 生成人:gfast +// desc:考勤机用户列相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusAttendanceMachineUserSearchReq 分页请求参数 +type BusAttendanceMachineUserSearchReq struct { + g.Meta `path:"/list" tags:"考勤机用户列" method:"get" summary:"考勤机用户列列表"` + Id string `p:"id"` //主键ID + MachineId string `p:"machineId" v:"machineId@integer#考勤机主键ID需为整数"` //考勤机主键ID + TeamId string `p:"teamId" v:"teamId@integer#班组ID需为整数"` //班组ID + UserId string `p:"userId" v:"userId@integer#用户ID需为整数"` //用户ID + Identifying string `p:"identifying" v:"identifying@integer#标识(是否下发)需为整数"` //标识(是否下发) + commonApi.PageReq + commonApi.Author +} + +// BusAttendanceMachineUserSearchRes 列表返回结果 +type BusAttendanceMachineUserSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusAttendanceMachineUserListRes `json:"list"` +} + +// BusAttendanceMachineUserAddReq 添加操作请求参数 +type BusAttendanceMachineUserAddReq struct { + g.Meta `path:"/add" tags:"考勤机用户列" method:"post" summary:"考勤机用户列添加"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + MachineId int64 `p:"machineId" ` + TeamId int64 `p:"teamId" ` + UserId int64 `p:"userId" ` + Identifying int `p:"identifying" ` +} + +// BusAttendanceMachineUserAddRes 添加操作返回结果 +type BusAttendanceMachineUserAddRes struct { + commonApi.EmptyRes +} + +// BusAttendanceMachineUserEditReq 修改操作请求参数 +type BusAttendanceMachineUserEditReq struct { + g.Meta `path:"/edit" tags:"考勤机用户列" method:"put" summary:"考勤机用户列修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + MachineId int64 `p:"machineId" ` + TeamId int64 `p:"teamId" ` + UserId int64 `p:"userId" ` + Identifying int `p:"identifying" ` +} + +// BusAttendanceMachineUserEditRes 修改操作返回结果 +type BusAttendanceMachineUserEditRes struct { + commonApi.EmptyRes +} + +// BusAttendanceMachineUserGetReq 获取一条数据请求 +type BusAttendanceMachineUserGetReq struct { + g.Meta `path:"/get" tags:"考勤机用户列" method:"get" summary:"获取考勤机用户列信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusAttendanceMachineUserGetRes 获取一条数据结果 +type BusAttendanceMachineUserGetRes struct { + g.Meta `mime:"application/json"` + *model.BusAttendanceMachineUserInfoRes +} + +// BusAttendanceMachineUserDeleteReq 删除数据请求 +type BusAttendanceMachineUserDeleteReq struct { + g.Meta `path:"/delete" tags:"考勤机用户列" method:"delete" summary:"删除考勤机用户列"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusAttendanceMachineUserDeleteRes 删除数据返回 +type BusAttendanceMachineUserDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_camera_channel.go b/api/v1/system/bus_camera_channel.go new file mode 100644 index 0000000..5a2ca67 --- /dev/null +++ b/api/v1/system/bus_camera_channel.go @@ -0,0 +1,106 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-09-20 14:55:42 +// 生成路径: api/v1/system/bus_camera_channel.go +// 生成人:gfast +// desc:摄像头(国标通道)相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusCameraChannelSearchReq 分页请求参数 +type BusCameraChannelSearchReq struct { + g.Meta `path:"/list" tags:"摄像头(国标通道)" method:"get" summary:"摄像头(国标通道)列表"` + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + CountryId string `p:"countryId"` //国标ID + ChannelNumber string `p:"channelNumber"` //国标通道号 + ChannelName string `p:"channelName"` //通道名称 + ChannelFormat string `p:"channelFormat"` //视频格式(字典) + ChannelState string `p:"channelState"` //在线状态(字典) + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusCameraChannelSearchRes 列表返回结果 +type BusCameraChannelSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusCameraChannelListRes `json:"list"` +} + +// BusCameraChannelAddReq 添加操作请求参数 +type BusCameraChannelAddReq struct { + g.Meta `path:"/add" tags:"摄像头(国标通道)" method:"post" summary:"摄像头(国标通道)添加"` + commonApi.Author + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + CountryId int64 `p:"countryId" v:"required#摄像头ID不能为空"` + ChannelNumber string `p:"channelNumber" v:"required#国标通道号不能为空"` + ChannelName string `p:"channelName" v:"required#通道名称不能为空"` + ChannelPath string `p:"channelPath" ` + ChannelFormat string `p:"channelFormat" ` + ChannelState string `p:"channelState" ` + Remark string `p:"remark" ` + Imei string `p:"imei" dc:"识别码"` + Iccid string `p:"iccid" dc:"序列号"` +} + +// BusCameraChannelAddRes 添加操作返回结果 +type BusCameraChannelAddRes struct { + commonApi.EmptyRes +} + +// BusCameraChannelEditReq 修改操作请求参数 +type BusCameraChannelEditReq struct { + g.Meta `path:"/edit" tags:"摄像头(国标通道)" method:"put" summary:"摄像头(国标通道)修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + CountryId int64 `p:"countryId" v:"required#摄像头ID不能为空"` + ChannelNumber string `p:"channelNumber" v:"required#国标通道号不能为空"` + ChannelName string `p:"channelName" v:"required#通道名称不能为空"` + ChannelPath string `p:"channelPath" ` + ChannelFormat string `p:"channelFormat" ` + ChannelState string `p:"channelState" ` + Remark string `p:"remark" ` + Detail string `p:"detail" ` + Imei string `p:"imei" dc:"识别码"` + Iccid string `p:"iccid" dc:"序列号"` +} + +// BusCameraChannelEditRes 修改操作返回结果 +type BusCameraChannelEditRes struct { + commonApi.EmptyRes +} + +// BusCameraChannelGetReq 获取一条数据请求 +type BusCameraChannelGetReq struct { + g.Meta `path:"/get" tags:"摄像头(国标通道)" method:"get" summary:"获取摄像头(国标通道)信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusCameraChannelGetRes 获取一条数据结果 +type BusCameraChannelGetRes struct { + g.Meta `mime:"application/json"` + *model.BusCameraChannelInfoRes +} + +// BusCameraChannelDeleteReq 删除数据请求 +type BusCameraChannelDeleteReq struct { + g.Meta `path:"/delete" tags:"摄像头(国标通道)" method:"delete" summary:"删除摄像头(国标通道)"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusCameraChannelDeleteRes 删除数据返回 +type BusCameraChannelDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_camera_chinese_standard.go b/api/v1/system/bus_camera_chinese_standard.go new file mode 100644 index 0000000..688b613 --- /dev/null +++ b/api/v1/system/bus_camera_chinese_standard.go @@ -0,0 +1,90 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-09-20 14:55:24 +// 生成路径: api/v1/system/bus_camera_chinese_standard.go +// 生成人:gfast +// desc:摄像头(国标)相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusCameraChineseStandardSearchReq 分页请求参数 +type BusCameraChineseStandardSearchReq struct { + g.Meta `path:"/list" tags:"摄像头(国标)" method:"get" summary:"摄像头(国标)列表"` + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + CountryNumber string `p:"countryNumber"` //国标号 + CountryName string `p:"countryName"` //摄像头名称 + CountryState string `p:"countryState"` //在线状态(字典) + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusCameraChineseStandardSearchRes 列表返回结果 +type BusCameraChineseStandardSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusCameraChineseStandardListRes `json:"list"` +} + +// BusCameraChineseStandardAddReq 添加操作请求参数 +type BusCameraChineseStandardAddReq struct { + g.Meta `path:"/add" tags:"摄像头(国标)" method:"post" summary:"摄像头(国标)添加"` + commonApi.Author + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + CountryNumber string `p:"countryNumber" v:"required#国标号不能为空"` + CountryName string `p:"countryName" v:"required#摄像头名称不能为空"` +} + +// BusCameraChineseStandardAddRes 添加操作返回结果 +type BusCameraChineseStandardAddRes struct { + commonApi.EmptyRes +} + +// BusCameraChineseStandardEditReq 修改操作请求参数 +type BusCameraChineseStandardEditReq struct { + g.Meta `path:"/edit" tags:"摄像头(国标)" method:"put" summary:"摄像头(国标)修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + CountryNumber string `p:"countryNumber" ` + CountryName string `p:"countryName" v:"required#摄像头名称不能为空"` + CountryState string `p:"countryState" ` +} + +// BusCameraChineseStandardEditRes 修改操作返回结果 +type BusCameraChineseStandardEditRes struct { + commonApi.EmptyRes +} + +// BusCameraChineseStandardGetReq 获取一条数据请求 +type BusCameraChineseStandardGetReq struct { + g.Meta `path:"/get" tags:"摄像头(国标)" method:"get" summary:"获取摄像头(国标)信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusCameraChineseStandardGetRes 获取一条数据结果 +type BusCameraChineseStandardGetRes struct { + g.Meta `mime:"application/json"` + *model.BusCameraChineseStandardInfoRes +} + +// BusCameraChineseStandardDeleteReq 删除数据请求 +type BusCameraChineseStandardDeleteReq struct { + g.Meta `path:"/delete" tags:"摄像头(国标)" method:"delete" summary:"删除摄像头(国标)"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusCameraChineseStandardDeleteRes 删除数据返回 +type BusCameraChineseStandardDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_category.go b/api/v1/system/bus_category.go new file mode 100644 index 0000000..1863dae --- /dev/null +++ b/api/v1/system/bus_category.go @@ -0,0 +1,82 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-10-07 15:52:19 +// 生成路径: api/v1/system/bus_category.go +// 生成人:gfast +// desc:题库_题库类别相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusCategorySearchReq 分页请求参数 +type BusCategorySearchReq struct { + g.Meta `path:"/list" tags:"题库_题库类别" method:"get" summary:"题库_题库类别列表"` + Id string `p:"id"` //序号 + CategoryName string `p:"categoryName"` //题库类别 + commonApi.PageReq + commonApi.Author +} + +// BusCategorySearchRes 列表返回结果 +type BusCategorySearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusCategoryListRes `json:"list"` +} + +// BusCategoryAddReq 添加操作请求参数 +type BusCategoryAddReq struct { + g.Meta `path:"/add" tags:"题库_题库类别" method:"post" summary:"题库_题库类别添加"` + commonApi.Author + CategoryName string `p:"categoryName" v:"required#题库类别不能为空"` +} + +// BusCategoryAddRes 添加操作返回结果 +type BusCategoryAddRes struct { + commonApi.EmptyRes +} + +// BusCategoryEditReq 修改操作请求参数 +type BusCategoryEditReq struct { + g.Meta `path:"/edit" tags:"题库_题库类别" method:"put" summary:"题库_题库类别修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + CategoryName string `p:"categoryName" v:"required#题库类别不能为空"` +} + +// BusCategoryEditRes 修改操作返回结果 +type BusCategoryEditRes struct { + commonApi.EmptyRes +} + +// BusCategoryGetReq 获取一条数据请求 +type BusCategoryGetReq struct { + g.Meta `path:"/get" tags:"题库_题库类别" method:"get" summary:"获取题库_题库类别信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusCategoryGetRes 获取一条数据结果 +type BusCategoryGetRes struct { + g.Meta `mime:"application/json"` + *model.BusCategoryInfoRes +} + +// BusCategoryDeleteReq 删除数据请求 +type BusCategoryDeleteReq struct { + g.Meta `path:"/delete" tags:"题库_题库类别" method:"delete" summary:"删除题库_题库类别"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusCategoryDeleteRes 删除数据返回 +type BusCategoryDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_company.go b/api/v1/system/bus_company.go new file mode 100644 index 0000000..3737e0e --- /dev/null +++ b/api/v1/system/bus_company.go @@ -0,0 +1,103 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-28 14:08:14 +// 生成路径: api/v1/system/bus_company.go +// 生成人:gfast +// desc:公司相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusCompanySearchReq 分页请求参数 +type BusCompanySearchReq struct { + g.Meta `path:"/list" tags:"公司" method:"get" summary:"公司列表"` + CompanyId string `p:"companyId"` //序号 + CompanyName string `p:"companyName"` //公司名称 + Status string `p:"status"` //帐号状态 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusCompanySearchRes 列表返回结果 +type BusCompanySearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusCompanyListRes `json:"list"` +} + +// BusCompanyAddReq 添加操作请求参数 +type BusCompanyAddReq struct { + g.Meta `path:"/add" tags:"公司" method:"post" summary:"公司添加"` + commonApi.Author + CompanyName string `p:"companyName" v:"required#公司名称不能为空"` + Status string `p:"status" v:"required#帐号状态不能为空"` + UpdateBy string `p:"updateBy" ` +} + +// BusCompanyAddRes 添加操作返回结果 +type BusCompanyAddRes struct { + commonApi.EmptyRes +} + +// BusCompanyEditReq 修改操作请求参数 +type BusCompanyEditReq struct { + g.Meta `path:"/edit" tags:"公司" method:"put" summary:"公司修改"` + commonApi.Author + CompanyId int64 `p:"companyId" v:"required#主键ID不能为空"` + CompanyName string `p:"companyName" v:"required#公司名称不能为空"` + Status string `p:"status" v:"required#帐号状态不能为空"` + UpdateBy string `p:"updateBy" ` +} + +// BusCompanyEditRes 修改操作返回结果 +type BusCompanyEditRes struct { + commonApi.EmptyRes +} + +// BusCompanyGetReq 获取一条数据请求 +type BusCompanyGetReq struct { + g.Meta `path:"/get" tags:"公司" method:"get" summary:"获取公司信息"` + commonApi.Author + CompanyId int64 `p:"companyId" v:"required#主键必须"` //通过主键获取 +} + +// BusCompanyGetRes 获取一条数据结果 +type BusCompanyGetRes struct { + g.Meta `mime:"application/json"` + *model.BusCompanyInfoRes +} + +// BusCompanyDeleteReq 删除数据请求 +type BusCompanyDeleteReq struct { + g.Meta `path:"/delete" tags:"公司" method:"delete" summary:"删除公司"` + commonApi.Author + CompanyIds []int64 `p:"companyIds" v:"required#主键必须"` //通过主键删除 +} + +// BusCompanyDeleteRes 删除数据返回 +type BusCompanyDeleteRes struct { + commonApi.EmptyRes +} + +//app + +// BusCompanyAppSearchReq分页请求参数 +type BusCompanyAppSearchReq struct { + g.Meta `path:"/applist" tags:"材料设备App" method:"get" summary:"公司app列表"` + commonApi.Author +} + +// BusCompanyAppSearchRes 列表返回结果 +type BusCompanyAppSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusCompanyAppListRes `json:"list"` +} diff --git a/api/v1/system/bus_complaint_box.go b/api/v1/system/bus_complaint_box.go new file mode 100644 index 0000000..9f2a8c6 --- /dev/null +++ b/api/v1/system/bus_complaint_box.go @@ -0,0 +1,94 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-12-04 18:09:50 +// 生成路径: api/v1/system/bus_complaint_box.go +// 生成人:gfast +// desc:意见箱相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusComplaintBoxSearchReq 分页请求参数 +type BusComplaintBoxSearchReq struct { + g.Meta `path:"/list" tags:"意见箱" method:"get" summary:"意见箱列表"` + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` // 项目id + Openid string `p:"openid"` // openid + Status string `p:"status"` // 状态(0未读,1已读) + Dispose string `p:"dispose" v:"dispose@datetime#处理时间需为YYYY-MM-DD hh:mm:ss格式"` // 处理时间 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` // 创建时间 + Phone string `p:"phone"` // 手机号 + commonApi.PageReq + commonApi.Author +} + +// BusComplaintBoxSearchRes 列表返回结果 +type BusComplaintBoxSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusComplaintBoxListRes `json:"list"` +} + +//// BusComplaintBoxAddReq 添加操作请求参数 +//type BusComplaintBoxAddReq struct { +// g.Meta `path:"/add" tags:"意见箱" method:"post" summary:"意见箱添加"` +// commonApi.Author +// ProjectId int64 `p:"projectId" ` +// Openid string `p:"openid" ` +// Opinion string `p:"opinion" ` +//} +// +//// BusComplaintBoxAddRes 添加操作返回结果 +//type BusComplaintBoxAddRes struct { +// commonApi.EmptyRes +//} + +// BusComplaintBoxEditReq 修改操作请求参数 +type BusComplaintBoxEditReq struct { + g.Meta `path:"/edit" tags:"意见箱" method:"put" summary:"意见箱修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + ProjectId int64 `p:"projectId" ` + Openid string `p:"openid" ` + Opinion string `p:"opinion" v:"max-length:512#最大输入字数为512"` + Status string `p:"status" v:"required#状态(0未读,1已读)不能为空"` + Dispose *gtime.Time `p:"dispose" ` + Remark string `p:"remark" v:"max-length:512#最大输入字数为512"` +} + +// BusComplaintBoxEditRes 修改操作返回结果 +type BusComplaintBoxEditRes struct { + commonApi.EmptyRes +} + +// BusComplaintBoxGetReq 获取一条数据请求 +type BusComplaintBoxGetReq struct { + g.Meta `path:"/get" tags:"意见箱" method:"get" summary:"获取意见箱信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// BusComplaintBoxGetRes 获取一条数据结果 +type BusComplaintBoxGetRes struct { + g.Meta `mime:"application/json"` + *model.BusComplaintBoxInfoRes +} + +// BusComplaintBoxDeleteReq 删除数据请求 +type BusComplaintBoxDeleteReq struct { + g.Meta `path:"/delete" tags:"意见箱" method:"delete" summary:"删除意见箱"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// BusComplaintBoxDeleteRes 删除数据返回 +type BusComplaintBoxDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_construction_blacklist.go b/api/v1/system/bus_construction_blacklist.go new file mode 100644 index 0000000..9484598 --- /dev/null +++ b/api/v1/system/bus_construction_blacklist.go @@ -0,0 +1,88 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-11-10 14:08:39 +// 生成路径: api/v1/system/bus_construction_blacklist.go +// 生成人:gfast +// desc:黑名单相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusConstructionBlacklistSearchReq 分页请求参数 +type BusConstructionBlacklistSearchReq struct { + g.Meta `path:"/list" tags:"黑名单" method:"get" summary:"黑名单列表"` + Name string `p:"name"` //名字 + SfzNumber string `p:"sfzNumber"` //身份证号码 + CreatedAt string `p:"createdAt" v:"createdAt@date#创建时间需为YYYY-MM-DD格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusConstructionBlacklistSearchRes 列表返回结果 +type BusConstructionBlacklistSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusConstructionBlacklistListRes `json:"list"` +} + +// BusConstructionBlacklistAddReq 添加操作请求参数 +type BusConstructionBlacklistAddReq struct { + g.Meta `path:"/add" tags:"黑名单" method:"post" summary:"黑名单添加"` + commonApi.Author + Openid string `p:"openid" v:"required#主键ID不能为空"` + Name string `p:"name" v:"required#名字不能为空"` + SfzNumber string `p:"sfzNumber" v:"required#身份证号码不能为空"` + Remark string `p:"remark" ` +} + +// BusConstructionBlacklistAddRes 添加操作返回结果 +type BusConstructionBlacklistAddRes struct { + commonApi.EmptyRes +} + +// BusConstructionBlacklistGetReq 获取一条数据请求 +type BusConstructionBlacklistGetReq struct { + g.Meta `path:"/get" tags:"黑名单" method:"get" summary:"获取黑名单信息"` + commonApi.Author + Openid string `p:"openid" v:"required#主键必须"` //通过主键获取 +} + +// BusConstructionBlacklistGetRes 获取一条数据结果 +type BusConstructionBlacklistGetRes struct { + g.Meta `mime:"application/json"` + *model.BusConstructionBlacklistInfoRes +} + +// BusConstructionBlacklistDeleteReq 删除数据请求 +type BusConstructionBlacklistDeleteReq struct { + g.Meta `path:"/delete" tags:"黑名单" method:"delete" summary:"删除黑名单"` + commonApi.Author + Openids []string `p:"openids" v:"required#主键必须"` //通过主键删除 +} + +// BusConstructionBlacklistDeleteRes 删除数据返回 +type BusConstructionBlacklistDeleteRes struct { + commonApi.EmptyRes +} + +// BlackListReq 黑名单人员列表查询 +type BlackListReq struct { + g.Meta `path:"/blackList" tags:"黑名单" method:"get" summary:"添加用户列表"` + SfzNumber string `p:"sfzNumber" dc:"身份证号码"` //身份证号码 + commonApi.PageReq + commonApi.Author +} + +// BlackListRes 黑名单人员列表查询 +type BlackListRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.ModBlackListRes `json:"list"` +} diff --git a/api/v1/system/bus_construction_log.go b/api/v1/system/bus_construction_log.go new file mode 100644 index 0000000..80f55ca --- /dev/null +++ b/api/v1/system/bus_construction_log.go @@ -0,0 +1,94 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-03-22 16:27:43 +// 生成路径: api/v1/system/bus_construction_log.go +// 生成人:gfast +// desc:施工日志相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusConstructionLogSearchReq 分页请求参数 +type BusConstructionLogSearchReq struct { + g.Meta `path:"/list" tags:"施工日志" method:"get" summary:"施工日志列表"` + //Id string `p:"id"` + //ProjectName string `p:"projectName"` + ProjectId int64 `p:"projectId" dc:"项目id"` + DateOfOccurrence string `p:"dateOfOccurrence" dc:"发生日期筛选" v:"date-format:Y-m-d#时间格式错误!"` + commonApi.PageReq + commonApi.Author +} + +// BusConstructionLogSearchRes 列表返回结果 +type BusConstructionLogSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.AppletDetails `json:"list"` +} + +// BusConstructionLogAddReq 添加操作请求参数 +type BusConstructionLogAddReq struct { + g.Meta `path:"/add" tags:"施工日志" method:"post" summary:"施工日志添加"` + commonApi.Author + ProjectId int64 `p:"projectId" ` + DateOfOccurrence string `p:"dateOfOccurrence" ` + Condition string `p:"condition" ` + TechnologyQuality string `p:"technologyQuality" ` + Remark string `p:"remark" ` + Path string `p:"path" ` + CreatedBy uint64 +} + +// BusConstructionLogAddRes 添加操作返回结果 +type BusConstructionLogAddRes struct { + commonApi.EmptyRes +} + +// BusConstructionLogEditReq 修改操作请求参数 +type BusConstructionLogEditReq struct { + g.Meta `path:"/edit" tags:"施工日志" method:"put" summary:"施工日志修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + DateOfOccurrence string `p:"dateOfOccurrence" ` + Condition string `p:"condition" ` + TechnologyQuality string `p:"technologyQuality" ` + Remark string `p:"remark" ` + UpdatedBy uint64 +} + +// BusConstructionLogEditRes 修改操作返回结果 +type BusConstructionLogEditRes struct { + commonApi.EmptyRes +} + +// BusConstructionLogGetReq 获取一条数据请求 +type BusConstructionLogGetReq struct { + g.Meta `path:"/get" tags:"施工日志" method:"get" summary:"获取施工日志信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusConstructionLogGetRes 获取一条数据结果 +type BusConstructionLogGetRes struct { + g.Meta `mime:"application/json"` + DataEntity *model.AppletDetails `json:"dataEntity"` +} + +// BusConstructionLogDeleteReq 删除数据请求 +type BusConstructionLogDeleteReq struct { + g.Meta `path:"/delete" tags:"施工日志" method:"delete" summary:"删除施工日志"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusConstructionLogDeleteRes 删除数据返回 +type BusConstructionLogDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_construction_project.go b/api/v1/system/bus_construction_project.go new file mode 100644 index 0000000..3547ddb --- /dev/null +++ b/api/v1/system/bus_construction_project.go @@ -0,0 +1,85 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-07 10:17:50 +// 生成路径: api/v1/system/bus_construction_project.go +// 生成人:gfast +// desc:施工人员对应项目相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusConstructionProjectSearchReq 分页请求参数 +type BusConstructionProjectSearchReq struct { + g.Meta `path:"/list" tags:"施工人员对应项目" method:"get" summary:"施工人员对应项目列表"` + Id string `p:"id"` //序号 + ConstructionUserId string `p:"constructionUserId" v:"constructionUserId@integer#微信用户id需为整数"` //微信用户id + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` //项目id + commonApi.PageReq + commonApi.Author +} + +// BusConstructionProjectSearchRes 列表返回结果 +type BusConstructionProjectSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusConstructionProjectListRes `json:"list"` +} + +// BusConstructionProjectAddReq 添加操作请求参数 +type BusConstructionProjectAddReq struct { + g.Meta `path:"/add" tags:"施工人员对应项目" method:"post" summary:"施工人员对应项目添加"` + commonApi.Author + ConstructionUserId int64 `p:"constructionUserId" ` + ProjectId int64 `p:"projectId" ` +} + +// BusConstructionProjectAddRes 添加操作返回结果 +type BusConstructionProjectAddRes struct { + commonApi.EmptyRes +} + +// BusConstructionProjectEditReq 修改操作请求参数 +type BusConstructionProjectEditReq struct { + g.Meta `path:"/edit" tags:"施工人员对应项目" method:"put" summary:"施工人员对应项目修改"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键ID不能为空"` + ConstructionUserId int64 `p:"constructionUserId" ` + ProjectId int64 `p:"projectId" ` +} + +// BusConstructionProjectEditRes 修改操作返回结果 +type BusConstructionProjectEditRes struct { + commonApi.EmptyRes +} + +// BusConstructionProjectGetReq 获取一条数据请求 +type BusConstructionProjectGetReq struct { + g.Meta `path:"/get" tags:"施工人员对应项目" method:"get" summary:"获取施工人员对应项目信息"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusConstructionProjectGetRes 获取一条数据结果 +type BusConstructionProjectGetRes struct { + g.Meta `mime:"application/json"` + *model.BusConstructionProjectInfoRes +} + +// BusConstructionProjectDeleteReq 删除数据请求 +type BusConstructionProjectDeleteReq struct { + g.Meta `path:"/delete" tags:"施工人员对应项目" method:"delete" summary:"删除施工人员对应项目"` + commonApi.Author + Ids []uint64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusConstructionProjectDeleteRes 删除数据返回 +type BusConstructionProjectDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_construction_user.go b/api/v1/system/bus_construction_user.go new file mode 100644 index 0000000..97c6a3a --- /dev/null +++ b/api/v1/system/bus_construction_user.go @@ -0,0 +1,382 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-07 10:31:18 +// 生成路径: api/v1/system/bus_construction_user.go +// 生成人:gfast +// desc:施工人员相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + wxModel "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" +) + +// ExportDataFuncReq 分页请求参数 +type ExportDataFuncReq struct { + g.Meta `path:"/list" tags:"施工人员" method:"get" summary:"施工人员列表"` + ProjectId string `p:"projectId" dc:"导出所有"` //项目id + Openid []string `p:"openid" dc:"根据openid导出"` //项目id + commonApi.Author +} + +// ExportDataFuncRes 列表返回结果 +type ExportDataFuncRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusConstructionUserListRes `json:"list"` +} + +// BusConstructionUserSearchReq 分页请求参数 +type BusConstructionUserSearchReq struct { + g.Meta `path:"/list" tags:"施工人员" method:"get" summary:"施工人员列表"` + NickName string `p:"nickName"` //微信名称 + UserName string `p:"userName"` //人员姓名 + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` //项目id + Status string `p:"status"` //状态 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + Phone string `p:"phone"` //电话 + Sex string `p:"sex"` //性别 + SfzNation string `p:"sfzNation"` //身份证民族 + NativePlace string `p:"nativePlace"` //籍贯 + commonApi.PageReq + commonApi.Author +} + +// BusConstructionUserSearchRes 列表返回结果 +type BusConstructionUserSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusConstructionUserListRes `json:"list"` +} + +// BusConstructionUserAddReq 添加操作请求参数 +type BusConstructionUserAddReq struct { + g.Meta `path:"/add" tags:"施工人员" method:"post" summary:"施工人员添加"` + commonApi.Author + Openid string `p:"openid" ` + NickName string `p:"nickName" v:"required#微信名称不能为空"` + TeamId int64 `p:"teamId" ` + HeadIcon string `p:"headIcon" ` + PacePhoto string `p:"pacePhoto" ` + UserName string `p:"userName" v:"required#人员姓名不能为空"` + ProjectId int64 `p:"projectId" ` + Status string `p:"status" v:"required#状态不能为空"` + IsPinch string `p:"isPinch" ` + IfManagement string `p:"ifManagement" ` + CreateBy string `p:"createBy" ` + UpdateBy string `p:"updateBy" ` + Phone string `p:"phone" ` + Sex string `p:"sex" ` + SfzNation string `p:"sfzNation" ` + SfzNumber string `p:"sfzNumber" ` + SfzStart string `p:"sfzStart" ` + SfzEnd string `p:"sfzEnd" ` + SfzSite string `p:"sfzSite" ` + NativePlace string `p:"nativePlace" ` + YhkNumber string `p:"yhkNumber" ` + YhkOpeningBank string `p:"yhkOpeningBank" ` + YhkCardholder string `p:"yhkCardholder" ` + ProjectRecord string `p:"projectRecord" ` + RoleIds []int64 `p:"roleIds" dc:"角色ID" v:"array"` +} + +// BusConstructionUserAddRes 添加操作返回结果 +type BusConstructionUserAddRes struct { + commonApi.EmptyRes +} + +// BusConstructionUserEditReq 修改操作请求参数 +type BusConstructionUserEditReq struct { + g.Meta `path:"/pcEdit" tags:"施工人员" method:"put" summary:"施工人员修改"` + commonApi.Author + WxOrPc string `p:"wxOrPc" dc:"参数为1表示pc添加 否则为小程序添加"` + SiteNum string `p:"siteNum" dc:"1入场时间 2离场时间 3或零值不操作"` + Id int64 `p:"id" v:"required#主键ID不能为空微信用户"` + Openid string `p:"openid" v:"required-unless:WxOrPc,1#需要填写小程序的openid"` + NickName string `p:"nickName" ` + //TeamId int64 `p:"teamId" ` + HeadIcon string `p:"headIcon" ` + PacePhoto string `p:"pacePhoto" ` + UserName string `p:"userName" v:"required#人员姓名不能为空"` + ProjectId int64 `p:"projectId" ` + Status string `p:"status" v:"required#状态不能为空"` + IsPinch string `p:"isPinch" ` + IfManagement string `p:"ifManagement" ` + CreateBy string `p:"createBy" ` + UpdateBy string `p:"updateBy" ` + Phone string `p:"phone" v:"phone"` + Sex string `p:"sex" ` + SfzNation string `p:"sfzNation" ` + SfzNumber string `p:"sfzNumber" ` + SfzStart string `p:"sfzStart" ` + SfzEnd string `p:"sfzEnd" ` + SfzSite string `p:"sfzSite" ` + NativePlace string `p:"nativePlace" ` + YhkNumber string `p:"yhkNumber" ` + YhkOpeningBank string `p:"yhkOpeningBank" ` + YhkCardholder string `p:"yhkCardholder" ` + SfzBirth string `p:"sfzBirth" ` + LabourserviceId int64 `p:"labourserviceId"` + TypeOfWork string `p:"typeOfWork"` + EntryDate string `p:"entryDate"` + LeaveDate string `p:"leaveDate"` + Clock string `p:"clock"` + PostReq *model.BusConstructionUserPostInfoRes `json:"postReq"` + ProjectListReq []*model.BusConstructionProjectListRes `json:"projectListReq"` + FilesListReq []*model.BusConstructionUserFileListRes `json:"filesListReq"` + ProjectRecord string `p:"projectRecord" ` + DevNum string `p:"devNum" dc:"安全帽标识"` + RoleIds []int64 `p:"roleIds" dc:"角色ID" v:"array"` +} + +// BusConstructionUserEditRes 修改操作返回结果 +type BusConstructionUserEditRes struct { + commonApi.EmptyRes +} + +// BusConstructionUserGetReq 获取一条数据请求 +type BusConstructionUserGetReq struct { + g.Meta `path:"/get" tags:"施工人员" method:"get" summary:"获取施工人员信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusConstructionUserGetRes 获取一条数据结果 +type BusConstructionUserGetRes struct { + g.Meta `mime:"application/json"` + *model.BusConstructionUserInfoRes +} + +// BusConstructionUserDeleteReq 删除数据请求 +type BusConstructionUserDeleteReq struct { + g.Meta `path:"/delete" tags:"施工人员" method:"delete" summary:"删除施工人员"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusConstructionUserDeleteRes 删除数据返回 +type BusConstructionUserDeleteRes struct { + commonApi.EmptyRes +} + +// BatchImportDataReq 批量导入施工人员的资料 +type BatchImportDataReq struct { + g.Meta `path:"/coryBatch" tags:"施工人员" method:"post" summary:"批量导入施工人员的资料(作废)"` + commonApi.Author + File *comModel.UpFile `p:"file"` +} + +// BatchImportDataRes 批量导入施工人员的资料 +type BatchImportDataRes struct { + commonApi.EmptyRes +} + +// ExportSalaryTeamReq 导出施工人员工资组成(项目) +type ExportSalaryTeamReq struct { + g.Meta `path:"/exportSalaryTeam" tags:"施工人员" method:"post" summary:"根据项目或班组导出出勤记录(项目)"` + commonApi.Author + //ProjectId int64 `p:"projectId" dc:"项目主键ID" v:"required#项目主键ID必须"` + //TeamId int64 `p:"teamId" dc:"班组主键ID" ` + //Years string `p:"years" dc:"时间格式为2024-02" v:"date-format:Y-m#格式为2024-02"` + + FuzzyQuery string `p:"fuzzyQuery" dc:"模糊查询" ` + ProjectId int64 `p:"projectId" dc:"项目ID" v:"required#项目ID不能为空"` + TeamId int64 `p:"teamId" dc:"班组ID"` + TypeOfWork string `p:"typeOfWork" dc:"工种"` + DateStr string `p:"dateStr" dc:"日期(格式:2024-04)" v:"date-format:Y-m#时间格式为2024-04"` +} + +// ExportSalaryReq 导出施工人员工资组成(班组) +type ExportSalaryReq struct { + g.Meta `path:"/exportSalary" tags:"施工人员" method:"post" summary:"根据项目或班组导出出勤记录(班组)"` + commonApi.Author + + FuzzyQuery string `p:"fuzzyQuery" dc:"模糊查询" ` + ProjectId int64 `p:"projectId" dc:"项目ID" v:"required#项目ID不能为空"` + TeamId int64 `p:"teamId" dc:"班组ID"` + TypeOfWork string `p:"typeOfWork" dc:"工种"` + DateStr string `p:"dateStr" dc:"日期(格式:2024-04)" v:"date-format:Y-m#时间格式为2024-04"` +} + +// ExportSalaryRes 导出施工人员工资组成 +type ExportSalaryRes struct { + commonApi.EmptyRes + AttendanceAllOne []model.AttendanceAllEntity `p:"attendanceAllOne" dc:"成员基本信息"` +} + +type SigningMessagesReq struct { + g.Meta `path:"/signingMessages" tags:"施工人员" method:"get" summary:"【签名】根据openid获取到指定小程序用户的签名信息"` + commonApi.Author + Openid string `p:"openid" dc:"openid" v:"required#施工人员openid不能为空"` +} +type SigningMessagesRes struct { + commonApi.EmptyRes + Signature *wxModel.BusConstructiomUserSignatureRes `p:"signature" dc:"签名信息"` +} + +type SigningUpdateFuncReq struct { + g.Meta `path:"/signingUpdate" tags:"施工人员" method:"put" summary:"【签名】修改指定签名的状态"` + commonApi.Author + Id string `p:"id" dc:"签名主键ID" v:"required#签名主键ID不能为空"` + Change string `p:"change" dc:"是否更改签名(1不更改 2更改)" v:"required#change状态不能为空"` +} +type SigningUpdateFuncRes struct { + commonApi.EmptyRes +} + +type OneClickOpenReq struct { + g.Meta `path:"/oneClickOpen" tags:"施工人员" method:"put" summary:"一键开启/关闭打开"` + commonApi.Author + Type string `p:"type" dc:"1开启 2关闭" v:"between:1,2#取值范围为1~2"` + ProjectId int64 `p:"projectId" dc:"项目ID" v:"required#项目主键ID必须"` +} +type OneClickOpenRes struct { + commonApi.EmptyRes +} +type ClockingConditionReq struct { + g.Meta `path:"/clockingCondition" tags:"施工人员" method:"put" summary:"开启/关闭打开(根据某个人操作)"` + commonApi.Author + Type string `p:"type" dc:"1开启 2关闭" v:"between:1,2#取值范围为1~2"` + Id int64 `p:"id" dc:"ID" v:"required#主键ID必须"` +} +type ClockingConditionRes struct { + commonApi.EmptyRes +} + +type TemplateExportReq struct { + g.Meta `path:"/templateExport" tags:"施工人员" method:"get" summary:"施工人员资料文件上传模板导出"` + ProjectId int64 `p:"projectId" v:"required#项目ID必须"` + commonApi.Author +} +type TemplateExportRes struct { + commonApi.EmptyRes + Path string `p:"path" dc:"zip路径"` +} + +type ZipFolderuploadReq struct { + g.Meta `path:"/zipFolderupload" tags:"施工人员" method:"post" summary:"批量上传施工人员的资料(压缩文件zip上传)"` + //File *ghttp.UploadFile `p:"file" ` + FilePath string `p:"filePath" ` + commonApi.Author +} +type ZipFolderuploadRes struct { + commonApi.EmptyRes +} + +type DepartureReq struct { + g.Meta `path:"/departure" tags:"施工人员" method:"post" summary:"离场(成员离开班组)"` + Id string `p:"id" dc:"班组成员主键ID" v:"required#班组成员主键ID必须"` + File []*ghttp.UploadFile `p:"file" dc:"附件"` + Remark string `p:"remark" dc:"备注" v:"max-length:512#最大输入字数为512"` + commonApi.Author +} +type DepartureRes struct { + commonApi.EmptyRes +} + +type DepartureRecordReq struct { + g.Meta `path:"/departureRecord" tags:"施工人员" method:"post" summary:"施工人员入场退场历史记录信息(根据身份证信息查询)"` + SfzNumber string `p:"sfzNumber" dc:"身份证号码" v:"required#身份证号码必须"` + commonApi.Author +} +type DepartureRecordRes struct { + commonApi.EmptyRes + List []model.BusConstructionUserDepartureInfoRes `p:"list"` +} + +type PcCollectDataForTwoWeeksReq struct { + g.Meta `path:"/pcCollectDataForTwoWeeks" tags:"施工人员" method:"get" summary:"获取最近两周的数据(统计全勤、半勤、缺勤)"` + commonApi.Author + ProjectId string `p:"projectId" dc:"项目ID" v:"required#项目ID不能为空"` +} + +type PcCollectDataForTwoWeeksRes struct { + commonApi.EmptyRes + List []*PcCollectDataForTwoWeeksTwoRes `json:"list"` +} + +type PcCollectDataForTwoWeeksTwoRes struct { + DateStr string `json:"dateStr" dc:"日期"` + Absenteeism int `json:"absenteeism" dc:"缺勤人数(下班未打卡)"` + HalfDuty int `json:"halfDuty" dc:"半勤人数(只打了上班)"` + Attendance int `json:"attendance" dc:"出勤人数(全勤)"` +} + +type PcSelectBelowProjectOfPersonnelReq struct { + g.Meta `path:"/pcSelectBelowProjectOfPersonnel" tags:"施工人员" method:"get" summary:"获取指定项目下的人员打卡信息"` + commonApi.Author + commonApi.PageReq + FuzzyQuery string `p:"fuzzyQuery" dc:"模糊查询" ` + ProjectId int64 `p:"projectId" dc:"项目ID" v:"required#项目ID不能为空"` + TeamId int64 `p:"teamId" dc:"班组ID"` + TypeOfWork string `p:"typeOfWork" dc:"工种"` + DateStr string `p:"dateStr" dc:"日期(格式:2024-04)" v:"date-format:Y-m#时间格式为2024-04"` +} + +type PcSelectBelowProjectOfPersonnelRes struct { + commonApi.EmptyRes + commonApi.ListRes + List []*PcSelectBelowProjectOfPersonnelTwoRes `json:"list"` +} + +type PcSelectBelowProjectOfPersonnelTwoRes struct { + Id string `p:"id" dc:"打卡主键ID"` + Openid string `p:"openid" dc:"openid"` + UserName string `p:"userName" dc:"用户名称"` + TeamName string `p:"teamName" dc:"班组名称"` + TypeOfWork string `p:"typeOfWork" dc:"工种(字典:type_of_work)"` + Attendance int `p:"attendance" dc:"出勤(单位:天)"` + BeLate int `p:"beLate" dc:"迟到(单位:次)"` + LeaveEarly int `p:"leaveEarly" dc:"早退(单位:次)"` + LackOfCard int `p:"lackOfCard" dc:"缺卡(单位:次)"` + List []*wxModel.BusAttendanceInfoRes `json:"list"` +} + +type PcQueryBasedOnOpenidReq struct { + g.Meta `path:"/pcQueryBasedOnOpenid" tags:"施工人员" method:"get" summary:"根据openid查询某人指定月份的打卡详情"` + commonApi.Author + Openid string `p:"openid" dc:"openid" ` + DateStr string `p:"dateStr" dc:"日期(格式:2024-04)" v:"date-format:Y-m#时间格式为2024-04"` +} + +type PcQueryBasedOnOpenidRes struct { + commonApi.EmptyRes + List []*PcQueryBasedOnOpenidTwoRes `json:"list"` +} + +type PcQueryBasedOnOpenidTwoRes struct { + Openid string `p:"openid" dc:"openid"` + ProjectId int64 `p:"projectId" dc:"项目ID"` + ProjectName string `p:"projectName" dc:"班组名称"` + TeamId int64 `p:"teamId" dc:"班组ID"` + TeamName string `p:"teamName" dc:"班组名称"` + PrintingDate string `p:"printingDate" dc:"年月日"` + Status []string `p:"status" dc:"1、考勤正常 2迟到早退缺卡 3补卡申请"` + ThreeList []*PcQueryBasedOnOpenidThreeRes `json:"threelist"` +} + +type PcQueryBasedOnOpenidThreeRes struct { + Commuter string `p:"commuter" dc:"上下班(1上班 2下班)"` + Clock string `p:"clock" dc:"打卡日期时间"` + IsPinch string `p:"isPinch" dc:"1正常,2迟到,3早退,4缺勤,5补卡"` +} + +type ListOfAttendanceMachinesReq struct { + g.Meta `path:"/listOfAttendanceMachines" tags:"施工人员" method:"get" summary:"考勤机列表"` + ProjectId int64 `p:"projectId" dc:"项目ID"` //项目id + Sn string `p:"sn" dc:"根据openid导出"` //sn + commonApi.Author +} + +type ListOfAttendanceMachinesRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusConstructionUserListRes `json:"list"` +} diff --git a/api/v1/system/bus_construction_user_file.go b/api/v1/system/bus_construction_user_file.go new file mode 100644 index 0000000..25f1573 --- /dev/null +++ b/api/v1/system/bus_construction_user_file.go @@ -0,0 +1,103 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-07 10:17:41 +// 生成路径: api/v1/system/bus_construction_user_file.go +// 生成人:gfast +// desc:微信用户的文件存储相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusConstructionUserFileSearchReq 分页请求参数 +type BusConstructionUserFileSearchReq struct { + g.Meta `path:"/list" tags:"微信用户的文件存储" method:"get" summary:"微信用户的文件存储列表"` + Id string `p:"id"` //主键ID + UserId string `p:"userId" v:"userId@integer#用户id需为整数"` //用户id + UserImgType string `p:"userImgType"` //图片类型 + Path string `p:"path"` //图片路径 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusConstructionUserFileSearchRes 列表返回结果 +type BusConstructionUserFileSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusConstructionUserFileListRes `json:"list"` +} + +// BusConstructionUserFileAddReq 添加操作请求参数 +type BusConstructionUserFileAddReq struct { + g.Meta `path:"/add" tags:"微信用户的文件存储" method:"post" summary:"微信用户的文件存储添加"` + commonApi.Author + UserId int64 `p:"userId" v:"required#用户id不能为空"` + UserImgType string `p:"userImgType" ` + Path string `p:"path" ` +} + +// BusConstructionUserFileAddRes 添加操作返回结果 +type BusConstructionUserFileAddRes struct { + commonApi.EmptyRes +} + +// BusConstructionUserFileEditReq 修改操作请求参数 +type BusConstructionUserFileEditReq struct { + g.Meta `path:"/edit" tags:"微信用户的文件存储" method:"put" summary:"微信用户的文件存储修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + UserId int64 `p:"userId" v:"required#用户id不能为空"` + UserImgType string `p:"userImgType" ` + Path string `p:"path" ` +} + +// BusConstructionUserFileEditRes 修改操作返回结果 +type BusConstructionUserFileEditRes struct { + commonApi.EmptyRes +} + +// BusConstructionUserFileGetReq 获取一条数据请求 +type BusConstructionUserFileGetReq struct { + g.Meta `path:"/get" tags:"微信用户的文件存储" method:"get" summary:"获取微信用户的文件存储信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusConstructionUserFileGetRes 获取一条数据结果 +type BusConstructionUserFileGetRes struct { + g.Meta `mime:"application/json"` + *model.BusConstructionUserFileInfoRes +} + +// BusConstructionUserFileGetReq 根据主键id获取安全考试信息 +type BusConstructionUserFileGetSafetyFileReq struct { + g.Meta `path:"/getsafety" tags:"微信用户的文件存储" method:"get" summary:"获取微信用户的安全考试存储信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 + ProjectId int64 `p:"projectId" v:"required#项目id必须"` +} + +// BusConstructionUserFileGetRes 根据主键id获取安全考试信息 +type BusConstructionUserFileGetSafetyFileRes struct { + g.Meta `mime:"application/json"` + List *model.BusWechatFileRes `json:"list"` +} + +// BusConstructionUserFileDeleteReq 删除数据请求 +type BusConstructionUserFileDeleteReq struct { + g.Meta `path:"/delete" tags:"微信用户的文件存储" method:"delete" summary:"删除微信用户的文件存储"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusConstructionUserFileDeleteRes 删除数据返回 +type BusConstructionUserFileDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_construction_user_post.go b/api/v1/system/bus_construction_user_post.go new file mode 100644 index 0000000..b482af4 --- /dev/null +++ b/api/v1/system/bus_construction_user_post.go @@ -0,0 +1,85 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-07 10:06:34 +// 生成路径: api/v1/system/bus_construction_user_post.go +// 生成人:gfast +// desc:施工人员岗位相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusConstructionUserPostSearchReq 分页请求参数 +type BusConstructionUserPostSearchReq struct { + g.Meta `path:"/list" tags:"施工人员岗位" method:"get" summary:"施工人员岗位列表"` + Id string `p:"id"` // + ConstructionUserId string `p:"constructionUserId" v:"constructionUserId@integer#施工人员id需为整数"` //施工人员id + PostId string `p:"postId" v:"postId@integer#岗位id需为整数"` //岗位id + commonApi.PageReq + commonApi.Author +} + +// BusConstructionUserPostSearchRes 列表返回结果 +type BusConstructionUserPostSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusConstructionUserPostListRes `json:"list"` +} + +// BusConstructionUserPostAddReq 添加操作请求参数 +type BusConstructionUserPostAddReq struct { + g.Meta `path:"/add" tags:"施工人员岗位" method:"post" summary:"施工人员岗位添加"` + commonApi.Author + ConstructionUserId int64 `p:"constructionUserId" ` + PostId int64 `p:"postId" ` +} + +// BusConstructionUserPostAddRes 添加操作返回结果 +type BusConstructionUserPostAddRes struct { + commonApi.EmptyRes +} + +// BusConstructionUserPostEditReq 修改操作请求参数 +type BusConstructionUserPostEditReq struct { + g.Meta `path:"/edit" tags:"施工人员岗位" method:"put" summary:"施工人员岗位修改"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键ID不能为空"` + ConstructionUserId int64 `p:"constructionUserId" ` + PostId int64 `p:"postId" ` +} + +// BusConstructionUserPostEditRes 修改操作返回结果 +type BusConstructionUserPostEditRes struct { + commonApi.EmptyRes +} + +// BusConstructionUserPostGetReq 获取一条数据请求 +type BusConstructionUserPostGetReq struct { + g.Meta `path:"/get" tags:"施工人员岗位" method:"get" summary:"获取施工人员岗位信息"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusConstructionUserPostGetRes 获取一条数据结果 +type BusConstructionUserPostGetRes struct { + g.Meta `mime:"application/json"` + *model.BusConstructionUserPostInfoRes +} + +// BusConstructionUserPostDeleteReq 删除数据请求 +type BusConstructionUserPostDeleteReq struct { + g.Meta `path:"/delete" tags:"施工人员岗位" method:"delete" summary:"删除施工人员岗位"` + commonApi.Author + Ids []uint64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusConstructionUserPostDeleteRes 删除数据返回 +type BusConstructionUserPostDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_corporate_events.go b/api/v1/system/bus_corporate_events.go new file mode 100644 index 0000000..a1b9545 --- /dev/null +++ b/api/v1/system/bus_corporate_events.go @@ -0,0 +1,86 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-03-20 16:49:36 +// 生成路径: api/v1/system/bus_corporate_events.go +// 生成人:gfast +// desc:企业大事记相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusCorporateEventsSearchReq 分页请求参数 +type BusCorporateEventsSearchReq struct { + g.Meta `path:"/list" tags:"企业大事记" method:"get" summary:"企业大事记列表"` + Headline string `p:"headline"` //标题 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusCorporateEventsSearchRes 列表返回结果 +type BusCorporateEventsSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusCorporateEventsListRes `json:"list"` +} + +// BusCorporateEventsAddReq 添加操作请求参数 +type BusCorporateEventsAddReq struct { + g.Meta `path:"/add" tags:"企业大事记" method:"post" summary:"企业大事记添加"` + commonApi.Author + Headline string `p:"headline" v:"required#标题必须"` + Content string `p:"content" v:"required#内容必须"` + CreatedBy uint64 +} + +// BusCorporateEventsAddRes 添加操作返回结果 +type BusCorporateEventsAddRes struct { + commonApi.EmptyRes +} + +// BusCorporateEventsEditReq 修改操作请求参数 +type BusCorporateEventsEditReq struct { + g.Meta `path:"/edit" tags:"企业大事记" method:"put" summary:"企业大事记修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + Headline string `p:"headline" v:"required#标题必须"` + Content string `p:"content" v:"required#内容必须"` + UpdatedBy uint64 +} + +// BusCorporateEventsEditRes 修改操作返回结果 +type BusCorporateEventsEditRes struct { + commonApi.EmptyRes +} + +// BusCorporateEventsGetReq 获取一条数据请求 +type BusCorporateEventsGetReq struct { + g.Meta `path:"/get" tags:"企业大事记" method:"get" summary:"获取企业大事记信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusCorporateEventsGetRes 获取一条数据结果 +type BusCorporateEventsGetRes struct { + g.Meta `mime:"application/json"` + *model.BusCorporateEventsInfoRes +} + +// BusCorporateEventsDeleteReq 删除数据请求 +type BusCorporateEventsDeleteReq struct { + g.Meta `path:"/delete" tags:"企业大事记" method:"delete" summary:"删除企业大事记"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusCorporateEventsDeleteRes 删除数据返回 +type BusCorporateEventsDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_design_audit.go b/api/v1/system/bus_design_audit.go new file mode 100644 index 0000000..81568ee --- /dev/null +++ b/api/v1/system/bus_design_audit.go @@ -0,0 +1,103 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-04-09 15:40:16 +// 生成路径: api/v1/system/bus_design_audit.go +// 生成人:gfast +// desc:设计审核(竣工、施工、可研)相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusDesignAuditSearchReq 分页请求参数 +type BusDesignAuditSearchReq struct { + g.Meta `path:"/list" tags:"设计审核(竣工、施工、可研)" method:"get" summary:"设计审核(竣工、施工、可研)列表"` + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + TableType string `p:"tableType" dc:"表类型(1竣工 2施工 3可研)" v:"between:1,3#范围值为1~3"` + Status string `p:"status" dc:"审核状态(1未读 2拒绝 3通过)" v:"between:1,3#范围值为1~3"` + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusDesignAuditSearchRes 列表返回结果 +type BusDesignAuditSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.CoryAuditListRes `json:"list"` +} + +// BusDesignAuditAddReq 添加操作请求参数 +type BusDesignAuditAddReq struct { + g.Meta `path:"/add" tags:"设计审核(竣工、施工、可研)" method:"post" summary:"设计审核(竣工、施工、可研)添加"` + commonApi.Author + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + TableName string `p:"tableName" v:"required#表名不能为空"` + TableId int64 `p:"tableId" v:"required#表ID不能为空"` +} + +// BusDesignAuditAddRes 添加操作返回结果 +type BusDesignAuditAddRes struct { + commonApi.EmptyRes +} + +// BusDesignAuditEditReq 修改操作请求参数 +type BusDesignAuditEditReq struct { + g.Meta `path:"/edit" tags:"设计审核(竣工、施工、可研)" method:"put" summary:"设计审核(竣工、施工、可研)修改"` + commonApi.Author + Id int64 `p:"id" dc:"主键ID" v:"required#主键ID不能为空"` + Status string `p:"status" dc:"审核状态" v:"required#审核状态(2拒绝 3通过)不能为空" v:"between:2,3#取值范围为2~3"` + Cause string `p:"cause" dc:"拒绝原因(status为2必填)" v:"required-if:status,2#status未拒绝状态必填cause|max-length:300#最大输入字数为300"` +} + +// BusDesignAuditEditRes 修改操作返回结果 +type BusDesignAuditEditRes struct { + commonApi.EmptyRes +} + +// BusDesignAuditGetReq 获取一条数据请求 +type BusDesignAuditGetReq struct { + g.Meta `path:"/get" tags:"设计审核(竣工、施工、可研)" method:"get" summary:"获取设计审核(竣工、施工、可研)信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusDesignAuditGetRes 获取一条数据结果 +type BusDesignAuditGetRes struct { + g.Meta `mime:"application/json"` + *model.BusDesignAuditInfoRes +} + +// BusDesignAuditDeleteReq 删除数据请求 +type BusDesignAuditDeleteReq struct { + g.Meta `path:"/delete" tags:"设计审核(竣工、施工、可研)" method:"delete" summary:"删除设计审核(竣工、施工、可研)"` + commonApi.Author + Id int64 `p:"id" dc:"审核主键ID" v:"required#主键必须"` +} + +// BusDesignAuditDeleteRes 删除数据返回 +type BusDesignAuditDeleteRes struct { + commonApi.EmptyRes +} + +// DesignAuditFileDownloadReq 单文件下载 +type DesignAuditFileDownloadReq struct { + g.Meta `path:"/designAuditFileDownload" tags:"设计审核(竣工、施工、可研)" method:"get" summary:"单文件下载"` + ProjectId int64 `p:"projectId" dc:"项目ID" v:"required#projectId不能为空"` + TableName string `p:"tableName" dc:"表名称" v:"required#tableName不能为空"` + TableId int64 `p:"tableId" dc:"对应TableName的主键ID" v:"required#tableId不能为空"` + Type string `p:"type" dc:"1文件下载 2文件夹下载" v:"required#type不能为空"` + commonApi.Author +} + +// DesignAuditFileDownloadRes 单文件下载 +type DesignAuditFileDownloadRes struct { + commonApi.EmptyRes + Path string `p:"path" dc:"文件夹压缩包下载路径"` +} diff --git a/api/v1/system/bus_design_document.go b/api/v1/system/bus_design_document.go new file mode 100644 index 0000000..aa21f17 --- /dev/null +++ b/api/v1/system/bus_design_document.go @@ -0,0 +1,87 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-29 16:31:29 +// 生成路径: api/v1/system/bus_design_document.go +// 生成人:gfast +// desc:设计管理相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusDesignDocumentSearchReq 分页请求参数 +type BusDesignDocumentSearchReq struct { + g.Meta `path:"/list" tags:"设计管理" method:"get" summary:"设计管理列表"` + DocumenName string `p:"documenName"` //文档名称 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#上传时间需为YYYY-MM-DD hh:mm:ss格式"` //上传时间 + commonApi.PageReq + commonApi.Author +} + +// BusDesignDocumentSearchRes 列表返回结果 +type BusDesignDocumentSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusDesignDocumentListRes `json:"list"` +} + +// BusDesignDocumentAddReq 添加操作请求参数 +type BusDesignDocumentAddReq struct { + g.Meta `path:"/add" tags:"设计管理" method:"post" summary:"设计管理添加"` + commonApi.Author + FileId int64 `p:"fileId" ` + ProjectId int64 `p:"projectId" ` + FileUrl []*comModel.UpFile `p:"fileUrl" ` +} + +// BusDesignDocumentAddRes 添加操作返回结果 +type BusDesignDocumentAddRes struct { + commonApi.EmptyRes +} + +// BusDesignDocumentEditReq 修改操作请求参数 +type BusDesignDocumentEditReq struct { + g.Meta `path:"/edit" tags:"设计管理" method:"put" summary:"设计管理修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + FileId int64 `p:"fileId" ` + ProjectId int64 `p:"projectId" ` + FileUrl []*comModel.UpFile `p:"fileUrl" ` +} + +// BusDesignDocumentEditRes 修改操作返回结果 +type BusDesignDocumentEditRes struct { + commonApi.EmptyRes +} + +// BusDesignDocumentGetReq 获取一条数据请求 +type BusDesignDocumentGetReq struct { + g.Meta `path:"/get" tags:"设计管理" method:"get" summary:"获取设计管理信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusDesignDocumentGetRes 获取一条数据结果 +type BusDesignDocumentGetRes struct { + g.Meta `mime:"application/json"` + *model.BusDesignDocumentInfoRes +} + +// BusDesignDocumentDeleteReq 删除数据请求 +type BusDesignDocumentDeleteReq struct { + g.Meta `path:"/delete" tags:"设计管理" method:"delete" summary:"删除设计管理"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusDesignDocumentDeleteRes 删除数据返回 +type BusDesignDocumentDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_design_period_range.go b/api/v1/system/bus_design_period_range.go new file mode 100644 index 0000000..7e91780 --- /dev/null +++ b/api/v1/system/bus_design_period_range.go @@ -0,0 +1,96 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-04-11 17:28:54 +// 生成路径: api/v1/system/bus_design_period_range.go +// 生成人:gfast +// desc:设计-周期范围相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusDesignPeriodRangeSearchReq 分页请求参数 +type BusDesignPeriodRangeSearchReq struct { + g.Meta `path:"/list" tags:"设计-周期范围" method:"get" summary:"设计-周期范围列表"` + ProjectId string `p:"projectId" dc:"项目ID" v:"projectId@integer#项目id需为整数"` //项目id + TableType string `p:"tableType" dc:"记录类型(1竣工 2施工 3可研)" v:"between:1,3#范围值为1~3"` //记录类型(1竣工 2施工 3可研) + FileName string `p:"fileName" dc:"文件名称"` //文件名称 + commonApi.PageReq + commonApi.Author +} + +// BusDesignPeriodRangeSearchRes 列表返回结果 +type BusDesignPeriodRangeSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusDesignPeriodRangeListRes `json:"list"` +} + +// BusDesignPeriodRangeAddReq 添加操作请求参数 +type BusDesignPeriodRangeAddReq struct { + g.Meta `path:"/add" tags:"设计-周期范围" method:"post" summary:"设计-周期范围添加"` + commonApi.Author + ProjectId int64 `p:"projectId" dc:"项目iD" v:"required#项目ID不能为空"` + TableType string `p:"tableType" dc:"记录类型" v:"required#记录类型不能为空"` + FileName string `p:"fileName" dc:"文件名称" v:"required#文件名称不能为空"` + FilePath string `p:"filePath" dc:"文件路径" v:"required#文件路径不能为空"` + StartTime string `p:"startTime" dc:"起始时间"` + EndTime string `p:"endTime" dc:"结束时间"` +} + +// BusDesignPeriodRangeAddRes 添加操作返回结果 +type BusDesignPeriodRangeAddRes struct { + commonApi.EmptyRes +} + +// BusDesignPeriodRangeEditReq 修改操作请求参数 +type BusDesignPeriodRangeEditReq struct { + g.Meta `path:"/edit" tags:"设计-周期范围" method:"put" summary:"设计-周期范围修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + ProjectId int64 `p:"projectId" ` + TableType string `p:"tableType" ` + FileName string `p:"fileName" v:"required#文件名称不能为空"` + FilePath string `p:"filePath" ` + IsEntering string `p:"isEntering" ` + StartTime string `p:"startTime" ` + EndTime string `p:"endTime" ` + CreateBy string `p:"createBy" ` + UpdateBy string `p:"updateBy" ` +} + +// BusDesignPeriodRangeEditRes 修改操作返回结果 +type BusDesignPeriodRangeEditRes struct { + commonApi.EmptyRes +} + +// BusDesignPeriodRangeGetReq 获取一条数据请求 +type BusDesignPeriodRangeGetReq struct { + g.Meta `path:"/get" tags:"设计-周期范围" method:"get" summary:"获取设计-周期范围信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusDesignPeriodRangeGetRes 获取一条数据结果 +type BusDesignPeriodRangeGetRes struct { + g.Meta `mime:"application/json"` + *model.BusDesignPeriodRangeInfoRes +} + +// BusDesignPeriodRangeDeleteReq 删除数据请求 +type BusDesignPeriodRangeDeleteReq struct { + g.Meta `path:"/delete" tags:"设计-周期范围" method:"delete" summary:"删除设计-周期范围"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusDesignPeriodRangeDeleteRes 删除数据返回 +type BusDesignPeriodRangeDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_engineering_quality.go b/api/v1/system/bus_engineering_quality.go new file mode 100644 index 0000000..a4a2d4a --- /dev/null +++ b/api/v1/system/bus_engineering_quality.go @@ -0,0 +1,122 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-29 10:41:51 +// 生成路径: api/v1/system/bus_engineering_quality.go +// 生成人:gfast +// desc:工程质量列相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusEngineeringQualitySearchReq 分页请求参数 +type BusEngineeringQualitySearchReq struct { + g.Meta `path:"/list" tags:"工程质量列" method:"get" summary:"工程质量列列表"` + UnitName1 string `p:"unitName1"` //单位工程 + UnitName2 string `p:"unitName2"` //子单位工程 + UnitName3 string `p:"unitName3"` //分部工程 + UnitName4 string `p:"unitName4"` //子分部工程 + UnitName5 string `p:"unitName5"` //分项工程 + UnitName6 string `p:"unitName6"` //检验批 + QualityName string `p:"qualityName"` //工程项目名称 + commonApi.PageReq + commonApi.Author +} + +// BusEngineeringQualitySearchRes 列表返回结果 +type BusEngineeringQualitySearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusEngineeringQualityListRes `json:"list"` +} + +// BusEngineeringQualityAddReq 添加操作请求参数 +type BusEngineeringQualityAddReq struct { + g.Meta `path:"/add" tags:"工程质量列" method:"post" summary:"工程质量列添加"` + commonApi.Author + UnitName1 string `p:"unitName1" v:"required#单位工程不能为空"` + UnitName2 string `p:"unitName2" v:"required#子单位工程不能为空"` + UnitName3 string `p:"unitName3" v:"required#分部工程不能为空"` + UnitName4 string `p:"unitName4" v:"required#子分部工程不能为空"` + UnitName5 string `p:"unitName5" v:"required#分项工程不能为空"` + UnitName6 string `p:"unitName6" v:"required#检验批不能为空"` + QualityName string `p:"qualityName" v:"required#工程项目名称不能为空"` + ProjectId int64 `p:"projectId" ` + Status string `p:"status" v:"required#施工类型状态不能为空"` + CreateTime *gtime.Time `p:"createTime" ` +} + +// BusEngineeringQualityAddRes 添加操作返回结果 +type BusEngineeringQualityAddRes struct { + commonApi.EmptyRes +} + +// BusEngineeringQualityEditReq 修改操作请求参数 +type BusEngineeringQualityEditReq struct { + g.Meta `path:"/edit" tags:"工程质量列" method:"put" summary:"工程质量列修改"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键ID不能为空"` + UnitName1 string `p:"unitName1" v:"required#单位工程不能为空"` + UnitName2 string `p:"unitName2" v:"required#子单位工程不能为空"` + UnitName3 string `p:"unitName3" v:"required#分部工程不能为空"` + UnitName4 string `p:"unitName4" v:"required#子分部工程不能为空"` + UnitName5 string `p:"unitName5" v:"required#分项工程不能为空"` + UnitName6 string `p:"unitName6" v:"required#检验批不能为空"` + QualityName string `p:"qualityName" v:"required#工程项目名称不能为空"` + Status string `p:"status" v:"required#施工类型状态不能为空"` + FileUrl []*comModel.UpFile `p:"fileUrl" ` + CreateBy string `p:"createBy" ` + CreateTime *gtime.Time `p:"createTime" ` + UpdateTime *gtime.Time `p:"updateTime" ` +} + +// BusEngineeringQualityEditRes 修改操作返回结果 +type BusEngineeringQualityEditRes struct { + commonApi.EmptyRes +} + +// BusEngineeringQualityGetReq 获取一条数据请求 +type BusEngineeringQualityGetReq struct { + g.Meta `path:"/get" tags:"工程质量列" method:"get" summary:"获取工程质量列信息"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusEngineeringQualityGetRes 获取一条数据结果 +type BusEngineeringQualityGetRes struct { + g.Meta `mime:"application/json"` + *model.BusEngineeringQualityInfoRes +} + +// BusEngineeringQualityDeleteReq 删除数据请求 +type BusEngineeringQualityDeleteReq struct { + g.Meta `path:"/delete" tags:"工程质量列" method:"delete" summary:"删除工程质量列"` + commonApi.Author + Ids []uint64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusEngineeringQualityDeleteRes 删除数据返回 +type BusEngineeringQualityDeleteRes struct { + commonApi.EmptyRes +} + +// BusEngineeringQualityUploadingReq 上传数据请求 +type BusEngineeringQualityUploadingReq struct { + g.Meta `path:"/delete" tags:"工程质量列" method:"delete" summary:"删除工程质量列"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键必须"` + FileUrl []*comModel.UpFile `p:"fileUrl" ` +} + +// BusEngineeringQualityUploadingRes 上传数据返回 +type BusEngineeringQualityUploadingRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_equipment_equipment_unpacking.go b/api/v1/system/bus_equipment_equipment_unpacking.go new file mode 100644 index 0000000..c75e1d6 --- /dev/null +++ b/api/v1/system/bus_equipment_equipment_unpacking.go @@ -0,0 +1,91 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-29 11:14:45 +// 生成路径: api/v1/system/bus_equipment_equipment_unpacking.go +// 生成人:gfast +// desc:开箱记录相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusEquipmentEquipmentUnpackingSearchReq 分页请求参数 +type BusEquipmentEquipmentUnpackingSearchReq struct { + g.Meta `path:"/list" tags:"开箱记录" method:"get" summary:"开箱记录列表"` + UnpackingName string `p:"unpackingName"` //开箱名称 + Status string `p:"status"` //状态 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusEquipmentEquipmentUnpackingSearchRes 列表返回结果 +type BusEquipmentEquipmentUnpackingSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusEquipmentEquipmentUnpackingListRes `json:"list"` +} + +// BusEquipmentEquipmentUnpackingAddReq 添加操作请求参数 +type BusEquipmentEquipmentUnpackingAddReq struct { + g.Meta `path:"/add" tags:"开箱记录" method:"post" summary:"开箱记录添加"` + commonApi.Author + EquipmentMaterialsId int64 `p:"equipmentMaterialsId" ` + UnpackingName string `p:"unpackingName" v:"required#开箱名称不能为空"` + UnpackingUrl []*comModel.UpFile `p:"unpackingUrl" ` + ProjectId int64 `p:"projectId" ` + Status string `p:"status" v:"required#状态不能为空"` +} + +// BusEquipmentEquipmentUnpackingAddRes 添加操作返回结果 +type BusEquipmentEquipmentUnpackingAddRes struct { + commonApi.EmptyRes +} + +// BusEquipmentEquipmentUnpackingEditReq 修改操作请求参数 +type BusEquipmentEquipmentUnpackingEditReq struct { + g.Meta `path:"/edit" tags:"开箱记录" method:"put" summary:"开箱记录修改"` + commonApi.Author + UnpackingId int64 `p:"unpackingId" v:"required#主键ID不能为空"` + EquipmentMaterialsId int64 `p:"equipmentMaterialsId" ` + UnpackingName string `p:"unpackingName" v:"required#开箱名称不能为空"` + UnpackingUrl []*comModel.UpFile `p:"unpackingUrl" ` + Status string `p:"status" v:"required#状态不能为空"` +} + +// BusEquipmentEquipmentUnpackingEditRes 修改操作返回结果 +type BusEquipmentEquipmentUnpackingEditRes struct { + commonApi.EmptyRes +} + +// BusEquipmentEquipmentUnpackingGetReq 获取一条数据请求 +type BusEquipmentEquipmentUnpackingGetReq struct { + g.Meta `path:"/get" tags:"开箱记录" method:"get" summary:"获取开箱记录信息"` + commonApi.Author + UnpackingId int64 `p:"unpackingId" v:"required#主键必须"` //通过主键获取 +} + +// BusEquipmentEquipmentUnpackingGetRes 获取一条数据结果 +type BusEquipmentEquipmentUnpackingGetRes struct { + g.Meta `mime:"application/json"` + *model.BusEquipmentEquipmentUnpackingInfoRes +} + +// BusEquipmentEquipmentUnpackingDeleteReq 删除数据请求 +type BusEquipmentEquipmentUnpackingDeleteReq struct { + g.Meta `path:"/delete" tags:"开箱记录" method:"delete" summary:"删除开箱记录"` + commonApi.Author + UnpackingIds []int64 `p:"unpackingIds" v:"required#主键必须"` //通过主键删除 +} + +// BusEquipmentEquipmentUnpackingDeleteRes 删除数据返回 +type BusEquipmentEquipmentUnpackingDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_equipment_materials.go b/api/v1/system/bus_equipment_materials.go new file mode 100644 index 0000000..906418e --- /dev/null +++ b/api/v1/system/bus_equipment_materials.go @@ -0,0 +1,198 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-29 11:14:16 +// 生成路径: api/v1/system/bus_equipment_materials.go +// 生成人:gfast +// desc:材料/设备名称相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusEquipmentMaterialsSearchReq 分页请求参数 +type BusEquipmentMaterialsSearchReq struct { + g.Meta `path:"/list" tags:"材料/设备名称" method:"get" summary:"材料/设备名称列表"` + EquipmentMaterialsName string `p:"equipmentMaterialsName" dc:"材料/设备"` + CompanyId string `p:"companyId" v:"companyId@integer#公司需为整数" dc:"公司"` + ProjectId string `p:"projectId" v:"required#项目不能为空" dc:"项目ID"` + commonApi.PageReq + commonApi.Author +} + +// BusEquipmentMaterialsSearchRes 列表返回结果 +type BusEquipmentMaterialsSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusEquipmentMaterialsListRes `json:"list"` +} + +// BusEquipmentMaterialsAddReq 添加操作请求参数 +type BusEquipmentMaterialsAddReq struct { + g.Meta `path:"/add" tags:"材料/设备名称" method:"post" summary:"材料/设备名称添加"` + commonApi.Author + EquipmentMaterialsName string `p:"equipmentMaterialsName" v:"required#材料/设备不能为空" dc:"材料/设备"` + CompanyId int64 `p:"companyId" v:"required#公司不能为空" dc:"公司ID"` + ProjectId int64 `p:"projectId" v:"required#项目不能为空" dc:"项目ID"` + TypeSpecificationName string `p:"typeSpecificationName" v:"required#规格型号不能为空" dc:"规格型号"` + //TypeSpecificationUrl []*comModel.UpFile `p:"typeSpecificationUrl" dc:"规格型号文件" v:"required#规格型号文件不能为空"` + //CertificateConformityName string `p:"certificateConformityName" v:"required#合格证编号不能为空" dc:"合格证编号"` + CertificateConformityUrl []*comModel.UpFile `p:"certificateConformityUrl" dc:"合格证编号文件" ` + //QualityName string `p:"qualityName" v:"required#质量说明书编号不能为空" dc:"质量说明书编号"` + QualityUrl []*comModel.UpFile `p:"qualityUrl" dc:"质量说明书编号文件"` + //InspectionReportName string `p:"inspectionReportName" v:"required#检验报告编号不能为空" dc:"检验报告编号"` + InspectionReportUrl []*comModel.UpFile `p:"inspectionReportUrl" dc:"检验报告编号文件" ` + //ReexamineReportName string `p:"reexamineReportName" v:"required#复试报告编号不能为空" dc:"复试报告编号"` + ReexamineReportUrl []*comModel.UpFile `p:"reexamineReportUrl" dc:"复试报告编号文件"` + UsePart string `p:"usePart" dc:"使用部位"` + WeightId string `p:"weightId" v:"required#计量单位不能为空" dc:"计量单位"` + Remark string `p:"remark" dc:"备注"` + QuantityCount string `p:"quantityCount" dc:"材料数量"` + //Status string `p:"status" dc:"状态(0正常 1停用)"` +} + +// BusEquipmentMaterialsAddRes 添加操作返回结果 +type BusEquipmentMaterialsAddRes struct { + commonApi.EmptyRes +} + +// BusEquipmentMaterialsEditReq 修改操作请求参数 +type BusEquipmentMaterialsEditReq struct { + g.Meta `path:"/edit" tags:"材料/设备名称" method:"put" summary:"材料/设备名称修改"` + commonApi.Author + EquipmentMaterialsId string `p:"equipmentMaterialsId" v:"required#主键ID不能为空" dc:"ID"` + EquipmentMaterialsName string `p:"equipmentMaterialsName" v:"required#材料/设备不能为空" dc:"材料/设备"` + CompanyId int64 `p:"companyId" v:"required#公司不能为空" dc:"公司ID"` + ProjectId int64 `p:"projectId" v:"required#项目不能为空" dc:"项目ID"` + TypeSpecificationName string `p:"typeSpecificationName" v:"required#规格型号不能为空" dc:"规格型号"` + //TypeSpecificationUrl []*comModel.UpFile `p:"typeSpecificationUrl" dc:"规格型号文件"` + //CertificateConformityName string `p:"certificateConformityName" v:"required#合格证编号不能为空" dc:"合格证编号"` + CertificateConformityUrl []*comModel.UpFile `p:"certificateConformityUrl" dc:"合格证编号文件"` + //QualityName string `p:"qualityName" v:"required#质量说明书编号不能为空" dc:"质量说明书编号"` + QualityUrl []*comModel.UpFile `p:"qualityUrl" dc:"质量说明书编号文件"` + //InspectionReportName string `p:"inspectionReportName" v:"required#检验报告编号不能为空" dc:"检验报告编号"` + InspectionReportUrl []*comModel.UpFile `p:"inspectionReportUrl" dc:"检验报告编号文件"` + //ReexamineReportName string `p:"reexamineReportName" v:"required#复试报告编号不能为空" dc:"复试报告编号"` + ReexamineReportUrl []*comModel.UpFile `p:"reexamineReportUrl" dc:"复试报告编号文件"` + UsePart string `p:"usePart" dc:"使用部位"` + WeightId string `p:"weightId" v:"required#计量单位不能为空" dc:"计量单位"` + Remark string `p:"remark" dc:"备注"` + QuantityCount string `p:"quantityCount" dc:"材料数量"` + Status string `p:"status" dc:"状态(0正常 1停用)"` +} + +// BusEquipmentMaterialsEditRes 修改操作返回结果 +type BusEquipmentMaterialsEditRes struct { + commonApi.EmptyRes +} + +// BusEquipmentMaterialsGetReq 获取一条数据请求 +type BusEquipmentMaterialsGetReq struct { + g.Meta `path:"/get" tags:"材料/设备名称" method:"get" summary:"获取材料/设备名称信息"` + commonApi.Author + EquipmentMaterialsId int64 `p:"equipmentMaterialsId" v:"required#主键必须"` //通过主键获取 +} + +// BusEquipmentMaterialsGetRes 获取一条数据结果 +type BusEquipmentMaterialsGetRes struct { + g.Meta `mime:"application/json"` + *model.BusEquipmentMaterialsInfoRes +} + +// BusEquipmentMaterialsDeleteReq 删除数据请求 +type BusEquipmentMaterialsDeleteReq struct { + g.Meta `path:"/delete" tags:"材料/设备名称" method:"delete" summary:"删除材料/设备名称"` + commonApi.Author + EquipmentMaterialsIds []int64 `p:"equipmentMaterialsIds" v:"required#主键必须"` //通过主键删除 +} + +// BusEquipmentMaterialsDeleteRes 删除数据返回 +type BusEquipmentMaterialsDeleteRes struct { + commonApi.EmptyRes +} + +//App + +// BusEquipmentMaterialsAppAddReq 添加操作请求参数 +type BusEquipmentMaterialsAppAddReq struct { + g.Meta `path:"/appadd" tags:"材料设备App" method:"post" summary:"材料设备App添加"` + commonApi.Author + EquipmentMaterialsName string `p:"equipmentMaterialsName" v:"required#材料/设备不能为空" dc:"材料/设备"` + CompanyId int64 `p:"companyId" v:"required#公司不能为空" dc:"公司ID"` + ProjectId int64 `p:"projectId" v:"required#项目不能为空" dc:"项目ID"` + TypeSpecificationName string `p:"typeSpecificationName" v:"required#规格型号不能为空" dc:"规格型号"` + CertificateConformityUrl []*comModel.UpFile `p:"certificateConformityUrl" dc:"合格证编号文件" ` + QualityUrl []*comModel.UpFile `p:"qualityUrl" dc:"质量说明书编号文件"` + InspectionReportUrl []*comModel.UpFile `p:"inspectionReportUrl" dc:"检验报告编号文件" ` + ReexamineReportUrl []*comModel.UpFile `p:"reexamineReportUrl" dc:"复试报告编号文件"` + UsePart string `p:"usePart" dc:"使用部位"` + WeightId string `p:"weightId" v:"required#计量单位不能为空" dc:"计量单位"` + Remark string `p:"remark" dc:"备注"` + QuantityCount string `p:"quantityCount" dc:"材料数量"` +} + +// BusEquipmentMaterialsAppAddRes 添加操作返回结果 +type BusEquipmentMaterialsAppAddRes struct { + commonApi.EmptyRes +} + +// BusEquipmentMaterialsAppEditReq 修改操作请求参数 +type BusEquipmentMaterialsAppEditReq struct { + g.Meta `path:"/appedit" tags:"材料设备App" method:"put" summary:"材料设备App修改"` + commonApi.Author + EquipmentMaterialsId string `p:"equipmentMaterialsId" v:"required#主键ID不能为空" dc:"ID"` + EquipmentMaterialsName string `p:"equipmentMaterialsName" v:"required#材料/设备不能为空" dc:"材料/设备"` + CompanyId int64 `p:"companyId" v:"required#公司不能为空" dc:"公司ID"` + ProjectId int64 `p:"projectId" v:"required#项目不能为空" dc:"项目ID"` + TypeSpecificationName string `p:"typeSpecificationName" v:"required#规格型号不能为空" dc:"规格型号"` + CertificateConformityUrl []*comModel.UpFile `p:"certificateConformityUrl" dc:"合格证编号文件"` + QualityUrl []*comModel.UpFile `p:"qualityUrl" dc:"质量说明书编号文件"` + InspectionReportUrl []*comModel.UpFile `p:"inspectionReportUrl" dc:"检验报告编号文件"` + ReexamineReportUrl []*comModel.UpFile `p:"reexamineReportUrl" dc:"复试报告编号文件"` + UsePart string `p:"usePart" dc:"使用部位"` + WeightId string `p:"weightId" v:"required#计量单位不能为空" dc:"计量单位"` + Remark string `p:"remark" dc:"备注"` + QuantityCount string `p:"quantityCount" dc:"材料数量"` + Status string `p:"status" dc:"状态(0正常 1停用)"` +} + +// BusEquipmentMaterialsAppEditRes 修改操作返回结果 +type BusEquipmentMaterialsAppEditRes struct { + commonApi.EmptyRes +} + +// BusEquipmentMaterialsAppSearchReq 分页请求参数 +type BusEquipmentMaterialsAppSearchReq struct { + g.Meta `path:"/applist" tags:"材料设备App" method:"get" summary:"材料设备App列表"` + EquipmentMaterialsName string `p:"equipmentMaterialsName" dc:"材料/设备"` + CompanyId string `p:"companyId" v:"companyId@integer#公司需为整数" dc:"公司"` + ProjectId string `p:"projectId" v:"required#项目不能为空" dc:"项目ID"` + commonApi.PageReq + commonApi.Author +} + +// BusEquipmentMaterialsAppSearchRes 列表返回结果 +type BusEquipmentMaterialsAppSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusEquipmentMaterialsAppListRes `json:"list"` +} + +// BusEquipmentMaterialsAppGetReq 获取一条数据请求 +type BusEquipmentMaterialsAppGetReq struct { + g.Meta `path:"/appget" tags:"材料设备App" method:"get" summary:"材料设备App信息"` + commonApi.Author + EquipmentMaterialsId int64 `p:"equipmentMaterialsId" v:"required#主键必须"` //通过主键获取 +} + +// BusEquipmentMaterialsAppGetRes 获取一条数据结果 +type BusEquipmentMaterialsAppGetRes struct { + g.Meta `mime:"application/json"` + *model.BusEquipmentMaterialsAppFileInfoRes +} diff --git a/api/v1/system/bus_equipment_materials_excel.go b/api/v1/system/bus_equipment_materials_excel.go new file mode 100644 index 0000000..1914d5f --- /dev/null +++ b/api/v1/system/bus_equipment_materials_excel.go @@ -0,0 +1,49 @@ +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusEquipmentMaterialsExcelIndexReq 修改操作请求参数 +type BusEquipmentMaterialsExcelIndexReq struct { + g.Meta `path:"/excelindex" tags:"设备材料入库" method:"get" summary:"设备材料入库首页"` + ProjectId string `json:"projectId"` + commonApi.Author +} + +// BusEquipmentMaterialsExcelIndexRes 修改操作返回结果 +type BusEquipmentMaterialsExcelIndexRes struct { + commonApi.EmptyRes + List []*model.BusEquimentIndexRes `json:"list"` +} + +// BusEquipmentMaterialsExcelSearchReq 分页请求参数 +type BusEquipmentMaterialsExcelSearchReq struct { + g.Meta `path:"/excellist" tags:"设备材料入库" method:"get" summary:"excel表格设备材料入库列表"` + ProjectId int `p:"projectId" dc:"项目id"` + EquipmentMaterialsName string `p:"equipmentMaterialsName" dc:"设备/材料名称"` + commonApi.PageReq + commonApi.Author +} + +// BusEquipmentMaterialsExcelSearchRes 列表返回结果 +type BusEquipmentMaterialsExcelSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusEquipmentMaterialsExcelListRes `json:"list"` +} + +// BusEquipmentMaterialsExcelEditReq 修改操作请求参数 +type BusEquipmentMaterialsExcelEditReq struct { + g.Meta `path:"/exceledit" tags:"设备材料入库" method:"put" summary:"excel表格设备材料入库修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + Disposition string `p:"disposition" dc:"处理方式"` +} + +// BusEquipmentMaterialsExcelEditRes 修改操作返回结果 +type BusEquipmentMaterialsExcelEditRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_equipment_materials_inventory.go b/api/v1/system/bus_equipment_materials_inventory.go new file mode 100644 index 0000000..dc5977d --- /dev/null +++ b/api/v1/system/bus_equipment_materials_inventory.go @@ -0,0 +1,175 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-09-13 14:21:30 +// 生成路径: api/v1/system/bus_equipment_materials_inventory.go +// 生成人:gfast +// desc:设备材料入库相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/os/gtime" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusEquipmentMaterialsInventorySearchReq 分页请求参数 +type BusEquipmentMaterialsInventorySearchReq struct { + g.Meta `path:"/list" tags:"设备材料入库" method:"get" summary:"设备材料入库列表"` + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + EquipmentMaterialsId string `p:"equipmentMaterialsId" v:"required#材料ID不能为空"` + commonApi.PageReq + commonApi.Author +} + +// BusEquipmentMaterialsInventorySearchRes 列表返回结果 +type BusEquipmentMaterialsInventorySearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusEquipmentMaterialsInventoryListRes `json:"list"` +} + +// BusEquipmentMaterialsInventoryAddReq 添加操作请求参数 +type BusEquipmentMaterialsInventoryAddReq struct { + g.Meta `path:"/add" tags:"设备材料入库" method:"post" summary:"设备材料入库添加"` + commonApi.Author + Recipient string `p:"recipient" dc:"交接单位"` + Shipper string `p:"shipper" dc:"领用人"` + EquipmentMaterialsId int64 `p:"equipmentMaterialsId" v:"required#材料ID不能为空"` + OutPut string `p:"outPut" v:"required#出入状态不能为空"` + Number int `p:"number" v:"required#出入库数量不能为空"` + Operator string `p:"operator" v:"required#出入库负责人不能为空"` + OutPutTime *gtime.Time `p:"outPutTime" dc:"操作时间" v:"outPutTime@datetime#操作时间需为YYYY-MM-DD hh:mm:ss格式"` + Remark string `p:"remark" dc:"备注"` + File []*ghttp.UploadFile `p:"file" dc:"支持多个图片或PDF"` +} + +// BusEquipmentMaterialsInventoryAddRes 添加操作返回结果 +type BusEquipmentMaterialsInventoryAddRes struct { + commonApi.EmptyRes +} + +// BusEquipmentMaterialsInventoryEditReq 修改操作请求参数 +type BusEquipmentMaterialsInventoryEditReq struct { + g.Meta `path:"/edit" tags:"设备材料入库" method:"put" summary:"设备材料入库修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + Remark string `p:"remark" dc:"备注"` + Recipient string `p:"recipient" dc:"交接单位"` + Shipper string `p:"shipper" dc:"领用人"` + Path string `json:"path" dc:"上传字符"` + File []*ghttp.UploadFile `p:"file" dc:"支持多个图片或PDF"` +} + +// BusEquipmentMaterialsInventoryEditRes 修改操作返回结果 +type BusEquipmentMaterialsInventoryEditRes struct { + commonApi.EmptyRes +} + +// BusEquipmentMaterialsInventoryGetReq 获取一条数据请求 +type BusEquipmentMaterialsInventoryGetReq struct { + g.Meta `path:"/get" tags:"设备材料入库" method:"get" summary:"获取设备材料入库信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusEquipmentMaterialsInventoryGetRes 获取一条数据结果 +type BusEquipmentMaterialsInventoryGetRes struct { + g.Meta `mime:"application/json"` + *model.BusEquipmentMaterialsInventoryInfoRes +} + +// BusEquipmentMaterialsInventoryDeleteReq 删除数据请求 +type BusEquipmentMaterialsInventoryDeleteReq struct { + g.Meta `path:"/delete" tags:"设备材料入库" method:"delete" summary:"删除设备材料入库"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusEquipmentMaterialsInventoryDeleteRes 删除数据返回 +type BusEquipmentMaterialsInventoryDeleteRes struct { + commonApi.EmptyRes +} + +//app + +// BusEquipmentMaterialsInventoryAppAddReq 添加操作请求参数 +type BusEquipmentMaterialsInventoryAppAddReq struct { + g.Meta `path:"/appadd" tags:"材料设备App" method:"post" summary:"设备材料入库App添加"` + commonApi.Author + Recipient string `p:"recipient" dc:"交接单位"` + Shipper string `p:"shipper" dc:"领用人"` + EquipmentMaterialsId int64 `p:"equipmentMaterialsId" v:"required#材料ID不能为空"` + OutPut string `p:"outPut" v:"required#出入状态不能为空"` + Number int `p:"number" v:"required#出入库数量不能为空"` + Operator string `p:"operator" v:"required#出入库负责人不能为空"` + OutPutTime *gtime.Time `p:"outPutTime" dc:"操作时间" ` + Remark string `p:"remark" dc:"备注"` + File []model.MaterialsInventoryFileAddApp `p:"file" dc:"支持多个图片或PDF"` +} + +// BusEquipmentMaterialsInventoryAppAddRes 添加操作返回结果 +type BusEquipmentMaterialsInventoryAppAddRes struct { + commonApi.EmptyRes +} + +// BusEquipmentMaterialsInventoryAppEditReq 修改操作请求参数 +type BusEquipmentMaterialsInventoryAppEditReq struct { + g.Meta `path:"/appedit" tags:"材料设备App" method:"put" summary:"设备材料入库App修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + Remark string `p:"remark" dc:"备注"` + Recipient string `p:"recipient" dc:"交接单位"` + Shipper string `p:"shipper" dc:"领用人"` + File []model.MaterialsInventoryFileEditApp `p:"file" dc:"支持多个图片或PDF"` + DelFile []model.MaterialsInventoryFileEditApp `p:"delFile" dc:"删除文件"` +} + +// BusEquipmentMaterialsInventoryAppEditRes 修改操作返回结果 +type BusEquipmentMaterialsInventoryAppEditRes struct { + commonApi.EmptyRes +} + +// BusEquipmentMaterialsInventoryAppSearchReq 分页请求参数 +type BusEquipmentMaterialsInventoryAppSearchReq struct { + g.Meta `path:"/applist" tags:"材料设备App" method:"get" summary:"设备材料入库App列表"` + EquipmentMaterialsId string `p:"equipmentMaterialsId" v:"required#材料ID不能为空"` + commonApi.PageReq + commonApi.Author +} + +// BusEquipmentMaterialsInventoryAppSearchRes 列表返回结果 +type BusEquipmentMaterialsInventoryAppSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusEquipmentMaterialsInventoryAppListRes `json:"list"` +} + +// BusEquipmentMaterialsInventoryAppGetReq 获取一条数据请求 +type BusEquipmentMaterialsInventoryAppGetReq struct { + g.Meta `path:"/appget" tags:"材料设备App" method:"get" summary:"获取设备材料入库App信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusEquipmentMaterialsInventoryAppGetRes 获取一条数据结果 +type BusEquipmentMaterialsInventoryAppGetRes struct { + g.Meta `mime:"application/json"` + *model.BusEquipmentMaterialsInventoryAppInfoRes +} + +// BusEquipmentMaterialsInventoryAppDeleteReq 删除数据请求 +type BusEquipmentMaterialsInventoryAppDeleteReq struct { + g.Meta `path:"/appdelete" tags:"材料设备App" method:"delete" summary:"删除设备材料入库App"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusEquipmentMaterialsInventoryAppDeleteRes 删除数据返回 +type BusEquipmentMaterialsInventoryAppDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_equipment_materials_weight.go b/api/v1/system/bus_equipment_materials_weight.go new file mode 100644 index 0000000..27a6001 --- /dev/null +++ b/api/v1/system/bus_equipment_materials_weight.go @@ -0,0 +1,85 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-28 15:27:53 +// 生成路径: api/v1/system/bus_equipment_materials_weight.go +// 生成人:gfast +// desc:计量单位相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusEquipmentMaterialsWeightSearchReq 分页请求参数 +type BusEquipmentMaterialsWeightSearchReq struct { + g.Meta `path:"/list" tags:"计量单位" method:"get" summary:"计量单位列表"` + Weight string `p:"weight"` //计量单位名称 + Status string `p:"status"` //状态 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusEquipmentMaterialsWeightSearchRes 列表返回结果 +type BusEquipmentMaterialsWeightSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusEquipmentMaterialsWeightListRes `json:"list"` +} + +// BusEquipmentMaterialsWeightAddReq 添加操作请求参数 +type BusEquipmentMaterialsWeightAddReq struct { + g.Meta `path:"/add" tags:"计量单位" method:"post" summary:"计量单位添加"` + commonApi.Author + Weight string `p:"weight" v:"required#计量单位名称不能为空"` + Status string `p:"status" v:"required#状态不能为空"` +} + +// BusEquipmentMaterialsWeightAddRes 添加操作返回结果 +type BusEquipmentMaterialsWeightAddRes struct { + commonApi.EmptyRes +} + +// BusEquipmentMaterialsWeightEditReq 修改操作请求参数 +type BusEquipmentMaterialsWeightEditReq struct { + g.Meta `path:"/edit" tags:"计量单位" method:"put" summary:"计量单位修改"` + commonApi.Author + WeightId int64 `p:"weightId" v:"required#主键ID不能为空"` + Weight string `p:"weight" v:"required#计量单位名称不能为空"` + Status string `p:"status" v:"required#状态不能为空"` +} + +// BusEquipmentMaterialsWeightEditRes 修改操作返回结果 +type BusEquipmentMaterialsWeightEditRes struct { + commonApi.EmptyRes +} + +// BusEquipmentMaterialsWeightGetReq 获取一条数据请求 +type BusEquipmentMaterialsWeightGetReq struct { + g.Meta `path:"/get" tags:"计量单位" method:"get" summary:"获取计量单位信息"` + commonApi.Author + WeightId int64 `p:"weightId" v:"required#主键必须"` //通过主键获取 +} + +// BusEquipmentMaterialsWeightGetRes 获取一条数据结果 +type BusEquipmentMaterialsWeightGetRes struct { + g.Meta `mime:"application/json"` + *model.BusEquipmentMaterialsWeightInfoRes +} + +// BusEquipmentMaterialsWeightDeleteReq 删除数据请求 +type BusEquipmentMaterialsWeightDeleteReq struct { + g.Meta `path:"/delete" tags:"计量单位" method:"delete" summary:"删除计量单位"` + commonApi.Author + WeightIds []int64 `p:"weightIds" v:"required#主键必须"` //通过主键删除 +} + +// BusEquipmentMaterialsWeightDeleteRes 删除数据返回 +type BusEquipmentMaterialsWeightDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_essential_information.go b/api/v1/system/bus_essential_information.go new file mode 100644 index 0000000..e3b10fd --- /dev/null +++ b/api/v1/system/bus_essential_information.go @@ -0,0 +1,94 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-03-20 19:38:54 +// 生成路径: api/v1/system/bus_essential_information.go +// 生成人:gfast +// desc:项目基本信息相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusEssentialInformationSearchReq 分页请求参数 +type BusEssentialInformationSearchReq struct { + g.Meta `path:"/list" tags:"项目基本信息" method:"get" summary:"项目基本信息列表"` + Id string `p:"id"` //主键ID + One string `p:"one"` //发电量 + Two string `p:"two"` //年发电量 + Three string `p:"three"` //当前发电量 + Four string `p:"four"` //减排量 + Five string `p:"five"` //预估发电量 + commonApi.PageReq + commonApi.Author +} + +// BusEssentialInformationSearchRes 列表返回结果 +type BusEssentialInformationSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusEssentialInformationListRes `json:"list"` +} + +// BusEssentialInformationAddReq 添加操作请求参数 +type BusEssentialInformationAddReq struct { + g.Meta `path:"/add" tags:"项目基本信息" method:"post" summary:"项目基本信息添加"` + commonApi.Author + One string `p:"one" ` + Two string `p:"two" ` + Three string `p:"three" ` + Four string `p:"four" ` + Five string `p:"five" ` +} + +// BusEssentialInformationAddRes 添加操作返回结果 +type BusEssentialInformationAddRes struct { + commonApi.EmptyRes +} + +// BusEssentialInformationEditReq 修改操作请求参数 +type BusEssentialInformationEditReq struct { + g.Meta `path:"/edit" tags:"项目基本信息" method:"put" summary:"项目基本信息修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + One string `p:"one" ` + Two string `p:"two" ` + Three string `p:"three" ` + Four string `p:"four" ` + Five string `p:"five" ` +} + +// BusEssentialInformationEditRes 修改操作返回结果 +type BusEssentialInformationEditRes struct { + commonApi.EmptyRes +} + +// BusEssentialInformationGetReq 获取一条数据请求 +type BusEssentialInformationGetReq struct { + g.Meta `path:"/get" tags:"项目基本信息" method:"get" summary:"获取项目基本信息信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusEssentialInformationGetRes 获取一条数据结果 +type BusEssentialInformationGetRes struct { + g.Meta `mime:"application/json"` + *model.BusEssentialInformationInfoRes +} + +// BusEssentialInformationDeleteReq 删除数据请求 +type BusEssentialInformationDeleteReq struct { + g.Meta `path:"/delete" tags:"项目基本信息" method:"delete" summary:"删除项目基本信息"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusEssentialInformationDeleteRes 删除数据返回 +type BusEssentialInformationDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_folder.go b/api/v1/system/bus_folder.go new file mode 100644 index 0000000..cbf4494 --- /dev/null +++ b/api/v1/system/bus_folder.go @@ -0,0 +1,104 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-09-15 17:15:59 +// 生成路径: api/v1/system/bus_folder.go +// 生成人:gfast +// desc:文件夹相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusFolderSearchReq 分页请求参数 +type BusFolderSearchReq struct { + g.Meta `path:"/list" tags:"文件夹" method:"get" summary:"文件夹列表"` + TypeNum int64 `p:"typeNum" dc:"类型:1查所有父文件夹 2查询子文件夹" v:"between:1,2#参数范围为1~2"` + FatherId string `p:"fatherId" dc:"typeNum为2,此字段不能为空" v:"required-if:typeNum,2#typeNum为2fatherId不能为空"` + Name string `p:"name"` //文件夹名称 + ProjectId string `p:"projectId" v:"required#项目id不能为空"` + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusFolderSearchRes 列表返回结果 +type BusFolderSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusFolderListRes `json:"list"` +} + +// TreeFormListFuncReq 树形文件夹列表 +type TreeFormListFuncReq struct { + g.Meta `path:"/treeFormListFunc" tags:"文件夹" method:"get" summary:"系统文件夹的虚拟树形结构"` + ProjectId string `p:"projectId" v:"required#项目id不能为空"` + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式""` //创建时间 + commonApi.Author +} + +// TreeFormListFuncRes 列表返回结果 +type TreeFormListFuncRes struct { + g.Meta `mime:"application/json"` + List []*model.BusFolderListRes `json:"list"` +} + +// BusFolderAddReq 添加操作请求参数 +type BusFolderAddReq struct { + g.Meta `path:"/add" tags:"文件夹" method:"post" summary:"文件夹添加"` + commonApi.Author + Icon string `p:"icon" ` + Name string `p:"name" v:"required#文件夹名称不能为空"` + Remark string `p:"remark" ` + ProjectId string `p:"projectId" v:"required#项目id不能为空"` +} + +// BusFolderAddRes 添加操作返回结果 +type BusFolderAddRes struct { + commonApi.EmptyRes +} + +// BusFolderEditReq 修改操作请求参数 +type BusFolderEditReq struct { + g.Meta `path:"/edit" tags:"文件夹" method:"put" summary:"文件夹修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + Icon string `p:"icon" ` + Name string `p:"name" v:"required#文件夹名称不能为空"` + Remark string `p:"remark" ` +} + +// BusFolderEditRes 修改操作返回结果 +type BusFolderEditRes struct { + commonApi.EmptyRes +} + +// BusFolderGetReq 获取一条数据请求 +type BusFolderGetReq struct { + g.Meta `path:"/get" tags:"文件夹" method:"get" summary:"获取文件夹信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusFolderGetRes 获取一条数据结果 +type BusFolderGetRes struct { + g.Meta `mime:"application/json"` + *model.BusFolderInfoRes +} + +// BusFolderDeleteReq 删除数据请求 +type BusFolderDeleteReq struct { + g.Meta `path:"/delete" tags:"文件夹" method:"delete" summary:"删除文件夹"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusFolderDeleteRes 删除数据返回 +type BusFolderDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_folder_file.go b/api/v1/system/bus_folder_file.go new file mode 100644 index 0000000..2edd5a3 --- /dev/null +++ b/api/v1/system/bus_folder_file.go @@ -0,0 +1,96 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-09-15 17:16:00 +// 生成路径: api/v1/system/bus_folder_file.go +// 生成人:gfast +// desc:文件相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusFolderFileSearchReq 分页请求参数 +type BusFolderFileSearchReq struct { + g.Meta `path:"/list" tags:"文件" method:"get" summary:"文件列表1"` + FolderId string `p:"folderId"` //文件ID + Name string `p:"name"` //文件名称 + Size string `p:"size"` //文件大小 + Suffix string `p:"suffix"` //文件后缀 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式" dc:"创建时间-格式为:年月日时分秒"` //创建时间 + CreateAt string `p:"createAt" v:"createAt@date-format:Y-m#创建时间需为YYYY-MM" dc:"创建时间-格式为:年月"` //创建时间 + ProjectId string `p:"projectId" v:"required#项目id不能为空"` + commonApi.PageReq + commonApi.Author +} + +// BusFolderFileSearchRes 列表返回结果 +type BusFolderFileSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusFolderFileListRes `json:"list"` +} + +// BusFolderFileAddReq 添加操作请求参数 +type BusFolderFileAddReq struct { + g.Meta `path:"/add" tags:"文件" method:"post" summary:"文件添加"` + commonApi.Author + ProjectId string `p:"projectId" v:"required#项目id不能为空"` + FolderId int64 `p:"folderId" dc:"所属文件夹" v:"required#所属文件夹不能为空"` + Name string `p:"name" dc:"文件名" v:"required#文件名称不能为空"` + Size string `p:"size" dc:"文件大小" v:"required#文件大小不能为空"` + Suffix string `p:"suffix" dc:"文件后缀" v:"required#文件后缀不能为空"` + Path string `p:"path" dc:"文件路径" v:"required#文件路径不能为空"` + Remark string `p:"remark" dc:"备注" ` +} + +// BusFolderFileAddRes 添加操作返回结果 +type BusFolderFileAddRes struct { + commonApi.EmptyRes +} + +// BusFolderFileEditReq 修改操作请求参数 +type BusFolderFileEditReq struct { + g.Meta `path:"/edit" tags:"文件" method:"put" summary:"文件修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + FolderId int64 `p:"folderId" ` + FileType string `p:"fileType" ` + Name string `p:"name" v:"required#文件名称不能为空"` + Remark string `p:"remark" ` +} + +// BusFolderFileEditRes 修改操作返回结果 +type BusFolderFileEditRes struct { + commonApi.EmptyRes +} + +// BusFolderFileGetReq 获取一条数据请求 +type BusFolderFileGetReq struct { + g.Meta `path:"/get" tags:"文件" method:"get" summary:"获取文件信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusFolderFileGetRes 获取一条数据结果 +type BusFolderFileGetRes struct { + g.Meta `mime:"application/json"` + *model.BusFolderFileInfoRes +} + +// BusFolderFileDeleteReq 删除数据请求 +type BusFolderFileDeleteReq struct { + g.Meta `path:"/delete" tags:"文件" method:"delete" summary:"删除文件"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusFolderFileDeleteRes 删除数据返回 +type BusFolderFileDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_hse_management.go b/api/v1/system/bus_hse_management.go new file mode 100644 index 0000000..05797cf --- /dev/null +++ b/api/v1/system/bus_hse_management.go @@ -0,0 +1,111 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-03-28 14:53:05 +// 生成路径: api/v1/system/bus_hse_management.go +// 生成人:gfast +// desc:HSE-巡检工单相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusHseManagementSearchReq 分页请求参数 +type BusHseManagementSearchReq struct { + g.Meta `path:"/list" tags:"HSE-巡检工单" method:"get" summary:"HSE-巡检工单列表"` + ProjectId string `p:"projectId" v:"projectId@integer#项目ID需为整数"` + StudyType string `p:"studyType" dc:"检查类型"` + TourType string `p:"tourType" dc:"违章类型"` + Fill string `p:"fill" dc:"检查人"` + Abarbeitung string `p:"abarbeitung" dc:"整改人"` + commonApi.PageReq + commonApi.Author +} + +// BusHseManagementSearchRes 列表返回结果 +type BusHseManagementSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusHseManagementInfoTwoRes `json:"list"` +} + +// BusHseManagementAddReq 添加操作请求参数 +type BusHseManagementAddReq struct { + g.Meta `path:"/add" tags:"HSE-巡检工单" method:"post" summary:"HSE-巡检工单添加"` + commonApi.Author + ProjectId int64 `p:"projectId" dc:"项目ID"` + StudyType string `p:"studyType" dc:"检查类型"` + TourType string `p:"tourType" dc:"违章类型"` + InspectionResult string `p:"inspectionResult" dc:"巡检结果"` + TeamName string `p:"teamName" v:"required#名称(班组/部门)不能为空"` + Corrector string `p:"corrector" dc:"整改人"` + ReplyDate string `p:"replyDate" dc:"回复日期"` + HseManagementAdd int `p:"hseManagementAdd" dc:"0使用file 1使用fileTwo"` + File []*ghttp.UploadFile `p:"file" dc:"附件"` + FileTwo []*comModel.UpFile `p:"fileTwo" dc:"附件"` +} + +// BusHseManagementAddRes 添加操作返回结果 +type BusHseManagementAddRes struct { + commonApi.EmptyRes +} + +// BusHseManagementEditReq 修改操作请求参数 +type BusHseManagementEditReq struct { + g.Meta `path:"/edit" tags:"HSE-巡检工单" method:"put" summary:"HSE-巡检工单整改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + File []*ghttp.UploadFile `p:"file" dc:"附件"` +} + +// BusHseManagementEditRes 修改操作返回结果 +type BusHseManagementEditRes struct { + commonApi.EmptyRes +} + +// EditReviewReq 修改操作请求参数 +type EditReviewReq struct { + g.Meta `path:"/editReview" tags:"HSE-巡检工单" method:"put" summary:"HSE-巡检工单复查"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + ReviewType string `p:"reviewType" dc:"复查状态(1通过 2未通过)" v:"required#主键ID不能为空"` + Review string `p:"review" dc:"复查情况" v:"required#复查情况不能为空"` + //Review string `p:"review" dc:"复查情况" v:"required-if:reviewType,2#状态为未通过,需填写复查"` +} + +// EditReviewRes 修改操作返回结果 +type EditReviewRes struct { + commonApi.EmptyRes +} + +// BusHseManagementGetReq 获取一条数据请求 +type BusHseManagementGetReq struct { + g.Meta `path:"/get" tags:"HSE-巡检工单" method:"get" summary:"获取HSE-巡检工单信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// BusHseManagementGetRes 获取一条数据结果 +type BusHseManagementGetRes struct { + g.Meta `mime:"application/json"` + *model.BusHseManagementDetailsRes +} + +// BusHseManagementDeleteReq 删除数据请求 +type BusHseManagementDeleteReq struct { + g.Meta `path:"/delete" tags:"HSE-巡检工单" method:"delete" summary:"删除HSE-巡检工单"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// BusHseManagementDeleteRes 删除数据返回 +type BusHseManagementDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_hse_security_log.go b/api/v1/system/bus_hse_security_log.go new file mode 100644 index 0000000..c4d63f3 --- /dev/null +++ b/api/v1/system/bus_hse_security_log.go @@ -0,0 +1,128 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-04-07 17:00:45 +// 生成路径: api/v1/system/bus_hse_security_log.go +// 生成人:gfast +// desc:HSE安全日志相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusHseSecurityLogSearchReq 分页请求参数 +type BusHseSecurityLogSearchReq struct { + g.Meta `path:"/list" tags:"HSE安全日志" method:"get" summary:"HSE安全日志列表"` + ProjectId string `p:"projectId" dc:"项目id" v:"required#项目ID不能为空"` + DateOfOccurrence []string `p:"dateOfOccurrence" dc:"发生日期(只要年月日)" v:"date-format:Y-m-d#格式为2023-10-12"` + Fill string `p:"fill" dc:"录入人"` + commonApi.PageReq + commonApi.Author +} + +// BusHseSecurityLogSearchRes 列表返回结果 +type BusHseSecurityLogSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusHseSecurityLogInfoTwoRes `json:"list"` +} + +// BusHseSecurityLogAddTxetReq 添加操作请求参数 +type BusHseSecurityLogAddTxetReq struct { + g.Meta `path:"/addText" tags:"HSE安全日志" method:"post" summary:"HSE安全日志添加(文字)"` + commonApi.Author + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + DateOfOccurrence string `p:"dateOfOccurrence" dc:"发生日期"` + AirTemperatureMax float64 `p:"airTemperatureMax" dc:"最高气温"` + AirTemperatureMin float64 `p:"airTemperatureMin" dc:"最低气温"` + Climate string `p:"climate" dc:"气候"` + Progress string `p:"progress" dc:"进展情况" v:"max-length:300#最大输入字数为300"` + JobContent string `p:"jobContent" dc:"作业内容" v:"max-length:300#最大输入字数为300"` + DiscloseTheFacts string `p:"discloseTheFacts" dc:"交底情况" v:"max-length:300#最大输入字数为300"` + ProgressOfActivity string `p:"progressOfActivity" dc:"活动情况" v:"max-length:300#最大输入字数为300"` + Examine string `p:"examine" dc:"检查情况" v:"max-length:300#最大输入字数为300"` + Implementation string `p:"implementation" dc:"实施情况" v:"max-length:300#最大输入字数为300"` + SafetyInspectionSituation string `p:"safetyInspectionSituation" dc:"安全检查情况" v:"max-length:300#最大输入字数为300"` + StoppageOrOvertime string `p:"stoppageOrOvertime" dc:"停工或加班情况" v:"max-length:300#最大输入字数为300"` + OtherRecords string `p:"otherRecords" dc:"其他情况" v:"max-length:300#最大输入字数为300"` + Remark string `p:"remark" dc:"备注"` +} + +// BusHseSecurityLogAddTxetRes 添加操作返回结果 +type BusHseSecurityLogAddTxetRes struct { + commonApi.EmptyRes +} + +// BusHseSecurityLogAddFileReq 添加操作请求参数 +type BusHseSecurityLogAddFileReq struct { + g.Meta `path:"/addFile" tags:"HSE安全日志" method:"post" summary:"HSE安全日志添加(附件)"` + commonApi.Author + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + DateOfOccurrence string `p:"dateOfOccurrence" dc:"发生日期"` + File []*ghttp.UploadFile `p:"file" dc:"附件"` + Remark string `p:"remark" dc:"备注"` +} + +// BusHseSecurityLogAddFileRes 添加操作返回结果 +type BusHseSecurityLogAddFileRes struct { + commonApi.EmptyRes +} + +// BusHseSecurityLogEditReq 修改操作请求参数 +type BusHseSecurityLogEditReq struct { + g.Meta `path:"/edit" tags:"HSE安全日志" method:"put" summary:"HSE安全日志修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + DateOfOccurrence string `p:"dateOfOccurrence" ` + AirTemperatureMax float64 `p:"airTemperatureMax" ` + AirTemperatureMin float64 `p:"airTemperatureMin" ` + Climate string `p:"climate" ` + Progress string `p:"progress" ` + JobContent string `p:"jobContent" ` + DiscloseTheFacts string `p:"discloseTheFacts" ` + ProgressOfActivity string `p:"progressOfActivity" ` + Examine string `p:"examine" ` + Implementation string `p:"implementation" ` + SafetyInspectionSituation string `p:"safetyInspectionSituation" ` + StoppageOrOvertime string `p:"stoppageOrOvertime" ` + OtherRecords string `p:"otherRecords" ` + Remark string `p:"remark" ` + UpdatedBy uint64 +} + +// BusHseSecurityLogEditRes 修改操作返回结果 +type BusHseSecurityLogEditRes struct { + commonApi.EmptyRes +} + +// BusHseSecurityLogGetReq 获取一条数据请求 +type BusHseSecurityLogGetReq struct { + g.Meta `path:"/get" tags:"HSE安全日志" method:"get" summary:"获取HSE安全日志信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusHseSecurityLogGetRes 获取一条数据结果 +type BusHseSecurityLogGetRes struct { + g.Meta `mime:"application/json"` + *model.BusHseSecurityLogInfoTwoRes +} + +// BusHseSecurityLogDeleteReq 删除数据请求 +type BusHseSecurityLogDeleteReq struct { + g.Meta `path:"/delete" tags:"HSE安全日志" method:"delete" summary:"删除HSE安全日志"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusHseSecurityLogDeleteRes 删除数据返回 +type BusHseSecurityLogDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_inspection_ticket.go b/api/v1/system/bus_inspection_ticket.go new file mode 100644 index 0000000..7015812 --- /dev/null +++ b/api/v1/system/bus_inspection_ticket.go @@ -0,0 +1,120 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-03-21 15:23:58 +// 生成路径: api/v1/system/bus_inspection_ticket.go +// 生成人:gfast +// desc:质量工单相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type UpdataCorrectorReq struct { + g.Meta `path:"/updataCorrector" tags:"质量工单" method:"put" summary:"质量工单变更整改人"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + Corrector string `p:"corrector" dc:"整改人"` +} +type UpdataCorrectorRes struct { + commonApi.EmptyRes +} + +// BusInspectionTicketSearchReq 分页请求参数 +type BusInspectionTicketSearchReq struct { + g.Meta `path:"/list" tags:"质量工单" method:"get" summary:"质量工单列表"` + ProjectId string `p:"projectId" dc:"项目ID" v:"required#项目id不能为空"` //项目ID + InspectionType string `p:"inspectionType" dc:"巡检类型"` //巡检类型(关联字典) + Status string `p:"工单状态(1通知 2整改 3验证)" dc:"工单状态"` //巡检类型(关联字典) + CreatedAt string `p:"createdAt" dc:"填报时间" v:"createdAt@date#创建时间需为YYYY-MM-DD格式"` //填报时间 + commonApi.PageReq + commonApi.Author +} + +// BusInspectionTicketSearchRes 列表返回结果 +type BusInspectionTicketSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.PcListRes `json:"list"` +} + +// BusInspectionTicketAddReq 添加操作请求参数 +type BusInspectionTicketAddReq struct { + g.Meta `path:"/add" tags:"质量工单" method:"post" summary:"质量工单添加"` + commonApi.Author + ProjectId int64 `p:"projectId" dc:"项目id" v:"required#项目ID不能为空"` + InspectionType string `p:"inspectionType" dc:"巡检类型" v:"required#巡检类型不能为空"` + InspectionHeadline string `p:"inspectionHeadline" dc:"巡检标题" v:"required#巡检标题不能为空"` + InspectionResult string `p:"inspectionResult" dc:"巡检结果" v:"required#巡检结果不能为空"` + IsReply string `p:"isReply" dc:"是否回复(1回复 2不回复)" ` + ReplyDate string `p:"replyDate" dc:"回复日期" ` + Corrector string `p:"corrector" dc:"整改人"` + CreatedBy int64 `p:"createdBy" dc:"填报人"` + HseManagementAdd int `p:"hseManagementAdd" dc:"0使用file 1使用fileTwo"` + File []*ghttp.UploadFile `p:"file" dc:"附件"` + FileTwo []*comModel.UpFile `p:"fileTwo" dc:"附件"` +} + +// BusInspectionTicketAddRes 添加操作返回结果 +type BusInspectionTicketAddRes struct { + commonApi.EmptyRes +} + +// BusInspectionTicketAbarbeitungReq 整改操作请求参数 +type BusInspectionTicketAbarbeitungReq struct { + g.Meta `path:"/editAbarbeitung" tags:"质量工单" method:"put" summary:"质量工单整改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + File []*ghttp.UploadFile `p:"file" dc:"附件"` +} + +// BusInspectionTicketAbarbeitungRes 整改操作返回结果 +type BusInspectionTicketAbarbeitungRes struct { + commonApi.EmptyRes +} + +// BusInspectionTicketVerificationReq 验证操作请求参数 +type BusInspectionTicketVerificationReq struct { + g.Meta `path:"/editVerification" tags:"质量工单" method:"put" summary:"质量工单验证"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + VerificationType string `p:"verificationType" dc:"验证状态(1通过 2未通过)"` + VerificationResult string `p:"verificationResult" dc:"结论"` +} + +// BusInspectionTicketVerificationRes 验证操作返回结果 +type BusInspectionTicketVerificationRes struct { + commonApi.EmptyRes +} + +// BusInspectionTicketGetReq 获取一条数据请求 +type BusInspectionTicketGetReq struct { + g.Meta `path:"/get" tags:"质量工单" method:"get" summary:"获取质量工单信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusInspectionTicketGetRes 获取一条数据结果 +type BusInspectionTicketGetRes struct { + g.Meta `mime:"application/json"` + Details *model.AppletDetailsRes `json:"details"` +} + +// BusInspectionTicketDeleteReq 删除数据请求 +type BusInspectionTicketDeleteReq struct { + g.Meta `path:"/delete" tags:"质量工单" method:"delete" summary:"删除质量工单"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusInspectionTicketDeleteRes 删除数据返回 +type BusInspectionTicketDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_machinery.go b/api/v1/system/bus_machinery.go new file mode 100644 index 0000000..71403b5 --- /dev/null +++ b/api/v1/system/bus_machinery.go @@ -0,0 +1,120 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-29 14:02:01 +// 生成路径: api/v1/system/bus_machinery.go +// 生成人:gfast +// desc:机械相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusMachinerySearchReq 分页请求参数 +type BusMachinerySearchReq struct { + g.Meta `path:"/list" tags:"机械" method:"get" summary:"机械列表"` + MachineryName string `p:"machineryName"` //机械名称 + ProjectId string `p:"projectId"` //项目id + Status string `p:"status"` //施工类型状态 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusMachinerySearchRes 列表返回结果 +type BusMachinerySearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusMachineryListRes `json:"list"` +} + +// BusMachineryAddReq 添加操作请求参数 +type BusMachineryAddReq struct { + g.Meta `path:"/add" tags:"机械" method:"post" summary:"机械添加"` + commonApi.Author + MachineryName string `p:"machineryName" v:"required#机械名称不能为空"` + MachineryNumber string `p:"machineryNumber" ` + ProjectId int64 `p:"projectId" ` + CheckoutNumber string `p:"checkoutNumber" ` + CheckoutUnit string `p:"checkoutUnit" ` + CheckoutDate string `p:"checkoutDate" ` + //Number int `p:"number"` + EntryTime *gtime.Time `p:"entryTime" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` + //Principal string `p:"principal" dc:"图片url"` + Remark string `p:"remark"` +} + +// BusMachineryAddRes 添加操作返回结果 +type BusMachineryAddRes struct { + commonApi.EmptyRes +} + +// BusMachineryEditReq 修改操作请求参数 +type BusMachineryEditReq struct { + g.Meta `path:"/edit" tags:"机械" method:"put" summary:"机械修改"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键ID不能为空"` + MachineryName string `p:"machineryName" v:"required#机械名称不能为空"` + MachineryNumber string `p:"machineryNumber" ` + CheckoutNumber string `p:"checkoutNumber" ` + CheckoutUnit string `p:"checkoutUnit" ` + CheckoutDate string `p:"checkoutDate" ` + Status string `p:"status" ` + //Number int `p:"number"` + EntryTime *gtime.Time `p:"entryTime"` + //Principal string `p:"principal"` + Remark string `p:"remark"` +} + +// BusMachineryEditRes 修改操作返回结果 +type BusMachineryEditRes struct { + commonApi.EmptyRes +} + +// BusMachineryGetReq 获取一条数据请求 +type BusMachineryGetReq struct { + g.Meta `path:"/get" tags:"机械" method:"get" summary:"获取机械信息"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusMachineryGetRes 获取一条数据结果 +type BusMachineryGetRes struct { + g.Meta `mime:"application/json"` + *model.BusMachineryInfoRes +} + +// BusMachineryDeleteReq 删除数据请求 +type BusMachineryDeleteReq struct { + g.Meta `path:"/delete" tags:"机械" method:"delete" summary:"删除机械"` + commonApi.Author + Ids []uint64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusMachineryDeleteRes 删除数据返回 +type BusMachineryDeleteRes struct { + commonApi.EmptyRes +} + +// app BusMachineryAppSearchReq 分页请求参数 +type BusMachineryAppSearchReq struct { + g.Meta `path:"/applist" tags:"机械" method:"get" summary:"App机械列表"` + ThreeSreach string `p:"threeSearch" dc:"机械名称|编号|负责人"` + ProjectId string `p:"projectId" dc:"项目id"` //项目id + AppStatus int `p:"appStatus" dc:"0 全部 1入场 2停用 3出场 "` //施工类型状态 + commonApi.PageReq + commonApi.Author +} + +// BusMachineryAppSearchRes 列表返回结果 +type BusMachineryAppSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusMachineryAppListRes `json:"list"` +} diff --git a/api/v1/system/bus_machinery_detail.go b/api/v1/system/bus_machinery_detail.go new file mode 100644 index 0000000..1da3618 --- /dev/null +++ b/api/v1/system/bus_machinery_detail.go @@ -0,0 +1,212 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-10-12 11:41:31 +// 生成路径: api/v1/system/bus_machinery_detail.go +// 生成人:gfast +// desc:机械详情相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusMachineryDetailSearchReq 分页请求参数 +type BusMachineryDetailSearchReq struct { + g.Meta `path:"/list" tags:"机械详情" method:"get" summary:"机械详情列表"` + MachineryId string `p:"machineryId" dc:"机械主键ID"` + CheckoutNumber string `p:"checkoutNumber"` //检验证编号 + Status string `p:"status"` //施工类型状态 + EntryTime string `p:"entryTime" v:"entryTime@datetime#入场时间需为YYYY-MM-DD hh:mm:ss格式"` //入场时间 + commonApi.PageReq + commonApi.Author +} + +// BusMachineryDetailSearchRes 列表返回结果 +type BusMachineryDetailSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusMachineryDetailListRes `json:"list"` +} + +// BusMachineryDetailAddReq 添加操作请求参数 +type BusMachineryDetailAddReq struct { + g.Meta `path:"/add" tags:"机械详情" method:"post" summary:"机械详情添加"` + commonApi.Author + Type int `p:"type" dc:"1出场 2入场" v:"between:1,2"` + CheckoutNumber string `p:"checkoutNumber" dc:"检验证编号" v:"required#检验证编号不能为空"` + CheckoutUnit string `p:"checkoutUnit" dc:"检验单位&生产厂家" v:"required#检验单位不能为空"` + CheckoutDate string `p:"checkoutDate" dc:"检定日期/有效期" v:"required#检定日期不能为空"` + Picture string `p:"picture" dc:"多个图片用逗号分隔"` + EntryTime string `p:"entryTime"dc:"入场时间"` + Remark string `p:"remark" dc:"备注"` + MachineryId string `p:"machineryId" dc:"机械主键ID"` + Principal string `p:"principal" dc:"负责人" v:"required#负责人不能为空"` +} + +// BusMachineryDetailAddRes 添加操作返回结果 +type BusMachineryDetailAddRes struct { + commonApi.EmptyRes +} + +// BusMachineryDetailEditReq 修改操作请求参数 +type BusMachineryDetailEditReq struct { + g.Meta `path:"/edit" tags:"机械详情" method:"put" summary:"机械详情修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + Type int `p:"type" dc:"1出场 2入场" v:"between:1,2"` + CheckoutNumber string `p:"checkoutNumber" dc:"检验证编号" v:"required#检验证编号不能为空"` + CheckoutUnit string `p:"checkoutUnit" dc:"检验单位" v:"required#检验单位不能为空"` + CheckoutDate string `p:"checkoutDate" dc:"检定日期/有效期" v:"required#检定日期不能为空"` + EntryTime string `p:"entryTime"dc:"入场时间"` + Status string `p:"status" dc:"施工类型状态(0正常 1停用)" v:"required#施工类型状态不能为空"` + Picture string `p:"picture" dc:"多个图片用逗号分隔"` + Remark string `p:"remark" dc:"备注"` + Principal string `p:"principal" dc:"负责人" v:"required#负责人不能为空"` +} + +// BusMachineryDetailEditRes 修改操作返回结果 +type BusMachineryDetailEditRes struct { + commonApi.EmptyRes +} + +// BusMachineryDetailGetReq 获取一条数据请求 +type BusMachineryDetailGetReq struct { + g.Meta `path:"/get" tags:"机械详情" method:"get" summary:"获取机械详情信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusMachineryDetailGetRes 获取一条数据结果 +type BusMachineryDetailGetRes struct { + g.Meta `mime:"application/json"` + *model.BusMachineryDetailGetIdInfoRes +} + +// BusMachineryDetailDeleteReq 删除数据请求 +type BusMachineryDetailDeleteReq struct { + g.Meta `path:"/delete" tags:"机械详情" method:"delete" summary:"删除机械详情"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusMachineryDetailDeleteRes 删除数据返回 +type BusMachineryDetailDeleteRes struct { + commonApi.EmptyRes +} + +//详情记录 + +// BusMachineryDetailRecordReq 删除数据请求 +type BusMachineryDetailRecordReq struct { + g.Meta `path:"/recordlist" tags:"机械详情" method:"get" summary:"机械详情记录"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusMachineryDetailRecordRes 删除数据返回 +type BusMachineryDetailRecordRes struct { + commonApi.EmptyRes +} + +// app + +// BusMachineryDetailSearchReq 分页请求参数 +type BusMachineryDetailAppSearchReq struct { + g.Meta `path:"/applist" tags:"机械详情" method:"get" summary:"App机械详情列表"` + MachineryId string `p:"machineryId" dc:"机械主键ID"` + AppStatus int `p:"appStatus" dc:"0 全部 1入场 2停用 3出场"` //施工类型状态 + commonApi.PageReq + commonApi.Author +} + +// BusMachineryDetailSearchRes 列表返回结果 +type BusMachineryDetailAppSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusMachineryDetailAppListRes `json:"list"` +} + +// BusMachineryDetailAppAddReq 添加操作请求参数 +type BusMachineryDetailAppAddReq struct { + g.Meta `path:"/appadd" tags:"机械详情" method:"post" summary:"App机械详情添加"` + commonApi.Author + //Type int `p:"type" dc:"1出场 2入场" v:"between:1,2"` + CheckoutNumber string `p:"checkoutNumber" dc:"检验证编号" v:"required#检验证编号不能为空"` + CheckoutUnit string `p:"checkoutUnit" dc:"检验单位&生产厂家" v:"required#检验单位不能为空"` + CheckoutDate string `p:"checkoutDate" dc:"检定日期/有效期" v:"required#检定日期不能为空"` + Picture string `p:"picture" dc:"多个图片用逗号分隔"` + EntryTime string `p:"entryTime" dc:"入场时间"` //入场时间 + Status string `p:"status" dc:"施工类型状态(0正常 1停用)" v:"required#施工类型状态不能为空"` + InspectionFile []model.BusMachineryDetailAddFile `json:"inspectionFile" dc:"上传设备合格校验单"` + LeaseFile []model.BusMachineryDetailAddFile `json:"leaseFile"dc:"上传设备租赁合同"` + Remark string `p:"remark" dc:"备注"` + MachineryId string `p:"machineryId" dc:"机械主键ID"` +} + +// BusMachineryDetailAppAddRes 添加操作返回结果 +type BusMachineryDetailAppAddRes struct { + commonApi.EmptyRes +} + +// BusMachineryDetailAppEditReq 修改操作请求参数 +type BusMachineryDetailAppEditReq struct { + g.Meta `path:"/appedit" tags:"机械详情" method:"put" summary:"App机械详情修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + Type int `p:"type" dc:"1出场 2入场" v:"between:1,2"` + CheckoutNumber string `p:"checkoutNumber" dc:"检验证编号" v:"required#检验证编号不能为空"` + CheckoutUnit string `p:"checkoutUnit" dc:"检验单位" v:"required#检验单位不能为空"` + CheckoutDate string `p:"checkoutDate" dc:"检定日期/有效期" v:"required#检定日期不能为空"` + Status string `p:"status" dc:"施工类型状态(0正常 1停用)" v:"required#施工类型状态不能为空"` + Picture string `p:"picture" dc:"多个图片用逗号分隔"` + InspectionFile []model.BusMachineryDetailFile `json:"inspectionFile" dc:"上传设备合格校验单"` + LeaseFile []model.BusMachineryDetailFile `json:"leaseFile"dc:"上传设备租赁合同"` + DelFile []model.BusMachineryDetailFile `p:"delFile"dc:"删除文件"` + EntryTime string `p:"entryTime" dc:"入场时间"` //入场时间 + Remark string `p:"remark" dc:"备注"` +} + +// BusMachineryDetailAppEditRes 修改操作返回结果 +type BusMachineryDetailAppEditRes struct { + commonApi.EmptyRes +} + +// BusMachineryDetailAppGetReq 获取一条数据请求 +type BusMachineryDetailAppGetReq struct { + g.Meta `path:"/appget" tags:"机械详情" method:"get" summary:"App获取机械详情信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusMachineryDetailAppGetRes 获取一条数据结果 +type BusMachineryDetailAppGetRes struct { + g.Meta `mime:"application/json"` + *model.BusMachineryDetailAppGetIdInfoRes +} + +// app退场接口 +type BusMachineryDetailAppExitReq struct { + g.Meta `path:"/appexit" tags:"机械详情" method:"get" summary:"App一键退场"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +type BusMachineryDetailAppExitRes struct { + g.Meta `mime:"application/json"` +} + +// app入场 +type BusMachineryDetailAppEntranceReq struct { + g.Meta `path:"/appentrance" tags:"机械详情" method:"get" summary:"App一键入场"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +type BusMachineryDetailAppEntranceRes struct { + g.Meta `mime:"application/json"` +} diff --git a/api/v1/system/bus_payroll_list.go b/api/v1/system/bus_payroll_list.go new file mode 100644 index 0000000..137a22c --- /dev/null +++ b/api/v1/system/bus_payroll_list.go @@ -0,0 +1,125 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-11-20 13:51:38 +// 生成路径: api/v1/system/bus_payroll_list.go +// 生成人:gfast +// desc:工资(excel导入形成的)相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type ImportExcelPaySheetReq struct { + g.Meta `path:"/importExcelPaySheet" tags:"工资表" method:"post" summary:"导入excel工资表"` + YearToDate string `p:"yearToDate" dc:"年月日+农民工工资表" v:"required#yearToDate必须"` + ExcelPath string `p:"excelPath" dc:"excel资源路径" v:"required#excelPath必须"` + Name string `p:"name" dc:"源文件名" v:"required#name必须"` + Suffix string `p:"suffix" dc:"后缀名" v:"required#suffix必须"` + commonApi.Author +} +type ImportExcelPaySheetRes struct { + commonApi.EmptyRes +} + +type ReadAllImportedListDataReq struct { + g.Meta `path:"/readAllImportedListData" tags:"工资表" method:"get" summary:"读取所有导入列表数据(汇总)"` + commonApi.Author +} +type ReadAllImportedListDataRes struct { + g.Meta `mime:"application/json"` + List []*model.BusPayrollRes `json:"list"` +} + +type GetTheSourceExcelAccordingToTheIdOfThePayrollReq struct { + g.Meta `path:"/getTheSourceExcelAccordingToTheIdOfThePayroll" tags:"工资表" method:"get" summary:"根据工资表的id获取到源excel(只允许查看)"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +type GetTheSourceExcelAccordingToTheIdOfThePayrollRes struct { + g.Meta `mime:"application/json"` + Path string `p:"path" dc:"源excel路径"` + Name string `p:"name" dc:"源文件名称"` + Suffix string `p:"suffix" dc:"源后缀名"` +} + +type BusPayrollListSearchReq struct { + g.Meta `path:"/list" tags:"工资表" method:"get" summary:"工资(excel导入形成的)列表"` + Pid int64 `p:"id" dc:"上级主键ID"` + LabourService int64 `p:"labourService" dc:"劳务公司(字符串名称)"` + GroupID int64 `p:"groupID" dc:"班组(字符串名称)"` + //commonApi.PageReq + commonApi.Author +} + +type BusPayrollListSearchRes struct { + g.Meta `mime:"application/json"` + Money string `json:"money" dc:"金额"` + Lw []int64 `json:"lw" dc:"劳务主键ID"` + Bz []int64 `json:"bz" dc:"班组主键ID"` + List []*model.BusPayrollListListRes `json:"list"` +} + +type BusDeletePayrollReq struct { + g.Meta `path:"/deletePayroll" tags:"工资表" method:"delete" summary:"删除工资目录"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +type BusDeletePayrollRes struct { + commonApi.EmptyRes +} + +// BusPayrollListAddReq 添加操作请求参数 +type BusPayrollListAddReq struct { + g.Meta `path:"/add" tags:"工资(excel导入形成的)" method:"post" summary:"工资(excel导入形成的)添加"` + commonApi.Author +} + +// BusPayrollListAddRes 添加操作返回结果 +type BusPayrollListAddRes struct { + commonApi.EmptyRes +} + +// BusPayrollListEditReq 修改操作请求参数 +type BusPayrollListEditReq struct { + g.Meta `path:"/edit" tags:"工资(excel导入形成的)" method:"put" summary:"工资(excel导入形成的)修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` +} + +// BusPayrollListEditRes 修改操作返回结果 +type BusPayrollListEditRes struct { + commonApi.EmptyRes +} + +// BusPayrollListGetReq 获取一条数据请求 +type BusPayrollListGetReq struct { + g.Meta `path:"/get" tags:"工资(excel导入形成的)" method:"get" summary:"获取工资(excel导入形成的)信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusPayrollListGetRes 获取一条数据结果 +type BusPayrollListGetRes struct { + g.Meta `mime:"application/json"` + *model.BusPayrollListInfoRes +} + +// BusPayrollListDeleteReq 删除数据请求 +type BusPayrollListDeleteReq struct { + g.Meta `path:"/delete" tags:"工资(excel导入形成的)" method:"delete" summary:"删除工资(excel导入形成的)"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusPayrollListDeleteRes 删除数据返回 +type BusPayrollListDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_projectin_progress.go b/api/v1/system/bus_projectin_progress.go new file mode 100644 index 0000000..a0b5cc3 --- /dev/null +++ b/api/v1/system/bus_projectin_progress.go @@ -0,0 +1,100 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-03-20 19:45:19 +// 生成路径: api/v1/system/bus_projectin_progress.go +// 生成人:gfast +// desc:在建项目相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusProjectinProgressSearchReq 分页请求参数 +type BusProjectinProgressSearchReq struct { + g.Meta `path:"/list" tags:"在建项目" method:"get" summary:"在建项目列表"` + Id string `p:"id"` //主键ID + ProjectId string `p:"projectId" v:"projectId@integer#项目ID需为整数"` //项目ID + ParallelIn string `p:"parallelIn" v:"parallelIn@integer#并网容量需为整数"` //并网容量 + CreatedBy string `p:"createdBy" v:"createdBy@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusProjectinProgressSearchRes 列表返回结果 +type BusProjectinProgressSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusProjectinProgressListRes `json:"list"` +} + +// BusProjectinProgressAddReq 添加操作请求参数 +type BusProjectinProgressAddReq struct { + g.Meta `path:"/add" tags:"在建项目" method:"post" summary:"在建项目添加"` + commonApi.Author + ProjectId int64 `p:"projectId" ` + ParallelIn float64 `p:"parallelIn" ` + CreatedBy uint64 +} + +// BusProjectinProgressAddRes 添加操作返回结果 +type BusProjectinProgressAddRes struct { + commonApi.EmptyRes +} + +// BusProjectinProgressEditReq 修改操作请求参数 +type BusProjectinProgressEditReq struct { + g.Meta `path:"/edit" tags:"在建项目" method:"put" summary:"在建项目修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + ProjectId int64 `p:"projectId" ` + ParallelIn float64 `p:"parallelIn" ` +} + +// BusProjectinProgressEditRes 修改操作返回结果 +type BusProjectinProgressEditRes struct { + commonApi.EmptyRes +} + +// BusProjectinProgressGetReq 获取一条数据请求 +type BusProjectinProgressGetReq struct { + g.Meta `path:"/get" tags:"在建项目" method:"get" summary:"获取在建项目信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusProjectinProgressGetRes 获取一条数据结果 +type BusProjectinProgressGetRes struct { + g.Meta `mime:"application/json"` + *model.BusProjectinProgressInfoRes +} + +// BusProjectinProgressDeleteReq 删除数据请求 +type BusProjectinProgressDeleteReq struct { + g.Meta `path:"/delete" tags:"在建项目" method:"delete" summary:"删除在建项目"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusProjectinProgressDeleteRes 删除数据返回 +type BusProjectinProgressDeleteRes struct { + commonApi.EmptyRes +} + +type BusProjectinProgressSearchAllReq struct { + g.Meta `path:"/listAll" tags:"在建项目" method:"get" summary:"GIS在建项目"` + commonApi.Author +} + +type BusProjectinProgressSearchAllRes struct { + g.Meta `mime:"application/json"` + SumNum int `p:"ids" dc:"项目总数" ` + WindPower int `p:"windPower" dc:"风电项目" ` + Photovoltaic int `p:"photovoltaic" dc:"光伏项目"` + ParallelIn float64 `p:"parallelIn" dc:"并网容量"` +} diff --git a/api/v1/system/bus_quality.go b/api/v1/system/bus_quality.go new file mode 100644 index 0000000..8808735 --- /dev/null +++ b/api/v1/system/bus_quality.go @@ -0,0 +1,158 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-02 17:11:39 +// 生成路径: api/v1/system/bus_quality.go +// 生成人:gfast +// desc:质量文档管理相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusQualitySearchReq 分页请求参数 +type BusQualitySearchReq struct { + g.Meta `path:"/list" tags:"质量文档管理" method:"get" summary:"质量文档管理列表"` + QualityName string `p:"qualityName"` //质量检查名称 + QualityType string `p:"qualityType"` //质量类型 + Status string `p:"status"` //帐号状态 + ProjectId string `p:"projectId"` //项目id + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusQualitySearchRes 列表返回结果 +type BusQualitySearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusQualityListRes `json:"list"` +} + +// BusQualityAddReq 添加操作请求参数 +type BusQualityAddReq struct { + g.Meta `path:"/add" tags:"质量文档管理" method:"post" summary:"质量文档管理添加"` + commonApi.Author + WxOrPc string `p:"wxOrPc" dc:"参数为1表示pc添加 否则为小程序添加" v:"required#wxOrPc不能为空"` + Openid string `p:"openid" v:"required-unless:WxOrPc,1#需要填写小程序的openid"` + QualityName string `p:"qualityName" v:"required#质量检查名称不能为空"` + QualityExplain string `p:"qualityExplain" ` + QualityDocument []*comModel.UpFile `p:"qualityDocument" ` + QualityType string `p:"qualityType" ` + ProjectId int64 `p:"projectId" ` +} + +// BusQualityAddRes 添加操作返回结果 +type BusQualityAddRes struct { + commonApi.EmptyRes +} + +// BusQualityEditReq 修改操作请求参数 +type BusQualityEditReq struct { + g.Meta `path:"/edit" tags:"质量文档管理" method:"put" summary:"质量文档管理修改"` + commonApi.Author + WxOrPc string `p:"wxOrPc" dc:"参数为1表示pc添加 否则为小程序添加" v:"required#wxOrPc不能为空"` + Openid string `p:"openid" v:"required-unless:WxOrPc,1#需要填写小程序的openid"` + Id uint64 `p:"id" v:"required#主键ID不能为空"` + QualityName string `p:"qualityName" v:"required#质量检查名称不能为空"` + QualityExplain string `p:"qualityExplain" ` + QualityDocument []*comModel.UpFile `p:"qualityDocument" ` + QualityType string `p:"qualityType" ` + ProjectId int64 `p:"projectId" ` + Status string `p:"status" v:"required#帐号状态不能为空"` +} + +// BusQualityEditRes 修改操作返回结果 +type BusQualityEditRes struct { + commonApi.EmptyRes +} + +// BusQualityGetReq 获取一条数据请求 +type BusQualityGetReq struct { + g.Meta `path:"/get" tags:"质量文档管理" method:"get" summary:"获取质量文档管理信息"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusQualityGetRes 获取一条数据结果 +type BusQualityGetRes struct { + g.Meta `mime:"application/json"` + *model.BusQualityInfoRes +} + +// BusQualityDeleteReq 删除数据请求 +type BusQualityDeleteReq struct { + g.Meta `path:"/delete" tags:"质量文档管理" method:"delete" summary:"删除质量文档管理"` + commonApi.Author + Ids []uint64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusQualityDeleteRes 删除数据返回 +type BusQualityDeleteRes struct { + commonApi.EmptyRes +} + +// GraphReq 图标统计 +type GraphReq struct { + g.Meta `path:"/graph" tags:"质量文档管理" method:"get" summary:"安全情况-图标统计"` + ProjectId string `json:"projectId" v:"required#项目ID必须"` + commonApi.Author +} + +// GraphRes 图标统计 +type GraphRes struct { + g.Meta `mime:"application/json"` + GraphList []*GraphListRes `json:"list"` +} + +type GraphListRes struct { + GraphStatus string `p:"graphStatus" dc:"类型 0表示站班会"` + GraphName string `p:"graphName" dc:"名称"` + GraphNumber int `p:"graphNumber" dc:"数量"` +} + +// GraphDataListReq 图标统计列表 +type GraphDataListReq struct { + g.Meta `path:"/graphDataList" tags:"质量文档管理" method:"get" summary:"安全情况-图标统计列表"` + GraphStatus string `json:"graphStatus" v:"required#类型必须"` + ProjectId string `json:"projectId" v:"required#项目ID必须"` + commonApi.Author + commonApi.PageReq +} + +// GraphDataListRes 图标统计列表 +type GraphDataListRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + GraphDataList []*GraphDataListTwoRes `json:"list"` +} + +type GraphDataListTwoRes struct { + Id int64 `p:"id" dc:"主键ID"` + Name string `p:"name" dc:"名称"` + DateTime *gtime.Time `p:"dateTime" dc:"时间"` + Type string `p:"type" dc:"类型 0站班会 1案例"` +} + +// WxBusQualityAddReq 添加操作请求参数 +type WxBusQualityAddReq struct { + g.Meta `path:"/wxAdd" tags:"质量文档管理" method:"post" summary:"微信小程序-质量文档管理添加"` + commonApi.Author + QualityName string `p:"qualityName" v:"required#质量检查名称不能为空"` + QualityExplain string `p:"qualityExplain" ` + QualityDocument []*comModel.UpFile `p:"qualityDocument" ` + QualityType string `p:"qualityType" ` + ProjectId int64 `p:"projectId" ` +} + +// WxBusQualityAddRes 添加操作返回结果 +type WxBusQualityAddRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_question_bank.go b/api/v1/system/bus_question_bank.go new file mode 100644 index 0000000..8415971 --- /dev/null +++ b/api/v1/system/bus_question_bank.go @@ -0,0 +1,124 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-10-07 15:52:18 +// 生成路径: api/v1/system/bus_question_bank.go +// 生成人:gfast +// desc:题库相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusQuestionBankSearchReq 分页请求参数 +type BusQuestionBankSearchReq struct { + g.Meta `path:"/list" tags:"题库" method:"get" summary:"题库列表"` + CategoryId string `p:"categoryId" v:"categoryId@integer#题目类别需为整数"` //题目类别 + QuestionType string `p:"questionType"` //题目类型(1单选、2多选、3判断、4填空、5问答) + QuestionText string `p:"questionText"` //题目内容 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusQuestionBankSearchRes 列表返回结果 +type BusQuestionBankSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusQuestionBankListRes `json:"list"` +} + +// BusQuestionBankAddReq 添加操作请求参数 +type BusQuestionBankAddReq struct { + g.Meta `path:"/add" tags:"题库" method:"post" summary:"题库添加"` + commonApi.Author + CategoryId int64 `p:"categoryId" v:"required#题目类别不能为空"` + QuestionType string `p:"questionType" v:"required#题目类型(1单选、2多选、3判断、4填空、5问答)不能为空"` + QuestionText string `p:"questionText" ` + Options string `p:"options" ` + CorrectAnswer string `p:"correctAnswer" ` + //Score float64 `p:"score" ` + WxOrPc string `p:"wxOrPc" v:"required#创建人类型(1pc、2小程序)不能为空"` +} + +// BusQuestionBankAddRes 添加操作返回结果 +type BusQuestionBankAddRes struct { + commonApi.EmptyRes +} + +// BusQuestionBankEditReq 修改操作请求参数 +type BusQuestionBankEditReq struct { + g.Meta `path:"/edit" tags:"题库" method:"put" summary:"题库修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + CategoryId int64 `p:"categoryId" v:"required#题目类别不能为空"` + QuestionType string `p:"questionType" v:"required#题目类型(1单选、2多选、3判断、4填空、5问答)不能为空"` + QuestionText string `p:"questionText" ` + Options string `p:"options" ` + CorrectAnswer string `p:"correctAnswer" ` + //Score float64 `p:"score" ` + WxOrPc string `p:"wxOrPc" v:"required#创建人类型(1pc、2小程序)不能为空"` +} + +// BusQuestionBankEditRes 修改操作返回结果 +type BusQuestionBankEditRes struct { + commonApi.EmptyRes +} + +// BusQuestionBankGetReq 获取一条数据请求 +type BusQuestionBankGetReq struct { + g.Meta `path:"/get" tags:"题库" method:"get" summary:"获取题库信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusQuestionBankGetRes 获取一条数据结果 +type BusQuestionBankGetRes struct { + g.Meta `mime:"application/json"` + *model.BusQuestionBankInfoRes +} + +// BusQuestionBankDeleteReq 删除数据请求 +type BusQuestionBankDeleteReq struct { + g.Meta `path:"/delete" tags:"题库" method:"delete" summary:"删除题库"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusQuestionBankDeleteRes 删除数据返回 +type BusQuestionBankDeleteRes struct { + commonApi.EmptyRes +} + +// ExaminationPaperReq 生成试卷 +type ExaminationPaperReq struct { + g.Meta `path:"/examinationPaper" tags:"题库" method:"get" summary:"生成试卷"` + commonApi.Author +} + +// ExaminationPaperRes 生成试卷返回结果 +type ExaminationPaperRes struct { + g.Meta `mime:"application/json"` + Maximum int `p:"最大考试时间(分钟)"` + Single *ExaminationPaperOne `json:"singleList" dc:"单选题"` + Multiple *ExaminationPaperOne `json:"multipleList" dc:"多选题"` + Estimate *ExaminationPaperOne `json:"estimateList" dc:"判断题"` +} + +type ExaminationPaperOne struct { + Topic string `p:"categoryId" dc:"题目+分数"` + List []*ExaminationPaperTwo `json:"list"` +} + +type ExaminationPaperTwo struct { + Id int64 `json:"id" dc:"题库id"` + QuestionType string `json:"questionType" dc:"题类型"` + QuestionText string `json:"questionText" dc:"题内容"` + Options string `json:"options" dc:"题选项"` + Score float64 `json:"score" dc:"题分数"` +} diff --git a/api/v1/system/bus_question_save.go b/api/v1/system/bus_question_save.go new file mode 100644 index 0000000..595f11e --- /dev/null +++ b/api/v1/system/bus_question_save.go @@ -0,0 +1,155 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-11-01 17:33:04 +// 生成路径: api/v1/system/bus_question_save.go +// 生成人:gfast +// desc:用户试卷存储相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusQuestionSaveSearchReq 分页请求参数 +type BusQuestionSaveSearchReq struct { + g.Meta `path:"/list" tags:"用户试卷存储" method:"get" summary:"用户试卷存储列表"` + Id string `p:"id"` //主键ID + Openid string `p:"openid"` //openid + BankId string `p:"bankId" v:"bankId@integer#题库ID需为整数"` //题库ID + Answer string `p:"answer"` //答案 + Correct string `p:"correct"` //答题是否正确(1正确 2错误) + Score string `p:"score" v:"score@float#得分(当前题)需为浮点数"` //得分(当前题) + Sign string `p:"sign"` //签名路径 + TakeTime string `p:"takeTime" v:"takeTime@integer#用时时间(时间戳/秒)需为整数"` //用时时间(时间戳/秒) + TimeOut string `p:"timeOut" v:"timeOut@integer#最大超时时间(单位/分钟)需为整数"` //最大超时时间(单位/分钟) + Pass string `p:"pass"` //及格线/总分(格式:60,100) + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusQuestionSaveSearchRes 列表返回结果 +type BusQuestionSaveSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusQuestionSaveListRes `json:"list"` +} + +// BusQuestionSaveAddReq 添加操作请求参数 +type BusQuestionSaveAddReq struct { + g.Meta `path:"/add" tags:"用户试卷存储" method:"post" summary:"用户试卷存储添加"` + commonApi.Author + Openid string `p:"openid" dc:"openid"` + //Sign *ghttp.UploadFile `p:"sign" dc:"签名(http图上传)"` + TakeTime int64 `p:"takeTime" dc:"用时时间(时间戳/秒)"` + List []*BusQuestionSaveAddEntity `json:"list"` +} + +// BusQuestionSaveAddRes 添加操作返回结果 +type BusQuestionSaveAddRes struct { + commonApi.EmptyRes + AnswerTime int `p:"answerTime" dc:"总考试时间(分钟)"` + TakeTime int64 `p:"takeTime" dc:"用时时间(时间戳/秒)"` + FullMark float64 `json:"fullMark" dc:"满分"` + PassingScore float64 `json:"passingScore" dc:"及格分"` + Score float64 `json:"score" dc:"当前分"` + Number int `json:"number" dc:"答对题数"` + PdfStr string `json:"pdfStr" dc:"试卷"` +} + +type BusQuestionSaveAddEntity struct { + BankId int64 `json:"bankId" dc:"题库ID"` + Answer string `json:"answer" dc:"答案"` + Score float64 `json:"score" dc:"当前题分数"` +} + +// BusQuestionSaveGetReq 获取一条数据请求 +type BusQuestionSaveGetReq struct { + g.Meta `path:"/get" tags:"用户试卷存储" method:"get" summary:"获取用户试卷存储信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusQuestionSaveGetRes 获取一条数据结果 +type BusQuestionSaveGetRes struct { + g.Meta `mime:"application/json"` + *model.BusQuestionSaveInfoRes +} + +// BusQuestionSaveDeleteReq 删除数据请求 +type BusQuestionSaveDeleteReq struct { + g.Meta `path:"/delete" tags:"用户试卷存储" method:"delete" summary:"删除用户试卷存储"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusQuestionSaveDeleteRes 删除数据返回 +type BusQuestionSaveDeleteRes struct { + commonApi.EmptyRes +} + +// PassOrNotReq 查询用户的考试是否已达到及格线 +type PassOrNotReq struct { + g.Meta `path:"/passOrNot" tags:"用户试卷存储" method:"get" summary:"查询用户的考试是否已达到及格线"` + commonApi.Author + Openid string `p:"openid" v:"required#openid必须"` +} + +// PassOrNotRes 查询用户的考试是否已达到及格线 +type PassOrNotRes struct { + g.Meta `mime:"application/json"` + IsPass string `json:"isPass" dc:"成绩是否合格(1及格 2不及格 3暂无记录)"` + PdfStr string `json:"pdfStr" dc:"上次考试的试卷(PDF格式)"` + Type string `json:"type" dc:"1pdf 2图片"` +} + +// WeChatPdfWoReq 根据项目id+班组id 查询到当前用户的考试信息 +type WeChatPdfWoReq struct { + g.Meta `path:"/weChatPdfWo" tags:"用户试卷存储" method:"get" summary:"根据项目id或者加班组id 查询到当前用户的考试信息(安全考试)"` + ProjectId int64 `p:"projectId" dc:"项目id" v:"required#项目ID必须"` + TeamId int64 `p:"teamId" dc:"班组id"` + Name string `p:"name" dc:"名称"` + commonApi.PageReq + commonApi.Author + //commonApi.Paging +} + +// WeChatPdfWoRes 根据项目id+班组id 查询到当前用户的考试信息 +type WeChatPdfWoRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.ModelWeChatPdfWoRes `json:"list"` +} + +// MultifileDownloadReq 批量下载用户试卷 +type MultifileDownloadReq struct { + g.Meta `path:"/multifileDownload" tags:"用户试卷存储" method:"get" summary:"批量下载用户试卷"` + //ProjectId int64 `p:"projectId" dc:"项目id" ` + //TeamId int64 `p:"teamId" dc:"班组id" ` + Openids []string `p:"openids" dc:"openid,传入openid就不需要项目和班组id" v:"required#班组ID必须"` + commonApi.Author +} + +// MultifileDownloadRes 批量下载用户试卷 +type MultifileDownloadRes struct { + g.Meta `mime:"application/json"` + Path string `json:"path"` +} + +// UploadZipFileReq 上传施工人员线下安全考试(上传压缩zip文件) +type UploadZipFileReq struct { + g.Meta `path:"/uploadZipFile" tags:"用户试卷存储" method:"post" summary:"上传施工人员线下安全考试(上传压缩zip文件)"` + //File *ghttp.UploadFile `p:"file" ` + FilePath string `p:"filePath" ` + commonApi.Author +} + +// UploadZipFileRes 上传施工人员线下安全考试(上传压缩zip文件) +type UploadZipFileRes struct { + g.Meta `mime:"application/json"` +} diff --git a/api/v1/system/bus_questions_configuration.go b/api/v1/system/bus_questions_configuration.go new file mode 100644 index 0000000..0efdd84 --- /dev/null +++ b/api/v1/system/bus_questions_configuration.go @@ -0,0 +1,96 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-10-07 17:11:20 +// 生成路径: api/v1/system/bus_questions_configuration.go +// 生成人:gfast +// desc:题库配置相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusQuestionsConfigurationSearchReq 分页请求参数 +type BusQuestionsConfigurationSearchReq struct { + g.Meta `path:"/list" tags:"题库配置" method:"get" summary:"题库配置列表"` + commonApi.PageReq + commonApi.Author +} + +// BusQuestionsConfigurationSearchRes 列表返回结果 +type BusQuestionsConfigurationSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusQuestionsConfigurationListRes `json:"list"` +} + +// BusQuestionsConfigurationAddReq 添加操作请求参数 +type BusQuestionsConfigurationAddReq struct { + g.Meta `path:"/add" tags:"题库配置" method:"post" summary:"题库配置添加"` + commonApi.Author + SingleChoice int `p:"singleChoice" dc:"单选题(单位/道)" v:"required#单选题(单位/道)不能为空"` + SingleScore float64 `p:"singleScore" dc:"单选分数" v:"required#单选分数不能为空"` + MultipleChoice int `p:"multipleChoice" dc:"多选题(单位/道)" v:"required#多选题(单位/道)不能为空"` + MultipleScore float64 `p:"multipleScore" dc:"多选分数" v:"required#多选分数不能为空"` + Estimate int `p:"estimate" dc:"判断题(单位/道)" v:"required#判断题(单位/道)不能为空"` + EstimateScore float64 `p:"estimateScore" dc:"判断分数" v:"required#判断分数不能为空"` + FullMark float64 `p:"fullMark" dc:"满分" v:"required#满分不能为空"` + PassingScore float64 `p:"passingScore" dc:"及格线" v:"required#及格线不能为空"` + AnswerTime float64 `p:"answerTime" dc:"答题最大超时时间" v:"min:0#及格线不能为空"` +} + +// BusQuestionsConfigurationAddRes 添加操作返回结果 +type BusQuestionsConfigurationAddRes struct { + commonApi.EmptyRes +} + +// BusQuestionsConfigurationEditReq 修改操作请求参数 +type BusQuestionsConfigurationEditReq struct { + g.Meta `path:"/edit" tags:"题库配置" method:"put" summary:"题库配置修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + SingleChoice int `p:"singleChoice" dc:"单选题(单位/道)" v:"required#单选题(单位/道)不能为空"` + SingleScore float64 `p:"singleScore" dc:"单选分数" v:"required#单选分数不能为空"` + MultipleChoice int `p:"multipleChoice" dc:"多选题(单位/道)" v:"required#多选题(单位/道)不能为空"` + MultipleScore float64 `p:"multipleScore" dc:"多选分数" v:"required#多选分数不能为空"` + Estimate int `p:"estimate" dc:"判断题(单位/道)" v:"required#判断题(单位/道)不能为空"` + EstimateScore float64 `p:"estimateScore" dc:"判断分数" v:"required#判断分数不能为空"` + FullMark float64 `p:"fullMark" dc:"满分" v:"required#满分不能为空"` + PassingScore float64 `p:"passingScore" dc:"及格线" v:"required#及格线不能为空"` + AnswerTime float64 `p:"answerTime" dc:"答题最大超时时间" v:"min:0#及格线不能为空"` +} + +// BusQuestionsConfigurationEditRes 修改操作返回结果 +type BusQuestionsConfigurationEditRes struct { + commonApi.EmptyRes +} + +// BusQuestionsConfigurationGetReq 获取一条数据请求 +type BusQuestionsConfigurationGetReq struct { + g.Meta `path:"/get" tags:"题库配置" method:"get" summary:"获取题库配置信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusQuestionsConfigurationGetRes 获取一条数据结果 +type BusQuestionsConfigurationGetRes struct { + g.Meta `mime:"application/json"` + *model.BusQuestionsConfigurationInfoRes +} + +// BusQuestionsConfigurationDeleteReq 删除数据请求 +type BusQuestionsConfigurationDeleteReq struct { + g.Meta `path:"/delete" tags:"题库配置" method:"delete" summary:"删除题库配置"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusQuestionsConfigurationDeleteRes 删除数据返回 +type BusQuestionsConfigurationDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_reissue_a_card.go b/api/v1/system/bus_reissue_a_card.go new file mode 100644 index 0000000..73bc119 --- /dev/null +++ b/api/v1/system/bus_reissue_a_card.go @@ -0,0 +1,94 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-02-02 15:18:48 +// 生成路径: api/v1/system/bus_reissue_a_card.go +// 生成人:gfast +// desc:施工人员补卡申请相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusReissueACardSearchReq 分页请求参数 +type BusReissueACardSearchReq struct { + g.Meta `path:"/list" tags:"施工人员补卡申请" method:"get" summary:"施工人员补卡申请列表"` + Name string `p:"name" dc:"根据名称模糊查询"` + ProjectId int64 `p:"projectId" dc:"项目id"` + TeamId int64 `p:"teamId" dc:"班组id"` + ManagerOpinion string `p:"managerOpinion" dc:"管理员意见(1未读 2同意 3拒绝)"` + commonApi.PageReq + commonApi.Author +} + +// BusReissueACardSearchRes 列表返回结果 +type BusReissueACardSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusReissueACardListRes `json:"list"` +} + +// BusReissueACardAddReq 添加操作请求参数 +type BusReissueACardAddReq struct { + g.Meta `path:"/add" tags:"施工人员补卡申请" method:"post" summary:"施工人员补卡申请添加"` + commonApi.Author + Openid string `p:"openid" ` + Scope string `p:"scope" ` + Explain string `p:"explain" ` + Ganger string `p:"ganger" ` + GangerOpinion string `p:"gangerOpinion" ` + GangerExplain string `p:"gangerExplain" ` + GangerTime *gtime.Time `p:"gangerTime" ` + ManagerOpinion string `p:"managerOpinion" ` + ManagerExplain string `p:"managerExplain" ` +} + +// BusReissueACardAddRes 添加操作返回结果 +type BusReissueACardAddRes struct { + commonApi.EmptyRes +} + +// BusReissueACardEditReq 修改操作请求参数 +type BusReissueACardEditReq struct { + g.Meta `path:"/edit" tags:"施工人员补卡申请" method:"put" summary:"施工人员补卡申请修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + ManagerOpinion string `p:"managerOpinion" dc:"管理员意见(1未读 2同意 3拒绝)"` + ManagerExplain string `p:"managerExplain" dc:"拒绝说明" v:"required-if:managerOpinion,3#请填写拒绝说明"` +} + +// BusReissueACardEditRes 修改操作返回结果 +type BusReissueACardEditRes struct { + commonApi.EmptyRes +} + +// BusReissueACardGetReq 获取一条数据请求 +type BusReissueACardGetReq struct { + g.Meta `path:"/get" tags:"施工人员补卡申请" method:"get" summary:"获取施工人员补卡申请信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusReissueACardGetRes 获取一条数据结果 +type BusReissueACardGetRes struct { + g.Meta `mime:"application/json"` + *model.BusReissueACardInfoRes +} + +// BusReissueACardDeleteReq 删除数据请求 +type BusReissueACardDeleteReq struct { + g.Meta `path:"/delete" tags:"施工人员补卡申请" method:"delete" summary:"删除施工人员补卡申请"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusReissueACardDeleteRes 删除数据返回 +type BusReissueACardDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_research_document.go b/api/v1/system/bus_research_document.go new file mode 100644 index 0000000..a5ec450 --- /dev/null +++ b/api/v1/system/bus_research_document.go @@ -0,0 +1,94 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-29 16:04:06 +// 生成路径: api/v1/system/bus_research_document.go +// 生成人:gfast +// desc:科研文档相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusResearchDocumentSearchReq 分页请求参数 +type BusResearchDocumentSearchReq struct { + g.Meta `path:"/list" tags:"科研文档" method:"get" summary:"科研文档列表"` + FileId string `p:"fileId" ` + ProjectId string `p:"projectId" ` + DocumenName string `p:"documenName"` //文档名称 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#上传时间需为YYYY-MM-DD hh:mm:ss格式"` //上传时间 + commonApi.PageReq + commonApi.Author +} + +// BusResearchDocumentSearchRes 列表返回结果 +type BusResearchDocumentSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusResearchDocumentListRes `json:"list"` +} + +// BusResearchDocumentAddReq 添加操作请求参数 +type BusResearchDocumentAddReq struct { + g.Meta `path:"/add" tags:"科研文档" method:"post" summary:"科研文档添加"` + commonApi.Author + //DocumenName string `p:"documenName" v:"required#文档名称不能为空"` + //DocumentUrl string `p:"documentUrl" ` + FileId int64 `p:"fileId" ` + ProjectId int64 `p:"projectId" ` + FileUrl []*comModel.UpFile `p:"fileUrl" ` +} + +// BusResearchDocumentAddRes 添加操作返回结果 +type BusResearchDocumentAddRes struct { + commonApi.EmptyRes +} + +// BusResearchDocumentEditReq 修改操作请求参数 +type BusResearchDocumentEditReq struct { + g.Meta `path:"/edit" tags:"科研文档" method:"put" summary:"科研文档修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + FileUrl []*comModel.UpFile `p:"fileUrl" ` + Remark string `p:"remark" ` + FileId int64 `p:"fileId" ` + ProjectId int64 `p:"projectId" ` + //DocumenName string `p:"documenName" v:"required#文档名称不能为空"` + //DocumentUrl string `p:"documentUrl" ` +} + +// BusResearchDocumentEditRes 修改操作返回结果 +type BusResearchDocumentEditRes struct { + commonApi.EmptyRes +} + +// BusResearchDocumentGetReq 获取一条数据请求 +type BusResearchDocumentGetReq struct { + g.Meta `path:"/get" tags:"科研文档" method:"get" summary:"获取科研文档信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusResearchDocumentGetRes 获取一条数据结果 +type BusResearchDocumentGetRes struct { + g.Meta `mime:"application/json"` + *model.BusResearchDocumentInfoRes +} + +// BusResearchDocumentDeleteReq 删除数据请求 +type BusResearchDocumentDeleteReq struct { + g.Meta `path:"/delete" tags:"科研文档" method:"delete" summary:"删除科研文档"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusResearchDocumentDeleteRes 删除数据返回 +type BusResearchDocumentDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_safety.go b/api/v1/system/bus_safety.go new file mode 100644 index 0000000..1dba51c --- /dev/null +++ b/api/v1/system/bus_safety.go @@ -0,0 +1,126 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-02 15:40:48 +// 生成路径: api/v1/system/bus_safety.go +// 生成人:gfast +// desc:安全例会管理相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusSafetySearchReq 分页请求参数 +type BusSafetySearchReq struct { + g.Meta `path:"/list" tags:"安全例会管理" method:"get" summary:"安全例会管理列表"` + SafetyName string `p:"safetyName"` //安全检查名称 + SafetyExplain string `p:"safetyExplain"` //安全说明 + SafetyDocument string `p:"safetyDocument"` //安全检查文件 + SafetyType string `p:"safetyType"` //安全类型 + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` //项目id + Status string `p:"status"` //帐号状态 + CreateBy string `p:"createBy"` //创建者 + UpdateAt string `p:"updateAt"` //更新者 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusSafetySearchRes 列表返回结果 +type BusSafetySearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusSafetyListRes `json:"list"` +} + +// BusSafetyAddReq 添加操作请求参数 +type BusSafetyAddReq struct { + g.Meta `path:"/add" tags:"安全例会管理" method:"post" summary:"安全例会管理添加"` + commonApi.Author + WxOrPc string `p:"wxOrPc" dc:"参数为1表示pc添加 否则为小程序添加" v:"required#wxOrPc不能为空"` + Openid string `p:"openid" v:"required-unless:WxOrPc,1#需要填写小程序的openid"` + SafetyName string `p:"safetyName" v:"required#安全检查名称不能为空"` + SafetyExplain string `p:"safetyExplain" ` + SafetyDocument []*comModel.UpFile `p:"safetyDocument" ` + SafetyType string `p:"safetyType" v:"required#安全类型不能为空"` + ProjectId int64 `p:"projectId" v:"required#项目id不能为空"` + SafetyGrade int64 `p:"safetyGrade" ` + StartDate *gtime.Time `p:"startDate" ` +} + +// BusSafetyAddRes 添加操作返回结果 +type BusSafetyAddRes struct { + commonApi.EmptyRes +} + +// BusSafetyEditReq 修改操作请求参数 +type BusSafetyEditReq struct { + g.Meta `path:"/edit" tags:"安全例会管理" method:"put" summary:"安全例会管理修改"` + commonApi.Author + WxOrPc string `p:"wxOrPc" dc:"参数为1表示pc添加 否则为小程序添加" v:"required#wxOrPc不能为空"` + Openid string `p:"openid" v:"required-unless:WxOrPc,1#需要填写小程序的openid"` + Id int64 `p:"id" v:"required#主键ID不能为空"` + SafetyName string `p:"safetyName" v:"required#安全检查名称不能为空"` + SafetyExplain string `p:"safetyExplain" ` + SafetyDocument []*comModel.UpFile `p:"safetyDocument" ` + SafetyType string `p:"safetyType" v:"required#安全类型不能为空"` + //ProjectId int64 `p:"projectId" ` + Status string `p:"status" v:"required#帐号状态不能为空"` + SafetyGrade int64 `p:"safetyGrade" ` +} + +// BusSafetyEditRes 修改操作返回结果 +type BusSafetyEditRes struct { + commonApi.EmptyRes +} + +// BusSafetyGetReq 获取一条数据请求 +type BusSafetyGetReq struct { + g.Meta `path:"/get" tags:"安全例会管理" method:"get" summary:"获取安全例会管理信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusSafetyGetRes 获取一条数据结果 +type BusSafetyGetRes struct { + g.Meta `mime:"application/json"` + *model.BusSafetyInfoRes +} + +// BusSafetyDeleteReq 删除数据请求 +type BusSafetyDeleteReq struct { + g.Meta `path:"/delete" tags:"安全例会管理" method:"delete" summary:"删除安全例会管理"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusSafetyDeleteRes 删除数据返回 +type BusSafetyDeleteRes struct { + commonApi.EmptyRes +} + +// WxBusSafetyAddReq 添加操作请求参数 +type WxBusSafetyAddReq struct { + g.Meta `path:"/wxAdd" tags:"安全例会管理" method:"post" summary:"微信小程序-安全例会管理添加"` + commonApi.Author + SafetyName string `p:"safetyName" v:"required#安全检查名称不能为空"` + Openid string `p:"openid" v:"required#小程序openid不能为空"` + SafetyExplain string `p:"safetyExplain" ` + SafetyDocument []*comModel.UpFile `p:"safetyDocument" ` + SafetyType string `p:"safetyType" v:"required#安全类型不能为空"` + ProjectId int64 `p:"projectId" ` + SafetyGrade string `p:"safetyGrade" ` + StartDate *gtime.Time `p:"startDate" ` +} + +// WxBusSafetyAddRes 添加操作返回结果 +type WxBusSafetyAddRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_salary_details.go b/api/v1/system/bus_salary_details.go new file mode 100644 index 0000000..85e9c8e --- /dev/null +++ b/api/v1/system/bus_salary_details.go @@ -0,0 +1,116 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-02-01 16:39:01 +// 生成路径: api/v1/system/bus_salary_details.go +// 生成人:gfast +// desc:员工工资考核记录相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusSalaryDetailsSearchReq 分页请求参数 +type BusSalaryDetailsSearchReq struct { + g.Meta `path:"/list" tags:"员工工资考核记录" method:"get" summary:"员工工资考核记录列表"` + Id string `p:"id"` //主键ID + SfzNumber string `p:"sfzNumber"` //身份证 + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` //项目id + TeamId string `p:"teamId" v:"teamId@integer#班组id需为整数"` //班组id + DateOfIssue string `p:"dateOfIssue" dc:"工作年月" v:"date-format:Y-m#格式为2024-02"` + commonApi.PageReq + commonApi.Author +} + +// BusSalaryDetailsSearchRes 列表返回结果 +type BusSalaryDetailsSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusSalaryDetailsListRes `json:"list"` +} + +// BusSalaryDetailsAddReq 添加操作请求参数 +type BusSalaryDetailsAddReq struct { + g.Meta `path:"/add" tags:"员工工资考核记录" method:"post" summary:"员工工资考核记录添加"` + commonApi.Author + DataList []model.AttendanceImportRes `p:"dataList" dc:"考勤信息"` +} + +// BusSalaryDetailsAddRes 添加操作返回结果 +type BusSalaryDetailsAddRes struct { + commonApi.EmptyRes +} + +// BusSalaryDetailsEditReq 修改操作请求参数 +type BusSalaryDetailsEditReq struct { + g.Meta `path:"/edit" tags:"员工工资考核记录" method:"put" summary:"员工工资考核记录修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` +} + +// BusSalaryDetailsEditRes 修改操作返回结果 +type BusSalaryDetailsEditRes struct { + commonApi.EmptyRes +} + +// BusSalaryDetailsGetReq 获取一条数据请求 +type BusSalaryDetailsGetReq struct { + g.Meta `path:"/get" tags:"员工工资考核记录" method:"get" summary:"获取员工工资考核记录信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusSalaryDetailsGetRes 获取一条数据结果 +type BusSalaryDetailsGetRes struct { + g.Meta `mime:"application/json"` + *model.BusSalaryDetailsInfoRes +} + +// BusSalaryDetailsDeleteReq 删除数据请求 +type BusSalaryDetailsDeleteReq struct { + g.Meta `path:"/delete" tags:"员工工资考核记录" method:"delete" summary:"删除员工工资考核记录"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusSalaryDetailsDeleteRes 删除数据返回 +type BusSalaryDetailsDeleteRes struct { + commonApi.EmptyRes +} + +// GetByIdDetailFuncReq 根据ID获取当前考勤记录明细 +type GetByIdDetailFuncReq struct { + g.Meta `path:"/getByIdDetail" tags:"员工工资考核记录" method:"get" summary:"根据身份证获取当前考勤记录明细"` + commonApi.Author + commonApi.PageReq + SfzNumber string `p:"sfzNumber" dc:"身份证号码" v:"required#身份证号码必须"` + DateOfIssue string `p:"dateOfIssue" dc:"工作年月" v:"date-format:Y-m#格式为2024-02"` +} + +// GetByIdDetailFuncRes 根据ID获取当前考勤记录明细 +type GetByIdDetailFuncRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.DateTwoRes `json:"list"` +} + +// SalarySheetFuncReq 工资条获取(可根据项目or班组or施工人员) +type SalarySheetFuncReq struct { + g.Meta `path:"/salarySheet" tags:"员工工资考核记录" method:"get" summary:"工资条获取(可根据项目or班组or施工人员)"` + commonApi.Author + DateOfIssue string `p:"dateOfIssue" dc:"工作年月" v:"date-format:Y-m#格式为2024-02"` + Project int64 `p:"project" dc:"项目ID" v:"required#主键必须"` + Team int64 `p:"team" dc:"班组ID" ` + SfzNumber string `p:"sfzNumber" dc:"施工人员身份证" ` +} + +// SalarySheetFuncRes 工资条获取(可根据项目or班组or施工人员) +type SalarySheetFuncRes struct { + g.Meta `mime:"application/json"` + List []model.SalarySheetRes `json:"list"` +} diff --git a/api/v1/system/bus_scheduled_plan_type.go b/api/v1/system/bus_scheduled_plan_type.go new file mode 100644 index 0000000..dd7cea7 --- /dev/null +++ b/api/v1/system/bus_scheduled_plan_type.go @@ -0,0 +1,116 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-29 17:39:12 +// 生成路径: api/v1/system/bus_scheduled_plan_type.go +// 生成人:gfast +// desc:施工进度分类相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusScheduledPlanTypeSearchReq 分页请求参数 +type BusScheduledPlanTypeSearchReq struct { + g.Meta `path:"/list" tags:"施工进度分类" method:"get" summary:"施工进度分类列表"` + PlanTypeId string `p:"planTypeId"` //施工类型id + ParentId string `p:"parentId" v:"parentId@integer#父文件id需为整数"` //父文件id + Ancestors string `p:"ancestors"` //祖级列表 + PlanTypeName string `p:"planTypeName"` //施工类型名称 + PlannedTime string `p:"plannedTime" v:"plannedTime@integer#计划施工持续时间需为整数"` //计划施工持续时间 + PlanStartTime string `p:"planStartTime"` //计划工期开始时间 + PlanEndTime string `p:"planEndTime"` //计划工期结束时间 + OrderNum string `p:"orderNum" v:"orderNum@integer#显示顺序需为整数"` //显示顺序 + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` //项目id + Leader string `p:"leader"` //负责人 + Status string `p:"status"` //施工类型状态 + CreateBy string `p:"createBy"` //创建者 + UpdateBy string `p:"updateBy"` //更新者 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusScheduledPlanTypeSearchRes 列表返回结果 +type BusScheduledPlanTypeSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusScheduledPlanTypeListRes `json:"list"` +} + +// BusScheduledPlanTypeAddReq 添加操作请求参数 +type BusScheduledPlanTypeAddReq struct { + g.Meta `path:"/add" tags:"施工进度分类" method:"post" summary:"施工进度分类添加"` + commonApi.Author + ParentId int `p:"parentId" ` + Ancestors string `p:"ancestors" ` + PlanTypeName string `p:"planTypeName" v:"required#施工类型名称不能为空"` + PlannedTime int64 `p:"plannedTime" ` + PlanStartTime string `p:"planStartTime" ` + PlanEndTime string `p:"planEndTime" ` + OrderNum int `p:"orderNum" ` + ProjectId int64 `p:"projectId" ` + Leader string `p:"leader" ` + Status string `p:"status" v:"required#施工类型状态不能为空"` + CreateBy string `p:"createBy" ` + UpdateBy string `p:"updateBy" ` +} + +// BusScheduledPlanTypeAddRes 添加操作返回结果 +type BusScheduledPlanTypeAddRes struct { + commonApi.EmptyRes +} + +// BusScheduledPlanTypeEditReq 修改操作请求参数 +type BusScheduledPlanTypeEditReq struct { + g.Meta `path:"/edit" tags:"施工进度分类" method:"put" summary:"施工进度分类修改"` + commonApi.Author + PlanTypeId int `p:"planTypeId" v:"required#主键ID不能为空"` + ParentId int `p:"parentId" ` + Ancestors string `p:"ancestors" ` + PlanTypeName string `p:"planTypeName" v:"required#施工类型名称不能为空"` + PlannedTime int64 `p:"plannedTime" ` + PlanStartTime string `p:"planStartTime" ` + PlanEndTime string `p:"planEndTime" ` + OrderNum int `p:"orderNum" ` + ProjectId int64 `p:"projectId" ` + Leader string `p:"leader" ` + Status string `p:"status" v:"required#施工类型状态不能为空"` + CreateBy string `p:"createBy" ` + UpdateBy string `p:"updateBy" ` +} + +// BusScheduledPlanTypeEditRes 修改操作返回结果 +type BusScheduledPlanTypeEditRes struct { + commonApi.EmptyRes +} + +// BusScheduledPlanTypeGetReq 获取一条数据请求 +type BusScheduledPlanTypeGetReq struct { + g.Meta `path:"/get" tags:"施工进度分类" method:"get" summary:"获取施工进度分类信息"` + commonApi.Author + PlanTypeId int `p:"planTypeId" v:"required#主键必须"` //通过主键获取 +} + +// BusScheduledPlanTypeGetRes 获取一条数据结果 +type BusScheduledPlanTypeGetRes struct { + g.Meta `mime:"application/json"` + *model.BusScheduledPlanTypeInfoRes +} + +// BusScheduledPlanTypeDeleteReq 删除数据请求 +type BusScheduledPlanTypeDeleteReq struct { + g.Meta `path:"/delete" tags:"施工进度分类" method:"delete" summary:"删除施工进度分类"` + commonApi.Author + PlanTypeIds []int `p:"planTypeIds" v:"required#主键必须"` //通过主键删除 +} + +// BusScheduledPlanTypeDeleteRes 删除数据返回 +type BusScheduledPlanTypeDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_scheduled_plan_type_detail.go b/api/v1/system/bus_scheduled_plan_type_detail.go new file mode 100644 index 0000000..3159a83 --- /dev/null +++ b/api/v1/system/bus_scheduled_plan_type_detail.go @@ -0,0 +1,105 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-29 17:15:27 +// 生成路径: api/v1/system/bus_scheduled_plan_type_detail.go +// 生成人:gfast +// desc:施工进度月报,年报分类相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusScheduledPlanTypeDetailSearchReq 分页请求参数 +type BusScheduledPlanTypeDetailSearchReq struct { + g.Meta `path:"/list" tags:"施工进度月报,年报分类" method:"get" summary:"施工进度月报,年报分类列表"` + PlanTypeName string `p:"planTypeName"` //施工类型名称 + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` //项目id + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusScheduledPlanTypeDetailSearchRes 列表返回结果 +type BusScheduledPlanTypeDetailSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusScheduledPlanTypeDetailListRes `json:"list"` +} + +// BusScheduledPlanTypeDetailAddReq 添加操作请求参数 +type BusScheduledPlanTypeDetailAddReq struct { + g.Meta `path:"/add" tags:"施工进度月报,年报分类" method:"post" summary:"施工进度月报,年报分类添加"` + commonApi.Author + ParentId int `p:"parentId" ` + Ancestors string `p:"ancestors" ` + PlanTypeName string `p:"planTypeName" v:"required#施工类型名称不能为空"` + PlannedTime int64 `p:"plannedTime" ` + PlanStartTime string `p:"planStartTime" ` + PlanEndTime string `p:"planEndTime" ` + OrderNum int `p:"orderNum" ` + DateValue string `p:"dateValue" ` + DateType string `p:"dateType" ` + ProjectId int64 `p:"projectId" ` + Leader string `p:"leader" ` + Status string `p:"status" ` +} + +// BusScheduledPlanTypeDetailAddRes 添加操作返回结果 +type BusScheduledPlanTypeDetailAddRes struct { + commonApi.EmptyRes +} + +// BusScheduledPlanTypeDetailEditReq 修改操作请求参数 +type BusScheduledPlanTypeDetailEditReq struct { + g.Meta `path:"/edit" tags:"施工进度月报,年报分类" method:"put" summary:"施工进度月报,年报分类修改"` + commonApi.Author + PlanTypeDetailId int `p:"planTypeDetailId" v:"required#主键ID不能为空"` + ParentId int `p:"parentId" ` + Ancestors string `p:"ancestors" ` + PlanTypeName string `p:"planTypeName" v:"required#施工类型名称不能为空"` + PlannedTime int64 `p:"plannedTime" ` + PlanStartTime string `p:"planStartTime" ` + PlanEndTime string `p:"planEndTime" ` + OrderNum int `p:"orderNum" ` + DateValue string `p:"dateValue" ` + DateType string `p:"dateType" ` + ProjectId int64 `p:"projectId" ` + Leader string `p:"leader" ` + Status string `p:"status" ` +} + +// BusScheduledPlanTypeDetailEditRes 修改操作返回结果 +type BusScheduledPlanTypeDetailEditRes struct { + commonApi.EmptyRes +} + +// BusScheduledPlanTypeDetailGetReq 获取一条数据请求 +type BusScheduledPlanTypeDetailGetReq struct { + g.Meta `path:"/get" tags:"施工进度月报,年报分类" method:"get" summary:"获取施工进度月报,年报分类信息"` + commonApi.Author + PlanTypeDetailId int `p:"planTypeDetailId" v:"required#主键必须"` //通过主键获取 +} + +// BusScheduledPlanTypeDetailGetRes 获取一条数据结果 +type BusScheduledPlanTypeDetailGetRes struct { + g.Meta `mime:"application/json"` + *model.BusScheduledPlanTypeDetailInfoRes +} + +// BusScheduledPlanTypeDetailDeleteReq 删除数据请求 +type BusScheduledPlanTypeDetailDeleteReq struct { + g.Meta `path:"/delete" tags:"施工进度月报,年报分类" method:"delete" summary:"删除施工进度月报,年报分类"` + commonApi.Author + PlanTypeDetailIds []int `p:"planTypeDetailIds" v:"required#主键必须"` //通过主键删除 +} + +// BusScheduledPlanTypeDetailDeleteRes 删除数据返回 +type BusScheduledPlanTypeDetailDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_scheduled_weekly.go b/api/v1/system/bus_scheduled_weekly.go new file mode 100644 index 0000000..c77fb66 --- /dev/null +++ b/api/v1/system/bus_scheduled_weekly.go @@ -0,0 +1,104 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-02 15:28:49 +// 生成路径: api/v1/system/bus_scheduled_weekly.go +// 生成人:gfast +// desc:周报相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusScheduledWeeklySearchReq 分页请求参数 +type BusScheduledWeeklySearchReq struct { + g.Meta `path:"/list" tags:"周报" method:"get" summary:"周报列表"` + Status string `p:"status"` //施工类型状态 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusScheduledWeeklySearchRes 列表返回结果 +type BusScheduledWeeklySearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusScheduledWeeklyListRes `json:"list"` +} + +// BusScheduledWeeklyAddReq 添加操作请求参数 +type BusScheduledWeeklyAddReq struct { + g.Meta `path:"/add" tags:"周报" method:"post" summary:"周报添加"` + commonApi.Author + PlanPeriodId int64 `p:"planPeriodId" ` + WeeklyPlanName string `p:"weeklyPlanName" v:"required#施工分类下第几周不能为空"` + WeeklyStartTime string `p:"weeklyStartTime" ` + WeeklyEndTime string `p:"weeklyEndTime" ` + WeeklyPlanFinish string `p:"weeklyPlanFinish" ` + WeeklyRealityFinish string `p:"weeklyRealityFinish" ` + WeekyAccumulativeFinish string `p:"weekyAccumulativeFinish" ` + WeekyAccumulativeTotal string `p:"weekyAccumulativeTotal" ` + CompletionRate string `p:"completionRate" ` + Leader string `p:"leader" ` + Status string `p:"status" v:"required#施工类型状态不能为空"` + WeeklyDocumentUrl string `p:"weeklyDocumentUrl" ` +} + +// BusScheduledWeeklyAddRes 添加操作返回结果 +type BusScheduledWeeklyAddRes struct { + commonApi.EmptyRes +} + +// BusScheduledWeeklyEditReq 修改操作请求参数 +type BusScheduledWeeklyEditReq struct { + g.Meta `path:"/edit" tags:"周报" method:"put" summary:"周报修改"` + commonApi.Author + PlanWeeklyId int64 `p:"planWeeklyId" v:"required#主键ID不能为空"` + PlanPeriodId int64 `p:"planPeriodId" ` + WeeklyPlanName string `p:"weeklyPlanName" v:"required#施工分类下第几周不能为空"` + WeeklyStartTime string `p:"weeklyStartTime" ` + WeeklyEndTime string `p:"weeklyEndTime" ` + WeeklyPlanFinish string `p:"weeklyPlanFinish" ` + WeeklyRealityFinish string `p:"weeklyRealityFinish" ` + WeekyAccumulativeFinish string `p:"weekyAccumulativeFinish" ` + WeekyAccumulativeTotal string `p:"weekyAccumulativeTotal" ` + CompletionRate string `p:"completionRate" ` + Leader string `p:"leader" ` + Status string `p:"status" v:"required#施工类型状态不能为空"` + WeeklyDocumentUrl string `p:"weeklyDocumentUrl" ` +} + +// BusScheduledWeeklyEditRes 修改操作返回结果 +type BusScheduledWeeklyEditRes struct { + commonApi.EmptyRes +} + +// BusScheduledWeeklyGetReq 获取一条数据请求 +type BusScheduledWeeklyGetReq struct { + g.Meta `path:"/get" tags:"周报" method:"get" summary:"获取周报信息"` + commonApi.Author + PlanWeeklyId int64 `p:"planWeeklyId" v:"required#主键必须"` //通过主键获取 +} + +// BusScheduledWeeklyGetRes 获取一条数据结果 +type BusScheduledWeeklyGetRes struct { + g.Meta `mime:"application/json"` + *model.BusScheduledWeeklyInfoRes +} + +// BusScheduledWeeklyDeleteReq 删除数据请求 +type BusScheduledWeeklyDeleteReq struct { + g.Meta `path:"/delete" tags:"周报" method:"delete" summary:"删除周报"` + commonApi.Author + PlanWeeklyIds []int64 `p:"planWeeklyIds" v:"required#主键必须"` //通过主键删除 +} + +// BusScheduledWeeklyDeleteRes 删除数据返回 +type BusScheduledWeeklyDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_scheduled_weekly_photovoltaic.go b/api/v1/system/bus_scheduled_weekly_photovoltaic.go new file mode 100644 index 0000000..c76bae1 --- /dev/null +++ b/api/v1/system/bus_scheduled_weekly_photovoltaic.go @@ -0,0 +1,93 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-02 15:21:55 +// 生成路径: api/v1/system/bus_scheduled_weekly_photovoltaic.go +// 生成人:gfast +// desc:周报-光伏板相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusScheduledWeeklyPhotovoltaicSearchReq 分页请求参数 +type BusScheduledWeeklyPhotovoltaicSearchReq struct { + g.Meta `path:"/list" tags:"周报-光伏板" method:"get" summary:"周报-光伏板列表"` + PhotovoltaicNumber string `p:"photovoltaicNumber"` //光伏板编号 + InstallNot string `p:"installNot"` //是否安装 + Status string `p:"status"` //光伏板状态 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusScheduledWeeklyPhotovoltaicSearchRes 列表返回结果 +type BusScheduledWeeklyPhotovoltaicSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusScheduledWeeklyPhotovoltaicListRes `json:"list"` +} + +// BusScheduledWeeklyPhotovoltaicAddReq 添加操作请求参数 +type BusScheduledWeeklyPhotovoltaicAddReq struct { + g.Meta `path:"/add" tags:"周报-光伏板" method:"post" summary:"周报-光伏板添加"` + commonApi.Author + PlanWeeklyId int64 `p:"planWeeklyId" ` + PhotovoltaicNumber string `p:"photovoltaicNumber" ` + PhotovoltaicNumberGis string `p:"photovoltaicNumberGis" ` + ProjectId string `p:"projectId" ` +} + +// BusScheduledWeeklyPhotovoltaicAddRes 添加操作返回结果 +type BusScheduledWeeklyPhotovoltaicAddRes struct { + commonApi.EmptyRes +} + +// BusScheduledWeeklyPhotovoltaicEditReq 修改操作请求参数 +type BusScheduledWeeklyPhotovoltaicEditReq struct { + g.Meta `path:"/edit" tags:"周报-光伏板" method:"put" summary:"周报-光伏板修改"` + commonApi.Author + PhotovoltaicId int64 `p:"photovoltaicId" v:"required#主键ID不能为空"` + PlanWeeklyId int64 `p:"planWeeklyId" ` + PhotovoltaicNumber string `p:"photovoltaicNumber" ` + PhotovoltaicNumberGis string `p:"photovoltaicNumberGis" ` + InstallNot string `p:"installNot" v:"required#是否安装不能为空"` + InstallCreateTime string `p:"installCreateTime" ` + Status string `p:"status" v:"required#光伏板状态不能为空"` + ProjectId string `p:"projectId" ` +} + +// BusScheduledWeeklyPhotovoltaicEditRes 修改操作返回结果 +type BusScheduledWeeklyPhotovoltaicEditRes struct { + commonApi.EmptyRes +} + +// BusScheduledWeeklyPhotovoltaicGetReq 获取一条数据请求 +type BusScheduledWeeklyPhotovoltaicGetReq struct { + g.Meta `path:"/get" tags:"周报-光伏板" method:"get" summary:"获取周报-光伏板信息"` + commonApi.Author + PhotovoltaicId int64 `p:"photovoltaicId" v:"required#主键必须"` //通过主键获取 +} + +// BusScheduledWeeklyPhotovoltaicGetRes 获取一条数据结果 +type BusScheduledWeeklyPhotovoltaicGetRes struct { + g.Meta `mime:"application/json"` + *model.BusScheduledWeeklyPhotovoltaicInfoRes +} + +// BusScheduledWeeklyPhotovoltaicDeleteReq 删除数据请求 +type BusScheduledWeeklyPhotovoltaicDeleteReq struct { + g.Meta `path:"/delete" tags:"周报-光伏板" method:"delete" summary:"删除周报-光伏板"` + commonApi.Author + PhotovoltaicIds []int64 `p:"photovoltaicIds" v:"required#主键必须"` //通过主键删除 +} + +// BusScheduledWeeklyPhotovoltaicDeleteRes 删除数据返回 +type BusScheduledWeeklyPhotovoltaicDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_standing_book.go b/api/v1/system/bus_standing_book.go new file mode 100644 index 0000000..174255a --- /dev/null +++ b/api/v1/system/bus_standing_book.go @@ -0,0 +1,93 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-29 11:36:04 +// 生成路径: api/v1/system/bus_standing_book.go +// 生成人:gfast +// desc:台账相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusStandingBookSearchReq 分页请求参数 +type BusStandingBookSearchReq struct { + g.Meta `path:"/list" tags:"台账" method:"get" summary:"台账列表"` + EquipmentMaterialsId string `p:"equipmentMaterialsId" v:"equipmentMaterialsId@integer#材料/设备需为整数"` //材料/设备 + StandingBookType string `p:"standingBookType"` //台账类型 + CreatedAt string `p:"createdAt" v:"createdAt@date#创建时间需为YYYY-MM-DD"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusStandingBookSearchRes 列表返回结果 +type BusStandingBookSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusStandingBookListRes `json:"list"` +} + +// BusStandingBookAddReq 添加操作请求参数 +type BusStandingBookAddReq struct { + g.Meta `path:"/add" tags:"台账" method:"post" summary:"台账添加"` + commonApi.Author + EquipmentMaterialsId int64 `p:"equipmentMaterialsId" ` + ProjectId int64 `p:"projectId" ` + StandingBookType string `p:"standingBookType" ` + ApproachTime string `p:"approachTime" ` + Quantity string `p:"quantity" ` + SignerRecipient string `p:"signerRecipient" ` +} + +// BusStandingBookAddRes 添加操作返回结果 +type BusStandingBookAddRes struct { + commonApi.EmptyRes +} + +// BusStandingBookEditReq 修改操作请求参数 +type BusStandingBookEditReq struct { + g.Meta `path:"/edit" tags:"台账" method:"put" summary:"台账修改"` + commonApi.Author + StandingBookId int64 `p:"standingBookId" v:"required#主键ID不能为空"` + EquipmentMaterialsId int64 `p:"equipmentMaterialsId" ` + StandingBookType string `p:"standingBookType" ` + ApproachTime string `p:"approachTime" ` + Quantity string `p:"quantity" ` + SignerRecipient string `p:"signerRecipient" ` + Status string `p:"status" ` +} + +// BusStandingBookEditRes 修改操作返回结果 +type BusStandingBookEditRes struct { + commonApi.EmptyRes +} + +// BusStandingBookGetReq 获取一条数据请求 +type BusStandingBookGetReq struct { + g.Meta `path:"/get" tags:"台账" method:"get" summary:"获取台账信息"` + commonApi.Author + StandingBookId int64 `p:"standingBookId" v:"required#主键必须"` //通过主键获取 +} + +// BusStandingBookGetRes 获取一条数据结果 +type BusStandingBookGetRes struct { + g.Meta `mime:"application/json"` + *model.BusStandingBookInfoRes +} + +// BusStandingBookDeleteReq 删除数据请求 +type BusStandingBookDeleteReq struct { + g.Meta `path:"/delete" tags:"台账" method:"delete" summary:"删除台账"` + commonApi.Author + StandingBookIds []int64 `p:"standingBookIds" v:"required#主键必须"` //通过主键删除 +} + +// BusStandingBookDeleteRes 删除数据返回 +type BusStandingBookDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_tour.go b/api/v1/system/bus_tour.go new file mode 100644 index 0000000..df0ea08 --- /dev/null +++ b/api/v1/system/bus_tour.go @@ -0,0 +1,93 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-10-10 12:11:05 +// 生成路径: api/v1/system/bus_tour.go +// 生成人:gfast +// desc:煤科巡视-故障记录相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusTourSearchReq 分页请求参数 +type BusTourSearchReq struct { + g.Meta `path:"/list" tags:"煤科巡视-故障记录" method:"get" summary:"煤科巡视-故障记录列表"` + ProjectId string `p:"projectId"` //項目id + TourCategory string `p:"tourCategory"` //类别字典 + TourType string `p:"tourType"` //类型字典 + Describe string `p:"describe"` //故障描述 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusTourSearchRes 列表返回结果 +type BusTourSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusTourListRes `json:"list"` +} + +// BusTourAddReq 添加操作请求参数 +type BusTourAddReq struct { + g.Meta `path:"/add" tags:"煤科巡视-故障记录" method:"post" summary:"煤科巡视-故障记录添加"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + TourCategory string `p:"tourCategory" ` + TourType string `p:"tourType" ` + Picture string `p:"picture" ` + Describe string `p:"describe"` + Num int `p:"describe"` + TableName string `p:"tableName"` + TableId int64 `p:"tableId"` + SxtName interface{} `p:"sxtName"` +} + +// BusTourAddRes 添加操作返回结果 +type BusTourAddRes struct { + commonApi.EmptyRes +} + +// BusTourEditReq 修改操作请求参数 +type BusTourEditReq struct { + g.Meta `path:"/edit" tags:"煤科巡视-故障记录" method:"put" summary:"煤科巡视-故障记录修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` +} + +// BusTourEditRes 修改操作返回结果 +type BusTourEditRes struct { + commonApi.EmptyRes +} + +// BusTourGetReq 获取一条数据请求 +type BusTourGetReq struct { + g.Meta `path:"/get" tags:"煤科巡视-故障记录" method:"get" summary:"获取煤科巡视-故障记录信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusTourGetRes 获取一条数据结果 +type BusTourGetRes struct { + g.Meta `mime:"application/json"` + *model.BusTourInfoRes +} + +// BusTourDeleteReq 删除数据请求 +type BusTourDeleteReq struct { + g.Meta `path:"/delete" tags:"煤科巡视-故障记录" method:"delete" summary:"删除煤科巡视-故障记录"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusTourDeleteRes 删除数据返回 +type BusTourDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_type_of_wage.go b/api/v1/system/bus_type_of_wage.go new file mode 100644 index 0000000..9431afa --- /dev/null +++ b/api/v1/system/bus_type_of_wage.go @@ -0,0 +1,87 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-09-05 10:07:11 +// 生成路径: api/v1/system/bus_type_of_wage.go +// 生成人:gfast +// desc:工种薪水相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusTypeOfWageSearchReq 分页请求参数 +type BusTypeOfWageSearchReq struct { + g.Meta `path:"/list" tags:"工种薪水" method:"get" summary:"工种薪水列表"` + Id string `p:"id"` //主键ID + TypeOfWork string `p:"typeOfWork"` //工种字典 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusTypeOfWageSearchRes 列表返回结果 +type BusTypeOfWageSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusTypeOfWageListRes `json:"list"` +} + +// BusTypeOfWageAddReq 添加操作请求参数 +type BusTypeOfWageAddReq struct { + g.Meta `path:"/add" tags:"工种薪水" method:"post" summary:"工种薪水添加"` + commonApi.Author + TypeOfWork string `p:"typeOfWork" ` + IsSpecialType string `p:"isSpecialType" ` + Standard float64 `p:"standard" ` +} + +// BusTypeOfWageAddRes 添加操作返回结果 +type BusTypeOfWageAddRes struct { + commonApi.EmptyRes +} + +// BusTypeOfWageEditReq 修改操作请求参数 +type BusTypeOfWageEditReq struct { + g.Meta `path:"/edit" tags:"工种薪水" method:"put" summary:"工种薪水修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + TypeOfWork string `p:"typeOfWork" ` + IsSpecialType string `p:"isSpecialType" ` + Standard float64 `p:"standard"` +} + +// BusTypeOfWageEditRes 修改操作返回结果 +type BusTypeOfWageEditRes struct { + commonApi.EmptyRes +} + +// BusTypeOfWageGetReq 获取一条数据请求 +type BusTypeOfWageGetReq struct { + g.Meta `path:"/get" tags:"工种薪水" method:"get" summary:"获取工种薪水信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusTypeOfWageGetRes 获取一条数据结果 +type BusTypeOfWageGetRes struct { + g.Meta `mime:"application/json"` + *model.BusTypeOfWageInfoRes +} + +// BusTypeOfWageDeleteReq 删除数据请求 +type BusTypeOfWageDeleteReq struct { + g.Meta `path:"/delete" tags:"工种薪水" method:"delete" summary:"删除工种薪水"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusTypeOfWageDeleteRes 删除数据返回 +type BusTypeOfWageDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_violation_level.go b/api/v1/system/bus_violation_level.go new file mode 100644 index 0000000..55be198 --- /dev/null +++ b/api/v1/system/bus_violation_level.go @@ -0,0 +1,91 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-11-20 11:18:36 +// 生成路径: api/v1/system/bus_violation_level.go +// 生成人:gfast +// desc:违章等级相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusViolationLevelSearchReq 分页请求参数 +type BusViolationLevelSearchReq struct { + g.Meta `path:"/list" tags:"违章等级" method:"get" summary:"违章等级列表"` + TourType string `p:"tourType"` //违章类型 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusViolationLevelSearchRes 列表返回结果 +type BusViolationLevelSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusViolationLevelListRes `json:"list"` +} + +// BusViolationLevelAddReq 添加操作请求参数 +type BusViolationLevelAddReq struct { + g.Meta `path:"/add" tags:"违章等级" method:"post" summary:"违章等级添加"` + commonApi.Author + ProjectId string `p:"projectId" dc:"项目id" v:"required" ` + Grade string `p:"grade" dc:"26字母中的任意大写" v:"regex:^[A-Z]$#请输入A~Z的任意大写字母"` + Color string `p:"color" dc:"颜色(格式:rgba(252, 5, 5, 1))"` + TourType string `p:"tourType" dc:"类型,多个用逗号分隔"` + Risx string `p:"risx" dc:"风险等级"` + Posts []int64 `p:"posts" dc:"岗位主键ID"` +} + +// BusViolationLevelAddRes 添加操作返回结果 +type BusViolationLevelAddRes struct { + commonApi.EmptyRes +} + +// BusViolationLevelEditReq 修改操作请求参数 +type BusViolationLevelEditReq struct { + g.Meta `path:"/edit" tags:"违章等级" method:"put" summary:"违章等级修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + Grade string `p:"grade" dc:"26字母中的任意大写" v:"regex:^[A-Z]$"` + Color string `p:"color" dc:"颜色(格式:rgba(252, 5, 5, 1))"` + TourType string `p:"tourType" dc:"类型,多个用逗号分隔"` + Risx string `p:"risx" dc:"风险等级"` + Posts []int64 `p:"posts" dc:"岗位主键ID"` +} + +// BusViolationLevelEditRes 修改操作返回结果 +type BusViolationLevelEditRes struct { + commonApi.EmptyRes +} + +// BusViolationLevelGetReq 获取一条数据请求 +type BusViolationLevelGetReq struct { + g.Meta `path:"/get" tags:"违章等级" method:"get" summary:"获取违章等级信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusViolationLevelGetRes 获取一条数据结果 +type BusViolationLevelGetRes struct { + g.Meta `mime:"application/json"` + *model.BusViolationLevelInfoRes +} + +// BusViolationLevelDeleteReq 删除数据请求 +type BusViolationLevelDeleteReq struct { + g.Meta `path:"/delete" tags:"违章等级" method:"delete" summary:"删除违章等级"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusViolationLevelDeleteRes 删除数据返回 +type BusViolationLevelDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/bus_violation_record.go b/api/v1/system/bus_violation_record.go new file mode 100644 index 0000000..c889ede --- /dev/null +++ b/api/v1/system/bus_violation_record.go @@ -0,0 +1,121 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-11-20 11:18:37 +// 生成路径: api/v1/system/bus_violation_record.go +// 生成人:gfast +// desc:违章记录相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusViolationRecordSearchReq 分页请求参数 +type BusViolationRecordSearchReq struct { + g.Meta `path:"/list" tags:"违章记录" method:"get" summary:"违章记录列表"` + ProjectId string `p:"projectId" dc:"项目id" v:"required#项目id不能为空"` + Id int64 `p:"id" dc:"工单号"` + TourType string `p:"tourType" dc:"违章类型"` + IsDispose string `p:"isDispose" dc:"是否处理(1待处理 2已处理)"` + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusViolationRecordSearchRes 列表返回结果 +type BusViolationRecordSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusViolationRecordListRes `json:"list"` +} + +// BusViolationRecordAddReq 添加操作请求参数 +type BusViolationRecordAddReq struct { + g.Meta `path:"/add" tags:"违章记录" method:"post" summary:"违章记录添加"` + commonApi.Author + //WxOrPc string `p:"wxOrPc" dc:"参数为1表示pc添加 否则为小程序添加" v:"required#wxOrPc不能为空"` + //ByOpenid string `p:"byOpenid" v:"required-unless:WxOrPc,1#需要填写小程序的openid"` + ProjectId string `p:"projectId" dc:"项目id" v:"required#项目id不能为空"` + DataSource string `p:"dataSource" dc:"数据来源(字典violation_record_data_source)" v:"required#数据来源不能为空"` + TourType string `p:"tourType" dc:"违章类型(字典tour_type)" v:"required#违章类型不能为空"` + LaborDate string `p:"laborDate" dc:"人工日期" v:"required#人工日期不能为空"` + Conductor string `p:"conductor" dc:"处理人(openid)" v:"required#处理人(openid)不能为空"` + Picture string `p:"picture" dc:"单图上传" ` + Remark string `p:"remark" dc:"备注" v:"max-length:512#最大输入字数为512"` + //LevelId string `p:"levelId" dc:"违章等级ID" v:"required#违章等级ID不能为空"` + //Level string `p:"level" dc:"违章等级" v:"required#违章等级不能为空"` +} + +// BusViolationRecordAddRes 添加操作返回结果 +type BusViolationRecordAddRes struct { + commonApi.EmptyRes +} + +//// BusViolationRecordEditReq 修改操作请求参数 +//type BusViolationRecordEditReq struct { +// g.Meta `path:"/edit" tags:"违章记录" method:"put" summary:"违章记录修改"` +// commonApi.Author +// WxOrPc string `p:"wxOrPc" dc:"参数为1表示pc添加 2为小程序添加" v:"required#wxOrPc不能为空"` +// Id int64 `p:"id" v:"required#主键ID不能为空"` +// //Openid string `p:"openid" ` +// //TourType string `p:"tourType" ` +// IsDispose string `p:"isDispose" ` +//} +// +//// BusViolationRecordEditRes 修改操作返回结果 +//type BusViolationRecordEditRes struct { +// commonApi.EmptyRes +//} + +// BusViolationRecordGetReq 获取一条数据请求 +type BusViolationRecordGetReq struct { + g.Meta `path:"/get" tags:"违章记录" method:"get" summary:"获取违章记录信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusViolationRecordGetRes 获取一条数据结果 +type BusViolationRecordGetRes struct { + g.Meta `mime:"application/json"` + //*model.AppProjectOverviewRes +} + +// BusViolationRecordDeleteReq 删除数据请求 +type BusViolationRecordDeleteReq struct { + g.Meta `path:"/delete" tags:"违章记录" method:"delete" summary:"删除违章记录"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusViolationRecordDeleteRes 删除数据返回 +type BusViolationRecordDeleteRes struct { + commonApi.EmptyRes +} + +// BSelectTheViolatorReq 选择违章处理人 +type BSelectTheViolatorReq struct { + g.Meta `path:"/selectTheViolator" tags:"违章记录" method:"post" summary:"选择违章处理人"` + commonApi.Author + Id string `p:"id" dc:"主键ID" v:"required#主键id不能为空"` + ProcessingPeriod string `json:"processingPeriod" dc:"要求处理期限(格式:2023-10-12)" v:"required|date-format:Y-m-d#格式为2023-10-12"` + Openid string `p:"openid" dc:"处理人" v:"required#openId不能为空"` + Remark string `p:"remark" dc:"备注" v:"max-length:512#最大输入字数为512"` +} + +// SelectTheViolatorRes 选择违章处理人 +type SelectTheViolatorRes struct { + commonApi.EmptyRes +} + +type ReviewReq struct { + g.Meta `path:"/reviewReq" tags:"违章记录" method:"put" summary:"复查"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + ReviewType string `p:"reviewType" dc:"复查状态(1通过 2未通过)" v:"required#主键ID不能为空"` + Review string `p:"review" dc:"复查情况" v:"max-length:300#最大输入字数为300"` +} diff --git a/api/v1/system/bus_weekly_security_report.go b/api/v1/system/bus_weekly_security_report.go new file mode 100644 index 0000000..4b9b72a --- /dev/null +++ b/api/v1/system/bus_weekly_security_report.go @@ -0,0 +1,153 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-04-02 18:03:23 +// 生成路径: api/v1/system/bus_weekly_security_report.go +// 生成人:gfast +// desc:安全周期相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// BusWeeklySecurityReportSearchReq 分页请求参数 +type BusWeeklySecurityReportSearchReq struct { + g.Meta `path:"/list" tags:"安全周期" method:"get" summary:"安全周期列表"` + ProjectId string `p:"projectId" v:"projectId@integer#项目ID需为整数"` //项目ID + ScopeDate string `p:"scopeDate" dc:"时间范围用逗号分割"` + //Scope string `p:"scope" v:"date-format:Y-m-d#格式为2023-10-12"` //周期范围 + //ScopeEnd string `p:"scopeEnd" v:"date-format:Y-m-d#格式为2023-10-12"` //周期范围结束 + commonApi.PageReq + commonApi.Author +} + +// BusWeeklySecurityReportSearchRes 列表返回结果 +type BusWeeklySecurityReportSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusWeeklySecurityReportListRes `json:"list"` +} + +// BusWeeklySecurityReportAddReq 添加操作请求参数 +type BusWeeklySecurityReportAddReq struct { + g.Meta `path:"/add" tags:"安全周期" method:"post" summary:"安全周期添加"` + commonApi.Author + ProjectId int64 `p:"projectId" ` + TimeRange string `p:"timeRange" dc:"时间范围筛选操作(时间用,分割)" v:"required#时间范围筛选操作(时间用,分割)必须"` +} + +// BusWeeklySecurityReportAddRes 添加操作返回结果 +type BusWeeklySecurityReportAddRes struct { + commonApi.EmptyRes +} + +// BusWeeklySecurityReportEditReq 修改操作请求参数 +type BusWeeklySecurityReportEditReq struct { + g.Meta `path:"/edit" tags:"安全周期" method:"put" summary:"安全周期修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + ProjectId int64 `p:"projectId" ` + ProjectName string `p:"projectName" v:"required#项目名称不能为空"` + Scope string `p:"scope" ` + ScopeEnd string `p:"scopeEnd" ` + Path string `p:"path" ` + CreateBy string `p:"createBy" ` + UpdateBy string `p:"updateBy" ` +} + +// BusWeeklySecurityReportEditRes 修改操作返回结果 +type BusWeeklySecurityReportEditRes struct { + commonApi.EmptyRes +} + +// BusWeeklySecurityReportGetReq 获取一条数据请求 +type BusWeeklySecurityReportGetReq struct { + g.Meta `path:"/get" tags:"安全周期" method:"get" summary:"获取安全周期信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusWeeklySecurityReportGetRes 获取一条数据结果 +type BusWeeklySecurityReportGetRes struct { + g.Meta `mime:"application/json"` + *model.BusWeeklySecurityReportInfoRes +} + +// BusWeeklySecurityReportDeleteReq 删除数据请求 +type BusWeeklySecurityReportDeleteReq struct { + g.Meta `path:"/delete" tags:"安全周期" method:"delete" summary:"删除安全周期"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusWeeklySecurityReportDeleteRes 删除数据返回 +type BusWeeklySecurityReportDeleteRes struct { + commonApi.EmptyRes +} + +type WeeklySecurityReportRes struct { + commonApi.EmptyRes + FilePath string `json:"filePath" dc:"项目ID"` + WeeklySecurityReport []*WeeklySecurityReportEntity `json:"weeklySecurityReportList"` +} + +type WeeklySecurityReportEntity struct { + ProjectId int64 `json:"projectId" dc:"项目ID"` + Begin string `json:"begin" dc:"开始时间"` + End string `json:"end" dc:"结束时间"` + ProjectName string `json:"projectName" dc:"项目名称"` + Builders int `json:"builders" dc:"施工人员"` + Attendance int `json:"attendance" dc:"入场人数"` + Education int `json:"education" dc:"教育人数"` + LargeScaleList []*LargeScaleEntity `json:"largeScaleList" dc:"大型设备"` + SecurityCheckList []*SecurityCheckEntity `json:"securityCheckList" dc:"安全检查记录"` + AbarbeitungList []*AbarbeitungEntity `json:"abarbeitungList" dc:"安全整改情况"` + ImgList []*ImgEntity `json:"imgList" dc:"可视化"` +} + +type LargeScaleEntity struct { + Num int `json:"num" dc:"序号"` + Machine string `json:"machine" dc:"机械名称"` + Numnber int `json:"numnber" dc:"进场数量"` + AddUp int `json:"addUp" dc:"累计数量"` +} +type LargeScaleTwoEntity struct { + MachineName string `json:"machineName" dc:"机械名称"` + MachineType string `json:"machineType" dc:"机械类型"` + Enter int `json:"enter" dc:"本周进场数量(入场)"` + Quit int `json:"quit" dc:"本周进场数量(退场)"` + AddUp int `json:"addUp" dc:"累计数量"` +} +type SecurityCheckEntity struct { + Num int `json:"num" dc:"序号"` + Time string `json:"time" dc:"时间"` + RiskGrade string `json:"riskGrade" dc:"风险等级"` + ProblemDescription string `json:"problemDescription" dc:"问题描述"` +} +type AbarbeitungEntity struct { + Num int `json:"num" dc:"序号"` + InspectionResult string `json:"inspectionResult" dc:"问题"` + Tiem string `json:"tiem" dc:"整改情况"` + Condition string `json:"condition" dc:"工单状态(1通知 2整改 3复查)"` +} +type AbarbeitungTwoEntity struct { + InspectionResult string `json:"inspectionResult" dc:"问题"` + Tiem string `json:"tiem" dc:"时间"` + Status string `json:"status" dc:"工单状态(1通知 2整改 3复查)"` + ReviewType string `json:"reviewType" dc:"复查状态(1通过 2未通过)"` +} +type ImgEntity struct { + Num int `json:"num" dc:"序号"` + Path string `json:"path" dc:"图片路径"` + Text string `json:"text" dc:"文字描述"` +} + +type SecurityReportReq struct { + g.Meta `path:"/securityReportAdd" tags:"安全周期" method:"post" summary:"畅写回调保存"` + Path string `p:"path" dc:"路径" v:"required#文件保存路径不能为空"` +} diff --git a/api/v1/system/cache.go b/api/v1/system/cache.go new file mode 100644 index 0000000..06571ef --- /dev/null +++ b/api/v1/system/cache.go @@ -0,0 +1,22 @@ +/* +* @desc:缓存处理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2023/2/1 18:12 + */ + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" +) + +type CacheRemoveReq struct { + g.Meta `path:"/cache/remove" tags:"缓存管理" method:"delete" summary:"清除缓存"` + commonApi.Author +} + +type CacheRemoveRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/comment_list.go b/api/v1/system/comment_list.go new file mode 100644 index 0000000..ac72af0 --- /dev/null +++ b/api/v1/system/comment_list.go @@ -0,0 +1,120 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-05-14 10:21:06 +// 生成路径: api/v1/system/comment_list.go +// 生成人:gfast +// desc:App消息-评论相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// 获取自己的评论列表 +type CommentListSelfReq struct { + g.Meta `path:"/self" tags:"App消息-评论" method:"get" summary:"获取自己的评论列表"` + commonApi.PageReq + commonApi.Author + ProjectId int `p:"projectId" v:"projectId@integer#项目ID需为整数"` // 项目ID +} + +// 评论列表信息 +type CommentListInfo struct { + // 评论ID + Id uint `json:"id"` + // 标题 + Title string `json:"title"` + // 项目名称 + ProjectName string `json:"projectName"` + // 评论内容 + Content string `json:"content"` + // 评论时间 + CreatedAt string `json:"createdAt"` +} + +type CommentListSelfRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*CommentListInfo `json:"list"` +} + +// CommentListSearchReq 分页请求参数 +type CommentListSearchReq struct { + g.Meta `path:"/list" tags:"App消息-评论" method:"get" summary:"App消息-评论列表"` + Id string `p:"id"` // + ProjectId string `p:"projectId" v:"projectId@integer#项目ID需为整数"` // 项目ID + Receiver string `p:"receiver" v:"receiver@integer#消息接收者需为整数"` // 消息接收者 + Content string `p:"content"` // 评论内容 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` // 创建时间 + Sender string `p:"sender" v:"sender@integer#消息的发起人需为整数"` // 消息的发起人 + commonApi.PageReq + commonApi.Author +} + +// CommentListSearchRes 列表返回结果 +type CommentListSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.CommentListListRes `json:"list"` +} + +// CommentListAddReq 添加操作请求参数 +type CommentListAddReq struct { + g.Meta `path:"/add" tags:"App消息-评论" method:"post" summary:"App消息-评论添加"` + commonApi.Author + ProjectId int `p:"projectId" ` + Receiver int `p:"receiver" ` + Content string `p:"content" ` + Sender int `p:"sender" ` +} + +// CommentListAddRes 添加操作返回结果 +type CommentListAddRes struct { + commonApi.EmptyRes +} + +// CommentListEditReq 修改操作请求参数 +type CommentListEditReq struct { + g.Meta `path:"/edit" tags:"App消息-评论" method:"put" summary:"App消息-评论修改"` + commonApi.Author + Id uint `p:"id" v:"required#主键ID不能为空"` + ProjectId int `p:"projectId" ` + Receiver int `p:"receiver" ` + Content string `p:"content" ` + Sender int `p:"sender" ` +} + +// CommentListEditRes 修改操作返回结果 +type CommentListEditRes struct { + commonApi.EmptyRes +} + +// CommentListGetReq 获取一条数据请求 +type CommentListGetReq struct { + g.Meta `path:"/get" tags:"App消息-评论" method:"get" summary:"获取App消息-评论信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// CommentListGetRes 获取一条数据结果 +type CommentListGetRes struct { + g.Meta `mime:"application/json"` + *model.CommentListInfoRes +} + +// CommentListDeleteReq 删除数据请求 +type CommentListDeleteReq struct { + g.Meta `path:"/delete" tags:"App消息-评论" method:"delete" summary:"删除App消息-评论"` + commonApi.Author + Ids []uint `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// CommentListDeleteRes 删除数据返回 +type CommentListDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/comments.go b/api/v1/system/comments.go new file mode 100644 index 0000000..12b34b4 --- /dev/null +++ b/api/v1/system/comments.go @@ -0,0 +1,115 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-04-23 14:47:24 +// 生成路径: api/v1/system/comments.go +// 生成人:gfast +// desc:App通知公告评论相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// CommentsSearchReq 分页请求参数 +type CommentsSearchReq struct { + g.Meta `path:"/list" tags:"App通知公告评论" method:"get" summary:"App通知公告评论列表"` + Id string `p:"id"` // 主键 + NotificationId string `p:"notificationId" v:"notificationId@integer#关联的通知ID需为整数"` // 关联的通知ID + CommentText string `p:"commentText"` // 评论内容 + CommentId string `p:"commentId"` // 用户ID + CreatedAt string `p:"createdAt" v:"createdAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // + commonApi.PageReq + commonApi.Author +} + +// CommentsSearchRes 列表返回结果 +type CommentsSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.CommentsInfoRes `json:"list"` +} + +// CommentsAddReq 添加操作请求参数 +type CommentsAddReq struct { + g.Meta `path:"/add" tags:"App通知公告评论" method:"post" summary:"App通知公告评论添加"` + commonApi.Author + NotificationId int `p:"notificationId" ` + CommentText string `p:"commentText" ` + CommentId string `p:"commentId" ` +} + +// CommentsAddRes 添加操作返回结果 +type CommentsAddRes struct { + commonApi.EmptyRes +} + +// CommentsEditReq 修改操作请求参数 +type CommentsEditReq struct { + g.Meta `path:"/edit" tags:"App通知公告评论" method:"put" summary:"App通知公告评论修改"` + commonApi.Author + Id uint `p:"id" v:"required#主键ID不能为空"` + NotificationId int `p:"notificationId" ` + CommentText string `p:"commentText" ` + CommentId string `p:"commentId" ` +} + +// CommentsEditRes 修改操作返回结果 +type CommentsEditRes struct { + commonApi.EmptyRes +} + +// CommentsGetReq 获取一条数据请求 +type CommentsGetReq struct { + g.Meta `path:"/get" tags:"App通知公告评论" method:"get" summary:"获取App通知公告评论信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// CommentsGetRes 获取一条数据结果 +type CommentsGetRes struct { + g.Meta `mime:"application/json"` + *model.CommentsInfoRes +} + +// CommentsDeleteReq 删除数据请求 +type CommentsDeleteReq struct { + g.Meta `path:"/delete" tags:"App通知公告评论" method:"delete" summary:"删除App通知公告评论"` + commonApi.Author + Ids []uint `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// CommentsDeleteRes 删除数据返回 +type CommentsDeleteRes struct { + commonApi.EmptyRes +} + +// CommentsPublishReq 发布一条评论 +type CommentsPublishReq struct { + g.Meta `path:"/publish" tags:"App" method:"post" summary:"发布App通知公告评论"` + commonApi.Author + NotificationId int `p:"notificationId" v:"required#公告ID不能为空" dc:"通知的ID"` // 通知ID + CommentText string `p:"commentText" dc:"评论的正文内容"` // 评论内容 +} + +type CommentsPublishRes struct { + commonApi.EmptyRes +} + +// 获取一个指定通知公告的评论列表 +type CommentsGetListByNotificationIdReq struct { + g.Meta `path:"/getByNotificationId" tags:"App" method:"get" summary:"获取指定通知公告下的评论列表"` + commonApi.Author + commonApi.PageReq + NotificationId int `p:"notificationId" v:"required#通知ID不能为空" dc:"通知公告的ID"` // 通知ID +} + +type CommentsGetListByNotificationIdRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.CommentsListRes `json:"list"` +} diff --git a/api/v1/system/comments_func.go b/api/v1/system/comments_func.go new file mode 100644 index 0000000..547b624 --- /dev/null +++ b/api/v1/system/comments_func.go @@ -0,0 +1,12 @@ +package system + +import "github.com/gogf/gf/v2/os/gtime" + +// App 通知公告评论列表 +type CommentList struct { + Id uint `json:"id"` + CommentId string `json:"commentId" dc:"用户id"` + Name string `json:"name" dc:"用户名"` + CommentText string `json:"commentText" dc:"评论内容"` + CreatedAt *gtime.Time `json:"createdAt" dc:"评论时间"` +} diff --git a/api/v1/system/construction_details.go b/api/v1/system/construction_details.go new file mode 100644 index 0000000..ff1accc --- /dev/null +++ b/api/v1/system/construction_details.go @@ -0,0 +1,170 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-03-13 18:10:56 +// 生成路径: api/v1/system/construction_details.go +// 生成人:gfast +// desc:施工类别详情相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// ConstructionDetailsSearchReq 分页请求参数 +type ConstructionDetailsSearchReq struct { + g.Meta `path:"/list" tags:"施工类别详情" method:"get" summary:"施工类别详情列表"` + Id string `p:"id"` // + CreatedBy string `p:"createdBy" v:"createdBy@integer#需为整数"` // + CreatedAt string `p:"createdAt" v:"createdAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // + Name string `p:"name"` // 施工名称 + Types string `p:"types"` // 施工类别 + Total string `p:"total" v:"total@integer#总量需为整数"` // 总量 + ConstructionId string `p:"constructionId" v:"constructionId@integer#施工id(父级id)需为整数"` // 施工id(父级id) + IsPercentage string `p:"isPercentage" v:"isPercentage@integer#数据类型是否为百分比需为整数"` // 数据类型是否为百分比 + StartTime string `p:"startTime" v:"startTime@datetime#开始时间需为YYYY-MM-DD hh:mm:ss格式"` // 开始时间 + EndTime string `p:"endTime" v:"endTime@datetime#结束时间需为YYYY-MM-DD hh:mm:ss格式"` // 结束时间 + Completed string `p:"completed" v:"completed@integer#完成量需为整数"` // 完成量 + Selectable string `p:"selectable" v:"selectable@integer#可选择余量需为整数"` // 可选择余量 + Overall string `p:"overall" v:"overall@integer#总余量需为整数"` // 总余量 + commonApi.PageReq + commonApi.Author +} + +// ConstructionDetailsSearchRes 列表返回结果 +type ConstructionDetailsSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.ConstructionDetailsListRes `json:"list"` +} + +// ConstructionDetailsAddReq 添加操作请求参数 +type ConstructionDetailsAddReq struct { + g.Meta `path:"/add" tags:"施工类别详情" method:"post" summary:"施工类别详情添加"` + commonApi.Author + Name string `p:"name" v:"required#施工名称不能为空"` + Types string `p:"types" ` + Total int `p:"total" ` + ConstructionId int `p:"constructionId" ` + Remark string `p:"remark" ` + IsPercentage int `p:"isPercentage" ` + StartTime *gtime.Time `p:"startTime" ` + EndTime *gtime.Time `p:"endTime" ` + Completed int `p:"completed" ` + Selectable int `p:"selectable" ` + Overall int `p:"overall" ` + CreatedBy uint64 +} + +// ConstructionDetailsAddRes 添加操作返回结果 +type ConstructionDetailsAddRes struct { + commonApi.EmptyRes +} + +// ConstructionDetailsEditReq 修改操作请求参数 +type ConstructionDetailsEditReq struct { + g.Meta `path:"/edit" tags:"施工类别详情" method:"put" summary:"施工类别详情修改"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键ID不能为空"` + Name string `p:"name" v:"required#施工名称不能为空"` + Types string `p:"types" ` + Total int `p:"total" ` + ConstructionId int `p:"constructionId" ` + Remark string `p:"remark" ` + IsPercentage int `p:"isPercentage" ` + StartTime *gtime.Time `p:"startTime" ` + EndTime *gtime.Time `p:"endTime" ` + Completed int `p:"completed" ` + Selectable int `p:"selectable" ` + Overall int `p:"overall" ` + UpdatedBy uint64 +} + +// ConstructionDetailsEditRes 修改操作返回结果 +type ConstructionDetailsEditRes struct { + commonApi.EmptyRes +} + +// ConstructionDetailsGetReq 获取一条数据请求 +type ConstructionDetailsGetReq struct { + g.Meta `path:"/get" tags:"施工类别详情" method:"get" summary:"获取施工类别详情信息"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// ConstructionDetailsGetRes 获取一条数据结果 +type ConstructionDetailsGetRes struct { + g.Meta `mime:"application/json"` + *model.ConstructionDetailsInfoRes +} + +// ConstructionDetailsDeleteReq 删除数据请求 +type ConstructionDetailsDeleteReq struct { + g.Meta `path:"/delete" tags:"施工类别详情" method:"delete" summary:"删除施工类别详情"` + commonApi.Author + Ids []uint64 `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// ConstructionDetailsDeleteRes 删除数据返回 +type ConstructionDetailsDeleteRes struct { + commonApi.EmptyRes +} + +// 查询指定方阵下、指定施工类别下的可选择余量 +type ConstructionDetailsListReq struct { + g.Meta `path:"/list" tags:"施工类别详情" method:"get" summary:"施工类别详情列表"` + commonApi.Author + // 方阵id + ConstructionId int `p:"constructionId"` + // 设施名称 + ConstructionName string `p:"constructionName"` + // 施工名称 + ConstructionDetailsName string `p:"constructionDetailsName"` +} + +// ConstructionDetailsListRes 列表返回结果 +type ConstructionDetailsListRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.ConstructionDetailsListRes `json:"list"` +} + +// 返回指定方阵下的 gannt json +type GanntJsonReq struct { + g.Meta `path:"/gannt" tags:"施工类别详情" method:"get" summary:"施工类别详情列表"` + commonApi.Author + // 方阵id + FangzhenID int `p:"FangzhenID"` +} + +type GanntJsonRes struct { + g.Meta `mime:"application/json"` + List []Gantt +} + +type Gantt struct { + Id int64 `json:"id"` + // 开始时间 + StartDate string `json:"start_date"` + // 结束时间 + EndDate string `json:"end_date,omitempty"` + // 持续时间 + Duration int `json:"duration"` + // 任务名称 + Text string `json:"text"` + // 子项目标识 + ConstructionId int `json:"construction_id,omitempty"` + // 进度 + Progress float64 `json:"progress,omitempty"` + // 父任务 + Parent int64 `json:"parent"` + // 计划中颜色标识 + // PlanColor bo `json:"plan_color,omitempty"` + // 是否展开 + Open bool `json:"open"` +} diff --git a/api/v1/system/construction_project.go b/api/v1/system/construction_project.go new file mode 100644 index 0000000..6cc5527 --- /dev/null +++ b/api/v1/system/construction_project.go @@ -0,0 +1,104 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-03-13 17:36:45 +// 生成路径: api/v1/system/construction_project.go +// 生成人:gfast +// desc:施工项目相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// ConstructionProjectSearchReq 分页请求参数 +type ConstructionProjectSearchReq struct { + g.Meta `path:"/list" tags:"施工项目" method:"get" summary:"施工项目列表"` + ConstructionId string `p:"constructionId"` //主键id + CreatedBy string `p:"createdBy" v:"createdBy@integer#需为整数"` // + CreatedAt string `p:"createdAt" v:"createdAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // + FangzhenId string `p:"fangzhenId" v:"fangzhenId@integer#方阵id需为整数"` //方阵id + ConstructionName string `p:"constructionName"` //施工名称 + Total string `p:"total" v:"total@integer#总量需为整数"` //总量 + IsPercentage string `p:"isPercentage" v:"isPercentage@integer#数据类型是否为百分比需为整数"` //数据类型是否为百分比 + EndTime string `p:"endTime" v:"endTime@datetime#结束时间需为YYYY-MM-DD hh:mm:ss格式"` //结束时间 + StartTime string `p:"startTime" v:"startTime@datetime#开始时间需为YYYY-MM-DD hh:mm:ss格式"` //开始时间 + commonApi.PageReq + commonApi.Author +} + +// ConstructionProjectSearchRes 列表返回结果 +type ConstructionProjectSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.ConstructionProjectListRes `json:"list"` +} + +// ConstructionProjectAddReq 添加操作请求参数 +type ConstructionProjectAddReq struct { + g.Meta `path:"/add" tags:"施工项目" method:"post" summary:"施工项目添加"` + commonApi.Author + FangzhenId int `p:"fangzhenId" ` + ConstructionName string `p:"constructionName" v:"required#施工名称不能为空"` + Total int `p:"total" ` + Remark string `p:"remark" ` + IsPercentage int `p:"isPercentage" ` + EndTime *gtime.Time `p:"endTime" ` + StartTime *gtime.Time `p:"startTime" ` + CreatedBy uint64 +} + +// ConstructionProjectAddRes 添加操作返回结果 +type ConstructionProjectAddRes struct { + commonApi.EmptyRes +} + +// ConstructionProjectEditReq 修改操作请求参数 +type ConstructionProjectEditReq struct { + g.Meta `path:"/edit" tags:"施工项目" method:"put" summary:"施工项目修改"` + commonApi.Author + ConstructionId uint64 `p:"constructionId" v:"required#主键ID不能为空"` + FangzhenId int `p:"fangzhenId" ` + ConstructionName string `p:"constructionName" v:"required#施工名称不能为空"` + Total int `p:"total" ` + Remark string `p:"remark" ` + IsPercentage int `p:"isPercentage" ` + EndTime *gtime.Time `p:"endTime" ` + StartTime *gtime.Time `p:"startTime" ` + UpdatedBy uint64 +} + +// ConstructionProjectEditRes 修改操作返回结果 +type ConstructionProjectEditRes struct { + commonApi.EmptyRes +} + +// ConstructionProjectGetReq 获取一条数据请求 +type ConstructionProjectGetReq struct { + g.Meta `path:"/get" tags:"施工项目" method:"get" summary:"获取施工项目信息"` + commonApi.Author + ConstructionId uint64 `p:"constructionId" v:"required#主键必须"` //通过主键获取 +} + +// ConstructionProjectGetRes 获取一条数据结果 +type ConstructionProjectGetRes struct { + g.Meta `mime:"application/json"` + *model.ConstructionProjectInfoRes +} + +// ConstructionProjectDeleteReq 删除数据请求 +type ConstructionProjectDeleteReq struct { + g.Meta `path:"/delete" tags:"施工项目" method:"delete" summary:"删除施工项目"` + commonApi.Author + ConstructionIds []uint64 `p:"constructionIds" v:"required#主键必须"` //通过主键删除 +} + +// ConstructionProjectDeleteRes 删除数据返回 +type ConstructionProjectDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/device.go b/api/v1/system/device.go new file mode 100644 index 0000000..ba90bfd --- /dev/null +++ b/api/v1/system/device.go @@ -0,0 +1,149 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-11-24 09:57:07 +// 生成路径: api/v1/system/device.go +// 生成人:gfast +// desc:安全帽设备(java)相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// DeviceSearchReq 分页请求参数 +type DeviceSearchReq struct { + g.Meta `path:"/list" tags:"安全帽设备(java)" method:"get" summary:"安全帽设备(java)列表"` + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + DevNum string `p:"devNum"` //设备编号 + DevName string `p:"devName"` //设备名称 + Status string `p:"status" v:"status@integer#状态需为整数"` //状态 + commonApi.PageReq + commonApi.Author +} + +// DeviceSearchRes 列表返回结果 +type DeviceSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.DeviceListRes `json:"list"` +} + +// DeviceSearchAllReq 分页请求参数 +type DeviceSearchAllReq struct { + g.Meta `path:"/allList" tags:"安全帽设备(java)" method:"get" summary:"GIS云图树上数据(返回当前项目下。设备和用户关联到的所有设备)"` + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + commonApi.Author +} + +// DeviceSearchAllRes 列表返回结果 +type DeviceSearchAllRes struct { + g.Meta `mime:"application/json"` + List []*model.DeviceListRes `json:"list"` +} + +// HelmetListReq 分页请求参数 +type HelmetListReq struct { + g.Meta `path:"/helmetList" tags:"安全帽设备(java)" method:"get" summary:"安全帽列表(设备名和设备标识)"` + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + DevNum string `p:"devNum"` //设备编号 + DevName string `p:"devName"` //设备名称 + commonApi.PageReq + commonApi.Author +} + +// HelmetListRes 列表返回结果 +type HelmetListRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.DeviceListRes `json:"list"` +} + +// DeviceAddReq 添加操作请求参数 +type DeviceAddReq struct { + g.Meta `path:"/add" tags:"安全帽设备(java)" method:"post" summary:"安全帽设备(java)添加"` + commonApi.Author + DevNum string `p:"devNum" v:"required#主键ID不能为空"` + DevName string `p:"devName" ` + Status int `p:"status" dc:"状态(0下线 1上线) v:"required#状态不能为空"` + ProjectId int `p:"project_id" v:"required#项目id不能为空"` +} + +// DeviceAddRes 添加操作返回结果 +type DeviceAddRes struct { + commonApi.EmptyRes +} + +// RemoveRelationReq 移除当前人员与安全帽的佩戴关系 +type RemoveRelationReq struct { + g.Meta `path:"/removeRelation" tags:"安全帽设备(java)" method:"put" summary:"移除当前人员与安全帽的佩戴关系"` + commonApi.Author + Openid string `p:"openid" v:"required#openid不能为空"` +} + +// RemoveRelationRes 移除当前人员与安全帽的佩戴关系 +type RemoveRelationRes struct { + commonApi.EmptyRes +} + +// DeviceGetReq 获取一条数据请求 +type DeviceGetReq struct { + g.Meta `path:"/get" tags:"安全帽设备(java)" method:"get" summary:"获取安全帽设备(java)信息"` + commonApi.Author + DateRange []string `p:"dateRange" dc:"日期范围"` + DevNum string `p:"devNum" v:"required#主键必须"` //通过主键获取 +} + +// DeviceGetRes 获取一条数据结果 +type DeviceGetRes struct { + g.Meta `mime:"application/json"` + *model.DeviceInfoRes + LatAndLonList []*ActionPathLatAndLonActionPathLatAndLon `json:"latAndLonList" dc:"足迹列表"` +} + +type ActionPathLatAndLonActionPathLatAndLon struct { + Latitude float64 `p:"latitude" dc:"纬度" ` + Longitude float64 `p:"longitude" dc:"经度" ` +} + +// DeviceDeleteReq 删除数据请求 +type DeviceDeleteReq struct { + g.Meta `path:"/delete" tags:"安全帽设备(java)" method:"delete" summary:"删除安全帽设备(java)"` + commonApi.Author + DevNums []string `p:"devNums" v:"required#主键必须"` //通过主键删除 +} + +// DeviceDeleteRes 删除数据返回 +type DeviceDeleteRes struct { + commonApi.EmptyRes +} + +// ScheduleTimeReq 根据指定时间段去查询有足迹的日期 +type ScheduleTimeReq struct { + g.Meta `path:"scheduleTime" tags:"安全帽设备(java)" method:"get" summary:"根据指定时间段去查询有足迹的日期"` + DevNum string `p:"devNum" dc:"设备编号" v:"required#设备编号必须"` + DateRange []string `p:"dateRange" dc:"日期范围" v:"required|array#日期范围必须"` + commonApi.Author +} + +// ScheduleTimeRes 根据指定时间段去查询有足迹的日期 +type ScheduleTimeRes struct { + g.Meta `mime:"application/json"` + List []string `json:"list"` +} + +// WebsocketReq 服务 +type WebsocketReq struct { + g.Meta `path:"/websocketReq" tags:"安全帽设备(java)" method:"get" summary:"WebSocket服务"` + commonApi.Author + ProjectId string `p:"projectId" v:"required#项目ID必须" dc:"项目ID"` //通过主键删除 +} + +// WebsocketRes 服务 +type WebsocketRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/device_preset.go b/api/v1/system/device_preset.go new file mode 100644 index 0000000..ab41cad --- /dev/null +++ b/api/v1/system/device_preset.go @@ -0,0 +1,101 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-03-01 12:50:08 +// 生成路径: api/v1/system/device_preset.go +// 生成人:gfast +// desc:预置位相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// DevicePresetSearchReq 分页请求参数 +type DevicePresetSearchReq struct { + g.Meta `path:"/list" tags:"预置位" method:"get" summary:"预置位列表"` + Id string `p:"id"` // 主键ID + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` // 创建时间 + DeviceSerial string `p:"deviceSerial"` // 设备序列号 + ChannelNo string `p:"channelNo" d:"1"` // 通道号 + commonApi.PageReq + commonApi.Author +} + +// DevicePresetSearchRes 列表返回结果 +type DevicePresetSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.DevicePresetListRes `json:"list"` +} + +// DevicePresetAddReq 添加操作请求参数 +type DevicePresetAddReq struct { + g.Meta `path:"/add" tags:"预置位" method:"post" summary:"预置位添加"` + commonApi.Author + DeviceSerial string `p:"deviceSerial" dc:"设备穿号"` + PresetName string `p:"presetName" dc:"预置位点名"` + ChannelNo string `p:"channelNo" dc:"频道号默认为1" d:"1"` +} + +// DevicePresetAddRes 添加操作返回结果 +type DevicePresetAddRes struct { + commonApi.EmptyRes +} + +// DevicePresetEditReq 修改操作请求参数 +type DevicePresetEditReq struct { + g.Meta `path:"/edit" tags:"预置位" method:"put" summary:"预置位修改"` + commonApi.Author + DeviceSerial string `p:"deviceSerial" dc:"设备编号"` + Id int `p:"id" dc:"需要被修改的主键id"` + NewName string `p:"newName" dc:"新名字"` +} + +// DevicePresetEditRes 修改操作返回结果 +type DevicePresetEditRes struct { + commonApi.EmptyRes +} + +// DevicePresetGetReq 获取一条数据请求 +type DevicePresetGetReq struct { + g.Meta `path:"/get" tags:"预置位" method:"get" summary:"获取预置位信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// DevicePresetGetRes 获取一条数据结果 +type DevicePresetGetRes struct { + g.Meta `mime:"application/json"` + *model.DevicePresetInfoRes +} + +// DevicePresetDeleteReq 删除数据请求 +type DevicePresetDeleteReq struct { + g.Meta `path:"/delete" tags:"预置位" method:"delete" summary:"删除预置位"` + commonApi.Author + DeviceSerial string `p:"deviceSerial" v:"required#设备序列号不能为空"` // 设备序列号 + Ids []int `p:"ids" v:"required#通道号必须"` // 通过主键删除 +} + +// DevicePresetDeleteRes 删除数据返回 +type DevicePresetDeleteRes struct { + commonApi.EmptyRes +} + +// DevicePresetCallReq 调用预置点 +type DevicePresetCallReq struct { + g.Meta `path:"/call" tags:"预置位" method:"post" summary:"调用预置位"` + DeviceSerial string `p:"deviceSerial" v:"required#设备序列号不能为空"` // 设备序列号 + Index int `p:"index" v:"required#预置点位不能为空"` + commonApi.Author +} + +// DevicePresetCallRes 调用预置点返回 +type DevicePresetCallRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/document.go b/api/v1/system/document.go new file mode 100644 index 0000000..b18cc15 --- /dev/null +++ b/api/v1/system/document.go @@ -0,0 +1,201 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-09-16 10:32:04 +// 生成路径: api/v1/system/document.go +// 生成人:gfast +// desc:母板相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type SendFileReq struct { + g.Meta `path:"/sendFile" tags:"工程资料>模板" method:"post" summary:"获取web365的在线阅读"` + commonApi.Author + FilePath string `p:"filePath" dc:"文件相对路径" v:"required#文件相对路径不能为空"` + FileType string `p:"fileType" dc:"文件类型(1word 2excel 3ppt)" v:"required#文件类型不能为空"` +} + +type SendFileRes struct { + commonApi.EmptyRes + FilePath string `p:"filePath" dc:"文件相对路径"` +} + +// DocumentSearchReq 分页请求参数 +type DocumentSearchReq struct { + g.Meta `path:"/list" tags:"工程资料>模板" method:"get" summary:"母板列表"` + Switch string `p:"switch" dc:"当前文件夹及以下(1)/当前文件夹(2)" v:"between:1,2#仅支持传递1~2"` + IdStr string `p:"idStr" dc:"模板标识" v:"required#模板标识不能为空"` + Name string `p:"name" dc:"模板名称"` + commonApi.Paging + commonApi.PageReq + commonApi.Author +} + +// DocumentSearchRes 列表返回结果 +type DocumentSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.DocumentListRes `json:"list"` +} + +// AllDocumentSearchReq 获取所有数据 +type AllDocumentSearchReq struct { + g.Meta `path:"/allList" tags:"工程资料>模板" method:"get" summary:"获取所有数据"` + Type string `p:"type" dc:"1未删除的全部 2删除的全部 3全部(删除+未删除)" v:"between:1,2#范围值为1~2"` + commonApi.Author +} + +// AllDocumentSearchRes 获取所有数据 +type AllDocumentSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.DocumentInfoRes `json:"list"` +} + +// DocumentAddReq 添加操作请求参数 +type DocumentAddReq struct { + g.Meta `path:"/add" tags:"工程资料>模板" method:"post" summary:"本地导入(文件/压缩文件夹)"` + commonApi.Author + Pid string `p:"pid" dc:"父级文件夹(如果需要在某个文件夹下导入,那么需要有此参数)" ` + FileType string `p:"fileType" dc:"1上传压缩文件夹 2上传文件" v:"between:1,2#范围值为1~2"` + FilePath *comModel.UpFile `p:"filePath" dc:"fileType为1上传压缩文件夹 2文件" v:"required-if:fileType,1#需要上传压缩文件夹"` + FileName string `p:"fileName" dc:"fileType为3填写文件夹名" v:"required-if:fileType,3#需要填写文件夹名称"` +} + +// DocumentAddRes 添加操作返回结果 +type DocumentAddRes struct { + commonApi.EmptyRes +} + +// NewFolderReq 添加操作请求参数 +type NewFolderReq struct { + g.Meta `path:"/newFolder" tags:"工程资料>模板" method:"post" summary:"新建文件夹"` + commonApi.Author + Pid string `p:"pid" dc:"父级文件夹(如果需要在某个文件夹下导入,那么需要有此参数)" ` + //FileType string `p:"fileType" dc:"1上传压缩文件夹 2上传文件 3新建文件夹" v:"between:1,3#范围值为1~3"` + FilePath *comModel.UpFile `p:"filePath" dc:"fileType为1上传压缩文件夹 2文件" v:"required-if:fileType,1#需要上传压缩文件夹"` + FileName string `p:"fileName" dc:"fileType为3填写文件夹名" v:"required-if:fileType,3#需要填写文件夹名称"` +} + +// NewFolderRes 添加操作返回结果 +type NewFolderRes struct { + commonApi.EmptyRes +} + +// DocumentEditReq 修改操作请求参数 +type DocumentEditReq struct { + g.Meta `path:"/edit" tags:"工程资料>模板" method:"put" summary:"母板修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + Name string `p:"name" dc:"名" v:"required#模板名称不能为空"` + Type string `p:"type" dc:"1文件 2文件夹" v:"between:1,2#范围值为1~2"` +} + +// DocumentEditRes 修改操作返回结果 +type DocumentEditRes struct { + commonApi.EmptyRes +} + +// DocumentGetReq 获取一条数据请求 +type DocumentGetReq struct { + g.Meta `path:"/get" tags:"工程资料>模板" method:"get" summary:"获取母板信息"` + commonApi.Author + Id int `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// DocumentGetRes 获取一条数据结果 +type DocumentGetRes struct { + g.Meta `mime:"application/json"` + *model.DocumentInfoRes +} + +// GetFileNameByDateReq 获取一条数据请求 +type GetFileNameByDateReq struct { + g.Meta `path:"/getFileNameByDate" tags:"工程资料>模板" method:"get" summary:"废弃"` + commonApi.Author + FileName string `p:"fileName" dc:"文件名称" v:"required#文件名称为必须"` + Id int64 `p:"id" dc:"文件名称" v:"required#文件名称为必须"` +} + +// DocumentDeleteReq 删除数据请求 +type DocumentDeleteReq struct { + g.Meta `path:"/delete" tags:"工程资料>模板" method:"delete" summary:"删除母板"` + commonApi.Author + Ids []int `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// DocumentDeleteRes 删除数据返回 +type DocumentDeleteRes struct { + commonApi.EmptyRes +} + +// TreeStructureReq 树形结构文件夹目录 +type TreeStructureReq struct { + g.Meta `path:"/treeStructure" tags:"工程资料>模板" method:"get" summary:"树形结构文件夹目录"` + //ProjectId string `p:"projectId" dc:"项目id" v:"required#项目ID不能为空"` + //IdStr string `p:"idStr" dc:"父级标识" v:"required#父级标识不能为空"` + commonApi.Author +} + +// TreeStructureRes 树形结构文件夹目录 +type TreeStructureRes struct { + g.Meta `mime:"application/json"` + List []*model.TreeStructureRes `json:"list"` +} + +// CompressedDownloadReq 根据文件夹路径(相对路径)下载当前目录及以下文件、文件夹 +type CompressedDownloadReq struct { + g.Meta `path:"/compressedDownload" tags:"工程资料>模板" method:"get" summary:"根据文件夹路径(相对路径)下载当前目录及以下文件、文件夹"` + RelativePath string `p:"relativePath" dc:"相对路径" v:"required#相对路径不能为空"` + commonApi.Author +} + +// CompressedDownloadRes 根据文件夹路径(相对路径)下载当前目录及以下文件、文件夹 +type CompressedDownloadRes struct { + commonApi.EmptyRes + RelativePath string `p:"relativePath" dc:"相对路径" v:"required#相对路径不能为空"` +} + +// TemplateRecycleBinReq 模板回收站 +type TemplateRecycleBinReq struct { + g.Meta `path:"/templateRecycleBin" tags:"工程资料>模板" method:"put" summary:"模板回收站"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键ID不能为空"` + Type string `p:"type" dc:"1恢复 2删除" v:"between:1,2#范围值为1~2"` +} + +// TemplateRecycleBinRes 模板回收站 +type TemplateRecycleBinRes struct { + commonApi.EmptyRes +} + +// WriteFreelyReq a +type WriteFreelyReq struct { + g.Meta `path:"/complaintBoxAddTwo" tags:"工程资料>模板" method:"post" summary:"畅写回调保存"` + Path string `p:"path" dc:"路径" v:"required#文件保存路径不能为空"` +} + +// WriteFreelyRes a +type WriteFreelyRes struct { + commonApi.EmptyRes +} + +// UniFileDownloadReq 单文件下载 +type UniFileDownloadReq struct { + g.Meta `path:"/uniFileDownload" tags:"工程资料>模板" method:"get" summary:"单文件下载"` + RelativePath string `p:"relativePath" dc:"相对路径" v:"required#相对路径不能为空"` + commonApi.Author +} + +// UniFileDownloadRes 单文件下载 +type UniFileDownloadRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/document_completion.go b/api/v1/system/document_completion.go new file mode 100644 index 0000000..d1afd96 --- /dev/null +++ b/api/v1/system/document_completion.go @@ -0,0 +1,202 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-03-15 10:25:00 +// 生成路径: api/v1/system/document_completion.go +// 生成人:gfast +// desc:竣工图相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// qSearchReq 分页请求参数 +type DocumentCompletionSearchReq struct { + g.Meta `path:"/list" tags:"竣工图" method:"get" summary:"竣工图列表"` + Id string `p:"id"` // + IdStr string `p:"idStr"` //模板id + Pid string `p:"pid"` //父级(0代表顶级) + Name string `p:"name"` //模板名称 + FilenPath string `p:"filenPath"` //模板文件名 + Type string `p:"type"` //类型(1文件-2文件夹) + Suffix string `p:"suffix"` //后缀 + CreateBy string `p:"createBy"` //创建人 + UpdateBy string `p:"updateBy"` //更新人 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` //项目id + commonApi.PageReq + commonApi.Author +} + +// DocumentCompletionSearchRes 列表返回结果 +type DocumentCompletionSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.DocumentCompletionListRes `json:"list"` +} + +// DocumentCompletionAddReq 添加操作请求参数 +type DocumentCompletionAddReq struct { + g.Meta `path:"/add" tags:"竣工图" method:"post" summary:"竣工图添加"` + commonApi.Author + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + Pid string `p:"pid" dc:"父级文件夹(如果需要在某个文件夹下导入,那么需要有此参数)" ` + FileType string `p:"fileType" dc:"1上传压缩文件夹 2上传文件" v:"between:1,2#范围值为1~2"` + FilePath *comModel.UpFile `p:"filePath" dc:"fileType为1上传压缩文件夹 2文件" v:"required-if:fileType,1#需要上传压缩文件夹"` + //FileName string `p:"fileName" dc:"fileType为3填写文件夹名" v:"required-if:fileType,3#需要填写文件夹名称"` +} + +// DocumentCompletionAddRes 添加操作返回结果 +type DocumentCompletionAddRes struct { + commonApi.EmptyRes +} + +// DocumentCompletionEditReq 修改操作请求参数 +type DocumentCompletionEditReq struct { + g.Meta `path:"/edit" tags:"竣工图" method:"put" summary:"重命名(文件/文件夹)"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + Name string `p:"name" dc:"名" v:"required#模板名称不能为空"` + Type string `p:"type" dc:"1文件 2文件夹" v:"between:1,2#范围值为1~2"` +} + +// DocumentCompletionEditRes 修改操作返回结果 +type DocumentCompletionEditRes struct { + commonApi.EmptyRes +} + +// DocumentCompletionGetReq 获取一条数据请求 +type DocumentCompletionGetReq struct { + g.Meta `path:"/get" tags:"竣工图" method:"get" summary:"获取竣工图信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// DocumentCompletionGetRes 获取一条数据结果 +type DocumentCompletionGetRes struct { + g.Meta `mime:"application/json"` + List []*model.SelectTabNameAndTabIdByDateRes `p:"list"` +} + +// DocumentCompletionDeleteReq 删除数据请求 +type DocumentCompletionDeleteReq struct { + g.Meta `path:"/delete" tags:"竣工图" method:"delete" summary:"删除竣工图"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// DocumentCompletionDeleteRes 删除数据返回 +type DocumentCompletionDeleteRes struct { + commonApi.EmptyRes +} + +// CompletionNewFolderDataReq 新建文件夹 +type CompletionNewFolderDataReq struct { + g.Meta `path:"/newFolder" tags:"竣工图" method:"post" summary:"新建文件夹"` + commonApi.Author + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + Pid string `p:"pid" dc:"父级文件夹(如果需要在某个文件夹下导入,那么需要有此参数)" ` + //FileType string `p:"fileType" dc:"1上传压缩文件夹 2上传文件 3新建文件夹" v:"between:1,3#范围值为1~3"` + FilePath *comModel.UpFile `p:"filePath" dc:"fileType为1上传压缩文件夹 2文件" v:"required-if:fileType,1#需要上传压缩文件夹"` + FileName string `p:"fileName" dc:"fileType为3填写文件夹名" v:"required-if:fileType,3#需要填写文件夹名称"` +} + +// CompletionNewFolderDataRes 新建文件夹 +type CompletionNewFolderDataRes struct { + commonApi.EmptyRes +} + +// CompletionDataUniFileDownloadReq 单文件下载 +type CompletionDataUniFileDownloadReq struct { + g.Meta `path:"/uniFileDownload" tags:"竣工图" method:"get" summary:"单文件下载"` + RelativePath string `p:"relativePath" dc:"相对路径" v:"required#相对路径不能为空"` + Type string `p:"type" dc:"1文件下载 2文件夹下载" v:"required#type不能为空"` + TableName string `p:"tableName" dc:"1竣工 2施工 3可研" v:"between:1,3#取值范围为1~3"` + TableId int64 `p:"tableId" dc:"对应TableName的主键ID" v:"required#tableId不能为空"` + ProjectId int64 `p:"projectId" dc:"项目ID" v:"required#projectId不能为空"` + commonApi.Author +} + +// CompletionDataUniFileDownloadRes 单文件下载 +type CompletionDataUniFileDownloadRes struct { + commonApi.EmptyRes + Path string `p:"path" dc:"文件夹压缩包下载路径"` +} + +// DocumentTreeStructureReq 树形结构 +type DocumentTreeStructureReq struct { + g.Meta `path:"/treeStructure" tags:"竣工图" method:"get" summary:"树形结构"` + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` //项目id + Pid string `p:"pid"` //父级(0代表顶级) + //Name string `p:"name"` //模板名称 + //Suffix string `p:"suffix"` //后缀 + commonApi.Author +} + +// DocumentTreeStructureRes 树形结构 +type DocumentTreeStructureRes struct { + g.Meta `mime:"application/json"` + List []*model.DocumentCompletionListRes `json:"list"` +} + +// SelectByPidReq 获取pid +type SelectByPidReq struct { + g.Meta `path:"/selectByPid" tags:"竣工图" method:"get" summary:"获取pid"` + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` + PathName string `p:"pathName" dc:"路径地址(例子:/xxxx/xxxx)" v:"required#路径地址不能为空"` + commonApi.Author +} + +// SelectByPidRes 获取pid +type SelectByPidRes struct { + g.Meta `mime:"application/json"` + Pid string `p:"pid" dc:"pid"` +} + +// CompletionDataRecyclingStationReq 回收站 +type CompletionDataRecyclingStationReq struct { + g.Meta `path:"/completionDataRecyclingStation" tags:"竣工图" method:"put" summary:"回收站恢复及删除(删除已被注释)"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键ID不能为空"` + //Type string `p:"type" dc:"1恢复 2删除" v:"between:1,1#范围值为1"` + Type string `p:"type" dc:"1恢复" ` +} + +// CompletionDataRecyclingStationRes 回收站 +type CompletionDataRecyclingStationRes struct { + commonApi.EmptyRes +} + +// RecycleBinListReq 不分页请求参数 +type RecycleBinListReq struct { + g.Meta `path:"/recycleBinList" tags:"竣工图" method:"get" summary:"回收站数据加载"` + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + Type string `p:"type" dc:"1未删除的全部 2删除的全部 3全部(删除+未删除)" v:"between:1,3#范围值为1~3"` + commonApi.Author +} + +// RecycleBinListRes 不分页请求参数 +type RecycleBinListRes struct { + g.Meta `mime:"application/json"` + List []*model.DocumentCompletionInfoRes `json:"list"` +} + +// AuditDataListReq 审核数据列表 +type AuditDataListReq struct { + g.Meta `path:"/auditDataList" tags:"竣工图" method:"get" summary:"审核数据列表"` + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + Type string `p:"type" dc:"1未删除的全部 2删除的全部 3全部(删除+未删除)" v:"between:1,3#范围值为1~3"` + commonApi.Author +} + +// AuditDataListRes 审核数据列表 +type AuditDataListRes struct { + g.Meta `mime:"application/json"` + List []*model.DocumentCompletionInfoRes `json:"list"` +} diff --git a/api/v1/system/document_data.go b/api/v1/system/document_data.go new file mode 100644 index 0000000..2061f3b --- /dev/null +++ b/api/v1/system/document_data.go @@ -0,0 +1,231 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-12-27 09:30:03 +// 生成路径: api/v1/system/document_data.go +// 生成人:gfast +// desc:工程资料>资料相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// DocumentDataSearchReq 分页请求参数 +type DocumentDataSearchReq struct { + g.Meta `path:"/list" tags:"工程资料>资料" method:"get" summary:"工程资料>资料列表"` + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + Switch string `p:"switch" dc:"当前文件夹及以下(1)/当前文件夹(2)" v:"between:1,2#仅支持传递1~2"` + IdStr string `p:"idStr" dc:"模板标识" v:"required#模板标识不能为空"` + Name string `p:"name" dc:"模板名称"` + commonApi.Paging + commonApi.PageReq + commonApi.Author +} + +// DocumentDataSearchRes 列表返回结果 +type DocumentDataSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.DocumentDataListRes `json:"list"` +} + +// AllDocumentDataSearchReq 不分页请求参数 +type AllDocumentDataSearchReq struct { + g.Meta `path:"/allList" tags:"工程资料>资料" method:"get" summary:"回收站数据加载"` + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + Type string `p:"type" dc:"1未删除的全部 2删除的全部 3全部(删除+未删除)" v:"between:1,3#范围值为1~3"` + commonApi.Author +} + +// AllDocumentDataSearchRes 不分页请求参数 +type AllDocumentDataSearchRes struct { + g.Meta `mime:"application/json"` + List []*model.DocumentDataInfoRes `json:"list"` +} + +// DocumentDataAddReq 本地导入(文件/压缩文件夹) +type DocumentDataAddReq struct { + g.Meta `path:"/add" tags:"工程资料>资料" method:"post" summary:"本地导入(文件/压缩文件夹)"` + commonApi.Author + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + Pid string `p:"pid" dc:"父级文件夹(如果需要在某个文件夹下导入,那么需要有此参数)" ` + FileType string `p:"fileType" dc:"1上传压缩文件夹 2上传文件" v:"between:1,2#范围值为1~2"` + FilePath *comModel.UpFile `p:"filePath" dc:"fileType为1上传压缩文件夹 2文件" v:"required-if:fileType,1#需要上传压缩文件夹"` + //FileName string `p:"fileName" dc:"fileType为3填写文件夹名" v:"required-if:fileType,3#需要填写文件夹名称"` +} + +// DocumentDataAddRes 本地导入(文件/压缩文件夹) +type DocumentDataAddRes struct { + commonApi.EmptyRes +} + +// NewFolderDataReq 新建文件夹 +type NewFolderDataReq struct { + g.Meta `path:"/newFolder" tags:"工程资料>资料" method:"post" summary:"新建文件夹"` + commonApi.Author + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + Pid string `p:"pid" dc:"父级文件夹(如果需要在某个文件夹下导入,那么需要有此参数)" ` + //FileType string `p:"fileType" dc:"1上传压缩文件夹 2上传文件 3新建文件夹" v:"between:1,3#范围值为1~3"` + FilePath *comModel.UpFile `p:"filePath" dc:"fileType为1上传压缩文件夹 2文件" v:"required-if:fileType,1#需要上传压缩文件夹"` + FileName string `p:"fileName" dc:"fileType为3填写文件夹名" v:"required-if:fileType,3#需要填写文件夹名称"` +} + +// NewFolderDataRes 新建文件夹 +type NewFolderDataRes struct { + commonApi.EmptyRes +} + +// DocumentDataEditReq 修改操作请求参数 +type DocumentDataEditReq struct { + g.Meta `path:"/edit" tags:"工程资料>资料" method:"put" summary:"重命名(文件/文件夹)"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + Name string `p:"name" dc:"名" v:"required#模板名称不能为空"` + Type string `p:"type" dc:"1文件 2文件夹" v:"between:1,2#范围值为1~2"` +} + +// DocumentDataEditRes 修改操作返回结果 +type DocumentDataEditRes struct { + commonApi.EmptyRes +} + +// DocumentDataGetReq 获取一条数据请求 +type DocumentDataGetReq struct { + g.Meta `path:"/get" tags:"工程资料>资料" method:"get" summary:"获取工程资料>资料信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// DocumentDataGetRes 获取一条数据结果 +type DocumentDataGetRes struct { + g.Meta `mime:"application/json"` + *model.DocumentDataInfoRes +} + +// DocumentDataDeleteReq 删除数据请求 +type DocumentDataDeleteReq struct { + g.Meta `path:"/delete" tags:"工程资料>资料" method:"delete" summary:"删除工程资料>资料"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// DocumentDataDeleteRes 删除数据返回 +type DocumentDataDeleteRes struct { + commonApi.EmptyRes +} + +// TreeStructureDataReq 树形结构文件夹目录 +type TreeStructureDataReq struct { + g.Meta `path:"/treeStructureData" tags:"工程资料>资料" method:"get" summary:"树形结构文件夹目录"` + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + commonApi.Author +} + +// TreeStructureDataRes 树形结构文件夹目录 +type TreeStructureDataRes struct { + g.Meta `mime:"application/json"` + List []*model.TreeStructureDataRes `json:"list"` +} + +// OnlineImportReq 在线模板导入|复制(复制文件或文件夹) +type OnlineImportReq struct { + g.Meta `path:"/onlineImport" tags:"工程资料>资料" method:"put" summary:"在线模板导入|复制(复制文件或文件夹)"` + commonApi.Author + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + Type string `p:"type" dc:"1模板文件 2模板文件夹" v:"between:1,4#范围值为1~4"` + TemplateId []string `p:"TemplateId" dc:"模板主键ID" v:"required#模板主键ID不能为空"` + DataId string `p:"DataId" dc:"资料主键ID" v:"required#资料主键ID不能为空"` +} + +// OnlineImportRes 在线模板导入|复制(复制文件或文件夹) +type OnlineImportRes struct { + commonApi.EmptyRes +} + +// OnlineMobileReq 在线资料导入|移动(移动文件或文件夹) +type OnlineMobileReq struct { + g.Meta `path:"/onlineMobile" tags:"工程资料>资料" method:"put" summary:"在线资料导入|移动(移动文件或文件夹)"` + commonApi.Author + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + Type string `p:"type" dc:"1资料文件 2资料文件夹" v:"between:1,2#范围值为1~2"` + TemplateId string `p:"TemplateId" dc:"被移动文件/文件夹(主键ID)" v:"required#模板主键ID不能为空"` + DataId string `p:"DataId" dc:"移动到哪儿(主键ID)" v:"required#资料主键ID不能为空"` +} + +// OnlineMobileRes 在线资料导入|移动(移动文件或文件夹) +type OnlineMobileRes struct { + commonApi.EmptyRes +} + +// DataRecyclingStationReq 资料回收站 +type DataRecyclingStationReq struct { + g.Meta `path:"/dataRecyclingStation" tags:"工程资料>资料" method:"put" summary:"资料回收站恢复及删除(删除已被注释)"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键ID不能为空"` + //Type string `p:"type" dc:"1恢复 2删除" v:"between:1,1#范围值为1"` + Type string `p:"type" dc:"1恢复" ` +} + +// DataRecyclingStationRes 资料回收站 +type DataRecyclingStationRes struct { + commonApi.EmptyRes +} + +// DataWriteFreelyReq 畅写回调保存 +type DataWriteFreelyReq struct { + g.Meta `path:"/complaintBoxAdd" tags:"工程资料>资料" method:"post" summary:"畅写回调保存"` + Path string `p:"path" dc:"路径" v:"required#文件保存路径不能为空"` +} + +// DataFileQueryReq 资料查询(查询资料里面的所有文件,限制格式为ppt、excel、word) +type DataFileQueryReq struct { + g.Meta `path:"/dataFileQuery" tags:"工程资料>资料" method:"get" summary:"资料文件模糊查询(查询资料里面的所有文件,限制文件为ppt、excel、word)"` + Project int64 `p:"project" dc:"项目id" ` + FileName string `p:"fileName" dc:"文件名称查询(模糊查询)"` + commonApi.Author +} + +// DataFileQueryRes 资料查询(查询资料里面的所有文件,限制格式为ppt、excel、word) +type DataFileQueryRes struct { + commonApi.EmptyRes + List []*model.DocumentDataListTwoRes `json:"list"` +} + +// DataCompressedDownloadReq 根据文件夹路径(相对路径)下载当前目录及以下文件、文件夹 +type DataCompressedDownloadReq struct { + g.Meta `path:"/dataCompressedDownload" tags:"工程资料>资料" method:"get" summary:"根据文件夹路径(相对路径)下载当前目录及以下文件、文件夹"` + RelativePath string `p:"relativePath" dc:"相对路径" v:"required#相对路径不能为空"` + commonApi.Author +} + +// DataUniFileDownloadReq 单文件下载 +type DataUniFileDownloadReq struct { + g.Meta `path:"/uniFileDownload" tags:"工程资料>资料" method:"get" summary:"单文件下载"` + RelativePath string `p:"relativePath" dc:"相对路径" v:"required#相对路径不能为空"` + commonApi.Author +} + +// DataUniFileDownloadRes 单文件下载 +type DataUniFileDownloadRes struct { + commonApi.EmptyRes +} + +// SonFileReq 获取文件夹下的子文件 +type SonFileReq struct { + g.Meta `path:"/sonFile" tags:"工程资料>资料" method:"get" summary:"获取文件夹下的子文件"` + Project int64 `p:"project" dc:"项目id" ` + IdStr string `p:"idStr" dc:"父文件夹唯一标识" v:"required#父文件夹唯一标识不能为空"` + commonApi.Author +} + +// SonFileRes 获取文件夹下的子文件 +type SonFileRes struct { + g.Meta `mime:"application/json"` + List []*model.DocumentDataInfoRes `json:"list"` +} diff --git a/api/v1/system/document_production_drawing.go b/api/v1/system/document_production_drawing.go new file mode 100644 index 0000000..2eed65f --- /dev/null +++ b/api/v1/system/document_production_drawing.go @@ -0,0 +1,188 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-03-15 10:24:54 +// 生成路径: api/v1/system/document_production_drawing.go +// 生成人:gfast +// desc:施工图相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// DocumentProductionDrawingSearchReq 分页请求参数 +type DocumentProductionDrawingSearchReq struct { + g.Meta `path:"/list" tags:"施工图" method:"get" summary:"施工图列表"` + Id string `p:"id"` // + IdStr string `p:"idStr"` //模板id + Pid string `p:"pid"` //父级(0代表顶级) + Name string `p:"name"` //模板名称 + FilenPath string `p:"filenPath"` //模板文件名 + Type string `p:"type"` //类型(1文件-2文件夹) + Suffix string `p:"suffix"` //后缀 + CreateBy string `p:"createBy"` //创建人 + UpdateBy string `p:"updateBy"` //更新人 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` //项目id + commonApi.PageReq + commonApi.Author +} + +// DocumentProductionDrawingSearchRes 列表返回结果 +type DocumentProductionDrawingSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.DocumentProductionDrawingListRes `json:"list"` +} + +// DocumentProductionDrawingAddReq 添加操作请求参数 +type DocumentProductionDrawingAddReq struct { + g.Meta `path:"/add" tags:"施工图" method:"post" summary:"施工图添加"` + commonApi.Author + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + Pid string `p:"pid" dc:"父级文件夹(如果需要在某个文件夹下导入,那么需要有此参数)" ` + FileType string `p:"fileType" dc:"1上传压缩文件夹 2上传文件" v:"between:1,2#范围值为1~2"` + FilePath *comModel.UpFile `p:"filePath" dc:"fileType为1上传压缩文件夹 2文件" v:"required-if:fileType,1#需要上传压缩文件夹"` + //FileName string `p:"fileName" dc:"fileType为3填写文件夹名" v:"required-if:fileType,3#需要填写文件夹名称"` +} + +// DocumentProductionDrawingAddRes 添加操作返回结果 +type DocumentProductionDrawingAddRes struct { + commonApi.EmptyRes +} + +// DocumentProductionDrawingEditReq 修改操作请求参数 +type DocumentProductionDrawingEditReq struct { + g.Meta `path:"/edit" tags:"施工图" method:"put" summary:"重命名(文件/文件夹)"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + Name string `p:"name" dc:"名" v:"required#模板名称不能为空"` + Type string `p:"type" dc:"1文件 2文件夹" v:"between:1,2#范围值为1~2"` +} + +// DocumentProductionDrawingEditRes 修改操作返回结果 +type DocumentProductionDrawingEditRes struct { + commonApi.EmptyRes +} + +// DocumentProductionDrawingGetReq 获取一条数据请求 +type DocumentProductionDrawingGetReq struct { + g.Meta `path:"/get" tags:"施工图" method:"get" summary:"获取施工图信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// DocumentProductionDrawingGetRes 获取一条数据结果 +type DocumentProductionDrawingGetRes struct { + g.Meta `mime:"application/json"` + List []*model.SelectTabNameAndTabIdByDateRes `p:"list"` +} + +// DocumentProductionDrawingDeleteReq 删除数据请求 +type DocumentProductionDrawingDeleteReq struct { + g.Meta `path:"/delete" tags:"施工图" method:"delete" summary:"删除施工图"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// DocumentProductionDrawingDeleteRes 删除数据返回 +type DocumentProductionDrawingDeleteRes struct { + commonApi.EmptyRes +} + +// ProductionDrawingNewFolderDataReq 新建文件夹 +type ProductionDrawingNewFolderDataReq struct { + g.Meta `path:"/productionDrawingNewFolderData" tags:"施工图" method:"post" summary:"新建文件夹"` + commonApi.Author + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + Pid string `p:"pid" dc:"父级文件夹(如果需要在某个文件夹下导入,那么需要有此参数)" ` + //FileType string `p:"fileType" dc:"1上传压缩文件夹 2上传文件 3新建文件夹" v:"between:1,3#范围值为1~3"` + FilePath *comModel.UpFile `p:"filePath" dc:"fileType为1上传压缩文件夹 2文件" v:"required-if:fileType,1#需要上传压缩文件夹"` + FileName string `p:"fileName" dc:"fileType为3填写文件夹名" v:"required-if:fileType,3#需要填写文件夹名称"` +} + +// ProductionDrawingNewFolderDataRes 新建文件夹 +type ProductionDrawingNewFolderDataRes struct { + commonApi.EmptyRes +} + +// ProductionDrawingDataUniFileDownloadReq 单文件下载 +type ProductionDrawingDataUniFileDownloadReq struct { + g.Meta `path:"/productionDrawingDataUniFileDownload" tags:"施工图" method:"get" summary:"单文件下载"` + RelativePath string `p:"relativePath" dc:"相对路径" v:"required#相对路径不能为空"` + Type string `p:"type" dc:"1文件下载 2文件夹下载" v:"required#相对路径不能为空"` + TableName string `p:"tableName" dc:"1竣工 2施工 3可研" v:"between:1,3#取值范围为1~3"` + TableId int64 `p:"tableId" dc:"对应TableName的主键ID" v:"required#tableId不能为空"` + ProjectId int64 `p:"projectId" dc:"项目ID" v:"required#projectId不能为空"` + commonApi.Author +} + +// ProductionDrawingDataUniFileDownloadRes 单文件下载 +type ProductionDrawingDataUniFileDownloadRes struct { + commonApi.EmptyRes + Path string `p:"path" dc:"文件夹压缩包下载路径"` +} + +// ProductionDrawingTreeStructureReq 树形结构 +type ProductionDrawingTreeStructureReq struct { + g.Meta `path:"/productionDrawingTreeStructure" tags:"施工图" method:"get" summary:"树形结构"` + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` //项目id + Pid string `p:"pid"` //父级(0代表顶级) + //Name string `p:"name"` //模板名称 + //Suffix string `p:"suffix"` //后缀 + commonApi.Author +} + +// ProductionDrawingTreeStructureRes 树形结构 +type ProductionDrawingTreeStructureRes struct { + g.Meta `mime:"application/json"` + List []*model.DocumentProductionDrawingListRes `json:"list"` +} + +// ProductionDrawingSelectByPidReq 获取pid +type ProductionDrawingSelectByPidReq struct { + g.Meta `path:"/productionDrawingSelectByPid" tags:"施工图" method:"get" summary:"获取pid"` + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` + PathName string `p:"pathName" dc:"路径地址(例子:/xxxx/xxxx)" v:"required#路径地址不能为空"` + commonApi.Author +} + +// ProductionDrawingSelectByPidRes 获取pid +type ProductionDrawingSelectByPidRes struct { + g.Meta `mime:"application/json"` + Pid string `p:"pid" dc:"pid"` +} + +// ProductionDrawingDataRecyclingStationReq 回收站 +type ProductionDrawingDataRecyclingStationReq struct { + g.Meta `path:"/productionDrawingDataRecyclingStation" tags:"施工图" method:"put" summary:"回收站恢复及删除(删除已被注释)"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键ID不能为空"` + //Type string `p:"type" dc:"1恢复 2删除" v:"between:1,1#范围值为1"` + Type string `p:"type" dc:"1恢复" ` +} + +// ProductionDrawingDataRecyclingStationRes 回收站 +type ProductionDrawingDataRecyclingStationRes struct { + commonApi.EmptyRes +} + +// ProductionDrawingRecycleBinListReq 不分页请求参数 +type ProductionDrawingRecycleBinListReq struct { + g.Meta `path:"/productionDrawingRecycleBin" tags:"施工图" method:"get" summary:"回收站数据加载"` + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + Type string `p:"type" dc:"1未删除的全部 2删除的全部 3全部(删除+未删除)" v:"between:1,3#范围值为1~3"` + commonApi.Author +} + +// ProductionDrawingRecycleBinListRes 不分页请求参数 +type ProductionDrawingRecycleBinListRes struct { + g.Meta `mime:"application/json"` + List []*model.DocumentProductionDrawingInfoRes `json:"list"` +} diff --git a/api/v1/system/document_quality_meeting.go b/api/v1/system/document_quality_meeting.go new file mode 100644 index 0000000..8874460 --- /dev/null +++ b/api/v1/system/document_quality_meeting.go @@ -0,0 +1,193 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-03-25 16:43:56 +// 生成路径: api/v1/system/document_quality_meeting.go +// 生成人:gfast +// desc:质量会议相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// DocumentQualityMeetingSearchReq 分页请求参数 +type DocumentQualityMeetingSearchReq struct { + g.Meta `path:"/list" tags:"质量会议" method:"get" summary:"质量会议列表"` + Id string `p:"id"` // + IdStr string `p:"idStr"` // 模板id + Pid string `p:"pid"` // 父级(0代表顶级) + Name string `p:"name"` // 模板名称 + FilenPath string `p:"filenPath"` // 模板文件名 + Type string `p:"type"` // 类型(1文件-2文件夹) + Suffix string `p:"suffix"` // 后缀 + CreateBy string `p:"createBy"` // 创建人 + UpdateBy string `p:"updateBy"` // 更新人 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` // 创建时间 + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` // 项目id + commonApi.PageReq + commonApi.Author +} + +// DocumentQualityMeetingSearchRes 列表返回结果 +type DocumentQualityMeetingSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.DocumentQualityMeetingListRes `json:"list"` +} + +// DocumentQualityMeetingAddReq 添加操作请求参数 +type DocumentQualityMeetingAddReq struct { + g.Meta `path:"/add" tags:"质量会议" method:"post" summary:"质量会议添加"` + commonApi.Author + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + Pid string `p:"pid" dc:"父级文件夹(如果需要在某个文件夹下导入,那么需要有此参数)" ` + FileType string `p:"fileType" dc:"1上传压缩文件夹 2上传文件" v:"between:1,2#范围值为1~2"` + FilePath *comModel.UpFile `p:"filePath" dc:"fileType为1上传压缩文件夹 2文件" v:"required-if:fileType,1#需要上传压缩文件夹"` + // FileName string `p:"fileName" dc:"fileType为3填写文件夹名" v:"required-if:fileType,3#需要填写文件夹名称"` +} + +// DocumentQualityMeetingAddRes 添加操作返回结果 +type DocumentQualityMeetingAddRes struct { + commonApi.EmptyRes +} + +// DocumentQualityMeetingEditReq 修改操作请求参数 +type DocumentQualityMeetingEditReq struct { + g.Meta `path:"/edit" tags:"质量会议" method:"put" summary:"质量会议修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + IdStr string `p:"idStr" ` + Pid string `p:"pid" ` + Name string `p:"name" v:"required#模板名称不能为空"` + FilenPath string `p:"filenPath" ` + Type string `p:"type" ` + Suffix string `p:"suffix" ` + CreateBy string `p:"createBy" ` + UpdateBy string `p:"updateBy" ` + ProjectId int64 `p:"projectId" ` +} + +// DocumentQualityMeetingEditRes 修改操作返回结果 +type DocumentQualityMeetingEditRes struct { + commonApi.EmptyRes +} + +// DocumentQualityMeetingGetReq 获取一条数据请求 +type DocumentQualityMeetingGetReq struct { + g.Meta `path:"/get" tags:"质量会议" method:"get" summary:"获取质量会议信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// DocumentQualityMeetingGetRes 获取一条数据结果 +type DocumentQualityMeetingGetRes struct { + g.Meta `mime:"application/json"` + List []*model.SelectTabNameAndTabIdByDateRes `p:"list"` +} + +// DocumentQualityMeetingDeleteReq 删除数据请求 +type DocumentQualityMeetingDeleteReq struct { + g.Meta `path:"/delete" tags:"质量会议" method:"delete" summary:"删除质量会议"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// DocumentQualityMeetingDeleteRes 删除数据返回 +type DocumentQualityMeetingDeleteRes struct { + commonApi.EmptyRes +} + +// DocumentQualityNewFolderDataReq 新建文件夹 +type DocumentQualityNewFolderDataReq struct { + g.Meta `path:"/qualityNewFolderData" tags:"质量会议" method:"post" summary:"新建文件夹"` + commonApi.Author + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + Pid string `p:"pid" dc:"父级文件夹(如果需要在某个文件夹下导入,那么需要有此参数)" ` + // FileType string `p:"fileType" dc:"1上传压缩文件夹 2上传文件 3新建文件夹" v:"between:1,3#范围值为1~3"` + FilePath *comModel.UpFile `p:"filePath" dc:"fileType为1上传压缩文件夹 2文件" v:"required-if:fileType,1#需要上传压缩文件夹"` + FileName string `p:"fileName" dc:"fileType为3填写文件夹名" v:"required-if:fileType,3#需要填写文件夹名称"` +} + +// DocumentQualityNewFolderDataRes 新建文件夹 +type DocumentQualityNewFolderDataRes struct { + commonApi.EmptyRes +} + +// DocumentQualityDataUniFileDownloadReq 单文件下载 +type DocumentQualityDataUniFileDownloadReq struct { + g.Meta `path:"/qualityDataUniFileDownload" tags:"质量会议" method:"get" summary:"单文件下载"` + RelativePath string `p:"relativePath" dc:"相对路径" v:"required#相对路径不能为空"` + Type string `p:"type" dc:"1文件下载 2文件夹下载" v:"required#相对路径不能为空"` + + commonApi.Author +} + +// DocumentQualityDataUniFileDownloadRes 单文件下载 +type DocumentQualityDataUniFileDownloadRes struct { + commonApi.EmptyRes + Path string `p:"path" dc:"文件夹压缩包下载路径"` +} + +// DocumentQualityTreeStructureReq 树形结构 +type DocumentQualityTreeStructureReq struct { + g.Meta `path:"/qualityTreeStructure" tags:"质量会议" method:"get" summary:"树形结构"` + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` // 项目id + Pid string `p:"pid"` // 父级(0代表顶级) + // Name string `p:"name"` //模板名称 + // Suffix string `p:"suffix"` //后缀 + commonApi.Author +} + +// DocumentQualityTreeStructureRes 树形结构 +type DocumentQualityTreeStructureRes struct { + g.Meta `mime:"application/json"` + List []*model.DocumentQualityMeetingListRes `json:"list"` +} + +// DocumentQualitySelectByPidReq 获取pid +type DocumentQualitySelectByPidReq struct { + g.Meta `path:"/qualitySelectByPid" tags:"质量会议" method:"get" summary:"获取pid"` + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` + PathName string `p:"pathName" dc:"路径地址(例子:/xxxx/xxxx)" v:"required#路径地址不能为空"` + commonApi.Author +} + +// DocumentQualitySelectByPidRes 获取pid +type DocumentQualitySelectByPidRes struct { + g.Meta `mime:"application/json"` + Pid string `p:"pid" dc:"pid"` +} + +// DocumentQualityDataRecyclingStationReq 回收站 +type DocumentQualityDataRecyclingStationReq struct { + g.Meta `path:"/qualityDataRecyclingStation" tags:"质量会议" method:"put" summary:"回收站恢复及删除(删除已被注释)"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键ID不能为空"` + // Type string `p:"type" dc:"1恢复 2删除" v:"between:1,1#范围值为1"` + Type string `p:"type" dc:"1恢复" ` +} + +// DocumentQualityDataRecyclingStationRes 回收站 +type DocumentQualityDataRecyclingStationRes struct { + commonApi.EmptyRes +} + +// DocumentQualityRecycleBinListReq 不分页请求参数 +type DocumentQualityRecycleBinListReq struct { + g.Meta `path:"/qualityRecycleBinList" tags:"质量会议" method:"get" summary:"回收站数据加载"` + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + Type string `p:"type" dc:"1未删除的全部 2删除的全部 3全部(删除+未删除)" v:"between:1,3#范围值为1~3"` + commonApi.Author +} + +// DocumentQualityRecycleBinListRes 不分页请求参数 +type DocumentQualityRecycleBinListRes struct { + g.Meta `mime:"application/json"` + List []*model.DocumentQualityMeetingInfoRes `json:"list"` +} diff --git a/api/v1/system/document_report.go b/api/v1/system/document_report.go new file mode 100644 index 0000000..eaba872 --- /dev/null +++ b/api/v1/system/document_report.go @@ -0,0 +1,195 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-03-15 10:24:21 +// 生成路径: api/v1/system/document_report.go +// 生成人:gfast +// desc:科研及专题报告相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// DocumentReportSearchReq 分页请求参数 +type DocumentReportSearchReq struct { + g.Meta `path:"/list" tags:"科研及专题报告" method:"get" summary:"科研及专题报告列表"` + Id string `p:"id"` // + IdStr string `p:"idStr"` //模板id + Pid string `p:"pid"` //父级(0代表顶级) + Name string `p:"name"` //模板名称 + FilenPath string `p:"filenPath"` //模板文件名 + Type string `p:"type"` //类型(1文件-2文件夹) + Suffix string `p:"suffix"` //后缀 + CreateBy string `p:"createBy"` //创建人 + UpdateBy string `p:"updateBy"` //更新人 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` //项目id + commonApi.PageReq + commonApi.Author +} + +// DocumentReportSearchRes 列表返回结果 +type DocumentReportSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.DocumentReportListRes `json:"list"` +} + +// DocumentReportAddReq 添加操作请求参数 +type DocumentReportAddReq struct { + g.Meta `path:"/add" tags:"科研及专题报告" method:"post" summary:"科研及专题报告添加"` + commonApi.Author + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + Pid string `p:"pid" dc:"父级文件夹(如果需要在某个文件夹下导入,那么需要有此参数)" ` + FileType string `p:"fileType" dc:"1上传压缩文件夹 2上传文件" v:"between:1,2#范围值为1~2"` + FilePath *comModel.UpFile `p:"filePath" dc:"fileType为1上传压缩文件夹 2文件" v:"required-if:fileType,1#需要上传压缩文件夹"` + //FileName string `p:"fileName" dc:"fileType为3填写文件夹名" v:"required-if:fileType,3#需要填写文件夹名称"` +} + +// DocumentReportAddRes 添加操作返回结果 +type DocumentReportAddRes struct { + commonApi.EmptyRes +} + +// DocumentReportEditReq 修改操作请求参数 +type DocumentReportEditReq struct { + g.Meta `path:"/edit" tags:"科研及专题报告" method:"put" summary:"科研及专题报告修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + IdStr string `p:"idStr" ` + Pid string `p:"pid" ` + Name string `p:"name" v:"required#模板名称不能为空"` + FilenPath string `p:"filenPath" ` + Type string `p:"type" ` + Suffix string `p:"suffix" ` + CreateBy string `p:"createBy" ` + UpdateBy string `p:"updateBy" ` + ProjectId int64 `p:"projectId" ` +} + +// DocumentReportEditRes 修改操作返回结果 +type DocumentReportEditRes struct { + commonApi.EmptyRes +} + +// DocumentReportGetReq 获取一条数据请求 +type DocumentReportGetReq struct { + g.Meta `path:"/get" tags:"科研及专题报告" method:"get" summary:"获取科研及专题报告信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// DocumentReportGetRes 获取一条数据结果 +type DocumentReportGetRes struct { + g.Meta `mime:"application/json"` + *model.DocumentReportInfoRes +} + +// DocumentReportDeleteReq 删除数据请求 +type DocumentReportDeleteReq struct { + g.Meta `path:"/delete" tags:"科研及专题报告" method:"delete" summary:"删除科研及专题报告"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// DocumentReportDeleteRes 删除数据返回 +type DocumentReportDeleteRes struct { + commonApi.EmptyRes +} + +// ReportNewFolderDataReq 新建文件夹 +type ReportNewFolderDataReq struct { + g.Meta `path:"/reportNewFolderData" tags:"科研及专题报告" method:"post" summary:"新建文件夹"` + commonApi.Author + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + Pid string `p:"pid" dc:"父级文件夹(如果需要在某个文件夹下导入,那么需要有此参数)" ` + //FileType string `p:"fileType" dc:"1上传压缩文件夹 2上传文件 3新建文件夹" v:"between:1,3#范围值为1~3"` + FilePath *comModel.UpFile `p:"filePath" dc:"fileType为1上传压缩文件夹 2文件" v:"required-if:fileType,1#需要上传压缩文件夹"` + FileName string `p:"fileName" dc:"fileType为3填写文件夹名" v:"required-if:fileType,3#需要填写文件夹名称"` +} + +// ReportNewFolderDataRes 新建文件夹 +type ReportNewFolderDataRes struct { + commonApi.EmptyRes +} + +// ReportDataUniFileDownloadReq 单文件下载 +type ReportDataUniFileDownloadReq struct { + g.Meta `path:"/reportDataUniFileDownload" tags:"科研及专题报告" method:"get" summary:"单文件下载"` + RelativePath string `p:"relativePath" dc:"相对路径" v:"required#相对路径不能为空"` + Type string `p:"type" dc:"1文件下载 2文件夹下载" v:"required#相对路径不能为空"` + TableName string `p:"tableName" dc:"1竣工 2施工 3可研" v:"between:1,3#取值范围为1~3"` + TableId int64 `p:"tableId" dc:"对应TableName的主键ID" v:"required#tableId不能为空"` + ProjectId int64 `p:"projectId" dc:"项目ID" v:"required#projectId不能为空"` + commonApi.Author +} + +// ReportDataUniFileDownloadRes 单文件下载 +type ReportDataUniFileDownloadRes struct { + commonApi.EmptyRes + Path string `p:"path" dc:"文件夹压缩包下载路径"` +} + +// ReportTreeStructureReq 树形结构 +type ReportTreeStructureReq struct { + g.Meta `path:"/reportTreeStructure" tags:"科研及专题报告" method:"get" summary:"树形结构"` + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` //项目id + Pid string `p:"pid"` //父级(0代表顶级) + //Name string `p:"name"` //模板名称 + //Suffix string `p:"suffix"` //后缀 + commonApi.Author +} + +// ReportTreeStructureRes 树形结构 +type ReportTreeStructureRes struct { + g.Meta `mime:"application/json"` + List []*model.DocumentReportListRes `json:"list"` +} + +// ReportSelectByPidReq 获取pid +type ReportSelectByPidReq struct { + g.Meta `path:"/reportSelectByPid" tags:"科研及专题报告" method:"get" summary:"获取pid"` + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` + PathName string `p:"pathName" dc:"路径地址(例子:/xxxx/xxxx)" v:"required#路径地址不能为空"` + commonApi.Author +} + +// ReportSelectByPidRes 获取pid +type ReportSelectByPidRes struct { + g.Meta `mime:"application/json"` + Pid string `p:"pid" dc:"pid"` +} + +// ReportDataRecyclingStationReq 回收站 +type ReportDataRecyclingStationReq struct { + g.Meta `path:"/reportDataRecyclingStation" tags:"科研及专题报告" method:"put" summary:"回收站恢复及删除(删除已被注释)"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键ID不能为空"` + //Type string `p:"type" dc:"1恢复 2删除" v:"between:1,1#范围值为1"` + Type string `p:"type" dc:"1恢复" ` +} + +// ReportDataRecyclingStationRes 回收站 +type ReportDataRecyclingStationRes struct { + commonApi.EmptyRes +} + +// ReportRecycleBinListReq 不分页请求参数 +type ReportRecycleBinListReq struct { + g.Meta `path:"/reportRecycleBinList" tags:"科研及专题报告" method:"get" summary:"回收站数据加载"` + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + Type string `p:"type" dc:"1未删除的全部 2删除的全部 3全部(删除+未删除)" v:"between:1,3#范围值为1~3"` + commonApi.Author +} + +// ReportRecycleBinListRes 不分页请求参数 +type ReportRecycleBinListRes struct { + g.Meta `mime:"application/json"` + List []*model.DocumentReportInfoRes `json:"list"` +} diff --git a/api/v1/system/document_safety_meeting.go b/api/v1/system/document_safety_meeting.go new file mode 100644 index 0000000..616c90e --- /dev/null +++ b/api/v1/system/document_safety_meeting.go @@ -0,0 +1,154 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-04-09 11:40:20 +// 生成路径: api/v1/system/document_safety_meeting.go +// 生成人:gfast +// desc:安全会议相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// DocumentSafetyMeetingSearchReq 分页请求参数 +type DocumentSafetyMeetingSearchReq struct { + g.Meta `path:"/list" tags:"安全会议" method:"get" summary:"安全会议列表"` + Id string `p:"id"` // + IdStr string `p:"idStr"` // 模板id + Pid string `p:"pid"` // 父级(0代表顶级) + Name string `p:"name"` // 模板名称 + FilenPath string `p:"filenPath"` // 模板文件名 + Type string `p:"type"` // 类型(1文件-2文件夹) + Suffix string `p:"suffix"` // 后缀 + CreateBy string `p:"createBy"` // 创建人 + UpdateBy string `p:"updateBy"` // 更新人 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` // 创建时间 + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` // 项目id + commonApi.PageReq + commonApi.Author +} + +// DocumentSafetyMeetingSearchRes 列表返回结果 +type DocumentSafetyMeetingSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.DocumentSafetyMeetingListRes `json:"list"` +} + +// DocumentSafetyMeetingAddReq 添加操作请求参数 +type DocumentSafetyMeetingAddReq struct { + g.Meta `path:"/add" tags:"安全会议" method:"post" summary:"安全会议添加"` + commonApi.Author + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + Pid string `p:"pid" dc:"父级文件夹(如果需要在某个文件夹下导入,那么需要有此参数)" ` + FileType string `p:"fileType" dc:"1上传压缩文件夹 2上传文件" v:"between:1,2#范围值为1~2"` + FilePath *comModel.UpFile `p:"filePath" dc:"fileType为1上传压缩文件夹 2文件" v:"required-if:fileType,1#需要上传压缩文件夹"` +} + +// DocumentSafetyMeetingAddRes 添加操作返回结果 +type DocumentSafetyMeetingAddRes struct { + commonApi.EmptyRes +} + +// DocumentSafetyMeetingEditReq 修改操作请求参数 +type DocumentSafetyMeetingEditReq struct { + g.Meta `path:"/edit" tags:"安全会议" method:"put" summary:"安全会议修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + IdStr string `p:"idStr" ` + Pid string `p:"pid" ` + Name string `p:"name" v:"required#模板名称不能为空"` + FilenPath string `p:"filenPath" ` + Type string `p:"type" ` + Suffix string `p:"suffix" ` + CreateBy string `p:"createBy" ` + UpdateBy string `p:"updateBy" ` + ProjectId int64 `p:"projectId" ` +} + +// DocumentSafetyMeetingEditRes 修改操作返回结果 +type DocumentSafetyMeetingEditRes struct { + commonApi.EmptyRes +} + +// DocumentSafetyMeetingGetReq 获取一条数据请求 +type DocumentSafetyMeetingGetReq struct { + g.Meta `path:"/get" tags:"安全会议" method:"get" summary:"获取安全会议信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// DocumentSafetyMeetingGetRes 获取一条数据结果 +type DocumentSafetyMeetingGetRes struct { + g.Meta `mime:"application/json"` + *model.DocumentSafetyMeetingInfoRes +} + +// DocumentSafetyMeetingDeleteReq 删除数据请求 +type DocumentSafetyMeetingDeleteReq struct { + g.Meta `path:"/delete" tags:"安全会议" method:"delete" summary:"删除安全会议"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// DocumentSafetyMeetingDeleteRes 删除数据返回 +type DocumentSafetyMeetingDeleteRes struct { + commonApi.EmptyRes +} + +// DocumentsafetyTreeStructureReq 树形结构 +type DocumentSafetyTreeStructureReq struct { + g.Meta `path:"/safetyTreeStructure" tags:"安全会议" method:"get" summary:"树形结构"` + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` // 项目id + Pid string `p:"pid"` // 父级(0代表顶级) + // Name string `p:"name"` //模板名称 + // Suffix string `p:"suffix"` //后缀 + commonApi.Author +} + +// 新建文件夹 +type DocumentSafetyNewFolderDataReq struct { + g.Meta `path:"/safetyNewFolderData" tags:"安全会议" method:"post" summary:"新建文件夹"` + commonApi.Author + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + Pid string `p:"pid" dc:"父级文件夹(如果需要在某个文件夹下导入,那么需要有此参数)" ` + // FileType string `p:"fileType" dc:"1上传压缩文件夹 2上传文件 3新建文件夹" v:"between:1,3#范围值为1~3"` + FilePath *comModel.UpFile `p:"filePath" dc:"fileType为1上传压缩文件夹 2文件" v:"required-if:fileType,1#需要上传压缩文件夹"` + FileName string `p:"fileName" dc:"fileType为3填写文件夹名" v:"required-if:fileType,3#需要填写文件夹名称"` +} + +// DocumentsafetySelectByPidReq 获取pid +type DocumentSafetySelectByPidReq struct { + g.Meta `path:"/safetySelectByPid" tags:"安全会议" method:"get" summary:"获取pid"` + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` + PathName string `p:"pathName" dc:"路径地址(例子:/xxxx/xxxx)" v:"required#路径地址不能为空"` + commonApi.Author +} + +type DocumentSafetyDataRecyclingStationReq struct { + g.Meta `path:"/safetyDataRecyclingStation" tags:"安全会议" method:"put" summary:"回收站恢复及删除(删除已被注释)"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键ID不能为空"` + // Type string `p:"type" dc:"1恢复 2删除" v:"between:1,1#范围值为1"` + Type string `p:"type" dc:"1恢复" ` +} + +type DocumentSafetyRecycleBinListReq struct { + g.Meta `path:"/safetyRecycleBinList" tags:"安全会议" method:"get" summary:"回收站数据加载"` + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` + Type string `p:"type" dc:"1未删除的全部 2删除的全部 3全部(删除+未删除)" v:"between:1,3#范围值为1~3"` + commonApi.Author +} + +type DocumentSafetyDataUniFileDownloadReq struct { + g.Meta `path:"/safetyDataUniFileDownload" tags:"安全会议" method:"get" summary:"单文件下载"` + RelativePath string `p:"relativePath" dc:"相对路径" v:"required#相对路径不能为空"` + Type string `p:"type" dc:"1文件下载 2文件夹下载" v:"required#相对路径不能为空"` + commonApi.Author +} diff --git a/api/v1/system/homePage.go b/api/v1/system/homePage.go new file mode 100644 index 0000000..808b088 --- /dev/null +++ b/api/v1/system/homePage.go @@ -0,0 +1,410 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-02 17:11:39 +// 生成路径: api/v1/system/bus_quality.go +// 生成人:gfast +// desc:质量文档管理相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + controllerModel "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type Paging struct { + IsPaging string `json:"isPaging" dc:"是否开启分页功能 YES开启 NO不开启(空字符串也不开启分页;默认)"` //是否开启分页功能 YES开启 NO不开启(空字符串也不开启分页;默认) +} + +// ParticipantNumberReq 参与人员数量 +type ParticipantNumberReq struct { + g.Meta `path:"/countProject" tags:"GIS云图" method:"get" summary:"参与人员数量"` + Paging + commonApi.PageReq + commonApi.Author +} + +// ParticipantNumberRes 参与人员数量 +type ParticipantNumberRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*ParticipantNumberEntity `json:"list"` +} + +type ParticipantNumberEntity struct { + ProjectId int64 `json:"projectId" dc:"项目id"` + ProjectName string `json:"projectName" dc:"项目名称"` + ShortName string `json:"shortName" dc:"项目简称"` + Number int `json:"number" dc:"人员数量"` + WorkList []*TypeOfWork `json:"workList"` +} + +type ParticipantNumberTwoEntity struct { + ProjectId int64 `json:"projectId" dc:"项目id"` + ProjectName string `json:"projectName" dc:"项目名称"` + ShortName string `json:"shortName" dc:"项目简称"` + WorkName string `json:"workName" dc:"工种名称"` + WorkNumber int `json:"workNumber" dc:"工种数量"` +} + +type TypeOfWork struct { + WorkName string `json:"workName" dc:"工种名称"` + WorkNumber int `json:"workNumber" dc:"工种数量"` +} + +// MachineNumberReq 机械数量 +type MachineNumberReq struct { + g.Meta `path:"/machineProject" tags:"GIS云图" method:"get" summary:"机械数量"` + Paging + commonApi.PageReq + commonApi.Author +} + +// MachineNumberRes 机械数量 +type MachineNumberRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*MachineNumberEntity `json:"list"` +} + +type MachineNumberEntity struct { + ProjectId int64 `json:"projectId" dc:"项目id"` + ProjectName string `json:"projectName" dc:"项目名称"` + StatusList []*AccountStatus `json:"statusList"` +} + +type AccountStatus struct { + StatusName string `json:"statusName" dc:"机械名称"` + StatusNumber int `json:"statusNumber" dc:"机械数量"` +} + +// MaterialsReq 材料数量 +type MaterialsReq struct { + g.Meta `path:"/materials" tags:"GIS云图" method:"get" summary:"材料数量"` + Paging + commonApi.PageReq + commonApi.Author +} + +// MaterialsRes 材料数量 +type MaterialsRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*MaterialsNumberEntity `json:"list"` +} + +type MaterialsNumberEntity struct { + ProjectId int64 `json:"projectId" dc:"项目id"` + ProjectName string `json:"projectName" dc:"项目名称"` + MaterialsList []*Materials `json:"materialsList"` +} + +type Materials struct { + StatusName string `json:"statusName" dc:"材料名称"` + Predict int `json:"predict" dc:"预计使用数量"` + Practical int `json:"practical" dc:"实际使用数量"` +} + +// ProgressOfWorksReq 合同容量 +type ProgressOfWorksReq struct { + g.Meta `path:"/progressOfWorks" tags:"GIS云图" method:"get" summary:"合同容量"` + Paging + commonApi.PageReq + commonApi.Author +} + +// ProgressOfWorksRes 合同容量 +type ProgressOfWorksRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*ProgressOfWorksNumberEntity `json:"list"` +} + +type ProgressOfWorksNumberEntity struct { + ProjectId int64 `json:"projectId" dc:"项目id"` + ProjectName string `json:"projectName" dc:"项目名称"` + Plan string `json:"plan" dc:"预计容量"` + Actual string `json:"actual" dc:"实际容量"` +} + +// ProjectCapacityReq 项目容量 +type ProjectCapacityReq struct { + g.Meta `path:"/projectCapacity" tags:"GIS云图" method:"get" summary:"项目容量"` + commonApi.Author +} + +// ProjectCapacityRes 项目容量 +type ProjectCapacityRes struct { + g.Meta `mime:"application/json"` + SumPlan string `json:"sumPlan" dc:"总预计容量"` + SumActual string `json:"sumActual" dc:"总实际容量"` + List []*ProjectCapacityTwoRes `json:"list" dc:"项目列表数据"` +} + +// ProjectCapacityTwoReq 项目容量 +type ProjectCapacityTwoReq struct { + g.Meta `path:"/projectCapacityTwo" tags:"GIS云图" method:"get" summary:"项目容量Two"` + commonApi.Author +} + +// ProjectCapacityTwoRes 项目容量 +type ProjectCapacityTwoRes struct { + g.Meta `mime:"application/json"` + SumPlan string `json:"sumPlan" dc:"总预计容量"` + SumActual string `json:"sumActual" dc:"总实际容量"` + List []*ProjectCapacityTwoTwoRes `json:"list" dc:"项目列表数据"` +} + +type ProjectCapacityTwoTwoRes struct { + ProjectName string `json:"projectName" dc:"项目名称"` + ShortName string `json:"shortName" dc:"项目简称"` + Plan string `json:"plan" dc:"预计容量"` + Actual string `json:"actual" dc:"实际容量"` +} + +// MechanicalConditionReq 机械情况 +type MechanicalConditionReq struct { + g.Meta `path:"/mechanicalCondition" tags:"GIS云图" method:"get" summary:"机械情况"` + Paging + commonApi.PageReq + commonApi.Author + ProjectId string `p:"projectId" dc:"项目id" ` +} + +// MechanicalConditionRes 机械情况 +type MechanicalConditionRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*MechanicalConditionListRes `json:"list"` +} + +type MechanicalConditionListRes struct { + StatusName string `json:"statusName" dc:"机械名称"` + StatusNumber int `json:"statusNumber" dc:"机械数量"` +} + +// OneProjectReq 项目进度 +type OneProjectReq struct { + g.Meta `path:"/mechanicalCondition" tags:"GIS云图" method:"get" summary:"项目进度"` + commonApi.Author + ProjectId string `p:"projectId" dc:"项目id" ` +} + +// OneProjectRes 项目进度 +type OneProjectRes struct { + g.Meta `mime:"application/json"` + PlanPercentage string `json:"planPercentage" dc:"预计(百分比)"` + ActualPercentage string `json:"actualPercentage" dc:"实际(百分比)"` +} + +// SafetyReq 安全生产天数 +type SafetyReq struct { + g.Meta `path:"/safety" tags:"GIS云图" method:"get" summary:"安全生产天数"` + commonApi.Author + ProjectId string `p:"projectId" dc:"项目id" ` +} + +// SafetyRes 安全生产天数 +type SafetyRes struct { + g.Meta `mime:"application/json"` + Day int `json:"day" dc:"天数"` +} + +// QualityReq 质量监控统计 +type QualityReq struct { + g.Meta `path:"/quality" tags:"GIS云图" method:"get" summary:"质量监控统计"` + ProjectId string `json:"projectId" v:"required#项目ID必须"` + commonApi.Author +} + +// QualityRes 质量监控统计 +type QualityRes struct { + g.Meta `mime:"application/json"` + List []*QualityListRes `json:"list"` +} + +type QualityListRes struct { + QualityType string `json:"qualityType" dc:"类型"` + QualityName string `json:"qualityName" dc:"名称"` + QualityNumber int `json:"qualityNumber" dc:"数量"` + Proportion string `json:"proportion" dc:"百分比(%)"` +} + +// QualityDataListReq 质量监控统计列表 +type QualityDataListReq struct { + g.Meta `path:"/qualityDataList" tags:"GIS云图" method:"get" summary:"质量监控统计列表"` + QualityType string `json:"qualityType" v:"required#类型不能为空"` + ProjectId string `json:"projectId" v:"required#项目id不能为空"` + Paging + commonApi.PageReq + commonApi.Author +} + +// QualityDataListRes 质量监控统计列表 +type QualityDataListRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusQualityListRes `json:"list"` +} + +// ConditionReq 材料情况 +type ConditionReq struct { + g.Meta `path:"/condition" tags:"GIS云图" method:"get" summary:"材料情况"` + ProjectId string `json:"projectId" v:"required#项目ID必须"` + Paging + commonApi.PageReq + commonApi.Author +} + +// ConditionRes 材料情况 +type ConditionRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*ConditionListRes `json:"list"` +} + +type ConditionListRes struct { + Id int64 `json:"id" dc:"主键ID"` + Name string `json:"name" dc:"名称"` + Number int `json:"number" dc:"数量"` +} + +//// ConditionReq 材料情况 +//type ConditionReq struct { +// g.Meta `path:"/condition" tags:"GIS云图" method:"get" summary:"材料情况"` +// ProjectId string `json:"projectId" v:"required#项目ID必须"` +// Paging +// commonApi.PageReq +// commonApi.Author +//} +// +//// ConditionRes 材料情况 +//type ConditionRes struct { +// g.Meta `mime:"application/json"` +// commonApi.ListRes +// List []*DateListRes `json:"list"` +//} +//type DateListRes struct { +// DateStr string `json:"dateStr" dc:"时间"` +// List []*ConditionListRes `json:"list"` +//} +// +//type ConditionListRes struct { +// Id int64 `json:"id" dc:"主键ID"` +// Name string `json:"name" dc:"名称"` +// Number int `json:"number" dc:"数量"` +//} + +type GisQualityManagementReq struct { + g.Meta `path:"/gisQualityManagement" tags:"GIS云图" method:"get" summary:"质量管理统计"` + ProjectId string `json:"projectId" v:"required#项目id不能为空"` + commonApi.Author +} + +type GisQualityManagementRes struct { + g.Meta `mime:"application/json"` + InspectionRecord int `json:"inspectionRecord" dc:"巡检记录"` + ReorganizeTheSituation float64 `json:"reorganizeTheSituation" dc:"整改情况"` +} + +type GisQualityManagementListReq struct { + g.Meta `path:"/gisQualityManagementList" tags:"GIS云图" method:"get" summary:"质量管理列表"` + ProjectId string `json:"projectId" v:"required#项目id不能为空"` + Type string `json:"type" dc:"1整改情况 2巡检记录" v:"between:1,2#取值范围为1~2"` + commonApi.Author + commonApi.PageReq +} + +type GisQualityManagementListRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*GisQualityManagementListEntityRes `json:"list"` +} + +type GisQualityManagementListEntityRes struct { + Id string `json:"id" dc:"主键ID"` + DictLabel string `json:"dictLabel" dc:"工单类型"` + InspectionHeadline string `json:"inspectionHeadline" dc:"主题"` + Status string `json:"status" dc:"工单状态"` + VerificationType string `json:"verificationType" dc:"验证状态(1通过 2未通过)"` + CreatedAt string `json:"createdAt" dc:"创建时间"` +} + +// BusTourSearchAllReq 分页请求参数 +type BusTourSearchAllReq struct { + g.Meta `path:"/tourSearchAllList" tags:"GIS云图" method:"get" summary:"GIS大屏展示所有ai"` + ProjectId string `p:"projectId"` + commonApi.Author +} + +// BusTourSearchAllRes 列表返回结果 +type BusTourSearchAllRes struct { + g.Meta `mime:"application/json"` + List []*model.BusTourListRes `json:"list"` +} + +type GisSafetyManagementReq struct { + g.Meta `path:"/gisSafetyManagement" tags:"GIS云图" method:"get" summary:"安全管理统计"` + ProjectId string `json:"projectId" v:"required#项目id不能为空"` + commonApi.Author +} + +type GisSafetyManagementRes struct { + g.Meta `mime:"application/json"` + TeamMeeting int `json:"teamMeeting" dc:"站班会"` + InspectionRecord int `json:"inspectionRecord" dc:"巡检记录"` + ReorganizeTheSituation float64 `json:"reorganizeTheSituation" dc:"整改情况"` +} + +type GisSafetyManagementListReq struct { + g.Meta `path:"/gisSafetyManagementList" tags:"GIS云图" method:"get" summary:"安全管理列表"` + ProjectId string `json:"projectId" v:"required#项目id不能为空"` + Type string `json:"type" dc:"1站班会 2整改情况 3巡检记录" v:"between:1,3#取值范围为1~3"` + commonApi.Author + commonApi.PageReq +} + +type GisSafetyManagementListRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*GisSafetyManagementListEntityRes `json:"list"` +} + +type GisSafetyManagementListEntityRes struct { + Id string `json:"id" dc:"主键ID"` + StudyTypeDictLabel string `json:"studyTypeName" dc:"检查类型or班组"` + TourTypeDictLabel string `json:"tourTypeName" dc:"违章类型or站班会"` + TeamName string `json:"teamName" dc:"班组"` + InspectionResult string `json:"inspectionResult" dc:"内容"` + Status string `json:"status" dc:"工单状态"` + VerificationType string `json:"verificationType" dc:"验证状态(1通过 2未通过)"` + CreatedAt string `json:"createdAt" dc:"创建时间or站班时间"` +} + +type LargeScreenDetailsReq struct { + g.Meta `path:"/argeScreenDetails" tags:"GIS云图" method:"get" summary:"大屏-质量管理"` + Id string `json:"id" dc:"主键ID"` + Type string `json:"type" dc:"1通知 2整改" v:"between:1,2#取值范围为1~2"` + commonApi.Author +} + +type LargeScreenDetailsRes struct { + g.Meta `mime:"application/json"` + *model.LargeScreenDetailsEntityRes +} + +type SafetyLargeScreenDetailsReq struct { + g.Meta `path:"/safetyLargeScreenDetails" tags:"GIS云图" method:"get" summary:"大屏-安全管理"` + Id string `json:"id" dc:"主键ID"` + Type string `json:"type" dc:"1巡检 2整改" v:"between:1,2#取值范围为1~2"` + commonApi.Author +} + +type SafetyLargeScreenDetailsRes struct { + g.Meta `mime:"application/json"` + *controllerModel.BusHseManagementDetailsRes +} diff --git a/api/v1/system/manage_airline.go b/api/v1/system/manage_airline.go new file mode 100644 index 0000000..7269c75 --- /dev/null +++ b/api/v1/system/manage_airline.go @@ -0,0 +1,121 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-12-11 16:10:18 +// 生成路径: api/v1/system/manage_airline.go +// 生成人:gfast +// desc:航线相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// ManageAirlineSearchReq 分页请求参数 +type ManageAirlineSearchReq struct { + g.Meta `path:"/list" tags:"航线" method:"get" summary:"航线列表"` + ProjectId string `p:"projectId" dc:"項目id" v:"projectId@integer#项目id需为整数"` //项目id + MqClientId string `p:"mqClientId" dc:"关联机场"` //关联机场 + AirLine string `p:"airLine"` //航线名称 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// ManageAirlineSearchRes 列表返回结果 +type ManageAirlineSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.ManageAirlineListRes `json:"list"` +} + +// ManageAirlineAddReq 添加操作请求参数 +type ManageAirlineAddReq struct { + g.Meta `path:"/add" tags:"航线" method:"post" summary:"航线添加"` + commonApi.Author + ProjectId int64 `p:"projectId" dc:"项目id" v:"required#项目id必须"` + AirLine string `p:"airLine" dc:"航线名称" v:"required#航线名称必须"` + StrId string `p:"strId" dc:"航线ID" v:"required#航线ID必须"` + Speed int `p:"speed" dc:"航线速度" v:"required#航线速度必须"` + Height int `p:"height" dc:"航线高度" v:"required#航线高度必须"` + Gap int `p:"gap" dc:"航线间距" v:"required#航线间距必须"` + MqClientId string `p:"mqClientId" dc:"关联机场" v:"required#mq客户端id必须"` + Remark string `p:"remark" dc:"备注"` + TakeOffSecurityHeight float64 `p:"takeOffSecurityHeight" dc:"安全起飞高度" ` + GlobalTransitionalSpeed float64 `p:"globalTransitionalSpeed" dc:"飞向首航点速度"` + Air *model.AirlineEntity `p:"air" dc:"航线生成信息"` + Positions []model.PositionsEntity `p:"positions" dc:"航线生成信息"` + LngAndLatAndHeight string `p:"lngAndLatAndHeight" dc:"经度维度高度" v:"required#经度维度高度必须"` +} + +// ManageAirlineAddRes 添加操作返回结果 +type ManageAirlineAddRes struct { + commonApi.EmptyRes +} + +// ManageAirlineEditReq 修改操作请求参数 +type ManageAirlineEditReq struct { + g.Meta `path:"/edit" tags:"航线" method:"put" summary:"航线修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + AirLine string `p:"airLine" dc:"航线名称" v:"required#航线名称必须"` + Speed int `p:"speed" dc:"航线速度" ` + Height int `p:"height" dc:"航线高度" ` + Gap int `p:"gap" dc:"航线间距" ` + Remark string `p:"remark" dc:"备注"` + Air *model.AirlineEntity `p:"air" dc:"航线生成信息"` + TakeOffSecurityHeight float64 `p:"takeOffSecurityHeight" dc:"安全起飞高度" ` + GlobalTransitionalSpeed float64 `p:"globalTransitionalSpeed" dc:"飞向首航点速度"` + Positions []model.PositionsEntity `p:"positions" dc:"航线生成信息"` + LngAndLatAndHeight string `p:"lngAndLatAndHeight" dc:"经度维度高度" v:"required#经度维度高度必须"` +} + +// ManageAirlineEditRes 修改操作返回结果 +type ManageAirlineEditRes struct { + commonApi.EmptyRes +} + +// ManageAirlineGetReq 获取一条数据请求 +type ManageAirlineGetReq struct { + g.Meta `path:"/get" tags:"航线" method:"get" summary:"获取航线信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// ManageAirlineGetRes 获取一条数据结果 +type ManageAirlineGetRes struct { + g.Meta `mime:"application/json"` + *model.ManageAirlineInfoRes +} + +// ManageAirlineDeleteReq 删除数据请求 +type ManageAirlineDeleteReq struct { + g.Meta `path:"/delete" tags:"航线" method:"delete" summary:"删除航线"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// ManageAirlineDeleteRes 删除数据返回 +type ManageAirlineDeleteRes struct { + commonApi.EmptyRes +} + +// RouteUploadReq 航线上传 +type RouteUploadReq struct { + g.Meta `path:"/routeUpload" tags:"航线" method:"post" summary:"航线上传"` + commonApi.Author + ProjectId int64 `p:"projectId" dc:"航线文件"` + MqClientId string `p:"mqClientId" dc:"无人机sn(mq客户端id))"` + File *ghttp.UploadFile `p:"file" dc:"航线文件"` + Remark string `p:"remark" dc:"备注"` +} + +// RouteUploadRes 航线上传 +type RouteUploadRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/manage_device.go b/api/v1/system/manage_device.go new file mode 100644 index 0000000..ba489ef --- /dev/null +++ b/api/v1/system/manage_device.go @@ -0,0 +1,167 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-11-14 10:53:21 +// 生成路径: api/v1/system/manage_device.go +// 生成人:gfast +// desc:设备信息相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// ManageDeviceSearchReq 分页请求参数 +type ManageDeviceSearchReq struct { + g.Meta `path:"/list" tags:"设备信息" method:"get" summary:"设备信息列表"` + Domain string `p:"domain" dc:"产品类型"` + DeviceSn string `p:"deviceSn" dc:"产品序列号"` + ProjectId string `p:"projectId" dc:"项目id" v:"required#项目id不能为空"` + commonApi.PageReq + commonApi.Author +} + +// ManageDeviceSearchRes 列表返回结果 +type ManageDeviceSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.ManageDeviceListRes `json:"list"` +} + +// NoPageListSearchReq 不分页请求参数 +type NoPageListSearchReq struct { + g.Meta `path:"/noPageList" tags:"设备信息" method:"get" summary:"设备信息列表(不分页 )"` + Domain string `p:"domain" dc:"产品类型"` + DeviceSn string `p:"deviceSn" dc:"产品序列号"` + ProjectId string `p:"projectId" dc:"项目id" v:"required#项目id不能为空"` + commonApi.Author +} + +// NoPageListSearchRes 不分页请求参数 +type NoPageListSearchRes struct { + g.Meta `mime:"application/json"` + List []*model.ManageDeviceListRes `json:"list"` +} + +// ManageDeviceAddReq 添加操作请求参数 +type ManageDeviceAddReq struct { + g.Meta `path:"/add" tags:"设备信息" method:"post" summary:"设备信息添加"` + ProjectId string `p:"projectId" dc:"项目id" v:"required#项目id不能为空"` + DictionaryId string `p:"dictionaryId" dc:"产品ID" v:"required#产品ID不能为空"` + DeviceSn string `p:"deviceSn" dc:"设备序列号" v:"required#设备序列号不能为空"` + Nickname string `p:"nickname" dc:"设备自定义名称" v:"required#设备自定义名称不能为空"` + MqClientId string `p:"mqClientId" dc:"客户端id" v:"required#客户端id不能为空"` + WorkspaceId string `p:"workspaceId" dc:"工作区" ` + //FirmwareVersion string `p:"firmwareVersion" dc:"固件版本" v:"required#固件版本不能为空"` + //CompatibleStatus string `p:"compatibleStatus" dc:"固件版本是否一致(1一致 0不一致)" v:"between:0,1#参数范围为0~1"` + //ChildSn string `p:"childSn" dc:"由网关控制的设备"` + commonApi.Author +} + +// ManageDeviceAddRes 添加操作返回结果 +type ManageDeviceAddRes struct { + commonApi.EmptyRes +} + +// ManageDeviceEditReq 修改操作请求参数 +type ManageDeviceEditReq struct { + g.Meta `path:"/edit" tags:"设备信息" method:"put" summary:"设备信息修改"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键ID不能为空"` + DictionaryId string `p:"dictionaryId" dc:"产品ID" v:"required#产品ID不能为空"` + DeviceSn string `p:"deviceSn" dc:"设备序列号" v:"required#设备序列号不能为空"` + Nickname string `p:"nickname" dc:"设备自定义名称" v:"required#设备自定义名称不能为空"` + MqClientId string `p:"mqClientId" dc:"客户端id" v:"required#设备自定义名称不能为空"` + WorkspaceId string `p:"workspaceId" dc:"工作区"` + //FirmwareVersion string `p:"firmwareVersion" dc:"固件版本" v:"required#固件版本不能为空"` + //CompatibleStatus string `p:"compatibleStatus" dc:"固件版本是否一致(1一致 0不一致)" v:"between:0,1#参数范围为0~1"` + //ChildSn string `p:"childSn" dc:"由网关控制的设备"` +} + +// ManageDeviceEditRes 修改操作返回结果 +type ManageDeviceEditRes struct { + commonApi.EmptyRes +} + +// ManageDeviceGetReq 获取一条数据请求 +type ManageDeviceGetReq struct { + g.Meta `path:"/get" tags:"设备信息" method:"get" summary:"获取设备信息信息"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// ManageDeviceGetRes 获取一条数据结果 +type ManageDeviceGetRes struct { + g.Meta `mime:"application/json"` + *model.ManageDeviceInfoRes +} + +// ManageDeviceDeleteReq 删除数据请求 +type ManageDeviceDeleteReq struct { + g.Meta `path:"/delete" tags:"设备信息" method:"delete" summary:"删除设备信息"` + commonApi.Author + Ids []uint64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// ManageDeviceDeleteRes 删除数据返回 +type ManageDeviceDeleteRes struct { + commonApi.EmptyRes +} + +// ProductEnumerationFuncReq 设备产品枚举 +type ProductEnumerationFuncReq struct { + g.Meta `path:"/productEnumerationList" tags:"设备信息" method:"get" summary:"设备产品枚举"` + commonApi.Author +} + +// ProductEnumerationFuncRes 设备产品枚举 +type ProductEnumerationFuncRes struct { + g.Meta `mime:"application/json"` + List []*model.ManageDeviceDictionaryInfo `json:"list"` +} + +// CameraPhotoTakeFuncReq 无人机抓拍 +type CameraPhotoTakeFuncReq struct { + g.Meta `path:"/cameraPhotoTake" tags:"设备信息" method:"get" summary:"无人机抓拍"` + TrackId string `p:"trackId" dc:"航迹ID" v:"required#航迹ID必须"` + GatewaySn string `p:"gatewaySn" dc:"网关SN" v:"required#网关SN必须"` + PayloadIndex string `p:"payloadIndex" dc:"摄像机编号" v:"required#摄像机编号必须"` + commonApi.Author +} + +// CameraPhotoTakeFuncRes 无人机抓拍 +type CameraPhotoTakeFuncRes struct { + g.Meta `mime:"application/json"` +} + +// LiveSetQualityReq 设置直播清晰度 +type LiveSetQualityReq struct { + g.Meta `path:"/liveSetQuality" tags:"设备信息" method:"put" summary:"设置直播清晰度"` + GatewaySn string `p:"gatewaySn" dc:"网关SN" v:"required#网关SN必须"` + Two string `p:"two" dc:"飞机sn" v:"required#飞机sn必须"` + PayloadIndex string `p:"payloadIndex" dc:"摄像机编号" v:"required#摄像机编号必须"` + Enum int `p:"enum" dc:"0自适应,1流畅,2标清,3高清,4超清" v:"required#摄像机编号必须"` + commonApi.Author +} + +// LiveSetQualityRes 设置直播清晰度 +type LiveSetQualityRes struct { + g.Meta `mime:"application/json"` +} + +// ButtonStateReq 调试模式按钮状态 +type ButtonStateReq struct { + g.Meta `path:"/buttonState" tags:"设备信息" method:"get" summary:"调试模式按钮状态"` + MqClientId string `p:"mqClientId" dc:"mq_client_id" v:"required#mq_client_id必须"` + commonApi.Author +} + +// ButtonStateRes 调试模式按钮状态 +type ButtonStateRes struct { + g.Meta `mime:"application/json"` + *model.ButtonEntity +} diff --git a/api/v1/system/manage_operation_log.go b/api/v1/system/manage_operation_log.go new file mode 100644 index 0000000..4795ca4 --- /dev/null +++ b/api/v1/system/manage_operation_log.go @@ -0,0 +1,94 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-06-21 15:23:29 +// 生成路径: api/v1/system/manage_operation_log.go +// 生成人:gfast +// desc:无人机指令日志相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// ManageOperationLogSearchReq 分页请求参数 +type ManageOperationLogSearchReq struct { + g.Meta `path:"/list" tags:"无人机指令日志" method:"get" summary:"无人机指令日志列表"` + Id string `p:"id"` //主键ID + Sn string `p:"sn"` //sn + Method string `p:"method"` //方法名 + Direction string `p:"direction"` //上发/下发命令 + Code string `p:"code" v:"code@integer#状态码需为整数"` //状态码 + Operator string `p:"operator" v:"operator@integer#操作人ID(默认为0表示系统操作)需为整数"` //操作人ID(默认为0表示系统操作) + commonApi.PageReq + commonApi.Author +} + +// ManageOperationLogSearchRes 列表返回结果 +type ManageOperationLogSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.ManageOperationLogListRes `json:"list"` +} + +// ManageOperationLogAddReq 添加操作请求参数 +type ManageOperationLogAddReq struct { + g.Meta `path:"/add" tags:"无人机指令日志" method:"post" summary:"无人机指令日志添加"` + commonApi.Author + Sn string `p:"sn" v:"required#sn不能为空"` + Method string `p:"method" v:"required#方法名不能为空"` + Direction string `p:"direction" v:"required#上发/下发命令不能为空"` + Code int `p:"code" ` + Operator int64 `p:"operator" ` +} + +// ManageOperationLogAddRes 添加操作返回结果 +type ManageOperationLogAddRes struct { + commonApi.EmptyRes +} + +// ManageOperationLogEditReq 修改操作请求参数 +type ManageOperationLogEditReq struct { + g.Meta `path:"/edit" tags:"无人机指令日志" method:"put" summary:"无人机指令日志修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + Sn string `p:"sn" v:"required#sn不能为空"` + Method string `p:"method" v:"required#方法名不能为空"` + Direction string `p:"direction" v:"required#上发/下发命令不能为空"` + Code int `p:"code" ` + Operator int64 `p:"operator" ` +} + +// ManageOperationLogEditRes 修改操作返回结果 +type ManageOperationLogEditRes struct { + commonApi.EmptyRes +} + +// ManageOperationLogGetReq 获取一条数据请求 +type ManageOperationLogGetReq struct { + g.Meta `path:"/get" tags:"无人机指令日志" method:"get" summary:"获取无人机指令日志信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// ManageOperationLogGetRes 获取一条数据结果 +type ManageOperationLogGetRes struct { + g.Meta `mime:"application/json"` + *model.ManageOperationLogInfoRes +} + +// ManageOperationLogDeleteReq 删除数据请求 +type ManageOperationLogDeleteReq struct { + g.Meta `path:"/delete" tags:"无人机指令日志" method:"delete" summary:"删除无人机指令日志"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// ManageOperationLogDeleteRes 删除数据返回 +type ManageOperationLogDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/manage_task.go b/api/v1/system/manage_task.go new file mode 100644 index 0000000..63929fc --- /dev/null +++ b/api/v1/system/manage_task.go @@ -0,0 +1,143 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-12-12 15:21:22 +// 生成路径: api/v1/system/manage_task.go +// 生成人:gfast +// desc:航线任务下发相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// ManageTaskSearchReq 分页请求参数 +type ManageTaskSearchReq struct { + g.Meta `path:"/list" tags:"航线任务下发" method:"get" summary:"航线任务下发列表"` + Id string `p:"id"` //主键ID + TaskName string `p:"taskName"` //任务名称 //任务开始执行时间毫秒时间戳 //0普通航线 + MqClientId string `p:"mqClientId" dc:"关联机场"` //关联机场 + AirLine string `p:"airLine" v:"airLine@integer#关联航线需为整数"` //关联航线 + ProjectId string `p:"projectId" v:"projectId@integer#关联项目需为整数"` //关联项目 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// ManageTaskSearchRes 列表返回结果 +type ManageTaskSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.ManageTaskListRes `json:"list"` +} +type T struct { + Field1 string `json:"0"` + Field2 string `json:"1"` + Field3 string `json:"2"` +} + +// ManageTaskAddReq 添加操作请求参数 +type ManageTaskAddReq struct { + g.Meta `path:"/add" tags:"航线任务下发" method:"post" summary:"航线任务下发添加"` + commonApi.Author + TaskName string `p:"taskName" v:"required#任务名称不能为空"` + //TaskType string `p:"taskType" dc:"0立即任务 1定时任务 2条件任务" v:"between:0,2#设置值的范围为0~2"` + //ExecuteTime int64 `p:"executeTime" dc:"任务开始执行时间毫秒时间戳。可选字段。当 task_type 为 0 或 1 时必填,为 2 时非必填。" v:"required-unless:taskType,2#taskType不为2时必须不为空" ` + WaylineType int `p:"waylineType" dc:"0普通航点航线" v:"in:0#设置值为0"` + Airport int64 `p:"airport" dc:"机场ID" v:"required#机场ID不能为空"` + AirLine int64 `p:"airLine" dc:"航线ID" v:"required#航线ID不能为空"` + ProjectId int64 `p:"projectId" dc:"项目ID" v:"required#项目ID不能为空"` + MqClientId string `p:"mqClientId" dc:"关联机场" v:"required#mq客户端id必须"` + RthAltitude int `p:"rthAltitude" dc:"返航高度 单位米" v:"between:20,1500#取值范围为20~1500"` + RthMode int `p:"rthMode" dc:"0智能高度 1设定高度(默认为0)" ` + OutOfControlAction int `p:"outOfControlAction" dc:"0返航 1悬停 2降落(默认为0)"` + ExitWaylineWhenRcLost int `p:"exitWaylineWhenRcLost" dc:"0继续执行航线任务 1退出航线任务,执行遥控器失控动作(默认为0)"` + Remark string `p:"remark" ` +} + +// ManageTaskAddRes 添加操作返回结果 +type ManageTaskAddRes struct { + commonApi.EmptyRes +} + +// ManageTaskEditReq 修改操作请求参数 +type ManageTaskEditReq struct { + g.Meta `path:"/edit" tags:"航线任务下发" method:"put" summary:"航线任务下发修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + TaskName string `p:"taskName" v:"required#任务名称不能为空"` + TaskType string `p:"taskType" dc:"0立即任务 1定时任务 2条件任务" v:"between:0,2#设置值的范围为0~2"` + ExecuteTime int64 `p:"executeTime" dc:"任务开始执行时间毫秒时间戳。可选字段。当 task_type 为 0 或 1 时必填,为 2 时非必填。" v:"required-unless:taskType,2#taskType不为2时必须不为空" ` + WaylineType int `p:"waylineType" dc:"0普通航点航线" v:"in:0#设置值为0"` + Airport int64 `p:"airport" dc:"机场ID" v:"required#机场ID不能为空"` + AirLine int64 `p:"airLine" dc:"航线ID" v:"required#航线ID不能为空"` + ProjectId int64 `p:"projectId" dc:"项目ID" v:"required#项目ID不能为空"` + RthAltitude int `p:"rthAltitude" dc:"返航高度 单位米" v:"between:20,1500#取值范围为20~1500"` + RthMode int `p:"rthMode" dc:"0智能高度 1设定高度(默认为0)" ` + OutOfControlAction int `p:"outOfControlAction" dc:"0返航 1悬停 2降落(默认为0)"` + ExitWaylineWhenRcLost int `p:"exitWaylineWhenRcLost" dc:"0继续执行航线任务 1退出航线任务,执行遥控器失控动作(默认为0)"` + Remark string `p:"remark" ` +} + +// ManageTaskEditRes 修改操作返回结果 +type ManageTaskEditRes struct { + commonApi.EmptyRes +} + +// ManageTaskGetReq 获取一条数据请求 +type ManageTaskGetReq struct { + g.Meta `path:"/get" tags:"航线任务下发" method:"get" summary:"获取航线任务下发信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// ManageTaskGetRes 获取一条数据结果 +type ManageTaskGetRes struct { + g.Meta `mime:"application/json"` + *model.ManageTaskInfoRes +} + +// ManageTaskDeleteReq 删除数据请求 +type ManageTaskDeleteReq struct { + g.Meta `path:"/delete" tags:"航线任务下发" method:"delete" summary:"删除航线任务下发"` + commonApi.Author + Ids int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// ManageTaskDeleteRes 删除数据返回 +type ManageTaskDeleteRes struct { + commonApi.EmptyRes +} + +// FlighttaskPrepareReq 航线任务下发 +type FlighttaskPrepareReq struct { + g.Meta `path:"/FlighttaskPrepare" tags:"航线任务下发" method:"post" summary:"航线任务下发"` + commonApi.Author + Id string `p:"id" dc:"主键ID" v:"required#id不能为空"` + GatewaySn string `p:"gatewaySn" dc:"网关SN" v:"required#网关SN必须"` + TaskType string `p:"taskType" dc:"0立即任务 1定时任务 2条件任务" v:"between:0,2#设置值的范围为0~2"` + ExecuteTime int64 `p:"executeTime" dc:"任务开始执行时间毫秒时间戳。可选字段。当 task_type 为 0 或 1 时必填,为 2 时非必填。" v:"required-unless:taskType,2#taskType不为2时必须不为空" ` + Remark string `p:"remark"` + + TimedFlight string `p:"timedFlight" dc:"有值代表自动飞行(比如:'ok'),后端传值"` + //Airport s `p:"airport" ` + BreakPoint *BreakPointReq `json:"breakPoint" dc:"断点信息"` + BreakpointRenewalUUID string `json:"breakpointRenewalUUID" dc:"断点续飞ID(计划UUID)"` +} + +type BreakPointReq struct { + Index int `json:"index" dc:"断点状态"` + State int `json:"state" dc:"返航高度模式"` + Progress float32 `json:"progress" dc:"遥控器失控动作"` + WaylineId int `json:"wayline_id" dc:"航线失控动作"` +} + +// FlighttaskPrepareRes 航线任务下发 +type FlighttaskPrepareRes struct { + commonApi.EmptyRes + Id string `p:"id" ` +} diff --git a/api/v1/system/manage_task_cron.go b/api/v1/system/manage_task_cron.go new file mode 100644 index 0000000..a1f757a --- /dev/null +++ b/api/v1/system/manage_task_cron.go @@ -0,0 +1,87 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-06-04 14:33:05 +// 生成路径: api/v1/system/manage_task_cron.go +// 生成人:gfast +// desc:航线任务定时飞行相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// ManageTaskCronSearchReq 分页请求参数 +type ManageTaskCronSearchReq struct { + g.Meta `path:"/list" tags:"航线任务定时飞行" method:"get" summary:"航线任务定时飞行列表"` + Id string `p:"id"` //主键ID + MqClientId string `p:"mqClientId"` //sn + TaskId string `p:"taskId" v:"taskId@integer#任务模板ID需为整数"` //任务模板ID + Cron string `p:"cron"` //表达式 + CronId string `p:"cronId" v:"cronId@integer#cronID需为整数"` //cronID + commonApi.PageReq + commonApi.Author +} + +// ManageTaskCronSearchRes 列表返回结果 +type ManageTaskCronSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.ManageTaskCronListRes `json:"list"` +} + +// ManageTaskCronAddReq 添加操作请求参数 +type ManageTaskCronAddReq struct { + g.Meta `path:"/add" tags:"航线任务定时飞行" method:"post" summary:"航线任务定时飞行添加"` + commonApi.Author + MqClientId string `p:"mqClientId" v:"required#sn不能为空"` + TaskId int64 `p:"taskId" v:"required#任务模板ID不能为空"` + Cron string `p:"cron" v:"required#表达式不能为空"` +} + +// ManageTaskCronAddRes 添加操作返回结果 +type ManageTaskCronAddRes struct { + commonApi.EmptyRes +} + +// ManageTaskCronEditReq 修改操作请求参数 +type ManageTaskCronEditReq struct { + g.Meta `path:"/edit" tags:"航线任务定时飞行" method:"put" summary:"航线任务定时飞行修改"` + commonApi.Author + MqClientId string `p:"mqClientId" v:"required#mqClientId必须"` //通过主键获取 + Cron string `p:"cron" v:"required#表达式不能为空"` +} + +// ManageTaskCronEditRes 修改操作返回结果 +type ManageTaskCronEditRes struct { + commonApi.EmptyRes +} + +// ManageTaskCronGetReq 获取一条数据请求 +type ManageTaskCronGetReq struct { + g.Meta `path:"/get" tags:"航线任务定时飞行" method:"get" summary:"获取航线任务定时飞行信息"` + commonApi.Author + MqClientId string `p:"mqClientId" v:"required#mqClientId必须"` //通过主键获取 +} + +// ManageTaskCronGetRes 获取一条数据结果 +type ManageTaskCronGetRes struct { + g.Meta `mime:"application/json"` + *model.ManageTaskCronInfoRes +} + +// ManageTaskCronDeleteReq 删除数据请求 +type ManageTaskCronDeleteReq struct { + g.Meta `path:"/delete" tags:"航线任务定时飞行" method:"delete" summary:"删除航线任务定时飞行"` + commonApi.Author + MqClientId []string `p:"mqClientId" v:"required#mqClientId必须"` //通过主键获取 +} + +// ManageTaskCronDeleteRes 删除数据返回 +type ManageTaskCronDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/manage_task_record.go b/api/v1/system/manage_task_record.go new file mode 100644 index 0000000..219620b --- /dev/null +++ b/api/v1/system/manage_task_record.go @@ -0,0 +1,164 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-12-12 17:56:19 +// 生成路径: api/v1/system/manage_task_record.go +// 生成人:gfast +// desc:航线任务下发-记录相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// ManageTaskRecordSearchReq 分页请求参数 +type ManageTaskRecordSearchReq struct { + g.Meta `path:"/list" tags:"航线任务下发-记录" method:"get" summary:"航线任务下发-记录列表"` + ProjectId string `p:"projectId" dc:"项目id" v:"projectId@integer#关联项目需为整数"` + MqClientId string `p:"mqClientId" dc:"关联机场"` + TaskType string `p:"taskType" dc:"任务类型0立即任务 1定时任务 2条件任务" ` + IsVoluntarily string `p:"isVoluntarily" dc:"0自动飞行 1手动飞行"` + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` + commonApi.PageReq + commonApi.Author +} + +// ManageTaskRecordSearchRes 列表返回结果 +type ManageTaskRecordSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.PcListOfRoutesRes `json:"list"` +} + +type UpDataResourceReq struct { + g.Meta `path:"/upDataResource" tags:"航线任务下发-记录" method:"put" summary:"上传资源文件"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` + MergeProjectId string `p:"mergeProjectId" v:"required#wImg必须" dc:"合并项目ID"` + MergeId string `p:"mergeId" v:"required#wTif必须" dc:"合并任务ID"` + WImg string `p:"wImg" v:"required#wImg必须" dc:"大图"` + WTif string `p:"wTif" v:"required#wTif必须" dc:"资源tif"` + ProjectId string `p:"projectId" v:"required#projectId必须" dc:"中煤项目ID"` + // WImg *ghttp.UploadFile `p:"wImg" v:"required#wImg必须" dc:"大图"` + // WTif *ghttp.UploadFile `p:"wTif" v:"required#wTif必须" dc:"资源tif"` +} + +type UpDataResourceRes struct { + g.Meta `mime:"application/json"` +} + +// 根据任务ID 获取本次AI识别的结果 +type GetAiResultReq struct { + g.Meta `path:"/getAiResult" tags:"航线任务下发-记录" method:"get" summary:"获取AI识别结果"` + commonApi.Author + commonApi.PageReq + Id int64 `p:"id" v:"required#主键必须" dc:"任务的ID"` // 通过主键获取 + Type string `p:"type" dc:"类型 15光伏板 14支架 13桩基 12钻孔" d:"15"` +} + +type GetAiResultRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []model.AiResultRes `json:"list"` +} + +// ConfirmAiResultReq 确认AI识别结果 +type ConfirmAiResultReq struct { + g.Meta `path:"/confirmAiResult" tags:"航线任务下发-记录" method:"put" summary:"提交AI识别结果"` + commonApi.Author + TaskId int `p:"taskId" v:"required#任务ID必须" dc:"任务ID"` +} + +// ConfirmAiResultRes 确认AI识别结果返回 +type ConfirmAiResultRes struct { + g.Meta `mime:"application/json"` +} + +// ManageTaskRecordGetReq 获取一条数据请求 +type ManageTaskRecordGetReq struct { + g.Meta `path:"/get" tags:"航线任务下发-记录" method:"get" summary:"获取航线任务下发-记录信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// ManageTaskRecordGetRes 获取一条数据结果 +type ManageTaskRecordGetRes struct { + g.Meta `mime:"application/json"` + *model.ManageTaskRecordInfoRes +} + +// PerformATaskReq 执行任务 +type PerformATaskReq struct { + g.Meta `path:"/performATask" tags:"航线任务下发-记录" method:"post" summary:"执行任务"` + commonApi.Author + Id int64 `p:"id" dc:"主键ID"` + GatewaySn string `p:"gatewaySn" dc:"网关SN" v:"required#网关SN必须"` +} + +// CancelATaskReq 取消任务 +type CancelATaskReq struct { + g.Meta `path:"/cancelATask" tags:"航线任务下发-记录" method:"post" summary:"取消任务"` + commonApi.Author + Id int64 `p:"id" dc:"主键ID"` + GatewaySn string `p:"gatewaySn" dc:"网关SN" v:"required#网关SN必须"` +} + +// RouteSuspensionReq 航线暂停 +type RouteSuspensionReq struct { + g.Meta `path:"/routeSuspension" tags:"航线任务下发-记录" method:"post" summary:"航线暂停"` + commonApi.Author + Id int64 `p:"id" dc:"主键ID"` + GatewaySn string `p:"gatewaySn" dc:"网关SN" v:"required#网关SN必须"` +} + +// CourseResumptionReq 航线恢复 +type CourseResumptionReq struct { + g.Meta `path:"/courseResumption" tags:"航线任务下发-记录" method:"post" summary:"航线恢复"` + commonApi.Author + Id int64 `p:"id" dc:"主键ID"` + GatewaySn string `p:"gatewaySn" dc:"网关SN" v:"required#网关SN必须"` +} + +// OneClickBackReq 一键返航 +type OneClickBackReq struct { + g.Meta `path:"/oneClickBack" tags:"航线任务下发-记录" method:"post" summary:"一键返航"` + commonApi.Author + Id int64 `p:"id" dc:"主键ID"` + GatewaySn string `p:"gatewaySn" dc:"网关SN" v:"required#网关SN必须"` +} + +// CancelHomingReq 取消返航 +type CancelHomingReq struct { + g.Meta `path:"/cancelHoming" tags:"航线任务下发-记录" method:"post" summary:"取消返航"` + commonApi.Author + Id int64 `p:"id" dc:"主键ID"` + GatewaySn string `p:"gatewaySn" dc:"网关SN" v:"required#网关SN必须"` +} + +// BreakpointContinuationReq 断点续飞 +type BreakpointContinuationReq struct { + g.Meta `path:"/breakpointContinuation" tags:"航线任务下发-记录" method:"post" summary:"断点续飞"` + commonApi.Author + Id int64 `p:"id" dc:"主键ID"` + GatewaySn string `p:"gatewaySn" dc:"网关SN" v:"required#网关SN必须"` +} + +type PerformATaskRes struct { + commonApi.EmptyRes +} + +// ManageTaskRecordDeleteReq 删除数据请求 +type ManageTaskRecordDeleteReq struct { + g.Meta `path:"/delete" tags:"航线任务下发-记录" method:"delete" summary:"删除记录"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// ManageTaskRecordDeleteRes 删除数据返回 +type ManageTaskRecordDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/manage_task_record_resource.go b/api/v1/system/manage_task_record_resource.go new file mode 100644 index 0000000..460f65e --- /dev/null +++ b/api/v1/system/manage_task_record_resource.go @@ -0,0 +1,159 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-05-30 17:07:01 +// 生成路径: api/v1/system/manage_task_record_resource.go +// 生成人:gfast +// desc:下发记录回传的媒体文件相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// ManageTaskRecordResourceSearchReq 分页请求参数 +type ManageTaskRecordResourceSearchReq struct { + g.Meta `path:"/list" tags:"下发记录回传的媒体文件" method:"get" summary:"下发记录回传的媒体文件列表"` + FlightId string `p:"flightId"` //计划ID + commonApi.PageReq + commonApi.Author +} + +type ManageTaskRecordResourceSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.ManageTaskRecordResourceListRes `json:"list"` +} + +type ObtainResourcesAccordingToFlightIdReq struct { + g.Meta `path:"/obtainResourcesAccordingToFlightId" tags:"下发记录回传的媒体文件" method:"get" summary:"根据flightId获取资源"` + FlightId string `p:"flightId"` //计划ID + commonApi.Author +} + +type ObtainResourcesAccordingToFlightIdRes struct { + g.Meta `mime:"application/json"` + List []string `json:"list"` +} + +type ManageTaskRecordResourceAddReq struct { + g.Meta `path:"/add" tags:"下发记录回传的媒体文件" method:"post" summary:"下发记录回传的媒体文件添加"` + commonApi.Author + FlightId string `p:"flightId" v:"required#主键ID不能为空"` + FileName string `p:"fileName" v:"required#文件名称不能为空"` + ObjectKey string `p:"objectKey" ` + Path string `p:"path" ` + DroneModelKey string `p:"droneModelKey" ` + PayloadModelKey string `p:"payloadModelKey" ` + AbsoluteAltitude float64 `p:"absoluteAltitude" ` + RelativeAltitude float64 `p:"relativeAltitude" ` + CreateTime *gtime.Time `p:"createTime" ` + ShootPosition string `p:"shootPosition" ` + Lat string `p:"lat" ` + Lng string `p:"lng" ` + Img string `p:"img" ` + ImgSize string `p:"imgSize" ` +} + +type ManageTaskRecordResourceAddRes struct { + commonApi.EmptyRes +} + +type ManageTaskRecordResourceEditReq struct { + g.Meta `path:"/edit" tags:"下发记录回传的媒体文件" method:"put" summary:"下发记录回传的媒体文件修改"` + commonApi.Author + FlightId string `p:"flightId" v:"required#主键ID不能为空"` + FileName string `p:"fileName" v:"required#文件名称不能为空"` + ObjectKey string `p:"objectKey" ` + Path string `p:"path" ` + DroneModelKey string `p:"droneModelKey" ` + PayloadModelKey string `p:"payloadModelKey" ` + AbsoluteAltitude float64 `p:"absoluteAltitude" ` + RelativeAltitude float64 `p:"relativeAltitude" ` + CreateTime *gtime.Time `p:"createTime" ` + ShootPosition string `p:"shootPosition" ` + Lat string `p:"lat" ` + Lng string `p:"lng" ` + Img string `p:"img" ` + ImgSize string `p:"imgSize" ` +} + +// ManageTaskRecordResourceEditRes 修改操作返回结果 +type ManageTaskRecordResourceEditRes struct { + commonApi.EmptyRes +} + +type ManageTaskRecordResourceGetReq struct { + g.Meta `path:"/get" tags:"下发记录回传的媒体文件" method:"get" summary:"获取下发记录回传的媒体文件信息"` + commonApi.Author + FlightId string `p:"flightId" v:"required#主键必须"` //通过主键获取 +} + +type ManageTaskRecordResourceGetRes struct { + g.Meta `mime:"application/json"` + *model.ManageTaskRecordResourceInfoRes +} + +// ManageTaskRecordResourceDeleteReq 删除数据请求 +type ManageTaskRecordResourceDeleteReq struct { + g.Meta `path:"/delete" tags:"下发记录回传的媒体文件" method:"delete" summary:"删除下发记录回传的媒体文件"` + commonApi.Author + FlightIds []string `p:"flightIds" v:"required#主键必须"` //通过主键删除 +} + +// ManageTaskRecordResourceDeleteRes 删除数据返回 +type ManageTaskRecordResourceDeleteRes struct { + commonApi.EmptyRes +} + +type DownloadAccordingToMysqlReq struct { + g.Meta `path:"/downloadAccordingToMysql" tags:"下发记录回传的媒体文件" method:"post" summary:"根据计划ID批量下载(准备)数据图片"` + commonApi.Author + FlightId string `p:"flightId" v:"required#主键必须"` //通过主键获取 +} + +// DownloadAccordingToMysqlRes 获取一条数据结果 +type DownloadAccordingToMysqlRes struct { + commonApi.EmptyRes +} + +type FlightIdByProgressQueryReq struct { + g.Meta `path:"/flightIdByProgressQueryFunc" tags:"下发记录回传的媒体文件" method:"post" summary:"根据计划ID查询下载(准备)数据图片进度"` + commonApi.Author + FlightId string `p:"flightId" v:"required#主键必须"` //通过主键获取 +} + +type FlightIdByProgressQueryRes struct { + commonApi.EmptyRes + Percentage string `p:"percentage" dc:"下载(准备)进度"` +} + +type VoluntarilyReq struct { + g.Meta `path:"/voluntarilyReq" tags:"下发记录回传的媒体文件" method:"post" summary:"下载合并大图"` + commonApi.Author + Id int64 `p:"id" v:"required#flightId必须" dc:"当前航线飞行主键ID"` + FlightId string `p:"flightId" v:"required#flightId必须" dc:"当前航线飞行任务ID"` + ProjectId string `p:"projectId" v:"required#projectId必须" dc:"当前媒科能管项目ID"` +} + +type VoluntarilyRes struct { + commonApi.EmptyRes + TaskId string `json:"taskId" dc:"任务ID"` + ProjectId string `json:"projectId" dc:"项目ID"` +} + +type DownLoadImgReq struct { + g.Meta `path:"/uavDownLoadImgReq" tags:"下发记录回传的媒体文件" method:"post" summary:"下载回传图片"` + commonApi.Author + ObjectKey string `p:"objectKey" v:"required#objectKey必须" dc:"资源路径消息"` +} + +type DownLoadImgRes struct { + commonApi.EmptyRes + Path string `json:"path" dc:"资源下载路径"` +} diff --git a/api/v1/system/manage_task_result.go b/api/v1/system/manage_task_result.go new file mode 100644 index 0000000..4bf7ca8 --- /dev/null +++ b/api/v1/system/manage_task_result.go @@ -0,0 +1,86 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-10-21 11:29:13 +// 生成路径: api/v1/system/manage_task_result.go +// 生成人:gfast +// desc:AI识别到的数据相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// ManageTaskResultSearchReq 分页请求参数 +type ManageTaskResultSearchReq struct { + g.Meta `path:"/list" tags:"AI识别到的数据" method:"get" summary:"AI识别到的数据列表"` + Id string `p:"id"` // + TaskId string `p:"taskId" v:"taskId@integer#航线任务ID需为整数"` // 航线任务ID + PvId string `p:"pvId" v:"pvId@integer#pv_module 的主键需为整数"` // pv_module 的主键 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // + commonApi.PageReq + commonApi.Author +} + +// ManageTaskResultSearchRes 列表返回结果 +type ManageTaskResultSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.ManageTaskResultListRes `json:"list"` +} + +// ManageTaskResultAddReq 添加操作请求参数 +type ManageTaskResultAddReq struct { + g.Meta `path:"/add" tags:"AI识别到的数据" method:"post" summary:"AI识别到的数据添加"` + commonApi.Author + TaskId int `p:"taskId" ` + PvId []int `p:"pvIds" ` +} + +// ManageTaskResultAddRes 添加操作返回结果 +type ManageTaskResultAddRes struct { + commonApi.EmptyRes +} + +// ManageTaskResultEditReq 修改操作请求参数 +type ManageTaskResultEditReq struct { + g.Meta `path:"/edit" tags:"AI识别到的数据" method:"put" summary:"AI识别到的数据修改"` + commonApi.Author + Id uint `p:"id" v:"required#主键ID不能为空"` + TaskId int `p:"taskId" ` + PvId int `p:"pvId" ` +} + +// ManageTaskResultEditRes 修改操作返回结果 +type ManageTaskResultEditRes struct { + commonApi.EmptyRes +} + +// ManageTaskResultGetReq 获取一条数据请求 +type ManageTaskResultGetReq struct { + g.Meta `path:"/get" tags:"AI识别到的数据" method:"get" summary:"获取AI识别到的数据信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// ManageTaskResultGetRes 获取一条数据结果 +type ManageTaskResultGetRes struct { + g.Meta `mime:"application/json"` + *model.ManageTaskResultInfoRes +} + +// ManageTaskResultDeleteReq 删除数据请求 +type ManageTaskResultDeleteReq struct { + g.Meta `path:"/delete" tags:"AI识别到的数据" method:"delete" summary:"删除AI识别到的数据"` + commonApi.Author + Ids []uint `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// ManageTaskResultDeleteRes 删除数据返回 +type ManageTaskResultDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/manage_workspace.go b/api/v1/system/manage_workspace.go new file mode 100644 index 0000000..dbd6280 --- /dev/null +++ b/api/v1/system/manage_workspace.go @@ -0,0 +1,92 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-11-14 10:53:20 +// 生成路径: api/v1/system/manage_workspace.go +// 生成人:gfast +// desc:工作空间相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// ManageWorkspaceSearchReq 分页请求参数 +type ManageWorkspaceSearchReq struct { + g.Meta `path:"/list" tags:"工作空间" method:"get" summary:"工作空间列表"` + ProjectId string `p:"projectId" dc:"项目id"` + BindCode string `p:"bindCode" dc:"绑定码"` + WorkspaceName string `p:"workspaceName" dc:"工作空间名称"` + commonApi.PageReq + commonApi.Author +} + +// ManageWorkspaceSearchRes 列表返回结果 +type ManageWorkspaceSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.ManageWorkspaceListRes `json:"list"` +} + +// ManageWorkspaceAddReq 添加操作请求参数 +type ManageWorkspaceAddReq struct { + g.Meta `path:"/add" tags:"工作空间" method:"post" summary:"工作空间添加"` + commonApi.Author + WorkspaceName string `p:"workspaceName" dc:"工作区名称" v:"required#工作区的名称不能为空"` + WorkspaceDesc string `p:"workspaceDesc" dc:"工作区描述" v:"required#工作区描述不能为空"` + PlatformName string `p:"platformName" dc:"工作区平台名称" v:"required#工作区的平台名称不能为空"` + BindCode string `p:"bindCode" dc:"工作区绑定码" v:"required#工作区绑定码不能为空"` + ProjectId int64 `p:"projectId" dc:"项目ID" v:"required#项目ID必须"` +} + +// ManageWorkspaceAddRes 添加操作返回结果 +type ManageWorkspaceAddRes struct { + commonApi.EmptyRes +} + +// ManageWorkspaceEditReq 修改操作请求参数 +type ManageWorkspaceEditReq struct { + g.Meta `path:"/edit" tags:"工作空间" method:"put" summary:"工作空间修改"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键ID不能为空"` + //WorkspaceId string `p:"workspaceId" ` + WorkspaceName string `p:"workspaceName" dc:"工作区名称" v:"required#工作区的名称不能为空"` + WorkspaceDesc string `p:"workspaceDesc" dc:"工作区描述" v:"required#工作区描述不能为空"` + PlatformName string `p:"platformName" dc:"工作区平台名称" v:"required#工作区的平台名称不能为空"` + //BindCode string `p:"bindCode" dc:"工作区绑定码" v:"required#工作区绑定码不能为空"` + //ProjectId int64 `p:"projectId" dc:"项目ID" v:"required#项目ID必须"` +} + +// ManageWorkspaceEditRes 修改操作返回结果 +type ManageWorkspaceEditRes struct { + commonApi.EmptyRes +} + +// ManageWorkspaceGetReq 获取一条数据请求 +type ManageWorkspaceGetReq struct { + g.Meta `path:"/get" tags:"工作空间" method:"get" summary:"获取工作空间信息"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// ManageWorkspaceGetRes 获取一条数据结果 +type ManageWorkspaceGetRes struct { + g.Meta `mime:"application/json"` + *model.ManageWorkspaceInfoRes +} + +// ManageWorkspaceDeleteReq 删除数据请求 +type ManageWorkspaceDeleteReq struct { + g.Meta `path:"/delete" tags:"工作空间" method:"delete" summary:"删除工作空间"` + commonApi.Author + Ids []uint64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// ManageWorkspaceDeleteRes 删除数据返回 +type ManageWorkspaceDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/master_schedule.go b/api/v1/system/master_schedule.go new file mode 100644 index 0000000..bdffb97 --- /dev/null +++ b/api/v1/system/master_schedule.go @@ -0,0 +1,105 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-10-08 09:38:35 +// 生成路径: api/v1/system/master_schedule.go +// 生成人:gfast +// desc:总进度计划相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// MasterScheduleSearchReq 分页请求参数 +type MasterScheduleSearchReq struct { + g.Meta `path:"/list" tags:"总进度计划" method:"get" summary:"总进度计划列表"` + Id string `p:"id"` // + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` //项目id + Name string `p:"name"` //工作名称 + Start string `p:"start"` //开始时间 + End string `p:"end"` //结束时间 + Content string `p:"content"` //备注 + CreateBy string `p:"createBy"` //创建人 + UpdateBy string `p:"updateBy"` //更新人 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + Sequence string `p:"sequence" v:"sequence@integer#顺序编号需为整数"` //顺序编号 + commonApi.PageReq + commonApi.Author + commonApi.Paging +} + +// MasterScheduleSearchRes 列表返回结果 +type MasterScheduleSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.MasterScheduleListRes `json:"list"` +} + +// MasterScheduleAddReq 添加操作请求参数 +type MasterScheduleAddReq struct { + g.Meta `path:"/add" tags:"总进度计划" method:"post" summary:"总进度计划添加"` + commonApi.Author + ProjectId int `p:"projectId" ` + Name string `p:"name" v:"required#工作名称不能为空"` + Start string `p:"start" ` + End string `p:"end" ` + Content string `p:"content" ` + CreateBy string `p:"createBy" ` + UpdateBy string `p:"updateBy" ` + Sequence int `p:"sequence" ` +} + +// MasterScheduleAddRes 添加操作返回结果 +type MasterScheduleAddRes struct { + commonApi.EmptyRes +} + +// MasterScheduleEditReq 修改操作请求参数 +type MasterScheduleEditReq struct { + g.Meta `path:"/edit" tags:"总进度计划" method:"put" summary:"总进度计划修改"` + commonApi.Author + Id int `p:"id" v:"required#主键ID不能为空"` + ProjectId int `p:"projectId" ` + Name string `p:"name" v:"required#工作名称不能为空"` + Start string `p:"start" ` + End string `p:"end" ` + Content string `p:"content" ` + CreateBy string `p:"createBy" ` + UpdateBy string `p:"updateBy" ` + Sequence int `p:"sequence" ` +} + +// MasterScheduleEditRes 修改操作返回结果 +type MasterScheduleEditRes struct { + commonApi.EmptyRes +} + +// MasterScheduleGetReq 获取一条数据请求 +type MasterScheduleGetReq struct { + g.Meta `path:"/get" tags:"总进度计划" method:"get" summary:"获取总进度计划信息"` + commonApi.Author + Id int `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// MasterScheduleGetRes 获取一条数据结果 +type MasterScheduleGetRes struct { + g.Meta `mime:"application/json"` + *model.MasterScheduleInfoRes +} + +// MasterScheduleDeleteReq 删除数据请求 +type MasterScheduleDeleteReq struct { + g.Meta `path:"/delete" tags:"总进度计划" method:"delete" summary:"删除总进度计划"` + commonApi.Author + Ids []int `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// MasterScheduleDeleteRes 删除数据返回 +type MasterScheduleDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/notification_recipients.go b/api/v1/system/notification_recipients.go new file mode 100644 index 0000000..cea1203 --- /dev/null +++ b/api/v1/system/notification_recipients.go @@ -0,0 +1,92 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-04-11 16:58:12 +// 生成路径: api/v1/system/notification_recipients.go +// 生成人:gfast +// desc:通知接收相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// NotificationRecipientsSearchReq 分页请求参数 +type NotificationRecipientsSearchReq struct { + g.Meta `path:"/list" tags:"通知接收" method:"get" summary:"通知接收列表"` + Id string `p:"id"` // + CreatedAt string `p:"createdAt" v:"createdAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // + NotificationId string `p:"notificationId" v:"notificationId@integer#关联的通知ID需为整数"` //关联的通知ID + RecipientId string `p:"recipientId" v:"recipientId@integer#接收者ID需为整数"` //接收者ID + RecipientRole string `p:"recipientRole"` //接收者权限 + NotificationStatus string `p:"notificationStatus" v:"notificationStatus@integer#0 未读 | 1 已读需为整数"` //0 未读 | 1 已读 + commonApi.PageReq + commonApi.Author +} + +// NotificationRecipientsSearchRes 列表返回结果 +type NotificationRecipientsSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.NotificationRecipientsListRes `json:"list"` +} + +// NotificationRecipientsAddReq 添加操作请求参数 +type NotificationRecipientsAddReq struct { + g.Meta `path:"/add" tags:"通知接收" method:"post" summary:"通知接收添加"` + commonApi.Author + NotificationId int `p:"notificationId" ` + RecipientId int `p:"recipientId" ` + RecipientRole string `p:"recipientRole" ` + NotificationStatus int `p:"notificationStatus" v:"required#0 未读 | 1 已读不能为空"` +} + +// NotificationRecipientsAddRes 添加操作返回结果 +type NotificationRecipientsAddRes struct { + commonApi.EmptyRes +} + +// NotificationRecipientsEditReq 修改操作请求参数 +type NotificationRecipientsEditReq struct { + g.Meta `path:"/edit" tags:"通知接收" method:"put" summary:"通知接收修改"` + commonApi.Author + Id uint `p:"id" v:"required#主键ID不能为空"` + NotificationId int `p:"notificationId" ` + RecipientId int `p:"recipientId" ` + RecipientRole string `p:"recipientRole" ` + NotificationStatus int `p:"notificationStatus" v:"required#0 未读 | 1 已读不能为空"` +} + +// NotificationRecipientsEditRes 修改操作返回结果 +type NotificationRecipientsEditRes struct { + commonApi.EmptyRes +} + +// NotificationRecipientsGetReq 获取一条数据请求 +type NotificationRecipientsGetReq struct { + g.Meta `path:"/get" tags:"通知接收" method:"get" summary:"获取通知接收信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// NotificationRecipientsGetRes 获取一条数据结果 +type NotificationRecipientsGetRes struct { + g.Meta `mime:"application/json"` + *model.NotificationRecipientsInfoRes +} + +// NotificationRecipientsDeleteReq 删除数据请求 +type NotificationRecipientsDeleteReq struct { + g.Meta `path:"/delete" tags:"通知接收" method:"delete" summary:"删除通知接收"` + commonApi.Author + Ids []uint `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// NotificationRecipientsDeleteRes 删除数据返回 +type NotificationRecipientsDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/notifications.go b/api/v1/system/notifications.go new file mode 100644 index 0000000..4b8d0c8 --- /dev/null +++ b/api/v1/system/notifications.go @@ -0,0 +1,218 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-04-11 16:56:36 +// 生成路径: api/v1/system/notifications.go +// 生成人:gfast +// desc:通知信息相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// NotificationsSearchReq 分页请求参数 +type NotificationsSearchReq struct { + g.Meta `path:"/list" tags:"通知信息" method:"get" summary:"通知信息列表"` + Id string `p:"id"` // + CreatedAt string `p:"createdAt" v:"createdAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // + NotificationText string `p:"notificationText"` // 通知正文 + Route string `p:"route"` // 跳转的路由 + NotificationTime string `p:"notificationTime"` // 通知时间 + Initiator string `p:"initiator" v:"initiator@integer#发起人需为整数"` // 发起人 + ProjectId string `p:"projectId" v:"projectId@integer#项目ID需为整数"` // 项目ID + Type string `p:"type"` // 0 未读 | 1 已读 + Title string `p:"title"` // 标题 + IsApp string `p:"isApp"` // 0 PC | 1 App 公告通知 | 2 公告新闻 + commonApi.PageReq + commonApi.Author +} + +// NotificationsSearchRes 列表返回结果 +type NotificationsSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.NotificationsListRes `json:"list"` +} + +// NotificationsAddReq 添加操作请求参数 +type NotificationsAddReq struct { + g.Meta `path:"/add" tags:"通知信息" method:"post" summary:"通知信息添加"` + commonApi.Author + NotificationText string `p:"notificationText" ` + Route string `p:"route" ` + NotificationTime string `p:"notificationTime" ` + Initiator int `p:"initiator" ` + ProjectId int `p:"projectId" ` +} + +// NotificationsAddRes 添加操作返回结果 +type NotificationsAddRes struct { + commonApi.EmptyRes +} + +// NotificationsEditReq 修改操作请求参数 +type NotificationsEditReq struct { + g.Meta `path:"/edit" tags:"通知信息" method:"put" summary:"通知信息修改"` + commonApi.Author + Id uint `p:"id" v:"required#主键ID不能为空"` + Title string `p:"title"` + NotificationText string `p:"text" ` + Route string `p:"route" ` + NotificationTime string `p:"notificationTime" ` + Initiator int `p:"initiator" ` + ProjectId int `p:"projectId" ` +} + +// NotificationsEditRes 修改操作返回结果 +type NotificationsEditRes struct { + commonApi.EmptyRes +} + +// NotificationsGetReq 获取一条数据请求 +type NotificationsGetReq struct { + g.Meta `path:"/get" tags:"通知信息" method:"get" summary:"获取通知信息信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// NotificationsGetRes 获取一条数据结果 +type NotificationsGetRes struct { + g.Meta `mime:"application/json"` + *model.NotificationsInfoRes +} + +// NotificationsDeleteReq 删除数据请求 +type NotificationsDeleteReq struct { + g.Meta `path:"/delete" tags:"通知信息" method:"delete" summary:"删除通知信息"` + commonApi.Author + Ids []uint `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// NotificationsDeleteRes 删除数据返回 +type NotificationsDeleteRes struct { + commonApi.EmptyRes +} + +// NotificationsPublishReq 发布一条通知 +type NotificationsPublishReq struct { + g.Meta `path:"/publish" tags:"通知信息" method:"post" summary:"发布通知"` + commonApi.Author + // 通知标题 + NotificationTitle string `p:"title" v:"required#通知标题不能为空|max-length:50#最大输入字数为50" dc:"通知标题"` + // 消息正文 + NotificationText string `p:"text" v:"required#消息正文不能为空|max-length:300#最大输入字数为255" dc:"通知正文"` + // 跳转路由 + Route string `p:"route" dc:"消息需要跳转的路由"` + // 通知人员 + Users []int `p:"users" dc:"消息接收人员"` + // 通知岗位下的人员 + Positions []int `p:"positions" dc:"通知该岗位下的人员"` + // 附件 + Files []*comModel.UpFile `p:"files" dc:"消息附件"` // 需事先通过 pload/singleFile 上传 + // 通知类型 + IsApp int `p:"isApp" dc:" 0 PC | 1 App 公告通知 | 2 公告新闻"` + // 关联的 PC 端项目新闻ID + ProjectNewsId int64 `p:"projectNewsId" dc:"关联的 PC 端项目新闻ID"` + // 项目ID + ProjectId int `p:"projectId" v:"required#项目ID不能为空" dc:"项目ID"` +} + +// NotificationsPublishRes 发布一条通知返回 +type NotificationsPublishRes struct { + commonApi.EmptyRes +} + +// NotificationsGetUserReq 获取当前用户的通知信息 +type NotificationsGetUserReq struct { + g.Meta `path:"/getNotify" tags:"App" method:"get" summary:"获取当前用户的通知信息"` + commonApi.Author + commonApi.PageReq + ProjectId int `p:"projectId" v:"required#项目ID不能为空" dc:"项目ID"` // 项目ID + IsApp int `p:"isApp" d:"0" dc:"App 获取通知公告时为 1 | App 获取新闻时为 2"` // 是否是 App +} + +// NotificationsGetUserRes 获取当前用户的通知信息返回 +type NotificationsGetUserRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []Notifications +} + +type Notifications struct { + Id string `p:"id" orm:"id" dc:"通知ID"` // 消息ID + NotificationTitle string `p:"title" orm:"title" dc:"公告标题"` // 标题 + NotificationText string `p:"notificationText" orm:"notification_text" dc:"公告正文"` // 通知正文 + NotificationTime string `p:"notificationTime" orm:"notification_time" dc:"通知时间"` // 通知时间 + NotificationStatus string `p:"notification_status" orm:"notification_status" dc:"0 未读 | 1 已读"` // 通知状态 + Initiator string `p:"initiator" orm:"initiator" dc:"发起人"` // 发起人 +} + +// NotificationsReadReq 标记消息为已读 +type NotificationsReadReq struct { + g.Meta `path:"/read" tags:"通知信息" method:"post" summary:"标记消息为已读"` + commonApi.Author + // 项目ID + ProjectId int `p:"projectId" v:"required#项目ID不能为空" dc:"项目ID"` +} + +// NotificationsReadRes 标记消息为已读返回 +type NotificationsReadRes struct { + commonApi.EmptyRes +} + +// NotificationsDetailReq 查看通知公告详情 +type NotificationsDetailReq struct { + g.Meta `path:"/detail" tags:"App" method:"get" summary:"查看一个通知公告详情"` + commonApi.Author + Id int `p:"id" v:"required#消息ID不能为空" dc:"通知公告的ID"` // 消息ID +} + +// NotificationsDetailRes 查看通知公告详情返回 +type NotificationsDetailRes struct { + g.Meta `mime:"application/json"` + List NotificationsDetail +} + +// 查看通知公告的详细数据 +type NotificationsDetail struct { + NotificationTitle string `json:"title" dc:"标题"` // 标题 + NotificationText string `json:"text" dc:"通知正文"` // 通知正文 + NotificationTime string `json:"time" dc:"发布时间"` // 发布时间 + ReadNum int `json:"readNum" dc:"总阅读数"` // 总阅读数 + ReadPeople int `json:"readPeople" dc:"已读人数"` // 已读人数 + UnreadPeople int `json:"unreadPeople" dc:"未读人数"` // 未读人数 + Files []model.FileInfo `json:"files" dc:"附件"` // 附件 +} + +// NotificationsGetPeopleReq 获取通知公告的未读人员或已读人员 +type NotificationsGetPeopleReq struct { + g.Meta `path:"/getPeople" tags:"App" method:"get" summary:"获取通知公告的未读人员或已读人员"` + commonApi.Author + commonApi.PageReq + Id int `p:"id" v:"required#消息ID不能为空" dc:"通知公告的ID"` // 消息ID + Status int `p:"status" v:"required#状态不能为空" dc:"0 未读 | 1 已读"` // 0 未读 | 1 已读 +} + +// NotificationsGetPeopleRes 获取通知公告的未读人员或已读人员返回 +type NotificationsGetPeopleRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []AppUserInfo +} + +// 用户详情 +type AppUserInfo struct { + Id uint `json:"id" dc:"用户ID"` // 用户ID + // 头像 + Avatars string `json:"avatar" dc:"头像"` + // 用户名 + Username string `json:"username" dc:"用户名"` + // 已读时间 + ReadTime string `json:"readTime" dc:"已读时间"` +} diff --git a/api/v1/system/personal.go b/api/v1/system/personal.go new file mode 100644 index 0000000..53cfc95 --- /dev/null +++ b/api/v1/system/personal.go @@ -0,0 +1,61 @@ +/* +* @desc:xxxx功能描述 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/11/3 10:04 + */ + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +type PersonalInfoReq struct { + g.Meta `path:"/personal/getPersonalInfo" tags:"用户管理" method:"get" summary:"登录用户信息"` + commonApi.Author +} + +type PersonalInfoRes struct { + g.Meta `mime:"application/json"` + User *entity.SysUser `json:"user"` + Roles []string `json:"roles"` + DeptName string `json:"deptName"` +} + +// SetPersonalReq 添加修改用户公用请求字段 +type SetPersonalReq struct { + Nickname string `p:"nickname" v:"required#用户昵称不能为空"` + Mobile string `p:"mobile" v:"required|phone#手机号不能为空|手机号格式错误"` + Remark string `p:"remark"` + Sex int `p:"sex"` + UserEmail string `p:"userEmail" v:"required|email#邮箱不能为空|邮箱格式错误"` + Describe string `p:"describe"` //签名 + Avatar string `p:"avatar"` //签名 + +} + +// PersonalEditReq 修改个人 +type PersonalEditReq struct { + g.Meta `path:"/personal/edit" tags:"用户管理" method:"put" summary:"修改个人资料"` + *SetPersonalReq + commonApi.Author +} + +type PersonalEditRes struct { + commonApi.EmptyRes + UserInfo *model.LoginUserRes `json:"userInfo"` + Token string `json:"token"` +} + +type PersonalResetPwdReq struct { + g.Meta `path:"/personal/resetPwd" tags:"用户管理" method:"put" summary:"重置个人密码"` + Password string `p:"password" v:"required|password#密码不能为空|密码以字母开头,只能包含字母、数字和下划线,长度在6~18之间"` + commonApi.Author +} + +type PersonalResetPwdRes struct { +} diff --git a/api/v1/system/plan_daily.go b/api/v1/system/plan_daily.go new file mode 100644 index 0000000..431ee48 --- /dev/null +++ b/api/v1/system/plan_daily.go @@ -0,0 +1,96 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-09-26 14:31:07 +// 生成路径: api/v1/system/plan_daily.go +// 生成人:gfast +// desc:日报相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// PlanDailySearchReq 分页请求参数 +type PlanDailySearchReq struct { + g.Meta `path:"/list" tags:"日报" method:"get" summary:"日报列表"` + ProjectId string `p:"projectId"` //项目id + SourceId string `p:"sourceId"` //资源id + Name string `p:"name"` //资源名称 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // + commonApi.PageReq + commonApi.Author +} + +// PlanDailySearchRes 列表返回结果 +type PlanDailySearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.PlanDailyListRes `json:"list"` +} + +// PlanDailyAddReq 添加操作请求参数 +type PlanDailyAddReq struct { + g.Meta `path:"/add" tags:"日报" method:"post" summary:"日报添加"` + commonApi.Author + ProjectId string `p:"projectId" ` + SourceId string `p:"sourceId" ` + Name string `p:"name" ` + SourceType string `p:"sourceType" ` + Cnt int `p:"cnt" ` + DataTime string `p:"dataTime" ` + Status int `p:"status" ` +} + +// PlanDailyAddRes 添加操作返回结果 +type PlanDailyAddRes struct { + commonApi.EmptyRes +} + +// PlanDailyEditReq 修改操作请求参数 +type PlanDailyEditReq struct { + g.Meta `path:"/edit" tags:"日报" method:"put" summary:"日报修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + ProjectId string `p:"projectId" ` + SourceId string `p:"sourceId" ` + Name string `p:"name" ` + SourceType string `p:"sourceType" ` + Cnt int `p:"cnt" ` + DataTime string `p:"dataTime" ` + Status int `p:"status" ` +} + +// PlanDailyEditRes 修改操作返回结果 +type PlanDailyEditRes struct { + commonApi.EmptyRes +} + +// PlanDailyGetReq 获取一条数据请求 +type PlanDailyGetReq struct { + g.Meta `path:"/get" tags:"日报" method:"get" summary:"获取日报信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// PlanDailyGetRes 获取一条数据结果 +type PlanDailyGetRes struct { + g.Meta `mime:"application/json"` + *model.PlanDailyInfoRes +} + +// PlanDailyDeleteReq 删除数据请求 +type PlanDailyDeleteReq struct { + g.Meta `path:"/delete" tags:"日报" method:"delete" summary:"删除日报"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// PlanDailyDeleteRes 删除数据返回 +type PlanDailyDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/plan_week.go b/api/v1/system/plan_week.go new file mode 100644 index 0000000..b462d6b --- /dev/null +++ b/api/v1/system/plan_week.go @@ -0,0 +1,154 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-04 17:26:59 +// 生成路径: api/v1/system/plan_week.go +// 生成人:gfast +// desc:周计划相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// PlanWeekSearchReq 分页请求参数 +type PlanWeekSearchReq struct { + g.Meta `path:"/list" tags:"周计划" method:"get" summary:"周计划列表"` + //Id string `p:"id"` // + ProjectId string `p:"projectId" v:"required#项目id不能为空"` //项目id + DateRange []string `p:"dateRange" dc:"时间范围格式为:2023-08-08"` //日期范围 + //SourceId string `p:"sourceId"` //资源id + //Name string `p:"name"` //资源名称 + //Start string `p:"start"` //开始时间 + //End string `p:"end"` //结束时间 + //PlanName string `p:"planName"` //计划名称 + //PlanId string `p:"planId"` //周id + //CreateBy string `p:"createBy"` // + //UpdateBy string `p:"updateBy"` // + //CreateAt string `p:"createAt" v:"createAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // + //UpdateAt string `p:"updateAt" v:"updateAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // + //Table string `p:"table"` //source_id的数据对应的数据表 + //Status string `p:"status" v:"status@integer#工作状态,0:未开始,1:进行中,2:已完成需为整数"` //工作状态,0:未开始,1:进行中,2:已完成 + //commonApi.PageReq + commonApi.Author +} + +// PlanWeekSearchRes 列表返回结果 +type PlanWeekSearchRes struct { + g.Meta `mime:"application/json"` + List []*model.PlanWeekListRes `json:"list"` +} + +type task struct { + SourceId string `p:"sourceId" v:"required#资源id不能为空"` + Name string `p:"name" v:"required#资源名称不能为空"` + SourceType string `p:"source_type" v:"required#资源类型不能为空"` + Cnt int `p:"cnt" ` + //Table string `p:"table" v:"source_id的数据对应的数据表不能为空"` + //Status int `p:"status" v:"工作状态,0:未开始,1:进行中,2:已完成不能为空"` +} + +// PlanWeekAddReq 添加操作请求参数 +type PlanWeekAddReq struct { + g.Meta `path:"/add" tags:"周计划" method:"post" summary:"周计划添加"` + commonApi.Author + ProjectId string `p:"projectId" v:"required#项目id不能为空"` + Start string `p:"start" v:"required#开始时间不能为空"` + End string `p:"end" v:"required#结束时间不能为空"` + PlanName string `p:"planName" v:"required#计划名称不能为空"` + Tasks []task `p:"tasks" ` +} + +// PlanWeekAddRes 添加操作返回结果 +type PlanWeekAddRes struct { + commonApi.EmptyRes +} + +// PlanWeekEditReq 修改操作请求参数 +type PlanWeekEditReq struct { + g.Meta `path:"/edit" tags:"周计划" method:"put" summary:"周计划修改"` + commonApi.Author + ProjectId string `p:"projectId" v:"required#项目id不能为空"` + PlanID string `p:"planId" v:"required#计划id不能为空"` + Start string `p:"start" v:"required#开始时间不能为空"` + End string `p:"end" v:"required#结束时间不能为空"` + PlanName string `p:"planName" v:"required#计划名称不能为空"` + Tasks []task `p:"tasks"` +} + +// PlanWeekEditRes 修改操作返回结果 +type PlanWeekEditRes struct { + commonApi.EmptyRes +} + +// PlanWeekGetReq 获取一条数据请求 +type PlanWeekGetReq struct { + g.Meta `path:"/get" tags:"周计划" method:"get" summary:"获取周计划信息"` + commonApi.Author + Id int `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// PlanWeekGetRes 获取一条数据结果 +type PlanWeekGetRes struct { + g.Meta `mime:"application/json"` + *model.PlanWeekInfoRes +} + +// PlanWeekDeleteReq 删除数据请求 +type PlanWeekDeleteReq struct { + g.Meta `path:"/delete" tags:"周计划" method:"delete" summary:"删除周计划"` + commonApi.Author + PlanID string `p:"planId" v:"required"` //通过主键删除 +} + +// PlanWeekDeleteRes 删除数据返回 +type PlanWeekDeleteRes struct { + commonApi.EmptyRes +} + +// PlanWeekGetInfoByPlanIDReq 根据计划id,获取计划的详情类型 +type PlanWeekGetInfoByPlanIDReq struct { + g.Meta `path:"/getInfoByPlanID" tags:"周计划" method:"get" summary:"根据计划id,获取计划的详情类型"` + commonApi.Author + PlanID string `json:"planId" v:"required"` //通过主键删除 + SourceType string `json:"source_type" ` //通过主键删除 + PlanWeekReality bool `json:"plan_week_reality" ` //是否获取实际的 +} +type PlanWeekGetInfoByPlanIDRes struct { + g.Meta `mime:"application/json"` + List []*model.Task `json:"list"` +} + +// WeekAndWeekRealityListReq 根据条件获取到计划于实际的数据 +type WeekAndWeekRealityListReq struct { + g.Meta `path:"/weekAndWeekRealityList" tags:"周计划" method:"get" summary:"总计划、周计划、月计划(根据条件获取到计划于实际的数据)"` + ProjectId string `p:"projectId" dc:"项目id" v:"required#项目id不能为空"` //项目id + DateRange []string `p:"dateRange" dc:"数组string 时间范围格式为:2023-08-08"` //日期范围 + commonApi.Author +} + +// WeekAndWeekRealityListRes 列表返回结果 +type WeekAndWeekRealityListRes struct { + g.Meta `mime:"application/json"` + WeekList []*model.PlanWeekListRes `json:"weekList"` + WeekRealityList []*model.PlanWeekRealityListRes `json:"weekRealityList"` +} + +// WeeklyAndMonthlyReportDataGenerationReq 周报/月报数据生成(周报生成word,月报生成压缩包文件夹) +type WeeklyAndMonthlyReportDataGenerationReq struct { + g.Meta `path:"/weeklyAndMonthlyReportDataGeneration" tags:"周计划" method:"get" summary:"周报/月报数据生成(周报生成word,月报生成压缩包文件夹)"` + ProjectId int64 `p:"projectId" dc:"项目id" v:"required#项目id不能为空"` + Type string `p:"type" dc:"1周报、2月报" v:"between:1,2#取值范围为1~2"` + PlanId []string `p:"planId" dc:"周计划ID" v:"bail|required#planId不能为空|array#请填写planId有效数据"` + commonApi.Author +} + +// WeeklyAndMonthlyReportDataGenerationRes 列表返回结果 +type WeeklyAndMonthlyReportDataGenerationRes struct { + g.Meta `mime:"application/json"` + List []*model.ProgressOfWorksListRes `json:"list" dc:"数据"` +} diff --git a/api/v1/system/plan_week_reality.go b/api/v1/system/plan_week_reality.go new file mode 100644 index 0000000..eb7bdd6 --- /dev/null +++ b/api/v1/system/plan_week_reality.go @@ -0,0 +1,127 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-17 17:23:07 +// 生成路径: api/v1/system/plan_week_reality.go +// 生成人:xyb +// desc:实际完成的周计划相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type PlanWeekRealityCompareReq struct { + g.Meta `path:"/compare" tags:"实际完成的周计划" method:"get" summary:"实际完成的和计划的周计划对比"` + PlanID string `p:"plan_id" v:"required"` // + commonApi.Author +} + +type PlanWeekRealityCompareRes struct { + g.Meta `mime:"application/json"` + PlanList []model.Task `json:"plan_list"` + RealityList []model.Task `json:"reality_list"` +} + +// PlanWeekRealitySearchReq 分页请求参数 +type PlanWeekRealitySearchReq struct { + g.Meta `path:"/list" tags:"实际完成的周计划" method:"get" summary:"实际完成的周计划列表"` + Id string `p:"id"` // + ProjectId string `p:"projectId" v:"required#项目id不能为空"` //项目id + DateRange []string `p:"dateRange" dc:"时间范围格式为:2023-08-08"` //日期范围 + //SourceId string `p:"sourceId"` //资源id + //Name string `p:"name"` //资源名称 + //Start string `p:"start"` //开始时间 + //End string `p:"end"` //结束时间 + //PlanName string `p:"planName"` //计划名称 + //PlanId string `p:"planId"` //周id + //CreateBy string `p:"createBy"` // + //UpdateBy string `p:"updateBy"` // + //CreateAt string `p:"createAt" v:"createAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // + //UpdateAt string `p:"updateAt" v:"updateAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // + //Table string `p:"table"` //source_id的数据对应的数据表 + //Status string `p:"status" v:"status@integer#工作状态,0:未开始,1:进行中,2:已完成需为整数"` //工作状态,0:未开始,1:进行中,2:已完成 + //SourceType string `p:"sourceType"` //资源类型 + //commonApi.PageReq + commonApi.Author +} + +// PlanWeekRealitySearchRes 列表返回结果 +type PlanWeekRealitySearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.PlanWeekRealityListRes `json:"list"` +} + +// PlanWeekRealityAddReq 添加操作请求参数 +type PlanWeekRealityAddReq struct { + g.Meta `path:"/add" tags:"实际完成的周计划" method:"post" summary:"实际完成的周计划添加"` + commonApi.Author + ProjectId string `p:"projectId" v:"required#项目id不能为空"` + PlanID string `p:"planId" v:"required#计划id"` + Start string `p:"start" v:"required#开始时间不能为空"` + End string `p:"end" v:"required#结束时间不能为空"` + PlanName string `p:"planName" v:"required#计划名称不能为空"` + Tasks []task `p:"tasks" ` +} + +// PlanWeekRealityAddRes 添加操作返回结果 +type PlanWeekRealityAddRes struct { + commonApi.EmptyRes +} + +// PlanWeekRealityEditReq 修改操作请求参数 +type PlanWeekRealityEditReq struct { + g.Meta `path:"/edit" tags:"实际完成的周计划" method:"put" summary:"实际完成的周计划修改"` + commonApi.Author + Id int `p:"id" v:"required#主键ID不能为空"` + ProjectId string `p:"projectId" v:"required#项目id不能为空"` + SourceId string `p:"sourceId" v:"required#资源id不能为空"` + Name string `p:"name" v:"required#资源名称不能为空"` + Start string `p:"start" v:"required#开始时间不能为空"` + End string `p:"end" v:"required#结束时间不能为空"` + PlanName string `p:"planName" v:"required#计划名称不能为空"` + PlanId string `p:"planId" v:"required#周id不能为空"` + CreateBy string `p:"createBy" ` + UpdateBy string `p:"updateBy" ` + CreateAt *gtime.Time `p:"createAt" ` + UpdateAt *gtime.Time `p:"updateAt" ` + Table string `p:"table" ` + Status int `p:"status" v:"required#工作状态,0:未开始,1:进行中,2:已完成不能为空"` + SourceType string `p:"sourceType" ` +} + +// PlanWeekRealityEditRes 修改操作返回结果 +type PlanWeekRealityEditRes struct { + commonApi.EmptyRes +} + +// PlanWeekRealityGetReq 获取一条数据请求 +type PlanWeekRealityGetReq struct { + g.Meta `path:"/get" tags:"实际完成的周计划" method:"get" summary:"获取实际完成的周计划信息"` + commonApi.Author + Id int `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// PlanWeekRealityGetRes 获取一条数据结果 +type PlanWeekRealityGetRes struct { + g.Meta `mime:"application/json"` + *model.PlanWeekRealityInfoRes +} + +// PlanWeekRealityDeleteReq 删除数据请求 +type PlanWeekRealityDeleteReq struct { + g.Meta `path:"/delete" tags:"实际完成的周计划" method:"delete" summary:"删除实际完成的周计划"` + commonApi.Author + Ids []int `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// PlanWeekRealityDeleteRes 删除数据返回 +type PlanWeekRealityDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/plant.go b/api/v1/system/plant.go new file mode 100644 index 0000000..301f7cb --- /dev/null +++ b/api/v1/system/plant.go @@ -0,0 +1,177 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-04-12 10:38:43 +// 生成路径: api/v1/system/plant.go +// 生成人:gfast +// desc:电站信息相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// PlantSearchReq 分页请求参数 +type PlantSearchReq struct { + g.Meta `path:"/list" tags:"电站信息" method:"get" summary:"电站信息列表"` + Id string `p:"id"` //电站Id + Name string `p:"name"` //电站名称 + Address string `p:"address"` //详细地址 + City string `p:"city"` //市 + District string `p:"district"` //区 + Province string `p:"province"` //省 + Latitude string `p:"latitude" v:"latitude@float#纬度需为浮点数"` //纬度 + Longitude string `p:"longitude" v:"longitude@float#经度需为浮点数"` //经度 + Kwp string `p:"kwp" v:"kwp@float#总容量kwp需为浮点数"` //总容量kwp + MonKwh string `p:"monKwh" v:"monKwh@float#当月发电量需为浮点数"` //当月发电量 + NowKw string `p:"nowKw" v:"nowKw@float#实时功率需为浮点数"` //实时功率 + SumKwh string `p:"sumKwh" v:"sumKwh@float#总发电量需为浮点数"` //总发电量 + TodayKwh string `p:"todayKwh" v:"todayKwh@float#当日发电量需为浮点数"` //当日发电量 + YearKwh string `p:"yearKwh" v:"yearKwh@float#当年发电量需为浮点数"` //当年发电量 + NetworkTime string `p:"networkTime" v:"networkTime@datetime#并网日期需为YYYY-MM-DD hh:mm:ss格式"` //并网日期 + UpdateTime string `p:"updateTime" v:"updateTime@datetime#修改时间需为YYYY-MM-DD hh:mm:ss格式"` //修改时间 + CompanyId string `p:"companyId"` //渠道商Id + CompanyName string `p:"companyName"` //渠道商名称 + OwnerId string `p:"ownerId"` //业主Id + OwnerName string `p:"ownerName"` //业主姓名 + ServiceProviderName string `p:"serviceProviderName"` //安装商名称 + ServiceProviderPhone string `p:"serviceProviderPhone"` //安装服务商电话 + NetworkType string `p:"networkType"` //并网类型 1:全额上网 2:自发自用余电上网 3:自发自用无馈网 4:离网 + PowerPlantType string `p:"powerPlantType"` //电站类型 1:家庭户用 2:工商业屋顶 3:地面电站 4:扶贫电站 5:储能电站 + Status string `p:"status" v:"status@integer#电站状态 0:未绑定 1:在线 2:停机 3:停机告警 4:运行告警 5:故障 6:离线需为整数"` //电站状态 0:未绑定 1:在线 2:停机 3:停机告警 4:运行告警 5:故障 6:离线 + PaymentType string `p:"paymentType"` //出资方式 + PlantContact string `p:"plantContact"` //电站联系人 + PlantContactPhone string `p:"plantContactPhone"` //电站联系人电话 + PlantImg string `p:"plantImg"` //电站图片 + DipAngle string `p:"dipAngle" v:"dipAngle@float#倾角度数需为浮点数"` //倾角度数 + OrientationAngle string `p:"orientationAngle" v:"orientationAngle@float#方位角度数需为浮点数"` //方位角度数 + SubassemblyNumber string `p:"subassemblyNumber" v:"subassemblyNumber@integer#组件数量需为整数"` //组件数量 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// PlantSearchRes 列表返回结果 +type PlantSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.PlantListRes `json:"list"` +} + +// PlantAddReq 添加操作请求参数 +type PlantAddReq struct { + g.Meta `path:"/add" tags:"电站信息" method:"post" summary:"电站信息添加"` + commonApi.Author + Id string `p:"id" v:"required#主键ID不能为空"` + Name string `p:"name" v:"required#电站名称不能为空"` + Address string `p:"address" ` + City string `p:"city" ` + District string `p:"district" ` + Province string `p:"province" ` + Latitude float64 `p:"latitude" ` + Longitude float64 `p:"longitude" ` + Kwp float64 `p:"kwp" ` + MonKwh float64 `p:"monKwh" ` + NowKw float64 `p:"nowKw" ` + SumKwh float64 `p:"sumKwh" ` + TodayKwh float64 `p:"todayKwh" ` + YearKwh float64 `p:"yearKwh" ` + NetworkTime *gtime.Time `p:"networkTime" ` + UpdateTime *gtime.Time `p:"updateTime" ` + CompanyId string `p:"companyId" ` + CompanyName string `p:"companyName" ` + OwnerId string `p:"ownerId" ` + OwnerName string `p:"ownerName" ` + ServiceProviderName string `p:"serviceProviderName" ` + ServiceProviderPhone string `p:"serviceProviderPhone" ` + NetworkType string `p:"networkType" ` + PowerPlantType string `p:"powerPlantType" ` + Status int `p:"status" v:"required#电站状态 0:未绑定 1:在线 2:停机 3:停机告警 4:运行告警 5:故障 6:离线不能为空"` + PaymentType string `p:"paymentType" ` + PlantContact string `p:"plantContact" ` + PlantContactPhone string `p:"plantContactPhone" ` + PlantImg string `p:"plantImg" ` + Remark string `p:"remark" ` + DipAngle float64 `p:"dipAngle" ` + OrientationAngle float64 `p:"orientationAngle" ` + SubassemblyNumber int `p:"subassemblyNumber" ` +} + +// PlantAddRes 添加操作返回结果 +type PlantAddRes struct { + commonApi.EmptyRes +} + +// PlantEditReq 修改操作请求参数 +type PlantEditReq struct { + g.Meta `path:"/edit" tags:"电站信息" method:"put" summary:"电站信息修改"` + commonApi.Author + Id string `p:"id" v:"required#主键ID不能为空"` + Name string `p:"name" v:"required#电站名称不能为空"` + Address string `p:"address" ` + City string `p:"city" ` + District string `p:"district" ` + Province string `p:"province" ` + Latitude float64 `p:"latitude" ` + Longitude float64 `p:"longitude" ` + Kwp float64 `p:"kwp" ` + MonKwh float64 `p:"monKwh" ` + NowKw float64 `p:"nowKw" ` + SumKwh float64 `p:"sumKwh" ` + TodayKwh float64 `p:"todayKwh" ` + YearKwh float64 `p:"yearKwh" ` + NetworkTime *gtime.Time `p:"networkTime" ` + UpdateTime *gtime.Time `p:"updateTime" ` + CompanyId string `p:"companyId" ` + CompanyName string `p:"companyName" ` + OwnerId string `p:"ownerId" ` + OwnerName string `p:"ownerName" ` + ServiceProviderName string `p:"serviceProviderName" ` + ServiceProviderPhone string `p:"serviceProviderPhone" ` + NetworkType string `p:"networkType" ` + PowerPlantType string `p:"powerPlantType" ` + Status int `p:"status" v:"required#电站状态 0:未绑定 1:在线 2:停机 3:停机告警 4:运行告警 5:故障 6:离线不能为空"` + PaymentType string `p:"paymentType" ` + PlantContact string `p:"plantContact" ` + PlantContactPhone string `p:"plantContactPhone" ` + PlantImg string `p:"plantImg" ` + Remark string `p:"remark" ` + DipAngle float64 `p:"dipAngle" ` + OrientationAngle float64 `p:"orientationAngle" ` + SubassemblyNumber int `p:"subassemblyNumber" ` +} + +// PlantEditRes 修改操作返回结果 +type PlantEditRes struct { + commonApi.EmptyRes +} + +// PlantGetReq 获取一条数据请求 +type PlantGetReq struct { + g.Meta `path:"/get" tags:"电站信息" method:"get" summary:"获取电站信息信息"` + commonApi.Author + Id string `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// PlantGetRes 获取一条数据结果 +type PlantGetRes struct { + g.Meta `mime:"application/json"` + *model.PlantInfoRes +} + +// PlantDeleteReq 删除数据请求 +type PlantDeleteReq struct { + g.Meta `path:"/delete" tags:"电站信息" method:"delete" summary:"删除电站信息"` + commonApi.Author + Ids []string `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// PlantDeleteRes 删除数据返回 +type PlantDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/project_finance.go b/api/v1/system/project_finance.go new file mode 100644 index 0000000..21c29da --- /dev/null +++ b/api/v1/system/project_finance.go @@ -0,0 +1,126 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-04-29 12:01:01 +// 生成路径: api/v1/system/project_finance.go +// 生成人:gfast +// desc:项目财务相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// ProjectFinanceSearchReq 分页请求参数 +type ProjectFinanceSearchReq struct { + g.Meta `path:"/list" tags:"项目财务" method:"get" summary:"项目财务列表"` + Id string `p:"id" json:"id" dc:"主键"` // 主键 + ProjectId string `p:"projectId" json:"projectId" dc:"项目ID"` + ProjectName string `p:"projectName" json:"projectName" dc:"项目名称"` // 项目ID // 项目ID + ContractAmount float64 `p:"contractAmount" json:"contractAmount" v:"contractAmount@float#承包合同金额需为浮点数" dc:"承包合同金额"` // 承包合同金额 + SubcontractAmount float64 `p:"subcontractAmount" json:"subcontractAmount" v:"subcontractAmount@float#分包合同金额需为浮点数" dc:"分包合同金额"` // 分包合同金额 + AmountReceived float64 `p:"amountReceived" json:"amountReceived" v:"amountReceived@float#已收款需为浮点数" dc:"已收款"` // 已收款 + AmountPaid float64 `p:"amountPaid" json:"amountPaid" v:"amountPaid@float#已付款需为浮点数" dc:"已付款"` // 已付款 + ExpensesReimbursed float64 `p:"expensesReimbursed" json:"expensesReimbursed" v:"expensesReimbursed@float#已费用报销需为浮点数" dc:"已费用报销"` // 已费用报销 + EstimatedGrossProfit float64 `p:"estimatedGrossProfit" json:"estimatedGrossProfit" v:"estimatedGrossProfit@float#预计毛利润需为浮点数" dc:"预计毛利润"` // 预计毛利润 + CurrentProfit float64 `p:"currentProfit" json:"currentProfit" v:"currentProfit@float#目前利润需为浮点数" dc:"目前利润"` // 目前利润 + CurrentRemainingFunds float64 `p:"currentRemainingFunds" json:"currentRemainingFunds" v:"currentRemainingFunds@float#目前结余资金需为浮点数" dc:"目前结余资金"` // 目前结余资金 + ProjectedIncreaseInRemainingFunds float64 `p:"projectedIncreaseInRemainingFunds" json:"projectedIncreaseInRemainingFunds" v:"projectedIncreaseInRemainingFunds@float#至项目完成应增加的结余资金需为浮点数" dc:"至项目完成应增加的结余资金"` // 至项目完成应增加的结余资金 + NetPresentValueOfProjectOperation float64 `p:"netPresentValueOfProjectOperation" json:"netPresentValueOfProjectOperation" v:"netPresentValueOfProjectOperation@float#项目经营净现值需为浮点数" dc:"项目经营净现值"` // 项目经营净现值 + CreatedAt string `p:"createdAt" json:"createdAt" v:"createdAt@datetime#填报时间需为YYYY-MM-DD hh:mm:ss格式" dc:"填报时间"` // 填报时间 + CreatedBy string `p:"createdBy" json:"createdBy" v:"createdBy@integer#填报人ID需为整数" dc:"填报人ID"` // 填报人ID + commonApi.PageReq + commonApi.Author +} + +// ProjectFinanceSearchRes 列表返回结果 +type ProjectFinanceSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.ProjectFinanceListResVo `json:"list"` +} + +// ProjectFinanceAddReq 添加操作请求参数 +type ProjectFinanceAddReq struct { + g.Meta `path:"/add" tags:"项目财务" method:"post" summary:"项目财务添加"` + commonApi.Author + ProjectId int `p:"projectId" json:"projectId" dc:"项目ID"` + ContractAmount float64 `p:"contractAmount" json:"contractAmount" dc:"承包合同金额"` + SubcontractAmount float64 `p:"subcontractAmount" json:"subcontractAmount" dc:"分包合同金额"` + AmountReceived float64 `p:"amountReceived" json:"amountReceived" dc:"已收款"` + AmountPaid float64 `p:"amountPaid" json:"amountPaid" dc:"已付款"` + ExpensesReimbursed float64 `p:"expensesReimbursed" json:"expensesReimbursed" dc:"已费用报销"` + EstimatedGrossProfit float64 `p:"estimatedGrossProfit" json:"estimatedGrossProfit" dc:"预计毛利润"` + CurrentProfit float64 `p:"currentProfit" json:"currentProfit" dc:"目前利润"` + CurrentRemainingFunds float64 `p:"currentRemainingFunds" json:"currentRemainingFunds" dc:"目前结余资金"` + ProjectedIncreaseInRemainingFunds float64 `p:"projectedIncreaseInRemainingFunds" json:"projectedIncreaseInRemainingFunds" dc:"至项目完成应增加的结余资金"` + NetPresentValueOfProjectOperation float64 `p:"netPresentValueOfProjectOperation" json:"netPresentValueOfProjectOperation" dc:"项目经营净现值"` + CreatedBy uint64 `p:"createdBy" json:"createdBy" dc:"创建人ID"` +} + +// ProjectFinanceAddRes 添加操作返回结果 +type ProjectFinanceAddRes struct { + commonApi.EmptyRes +} + +// ProjectFinanceEditReq 修改操作请求参数 +type ProjectFinanceEditReq struct { + g.Meta `path:"/edit" tags:"项目财务" method:"put" summary:"项目财务修改"` + commonApi.Author + Id int `p:"id" v:"required#主键ID不能为空" json:"id" dc:"主键"` + ProjectId int `p:"projectId" json:"projectId" dc:"项目ID"` + ContractAmount float64 `p:"contractAmount" json:"contractAmount" dc:"承包合同金额"` + SubcontractAmount float64 `p:"subcontractAmount" json:"subcontractAmount" dc:"分包合同金额"` + AmountReceived float64 `p:"amountReceived" json:"amountReceived" dc:"已收款"` + AmountPaid float64 `p:"amountPaid" json:"amountPaid" dc:"已付款"` + ExpensesReimbursed float64 `p:"expensesReimbursed" json:"expensesReimbursed" dc:"已费用报销"` + EstimatedGrossProfit float64 `p:"estimatedGrossProfit" json:"estimatedGrossProfit" dc:"预计毛利润"` + CurrentProfit float64 `p:"currentProfit" json:"currentProfit" dc:"目前利润"` + CurrentRemainingFunds float64 `p:"currentRemainingFunds" json:"currentRemainingFunds" dc:"目前结余资金"` + ProjectedIncreaseInRemainingFunds float64 `p:"projectedIncreaseInRemainingFunds" json:"projectedIncreaseInRemainingFunds" dc:"至项目完成应增加的结余资金"` + NetPresentValueOfProjectOperation float64 `p:"netPresentValueOfProjectOperation" json:"netPresentValueOfProjectOperation" dc:"项目经营净现值"` +} + +// ProjectFinanceEditRes 修改操作返回结果 +type ProjectFinanceEditRes struct { + commonApi.EmptyRes +} + +// ProjectFinanceGetReq 获取一条数据请求 +type ProjectFinanceGetReq struct { + g.Meta `path:"/get" tags:"项目财务" method:"get" summary:"获取项目财务信息"` + commonApi.Author + Id int `p:"id" dc:"主键ID"` //通过主键获取 + ProjectId int `p:"projectId" dc:"项目ID"` //通过主键获取 +} + +// ProjectFinanceGetRes 获取一条数据结果 +type ProjectFinanceGetRes struct { + g.Meta `mime:"application/json"` + *model.ProjectFinanceInfoResVo +} + +// ProjectFinanceDeleteReq 删除数据请求 +type ProjectFinanceDeleteReq struct { + g.Meta `path:"/delete" tags:"项目财务" method:"delete" summary:"删除项目财务"` + commonApi.Author + Ids []int `p:"ids" v:"required#主键必须" dc:"主键ID列表"` //通过主键删除 +} + +// ProjectFinanceDeleteRes 删除数据返回 +type ProjectFinanceDeleteRes struct { + commonApi.EmptyRes +} + +// 文件上传请求 +type UploadExcelReq struct { + g.Meta `path:"/excel/upload" method:"post" tags:"项目财务" summary:"上传Excel文件"` + ProjectId int64 `json:"projectId" v:"required#项目ID不能为空" dc:"项目ID"` +} + +type UploadExcelRes struct { +} diff --git a/api/v1/system/project_schedule.go b/api/v1/system/project_schedule.go new file mode 100644 index 0000000..1fa4c7c --- /dev/null +++ b/api/v1/system/project_schedule.go @@ -0,0 +1,111 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-03-13 18:17:32 +// 生成路径: api/v1/system/project_schedule.go +// 生成人:gfast +// desc:项目排期相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// ProjectScheduleSearchReq 分页请求参数 +type ProjectScheduleSearchReq struct { + g.Meta `path:"/list" tags:"项目排期" method:"get" summary:"项目排期列表"` + Id string `p:"id"` // + ParentId string `p:"parentId" v:"parentId@integer#设施ID需为整数"` // 设施ID + StartDate string `p:"startDate"` // 开始时间 + EndDate string `p:"endDate"` // 结束时间 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // + Name string `p:"name"` // 项目名 + PlaneNum string `p:"planeNum"` // 计划持有量 + commonApi.PageReq + commonApi.Author +} + +// ProjectScheduleSearchRes 列表返回结果 +type ProjectScheduleSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.ProjectScheduleListRes `json:"list"` +} + +// ProjectScheduleAddReq 添加操作请求参数 +type ProjectScheduleAddReq struct { + g.Meta `path:"/add" tags:"项目排期" method:"post" summary:"项目排期添加"` + commonApi.Author + ParentId int `p:"parentId" ` + StartDate string `p:"startDate" ` + EndDate string `p:"endDate" ` + Name string `p:"name" ` + PlaneNum string `p:"planeNum" ` +} + +// ProjectScheduleAddRes 添加操作返回结果 +type ProjectScheduleAddRes struct { + commonApi.EmptyRes +} + +// ProjectScheduleEditReq 修改操作请求参数 +type ProjectScheduleEditReq struct { + g.Meta `path:"/edit" tags:"项目排期" method:"put" summary:"项目排期修改"` + commonApi.Author + Id uint `p:"id" v:"required#主键ID不能为空"` + ParentId int `p:"parentId" ` + StartDate string `p:"startDate" ` + EndDate string `p:"endDate" ` + Name string `p:"name" ` + PlaneNum string `p:"planeNum" ` +} + +// ProjectScheduleEditRes 修改操作返回结果 +type ProjectScheduleEditRes struct { + commonApi.EmptyRes +} + +// ProjectScheduleGetReq 获取一条数据请求 +type ProjectScheduleGetReq struct { + g.Meta `path:"/get" tags:"项目排期" method:"get" summary:"获取项目排期信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// ProjectScheduleGetRes 获取一条数据结果 +type ProjectScheduleGetRes struct { + g.Meta `mime:"application/json"` + *model.ProjectScheduleInfoRes +} + +// ProjectScheduleDeleteReq 删除数据请求 +type ProjectScheduleDeleteReq struct { + g.Meta `path:"/delete" tags:"项目排期" method:"delete" summary:"删除项目排期"` + commonApi.Author + Ids []uint `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// ProjectScheduleDeleteRes 删除数据返回 +type ProjectScheduleDeleteRes struct { + commonApi.EmptyRes +} + +// 添加计划 +type ProjectScheduleAddPlanReq struct { + g.Meta `path:"/addPlan" tags:"项目排期" method:"post" summary:"项目排期添加计划"` + commonApi.Author + ConstructionId int `p:"construction_Id" v:"required#项目id不能为空"` + StartDate string `p:"startDate" v:"required#开始时间不能为空"` + EndDate string `p:"endDate" v:"required#结束时间不能为空"` + Name string `p:"name"` + PlaneNum string `p:"planeNum" v:"required#计划持有量不能为空"` + Types int `p:"types" dc:"0|1为计划中" v:"required#计划类型不能为空"` +} + +type ProjectScheduleAddPlanRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/pv_ module.go b/api/v1/system/pv_ module.go new file mode 100644 index 0000000..a87bb19 --- /dev/null +++ b/api/v1/system/pv_ module.go @@ -0,0 +1,244 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-03-23 10:25:39 +// 生成路径: api/v1/system/pv_ module.go +// 生成人:gfast +// desc:光伏组件相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/os/gtime" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/api/v1/common/shp" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +// PvModuleSearchReq 分页请求参数 +type PvModuleSearchReq struct { + g.Meta `path:"/list" tags:"光伏组件" method:"get" summary:"光伏组件列表"` + Id string `p:"id"` // + FangzhenId string `p:"fangzhenId"` // 方阵ID + SubProjectid string `p:"subProjectid"` // 子项目ID + WorkId string `p:"workId"` // 工作ID + Name string `p:"name"` // 名字 + Status string `p:"status"` // 状态 0未开始 1 进行中 2 已完成 + DoneTime string `p:"doneTime" v:"doneTime@datetime#完成时间需为YYYY-MM-DD hh:mm:ss格式"` // 完成时间 + Detail string `p:"detail"` // 坐标详细信息 + Type string `p:"work_type"` // 类型 + commonApi.PageReq + commonApi.Author +} + +// PvModuleSearchRes 列表返回结果 +type PvModuleSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.PvModuleListRes `json:"list"` +} + +// PvModuleAddReq 添加操作请求参数 +type PvModuleAddReq struct { + g.Meta `path:"/add" tags:"光伏组件" method:"post" summary:"光伏组件添加"` + commonApi.Author + FangzhenId string `p:"fangzhenId" ` + SubProjectid string `p:"subProjectid" ` + WorkId string `p:"workId" ` + Name string `p:"name" v:"required#名字不能为空"` + Status string `p:"status" v:"required#状态 0未开始 1 进行中 2 已完成不能为空"` + DoneTime *gtime.Time `p:"doneTime" ` + Detail string `p:"detail"` +} + +// PvModuleAddRes 添加操作返回结果 +type PvModuleAddRes struct { + commonApi.EmptyRes +} + +// PvModuleEditReq 修改操作请求参数 +type PvModuleEditReq struct { + g.Meta `path:"/edit" tags:"光伏组件" method:"put" summary:"光伏组件修改"` + commonApi.Author + Id uint `p:"id" v:"required#主键ID不能为空"` + FangzhenId string `p:"fangzhenId" ` + SubProjectid string `p:"subProjectid" ` + WorkId string `p:"workId" ` + Name string `p:"name" v:"required#名字不能为空"` + Status string `p:"status" v:"required#状态 0未开始 1 进行中 2 已完成不能为空"` + DoneTime *gtime.Time `p:"doneTime" ` + Detail string `p:"detail" ` +} + +// PvModuleEditRes 修改操作返回结果 +type PvModuleEditRes struct { + commonApi.EmptyRes +} + +// PvModuleGetReq 获取一条数据请求 +type PvModuleGetReq struct { + g.Meta `path:"/get" tags:"光伏组件" method:"get" summary:"获取光伏组件信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// PvModuleGetRes 获取一条数据结果 +type PvModuleGetRes struct { + g.Meta `mime:"application/json"` + *model.PvModuleInfoRes +} + +// PvModuleDeleteReq 删除数据请求 +type PvModuleDeleteReq struct { + g.Meta `path:"/delete" tags:"光伏组件" method:"delete" summary:"删除光伏组件"` + commonApi.Author + Ids []uint `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// PvModuleDeleteRes 删除数据返回 +type PvModuleDeleteRes struct { + commonApi.EmptyRes +} + +// PvModuleImportReq 导入项目描述文件 +type PvModuleImportReq struct { + g.Meta `path:"/import" tags:"光伏组件" method:"post" summary:"导入箱变"` + commonApi.Author + // WorkID string `p:"workID" v:"required#工作ID不能为空"` + FangZhenID string `p:"fangZhenID" v:"required#方阵ID不能为空" dc:"方阵ID"` + // 项目ID + ProjectID string `p:"projectID" v:"required#项目ID不能为空" dc:"主项目ID"` + // 子项目ID + SubProjectID string `p:"subProjectID" v:"required#子项目ID不能为空" dc:"子项目ID"` + // TypeNumb int `p:"typeNumb" v:"required#类型编号不能为空" dc:"类型编号"` + Files []*ghttp.UploadFile `p:"files" v:"required#文件不能为空" dc:"shp 文件"` +} + +type PvModuleImportCory struct { + FangZhenID string `p:"fangZhenID" v:"required#方阵ID不能为空" dc:"方阵ID"` + ProjectID string `p:"projectID" v:"required#项目ID不能为空" dc:"主项目ID"` + SubProjectID string `p:"subProjectID" v:"required#子项目ID不能为空" dc:"子项目ID"` + Shapes *shp.ShpObj `p:"shapes" v:"required#子项目ID不能为空" dc:"数据"` +} + +// 导入逆变器 +type PvModuleImportInverterReq struct { + g.Meta `path:"/importInverter" tags:"光伏组件" method:"post" summary:"导入逆变器"` + commonApi.Author + FangZhenID string `p:"fangZhenID" v:"required#方阵ID不能为空" dc:"方阵ID"` + ProjectID string `p:"projectID" v:"required#项目ID不能为空" dc:"主项目ID"` + SubProjectID string `p:"subProjectID" v:"required#子项目ID不能为空" dc:"子项目ID"` + // TypeNumb int `p:"typeNumb" v:"required#类型编号不能为空" dc:"类型编号"` + Files []*ghttp.UploadFile `p:"file" v:"required#文件不能为空" dc:"shp 文件"` +} + +type ImportInverterCory struct { + FangZhenID string `p:"fangZhenID" v:"required#方阵ID不能为空" dc:"方阵ID"` + ProjectID string `p:"projectID" v:"required#项目ID不能为空" dc:"主项目ID"` + SubProjectID string `p:"subProjectID" v:"required#子项目ID不能为空" dc:"子项目ID"` + Shapes *shp.ShpObj `p:"shapes" v:"required#子项目ID不能为空" dc:"数据"` +} + +// PvModuleImportRes 导入项目描述文件返回 +type PvModuleImportRes struct { + commonApi.EmptyRes +} + +// 导入光伏板 +type PvModuleImportPvBoardReq struct { + g.Meta `path:"/importPvBoard" tags:"光伏组件" method:"post" summary:"导入光伏板"` + commonApi.Author + FangZhenID string `p:"fangZhenID" v:"required#方阵ID不能为空" dc:"方阵ID"` + ProjectID string `p:"projectID" v:"required#项目ID不能为空" dc:"主项目ID"` + SubProjectID string `p:"subProjectID" v:"required#子项目ID不能为空" dc:"子项目ID"` + Files []*ghttp.UploadFile `p:"file" v:"required#文件不能为空" dc:"shp 文件"` +} +type ImportPvBoardCory struct { + FangZhenID string `p:"fangZhenID" v:"required#方阵ID不能为空" dc:"方阵ID"` + ProjectID string `p:"projectID" v:"required#项目ID不能为空" dc:"主项目ID"` + SubProjectID string `p:"subProjectID" v:"required#子项目ID不能为空" dc:"子项目ID"` + Shapes *shp.ShpObj `p:"shapes" v:"required#子项目ID不能为空" dc:"数据"` + Fangzhens []entity.QianqiFangzhen `p:"fangzhens" ` +} + +// 添加日报 +type PvModuleAddDailyReq struct { + g.Meta `path:"/addDaily" tags:"光伏组件" method:"post" summary:"添加日报"` + commonApi.Author + PlanID string `p:"planID" v:"required#计划ID不能为空" dc:"计划ID"` + Ids []int `p:"ids" v:"required#主键ID不能为空" dc:"主键ID"` + WorkID string `p:"workID" v:"required#工作ID不能为空" dc:"WorkID"` + // 完成日期 + DoneTime *gtime.Time `p:"doneTime" v:"required#完成时间不能为空" dc:"完成时间"` +} + +type PvModuleAddDailyRes struct { + commonApi.EmptyRes +} + +// 传入 WorkID Type done_time 获取具体完成的数据 +type PvModuleGetDailyReq struct { + g.Meta `path:"/getDaily" tags:"光伏组件" method:"get" summary:"获取日报"` + commonApi.Author + WorkID string `p:"workID" v:"required#工作ID不能为空" dc:"WorkID"` + Type string `p:"type" v:"required#类型不能为空" dc:"类型"` + // 完成日期 + DoneTime string `p:"doneTime" v:"required#完成时间不能为空" dc:"完成时间"` +} + +type PvModuleGetDailyRes struct { + g.Meta `mime:"application/json"` + List []*model.PvModuleListRes `json:"list"` +} + +// 删除日报 +type PvModuleDeleteDailyReq struct { + g.Meta `path:"/deleteDaily" tags:"光伏组件" method:"delete" summary:"删除日报"` + commonApi.Author + // 计划的主键ID + Id int `p:"id" v:"required#主键ID不能为空" dc:"计划的主键ID"` + // 计划的WorkID + WorkID string `p:"workID" v:"required#工作ID不能为空" dc:"计划的WorkID"` + // 需要被删除计划的时间 + Time string `p:"time" v:"required#时间不能为空" dc:"计划的时间"` + // 需要被删除计划的主键ID列表 + PlanID []int `p:"planID" v:"required#计划ID不能为空" dc:"计划的主键ID"` +} + +type PvModuleDeleteDailyRes struct { + commonApi.EmptyRes +} + +// 上传 excel 为指定子项目添加数据 +type PvModuleAddExcelReq struct { + g.Meta `path:"/addExcel" tags:"光伏组件" method:"post" summary:"上传excel添加数据"` + commonApi.Author + // 项目ID + ProjectID string `p:"projectID" v:"required#项目ID不能为空" dc:"主项目ID"` + // 子项目ID + SubProjectID string `p:"subProjectID" v:"required#子项目ID不能为空" dc:"子项目ID"` + // 文件 + File *ghttp.UploadFile `p:"file" v:"required#文件不能为空" dc:"excel 文件"` +} + +type PvModuleAddExcelRes struct { + commonApi.EmptyRes +} + +// 为逆变器绑定设备ID +type PvModuleBindDeviceIDReq struct { + g.Meta `path:"/bindDeviceID" tags:"光伏组件" method:"post" summary:"为逆变器绑定设备ID"` + commonApi.Author + // 主键ID + ID int `p:"id" v:"required#主键ID不能为空" dc:"主键ID"` + // 设备ID + DeviceID string `p:"deviceID" v:"required#设备ID不能为空" dc:"设备ID"` +} + +type PvModuleBindDeviceIDRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/qianqi_bubantu.go b/api/v1/system/qianqi_bubantu.go new file mode 100644 index 0000000..3ea3593 --- /dev/null +++ b/api/v1/system/qianqi_bubantu.go @@ -0,0 +1,92 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-31 11:44:41 +// 生成路径: api/v1/system/qianqi_bubantu.go +// 生成人:gfast +// desc:布板图相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// QianqiBubantuSearchReq 分页请求参数 +type QianqiBubantuSearchReq struct { + g.Meta `path:"/list" tags:"布板图" method:"get" summary:"布板图列表"` + ProjectId string `p:"projectId" v:"required#项目id不能为空"` //项目id + Name string `p:"name"` //名称 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// QianqiBubantuSearchRes 列表返回结果 +type QianqiBubantuSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.QianqiBubantuListRes `json:"list"` +} + +// QianqiBubantuAddReq 添加操作请求参数 +type QianqiBubantuAddReq struct { + g.Meta `path:"/add" tags:"布板图" method:"post" summary:"布板图添加"` + commonApi.Author + ProjectId string `p:"projectId" v:"required#项目id不能为空"` + GuangfubanId string `p:"guangfubanId" v:"required#光伏板id不能为空"` + //Name string `p:"name" v:"required#名称不能为空"` + //SourceId string `p:"sourceId" ` + //SourcePath string `p:"sourcePath" ` + File []*ghttp.UploadFile `p:"file" ` +} + +// QianqiBubantuAddRes 添加操作返回结果 +type QianqiBubantuAddRes struct { + commonApi.EmptyRes +} + +// QianqiBubantuEditReq 修改操作请求参数 +type QianqiBubantuEditReq struct { + g.Meta `path:"/edit" tags:"布板图" method:"put" summary:"布板图修改"` + commonApi.Author + Id int `p:"id" v:"required#主键ID不能为空"` + //ProjectId string `p:"projectId" ` + Name string `p:"name" v:"required#名称不能为空"` + //SourceId string `p:"sourceId" ` + //SourcePath string `p:"sourcePath" ` +} + +// QianqiBubantuEditRes 修改操作返回结果 +type QianqiBubantuEditRes struct { + commonApi.EmptyRes +} + +// QianqiBubantuGetReq 获取一条数据请求 +type QianqiBubantuGetReq struct { + g.Meta `path:"/get" tags:"布板图" method:"get" summary:"获取布板图信息"` + commonApi.Author + Id int `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// QianqiBubantuGetRes 获取一条数据结果 +type QianqiBubantuGetRes struct { + g.Meta `mime:"application/json"` + *model.QianqiBubantuInfoRes +} + +// QianqiBubantuDeleteReq 删除数据请求 +type QianqiBubantuDeleteReq struct { + g.Meta `path:"/delete" tags:"布板图" method:"delete" summary:"删除布板图"` + commonApi.Author + Ids []int `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// QianqiBubantuDeleteRes 删除数据返回 +type QianqiBubantuDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/qianqi_camera.go b/api/v1/system/qianqi_camera.go new file mode 100644 index 0000000..ea6a4e6 --- /dev/null +++ b/api/v1/system/qianqi_camera.go @@ -0,0 +1,139 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-09-30 22:37:34 +// 生成路径: api/v1/system/qianqi_camera.go +// 生成人:gfast +// desc:摄像头相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/api/v1/common/shp" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// QianqiCameraSearchReq 分页请求参数 +type QianqiCameraSearchReq struct { + g.Meta `path:"/list" tags:"摄像头" method:"get" summary:"摄像头列表"` + Id string `p:"id"` // + CameraName string `p:"cameraName"` // 摄像头名称 + CameraCode string `p:"cameraCode"` // 摄像头编码 + Detail string `p:"detail"` // 摄像头坐标信息 + ProjectId string `p:"projectId"` // 项目id + Status string `p:"status" v:"status@integer#在线情况(1、在线,0、离线),字典on_line_status需为整数"` // 在线情况(1、在线,0、离线),字典on_line_status + Poster string `p:"poster"` // 封面图 + CreateBy string `p:"createBy"` // 创建人 + UpdateBy string `p:"updateBy"` // 更新人 + CreateddAt string `p:"createddAt" v:"createddAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` // 创建时间 + SourceType string `p:"sourceType"` // + Serial string `p:"serial"` // 国标id + Code string `p:"code"` // 通道号 + Flv string `p:"flv"` // flv地址 + Hls string `p:"hls"` // hls地址 + Share string `p:"share"` // 分享地址 + Rtc string `p:"rtc"` // webrtc地址 + commonApi.PageReq + commonApi.Author +} + +// QianqiCameraSearchRes 列表返回结果 +type QianqiCameraSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.QianqiCameraListRes `json:"list"` +} + +// QianqiCameraAddReq 添加操作请求参数 +type QianqiCameraAddReq struct { + g.Meta `path:"/add" tags:"摄像头" method:"post" summary:"摄像头添加"` + commonApi.Author + CameraName string `p:"cameraName" dc:"摄像头名称" v:"required#摄像头名称不能为空"` + // CameraCode string `p:"cameraCode" dc:"摄像头编码" ` + Detail string `p:"detail" dc:"摄像头坐标信息"` + ProjectId string `p:"projectId" dc:"项目id" v:"required#项目ID不能为空"` + Status int `p:"status" dc:"在线情况(1、在线,0、离线),字典on_line_status不能为空" v:"required#在线情况(1、在线,0、离线),字典on_line_status不能为空"` + Poster string `p:"poster" dc:"封面图"` + // CreateBy string `p:"createBy" ` + // UpdateBy string `p:"updateBy" ` + // CreateddAt *gtime.Time `p:"createddAt" ` + // SourceType string `p:"sourceType" ` + Serial string `p:"serial" dc:"国标号"` + Code string `p:"code" dc:"通道号" ` + // Flv string `p:"flv" ` + // Hls string `p:"hls" ` + // Share string `p:"share" ` + // Rtc string `p:"rtc" ` +} + +// QianqiCameraAddRes 添加操作返回结果 +type QianqiCameraAddRes struct { + commonApi.EmptyRes +} + +type QianqiCameraEditNameAndDetailReq struct { + g.Meta `path:"/editNameAndDetail" tags:"摄像头" method:"put" summary:"摄像头修改名称和坐标详情数据"` + commonApi.Author + CameraName string `p:"cameraName" v:"required#摄像头名称不能为空"` + CameraCode string `p:"cameraCode" v:"required#摄像头编码不能为空"` + Detail shp.Detail `p:"detail" v:"required#摄像头坐标详情不能为空"` +} +type QianqiCameraEditNameAndDetailRes struct { + commonApi.EmptyRes +} + +// QianqiCameraEditReq 视频融合(平移、旋转) +type QianqiCameraEditReq struct { + g.Meta `path:"/edit" tags:"摄像头" method:"put" summary:"视频融合(平移、旋转)"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + Degree shp.Degree `p:"degree" dc:"经度、纬度、高度、旋转值"` +} + +// QianqiCameraEditRes 视频融合(平移、旋转) +type QianqiCameraEditRes struct { + commonApi.EmptyRes +} + +// QianqiCameraGetReq 获取一条数据请求 +type QianqiCameraGetReq struct { + g.Meta `path:"/get" tags:"摄像头" method:"get" summary:"获取摄像头信息"` + commonApi.Author + Id int `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// QianqiCameraGetRes 获取一条数据结果 +type QianqiCameraGetRes struct { + g.Meta `mime:"application/json"` + *model.QianqiCameraInfoRes +} + +// QianqiCameraDeleteReq 删除数据请求 +type QianqiCameraDeleteReq struct { + g.Meta `path:"/delete" tags:"摄像头" method:"delete" summary:"删除摄像头"` + commonApi.Author + Ids []int `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// QianqiCameraDeleteRes 删除数据返回 +type QianqiCameraDeleteRes struct { + commonApi.EmptyRes +} + +// EditCameraReq 摄像头修改(名称、国标、通道) +type EditCameraReq struct { + g.Meta `path:"/cameraEdit" tags:"摄像头" method:"put" summary:"摄像头修改(名称、国标、通道)"` + commonApi.Author + Id int64 `p:"id" dc:"主键ID" v:"required#主键ID不能为空"` + CameraName string `p:"cameraName" dc:"摄像头名称" v:"required#摄像头名称必填"` + Serial string `p:"serial" dc:"国标" v:"required#国标必填"` + Code string `p:"code" dc:"通道" v:"required#通道必填"` +} + +// EditCameraRes 视频融合(平移、旋转) +type EditCameraRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/qianqi_dixing.go b/api/v1/system/qianqi_dixing.go new file mode 100644 index 0000000..59cd6db --- /dev/null +++ b/api/v1/system/qianqi_dixing.go @@ -0,0 +1,92 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-31 11:44:56 +// 生成路径: api/v1/system/qianqi_dixing.go +// 生成人:gfast +// desc:地形相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// QianqiDixingSearchReq 分页请求参数 +type QianqiDixingSearchReq struct { + g.Meta `path:"/list" tags:"地形" method:"get" summary:"地形列表"` + ProjectId string `p:"projectId" v:"required#项目id不能为空"` //项目id + Name string `p:"name"` //名称 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + + commonApi.PageReq + commonApi.Author +} + +// QianqiDixingSearchRes 列表返回结果 +type QianqiDixingSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.QianqiDixingListRes `json:"list"` +} + +// QianqiDixingAddReq 添加操作请求参数 +type QianqiDixingAddReq struct { + g.Meta `path:"/add" tags:"地形" method:"post" summary:"地形添加"` + commonApi.Author + ProjectId string `p:"projectId" ` + //Name string `p:"name" v:"required#名称不能为空"` + //SourceId string `p:"sourceId" ` + //SourcePath string `p:"sourcePath" ` + File []*ghttp.UploadFile `p:"file" ` +} + +// QianqiDixingAddRes 添加操作返回结果 +type QianqiDixingAddRes struct { + commonApi.EmptyRes +} + +// QianqiDixingEditReq 修改操作请求参数 +type QianqiDixingEditReq struct { + g.Meta `path:"/edit" tags:"地形" method:"put" summary:"地形修改"` + commonApi.Author + Id int `p:"id" v:"required#主键ID不能为空"` + //ProjectId string `p:"projectId" ` + Name string `p:"name" v:"required#名称不能为空"` + //SourceId string `p:"sourceId" ` + //SourcePath string `p:"sourcePath" ` +} + +// QianqiDixingEditRes 修改操作返回结果 +type QianqiDixingEditRes struct { + commonApi.EmptyRes +} + +// QianqiDixingGetReq 获取一条数据请求 +type QianqiDixingGetReq struct { + g.Meta `path:"/get" tags:"地形" method:"get" summary:"获取地形信息"` + commonApi.Author + Id int `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// QianqiDixingGetRes 获取一条数据结果 +type QianqiDixingGetRes struct { + g.Meta `mime:"application/json"` + *model.QianqiDixingInfoRes +} + +// QianqiDixingDeleteReq 删除数据请求 +type QianqiDixingDeleteReq struct { + g.Meta `path:"/delete" tags:"地形" method:"delete" summary:"删除地形"` + commonApi.Author + Ids []int `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// QianqiDixingDeleteRes 删除数据返回 +type QianqiDixingDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/qianqi_dxf.go b/api/v1/system/qianqi_dxf.go new file mode 100644 index 0000000..8d7033a --- /dev/null +++ b/api/v1/system/qianqi_dxf.go @@ -0,0 +1,139 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-31 11:20:54 +// 生成路径: api/v1/system/qianqi_fangzhen.go +// 生成人:gfast +// desc:方阵相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" +) + +type DxfGetReq struct { + g.Meta `path:"/dxfGetReq" tags:"dxf" method:"post" summary:"dxf得到json"` + commonApi.Author +} +type DxfGetRes struct { + commonApi.EmptyRes +} + +type DxfDataReq struct { + g.Meta `path:"/dxfDataReq" tags:"dxf" method:"post" summary:"json数据"` + commonApi.Author +} +type DxfDataRes struct { + commonApi.EmptyRes + Map map[string]interface{} `p:"map" ` +} + +// 方阵 +type FzReq struct { + g.Meta `path:"/fz" tags:"dxf" method:"post" summary:"方正数据新增"` + commonApi.Author + Point []FacGeoJsonByPoint `p:"point" dc:"名称"` + Plane []FacGeoJsonByPlane `p:"plane" dc:"经纬度"` + ProjectId string `p:"projectId" v:"required#项目id不能为空"` + SubProjectId string `p:"subProjectId" v:"required#子项目id不能为空"` +} +type FzRes struct { + commonApi.EmptyRes +} + +// 光伏板 +type GfbReq struct { + g.Meta `path:"/gfb" tags:"dxf" method:"post" summary:"光伏板新增"` + commonApi.Author + Point []FacGeoJsonByPoint `p:"point" dc:"名称"` + Plane []FacGeoJsonByPlane `p:"plane" dc:"经纬度"` + ProjectId string `p:"projectId" v:"required#项目id不能为空"` + SubProjectId string `p:"subProjectId" v:"required#子项目id不能为空"` +} +type GfbRes struct { + commonApi.EmptyRes +} + +// 逆变器 +type NbqReq struct { + g.Meta `path:"/nbq" tags:"dxf" method:"post" summary:"逆变器新增"` + commonApi.Author + Point []FacGeoJsonByPoint `p:"point" dc:"名称"` + Plane []FacGeoJsonByPoint `p:"plane" dc:"经纬度"` + ProjectId string `p:"projectId" v:"required#项目id不能为空"` + SubProjectId string `p:"subProjectId" v:"required#子项目id不能为空"` +} +type NbqRes struct { + commonApi.EmptyRes +} + +// 箱变 +type XbReq struct { + g.Meta `path:"/xb" tags:"dxf" method:"post" summary:"箱变新增"` + commonApi.Author + Point []FacGeoJsonByPoint `p:"point" dc:"名称"` + Plane []FacGeoJsonByPoint `p:"plane" dc:"经纬度"` + ProjectId string `p:"projectId" v:"required#项目id不能为空"` + SubProjectId string `p:"subProjectId" v:"required#子项目id不能为空"` +} +type XbRes struct { + commonApi.EmptyRes +} + +// 桩点、立柱、支架 +type ZdReq struct { + g.Meta `path:"/zd" tags:"dxf" method:"post" summary:"桩点、立柱、支架新增"` + commonApi.Author + Plane []FacGeoJsonByPoint `p:"plane" dc:"经纬度"` + ProjectId string `p:"projectId" v:"required#项目id不能为空"` + SubProjectid string `p:"subprojectid" v:"required#子项目id不能为空"` +} +type ZdRes struct { + commonApi.EmptyRes +} + +//公共结构体 + +type FacGeoJsonByPlane struct { + Name string `json:"name"` + Type string `json:"type"` + Features []FacFeatureByPlane `json:"features"` +} + +type FacFeatureByPlane struct { + Type string `json:"type"` + Geometry FacGeometryByPlane `json:"geometry"` + Properties FacProperties `json:"properties"` +} + +type FacGeometryByPlane struct { + Type string `json:"type"` + Coordinates [][][]float64 `json:"coordinates"` + ID int64 `json:"id"` +} + +type FacGeoJsonByPoint struct { + Name string `json:"name"` + Type string `json:"type"` + Features []FacFeatureByPoint `json:"features"` +} + +type FacFeatureByPoint struct { + Type string `json:"type"` + Geometry FacGeometryByPoint `json:"geometry"` + Properties FacProperties `json:"properties"` +} + +type FacGeometryByPoint struct { + Type string `json:"type"` + Coordinates []float64 `json:"coordinates"` + ID int64 `json:"id"` +} + +type FacProperties struct { + Type string `json:"type"` + Text string `json:"text"` +} diff --git a/api/v1/system/qianqi_fangzhen.go b/api/v1/system/qianqi_fangzhen.go new file mode 100644 index 0000000..79f970b --- /dev/null +++ b/api/v1/system/qianqi_fangzhen.go @@ -0,0 +1,150 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-31 11:20:54 +// 生成路径: api/v1/system/qianqi_fangzhen.go +// 生成人:gfast +// desc:方阵相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/api/v1/common/shp" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// QianqiFangzhenSearchReq 分页请求参数 +type QianqiFangzhenSearchReq struct { + g.Meta `path:"/list" tags:"方阵" method:"get" summary:"方阵列表"` + ProjectId string `p:"projectId" v:"required#项目id不能为空"` // 项目id + Name string `p:"name"` // 名称 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` // 创建时间 + + commonApi.PageReq + commonApi.Author +} + +// QianqiFangzhenSearchRes 列表返回结果 +type QianqiFangzhenSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.QianqiFangzhenListRes `json:"list"` +} + +// QianqiFangzhenAddReq 添加操作请求参数 + +type QianqiFangzhenAddReq struct { + g.Meta `path:"/add" tags:"方阵" method:"post" summary:"方阵添加"` + commonApi.Author + ProjectId string `p:"projectId" v:"required#项目id不能为空"` + // Name string `p:"name" ` + // SourceId string `p:"sourceId" ` + // SourcePath string `p:"sourcePath" ` + XiangbianId string `p:"xiangbianId" ` + File []*ghttp.UploadFile `p:"file" ` +} + +//// QianqiFangzhenAddReq 添加操作请求参数 +//type QianqiFangzhenAddReq struct { +// g.Meta `path:"/add" tags:"方阵" method:"post" summary:"方阵添加"` +// commonApi.Author +// ProjectId string `p:"projectId" v:"required#项目id不能为空"` +// XiangbianId string `p:"xiangbianId" ` +// FilePath string `p:"filePath" ` +//} + +// QianqiFangzhenAddRes 添加操作返回结果 +type QianqiFangzhenAddRes struct { + commonApi.EmptyRes +} + +// QianqiFangzhenEditReq 修改操作请求参数 +type QianqiFangzhenEditReq struct { + g.Meta `path:"/edit" tags:"方阵" method:"put" summary:"方阵修改"` + commonApi.Author + Name string `p:"name" ` + SourceId string `p:"sourceId"` + Detail string `json:"detail"` +} + +// QianqiFangzhenEditRes 修改操作返回结果 +type QianqiFangzhenEditRes struct { + commonApi.EmptyRes +} + +// QianqiFangzhenGetReq 获取一条数据请求 +type QianqiFangzhenGetReq struct { + g.Meta `path:"/get" tags:"方阵" method:"get" summary:"获取方阵信息"` + commonApi.Author + Id int `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// QianqiFangzhenGetRes 获取一条数据结果 +type QianqiFangzhenGetRes struct { + g.Meta `mime:"application/json"` + *model.QianqiFangzhenInfoRes +} + +// QianqiFangzhenDeleteReq 删除数据请求 +type QianqiFangzhenDeleteReq struct { + g.Meta `path:"/delete" tags:"方阵" method:"delete" summary:"删除方阵"` + commonApi.Author + Ids []int `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// QianqiFangzhenDeleteRes 删除数据返回 +type QianqiFangzhenDeleteRes struct { + commonApi.EmptyRes +} + +type QianqiFangzhenEditDetailReq struct { + g.Meta `path:"/edit_detail" tags:"方阵" method:"put" summary:"方阵修改坐标高程信息"` + commonApi.Author + Detail shp.Polyline `json:"detail"` + SourceId string `p:"sourceId" v:"required#资源id必须"` +} +type QianqiFangzhenEditDetailRes struct { + commonApi.EmptyRes +} + +type QianqiFangzhenAddDeviceReq struct { + g.Meta `path:"/add_device" tags:"方阵" method:"post" summary:"方阵与其施工设备关联"` + commonApi.Author + // 方阵id + FangzhenId string `p:"fangzhenId" v:"required#方阵id不能为空"` +} + +type QianqiFangzhenAddDeviceRes struct { + commonApi.EmptyRes +} + +type Component struct { + Name string // 子设备名 + IsPercentage *int // 是否百分比 + Quantity int // 数量 + TypeNumber int +} + +type FacilityGroup struct { + Name string + FacilityCount *int + IsPercentage *int // 是否百分比 + TypeNumber int + Components []Component +} + +// 传入方阵的主键ID 并将其 ViewName 更新到表中 +type QianqiFangzhenUpdateViewNameReq struct { + g.Meta `path:"/updateView" tags:"方阵" method:"put" summary:"更新方阵的ViewName"` + commonApi.Author + Id int `p:"id" dc:"方阵的ID" v:"required#缺少方阵的主键ID"` // 方阵的主键ID + View string `p:"view" dc:"view的名字" v:"required#缺少方阵的ViewName"` // 方阵的ViewName +} + +type QianqiFangzhenUpdateViewNameRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/qianqi_guangfuban.go b/api/v1/system/qianqi_guangfuban.go new file mode 100644 index 0000000..38d1c29 --- /dev/null +++ b/api/v1/system/qianqi_guangfuban.go @@ -0,0 +1,158 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-31 11:31:49 +// 生成路径: api/v1/system/qianqi_guangfuban.go +// 生成人:gfast +// desc:光伏板模型相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// QianqiGuangfubanSearchReq 分页请求参数 +type QianqiGuangfubanSearchReq struct { + g.Meta `path:"/list" tags:"光伏板模型" method:"get" summary:"光伏板模型列表"` + ProjectId string `p:"projectId" v:"required#项目id不能为空"` //项目id + Name string `p:"name"` //倾斜模型 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// QianqiGuangfubanSearchRes 列表返回结果 +type QianqiGuangfubanSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.QianqiGuangfubanListRes `json:"list"` +} + +// QianqiGuangfubanAddReq 添加操作请求参数 +type QianqiGuangfubanAddReq struct { + g.Meta `path:"/add" tags:"光伏板模型" method:"post" summary:"光伏板模型添加"` + commonApi.Author + ProjectId string `p:"projectId" v:"required#项目id不能为空"` + //Name string `p:"name" v:"required#倾斜模型不能为空"` + //SourcePath string `p:"sourcePath" ` + //SourceId string `p:"sourceId" ` + Detail string `p:"detail" ` + File *ghttp.UploadFile `p:"file" ` +} + +// QianqiGuangfubanAddRes 添加操作返回结果 +type QianqiGuangfubanAddRes struct { + commonApi.EmptyRes +} + +// QianqiGuangfubanEditReq 修改操作请求参数 +type QianqiGuangfubanEditReq struct { + g.Meta `path:"/edit" tags:"光伏板模型" method:"put" summary:"光伏板模型修改"` + commonApi.Author + Id int `p:"id" v:"required#主键ID不能为空"` + Name string `p:"name" v:"required#倾斜模型不能为空"` + Detail string `p:"detail" ` +} + +// QianqiGuangfubanEditRes 修改操作返回结果 +type QianqiGuangfubanEditRes struct { + commonApi.EmptyRes +} + +// QianqiGuangfubanGetReq 获取一条数据请求 +type QianqiGuangfubanGetReq struct { + g.Meta `path:"/get" tags:"光伏板模型" method:"get" summary:"获取光伏板模型信息"` + commonApi.Author + Id int `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// QianqiGuangfubanGetRes 获取一条数据结果 +type QianqiGuangfubanGetRes struct { + g.Meta `mime:"application/json"` + *model.QianqiGuangfubanInfoRes +} + +// QianqiGuangfubanDeleteReq 删除数据请求 +type QianqiGuangfubanDeleteReq struct { + g.Meta `path:"/delete" tags:"光伏板模型" method:"delete" summary:"删除光伏板模型"` + commonApi.Author + //Ids []int `p:"ids" v:"required#主键必须"` //通过主键删除 + SourceIDs []string `p:"sourceIDs" v:"required"` //通过主键删除 +} + +// QianqiGuangfubanDeleteRes 删除数据返回 +type QianqiGuangfubanDeleteRes struct { + commonApi.EmptyRes +} + +// // UploadFileBimReq 文件上传 +// +// type UploadFileBimReq struct { +// g.Meta `path:"/gfbUploadFile" tags:"光伏板模型" method:"post" summary:"上传文件"` +// commonApi.Author +// File *ghttp.UploadFile `p:"file" ` +// } +// +// type UploadFileBimRes struct { +// commonApi.EmptyRes +// FileName string `p:"fileName" ` +// FilePath string `p:"filePath" ` +// } +// +// QianqiGuangfubanImportZuchuanReq 添加操作请求参数 +type QianqiGuangfubanImportZuchuanReq struct { + g.Meta `path:"/zuchuan/import" tags:"光伏板模型" method:"post" summary:"给光伏板模型导入对应的组串数据,shp文件"` + commonApi.Author + SourceId string `p:"sourceId" v:"required#资源id不能为空" ` + ProjectId string `p:"projectId" v:"required#项目id不能为空"` + File []*ghttp.UploadFile `p:"file" ` +} + +// QianqiGuangfubanImportZuchuanRes 添加操作返回结果 +type QianqiGuangfubanImportZuchuanRes struct { + commonApi.EmptyRes +} + +// QianqiGuangfubanAddReq 添加操作请求参数 +type QianqiGuangfubanCalZuchuanReq struct { + g.Meta `path:"/zuchuan/caculate" tags:"光伏板模型" method:"post" summary:"根据光伏板内部的scenetree.json中的数据和组串shp进行计算每个光伏板对应的组串编号"` + commonApi.Author + SourceId string `p:"sourceId" v:"required#资源id不能为空" ` +} + +// QianqiGuangfubanAddRes 添加操作返回结果 +type QianqiGuangfubanCalZuchuanRes struct { + commonApi.EmptyRes +} + +// CorrectFuncReq 光伏板数据纠正 +type CorrectFuncReq struct { + g.Meta `path:"/correct" tags:"光伏板模型" method:"post" summary:"光伏板数据纠正"` + commonApi.Author + GuangfubanSourceId string `p:"guangfubanSourceId" dc:"光伏板资源id" v:"required#光伏板资源id不能为空"` + GuangfubanData string `p:"guangfubanData" dc:"光伏板数据"` +} + +// CorrectFuncRes 修改操作返回结果 +type CorrectFuncRes struct { + commonApi.EmptyRes +} + +// CorrectQueryFuncReq 光伏板数据纠正查询 +type CorrectQueryFuncReq struct { + g.Meta `path:"/correctQuery" tags:"光伏板模型" method:"post" summary:"光伏板数据纠正查询"` + commonApi.Author + GuangfubanSourceId string `p:"guangfubanSourceId" dc:"光伏板资源ID" v:"required#光伏板资源id不能为空"` +} + +// CorrectQueryFuncRes 光伏板数据纠正查询操作返回结果 +type CorrectQueryFuncRes struct { + commonApi.EmptyRes + GuangfubanSourceId string `json:"guangfubanSourceId" dc:"光伏板资源ID"` + GuangfubanData string `json:"guangfubanData" dc:"光伏板数据纠正"` +} diff --git a/api/v1/system/qianqi_guangfuban_ids.go b/api/v1/system/qianqi_guangfuban_ids.go new file mode 100644 index 0000000..1498491 --- /dev/null +++ b/api/v1/system/qianqi_guangfuban_ids.go @@ -0,0 +1,102 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-05 16:00:23 +// 生成路径: api/v1/system/qianqi_guangfuban_ids.go +// 生成人:gfast +// desc:光伏板模型的id相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// QianqiGuangfubanIdsSearchReq 分页请求参数 +type QianqiGuangfubanIdsSearchReq struct { + g.Meta `path:"/list" tags:"光伏板模型的id" method:"get" summary:"光伏板模型的id列表"` + ProjectId string `p:"projectId" v:"required#项目id不能为空"` //项目id + Name string `p:"name"` //倾斜模型 + commonApi.PageReq + commonApi.Author +} + +// QianqiGuangfubanIdsSearchRes 列表返回结果 +type QianqiGuangfubanIdsSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + //List []*model.QianqiGuangfubanIdsListRes `json:"list"` + List []*model.Nibianqi `json:"list"` +} + +// QianqiGuangfubanIdsAddReq 添加操作请求参数 +type QianqiGuangfubanIdsAddReq struct { + g.Meta `path:"/add" tags:"光伏板模型的id" method:"post" summary:"光伏板模型的id添加"` + commonApi.Author + Name string `p:"name" v:"required#名称不能为空"` + DevId string `p:"devId" ` + DevType int `p:"devType" ` + CreateBy string `p:"createBy" ` + UpdateBy string `p:"updateBy" ` + SourceType string `p:"sourceType" ` + SourceId string `p:"sourceId" ` + ProjectId string `p:"projectId" ` +} + +// QianqiGuangfubanIdsAddRes 添加操作返回结果 +type QianqiGuangfubanIdsAddRes struct { + commonApi.EmptyRes +} + +// QianqiGuangfubanIdsEditReq 修改操作请求参数 +type QianqiGuangfubanIdsEditReq struct { + g.Meta `path:"/edit" tags:"光伏板模型的id" method:"put" summary:"光伏板模型的id修改"` + commonApi.Author + //Id int `p:"id" v:"required#主键ID不能为空"` + //Name string `p:"name" v:"required#名称不能为空"` + //DevId string `p:"devId" ` + //DevType int `p:"devType" ` + //CreateBy string `p:"createBy" ` + //UpdateBy string `p:"updateBy" ` + //SourceType string `p:"sourceType" ` + SourceId string `p:"sourceId" v:"required#资源ID不能为空"` + Range string `p:"range" ` + //ProjectId string `p:"projectId" ` +} + +// QianqiGuangfubanIdsEditRes 修改操作返回结果 +type QianqiGuangfubanIdsEditRes struct { + commonApi.EmptyRes +} + +// QianqiGuangfubanIdsGetReq 获取一条数据请求 +type QianqiGuangfubanIdsGetReq struct { + g.Meta `path:"/get" tags:"光伏板模型的id" method:"get" summary:"获取光伏板模型的id信息"` + commonApi.Author + Id string `p:"id" v:"required#主键必须"` //通过主键获取 + Total bool `json:"total"` + commonApi.PageReq +} + +// QianqiGuangfubanIdsGetRes 获取一条数据结果 +type QianqiGuangfubanIdsGetRes struct { + g.Meta `mime:"application/json"` + //QianqiGuangfubanIdsInfoRes []*model.QianqiGuangfubanIdsInfoRes `json:"list"` + commonApi.ListRes + List []*model.QianqiGuangfubanIdsInfoRes `json:"list"` +} + +// QianqiGuangfubanIdsDeleteReq 删除数据请求 +type QianqiGuangfubanIdsDeleteReq struct { + g.Meta `path:"/delete" tags:"光伏板模型的id" method:"delete" summary:"删除光伏板模型的id"` + commonApi.Author + Ids []int `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// QianqiGuangfubanIdsDeleteRes 删除数据返回 +type QianqiGuangfubanIdsDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/qianqi_guangfuban_ids_lizhu.go b/api/v1/system/qianqi_guangfuban_ids_lizhu.go new file mode 100644 index 0000000..226a33b --- /dev/null +++ b/api/v1/system/qianqi_guangfuban_ids_lizhu.go @@ -0,0 +1,139 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-09-05 12:10:40 +// 生成路径: api/v1/system/qianqi_guangfuban_ids_lizhu.go +// 生成人:gfast +// desc:光伏板立柱相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// FlowListReq 分页请求参数 +type FlowListReq struct { + g.Meta `path:"/flowList" tags:"光伏板立柱" method:"get" summary:"流程图光伏板立柱列表"` + ProjectId string `p:"projectId" v:"required#项目id不能为空"` // 项目id + commonApi.PageReq + commonApi.Author + commonApi.Paging +} + +// GisListLizhuReq 分页请求参数 +type GisListLizhuReq struct { + g.Meta `path:"/gisListLizhu" tags:"光伏板立柱" method:"get" summary:"GIS云图光伏板立柱列表"` + ProjectId string `p:"projectId" dc:"大项目ID"` // 项目id + FangZhenID string `p:"fangZhenID" dc:"方阵ID"` // 方阵ID + commonApi.PageReq + commonApi.Author + commonApi.Paging +} + +// GisListLizhuRes 列表返回结果 +type GisListLizhuRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.QianqiGuangfubanIdsLizhuListRes `json:"list"` +} + +// QianqiGuangfubanIdsLizhuSearchReq 分页请求参数 +type QianqiGuangfubanIdsLizhuSearchReq struct { + g.Meta `path:"/list" tags:"光伏板立柱" method:"get" summary:"光伏板立柱列表"` + Id string `p:"id"` // + Name string `p:"name"` // 名称 + CreateBy string `p:"createBy"` // 创建人 + UpdateBy string `p:"updateBy"` // 更新人 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` // 创建时间 + SourceType string `p:"sourceType"` // + SourceId string `p:"sourceId"` // 资源id + ProjectId string `p:"projectId" v:"required#项目id不能为空"` // 项目id + Status string `p:"status" v:"status@integer#状态:0:未完成;1:计划中;2:已完成需为整数"` // 状态:0:未完成;1:计划中;2:已完成 + commonApi.PageReq + commonApi.Author +} + +// QianqiGuangfubanIdsLizhuSearchRes 列表返回结果 +type QianqiGuangfubanIdsLizhuSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.QianqiGuangfubanIdsLizhuListRes `json:"list"` +} + +// QianqiGuangfubanIdsLizhuAddReq 添加操作请求参数 +type QianqiGuangfubanIdsLizhuAddReq struct { + g.Meta `path:"/add" tags:"光伏板立柱" method:"post" summary:"光伏板立柱添加"` + commonApi.Author + Name string `p:"name" v:"required#名称不能为空"` + CreateBy string `p:"createBy" ` + UpdateBy string `p:"updateBy" ` + SourceType string `p:"sourceType" ` + SourceId string `p:"sourceId" ` + ProjectId string `p:"projectId" ` + Status int `p:"status" v:"required#状态:0:未完成;1:计划中;2:已完成不能为空"` +} + +// QianqiGuangfubanIdsLizhuAddRes 添加操作返回结果 +type QianqiGuangfubanIdsLizhuAddRes struct { + commonApi.EmptyRes +} + +// QianqiGuangfubanIdsLizhuEditReq 修改操作请求参数 +type QianqiGuangfubanIdsLizhuEditReq struct { + g.Meta `path:"/edit" tags:"光伏板立柱" method:"put" summary:"光伏板立柱修改"` + commonApi.Author + Id int `p:"id" v:"required#主键ID不能为空"` + Name string `p:"name" v:"required#名称不能为空"` + CreateBy string `p:"createBy" ` + UpdateBy string `p:"updateBy" ` + SourceType string `p:"sourceType" ` + SourceId string `p:"sourceId" ` + ProjectId string `p:"projectId" ` + Status int `p:"status" v:"required#状态:0:未完成;1:计划中;2:已完成不能为空"` +} + +// QianqiGuangfubanIdsLizhuEditRes 修改操作返回结果 +type QianqiGuangfubanIdsLizhuEditRes struct { + commonApi.EmptyRes +} + +// QianqiGuangfubanIdsLizhuGetReq 获取一条数据请求 +type QianqiGuangfubanIdsLizhuGetReq struct { + g.Meta `path:"/get" tags:"光伏板立柱" method:"get" summary:"获取光伏板立柱信息"` + commonApi.Author + Id int `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// QianqiGuangfubanIdsLizhuGetRes 获取一条数据结果 +type QianqiGuangfubanIdsLizhuGetRes struct { + g.Meta `mime:"application/json"` + *model.QianqiGuangfubanIdsLizhuInfoRes +} + +// QianqiGuangfubanIdsLizhuDeleteReq 删除数据请求 +type QianqiGuangfubanIdsLizhuDeleteReq struct { + g.Meta `path:"/delete" tags:"光伏板立柱" method:"delete" summary:"删除光伏板立柱"` + commonApi.Author + Ids []int `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// QianqiGuangfubanIdsLizhuDeleteRes 删除数据返回 +type QianqiGuangfubanIdsLizhuDeleteRes struct { + commonApi.EmptyRes +} + +// BooleanValueEditReq 对立柱高度进行减 +type BooleanValueEditReq struct { + g.Meta `path:"/edit" tags:"光伏板立柱" method:"put" summary:"对立柱高度进行加减"` + commonApi.Author + ProjectId string `p:"projectId" v:"required#项目id不能为空"` +} + +// BooleanValueEditRes 对立柱高度进行减 +type BooleanValueEditRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/qianqi_guangfuban_ids_zhijia.go b/api/v1/system/qianqi_guangfuban_ids_zhijia.go new file mode 100644 index 0000000..4658627 --- /dev/null +++ b/api/v1/system/qianqi_guangfuban_ids_zhijia.go @@ -0,0 +1,181 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-09-05 12:10:51 +// 生成路径: api/v1/system/qianqi_guangfuban_ids_zhijia.go +// 生成人:gfast +// desc:光伏板支架相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gmeta" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// FlowZhijiaReq 分页请求参数 +type FlowZhijiaReq struct { + g.Meta `path:"/flowZhijia" tags:"光伏板支架" method:"get" summary:"流程图支架列表"` + ProjectId string `p:"projectId" v:"required#项目id不能为空"` // 项目id + commonApi.PageReq + commonApi.Author + commonApi.Paging +} + +// GisZhijiaReq 分页请求参数 +type GisZhijiaReq struct { + g.Meta `path:"/gisListZhijia" tags:"光伏板支架" method:"get" summary:"GIS云图光伏板支架列表"` + ProjectId string `p:"projectId" ` // 项目id + FangZhenID string `p:"fangZhenID" ` // 方阵ID + commonApi.PageReq + commonApi.Author + commonApi.Paging +} + +// GisZhijiaRes 列表返回结果 +type GisZhijiaRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.QianqiGuangfubanIdsZhijiaListRes `json:"list"` +} + +// QianqiGuangfubanIdsZhijiaSearchReq 分页请求参数 +type QianqiGuangfubanIdsZhijiaSearchReq struct { + g.Meta `path:"/list" tags:"光伏板支架" method:"get" summary:"光伏板支架列表"` + Id string `p:"id"` // + Name string `p:"name"` // 名称 + CreateBy string `p:"createBy"` // 创建人 + UpdateBy string `p:"updateBy"` // 更新人 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` // 创建时间 + SourceType string `p:"sourceType"` // + SourceId string `p:"sourceId"` // 资源id + ProjectId string `p:"projectId" v:"required#项目id不能为空"` // 项目id + Status string `p:"status" v:"status@integer#状态:0:未完成;1:计划中;2:已完成需为整数"` // 状态:0:未完成;1:计划中;2:已完成 + commonApi.PageReq + commonApi.Author +} + +// QianqiGuangfubanIdsZhijiaSearchRes 列表返回结果 +type QianqiGuangfubanIdsZhijiaSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.QianqiGuangfubanIdsZhijiaListRes `json:"list"` +} + +// QianqiGuangfubanIdsZhijiaAddReq 添加操作请求参数 +type QianqiGuangfubanIdsZhijiaAddReq struct { + g.Meta `path:"/add" tags:"光伏板支架" method:"post" summary:"光伏板支架添加"` + commonApi.Author + Name string `p:"name" v:"required#名称不能为空"` + CreateBy string `p:"createBy" ` + UpdateBy string `p:"updateBy" ` + SourceType string `p:"sourceType" ` + SourceId string `p:"sourceId" ` + ProjectId string `p:"projectId" ` + Status int `p:"status" v:"required#状态:0:未完成;1:计划中;2:已完成不能为空"` +} + +// QianqiGuangfubanIdsZhijiaAddRes 添加操作返回结果 +type QianqiGuangfubanIdsZhijiaAddRes struct { + commonApi.EmptyRes +} + +// QianqiGuangfubanIdsZhijiaEditReq 修改操作请求参数 +type QianqiGuangfubanIdsZhijiaEditReq struct { + g.Meta `path:"/edit" tags:"光伏板支架" method:"put" summary:"光伏板支架修改"` + commonApi.Author + Id int `p:"id" v:"required#主键ID不能为空"` + Name string `p:"name" v:"required#名称不能为空"` + CreateBy string `p:"createBy" ` + UpdateBy string `p:"updateBy" ` + SourceType string `p:"sourceType" ` + SourceId string `p:"sourceId" ` + ProjectId string `p:"projectId" ` + Status int `p:"status" v:"required#状态:0:未完成;1:计划中;2:已完成不能为空"` +} + +// QianqiGuangfubanIdsZhijiaEditRes 修改操作返回结果 +type QianqiGuangfubanIdsZhijiaEditRes struct { + commonApi.EmptyRes +} + +// QianqiGuangfubanIdsZhijiaGetReq 获取一条数据请求 +type QianqiGuangfubanIdsZhijiaGetReq struct { + g.Meta `path:"/get" tags:"光伏板支架" method:"get" summary:"获取光伏板支架信息"` + commonApi.Author + Id int `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// QianqiGuangfubanIdsZhijiaGetRes 获取一条数据结果 +type QianqiGuangfubanIdsZhijiaGetRes struct { + g.Meta `mime:"application/json"` + *model.QianqiGuangfubanIdsZhijiaInfoRes +} + +// QianqiGuangfubanIdsZhijiaDeleteReq 删除数据请求 +type QianqiGuangfubanIdsZhijiaDeleteReq struct { + g.Meta `path:"/delete" tags:"光伏板支架" method:"delete" summary:"删除光伏板支架"` + commonApi.Author + Ids []int `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// QianqiGuangfubanIdsZhijiaDeleteRes 删除数据返回 +type QianqiGuangfubanIdsZhijiaDeleteRes struct { + commonApi.EmptyRes +} + +type QianqiGuangfubanIdsZhijiaDetailReq struct { + g.Meta `path:"/edit_detail" tags:"光伏板支架" method:"put" summary:"光伏板立柱修改坐标高程信息(修改高程+存储预警值)"` + commonApi.Author + List []Zhuangdian `json:"list"` + ProjectId string `p:"projectId" v:"required#项目id必须"` +} +type QianqiGuangfubanIdsZhijiaDetailRes struct { + commonApi.EmptyRes +} + +type PrewarningValueReq struct { + g.Meta `path:"/prewarningValue" tags:"光伏板支架" method:"put" summary:"获取立柱的预警(树形结构)"` + commonApi.Author + ProjectId string `p:"projectId" v:"required#项目id必须"` + SourceType string `p:"sourceType" dc:"资源类型"` +} +type PrewarningValueRes struct { + commonApi.EmptyRes + List []*PrewarningValueEntity `json:"list"` +} + +// 1、定义主目录 +// 2、定义子目录 +// 3、定义组合目录 +type PrewarningValueEntity struct { + gmeta.Meta `orm:"table:qianqi_warning"` + NameStr string `json:"nameStr" dc:"祖串名称"` + // WarningList []*WarningEntity `json:"warningList"` + WarningEntity []*WarningEntity `json:"warningEntity" orm:"with:name_one=nameStr"` +} + +type WarningEntity struct { + gmeta.Meta `orm:"table:qianqi_warning"` + Id string `json:"id" dc:"资源类型"` + NameOne string `json:"nameOne" dc:"祖串名称"` + NameTwo string `json:"nameTwo" dc:"名称"` + SourceType string `json:"sourceType" dc:"资源类型"` + SourceId string `json:"sourceId" dc:"资源id"` + ProjectId string `json:"projectId" dc:"项目id"` + Detail string `json:"detail" dc:"坐标信息"` +} + +type QueryDetailsReq struct { + g.Meta `path:"/queryDetails" tags:"光伏板支架" method:"put" summary:"获取立柱的预警(组串)"` + commonApi.Author + Name string `p:"name" v:"required#组串名必须"` + ProjectId string `p:"projectId" v:"required#项目id必须"` +} +type QueryDetailsRes struct { + commonApi.EmptyRes + List []*Zhuangdian `json:"list"` +} diff --git a/api/v1/system/qianqi_guangfuban_ids_zhuangdian.go b/api/v1/system/qianqi_guangfuban_ids_zhuangdian.go new file mode 100644 index 0000000..7c153e0 --- /dev/null +++ b/api/v1/system/qianqi_guangfuban_ids_zhuangdian.go @@ -0,0 +1,144 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-09-05 12:07:41 +// 生成路径: api/v1/system/qianqi_guangfuban_ids_zhuangdian.go +// 生成人:gfast +// desc:光伏板桩点相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/api/v1/common/shp" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// FlowZhuangdianReq 分页请求参数 +type FlowZhuangdianReq struct { + g.Meta `path:"/flowZhuangdian" tags:"光伏板桩点" method:"get" summary:"流程图桩点列表"` + ProjectId string `p:"projectId" v:"required#项目id不能为空"` // 项目id + commonApi.PageReq + commonApi.Author + commonApi.Paging +} + +// GisListReq 分页请求参数 +type GisListReq struct { + g.Meta `path:"/gisList" tags:"光伏板桩点" method:"get" summary:"GIS云图光伏板桩点列表"` + ProjectId string `p:"projectId" ` // 项目id + FangZhenID string `p:"fangZhenID" ` // 方阵ID + commonApi.PageReq + commonApi.Author + commonApi.Paging +} + +// GisListRes 列表返回结果 +type GisListRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.QianqiGuangfubanIdsZhuangdianListRes `json:"list"` +} + +// QianqiGuangfubanIdsZhuangdianSearchReq 分页请求参数 +type QianqiGuangfubanIdsZhuangdianSearchReq struct { + g.Meta `path:"/list" tags:"光伏板桩点" method:"get" summary:"光伏板桩点列表"` + Id string `p:"id"` // + Name string `p:"name"` // 名称 + CreateBy string `p:"createBy"` // 创建人 + UpdateBy string `p:"updateBy"` // 更新人 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` // 创建时间 + SourceType string `p:"sourceType"` // + SourceId string `p:"sourceId"` // 资源id + ProjectId string `p:"projectId" v:"required#项目id不能为空"` // 项目id + Status string `p:"status" v:"status@integer#状态:0:未完成;1:计划中;2:已完成需为整数"` // 状态:0:未完成;1:计划中;2:已完成 + Detail string `p:"detail" ` // 状态:0:未完成;1:计划中;2:已完成 + commonApi.PageReq + commonApi.Author +} + +// QianqiGuangfubanIdsZhuangdianSearchRes 列表返回结果 +type QianqiGuangfubanIdsZhuangdianSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.QianqiGuangfubanIdsZhuangdianListRes `json:"list"` +} + +// QianqiGuangfubanIdsZhuangdianAddReq 添加操作请求参数 +type QianqiGuangfubanIdsZhuangdianAddReq struct { + g.Meta `path:"/add" tags:"光伏板桩点" method:"post" summary:"光伏板桩点添加"` + commonApi.Author + ProjectId string `p:"projectId" v:"required#项目id不能为空"` + SubProjectid string `p:"subProjectid" v:"required#子项目id不能为空" dc:"子项目ID" d:"37"` + File []*ghttp.UploadFile `p:"file" ` +} + +// QianqiGuangfubanIdsZhuangdianAddRes 添加操作返回结果 +type QianqiGuangfubanIdsZhuangdianAddRes struct { + commonApi.EmptyRes +} + +// QianqiGuangfubanIdsZhuangdianEditReq 修改操作请求参数 +type QianqiGuangfubanIdsZhuangdianEditReq struct { + g.Meta `path:"/edit" tags:"光伏板桩点" method:"put" summary:"光伏板桩点修改"` + commonApi.Author + Id int `p:"id" v:"required#主键ID不能为空"` + Name string `p:"name" v:"required#名称不能为空"` + CreateBy string `p:"createBy" ` + UpdateBy string `p:"updateBy" ` + SourceType string `p:"sourceType" ` + SourceId string `p:"sourceId" ` + ProjectId string `p:"projectId" ` + Status int `p:"status" v:"required#状态:0:未完成;1:计划中;2:已完成不能为空"` +} + +// QianqiGuangfubanIdsZhuangdianEditRes 修改操作返回结果 +type QianqiGuangfubanIdsZhuangdianEditRes struct { + commonApi.EmptyRes +} +type Zhuangdian struct { + Position shp.Point `json:"position"` + // Name string `json:"name"` +} + +//type Fangzheng struct { +// shp.Polyline +//} + +type QianqiGuangfubanIdsZhuangdianEditDetailReq struct { + g.Meta `path:"/edit_detail" tags:"光伏板桩点" method:"put" summary:"光伏板桩点修改坐标高程信息"` + commonApi.Author + List []Zhuangdian `json:"list"` + ProjectId string `p:"projectId" v:"required#项目id必须"` +} +type QianqiGuangfubanIdsZhuangdianEditDetailRes struct { + commonApi.EmptyRes +} + +// QianqiGuangfubanIdsZhuangdianGetReq 获取一条数据请求 +type QianqiGuangfubanIdsZhuangdianGetReq struct { + g.Meta `path:"/get" tags:"光伏板桩点" method:"get" summary:"获取光伏板桩点信息"` + commonApi.Author + Id int `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// QianqiGuangfubanIdsZhuangdianGetRes 获取一条数据结果 +type QianqiGuangfubanIdsZhuangdianGetRes struct { + g.Meta `mime:"application/json"` + *model.QianqiGuangfubanIdsZhuangdianInfoRes +} + +// QianqiGuangfubanIdsZhuangdianDeleteReq 删除数据请求 +type QianqiGuangfubanIdsZhuangdianDeleteReq struct { + g.Meta `path:"/delete" tags:"光伏板桩点" method:"delete" summary:"删除光伏板桩点"` + commonApi.Author + Ids []int `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// QianqiGuangfubanIdsZhuangdianDeleteRes 删除数据返回 +type QianqiGuangfubanIdsZhuangdianDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/qianqi_guangfuban_zuchuan.go b/api/v1/system/qianqi_guangfuban_zuchuan.go new file mode 100644 index 0000000..c5dd900 --- /dev/null +++ b/api/v1/system/qianqi_guangfuban_zuchuan.go @@ -0,0 +1,101 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-17 10:37:21 +// 生成路径: api/v1/system/qianqi_guangfuban_zuchuan.go +// 生成人:xyb +// desc:组串相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// QianqiGuangfubanZuchuanSearchReq 分页请求参数 +type QianqiGuangfubanZuchuanSearchReq struct { + g.Meta `path:"/list" tags:"组串" method:"get" summary:"组串列表"` + Id string `p:"id"` // + CreateBy string `p:"createBy"` //创建人 + UpdateBy string `p:"updateBy"` //更新人 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + SourceType string `p:"sourceType"` // + SourceId string `p:"sourceId"` //资源id,为project_id拼接上组串编号 + ProjectId string `p:"projectId"` //项目id + ZuchuanId string `p:"zuchuanId"` //组串编号 + GuangfubanId string `p:"guangfubanId"` //光伏板模型的id + commonApi.PageReq + commonApi.Author +} + +// QianqiGuangfubanZuchuanSearchRes 列表返回结果 +type QianqiGuangfubanZuchuanSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.QianqiGuangfubanZuchuanListRes `json:"list"` +} + +// QianqiGuangfubanZuchuanAddReq 添加操作请求参数 +type QianqiGuangfubanZuchuanAddReq struct { + g.Meta `path:"/add" tags:"组串" method:"post" summary:"组串添加"` + commonApi.Author + CreateBy string `p:"createBy" ` + UpdateBy string `p:"updateBy" ` + SourceType string `p:"sourceType" ` + SourceId string `p:"sourceId" ` + ProjectId string `p:"projectId" ` + ZuchuanId string `p:"zuchuanId" v:"required#组串编号不能为空"` + GuangfubanId string `p:"guangfubanId" v:"required#光伏板模型的id不能为空"` +} + +// QianqiGuangfubanZuchuanAddRes 添加操作返回结果 +type QianqiGuangfubanZuchuanAddRes struct { + commonApi.EmptyRes +} + +// QianqiGuangfubanZuchuanEditReq 修改操作请求参数 +type QianqiGuangfubanZuchuanEditReq struct { + g.Meta `path:"/edit" tags:"组串" method:"put" summary:"组串修改"` + commonApi.Author + Id int `p:"id" v:"required#主键ID不能为空"` + CreateBy string `p:"createBy" ` + UpdateBy string `p:"updateBy" ` + SourceType string `p:"sourceType" ` + SourceId string `p:"sourceId" ` + ProjectId string `p:"projectId" ` + ZuchuanId string `p:"zuchuanId" v:"required#组串编号不能为空"` + GuangfubanId string `p:"guangfubanId" v:"required#光伏板模型的id不能为空"` +} + +// QianqiGuangfubanZuchuanEditRes 修改操作返回结果 +type QianqiGuangfubanZuchuanEditRes struct { + commonApi.EmptyRes +} + +// QianqiGuangfubanZuchuanGetReq 获取一条数据请求 +type QianqiGuangfubanZuchuanGetReq struct { + g.Meta `path:"/get" tags:"组串" method:"get" summary:"获取组串信息"` + commonApi.Author + Id int `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// QianqiGuangfubanZuchuanGetRes 获取一条数据结果 +type QianqiGuangfubanZuchuanGetRes struct { + g.Meta `mime:"application/json"` + *model.QianqiGuangfubanZuchuanInfoRes +} + +// QianqiGuangfubanZuchuanDeleteReq 删除数据请求 +type QianqiGuangfubanZuchuanDeleteReq struct { + g.Meta `path:"/delete" tags:"组串" method:"delete" summary:"删除组串"` + commonApi.Author + Ids []int `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// QianqiGuangfubanZuchuanDeleteRes 删除数据返回 +type QianqiGuangfubanZuchuanDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/qianqi_jidianxianlu.go b/api/v1/system/qianqi_jidianxianlu.go new file mode 100644 index 0000000..d0cd265 --- /dev/null +++ b/api/v1/system/qianqi_jidianxianlu.go @@ -0,0 +1,91 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-04 16:29:44 +// 生成路径: api/v1/system/qianqi_jidianxianlu.go +// 生成人:gfast +// desc:集电线路相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// QianqiJidianxianluSearchReq 分页请求参数 +type QianqiJidianxianluSearchReq struct { + g.Meta `path:"/list" tags:"集电线路" method:"get" summary:"集电线路列表"` + Id string `p:"id"` //序号 + ProjectId string `p:"projectId"` //项目id + Name string `p:"name"` //线路名称 + SourceId string `p:"sourceId"` //资源id + SourcePath string `p:"sourcePath"` //资源路径 + CreateBy string `p:"createBy"` //创建人 + UpdateBy string `p:"updateBy"` //更新人 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + SourceType string `p:"sourceType"` //资源类型 + commonApi.PageReq + commonApi.Author +} + +// QianqiJidianxianluSearchRes 列表返回结果 +type QianqiJidianxianluSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.QianqiJidianxianluListRes `json:"list"` +} + +// QianqiJidianxianluAddReq 添加操作请求参数 +type QianqiJidianxianluAddReq struct { + g.Meta `path:"/add" tags:"集电线路" method:"post" summary:"集电线路添加"` + commonApi.Author + ProjectId string `p:"projectId" v:"required#项目id不能为空"` + File []*ghttp.UploadFile `p:"file" ` +} + +// QianqiJidianxianluAddRes 添加操作返回结果 +type QianqiJidianxianluAddRes struct { + commonApi.EmptyRes +} + +// QianqiJidianxianluEditReq 修改操作请求参数 +type QianqiJidianxianluEditReq struct { + g.Meta `path:"/edit" tags:"集电线路" method:"put" summary:"集电线路修改"` + commonApi.Author + Id int `p:"id" v:"required#主键ID不能为空"` + Name string `p:"name" v:"required#线路名称不能为空"` +} + +// QianqiJidianxianluEditRes 修改操作返回结果 +type QianqiJidianxianluEditRes struct { + commonApi.EmptyRes +} + +// QianqiJidianxianluGetReq 获取一条数据请求 +type QianqiJidianxianluGetReq struct { + g.Meta `path:"/get" tags:"集电线路" method:"get" summary:"获取集电线路信息"` + commonApi.Author + Id int `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// QianqiJidianxianluGetRes 获取一条数据结果 +type QianqiJidianxianluGetRes struct { + g.Meta `mime:"application/json"` + *model.QianqiJidianxianluInfoRes +} + +// QianqiJidianxianluDeleteReq 删除数据请求 +type QianqiJidianxianluDeleteReq struct { + g.Meta `path:"/delete" tags:"集电线路" method:"delete" summary:"删除集电线路"` + commonApi.Author + Ids []int `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// QianqiJidianxianluDeleteRes 删除数据返回 +type QianqiJidianxianluDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/qianqi_moxing.go b/api/v1/system/qianqi_moxing.go new file mode 100644 index 0000000..5aa932c --- /dev/null +++ b/api/v1/system/qianqi_moxing.go @@ -0,0 +1,105 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-31 11:09:26 +// 生成路径: api/v1/system/qianqi_moxing.go +// 生成人:gfast +// desc:倾斜模型相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// QianqiMoxingSearchReq 分页请求参数 +type QianqiMoxingSearchReq struct { + g.Meta `path:"/list" tags:"倾斜模型" method:"get" summary:"倾斜模型列表"` + ProjectId string `p:"projectId" v:"required#项目id不能为空"` //项目id + Name string `p:"name"` //倾斜模型 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// QianqiMoxingSearchRes 列表返回结果 +type QianqiMoxingSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.QianqiMoxingListRes `json:"list"` +} + +// QianqiMoxingAddReq 添加操作请求参数 v:"required#倾斜模型不能为空" +type QianqiMoxingAddReq struct { + g.Meta `path:"/add" tags:"倾斜模型" method:"post" summary:"倾斜模型添加"` + commonApi.Author + ProjectId string `p:"projectId" ` + Name string `p:"name"` + SourcePath string `p:"sourcePath" ` + //Detail string `p:"detail" ` + //SourceId string `p:"sourceId" ` + //File *ghttp.UploadFile `p:"file" ` +} + +// QianqiMoxingAddRes 添加操作返回结果 +type QianqiMoxingAddRes struct { + commonApi.EmptyRes +} + +// QianqiMoxingEditReq 修改操作请求参数 +type QianqiMoxingEditReq struct { + g.Meta `path:"/edit" tags:"倾斜模型" method:"put" summary:"倾斜模型修改"` + commonApi.Author + Id int `p:"id" v:"required#主键ID不能为空"` + //ProjectId string `p:"projectId" ` + Name string `p:"name" v:"required#倾斜模型名称不能为空"` + //SourcePath string `p:"sourcePath" ` + Detail string `p:"detail" ` + //SourceId string `p:"sourceId" ` +} + +// QianqiMoxingEditRes 修改操作返回结果 +type QianqiMoxingEditRes struct { + commonApi.EmptyRes +} + +// QianqiMoxingGetReq 获取一条数据请求 +type QianqiMoxingGetReq struct { + g.Meta `path:"/get" tags:"倾斜模型" method:"get" summary:"获取倾斜模型信息"` + commonApi.Author + Id int `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// QianqiMoxingGetRes 获取一条数据结果 +type QianqiMoxingGetRes struct { + g.Meta `mime:"application/json"` + *model.QianqiMoxingInfoRes +} + +// QianqiMoxingDeleteReq 删除数据请求 +type QianqiMoxingDeleteReq struct { + g.Meta `path:"/delete" tags:"倾斜模型" method:"delete" summary:"删除倾斜模型"` + commonApi.Author + Ids []int `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// QianqiMoxingDeleteRes 删除数据返回 +type QianqiMoxingDeleteRes struct { + commonApi.EmptyRes +} + +// UploadFileReq 文件上传 +type UploadFileReq struct { + g.Meta `path:"/mxUploadFile" tags:"倾斜模型" method:"post" summary:"上传文件(tileset)"` + commonApi.Author + File *ghttp.UploadFile `p:"file" ` +} +type UploadFileRes struct { + commonApi.EmptyRes + FileName string `p:"fileName" ` + FilePath string `p:"filePath" ` +} diff --git a/api/v1/system/qianqi_nibianqi.go b/api/v1/system/qianqi_nibianqi.go new file mode 100644 index 0000000..c2e1666 --- /dev/null +++ b/api/v1/system/qianqi_nibianqi.go @@ -0,0 +1,118 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-31 09:40:17 +// 生成路径: api/v1/system/qianqi_nibianqi.go +// 生成人:gfast +// desc:逆变器相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/api/v1/common/shp" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// QianqiNibianqiSearchReq 分页请求参数 +type QianqiNibianqiSearchReq struct { + g.Meta `path:"/list" tags:"逆变器" method:"get" summary:"逆变器列表"` + ProjectId string `p:"projectId"` //项目id + Name string `p:"name"` //名称 + SourceId string `p:"sourceId"` //资源id + ModelId string `p:"modelId"` //模型id + Xiangbianid string `p:"xiangbianid"` //箱变id + CreatedAt string `p:"createdAt" v:"createAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// QianqiNibianqiSearchRes 列表返回结果 +type QianqiNibianqiSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.QianqiNibianqiListRes `json:"list"` +} + +// QianqiNibianqiAddReq 添加操作请求参数 +type QianqiNibianqiAddReq struct { + g.Meta `path:"/add" tags:"逆变器" method:"post" summary:"逆变器添加"` + commonApi.Author + ProjectId string `p:"projectId" ` + //Name string `p:"name" v:"required#名称不能为空"` + //SourceId string `p:"sourceId" ` + //ModelId string `p:"modelId" ` + //Detail string `p:"detail" ` + Xiangbianid string `p:"xiangbianid" ` + File []*ghttp.UploadFile `p:"file" ` +} + +// QianqiNibianqiAddRes 添加操作返回结果 +type QianqiNibianqiAddRes struct { + commonApi.EmptyRes +} + +// QianqiNibianqiEditReq 修改操作请求参数 +type QianqiNibianqiEditReq struct { + g.Meta `path:"/edit" tags:"逆变器" method:"put" summary:"逆变器修改"` + commonApi.Author + Id int `p:"id" v:"required#主键ID不能为空"` + //ProjectId string `p:"projectId" ` + Name string `p:"name" v:"required#名称不能为空"` + //SourceId string `p:"sourceId" ` + //ModelId string `p:"modelId" ` + Detail string `p:"detail" ` + //Xiangbianid string `p:"xiangbianid" ` +} + +// QianqiNibianqiEditRes 修改操作返回结果 +type QianqiNibianqiEditRes struct { + commonApi.EmptyRes +} +type NibianqiDetail struct { + Name string `json:"name" v:"required"` + Detail shp.Detail `json:"detail" v:"required"` +} +type QianqiNibianqiEditDetailReq struct { + g.Meta `path:"/edit_detail" tags:"逆变器" method:"put" summary:"逆变器修改高程"` + commonApi.Author + //Id int `p:"id" v:"required#主键ID不能为空"` + ProjectId string `p:"projectId" v:"required"` + List []NibianqiDetail `json:"list"` + //SourceId string `p:"sourceId" ` + //ModelId string `p:"modelId" ` + //Xiangbianid string `p:"xiangbianid" ` +} + +// QianqiNibianqiEditRes 修改操作返回结果 +type QianqiNibianqiEditDetailRes struct { + commonApi.EmptyRes +} + +// QianqiNibianqiGetReq 获取一条数据请求 +type QianqiNibianqiGetReq struct { + g.Meta `path:"/get" tags:"逆变器" method:"get" summary:"获取逆变器信息"` + commonApi.Author + Id int `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// QianqiNibianqiGetRes 获取一条数据结果 +type QianqiNibianqiGetRes struct { + g.Meta `mime:"application/json"` + *model.QianqiNibianqiInfoRes +} + +// QianqiNibianqiDeleteReq 删除数据请求 +type QianqiNibianqiDeleteReq struct { + g.Meta `path:"/delete" tags:"逆变器" method:"delete" summary:"删除逆变器"` + commonApi.Author + Ids []int `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// QianqiNibianqiDeleteRes 删除数据返回 +type QianqiNibianqiDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/qianqi_pingchang.go b/api/v1/system/qianqi_pingchang.go new file mode 100644 index 0000000..81220fa --- /dev/null +++ b/api/v1/system/qianqi_pingchang.go @@ -0,0 +1,212 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-08 10:08:24 +// 生成路径: api/v1/system/qianqi_pingchang.go +// 生成人:gfast +// desc:平场数据相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" +) + +type PingchangCalculateReq struct { + g.Meta `path:"calculate" summary:"计算平场" method:"post" tags:"平场相关"` + commonApi.Author + PcID string `json:"pc_id" dc:"平场id"` + Locations []Point `json:"locations" v:"required" dc:"采样的坐标点"` + //GridWidth float64 `json:"grid_width" v:"required" dc:"采样精度"` + //Area float64 `json:"area" dc:"面积" ` + //Cut float64 `json:"cut" dc:"挖方" ` + //Fill float64 `json:"fill" dc:"填方" ` + //Total float64 `json:"total" dc:"挖填平衡值" ` + //Radius int `json:"radius" dc:"邻居范围(1,为附近1圈,2为附近2圈)"` +} + +type PingchangImportReq struct { + g.Meta `path:"import" summary:"导入平场区域" method:"post" tags:"平场相关"` + commonApi.Author + ProjectID string `json:"project_id" v:"required" dc:"项目id" ` +} + +type UsualRes struct { + commonApi.EmptyRes +} + +type PingchangUpdateReq struct { + g.Meta `path:"update" summary:"更新平场区域相关数据" method:"post" tags:"平场相关"` + commonApi.Author + PcID string `json:"pc_id" v:"required" dc:"平场id"` + Points []Point `json:"points" dc:"平滑处理前的高程点" ` + GridWidth float64 `json:"grid_width" v:"required" dc:"采点精度"` + PCName string `json:"pc_name" v:"required" dc:"平场范围名称"` +} + +type Point struct { + Lng float64 `json:"lng" v:"required" dc:"经度"` + Lat float64 `json:"lat" v:"required" dc:"纬度"` + Alt float64 `json:"alt" dc:"高度"` +} + +type PingChangListReq struct { + g.Meta `path:"list" summary:"根据项目id分页获取平场区域" method:"post" tags:"平场相关"` + commonApi.Author + ProjectID string `json:"project_id" v:"required" dc:"项目id" ` + Page int `json:"page" v:"required" dc:"页数(从1开始)" ` + PageSize int `json:"page_size" v:"required" dc:"每页数量" ` +} + +type PC1 struct { + ProjectID string `json:"project_id" dc:"项目id" ` + PcID string `json:"pc_id" dc:"平场id"` + PCName string `json:"pc_name" dc:"平场范围名称"` + GridWidth float64 `json:"grid_width" dc:"采点精度"` + Progress float64 `json:"progress" dc:"计算进度"` + Cut float64 `json:"cut" dc:"挖方"` + Fill float64 `json:"fill" dc:"填方"` + Total float64 `json:"total" dc:"挖填平衡值"` + Area float64 `json:"area" dc:"面积"` + Shp string `json:"shp" dc:"计算后生成的shp"` + Range []Point `json:"range" dc:"平场范围"` + Points []Point `json:"points" dc:"平滑处理前的高程点" ` + SmoothPoints []Point `json:"smooth_points" dc:"平滑处理后的高程点" ` +} + +type PingChangListRes struct { + Range []PC1 `json:"range" v:"required" dc:"平场范围"` +} + +type PingChangAddReq struct { + g.Meta `path:"add" summary:"添加平场区域" method:"post" tags:"平场相关"` + commonApi.Author + ProjectID string `json:"project_id" v:"required" dc:"项目id" ` + PCName string `json:"pc_name" v:"required" dc:"平场范围名称"` + GridWidth float64 `json:"grid_width" v:"required" dc:"采点精度"` + Range []Point `json:"range" v:"required" dc:"平场范围"` +} + +type PC struct { + ProjectID string `json:"project_id" gorm:"type:varchar(128);comment:'项目id'" ` + PcID string `json:"pc_id" gorm:"type:varchar(128);comment:'平场id'"` + PCName string `json:"pc_name" gorm:"type:varchar(128);comment:'平场范围名称'"` + GridWidth float64 `json:"grid_width" gorm:"comment:'采点精度'"` + Progress float64 `json:"progress" gorm:"comment:'计算进度'"` + Range string `json:"range" gorm:"comment:'平场范围'"` + Points string `json:"points" gorm:"comment:'平滑处理前的高程点'"` + SmoothPoints string `json:"smooth_points" gorm:"comment:'平滑处理后的高程点'"` + SHP string `json:"shp" gorm:"comment:'经过计算生成的shp文件'" ` + Area float64 `json:"area" gorm:"comment:'面积'" ` + Cut float64 `json:"cut" gorm:"comment:'挖方'" ` + Fill float64 `json:"fill" gorm:"comment:'填方'" ` + Total float64 `json:"total" gorm:"comment:'挖填平衡值'" ` + Imported bool `json:"imported" gorm:"comment:'是否为导入的值'" ` +} + +type PingchangDelReq struct { + g.Meta `path:"del" summary:"删除平场区域" method:"post" tags:"平场相关"` + commonApi.Author + PcID string `json:"pc_id" v:"required" dc:"平场id"` +} + +//// QianqiPingchangSearchReq 分页请求参数 +//type QianqiPingchangSearchReq struct { +// g.Meta `path:"/list" tags:"平场数据" method:"get" summary:"平场数据列表"` +// Id string `p:"id"` // +// CreateAt string `p:"createAt" v:"createAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // +// UpdateAt string `p:"updateAt" v:"updateAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // +// DeleteAt string `p:"deleteAt" v:"deleteAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // +// ProjectId string `p:"projectId"` //'项目id' +// PcId string `p:"pcId"` //'平场id' +// PcName string `p:"pcName"` //'平场范围名称' +// GridWidth string `p:"gridWidth" v:"gridWidth@float#'采点精度'需为浮点数"` //'采点精度' +// Progress string `p:"progress" v:"progress@float#'计算进度'需为浮点数"` //'计算进度' +// Range string `p:"range"` //'平场范围' +// Points string `p:"points"` //'平滑处理前的高程点' +// SmoothPoints string `p:"smoothPoints"` //'平滑处理后的高程点' +// Shp string `p:"shp"` //'经过计算生成的shp文件' +// Area string `p:"area" v:"area@float#'面积'需为浮点数"` //'面积' +// Cut string `p:"cut" v:"cut@float#'挖方'需为浮点数"` //'挖方' +// Fill string `p:"fill" v:"fill@float#'填方'需为浮点数"` //'填方' +// Total string `p:"total" v:"total@float#'挖填平衡值'需为浮点数"` //'挖填平衡值' +// Imported string `p:"imported" v:"imported@integer#'是否为导入的值'需为整数"` //'是否为导入的值' +// commonApi.PageReq +// commonApi.Author +//} +// +//// QianqiPingchangSearchRes 列表返回结果 +//type QianqiPingchangSearchRes struct { +// g.Meta `mime:"application/json"` +// commonApi.ListRes +// List []*model.QianqiPingchangListRes `json:"list"` +//} +// +//// QianqiPingchangAddReq 添加操作请求参数 +//type QianqiPingchangAddReq struct { +// g.Meta `path:"/add" tags:"平场数据" method:"post" summary:"平场数据添加"` +// commonApi.Author +// ProjectId string `p:"projectId" ` +// File []*ghttp.UploadFile `p:"file" ` +//} +// +//// QianqiPingchangAddRes 添加操作返回结果 +//type QianqiPingchangAddRes struct { +// commonApi.EmptyRes +//} +// +//// QianqiPingchangEditReq 修改操作请求参数 +//type QianqiPingchangEditReq struct { +// g.Meta `path:"/edit" tags:"平场数据" method:"put" summary:"平场数据修改"` +// commonApi.Author +// Id uint64 `p:"id" v:"required#主键ID不能为空"` +// CreateAt *gtime.Time `p:"createAt" ` +// UpdateAt *gtime.Time `p:"updateAt" ` +// DeleteAt *gtime.Time `p:"deleteAt" ` +// ProjectId string `p:"projectId" ` +// PcId string `p:"pcId" ` +// PcName string `p:"pcName" v:"required#'平场范围名称'不能为空"` +// GridWidth float64 `p:"gridWidth" ` +// Progress float64 `p:"progress" ` +// Range string `p:"range" ` +// Points string `p:"points" ` +// SmoothPoints string `p:"smoothPoints" ` +// Shp string `p:"shp" ` +// Area float64 `p:"area" ` +// Cut float64 `p:"cut" ` +// Fill float64 `p:"fill" ` +// Total float64 `p:"total" ` +// Imported int `p:"imported" ` +//} +// +//// QianqiPingchangEditRes 修改操作返回结果 +//type QianqiPingchangEditRes struct { +// commonApi.EmptyRes +//} +// +//// QianqiPingchangGetReq 获取一条数据请求 +//type QianqiPingchangGetReq struct { +// g.Meta `path:"/get" tags:"平场数据" method:"get" summary:"获取平场数据信息"` +// commonApi.Author +// Id uint64 `p:"id" v:"required#主键必须"` //通过主键获取 +//} +// +//// QianqiPingchangGetRes 获取一条数据结果 +//type QianqiPingchangGetRes struct { +// g.Meta `mime:"application/json"` +// *model.QianqiPingchangInfoRes +//} +// +//// QianqiPingchangDeleteReq 删除数据请求 +//type QianqiPingchangDeleteReq struct { +// g.Meta `path:"/delete" tags:"平场数据" method:"delete" summary:"删除平场数据"` +// commonApi.Author +// Ids []uint64 `p:"ids" v:"required#主键必须"` //通过主键删除 +//} +// +//// QianqiPingchangDeleteRes 删除数据返回 +//type QianqiPingchangDeleteRes struct { +// commonApi.EmptyRes +//} diff --git a/api/v1/system/qianqi_redline.go b/api/v1/system/qianqi_redline.go new file mode 100644 index 0000000..0d114ec --- /dev/null +++ b/api/v1/system/qianqi_redline.go @@ -0,0 +1,104 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-31 11:45:12 +// 生成路径: api/v1/system/qianqi_redline.go +// 生成人:gfast +// desc:红线相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// QianqiRedlineSearchReq 分页请求参数 +type QianqiRedlineSearchReq struct { + g.Meta `path:"/list" tags:"红线" method:"get" summary:"红线列表"` + ProjectId string `p:"projectId" v:"required#项目id不能为空"` //项目id + Name string `p:"name"` //名称 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + NotInPlan bool `p:"notInPlan"` + commonApi.PageReq + commonApi.Author +} + +// QianqiRedlineSearchRes 列表返回结果 +type QianqiRedlineSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.QianqiRedlineListRes `json:"list"` +} + +// QianqiRedlineAddReq 添加操作请求参数 +type QianqiRedlineAddReq struct { + g.Meta `path:"/add" tags:"红线" method:"post" summary:"红线添加"` + commonApi.Author + ProjectId string `p:"projectId" v:"required#项目id不能为空"` + //Name string `p:"name" v:"required#名称不能为空"` + //SourceId string `p:"sourceId" ` + //SourcePath string `p:"sourcePath" ` + File []*ghttp.UploadFile `p:"file" ` +} + +// QianqiRedlineAddRes 添加操作返回结果 +type QianqiRedlineAddRes struct { + commonApi.EmptyRes +} + +// QianqiRedlineEditReq 修改操作请求参数 +type QianqiRedlineEditReq struct { + g.Meta `path:"/edit" tags:"红线" method:"put" summary:"红线修改"` + commonApi.Author + Id int `p:"id" v:"required#主键ID不能为空"` + //ProjectId string `p:"projectId" ` + Name string `p:"name" v:"required#名称不能为空"` + //SourceId string `p:"sourceId" ` + //SourcePath string `p:"sourcePath" ` +} + +// QianqiRedlineEditRes 修改操作返回结果 +type QianqiRedlineEditRes struct { + commonApi.EmptyRes +} + +// QianqiRedlineGetReq 获取一条数据请求 +type QianqiRedlineGetReq struct { + g.Meta `path:"/get" tags:"红线" method:"get" summary:"获取红线信息"` + commonApi.Author + Id int `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// QianqiRedlineGetRes 获取一条数据结果 +type QianqiRedlineGetRes struct { + g.Meta `mime:"application/json"` + *model.QianqiRedlineInfoRes +} + +// QianqiRedlineDeleteReq 删除数据请求 +type QianqiRedlineDeleteReq struct { + g.Meta `path:"/delete" tags:"红线" method:"delete" summary:"删除红线"` + commonApi.Author + Ids []int `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// QianqiRedlineDeleteRes 删除数据返回 +type QianqiRedlineDeleteRes struct { + commonApi.EmptyRes +} + +// UploadFileRedlineReq 读取shp文件内容 +type ReadFileRedlineReq struct { + g.Meta `path:"/readRedlineFile" tags:"红线" method:"post" summary:"读取红线shp文件"` + commonApi.Author + Id int `p:"id" v:"required#主键ID不能为空"` +} +type ReadFileRedlineRes struct { + commonApi.EmptyRes + FileName string `p:"fileName" ` + FilePath string `p:"filePath" ` +} diff --git a/api/v1/system/qianqi_redline_tudiliuzhuan.go b/api/v1/system/qianqi_redline_tudiliuzhuan.go new file mode 100644 index 0000000..9f1b70e --- /dev/null +++ b/api/v1/system/qianqi_redline_tudiliuzhuan.go @@ -0,0 +1,91 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-04 11:47:15 +// 生成路径: api/v1/system/qianqi_redline_tudiliuzhuan.go +// 生成人:gfast +// desc:土地流转相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// QianqiRedlineTudiliuzhuanSearchReq 分页请求参数 +type QianqiRedlineTudiliuzhuanSearchReq struct { + g.Meta `path:"/list" tags:"土地流转" method:"get" summary:"土地流转列表"` + Id string `p:"id"` //序号 + ProjectId string `p:"projectId" v:"required#项目id不能为空"` //项目id + Name string `p:"name"` //红线名称 + SourceId string `p:"sourceId"` //资源id + SourcePath string `p:"sourcePath"` //资源路径 + CreateBy string `p:"createBy"` //创建人 + UpdateBy string `p:"updateBy"` //更新人 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + SourceType string `p:"sourceType"` // + commonApi.PageReq + commonApi.Author +} + +// QianqiRedlineTudiliuzhuanSearchRes 列表返回结果 +type QianqiRedlineTudiliuzhuanSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.QianqiRedlineTudiliuzhuanListRes `json:"list"` +} + +// QianqiRedlineTudiliuzhuanAddReq 添加操作请求参数 +type QianqiRedlineTudiliuzhuanAddReq struct { + g.Meta `path:"/add" tags:"土地流转" method:"post" summary:"土地流转添加"` + commonApi.Author + ProjectId string `p:"projectId" ` + File []*ghttp.UploadFile `p:"file" ` +} + +// QianqiRedlineTudiliuzhuanAddRes 添加操作返回结果 +type QianqiRedlineTudiliuzhuanAddRes struct { + commonApi.EmptyRes +} + +// QianqiRedlineTudiliuzhuanEditReq 修改操作请求参数 +type QianqiRedlineTudiliuzhuanEditReq struct { + g.Meta `path:"/edit" tags:"土地流转" method:"put" summary:"土地流转修改"` + commonApi.Author + Id int `p:"id" v:"required#主键ID不能为空"` + Name string `p:"name" v:"required#红线名称不能为空"` +} + +// QianqiRedlineTudiliuzhuanEditRes 修改操作返回结果 +type QianqiRedlineTudiliuzhuanEditRes struct { + commonApi.EmptyRes +} + +// QianqiRedlineTudiliuzhuanGetReq 获取一条数据请求 +type QianqiRedlineTudiliuzhuanGetReq struct { + g.Meta `path:"/get" tags:"土地流转" method:"get" summary:"获取土地流转信息"` + commonApi.Author + Id int `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// QianqiRedlineTudiliuzhuanGetRes 获取一条数据结果 +type QianqiRedlineTudiliuzhuanGetRes struct { + g.Meta `mime:"application/json"` + *model.QianqiRedlineTudiliuzhuanInfoRes +} + +// QianqiRedlineTudiliuzhuanDeleteReq 删除数据请求 +type QianqiRedlineTudiliuzhuanDeleteReq struct { + g.Meta `path:"/delete" tags:"土地流转" method:"delete" summary:"删除土地流转"` + commonApi.Author + Ids []int `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// QianqiRedlineTudiliuzhuanDeleteRes 删除数据返回 +type QianqiRedlineTudiliuzhuanDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/qianqi_road.go b/api/v1/system/qianqi_road.go new file mode 100644 index 0000000..deb15d6 --- /dev/null +++ b/api/v1/system/qianqi_road.go @@ -0,0 +1,92 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-04 16:24:38 +// 生成路径: api/v1/system/qianqi_road.go +// 生成人:gfast +// desc:道路相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// QianqiRoadSearchReq 分页请求参数 +type QianqiRoadSearchReq struct { + g.Meta `path:"/list" tags:"道路" method:"get" summary:"道路列表"` + Id string `p:"id"` //序号 + ProjectId string `p:"projectId"` //项目id + Name string `p:"name"` //名称 + SourceId string `p:"sourceId"` //资源id + SourcePath string `p:"sourcePath"` //资源路径 + CreateBy string `p:"createBy"` //创建人 + UpdateBy string `p:"updateBy"` //更新人 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + SourceType string `p:"sourceType"` //资源类型 + commonApi.PageReq + commonApi.Author +} + +// QianqiRoadSearchRes 列表返回结果 +type QianqiRoadSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.QianqiRoadListRes `json:"list"` +} + +// QianqiRoadAddReq 添加操作请求参数 +type QianqiRoadAddReq struct { + g.Meta `path:"/add" tags:"道路" method:"post" summary:"道路添加"` + commonApi.Author + ProjectId string `p:"projectId" v:"required#项目id不能为空"` + File []*ghttp.UploadFile `p:"file" ` +} + +// QianqiRoadAddRes 添加操作返回结果 +type QianqiRoadAddRes struct { + commonApi.EmptyRes +} + +// QianqiRoadEditReq 修改操作请求参数 +type QianqiRoadEditReq struct { + g.Meta `path:"/edit" tags:"道路" method:"put" summary:"道路修改"` + commonApi.Author + Id int `p:"id" v:"required#主键ID不能为空"` + Name string `p:"name" v:"required#名称不能为空"` + SourceType string `p:"sourceType" ` +} + +// QianqiRoadEditRes 修改操作返回结果 +type QianqiRoadEditRes struct { + commonApi.EmptyRes +} + +// QianqiRoadGetReq 获取一条数据请求 +type QianqiRoadGetReq struct { + g.Meta `path:"/get" tags:"道路" method:"get" summary:"获取道路信息"` + commonApi.Author + Id int `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// QianqiRoadGetRes 获取一条数据结果 +type QianqiRoadGetRes struct { + g.Meta `mime:"application/json"` + *model.QianqiRoadInfoRes +} + +// QianqiRoadDeleteReq 删除数据请求 +type QianqiRoadDeleteReq struct { + g.Meta `path:"/delete" tags:"道路" method:"delete" summary:"删除道路"` + commonApi.Author + Ids []int `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// QianqiRoadDeleteRes 删除数据返回 +type QianqiRoadDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/qianqi_xiangbian.go b/api/v1/system/qianqi_xiangbian.go new file mode 100644 index 0000000..16cc73f --- /dev/null +++ b/api/v1/system/qianqi_xiangbian.go @@ -0,0 +1,108 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-31 09:52:13 +// 生成路径: api/v1/system/qianqi_xiangbian.go +// 生成人:gfast +// desc:箱变相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// QianqiXiangbianSearchReq 分页请求参数 +type QianqiXiangbianSearchReq struct { + g.Meta `path:"/list" tags:"箱变" method:"get" summary:"箱变列表"` + ProjectId string `p:"projectId" v:"required#项目id不能为空"` + // 项目id + Name string `p:"name"` // 名称 + CreatedAt string `p:"createAt" v:"createAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` // 创建时间 + commonApi.PageReq + commonApi.Author +} + +// QianqiXiangbianSearchRes 列表返回结果 +type QianqiXiangbianSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + // ProjectId string `p:"projectId" v:"required#项目id不能为空"` + List []*model.QianqiXiangbianListRes `json:"list"` +} + +// QianqiXiangbianAddReq 添加操作请求参数 +type QianqiXiangbianAddReq struct { + g.Meta `path:"/add" tags:"箱变" method:"post" summary:"箱变添加"` + commonApi.Author + ProjectId string `p:"projectId" v:"required#项目id不能为空"` + // 方阵的主键ID + //FangzhenName string `p:"fangzhenName" v:"required#方阵id不能为空"` + File []*ghttp.UploadFile `p:"file" ` +} + +// QianqiXiangbianAddRes 添加操作返回结果 +type QianqiXiangbianAddRes struct { + commonApi.EmptyRes +} + +// QianqiXiangbianEditReq 修改操作请求参数 +type QianqiXiangbianEditReq struct { + g.Meta `path:"/edit" tags:"箱变" method:"put" summary:"箱变修改"` + commonApi.Author + Id int `p:"id" v:"required#主键ID不能为空"` + ProjectId string `p:"projectId" ` + Name string `p:"name" v:"required#名称不能为空"` + // SourceId string `p:"sourceId" ` + // ModelId string `p:"modelId" ` + Detail string `p:"detail" ` +} + +// QianqiXiangbianEditRes 修改操作返回结果 +type QianqiXiangbianEditRes struct { + commonApi.EmptyRes +} +type QianqiXiangbianEditDetailReq struct { + g.Meta `path:"/edit_detail" tags:"箱变" method:"put" summary:"箱变修改高程"` + commonApi.Author + // Id int `p:"id" v:"required#主键ID不能为空"` + ProjectId string `p:"projectId" v:"required"` + List []NibianqiDetail `json:"list"` + // SourceId string `p:"sourceId" ` + // ModelId string `p:"modelId" ` + // Xiangbianid string `p:"xiangbianid" ` +} + +// QianqiNibianqiEditRes 修改操作返回结果 +type QianqiXiangbianEditDetailRes struct { + commonApi.EmptyRes +} + +// QianqiXiangbianGetReq 获取一条数据请求 +type QianqiXiangbianGetReq struct { + g.Meta `path:"/get" tags:"箱变" method:"get" summary:"获取箱变信息"` + commonApi.Author + Id int `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// QianqiXiangbianGetRes 获取一条数据结果 +type QianqiXiangbianGetRes struct { + g.Meta `mime:"application/json"` + *model.QianqiXiangbianInfoRes +} + +// QianqiXiangbianDeleteReq 删除数据请求 +type QianqiXiangbianDeleteReq struct { + g.Meta `path:"/delete" tags:"箱变" method:"delete" summary:"删除箱变"` + commonApi.Author + Ids []int `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// QianqiXiangbianDeleteRes 删除数据返回 +type QianqiXiangbianDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/reminders.go b/api/v1/system/reminders.go new file mode 100644 index 0000000..f57e53b --- /dev/null +++ b/api/v1/system/reminders.go @@ -0,0 +1,96 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-05-14 14:55:52 +// 生成路径: api/v1/system/reminders.go +// 生成人:gfast +// desc:App-消息-提醒相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// RemindersSearchReq 分页请求参数 +type RemindersSearchReq struct { + g.Meta `path:"/list" tags:"App-消息-提醒" method:"get" summary:"App-消息-提醒列表"` + Id string `p:"id"` // + UserId string `p:"userId" v:"userId@integer#消息接收者ID需为整数"` // 消息接收者ID + ReminderType string `p:"reminderType" v:"reminderType@integer#提醒类型 0 安全整改 | 1 质量整改 | 2 AI | 3 打卡需为整数"` // 提醒类型 0 安全整改 | 1 质量整改 | 2 AI | 3 打卡 + Title string `p:"title"` // 标题 + ViolationType string `p:"violationType"` // 违章类型 + ProjectId string `p:"projectId" v:"projectId@integer#项目ID需为整数"` // 项目ID + CreatedAt string `p:"createdAt" v:"createdAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // + OpenId string `p:"openId"` + commonApi.PageReq + commonApi.Author +} + +// RemindersSearchRes 列表返回结果 +type RemindersSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.RemindersListRes `json:"list"` +} + +// RemindersAddReq 添加操作请求参数 +type RemindersAddReq struct { + g.Meta `path:"/add" tags:"App-消息-提醒" method:"post" summary:"App-消息-提醒添加"` + commonApi.Author + UserId int `p:"userId" ` + ReminderType int `p:"reminderType" ` + Title string `p:"title" ` + ViolationType string `p:"violationType" ` + ProjectId int `p:"projectId" ` +} + +// RemindersAddRes 添加操作返回结果 +type RemindersAddRes struct { + commonApi.EmptyRes +} + +// RemindersEditReq 修改操作请求参数 +type RemindersEditReq struct { + g.Meta `path:"/edit" tags:"App-消息-提醒" method:"put" summary:"App-消息-提醒修改"` + commonApi.Author + Id uint `p:"id" v:"required#主键ID不能为空"` + UserId int `p:"userId" ` + ReminderType int `p:"reminderType" ` + Title string `p:"title" ` + ViolationType string `p:"violationType" ` + ProjectId int `p:"projectId" ` +} + +// RemindersEditRes 修改操作返回结果 +type RemindersEditRes struct { + commonApi.EmptyRes +} + +// RemindersGetReq 获取一条数据请求 +type RemindersGetReq struct { + g.Meta `path:"/get" tags:"App-消息-提醒" method:"get" summary:"获取App-消息-提醒信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// RemindersGetRes 获取一条数据结果 +type RemindersGetRes struct { + g.Meta `mime:"application/json"` + *model.RemindersInfoRes +} + +// RemindersDeleteReq 删除数据请求 +type RemindersDeleteReq struct { + g.Meta `path:"/delete" tags:"App-消息-提醒" method:"delete" summary:"删除App-消息-提醒"` + commonApi.Author + Ids []uint `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// RemindersDeleteRes 删除数据返回 +type RemindersDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/sub_project.go b/api/v1/system/sub_project.go new file mode 100644 index 0000000..a7b4940 --- /dev/null +++ b/api/v1/system/sub_project.go @@ -0,0 +1,86 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-03-21 18:53:14 +// 生成路径: api/v1/system/sub_project.go +// 生成人:gfast +// desc:子项目相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// SubProjectSearchReq 分页请求参数 +type SubProjectSearchReq struct { + g.Meta `path:"/list" tags:"子项目" method:"get" summary:"子项目列表"` + Id string `p:"id"` //主键ID + ProjectId string `p:"projectId" v:"projectId@integer#项目ID需为整数"` //项目ID + ProjectName string `p:"projectName"` //子项目名 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // + commonApi.PageReq + commonApi.Author +} + +// SubProjectSearchRes 列表返回结果 +type SubProjectSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.SubProjectListRes `json:"list"` +} + +// SubProjectAddReq 添加操作请求参数 +type SubProjectAddReq struct { + g.Meta `path:"/add" tags:"子项目" method:"post" summary:"子项目添加"` + commonApi.Author + ProjectId int `p:"projectId" ` + ProjectName string `p:"projectName" v:"required#子项目名不能为空"` +} + +// SubProjectAddRes 添加操作返回结果 +type SubProjectAddRes struct { + commonApi.EmptyRes +} + +// SubProjectEditReq 修改操作请求参数 +type SubProjectEditReq struct { + g.Meta `path:"/edit" tags:"子项目" method:"put" summary:"子项目修改"` + commonApi.Author + Id uint `p:"id" v:"required#主键ID不能为空"` + ProjectId int `p:"projectId" ` + ProjectName string `p:"projectName" v:"required#子项目名不能为空"` +} + +// SubProjectEditRes 修改操作返回结果 +type SubProjectEditRes struct { + commonApi.EmptyRes +} + +// SubProjectGetReq 获取一条数据请求 +type SubProjectGetReq struct { + g.Meta `path:"/get" tags:"子项目" method:"get" summary:"获取子项目信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// SubProjectGetRes 获取一条数据结果 +type SubProjectGetRes struct { + g.Meta `mime:"application/json"` + *model.SubProjectInfoRes +} + +// SubProjectDeleteReq 删除数据请求 +type SubProjectDeleteReq struct { + g.Meta `path:"/delete" tags:"子项目" method:"delete" summary:"删除子项目"` + commonApi.Author + Ids []uint `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// SubProjectDeleteRes 删除数据返回 +type SubProjectDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/sys_auth_rule.go b/api/v1/system/sys_auth_rule.go new file mode 100644 index 0000000..d37aead --- /dev/null +++ b/api/v1/system/sys_auth_rule.go @@ -0,0 +1,113 @@ +/* +* @desc:菜单api +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/18 10:27 + */ + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +type RuleSearchReq struct { + g.Meta `path:"/menu/list" tags:"菜单管理" method:"get" summary:"菜单列表"` + commonApi.Author + Hide int `p:"hide" dc:"0显示 1隐藏" v:"between:0,1"` + Title string `p:"menuName" ` + Component string `p:"component"` +} + +type RuleListRes struct { + g.Meta `mime:"application/json"` + Rules []*model.SysAuthRuleTreeRes `json:"rules"` +} + +type RuleAddReq struct { + g.Meta `path:"/menu/add" tags:"菜单管理" method:"post" summary:"添加菜单"` + commonApi.Author + MenuType uint `p:"menuType" v:"min:0|max:2#菜单类型最小值为:min|菜单类型最大值为:max"` + Pid uint `p:"parentId" v:"min:0"` + Name string `p:"name" v:"required#请填写规则名称"` + Title string `p:"menuName" v:"required|length:1,100#请填写标题|标题长度在:min到:max位"` + Icon string `p:"icon"` + Weigh int `p:"menuSort" ` + Condition string `p:"condition" ` + Remark string `p:"remark" ` + IsHide uint `p:"isHide"` + Path string `p:"path"` + Redirect string `p:"redirect"` // 路由重定向 + Roles []uint `p:"roles"` // 角色ids + Component string `p:"component" v:"required-if:menuType,1#组件路径不能为空"` + IsLink uint `p:"isLink"` + IsIframe uint `p:"isIframe"` + IsCached uint `p:"isKeepAlive"` + IsAffix uint `p:"isAffix"` + LinkUrl string `p:"linkUrl"` +} + +type RuleAddRes struct { +} + +type RuleGetParamsReq struct { + g.Meta `path:"/menu/getParams" tags:"菜单管理" method:"get" summary:"获取添加、编辑菜单相关参数"` + commonApi.Author +} + +type RuleGetParamsRes struct { + g.Meta `mime:"application/json"` + Roles []*entity.SysRole `json:"roles"` + Menus []*model.SysAuthRuleInfoRes `json:"menus"` +} + +type RuleInfoReq struct { + g.Meta `path:"/menu/get" tags:"菜单管理" method:"get" summary:"获取菜单信息"` + commonApi.Author + Id uint `p:"required#菜单id必须"` +} + +type RuleInfoRes struct { + g.Meta `mime:"application/json"` + Rule *entity.SysAuthRule `json:"rule"` + RoleIds []uint `json:"roleIds"` +} + +type RuleUpdateReq struct { + g.Meta `path:"/menu/update" tags:"菜单管理" method:"put" summary:"修改菜单"` + commonApi.Author + Id uint `p:"id" v:"required#id必须"` + MenuType uint `p:"menuType" v:"min:0|max:2#菜单类型最小值为:min|菜单类型最大值为:max"` + Pid uint `p:"parentId" v:"min:0"` + Name string `p:"name" v:"required#请填写规则名称"` + Title string `p:"menuName" v:"required|length:1,100#请填写标题|标题长度在:min到:max位"` + Icon string `p:"icon"` + Weigh int `p:"menuSort" ` + Condition string `p:"condition" ` + Remark string `p:"remark" ` + IsHide uint `p:"isHide"` + Path string `p:"path"` + Redirect string `p:"redirect"` // 路由重定向 + Roles []uint `p:"roles"` // 角色ids + Component string `p:"component" v:"required-if:menuType,1#组件路径不能为空"` + IsLink uint `p:"isLink"` + IsIframe uint `p:"isIframe"` + IsCached uint `p:"isKeepAlive"` + IsAffix uint `p:"isAffix"` + LinkUrl string `p:"linkUrl"` +} + +type RuleUpdateRes struct { +} + +type RuleDeleteReq struct { + g.Meta `path:"/menu/delete" tags:"菜单管理" method:"delete" summary:"删除菜单"` + commonApi.Author + Ids []int `p:"ids" v:"required#菜单id必须"` +} + +type RuleDeleteRes struct { +} diff --git a/api/v1/system/sys_big_file.go b/api/v1/system/sys_big_file.go new file mode 100644 index 0000000..175f9ad --- /dev/null +++ b/api/v1/system/sys_big_file.go @@ -0,0 +1,66 @@ +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +type BigFileSearchReq struct { + g.Meta `path:"/bigFile/list" tags:"大文件管理" method:"get" summary:"大文件管理"` + Name string `p:"name"` //文件名称 + commonApi.PageReq +} + +type BigFileSearchRes struct { + g.Meta `mime:"application/json"` + List []*entity.BigFile `json:"list"` + commonApi.ListRes +} + +type BigFileForm struct { + Name string `p:"name" v:"required#文件名称必须"` + Size int `p:"size" v:"required#文件大小必须"` + Path string `p:"path" v:"required#文件路径必须"` + FullPath string `p:"fullPath"` + MimeType string `p:"mimeType"` + Source int `p:"source"` + Describe string `p:"describe"` + Md5 string `p:"md5"` +} + +type BigFileGetReq struct { + g.Meta `path:"/bigFile/get" tags:"大文件管理" method:"get" summary:"获取大文件信息"` + Id uint64 `p:"id"` +} + +type BigFileGetRes struct { + g.Meta `mime:"application/json"` + entity.BigFile +} + +type BigFileAddReq struct { + g.Meta `path:"/bigFile/add" tags:"大文件管理" method:"post" summary:"大文件新增"` + BigFileForm +} + +type BigFileAddRes struct { +} + +type BigFileEditReq struct { + g.Meta `path:"/bigFile/edit" tags:"大文件管理" method:"put" summary:"大文件新增"` + Id uint64 `p:"id" v:"required|min:1#主键ID不能为空|主键ID参数错误"` + Name string `p:"name" v:"required#标题必须"` + Describe string `p:"describe"` +} + +type BigFileEditRes struct { +} + +type BigFileDeleteReq struct { + g.Meta `path:"/bigFile/delete" tags:"大文件管理" method:"delete" summary:"大文件删除"` + Ids []uint64 `p:"ids"` +} + +type BigFileDeleteRes struct { +} diff --git a/api/v1/system/sys_config.go b/api/v1/system/sys_config.go new file mode 100644 index 0000000..ee9c98e --- /dev/null +++ b/api/v1/system/sys_config.go @@ -0,0 +1,71 @@ +/* +* @desc:系统参数配置 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/4/18 21:11 + */ + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + commonEntity "github.com/tiger1103/gfast/v3/internal/app/common/model/entity" +) + +type ConfigSearchReq struct { + g.Meta `path:"/config/list" tags:"系统参数管理" method:"get" summary:"系统参数列表"` + ConfigName string `p:"configName"` //参数名称 + ConfigKey string `p:"configKey"` //参数键名 + ConfigType string `p:"configType"` //状态 + commonApi.PageReq +} + +type ConfigSearchRes struct { + g.Meta `mime:"application/json"` + List []*commonEntity.SysConfig `json:"list"` + commonApi.ListRes +} + +type ConfigReq struct { + ConfigName string `p:"configName" v:"required#参数名称不能为空"` + ConfigKey string `p:"configKey" v:"required#参数键名不能为空"` + ConfigValue string `p:"configValue" v:"required#参数键值不能为空"` + ConfigType int `p:"configType" v:"required|in:0,1#系统内置不能为空|系统内置类型只能为0或1"` + Remark string `p:"remark"` +} + +type ConfigAddReq struct { + g.Meta `path:"/config/add" tags:"系统参数管理" method:"post" summary:"添加系统参数"` + *ConfigReq +} + +type ConfigAddRes struct { +} + +type ConfigGetReq struct { + g.Meta `path:"/config/get" tags:"系统参数管理" method:"get" summary:"获取系统参数"` + Id int `p:"id"` +} + +type ConfigGetRes struct { + g.Meta `mime:"application/json"` + Data *commonEntity.SysConfig `json:"data"` +} + +type ConfigEditReq struct { + g.Meta `path:"/config/edit" tags:"系统参数管理" method:"put" summary:"修改系统参数"` + ConfigId int64 `p:"configId" v:"required|min:1#主键ID不能为空|主键ID参数错误"` + *ConfigReq +} + +type ConfigEditRes struct { +} + +type ConfigDeleteReq struct { + g.Meta `path:"/config/delete" tags:"系统参数管理" method:"delete" summary:"删除系统参数"` + Ids []int `p:"ids"` +} + +type ConfigDeleteRes struct { +} diff --git a/api/v1/system/sys_dept.go b/api/v1/system/sys_dept.go new file mode 100644 index 0000000..162cff4 --- /dev/null +++ b/api/v1/system/sys_dept.go @@ -0,0 +1,71 @@ +/* +* @desc:部门管理参数 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/4/6 15:07 + */ + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +type DeptSearchReq struct { + g.Meta `path:"/dept/list" tags:"部门管理" method:"get" summary:"部门列表"` + DeptName string `p:"deptName"` + Status string `p:"status"` +} + +type DeptSearchRes struct { + g.Meta `mime:"application/json"` + DeptList []*entity.SysDept `json:"deptList"` +} + +type DeptAddReq struct { + g.Meta `path:"/dept/add" tags:"部门管理" method:"post" summary:"添加部门"` + ParentID int `p:"parentId" v:"required#父级不能为空"` + DeptName string `p:"deptName" v:"required#部门名称不能为空"` + OrderNum int `p:"orderNum" v:"required#排序不能为空"` + Leader string `p:"leader"` + Phone string `p:"phone"` + Email string `p:"email" v:"email#邮箱格式不正确"` + Status uint `p:"status" v:"required#状态必须"` +} + +type DeptAddRes struct { +} + +type DeptEditReq struct { + g.Meta `path:"/dept/edit" tags:"部门管理" method:"put" summary:"修改部门"` + DeptId int `p:"deptId" v:"required#deptId不能为空"` + ParentID int `p:"parentId" v:"required#父级不能为空"` + DeptName string `p:"deptName" v:"required#部门名称不能为空"` + OrderNum int `p:"orderNum" v:"required#排序不能为空"` + Leader string `p:"leader"` + Phone string `p:"phone"` + Email string `p:"email" v:"email#邮箱格式不正确"` + Status uint `p:"status" v:"required#状态必须"` +} + +type DeptEditRes struct { +} + +type DeptDeleteReq struct { + g.Meta `path:"/dept/delete" tags:"部门管理" method:"delete" summary:"删除部门"` + Id uint64 `p:"id" v:"required#id不能为空"` +} + +type DeptDeleteRes struct { +} + +type DeptTreeSelectReq struct { + g.Meta `path:"/dept/treeSelect" tags:"部门管理" method:"get" summary:"获取部门树形菜单"` +} + +type DeptTreeSelectRes struct { + g.Meta `mime:"application/json"` + Deps []*model.SysDeptTreeRes `json:"deps"` +} diff --git a/api/v1/system/sys_dict_data.go b/api/v1/system/sys_dict_data.go new file mode 100644 index 0000000..3d86502 --- /dev/null +++ b/api/v1/system/sys_dict_data.go @@ -0,0 +1,93 @@ +/* +* @desc:字典数据api +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/18 11:59 + */ + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + commonModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + commonEntity "github.com/tiger1103/gfast/v3/internal/app/common/model/entity" +) + +// GetDictReq 获取字典信息请求参数 +type GetDictReq struct { + g.Meta `path:"/dict/data/getDictData" tags:"字典管理" method:"get" summary:"获取字典数据公共方法"` + commonApi.Author + DictType string `p:"dictType" v:"required#字典类型不能为空"` + DefaultValue string `p:"defaultValue"` +} + +// GetDictRes 完整的一个字典信息 +type GetDictRes struct { + g.Meta `mime:"application/json"` + Info *commonModel.DictTypeRes `json:"info"` + Values []*commonModel.DictDataRes `json:"values"` +} + +// DictDataSearchReq 分页请求参数 +type DictDataSearchReq struct { + g.Meta `path:"/dict/data/list" tags:"字典管理" method:"get" summary:"字典数据列表"` + DictType string `p:"dictType"` //字典类型 + DictLabel string `p:"dictLabel"` //字典标签 + Status string `p:"status"` //状态 + commonApi.PageReq +} + +// DictDataSearchRes 字典数据结果 +type DictDataSearchRes struct { + g.Meta `mime:"application/json"` + List []*commonEntity.SysDictData `json:"list"` + commonApi.ListRes +} + +type DictDataReq struct { + DictLabel string `p:"dictLabel" v:"required#字典标签不能为空"` + DictValue string `p:"dictValue" v:"required#字典键值不能为空"` + DictType string `p:"dictType" v:"required#字典类型不能为空"` + DictSort int `p:"dictSort" v:"integer#排序只能为整数"` + CssClass string `p:"cssClass"` + ListClass string `p:"listClass"` + IsDefault int `p:"isDefault" v:"required|in:0,1#系统默认不能为空|默认值只能为0或1"` + Status int `p:"status" v:"required|in:0,1#状态不能为空|状态只能为0或1"` + Remark string `p:"remark"` +} + +type DictDataAddReq struct { + g.Meta `path:"/dict/data/add" tags:"字典管理" method:"post" summary:"添加字典数据"` + *DictDataReq +} + +type DictDataAddRes struct { +} + +type DictDataGetReq struct { + g.Meta `path:"/dict/data/get" tags:"字典管理" method:"get" summary:"获取字典数据"` + DictCode uint `p:"dictCode"` +} + +type DictDataGetRes struct { + g.Meta `mime:"application/json"` + Dict *commonEntity.SysDictData `json:"dict"` +} + +type DictDataEditReq struct { + g.Meta `path:"/dict/data/edit" tags:"字典管理" method:"put" summary:"修改字典数据"` + DictCode int `p:"dictCode" v:"required|min:1#主键ID不能为空|主键ID不能小于1"` + *DictDataReq +} + +type DictDataEditRes struct { +} + +type DictDataDeleteReq struct { + g.Meta `path:"/dict/data/delete" tags:"字典管理" method:"delete" summary:"删除字典数据"` + Ids []int `p:"ids"` +} + +type DictDataDeleteRes struct { +} diff --git a/api/v1/system/sys_dict_type.go b/api/v1/system/sys_dict_type.go new file mode 100644 index 0000000..98fe4a1 --- /dev/null +++ b/api/v1/system/sys_dict_type.go @@ -0,0 +1,79 @@ +/* +* @desc:字典类型 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/4/14 21:30 + */ + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + commonModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + commonEntity "github.com/tiger1103/gfast/v3/internal/app/common/model/entity" +) + +type DictTypeSearchReq struct { + g.Meta `path:"/dict/type/list" tags:"字典管理" method:"get" summary:"字典类型列表"` + DictName string `p:"dictName"` //字典名称 + DictType string `p:"dictType"` //字典类型 + Status string `p:"status"` //字典状态 + commonApi.PageReq +} + +type DictTypeSearchRes struct { + g.Meta `mime:"application/json"` + DictTypeList []*commonModel.SysDictTypeInfoRes `json:"dictTypeList"` + commonApi.ListRes +} + +type DictTypeAddReq struct { + g.Meta `path:"/dict/type/add" tags:"字典管理" method:"post" summary:"添加字典类型"` + DictName string `p:"dictName" v:"required#字典名称不能为空"` + DictType string `p:"dictType" v:"required#字典类型不能为空"` + Status uint `p:"status" v:"required|in:0,1#状态不能为空|状态只能为0或1"` + Remark string `p:"remark"` +} + +type DictTypeAddRes struct { +} + +type DictTypeGetReq struct { + g.Meta `path:"/dict/type/get" tags:"字典管理" method:"get" summary:"获取字典类型"` + DictId uint `p:"dictId" v:"required#类型id不能为空"` +} + +type DictTypeGetRes struct { + g.Meta `mime:"application/json"` + DictType *commonEntity.SysDictType `json:"dictType"` +} + +type DictTypeEditReq struct { + g.Meta `path:"/dict/type/edit" tags:"字典管理" method:"put" summary:"修改字典类型"` + DictId int64 `p:"dictId" v:"required|min:1#主键ID不能为空|主键ID必须为大于0的值"` + DictName string `p:"dictName" v:"required#字典名称不能为空"` + DictType string `p:"dictType" v:"required#字典类型不能为空"` + Status uint `p:"status" v:"required|in:0,1#状态不能为空|状态只能为0或1"` + Remark string `p:"remark"` +} + +type DictTypeEditRes struct { +} + +type DictTypeDeleteReq struct { + g.Meta `path:"/dict/type/delete" tags:"字典管理" method:"delete" summary:"删除字典类型"` + DictIds []int `p:"dictIds" v:"required#字典类型id不能为空"` +} + +type DictTypeDeleteRes struct { +} + +type DictTypeAllReq struct { + g.Meta `path:"/dict/type/optionSelect" tags:"字典管理" method:"get" summary:"获取字典选择框列表"` +} + +type DictTYpeAllRes struct { + g.Meta `mime:"application/json"` + DictType []*commonEntity.SysDictType `json:"dictType"` +} diff --git a/api/v1/system/sys_file.go b/api/v1/system/sys_file.go new file mode 100644 index 0000000..6315b10 --- /dev/null +++ b/api/v1/system/sys_file.go @@ -0,0 +1,89 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-29 15:32:09 +// 生成路径: api/v1/system/sys_file.go +// 生成人:gfast +// desc:文件相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// SysFileSearchReq 分页请求参数 +type SysFileSearchReq struct { + g.Meta `path:"/list" tags:"文件" method:"get" summary:"文件列表"` + FileName string `p:"fileName"` //文件名称 + Status string `p:"status"` //文件状态 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// SysFileSearchRes 列表返回结果 +type SysFileSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.SysFileListRes `json:"list"` +} + +// SysFileAddReq 添加操作请求参数 +type SysFileAddReq struct { + g.Meta `path:"/add" tags:"文件" method:"post" summary:"文件添加"` + commonApi.Author + ParentId int `p:"parentId" ` + FileName string `p:"fileName" v:"required#文件名称不能为空"` + ProjectId int64 `p:"projectId" ` + FileTypeId int `p:"fileTypeId" ` +} + +// SysFileAddRes 添加操作返回结果 +type SysFileAddRes struct { + commonApi.EmptyRes +} + +// SysFileEditReq 修改操作请求参数 +type SysFileEditReq struct { + g.Meta `path:"/edit" tags:"文件" method:"put" summary:"文件修改"` + commonApi.Author + FileId int `p:"fileId" v:"required#主键ID不能为空"` + ParentId int `p:"parentId" ` + FileName string `p:"fileName" v:"required#文件名称不能为空"` + ProjectId int64 `p:"projectId" ` + FileTypeId int `p:"fileTypeId" ` +} + +// SysFileEditRes 修改操作返回结果 +type SysFileEditRes struct { + commonApi.EmptyRes +} + +// SysFileGetReq 获取一条数据请求 +type SysFileGetReq struct { + g.Meta `path:"/get" tags:"文件" method:"get" summary:"获取文件信息"` + commonApi.Author + FileId int `p:"fileId" v:"required#主键必须"` //通过主键获取 +} + +// SysFileGetRes 获取一条数据结果 +type SysFileGetRes struct { + g.Meta `mime:"application/json"` + *model.SysFileInfoRes +} + +// SysFileDeleteReq 删除数据请求 +type SysFileDeleteReq struct { + g.Meta `path:"/delete" tags:"文件" method:"delete" summary:"删除文件"` + commonApi.Author + FileIds []int `p:"fileIds" v:"required#主键必须"` //通过主键删除 +} + +// SysFileDeleteRes 删除数据返回 +type SysFileDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/sys_file_type.go b/api/v1/system/sys_file_type.go new file mode 100644 index 0000000..6fa7381 --- /dev/null +++ b/api/v1/system/sys_file_type.go @@ -0,0 +1,85 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-29 15:27:54 +// 生成路径: api/v1/system/sys_file_type.go +// 生成人:gfast +// desc:文件类型相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// SysFileTypeSearchReq 分页请求参数 +type SysFileTypeSearchReq struct { + g.Meta `path:"/list" tags:"文件类型" method:"get" summary:"文件类型列表"` + Id string `p:"id"` //序号 + FileTypeName string `p:"fileTypeName"` //文件类型 + Status string `p:"status"` //文件状态 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// SysFileTypeSearchRes 列表返回结果 +type SysFileTypeSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.SysFileTypeListRes `json:"list"` +} + +// SysFileTypeAddReq 添加操作请求参数 +type SysFileTypeAddReq struct { + g.Meta `path:"/add" tags:"文件类型" method:"post" summary:"文件类型添加"` + commonApi.Author + FileTypeName string `p:"fileTypeName" v:"required#文件类型不能为空"` +} + +// SysFileTypeAddRes 添加操作返回结果 +type SysFileTypeAddRes struct { + commonApi.EmptyRes +} + +// SysFileTypeEditReq 修改操作请求参数 +type SysFileTypeEditReq struct { + g.Meta `path:"/edit" tags:"文件类型" method:"put" summary:"文件类型修改"` + commonApi.Author + Id int `p:"id" v:"required#主键ID不能为空"` + FileTypeName string `p:"fileTypeName" v:"required#文件类型不能为空"` + Status string `p:"status" v:"required#文件状态不能为空"` +} + +// SysFileTypeEditRes 修改操作返回结果 +type SysFileTypeEditRes struct { + commonApi.EmptyRes +} + +// SysFileTypeGetReq 获取一条数据请求 +type SysFileTypeGetReq struct { + g.Meta `path:"/get" tags:"文件类型" method:"get" summary:"获取文件类型信息"` + commonApi.Author + Id int `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// SysFileTypeGetRes 获取一条数据结果 +type SysFileTypeGetRes struct { + g.Meta `mime:"application/json"` + *model.SysFileTypeInfoRes +} + +// SysFileTypeDeleteReq 删除数据请求 +type SysFileTypeDeleteReq struct { + g.Meta `path:"/delete" tags:"文件类型" method:"delete" summary:"删除文件类型"` + commonApi.Author + Ids []int `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// SysFileTypeDeleteRes 删除数据返回 +type SysFileTypeDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/sys_init.go b/api/v1/system/sys_init.go new file mode 100644 index 0000000..de13233 --- /dev/null +++ b/api/v1/system/sys_init.go @@ -0,0 +1,66 @@ +package system + +import ( + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type DbInitIsInitReq struct { + g.Meta `path:"/dbInit/isInit" tags:"系统初始化" method:"get" summary:"系统初始化"` +} + +type DbInitIsInitRes bool + +type DbInitGetEnvInfoReq struct { + g.Meta `path:"/dbInit/getEnvInfo" tags:"系统初始化" method:"get" summary:"获取环境信息"` +} + +type DbInitGetEnvInfoRes g.Map + +type DbInitCreateDbReq struct { + g.Meta `path:"/dbInit/createDb" tags:"系统初始化" method:"post" summary:"创建配置文件"` + DbHost string `json:"dbHost" p:"dbHost" v:"required#数据库地址必须"` + DbPort int `json:"dbPort" p:"dbPort" v:"required#数据库端口必须"` + DbUser string `json:"dbUser" p:"dbUser" v:"required#数据库用户名称必须"` + DbPass string `json:"dbPass"` + DbName string `json:"dbName" p:"dbName" v:"required#数据库名称必须"` + DbCharset string `json:"dbCharset" p:"dbCharset" v:"required#数据库编码必须"` + RedisAddress string `json:"redisAddress" p:"redisAddress" v:"required#Redis地址必须"` + RedisPort int `json:"redisPort" p:"redisPort" v:"required#Redis端口必须"` + RedisDb int `json:"redisDb" p:"redisDb" v:"required#Redis索引必须"` + RedisPass string `json:"redisPass"` +} + +type DbInitCreateDbRes bool + +func (req *DbInitCreateDbReq) ToDbInitConfig() *model.DbInitConfig { + return &model.DbInitConfig{ + Database: model.Database{ + Default: model.DbDefault{ + Host: req.DbHost, + Port: req.DbPort, + User: req.DbUser, + Pass: req.DbPass, + Name: req.DbName, + Type: "mysql", + Role: "master", + Debug: true, + Charset: req.DbCharset, + DryRun: false, + MaxIdle: 10, + MaxOpen: 10, + MaxLifetime: 10, + }, + }, + Redis: model.Redis{ + Default: model.RedisDefault{ + Address: fmt.Sprintf("%s:%d", req.RedisAddress, req.RedisPort), + Db: req.RedisDb, + Pass: req.RedisPass, + IdleTimeout: 600, + MaxActive: 100, + }, + }, + } +} diff --git a/api/v1/system/sys_job.go b/api/v1/system/sys_job.go new file mode 100644 index 0000000..4ff4db9 --- /dev/null +++ b/api/v1/system/sys_job.go @@ -0,0 +1,154 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-01-12 17:43:50 +// 生成路径: api/v1/system/sys_job.go +// 生成人:gfast +// desc:定时任务相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// SysJobSearchReq 分页请求参数 +type SysJobSearchReq struct { + g.Meta `path:"/list" tags:"定时任务" method:"get" summary:"定时任务列表"` + JobName string `p:"jobName"` //任务名称 + JobGroup string `p:"jobGroup"` //任务组名 + Status string `p:"status" v:"status@integer#状态需为整数"` //状态 + commonApi.PageReq + commonApi.Author +} + +// SysJobSearchRes 列表返回结果 +type SysJobSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.SysJobListRes `json:"list"` +} + +// SysJobAddReq 添加操作请求参数 +type SysJobAddReq struct { + g.Meta `path:"/add" tags:"定时任务" method:"post" summary:"定时任务添加"` + commonApi.Author + JobName string `p:"jobName" v:"required#任务名称不能为空"` + JobParams string `p:"jobParams" ` + JobGroup string `p:"jobGroup" ` + InvokeTarget string `p:"invokeTarget" v:"required#任务方法不能为空"` + CronExpression string `p:"cronExpression" v:"required#cron执行表达式不能为空"` + MisfirePolicy int `p:"misfirePolicy" ` + Status int `p:"status" v:"required#状态不能为空"` + Remark string `p:"remark" ` + CreatedBy uint64 +} + +// SysJobAddRes 添加操作返回结果 +type SysJobAddRes struct { + commonApi.EmptyRes +} + +// SysJobEditReq 修改操作请求参数 +type SysJobEditReq struct { + g.Meta `path:"/edit" tags:"定时任务" method:"put" summary:"定时任务修改"` + commonApi.Author + JobId uint64 `p:"jobId" v:"required#主键ID不能为空"` + JobName string `p:"jobName" v:"required#任务名称不能为空"` + JobParams string `p:"jobParams" ` + JobGroup string `p:"jobGroup" ` + InvokeTarget string `p:"invokeTarget" v:"required#任务方法不能为空"` + CronExpression string `p:"cronExpression" v:"required#cron执行表达式不能为空"` + MisfirePolicy int `p:"misfirePolicy" ` + Status int `p:"status" v:"required#状态不能为空"` + Remark string `p:"remark" ` + UpdatedBy uint64 +} + +// SysJobEditRes 修改操作返回结果 +type SysJobEditRes struct { + commonApi.EmptyRes +} + +// SysJobGetReq 获取一条数据请求 +type SysJobGetReq struct { + g.Meta `path:"/get" tags:"定时任务" method:"get" summary:"获取定时任务信息"` + commonApi.Author + JobId uint64 `p:"jobId" v:"required#主键必须"` //通过主键获取 +} + +// SysJobGetRes 获取一条数据结果 +type SysJobGetRes struct { + g.Meta `mime:"application/json"` + *model.SysJobInfoRes +} + +// SysJobDeleteReq 删除数据请求 +type SysJobDeleteReq struct { + g.Meta `path:"/delete" tags:"定时任务" method:"delete" summary:"删除定时任务"` + commonApi.Author + JobIds []uint64 `p:"jobIds" v:"required#主键必须"` //通过主键删除 +} + +// SysJobDeleteRes 删除数据返回 +type SysJobDeleteRes struct { + commonApi.EmptyRes +} + +type SysJobStartReq struct { + g.Meta `path:"/start" tags:"定时任务" method:"put" summary:"启动任务"` + commonApi.Author + JobId uint64 `p:"jobId" v:"required#jobId必须"` +} + +type SysJobStartRes struct { + commonApi.EmptyRes +} + +type SysJobStopReq struct { + g.Meta `path:"/stop" tags:"定时任务" method:"put" summary:"停止任务"` + commonApi.Author + JobId uint64 `p:"jobId" v:"required#jobId必须"` +} + +type SysJobStopRes struct { + commonApi.EmptyRes +} + +type SysJobRunReq struct { + g.Meta `path:"/run" tags:"定时任务" method:"put" summary:"运行任务"` + commonApi.Author + JobId uint64 `p:"jobId" v:"required#jobId必须"` +} + +type SysJobRunRes struct { + commonApi.EmptyRes +} + +type SysJobLogListReq struct { + g.Meta `path:"/logs" tags:"定时任务" method:"get" summary:"执行日志"` + commonApi.Author + commonApi.PageReq + TargetName string `p:"targetName" v:"required#targetName必须"` +} + +type SysJobLogListRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*entity.SysJobLog `json:"list"` +} + +type SysJobLogDeleteReq struct { + g.Meta `path:"/deleteLogs" tags:"定时任务" method:"delete" summary:"删除执行日志"` + commonApi.Author + LogIds []uint64 `p:"logIds" v:"required#主键必须"` +} + +type SysJobLogDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/sys_login.go b/api/v1/system/sys_login.go new file mode 100644 index 0000000..0063c71 --- /dev/null +++ b/api/v1/system/sys_login.go @@ -0,0 +1,159 @@ +/* +* @desc:登录 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/4/27 21:51 + */ + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type UserLoginReq struct { + g.Meta `path:"/login" tags:"登录" method:"post" summary:"用户登录"` + Username string `p:"username" v:"required#用户名不能为空"` + Password string `p:"password" v:"required#密码不能为空"` + VerifyCode string `p:"verifyCode" v:"required#验证码不能为空"` + VerifyKey string `p:"verifyKey"` +} + +type UserLoginRes struct { + g.Meta `mime:"application/json"` + UserInfo *model.LoginUserRes `json:"userInfo"` + Token string `json:"token"` + MenuList []*model.UserMenus `json:"menuList"` + Permissions []string `json:"permissions"` +} + +type UserLoginOutReq struct { + g.Meta `path:"/logout" tags:"登录" method:"get" summary:"退出登录"` + commonApi.Author +} + +type UserLoginOutRes struct{} + +// App 登录 +type AppLoginReq struct { + g.Meta `path:"/appLogin" tags:"App" method:"post" summary:"App登录"` + Username string `p:"phone" v:"required#用户名或手机号不能为空" dc:"用户名或手机号"` + Password string `p:"password" v:"required#密码不能为空" dc:"密码"` +} + +type AppLoginRes struct { + g.Meta `mime:"application/json"` + UserInfo *model.LoginUserRes `json:"userInfo"` + Token string `json:"token" dc:"PC端 Token" ` // 鉴权 Token + AccessToken string `json:"ysToken" dc:"萤石云 Token"` // 萤石云Token + OpenID string `json:"openId" dc:"微信小程序 OpenID"` // 微信小程序的OpenID + MenuList []*model.UserMenus `json:"menuList"` + Permissions []string `json:"permissions"` +} + +// App 用户注册 +type AppCreateUserReq struct { + g.Meta `path:"/app_register" tags:"App" method:"post" summary:"App创建用户"` + // 手机号 + Mobile string `p:"mobile" v:"required#手机号不能为空"` + // 密码 + Password string `p:"password" v:"required#密码不能为空"` +} + +// AppCreateUserRes 创建用户返回 +type AppCreateUserRes struct { + commonApi.EmptyRes + Id int64 `p:"id" dc:"返回用户id"` + Openid string `p:"openid" dc:"返回用户id"` +} + +// App 修改用户密码 +type AppUpdatePwdReq struct { + g.Meta `path:"/updatePassword" tags:"App" method:"post" summary:"App修改密码"` + commonApi.Author + // 原始密码 + Password string `p:"password" v:"required#旧密码不能为空" dc:"老密码"` + // 新密码 + NewPassword string `p:"newPassword" v:"required#新密码不能为空" dc:"新密码"` +} + +type AppUpdatePwdRes struct { + commonApi.EmptyRes +} + +// AppCheckTokenReq 判断 Token 是否有效 +type AppCheckTokenReq struct { + g.Meta `path:"/checkToken" tags:"App" method:"get" summary:"App检查Token"` + commonApi.Author +} + +type AppCheckTokenRes struct { + g.Meta `mime:"application/json"` + IsValid int `json:"isValid" dc:"0 无效 | 1 有效"` +} + +// AppGetUserInfoReq 获取个人信息 +type AppGetUserInfoReq struct { + g.Meta `path:"/getUserInfo" tags:"App" method:"get" summary:"App 获取个人信息"` + commonApi.Author +} + +type AppGetUserInfoRes struct { + g.Meta `mime:"application/json"` + UserID uint64 `json:"userId" dc:"用户ID"` // 用户ID + Avatar string `json:"headIcon" dc:"头像"` // 头像 + Name string `json:"user_nickname" dc:"昵称"` // 姓名 + RealName string `json:"userName" dc:"真实姓名"` // 真实姓名 + IsNewUser int `json:"isNewUser" dc:"0 不是新用户 | 1 是新用户"` // 是否是新用户 + IsRealName int `json:"isRealName" dc:"是否实名 0 未实名 | 1 已实名"` // 是否实名 + Mobile string `json:"phone" dc:"手机号"` // 手机号 + Sex string `json:"sex" dc:"性别 1 男 | 2 女 | 3 保密"` // 性别 + Project string `json:"project" dc:"项目"` // 项目 + ProjectId string `json:"projectId" dc:"项目ID"` // 项目ID + Lng string `orm:"lng" dc:"经度"` // 经度 + Lat string `orm:"lat" dc:"维度"` // 纬度 + ConstructionUnitName string `json:"constructionUnitName" dc:"施工单位"` // 施工单位 + WorkType string `json:"workType" dc:"工种"` // 工种 + Team string `json:"team" dc:"班组"` // 班组 + TeamID string `json:"teamId" dc:"班组ID"` // 班组ID + Status string `json:"status" dc:"0 在职 | 1 离职"` // 状态 + WorkTime string `json:"workTime" dc:"工作时间"` // 工作时间 + EntryTime string `json:"entryTime" dc:"入场时间"` // 入场时间 + LeaveTime string `json:"leaveTime" dc:"离场时间"` // 离场时间 + IsLeader int `json:"isLeader" dc:"是否是组长 0 普通员工 | 1 组长"` +} + +// AppUpdateAvatarReq 修改用户头像 +type AppUpdateAvatarReq struct { + g.Meta `path:"/updateAvatar" tags:"App" method:"post" summary:"App 修改头像"` + commonApi.Author + Image string `p:"image" v:"required#头像不能为空" dc:"头像"` +} + +type AppUpdateAvatarRes struct { + commonApi.EmptyRes +} + +// AppIsAdminReq 用户是否拥有 PC 端管理员权限或仅为施工人员 +type AppUserTypeReq struct { + g.Meta `path:"/getUserType" tags:"App" method:"get" summary:"App 是否为管理员或施工人员"` + commonApi.Author +} + +type AppUserTypeRes struct { + g.Meta `mime:"application/json"` + UserType []int `json:"userType" dc:"0 后台管理人员 | 1 施工人员"` +} + +// AppGetUserRoleReq 获取用户角色 +type AppGetUserRoleReq struct { + g.Meta `path:"/getUserRole" tags:"App" method:"get" summary:"App 获取用户角色"` + commonApi.Author +} + +type AppGetUserRoleRes struct { + g.Meta `mime:"application/json"` + Role []int `json:"role" dc:"0 后台管理人员 | 1 施工人员"` +} diff --git a/api/v1/system/sys_login_log.go b/api/v1/system/sys_login_log.go new file mode 100644 index 0000000..fc7e207 --- /dev/null +++ b/api/v1/system/sys_login_log.go @@ -0,0 +1,47 @@ +/* +* @desc:登录日志 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/4/24 22:09 + */ + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +// LoginLogSearchReq 查询列表请求参数 +type LoginLogSearchReq struct { + g.Meta `path:"/loginLog/list" tags:"登录日志管理" method:"get" summary:"日志列表"` + LoginName string `p:"userName"` //登陆名 + Status string `p:"status"` //状态 + Ipaddr string `p:"ipaddr"` //登录地址 + SortName string `p:"orderByColumn"` //排序字段 + SortOrder string `p:"isAsc"` //排序方式 + LoginLocation string `p:"loginLocation"` //登录地点 + commonApi.PageReq +} + +type LoginLogSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*entity.SysLoginLog `json:"list"` +} + +type LoginLogDelReq struct { + g.Meta `path:"/loginLog/delete" tags:"登录日志管理" method:"delete" summary:"删除日志"` + Ids []int `p:"ids" v:"required#ids必须"` +} + +type LoginLogDelRes struct { +} + +type LoginLogClearReq struct { + g.Meta `path:"/loginLog/clear" tags:"登录日志管理" method:"delete" summary:"清除日志"` +} + +type LoginLogClearRes struct { +} diff --git a/api/v1/system/sys_monitor.go b/api/v1/system/sys_monitor.go new file mode 100644 index 0000000..d22ee1c --- /dev/null +++ b/api/v1/system/sys_monitor.go @@ -0,0 +1,11 @@ +package system + +import ( + "github.com/gogf/gf/v2/frame/g" +) + +type MonitorSearchReq struct { + g.Meta `path:"/monitor/server" tags:"服务监控" method:"get" summary:"服务监控"` +} + +type MonitorSearchRes g.Map diff --git a/api/v1/system/sys_oper_log.go b/api/v1/system/sys_oper_log.go new file mode 100644 index 0000000..33f1cf8 --- /dev/null +++ b/api/v1/system/sys_oper_log.go @@ -0,0 +1,65 @@ +/* +* @desc:操作日志 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/12/21 14:37 + */ + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// SysOperLogSearchReq 分页请求参数 +type SysOperLogSearchReq struct { + g.Meta `path:"/operLog/list" tags:"操作日志" method:"get" summary:"操作日志列表"` + Title string `p:"title"` //系统模块 + RequestMethod string `p:"requestMethod"` //请求方式 + OperName string `p:"operName"` //操作人员 + commonApi.PageReq + commonApi.Author +} + +// SysOperLogSearchRes 列表返回结果 +type SysOperLogSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.SysOperLogListRes `json:"list"` +} + +// SysOperLogGetReq 获取一条数据请求 +type SysOperLogGetReq struct { + g.Meta `path:"/operLog/get" tags:"操作日志" method:"get" summary:"获取操作日志信息"` + commonApi.Author + OperId uint64 `p:"operId" v:"required#主键必须"` //通过主键获取 +} + +// SysOperLogGetRes 获取一条数据结果 +type SysOperLogGetRes struct { + g.Meta `mime:"application/json"` + *model.SysOperLogInfoRes +} + +// SysOperLogDeleteReq 删除数据请求 +type SysOperLogDeleteReq struct { + g.Meta `path:"/operLog/delete" tags:"操作日志" method:"delete" summary:"删除操作日志"` + commonApi.Author + OperIds []uint64 `p:"operIds" v:"required#主键必须"` //通过主键删除 +} + +// SysOperLogDeleteRes 删除数据返回 +type SysOperLogDeleteRes struct { + commonApi.EmptyRes +} + +type SysOperLogClearReq struct { + g.Meta `path:"/operLog/clear" tags:"操作日志" method:"delete" summary:"清除日志"` + commonApi.Author +} + +type SysOperLogClearRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/sys_post.go b/api/v1/system/sys_post.go new file mode 100644 index 0000000..379c9d7 --- /dev/null +++ b/api/v1/system/sys_post.go @@ -0,0 +1,61 @@ +/* +* @desc:岗位相关参数 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/4/7 23:09 + */ + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +type PostSearchReq struct { + g.Meta `path:"/post/list" tags:"岗位管理" method:"get" summary:"岗位列表"` + PostCode string `p:"postCode"` //岗位编码 + PostName string `p:"postName"` //岗位名称 + Status string `p:"status"` //状态 + commonApi.PageReq +} + +type PostSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + PostList []*entity.SysPost `json:"postList"` +} + +type PostAddReq struct { + g.Meta `path:"/post/add" tags:"岗位管理" method:"post" summary:"添加岗位"` + PostCode string `p:"postCode" v:"required#岗位编码不能为空"` + PostName string `p:"postName" v:"required#岗位名称不能为空"` + PostSort int `p:"postSort" v:"required#岗位排序不能为空"` + Status uint `p:"status" v:"required#状态不能为空"` + Remark string `p:"remark"` +} + +type PostAddRes struct { +} + +type PostEditReq struct { + g.Meta `path:"/post/edit" tags:"岗位管理" method:"put" summary:"修改岗位"` + PostId int64 `p:"postId" v:"required#id必须"` + PostCode string `p:"postCode" v:"required#岗位编码不能为空"` + PostName string `p:"postName" v:"required#岗位名称不能为空"` + PostSort int `p:"postSort" v:"required#岗位排序不能为空"` + Status uint `p:"status" v:"required#状态不能为空"` + Remark string `p:"remark"` +} + +type PostEditRes struct { +} + +type PostDeleteReq struct { + g.Meta `path:"/post/delete" tags:"岗位管理" method:"delete" summary:"删除岗位"` + Ids []int `p:"ids"` +} + +type PostDeleteRes struct { +} diff --git a/api/v1/system/sys_project.go b/api/v1/system/sys_project.go new file mode 100644 index 0000000..06216a2 --- /dev/null +++ b/api/v1/system/sys_project.go @@ -0,0 +1,210 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-27 15:20:49 +// 生成路径: api/v1/system/sys_project.go +// 生成人:gfast +// desc:项目相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/api/v1/common/shp" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// SysProjectSearchReq 分页请求参数 +type SysProjectSearchReq struct { + g.Meta `path:"/list" tags:"项目" method:"get" summary:"项目列表"` + ProjectName string `p:"projectName"` //项目名称 + PId string `p:"pId" v:"pId@integer#父id需为整数"` //父id + Status string `p:"status"` //状态(0正常 1停用) + CreateTime string `p:"createTime" v:"createTime@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + Type string `p:"type" dc:"1工程 2运维 3全部" v:"between:1,3#取值范围为1~3"` //项目类型 + IsType string `p:"isType" dc:"1光伏 2风电 3全部" v:"between:1,3#取值范围为1~3"` //项目类别 + PagingType int `json:"pagingType" dc:"0分页 1不分页" v:"between:0,1#取值范围为0~1"` + IsShow int `json:"isShow" dc:"0显示 1隐藏 2全部" v:"between:0,2#取值范围为0~2"` + commonApi.PageReq + commonApi.Author +} + +// SysProjectSearchRes 列表返回结果 +type SysProjectSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.SysProjectListRes `json:"list"` +} + +// SysProjectSearchAllReq 分页请求参数 +type SysProjectSearchAllReq struct { + g.Meta `path:"/listAll" tags:"项目" method:"get" summary:"项目列表"` + Project int64 `p:"project" dc:"项目id"` + Name string `p:"name" dc:"根据项目名称模糊查询"` + commonApi.Author +} + +// SysProjectSearchAllRes 列表返回结果 +type SysProjectSearchAllRes struct { + g.Meta `mime:"application/json"` + List []*model.SysProjectListRes `json:"list"` +} + +// SysProjectAddReq 添加操作请求参数 +type SysProjectAddReq struct { + g.Meta `path:"/add" tags:"项目" method:"post" summary:"项目添加"` + commonApi.Author + ProjectName string `p:"projectName" v:"required#项目名称不能为空"` + ShortName string `p:"shortName" ` + PunchRange string `p:"punchRange" v:"required#打卡范围不能为空"` + PId int64 `p:"pId"` + //Status string `p:"status"` + PicUrl string `p:"picUrl" ` + CreateBy string `p:"createBy" ` + CreateTime *gtime.Time `p:"createTime" ` + UpdateBy string `p:"updateBy" ` + UpdateTime *gtime.Time `p:"updateTime" ` + Lng string `p:"lng" ` + Lat string `p:"lat" ` + Remark string `p:"remark" ` + Type string `p:"type" v:"required#项目类型不能为空"` + ColourRgb string `p:"colourRgb" ` + Sort int64 `p:"sort" dc:"排序字段(asc)"` + + PrincipalXz string `p:"principalXz" dc:"小程序薪资管理员" ` + ProjectSite string `p:"projectSite" v:"required#项目地址不能为空"` + Principal string `p:"principal" v:"required#项目负责人不能为空"` + PrincipalPhone string `p:"principalPhone" v:"required#负责人电话不能为空"` + Actual string `p:"actual" dc:"实际容量" v:"required#实际容量不能为空"` + Plan string `p:"plan" dc:"计划容量" v:"required#计划容量不能为空"` + OnStreamTime string `p:"onStreamTime" dc:"开工时间" v:"required#开工时间不能为空"` + RichText string `p:"richText" dc:"富文本"` + DesignTotal int64 `p:"designTotal" dc:"设计总量"` + IsType int64 `p:"isType" dc:"项目类型(1光伏 2风电)"` + + ProjectPunchRangeList []*ProjectPunchRangeRes `json:"projectPunchRangeList" dc:"范围边界"` +} + +// SysProjectAddRes 添加操作返回结果 +type SysProjectAddRes struct { + commonApi.EmptyRes +} + +// SysProjectEditReq 修改操作请求参数 +type SysProjectEditReq struct { + g.Meta `path:"/edit" tags:"项目" method:"put" summary:"项目修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + ProjectName string `p:"projectName" v:"required#项目名称不能为空"` + ShortName string `p:"shortName" ` + PunchRange string `p:"punchRange" v:"required#打卡范围不能为空"` + PId int64 `p:"pId" v:"required#父id不能为空"` + Status string `p:"status" v:"required#状态(0正常 1停用)不能为空"` + PicUrl string `p:"picUrl" ` + Lng string `p:"lng" ` + Lat string `p:"lat" ` + Remark string `p:"remark" ` + Type string `p:"type" v:"required#项目类型不能为空"` + ColourRgb string `p:"colourRgb" ` + Sort int64 `p:"sort" dc:"排序字段(asc)"` + ShowHidden string `p:"showHidden" dc:"显示隐藏(1显示 2隐藏)"` + + PrincipalXz string `p:"principalXz" dc:"小程序薪资管理员" ` + ProjectSite string `p:"projectSite" v:"required#项目地址不能为空"` + Principal string `p:"principal" v:"required#项目负责人不能为空"` + PrincipalPhone string `p:"principalPhone" v:"required#负责人电话不能为空"` + Actual string `p:"actual" dc:"实际容量" v:"required#实际容量不能为空"` + Plan string `p:"plan" dc:"计划容量" v:"required#计划容量不能为空"` + OnStreamTime string `p:"onStreamTime" dc:"开工时间" v:"required#开工时间不能为空"` + RichText string `p:"richText" dc:"富文本"` + DesignTotal int64 `p:"designTotal" dc:"设计总量"` + IsType int64 `p:"isType" dc:"项目类型(1光伏 2风电)"` + + PunchRangeList []*ProjectPunchRangeRes `json:"punchRangeList" dc:"范围边界"` +} + +// SysProjectEditRes 修改操作返回结果 +type SysProjectEditRes struct { + commonApi.EmptyRes +} + +// SysProjectGetReq 获取一条数据请求 +type SysProjectGetReq struct { + g.Meta `path:"/get" tags:"项目" method:"get" summary:"获取项目信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// SysProjectGetRes 获取一条数据结果 +type SysProjectGetRes struct { + g.Meta `mime:"application/json"` + *model.SysProjectInfoRes + FangzhengList []*FangzhengListRes `json:"fangzhengList" dc:"方正边界范围"` + PunchRangeList []*ProjectPunchRangeRes `json:"punchRangeList" dc:"打卡范围边界"` +} + +type FangzhengListRes struct { + Id string `json:"id" dc:"主键ID"` + SourceId string `json:"sourceId" dc:"资源ID"` + Name string `json:"name" dc:"方正名称"` + Detail shp.Polyline `json:"detail" dc:"方正范围"` +} + +type ProjectPunchRangeRes struct { + Id int64 `json:"id" dc:"主键ID"` + ProjectId string `json:"projectId" dc:"项目ID"` + PunchName string `json:"punchName" dc:"范围名称"` + PunchColor string `json:"punchColor" dc:"颜色"` + PunchRange []*Position `json:"punchRange" dc:"打卡范围"` +} + +// Position 定义一个结构体来表示JSON数据中的位置信息 +type Position struct { + Lng float64 `json:"lng"` + Lat float64 `json:"lat"` + Alt float64 `json:"alt"` +} + +// SysProjectDeleteReq 删除数据请求 +type SysProjectDeleteReq struct { + g.Meta `path:"/delete" tags:"项目" method:"delete" summary:"删除项目"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// SysProjectDeleteRes 删除数据返回 +type SysProjectDeleteRes struct { + commonApi.EmptyRes +} + +// BriefIntroductionReq 获取一条数据请求 +type BriefIntroductionReq struct { + g.Meta `path:"/briefIntroduction" tags:"项目" method:"get" summary:"根据主键ID获取项目简介"` + commonApi.Author + ProjectId string `p:"projectId" dc:"项目id" v:"required#项目id必须"` +} + +// BriefIntroductionRes 获取一条数据结果 +type BriefIntroductionRes struct { + g.Meta `mime:"application/json"` + ProjectId string `json:"projectId" dc:"项目ID"` + ProjectName string `json:"projectName" dc:"项目全称"` + ShortName string `json:"shortName" dc:"项目简称"` + RichText string `json:"richText" dc:"富文本"` +} + +// SecurityAgreementReq 上传安全协议书 +type SecurityAgreementReq struct { + g.Meta `path:"/securityAgreement" tags:"项目" method:"post" summary:"上传安全协议书(每个项目都有一个安全协议书)"` + commonApi.Author + Id string `p:"id" dc:"项目主键id" v:"required#项目主键id必须"` + File string `p:"file" dc:"传递安全协议书" v:"required#安全协议书必须"` +} + +// SecurityAgreementRes 上传安全协议书 +type SecurityAgreementRes struct { + g.Meta `mime:"application/json"` +} diff --git a/api/v1/system/sys_project_introduce.go b/api/v1/system/sys_project_introduce.go new file mode 100644 index 0000000..ccb2482 --- /dev/null +++ b/api/v1/system/sys_project_introduce.go @@ -0,0 +1,90 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-03-29 10:05:02 +// 生成路径: api/v1/system/sys_project_introduce.go +// 生成人:gfast +// desc:项目新闻相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// SysProjectIntroduceSearchReq 分页请求参数 +type SysProjectIntroduceSearchReq struct { + g.Meta `path:"/list" tags:"项目新闻" method:"get" summary:"项目新闻列表"` + ProjectId string `p:"projectId"` // 项目id + Headline string `p:"headline"` // 标题 + RichText string `p:"richText"` // 富文本 + CreatedBy string `p:"createdBy"` // 创建人 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` // 创建时间 + commonApi.PageReq + commonApi.Author +} + +// SysProjectIntroduceSearchRes 列表返回结果 +type SysProjectIntroduceSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.SysProjectIntroduceListRes `json:"list"` +} + +// SysProjectIntroduceAddReq 添加操作请求参数 +type SysProjectIntroduceAddReq struct { + g.Meta `path:"/add" tags:"项目新闻" method:"post" summary:"项目新闻添加"` + commonApi.Author + ProjectId int64 `p:"projectId" v:"required#主键ID不能为空"` + Headline string `p:"headline" dc:"标题" v:"max-length:64#最大输入字数为64" ` + RichText string `p:"richText" ` + CreatedBy uint64 +} + +// SysProjectIntroduceAddRes 添加操作返回结果 +type SysProjectIntroduceAddRes struct { + commonApi.EmptyRes +} + +// SysProjectIntroduceEditReq 修改操作请求参数 +type SysProjectIntroduceEditReq struct { + g.Meta `path:"/edit" tags:"项目新闻" method:"put" summary:"项目新闻修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + Headline string `p:"headline" v:"required#标题不能为空"` + RichText string `p:"richText" ` + UpdatedBy uint64 +} + +// SysProjectIntroduceEditRes 修改操作返回结果 +type SysProjectIntroduceEditRes struct { + commonApi.EmptyRes +} + +// SysProjectIntroduceGetReq 获取一条数据请求 +type SysProjectIntroduceGetReq struct { + g.Meta `path:"/get" tags:"项目新闻" method:"get" summary:"获取项目新闻信息"` + commonApi.Author + Id int64 `p:"Id" v:"required#主键必须"` // 通过主键获取 +} + +// SysProjectIntroduceGetRes 获取一条数据结果 +type SysProjectIntroduceGetRes struct { + g.Meta `mime:"application/json"` + *model.SysProjectIntroduceInfoRes +} + +// SysProjectIntroduceDeleteReq 删除数据请求 +type SysProjectIntroduceDeleteReq struct { + g.Meta `path:"/delete" tags:"项目新闻" method:"delete" summary:"删除项目新闻"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// SysProjectIntroduceDeleteRes 删除数据返回 +type SysProjectIntroduceDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/sys_project_value.go b/api/v1/system/sys_project_value.go new file mode 100644 index 0000000..8ddf543 --- /dev/null +++ b/api/v1/system/sys_project_value.go @@ -0,0 +1,107 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-03-27 12:55:26 +// 生成路径: api/v1/system/sys_project_value.go +// 生成人:xiaoyang +// desc:projectValue相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// SysProjectValueSearchReq 分页请求参数 +type EveryProjectValueSearchReq struct { + g.Meta `path:"/everylist" tags:"项目产值" method:"post" summary:"项目产值首页展示"` + ProId string `p:"proId" dc:"项目id"` + Year string `p:"year" dc:"项目产值年"` + Month string `p:"month" dc:"项目产值月"` + commonApi.PageReq + commonApi.Author +} +type EveryProjectValueSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List *model.TotalProjectValue `json:"list"` +} + +// SysProjectValueSearchReq 分页请求参数 +type SysProjectValueSearchReq struct { + g.Meta `path:"/list" tags:"项目产值" method:"get" summary:"项目产值列表"` + ProId string `p:"projectId" dc:"项目id"` //前端传值projectId + Year string `p:"year" dc:"项目产值年"` + Month string `p:"month" dc:"项目产值月"` + ProValue string `p:"proValue" dc:"项目产值"` //项目产值 + IsShow string `p:"isShow" dc:"显示隐藏(1显示 2隐藏)"` //项目产值 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// SysProjectValueSearchRes 列表返回结果 +type SysProjectValueSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.SysProjectValueListRes `json:"list"` +} + +// SysProjectValueAddReq 添加操作请求参数 +type SysProjectValueAddReq struct { + g.Meta `path:"/add" tags:"项目产值" method:"post" summary:"项目产值添加"` + commonApi.Author + ProId int64 `p:"proId" dc:"项目id"` + Year string `p:"year" dc:"项目产值年"` + Month string `p:"month" dc:"项目产值月"` + ProValue string `p:"proValue" v:"required#项目产值不能为空" dc:"项目产值"` +} + +// SysProjectValueAddRes 添加操作返回结果 +type SysProjectValueAddRes struct { + commonApi.EmptyRes +} + +// SysProjectValueEditReq 修改操作请求参数 +type SysProjectValueEditReq struct { + g.Meta `path:"/edit" tags:"项目产值" method:"put" summary:"项目产值修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + ProId int64 `p:"proId" dc:"项目id"` + Year string `p:"year" dc:"项目产值年"` + Month string `p:"month" dc:"项目产值月"` + ProValue string `p:"proValue" dc:"项目产值"` +} + +// SysProjectValueEditRes 修改操作返回结果 +type SysProjectValueEditRes struct { + commonApi.EmptyRes +} + +// SysProjectValueGetReq 获取一条数据请求 +type SysProjectValueGetReq struct { + g.Meta `path:"/get" tags:"项目产值" method:"get" summary:"项目产值get信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// SysProjectValueGetRes 获取一条数据结果 +type SysProjectValueGetRes struct { + g.Meta `mime:"application/json"` + *model.SysProjectValueListRes +} + +// SysProjectValueDeleteReq 删除数据请求 +type SysProjectValueDeleteReq struct { + g.Meta `path:"/delete" tags:"项目产值" method:"delete" summary:"删除项目产值"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// SysProjectValueDeleteRes 删除数据返回 +type SysProjectValueDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/sys_role.go b/api/v1/system/sys_role.go new file mode 100644 index 0000000..3040968 --- /dev/null +++ b/api/v1/system/sys_role.go @@ -0,0 +1,105 @@ +/* +* @desc:角色api +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/30 9:16 + */ + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +type RoleListReq struct { + g.Meta `path:"/role/list" tags:"角色管理" method:"get" summary:"角色列表"` + RoleName string `p:"roleName"` //参数名称 + Status string `p:"roleStatus"` //状态 + commonApi.PageReq +} + +type RoleListRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*entity.SysRole `json:"list"` +} + +type RoleGetParamsReq struct { + g.Meta `path:"/role/getParams" tags:"角色管理" method:"get" summary:"角色编辑参数"` +} + +type RoleGetParamsRes struct { + g.Meta `mime:"application/json"` + Menu []*model.SysAuthRuleInfoRes `json:"menu"` +} + +type RoleAddReq struct { + g.Meta `path:"/role/add" tags:"角色管理" method:"post" summary:"添加角色"` + Name string `p:"name" v:"required#角色名称不能为空"` + Status uint `p:"status" ` + ListOrder uint `p:"listOrder" ` + Remark string `p:"remark" ` + MenuIds []uint `p:"menuIds"` +} + +type RoleAddRes struct { +} + +type RoleGetReq struct { + g.Meta `path:"/role/get" tags:"角色管理" method:"get" summary:"获取角色信息"` + Id uint `p:"id" v:"required#角色id不能为空""` +} + +type RoleGetRes struct { + g.Meta `mime:"application/json"` + Role *entity.SysRole `json:"role"` + MenuIds []int `json:"menuIds"` +} + +type RoleEditReq struct { + g.Meta `path:"/role/edit" tags:"角色管理" method:"put" summary:"修改角色"` + Id int64 `p:"id" v:"required#角色id必须"` + Name string `p:"name" v:"required#角色名称不能为空"` + Status uint `p:"status" ` + ListOrder uint `p:"listOrder" ` + Remark string `p:"remark" ` + MenuIds []uint `p:"menuIds"` +} + +type RoleEditRes struct { +} + +type RoleDeleteReq struct { + g.Meta `path:"/role/delete" tags:"角色管理" method:"delete" summary:"删除角色"` + Ids []int64 `p:"ids" v:"required#角色id不能为空"` +} + +type RoleDeleteRes struct { +} + +type RoleDeptTreeSelectReq struct { + g.Meta `path:"/role/deptTreeSelect" tags:"角色管理" method:"get" summary:"获取角色数据权限"` + commonApi.Author + RoleId int64 `p:"roleId" v:"required#角色id必须"` +} + +type RoleDeptTreeSelectRes struct { + g.Meta `mime:"application/json"` + Depts []*model.SysDeptTreeRes `json:"depts"` + CheckedKeys []int64 `json:"checkedKeys"` +} + +// DataScopeReq 角色数据授权参数 +type DataScopeReq struct { + g.Meta `path:"/role/dataScope" tags:"角色管理" method:"put" summary:"角色数据授权"` + RoleId uint `p:"roleId" v:"required#角色ID不能为空"` + DataScope uint `p:"dataScope" v:"required#权限范围不能为空"` + DeptIds []uint `p:"deptIds"` +} + +type DataScopeRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/sys_user.go b/api/v1/system/sys_user.go new file mode 100644 index 0000000..9c28fe0 --- /dev/null +++ b/api/v1/system/sys_user.go @@ -0,0 +1,161 @@ +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + wxModel "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model/do" +) + +type UserMenusReq struct { + g.Meta `path:"/user/getUserMenus" tags:"用户管理" method:"get" summary:"获取用户菜单"` + commonApi.Author +} + +type UserMenusRes struct { + g.Meta `mime:"application/json"` + MenuList []*model.UserMenus `json:"menuList"` + Permissions []string `json:"permissions"` +} + +// UserSearchReq 用户搜索请求参数 +type UserSearchReq struct { + g.Meta `path:"/user/list" tags:"用户管理" method:"get" summary:"用户列表"` + DeptId string `p:"deptId"` //部门id + RoleId uint `p:"roleId"` + Mobile string `p:"mobile"` + Status string `p:"status"` + KeyWords string `p:"keyWords"` + commonApi.PageReq + commonApi.Author +} + +type UserSearchRes struct { + g.Meta `mime:"application/json"` + UserList []*model.SysUserRoleDeptRes `json:"userList"` + commonApi.ListRes +} + +type UserGetParamsReq struct { + g.Meta `path:"/user/params" tags:"用户管理" method:"get" summary:"用户维护参数获取"` +} + +type UserGetParamsRes struct { + g.Meta `mime:"application/json"` + RoleList []*entity.SysRole `json:"roleList"` + Posts []*entity.SysPost `json:"posts"` +} + +// SetUserReq 添加修改用户公用请求字段 +type SetUserReq struct { + DeptId uint64 `p:"deptId" v:"required#用户部门不能为空"` //所属部门 + Email string `p:"email" v:"email#邮箱格式错误"` //邮箱 + NickName string `p:"nickName" v:"required#用户昵称不能为空"` + Mobile string `p:"mobile" v:"required|phone#手机号不能为空|手机号格式错误"` + PostIds []int64 `p:"postIds"` + Remark string `p:"remark"` + RoleIds []int64 `p:"roleIds"` + Sex int `p:"sex"` + Status uint `p:"status"` + IsAdmin int `p:"isAdmin"` // 是否后台管理员 1 是 0 否 + IsData int `p:"isData"` // 项目备案 1查看所有书 2仅自己 +} + +// UserAddReq 添加用户参数 +type UserAddReq struct { + g.Meta `path:"/user/add" tags:"用户管理" method:"post" summary:"添加用户"` + *SetUserReq + UserName string `p:"userName" v:"required#用户账号不能为空"` + Password string `p:"password" v:"required|password#密码不能为空|密码以字母开头,只能包含字母、数字和下划线,长度在6~18之间"` + Project []int64 `p:"project" v:"required#项目id不能为空"` + UserSalt string + Power []PowerEntity `p:"power"` +} + +type PowerEntity struct { + SysUserId int64 `json:"sysUserId" dc:"用户id"` + ProjectId int64 `json:"projectId" dc:"项目id"` + Type string `json:"type" dc:"1模板 2资料 3回收站"` + V1 string `json:"v1" dc:"新建文件夹(1有权 2无权)"` + V2 string `json:"v2" dc:"本地导入(1有权 2无权)"` + V3 string `json:"v3" dc:"重命名(1有权 2无权)"` + V4 string `json:"v4" dc:"下载(1有权 2无权)"` + V5 string `json:"v5" dc:"预览(1有权 2无权)"` + V6 string `json:"v6" dc:"保存(1有权 2无权)"` + V7 string `json:"v7" dc:"删除(1有权 2无权)"` + V8 string `json:"v8" dc:"在线模板复制(1有权 2无权)"` + V9 string `json:"v9" dc:"在线资料移动(1有权 2无权)"` + V10 string `json:"v10" dc:"模板恢复/删除(1有权 2无权)"` + V11 string `json:"v11" dc:"资料恢复/删除(1有权 2无权)"` + V12 string `json:"v12" dc:"全项目文件预览/下载(1有权 2无权)"` +} + +type UserAddRes struct { +} + +// UserEditReq 修改用户参数 +type UserEditReq struct { + g.Meta `path:"/user/edit" tags:"用户管理" method:"put" summary:"修改用户"` + *SetUserReq + UserId int64 `p:"userId" v:"required#用户id不能为空"` + Project []int64 `p:"project" v:"required#项目id不能为空"` + Power []PowerEntity `p:"power"` +} + +type UserEditRes struct { +} + +type UserGetEditReq struct { + g.Meta `path:"/user/getEdit" tags:"用户管理" method:"get" summary:"获取用户信息"` + Id uint64 `p:"id"` +} + +type UserGetEditRes struct { + g.Meta `mime:"application/json"` + User *entity.SysUser `json:"user"` + CheckedRoleIds []uint `json:"checkedRoleIds"` + CheckedPosts []int64 `json:"checkedPosts"` + Project []int64 `json:"project"` + WxList []wxModel.SysUserProjectRelevancy `json:"wxList"` + PowerList []PowerEntity `json:"powerList"` +} + +// UserResetPwdReq 重置用户密码状态参数 +type UserResetPwdReq struct { + g.Meta `path:"/user/resetPwd" tags:"用户管理" method:"put" summary:"重置用户密码"` + Id uint64 `p:"userId" v:"required#用户id不能为空"` + Password string `p:"password" v:"required|password#密码不能为空|密码以字母开头,只能包含字母、数字和下划线,长度在6~18之间"` +} + +type UserResetPwdRes struct { +} + +// UserStatusReq 设置用户状态参数 +type UserStatusReq struct { + g.Meta `path:"/user/setStatus" tags:"用户管理" method:"put" summary:"设置用户状态"` + Id uint64 `p:"userId" v:"required#用户id不能为空"` + UserStatus uint `p:"status" v:"required#用户状态不能为空"` +} + +type UserStatusRes struct { +} + +type UserDeleteReq struct { + g.Meta `path:"/user/delete" tags:"用户管理" method:"delete" summary:"删除用户"` + Ids []int `p:"ids" v:"required#ids不能为空"` +} + +type UserDeleteRes struct { +} + +type UserGetByIdsReq struct { + g.Meta `path:"/user/getUsers" tags:"用户管理" method:"get" summary:"同时获取多个用户"` + commonApi.Author + Ids []int `p:"ids" v:"required#ids不能为空"` +} + +type UserGetByIdsRes struct { + g.Meta `mime:"application/json"` + List []*model.SysUserSimpleRes `json:"list"` +} diff --git a/api/v1/system/sys_user_online.go b/api/v1/system/sys_user_online.go new file mode 100644 index 0000000..a61852a --- /dev/null +++ b/api/v1/system/sys_user_online.go @@ -0,0 +1,40 @@ +/* +* @desc:在线用户 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2023/1/10 16:57 + */ + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +// SysUserOnlineSearchReq 列表搜索参数 +type SysUserOnlineSearchReq struct { + g.Meta `path:"/online/list" tags:"在线用户管理" method:"get" summary:"列表"` + Username string `p:"userName"` + Ip string `p:"ipaddr"` + commonApi.PageReq + commonApi.Author +} + +// SysUserOnlineSearchRes 列表结果 +type SysUserOnlineSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*entity.SysUserOnline `json:"list"` +} + +type SysUserOnlineForceLogoutReq struct { + g.Meta `path:"/online/forceLogout" tags:"在线用户管理" method:"delete" summary:"强制用户退出登录"` + commonApi.Author + Ids []int `p:"ids" v:"required#ids不能为空"` +} + +type SysUserOnlineForceLogoutRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/sys_user_project.go b/api/v1/system/sys_user_project.go new file mode 100644 index 0000000..1247504 --- /dev/null +++ b/api/v1/system/sys_user_project.go @@ -0,0 +1,85 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-27 15:20:52 +// 生成路径: api/v1/system/sys_user_project.go +// 生成人:gfast +// desc:用户和项目关联相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// SysUserProjectSearchReq 分页请求参数 +type SysUserProjectSearchReq struct { + g.Meta `path:"/list" tags:"用户和项目关联" method:"get" summary:"用户和项目关联列表"` + Id string `p:"id"` //序号 + UserId string `p:"userId" v:"userId@integer#用户需为整数"` //用户 + ProjectId string `p:"projectId" v:"projectId@integer#项目需为整数"` //项目 + commonApi.PageReq + commonApi.Author +} + +// SysUserProjectSearchRes 列表返回结果 +type SysUserProjectSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.SysUserProjectListRes `json:"list"` +} + +// SysUserProjectAddReq 添加操作请求参数 +type SysUserProjectAddReq struct { + g.Meta `path:"/add" tags:"用户和项目关联" method:"post" summary:"用户和项目关联添加"` + commonApi.Author + UserId int64 `p:"userId" ` + ProjectId int64 `p:"projectId" ` +} + +// SysUserProjectAddRes 添加操作返回结果 +type SysUserProjectAddRes struct { + commonApi.EmptyRes +} + +// SysUserProjectEditReq 修改操作请求参数 +type SysUserProjectEditReq struct { + g.Meta `path:"/edit" tags:"用户和项目关联" method:"put" summary:"用户和项目关联修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + UserId int64 `p:"userId" ` + ProjectId int64 `p:"projectId" ` +} + +// SysUserProjectEditRes 修改操作返回结果 +type SysUserProjectEditRes struct { + commonApi.EmptyRes +} + +// SysUserProjectGetReq 获取一条数据请求 +type SysUserProjectGetReq struct { + g.Meta `path:"/get" tags:"用户和项目关联" method:"get" summary:"获取用户和项目关联信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// SysUserProjectGetRes 获取一条数据结果 +type SysUserProjectGetRes struct { + g.Meta `mime:"application/json"` + *model.SysUserProjectInfoRes +} + +// SysUserProjectDeleteReq 删除数据请求 +type SysUserProjectDeleteReq struct { + g.Meta `path:"/delete" tags:"用户和项目关联" method:"delete" summary:"删除用户和项目关联"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// SysUserProjectDeleteRes 删除数据返回 +type SysUserProjectDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/sys_wechat_role.go b/api/v1/system/sys_wechat_role.go new file mode 100644 index 0000000..a7c2448 --- /dev/null +++ b/api/v1/system/sys_wechat_role.go @@ -0,0 +1,120 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-01-22 15:05:42 +// 生成路径: api/v1/system/sys_wechat_role.go +// 生成人:gfast +// desc:微信角色相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// SysWechatRoleSearchReq 分页请求参数 +type SysWechatRoleSearchReq struct { + g.Meta `path:"/list" tags:"微信角色" method:"get" summary:"微信角色列表"` + Id string `p:"id"` //主键ID + Name string `p:"name"` //角色名称 + ListOrder string `p:"listOrder" v:"listOrder@integer#排序需为整数"` //排序 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// SysWechatRoleSearchRes 列表返回结果 +type SysWechatRoleSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.SysWechatRoleListRes `json:"list"` +} + +// SysWechatRoleSearchNoPageReq 不分页请求参数 +type SysWechatRoleSearchNoPageReq struct { + g.Meta `path:"/noPageList" tags:"微信角色" method:"get" summary:"微信角色列表"` + Name string `p:"name"` //角色名称 + commonApi.Author +} + +// SysWechatRoleSearchNoPageRes 不分页请求参数 +type SysWechatRoleSearchNoPageRes struct { + g.Meta `mime:"application/json"` + List []*model.SysWechatRoleListRes `json:"list"` +} + +// SysWechatRoleAddReq 添加操作请求参数 +type SysWechatRoleAddReq struct { + g.Meta `path:"/add" tags:"微信角色" method:"post" summary:"微信角色添加"` + commonApi.Author + Name string `p:"name" v:"required#角色名称不能为空"` + ListOrder int `p:"listOrder" v:"required#排序不能为空"` + ModuleIds []int64 `p:"moduleIds" dc:"模块id" v:"array"` + Remark string `p:"remark" ` +} + +// SysWechatRoleAddRes 添加操作返回结果 +type SysWechatRoleAddRes struct { + commonApi.EmptyRes +} + +// SysWechatRoleEditReq 修改操作请求参数 +type SysWechatRoleEditReq struct { + g.Meta `path:"/edit" tags:"微信角色" method:"put" summary:"微信角色修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + Name string `p:"name" v:"required#角色名称不能为空"` + ListOrder int `p:"listOrder" dc:"排序" v:"required#排序不能为空"` + Status int `p:"status" dc:"状态;0:禁用;1:正常" v:"required#状态不能为空"` + ModuleIds []int64 `p:"moduleIds" dc:"模块id" v:"array"` + Remark string `p:"remark" v:"max-length:512#最大输入字数为512"` +} + +// SysWechatRoleEditRes 修改操作返回结果 +type SysWechatRoleEditRes struct { + commonApi.EmptyRes +} + +// SysWechatRoleGetReq 获取一条数据请求 +type SysWechatRoleGetReq struct { + g.Meta `path:"/get" tags:"微信角色" method:"get" summary:"获取微信角色信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// SysWechatRoleGetRes 获取一条数据结果 +type SysWechatRoleGetRes struct { + g.Meta `mime:"application/json"` + *model.SysWechatRoleListTwoRes +} + +// SysWechatRoleDeleteReq 删除数据请求 +type SysWechatRoleDeleteReq struct { + g.Meta `path:"/delete" tags:"微信角色" method:"delete" summary:"删除微信角色"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// SysWechatRoleDeleteRes 删除数据返回 +type SysWechatRoleDeleteRes struct { + commonApi.EmptyRes +} + +// SysWechatModuleSearchReq 微信模块列表 +type SysWechatModuleSearchReq struct { + g.Meta `path:"/modulelist" tags:"微信角色" method:"get" summary:"微信模块列表"` + Id string `p:"id"` //主键ID + Name string `p:"name"` //角色名称 + ListOrder string `p:"listOrder" v:"listOrder@integer#排序需为整数"` //排序 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.Author +} + +// SysWechatModuleSearchRes 微信模块列表 +type SysWechatModuleSearchRes struct { + g.Meta `mime:"application/json"` + List []*model.SysWechatModuleInfoRes `json:"list"` +} diff --git a/api/v1/system/template_data.go b/api/v1/system/template_data.go new file mode 100644 index 0000000..2665249 --- /dev/null +++ b/api/v1/system/template_data.go @@ -0,0 +1,87 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-12-08 14:21:01 +// 生成路径: api/v1/system/template_data.go +// 生成人:gfast +// desc:工程资料>资料相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// TemplateDataSearchReq 分页请求参数 +type TemplateDataSearchReq struct { + g.Meta `path:"/list" tags:"废弃-工程资料>资料" method:"get" summary:"工程资料>资料列表"` + ProjectId string `p:"projectId" dc:"项目id"` //项目id + DataName string `p:"dataName" dc:"名称"` //名称 + DataType string `p:"dataType" dc:"1编写 2存储"` //1编写 2存储 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// TemplateDataSearchRes 列表返回结果 +type TemplateDataSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.TemplateDataListRes `json:"list"` +} + +// TemplateDataAddReq 添加操作请求参数 +type TemplateDataAddReq struct { + g.Meta `path:"/add" tags:"废弃-工程资料>资料" method:"post" summary:"工程资料>资料添加"` + commonApi.Author + ProjectId string `p:"projectId" dc:"项目id"` + DataName string `p:"dataName" dc:"名称" v:"required#名称不能为空"` + DataType string `p:"dataType" dc:"1编写 2存储"` +} + +// TemplateDataAddRes 添加操作返回结果 +type TemplateDataAddRes struct { + commonApi.EmptyRes +} + +// TemplateDataEditReq 修改操作请求参数 +type TemplateDataEditReq struct { + g.Meta `path:"/edit" tags:"废弃-工程资料>资料" method:"put" summary:"工程资料>资料修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + DataName string `p:"dataName" v:"required#名称不能为空"` + DataType string `p:"dataType" ` +} + +// TemplateDataEditRes 修改操作返回结果 +type TemplateDataEditRes struct { + commonApi.EmptyRes +} + +// TemplateDataGetReq 获取一条数据请求 +type TemplateDataGetReq struct { + g.Meta `path:"/get" tags:"废弃-工程资料>资料" method:"get" summary:"获取工程资料>资料信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// TemplateDataGetRes 获取一条数据结果 +type TemplateDataGetRes struct { + g.Meta `mime:"application/json"` + *model.TemplateDataInfoRes +} + +// TemplateDataDeleteReq 删除数据请求 +type TemplateDataDeleteReq struct { + g.Meta `path:"/delete" tags:"废弃-工程资料>资料" method:"delete" summary:"删除工程资料>资料"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// TemplateDataDeleteRes 删除数据返回 +type TemplateDataDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/template_data_junior.go b/api/v1/system/template_data_junior.go new file mode 100644 index 0000000..9b92563 --- /dev/null +++ b/api/v1/system/template_data_junior.go @@ -0,0 +1,93 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-12-08 14:21:01 +// 生成路径: api/v1/system/template_data_junior.go +// 生成人:gfast +// desc:工程资料>资料>下级模板相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// TemplateDataJuniorSearchReq 分页请求参数 +type TemplateDataJuniorSearchReq struct { + g.Meta `path:"/list" tags:"工程资料>资料>下级模板" method:"get" summary:"工程资料>资料>下级模板列表"` + ProjectId int64 `p:"projectId" dc:"项目id"` + Name string `p:"name" dc:"模板名称"` + Suffix string `p:"suffix" dc:"后缀"` + CreatedAt string `p:"createdAt" dc:"创建时间" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// TemplateDataJuniorSearchRes 列表返回结果 +type TemplateDataJuniorSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.TemplateDataJuniorListRes `json:"list"` +} + +// TemplateDataJuniorAddReq 添加操作请求参数 +type TemplateDataJuniorAddReq struct { + g.Meta `path:"/add" tags:"工程资料>资料>下级模板" method:"post" summary:"工程资料>资料>下级模板添加"` + commonApi.Author + ProjectId int64 `p:"projectId" dc:"项目id"` + Name string `p:"name" v:"required#模板名称不能为空"` + File *ghttp.UploadFile `p:"File" dc:"文件上传"` + Suffix string `p:"suffix" ` +} + +// TemplateDataJuniorAddRes 添加操作返回结果 +type TemplateDataJuniorAddRes struct { + commonApi.EmptyRes +} + +// TemplateDataJuniorEditReq 修改操作请求参数 +type TemplateDataJuniorEditReq struct { + g.Meta `path:"/edit" tags:"工程资料>资料>下级模板" method:"put" summary:"工程资料>资料>下级模板修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + ProjectId int64 `p:"projectId" dc:"项目id"` + Name string `p:"name" v:"required#模板名称不能为空"` + FilenPath string `p:"filenPath" ` + Suffix string `p:"suffix" ` + CreateBy string `p:"createBy" ` + UpdateBy string `p:"updateBy" ` +} + +// TemplateDataJuniorEditRes 修改操作返回结果 +type TemplateDataJuniorEditRes struct { + commonApi.EmptyRes +} + +// TemplateDataJuniorGetReq 获取一条数据请求 +type TemplateDataJuniorGetReq struct { + g.Meta `path:"/get" tags:"工程资料>资料>下级模板" method:"get" summary:"获取工程资料>资料>下级模板信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// TemplateDataJuniorGetRes 获取一条数据结果 +type TemplateDataJuniorGetRes struct { + g.Meta `mime:"application/json"` + *model.TemplateDataJuniorInfoRes +} + +// TemplateDataJuniorDeleteReq 删除数据请求 +type TemplateDataJuniorDeleteReq struct { + g.Meta `path:"/delete" tags:"工程资料>资料>下级模板" method:"delete" summary:"删除工程资料>资料>下级模板"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// TemplateDataJuniorDeleteRes 删除数据返回 +type TemplateDataJuniorDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/template_data_source_data.go b/api/v1/system/template_data_source_data.go new file mode 100644 index 0000000..7646e27 --- /dev/null +++ b/api/v1/system/template_data_source_data.go @@ -0,0 +1,96 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-12-08 10:06:54 +// 生成路径: api/v1/system/template_data_source_data.go +// 生成人:gfast +// desc:模板资料源数据相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// TemplateDataSourceDataSearchReq 分页请求参数 +type TemplateDataSourceDataSearchReq struct { + g.Meta `path:"/list" tags:"工程资料>模板or资料>源数据" method:"get" summary:"模板资料源数据列表"` + Id string `p:"id"` //主键ID + Type string `p:"type"` //1模板 2资料 + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` //项目id + SourceName string `p:"sourceName"` //资源名称 + SourceId string `p:"sourceId"` //资源ID + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// TemplateDataSourceDataSearchRes 列表返回结果 +type TemplateDataSourceDataSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.TemplateDataSourceDataListRes `json:"list"` +} + +// TemplateDataSourceDataAddReq 添加操作请求参数 +type TemplateDataSourceDataAddReq struct { + g.Meta `path:"/add" tags:"工程资料>模板or资料>源数据" method:"post" summary:"模板资料源数据添加"` + commonApi.Author + Type string `p:"type" v:"required#1模板 2资料不能为空"` + TypeId int64 `p:"typeId" v:"required#对应数据id不能为空"` + ProjectId int64 `p:"projectId" v:"required#项目id不能为空"` + SourceName string `p:"sourceName" v:"required#资源名称不能为空"` + SourceId string `p:"sourceId" v:"required#资源ID不能为空"` + SourcePath string `p:"sourcePath" v:"required#资源路径不能为空"` +} + +// TemplateDataSourceDataAddRes 添加操作返回结果 +type TemplateDataSourceDataAddRes struct { + commonApi.EmptyRes +} + +// TemplateDataSourceDataEditReq 修改操作请求参数 +type TemplateDataSourceDataEditReq struct { + g.Meta `path:"/edit" tags:"工程资料>模板or资料>源数据" method:"put" summary:"模板资料源数据修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + Type string `p:"type" v:"required#1模板 2资料不能为空"` + TypeId int64 `p:"typeId" v:"required#对应数据id不能为空"` + ProjectId int64 `p:"projectId" v:"required#项目id不能为空"` + SourceName string `p:"sourceName" v:"required#资源名称不能为空"` + SourceId string `p:"sourceId" v:"required#资源ID不能为空"` + SourcePath string `p:"sourcePath" v:"required#资源路径不能为空"` +} + +// TemplateDataSourceDataEditRes 修改操作返回结果 +type TemplateDataSourceDataEditRes struct { + commonApi.EmptyRes +} + +// TemplateDataSourceDataGetReq 获取一条数据请求 +type TemplateDataSourceDataGetReq struct { + g.Meta `path:"/get" tags:"工程资料>模板or资料>源数据" method:"get" summary:"获取模板资料源数据信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// TemplateDataSourceDataGetRes 获取一条数据结果 +type TemplateDataSourceDataGetRes struct { + g.Meta `mime:"application/json"` + *model.TemplateDataSourceDataInfoRes +} + +// TemplateDataSourceDataDeleteReq 删除数据请求 +type TemplateDataSourceDataDeleteReq struct { + g.Meta `path:"/delete" tags:"工程资料>模板or资料>源数据" method:"delete" summary:"删除模板资料源数据"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// TemplateDataSourceDataDeleteRes 删除数据返回 +type TemplateDataSourceDataDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/todo_tasks.go b/api/v1/system/todo_tasks.go new file mode 100644 index 0000000..a482c22 --- /dev/null +++ b/api/v1/system/todo_tasks.go @@ -0,0 +1,114 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-05-15 17:30:14 +// 生成路径: api/v1/system/todo_tasks.go +// 生成人:gfast +// desc:App-待办相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// TodoTasksSearchReq 分页请求参数 +type TodoTasksSearchReq struct { + g.Meta `path:"/list" tags:"App-待办" method:"get" summary:"App-待办列表"` + Id string `p:"id"` // + MissingCardTime string `p:"missingCardTime"` // 缺卡时间 + Applicant string `p:"applicant" v:"applicant@integer#申请人需为整数"` // 申请人 + ProjectId string `p:"projectId" v:"projectId@integer#项目ID需为整数"` // 项目ID + TaskType string `p:"taskType" v:"taskType@integer#0 补卡提醒 | 1 考勤审批需为整数"` // 0 补卡提醒 | 1 考勤审批 + OrderId string `p:"orderId" v:"orderId@integer#对应跳转的主键ID需为整数"` // 对应跳转的主键ID + CreatedAt string `p:"createdAt" v:"createdAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // + UserId string `p:"userId" v:"userId@integer#用户ID需为整数"` // 用户ID + commonApi.PageReq + commonApi.Author +} + +// TodoTasksSearchRes 列表返回结果 +type TodoTasksSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.TodoTasksListRes `json:"list"` +} + +// 获取自己的待办列表 +type TodoTasksMyListReq struct { + g.Meta `path:"/todoList" tags:"App-待办" method:"get" summary:"获取自己的待办列表"` + commonApi.Author + commonApi.PageReq + ProjectId int `p:"projectId" v:"projectId@integer#项目ID需为整数"` // 项目ID + Role string `p:"role" dc:"0 管理员 | 1 施工人员"` // // 角色 + Status int `p:"status" v:"status@integer#状态" dc:"0 未处理 | 1 已处理 | 2 所有"` +} + +type TodoTasksMyListRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.TodoTasksListRes `json:"list"` +} + +// TodoTasksAddReq 添加操作请求参数 +type TodoTasksAddReq struct { + g.Meta `path:"/add" tags:"App-待办" method:"post" summary:"App-待办添加"` + commonApi.Author + MissingCardTime string `p:"missingCardTime" ` + Applicant int `p:"applicant" ` + ProjectId int `p:"projectId" ` + TaskType int `p:"taskType" ` + OrderId int `p:"orderId" ` + UserId int `p:"userId" ` +} + +// TodoTasksAddRes 添加操作返回结果 +type TodoTasksAddRes struct { + commonApi.EmptyRes +} + +// TodoTasksEditReq 修改操作请求参数 +type TodoTasksEditReq struct { + g.Meta `path:"/edit" tags:"App-待办" method:"put" summary:"App-待办修改"` + commonApi.Author + Id uint `p:"id" v:"required#主键ID不能为空"` + MissingCardTime string `p:"missingCardTime" ` + Applicant int `p:"applicant" ` + ProjectId int `p:"projectId" ` + TaskType int `p:"taskType" ` + OrderId int `p:"orderId" ` + UserId int `p:"userId" ` +} + +// TodoTasksEditRes 修改操作返回结果 +type TodoTasksEditRes struct { + commonApi.EmptyRes +} + +// TodoTasksGetReq 获取一条数据请求 +type TodoTasksGetReq struct { + g.Meta `path:"/get" tags:"App-待办" method:"get" summary:"获取App-待办信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// TodoTasksGetRes 获取一条数据结果 +type TodoTasksGetRes struct { + g.Meta `mime:"application/json"` + *model.TodoTasksInfoRes +} + +// TodoTasksDeleteReq 删除数据请求 +type TodoTasksDeleteReq struct { + g.Meta `path:"/delete" tags:"App-待办" method:"delete" summary:"删除App-待办"` + commonApi.Author + Ids []uint `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// TodoTasksDeleteRes 删除数据返回 +type TodoTasksDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/tools_gen_table.go b/api/v1/system/tools_gen_table.go new file mode 100644 index 0000000..865b250 --- /dev/null +++ b/api/v1/system/tools_gen_table.go @@ -0,0 +1,127 @@ +/* +* @desc:代码生成 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/10/26 16:44 + */ + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +// ToolsGenTableSearchReq 列表分页请求参数 +type ToolsGenTableSearchReq struct { + g.Meta `path:"/tools/gen/tableList" tags:"代码生成" method:"get" summary:"获取数据表"` + TableName string `p:"tableName"` //表名称 + TableComment string `p:"tableComment"` //表描述 + commonApi.PageReq + commonApi.Author +} + +// ToolsGenTableSearchRes 表列表数据 +type ToolsGenTableSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*entity.ToolsGenTable `json:"list"` +} + +// ToolsGenTableImportSearchReq 要导入的表列表数据 +type ToolsGenTableImportSearchReq struct { + g.Meta `path:"/tools/gen/dataList" tags:"代码生成" method:"get" summary:"获取需要导入的数据表"` + TableName string `p:"tableName"` //表名称 + TableComment string `p:"tableComment"` //表描述 + commonApi.PageReq + commonApi.Author +} + +// ToolsGenTableImportTableReq 导入表数据操作 +type ToolsGenTableImportTableReq struct { + g.Meta `path:"/tools/gen/importTableSave" tags:"代码生成" method:"post" summary:"导入表结构操作"` + commonApi.Author + Tables []string `p:"tables" v:"required#表名必须指定"` +} + +type ToolsGenTableDeleteReq struct { + g.Meta `path:"/tools/gen/tableDelete" tags:"代码生成" method:"delete" summary:"删除已导入的表"` + commonApi.Author + Ids []int `p:"ids" v:required#删除的id必须` +} + +type ToolsGenTableEditReq struct { + g.Meta `path:"/tools/gen/columnList" tags:"代码生成" method:"get" summary:"生成数据编辑"` + commonApi.Author + TableId int64 `p:"tableId" v:"required#tableId字段必须"` +} + +// ToolsGenTableEditRes 生成数据编辑页面返回数据 +type ToolsGenTableEditRes struct { + g.Meta `mime:"application/json"` + List []*entity.ToolsGenTableColumn `json:"list"` + Info *model.ToolsGenTableEditData `json:"info"` +} + +// ToolsGenRelationTableReq 获取关联表数据 +type ToolsGenRelationTableReq struct { + g.Meta `path:"/tools/gen/relationTable" tags:"代码生成" method:"get" summary:"获取关联表数据"` +} + +// ToolsGenRelationTableRes 关联表返回数据 +type ToolsGenRelationTableRes struct { + g.Meta `mime:"application/json"` + Data []*model.ToolsGenTableColumnsData `json:"data"` +} + +// ToolsGenTableColumnsEditReq 生成信息修改参数 +type ToolsGenTableColumnsEditReq struct { + g.Meta `path:"/tools/gen/editSave" tags:"代码生成" method:"post" summary:"生成信息修改保存"` + commonApi.Author + TableId int64 `p:"tableId" v:"required#主键ID不能为空"` + TableName string `p:"tableName" v:"required#表名称不能为空"` + TableComment string `p:"tableComment" v:"required#表描述不能为空"` + ClassName string `p:"className" v:"required#实体类名称不能为空"` + FunctionAuthor string `p:"functionAuthor" v:"required#作者不能为空"` + TplCategory string `p:"tplCategory"` + PackageName string `p:"packageName" v:"required#生成包路径不能为空"` + ModuleName string `p:"moduleName" v:"required#生成模块名不能为空"` + BusinessName string `p:"businessName" v:"required#生成业务名不能为空"` + FunctionName string `p:"functionName" v:"required#生成功能名不能为空"` + Remark string `p:"remark"` + Overwrite string `p:"overwrite" v:"required#是否覆盖原有文件不能为空"` + SortColumn string `p:"sort_column" v:"required#缺省排序字段不能为空"` + SortType string `p:"sort_type" v:"required#缺省排序方式不能为空"` + ShowDetail string `p:"show_detail" v:"required#是否有查看详情功能不能为空"` + Params string `p:"params"` + Columns []*entity.ToolsGenTableColumn `p:"columns"` + TreeCode string `p:"tree_code"` + TreeParentCode string `p:"tree_parent_code"` + TreeName string `p:"tree_name"` + UserName string +} + +type ToolsGenTableColumnsEditRes struct { + commonApi.EmptyRes +} + +type ToolsGenTablePreviewReq struct { + g.Meta `path:"/tools/gen/preview" tags:"代码生成" method:"get" summary:"代码预览"` + TableId int64 `p:"tableId" v:"required#表ID必须"` +} + +type ToolsGenTablePreviewRes struct { + g.Meta `mime:"application/json"` + Data g.MapStrStr `json:"data"` +} + +type ToolsGenTableBatchGenCodeReq struct { + g.Meta `path:"/tools/gen/batchGenCode" tags:"代码生成" method:"post" summary:"代码生成"` + Ids []int `p:"ids" v:"required#ids必须且不能为空"` +} + +type ToolsGenTableBatchGenCodeRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/ueditor.go b/api/v1/system/ueditor.go new file mode 100644 index 0000000..fd8eecb --- /dev/null +++ b/api/v1/system/ueditor.go @@ -0,0 +1,34 @@ +/* +* @desc:ueditor编辑器 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/11/17 14:15 + */ + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" +) + +type UEditorConfigReq struct { + g.Meta `path:"/uEditor/action" tags:"UEditor" method:"get" summary:"获取UEditor配置"` + UEditorReq +} + +type UEditorUpFileReq struct { + g.Meta `path:"/uEditor/action" tags:"UEditor" method:"post" summary:"UEditor上传"` + UEditorReq +} + +type UEditorReq struct { + Action string `p:"action"` + Callback string `p:"callback"` + File *ghttp.UploadFile `p:"upfile" type:"file"` +} + +type UEditorRes struct { + g.Meta `mime:"application/json"` + g.Map +} diff --git a/api/v1/system/upload.go b/api/v1/system/upload.go new file mode 100644 index 0000000..7eaedcc --- /dev/null +++ b/api/v1/system/upload.go @@ -0,0 +1,45 @@ +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" +) + +// 单图上传 +type UploadSingleImgReq struct { + g.Meta `path:"/upload/singleImg" tags:"后台文件上传" method:"post" summary:"上传图片"` + File *ghttp.UploadFile `p:"file" type:"file" dc:"选择上传文件" v:"required#上传文件必须"` +} + +// 单文件上传 +type UploadSingleFileReq struct { + g.Meta `path:"/upload/singleFile" tags:"后台文件上传" method:"post" summary:"上传文件"` + File *ghttp.UploadFile `p:"file" type:"file" dc:"选择上传文件" v:"required#上传文件必须"` +} + +type UploadSingleRes struct { + g.Meta `mime:"application/json"` + UploadResponse +} + +// 多图上传 +type UploadMultipleImgReq struct { + g.Meta `path:"/upload/multipleImg" tags:"后台文件上传" method:"post" summary:"上传多图片"` + File ghttp.UploadFiles `p:"file" type:"file" dc:"选择上传文件" v:"required#上传文件必须"` +} + +// 多文件上传 +type UploadMultipleFileReq struct { + g.Meta `path:"/upload/multipleFile" tags:"后台文件上传" method:"post" summary:"上传多文件"` + File ghttp.UploadFiles `p:"file" type:"file" dc:"选择上传文件" v:"required#上传文件必须"` +} + +type UploadMultipleRes []*UploadResponse + +type UploadResponse struct { + Size int64 `json:"size" dc:"文件大小"` + Path string `json:"path" dc:"文件相对路径"` + FullPath string `json:"fullPath" dc:"文件绝对路径"` + Name string `json:"name" dc:"文件名称"` + Type string `json:"type" dc:"文件类型"` +} diff --git a/api/v1/system/user_registration.go b/api/v1/system/user_registration.go new file mode 100644 index 0000000..2af23d0 --- /dev/null +++ b/api/v1/system/user_registration.go @@ -0,0 +1,101 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-07-26 15:32:12 +// 生成路径: api/v1/system/user_registration.go +// 生成人:gfast +// desc:极光推送相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// UserRegistrationSearchReq 分页请求参数 +type UserRegistrationSearchReq struct { + g.Meta `path:"/list" tags:"极光推送" method:"get" summary:"极光推送列表"` + Id string `p:"id"` // + UserId string `p:"userId" v:"userId@integer#用户ID需为整数"` // 用户ID + OpenId string `p:"openId"` // 微信 open_id + RegistrationId string `p:"registrationId"` // 极光推送 设备唯一标识 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // + commonApi.PageReq + commonApi.Author +} + +// UserRegistrationSearchRes 列表返回结果 +type UserRegistrationSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.UserRegistrationListRes `json:"list"` +} + +// UserRegistrationAddReq 添加操作请求参数 +type UserRegistrationAddReq struct { + g.Meta `path:"/add" tags:"极光推送" method:"post" summary:"极光推送添加"` + commonApi.Author + UserId int `p:"userId" ` + OpenId string `p:"openId" ` + RegistrationId string `p:"registrationId" ` +} + +// UserRegistrationAddRes 添加操作返回结果 +type UserRegistrationAddRes struct { + commonApi.EmptyRes +} + +// UserRegistrationEditReq 修改操作请求参数 +type UserRegistrationEditReq struct { + g.Meta `path:"/edit" tags:"极光推送" method:"put" summary:"极光推送修改"` + commonApi.Author + Id uint `p:"id" v:"required#主键ID不能为空"` + UserId int `p:"userId" ` + OpenId string `p:"openId" ` + RegistrationId string `p:"registrationId" ` +} + +// UserRegistrationEditRes 修改操作返回结果 +type UserRegistrationEditRes struct { + commonApi.EmptyRes +} + +// UserRegistrationGetReq 获取一条数据请求 +type UserRegistrationGetReq struct { + g.Meta `path:"/get" tags:"极光推送" method:"get" summary:"获取极光推送信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// UserRegistrationGetRes 获取一条数据结果 +type UserRegistrationGetRes struct { + g.Meta `mime:"application/json"` + *model.UserRegistrationInfoRes +} + +// UserRegistrationDeleteReq 删除数据请求 +type UserRegistrationDeleteReq struct { + g.Meta `path:"/delete" tags:"极光推送" method:"delete" summary:"删除极光推送"` + commonApi.Author + Ids []uint `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// UserRegistrationDeleteRes 删除数据返回 +type UserRegistrationDeleteRes struct { + commonApi.EmptyRes +} + +// UserRegistrationRegisterReq 为当前用户注册设备 RegistrationId +type UserRegistrationRegisterReq struct { + g.Meta `path:"/register" tags:"极光推送" method:"post" summary:"为当前用户注册设备 RegistrationId"` + RegistrationId string `p:"registrationId" v:"required#RegistrationId不能为空"` // RegistrationId + commonApi.Author +} + +// UserRegistrationRegisterRes 为当前用户注册设备 RegistrationId 返回 +type UserRegistrationRegisterRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/work_schedule.go b/api/v1/system/work_schedule.go new file mode 100644 index 0000000..1515aab --- /dev/null +++ b/api/v1/system/work_schedule.go @@ -0,0 +1,211 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-03-20 10:02:26 +// 生成路径: api/v1/system/work_schedule.go +// 生成人:gfast +// desc:工作计划相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// WorkScheduleSearchReq 分页请求参数 +type WorkScheduleSearchReq struct { + g.Meta `path:"/list" tags:"工作计划" method:"get" summary:"工作计划列表"` + Id string `p:"id"` // + WorkId string `p:"workId"` // 关联的工作ID + StartAt string `p:"startAt" v:"startAt@datetime#开始时间需为YYYY-MM-DD hh:mm:ss格式"` // 开始时间 + Detail string `p:"detail"` // 每天详细数据 + Status string `p:"status" v:"status@integer#状态需为整数"` // 状态 + PlanNum string `p:"planNum" v:"planNum@integer#计划需为整数"` // 计划 + FinishedNum string `p:"finishedNum" v:"finishedNum@integer#完成量需为整数"` // 完成量 + commonApi.PageReq + commonApi.Author +} + +// WorkScheduleSearchRes 列表返回结果 +type WorkScheduleSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.WorkScheduleInfo2Res `json:"list"` +} + +// WorkScheduleAddReq 添加操作请求参数 +type WorkScheduleAddReq struct { + g.Meta `path:"/add" tags:"工作计划" method:"post" summary:"工作计划添加"` + commonApi.Author + WorkId string `p:"workId" ` + StartAt *gtime.Time `p:"startAt" ` + Detail string `p:"detail" ` + Status int `p:"status" v:"required#状态不能为空"` + PlanNum int `p:"planNum" ` + FinishedNum int `p:"finishedNum" ` +} + +// WorkScheduleAddRes 添加操作返回结果 +type WorkScheduleAddRes struct { + commonApi.EmptyRes +} + +// WorkScheduleEditReq 修改操作请求参数 +type WorkScheduleEditReq struct { + g.Meta `path:"/edit" tags:"工作计划" method:"put" summary:"工作计划修改"` + commonApi.Author + Id uint `p:"id" v:"required#主键ID不能为空"` + WorkId string `p:"workId" ` + StartAt *gtime.Time `p:"startAt" ` + Detail string `p:"detail" ` + Status int `p:"status" v:"required#状态不能为空"` + PlanNum int `p:"planNum" ` + FinishedNum int `p:"finishedNum" ` +} + +// WorkScheduleEditRes 修改操作返回结果 +type WorkScheduleEditRes struct { + commonApi.EmptyRes +} + +// WorkScheduleGetReq 获取一条数据请求 +type WorkScheduleGetReq struct { + g.Meta `path:"/get" tags:"工作计划" method:"get" summary:"获取工作计划信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// WorkScheduleGetRes 获取一条数据结果 +type WorkScheduleGetRes struct { + g.Meta `mime:"application/json"` + *model.WorkScheduleInfoRes +} + +// WorkScheduleDeleteReq 删除数据请求 +type WorkScheduleDeleteReq struct { + g.Meta `path:"/delete" tags:"工作计划" method:"delete" summary:"删除工作计划"` + commonApi.Author + Ids int `p:"ids" v:"required#主键必须" dc:"计划的主键ID"` // 通过主键删除 + // 方阵ID + FangzhenId string `p:"fangzhenId" v:"required#方阵ID不能为空" dc:"当前方阵ID"` +} + +// WorkScheduleDeleteRes 删除数据返回 +type WorkScheduleDeleteRes struct { + commonApi.EmptyRes +} + +type ScheduleDetail struct { + Date string `json:"date" dc:"日期"` + // 计划数量 + PlanNum int `json:"planNum" dc:"单日计划数量"` +} + +// WorkScheduleAdddReq 新增工作计划 +type WorkScheduleAdddReq struct { + g.Meta `path:"/addPlan" tags:"工作计划" method:"post" summary:"工作计划添加"` + // 工作ID + WorkID string `p:"workId" v:"required#工作ID不能为空" dc:"工作ID"` + // 是否延期 + IsDelay int `p:"is_delay" d:"0" dc:"是否延期"` + // 计划数量 + PlanNum int `p:"planNum" v:"required#计划数量不能为空" dc:"计划总数量"` + // 计划工期 + PlanTime []ScheduleDetail `p:"scheduledTime" v:"required#计划工期不能为空" dc:"计划工期"` +} + +// 新增工作计划返回 +type WorkScheduleAdddRes struct { + commonApi.EmptyRes +} + +// 获取指定 WorkID 下最后一个任务的结束时间 +type WorkScheduleLastTimeReq struct { + g.Meta `path:"/lastTime" tags:"工作计划" method:"get" summary:"获取指定工作ID下最后一个任务的结束时间"` + commonApi.Author + // 是否延期 + IsDelay int `p:"is_delay" dc:"是否延期"` + WorkID string `p:"workId" v:"required#工作ID不能为空" dc:"工作ID"` +} + +type WorkScheduleLastTimeRes struct { + g.Meta `mime:"application/json"` + // 结束时间 + EndAt *gtime.Time `json:"endAt" dc:"最后一个任务的结束时间"` + // 剩余可分配数量 + RemainingNum int `json:"remainingNum" dc:"剩余可分配数量"` +} + +type WorkScheduleSubmitReq struct { + g.Meta `path:"/submit" tags:"工作计划" method:"post" summary:"提交工作计划"` + ID uint `p:"id" v:"required#主键ID不能为空" dc:"主键ID"` + WorkID string `p:"workId" v:"required#工作ID不能为空" dc:"工作ID"` + SubmitTime string `p:"submitTime" v:"required#提交时间不能为空" dc:"提交时间"` + FinishedNum int `p:"finishedNum" v:"required#完成数量不能为空" dc:"完成数量"` +} + +type WorkScheduleSubmitRes struct { + commonApi.EmptyRes +} + +type WorkScheduleDetailReq struct { + g.Meta `path:"/scheduleDetail" tags:"工作计划" method:"get" summary:"获取工作计划详情"` + WorkID string `p:"workId" v:"required#工作ID不能为空" dc:"工作ID"` +} + +type WorkScheduleDetailRes struct { + g.Meta `mime:"application/json"` + List []model.WorkScheduleDetail `json:"list"` +} + +// 获取导出日报的可选日期 +type WorkScheduleExportDateReq struct { + g.Meta `path:"/exportDate" tags:"工作计划" method:"get" summary:"获取导出日报的可选日期"` + SubProjectID string `p:"subProjectId" dc:"子项目ID"` + FangzhenID string `p:"fangzhenId" dc:"方阵ID"` +} + +type WorkScheduleExportDateRes struct { + g.Meta `mime:"application/json"` + // 可选日期 + StartTime string `json:"startTime"` // 起始时间 + EndTime string `json:"endTime"` // 结束时间 +} + +// 导出为 Excel +type WorkScheduleExportExcelReq struct { + g.Meta `path:"/exportExcel" tags:"工作计划" method:"get" summary:"导出为Excel"` + // 方阵ID + FangzhenID string `p:"fangzhenId" dc:"方阵ID"` + // 子项目ID + SubProjectID string `p:"subProjectId" dc:"子项目ID"` + // 导出的起始时间 + StartTime string `p:"startTime" v:"required#起始时间不能为空" dc:"起始时间"` + // 导出的结束时间 + EndTime string `p:"endTime" v:"required#结束时间不能为空" dc:"结束时间"` +} + +type WorkScheduleExportExcelRes struct { + // 文件路径 + FilePath string `json:"filePath"` +} + +// WorkScheduleExportWeekReq 导出周报 +type WorkScheduleExportWeekReq struct { + g.Meta `path:"/exportWeek" tags:"工作计划" method:"get" summary:"导出周报"` + commonApi.Author + // 大项目ID + ProjectID string `p:"projectId" dc:"大项目ID"` + // 方阵ID + FangzhenID string `p:"fangzhenId" dc:"方阵ID"` + // 子项目ID + SubProjectID string `p:"subProjectId" dc:"子项目ID"` + // 导出的起始时间 + StartTime string `p:"startTime" v:"required#起始时间不能为空" dc:"起始时间"` + // 导出的结束时间 + EndTime string `p:"endTime" v:"required#结束时间不能为空" dc:"结束时间"` +} diff --git a/api/v1/system/work_status.go b/api/v1/system/work_status.go new file mode 100644 index 0000000..168d4b4 --- /dev/null +++ b/api/v1/system/work_status.go @@ -0,0 +1,182 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-03-19 11:45:09 +// 生成路径: api/v1/system/work_status.go +// 生成人:gfast +// desc:工作状态相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// WorkStatusSearchReq 分页请求参数 +type WorkStatusSearchReq struct { + g.Meta `path:"/list" tags:"工作状态" method:"get" summary:"工作状态列表"` + Id string `p:"id"` // + FangzhenId string `p:"fangzhenId"` // 方阵ID + Parent string `p:"parent" v:"parent@integer#父节点需为整数"` // 父节点 + WorkId string `p:"workId"` // 工作id + WorkName string `p:"workName"` // 工作名称 + Total string `p:"total" v:"total@integer#总量需为整数"` // 总量 + Finished string `p:"finished" v:"finished@integer#完成量需为整数"` // 完成量 + StartAt string `p:"startAt" v:"startAt@datetime#开始时间需为YYYY-MM-DD hh:mm:ss格式"` // 开始时间 + EndAt string `p:"endAt" v:"endAt@datetime#工作结束时间需为YYYY-MM-DD hh:mm:ss格式"` // 工作结束时间 + Status string `p:"status" v:"status@integer#状态 0未开始 1 进行中 2 已完成 3 已延期需为整数"` // 状态 0未开始 1 进行中 2 已完成 3 已延期 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // + commonApi.PageReq + commonApi.Author +} + +// WorkStatusSearchRes 列表返回结果 +type WorkStatusSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.WorkStatusListRes `json:"list"` +} + +// WorkStatusAddReq 添加操作请求参数 +type WorkStatusAddReq struct { + g.Meta `path:"/add" tags:"工作状态" method:"post" summary:"工作状态添加"` + commonApi.Author + FangzhenId string `p:"fangzhenId" ` + Parent int `p:"parent" ` + WorkId string `p:"workId" ` + WorkName string `p:"workName" v:"required#工作名称不能为空"` + Total int `p:"total" ` + Finished int `p:"finished" ` + StartAt *gtime.Time `p:"startAt" ` + EndAt *gtime.Time `p:"endAt" ` + Status int `p:"status" v:"required#状态 0未开始 1 进行中 2 已完成 3 已延期不能为空"` +} + +// WorkStatusAddRes 添加操作返回结果 +type WorkStatusAddRes struct { + commonApi.EmptyRes +} + +// WorkStatusEditReq 修改操作请求参数 +type WorkStatusEditReq struct { + g.Meta `path:"/edit" tags:"工作状态" method:"put" summary:"工作状态修改"` + commonApi.Author + Id uint `p:"id" v:"required#主键ID不能为空"` + FangzhenId string `p:"fangzhenId" ` + Parent int `p:"parent" ` + WorkId string `p:"workId" ` + WorkName string `p:"workName" v:"required#工作名称不能为空"` + Total int `p:"total" ` + Finished int `p:"finished" ` + StartAt *gtime.Time `p:"startAt" ` + EndAt *gtime.Time `p:"endAt" ` + Status int `p:"status" v:"required#状态 0未开始 1 进行中 2 已完成 3 已延期不能为空"` +} + +// WorkStatusEditRes 修改操作返回结果 +type WorkStatusEditRes struct { + commonApi.EmptyRes +} + +// WorkStatusGetReq 获取一条数据请求 +type WorkStatusGetReq struct { + g.Meta `path:"/get" tags:"工作状态" method:"get" summary:"获取工作状态信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// WorkStatusGetRes 获取一条数据结果 +type WorkStatusGetRes struct { + g.Meta `mime:"application/json"` + *model.WorkStatusInfoRes +} + +// WorkStatusDeleteReq 删除数据请求 +type WorkStatusDeleteReq struct { + g.Meta `path:"/delete" tags:"工作状态" method:"delete" summary:"删除工作状态"` + commonApi.Author + Ids []uint `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// WorkStatusDeleteRes 删除数据返回 +type WorkStatusDeleteRes struct { + commonApi.EmptyRes +} + +// 删除父项目或子项目 +type WorkStatusDeleteParentReq struct { + g.Meta `path:"/deleteParentWorkStatus" tags:"工作状态" method:"delete" summary:"删除父项目或子项目"` + commonApi.Author + WorkID string `p:"workId" v:"required#工作ID不能为空" dc:"删除父级时,将删除其所有子级"` +} + +// 删除父项目或子项目 +type WorkStatusDeleteParentRes struct { + commonApi.EmptyRes +} + +// 传入fangzhenid 获取进度图 +type WorkStatusGetProgressReq struct { + g.Meta `path:"/getProgress" tags:"工作状态" method:"get" summary:"获取工作状态进度图"` + commonApi.Author + FangzhenId string `p:"fangzhenId" v:"required#方阵ID不能为空"` +} + +type WorkStatusGetProgressRes struct { + g.Meta `mime:"application/json"` + Progress []*model.WorkStatusProgressRes `json:"progress"` +} + +// App 获取指定父项目的所有子项目的信息 +type WorkStatusGetSubProjectReq struct { + g.Meta `path:"/getSubProject" tags:"App(进度管理)" method:"get" summary:"获取指定父项目的所有子项目的信息"` + commonApi.Author + WorkID string `p:"workId" v:"required#父项目的WorkID不能为空" dc:"父级的WorkID"` // 父级的 WorkID +} + +type WorkStatusGetSubProjectRes struct { + g.Meta `mime:"application/json"` + Progress []*model.WorkStatusProgressRes `json:"progress"` +} + +// 根据主项目获取其子项目和子项目所有的方阵 +type WorkStatusGetTreeReq struct { + g.Meta `path:"/getTree" tags:"工作状态" method:"get" summary:"传入主项目ID获取其子项目和及其方阵"` + commonApi.Author + ProjectID string `p:"ProjectID" v:"required#主项目ID不能为空"` +} + +type WorkStatusGetTreeRes struct { + g.Meta `mime:"application/json"` + Tree []model.WorkStatusTreeRes `json:"tree"` +} + +// 根据主项目获取其子项目和子项目所有的方阵 +type WorkStatusQueryReq struct { + g.Meta `path:"/getrc" tags:"工作状态" method:"get" summary:"传入主项目ID获取其子项目和及其方阵"` + commonApi.Author + ProjectID string `p:"ProjectID" v:"required#主项目ID不能为空"` +} + +type WorkStatusQueryRes struct { + g.Meta `mime:"application/json"` + Tree []model.ProjectHierarchy `json:"tree"` +} + +// 获取所有父项的总进度和当前进度 +type WorkStatusGetParentProgressReq struct { + g.Meta `path:"/getParentProgress" tags:"工作状态" method:"get" summary:"获取所有父项的总进度和当前进度"` + commonApi.Author + FangzhenId string `p:"fangzhenId" ` // 方阵ID + SubProjectID string `p:"sub_projectId" dc:"子项目ID"` // 子项目ID + ProjectID string `p:"projectId" dc:"大项目ID" ` +} + +type WorkStatusGetParentProgressRes struct { + g.Meta `mime:"application/json"` + Tree []model.WorkStatusTreeRes `json:"tree"` +} diff --git a/api/v1/system/xiangmuhuafenbiao.go b/api/v1/system/xiangmuhuafenbiao.go new file mode 100644 index 0000000..d0b7989 --- /dev/null +++ b/api/v1/system/xiangmuhuafenbiao.go @@ -0,0 +1,142 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-10-07 16:08:09 +// 生成路径: api/v1/system/xiangmuhuafenbiao.go +// 生成人:gfast +// desc:项目划分相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/os/gtime" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// XiangmuhuafenbiaoSearchReq 分页请求参数 +type XiangmuhuafenbiaoSearchReq struct { + g.Meta `path:"/list" tags:"项目划分" method:"get" summary:"项目划分列表"` + Id string `p:"id"` // + Danweigongcheng string `p:"danweigongcheng"` //单位 工程 + Zidanweigongcheng string `p:"zidanweigongcheng"` //子单位工程 + Fenbugongcheng string `p:"fenbugongcheng"` //分部 工程 + Zifenbugongcheng string `p:"zifenbugongcheng"` //子分部工程 + Fenxianggongcheng string `p:"fenxianggongcheng"` //分项 工程 + Jianyanpi string `p:"jianyanpi"` //检验批 + Name string `p:"name"` //工 程 项 目 名 称 + Zhixingbiaohao string `p:"zhixingbiaohao"` //执行表号 + Json string `p:"json"` //json数据文件路径 + PrintStatus string `p:"printStatus" v:"printStatus@integer#打印状态需为整数"` //打印状态 + ProjectId string `p:"projectId" v:"required"` //项目id + CreateBy string `p:"createBy"` //创建人 + UpdateBy string `p:"updateBy"` //更新人 + CreateddAt string `p:"createddAt" v:"createddAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + //commonApi.Author +} + +// XiangmuhuafenbiaoSearchRes 列表返回结果 +type XiangmuhuafenbiaoSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.XiangmuhuafenbiaoListRes `json:"list"` +} + +// XiangmuhuafenbiaoAddReq 添加操作请求参数 +type XiangmuhuafenbiaoAddReq struct { + g.Meta `path:"/add" tags:"项目划分" method:"post" summary:"项目划分添加"` + //commonApi.Author + File *ghttp.UploadFile `p:"file" ` + ProjectId string `p:"projectId" ` +} + +// XiangmuhuafenbiaoAddRes 添加操作返回结果 +type XiangmuhuafenbiaoAddRes struct { + commonApi.EmptyRes +} + +// XiangmuhuafenbiaoEditReq 修改操作请求参数 +type XiangmuhuafenbiaoEditReq struct { + g.Meta `path:"/edit" tags:"项目划分" method:"put" summary:"项目划分修改"` + //commonApi.Author + Id int `p:"id" v:"required#主键ID不能为空"` + Danweigongcheng string `p:"danweigongcheng" ` + Zidanweigongcheng string `p:"zidanweigongcheng" ` + Fenbugongcheng string `p:"fenbugongcheng" ` + Zifenbugongcheng string `p:"zifenbugongcheng" ` + Fenxianggongcheng string `p:"fenxianggongcheng" ` + Jianyanpi string `p:"jianyanpi" ` + Name string `p:"name" ` + Zhixingbiaohao string `p:"zhixingbiaohao" ` + Json string `p:"json" ` + PrintStatus int `p:"printStatus" ` + ProjectId int `p:"projectId" ` + CreateBy string `p:"createBy" ` + UpdateBy string `p:"updateBy" ` + CreateddAt *gtime.Time `p:"createddAt" ` +} + +// EditExcelFuncReq 修改excel数据 +type EditExcelFuncReq struct { + g.Meta `path:"/editExcel" tags:"项目划分" method:"put" summary:"修改excel数据"` + //commonApi.Author + Id int `p:"id" dc:"项目划分表id" v:"required#项目划分表的主键ID不能为空"` + FileName string `p:"fileName" dc:"母版表fileName" v:"required#母版表的fileName不能为空"` + Json string `p:"json" dc:"json数据" v:"required#json数据不能为空"` +} + +// XiangmuhuafenbiaoEditRes 修改操作返回结果 +type XiangmuhuafenbiaoEditRes struct { + commonApi.EmptyRes +} + +// XiangmuhuafenbiaoGetReq 获取一条数据请求 +type XiangmuhuafenbiaoGetReq struct { + g.Meta `path:"/get" tags:"项目划分" method:"get" summary:"获取项目划分信息"` + //commonApi.Author + Id int `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// XiangmuhuafenbiaoGetRes 获取一条数据结果 +type XiangmuhuafenbiaoGetRes struct { + g.Meta `mime:"application/json"` + *model.XiangmuhuafenbiaoInfoRes +} + +// XiangmuhuafenbiaoDeleteReq 删除数据请求 +type XiangmuhuafenbiaoDeleteReq struct { + g.Meta `path:"/delete" tags:"项目划分" method:"delete" summary:"删除项目划分"` + //commonApi.Author + Ids []int `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// XiangmuhuafenbiaoDeleteRes 删除数据返回 +type XiangmuhuafenbiaoDeleteRes struct { + commonApi.EmptyRes +} + +// MultipleProjectsListFuncReq 返回当前项目下所有相同zhixingbiaohao的excel数据 请求参数 +type MultipleProjectsListFuncReq struct { + g.Meta `path:"/multipleProjectsList" tags:"项目划分" method:"get" summary:"同一执行表号列表"` + ExecutionTableNumber string `p:"executionTableNumber" dc:"执行表号" v:"required#执行表号不能为空"` + ProjectId int64 `p:"projectId" dc:"项目id" v:"required#项目id不能为空"` + //commonApi.Author +} + +// MultipleProjectsListFuncRes 返回当前项目下所有相同zhixingbiaohao的excel数据 返回结果 +type MultipleProjectsListFuncRes struct { + g.Meta `mime:"application/json"` + List []*MultipleProjectsListFuncOne `json:"list"` +} + +type MultipleProjectsListFuncOne struct { + Id int64 `json:"id" dc:"项目划分表主键ID"` + Json string `json:"json" dc:"excel json数据"` + FilenPath string `json:"filenPath" dc:"excel母版地址"` + Name string `json:"name" dc:"工程项目名称"` + Zhixingbiaohao string `json:"zhixingbiaohao" dc:"执行表号"` +} diff --git a/api/v1/system/ys7devices.go b/api/v1/system/ys7devices.go new file mode 100644 index 0000000..e6071a4 --- /dev/null +++ b/api/v1/system/ys7devices.go @@ -0,0 +1,267 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-03-01 12:49:32 +// 生成路径: api/v1/system/ys7devices.go +// 生成人:gfast +// desc:荧石摄像头相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// Ys7DevicesSearchReq 分页请求参数 +type Ys7DevicesSearchReq struct { + g.Meta `path:"/list" tags:"荧石摄像头" method:"get" summary:"荧石摄像头列表"` + Id string `p:"id"` // id + CreatedAt string `p:"createdAt" v:"createdAt@datetime#需为YYYY-MM-DD hh:mm:ss格式"` // + DeviceSerial string `p:"deviceSerial"` // 设备串号 + DeviceName string `p:"deviceName"` // 设备名称 + DeviceType string `p:"deviceType"` // 设备类型 + Status string `p:"status" v:"status@integer#状态需为整数"` // 状态 + Defence string `p:"defence" v:"defence@integer#需为整数"` // + DeviceVersion string `p:"deviceVersion"` // 设备版本 + ProjectId string `p:"projectId"` // 项目ID + // 判断是否前端还是后端页面的请求 + IsFront bool `p:"isFront"` + // 判断是否是小程序的请求 + IsWechat bool `p:"isWechat"` + commonApi.PageReq + commonApi.Author +} + +// Ys7DevicesSearchRes 列表返回结果 +type Ys7DevicesSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.Ys7DevicesListRes `json:"list"` +} + +// Ys7DevicesAddReq 添加操作请求参数 +type Ys7DevicesAddReq struct { + g.Meta `path:"/add" tags:"荧石摄像头" method:"post" summary:"荧石摄像头添加"` + commonApi.Author + DeviceSerial string `p:"deviceSerial" ` + DeviceName string `p:"deviceName" ` + DeviceType string `p:"deviceType" ` + Status int `p:"status" ` + Defence int64 `p:"defence" ` + DeviceVersion string `p:"deviceVersion" ` + ProjectId string `p:"projectId" ` + Remark string `p:"remark" ` + Sort int `p:"sort" ` +} + +// Ys7DevicesAddRes 添加操作返回结果 +type Ys7DevicesAddRes struct { + commonApi.EmptyRes +} + +// Ys7DevicesEditReq 修改操作请求参数 +type Ys7DevicesEditReq struct { + g.Meta `path:"/edit" tags:"荧石摄像头" method:"put" summary:"荧石摄像头修改"` + commonApi.Author + Id uint `p:"id" v:"required#主键ID不能为空"` + DeviceSerial string `p:"deviceSerial" ` + DeviceName string `p:"deviceName" ` + DeviceType string `p:"deviceType" ` + Status int `p:"status" ` + Defence int64 `p:"defence" ` + DeviceVersion string `p:"deviceVersion" ` + ProjectId string `p:"projectId" ` + Detail string `p:"detail" dc:"摄像头位置信息"` + Position string `p:"position" dc:"摄像头位置"` + ReMark string `p:"remark" dc:"备注"` + Sort int `p:"sort" ` +} + +// Ys7DevicesEditRes 修改操作返回结果 +type Ys7DevicesEditRes struct { + commonApi.EmptyRes +} + +// Ys7DevicesGetReq 获取一条数据请求 +type Ys7DevicesGetReq struct { + g.Meta `path:"/get" tags:"荧石摄像头" method:"get" summary:"获取荧石摄像头信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// Ys7DevicesGetRes 获取一条数据结果 +type Ys7DevicesGetRes struct { + g.Meta `mime:"application/json"` + *model.Ys7DevicesInfoRes +} + +// Ys7DevicesDeleteReq 删除数据请求 +type Ys7DevicesDeleteReq struct { + g.Meta `path:"/delete" tags:"荧石摄像头" method:"delete" summary:"删除荧石摄像头"` + commonApi.Author + Ids []uint `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// Ys7DevicesDeleteRes 删除数据返回 +type Ys7DevicesDeleteRes struct { + commonApi.EmptyRes +} + +// Ys7DevicesBindProjectReq 摄像头绑定项目 +type Ys7DevicesBindProjectReq struct { + g.Meta `path:"/bindProject" tags:"荧石摄像头" method:"post" summary:"摄像头绑定项目"` + commonApi.Author + List *model.Ys7DevicesProject `json:"list"` +} + +// Ys7DevicesBindProjectRes 摄像头绑定项目返回 +type Ys7DevicesBindProjectRes struct { + commonApi.EmptyRes +} + +// Ys7DevicesEditPositionReq 小程序修改摄像头坐标 +type Ys7DevicesEditPositionReq struct { + g.Meta `path:"/editPosition" tags:"荧石摄像头" method:"put" summary:"前端和小程序修改摄像头坐标"` + commonApi.Author + Id uint `p:"id" v:"required#主键ID不能为空" dc:"摄像头主键ID"` + Position string `p:"detail" dc:"摄像头位置"` +} + +// Ys7DevicesEditPositionRes 小程序修改摄像头坐标返回 +type Ys7DevicesEditPositionRes struct { + commonApi.EmptyRes +} + +// Ys7DevicesGetByProjectIdReq 根据项目ID获取摄像头列表 +type Ys7DevicesGetByProjectIdReq struct { + g.Meta `path:"/getByProjectId" tags:"荧石摄像头" method:"get" summary:"根据项目ID获取摄像头列表"` + commonApi.PageReq + ProjectId int `p:"projectId" v:"required#项目ID不能为空"` +} + +// Ys7DevicesGetByProjectIdRes 根据项目ID获取摄像头列表返回 +type Ys7DevicesGetByProjectIdRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.Ys7DevicesList2Res `json:"list"` +} + +// 获取视频播放地址 +type Ys7DevicesGetVideoUrlReq struct { + g.Meta `path:"/getVideoUrl" tags:"荧石摄像头" method:"post" summary:"获取视频播放地址"` + commonApi.Author + DeviecesSerial string `p:"deviecesSerial" v:"required#设备序列号不能为空"` +} + +// 获取视频播放地址返回 +type Ys7DevicesGetVideoUrlRes struct { + g.Meta `mime:"application/json"` + VideoUrl string `json:"videoUrl"` +} + +// 获取荧石云 AccessTOken +type Ys7DevicesGetAccessTokenReq struct { + g.Meta `path:"/getAccessToken" tags:"荧石摄像头" method:"get" summary:"获取荧石云AccessToken"` + commonApi.Author +} + +// 获取荧石云 AccessToken返回 +type Ys7DevicesGetAccessTokenRes struct { + g.Meta `mime:"application/json"` + Token string `json:"token"` +} + +// Ys7DevicesEditGisReq GIS 前端调用修改摄像头信息 +type Ys7DevicesEditGisReq struct { + g.Meta `path:"/editGis" tags:"荧石摄像头" method:"put" summary:"GIS前端调用修改摄像头信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键ID不能为空" dc:"摄像头主键ID"` + DeviceSerial string `p:"deviceSerial" dc:"设备序列号"` + DeviceName string `p:"deviceName" dc:"设备名称"` + Detail string `p:"detail" dc:"摄像头位置信息"` +} + +// Ys7DevicesEditGisRes GIS 前端调用修改摄像头信息返回 +type Ys7DevicesEditGisRes struct { + commonApi.EmptyRes +} + +// 开启视频加密 +type Ys7DevicesOpenEncryptReq struct { + g.Meta `path:"/openEncrypt" tags:"荧石摄像头" method:"post" summary:"开启视频加密"` + commonApi.Author + DeviceSerial string `p:"deviceSerial" v:"required#设备序列号不能为空"` +} + +type Ys7DevicesOpenEncryptRes struct { + commonApi.EmptyRes +} + +// 关闭视频加密 +type Ys7DevicesCloseEncryptReq struct { + g.Meta `path:"/closeEncrypt" tags:"荧石摄像头" method:"post" summary:"关闭视频加密"` + commonApi.Author + DeviceSerial string `p:"deviceSerial" v:"required#设备序列号不能为空"` +} + +type Ys7DevicesCloseEncryptRes struct { + commonApi.EmptyRes +} + +// 小程序获取设备列表 +type Ys7DevicesGetListReq struct { + g.Meta `path:"/getList" tags:"荧石摄像头" method:"get" summary:"小程序获取设备列表"` + commonApi.Author + commonApi.PageReq + Id string `p:"id" dc:"设备主键"` // id + CreatedAt string `p:"createdAt" dc:"创建时间"` // + DeviceSerial string `p:"deviceSerial" dc:"设备串号"` // 设备串号 + DeviceName string `p:"deviceName" dc:"设备名称"` // 设备名称 + DeviceType string `p:"deviceType dc:"设备类型"` // 设备类型 + Status string `p:"status" dc:"设备状态"` // 状态 + Defence string `p:"defence" dc:"不用管"` // + DeviceVersion string `p:"deviceVersion" dc:"设备版本"` // 设备版本 + ProjectId string `p:"projectId" dc:"项目id"` + Detail string `p:"detail" dc:"设备位置信息"` +} + +type Ys7DevicesGetListRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.Ys7DevicesList3Res `json:"list"` +} + +type PtzStartReq struct { + g.Meta `path:"/ptzStart" tags:"荧石摄像头" method:"put" summary:"开启云台控制"` + commonApi.Author + DeviceSerial string `p:"deviceSerial" v:"required#设备序列号不能为空"` + Direction int `p:"direction" dc:"操作命令:0-上,1-下,2-左,3-右,4-左上,5-左下,6-右上,7-右下,8-放大,9-缩小,10-近焦距,11-远焦距,16-自动控制" v:"between:0,16#取值范围为0~16"` +} + +type PtzStartRes struct { + commonApi.EmptyRes +} + +type PtzEndReq struct { + g.Meta `path:"/ptzEnd" tags:"荧石摄像头" method:"put" summary:"停止云台控制"` + commonApi.Author + DeviceSerial string `p:"deviceSerial" v:"required#设备序列号不能为空"` + Direction int `p:"direction" dc:"操作命令:0-上,1-下,2-左,3-右,4-左上,5-左下,6-右上,7-右下,8-放大,9-缩小,10-近焦距,11-远焦距,16-自动控制" v:"between:0,16#取值范围为0~16"` +} + +type PtzEndRes struct { + commonApi.EmptyRes +} + +type ManualSnapshotInterfaceReq struct { + g.Meta `path:"/manualSnapshotInterface" tags:"荧石摄像头" method:"put" summary:"手动摄像头抓拍"` + commonApi.Author + DeviceSerial string `p:"deviceSerial" v:"required#设备序列号不能为空"` +} + +type ManualSnapshotInterfaceRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/ys7devices_img.go b/api/v1/system/ys7devices_img.go new file mode 100644 index 0000000..e721981 --- /dev/null +++ b/api/v1/system/ys7devices_img.go @@ -0,0 +1,89 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2024-08-19 11:51:53 +// 生成路径: api/v1/system/ys7devices_img.go +// 生成人:gfast +// desc:摄像头所拍摄到的所有图片(每月会定时清除)相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// Ys7DevicesImgSearchReq 分页请求参数 +type Ys7DevicesImgSearchReq struct { + g.Meta `path:"/list" tags:"摄像头所拍摄到的所有图片(每月会定时清除)" method:"get" summary:"摄像头所拍摄到的所有图片(每月会定时清除)列表"` + Id string `p:"id"` //主键ID + FatherId string `p:"fatherId" v:"fatherId@integer#父id需为整数"` //父id + Name string `p:"name"` //摄像头名称 + Path string `p:"path"` //图片路径 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#拍摄时间需为YYYY-MM-DD hh:mm:ss格式"` //拍摄时间 + commonApi.PageReq + commonApi.Author +} + +// Ys7DevicesImgSearchRes 列表返回结果 +type Ys7DevicesImgSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.Ys7DevicesImgListRes `json:"list"` +} + +// Ys7DevicesImgAddReq 添加操作请求参数 +type Ys7DevicesImgAddReq struct { + g.Meta `path:"/add" tags:"摄像头所拍摄到的所有图片(每月会定时清除)" method:"post" summary:"摄像头所拍摄到的所有图片(每月会定时清除)添加"` + commonApi.Author + FatherId uint64 `p:"fatherId" v:"required#父id不能为空"` + Name string `p:"name" v:"required#摄像头名称不能为空"` + Path string `p:"path" ` +} + +// Ys7DevicesImgAddRes 添加操作返回结果 +type Ys7DevicesImgAddRes struct { + commonApi.EmptyRes +} + +// Ys7DevicesImgEditReq 修改操作请求参数 +type Ys7DevicesImgEditReq struct { + g.Meta `path:"/edit" tags:"摄像头所拍摄到的所有图片(每月会定时清除)" method:"put" summary:"摄像头所拍摄到的所有图片(每月会定时清除)修改"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键ID不能为空"` + FatherId uint64 `p:"fatherId" v:"required#父id不能为空"` + Name string `p:"name" v:"required#摄像头名称不能为空"` + Path string `p:"path" ` +} + +// Ys7DevicesImgEditRes 修改操作返回结果 +type Ys7DevicesImgEditRes struct { + commonApi.EmptyRes +} + +// Ys7DevicesImgGetReq 获取一条数据请求 +type Ys7DevicesImgGetReq struct { + g.Meta `path:"/get" tags:"摄像头所拍摄到的所有图片(每月会定时清除)" method:"get" summary:"获取摄像头所拍摄到的所有图片(每月会定时清除)信息"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// Ys7DevicesImgGetRes 获取一条数据结果 +type Ys7DevicesImgGetRes struct { + g.Meta `mime:"application/json"` + *model.Ys7DevicesImgInfoRes +} + +// Ys7DevicesImgDeleteReq 删除数据请求 +type Ys7DevicesImgDeleteReq struct { + g.Meta `path:"/delete" tags:"摄像头所拍摄到的所有图片(每月会定时清除)" method:"delete" summary:"删除摄像头所拍摄到的所有图片(每月会定时清除)"` + commonApi.Author + Ids []uint64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// Ys7DevicesImgDeleteRes 删除数据返回 +type Ys7DevicesImgDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/system/zmkg_gis_model_lib.go b/api/v1/system/zmkg_gis_model_lib.go new file mode 100644 index 0000000..5e17462 --- /dev/null +++ b/api/v1/system/zmkg_gis_model_lib.go @@ -0,0 +1,87 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-07-31 10:18:14 +// 生成路径: api/v1/system/zmkg_gis_model_lib.go +// 生成人:gfast +// desc:模型库相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package system + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +// ZmkgGisModelLibSearchReq 分页请求参数 +type ZmkgGisModelLibSearchReq struct { + g.Meta `path:"/list" tags:"模型库" method:"get" summary:"模型库列表"` + ModelId string `p:"modelId"` //模型id + ModelName string `p:"modelName"` //模型名称 + CreateAt string `p:"createAt" v:"createAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// ZmkgGisModelLibSearchRes 列表返回结果 +type ZmkgGisModelLibSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.ZmkgGisModelLibListRes `json:"list"` +} + +// ZmkgGisModelLibAddReq 添加操作请求参数 +type ZmkgGisModelLibAddReq struct { + g.Meta `path:"/add" tags:"模型库" method:"post" summary:"模型库添加"` + commonApi.Author + ModelName string `p:"modelName" v:"required#模型名称不能为空"` + File *ghttp.UploadFile `p:"file" ` +} + +// ZmkgGisModelLibAddRes 添加操作返回结果 +type ZmkgGisModelLibAddRes struct { + commonApi.EmptyRes +} + +// ZmkgGisModelLibEditReq 修改操作请求参数 +type ZmkgGisModelLibEditReq struct { + g.Meta `path:"/edit" tags:"模型库" method:"put" summary:"模型库修改"` + commonApi.Author + Id int `p:"id" v:"required#主键ID不能为空"` + ModelId string `p:"modelId" ` + ModelName string `p:"modelName" v:"required#模型名称不能为空"` + File *ghttp.UploadFile `p:"file" ` +} + +// ZmkgGisModelLibEditRes 修改操作返回结果 +type ZmkgGisModelLibEditRes struct { + commonApi.EmptyRes +} + +// ZmkgGisModelLibGetReq 获取一条数据请求 +type ZmkgGisModelLibGetReq struct { + g.Meta `path:"/get" tags:"模型库" method:"get" summary:"获取模型库信息"` + commonApi.Author + Id int `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// ZmkgGisModelLibGetRes 获取一条数据结果 +type ZmkgGisModelLibGetRes struct { + g.Meta `mime:"application/json"` + *model.ZmkgGisModelLibInfoRes +} + +// ZmkgGisModelLibDeleteReq 删除数据请求 +type ZmkgGisModelLibDeleteReq struct { + g.Meta `path:"/delete" tags:"模型库" method:"delete" summary:"删除模型库"` + commonApi.Author + Ids []int `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// ZmkgGisModelLibDeleteRes 删除数据返回 +type ZmkgGisModelLibDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/test/test_contact_info.go b/api/v1/test/test_contact_info.go new file mode 100644 index 0000000..6bfa49b --- /dev/null +++ b/api/v1/test/test_contact_info.go @@ -0,0 +1,95 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-09-01 17:36:18 +// 生成路径: api/v1/test/test_contact_info.go +// 生成人:yqq +// desc:业主方联系人关联相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package test + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/test/model" +) + +// TestContactInfoSearchReq 分页请求参数 +type TestContactInfoSearchReq struct { + g.Meta `path:"/list" tags:"业主方联系人关联" method:"get" summary:"业主方联系人关联列表"` + Id string `p:"id"` // + OwenerId string `p:"owenerId" v:"owenerId@integer#需为整数"` // + ContactName string `p:"contactName"` // + ContactPost string `p:"contactPost"` // + ContactPhone string `p:"contactPhone"` // + commonApi.PageReq + commonApi.Author +} + +// TestContactInfoSearchRes 列表返回结果 +type TestContactInfoSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.TestContactInfoListRes `json:"list"` +} + +// TestContactInfoAddReq 添加操作请求参数 +type TestContactInfoAddReq struct { + g.Meta `path:"/add" tags:"业主方联系人关联" method:"post" summary:"业主方联系人关联添加"` + commonApi.Author + WxOrPc string `p:"wxOrPc" dc:"参数为1表示pc添加 否则为小程序添加"` + Creator string `p:"creator" v:"phone"` + OwenerId uint `p:"owenerId" ` + ContactName string `p:"contactName" v:"required#不能为空"` + ContactPost string `p:"contactPost" ` + ContactPhone string `p:"contactPhone" ` +} + +// TestContactInfoAddRes 添加操作返回结果 +type TestContactInfoAddRes struct { + commonApi.EmptyRes +} + +// TestContactInfoEditReq 修改操作请求参数 +type TestContactInfoEditReq struct { + g.Meta `path:"/edit" tags:"业主方联系人关联" method:"put" summary:"业主方联系人关联修改"` + commonApi.Author + Creator string `p:"creator" v:"phone" dc:"小程序需要传递当前用户的电话"` + WxOrPc string `p:"wxOrPc" dc:"参数为1表示pc添加 否则为小程序添加"` + Id uint `p:"id" v:"required#主键ID不能为空"` + OwenerId uint `p:"owenerId" ` + ContactName string `p:"contactName" v:"required#不能为空"` + ContactPost string `p:"contactPost" ` + ContactPhone string `p:"contactPhone" ` +} + +// TestContactInfoEditRes 修改操作返回结果 +type TestContactInfoEditRes struct { + commonApi.EmptyRes +} + +// TestContactInfoGetReq 获取一条数据请求 +type TestContactInfoGetReq struct { + g.Meta `path:"/get" tags:"业主方联系人关联" method:"get" summary:"获取业主方联系人关联信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// TestContactInfoGetRes 获取一条数据结果 +type TestContactInfoGetRes struct { + g.Meta `mime:"application/json"` + *model.TestContactInfoInfoRes +} + +// TestContactInfoDeleteReq 删除数据请求 +type TestContactInfoDeleteReq struct { + g.Meta `path:"/delete" tags:"业主方联系人关联" method:"delete" summary:"删除业主方联系人关联"` + commonApi.Author + Ids []uint `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// TestContactInfoDeleteRes 删除数据返回 +type TestContactInfoDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/test/test_follow_info.go b/api/v1/test/test_follow_info.go new file mode 100644 index 0000000..d04987a --- /dev/null +++ b/api/v1/test/test_follow_info.go @@ -0,0 +1,108 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-09-01 16:38:07 +// 生成路径: api/v1/test/test_follow_info.go +// 生成人:yqq +// desc:跟进信息相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package test + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/test/model" +) + +// TestFollowInfoSearchReq 分页请求参数 +type TestFollowInfoSearchReq struct { + g.Meta `path:"/list" tags:"跟进信息" method:"get" summary:"跟进信息列表"` + Id string `p:"id"` // + ProjectId string `p:"projectId" v:"projectId@integer#关联的项目需为整数" dc:"关联的项目"` //关联的项目 + FollowName string `p:"followName" dc:"跟进人姓名"` //跟进人姓名 + OwnerId string `p:"ownerId" v:"ownerId@integer#业主名需为整数" dc:"业主名"` //业主名 + ContactName string `p:"contactName" dc:"对接人姓名"` //对接人姓名 + ConPostName string `p:"conPostName" dc:"对接人职称"` //对接人职称 + ContactPhone string `p:"contactPhone" dc:"对接人电话"` //对接人电话 + FollowInfo string `p:"followInfo" dc:"跟进情况"` //跟进情况 + FollowFile string `p:"followFile" dc:"相关附件"` //相关附件 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建日期需为YYYY-MM-DD hh:mm:ss格式" dc:"创建日期"` //创建日期 + commonApi.PageReq + commonApi.Author +} + +// TestFollowInfoSearchRes 列表返回结果 +type TestFollowInfoSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.TestFollowInfoListRes `json:"list"` +} + +// TestFollowInfoAddReq 添加操作请求参数 +type TestFollowInfoAddReq struct { + g.Meta `path:"/add" tags:"跟进信息" method:"post" summary:"跟进信息添加"` + commonApi.Author + WxOrPc string `p:"wxOrPc" dc:"参数为1表示pc添加 否则为小程序添加"` + Creator string `p:"creator" v:"phone"` + ProjectId int `p:"projectId" v:"required#关联的项目不能为空"` + FollowName string `p:"followName" v:"required#跟进人姓名不能为空"` + OwnerId uint `p:"ownerId" ` + ContactName string `p:"contactName" v:"required#对接人姓名不能为空"` + ConPostName string `p:"conPostName" v:"required#对接人职称不能为空"` + ContactPhone string `p:"contactPhone" ` + FollowInfo string `p:"followInfo" ` + FollowFile string `p:"followFile" ` +} + +// TestFollowInfoAddRes 添加操作返回结果 +type TestFollowInfoAddRes struct { + commonApi.EmptyRes +} + +// TestFollowInfoEditReq 修改操作请求参数 +type TestFollowInfoEditReq struct { + g.Meta `path:"/edit" tags:"跟进信息" method:"put" summary:"跟进信息修改"` + commonApi.Author + Creator string `p:"creator" v:"phone" dc:"小程序需要传递当前用户的电话"` + WxOrPc string `p:"wxOrPc" dc:"参数为1表示pc添加 否则为小程序添加"` + Id uint `p:"id" v:"required#主键ID不能为空"` + ProjectId int `p:"projectId" v:"required#关联的项目不能为空"` + FollowName string `p:"followName" v:"required#跟进人姓名不能为空"` + OwnerId uint `p:"ownerId" ` + ContactName string `p:"contactName" v:"required#对接人姓名不能为空"` + ConPostName string `p:"conPostName" v:"required#对接人职称不能为空"` + ContactPhone string `p:"contactPhone" ` + FollowInfo string `p:"followInfo" ` + FollowFile string `p:"followFile" ` +} + +// TestFollowInfoEditRes 修改操作返回结果 +type TestFollowInfoEditRes struct { + commonApi.EmptyRes +} + +// TestFollowInfoGetReq 获取一条数据请求 +type TestFollowInfoGetReq struct { + g.Meta `path:"/get" tags:"跟进信息" method:"get" summary:"获取跟进信息信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// TestFollowInfoGetRes 获取一条数据结果 +type TestFollowInfoGetRes struct { + g.Meta `mime:"application/json"` + *model.TestFollowInfoInfoRes +} + +// TestFollowInfoDeleteReq 删除数据请求 +type TestFollowInfoDeleteReq struct { + g.Meta `path:"/delete" tags:"跟进信息" method:"delete" summary:"删除跟进信息"` + commonApi.Author + Ids []uint `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// TestFollowInfoDeleteRes 删除数据返回 +type TestFollowInfoDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/test/test_owner_info.go b/api/v1/test/test_owner_info.go new file mode 100644 index 0000000..837584a --- /dev/null +++ b/api/v1/test/test_owner_info.go @@ -0,0 +1,102 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-09-01 17:51:41 +// 生成路径: api/v1/test/test_owner_info.go +// 生成人:yqq +// desc:业主方基本情况相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package test + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/test/model" +) + +// TestOwnerInfoSearchReq 分页请求参数 +type TestOwnerInfoSearchReq struct { + g.Meta `path:"/list" tags:"业主方基本情况" method:"get" summary:"业主方基本情况列表"` + Id string `p:"id"` // + CompanyName string `p:"companyName"` //企业名称 + CompanyAddress string `p:"companyAddress"` //单位地址 + RegistrationType string `p:"registrationType"` //企业登记注册类型 + RegisteredCapital string `p:"registeredCapital" v:"registeredCapital@integer#注册资金需为整数"` //注册资金 + Legaler string `p:"legaler"` //法人代表 + LegalerPhone string `p:"legalerPhone"` //法人电话 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建日期需为YYYY-MM-DD hh:mm:ss格式"` //创建日期 + commonApi.PageReq + commonApi.Author +} + +// TestOwnerInfoSearchRes 列表返回结果 +type TestOwnerInfoSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.TestOwnerInfoListRes `json:"list"` +} + +// TestOwnerInfoAddReq 添加操作请求参数 +type TestOwnerInfoAddReq struct { + g.Meta `path:"/add" tags:"业主方基本情况" method:"post" summary:"业主方基本情况添加"` + commonApi.Author + WxOrPc string `p:"wxOrPc" dc:"参数为1表示pc添加 否则为小程序添加"` + Creator string `p:"creator" v:"phone"` + CompanyName string `p:"companyName" v:"required#企业名称不能为空"` + CompanyAddress string `p:"companyAddress" ` + RegistrationType string `p:"registrationType" ` + RegisteredCapital int `p:"registeredCapital" ` + Legaler string `p:"legaler" ` + LegalerPhone string `p:"legalerPhone" ` +} + +// TestOwnerInfoAddRes 添加操作返回结果 +type TestOwnerInfoAddRes struct { + commonApi.EmptyRes +} + +// TestOwnerInfoEditReq 修改操作请求参数 +type TestOwnerInfoEditReq struct { + g.Meta `path:"/edit" tags:"业主方基本情况" method:"put" summary:"业主方基本情况修改"` + commonApi.Author + WxOrPc string `p:"wxOrPc" dc:"参数为1表示pc添加 否则为小程序添加"` + Creator string `p:"creator" v:"phone" dc:"小程序需要传递当前用户的电话"` + Id uint `p:"id" v:"required#主键ID不能为空"` + CompanyName string `p:"companyName" v:"required#企业名称不能为空"` + CompanyAddress string `p:"companyAddress" ` + RegistrationType string `p:"registrationType" ` + RegisteredCapital int `p:"registeredCapital" ` + Legaler string `p:"legaler" ` + LegalerPhone string `p:"legalerPhone" ` +} + +// TestOwnerInfoEditRes 修改操作返回结果 +type TestOwnerInfoEditRes struct { + commonApi.EmptyRes +} + +// TestOwnerInfoGetReq 获取一条数据请求 +type TestOwnerInfoGetReq struct { + g.Meta `path:"/get" tags:"业主方基本情况" method:"get" summary:"获取业主方基本情况信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// TestOwnerInfoGetRes 获取一条数据结果 +type TestOwnerInfoGetRes struct { + g.Meta `mime:"application/json"` + *model.TestOwnerInfoInfoRes +} + +// TestOwnerInfoDeleteReq 删除数据请求 +type TestOwnerInfoDeleteReq struct { + g.Meta `path:"/delete" tags:"业主方基本情况" method:"delete" summary:"删除业主方基本情况"` + commonApi.Author + Ids []uint `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// TestOwnerInfoDeleteRes 删除数据返回 +type TestOwnerInfoDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/v1/test/test_project_info.go b/api/v1/test/test_project_info.go new file mode 100644 index 0000000..4461134 --- /dev/null +++ b/api/v1/test/test_project_info.go @@ -0,0 +1,107 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-09-01 16:15:09 +// 生成路径: api/v1/test/test_project_info.go +// 生成人:yqq +// desc:项目备案信息相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package test + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/test/model" +) + +// TestProjectInfoSearchReq 分页请求参数 +type TestProjectInfoSearchReq struct { + g.Meta `path:"/list" tags:"项目备案信息" method:"get" summary:"项目备案信息列表"` + ProjectName string `p:"projectName" dc:"项目名称"` + ProjectAddress string `p:"projectAddress" dc:"单位地址"` + ProjectLeader string `p:"projectLeader" dc:"项目负责人"` + ResourceName string `p:"resourceName" dc:"资源方"` + OwnerId string `p:"ownerId" v:"ownerId@integer#业主名id需为整数" dc:"业主名id"` + ProjectType string `p:"projectType" dc:"项目类型"` + ProjectInfo string `p:"projectInfo" dc:"项目概况"` + ProjectState string `p:"projectState" dc:"项目状态(0未开始 1进行中 2已完成)" v:"projectState@integer#项目状态(0未开始 1进行中 2已完成)需为整数"` //项目状态(0未开始 1进行中 2已完成) + CreatedAt string `p:"createdAt" dc:"创建日期" v:"createdAt@datetime#创建日期需为YYYY-MM-DD hh:mm:ss格式"` //创建日期 + commonApi.PageReq + commonApi.Author +} + +// TestProjectInfoSearchRes 列表返回结果 +type TestProjectInfoSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.TestProjectInfoListRes `json:"list"` +} + +// TestProjectInfoAddReq 添加操作请求参数 +type TestProjectInfoAddReq struct { + g.Meta `path:"/add" tags:"项目备案信息" method:"post" summary:"项目备案信息添加"` + commonApi.Author + WxOrPc string `p:"wxOrPc" dc:"参数为1表示pc添加 否则为小程序添加"` + Creator string `p:"creator,primary" v:"phone" dc:"小程序需要传递当前用户的电话"` + ProjectName string `p:"projectName" v:"required#项目名称不能为空" dc:"项目名称"` + ProjectAddress string `p:"projectAddress" dc:"单位地址"` + ProjectLeader string `p:"projectLeader" dc:"项目负责人"` + ResourceName string `p:"resourceName" v:"required#资源方不能为空" dc:"资源方"` + OwnerId int `p:"ownerId" v:"required#业主名id不能为空" dc:"业主id"` + ProjectType string `p:"projectType" dc:"项目类型"` + ProjectInfo string `p:"projectInfo" dc:"项目概况"` + ProjectState int `p:"projectState" dc:"项目状态(0未开始 1进行中 2已完成)"` +} + +// TestProjectInfoAddRes 添加操作返回结果 +type TestProjectInfoAddRes struct { + commonApi.EmptyRes +} + +// TestProjectInfoEditReq 修改操作请求参数 +type TestProjectInfoEditReq struct { + g.Meta `path:"/edit" tags:"项目备案信息" method:"put" summary:"项目备案信息修改"` + commonApi.Author + WxOrPc string `p:"wxOrPc" dc:"参数为1表示pc添加 否则为小程序添加"` + Creator string `p:"creator" v:"phone" dc:"小程序需要传递当前用户的电话"` + Id uint `p:"id" v:"required#主键ID不能为空"` + ProjectName string `p:"projectName" v:"required#项目名称不能为空"` + ProjectAddress string `p:"projectAddress" ` + ProjectLeader string `p:"projectLeader" ` + ResourceName string `p:"resourceName" v:"required#资源方不能为空"` + OwnerId int `p:"ownerId" v:"required#业主名id不能为空"` + ProjectType string `p:"projectType" ` + ProjectInfo string `p:"projectInfo" ` + ProjectState int `p:"projectState" ` +} + +// TestProjectInfoEditRes 修改操作返回结果 +type TestProjectInfoEditRes struct { + commonApi.EmptyRes +} + +// TestProjectInfoGetReq 获取一条数据请求 +type TestProjectInfoGetReq struct { + g.Meta `path:"/get" tags:"项目备案信息" method:"get" summary:"获取项目备案信息信息"` + commonApi.Author + Id uint `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// TestProjectInfoGetRes 获取一条数据结果 +type TestProjectInfoGetRes struct { + g.Meta `mime:"application/json"` + *model.TestProjectInfoInfoRes +} + +// TestProjectInfoDeleteReq 删除数据请求 +type TestProjectInfoDeleteReq struct { + g.Meta `path:"/delete" tags:"项目备案信息" method:"delete" summary:"删除项目备案信息"` + commonApi.Author + Ids []uint `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// TestProjectInfoDeleteRes 删除数据返回 +type TestProjectInfoDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/video_hat/alarm/alarm.go b/api/video_hat/alarm/alarm.go new file mode 100644 index 0000000..4dc41a7 --- /dev/null +++ b/api/video_hat/alarm/alarm.go @@ -0,0 +1,4 @@ +package alarm + +type Alarm struct { +} diff --git a/api/video_hat/alarm/model.go b/api/video_hat/alarm/model.go new file mode 100644 index 0000000..81f9df0 --- /dev/null +++ b/api/video_hat/alarm/model.go @@ -0,0 +1,17 @@ +package alarm + +import "time" + +type HatAlarm struct { + ID int `json:"id" dc:"ID"` + DevNum string `json:"devNum" dc:"视频安全帽设备号"` + DevName string `json:"devName" dc:"设备名称"` + ProjectID int `json:"projectId" dc:"项目ID"` + BatteryLevel string `json:"batteryLevel" dc:"电池电量"` + IsLowBattery bool `json:"isLowBattery" dc:"是否低电量"` + RoomID string `json:"roomId" dc:"房间ID"` + SipId string `json:"sipId" dc:"sipId"` + IsHandle string `json:"isHandle" dc:"是否处理(1处理了、0未处理)"` + CreatedAt time.Time `json:"createdAt" dc:"创建时间"` + HandleAt time.Time `json:"handleAt" dc:"处理时间"` +} diff --git a/api/video_hat/alarm/req.go b/api/video_hat/alarm/req.go new file mode 100644 index 0000000..f5a9dd1 --- /dev/null +++ b/api/video_hat/alarm/req.go @@ -0,0 +1,15 @@ +package alarm + +import "github.com/gogf/gf/v2/frame/g" + +type HatAlarmListReq struct { + g.Meta `path:"/alarm/list" method:"get" tags:"视频安全帽相关" summary:"获取设备报警列表"` + ProjectId int64 `json:"projectId" dc:"项目ID"` + Page int64 `json:"page" dc:"请求的页码" v:"required"` + PageSize int64 `json:"pageSize" dc:"每页显示的条目数" v:"required"` +} + +type HandleAlarmReq struct { + g.Meta `path:"/alarm/handle" method:"post" tags:"视频安全帽相关" summary:"处理SOS报警消息"` + Id string `json:"id" dc:"报警ID"` +} diff --git a/api/video_hat/alarm/res.go b/api/video_hat/alarm/res.go new file mode 100644 index 0000000..5d2f285 --- /dev/null +++ b/api/video_hat/alarm/res.go @@ -0,0 +1,9 @@ +package alarm + +type HatAlarmListRes struct { + HatAlarms []HatAlarm `json:"hatAlarms" dc:"报警列表"` + Total int64 `json:"total"` +} + +type HandleAlarmRes struct { +} diff --git a/api/video_hat/alarm/service.go b/api/video_hat/alarm/service.go new file mode 100644 index 0000000..9334b03 --- /dev/null +++ b/api/video_hat/alarm/service.go @@ -0,0 +1,38 @@ +package alarm + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "time" +) + +// 报警列表 +func (h Alarm) HatAlarmList(ctx context.Context, req *HatAlarmListReq) (res *HatAlarmListRes, err error) { + res = new(HatAlarmListRes) + offset := (req.Page - 1) * req.PageSize + var hatAlarms []HatAlarm + model := g.Model("hat_alarm") + count, err := model.Ctx(ctx).Count() + if err != nil { + return nil, err + } + model.Where("project_id = ?", req.ProjectId) + err = model.Offset(int(offset)).Limit(int(req.PageSize)).Scan(&hatAlarms) + if err != nil { + return nil, err + } + res.HatAlarms = hatAlarms + res.Total = int64(count) + return res, nil +} + +// 处理报警 +func (h Alarm) HandleAlarm(ctx context.Context, req *HandleAlarmReq) (res *HandleAlarmRes, err error) { + res = new(HandleAlarmRes) + data := g.Map{ + "is_handle": 1, + "handle_at": time.Now(), + } + g.Model("hat_alarm").Ctx(ctx).Data(data).Where("id", req.Id).Update() + return res, nil +} diff --git a/api/video_hat/guiji_back5/guiji_back.go b/api/video_hat/guiji_back5/guiji_back.go new file mode 100644 index 0000000..2d30d63 --- /dev/null +++ b/api/video_hat/guiji_back5/guiji_back.go @@ -0,0 +1,4 @@ +package guiji_back5 + +type GuijiBack struct { +} diff --git a/api/video_hat/guiji_back5/guiji_back5.1.go b/api/video_hat/guiji_back5/guiji_back5.1.go new file mode 100644 index 0000000..a46c106 --- /dev/null +++ b/api/video_hat/guiji_back5/guiji_back5.1.go @@ -0,0 +1,117 @@ +package guiji_back5 + +import ( + "bytes" + "context" + "encoding/json" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/constant" + "io/ioutil" + "net/http" + "strconv" +) + +// 请求参数结构体【这里传时间】 +type GetDevicesOnlineTimeDaysReq struct { + g.Meta `path:"/guijiDate" method:"post" tags:"视频安全帽相关" summary:"获取指定时间戳范围内帽子的在线时间"` + UID string `json:"uid" dc:"平台的用户ID"` + Stime int64 `json:"stime" dc:"Unix开始时间戳"` + Etime int64 `json:"etime" dc:"Unix结束时间戳"` +} + +type DevicesOnlineTimeDaysReq struct { + AdminID string `json:"admin_id"` + UserID string `json:"user_id"` + Stime int64 `json:"stime"` + Etime int64 `json:"etime"` + Token string `json:"token"` +} + +type DataListItem struct { + Ctime string `json:"ctime"` + Ltime int `json:"ltime"` + Sec int `json:"sec"` +} + +// 完整响应结构体 +type GetDevicesOnlineTimeDaysRes struct { + Status bool `json:"status"` + Msg string `json:"msg"` + Data DataResponse `json:"data"` + MsgCode string `json:"msg_code"` +} + +// 响应中的数据部分结构体 +type DataResponse struct { + List []DataListItem `json:"list"` + Total int `json:"total"` + TotalText string `json:"total_text"` +} + +// GetDevicesOnlineTimeDays是用于获取设备在线时间的方法 +func (gui GuijiBack) GetDevicesOnlineTimeDays(ctx context.Context, req *GetDevicesOnlineTimeDaysReq) (res *GetDevicesOnlineTimeDaysRes, err error) { + res = new(GetDevicesOnlineTimeDaysRes) + dataReq := DevicesOnlineTimeDaysReq{ + AdminID: constant.AdminId, + UserID: req.UID, + Stime: req.Stime, + Etime: req.Etime, + Token: constant.Token, + } + + reqBody, err := json.Marshal(dataReq) + if err != nil { + return res, err + } + + // 发送POST请求 + resp, err := http.Post("https://caps.runde.pro/api/index.php?ctl=device&act=get_devices_online_time_days", "application/json", bytes.NewBuffer(reqBody)) + if err != nil { + return res, err + } + defer resp.Body.Close() + + // 读取响应体 + respBody, err := ioutil.ReadAll(resp.Body) + + if err != nil { + return res, err + } + + // 反序列化响应体到结构体 + err = json.Unmarshal(respBody, &res) + if err != nil { + return res, err + } + + return res, nil +} + +// 自定义UnmarshalJSON方法来处理sec字段的不同数据类型【小杨源码改写】 +func (d *DataListItem) UnmarshalJSON(data []byte) error { + // 创建一个只在此方法内使用的类型,以避免无限递归调用UnmarshalJSON + type Alias DataListItem + aux := &struct { + Sec json.RawMessage `json:"sec"` + *Alias + }{ + Alias: (*Alias)(d), + } + if err := json.Unmarshal(data, &aux); err != nil { + return err + } + // 尝试将sec解析为int + if err := json.Unmarshal(aux.Sec, &d.Sec); err != nil { + // 如果解析为int失败,尝试解析为string,然后转换为int + var secStr string + if err := json.Unmarshal(aux.Sec, &secStr); err != nil { + return err // 不能解析sec为int或string + } + secInt, err := strconv.Atoi(secStr) + if err != nil { + return err // 不能将sec的字符串值转换为int + } + d.Sec = secInt + } + return nil +} diff --git a/api/video_hat/guiji_back5/guiji_back5.2.go b/api/video_hat/guiji_back5/guiji_back5.2.go new file mode 100644 index 0000000..e78b1cc --- /dev/null +++ b/api/video_hat/guiji_back5/guiji_back5.2.go @@ -0,0 +1,77 @@ +package guiji_back5 + +import ( + "bytes" + "context" + "encoding/json" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/constant" + "io/ioutil" + "net/http" +) + +type GetUserPathWebReq struct { + g.Meta `path:"/guijiData" method:"post" tags:"视频安全帽相关" summary:"获取指定时间段内轨迹记录"` + UID string `json:"uid" dc:"平台的用户ID"` + Start int64 `json:"start" dc:"Unix开始时间戳"` + End int64 `json:"end" dc:"Unix结束时间戳"` +} + +type UserPathWebRequest struct { + AdminID string `json:"admin_id"` + UserID string `json:"user_id"` + Start int64 `json:"start"` + End int64 `json:"end"` + Token string `json:"token"` +} + +type GetUserPathWebRes struct { + Status bool `json:"status"` + Msg string `json:"msg"` + Data []PathDataItem `json:"data"` + MsgCode string `json:"msg_code"` +} + +type PathDataItem struct { + XPoint string `json:"x_point"` + YPoint string `json:"y_point"` + Time string `json:"time"` + CTime string `json:"c_time"` + CAngle string `json:"c_angle"` + CSpeed string `json:"c_speed"` + CTrust string `json:"c_trust"` + GPS string `json:"gps"` +} + +func (gj GuijiBack) GetUserPathWeb(ctx context.Context, req *GetUserPathWebReq) (res *GetUserPathWebRes, err error) { + res = new(GetUserPathWebRes) + dataReq := UserPathWebRequest{ + AdminID: constant.AdminId, + UserID: req.UID, + Start: req.Start, + End: req.End, + Token: constant.Token, + } + + reqBody, err := json.Marshal(dataReq) + + // 替换为实际的API URL + url := "https://caps.runde.pro/api/index.php?ctl=location&act=get_user_path_web" + resp, err := http.Post(url, "application/json", bytes.NewBuffer(reqBody)) + if err != nil { + return res, err + } + defer resp.Body.Close() + + respBody, err := ioutil.ReadAll(resp.Body) + if err != nil { + return res, err + } + + err = json.Unmarshal(respBody, &res) + if err != nil { + return nil, err + } + + return res, nil +} diff --git a/api/video_hat/index.go b/api/video_hat/index.go new file mode 100644 index 0000000..984006b --- /dev/null +++ b/api/video_hat/index.go @@ -0,0 +1,207 @@ +package video_hat + +import ( + "context" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "time" +) + +type VideoDeviceHat struct { + DevNum string `json:"dev_num"` // 设备编号 + DevName string `json:"dev_name"` // 设备名 + Status int `json:"status"` // 安全帽状态(0:离线,1:在线,2:监控中,3:通话中,4:隐私模式) + ProjectID int64 `json:"project_id"` // 项目id + UserID string `json:"user_id"` // 用户id + BatteryLevel string `json:"battery_level"` // 电量 + IsLowBattery bool `json:"is_low_battery"` // 是否处于低电量,true代表低电量,false则不是低电量 + CreateTime time.Time `json:"create_time"` // 创建时间 + UpdatedAt time.Time `json:"updated_at"` // 更新时间 + Longitude string `json:"longitude"` // 最新的经度 + Latitude string `json:"latitude"` // 最新的维度 + SipId int `json:"sip_id"` // SIPID + Uid int `json:"uid"` // 安全帽厂商返回的用户ID + PushStatus string `json:"push_status"` // 推流状态 + Nickname string `json:"nick_name"` // 用户名称 + UserName string `json:"user_name"` // 真实名称 + HeadIcon string `json:"head_icon"` // 头像 + Phone string `json:"phone"` // 电话 +} + +// 视频安全帽设备列表 +type DeviceListReq struct { + g.Meta `path:"/video/device/list" method:"post" tags:"视频安全帽相关" summary:"视频安全帽设备列表"` + ProjectId int64 `json:"projectId" dc:"项目ID"` + DevNum string `json:"devNum" dc:"设备编号模糊查询"` + DevName string `json:"devName" dc:"设备名称模糊查询"` + Status *int `json:"status" dc:"安全帽状态等值查询"` // 使用指针允许状态为nil,表示不过滤状态 + Page int64 `json:"page" dc:"请求的页码" v:"required"` + PageSize int64 `json:"pageSize" dc:"每页显示的条目数" v:"required"` +} + +// 视频安全帽设备列表响应结构体 +type DeviceListRes struct { + Total int64 `json:"total"` // 总条目数 + VideoDeviceHats []VideoDeviceHat `json:"videoDeviceHats"` +} + +func (v VideoHat) DeviceList(ctx context.Context, req *DeviceListReq) (res *DeviceListRes, err error) { + res = new(DeviceListRes) + offset := (req.Page - 1) * req.PageSize + var devices []VideoDeviceHat + + // 准备查询模型,设置连表查询 + model := g.Model("device_video_hat AS dvh").LeftJoin("bus_construction_user AS user", "user.id=dvh.user_id") + + // 根据项目ID过滤 + if req.ProjectId != 0 { + model = model.Where("dvh.project_id = ?", req.ProjectId) + } + + // 设备编号模糊查询 + if req.DevNum != "" { + model = model.Where("dvh.dev_num LIKE ?", "%"+req.DevNum+"%") + } + + // 设备名称模糊查询 + if req.DevName != "" { + model = model.Where("dvh.dev_name LIKE ?", "%"+req.DevName+"%") + } + + // 安全帽状态等值查询 + if req.Status != nil { + model = model.Where("dvh.status = ?", *req.Status) + } + + // 应用查询条件但不选取字段,用于计数 + count, err := model.Count() + if err != nil { + return nil, err + } + + // 选取具体字段,包括连表查询字段 + model = model.Fields("dvh.*, user.nick_name,user.user_name,user.head_icon,user.phone") + + // 获取当前页的设备列表 + err = model.Offset(int(offset)).Limit(int(req.PageSize)).Scan(&devices) + if err != nil { + return nil, err + } + + res.Total = int64(count) + res.VideoDeviceHats = devices + return res, nil +} + +// 为设备绑定项目ID +type BindProjectIdReq struct { + g.Meta `path:"/video/project/bind" method:"post" tags:"视频安全帽相关" summary:"为设备绑定项目"` + ProjectId int64 `json:"projectId" dc:"项目ID"` + DevNum string `json:"devNum" dc:"设备编号"` +} + +type BindProjectIdRes struct { +} + +func (v VideoHat) BindProjectId(ctx context.Context, req *BindProjectIdReq) (res *BindProjectIdRes, err error) { + res = new(BindProjectIdRes) + param := g.Map{ + "project_id": req.ProjectId, + } + g.Model("device_video_hat").Data(param).Where("dev_num = ?", req.DevNum).Update() + return res, nil +} + +// 为设备解绑项目ID +type UnBindProjectIdReq struct { + g.Meta `path:"/video/project/unbind" method:"post" tags:"视频安全帽相关" summary:"为设备解绑项目"` + DevNum string `json:"devNum" dc:"设备编号"` +} + +// 视频安全帽设备列表响应结构体 +type UnBindProjectIdRes struct { +} + +func (v VideoHat) UnBindProjectId(ctx context.Context, req *UnBindProjectIdReq) (res *UnBindProjectIdRes, err error) { + res = new(UnBindProjectIdRes) + param := g.Map{ + "project_id": nil, + } + g.Model("device_video_hat").Data(param).Where("dev_num = ?", req.DevNum).Update() + return res, nil +} + +// 为设备绑定用户ID +type BindUserIdReq struct { + g.Meta `path:"/video/user/bind" method:"post" tags:"视频安全帽相关" summary:"为设备绑定用户"` + UserId int64 `json:"userId" dc:"用户ID"` + DevNum string `json:"devNum" dc:"设备编号"` +} + +type BindUserIdRes struct { +} + +func (v VideoHat) BindUserId(ctx context.Context, req *BindUserIdReq) (res *BindUserIdRes, err error) { + param := g.Map{ + "user_id": req.UserId, + } + g.Model("device_video_hat").Data(param).Where("dev_num = ?", req.DevNum).Update() + return res, nil +} + +// 为设备绑定用户ID +type UnBindUserIdReq struct { + g.Meta `path:"/video/user/unbind" method:"post" tags:"视频安全帽相关" summary:"为设备解绑用户"` + DevNum string `json:"devNum" dc:"设备编号"` +} + +type UnBindUserIdRes struct { +} + +func (v VideoHat) UnBindUserId(ctx context.Context, req *UnBindUserIdReq) (res *UnBindUserIdRes, err error) { + param := g.Map{ + "user_id": nil, + } + g.Model("device_video_hat").Data(param).Where("dev_num = ?", req.DevNum).Update() + return res, nil +} + +// 查询某个安全帽有轨迹的时间 +type DeviceListDateTimeReq struct { + g.Meta `path:"/video/device/dateList" method:"post" tags:"视频安全帽相关" summary:"视频安全帽轨迹时间列表"` + DevNum string `json:"devNum" dc:"设备编号"` + StartTime string `json:"startTime" dc:"开始时间,格式为 YYYY-MM"` +} + +type DeviceDataTime struct { + DataTime string `json:"dataTime"` +} + +// 视频安全帽设备列表响应结构体 +type DeviceListDateTimeRes struct { + DateTimeList []DeviceDataTime `json:"dateTimeList" dc:"设备含有轨迹的数据列表"` +} + +func (v VideoHat) DeviceListDateTime(ctx context.Context, req *DeviceListDateTimeReq) (res *DeviceListDateTimeRes, err error) { + res = new(DeviceListDateTimeRes) + + // 解析开始时间 + startTime, err := time.Parse("2006-01", req.StartTime) + if err != nil { + return nil, fmt.Errorf("invalid start time format: %v", err) + } + + // 计算该月的第一天和最后一天 + firstDayOfMonth := startTime + lastDayOfMonth := firstDayOfMonth.AddDate(0, 1, -1) // 增加一个月,减去一天 + + // 查询设备的数据时间在指定月份内 + g.Model("device_data_time"). + Fields("data_time AS dataTime"). + Where("dev_num = ?", req.DevNum). + Where("data_time >= ?", firstDayOfMonth.Format("2006-01-02")). + Where("data_time <= ?", lastDayOfMonth.Format("2006-01-02")). + Scan(&res.DateTimeList) + + return res, nil +} diff --git a/api/video_hat/location.go b/api/video_hat/location.go new file mode 100644 index 0000000..08e60c2 --- /dev/null +++ b/api/video_hat/location.go @@ -0,0 +1,24 @@ +package video_hat + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" +) + +// 查询某个设备的当前定位 +type GetNowLocationReq struct { + g.Meta `path:"/video/location" method:"post" tags:"视频安全帽相关" summary:"获取某个设备的当前定位"` + DevNum string `json:"devNum" dc:"设备号"` +} + +type GetNowLocationRes struct { + DevNum string `json:"devNum"` + Longitude string `json:"longitude"` + Latitude string `json:"latitude"` +} + +func (v VideoHat) GetAllVideodata(ctx context.Context, req *GetNowLocationReq) (res *GetNowLocationRes, err error) { + res = new(GetNowLocationRes) + g.Model("device_video_hat").Fields("dev_num AS devNum,longitude,latitude").Where("dev_num", req.DevNum).Scan(&res) + return res, nil +} diff --git a/api/video_hat/photomange10/get_pictures.go b/api/video_hat/photomange10/get_pictures.go new file mode 100644 index 0000000..3ee4348 --- /dev/null +++ b/api/video_hat/photomange10/get_pictures.go @@ -0,0 +1,57 @@ +package photomange10 + +import ( + "context" + "encoding/json" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/constant" + "io" + "net/http" + "net/url" +) + +// 获取照片 +type GetPicturesReq struct { + g.Meta `path:"/getpictures" method:"post" tags:"视频安全帽相关" summary:"获取照片"` + DevNum string `json:"devNum" dc:"设备号"` + Date string `json:"date" dc:"格式 yyyy-mm-dd(不是必填参数)"` + PageNum string `json:"pageNum" dc:"当前页数"` +} + +// 获取照片相应 +type GetPicturesRes struct { + ResponseData ResponseData `json:"responseData"` +} + +func (v Pictures) GetPictures(ctx context.Context, req *GetPicturesReq) (res *GetPicturesRes, err error) { + var userId string + id, _ := g.Model("device_video_hat").Fields("uid AS userId").Where("dev_num", req.DevNum).Value() + userId = gconv.String(id) + res = new(GetPicturesRes) + data := url.Values{} + data.Set("user_id", userId) + if req.Date != "" { + data.Set("date", req.Date) + } + data.Set("p", req.PageNum) + data.Set("token", constant.Token) + + resp, err := http.PostForm("https://caps.runde.pro/api/index.php?ctl=report&act=get_user_image", data) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + respBody, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + err = json.Unmarshal(respBody, &res.ResponseData) + if err != nil { + return nil, err + } + + return res, nil +} diff --git a/api/video_hat/photomange10/pictures.go b/api/video_hat/photomange10/pictures.go new file mode 100644 index 0000000..f8be09f --- /dev/null +++ b/api/video_hat/photomange10/pictures.go @@ -0,0 +1,4 @@ +package photomange10 + +type Pictures struct { +} diff --git a/api/video_hat/photomange10/pictures_model.go b/api/video_hat/photomange10/pictures_model.go new file mode 100644 index 0000000..87a98ff --- /dev/null +++ b/api/video_hat/photomange10/pictures_model.go @@ -0,0 +1,23 @@ +package photomange10 + +// 获取照片 +type ResponseData struct { + Status bool `json:"status"` + Message string `json:"msg"` + Data []ImageInfo `json:"data"` + MsgCode string `json:"msg_code"` +} + +type ImageInfo struct { + ID string `json:"i_id"` + UserID string `json:"user_id" dc:""` + ImageURL string `json:"image_url"` + XCoordinate string `json:"x_point"` // 将经纬度转换为浮点数类型 + YCoordinate string `json:"y_point"` + Timestamp string `json:"time" ` // 需要使用time.Unix()反序列化时间戳 + Extra string `json:"extra"` + TaskID string `json:"task_id"` + Content string `json:"content"` + FaceName string `json:"face_name"` + Temperature string `json:"temperature"` // 温度可能是字符串类型,如果需要转为数值类型请相应调整 +} diff --git a/api/video_hat/router.go b/api/video_hat/router.go new file mode 100644 index 0000000..7e79516 --- /dev/null +++ b/api/video_hat/router.go @@ -0,0 +1,25 @@ +package video_hat + +import ( + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/api/video_hat/alarm" + "github.com/tiger1103/gfast/v3/api/video_hat/guiji_back5" + "github.com/tiger1103/gfast/v3/api/video_hat/photomange10" + "github.com/tiger1103/gfast/v3/api/video_hat/video_playback11" + "github.com/tiger1103/gfast/v3/api/video_hat/ws2" +) + +func InitHatAPI(group *ghttp.RouterGroup) { + group.Middleware(ghttp.MiddlewareCORS) + group.Group("/manage", func(group *ghttp.RouterGroup) { + group.Group("/api/v1", func(group *ghttp.RouterGroup) { + group.Bind( + new(VideoHat), // 视频安全帽获取Token + new(photomange10.Pictures), // 照片管理10 + new(video_playback11.VideoPlayback), // 视频回放11 + new(ws2.WsRouter), // ws2相关 + new(guiji_back5.GuijiBack), // 轨迹相关 + new(alarm.Alarm)) + }) + }) +} diff --git a/api/video_hat/video.go b/api/video_hat/video.go new file mode 100644 index 0000000..3b05130 --- /dev/null +++ b/api/video_hat/video.go @@ -0,0 +1,4 @@ +package video_hat + +type VideoHat struct { +} diff --git a/api/video_hat/video_playback11/all_video_data11.1.go b/api/video_hat/video_playback11/all_video_data11.1.go new file mode 100644 index 0000000..ce59c3d --- /dev/null +++ b/api/video_hat/video_playback11/all_video_data11.1.go @@ -0,0 +1,49 @@ +package video_playback11 + +import ( + "context" + "encoding/json" + "io" + "net/http" + "net/url" + + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/constant" +) + +// 回放路由 +type VideoPlayback struct{} + +// 管理员下所有视频 +type GetAllVideodataReq struct { + g.Meta `path:"/video/data" method:"post" tags:"视频安全帽相关" summary:"获取管理员账号下所有设备的视频记录日期"` +} + +type GetAllVideodataRes struct { + List UserData `json:"list"` +} + +func (v VideoPlayback) GetAllVideodata(ctx context.Context, req *GetAllVideodataReq) (res *GetAllVideodataRes, err error) { + res = new(GetAllVideodataRes) + data := url.Values{} + data.Set("admin_id", constant.AdminId) + data.Set("token", constant.Token) + + resp, err := http.PostForm("https://caps.runde.pro/api/index.php?ctl=video&act=get_path_list", data) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + respBody, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + err = json.Unmarshal(respBody, &res.List) + if err != nil { + return nil, nil + } + + return res, nil +} diff --git a/api/video_hat/video_playback11/data_videoplayback11.2.go b/api/video_hat/video_playback11/data_videoplayback11.2.go new file mode 100644 index 0000000..11adf9c --- /dev/null +++ b/api/video_hat/video_playback11/data_videoplayback11.2.go @@ -0,0 +1,76 @@ +package video_playback11 + +import ( + "encoding/json" + "errors" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/constant" + "golang.org/x/net/context" + "io" + "net/http" + "net/url" +) + +// 管理员下所有视频 +type GetDataVideoPlaybackReq struct { + g.Meta `path:"/video/playback" method:"post" tags:"视频安全帽相关" summary:"根据日期获取设备视频列表"` + Year string `json:"year" dc:"年"` + Month string `json:"month" dc:"月"` + Day string `json:"day" dc:"日"` + UID string `json:"uid" dc:"平台的用户ID"` +} + +type GetDataVideoPlaybackRes struct { + List DataVideoPlayRes `json:"list"` +} + +type AnyString string + +func (a *AnyString) UnmarshalJSON(data []byte) error { + if string(data) == "null" { + return nil + } + // 尝试解析为字符串 + var str string + if err := json.Unmarshal(data, &str); err == nil { + *a = AnyString(str) + return nil + } + // 尝试解析为数字并转换为字符串 + var num int + if err := json.Unmarshal(data, &num); err == nil { + *a = AnyString(fmt.Sprintf("%d", num)) + return nil + } + return errors.New("msg_code is neither a string nor a number") +} + +func (v VideoPlayback) GetDataVideoPlayback(ctx context.Context, req *GetDataVideoPlaybackReq) (res *GetDataVideoPlaybackRes, err error) { + res = new(GetDataVideoPlaybackRes) + data := url.Values{} + data.Set("token", constant.Token) + data.Set("admin_id", constant.AdminId) + data.Set("uid", req.UID) + data.Set("year", req.Year) + data.Set("month", req.Month) + data.Set("day", req.Day) + + resp, err := http.PostForm("https://caps.runde.pro/api/index.php?ctl=video&act=get_video_list_v1", data) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + respBody, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + err = json.Unmarshal(respBody, &res.List) + if err != nil { + return nil, err + } + + return res, nil +} diff --git a/api/video_hat/video_playback11/videopalyback_model.go b/api/video_hat/video_playback11/videopalyback_model.go new file mode 100644 index 0000000..8f7459b --- /dev/null +++ b/api/video_hat/video_playback11/videopalyback_model.go @@ -0,0 +1,24 @@ +package video_playback11 + +// 11.1 获取管理员账号下所有设备包含视频记录日期 +type UserData map[string]UserYears +type UserYears map[string]UserMonths +type UserMonths map[string][]string + +// 11.2 根据日期获取设备视频列表 定义外层结构体 +type DataVideoPlayRes struct { + Status bool `json:"status"` + Msg string `json:"msg"` + Data []Video `json:"data"` + MsgCode interface{} `json:"msg_code"` +} + +// 定义Video结构体,表示data字段中的单个元素 +type Video struct { + ID string `json:"id"` + UserID string `json:"user_id"` + URL string `json:"url"` + CTime string `json:"ctime"` + Content *string `json:"content"` // 使用指针处理可能为null的字段 + PlayTime string `json:"play_time"` +} diff --git a/api/video_hat/video_token.go b/api/video_hat/video_token.go new file mode 100644 index 0000000..1192795 --- /dev/null +++ b/api/video_hat/video_token.go @@ -0,0 +1,84 @@ +package video_hat + +import ( + "context" + "encoding/json" + "io" + "net/http" + "net/url" + + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/constant" +) + +type RefreshTokenReq struct { + g.Meta `path:"/video/refreshToken" method:"post" tags:"视频安全帽相关" summary:"刷新Token(不需要前端调用)"` +} + +type RefreshTokenRes struct{} + +func (v VideoHat) RefreshToken(ctx context.Context, req *RefreshTokenReq) (res *RefreshTokenRes, err error) { + res = new(RefreshTokenRes) + InitToken() + return res, nil +} + +// 用于接收获取 Token 的响应 +type TokenRes struct { + Status bool `json:"status"` + Token string `json:"token"` + SessionId string `json:"session_id"` + MsgCode string `json:"msg_code"` +} + +type PKeyResponse struct { + Status bool `json:"status"` + Data string `json:"data"` + Msg string `json:"msg"` + MsgCode string `json:"msg_code"` +} + +type TokenResponse struct { + Token string `json:"token"` +} + +// 发送 POST 请求 +func fetchPostForm(url string, data url.Values) ([]byte, error) { + resp, err := http.PostForm(url, data) + if err != nil { + return nil, err + } + defer resp.Body.Close() + return io.ReadAll(resp.Body) +} + +// InitToken 项目初始化启动获取 Token【以及刷新 Token】 +func InitToken() error { + data := url.Values{} + data.Set("user_name", constant.Username) + data.Set("pwd", constant.Password) + + respBody, err := fetchPostForm("https://caps.runde.pro/api/index.php?ctl=tool&act=get_pkey", data) + if err != nil { + return err + } + + var pkeyRes PKeyResponse + if err := json.Unmarshal(respBody, &pkeyRes); err != nil { + return err + } + + data.Set("pkey", pkeyRes.Data) + respBody, err = fetchPostForm("https://caps.runde.pro/api/index.php?ctl=tool&act=get_token", data) + if err != nil { + return err + } + + var tokenRes TokenResponse + if err := json.Unmarshal(respBody, &tokenRes); err != nil { + return err + } + + constant.Token = tokenRes.Token + return nil +} diff --git a/api/video_hat/ws2/ws.go b/api/video_hat/ws2/ws.go new file mode 100644 index 0000000..76598e1 --- /dev/null +++ b/api/video_hat/ws2/ws.go @@ -0,0 +1,4 @@ +package ws2 + +type WsRouter struct { +} diff --git a/api/video_hat/ws2/ws2.1.go b/api/video_hat/ws2/ws2.1.go new file mode 100644 index 0000000..abd8a5b --- /dev/null +++ b/api/video_hat/ws2/ws2.1.go @@ -0,0 +1,112 @@ +package ws2 + +import ( + "encoding/json" + "github.com/gogf/gf/v2/frame/g" + "github.com/gorilla/websocket" + "github.com/tiger1103/gfast/v3/api/constant" + "golang.org/x/net/context" + "log" + "time" +) + +// 根据 Token 去登录 WS 请求 +func Login(conn *websocket.Conn) { + loginMessage := map[string]string{ + "act": "ma_login", + "user_name": constant.Username, + "access_token": constant.Token, + } + conn.WriteJSON(loginMessage) + // 休眠两秒钟,以便第三方服务端记录连接的信息 + time.Sleep(time.Second * 3) +} + +// 定义管理员登录响应结构体 +type AdminLoginResponse struct { + Cmd string `json:"cmd"` + Status bool `json:"status"` + Msg string `json:"msg"` + AdminInfo AdminInfo `json:"admin_info"` +} + +// 定义管理员信息结构体 +type AdminInfo struct { + AdminID string `json:"admin_id"` + UserName string `json:"user_name"` + Mobile string `json:"mobile"` + CTime string `json:"c_time"` + Pwd string `json:"pwd"` + PID string `json:"p_id"` + Department string `json:"department"` + Role string `json:"role"` + SIPInfo SIPInfo `json:"sip_info"` +} + +// 定义 SIP 信息结构体 +type SIPInfo struct { + SIPID string `json:"sip_id" dc:"SIPID"` + SIPPwd string `json:"sip_pwd" dc:"SIP密码"` + SIPHost string `json:"sip_host" dc:"SIP服务器URL"` + WSSURL string `json:"wss_url" dc:"WSS地址"` + STUNHost string `json:"stun_host" dc:"stun服务器"` + TurnHost string `json:"turn_host" dc:"turnserver地址"` + TurnUser string `json:"turn_user" dc:"turnserver账号"` + TurnPwd string `json:"turn_pwd" dc:"turnserver密码"` +} + +// 处理登录 +func HandleLogin(jsonString string) { + var response AdminLoginResponse + err := json.Unmarshal([]byte(jsonString), &response) + if err != nil { + log.Fatal("Error decoding JSON to struct:", err) + } + sipInfo := response.AdminInfo.SIPInfo + // 查询是否存在该数据 + IfExists, _ := g.Model("sip_info").Where("id = ?", 1).Count() + // 如果不存在,则插入数据 + if IfExists == 0 { + sipinfo := g.Map{ + "sip_id": sipInfo.SIPID, + "sip_pwd": sipInfo.SIPPwd, + "sip_host": sipInfo.SIPHost, + "wss_url": sipInfo.WSSURL, + "stun_host": sipInfo.STUNHost, + "turn_host": sipInfo.TurnHost, + "turn_user": sipInfo.TurnUser, + "turn_pwd": sipInfo.TurnPwd, + } + g.Model("sip_info").Data(sipinfo).Insert() + } else { + // 存在则更新数据 + sipinfo := g.Map{ + "sip_id": sipInfo.SIPID, + "sip_pwd": sipInfo.SIPPwd, + "sip_host": sipInfo.SIPHost, + "wss_url": sipInfo.WSSURL, + "stun_host": sipInfo.STUNHost, + "turn_host": sipInfo.TurnHost, + "turn_user": sipInfo.TurnUser, + "turn_pwd": sipInfo.TurnPwd, + } + g.Model("sip_info").Data(sipinfo).Where("id =?", 1).Update() + } +} + +// 管理员详情sip +type GetAdminLoginInfoReq struct { + g.Meta `path:"/device/admininfo" method:"get" tags:"视频安全帽相关" summary:"管理员详情sip"` +} + +type GetAdminLoginInfoRes struct { + List []SIPInfo `json:"list"` +} + +func (w WsRouter) GetAdminLoginInfo(ctx context.Context, req *GetAdminLoginInfoReq) (res *GetAdminLoginInfoRes, err error) { + res = new(GetAdminLoginInfoRes) + var list []SIPInfo + g.Model("sip_info").WithAll().Scan(&list) + res.List = list + return res, nil +} diff --git a/api/video_hat/ws2/ws2.2.go b/api/video_hat/ws2/ws2.2.go new file mode 100644 index 0000000..4baf61d --- /dev/null +++ b/api/video_hat/ws2/ws2.2.go @@ -0,0 +1,194 @@ +package ws2 + +import ( + "encoding/json" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/gorilla/websocket" + "github.com/tiger1103/gfast/v3/api/constant" + "log" + "time" +) + +// 获取实时、状态等心跳包的请求 +func SendHeartbeat(conn *websocket.Conn) { + activeDevicesMessage := map[string]string{ + "act": "ma_get_active_devices", + } + conn.WriteJSON(activeDevicesMessage) +} + +// 定时任务 +func SendHeartbeatTime(Conn *websocket.Conn) { + // 使用匿名函数创建一个定时器,每隔60秒执行一次 + ticker := time.NewTicker(60 * time.Second) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + SendHeartbeat(Conn) + } + } +} + +// Response 包含从服务器获取的设备数据 +type LocationAndHeart struct { + Cmd string `json:"cmd"` + Status bool `json:"status"` + Message string `json:"msg"` + Data []DeviceData `json:"data"` + MsgCode string `json:"msg_code"` +} + +// UserInfo 包含有关用户的信息 +type UserInfo struct { + UserID string `json:"user_id" dc:"用户id"` + CAVersion string `json:"ca_ver"` + DeviceID string `json:"device_id" dc:"设备id"` + Mobile string `json:"mobile"` + SIM string `json:"sim"` + CTime string `json:"c_time" dc:"创建时间"` + CALastLoginTime string `json:"ca_last_login_time"` + UserName string `json:"user_name" dc:"用户名字"` + UserImg string `json:"user_img"` + Department string `json:"department"` + Role string `json:"role"` + FID string `json:"f_id"` + CapType string `json:"cap_type"` + B1 string `json:"b1"` + B2 string `json:"b2"` + SOSHeight string `json:"sos_height"` + CUserID string `json:"c_user_id"` + VoicePkg string `json:"voice_pkg"` + AppVersion string `json:"app_version"` + Headset string `json:"headset"` + UploadVideoNum string `json:"upload_video_num"` + NotUploadedVideos string `json:"notuploaded_video_count"` + GID string `json:"g_id"` + SIPID int `json:"sip_id"` +} + +// LocationInfo 包含有关位置信息的数据 +type LocationInfo struct { + Act string `json:"act"` + BatteryLevel string `json:"bat_l" dc:"电量百分比"` + BatteryVoltage string `json:"bat_v" dc:"电池电压"` + Charging string `json:"charging"` + GPS string `json:"gps"` + GPSLevel string `json:"gps_level"` + InUse string `json:"in_use"` + IsWorn string `json:"is_weared"` + NetStrength string `json:"net_strenth"` + NetType string `json:"net_type"` + NotUploadedVideos string `json:"notuploaded_video_count"` + OnlineType string `json:"online_type"` + PhoneNumber string `json:"phoneNumber"` + RailStatus string `json:"rail_status"` + SIMDataNum string `json:"sim_data_num"` + SIMStatus string `json:"sim_status"` + TCardStatus string `json:"tcard_status"` + TempData string `json:"tempdata"` + UserID string `json:"user_id"` + XPoint string `json:"x_point"` + YPoint string `json:"y_point"` + CTime int64 `json:"ctime"` + CapType string `json:"cap_type"` +} + +// DeviceData 包含用户信息和位置信息 +type DeviceData struct { + UserInfo UserInfo `json:"user_info"` + LocationInfo LocationInfo `json:"location_info"` +} + +// 处理收到的心跳和实时数据信息 +func HandleLocation(jsonString string) { + var response LocationAndHeart + // 解析 JSON 字符串到结构体 + err := json.Unmarshal([]byte(jsonString), &response) + if err != nil { + log.Fatal("Error decoding JSON to struct:", err) + } + + var IsLowBattery int + // 用来跟踪当前活跃的设备编号 + activeDevices := make(map[string]bool) + + // 获取当前时间,格式化为 YYYY-MM-DD + currentTime := time.Now() + todayDate := currentTime.Format("2006-01-02") + + for _, v := range response.Data { + // 标记此设备ID为活跃 + activeDevices[v.UserInfo.DeviceID] = true + + // 将 Unix 时间戳(秒)转换为 time.Time 类型 + createTime := time.Unix(gconv.Int64(v.UserInfo.CTime), 0) + + // 判断电量是否低于20%,如果是,则标记为低电量 + if gconv.Int(v.LocationInfo.BatteryLevel) <= constant.BatteryLevel { + IsLowBattery = 1 + } + + // 检查数据库中是否存在该设备 + IfExists, _ := g.Model("device_video_hat").Where("dev_num", v.UserInfo.DeviceID).Count() + + if IfExists == 0 { + // 如果设备不存在,则插入新设备数据(不包括设备名称) + devHat := g.Map{ + "dev_num": v.UserInfo.DeviceID, + "status": v.LocationInfo.InUse, + "uid": v.UserInfo.UserID, + "battery_level": v.LocationInfo.BatteryLevel, + "is_low_battery": IsLowBattery, + "create_time": createTime, + "longitude": v.LocationInfo.XPoint, + "latitude": v.LocationInfo.YPoint, + "sip_id": v.UserInfo.SIPID, + } + g.Model("device_video_hat").Data(devHat).Save() + } else { + // 更新已存在的设备数据 + updateData := g.Map{ + "status": v.LocationInfo.InUse, + "uid": v.UserInfo.UserID, + "battery_level": v.LocationInfo.BatteryLevel, + "is_low_battery": IsLowBattery, + "create_time": createTime, + "longitude": v.LocationInfo.XPoint, + "latitude": v.LocationInfo.YPoint, + "sip_id": v.UserInfo.SIPID, + } + g.Model("device_video_hat").Data(updateData).Where("dev_num", v.UserInfo.DeviceID).Update() + } + + // 检查 device_data_time 表是否已有当天的记录 + count, err := g.Model("device_data_time").Where("dev_num = ? AND data_time = ?", v.UserInfo.DeviceID, todayDate).Count() + if err != nil { + log.Println("Error checking device_data_time:", err) + continue + } + if count == 0 { + // 如果没有记录,则插入新数据 + g.Model("device_data_time").Data(g.Map{ + "dev_num": v.UserInfo.DeviceID, + "data_time": todayDate, + }).Insert() + } + } + + // 从数据库中检索所有设备 + var allDevices []struct{ DevNum string } + err = g.Model("device_video_hat").Fields("dev_num AS DevNum").Scan(&allDevices) + if err != nil { + log.Fatal("Error retrieving all devices:", err) + } + + // 为不活跃的设备设置状态为0 + for _, device := range allDevices { + if _, isActive := activeDevices[device.DevNum]; !isActive { + g.Model("device_video_hat").Data(g.Map{"status": 0}).Where("dev_num", device.DevNum).Update() + } + } +} diff --git a/api/video_hat/ws2/ws2.4.go b/api/video_hat/ws2/ws2.4.go new file mode 100644 index 0000000..7260307 --- /dev/null +++ b/api/video_hat/ws2/ws2.4.go @@ -0,0 +1,153 @@ +package ws2 + +import ( + "encoding/json" + "errors" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/constant" + "github.com/tiger1103/gfast/v3/api/video_hat/alarm" + "io/ioutil" + "log" + "net/http" + "strconv" + "time" +) + +type CaInfo struct { + UserID string `json:"user_id"` + DeviceID string `json:"device_id"` + CaVer string `json:"ca_ver"` + Mobile string `json:"mobile"` + SIM string `json:"sim"` + Password string `json:"pwd"` + CTime string `json:"c_time"` + AppLastLoginTime string `json:"app_last_login_time"` + CaLastLoginTime string `json:"ca_last_login_time"` + UserName string `json:"user_name"` + RealName string `json:"real_name"` + UserImg string `json:"user_img"` + Department string `json:"department"` + Role string `json:"role"` + FID string `json:"f_id"` + CapType string `json:"cap_type"` +} + +type ServerPushCaSipSos struct { + Cmd string `json:"cmd"` + Type string `json:"type"` + RoomID string `json:"room_id"` + SosRoomID string `json:"sos_room_id"` + PictureQuality string `json:"picture_quality"` + CaInfo CaInfo `json:"ca_info"` + XPoint string `json:"x_point"` + YPoint string `json:"y_point"` + Time int64 `json:"time"` +} + +// 处理SOS信息 +func HandlePushCaSipSos(jsonString string) { + var response ServerPushCaSipSos + err := json.Unmarshal([]byte(jsonString), &response) + deviceID := response.CaInfo.DeviceID + var videoHat VideoDeviceHat + g.Model("device_video_hat").Where("dev_num = ?", deviceID).Scan(&videoHat) + + // 发送请求去获取设备的 sip_id 信息 https://caps.runde.pro/api/index.php?ctl=device&act=get_user_sip_id + res, _ := getSipId(constant.Token, videoHat.Uid) + sipid := res.Data.SIPID + + // 收到了报警 SOS 信息,把数据写入数据库,处理标记为未处理 + data := alarm.HatAlarm{ + DevNum: deviceID, + DevName: videoHat.DevName, + ProjectID: int(videoHat.ProjectID), + BatteryLevel: videoHat.BatteryLevel, + IsLowBattery: videoHat.IsLowBattery, + RoomID: response.RoomID, + SipId: sipid, + IsHandle: strconv.Itoa(0), + HandleAt: time.Time{}, + } + g.Model("hat_alarm").Data(data).Insert() + if err != nil { + log.Fatal("Error decoding JSON to struct:", err) + } +} + +func getSipId(token string, userId int) (res *Response, err error) { + res = new(Response) + + // 创建请求 + req, err := http.NewRequest("GET", "https://caps.runde.pro/api/index.php?ctl=device&act=get_user_sip_id", nil) + if err != nil { + return res, err + } + + // 添加请求头 + req.Header.Set("Authentication", token) + + // 添加查询参数 + query := req.URL.Query() + query.Add("user_id", strconv.Itoa(userId)) + req.URL.RawQuery = query.Encode() + + // 发送请求 + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + return res, err + } + defer resp.Body.Close() + + // 读取响应体 + respBody, err := ioutil.ReadAll(resp.Body) + if err != nil { + return res, err + } + + // 检查响应状态码 + if resp.StatusCode != http.StatusOK { + return res, errors.New(fmt.Sprintf("unexpected status code: %d", resp.StatusCode)) + } + + // 反序列化响应体到结构体 + err = json.Unmarshal(respBody, &res) + if err != nil { + return res, err + } + + return res, nil +} + +type Response struct { + Status bool `json:"status"` + Msg string `json:"msg"` + Data DataObject `json:"data"` + MsgCode string `json:"msg_code"` +} + +type DataObject struct { + SIPID string `json:"sip_id"` +} + +type VideoDeviceHat struct { + DevNum string `json:"dev_num"` // 设备编号 + DevName string `json:"dev_name"` // 设备名 + Status int `json:"status"` // 安全帽状态(0:离线,1:在线,2:监控中,3:通话中,4:隐私模式) + ProjectID int64 `json:"project_id"` // 项目id + UserID string `json:"user_id"` // 用户id + BatteryLevel string `json:"battery_level"` // 电量 + IsLowBattery bool `json:"is_low_battery"` // 是否处于低电量,true代表低电量,false则不是低电量 + CreateTime time.Time `json:"create_time"` // 创建时间 + UpdatedAt time.Time `json:"updated_at"` // 更新时间 + Longitude string `json:"longitude"` // 最新的经度 + Latitude string `json:"latitude"` // 最新的维度 + SipId int `json:"sip_id"` // SIPID + Uid int `json:"uid"` // 安全帽厂商返回的用户ID + PushStatus string `json:"push_status"` // 推流状态 + Nickname string `json:"nick_name"` // 用户名称 + UserName string `json:"user_name"` // 真实名称 + HeadIcon string `json:"head_icon"` // 头像 + Phone string `json:"phone"` // 电话 +} diff --git a/api/video_hat/ws2/ws2.5.1.go b/api/video_hat/ws2/ws2.5.1.go new file mode 100644 index 0000000..9a70789 --- /dev/null +++ b/api/video_hat/ws2/ws2.5.1.go @@ -0,0 +1,84 @@ +package ws2 + +import ( + "context" + "encoding/json" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/gorilla/websocket" + "github.com/tiger1103/gfast/v3/api/constant" + "log" + "strings" + "time" +) + +type OpenPushFlowReq struct { + g.Meta `path:"/device/open" method:"post" tags:"视频安全帽相关" summary:"开启推流"` + DevNum string `json:"devNum" dc:"设备id"` +} + +type OpenPushFlowRes struct { + Url string `json:"Url" dc:"返回地址"` +} + +// 设备地址的 Map 映射通道 +var deviceChannels = make(map[string]chan string) + +func (w WsRouter) OpenPushFlow(ctx context.Context, req *OpenPushFlowReq) (res *OpenPushFlowRes, err error) { + // 创建设备ID对应的通道 + deviceChan := make(chan string, 1) // 缓冲为1 + deviceChannels[req.DevNum] = deviceChan + + // 触发WS的推流 + SendDeviceEnablesPushFlow(constant.Conn, req.DevNum) + + // 等待接收 URL 或超时 + select { + case url := <-deviceChan: + res = &OpenPushFlowRes{Url: url} + case <-time.After(time.Second * 10): // 设置超时时间为10秒 + err = fmt.Errorf("timeout waiting for URL") + } + // 清理工作 + delete(deviceChannels, req.DevNum) + close(deviceChan) + return res, err +} + +// 发送报文指定设备开启推流 +func SendDeviceEnablesPushFlow(conn *websocket.Conn, DeviceId string) { + activeDevicesMessage := map[string]string{ + "act": "ma_open_rtsp", + "device_id": DeviceId, + } + + conn.WriteJSON(activeDevicesMessage) +} + +type MaOpenRtspResponse struct { + Cmd string `json:"cmd"` + DeviceId string `json:"device_id"` + Status bool `json:"status"` + Msg string `json:"msg"` + ApiUrl string `json:"api_url"` + PlayUrl []string `json:"play_url"` + MsgCode string `json:"msg_code"` + WebrtcUrl string `json:"webrtc_url"` +} + +// 处理函数 +func HandleDeviceEnablesPushFlow(jsonString string) { + var response MaOpenRtspResponse + err := json.Unmarshal([]byte(jsonString), &response) + if err != nil { + log.Fatal("Error decoding JSON to struct:", err) + } + for _, url := range response.PlayUrl { + // 截取 FLV 结尾的视频并发送到 HTTP 响应的通道中 + if strings.HasSuffix(url, ".flv") { + if deviceChan, ok := deviceChannels[response.DeviceId]; ok { + deviceChan <- url // 将URL发送到对应的通道 + } + } + } +} diff --git a/api/video_hat/ws2/ws2.5.2.go b/api/video_hat/ws2/ws2.5.2.go new file mode 100644 index 0000000..3c318de --- /dev/null +++ b/api/video_hat/ws2/ws2.5.2.go @@ -0,0 +1,48 @@ +package ws2 + +import ( + "context" + "encoding/json" + "github.com/gogf/gf/v2/frame/g" + "github.com/gorilla/websocket" + + "github.com/tiger1103/gfast/v3/api/constant" +) + +type OffPushFlowReq struct { + g.Meta `path:"/device/off" method:"post" tags:"视频安全帽相关" summary:"关闭推流"` + DevNum string `json:"devNum" dc:"设备id"` +} + +type OffPushFlowRes struct { +} + +func (w WsRouter) OffPushFlow(ctx context.Context, req *OffPushFlowReq) (res *OffPushFlowRes, err error) { + SendDeviceOffPushFlow(constant.Conn, req.DevNum) + return res, nil +} + +// 设备关闭推流 +func SendDeviceOffPushFlow(conn *websocket.Conn, DeviceId string) { + activeDevicesMessage := map[string]string{ + "act": "ma_stop_rtsp", + "device_id": DeviceId, + } + + conn.WriteJSON(activeDevicesMessage) +} + +// MaStopRtspCommand 定义了停止RTSP流的命令结构体 +type MaStopRtspCommand struct { + Cmd string `json:"cmd"` // cmd 指令标识 + DeviceID string `json:"device_id"` // device_id 设备ID + Status bool `json:"status"` // status 返回状态 + Msg string `json:"msg"` // msg 返回消息 + MsgCode string `json:"msg_code"` // msg_code 返回消息码 +} + +func HandStopPush(jsonString string) { + var response MaStopRtspCommand + json.Unmarshal([]byte(jsonString), &response) + +} diff --git a/api/video_hat/ws_connect.go b/api/video_hat/ws_connect.go new file mode 100644 index 0000000..9ebd61f --- /dev/null +++ b/api/video_hat/ws_connect.go @@ -0,0 +1,89 @@ +package video_hat + +import ( + "encoding/json" + "github.com/gorilla/websocket" + "github.com/tiger1103/gfast/v3/api/constant" + "github.com/tiger1103/gfast/v3/api/video_hat/ws2" + "log" + "time" +) + +// 项目启动就登录视频安全帽的 WS +func WsConnection() { + // 首先加载 WS 路径映射 + InitWsMap() + + // 无限循环尝试连接,直到成功 + for { + if connectWs() { + break // 如果连接成功,则退出循环 + } + log.Println("Reconnecting in 5 seconds...") + time.Sleep(5 * time.Second) // 等待5秒后重新连接WS + } +} + +func connectWs() bool { + // 创建 WebSocket 连接 + dialer := websocket.Dialer{ + HandshakeTimeout: 10 * time.Second, + } + + // 尝试连接 WebSocket + var err error + constant.Conn, _, err = dialer.Dial(constant.Url, nil) + if err != nil { + log.Println("Dial:", err) + return false + } + defer constant.Conn.Close() + + // 连接成功之后发送登录信息 + ws2.Login(constant.Conn) + + // 设置定时任务,每间隔60秒发送参数获取实时、状态等心跳包 + go ws2.SendHeartbeatTime(constant.Conn) + + // 处理从 WebSocket 接收的消息 + if handlerFun(constant.Conn) { + return true + } + + return false +} + +func handlerFun(Conn *websocket.Conn) bool { + // 读取 Conn 的数据成 JSON 字符串 + for { + _, message, err := Conn.ReadMessage() + + if err != nil { + log.Println("ReadMessage:", err) + return false // 如果读取过程中出现错误,则返回 false + } + + // 创建一个 map 来存储解析后的 JSON + var msgMap map[string]interface{} + + // 将读取到的字节切片解析为 JSON + err = json.Unmarshal(message, &msgMap) + if err != nil { + log.Println("Unmarshal:", err) + continue // 如果解析失败,则跳过此次循环 + } + + if cmd, ok := msgMap["cmd"].(string); ok { + if handler, exists := commandHandlers[cmd]; exists { + jsonString, err := json.Marshal(msgMap) + if err != nil { + log.Println("Marshal:", err) + continue // 如果序列化失败,则跳过此次循环 + } + handler(string(jsonString)) // 调用处理函数 + } + } + } + + return true // 正常退出循环,返回 true +} diff --git a/api/video_hat/ws_map.go b/api/video_hat/ws_map.go new file mode 100644 index 0000000..ffb6a50 --- /dev/null +++ b/api/video_hat/ws_map.go @@ -0,0 +1,26 @@ +package video_hat + +import ( + "github.com/tiger1103/gfast/v3/api/video_hat/ws2" +) + +type CommandHandler func(json string) + +type SpecialCommandHandler func(json string) (interface{}, error) + +var commandHandlers = map[string]CommandHandler{} + +// 初始化对应函数处理的方法 +func InitWsMap() { + commandHandlers[MALOGIN] = ws2.HandleLogin // 注册处理登录的函数【需要定义一个请求一个响应】 + commandHandlers[MAGETACTIVEDEVICES] = ws2.HandleLocation // 注册实时数据心跳的函数【需要定义一个请求一个响应】 + commandHandlers[MAOPENRTSP] = ws2.HandleDeviceEnablesPushFlow // 注册长链接发送报文指定设备开启推流 + commandHandlers[SERVERPUSHCASIPSOS] = ws2.HandlePushCaSipSos // 接收设备主动sos报警 + commandHandlers[MASTOPRTSP] = ws2.HandStopPush // 停止推流 +} + +const MALOGIN = "ma_login" // 登录 +const MAGETACTIVEDEVICES = "ma_get_active_devices" // 获取实时、状态等心跳包 +const MAOPENRTSP = "ma_open_rtsp" // 长链接发送报文指定设备开启推流 +const SERVERPUSHCASIPSOS = "server_push_ca_sip_sos" // 接收设备主动sos报警 +const MASTOPRTSP = "ma_stop_rtsp" // 停止推流 diff --git a/api/webodm.zip b/api/webodm.zip new file mode 100644 index 0000000..0ddc901 Binary files /dev/null and b/api/webodm.zip differ diff --git a/api/webodm/constant.go b/api/webodm/constant.go new file mode 100644 index 0000000..f83590d --- /dev/null +++ b/api/webodm/constant.go @@ -0,0 +1,8 @@ +package webodm + +const ( + Username = "yjdsj" + Password = "CQyj20200808!" + Host = "58.17.134.85" + Port = "8000" +) diff --git a/api/webodm/req.go b/api/webodm/req.go new file mode 100644 index 0000000..ab969c4 --- /dev/null +++ b/api/webodm/req.go @@ -0,0 +1,30 @@ +package webodm + +import "github.com/gogf/gf/v2/frame/g" + +// 项目及其任务列表请求 +type ProjectListReq struct { + g.Meta `path:"projectList" method:"get" tags:"图片合成相关" summary:"获取图片合成项目及其任务列表"` +} + +// 发起任务请求【只有手动测试一下这个接口】 +type TaskCreateReq struct { + g.Meta `path:"taskCreate" method:"post" tags:"图片合成相关" summary:"针对某个项目发起图片合成任务"` + ProjectId string `json:"projectId"` + UrlList []string `json:"urlList"` +} + +// 获取某个任务的进度 +type TaskProcessReq struct { + g.Meta `path:"taskProcess" method:"get" tags:"图片合成相关" summary:"查看某个任务的进度"` + TaskId string `json:"taskId" ` + ProjectId string `json:"projectId" ` +} + +// 下载某个任务的结果 +type TaskDownloadReq struct { + g.Meta `path:"download" method:"post" tags:"图片合成相关" summary:"下载某个任务的结果"` + TaskId string `json:"taskId"` + Format string `json:"format"` + ProjectId string `json:"projectId" ` +} diff --git a/api/webodm/res.go b/api/webodm/res.go new file mode 100644 index 0000000..a828117 --- /dev/null +++ b/api/webodm/res.go @@ -0,0 +1,64 @@ +package webodm + +// 项目列表响应 +type ProjectListRes struct { + ProjectsResponse +} +type ProjectsResponse struct { + Count int `json:"count"` + Next *string `json:"next"` + Previous *string `json:"previous"` + Results []Project `json:"results"` +} +type Project struct { + ID int `json:"id"` + Tasks []string `json:"tasks"` + CreatedAt string `json:"created_at"` + Permissions []string `json:"permissions"` + Name string `json:"name"` + Description string `json:"description"` +} + +// 发起任务响应 +type TaskCreateRes struct { + TaskId string `json:"taskId" dc:"任务ID"` +} + +// 获取某个任务的进度 +type TaskProcessRes struct { + TaskProcessResponse +} + +type TaskProcessResponse struct { + ID string `json:"id"` + Project int `json:"project"` + ProcessingNode int `json:"processing_node"` + ProcessingNodeName string `json:"processing_node_name"` + CanRerunFrom []string `json:"can_rerun_from"` + Statistics map[string]interface{} `json:"statistics"` + UUID string `json:"uuid"` + Name interface{} `json:"name"` + ProcessingTime int `json:"processing_time"` + AutoProcessingNode bool `json:"auto_processing_node"` + Status int `json:"status"` + LastError interface{} `json:"last_error"` + Options map[string]interface{} `json:"options"` + AvailableAssets []string `json:"available_assets"` + CreatedAt string `json:"created_at"` + PendingAction interface{} `json:"pending_action"` + Public bool `json:"public"` + ResizeTo int `json:"resize_to"` + UploadProgress float64 `json:"upload_progress"` + ResizeProgress float64 `json:"resize_progress"` + RunningProgress float64 `json:"running_progress"` + ImportURL string `json:"import_url"` + ImagesCount int `json:"images_count"` + Partial bool `json:"partial"` + PotreeScene map[string]interface{} `json:"potree_scene"` + EPSG interface{} `json:"epsg"` +} + +// 下载任务 +type TaskDownloadRes struct { + FileUrl string `json:"fileUrl"` +} diff --git a/api/webodm/router.go b/api/webodm/router.go new file mode 100644 index 0000000..798646e --- /dev/null +++ b/api/webodm/router.go @@ -0,0 +1,15 @@ +package webodm + +import "github.com/gogf/gf/v2/net/ghttp" + +type WebOdmApi struct { +} + +func InitWebOdmAPI(group *ghttp.RouterGroup) { + group.Middleware(ghttp.MiddlewareCORS) + group.Group("/", func(group *ghttp.RouterGroup) { + group.Group("/api/v1", func(group *ghttp.RouterGroup) { + group.Bind(new(WebOdmApi)) + }) + }) +} diff --git a/api/webodm/service.go b/api/webodm/service.go new file mode 100644 index 0000000..677d4f1 --- /dev/null +++ b/api/webodm/service.go @@ -0,0 +1,464 @@ +package webodm + +import ( + "bytes" + "context" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "github.com/go-resty/resty/v2" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gctx" + "github.com/tidwall/gjson" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "io" + "io/ioutil" + "mime/multipart" + "net/http" + "net/url" + "os" + fpath "path/filepath" + "strconv" + "strings" + "time" +) + +// 获取项目列表及其对应的任务列表 +func (w WebOdmApi) ProjectList(ctx context.Context, req *ProjectListReq) (res *ProjectListRes, err error) { + res, err = ProjectListFunc() + return +} +func ProjectListFunc() (res *ProjectListRes, err error) { + res = new(ProjectListRes) + url := fmt.Sprintf("http://%s:%s/api/projects/?ordering=-created_at&page=1", Host, Port) + + // 创建基本身份验证信息 + auth := Username + ":" + Password + authEncoded := base64.StdEncoding.EncodeToString([]byte(auth)) + + // 创建请求 + request, err := http.NewRequest("GET", url, nil) + if err != nil { + fmt.Println("Error creating request:", err) + return nil, err + } + + // 添加基本身份验证信息到请求头 + request.Header.Set("Authorization", "Basic "+authEncoded) + + // 发送请求 + client := &http.Client{} + resp, err := client.Do(request) + if err != nil { + fmt.Println("Error sending request:", err) + return nil, err + } + defer resp.Body.Close() + + // 读取响应体 + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + fmt.Println("Error reading response body:", err) + return nil, err + } + + // 解析 JSON 响应 + var projectsResponse ProjectsResponse + err = json.Unmarshal(body, &projectsResponse) + if err != nil { + fmt.Println("Error decoding JSON:", err) + return nil, err + } + + // 设置响应结果 + res.ProjectsResponse = projectsResponse + return res, nil +} + +// 创建任务 +func (w WebOdmApi) TaskCreate(ctx context.Context, req *TaskCreateReq) (res *TaskCreateRes, err error) { + res = new(TaskCreateRes) + res, err = TaskCreateFunc(ctx, req) + return +} +func TaskCreateFunc(ctx context.Context, req *TaskCreateReq) (res *TaskCreateRes, err error) { + res = new(TaskCreateRes) + // 准备图片 URL 列表 + imageURLs := req.UrlList + + // 准备一个 buffer 来保存 multipart form 的内容 + body := &bytes.Buffer{} + writer := multipart.NewWriter(body) + + // 遍历图片 URL 列表并从 URL 获取图片并添加到 multipart form 中 + for i, imageURL := range imageURLs { + // 从 URL 获取图片 + resp, err := http.Get(imageURL) + if err != nil { + fmt.Println("Failed to fetch image from URL:", err) + return res, err + } + defer resp.Body.Close() + + // 准备一个 multipart form 的 part,将图片数据写入 + part, err := writer.CreateFormFile("file"+strconv.Itoa(i+1), fpath.Base(imageURL)) + if err != nil { + fmt.Println("Failed to create form file:", err) + return res, err + } + _, err = io.Copy(part, resp.Body) + if err != nil { + fmt.Println("Failed to write image data:", err) + return res, err + } + } + + // 写入项目ID到 multipart form 中 + writer.WriteField("project_id", req.ProjectId) + + // 设置任务参数,以生成合并后的tif图片 + writer.WriteField("merge", "true") + + // 关闭 multipart writer + writer.Close() + + // 创建包含基本身份验证的请求 + url := fmt.Sprintf("http://%s:%s/api/projects/%s/tasks/", Host, Port, req.ProjectId) + request, err := http.NewRequest("POST", url, body) + if err != nil { + fmt.Println("Failed to create request:", err) + return res, err + } + + // 添加基本身份验证信息 + auth := Username + ":" + Password + authEncoded := base64.StdEncoding.EncodeToString([]byte(auth)) + request.Header.Set("Authorization", "Basic "+authEncoded) + + // 设置请求头中的 Content-Type 为 multipart/form-data + request.Header.Set("Content-Type", writer.FormDataContentType()) + + // 发送请求 + client := &http.Client{} + resp, err := client.Do(request) + if err != nil { + fmt.Println("Failed to send request:", err) + return res, err + } + defer resp.Body.Close() + + // 读取响应体 + respBody, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Println("Failed to read response body:", err) + return res, err + } + + // 解析 JSON 响应 + var jsonResponse map[string]interface{} + err = json.Unmarshal(respBody, &jsonResponse) + if err != nil { + fmt.Println("Failed to parse JSON response:", err) + return res, err + } + + // 提取任务ID + taskID, ok := jsonResponse["id"].(string) + if !ok { + fmt.Println("Failed to extract task ID from response") + return res, err + } + + // 设置任务ID到响应结构体中 + res.TaskId = taskID + return res, nil +} + +// 获取任务进度 +func (w WebOdmApi) TaskProcess(ctx context.Context, req *TaskProcessReq) (*TaskProcessRes, error) { + ressss, err := TaskProcessFunc(ctx, req) + return ressss, err +} + +func TaskProcessFunc(ctx context.Context, req *TaskProcessReq) (res *TaskProcessRes, err error) { + res = new(TaskProcessRes) + + // 构建请求 URL + url := fmt.Sprintf("http://%s:%s/api/projects/"+req.ProjectId+"/tasks/%s/", Host, Port, req.TaskId) + + // 创建基本身份验证信息 + auth := Username + ":" + Password + authEncoded := base64.StdEncoding.EncodeToString([]byte(auth)) + + // 创建请求 + request, err := http.NewRequest("GET", url, nil) + if err != nil { + fmt.Println("Error creating request:", err) + return nil, err + } + + // 添加基本身份验证信息到请求头 + request.Header.Set("Authorization", "Basic "+authEncoded) + + // 发送请求 + client := &http.Client{} + resp, err := client.Do(request) + if err != nil { + fmt.Println("Error sending request:", err) + return nil, err + } + defer resp.Body.Close() + + // 读取响应体 + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + fmt.Println("Error reading response body:", err) + return nil, err + } + + // 解析 JSON 响应 + err = json.Unmarshal(body, res) + if err != nil { + fmt.Println("Error decoding JSON:", err) + return nil, err + } + return res, nil +} + +// 下载任务得到的结果 +func (w WebOdmApi) DownloadTask(ctx context.Context, req *TaskDownloadReq) (res *TaskDownloadRes, err error) { + res, err = DownloadTask(ctx, req) + return +} + +func DownloadTask(ctx context.Context, req *TaskDownloadReq) (res *TaskDownloadRes, err error) { + res = new(TaskDownloadRes) + + // 构建请求 URL + requestURL := fmt.Sprintf("http://%s:%s/api/projects/"+req.ProjectId+"/tasks/%s/orthophoto/export", Host, Port, req.TaskId) + + // 创建基本身份验证信息 + auth := Username + ":" + Password + authEncoded := base64.StdEncoding.EncodeToString([]byte(auth)) + + // 获取任务的 epsg + epsg, err := GetEpsgByTaskID(req.ProjectId, req.TaskId) + if err != nil { + return nil, err + } + + // 构建请求体 + form := url.Values{} + form.Set("format", req.Format) + form.Set("epsg", epsg) + + // 创建请求 + httpRequest, err := http.NewRequest("POST", requestURL, strings.NewReader(form.Encode())) + if err != nil { + return nil, err + } + + // 设置基本身份验证头部 + httpRequest.Header.Set("Authorization", "Basic "+authEncoded) + httpRequest.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8") + + // 执行请求 + client := &http.Client{} + httpResponse, err := client.Do(httpRequest) + if err != nil { + return nil, err + } + defer httpResponse.Body.Close() + + // 读取响应体 + responseBody, err := ioutil.ReadAll(httpResponse.Body) + if err != nil { + return nil, err + } + + var TaskExportRes struct { + CeleryTaskID string `json:"celery_task_id"` + Filename string `json:"filename"` + } + + // 解析 JSON 响应 + err = json.Unmarshal(responseBody, &TaskExportRes) + if err != nil { + return nil, err + } + + celeryTaskID := TaskExportRes.CeleryTaskID + filename := TaskExportRes.Filename + + type WorkerCheckRes struct { + Ready bool `json:"ready"` + } + + // 定义 worker 检查结果的变量 + var workerCheckRes WorkerCheckRes + + // 循环检查任务状态,直到 Ready 为 true + for { + // 发起请求到 http://%s:%s/api/workers/check/celeryTaskID + workerCheckURL := fmt.Sprintf("http://%s:%s/api/workers/check/%s", Host, Port, celeryTaskID) + + // 创建新的 GET 请求 + workerCheckRequest, err := http.NewRequest("GET", workerCheckURL, nil) + if err != nil { + return nil, err + } + + // 设置基本身份验证头部 + workerCheckRequest.Header.Set("Authorization", "Basic "+authEncoded) + workerCheckRequest.Header.Set("Accept", "application/json") + + // 执行 GET 请求 + workerCheckResponse, err := client.Do(workerCheckRequest) + if err != nil { + return nil, err + } + defer workerCheckResponse.Body.Close() + + // 读取 GET 响应体 + workerCheckResponseBody, err := ioutil.ReadAll(workerCheckResponse.Body) + if err != nil { + return nil, err + } + + // 解析 GET 响应 + err = json.Unmarshal(workerCheckResponseBody, &workerCheckRes) + if err != nil { + return nil, err + } + + // 输出 worker 检查结果 + fmt.Println("Worker Check Result:", workerCheckRes) + + // 如果 Ready 为 true,则退出循环 + if workerCheckRes.Ready { + break + } + + // 如果 Ready 为 false,则等待 1 秒后重新检查 + time.Sleep(1 * time.Second) + } + + // 构建下载 URL + downloadURL := fmt.Sprintf("http://%s:%s/api/workers/get/%s?filename=%s", Host, Port, celeryTaskID, filename) + + // 发送 GET 请求并获取响应 + resp, err := http.Get(downloadURL) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + // 检查响应状态码 + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + // 读取图片数据 + imageData, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + // 创建目标文件夹路径 + if err := os.MkdirAll(coryCommon.UavMerge, os.ModePerm); err != nil { + return nil, err + } + + // 构建文件名,添加当前时间的年月日时分秒作为前缀 + currentTime := time.Now().Format("20060102150405") + fileNameWithTime := fmt.Sprintf("%s%s", currentTime, filename) + + // 构建文件路径 + filepath := fpath.Join(coryCommon.UavMerge, fileNameWithTime) + + // 写入图片数据到文件 + err = ioutil.WriteFile(filepath, imageData, 0644) + if err != nil { + return nil, err + } + + // 打印下载文件的信息 + fmt.Printf("Downloaded image saved as: %s\n", filepath) + + // 获取IP和端口 + //host := g.RequestFromCtx(ctx).Host + res.FileUrl = fmt.Sprintf("/%s/%s", coryCommon.UavMerge, fileNameWithTime) + return res, nil +} + +// GetEpsgByTaskID 根据任务ID 获取 epsg +func GetEpsgByTaskID(projectID, taskID string) (string, error) { + client := &http.Client{} + + auth := Username + ":" + Password + authEncoded := base64.StdEncoding.EncodeToString([]byte(auth)) + + url := fmt.Sprintf("http://%s:%s/api/projects/%s/tasks/?ordering=-created_at", Host, Port, projectID) + + request, err := http.NewRequest("GET", url, nil) + if err != nil { + return "", err + } + + request.Header.Set("Authorization", "Basic "+authEncoded) + + resp, err := client.Do(request) + if err != nil { + return "", err + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return "", err + } + + result := gjson.Parse(string(body)) + for _, value := range result.Array() { + if value.Get("id").String() == taskID { + return value.Get("epsg").String(), nil + } + } + + return "", nil +} + +// @Title DelUuidFunc 2024/8/13 11:40:00 +// @Description 根据项目ID及任务ID 找到资源并删除 +// @Auth Cory +// @param projectID ---> "webdom项目ID" +// @Return taskID ---> "webdom任务ID" +func DelUuidFunc(projectID, taskID string) (flag bool, err error) { + client := resty.New() + header := client.R(). + SetHeader("Content-Type", "application/json"). + SetHeader("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(Username+":"+Password))) + //1、获取uuid + url := fmt.Sprintf("http://%s:%s/api/projects/%s/tasks/%s", Host, Port, projectID, taskID) + resp, err := header.Get(url) + if err != nil { + g.Log().Error(gctx.New(), err) + return + } + uuid := gjson.Get(string(resp.Body()), "uuid").String() + if uuid == "" { + err = errors.New("删除失败,无法获取uuid!") + return + } + //2、根据uuid去删除对应的资源 + m := make(map[string]string) + m["uuid"] = uuid + url = url + "/remove/" + post, err := header.SetBody(m).Post(url) + if err != nil { + g.Log().Error(gctx.New(), err) + return false, err + } + return gjson.Get(string(post.Body()), "succeed").Bool(), nil +} diff --git a/api/wxApplet/wxApplet/appHomePage.go b/api/wxApplet/wxApplet/appHomePage.go new file mode 100644 index 0000000..29fad49 --- /dev/null +++ b/api/wxApplet/wxApplet/appHomePage.go @@ -0,0 +1,991 @@ +package wxApplet + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + controllerModel "github.com/tiger1103/gfast/v3/internal/app/system/model" + modelController "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" +) + +// ===========================================APP首页=========================================== +// ===========================================APP首页=========================================== +// ===========================================APP首页=========================================== + +type GetsTheAttendanceOfASpecifiedShiftGroupReq struct { + commonApi.Author + g.Meta `path:"/getsTheAttendanceOfASpecifiedShiftGroup" tags:"APP" method:"get" summary:"班组长人员打卡统计"` + TeamId int `p:"teamId" dc:"班组Id"` + LocalDate string `p:"localDate" dc:"日期(格式:2024-04-04)" v:"date-format:Y-m-d#时间格式为2024-04-04"` +} + +type GetsTheAttendanceOfASpecifiedShiftGroupRes struct { + g.Meta `mime:"application/json"` + All int `p:"all" dc:"班组总人数"` + ClockIn int `p:"clockIn" dc:"出勤人数"` + AskForLeave int `p:"askForLeave" dc:"请假人数"` + NotClockIn int `p:"notClockIn" dc:"未出勤人数"` +} + +type ListOfAttendancePersonnelReq struct { + g.Meta `path:"/listOfAttendancePersonnel" tags:"APP" method:"get" summary:"获取用户对应出勤状态的人员列表"` + commonApi.Author + commonApi.PageReq + Type string `p:"type" dc:"类型(0全部 1出勤 2请假 3未出勤)"` + TeamId int `p:"teamId" dc:"班组Id"` + LocalDate string `p:"localDate" dc:"日期(格式:2024-04-04)" v:"date-format:Y-m-d#时间格式为2024-04-04"` +} + +type ListOfAttendancePersonnelRes struct { + commonApi.EmptyRes + commonApi.ListRes + List []*ListOfAttendancePersonnelTwo `json:"list"` +} +type ListOfAttendancePersonnelTwo struct { + Openid string `p:"openid" dc:"openid"` + UserHead string `p:"userHead" dc:"头像"` + UserName string `p:"userName" dc:"名称"` + Phone string `p:"phone" dc:"电话"` + GangerOpinion string `p:"gangerOpinion" dc:"班组长意见(1未读 2同意 3拒绝)""` + ManagerOpinion string `p:"managerOpinion" dc:"管理员意见(1未读 2同意 3拒绝)"` + CardMode string `json:"cardMode" dc:"卡片状态(文字)"` + CardNumber string `json:"cardNumber" dc:"卡片状态(数字:1待审核 2审核中 3已拒绝 4已同意)"` +} + +// AppUserMenusReq 获取用户菜单 +type AppUserMenusReq struct { + commonApi.Author + g.Meta `path:"/appUserMenus" tags:"APP" method:"get" summary:"获取用户菜单"` + UserType int `p:"userType" dc:"用户类型(0管理人员 1施工人员)"` +} + +type AppUserMenu struct { + MenuName string `orm:"menu_name" json:"menuName"` // 菜单名 + MenuID uint `orm:"menu_id,primary" json:"menuId"` // 菜单主键ID +} + +// AppUserMenusRes 用户菜单返回 +type AppUserMenusRes struct { + g.Meta `mime:"application/json"` + MenuList []AppUserMenu +} + +type AppMyAttendanceReq struct { + g.Meta `path:"/appMyAttendanceReq" tags:"APP" method:"get" summary:"首页>我的考勤"` + Openid string `p:"openid" dc:"openid" v:"required#openId必须"` + YearAndMonth string `p:"yearAndMonth" dc:"日期(格式:2024-04)" v:"date-format:Y-m#时间格式为2024-04"` + commonApi.Author +} + +type AppMyAttendanceRes struct { + g.Meta `mime:"application/json"` + GoOut int `p:"goOut" dc:"出勤"` + BeLate int `p:"beLate" dc:"迟到"` + LeaveEarly int `p:"leaveEarly" dc:"早退"` + LackOfCard int `p:"lackOfCard" dc:"缺卡"` +} + +type AppProjectOverviewReq struct { + g.Meta `path:"/appProjectOverview" tags:"APP" method:"get" summary:"首页>项目概况"` + ProjectId string `p:"projectId" dc:"项目ID" v:"required#projectId必须" ` + commonApi.Author +} + +type AppProjectOverviewRes struct { + g.Meta `mime:"application/json"` + VideoSurveillance int `p:"videoSurveillance" dc:"监控视频点位"` + SafetyLoophole int `p:"safetyLoophole" dc:"工地安全隐患"` + SafetyInspection int `p:"safetyInspection" dc:"日常安全巡检"` +} + +type AppSafetyHazardTodayReq struct { + g.Meta `path:"/appSafetyHazardToday" tags:"APP" method:"get" summary:"首页>项目概况>AI安全隐患【分页】"` + commonApi.Author + commonApi.PageReq + FuzzyQuery string `p:"fuzzyQuery" dc:"模糊查询姓名"` + DateQuery string `p:"dateQuery" dc:"日期模糊查询(2023-02-02)" v:"date-format:Y-m-d#时间格式错误!"` +} + +type AppSafetyHazardTodayRes struct { + commonApi.EmptyRes + commonApi.ListRes + List []*modelController.AppWorkOrderPcListLogicRes `json:"list"` +} + +type AppWeatherReq struct { + g.Meta `path:"/appWeather" tags:"APP" method:"get" summary:"首页>气象"` + commonApi.Author + Location string `p:"location" v:"required#location必须"` +} + +type AppWeatherRes struct { + g.Meta `mime:"application/json"` + *coryCommon.WeatherRep +} + +type AppMyAttendanceDetailsReq struct { + g.Meta `path:"/appMyAttendanceDetails" tags:"APP" method:"get" summary:"我的考勤>我的出勤"` + commonApi.Author + Openid string `p:"openid" dc:"openid" v:"required#openId必须"` + YearAndMonth string `p:"yearAndMonth" dc:"日期(格式:2024-04)" v:"date-format:Y-m#时间格式为2024-04"` +} + +// AppMyProjectListReq 获取项目列表 +type AppMyProjectListReq struct { + g.Meta `path:"/appMyProjectList" tags:"APP" method:"get" summary:"首页>我的项目列表"` + commonApi.Author + // 获取施工人员或管理人员项目 + ProjectType int `p:"projectType" d:"0" dc:"0 管理人员 | 1 施工人员"` +} + +type AppMyAttendanceDetailsRes struct { + commonApi.EmptyRes + UserName string `p:"userName" dc:"名称"` + ProjectId int64 `p:"projectId" dc:"项目ID"` + PacePhoto string `p:"pacePhoto" dc:"人脸头像"` + EntryDate string `p:"entryDate" dc:"入场时间"` + LeaveDate string `p:"leaveDate" dc:"退场时间"` + SfzNumber string `p:"sfzNumber" dc:"身份证号码"` + MyAttendance *AppMyAttendanceRes `p:"myAttendance" dc:"我的考勤"` + DetailsList []MyAttendanceDetailsListRes `p:"detailsList" dc:"详情列表"` + BeLate string `p:"beLate" dc:"迟到统计(返回:1次,10分钟)"` + BeLateList []MyAttendanceDetailsListRes `p:"beLateList" dc:"迟到列表"` + LeaveEarly string `p:"leaveEarly" dc:"早退统计(返回:1次,10分钟)"` + LeaveEarlyList []MyAttendanceDetailsListRes `p:"leaveEarlyList" dc:"早退列表"` + LackOfCard string `p:"lackOfCard" dc:"缺卡统计(返回:1次,10分钟)"` + LackOfCardList []MyAttendanceDetailsListRes `p:"lackOfCardList" dc:"缺卡列表"` +} + +type MyAttendanceDetailsListRes struct { + commonApi.EmptyRes + Id uint64 `p:"id" dc:"考勤表的主键ID"` + Commuter string `p:"commuter" dc:"上下班(1上班2下班)"` + ResDate string `p:"resDate" dc:"考勤日期"` + Week string `p:"resDate" dc:"星期"` + Duration string `p:"duration" dc:"时长(0.5半天 1全天 超过1天说明有加班情况)"` + Type string `p:"type" dc:"2迟到 3早退 4缺卡"` + FourType string `p:"fourType" dc:"type为4出现此字段(1已补卡 2未补卡)"` + ClockingTime string `p:"clockingTime" dc:"打卡时间(迟到、早退的打卡时间)"` + Minute float64 `p:"minute" dc:"分钟(迟到、早退的分钟)"` +} + +type AppProjectNoticeReq struct { + g.Meta `path:"/appProjectNotice" tags:"APP" method:"get" summary:"首页>项目公告"` + commonApi.Author + ProjectId string `p:"projectId" dc:"项目ID" v:"required#projectId必须"` +} + +type ProjectNoticeList struct { + Title string `p:"title" orm:"title" dc:"项目公告标题"` +} + +type AppProjectNoticeRes struct { + g.Meta `mime:"application/json"` + List []*ProjectNoticeList `p:"projectNoticeList" dc:"项目公告列表"` +} + +type AppRegisteredButNotVerifiedWithRealNameReq struct { + g.Meta `path:"/registeredButNotVerifiedWithRealName" tags:"APP" method:"get" summary:"获取所有已注册未实名的用户"` + commonApi.PageReq + commonApi.Author + Phone string `dc:"电话" json:"phone"` +} + +type AppRegisteredButNotVerifiedWithRealNameRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*RegisteredButNotVerifiedWithRealNameRes `p:"projectNoticeList" dc:"项目公告列表"` +} + +type RegisteredButNotVerifiedWithRealNameRes struct { + Id int64 `dc:"序号" json:"id"` + Openid string `dc:"微信id" json:"openid"` + Phone string `dc:"电话" json:"phone"` +} + +// ===========================================定位考勤=========================================== +// ===========================================定位考勤=========================================== +// ===========================================定位考勤=========================================== + +type AppCodedBackwardsByLatitudeAndLongitudeReq struct { + g.Meta `path:"/appCodedBackwardsByLatitudeAndLongitude" tags:"APP" method:"get" summary:"定位考勤>逆地理编码(经度纬度转城市名称)"` + commonApi.Author + Location string `p:"location" v:"required#location必须"` +} + +type AppCodedBackwardsByLatitudeAndLongitudeRes struct { + g.Meta `mime:"application/json"` + *coryCommon.InverseGeocodingRep +} + +type AppOpenidByFounderReq struct { + g.Meta `path:"/appOpenidByFounder" tags:"APP" method:"get" summary:"定位考勤>返回当前用户所在项目的打卡范围"` + commonApi.Author + Openid string `p:"openid" dc:"openid" v:"required#openid必须"` +} + +type AppOpenidByFounderRes struct { + g.Meta `mime:"application/json"` + LongAndLat string `json:"longAndLat" dc:"经度纬度"` + FangzhengEntity []*FangzhengEntity `json:"fangzhengEntity" dc:"方正范围"` + ProjectPunchEntity []*ProjectPunchEntity `json:"projectPunchEntity" dc:"打卡范围"` +} + +type AppWhetherToEnterTheClockRangeReq struct { + g.Meta `path:"/appWhetherToEnterTheClockRange" tags:"APP" method:"get" summary:"定位考勤>判断当前用户是否进入打卡范围"` + commonApi.Author + Openid string `p:"openid" dc:"openid" v:"required#openid必须"` + LocationLng float64 `p:"locationLng" dc:"经度"` // 经度 + LocationLat float64 `p:"locationLat" dc:"纬度"` // 纬度 +} + +type AppWhetherToEnterTheClockRangeRes struct { + g.Meta `mime:"application/json"` + ReturnState string `json:"returnState" dc:"1未在范围内 2在范围内 3可在任意范围打卡"` +} + +type AppClockingStatusOfTheDayReq struct { + g.Meta `path:"/appClockingStatusOfTheDay" tags:"APP" method:"get" summary:"定位考勤>判断当前用户当天的打卡状态"` + commonApi.Author + Openid string `p:"openid" dc:"openid" v:"required#openid必须"` +} + +type AppClockingStatusOfTheDayRes struct { + g.Meta `mime:"application/json"` + ReturnState string `json:"returnState" dc:"1未打卡 2已打上班卡 3已打下班卡"` +} + +type AppFaceDetectionReq struct { + g.Meta `path:"/appFaceDetection" tags:"APP" method:"post" summary:"定位考勤>人脸检测"` + commonApi.Author + File *ghttp.UploadFile `p:"file" dc:"图片上传"` +} + +type AppFaceDetectionRes struct { + commonApi.EmptyRes + Path string `p:"path" dc:"人脸检查通过返回文件相对路径"` +} + +type AppAttendanceCardReq struct { + g.Meta `path:"/appAttendanceCard" tags:"APP" method:"post" summary:"定位考勤>考勤打卡"` + commonApi.Author + PacePhoto string `p:"pacePhoto" dc:"人脸数据" v:"required#人脸数据pacePhoto不能为空"` + ProjectId int64 `p:"projectId" dc:"项目ID"` + Openid string `p:"openid" dc:"openid" v:"required#用户标识Openid不能为空"` + PinchOpenId string `p:"pinchOpenId" dc:"代打卡人openid"` + LocationLng float64 `p:"locationLng" dc:"经度"` // 经度 + LocationLat float64 `p:"locationLat" dc:"纬度"` // 纬度 +} + +type AppAttendanceCardRes struct { + commonApi.EmptyRes +} + +type AppAllMembersOfTheCurrentGroupReq struct { + g.Meta `path:"/allMembersOfTheCurrentGroup" tags:"APP" method:"get" summary:"定位考勤>获取当前用户所在组的所有成员(除自己)【分页】"` + commonApi.Author + commonApi.PageReq + Openid string `p:"openid" v:"required#openid不能为空"` + LikeName string `p:"likeName" dc:"模糊查询姓名"` +} + +type AppAllMembersOfTheCurrentGroupRes struct { + commonApi.EmptyRes + commonApi.ListRes + List []*model.AppAllMembersOfTheCurrentGroupRes +} + +type AppSelectThisUserByCardRecordReq struct { + g.Meta `path:"/appSelectThisUserByCardRecord" tags:"APP" method:"get" summary:"定位考勤>为指定用户指定时间查询代打卡了哪些人"` + commonApi.Author + Openid string `p:"openid" v:"required#openid不能为空"` + YearAndMonth string `p:"yearAndMonth" dc:"日期(格式:2024-04-01)" v:"date-format:Y-m-d#时间格式为2024-04-01"` +} + +type AppSelectThisUserByCardRecordRes struct { + commonApi.EmptyRes + List []*model.AppSelectThisUserByCardRecordReqRes +} + +type AppReissueACardListReq struct { + g.Meta `path:"/appReissueACardList" tags:"APP" method:"get" summary:"定位考勤>补卡申请列表(分页)"` + commonApi.Author + Openid string `p:"openid" v:"required#openid不能为空"` + YearAndMonth string `p:"yearAndMonth" dc:"日期(格式:2024-04-01)" v:"date-format:Y-m-d#时间格式为2024-04-01"` +} + +type AppReissueACardListRes struct { + g.Meta `mime:"application/json"` + List []*model.AppReissueACardListRes +} + +type AppReissueACardIdReq struct { + g.Meta `path:"/appReissueACardId" tags:"APP" method:"get" summary:"定位考勤>补卡申请ID查询"` + commonApi.Author + Id string `p:"id" v:"required#id不能为空"` +} + +type AppReissueACardIdRes struct { + g.Meta `mime:"application/json"` + *model.AppReissueACardListRes +} + +type AppCardReplacementApplicationAddReq struct { + g.Meta `path:"/appCardReplacementApplicationAdd" tags:"APP" method:"post" summary:"定位考勤>新增补卡申请"` + commonApi.Author + Openid string `p:"openid" dc:"openid" v:"required#施工人员openid不能为空"` + Scope string `p:"scope" dc:"打卡范围(例:2024-01-26 08:18:00,2024-01-26 20:18:00;可以范围时间也可单个时间)" v:"required#打卡范围不能为空"` + Type string `p:"type" dc:"补卡范围(1上班 2下班 3全天)" v:"between:1,3#type取值范围错误"` + Explain string `p:"explain" dc:"补卡说明" v:"max-length:512#最大输入字数为512"` + AttendanceId string `p:"attendanceId" dc:"如果能确认对那条考勤进行补卡,那么就填写对应考勤的主键ID" ` +} + +type AppCardReplacementApplicationAddRes struct { + commonApi.EmptyRes +} + +type AppReplacementCardApplicationRecordReq struct { + g.Meta `path:"/appReplacementCardApplicationRecord" tags:"APP" method:"get" summary:"定位考勤>申请人补卡记录(分页)"` + commonApi.PageReq + commonApi.Author + Openid string `p:"openid" dc:"openid" v:"required#施工人员openid不能为空"` +} +type AppReplacementCardApplicationRecordRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*controllerModel.WxBusReissueACardListRes `json:"list"` +} + +type AppLocationAttendanceStatisticsReq struct { + g.Meta `path:"/appLocationAttendanceStatistics" tags:"APP" method:"get" summary:"定位考勤>统计"` + commonApi.Author + Openid string `p:"openid" dc:"openid" v:"required#openId必须"` + YearAndMonth string `p:"yearAndMonth" dc:"日期(格式:2024-04)" v:"date-format:Y-m#时间格式为2024-04"` +} +type AppLocationAttendanceStatisticsRes struct { + g.Meta `mime:"application/json"` + List []*model.AppLocationAttendanceStatisticsOneRes `json:"list"` +} + +type AppSelectBySiteDateAndTimeReq struct { + g.Meta `path:"/appSelectBySiteDateAndTime" tags:"APP" method:"get" summary:"定位考勤>规则"` + commonApi.Author + ProjectId int64 `p:"projectId" dc:"项目ID" v:"required#openId必须"` +} +type AppSelectBySiteDateAndTimeRes struct { + g.Meta `mime:"application/json"` + PunchRange string `p:"punchRange" dc:"当前项目打卡时间范围"` + Lng string `p:"lng" dc:"经度"` + Lat string `p:"lat" dc:"纬度"` + Site string `p:"site" dc:"详细地址"` +} + +type AppTheTeamLeaderSupplementCardApprovalListReq struct { + g.Meta `path:"/appTheTeamLeaderSupplementCardApprovalList" tags:"APP" method:"get" summary:"定位考勤>班组长补卡审批列表(分页)"` + commonApi.PageReq + commonApi.Author + Openid string `p:"openid" dc:"openid" v:"required#施工人员openid不能为空"` +} +type AppTheTeamLeaderSupplementCardApprovalRecordListReq struct { + g.Meta `path:"/appTheTeamLeaderSupplementCardApprovalRecordList" tags:"APP" method:"get" summary:"定位考勤>班组长补卡审批记录列表(分页)"` + commonApi.PageReq + commonApi.Author + Openid string `p:"openid" dc:"openid" v:"required#施工人员openid不能为空"` + YearAndMonth string `p:"yearAndMonth" dc:"日期(格式:2024-04-01)" v:"date-format:Y-m-d#时间格式为2024-04-01"` +} + +type AppTheTeamLeaderSupplementCardApprovalListRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*controllerModel.AppTheTeamLeaderSupplementCardApprovalList `json:"list"` +} + +type AppApprovalRecordDetailsReq struct { + g.Meta `path:"/appApprovalRecordDetails" tags:"APP" method:"get" summary:"定位考勤>审批记录详情"` + commonApi.Author + Id string `p:"id" dc:"主键ID" v:"required#主键id不能为空"` +} + +type AppApprovalRecordDetailsRes struct { + g.Meta `mime:"application/json"` + *modelController.AppApprovalRecordDetailsRes +} + +type AppForemanApprovalReq struct { + g.Meta `path:"/appForemanApproval" tags:"APP" method:"put" summary:"定位考勤>班组长审批"` + commonApi.Author + Id int64 `p:"id" dc:"主键ID" v:"required#主键id不能为空"` + GangerOpinion string `p:"gangerOpinion" dc:"班组长意见(1未读 2同意 3拒绝)" v:"required#gangerOpinion不能为空"` + GangerExplain string `p:"gangerExplain" dc:"拒绝说明" v:"required-if:gangerOpinion,3#请填写拒绝说明"` +} + +type AppForemanApprovalRes struct { + g.Meta `mime:"application/json"` +} + +type AdministratorApprovalReq struct { + g.Meta `path:"/administratorApproval" tags:"APP" method:"put" summary:"管理员审批"` + commonApi.Author + Id int64 `p:"id" dc:"主键ID" v:"required#主键id不能为空"` + ManagerOpinion string `p:"managerOpinion" dc:"意见(1未读 2同意 3拒绝)" v:"required#gangerOpinion不能为空"` + ManagerExplain string `p:"managerExplain" dc:"拒绝说明" v:"required-if:gangerOpinion,3#请填写拒绝说明"` +} + +type AdministratorApprovalRes struct { + g.Meta `mime:"application/json"` +} + +// ===========================================安全(HSE)巡检管理=========================================== +// ===========================================安全(HSE)巡检管理=========================================== +// ===========================================安全(HSE)巡检管理=========================================== + +type AppManagement struct { + Type string `p:"type" dc:"1填报人 2整改人 3填报人或整改人" v:"between:1,3#取值范围为1~3"` + OpenId string `json:"openId" dc:"操作人" v:"required#openId不能为空"` + ProjectName string `json:"projectName" dc:"项目名称"` + CreatedAt string `json:"createdAt" dc:"录入日期" v:"date-format:Y-m-d#格式为2023-10-12" ` + StudyType string `json:"studyType" dc:"检查/巡检类型;空字符串表示查全部"` + ProjectId int64 `p:"projectId" dc:"项目ID"` +} + +type AppManagementAppletListInformReq struct { + g.Meta `path:"/appManagementAppletListInform" tags:"APP" method:"get" summary:"HSE巡检工单>巡检工单列表-全部(分页)"` + commonApi.Author + commonApi.PageReq + AppManagement +} +type AppManagementAppletListAbarbeitungReq struct { + g.Meta `path:"/appManagementAppletListAbarbeitung" tags:"APP" method:"get" summary:"HSE巡检工单>巡检工单列表-整改(分页)"` + commonApi.Author + commonApi.PageReq + AppManagement +} +type AppManagementAppletListReviewReq struct { + g.Meta `path:"/appManagementAppletListReview" tags:"APP" method:"get" summary:"HSE巡检工单>巡检工单列表-复查(分页)"` + commonApi.Author + commonApi.PageReq + AppManagement +} + +type AppManagementAppletListRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*controllerModel.HseManagementAppletListRes `json:"list"` +} + +type APPAddedDataSecurityForBackgroundUsersReq struct { + g.Meta `path:"/aPPAddedDataSecurityForBackgroundUsers" tags:"APP" method:"post" summary:"SE巡检工单>巡检工单列表-新增(管理员新增)"` + commonApi.Author + ProjectId int64 `p:"projectId" dc:"项目ID"` + StudyType string `p:"studyType" dc:"检查类型"` + TourType string `p:"tourType" dc:"违章类型"` + InspectionResult string `p:"inspectionResult" dc:"巡检结果"` + Corrector string `p:"corrector" dc:"整改人"` + ReplyDate string `p:"replyDate" dc:"回复日期"` + File []*comModel.UpFile `p:"file" dc:"附件"` +} +type APPAddedDataSecurityForBackgroundUsersRes struct { + commonApi.EmptyRes +} + +type APPReviewDataSecurityForBackgroundUsersReq struct { + g.Meta `path:"/aPPReviewDataSecurityForBackgroundUsers" tags:"APP" method:"put" summary:"SE巡检工单>巡检工单列表-新增(管理员复查)"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + ReviewType string `p:"reviewType" dc:"复查状态(1通过 2未通过)" v:"required#主键ID不能为空"` + Review string `p:"review" dc:"复查情况" v:"required#复查情况不能为空"` + //Review string `p:"review" dc:"复查情况" v:"required-if:reviewType,2#状态为未通过,需填写复查"` +} + +type APPReviewDataSecurityForBackgroundUsersRes struct { + commonApi.EmptyRes +} + +// ===========================================质量管理=========================================== +// ===========================================质量管理=========================================== +// ===========================================质量管理=========================================== + +type AppInspectionTicketAppletListInformReq struct { + g.Meta `path:"/appInspectionTicketAppletListInform" tags:"APP" method:"get" summary:"质量管理>质量工单列表-全部(分页)"` + commonApi.Author + commonApi.PageReq + AppManagement +} + +type AppInspectionTicketAppletListAbarbeitungReq struct { + g.Meta `path:"/appInspectionTicketAppletListAbarbeitung" tags:"APP" method:"get" summary:"质量管理>质量工单列表-整改(分页)"` + commonApi.Author + commonApi.PageReq + AppManagement +} + +type AppInspectionTicketAppletListReviewReq struct { + g.Meta `path:"/appInspectionTicketAppletListReview" tags:"APP" method:"get" summary:"质量管理>质量工单列表-复查(分页)"` + commonApi.Author + commonApi.PageReq + AppManagement +} + +type AppInspectionTicketAppletListRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*controllerModel.AppletListRes `json:"list"` +} + +type AppQualityDataIsAddedForBackgroundUsersReq struct { + g.Meta `path:"/appQualityDataIsAddedForBackgroundUsers" tags:"APP" method:"post" summary:"质量管理>质量工单列表-新增(管理员新增)"` + commonApi.Author + ProjectId int64 `p:"projectId" dc:"项目id" v:"required#项目ID不能为空"` + InspectionType string `p:"inspectionType" dc:"巡检类型" v:"required#巡检类型不能为空"` + InspectionHeadline string `p:"inspectionHeadline" dc:"巡检标题" v:"required#巡检标题不能为空"` + InspectionResult string `p:"inspectionResult" dc:"巡检结果" v:"required#巡检结果不能为空"` + IsReply string `p:"isReply" dc:"是否回复(1回复 2不回复)" ` + ReplyDate string `p:"replyDate" dc:"回复日期" ` + Corrector string `p:"corrector" dc:"整改人"` + CreatedBy int64 `p:"createdBy" dc:"填报人"` + File []*comModel.UpFile `p:"file" dc:"附件"` +} +type AppQualityDataIsAddedForBackgroundUsersRes struct { + commonApi.EmptyRes +} + +type AppBackgroundUsersReviewQualityDataReq struct { + g.Meta `path:"/appBackgroundUsersReviewQualityData" tags:"APP" method:"put" summary:"质量管理>质量工单列表-复查(管理员复查)"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + VerificationType string `p:"verificationType" dc:"验证状态(1通过 2未通过)"` + VerificationResult string `p:"verificationResult" dc:"结论"` +} +type AppBackgroundUsersReviewQualityDataRes struct { + commonApi.EmptyRes +} + +// ===========================================AI工单=========================================== +// ===========================================AI工单=========================================== +// ===========================================AI工单=========================================== + +type AppWorkOrderPcListReq struct { + g.Meta `path:"/appWorkOrderPcList" tags:"APP" method:"get" summary:"HSE巡检工单>AI工单>工单列表(根据pc用户主键ID进行分页获取)"` + commonApi.Author + commonApi.PageReq + PcUserId string `p:"pcUserId" dc:"pc端用户" v:"required#pc端用户ID不能为空"` + ProjectId string `p:"projectId" dc:"项目ID" v:"required#projectId不能为空"` + FuzzyQuery string `p:"fuzzyQuery" dc:"标题模糊查询(例:高处作业...)"` +} + +type AppWorkOrderAppListReq struct { + g.Meta `path:"/appWorkOrderAppList" tags:"APP" method:"get" summary:"HSE巡检工单>AI工单>工单列表(根据App的openid进行分页获取)"` + commonApi.Author + commonApi.PageReq + Openid string `p:"openid" dc:"openid" v:"required#openId不能为空"` + ProjectId string `p:"projectId" dc:"项目ID" v:"required#projectId不能为空"` + FuzzyQuery string `p:"fuzzyQuery" dc:"标题模糊查询(例:高处作业...)"` +} + +type AppWorkOrderPcListRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*modelController.AppWorkOrderPcListLogicRes `json:"list"` +} + +type AppWorkOrderParticularsReq struct { + g.Meta `path:"/appWorkOrderParticulars" tags:"APP" method:"get" summary:"HSE巡检工单>AI工单>AI工单详情"` + commonApi.Author + Id int64 `p:"id" dc:"主键ID" v:"required#主键id不能为空"` +} + +type AppWorkOrderParticularsRes struct { + g.Meta `mime:"application/json"` + modelController.AppWorkOrderParticularsLogicRes +} + +type AppGetsAllThePeopleUnderTheCurrentPersonsProjectReq struct { + g.Meta `path:"/appGetsAllThePeopleUnderTheCurrentPersonsProject" tags:"APP" method:"get" summary:"HSE巡检工单>AI工单>获取当前人所在项目下的所有人"` + commonApi.Author + // commonApi.PageReq + Openid string `p:"openid" dc:"处理人" v:"required#openId不能为空"` + Name string `p:"name" dc:"名字(模糊查询)"` +} + +type AppGetsAllThePeopleUnderTheCurrentPersonsProjectRes struct { + g.Meta `mime:"application/json"` + // commonApi.ListRes + List []*AppPersonnelListRes `json:"list"` +} + +type AppAiInformReq struct { + g.Meta `path:"/appAiInform" tags:"APP" method:"put" summary:"HSE巡检工单>AI工单>选择处理人"` + commonApi.Author + Id int64 `p:"id" dc:"主键ID" v:"required#主键id不能为空"` + ProcessingPeriod string `json:"processingPeriod" dc:"要求处理期限(格式:2023-10-12)" v:"required|date-format:Y-m-d#格式为2023-10-12"` + Openid string `p:"openid" dc:"处理人" v:"required#openId不能为空"` + Remark string `p:"remark" dc:"备注" v:"max-length:512#最大输入字数为512"` + AppOpenid string `p:"appOpenid" dc:"小程序或APP操作" ` +} + +type AppAiInformRes struct { + g.Meta `mime:"application/json"` +} + +type AppPersonnelListRes struct { + Openid string `p:"openid" dc:"openid"` + PacePhoto string `p:"pacePhoto" dc:"头像"` + UserName string `p:"userName" dc:"名称"` + Phone string `p:"phone" dc:"电话"` +} + +type AppRectificationReplyReq struct { + g.Meta `path:"/appRectificationReply" tags:"APP" method:"put" summary:"HSE巡检工单>AI工单>整改回复"` + commonApi.Author + Id int64 `p:"id" dc:"主键ID" v:"required#主键id不能为空"` + Measure string `p:"measure" dc:"整改措施" v:"max-length:300#最大输入字数为300"` + // File []*ghttp.UploadFile `p:"file" dc:"附件"` + File []*comModel.UpFile `p:"file" dc:"附件"` +} + +type AppRectificationReplyRes struct { + g.Meta `mime:"application/json"` +} + +type AppReviewReq struct { + g.Meta `path:"/appReview" tags:"APP" method:"put" summary:"HSE-巡检工单>AI工单>复查"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + ReviewType string `p:"reviewType" dc:"复查状态(1通过 2未通过)" v:"required#主键ID不能为空"` + Review string `p:"review" dc:"复查情况" v:"max-length:300#最大输入字数为300"` + Operator string `p:"operator" dc:"操作人"` +} + +type AppReviewRes struct { + commonApi.EmptyRes +} + +// =========================================== 消息 =========================================== +// =========================================== 消息 =========================================== +// =========================================== 消息 =========================================== + +// AppMessageListReq 消息 +type AppMessageListReq struct { + g.Meta `path:"/appMessageList" tags:"APP" method:"get" summary:"消息>消息列表"` + commonApi.Author + ProjectId string `p:"projectId" dc:"项目ID" v:"required#projectId必须"` + OpenID string `p:"openid" dc:"OpenID"` +} + +type MessageListInfo struct { + Text string `p:"text" dc:"消息内容" orm:"title"` // 消息内容 + Unread int `p:"unread" dc:"剩余未读数量" orm:"unread_count"` // 剩余未读数量 + Created string `p:"created" dc:"创建时间" orm:"created_at"` // 创建时间 +} + +// AppMessageListRes 消息响应 +type AppMessageListRes struct { + g.Meta `mime:"application/json"` + // 评论 + Comment MessageListInfo `json:"comment" dc:"评论"` + // 提醒 + Remind MessageListInfo `json:"remind" dc:"提醒"` +} + +// ===========================================人员管理=========================================== +// ===========================================人员管理=========================================== +// ===========================================人员管理=========================================== + +type AppChangeThePunchStatusForTheSpecifiedPersonReq struct { + g.Meta `path:"/appChangeThePunchStatusForTheSpecifiedPerson" tags:"APP" method:"get" summary:"人员管理>变更指定人的打卡状态"` + commonApi.Author + Type string `p:"type" dc:"1开启 2关闭" v:"between:1,2#取值范围为1~2"` + Id int64 `p:"id" dc:"施工人员主键ID" v:"required#主键ID必须"` +} + +type AppChangeThePunchStatusForTheSpecifiedPersonRes struct { + commonApi.EmptyRes +} + +type AppSelectAppointProjectAllTeamReq struct { + g.Meta `path:"/appSelectAppointProjectAllTeam" tags:"APP" method:"get" summary:"人员管理>获取指定项目所有班组"` + commonApi.Author + ProjectId int64 `p:"projectId" dc:"项目ID" v:"required#项目ID不能为空"` +} + +type AppSelectAppointProjectAllTeamRes struct { + g.Meta `mime:"application/json"` + List []*model.SysProjectTeamListRes `json:"list"` +} + +type AppListOfParticipatingUnitsReq struct { + g.Meta `path:"/appListOfParticipatingUnits" tags:"APP" method:"get" summary:"人员管理>参建单位列表"` + commonApi.Author + FuzzyQuery string `p:"fuzzyQuery" dc:"模糊查询"` +} + +type AppListOfParticipatingUnitsRes struct { + g.Meta `mime:"application/json"` + List []*model.BusLabourserviceListRes `json:"list"` +} + +type AppListOfConstructionPersonnelReq struct { + g.Meta `path:"/appListOfConstructionPersonnel" tags:"APP" method:"get" summary:"人员管理>施工人员列表(分页)"` + commonApi.Author + commonApi.PageReq + ProjectId int64 `p:"projectId" dc:"项目ID" v:"required#项目ID不能为空"` + OnGuard string `p:"onGuard" dc:"在岗(1全部 2入场 3退场)" v:"between:1,3#onGuard字段范围值为1~3"` + ClockIn string `p:"clockIn" dc:"是否开启打卡(1全部 2开启 3关闭)" v:"between:1,3#clockIn字段范围值为1~3"` + // ApproachTime string `p:"approachTime" dc:"进场时间(格式:2024-04-01)" v:"date-format:Y-m-d#时间格式为2024-04-01"` + ApproachTime int `p:"approachTime" dc:"进场时间(0全部 1近一周 2近一月 3近3月 4近半年 5近一年)" v:"between:0,5#approachTime字段范围值为0~5"` + TeamID int64 `p:"teamId" dc:"班组ID" v:"teamId@integer#班组ID需为整数"` + TypeOfWork string `p:"typeOfWork" dc:"工种"` + ParticipatingUnit int64 `p:"participatingUnit" dc:"参建单位"` + UserName string `p:"userName" dc:"模糊查询用户名称"` +} + +type AppListOfConstructionPersonnelRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.AppListOfConstructionPersonnelModelRes `json:"list"` +} + +type AppExitReq struct { + g.Meta `path:"/appExit" tags:"APP" method:"post" summary:"人员管理>退场"` + commonApi.Author + Openid string `p:"openId" dc:"施工人员openid" v:"required#施工人员openid必须"` + File []*comModel.UpFile `p:"file" dc:"支持多个图片或PDF"` + Remark string `p:"remark" dc:"备注" v:"max-length:512#最大输入字数为512"` +} + +type AppExitRes struct { + g.Meta `mime:"application/json"` +} + +type AppResubmitTheExitAttachmentReq struct { + g.Meta `path:"/appResubmitTheExitAttachment" tags:"APP" method:"put" summary:"人员管理>补交退场附件"` + commonApi.Author + Openid string `p:"openid" dc:"班组成员主键ID" v:"required#openid必须"` + File []*comModel.UpFile `p:"file" dc:"附件"` + Remark string `p:"remark" dc:"备注" v:"max-length:512#最大输入字数为512"` +} + +type AppResubmitTheExitAttachmentRes struct { + g.Meta `mime:"application/json"` +} + +type AppTeamAttendanceReq struct { + g.Meta `path:"/appTeamAttendance" tags:"APP" method:"get" summary:"人员管理>团队出勤(分页)"` + commonApi.Author + commonApi.PageReq + SelectDate string `p:"selectDate" dc:"日期查询(格式:2023-03-06)" v:"date-format:Y-m-d#时间格式错误!"` + Type int `p:"type" dc:"0全部人员 1出勤 2半勤 3缺勤"` + ProjectId int64 `p:"projectId" dc:"项目ID" v:"required#projectId需为整数" ` + TeamId int64 `p:"teamId" dc:"班组ID"` + TypeOfWork string `p:"typeOfWork" dc:"工种"` +} + +type AppTeamAttendanceRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.AppResubmitTheExitAttachmentModelRes `p:"list"` + Absenteeism int `p:"absenteeism" dc:"缺勤人数(下班未打卡)"` + HalfDuty int `p:"halfDuty" dc:"半勤人数(只打了上班)"` + Attendance int `p:"attendance" dc:"出勤人数(全勤)"` +} + +type AppGetsThePeopleUnderTheSpecifiedProjectReq struct { + g.Meta `path:"/appGetsThePeopleUnderTheSpecifiedProject" tags:"APP" method:"get" summary:"人员管理>获取指定项目下【已实名|已退场】却未加入班组的人员(分页)"` + commonApi.Author + commonApi.PageReq + ProjectId int64 `p:"projectId" dc:"项目ID" v:"required#projectId需为整数" ` + Type int `p:"type" dc:"0已实名 1退场"` + FuzzyQuery string `p:"fuzzyQuery" dc:"模糊查询(姓名、手机号、身份证)"` +} + +type AppGetsThePeopleUnderTheSpecifiedProjectRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.AppListOfConstructionPersonnelModelRes `p:"list"` +} + +type AppJoinATeamReq struct { + g.Meta `path:"/appJoinATeam" tags:"APP" method:"post" summary:"人员管理>将施工人员加入指定项目下的指定班组(以普工身份)"` + commonApi.Author + ProjectId int64 `p:"projectId" dc:"项目ID" v:"required#projectId需为整数" ` + TeamId int64 `p:"teamId" v:"required#班组ID不能为空"` + Openids []string `p:"openids" v:"required#openids不能为空"` +} + +type AppJoinATeamRes struct { + g.Meta `mime:"application/json"` +} + +type AppGetPersonnelDetailsReq struct { + g.Meta `path:"/getPersonnelDetails" tags:"APP" method:"get" summary:"人员管理>获取人员详情"` + commonApi.Author + Openid string `p:"openid" v:"required#openid不能为空"` +} + +type AppGetPersonnelDetailsRes struct { + g.Meta `mime:"application/json"` + model.AppGetPersonnelDetailsModelRes + IsClockIn bool `json:"isClockIn"` + Clock string `json:"clock"` + ImgFileList []*model.BusConstructionUserFileListRes `json:"imgFileList" dc:"用户附件信息"` +} + +// ===========================================提醒=========================================== +// ===========================================提醒=========================================== +// ===========================================提醒=========================================== + +type AIWorkOrderDetailsReq struct { + g.Meta `path:"/aIWorkOrderDetails" tags:"APP" method:"get" summary:"提醒>AI工单详情"` + commonApi.Author + Id string `p:"id" v:"required#id必须" dc:"提醒的id"` +} + +type AIWorkOrderDetailsRes struct { + g.Meta `mime:"application/json"` + modelController.AppWorkOrderParticularsLogicRes +} + +type SecurityManagementDetailsReq struct { + g.Meta `path:"/securityManagementDetails" tags:"APP" method:"get" summary:"提醒>安全管理详情"` + commonApi.Author + Id string `p:"id" v:"required#id必须" dc:"提醒的id"` +} + +type SecurityManagementDetailsRes struct { + g.Meta `mime:"application/json"` + Id int64 `json:"id"` + ProjectName string `json:"projectName" dc:"项目名称"` + StudyTypeName string `json:"studyTypeName" dc:"检查类型"` + TourTypeName string `json:"tourTypeName" dc:"违章类型"` + InspectionResult string `json:"inspectionResult" dc:"巡检结果"` + CheckTime *gtime.Time `json:"checkTime" dc:"检查时间"` + ReplyDate string `json:"replyDate" dc:"要求整改期限"` + TeamName string `json:"teamName" dc:"班组"` + Abarbeitung string `json:"abarbeitung" dc:"整改人"` + RectificationTime *gtime.Time `json:"rectificationTime" dc:"整改时间"` + CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"` + Hidden_danger string `json:"hiddenDanger" dc:"问题隐患"` + Measure string `json:"measure" dc:"整改措施"` + ReviewTime string `json:"reviewTime" dc:"复查时间"` + Review string `json:"review" dc:"复查情况"` + Status string `json:"status" dc:"工单状态(0通知 1整改 2复查)"` + ReviewType string `json:"reviewType" dc:"复查状态(1通过 2未通过)"` + Fill string `json:"fill" dc:"创建人(检查、复查)"` + IsReply string `json:"isReply" dc:"是否回复"` + CheckAttachment []*SecurityManagementDetailsPath `json:"checkAttachment" dc:"检查附件"` + AbarbeitungAttachment []*SecurityManagementDetailsPath `json:"abarbeitungAttachment" dc:"整改附件"` +} + +type QualityControlDetailsReq struct { + g.Meta `path:"/qualityControlDetails" tags:"APP" method:"get" summary:"提醒>质量管理详情"` + commonApi.Author + Id string `p:"id" v:"required#id必须" dc:"提醒的id"` + // OrderId string `p:"orderId" v:"required#orderId必须"` + // Status string `p:"status" v:"required#status必须"` +} + +type QualityControlDetailsRes struct { + g.Meta `mime:"application/json"` + Id int64 `json:"id"` + ProjectName string `json:"projectName" dc:"项目名称"` + DictLabel string `json:"dictLabel" dc:"巡检类型"` + InspectionHeadline string `json:"inspectionHeadline" dc:"巡检主题"` + InspectionResult string `json:"inspectionResult" dc:"巡检结果"` + Abarbeitung string `json:"abarbeitung" dc:"整改人"` + IsReply string `json:"isReply" dc:"是否回复(1回复 2不回复)"` + ReplyDate string `json:"replyDate" dc:"回复时间"` + Fill string `json:"fill" dc:"填报人"` + CreatedAt string `json:"createdAt" dc:"填报时间"` + Feedback string `json:"feedback" dc:"整改反馈"` + VerificationResult string `json:"verificationResult" dc:"验证结果"` + Status string `json:"status" dc:"工单状态(1通知 2整改 3验证)"` + VerificationType string `json:"verificationType" dc:"验证状态(1通过 2未通过)"` + UpdatedAt *gtime.Time `json:"updatedAt" dc:"更新时间"` + RectificationTime *gtime.Time `json:"rectificationTime" dc:"整改时间"` + Inspectionccessories []*SecurityManagementDetailsPath `json:"inspectionccessories" dc:"巡检附件"` + CorrectiveAttachment []*SecurityManagementDetailsPath `json:"correctiveAttachment" dc:"整改附件"` +} + +type SecurityManagementDetailsPath struct { + gmeta.Meta `orm:"table:bus_inspection_ticket_path"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + TicketId int64 `orm:"ticket_id" json:"ticketId"` // 质量工单主键ID(级联删除) + Type string `orm:"type" json:"type"` // 类型(1巡检 2整改) + Name string `orm:"name" json:"name"` // 文件名称 + Path string `orm:"path" json:"path"` // 文件路径 + FileType string `orm:"file_type" json:"fileType"` // 文件类型(后缀) +} + +// ===========================================请假=========================================== +// ===========================================请假=========================================== +// ===========================================请假=========================================== + +type AppAskForLeaveAddReq struct { + g.Meta `path:"/appAskForLeaveAdd" tags:"APP" method:"post" summary:"务工者请假申请"` + commonApi.Author + Openid string `p:"openid" dc:"openid" v:"required#openid不能为空"` + StartTime *gtime.Time `p:"startTime" dc:"开始时间" v:"required#开始时间不能为空"` + EndTime *gtime.Time `p:"endTime" dc:"结束时间" v:"required#开始时间不能为空"` + Argument string `p:"argument" dc:"请假理由" v:"required#请假理由不能为空|max-length:512#请假理由最大输入字数为512"` +} + +type AppBusAskforleaveAddRes struct { + commonApi.EmptyRes +} + +type AppAskForLeaveListPageReq struct { + g.Meta `path:"/appAskForLeaveListPage" tags:"APP" method:"get" summary:"务工者请假列表"` + Openid string `p:"openid" dc:"openid" v:"required#openid不能为空"` + ProjectId string `p:"projectId" dc:"项目ID" v:"projectId@integer#项目ID需为整数"` + TeamId string `p:"teamId" dc:"班组ID" v:"teamId@integer#班组ID需为整数"` + commonApi.PageReq + commonApi.Author +} + +type AppAskForLeaveListPageRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusAskforleaveListAppRes `json:"list"` +} + +type AppAskForLeaveInfoReq struct { + g.Meta `path:"/appAskForLeaveInfo" tags:"APP" method:"get" summary:"获取请假信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +type AppAskForLeaveInfoRes struct { + g.Meta `mime:"application/json"` + *model.BusAskforleaveListAppRes +} + +type AppBzzAskForLeaveUpdateReq struct { + g.Meta `path:"/appBzzAskForLeaveUpdate" tags:"APP" method:"put" summary:"班组长审批"` + commonApi.Author + Id int64 `p:"id" dc:"请假主键ID" v:"required#请假主键ID不能为空"` + GangerOpinion string `p:"gangerOpinion" dc:"班组长意见(1未读 2同意 3拒绝)" v:"required#gangerOpinion不能为空"` + GangerExplain string `p:"gangerExplain" dc:"拒绝说明" v:"required-if:gangerOpinion,3#请填写拒绝说明"` +} +type AppBzzAskForLeaveUpdateRes struct { + commonApi.EmptyRes +} + +// ===========================================其他=========================================== +// ===========================================其他=========================================== +// ===========================================其他=========================================== + +type AppBase64ToImgFuncReq struct { + g.Meta `path:"/appBase64ToImgFunc" tags:"APP" method:"post" summary:"将图片的base64转成png存储到本地,返回相对路径"` + commonApi.Author + Base64Str string `json:"base64Str" v:"required#base64必须"` +} + +type AppBase64ToImgFuncRes struct { + g.Meta `mime:"application/json"` + Path string `json:"path"` +} diff --git a/api/wxApplet/wxApplet/appVersion.go b/api/wxApplet/wxApplet/appVersion.go new file mode 100644 index 0000000..f1354b3 --- /dev/null +++ b/api/wxApplet/wxApplet/appVersion.go @@ -0,0 +1,30 @@ +package wxApplet + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +// GetLatestAppVersionReq 获取最新的App版本号 +type GetLatestAppVersionReq struct { + g.Meta `path:"/getLatestAppVersion" tags:"APP(版本号)" method:"get" summary:"获取最新的App版本号"` + Platform int `json:"platform" d:"0" dc:"平台类型 | 0 Android 1 IOS"` +} + +type GetLatestAppVersionRes struct { + g.Meta `mime:"application/json"` + Info entity.AppVersions `json:"info"` +} + +// GetLatestAppVersionReq 发布一个新的版本 +type ReleaseAppVersionReq struct { + g.Meta `path:"/releaseAppVersion" tags:"APP(版本号)" method:"post" summary:"发布一个新的版本"` + File *ghttp.UploadFile `json:"file" v:"required#文件不能为空" dc:"Apk文件"` + Version string `json:"version" v:"required#版本号不能为空" dc:"版本号"` + Platform int `json:"platform" v:"required#平台不能为空" dc:"平台类型 | 0 Android 1 IOS"` +} + +type ReleaseAppVersionRes struct { + g.Meta `mime:"application/json"` +} diff --git a/api/wxApplet/wxApplet/bus_askforleave.go b/api/wxApplet/wxApplet/bus_askforleave.go new file mode 100644 index 0000000..4e32108 --- /dev/null +++ b/api/wxApplet/wxApplet/bus_askforleave.go @@ -0,0 +1,104 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2025-03-27 14:14:25 +// 生成路径: api/v1/wxApplet/bus_askforleave.go +// 生成人:gfast +// desc:请假相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package wxApplet + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" +) + +// BusAskforleaveSearchReq 分页请求参数 +type BusAskforleaveSearchReq struct { + g.Meta `path:"/list" tags:"请假" method:"get" summary:"请假列表"` + Name string `p:"name" dc:"根据名称模糊查询"` + ProjectId int64 `p:"projectId" dc:"项目id"` + TeamId int64 `p:"teamId" dc:"班组id"` + ManagerOpinion string `p:"managerOpinion" dc:"管理员意见(1未读 2同意 3拒绝)"` + LeaveDateRange []string `p:"leaveDateRange" dc:"请假日期范围"` + commonApi.PageReq + commonApi.Author +} + +// BusAskforleaveSearchRes 列表返回结果 +type BusAskforleaveSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusAskforleaveListRes `json:"list"` +} + +// BusAskforleaveAddReq 添加操作请求参数 +type BusAskforleaveAddReq struct { + g.Meta `path:"/add" tags:"请假" method:"post" summary:"请假添加"` + commonApi.Author + ProjectId int64 `p:"projectId" ` + ProjectName string `p:"projectName" v:"required#项目名称不能为空"` + TeamId int64 `p:"teamId" ` + TeamName string `p:"teamName" v:"required#班组名称不能为空"` + StartTime *gtime.Time `p:"startTime" ` + EndTime *gtime.Time `p:"endTime" ` + Argument string `p:"argument" ` + Ganger string `p:"ganger" ` + GangerOpinion string `p:"gangerOpinion" ` + GangerExplain string `p:"gangerExplain" ` + GangerTime *gtime.Time `p:"gangerTime" ` + Manager string `p:"manager" ` + ManagerOpinion string `p:"managerOpinion" ` + ManagerExplain string `p:"managerExplain" ` + ManagerTime *gtime.Time `p:"managerTime" ` + CreateBy string `p:"createBy" ` + UpdateBy string `p:"updateBy" ` + Remark string `p:"remark" ` +} + +// BusAskforleaveAddRes 添加操作返回结果 +type BusAskforleaveAddRes struct { + commonApi.EmptyRes +} + +// BusAskforleaveEditReq 修改操作请求参数 +type BusAskforleaveEditReq struct { + g.Meta `path:"/edit" tags:"请假" method:"put" summary:"请假修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + ManagerOpinion string `p:"managerOpinion" dc:"管理员意见(1未读 2同意 3拒绝)"` + ManagerExplain string `p:"managerExplain" dc:"拒绝说明" v:"required-if:managerOpinion,3#请填写拒绝说明"` +} + +// BusAskforleaveEditRes 修改操作返回结果 +type BusAskforleaveEditRes struct { + commonApi.EmptyRes +} + +// BusAskforleaveGetReq 获取一条数据请求 +type BusAskforleaveGetReq struct { + g.Meta `path:"/get" tags:"请假" method:"get" summary:"获取请假信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusAskforleaveGetRes 获取一条数据结果 +type BusAskforleaveGetRes struct { + g.Meta `mime:"application/json"` + *model.BusAskforleaveInfoRes +} + +// BusAskforleaveDeleteReq 删除数据请求 +type BusAskforleaveDeleteReq struct { + g.Meta `path:"/delete" tags:"请假" method:"delete" summary:"删除请假"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusAskforleaveDeleteRes 删除数据返回 +type BusAskforleaveDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/wxApplet/wxApplet/bus_attendance.go b/api/wxApplet/wxApplet/bus_attendance.go new file mode 100644 index 0000000..464c094 --- /dev/null +++ b/api/wxApplet/wxApplet/bus_attendance.go @@ -0,0 +1,249 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-07 16:29:52 +// 生成路径: api/wxApplet/wxApplet/bus_attendance.go +// 生成人:gfast +// desc:考勤相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package wxApplet + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" +) + +// PunchingCardRecordProjectReq 打卡记录导出(项目单独使用一个接口) +type PunchingCardRecordProjectReq struct { + g.Meta `path:"/exportProject" tags:"考勤" method:"get" summary:"打卡记录导出"` + ProjectId int64 `p:"projectId"` //项目id 下载当前项目下的所有班组信息 + SelectDate string `p:"selectDate" dc:"Y-m-d" v:"date-format:Y-m-d#时间格式错误!"` //时间 + Type string `p:"type" dc:"根据字段selectDate来选择查询类型:1年 2月" v:"between:1,2#type取值范围错误"` //查询类型 + commonApi.Author +} + +// PunchingCardRecordReq 打卡记录导出 +type PunchingCardRecordReq struct { + g.Meta `path:"/export" tags:"考勤" method:"get" summary:"打卡记录导出"` + ProjectId int64 `p:"projectId"` //项目id 下载当前项目下的所有班组信息 + TeamId []int64 `p:"teamId"` //班组id 下载当前班组下面的所有成员 + OpenId []string `p:"openid"` //根据openid 下载指定的成员 + SelectDate string `p:"selectDate" dc:"Y-m-d" v:"date-format:Y-m-d#时间格式错误!"` //时间 + Type string `p:"type" dc:"根据字段selectDate来选择查询类型:1年 2月" v:"between:1,2#type取值范围错误"` //查询类型 + commonApi.Author +} + +// PunchingCardRecordRes 打卡记录导出 返回数据到controller +type PunchingCardRecordRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*GroupEntity `json:"list"` +} + +// PunchingCardRecordTwoRes 打卡记录导出 返回给前端的结构体 +type PunchingCardRecordTwoRes struct { + //commonApi.EmptyRes + g.Meta `mime:"application/json"` + Path string `p:"path"` +} + +type GroupEntity struct { + Openid string `p:"openid" d:"单个用户才用得着它"` + GroupId int64 `p:"id" d:"班组id"` + GroupName string `p:"groupName" d:"班组名称"` + PunchingCardRecordOne []*PunchingCardRecordOne `p:"punchingCardRecordOne" d:"组下的人"` +} + +// PunchingCardRecordOne 打卡记录---人 +type PunchingCardRecordOne struct { + Name string `p:"name"` //姓名 = 姓名+电话 + PunchCard []*PunchingCardRecordTwo `p:"unchCard"` //打卡数据 + SumHour int `p:"sumHour"` //合计小时 + SumDay int `p:"sumDay"` //合计天数 + Years string `p:"years"` //年? 月? +} + +// PunchingCardRecordTwo 打卡记录---数据 +type PunchingCardRecordTwo struct { + Openid string `json:"openid"` //用户 + Clock string `json:"clock"` //上班打卡+下班打卡时间 + Hour string `json:"hour"` //每天的时长 + UserName string `p:"userName"` //姓名 = 姓名+电话 + Phone string `p:"phone"` //姓名 = 姓名+电话 +} + +// BusAttendanceSearchReq 分页请求参数 +type BusAttendanceSearchReq struct { + g.Meta `path:"/list" tags:"考勤" method:"get" summary:"考勤列表"` + Id string `p:"id"` //序号 + UserName string `p:"userName"` //人员姓名 + PacePhoto string `p:"pacePhoto"` //人脸照 + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` //项目id + CreateBy string `p:"createBy"` //创建者 + UpdateBy string `p:"updateBy"` //更新者 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + ClockOn string `p:"clockOn"` //上午打卡 + //ClockOff string `p:"clockOff"` //下午打卡 + PrintingDate string `p:"printingDate"` //年月日打卡时间 + IsPinch string `p:"isPinch"` //打卡状态 + Openid string `p:"openid"` //微信id + PinchOpenId string `p:"pinchOpenId"` //代打id + ClockRecord string `p:"clockRecord"` //多次打卡时间记录 + PinchUserName string `p:"pinchUserName"` //代打人姓名 + Commuter string `p:"commuter" de:"上下班状态(1上班2下班)"` //上下班状态(1上班2下班) + commonApi.PageReq + commonApi.Author +} + +// BusAttendanceSearchRes 列表返回结果 +type BusAttendanceSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusAttendanceListRes `json:"list"` +} + +// BusAttendanceAddReq 添加操作请求参数 +type BusAttendanceAddReq struct { + g.Meta `path:"/add" tags:"考勤" method:"post" summary:"考勤添加"` + commonApi.Author + PacePhoto string `p:"pacePhoto" v:"required#人脸数据pacePhoto不能为空"` + ProjectId int64 `p:"projectId" ` + Openid string `p:"openid" v:"required#用户标识Openid不能为空"` + PinchOpenId string `p:"pinchOpenId"` + LocationLng float64 `p:"locationLng" dc:"经度"` //经度 + LocationLat float64 `p:"locationLat" dc:"纬度"` //纬度 + //Commuter string `p:"commuter" v:"required#代打人姓名不能为空"` +} + +// BusAttendanceAddRes 添加操作返回结果 +type BusAttendanceAddRes struct { + commonApi.EmptyRes +} + +// BusAttendanceEditReq 修改操作请求参数 +type BusAttendanceEditReq struct { + g.Meta `path:"/edit" tags:"考勤" method:"put" summary:"考勤修改"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键ID不能为空"` + ClockOn string `p:"clockOn" ` +} + +// BusAttendanceEditRes 修改操作返回结果 +type BusAttendanceEditRes struct { + commonApi.EmptyRes +} + +// BusAttendanceGetReq 获取一条数据请求 +type BusAttendanceGetReq struct { + g.Meta `path:"/get" tags:"考勤" method:"get" summary:"获取考勤信息"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusAttendanceGetRes 获取一条数据结果 +type BusAttendanceGetRes struct { + g.Meta `mime:"application/json"` + *model.BusAttendanceInfoRes +} + +// BusAttendanceDeleteReq 删除数据请求 +type BusAttendanceDeleteReq struct { + g.Meta `path:"/delete" tags:"考勤" method:"delete" summary:"删除考勤"` + commonApi.Author + Ids []uint64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusAttendanceDeleteRes 删除数据返回 +type BusAttendanceDeleteRes struct { + commonApi.EmptyRes +} + +// ByOpenIdFuncReq 根据opendi获取当月打卡信息 +type ByOpenIdFuncReq struct { + g.Meta `path:"/byOpenId" tags:"考勤" method:"get" summary:"根据opendi获取当月打卡信息"` + Openid string `p:"openid"` // 序号 + Years string `p:"years" v:"date-format:Y-m#格式为年月"` // 按照时间的月份来取数据 + commonApi.Author +} + +// ByOpenIdFuncRes 列表返回结果 +type ByOpenIdFuncRes struct { + g.Meta `mime:"application/json"` + List []*ByOpenIdFuncOne `json:"list"` +} + +// ByOpenIdFuncOne 列表返回结果 实现数据的一对多 +type ByOpenIdFuncOne struct { + PrintingDate string `json:"printingDate" dc:"打卡日期(当天打卡时间)"` + Type string `json:"type" dc:"1灰 2红 3绿色"` + Clock *ByOpenIdFuncTwo `json:"clock"` +} + +// ByOpenIdFuncTwo 列表返回结果 实现数据的一对多 +type ByOpenIdFuncTwo struct { + ClockOn string `json:"clockOn" dc:"上班打卡时间"` + HeadOn string `json:"headOn" dc:"上班打卡头像"` + ClockOff string `json:"clockOff" dc:"下班打卡时间"` + HeadOff string `json:"headOff" dc:"下班打卡头像"` +} + +// PCListReq 分页请求参数 +type PCListReq struct { + g.Meta `path:"/pCList" tags:"考勤" method:"get" summary:"考勤列表"` + UserName string `p:"userName" dc:"模糊查询人员姓名"` + PrintingDate string `p:"printingDate" dc:"打卡时间" v:"date-format:Y-m-d#格式为2023-10-12"` + ProjectId int64 `p:"projectId" dc:"项目id" v:"projectId@integer#项目id需为整数"` + TeamId int64 `p:"teamId" dc:"班组id" v:"projectId@integer#班组id需为整数"` + Absenteeism string `p:"absenteeism" dc:"1正常 2缺卡"` + //Commuter string `p:"commuter" de:"上下班状态(1上班2下班)"` + //IsPinch string `p:"isPinch" dc:"打卡状态"` + commonApi.PageReq + commonApi.Author +} + +// PCListRes 列表返回结果 +type PCListRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusAttendanceListRes `json:"list"` +} + +// AttendanceByOpenIdGetReq 获取一条数据请求 +type AttendanceByOpenIdGetReq struct { + g.Meta `path:"/attendanceByOpenIdGet" tags:"考勤" method:"get" summary:"根据openid获取用户打卡信息"` + commonApi.Author + Openid string `p:"openid" v:"required#主键必须"` //通过主键获取 +} + +// AttendanceByOpenIdRes 获取一条数据结果 +type AttendanceByOpenIdRes struct { + g.Meta `mime:"application/json"` + Status string `p:"status" dc:"1、上班打卡 2、下班打卡 3、打卡完成"` //通过主键获取 +} + +// SalaryDetailsReq 获取一条数据请求 +type SalaryDetailsReq struct { + g.Meta `path:"/salaryDetails" tags:"考勤" method:"get" summary:"施工人员工资详情"` + commonApi.Author + Openid string `p:"openId" dc:"小程序唯一标识" v:"required#openId必须"` + YearMonth string `p:"yearMonth" dc:"年月(格式:2024-03)" v:"date-format:Y-m#参数格式为:年-月"` +} + +// SalaryDetailsRes 获取一条数据结果 +type SalaryDetailsRes struct { + g.Meta `mime:"application/json"` + OneDays int `p:"oneDays" dc:"正常打卡天数"` + TwoDays int `p:"twoDays" dc:"异常打卡天数"` + PerDiem string `p:"perDiem" dc:"日薪"` + PunchRange string `p:"punchRange" dc:"打卡范围"` + SumDuration string `p:"sumDuration" dc:"工作总时长(当月不会有数据,当前之前的会有)"` + List []CalendarData `p:"list" dc:"日历"` +} + +// CalendarData 日历数据 +type CalendarData struct { + Type string `p:"type" dc:"1无 2异常 3正常 4进行中"` + Days string `p:"days" dc:"时间(年月日:2024-03-08)"` +} diff --git a/api/wxApplet/wxApplet/bus_construction_project.go b/api/wxApplet/wxApplet/bus_construction_project.go new file mode 100644 index 0000000..33471a5 --- /dev/null +++ b/api/wxApplet/wxApplet/bus_construction_project.go @@ -0,0 +1,85 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-09 15:12:58 +// 生成路径: api/wxApplet/wxApplet/bus_construction_project.go +// 生成人:gfast +// desc:施工人员对应项目相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package wxApplet + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" +) + +// BusConstructionProjectSearchReq 分页请求参数 +type BusConstructionProjectSearchReq struct { + g.Meta `path:"/list" tags:"施工人员对应项目" method:"get" summary:"施工人员对应项目列表"` + Id string `p:"id"` //序号 + ConstructionUserId string `p:"constructionUserId" v:"constructionUserId@integer#微信用户id需为整数"` //微信用户id + ProjectId string `p:"projectId" v:"projectId@integer#项目id需为整数"` //项目id + commonApi.PageReq + commonApi.Author +} + +// BusConstructionProjectSearchRes 列表返回结果 +type BusConstructionProjectSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusConstructionProjectListRes `json:"list"` +} + +// BusConstructionProjectAddReq 添加操作请求参数 +type BusConstructionProjectAddReq struct { + g.Meta `path:"/add" tags:"施工人员对应项目" method:"post" summary:"施工人员对应项目添加"` + commonApi.Author + ConstructionUserId int64 `p:"constructionUserId" ` + ProjectId int64 `p:"projectId" ` +} + +// BusConstructionProjectAddRes 添加操作返回结果 +type BusConstructionProjectAddRes struct { + commonApi.EmptyRes +} + +// BusConstructionProjectEditReq 修改操作请求参数 +type BusConstructionProjectEditReq struct { + g.Meta `path:"/edit" tags:"施工人员对应项目" method:"put" summary:"施工人员对应项目修改"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键ID不能为空"` + ConstructionUserId int64 `p:"constructionUserId" ` + ProjectId int64 `p:"projectId" ` +} + +// BusConstructionProjectEditRes 修改操作返回结果 +type BusConstructionProjectEditRes struct { + commonApi.EmptyRes +} + +// BusConstructionProjectGetReq 获取一条数据请求 +type BusConstructionProjectGetReq struct { + g.Meta `path:"/get" tags:"施工人员对应项目" method:"get" summary:"获取施工人员对应项目信息"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusConstructionProjectGetRes 获取一条数据结果 +type BusConstructionProjectGetRes struct { + g.Meta `mime:"application/json"` + *model.BusConstructionProjectInfoRes +} + +// BusConstructionProjectDeleteReq 删除数据请求 +type BusConstructionProjectDeleteReq struct { + g.Meta `path:"/delete" tags:"施工人员对应项目" method:"delete" summary:"删除施工人员对应项目"` + commonApi.Author + Ids []uint64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusConstructionProjectDeleteRes 删除数据返回 +type BusConstructionProjectDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/wxApplet/wxApplet/bus_construction_user.go b/api/wxApplet/wxApplet/bus_construction_user.go new file mode 100644 index 0000000..87c46e8 --- /dev/null +++ b/api/wxApplet/wxApplet/bus_construction_user.go @@ -0,0 +1,1048 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-07 11:17:50 +// 生成路径: api/wxApplet/wxApplet/bus_construction_user.go +// 生成人:gfast +// desc:施工人员相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package wxApplet + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/common/shp" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + controllerModel "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" +) + +type LoginReq struct { + g.Meta `path:"/BusLogin" tags:"施工人员" method:"post" summary:"微信登录"` + Code string `json:"code" v:"required" dc:"小程序用户的临时code"` + NickName string `json:"nick_name" v:"required" dc:"小程序用户的昵称"` + HeadIcon *ghttp.UploadFile `json:"head_icon" v:"required" dc:"小程序用户的头像"` + // HeadIcon string `json:"head_icon" v:"required" dc:"小程序用户的头像的base64"` +} + +type LoginRes struct { + commonApi.EmptyRes + Openid string `json:"openid" dc:"用户的openid"` + Token string `json:"token" dc:"token"` +} + +// ImgUploadReq 上传返回身份证或银行卡信息数据 +type ImgUploadReq struct { + g.Meta `path:"/wxUserImgUpload" tags:"施工人员" method:"post" summary:"身份证或银行卡上传"` + ImgUpload *ghttp.UploadFile `p:"imgUpload" dc:"上传图片,大小不能超过4M"` + StrType string `p:"strType" dc:"1身份证(人头)-2身份证(国徽)-3银行卡-4合同"` + commonApi.Author +} + +// ImgUploadRes 列表返回结果 +type ImgUploadRes struct { + g.Meta `mime:"application/json"` + MapKV *map[string]interface{} `json:"list"` +} + +// BusConstructionUserSearchReq 分页请求参数 +type BusConstructionUserSearchReq struct { + g.Meta `path:"/list" tags:"施工人员" method:"get" summary:"施工人员列表"` + NewUser int `p:"newUser" dc:"参数:0表示查询所有-1表示查新用户"` + NickName string `p:"nickName" dc:"微信名称"` + UserName string `p:"userName" dc:"人员姓名"` + ProjectId string `p:"projectId" dc:"项目id" v:"projectId@integer#项目id需为整数"` + Status string `p:"status" dc:"状态(0在职 1离职)"` + CreatedAt string `p:"createdAt" dc:"创建时间" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` + Phone string `p:"phone" dc:"电话"` + Sex string `p:"sex" dc:"性别"` + TeamId int64 `p:"teamId" dc:"班组ID"` + SfzNation string `p:"sfzNation" dc:"身份证民族"` + NativePlace string `p:"nativePlace" dc:"籍贯"` + TypeOfWork string `p:"typeOfWork" dc:"工种"` + WxOrPc string `p:"wxOrPc" dc:"参数为1表示pc添加 否则为小程序添加"` + Clock string `p:"clock" dc:"打卡(1启用打卡 2禁止打卡)"` + FileStatus string `p:"fileStatus" dc:"1未上传 2上传中 3已上传"` // 文件状态 + LabourserviceId int64 `p:"labourserviceId" dc:"劳务公司ID"` + commonApi.PageReq + commonApi.Author +} + +// BusConstructionUserSearchRes 列表返回结果 +type BusConstructionUserSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusConstructionUserListRes `json:"list"` +} + +// BusConstructionUserAddReq 添加操作请求参数 +type BusConstructionUserAddReq struct { + g.Meta `path:"/add" tags:"施工人员" method:"post" summary:"施工人员添加"` + commonApi.Author + WxOrPc string `p:"wxOrPc" dc:"参数为1表示pc添加 否则为小程序添加"` + Openid string `p:"openid" ` + //NickName string `p:"nickName" v:"required#微信名称不能为空"` + //HeadIcon string `json:"head_icon" ` + TeamId int64 `p:"teamId" ` + PacePhoto string `p:"pacePhoto" ` + UserName string `p:"userName" v:"required#人员姓名不能为空"` + ProjectId int64 `p:"projectId" v:"required#项目id不能为空"` + Status string `p:"status" ` + IsPinch string `p:"isPinch" ` + IfManagement string `p:"ifManagement" ` + CreateBy string `p:"createBy" ` + Phone string `p:"phone" ` + Sex string `p:"sex" ` + SfzNation string `p:"sfzNation" ` + SfzNumber string `p:"sfzNumber" ` + SfzStart string `p:"sfzStart" ` + SfzEnd string `p:"sfzEnd" ` + SfzSite string `p:"sfzSite" ` + NativePlace string `p:"nativePlace" ` + YhkNumber string `p:"yhkNumber" ` + YhkOpeningBank string `p:"yhkOpeningBank" ` + YhkCardholder string `p:"yhkCardholder" ` + wxOrPc string `p:"wxOrPc" ` + PostReq *model.BusConstructionUserPostInfoRes `json:"postReq"` + ProjectListReq []*model.BusConstructionProjectListRes `json:"projectListReq"` + FilesListReq []*model.BusConstructionUserFileListRes `json:"filesListReq"` + ProjectRecord string `p:"projectRecord" ` + // RoleIds []int64 `p:"roleIds" dc:"角色ID" v:"array"` +} + +// BusConstructionUserAddRes 添加操作返回结果 +type BusConstructionUserAddRes struct { + commonApi.EmptyRes + Id int64 `p:"id"` +} + +// BusConstructionUserEditReq 修改操作请求参数 +type BusConstructionUserEditReq struct { + g.Meta `path:"/edit" tags:"施工人员" method:"put" summary:"施工人员修改"` + commonApi.Author + WxOrPc string `p:"wxOrPc" dc:"参数为1表示pc添加 2为小程序添加 3为APP"` + SiteNum string `p:"siteNum" dc:"1入场时间 2离场时间 3或零值不操作"` + Id int64 `p:"id" v:"required#主键ID不能为空微信用户"` + Openid string `p:"openid" v:"required-unless:WxOrPc,1#需要填写小程序的openid"` + NickName string `p:"nickName" ` + HeadIcon string `p:"headIcon" ` + PacePhoto string `p:"pacePhoto" ` + UserName string `p:"userName" v:"required#人员姓名不能为空"` + ProjectId int64 `p:"projectId" ` + Status string `p:"status" v:"required#状态不能为空"` + IsPinch string `p:"isPinch" ` + IfManagement string `p:"ifManagement" ` + CreateBy string `p:"createBy" ` + UpdateBy string `p:"updateBy" ` + Phone string `p:"phone" v:"phone"` + Sex string `p:"sex" ` + SfzNation string `p:"sfzNation" ` + SfzNumber string `p:"sfzNumber" ` + SfzStart string `p:"sfzStart" ` + SfzEnd string `p:"sfzEnd" ` + SfzSite string `p:"sfzSite" ` + NativePlace string `p:"nativePlace" ` + YhkNumber string `p:"yhkNumber" ` + YhkOpeningBank string `p:"yhkOpeningBank" ` + YhkCardholder string `p:"yhkCardholder" ` + SfzBirth string `p:"sfzBirth" ` + LabourserviceId int64 `p:"labourserviceId"` + TypeOfWork string `p:"typeOfWork"` + EntryDate string `p:"entryDate"` + LeaveDate string `p:"leaveDate"` + Clock string `p:"clock"` + PostReq *model.BusConstructionUserPostInfoRes `json:"postReq"` + ProjectListReq []*model.BusConstructionProjectListRes `json:"projectListReq"` + FilesListReq []*model.BusConstructionUserFileListRes `json:"filesListReq"` + ProjectRecord string `p:"projectRecord" ` + DevNum string `p:"devNum" dc:"安全帽标识"` + RoleIds []int64 `p:"roleIds" dc:"角色ID" v:"array"` + + TeamId int64 `p:"teamId" dc:"teamId大于0的时候必须传递postId字段"` + PostId int64 `p:"postId" dc:"teamId大于0的时候必须传递值(10班组长,4普通员工)"` +} + +// BusConstructionUserEditRes 修改操作返回结果 +type BusConstructionUserEditRes struct { + commonApi.EmptyRes +} + +// BusConstructionUserGetReq 获取一条数据请求 +type BusConstructionUserGetReq struct { + g.Meta `path:"/get" tags:"施工人员" method:"get" summary:"施工人员列表_文件上传【详情】---id查询"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` // 通过主键获取 + ImgFileList []*model.BusConstructionUserFileListRes +} + +// BusConstructionUserGetRes 获取一条数据结果 +type BusConstructionUserGetRes struct { + g.Meta `mime:"application/json"` + *model.BusConstructionUserInfoRes + ImgFileList []*model.BusConstructionUserFileListRes `dc:"小程序身份证明"` + ImgFileListTwo []*model.BusConstructionUserFileListRes `dc:"pc端文件合同等文件"` +} + +// BusConstructionUserDeleteReq 删除数据请求 +type BusConstructionUserDeleteReq struct { + g.Meta `path:"/delete" tags:"施工人员" method:"delete" summary:"删除施工人员"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` // 通过主键删除 +} + +// BusConstructionUserDeleteRes 删除数据返回 +type BusConstructionUserDeleteRes struct { + commonApi.EmptyRes +} + +// BusConstructionUserByOpenIdGetReq 获取一条数据请求 +type BusConstructionUserByOpenIdGetReq struct { + g.Meta `path:"/getByOpenId" tags:"施工人员" method:"get" summary:"获取施工人员信息(openid)"` + commonApi.Author + OpenId string `p:"openid" v:"required#openid必须"` +} + +// BusConstructionUserByOpenIdGetRes 获取一条数据结果 +type BusConstructionUserByOpenIdGetRes struct { + g.Meta `mime:"application/json"` + *model.BusConstructionUserInfoRes + ShortName string `json:"shortName" dc:"项目简称"` + ImgFileList []*model.BusConstructionUserFileListRes + ModuleName []string `json:"moduleName" dc:"当前用户所拥有的模块"` +} + +// WeatherReq 施工人员天气 +type WeatherReq struct { + g.Meta `path:"/weather" tags:"施工人员" method:"get" summary:"施工人员天气"` + commonApi.Author + Location string `p:"location" v:"required#location必须"` +} + +// WeatherRes 施工人员天气 +type WeatherRes struct { + g.Meta `mime:"application/json"` + *coryCommon.WeatherRep +} + +// InverseGeocodingReq 逆地理编码 +type InverseGeocodingReq struct { + g.Meta `path:"/inverseGeocoding" tags:"施工人员" method:"get" summary:"逆地理编码"` + commonApi.Author + Location string `p:"location" v:"required#location必须"` +} + +// InverseGeocodingRes 逆地理编码 +type InverseGeocodingRes struct { + g.Meta `mime:"application/json"` + *coryCommon.InverseGeocodingRep +} + +// GroupLeaderReq 分页请求参数 +type GroupLeaderReq struct { + g.Meta `path:"/memberList" tags:"施工人员" method:"get" summary:"班组长成员列表"` + TeamId string `p:"teamId"` // 班组Id + UserName string `p:"userName"` // 人员姓名 + commonApi.PageReq + commonApi.Author +} + +// GroupLeaderRes 列表返回结果 +type GroupLeaderRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusConstructionUserListRes `json:"list"` +} + +// PayFuncReq 薪资修改操作请求参数payEdit +type PayFuncReq struct { + g.Meta `path:"/payEdit" tags:"施工人员" method:"put" summary:"变更薪资"` + commonApi.Author + TypeStr string `p:"typeStr" dc:"1变更薪资 2取消变更"` + Openid string `p:"openid"` + Salary string `p:"salary"` +} + +// PayFuncRes 薪资修改操作返回结果 +type PayFuncRes struct { + commonApi.EmptyRes +} + +// AttendanceReq 出勤-统计情况 pc大屏也在使用此接口 +type AttendanceReq struct { + g.Meta `path:"/attendanceCount" tags:"施工人员" method:"get" summary:"小程序-首页-出勤(统计情况)"` + commonApi.Author + TeamId string `json:"teamId" dc:"班组id" ` + ProjectId string `json:"projectId" dc:"项目id" ` +} + +// AttendanceRes 出勤-统计情况 +type AttendanceRes struct { + g.Meta `mime:"application/json"` + Ratio string `json:"ratio" dc:"出勤率(百分比)"` + Headcount int `json:"headcount" dc:"出勤总人数"` + AskForLeave int `json:"askForLeave" dc:"请假人数"` + ResponseCunt int `json:"responseCunt" dc:"出勤数"` +} + +// AttendanceListReq 出勤-人员列表 +type AttendanceListReq struct { + g.Meta `path:"/attendanceList" tags:"施工人员" method:"get" summary:"小程序-首页-出勤(人员列表)"` + TeamId int64 `p:"teamId" dc:"班组id"` + ProjectId int64 `p:"projectId" dc:"项目id" v:"required#项目ID必须"` + Status int `p:"status" dc:"1出勤 2未出勤" v:"between:1,2#取值范围为1~2"` + UserName string `p:"userName" dc:"模糊搜索" ` + commonApi.Author + commonApi.PageReq +} + +// AttendanceListRes 出勤-人员列表 +type AttendanceListRes struct { + g.Meta `mime:"application/json"` + PersonnelList []*PersonnelList `json:"PersonnelList"` + commonApi.ListRes +} + +type PersonnelList struct { + Openid string `p:"openid" dc:"openid"` + PacePhoto string `p:"pacePhoto" dc:"人脸"` + UserName string `p:"userName" dc:"名称"` + Sex string `p:"sex" dc:"性别"` + Phone string `p:"phone" dc:"手机号"` + DictLabel string `p:"dictLabel" dc:"岗位"` + IsStatus int `p:"isStatus" dc:"1出勤 2未出勤"` +} + +// GridPointFuncReq 格点天气 +type GridPointFuncReq struct { + g.Meta `path:"/gridPoint" tags:"施工人员" method:"get" summary:"格点天气(3~5公里的情况)"` + commonApi.Author + Location string `p:"location" v:"required#location必须"` +} + +// GridPointFuncRes 格点天气 +type GridPointFuncRes struct { + g.Meta `mime:"application/json"` + *coryCommon.GridPointRes +} + +// PersonnelListReq 分页请求参数 +type PersonnelListReq struct { + g.Meta `path:"/personnelList" tags:"施工人员" method:"get" summary:"施工人员列表(只返回id、头像、名称、电话)"` + NewUser int `p:"newUser" dc:"参数:0表示查询所有-1表示查新用户"` // 查询新用户 + UserName string `p:"userName"` // 人员姓名 + commonApi.PageReq + commonApi.Author +} + +// PersonnelListRes 列表返回结果 +type PersonnelListRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusConstructionUserListRes `json:"list"` +} + +// PersonnelInquiryReq 分页请求参数 +type PersonnelInquiryReq struct { + g.Meta `path:"/personnelInquiry" tags:"施工人员" method:"get" summary:"查询在职施工人员(只返回id、名称)"` + ProjectId int64 `p:"projectId" dc:"项目ID" v:"required#项目ID必须"` // 项目ID + UserName string `p:"userName"` // 人员姓名 + commonApi.PageReq + commonApi.Author +} + +// PersonnelInquiryRes 列表返回结果 +type PersonnelInquiryRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusConstructionUserListRes `json:"list"` +} + +// ProjectRecordReq 是否开启小程序的项目备案 +type ProjectRecordReq struct { + g.Meta `path:"/projectRecordApi" tags:"施工人员" method:"put" summary:"是否开启小程序的项目备案"` + commonApi.Author + ProjectRecord string `p:"project_record" dc:"1开启 2关闭" v:"required#开启状态不能为空"` + Openid string `p:"openid" v:"required#openid不能为空"` +} + +// ProjectRecordRes 是否开启小程序的项目备案返回结果 +type ProjectRecordRes struct { + commonApi.EmptyRes +} + +// HumanFaceReq 更换实名认证的人脸照片 +type HumanFaceReq struct { + g.Meta `path:"/humanFace" tags:"施工人员" method:"put" summary:"更换实名认证的人脸照片"` + commonApi.Author + Openid string `p:"openid" v:"required#openid必须"` + FacePhoto string `p:"facePhoto" v:"required#人脸图必须"` +} + +// HumanFaceReqRes 更换实名认证的人脸照片 +type HumanFaceReqRes struct { + g.Meta `mime:"application/json"` + commonApi.EmptyRes +} + +// SubscriptionFuncReq 更改用户逇消息订阅状态 +type SubscriptionFuncReq struct { + g.Meta `path:"/subscription" tags:"施工人员" method:"put" summary:"更改用户逇消息订阅状态"` + commonApi.Author + Openid string `p:"openid" v:"required#小程序openid主键ID必须" dc:"小程序opendi"` + Subscription string `p:"subscription" v:"between:1,2#取值范围为1~2" dc:"消息订阅状态(1订阅 2无订阅)"` +} + +// SubscriptionFuncRes 小程序变更消息订阅状态 +type SubscriptionFuncRes struct { + g.Meta `mime:"application/json"` + commonApi.EmptyRes +} + +// ChangeStateReq 修改用户在职、离职状态 +type ChangeStateReq struct { + g.Meta `path:"/changeState" tags:"施工人员" method:"delete" summary:"变更施工人员在职/离职情况"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` + Status string `p:"status" dc:"0在职 1离职" v:"required#状态必须"` +} + +// ChangeStateRes 修改用户在职、离职状态 +type ChangeStateRes struct { + commonApi.EmptyRes +} + +// ChangePayReq 薪资修改操作请求参数payEdit +type ChangePayReq struct { + g.Meta `path:"/changePay" tags:"施工人员" method:"put" summary:"根据openid改变当前微信用户的项目id"` + commonApi.Author + Openid string `p:"openid" dc:"openid" v:"required#openid必须"` + ProjectId string `p:"projectId" dc:"项目id" v:"required#项目id必须"` +} + +// ChangePayRes 薪资修改操作返回结果 +type ChangePayRes struct { + commonApi.EmptyRes +} + +// PacePhotoReq 人脸检测 +type PacePhotoReq struct { + g.Meta `path:"/pacePhoto" tags:"施工人员" method:"post" summary:"人脸检测(小程序)"` + commonApi.Author + File *ghttp.UploadFile `p:"file" dc:"图片上传"` +} + +// PacePhotoRes 人脸检测 +type PacePhotoRes struct { + commonApi.EmptyRes + Path string `p:"path" dc:"人脸检查通过返回文件相对路径"` +} + +// GetDetailsReq 施工人员列表_详情 +type GetDetailsReq struct { + g.Meta `path:"/getDetails" tags:"施工人员" method:"get" summary:"施工人员列表_详情---id查询"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` // 通过主键获取 +} + +// GetDetailsRes 施工人员列表_详情 +type GetDetailsRes struct { + g.Meta `mime:"application/json"` + *model.BusConstructionUserListRes + WoPdf string `json:"woPdf" dc:"是否有试卷(不为空表示有)"` +} + +// OpenidByFounderReq 获取当前用户当前项目的打卡坐标 +type OpenidByFounderReq struct { + g.Meta `path:"/openidByFounder" tags:"施工人员" method:"get" summary:"获取当前用户当前项目的打卡坐标"` + commonApi.Author + Openid string `p:"openid" dc:"openid" v:"required#openid必须"` +} + +// OpenidByFounderRes 获取当前用户当前项目的打卡坐标 +type OpenidByFounderRes struct { + commonApi.EmptyRes + LongAndLat string `json:"longAndLat" dc:"经度纬度"` + FangzhengEntity []*FangzhengEntity `json:"fangzhengEntity" dc:"方正范围"` + ProjectPunchEntity []*ProjectPunchEntity `json:"projectPunchEntity" dc:"打卡范围"` +} + +type FangzhengEntity struct { + FangzhengName string `json:"fangzhengName" dc:"方正名称"` + Entity []*Position `json:"positions"` +} +type ProjectPunchEntity struct { + PunchName string `json:"punchName" dc:"方正名称"` + Entity []*Position `json:"punchRange"` +} + +// Position 定义一个结构体来表示JSON数据中的位置信息 +type Position struct { + Lng float64 `json:"lng"` + Lat float64 `json:"lat"` + Alt float64 `json:"alt"` +} + +// ActionPathReq 根据openid获取当前人的行动轨迹 +type ActionPathReq struct { + g.Meta `path:"/actionPath" tags:"施工人员" method:"get" summary:"根据openid获取当前人的行动轨迹"` + Openid string `p:"openid" dc:"openid" v:"required#openid必须"` + DateRange []string `p:"dateRange" dc:"日期范围(格式:2023-08-08)"` + commonApi.Author +} + +// ActionPathRes 根据openid获取当前人的行动轨迹 +type ActionPathRes struct { + commonApi.EmptyRes + LatAndLonList []*ActionPathLatAndLonActionPathLatAndLon `json:"latAndLon" dc:"足迹列表"` +} + +type ActionPathLatAndLonActionPathLatAndLon struct { + Latitude float64 `p:"latitude" dc:"纬度" ` + Longitude float64 `p:"longitude" dc:"经度" ` +} + +/* +其他表 专门提供给小程序的接口 +*/ + +// BusViolationRecordSearchReq 分页请求参数 +type BusViolationRecordSearchReq struct { + g.Meta `path:"/wxViolationRecordList" tags:"小程序-违章记录" method:"get" summary:"违章记录列表"` + Openid string `p:"openid" dc:"openid" v:"required#openid必须"` + TourType string `p:"tourType" dc:"违章类型"` + IsDispose string `p:"isDispose" dc:"是否处理(1待处理 2已处理)"` + CreatedAt string `p:"createdAt" dc:"记录参加时间" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` + commonApi.PageReq + commonApi.Author +} + +// BusViolationRecordSearchRes 列表返回结果 +type BusViolationRecordSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*controllerModel.BusViolationRecordListRes `json:"list"` +} + +// BusViolationRecordSearchTwoReq 当前用户新增的风险管控的所有记录 +type BusViolationRecordSearchTwoReq struct { + g.Meta `path:"/wxViolationRecordTwoList" tags:"小程序-违章记录" method:"get" summary:"当前用户新增的风险管控的所有记录"` + Openid string `p:"openid" dc:"openid" v:"required#openid必须"` + TourType string `p:"tourType" dc:"违章类型"` + IsDispose string `p:"isDispose" dc:"是否处理(1待处理 2已处理)"` + CreatedAt string `p:"createdAt" dc:"时间筛选" v:"createdAt@date#创建时间需为YYYY-MM-DD格式"` + commonApi.PageReq + commonApi.Author +} + +// BusViolationRecordSearchTwoRes 当前用户新增的风险管控的所有记录 +type BusViolationRecordSearchTwoRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*controllerModel.BusViolationRecordListRes `json:"list"` +} + +// BusViolationRecordEditReq 违章记录状态修改 +type BusViolationRecordEditReq struct { + g.Meta `path:"/wxViolationRecordEdit" tags:"小程序" method:"put" summary:"违章记录状态修改"` + commonApi.Author + WxOrPc string `p:"wxOrPc" dc:"参数为1表示pc添加 2为小程序添加" v:"required#wxOrPc不能为空"` + Openid string `p:"openid" v:"required-unless:WxOrPc,1#需要填写小程序的openid"` + Id int64 `p:"id" dc:"主键ID" v:"required#主键ID不能为空"` + IsDispose string `p:"isDispose" dc:"是否处理(1待处理 2已处理)"` +} + +// BusViolationRecordEditRes 违章记录状态修改 +type BusViolationRecordEditRes struct { + commonApi.EmptyRes +} + +// AppletComplaintBoxSearchReq 意见箱列表 +type AppletComplaintBoxSearchReq struct { + g.Meta `path:"/complaintBoxSearchList" tags:"小程序" method:"get" summary:"意见箱列表"` + Openid string `p:"openid"` // openid + Status string `p:"status"` // 状态(0未读,1已读) + Dispose string `p:"dispose" v:"dispose@datetime#处理时间需为YYYY-MM-DD hh:mm:ss格式"` // 处理时间 + commonApi.PageReq + commonApi.Author +} + +// AppletComplaintBoxSearchRes 意见箱列表 +type AppletComplaintBoxSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*controllerModel.BusComplaintBoxListRes `json:"list"` +} + +// AppletComplaintBoxAddReq 意见箱添加 +type AppletComplaintBoxAddReq struct { + g.Meta `path:"/complaintBoxAdd" tags:"小程序" method:"post" summary:"意见箱添加"` + commonApi.Author + ProjectId int64 `p:"projectId" ` + Openid string `p:"openid" ` + Opinion string `p:"opinion" v:"max-length:512#最大输入字数为512"` + File []*Files `p:"file" dc:"附件"` + //File []*ghttp.UploadFile `p:"file" dc:"附件"` + // File []*comModel.UpFile `p:"file" dc:"附件"` +} + +type Files struct { + Name string `p:"file" dc:"名称"` + Path string `p:"path" dc:"路径"` +} + +// AppletComplaintBoxAddRes 意见箱添加 +type AppletComplaintBoxAddRes struct { + commonApi.EmptyRes +} + +// WxBusViolationRecordAddReq 风险管控添加(人工) +type WxBusViolationRecordAddReq struct { + g.Meta `path:"/busViolationRecordAdd" tags:"小程序" method:"post" summary:"风险管控添加(人工)"` + commonApi.Author + ByOpenid string `p:"byOpenid" v:"required#需要填写小程序的byOpenid"` + ProjectId string `p:"projectId" dc:"项目id" v:"required#项目id不能为空"` + // DataSource string `p:"dataSource" dc:"数据来源(字典violation_record_data_source)" v:"required#数据来源不能为空"` + TourType string `p:"tourType" dc:"违章类型(字典tour_type)" v:"required#违章类型不能为空"` + LaborDate string `p:"laborDate" dc:"人工日期" v:"required#人工日期不能为空"` + Picture string `p:"picture" dc:"单图上传" ` + Remark string `p:"remark" dc:"备注" v:"max-length:512#最大输入字数为512"` +} + +// WxBusViolationRecordAddRes 风险管控添加(人工) +type WxBusViolationRecordAddRes struct { + commonApi.EmptyRes +} + +// WxBusViolationRecordDetailsReq 违章记录详情 +type WxBusViolationRecordDetailsReq struct { + g.Meta `path:"/wxBusViolationRecordDetails" tags:"小程序" method:"get" summary:"违章记录详情"` + Id string `p:"id" dc:"主键ID" v:"required#主键ID不能为空"` + commonApi.Author +} + +// WxBusViolationRecordDetailsRes 违章记录详情 +type WxBusViolationRecordDetailsRes struct { + g.Meta `mime:"application/json"` + *controllerModel.BusViolationRecordListRes +} + +// QianqiCameraSearchReq 摄像头列表 +type QianqiCameraSearchReq struct { + g.Meta `path:"/cameraList" tags:"小程序" method:"get" summary:"摄像头列表"` + Id string `p:"id"` // + CameraName string `p:"cameraName"` // 摄像头名称 + CameraCode string `p:"cameraCode"` // 摄像头编码 + Detail string `p:"detail"` // 摄像头坐标信息 + ProjectId string `p:"projectId"` // 项目id + Status string `p:"status" v:"status@integer#在线情况(1、在线,0、离线),字典on_line_status需为整数"` // 在线情况(1、在线,0、离线),字典on_line_status + CreateddAt string `p:"createddAt" v:"createddAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` // 创建时间 + SourceType string `p:"sourceType"` // + Serial string `p:"serial"` // 国标id + Code string `p:"code"` + commonApi.Author +} + +// QianqiCameraSearchRes 摄像头列表 +type QianqiCameraSearchRes struct { + g.Meta `mime:"application/json"` + List []*controllerModel.QianqiCameraListRes `json:"list"` +} + +type QianqiCameraEditNameAndDetailReq struct { + g.Meta `path:"/cameraEditNameAndDetail" tags:"小程序" method:"put" summary:"摄像头修改名称和坐标详情数据"` + commonApi.Author + CameraName string `p:"cameraName" v:"required#摄像头名称不能为空"` + CameraCode string `p:"cameraCode" v:"required#摄像头编码不能为空"` + Detail shp.Detail `p:"detail" v:"required#摄像头坐标详情不能为空"` +} +type QianqiCameraEditNameAndDetailRes struct { + commonApi.EmptyRes +} + +type ReissueACardWxAddReq struct { + g.Meta `path:"/reissueACardWxAdd" tags:"小程序" method:"put" summary:"补卡申请"` + commonApi.Author + Openid string `p:"openid" dc:"openid" v:"required#施工人员openid不能为空"` + Scope string `p:"scope" dc:"打卡范围(例:2024-01-26 08:18:00,2024-01-26 20:18:00)" v:"required#打卡范围不能为空"` + Type string `p:"type" dc:"补卡范围(1上班 2下班 3全天)" v:"between:1,3#type取值范围错误"` + Explain string `p:"explain" dc:"补卡说明" v:"max-length:512#最大输入字数为512"` + AttendanceId string `p:"attendanceId" dc:"如果能确认对那条考勤进行补卡,那么就填写对应考勤的主键ID" ` +} +type ReissueACardWxAddRes struct { + commonApi.EmptyRes +} + +type ReissueACardWxGetByIdReq struct { + g.Meta `path:"/reissueACardWxGetById" tags:"小程序" method:"get" summary:"申请补卡人记录查看"` + commonApi.PageReq + commonApi.Author + Openid string `p:"openid" dc:"openid" v:"required#施工人员openid不能为空"` +} +type ReissueACardWxGetByIdRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*controllerModel.WxBusReissueACardListRes `json:"list"` +} + +type ReissueACardWxGetByIdTeamReq struct { + g.Meta `path:"/reissueACardWxGetByIdTeam" tags:"小程序" method:"get" summary:"班组长查看提交的补卡申请列表"` + commonApi.PageReq + commonApi.Author + Openid string `p:"openid" dc:"openid" v:"required#施工人员openid不能为空"` +} +type ReissueACardWxGetByIdTeamRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*controllerModel.WxBusReissueACardListRes `json:"list"` +} + +type ReissueACardWxEditTeamReq struct { + g.Meta `path:"/reissueACardWxEditTeam" tags:"小程序" method:"put" summary:"班组长审批修改提交的补卡申请"` + commonApi.Author + Id int64 `p:"id" dc:"补卡主键ID" v:"required#补卡主键ID不能为空"` + GangerOpinion string `p:"gangerOpinion" dc:"班组长意见(1未读 2同意 3拒绝)" v:"required#gangerOpinion不能为空"` + GangerExplain string `p:"gangerExplain" dc:"拒绝说明" v:"required-if:gangerOpinion,3#请填写拒绝说明"` +} +type ReissueACardWxEditTeamRes struct { + commonApi.EmptyRes +} + +type JobForemanSumnumberReq struct { + g.Meta `path:"/jobForemanSumnumber" tags:"小程序" method:"put" summary:"班组长未读的补卡申请有多少条?"` + commonApi.Author + Openid string `p:"openid" dc:"openid" v:"required#施工人员openid不能为空"` +} +type JobForemanSumnumberRes struct { + commonApi.EmptyRes + Number int `p:"number" dc:"未读的补卡申请数量"` +} + +type BusConstructiomUserSignatureAddReq struct { + g.Meta `path:"/busConstructiomUserSignatureAdd" tags:"小程序" method:"post" summary:"【签名】给指定用户新增签名"` + commonApi.Author + Openid string `p:"openid" dc:"openid" v:"required#施工人员openid不能为空"` + Sign *ghttp.UploadFile `p:"sign" dc:"签名(http图上传)" v:"required#签名不能为空"` +} +type BusConstructiomUserSignatureAddRes struct { + commonApi.EmptyRes +} + +type BusConstructiomUserSignatureQueryReq struct { + g.Meta `path:"/busConstructiomUserSignatureQuery" tags:"小程序" method:"get" summary:"【签名】查询指定用户是否有签名"` + commonApi.Author + Openid string `p:"openid" dc:"openid" v:"required#施工人员openid不能为空"` +} +type BusConstructiomUserSignatureQueryRes struct { + commonApi.EmptyRes + Signature *model.BusConstructiomUserSignatureRes `p:"signature" dc:"签名信息"` +} + +type AttendanceSituationReq struct { + g.Meta `path:"/attendanceSituation" tags:"小程序" method:"put" summary:"出勤情况(列表-分页)"` + Type string `p:"type" dc:"1出勤 2未出勤" v:"between:1,2#范围值为1~2"` + Name string `p:"name" dc:"模糊搜索"` + commonApi.PageReq + commonApi.Author +} +type AttendanceSituationRes struct { + commonApi.ListRes + List []*model.BusConstructionUserListRes `json:"list"` +} + +// =====================================================质量工单 + +type InspectionTicketAppletAddReq struct { + g.Meta `path:"/inspectionTicketAppletAdd" tags:"小程序" method:"post" summary:"质量工单-新增"` + commonApi.Author + ProjectId int64 `p:"projectId" dc:"项目id" v:"required#项目ID不能为空"` + InspectionType string `p:"inspectionType" dc:"巡检类型" v:"required#巡检类型不能为空"` + InspectionHeadline string `p:"inspectionHeadline" dc:"巡检主题(标题)" v:"max-length:64#最大输入字数为64"` + InspectionResult string `p:"inspectionResult" dc:"巡检结果" v:"max-length:300#最大输入字数为300"` + // File []*ghttp.UploadFile `p:"file" dc:"附件"` + File []*comModel.UpFile `p:"file" dc:"附件"` + Corrector string `p:"corrector" dc:"整改人openoid"` + IsReply string `p:"isReply" dc:"是否回复(1回复 2不回复)" v:"between:1,2#取值范围为1~2"` + ReplyDate string `p:"replyDate" dc:"回复时间Y-m-d(isReply为1必填)" v:"required-if:isReply,1|date-format:Y-m-d#创建时间需为Y-m-d格式"` + Openid string `p:"openid" dc:"操作人" v:"required#openId不能为空"` +} + +type InspectionTicketAppletAddRes struct { + commonApi.EmptyRes +} + +type InspectionTicketAppletAbarbeitungReq struct { + g.Meta `path:"/inspectionTicketAppletAbarbeitung" tags:"小程序" method:"post" summary:"质量工单-整改"` + commonApi.Author + Id int64 `p:"id" dc:"主键ID" v:"required#主键ID不能为空"` + Feedback string `p:"feedback" dc:"整改反馈" v:"max-length:300#最大输入字数为300"` + // File []*ghttp.UploadFile `p:"file" dc:"附件"` + File []*comModel.UpFile `p:"file" dc:"附件"` + Openid string `p:"openid" dc:"操作人" v:"required#openId不能为空"` +} + +type InspectionTicketAppletAbarbeitungRes struct { + commonApi.EmptyRes +} + +type InspectionTicketAppletVerifyReq struct { + g.Meta `path:"/inspectionTicketAppletVerify" tags:"小程序" method:"post" summary:"质量工单-验证"` + commonApi.Author + Id int64 `p:"id" dc:"主键ID" v:"required#主键ID不能为空"` + VerificationType string `p:"verificationType" dc:"验证状态(1通过 2未通过)" v:"between:1,2#取值范围为1~2"` + VerificationResult string `p:"verification_result" dc:"验证结果" v:"max-length:300#最大输入字数为300"` + Openid string `p:"openid" dc:"操作人" v:"required#openId不能为空"` +} + +type InspectionTicketAppletVerifyRes struct { + commonApi.EmptyRes +} + +type InspectionTicketAppletListReq struct { + g.Meta `path:"/inspectionTicketAppletList" tags:"小程序" method:"get" summary:"质量工单-分页请求"` + commonApi.Author + commonApi.PageReq + Type string `p:"type" dc:"1填报人 2整改人 3填报人或整改人" v:"between:1,3#取值范围为1~3"` + OpenId string `p:"openId" dc:"操作人" v:"required#openId不能为空"` + ProjectName string `p:"projectName" dc:"项目名称"` + + Status string `p:"status" dc:"工单状态(0或空查全部 1通知 2整改 3复查)" ` + CreatedAt string `p:"createdAt" dc:"录入日期" v:"date-format:Y-m-d#格式为2023-10-12" ` + StudyType string `json:"studyType" dc:"检查/巡检类型;空字符串表示查全部"` + + ProjectId int64 `p:"projectId" dc:"项目ID"` +} + +type InspectionTicketAppletListRes struct { + commonApi.ListRes + List []*controllerModel.AppletListRes `json:"list"` +} + +type AcquisitionOfCorrectivePersonnelReq struct { + g.Meta `path:"/acquisitionOfCorrectivePersonnel" tags:"小程序" method:"get" summary:"质量工单-获取整改人(整改人为当前项目的所有班组长)"` + commonApi.Author + UserName string `p:"userName" dc:"整改人名称"` + ProjectId int64 `p:"projectId" dc:"项目id" v:"required#项目ID不能为空"` +} + +type AcquisitionOfCorrectivePersonnelRes struct { + List []*controllerModel.AcquisitionOfCorrectivePersonnelEntityRes `json:"list"` +} + +type InspectionTicketAppletDetailsReq struct { + g.Meta `path:"/inspectionTicketAppletDetails" tags:"小程序" method:"get" summary:"质量工单-详情"` + commonApi.Author + Id int64 `p:"id" dc:"主键ID" v:"required#主键ID不能为空"` +} + +type InspectionTicketAppletDetailsRes struct { + *controllerModel.AppletDetailsRes +} + +// =====================================================施工日志 + +type ConstructionLogAddReq struct { + g.Meta `path:"/constructionLogAdd" tags:"小程序" method:"post" summary:"施工日志-新增"` + commonApi.Author + ProjectId string `p:"projectId" dc:"项目ID" v:"projectId@integer#项目ID需为整数"` + DateOfOccurrence string `p:"dateOfOccurrence" dc:"发生日期" v:"date-format:Y-m-d#创建时间需为Y-m-d格式"` + Condition string `p:"condition" dc:"生产情况" v:"max-length:300#最大输入字数为300"` + TechnologyQuality string `p:"technologyQuality" dc:"技术质量安全工作" v:"max-length:300#最大输入字数为300"` + Remark string `p:"remark" dc:"备注" v:"max-length:300#最大输入字数为300" ` + // File []*ghttp.UploadFile `p:"file" dc:"附件"` + File []*comModel.UpFile `p:"file" dc:"附件"` + OpenId string `p:"openid" dc:""` + BinarySystem []string `p:"binarySystem" dc:"二进制数据流(多个)"` +} + +type ConstructionLogAddRes struct { + commonApi.EmptyRes +} + +type ConstructionLogDetailsReq struct { + g.Meta `path:"/constructionLogDetails" tags:"小程序" method:"get" summary:"施工日志-详情"` + commonApi.Author + Id int64 `p:"id" dc:"主键ID" v:"required#主键ID不能为空"` +} + +type ConstructionLogDetailsRes struct { + g.Meta `mime:"application/json"` + commonApi.EmptyRes + controllerModel.AppletDetails +} + +type ConstructionLogListReq struct { + g.Meta `path:"/constructionLogList" tags:"小程序" method:"get" summary:"施工日志-列表"` + commonApi.Author + commonApi.PageReq + ProjectName string `p:"project_name" dc:"项目名称" ` + ProjectId string `p:"project_id" dc:"项目id" ` + OpenId string `p:"openId" dc:"openid" v:"required#openid不能为空"` + CreatedAt string `json:"createdAt" dc:"录入日期" v:"date-format:Y-m-d#格式为2023-10-12" ` +} + +type ConstructionLogListRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*controllerModel.AppletList `json:"list"` +} + +// =====================================================HSE巡检工单 + +type HseManagementAppletAddReq struct { + g.Meta `path:"/hseManagementAppletAdd" tags:"小程序" method:"post" summary:"hse安全管理-新增"` + commonApi.Author + ProjectId int64 `p:"projectId" dc:"项目id" v:"required#项目ID不能为空"` + StudyType string `p:"studyType" dc:"检查类型" v:"required#检查类型不能为空"` + TourType string `p:"tourType" dc:"违章类型" ` + InspectionResult string `p:"inspectionResult" dc:"巡检结果" v:"max-length:300#最大输入字数为300"` + // TeamName string `p:"teamName" dc:"名称(班组/部门)" v:"max-length:64#最大输入字数为64"` + Corrector string `p:"corrector" dc:"整改人(班组长)"` + IsReply string `p:"isReply" dc:"是否回复(1回复 2不回复)" v:"between:1,2#取值范围为1~2"` + ReplyDate string `p:"replyDate" dc:"回复时间Y-m-d(isReply为1必填)" v:"required-if:isReply,1|date-format:Y-m-d#创建时间需为Y-m-d格式"` + Openid string `p:"openid" dc:"操作人" v:"required#openId不能为空"` + // File []*ghttp.UploadFile `p:"file" dc:"附件"` + File []*comModel.UpFile `p:"file" dc:"附件"` +} + +type HseManagementAppletAddRes struct { + commonApi.EmptyRes +} + +type HseManagementAppletAbarbeitungReq struct { + g.Meta `path:"/hseManagementAppletAbarbeitung" tags:"小程序" method:"post" summary:"hse安全管理-整改"` + commonApi.Author + Id int64 `p:"id" dc:"主键ID" v:"required#主键ID不能为空"` + HiddenDanger string `p:"hiddenDanger" dc:"问题隐患" v:"max-length:300#最大输入字数为300"` + Measure string `p:"measure" dc:"整改措施" v:"max-length:300#最大输入字数为300"` + File []*comModel.UpFile `p:"file" dc:"附件"` + Openid string `p:"openid" dc:"操作人" v:"required#openId不能为空"` +} + +type HseManagementAppletAbarbeitungRes struct { + commonApi.EmptyRes +} + +type HseManagementAppletVerifyReq struct { + g.Meta `path:"/hseManagementAppletVerify" tags:"小程序" method:"post" summary:"hse安全管理-验证"` + commonApi.Author + Id int64 `p:"id" dc:"主键ID" v:"required#主键ID不能为空"` + ReviewType string `p:"review_type" dc:"验证状态(1通过 2未通过)" v:"between:1,2#取值范围为1~2"` + Review string `p:"review" dc:"验证结果" v:"max-length:300#最大输入字数为300"` + Openid string `p:"openid" dc:"操作人" v:"required#openId不能为空"` +} + +type HseManagementAppletVerifyRes struct { + commonApi.EmptyRes +} + +type HseManagementAppletListReq struct { + g.Meta `path:"/hseManagementAppletList" tags:"小程序" method:"get" summary:"hse安全管理-分页请求"` + commonApi.Author + commonApi.PageReq + Type string `p:"type" dc:"1填报人 2整改人 3填报人或整改人" v:"between:1,3#取值范围为1~3"` + OpenId string `p:"openId" dc:"操作人" v:"required#openId不能为空"` + ProjectName string `p:"projectName" dc:"项目名称"` + + Status string `p:"status" dc:"工单状态(0或空查全部 1通知 2整改 3复查)" ` + CreatedAt string `p:"createdAt" dc:"录入日期" v:"date-format:Y-m-d#格式为2023-10-12" ` + StudyType string `p:"studyType" dc:"检查/巡检类型;空字符串表示查全部"` + + Flag bool `json:"flag" dc:"是否只查询今日(布尔值)"` + + ProjectId int64 `p:"projectId" dc:"项目ID"` +} + +type HseManagementAppletListRes struct { + commonApi.ListRes + List []*controllerModel.HseManagementAppletListRes `json:"list"` +} + +type HseManagementAppletDetailsReq struct { + g.Meta `path:"/hseManagementAppletDetails" tags:"小程序" method:"get" summary:"hse安全管理-详情"` + commonApi.Author + Id int64 `p:"id" dc:"主键ID" v:"required#主键ID不能为空"` +} + +type HseManagementAppletDetailsRes struct { + g.Meta `mime:"application/json"` + *controllerModel.BusHseManagementDetailsRes +} + +// =====================================================HSE安全日志 + +type HseSecurityLogAppletAddReq struct { + g.Meta `path:"/hseSecurityLogAppletAdd" tags:"小程序" method:"post" summary:"hse安全日志-新增"` + commonApi.Author + ProjectId int64 `p:"projectId" dc:"项目id" v:"required#项目ID不能为空"` + DateOfOccurrence string `p:"dateOfOccurrence" dc:"发生日期" v:"date-format:Y-m-d#时间格式错误!"` + AirTemperatureMax float64 `p:"airTemperatureMax" dc:"最高气温" v:"max-length:300#最大输入字数为300"` + AirTemperatureMin float64 `p:"airTemperatureMin" dc:"最低气温" v:"max-length:300#最大输入字数为300"` + Climate string `p:"climate" dc:"气候" v:"max-length:300#最大输入字数为300"` + Progress string `p:"progress" dc:"进展情况" v:"max-length:300#最大输入字数为300"` + JobContent string `p:"jobContent" dc:"作业内容" v:"max-length:300#最大输入字数为300"` + DiscloseTheFacts string `p:"discloseTheFacts" dc:"交底情况" v:"max-length:300#最大输入字数为300"` + ProgressOfActivity string `p:"progressOfActivity" dc:"活动情况" v:"max-length:300#最大输入字数为300"` + Examine string `p:"examine" dc:"检查情况" v:"max-length:300#最大输入字数为300"` + Implementation string `p:"implementation" dc:"实施情况" v:"max-length:300#最大输入字数为300"` + SafetyInspectionSituation string `p:"safetyInspectionSituation" dc:"安全检查情况" v:"max-length:300#最大输入字数为300"` + StoppageOrOvertime string `p:"stoppageOrOvertime" dc:"停工或加班情况" v:"max-length:300#最大输入字数为300"` + OtherRecords string `p:"otherRecords" dc:"其他情况" v:"max-length:300#最大输入字数为300"` + Openid string `p:"openid" dc:"记录人" v:"required#openid不能为空"` + + File []*comModel.UpFile `p:"file" dc:"附件"` + Remark string `p:"remark" dc:"备注"` +} + +type HseSecurityLogAppletAddRes struct { + commonApi.EmptyRes +} + +type HseSecurityLogAppletListReq struct { + g.Meta `path:"/hseSecurityLogAppletList" tags:"小程序" method:"get" summary:"hse安全日志-分页请求"` + commonApi.Author + commonApi.PageReq + OpenId string `p:"openId" dc:"操作人" v:"required#openId不能为空"` + ProjectName string `p:"project_name" dc:"项目名称" ` + CreatedAt string `p:"createdAt" dc:"录入日期" v:"date-format:Y-m-d#格式为2023-10-12" ` +} + +type HseSecurityLogAppletListRes struct { + commonApi.ListRes + List []*controllerModel.BusHseSecurityLogInfoTwoRes `json:"list"` +} + +type HseSecurityLogAppletDetailsReq struct { + g.Meta `path:"/hseSecurityLogAppletDetails" tags:"小程序" method:"get" summary:"hse安全日志-详情"` + commonApi.Author + Id string `p:"id" dc:"主键ID" v:"required#主键ID不能为空"` +} + +type HseSecurityLogAppletDetailsRes struct { + commonApi.ListRes + *controllerModel.BusHseSecurityLogInfoTwoRes +} + +// IsBindAppReq 是否绑定 App +type IsBindAppReq struct { + g.Meta `path:"/isBindApp" tags:"小程序" method:"get" summary:"是否绑定App"` + Openid string `p:"openid" dc:"当前用户的 openid" v:"required#openid不能为空"` +} + +type IsBindAppRes struct { + IsBind int `json:"isBind" dc:"是否绑定 0 未绑定 | 1 已绑定"` +} + +// AppletBindAppReq 小程序绑定 App +type AppletBindAppReq struct { + g.Meta `path:"/appletBindApp" tags:"小程序" method:"post" summary:"小程序绑定 App"` + Openid string `p:"openid" dc:"当前用户的 openid" v:"required#openid不能为空"` + // 登录密码 + Password string `p:"password" dc:"登录密码" v:"required#登录密码不能为空"` +} + +type AppletBindAppRes struct { + commonApi.EmptyRes +} diff --git a/api/wxApplet/wxApplet/bus_construction_user_file.go b/api/wxApplet/wxApplet/bus_construction_user_file.go new file mode 100644 index 0000000..0a65a19 --- /dev/null +++ b/api/wxApplet/wxApplet/bus_construction_user_file.go @@ -0,0 +1,91 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-09 15:13:08 +// 生成路径: api/wxApplet/wxApplet/bus_construction_user_file.go +// 生成人:gfast +// desc:微信用户的文件存储相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package wxApplet + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" +) + +// BusConstructionUserFileSearchReq 分页请求参数 +type BusConstructionUserFileSearchReq struct { + g.Meta `path:"/list" tags:"微信用户的文件存储" method:"get" summary:"微信用户的文件存储列表"` + Id string `p:"id"` //主键ID + UserId string `p:"userId" v:"userId@integer#用户id需为整数"` //用户id + UserImgType string `p:"userImgType"` //图片类型 + Path string `p:"path"` //图片路径 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusConstructionUserFileSearchRes 列表返回结果 +type BusConstructionUserFileSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusConstructionUserFileListRes `json:"list"` +} + +// BusConstructionUserFileAddReq 添加操作请求参数 +type BusConstructionUserFileAddReq struct { + g.Meta `path:"/add" tags:"微信用户的文件存储" method:"post" summary:"微信用户的文件存储添加"` + commonApi.Author + UserId int64 `p:"userId" v:"required#用户id不能为空"` + UserImgType string `p:"userImgType" ` + Name string `p:"name" ` + Path string `p:"path" ` +} + +// BusConstructionUserFileAddRes 添加操作返回结果 +type BusConstructionUserFileAddRes struct { + commonApi.EmptyRes +} + +// BusConstructionUserFileEditReq 修改操作请求参数 +type BusConstructionUserFileEditReq struct { + g.Meta `path:"/edit" tags:"微信用户的文件存储" method:"put" summary:"微信用户的文件存储修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + UserId int64 `p:"userId" v:"required#用户id不能为空"` + UserImgType string `p:"userImgType" ` + Name string `p:"name" ` + Path string `p:"path" ` +} + +// BusConstructionUserFileEditRes 修改操作返回结果 +type BusConstructionUserFileEditRes struct { + commonApi.EmptyRes +} + +// BusConstructionUserFileGetReq 获取一条数据请求 +type BusConstructionUserFileGetReq struct { + g.Meta `path:"/get" tags:"微信用户的文件存储" method:"get" summary:"获取微信用户的文件存储信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusConstructionUserFileGetRes 获取一条数据结果 +type BusConstructionUserFileGetRes struct { + g.Meta `mime:"application/json"` + *model.BusConstructionUserFileInfoRes +} + +// BusConstructionUserFileDeleteReq 删除数据请求 +type BusConstructionUserFileDeleteReq struct { + g.Meta `path:"/delete" tags:"微信用户的文件存储" method:"delete" summary:"删除微信用户的文件存储"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusConstructionUserFileDeleteRes 删除数据返回 +type BusConstructionUserFileDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/wxApplet/wxApplet/bus_construction_user_post.go b/api/wxApplet/wxApplet/bus_construction_user_post.go new file mode 100644 index 0000000..c4ec6b7 --- /dev/null +++ b/api/wxApplet/wxApplet/bus_construction_user_post.go @@ -0,0 +1,85 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-09 15:13:08 +// 生成路径: api/wxApplet/wxApplet/bus_construction_user_post.go +// 生成人:gfast +// desc:施工人员岗位相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package wxApplet + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" +) + +// BusConstructionUserPostSearchReq 分页请求参数 +type BusConstructionUserPostSearchReq struct { + g.Meta `path:"/list" tags:"施工人员岗位" method:"get" summary:"施工人员岗位列表"` + Id string `p:"id"` //序号 + ConstructionUserId string `p:"constructionUserId" v:"constructionUserId@integer#施工人员id需为整数"` //施工人员id + PostId string `p:"postId" v:"postId@integer#岗位id需为整数"` //岗位id + commonApi.PageReq + commonApi.Author +} + +// BusConstructionUserPostSearchRes 列表返回结果 +type BusConstructionUserPostSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusConstructionUserPostListRes `json:"list"` +} + +// BusConstructionUserPostAddReq 添加操作请求参数 +type BusConstructionUserPostAddReq struct { + g.Meta `path:"/add" tags:"施工人员岗位" method:"post" summary:"施工人员岗位添加"` + commonApi.Author + ConstructionUserId int64 `p:"constructionUserId" ` + PostId int64 `p:"postId" ` +} + +// BusConstructionUserPostAddRes 添加操作返回结果 +type BusConstructionUserPostAddRes struct { + commonApi.EmptyRes +} + +// BusConstructionUserPostEditReq 修改操作请求参数 +type BusConstructionUserPostEditReq struct { + g.Meta `path:"/edit" tags:"施工人员岗位" method:"put" summary:"施工人员岗位修改"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键ID不能为空"` + ConstructionUserId int64 `p:"constructionUserId" ` + PostId int64 `p:"postId" ` +} + +// BusConstructionUserPostEditRes 修改操作返回结果 +type BusConstructionUserPostEditRes struct { + commonApi.EmptyRes +} + +// BusConstructionUserPostGetReq 获取一条数据请求 +type BusConstructionUserPostGetReq struct { + g.Meta `path:"/get" tags:"施工人员岗位" method:"get" summary:"获取施工人员岗位信息"` + commonApi.Author + Id uint64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusConstructionUserPostGetRes 获取一条数据结果 +type BusConstructionUserPostGetRes struct { + g.Meta `mime:"application/json"` + *model.BusConstructionUserPostInfoRes +} + +// BusConstructionUserPostDeleteReq 删除数据请求 +type BusConstructionUserPostDeleteReq struct { + g.Meta `path:"/delete" tags:"施工人员岗位" method:"delete" summary:"删除施工人员岗位"` + commonApi.Author + Ids []uint64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusConstructionUserPostDeleteRes 删除数据返回 +type BusConstructionUserPostDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/wxApplet/wxApplet/bus_labourservice.go b/api/wxApplet/wxApplet/bus_labourservice.go new file mode 100644 index 0000000..c5ccea4 --- /dev/null +++ b/api/wxApplet/wxApplet/bus_labourservice.go @@ -0,0 +1,127 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-14 11:24:31 +// 生成路径: api/wxApplet/wxApplet/bus_labourservice.go +// 生成人:gfast +// desc:劳务公司相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package wxApplet + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" +) + +// BusLabourserviceSearchReq 分页请求参数 +type BusLabourserviceSearchReq struct { + g.Meta `path:"/list" tags:"劳务公司" method:"get" summary:"劳务公司列表"` + Name string `p:"name"` //劳务公司 + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// BusLabourserviceSearchRes 列表返回结果 +type BusLabourserviceSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.BusLabourserviceListRes `json:"list"` +} + +// BusLabourserviceAddReq 添加操作请求参数 +type BusLabourserviceAddReq struct { + g.Meta `path:"/add" tags:"劳务公司" method:"post" summary:"劳务公司添加"` + commonApi.Author + Name string `p:"name" v:"required#劳务公司不能为空"` + Principal string `p:"principal" dc:"负责人"` + Phone string `p:"phone" dc:"负责人电话"` + Custodian string `p:"custodian" dc:"管理人"` + CustodianPhone string `p:"custodianPhone" dc:"管理人电话"` + Remark string `p:"remark" dc:"备注"` +} + +// BusLabourserviceAddRes 添加操作返回结果 +type BusLabourserviceAddRes struct { + commonApi.EmptyRes +} + +// BusLabourserviceEditReq 修改操作请求参数 +type BusLabourserviceEditReq struct { + g.Meta `path:"/edit" tags:"劳务公司" method:"put" summary:"劳务公司修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + Name string `p:"name" v:"required#劳务公司不能为空"` + Principal string `p:"principal" dc:"负责人"` + Phone string `p:"phone" dc:"负责人电话"` + Custodian string `p:"custodian" dc:"管理人"` + CustodianPhone string `p:"custodianPhone" dc:"管理人电话"` + Remark string `p:"remark" dc:"备注"` +} + +// BusLabourserviceEditRes 修改操作返回结果 +type BusLabourserviceEditRes struct { + commonApi.EmptyRes +} + +// BusLabourserviceGetReq 获取一条数据请求 +type BusLabourserviceGetReq struct { + g.Meta `path:"/get" tags:"劳务公司" method:"get" summary:"获取劳务公司信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// BusLabourserviceGetRes 获取一条数据结果 +type BusLabourserviceGetRes struct { + g.Meta `mime:"application/json"` + *model.BusLabourserviceInfoRes +} + +// BusLabourserviceDeleteReq 删除数据请求 +type BusLabourserviceDeleteReq struct { + g.Meta `path:"/delete" tags:"劳务公司" method:"delete" summary:"删除劳务公司"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// BusLabourserviceDeleteRes 删除数据返回 +type BusLabourserviceDeleteRes struct { + commonApi.EmptyRes +} + +//=================== + +type BusPcAddReq struct { + g.Meta `path:"/pcAdd" tags:"劳务公司" method:"post" summary:"劳务公司资料添加"` + commonApi.Author + Pid int64 `json:"pid" dc:"劳务公司主键ID" v:"required#劳务公司主键ID不能为空"` + Type string `json:"type" dc:"资料类型" v:"required#资料类型不能为空"` + Name string `json:"name" dc:"文件名称" v:"required#文件名称不能为空"` + Path string `json:"path" dc:"路径" v:"required#路径不能为空"` +} + +type BusPcAddRes struct { + commonApi.EmptyRes +} + +type BusPcDelReq struct { + g.Meta `path:"/pcDel" tags:"劳务公司" method:"delete" summary:"劳务公司资料删除"` + commonApi.Author + Id int64 `p:"id" dc:"资料主键ID" v:"required#资料主键ID不能为空"` +} + +type BusPcDelRes struct { + commonApi.EmptyRes +} + +type BusPcFindReq struct { + g.Meta `path:"/pcFind" tags:"劳务公司" method:"get" summary:"劳务公司资料查询"` + Pid int64 `p:"pid" dc:"劳务公司主键ID"` + commonApi.Author +} +type BusPcFindRes struct { + g.Meta `mime:"application/json"` + List []*model.BusLabourserviceFileRes `json:"list" dc:"资料列表"` +} diff --git a/api/wxApplet/wxApplet/project_news.go b/api/wxApplet/wxApplet/project_news.go new file mode 100644 index 0000000..eaaa928 --- /dev/null +++ b/api/wxApplet/wxApplet/project_news.go @@ -0,0 +1 @@ +package wxApplet diff --git a/api/wxApplet/wxApplet/sys_project_team.go b/api/wxApplet/wxApplet/sys_project_team.go new file mode 100644 index 0000000..d5be3c6 --- /dev/null +++ b/api/wxApplet/wxApplet/sys_project_team.go @@ -0,0 +1,87 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-15 09:34:52 +// 生成路径: api/wxApplet/wxApplet/sys_project_team.go +// 生成人:gfast +// desc:项目班组相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package wxApplet + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" +) + +// SysProjectTeamSearchReq 分页请求参数 +type SysProjectTeamSearchReq struct { + g.Meta `path:"/list" tags:"项目班组" method:"get" summary:"项目班组列表"` + ProjectId string `p:"projectId"` //项目id + Name string `p:"name"` //班组名称 + CreateTime string `p:"createTime" v:"createTime@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// SysProjectTeamSearchRes 列表返回结果 +type SysProjectTeamSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.SysProjectTeamListRes `json:"list"` +} + +// SysProjectTeamAddReq 添加操作请求参数 +type SysProjectTeamAddReq struct { + g.Meta `path:"/add" tags:"项目班组" method:"post" summary:"项目班组添加"` + commonApi.Author + ProjectId string `p:"projectId" ` + Name string `p:"name" v:"required#班组名称不能为空"` + IsClockIn string `p:"isClockIn" dc:"范围内打卡(1范围内打卡 2任何地点打卡)默认为1" v:"required#班组名称不能为空"` +} + +// SysProjectTeamAddRes 添加操作返回结果 +type SysProjectTeamAddRes struct { + commonApi.EmptyRes +} + +// SysProjectTeamEditReq 修改操作请求参数 +type SysProjectTeamEditReq struct { + g.Meta `path:"/edit" tags:"项目班组" method:"put" summary:"项目班组修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + ProjectId string `p:"projectId" ` + Name string `p:"name" v:"required#班组名称不能为空"` + IsClockIn string `p:"isClockIn" dc:"范围内打卡(1范围内打卡 2任何地点打卡)默认为1" v:"required#班组名称不能为空"` +} + +// SysProjectTeamEditRes 修改操作返回结果 +type SysProjectTeamEditRes struct { + commonApi.EmptyRes +} + +// SysProjectTeamGetReq 获取一条数据请求 +type SysProjectTeamGetReq struct { + g.Meta `path:"/get" tags:"项目班组" method:"get" summary:"获取项目班组信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// SysProjectTeamGetRes 获取一条数据结果 +type SysProjectTeamGetRes struct { + g.Meta `mime:"application/json"` + *model.SysProjectTeamInfoRes +} + +// SysProjectTeamDeleteReq 删除数据请求 +type SysProjectTeamDeleteReq struct { + g.Meta `path:"/delete" tags:"项目班组" method:"delete" summary:"删除项目班组"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// SysProjectTeamDeleteRes 删除数据返回 +type SysProjectTeamDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/wxApplet/wxApplet/sys_project_team_member.go b/api/wxApplet/wxApplet/sys_project_team_member.go new file mode 100644 index 0000000..1c6bea0 --- /dev/null +++ b/api/wxApplet/wxApplet/sys_project_team_member.go @@ -0,0 +1,93 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-15 09:34:52 +// 生成路径: api/wxApplet/wxApplet/sys_project_team_member.go +// 生成人:gfast +// desc:项目班组下的成员相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package wxApplet + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" +) + +// SysProjectTeamMemberSearchReq 分页请求参数 +type SysProjectTeamMemberSearchReq struct { + g.Meta `path:"/list" tags:"项目班组下的成员" method:"get" summary:"项目班组下的成员列表"` + IsPcSysUser string `p:"isPcSysUser" dc:"1查询pc注册的 2查询小程序注册的 不填或其他查全部"` + UserName string `p:"userName" dc:"模糊查询人员名称"` + TeamId string `p:"teamId" v:"required#班组ID不能为空"` //项目id + Openid string `p:"openid"` //微信用户标识 + PostId string `p:"postId" v:"postId@integer#岗位(默认为4普通员工,组长为10)需为整数"` //岗位(默认为4普通员工,组长为10) + CreateTime string `p:"createTime" v:"updateTime@datetime#更新时间需为YYYY-MM-DD hh:mm:ss格式"` //更新时间 + commonApi.PageReq + commonApi.Author +} + +// SysProjectTeamMemberSearchRes 列表返回结果 +type SysProjectTeamMemberSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.SysProjectTeamMemberListRes `json:"list"` +} + +// SysProjectTeamMemberAddReq 添加操作请求参数 +type SysProjectTeamMemberAddReq struct { + g.Meta `path:"/add" tags:"项目班组下的成员" method:"post" summary:"项目班组下的成员添加"` + commonApi.Author + TeamId int64 `p:"teamId" v:"required#班组ID不能为空"` + Openid string `p:"openid" v:"required#openid不能为空"` + PostId int64 `p:"postId" v:"required#职位不能为空"` + //TypeOfWork int64 `p:"typeOfWork"` + //NativePlace int64 `p:"nativePlace" ` +} + +// SysProjectTeamMemberAddRes 添加操作返回结果 +type SysProjectTeamMemberAddRes struct { + commonApi.EmptyRes +} + +// SysProjectTeamMemberEditReq 修改操作请求参数 +type SysProjectTeamMemberEditReq struct { + g.Meta `path:"/edit" tags:"项目班组下的成员" method:"put" summary:"项目班组下的成员修改"` + commonApi.Author + SiteNum string `p:"siteNum"` //1入场时间 2离场时间 3或零值不操作 + Id int64 `p:"id" v:"required#主键ID不能为空"` + TeamId int64 `p:"teamId" ` + Openid string `p:"openid" ` + PostId int64 `p:"postId" gf:"default:4" dc:"不填写为普通员工"` +} + +// SysProjectTeamMemberEditRes 修改操作返回结果 +type SysProjectTeamMemberEditRes struct { + commonApi.EmptyRes +} + +// SysProjectTeamMemberGetReq 获取一条数据请求 +type SysProjectTeamMemberGetReq struct { + g.Meta `path:"/get" tags:"项目班组下的成员" method:"get" summary:"获取项目班组下的成员信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// SysProjectTeamMemberGetRes 获取一条数据结果 +type SysProjectTeamMemberGetRes struct { + g.Meta `mime:"application/json"` + *model.SysProjectTeamMemberInfoRes +} + +// SysProjectTeamMemberDeleteReq 删除数据请求 +type SysProjectTeamMemberDeleteReq struct { + g.Meta `path:"/delete" tags:"项目班组下的成员" method:"delete" summary:"删除项目班组下的成员"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// SysProjectTeamMemberDeleteRes 删除数据返回 +type SysProjectTeamMemberDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/wxApplet/wxApplet/sys_project_team_squad.go b/api/wxApplet/wxApplet/sys_project_team_squad.go new file mode 100644 index 0000000..8d9345f --- /dev/null +++ b/api/wxApplet/wxApplet/sys_project_team_squad.go @@ -0,0 +1,119 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-30 15:24:06 +// 生成路径: api/v1/wxApplet/sys_project_team_squad.go +// 生成人:gfast +// desc:站班会相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package wxApplet + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" +) + +// SysProjectTeamSquadSearchReq 分页请求参数 +type SysProjectTeamSquadSearchReq struct { + g.Meta `path:"/list" tags:"站班会" method:"get" summary:"站班会列表"` + MeetingDate string `p:"meetingDate" dc:"开会时间" v:"date-format:Y-m-d#时间需为Y-m-d格式"` //开会时间 + //CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + ProjectId string `p:"projectId" v:"required#项目id不能为空"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// SysProjectTeamSquadSearchRes 列表返回结果 +type SysProjectTeamSquadSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.SysProjectTeamSquadListRes `json:"list"` +} + +// SysProjectTeamSquadAddReq 添加操作请求参数 +type SysProjectTeamSquadAddReq struct { + g.Meta `path:"/add" tags:"站班会" method:"post" summary:"站班会添加(只能供小程序使用)"` + commonApi.Author + TeamId int64 `json:"teamId" dc:"班组ID" v:"required#班组ID不能为空" ` + //ProjectId int64 `json:"projectId" dc:"班组ID" v:"required#项目ID不能为空" ` + MeetingDate *gtime.Time `json:"meetingDate" dc:"开会时间" v:"meetingDate@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` + CompereId string `json:"compereId" dc:"主持人openid" v:"required#主持人不能为空"` + ParticipantId string `json:"participantId" dc:"参与人openid(多个用,分开)" v:"required#参与人不能为空"` + Content string `json:"content" dc:"内容" v:"required#内容不能为空"` + Picture string `json:"picture" dc:"图片(多个用,分开)" v:"required#图片不能为空"` + //LongitudeAndLatitude string `json:"longitudeAndLatitude" dc:"经度纬度,逗号拼接" v:"required#经度纬度不能为空"` +} + +// SysProjectTeamSquadAddRes 添加操作返回结果 +type SysProjectTeamSquadAddRes struct { + commonApi.EmptyRes +} + +// SysProjectTeamSquadEditReq 修改操作请求参数 +type SysProjectTeamSquadEditReq struct { + g.Meta `path:"/edit" tags:"站班会" method:"put" summary:"站班会修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` +} + +// SysProjectTeamSquadEditRes 修改操作返回结果 +type SysProjectTeamSquadEditRes struct { + commonApi.EmptyRes +} + +// SysProjectTeamSquadGetReq 获取一条数据请求 +type SysProjectTeamSquadGetReq struct { + g.Meta `path:"/get" tags:"站班会" method:"get" summary:"获取站班会信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// SysProjectTeamSquadGetRes 获取一条数据结果 +type SysProjectTeamSquadGetRes struct { + g.Meta `mime:"application/json"` + *model.SysProjectTeamSquadInfoRes +} + +// SysProjectTeamSquadDeleteReq 删除数据请求 +type SysProjectTeamSquadDeleteReq struct { + g.Meta `path:"/delete" tags:"站班会" method:"delete" summary:"删除站班会"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// SysProjectTeamSquadDeleteRes 删除数据返回 +type SysProjectTeamSquadDeleteRes struct { + commonApi.EmptyRes +} + +// SysProjectTeamSquadCountReq 总开会次数统计 +type SysProjectTeamSquadCountReq struct { + g.Meta `path:"/count" tags:"站班会" method:"get" summary:"总开会次数统计"` + commonApi.Author + //Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// SysProjectTeamSquadCountRes 总开会次数统计 +type SysProjectTeamSquadCountRes struct { + g.Meta `mime:"application/json"` + Number int `json:"number"` +} + +// SelectByOpenidTeamSquadSearchReq 分页请求参数 +type SelectByOpenidTeamSquadSearchReq struct { + g.Meta `path:"/selectByOpenidTeamSquadSearch" tags:"站班会" method:"get" summary:"根据openid查询当前人员的所有站班会内容"` + MeetingDate string `p:"meetingDate" dc:"开会时间" v:"date-format:Y-m-d#时间需为Y-m-d格式"` + Openid string `p:"openid" v:"required#openid不能为空"` + commonApi.PageReq + commonApi.Author +} + +// SelectByOpenidTeamSquadSearchRes 列表返回结果 +type SelectByOpenidTeamSquadSearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.SysProjectTeamSquadListRes `json:"list"` +} diff --git a/api/wxApplet/wxApplet/sys_user_project_relevancy.go b/api/wxApplet/wxApplet/sys_user_project_relevancy.go new file mode 100644 index 0000000..dee9dea --- /dev/null +++ b/api/wxApplet/wxApplet/sys_user_project_relevancy.go @@ -0,0 +1,85 @@ +// ========================================================================== +// GFast自动生成api操作代码。 +// 生成日期:2023-08-21 09:19:14 +// 生成路径: api/wxApplet/wxApplet/sys_user_project_relevancy.go +// 生成人:gfast +// desc:系统用户与项目关联相关参数 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package wxApplet + +import ( + "github.com/gogf/gf/v2/frame/g" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" +) + +// SysUserProjectRelevancySearchReq 分页请求参数 +type SysUserProjectRelevancySearchReq struct { + g.Meta `path:"/list" tags:"系统用户与项目关联" method:"get" summary:"系统用户与项目关联列表"` + UserId string `p:"userId" v:"userId@integer#用户ID需为整数"` //用户ID + ProjectId string `p:"projectId" v:"projectId@integer#项目ID需为整数"` //项目ID + CreatedAt string `p:"createdAt" v:"createdAt@datetime#创建时间需为YYYY-MM-DD hh:mm:ss格式"` //创建时间 + commonApi.PageReq + commonApi.Author +} + +// SysUserProjectRelevancySearchRes 列表返回结果 +type SysUserProjectRelevancySearchRes struct { + g.Meta `mime:"application/json"` + commonApi.ListRes + List []*model.SysUserProjectRelevancyListRes `json:"list"` +} + +// SysUserProjectRelevancyAddReq 添加操作请求参数 +type SysUserProjectRelevancyAddReq struct { + g.Meta `path:"/add" tags:"系统用户与项目关联" method:"post" summary:"系统用户与项目关联添加"` + commonApi.Author + UserId int64 `p:"userId" v:"required#用户ID不能为空"` + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` +} + +// SysUserProjectRelevancyAddRes 添加操作返回结果 +type SysUserProjectRelevancyAddRes struct { + commonApi.EmptyRes +} + +// SysUserProjectRelevancyEditReq 修改操作请求参数 +type SysUserProjectRelevancyEditReq struct { + g.Meta `path:"/edit" tags:"系统用户与项目关联" method:"put" summary:"系统用户与项目关联修改"` + commonApi.Author + Id int64 `p:"id" v:"required#主键ID不能为空"` + UserId int64 `p:"userId" v:"required#用户ID不能为空"` + ProjectId int64 `p:"projectId" v:"required#项目ID不能为空"` +} + +// SysUserProjectRelevancyEditRes 修改操作返回结果 +type SysUserProjectRelevancyEditRes struct { + commonApi.EmptyRes +} + +// SysUserProjectRelevancyGetReq 获取一条数据请求 +type SysUserProjectRelevancyGetReq struct { + g.Meta `path:"/get" tags:"系统用户与项目关联" method:"get" summary:"获取系统用户与项目关联信息"` + commonApi.Author + Id int64 `p:"id" v:"required#主键必须"` //通过主键获取 +} + +// SysUserProjectRelevancyGetRes 获取一条数据结果 +type SysUserProjectRelevancyGetRes struct { + g.Meta `mime:"application/json"` + *model.SysUserProjectRelevancyInfoRes +} + +// SysUserProjectRelevancyDeleteReq 删除数据请求 +type SysUserProjectRelevancyDeleteReq struct { + g.Meta `path:"/delete" tags:"系统用户与项目关联" method:"delete" summary:"删除系统用户与项目关联"` + commonApi.Author + Ids []int64 `p:"ids" v:"required#主键必须"` //通过主键删除 +} + +// SysUserProjectRelevancyDeleteRes 删除数据返回 +type SysUserProjectRelevancyDeleteRes struct { + commonApi.EmptyRes +} diff --git a/api/wxApplet/wxApplet/wx_login.go b/api/wxApplet/wxApplet/wx_login.go new file mode 100644 index 0000000..d663817 --- /dev/null +++ b/api/wxApplet/wxApplet/wx_login.go @@ -0,0 +1,13 @@ +package wxApplet + +//type LoginReq struct { +// g.Meta `path:"/BusLogin" tags:"施工人员" method:"post" summary:"微信登录"` +// Code string `json:"code" v:"required" dc:"小程序用户的临时code"` +// NickName string `json:"nick_name" v:"required" dc:"小程序用户的昵称"` +// HeadIcon string `json:"head_icon" v:"required" dc:"小程序用户的头像的base64"` +//} +//type LoginRes struct { +// commonApi.EmptyRes +// Openid string `json:"openid" dc:"用户的openid"` +// Token string `json:"token" dc:"token"` +//} diff --git a/convert b/convert new file mode 100644 index 0000000..39a4cf1 Binary files /dev/null and b/convert differ diff --git a/database/db.go b/database/db.go new file mode 100644 index 0000000..f39c320 --- /dev/null +++ b/database/db.go @@ -0,0 +1,158 @@ +package database + +import ( + "gorm.io/gorm" +) + +const ( + DEFAULTPWD = "123456" + DEFAULTUSR = "admin" + OFFLINE_DB = "database.ydb" +) + +var sourceDBMap = map[string]SourceObj{} + +/*服务器端MySQL的连接实例*/ +var ormIncestance *gorm.DB + +/*获取服务端的数据库连接实例*/ +func GetORMDBInstance() *gorm.DB { + return ormIncestance +} +func SetORMDBInstance(db *gorm.DB) { + ormIncestance = db + sourceDBMap = make(map[string]SourceObj) + InitTable() +} + +type DataSource struct { + Url string //数据请求地址 + Type string //数据类型 +} + +type SourceInfo struct { + MaxLevel int `json:"maximumLevel"` + MinLevel int `json:"minimumLevel"` + West string `json:"west"` + South string `json:"south"` + East string `json:"east"` + North string `json:"north"` + ProFile string `json:"pro_file"` + TilingScheme int `json:"tiling_scheme"` //是否需要加投影 +} +type SourceObj struct { + DataSource + DB *gorm.DB //链接对象 + Gzip bool //是否压缩 + ContentType string //响应头 + Info SourceInfo //资源信息 +} + +// 保存资源连接对象 +func SetSourceDB(sourceId string, obj SourceObj) { + sourceDBMap[sourceId] = obj +} + +// 获取资源连接对象 +func GetSourceDB(sourceId string) SourceObj { + return sourceDBMap[sourceId] +} + +type SOURCE struct { + //gorm.Model + //ProjectID string `json:"project_id" gorm:"type:varchar(128);comment:'项目id'" dc:"项目id"` + //SourceName string `json:"source_name" gorm:"type:varchar(128);comment:'资源名称'" dc:"资源名称"` + SourceID string `json:"source_id" gorm:"type:varchar(128);comment:'资源id'" dc:"资源id"` + //SourceType string `json:"source_type" gorm:"type:varchar(128);comment:'资源类型'" dc:"资源类型"` + //IsShow int `json:"is_show" gorm:"type:int(11);comment:'初次渲染的时候是否显示'" dc:"初次渲染的时候是否显示"` + //Detail string `json:"detail" gorm:"comment:'资源的一些自带参数,序列话的字符串'" dc:"资源的一些自带参数,序列话的字符串"` + //PID string `json:"p_id" gorm:"type:varchar(128);comment:'父id'" dc:"父id"` + SourcePath string `json:"source_path" gorm:"type:varchar(512);comments:'资源路径'" dc:"资源路径"` + //LayerIndex int `json:"layer_index" gorm:"type:int(11);comment:'二维图层在地球上的顺序序号'" dc:"二维图层在地球上的顺序序号"` + //TreeIndex int `json:"tree_index" gorm:"type:int(11);comment:'结构树上的顺序序号'" dc:"结构树上的顺序序号"` + //RichText string `json:"rich_text" comments:"富文本内容" dc:"富文本内容"` +} + +func (SOURCE) TableName() string { + return "zmkg_gis_sources" +} + +type USER struct { + gorm.Model + Username string `json:"username"` + Password string `json:"password"` +} + +func InitTable() { + createMarkerTable() + createUserTable() + createGfbInfoTable() +} +func createMarkerTable() { + if !GetORMDBInstance().Migrator().HasTable(&SOURCE{}) { + GetORMDBInstance().Migrator().AutoMigrate(&SOURCE{}) + } +} +func createUserTable() { + if !GetORMDBInstance().Migrator().HasTable(&USER{}) { + err := GetORMDBInstance().Migrator().AutoMigrate(&USER{}) + if err != nil { + return + } + user := USER{Username: DEFAULTUSR, Password: DEFAULTPWD} + users := []USER{user} + GetORMDBInstance().Create(&users) + } +} + +/*光伏板导入*/ +type GFB struct { + ProjectID string `json:"project_id" gorm:"type:varchar(128);comment:'项目id'" dc:"项目id"` + PhotovoltaicNumber string `json:"photovoltaic_number"` + PhotovoltaicNumberGis string `json:"photovoltaic_number_gis"` +} + +func (GFB) TableName() string { + return "bus_scheduled_weekly_photovoltaic" +} + +type FzInfo struct { + gorm.Model + ProjectID string `json:"project_id" gorm:"type:varchar(128);comment:'项目id'" dc:"项目id"` + PhotovoltaicNumber string `json:"photovoltaic_number"gorm:"type:varchar(128);comment:'光伏板编号(candela里面的实例名称)'" dc:"光伏板编号" ` + ZhuangBianHao string `json:"zhuang_bian_hao"gorm:"type:varchar(255);comment:'桩编号'" dc:"桩编号" ` + X string `json:"x"gorm:"type:varchar(255);comment:'X'" dc:"X" ` + Y string `json:"y"gorm:"type:varchar(255);comment:'Y'" dc:"Y" ` + ZTop string `json:"z_top"gorm:"type:varchar(255);comment:'顶部高程'" dc:"顶部高程" ` + ZBottom string `json:"z_bottom"gorm:"type:varchar(255);comment:'底部高程'" dc:"底部高程" ` + FZName string `json:"fz_name"gorm:"type:varchar(255);comment:'方阵名称'" dc:"方阵名称" ` + //ZhuangJianJu string `json:"zhuang_jian_ju"gorm:"type:varchar(255);comment:'桩间距'" dc:"桩间距" ` + //ColorNum int `json:"color_num"gorm:"comment:'颜色编号" dc:"颜色编号" ` + //Positions string `json:"positions"gorm:"comment:'光伏板桩号坐标'" dc:"光伏板桩号坐标" ` + //Params string `json:"params"gorm:"comment:'参数'" dc:"参数" ` +} + +func (FzInfo) TableName() string { + return "zmkg_fz_infos" +} + +func createGfbInfoTable() { + if !GetORMDBInstance().Migrator().HasTable(&FzInfo{}) { + GetORMDBInstance().Migrator().AutoMigrate(&FzInfo{}) + } +} + +type Project struct { + ID int64 `json:"id"` +} + +func (Project) TableName() string { + return "sys_project" +} +func CheckProjectIsExists(project_id int64) bool { + RowsAffected := GetORMDBInstance().Model(&Project{}).Where(&Project{project_id}).Find(&Project{}).RowsAffected + if RowsAffected > 0 { + return true + } + return false +} diff --git a/database/db_mysql/mysql.go b/database/db_mysql/mysql.go new file mode 100644 index 0000000..9558578 --- /dev/null +++ b/database/db_mysql/mysql.go @@ -0,0 +1,42 @@ +package db_mysql + +import ( + "fmt" + "github.com/tiger1103/gfast/v3/database" + "gorm.io/driver/mysql" + "gorm.io/gorm" + "time" +) + +var ( + HOST = "" //主机 + PORT = "" //端口 + USERNAME = "" //用户名 + PASSWORD = "" //密码 + DBNAME = "" //数据库 +) + +func InitMySQL() { + connectDB(getMysqlAddr()) +} + +/*获取MySQL连接地址*/ +func getMysqlAddr() string { + return USERNAME + ":" + PASSWORD + "@tcp(" + HOST + ":" + PORT + ")/" + DBNAME + "?charset=utf8&parseTime=True&loc=Local" +} + +func connectDB(path string) { + db, err := gorm.Open(mysql.Open(path), &gorm.Config{}) + if err != nil { + fmt.Println(err) + return + } + d, err := db.DB() + if err != nil { + return + } + d.SetMaxIdleConns(10) + //d.SetMaxOpenConns() + d.SetConnMaxLifetime(time.Second * 60) + database.SetORMDBInstance(db) +} diff --git a/database/sqlite/sqlite.go b/database/sqlite/sqlite.go new file mode 100644 index 0000000..322f465 --- /dev/null +++ b/database/sqlite/sqlite.go @@ -0,0 +1,21 @@ +package sqlite + +import ( + "fmt" + "github.com/glebarez/sqlite" + "github.com/tiger1103/gfast/v3/database" + "gorm.io/gorm" +) + +func InitSqlite(path string) { + fmt.Println(path) + db, err := OpenDB(path) + if err != nil { + return + } + database.SetORMDBInstance(db) +} + +func OpenDB(path string) (*gorm.DB, error) { + return gorm.Open(sqlite.Open(path), &gorm.Config{}) +} diff --git a/gfast b/gfast new file mode 100644 index 0000000..8aa05f7 Binary files /dev/null and b/gfast differ diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..6e5bf2b --- /dev/null +++ b/go.mod @@ -0,0 +1,118 @@ +module github.com/tiger1103/gfast/v3 + +go 1.22.5 + +require ( + github.com/aws/aws-sdk-go v1.50.5 + github.com/bwmarrin/snowflake v0.3.0 + github.com/casbin/casbin/v2 v2.42.0 + github.com/dop251/goja v0.0.0-20231027120936-b396bb4c349d + github.com/eclipse/paho.mqtt.golang v1.4.3 + github.com/fogleman/gg v1.3.0 + github.com/glebarez/sqlite v1.10.0 + github.com/go-redis/redis/v8 v8.11.5 + github.com/go-resty/resty/v2 v2.14.0 + github.com/go-sql-driver/mysql v1.7.0 // indirect + github.com/gogf/gf/contrib/drivers/mysql/v2 v2.2.5 + github.com/gogf/gf/contrib/nosql/redis/v2 v2.3.0 + github.com/gogf/gf/v2 v2.3.2 + github.com/golang/geo v0.0.0-20230421003525-6adc56603217 + github.com/google/uuid v1.6.0 + github.com/gorilla/websocket v1.5.3 + github.com/jinzhu/copier v0.4.0 + github.com/jung-kurt/gofpdf v1.16.2 + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/medivhzhan/weapp/v3 v3.8.1 + github.com/minio/minio-go/v7 v7.0.69 + github.com/mojocn/base64Captcha v1.3.5 + github.com/mssola/user_agent v0.5.3 + github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 + github.com/qiniu/go-sdk/v7 v7.13.0 + github.com/rivo/uniseg v0.4.3 // indirect + github.com/robfig/cron/v3 v3.0.1 + github.com/samber/lo v1.39.0 + github.com/satori/go.uuid v1.2.0 + github.com/shirou/gopsutil/v3 v3.23.2 + github.com/shopspring/decimal v1.3.1 + github.com/sony/sonyflake v1.2.0 + github.com/tencentyun/cos-go-sdk-v5 v0.7.34 + github.com/tidwall/gjson v1.17.3 + github.com/tiger1103/gfast-cache v1.0.0 + github.com/tiger1103/gfast-token v1.0.3 + github.com/tomchavakis/geojson v0.0.5 + github.com/tomchavakis/turf-go v0.0.5 + github.com/xuri/excelize/v2 v2.8.0 + github.com/yusufpapurcu/wmi v1.2.2 // indirect + golang.org/x/exp v0.0.0-20240119083558-1b970713d09a + golang.org/x/net v0.32.0 + golang.org/x/text v0.21.0 + gorm.io/driver/mysql v1.5.2 + gorm.io/gorm v1.25.6 +) + +require ( + github.com/BurntSushi/toml v1.4.0 // indirect + github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/clbanning/mxj v1.8.4 // indirect + github.com/clbanning/mxj/v2 v2.7.0 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/dlclark/regexp2 v1.10.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/fatih/color v1.18.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/glebarez/go-sqlite v1.22.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect + github.com/golang-jwt/jwt/v4 v4.4.2 // indirect + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect + github.com/google/go-querystring v1.1.0 // indirect + github.com/google/pprof v0.0.0-20240125082051-42cd04596328 // indirect + github.com/grokify/html-strip-tags-go v0.1.0 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.17.6 // indirect + github.com/klauspost/cpuid/v2 v2.2.6 // indirect + github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed // indirect + github.com/magiconair/properties v1.8.9 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/minio/md5-simd v1.1.2 // indirect + github.com/minio/sha256-simd v1.0.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect + github.com/mozillazg/go-httpheader v0.4.0 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/paulmach/orb v0.11.1 // indirect + github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + github.com/richardlehane/mscfb v1.0.4 // indirect + github.com/richardlehane/msoleps v1.0.3 // indirect + github.com/rs/xid v1.5.0 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.0 // indirect + github.com/tklauser/go-sysconf v0.3.13 // indirect + github.com/tklauser/numcpus v0.7.0 // indirect + github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53 // indirect + github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + golang.org/x/crypto v0.30.0 // indirect + golang.org/x/image v0.15.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + modernc.org/libc v1.40.8 // indirect + modernc.org/mathutil v1.6.0 // indirect + modernc.org/memory v1.7.2 // indirect + modernc.org/sqlite v1.28.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..d04f6dd --- /dev/null +++ b/go.sum @@ -0,0 +1,543 @@ +github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/QcloudApi/qcloud_sign_golang v0.0.0-20141224014652-e4130a326409/go.mod h1:1pk82RBxDY/JZnPQrtqHlUFfCctgdorsd9M06fMynOM= +github.com/aws/aws-sdk-go v1.50.5 h1:H2Aadcgwr7a2aqS6ZwcE+l1mA6ZrTseYCvjw2QLmxIA= +github.com/aws/aws-sdk-go v1.50.5/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0= +github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE= +github.com/casbin/casbin/v2 v2.42.0 h1:EA0aE5PZnFSYY6WulzTScOo4YO6xrGAAZkXRLs8p2ME= +github.com/casbin/casbin/v2 v2.42.0/go.mod h1:sEL80qBYTbd+BPeL4iyvwYzFT3qwLaESq5aFKVLbLfA= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I= +github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= +github.com/clbanning/mxj/v2 v2.5.5/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= +github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= +github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/dlclark/regexp2 v1.10.0 h1:+/GIL799phkJqYW+3YbOd8LCcbHzT0Pbo8zl70MHsq0= +github.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/dop251/goja v0.0.0-20211022113120-dc8c55024d06/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= +github.com/dop251/goja v0.0.0-20231027120936-b396bb4c349d h1:wi6jN5LVt/ljaBG4ue79Ekzb12QfJ52L9Q98tl8SWhw= +github.com/dop251/goja v0.0.0-20231027120936-b396bb4c349d/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= +github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= +github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d/go.mod h1:DngW8aVqWbuLRMHItjPUyqdj+HWPvnQe8V8y1nDpIbM= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/eclipse/paho.mqtt.golang v1.4.3 h1:2kwcUGn8seMUfWndX0hGbvH8r7crgcJguQNCyp70xik= +github.com/eclipse/paho.mqtt.golang v1.4.3/go.mod h1:CSYvoAlsMkhYOXh/oKyxa8EcBci6dVkLCbo5tTC1RIE= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec+ruQ= +github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc= +github.com/glebarez/sqlite v1.10.0 h1:u4gt8y7OND/cCei/NMHmfbLxF6xP2wgKcT/BJf2pYkc= +github.com/glebarez/sqlite v1.10.0/go.mod h1:IJ+lfSOmiekhQsFTJRx/lHtGYmCdtAiTaf5wI9u5uHA= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/validator/v10 v10.8.0/go.mod h1:9JhgTzTaE31GZDpH/HSvHiRJrJ3iKAgqqH0Bl/Ocjdk= +github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/go-resty/resty/v2 v2.14.0 h1:/rhkzsAqGQkozwfKS5aFAbb6TyKd3zyFRWcdRXLPCAU= +github.com/go-resty/resty/v2 v2.14.0/go.mod h1:IW6mekUOsElt9C7oWr0XRt9BNSD6D5rr9mhk6NjmNHg= +github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= +github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gogf/gf/contrib/drivers/mysql/v2 v2.2.5 h1:lbktAfOabQV9ZzLdEUK6DkELnq2hcHLd8gAD1a6HfSQ= +github.com/gogf/gf/contrib/drivers/mysql/v2 v2.2.5/go.mod h1:z+/0qiOwMroAnj5ESuobTv0l5P83rf+XR3r6Fj8WJyk= +github.com/gogf/gf/contrib/nosql/redis/v2 v2.3.0 h1:r2q8MLwF6yUIEm6Hhwsfo/ixaJTKluTXSjU8rSeXo3c= +github.com/gogf/gf/contrib/nosql/redis/v2 v2.3.0/go.mod h1:V9o2BF9ovJnaZhHImHAanqUgjX4kI51lgU45u5rPqvw= +github.com/gogf/gf/v2 v2.0.0/go.mod h1:apktt6TleWtCIwpz63vBqUnw8MX8gWKoZyxgDpXFtgM= +github.com/gogf/gf/v2 v2.3.2 h1:nlJ0zuDWqFb93/faZmr7V+GADx/lzz5Unz/9x6OJ2u8= +github.com/gogf/gf/v2 v2.3.2/go.mod h1:tsbmtwcAl2chcYoq/fP9W2FZf06aw4i89X34nbSHo9Y= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v4 v4.4.2 h1:rcc4lwaZgFMCZ5jxF9ABolDcIHdBytAFgqFPbSJQAYs= +github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/geo v0.0.0-20230421003525-6adc56603217 h1:HKlyj6in2JV6wVkmQ4XmG/EIm+SCYlPZ+V4GWit7Z+I= +github.com/golang/geo v0.0.0-20230421003525-6adc56603217/go.mod h1:8wI0hitZ3a1IxZfeH3/5I97CI8i5cLGsYe7xNhQGs9U= +github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg= +github.com/google/pprof v0.0.0-20240125082051-42cd04596328 h1:oI+lCI2DY1BsRrdzMJBhIMxBBdlZJl31YNQC11EiyvA= +github.com/google/pprof v0.0.0-20240125082051-42cd04596328/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grokify/html-strip-tags-go v0.0.1/go.mod h1:2Su6romC5/1VXOQMaWL2yb618ARB8iVo6/DR99A6d78= +github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4= +github.com/grokify/html-strip-tags-go v0.1.0/go.mod h1:ZdzgfHEzAfz9X6Xe5eBLVblWIxXfYSQ40S/VKrAOGpc= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= +github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= +github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.16.2 h1:jgbatWHfRlPYiK85qgevsZTHviWXKwB1TTiKdz5PtRc= +github.com/jung-kurt/gofpdf v1.16.2/go.mod h1:1hl7y57EsiPAkLbOwzpzqgx1A30nQCk/YmFV8S2vmK0= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.17.6 h1:60eq2E/jlfwQXtvZEeBUYADs+BwKBWURIY+Gj2eRGjI= +github.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc= +github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed h1:036IscGBfJsFIgJQzlui7nK1Ncm0tp2ktmPj8xO4N/0= +github.com/lufia/plan9stats v0.0.0-20231016141302-07b5767bb0ed/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= +github.com/lukeroth/gdal v0.0.0-20240301124940-d4ff2229365e h1:ih9r73dwd1JGB24sWU4I1TgGdljjR0Suh08rDS8CeRU= +github.com/lukeroth/gdal v0.0.0-20240301124940-d4ff2229365e/go.mod h1:u/R3dIULVNb+dWMOvaoa5GxHgN1rJi+TUKUlTOqU/MY= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM= +github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/medivhzhan/weapp/v3 v3.8.1 h1:ZRYcEAU9mz73hI/X7+/qVj2ik+TPEQaI7PuiD2alF8E= +github.com/medivhzhan/weapp/v3 v3.8.1/go.mod h1:xE4GrGv/3/eR2+GSO8L8wCmvbf261aBHJla/QmoVGQM= +github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.69 h1:l8AnsQFyY1xiwa/DaQskY4NXSLA2yrGsW5iD9nRPVS0= +github.com/minio/minio-go/v7 v7.0.69/go.mod h1:XAvOPJQ5Xlzk5o3o/ArO2NMbhSGkimC+bpW/ngRKDmQ= +github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= +github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/mojocn/base64Captcha v1.3.5 h1:Qeilr7Ta6eDtG4S+tQuZ5+hO+QHbiGAJdi4PfoagaA0= +github.com/mojocn/base64Captcha v1.3.5/go.mod h1:/tTTXn4WTpX9CfrmipqRytCpJ27Uw3G6I7NcP2WwcmY= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/mozillazg/go-httpheader v0.2.1/go.mod h1:jJ8xECTlalr6ValeXYdOF8fFUISeBAdw6E61aqQma60= +github.com/mozillazg/go-httpheader v0.4.0 h1:aBn6aRXtFzyDLZ4VIRLsZbbJloagQfMnCiYgOq6hK4w= +github.com/mozillazg/go-httpheader v0.4.0/go.mod h1:PuT8h0pw6efvp8ZeUec1Rs7dwjK08bt6gKSReGMqtdA= +github.com/mssola/user_agent v0.5.3 h1:lBRPML9mdFuIZgI2cmlQ+atbpJdLdeVl2IDodjBR578= +github.com/mssola/user_agent v0.5.3/go.mod h1:TTPno8LPY3wAIEKRpAtkdMT0f8SE24pLRGPahjCH4uw= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= +github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= +github.com/paulmach/orb v0.11.1 h1:3koVegMC4X/WeiXYz9iswopaTwMem53NzTJuTF20JzU= +github.com/paulmach/orb v0.11.1/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= +github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= +github.com/phpdave11/gofpdi v1.0.7/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b h1:0LFwY6Q3gMACTjAbMZBjXAqTOzOwFaj2Ld6cjeQ7Rig= +github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/qiniu/dyn v1.3.0/go.mod h1:E8oERcm8TtwJiZvkQPbcAh0RL8jO1G0VXJMW3FAWdkk= +github.com/qiniu/go-sdk/v7 v7.13.0 h1:0bWRh/oAC2cArUILZLuWN+s9hPep1JYch5sA2Mfxq7A= +github.com/qiniu/go-sdk/v7 v7.13.0/go.mod h1:btsaOc8CA3hdVloULfFdDgDc+g4f3TDZEFsDY0BLE+w= +github.com/qiniu/x v1.10.5/go.mod h1:03Ni9tj+N2h2aKnAz+6N0Xfl8FwMEDRC2PAlxekASDs= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM= +github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= +github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= +github.com/richardlehane/msoleps v1.0.3 h1:aznSZzrwYRl3rLKRT3gUk9am7T/mLNSnJINvN0AQoVM= +github.com/richardlehane/msoleps v1.0.3/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= +github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/samber/lo v1.39.0 h1:4gTz1wUhNYLhFSKl6O+8peW0v2F4BCY034GRpU9WnuA= +github.com/samber/lo v1.39.0/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= +github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/shirou/gopsutil/v3 v3.23.2 h1:PAWSuiAszn7IhPMBtXsbSCafej7PqUOvY6YywlQUExU= +github.com/shirou/gopsutil/v3 v3.23.2/go.mod h1:gv0aQw33GLo3pG8SiWKiQrbDzbRY1K80RyZJ7V4Th1M= +github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/sony/sonyflake v1.2.0 h1:Pfr3A+ejSg+0SPqpoAmQgEtNDAhc2G1SUYk205qVMLQ= +github.com/sony/sonyflake v1.2.0/go.mod h1:LORtCywH/cq10ZbyfhKrHYgAUGH7mOBa76enV9txy/Y= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.194/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/kms v1.0.194/go.mod h1:yrBKWhChnDqNz1xuXdSbWXG56XawEq0G5j1lg4VwBD4= +github.com/tencentyun/cos-go-sdk-v5 v0.7.34 h1:xm+Pg+6m486y4eugRI7/E4WasbVmpY1hp9QBSRErgp8= +github.com/tencentyun/cos-go-sdk-v5 v0.7.34/go.mod h1:4dCEtLHGh8QPxHEkgq+nFaky7yZxQuYwgSJM87icDaw= +github.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94= +github.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tiger1103/gfast-cache v1.0.0 h1:+amboC6uu4AvkUnDz4DECcsBTp5HW+O98k8guJtrDlA= +github.com/tiger1103/gfast-cache v1.0.0/go.mod h1:l+e5vdUHmqK0Th5VBOCSxXORbm8MwZQMXDkn+KA+amE= +github.com/tiger1103/gfast-token v1.0.3 h1:6uPGGuhxlLODV9tDS1djhWHUSaIYtVNyOqibHTITCt4= +github.com/tiger1103/gfast-token v1.0.3/go.mod h1:yjTBd86Gi2tOrgNBZe60QKyMprJVFSg3zUmQDEkD/Lw= +github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= +github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= +github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= +github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= +github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= +github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= +github.com/tomchavakis/geojson v0.0.5 h1:4A2lVdwhKurcjxhozIkXIZLzQl4Cdhh4zyIBtvcW6oE= +github.com/tomchavakis/geojson v0.0.5/go.mod h1:cV7rPpWhNXW+WnHlIo3od3KKfiekyVqe0gG2N+krlB4= +github.com/tomchavakis/turf-go v0.0.5 h1:+kQafGVE5slB/Q0iKA2q3bl0sSsi4xJsmCLn2IR3jsw= +github.com/tomchavakis/turf-go v0.0.5/go.mod h1:YFsD+j5apnndklbjzrRUYhOiMaGZmjX7PQHHRA4ezMI= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= +github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= +github.com/xuri/efp v0.0.0-20230802181842-ad255f2331ca/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI= +github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53 h1:Chd9DkqERQQuHpXjR/HSV1jLZA6uaoiwwH3vSuF3IW0= +github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI= +github.com/xuri/excelize/v2 v2.8.0 h1:Vd4Qy809fupgp1v7X+nCS/MioeQmYVVzi495UCTqB7U= +github.com/xuri/excelize/v2 v2.8.0/go.mod h1:6iA2edBTKxKbZAa7X5bDhcCg51xdOn1Ar5sfoXRGrQg= +github.com/xuri/nfp v0.0.0-20230819163627-dc951e3ffe1a/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= +github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05 h1:qhbILQo1K3mphbwKh1vNm4oGezE1eF9fQWmNiIpSfI4= +github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= +github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= +go.opentelemetry.io/otel v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg= +go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.0.0/go.mod h1:PCrDHlSy5x1kjezSdL37PhbFUMjrsLRshJ2zCzeXwbM= +go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs= +go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= +golang.org/x/crypto v0.30.0 h1:RwoQn3GkWiMkzlX562cLB7OxWvjH1L8xutO2WoJcRoY= +golang.org/x/crypto v0.30.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA= +golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= +golang.org/x/image v0.0.0-20190501045829-6d32002ffd75/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.11.0/go.mod h1:bglhjqbqVuEb9e9+eNR45Jfu7D+T4Qan+NhQk8Ck2P8= +golang.org/x/image v0.15.0 h1:kOELfmgrmJlw4Cdb7g/QGuB3CvDrXbqEIww/pNtNBm8= +golang.org/x/image v0.15.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211020174200-9d6173849985/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8-0.20211105212822-18b340fc7af2/go.mod h1:EFNZuWvGYxIRUEX+K8UmCFwYmZjqcrnq15ZuVldZkZ0= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= +golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.5.2 h1:QC2HRskSE75wBuOxe0+iCkyJZ+RqpudsQtqkp+IMuXs= +gorm.io/driver/mysql v1.5.2/go.mod h1:pQLhh1Ut/WUAySdTHwBpBv6+JKcj+ua4ZFx1QQTBzb8= +gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gorm.io/gorm v1.25.6 h1:V92+vVda1wEISSOMtodHVRcUIOPYa2tgQtyF+DfFx+A= +gorm.io/gorm v1.25.6/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +modernc.org/libc v1.40.8 h1:ZHN83BZzEytp4ctJMC2lxGTU3l8jo+2kGW7AUatIDZw= +modernc.org/libc v1.40.8/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= +modernc.org/sqlite v1.28.0 h1:Zx+LyDDmXczNnEQdvPuEfcFVA2ZPyaD7UCZDjef3BHQ= +modernc.org/sqlite v1.28.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= diff --git a/hack/config.yaml b/hack/config.yaml new file mode 100644 index 0000000..244789b --- /dev/null +++ b/hack/config.yaml @@ -0,0 +1,11 @@ +# CLI. +gfcli: + gen: + dao: + - link: "mysql:zmkg:RBCE83eRH6YCL8PL@tcp(119.45.210.154:28002)/zmkg" + tables: "pv_module" + removePrefix: "gf_" + descriptionTag: true + noModelComment: true + jsonCase: Snake + path: "./internal/app/system" diff --git a/internal/app/boot/boot.go b/internal/app/boot/boot.go new file mode 100644 index 0000000..799ce27 --- /dev/null +++ b/internal/app/boot/boot.go @@ -0,0 +1,13 @@ +/* +* @desc:启动 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/9/23 15:55 + */ + +package boot + +import ( + _ "github.com/tiger1103/gfast/v3/internal/app/common/logic" + _ "github.com/tiger1103/gfast/v3/internal/app/system/logic" +) diff --git a/internal/app/boot/test.go b/internal/app/boot/test.go new file mode 100644 index 0000000..0ef7abc --- /dev/null +++ b/internal/app/boot/test.go @@ -0,0 +1,5 @@ +package boot + +import ( + _ "github.com/tiger1103/gfast/v3/internal/app/test/logic" +) diff --git a/internal/app/boot/wxApplet.go b/internal/app/boot/wxApplet.go new file mode 100644 index 0000000..bacd575 --- /dev/null +++ b/internal/app/boot/wxApplet.go @@ -0,0 +1,5 @@ +package boot + +import ( + _ "github.com/tiger1103/gfast/v3/internal/app/wxApplet/logic" +) diff --git a/internal/app/common/consts/cache.go b/internal/app/common/consts/cache.go new file mode 100644 index 0000000..cb1b3b8 --- /dev/null +++ b/internal/app/common/consts/cache.go @@ -0,0 +1,21 @@ +/* +* @desc:缓存相关 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/9 11:25 + */ + +package consts + +const ( + CacheModelMem = "memory" + CacheModelRedis = "redis" + + // CacheSysDict 字典缓存菜单KEY + CacheSysDict = "sysDict" + + // CacheSysDictTag 字典缓存标签 + CacheSysDictTag = "sysDictTag" + // CacheSysConfigTag 系统参数配置 + CacheSysConfigTag = "sysConfigTag" +) diff --git a/internal/app/common/consts/consts.go b/internal/app/common/consts/consts.go new file mode 100644 index 0000000..9303cfa --- /dev/null +++ b/internal/app/common/consts/consts.go @@ -0,0 +1,8 @@ +/* +* @desc:常量 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/30 11:54 + */ + +package consts diff --git a/internal/app/common/consts/upload.go b/internal/app/common/consts/upload.go new file mode 100644 index 0000000..22a8143 --- /dev/null +++ b/internal/app/common/consts/upload.go @@ -0,0 +1,11 @@ +package consts + +const ( + UploadPath = "upload_file" + ImgTypeKey = "sys.uploadFile.imageType" + ImgSizeKey = "sys.uploadFile.imageSize" + FileTypeKey = "sys.uploadFile.fileType" + FileSizeKey = "sys.uploadFile.fileSize" + CheckFileTypeImg = "img" // 文件类型(图片) + CheckFileTypeFile = "file" // 文件类型(任意) +) diff --git a/internal/app/common/controller/base.go b/internal/app/common/controller/base.go new file mode 100644 index 0000000..e9b22f3 --- /dev/null +++ b/internal/app/common/controller/base.go @@ -0,0 +1,19 @@ +/* +* @desc: +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/4 18:19 + */ + +package controller + +import ( + "github.com/gogf/gf/v2/net/ghttp" +) + +type BaseController struct { +} + +// Init 自动执行的初始化方法 +func (c *BaseController) Init(r *ghttp.Request) { +} diff --git a/internal/app/common/controller/bususer.go b/internal/app/common/controller/bususer.go new file mode 100644 index 0000000..590f8cb --- /dev/null +++ b/internal/app/common/controller/bususer.go @@ -0,0 +1,118 @@ +package controller + +import ( + "context" + "regexp" + "strconv" + "strings" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + busFolderFile "github.com/tiger1103/gfast/v3/internal/app/system/logic/busFolderFile" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +// CommmonUpdateFile 修改施工人员图片/文件信息 +func CommmonUpdateFile(ctx context.Context, filesListReq []*model.BusConstructionUserFileListRes, id int64, wxOrPc string, openid string, projectId int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 4、批量修改身份证等图片数据 + if filesListReq != nil && id != 0 { + listReq := filesListReq + for i := range listReq { + //根据id+图片类型插入数据,如果数据存在则修改 + //if wxOrPc != "1" { + // var str = "" + // busfile := strings.Split(listReq[i].Path, ",") + // for _, imgData := range busfile { + // str = str + strings.Replace(imgData, "file", "wxfile", 1) + "," + // } + // listReq[i].Path = str[0 : len(str)-1] + //} + _, err = dao.BusConstructionUserFile.Ctx(ctx).WherePri(listReq[i].Id).Update(listReq[i]) + // 5、将图片信息添加到图库中 + pe := strings.Split(listReq[i].Path, ",") + zjId := strconv.FormatUint(ct.New().GetLoginUser(ctx).Id, 10) + if wxOrPc != "1" { + zjId = openid + for i, imgData := range pe { + pe[i] = strings.Replace(imgData, "file", "wxfile", 1) + } + } + // 判断是否是图片,不是就不允许进入图库 + for i, imgData := range pe { + re := regexp.MustCompile(`(?i)\.(` + coryCommon.PictureSuffix + `)$`) + match := re.FindString(imgData) + if match != "" { + err = busFolderFile.New().AllPicture( + ctx, + pe, + 3, + dao.BusConstructionUserFile.Table(), + listReq[i].Id, + wxOrPc, + zjId, + "", + projectId, + ) + } + } + + } + } + liberr.ErrIsNil(ctx, err) + }) + return +} + +// @Title BatchUpdateTheOpenidsOfIndividualTables 2024/4/26 15:07:00 +// @Description 批量更新各个表的openid (原因是最开始账号的openid是微信开发生成的,如果当前账号进入过了小程序那就根据小程序的微信openid来) +// @Auth Cory +// @param openid ---> "openid" +// @Return error ---> "错误信息" +func BatchUpdateTheOpenidsOfIndividualTables(ctx context.Context, openid string) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + tableNmaes := []string{ + "bus_attendance", + "bus_complaint_box", + "bus_constructiom_user_signature", + "bus_construction_blacklist", + "bus_question_offline", + "bus_question_save", + "bus_question_save_pdf", + "bus_reissue_a_card", + "bus_violation_record", + "sys_project_team_member", + "user_registration", + "bus_askforleave", + } + // 1、批量修改对应表字段 + for i := range tableNmaes { + err = updateFunc(ctx, tableNmaes[i], openid) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + } + // 2、站班会不一样,单独写sql sys_project_team_squad + sql := `UPDATE sys_project_team_squad set participant_id = REPLACE(participant_id,participant_id,` + "'" + openid + "'" + `) WHERE participant_id like '%` + openid + `%'` + _, err = g.DB().Exec(ctx, sql) + liberr.ErrIsNil(ctx, err) + _, err = g.DB().Model("sys_project_team_squad").Ctx(ctx).Unscoped().Where("compere_id", openid).Update(g.Map{"compere_id": openid}) + liberr.ErrIsNil(ctx, err) + return + }) + return err + }) + return +} + +func updateFunc(ctx context.Context, tableName string, openid string) (err error) { + op := "openid" + _, err = g.DB().Model(tableName).Ctx(ctx).Unscoped().Where(op, openid).Update(g.Map{op: openid}) + return +} diff --git a/internal/app/common/controller/captcha.go b/internal/app/common/controller/captcha.go new file mode 100644 index 0000000..0471ff6 --- /dev/null +++ b/internal/app/common/controller/captcha.go @@ -0,0 +1,32 @@ +/* +* @desc:验证码获取 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/2 17:45 + */ + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/internal/app/common/service" +) + +var Captcha = captchaController{} + +type captchaController struct { +} + +// Get 获取验证码 +func (c *captchaController) Get(ctx context.Context, req *common.CaptchaReq) (res *common.CaptchaRes, err error) { + var ( + idKeyC, base64stringC string + ) + idKeyC, base64stringC, err = service.Captcha().GetVerifyImgString(ctx) + res = &common.CaptchaRes{ + Key: idKeyC, + Img: base64stringC, + } + return +} diff --git a/internal/app/common/controller/design.go b/internal/app/common/controller/design.go new file mode 100644 index 0000000..32b903e --- /dev/null +++ b/internal/app/common/controller/design.go @@ -0,0 +1,26 @@ +package controller + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +// AuditEntityReq 审核请求参数 +type AuditEntityReq struct { + TableName string `p:"table_name" dc:"表名"` + TableId string `p:"table_id" dc:"表ID"` + ProjectId int64 `p:"projectId"` +} + +// AuditDataListCommon 设计审核列表 +func AuditDataListCommon(ctx context.Context, audit *AuditEntityReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + dao.DocumentCompletion.Ctx(ctx).Where("") + liberr.ErrIsNil(ctx, err) + }) + return +} + +// 根据当前数据的项目id递归推断出根目录id diff --git a/internal/app/common/dao/casbin_rule.go b/internal/app/common/dao/casbin_rule.go new file mode 100644 index 0000000..f58b618 --- /dev/null +++ b/internal/app/common/dao/casbin_rule.go @@ -0,0 +1,24 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/common/dao/internal" +) + +// casbinRuleDao is the data access object for table casbin_rule. +// You can define custom methods on it to extend its functionality as you wish. +type casbinRuleDao struct { + *internal.CasbinRuleDao +} + +var ( + // CasbinRule is globally public accessible object for table casbin_rule operations. + CasbinRule = casbinRuleDao{ + internal.NewCasbinRuleDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/common/dao/internal/casbin_rule.go b/internal/app/common/dao/internal/casbin_rule.go new file mode 100644 index 0000000..c3d7648 --- /dev/null +++ b/internal/app/common/dao/internal/casbin_rule.go @@ -0,0 +1,84 @@ +// ========================================================================== +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// CasbinRuleDao is the data access object for table casbin_rule. +type CasbinRuleDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns CasbinRuleColumns // columns contains all the column names of Table for convenient usage. +} + +// CasbinRuleColumns defines and stores column names for table casbin_rule. +type CasbinRuleColumns struct { + Ptype string // + V0 string // + V1 string // + V2 string // + V3 string // + V4 string // + V5 string // +} + +// casbinRuleColumns holds the columns for table casbin_rule. +var casbinRuleColumns = CasbinRuleColumns{ + Ptype: "ptype", + V0: "v0", + V1: "v1", + V2: "v2", + V3: "v3", + V4: "v4", + V5: "v5", +} + +// NewCasbinRuleDao creates and returns a new DAO object for table data access. +func NewCasbinRuleDao() *CasbinRuleDao { + return &CasbinRuleDao{ + group: "default", + table: "casbin_rule", + columns: casbinRuleColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *CasbinRuleDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *CasbinRuleDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *CasbinRuleDao) Columns() CasbinRuleColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *CasbinRuleDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *CasbinRuleDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *CasbinRuleDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/common/dao/internal/sys_config.go b/internal/app/common/dao/internal/sys_config.go new file mode 100644 index 0000000..f5673c1 --- /dev/null +++ b/internal/app/common/dao/internal/sys_config.go @@ -0,0 +1,90 @@ +// ========================================================================== +// Code generated by GoFrame CLI tool. DO NOT EDIT. Created at 2022-04-18 21:09:17 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysConfigDao is the data access object for table sys_config. +type SysConfigDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns SysConfigColumns // columns contains all the column names of Table for convenient usage. +} + +// SysConfigColumns defines and stores column names for table sys_config. +type SysConfigColumns struct { + ConfigId string // 参数主键 + ConfigName string // 参数名称 + ConfigKey string // 参数键名 + ConfigValue string // 参数键值 + ConfigType string // 系统内置(Y是 N否) + CreateBy string // 创建者 + UpdateBy string // 更新者 + Remark string // 备注 + CreatedAt string // 创建时间 + UpdatedAt string // 修改时间 +} + +// sysConfigColumns holds the columns for table sys_config. +var sysConfigColumns = SysConfigColumns{ + ConfigId: "config_id", + ConfigName: "config_name", + ConfigKey: "config_key", + ConfigValue: "config_value", + ConfigType: "config_type", + CreateBy: "create_by", + UpdateBy: "update_by", + Remark: "remark", + CreatedAt: "created_at", + UpdatedAt: "updated_at", +} + +// NewSysConfigDao creates and returns a new DAO object for table data access. +func NewSysConfigDao() *SysConfigDao { + return &SysConfigDao{ + group: "default", + table: "sys_config", + columns: sysConfigColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysConfigDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysConfigDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysConfigDao) Columns() SysConfigColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysConfigDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysConfigDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysConfigDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/common/dao/internal/sys_dict_data.go b/internal/app/common/dao/internal/sys_dict_data.go new file mode 100644 index 0000000..f601006 --- /dev/null +++ b/internal/app/common/dao/internal/sys_dict_data.go @@ -0,0 +1,98 @@ +// ========================================================================== +// Code generated by GoFrame CLI tool. DO NOT EDIT. Created at 2022-04-16 16:32:52 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysDictDataDao is the data access object for table sys_dict_data. +type SysDictDataDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns SysDictDataColumns // columns contains all the column names of Table for convenient usage. +} + +// SysDictDataColumns defines and stores column names for table sys_dict_data. +type SysDictDataColumns struct { + DictCode string // 字典编码 + DictSort string // 字典排序 + DictLabel string // 字典标签 + DictValue string // 字典键值 + DictType string // 字典类型 + CssClass string // 样式属性(其他样式扩展) + ListClass string // 表格回显样式 + IsDefault string // 是否默认(1是 0否) + Status string // 状态(0正常 1停用) + CreateBy string // 创建者 + UpdateBy string // 更新者 + Remark string // 备注 + CreatedAt string // 创建时间 + UpdatedAt string // 修改时间 +} + +// sysDictDataColumns holds the columns for table sys_dict_data. +var sysDictDataColumns = SysDictDataColumns{ + DictCode: "dict_code", + DictSort: "dict_sort", + DictLabel: "dict_label", + DictValue: "dict_value", + DictType: "dict_type", + CssClass: "css_class", + ListClass: "list_class", + IsDefault: "is_default", + Status: "status", + CreateBy: "create_by", + UpdateBy: "update_by", + Remark: "remark", + CreatedAt: "created_at", + UpdatedAt: "updated_at", +} + +// NewSysDictDataDao creates and returns a new DAO object for table data access. +func NewSysDictDataDao() *SysDictDataDao { + return &SysDictDataDao{ + group: "default", + table: "sys_dict_data", + columns: sysDictDataColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysDictDataDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysDictDataDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysDictDataDao) Columns() SysDictDataColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysDictDataDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysDictDataDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysDictDataDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/common/dao/internal/sys_dict_type.go b/internal/app/common/dao/internal/sys_dict_type.go new file mode 100644 index 0000000..edee6dc --- /dev/null +++ b/internal/app/common/dao/internal/sys_dict_type.go @@ -0,0 +1,88 @@ +// ========================================================================== +// Code generated by GoFrame CLI tool. DO NOT EDIT. Created at 2022-04-16 16:32:52 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysDictTypeDao is the data access object for table sys_dict_type. +type SysDictTypeDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns SysDictTypeColumns // columns contains all the column names of Table for convenient usage. +} + +// SysDictTypeColumns defines and stores column names for table sys_dict_type. +type SysDictTypeColumns struct { + DictId string // 字典主键 + DictName string // 字典名称 + DictType string // 字典类型 + Status string // 状态(0正常 1停用) + CreateBy string // 创建者 + UpdateBy string // 更新者 + Remark string // 备注 + CreatedAt string // 创建日期 + UpdatedAt string // 修改日期 +} + +// sysDictTypeColumns holds the columns for table sys_dict_type. +var sysDictTypeColumns = SysDictTypeColumns{ + DictId: "dict_id", + DictName: "dict_name", + DictType: "dict_type", + Status: "status", + CreateBy: "create_by", + UpdateBy: "update_by", + Remark: "remark", + CreatedAt: "created_at", + UpdatedAt: "updated_at", +} + +// NewSysDictTypeDao creates and returns a new DAO object for table data access. +func NewSysDictTypeDao() *SysDictTypeDao { + return &SysDictTypeDao{ + group: "default", + table: "sys_dict_type", + columns: sysDictTypeColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysDictTypeDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysDictTypeDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysDictTypeDao) Columns() SysDictTypeColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysDictTypeDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysDictTypeDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysDictTypeDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/common/dao/sys_config.go b/internal/app/common/dao/sys_config.go new file mode 100644 index 0000000..bb94040 --- /dev/null +++ b/internal/app/common/dao/sys_config.go @@ -0,0 +1,24 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/common/dao/internal" +) + +// sysConfigDao is the data access object for table sys_config. +// You can define custom methods on it to extend its functionality as you wish. +type sysConfigDao struct { + *internal.SysConfigDao +} + +var ( + // SysConfig is globally public accessible object for table sys_config operations. + SysConfig = sysConfigDao{ + internal.NewSysConfigDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/common/dao/sys_dict_data.go b/internal/app/common/dao/sys_dict_data.go new file mode 100644 index 0000000..7bf40ed --- /dev/null +++ b/internal/app/common/dao/sys_dict_data.go @@ -0,0 +1,24 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/common/dao/internal" +) + +// sysDictDataDao is the data access object for table sys_dict_data. +// You can define custom methods on it to extend its functionality as you wish. +type sysDictDataDao struct { + *internal.SysDictDataDao +} + +var ( + // SysDictData is globally public accessible object for table sys_dict_data operations. + SysDictData = sysDictDataDao{ + internal.NewSysDictDataDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/common/dao/sys_dict_type.go b/internal/app/common/dao/sys_dict_type.go new file mode 100644 index 0000000..4cb5521 --- /dev/null +++ b/internal/app/common/dao/sys_dict_type.go @@ -0,0 +1,24 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/common/dao/internal" +) + +// sysDictTypeDao is the data access object for table sys_dict_type. +// You can define custom methods on it to extend its functionality as you wish. +type sysDictTypeDao struct { + *internal.SysDictTypeDao +} + +var ( + // SysDictType is globally public accessible object for table sys_dict_type operations. + SysDictType = sysDictTypeDao{ + internal.NewSysDictTypeDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/common/logic/bigUpload/big_upload.go b/internal/app/common/logic/bigUpload/big_upload.go new file mode 100644 index 0000000..bab927a --- /dev/null +++ b/internal/app/common/logic/bigUpload/big_upload.go @@ -0,0 +1,71 @@ +/* +* @desc:大文件上传 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/9/27 16:25 + */ + +package bigUpload + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/common/service" + "github.com/tiger1103/gfast/v3/library/upload_chunk" +) + +func init() { + service.RegisterBigUpload(New()) +} + +func New() *sBigUpload { + return &sBigUpload{} +} + +type sBigUpload struct{} + +// Upload 上传分片文件 +func (s *sBigUpload) Upload(ctx context.Context, req *system.BigUploadReq) (res *system.BigUploadRes, err error) { + uploadChunk := &upload_chunk.UploadChunk{} + result, err := uploadChunk.Upload(req.UploadReq) + if err != nil { + return + } + res = new(system.BigUploadRes) + res.UpLoadRes = *result + return +} + +// UploadCheck 上传文件检查 +func (s *sBigUpload) UploadCheck(ctx context.Context, req *system.BigUploadCheckReq) (res *system.BigUploadCheckRes, err error) { + uploadChunk := &upload_chunk.UploadChunk{} + result, err := uploadChunk.CheckChunk(req.UploadReq) + if err != nil { + return + } + res = &system.BigUploadCheckRes{ + CheckRes: *result, + Identifier: req.Identifier, + TotalChunks: req.TotalChunks, + } + return +} + +// UploadMerge 上传文件合并 +func (s *sBigUpload) UploadMerge(ctx context.Context, req *system.BigUploadMergeReq) (res *system.BigUploadRes, err error) { + uploadChunk := &upload_chunk.UploadChunk{} + result, err := uploadChunk.MergeChunk(req.UploadReq) + if err != nil { + return nil, err + } + res = &system.BigUploadRes{ + UpLoadRes: upload_chunk.UpLoadRes{ + BaseRes: result.BaseRes, + NeedMerge: false, + Identifier: req.Identifier, + TotalChunks: req.TotalChunks, + }, + } + + return +} diff --git a/internal/app/common/logic/cache/cache.go b/internal/app/common/logic/cache/cache.go new file mode 100644 index 0000000..f9184e0 --- /dev/null +++ b/internal/app/common/logic/cache/cache.go @@ -0,0 +1,45 @@ +/* +* @desc:缓存处理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/9/27 16:33 + */ + +package cache + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gctx" + "github.com/tiger1103/gfast-cache/cache" + "github.com/tiger1103/gfast/v3/internal/app/common/consts" + "github.com/tiger1103/gfast/v3/internal/app/common/service" +) + +func init() { + service.RegisterCache(New()) +} + +func New() *sCache { + var ( + ctx = gctx.New() + cacheContainer *cache.GfCache + ) + prefix := g.Cfg().MustGet(ctx, "system.cache.prefix").String() + model := g.Cfg().MustGet(ctx, "system.cache.model").String() + if model == consts.CacheModelRedis { + // redis + cacheContainer = cache.NewRedis(prefix) + } else { + // memory + cacheContainer = cache.New(prefix) + } + return &sCache{ + GfCache: cacheContainer, + prefix: prefix, + } +} + +type sCache struct { + *cache.GfCache + prefix string +} diff --git a/internal/app/common/logic/captcha/captcha.go b/internal/app/common/logic/captcha/captcha.go new file mode 100644 index 0000000..f3f9608 --- /dev/null +++ b/internal/app/common/logic/captcha/captcha.go @@ -0,0 +1,76 @@ +/* +* @desc:验证码处理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/9/28 9:01 + */ + +package captcha + +import ( + "context" + "github.com/gogf/gf/v2/text/gstr" + "github.com/mojocn/base64Captcha" + "github.com/tiger1103/gfast/v3/internal/app/common/service" +) + +func init() { + service.RegisterCaptcha(New()) +} + +func New() *sCaptcha { + return &sCaptcha{ + driver: &base64Captcha.DriverString{ + //Height: 80, + //Width: 240, + Height: 100, + Width: 260, + NoiseCount: 50, + ShowLineOptions: 20, + Length: 4, + Source: "0123456789", + //Length: 4, + //Source: "abcdefghjkmnpqrstuvwxyz23456789", + Fonts: []string{"chromohv.ttf"}, + }, + store: base64Captcha.DefaultMemStore, + } +} + +type sCaptcha struct { + driver *base64Captcha.DriverString + store base64Captcha.Store +} + +var ( + captcha = sCaptcha{ + driver: &base64Captcha.DriverString{ + Height: 100, + Width: 260, + NoiseCount: 50, + ShowLineOptions: 20, + Length: 4, + Source: "0123456789", + //Length: 4, + //Source: "abcdefghjkmnpqrstuvwxyz23456789", + Fonts: []string{"chromohv.ttf"}, + }, + store: base64Captcha.DefaultMemStore, + } +) + +// GetVerifyImgString 获取字母数字混合验证码 +func (s *sCaptcha) GetVerifyImgString(ctx context.Context) (idKeyC string, base64stringC string, err error) { + driver := s.driver.ConvertFonts() + c := base64Captcha.NewCaptcha(driver, s.store) + //idKeyC, base64stringC, _, err = c.Generate() + idKeyC, base64stringC, err = c.Generate() + return +} + +// VerifyString 验证输入的验证码是否正确 +func (s *sCaptcha) VerifyString(id, answer string) bool { + c := base64Captcha.NewCaptcha(s.driver, s.store) + answer = gstr.ToLower(answer) + return c.Verify(id, answer, true) +} diff --git a/internal/app/common/logic/logic.go b/internal/app/common/logic/logic.go new file mode 100644 index 0000000..0dcb5d0 --- /dev/null +++ b/internal/app/common/logic/logic.go @@ -0,0 +1,16 @@ +// ========================================================================== +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package logic + +import ( + _ "github.com/tiger1103/gfast/v3/internal/app/common/logic/bigUpload" + _ "github.com/tiger1103/gfast/v3/internal/app/common/logic/cache" + _ "github.com/tiger1103/gfast/v3/internal/app/common/logic/captcha" + _ "github.com/tiger1103/gfast/v3/internal/app/common/logic/middleware" + _ "github.com/tiger1103/gfast/v3/internal/app/common/logic/sysConfig" + _ "github.com/tiger1103/gfast/v3/internal/app/common/logic/sysDictData" + _ "github.com/tiger1103/gfast/v3/internal/app/common/logic/sysDictType" + _ "github.com/tiger1103/gfast/v3/internal/app/common/logic/upload" +) diff --git a/internal/app/common/logic/middleware/middleware.go b/internal/app/common/logic/middleware/middleware.go new file mode 100644 index 0000000..7d25fa4 --- /dev/null +++ b/internal/app/common/logic/middleware/middleware.go @@ -0,0 +1,31 @@ +/* +* @desc:中间件处理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/9/28 9:08 + */ + +package middleware + +import ( + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/common/service" +) + +func init() { + service.RegisterMiddleware(New()) +} + +func New() *sMiddleware { + return &sMiddleware{} +} + +type sMiddleware struct{} + +func (s *sMiddleware) MiddlewareCORS(r *ghttp.Request) { + corsOptions := r.Response.DefaultCORSOptions() + // you can set options + //corsOptions.AllowDomain = []string{"goframe.org", "baidu.com"} + r.Response.CORS(corsOptions) + r.Middleware.Next() +} diff --git a/internal/app/common/logic/sysConfig/sys_config.go b/internal/app/common/logic/sysConfig/sys_config.go new file mode 100644 index 0000000..65eb167 --- /dev/null +++ b/internal/app/common/logic/sysConfig/sys_config.go @@ -0,0 +1,178 @@ +/* +* @desc:配置参数管理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/9/28 9:13 + */ + +package sysConfig + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/common/consts" + "github.com/tiger1103/gfast/v3/internal/app/common/dao" + "github.com/tiger1103/gfast/v3/internal/app/common/model/do" + "github.com/tiger1103/gfast/v3/internal/app/common/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/common/service" + systemConsts "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterSysConfig(New()) +} + +func New() *sSysConfig { + return &sSysConfig{} +} + +type sSysConfig struct { +} + +// List 系统参数列表 +func (s *sSysConfig) List(ctx context.Context, req *system.ConfigSearchReq) (res *system.ConfigSearchRes, err error) { + res = new(system.ConfigSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SysConfig.Ctx(ctx) + if req != nil { + if req.ConfigName != "" { + m = m.Where("config_name like ?", "%"+req.ConfigName+"%") + } + if req.ConfigType != "" { + m = m.Where("config_type = ", gconv.Int(req.ConfigType)) + } + if req.ConfigKey != "" { + m = m.Where("config_key like ?", "%"+req.ConfigKey+"%") + } + if len(req.DateRange) > 0 { + m = m.Where("created_at >= ? AND created_at<=?", req.DateRange[0], req.DateRange[1]) + } + } + res.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取数据失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + res.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = systemConsts.PageSize + } + err = m.Page(req.PageNum, req.PageSize).Order("config_id asc").Scan(&res.List) + liberr.ErrIsNil(ctx, err, "获取数据失败") + }) + return +} + +func (s *sSysConfig) Add(ctx context.Context, req *system.ConfigAddReq, userId uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = s.CheckConfigKeyUnique(ctx, req.ConfigKey) + liberr.ErrIsNil(ctx, err) + _, err = dao.SysConfig.Ctx(ctx).Insert(do.SysConfig{ + ConfigName: req.ConfigName, + ConfigKey: req.ConfigKey, + ConfigValue: req.ConfigValue, + ConfigType: req.ConfigType, + CreateBy: userId, + Remark: req.Remark, + }) + liberr.ErrIsNil(ctx, err, "添加系统参数失败") + //清除缓存 + service.Cache().RemoveByTag(ctx, consts.CacheSysConfigTag) + }) + return +} + +// CheckConfigKeyUnique 验证参数键名是否存在 +func (s *sSysConfig) CheckConfigKeyUnique(ctx context.Context, configKey string, configId ...int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + data := (*entity.SysConfig)(nil) + m := dao.SysConfig.Ctx(ctx).Fields(dao.SysConfig.Columns().ConfigId).Where(dao.SysConfig.Columns().ConfigKey, configKey) + if len(configId) > 0 { + m = m.Where(dao.SysConfig.Columns().ConfigId+" != ?", configId[0]) + } + err = m.Scan(&data) + liberr.ErrIsNil(ctx, err, "校验失败") + if data != nil { + liberr.ErrIsNil(ctx, errors.New("参数键名重复")) + } + }) + return +} + +// Get 获取系统参数 +func (s *sSysConfig) Get(ctx context.Context, id int) (res *system.ConfigGetRes, err error) { + res = new(system.ConfigGetRes) + err = g.Try(ctx, func(ctx context.Context) { + err = dao.SysConfig.Ctx(ctx).WherePri(id).Scan(&res.Data) + liberr.ErrIsNil(ctx, err, "获取系统参数失败") + }) + return +} + +// Edit 修改系统参数 +func (s *sSysConfig) Edit(ctx context.Context, req *system.ConfigEditReq, userId uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = s.CheckConfigKeyUnique(ctx, req.ConfigKey, req.ConfigId) + liberr.ErrIsNil(ctx, err) + _, err = dao.SysConfig.Ctx(ctx).WherePri(req.ConfigId).Update(do.SysConfig{ + ConfigName: req.ConfigName, + ConfigKey: req.ConfigKey, + ConfigValue: req.ConfigValue, + ConfigType: req.ConfigType, + UpdateBy: userId, + Remark: req.Remark, + }) + liberr.ErrIsNil(ctx, err, "修改系统参数失败") + //清除缓存 + service.Cache().RemoveByTag(ctx, consts.CacheSysConfigTag) + }) + return +} + +// Delete 删除系统参数 +func (s *sSysConfig) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysConfig.Ctx(ctx).Delete(dao.SysConfig.Columns().ConfigId+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + //清除缓存 + service.Cache().RemoveByTag(ctx, consts.CacheSysConfigTag) + }) + return +} + +// GetConfigByKey 通过key获取参数(从缓存获取) +func (s *sSysConfig) GetConfigByKey(ctx context.Context, key string) (config *entity.SysConfig, err error) { + if key == "" { + err = gerror.New("参数key不能为空") + return + } + cache := service.Cache() + cf := cache.Get(ctx, consts.CacheSysConfigTag+key) + if cf != nil && !cf.IsEmpty() { + err = gconv.Struct(cf, &config) + return + } + config, err = s.GetByKey(ctx, key) + if err != nil { + return + } + if config != nil { + cache.Set(ctx, consts.CacheSysConfigTag+key, config, 0, consts.CacheSysConfigTag) + } + return +} + +// GetByKey 通过key获取参数(从数据库获取) +func (s *sSysConfig) GetByKey(ctx context.Context, key string) (config *entity.SysConfig, err error) { + err = dao.SysConfig.Ctx(ctx).Where("config_key", key).Scan(&config) + if err != nil { + g.Log().Error(ctx, err) + err = gerror.New("获取配置失败") + } + return +} diff --git a/internal/app/common/logic/sysDictData/sys_dict_data.go b/internal/app/common/logic/sysDictData/sys_dict_data.go new file mode 100644 index 0000000..ded8f47 --- /dev/null +++ b/internal/app/common/logic/sysDictData/sys_dict_data.go @@ -0,0 +1,173 @@ +/* +* @desc:字典数据管理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/9/28 9:22 + */ + +package sysDictData + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/text/gstr" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/common/consts" + "github.com/tiger1103/gfast/v3/internal/app/common/dao" + "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/common/model/do" + "github.com/tiger1103/gfast/v3/internal/app/common/service" + systemConsts "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterSysDictData(New()) +} + +func New() *sSysDictData { + return &sSysDictData{} +} + +type sSysDictData struct { +} + +// GetDictWithDataByType 通过字典键类型获取选项 +func (s *sSysDictData) GetDictWithDataByType(ctx context.Context, req *system.GetDictReq) (dict *system.GetDictRes, + err error) { + cache := service.Cache() + cacheKey := consts.CacheSysDict + "_" + req.DictType + //从缓存获取 + iDict := cache.GetOrSetFuncLock(ctx, cacheKey, func(ctx context.Context) (value interface{}, err error) { + err = g.Try(ctx, func(ctx context.Context) { + //从数据库获取 + dict = &system.GetDictRes{} + //获取类型数据 + err = dao.SysDictType.Ctx(ctx).Where(dao.SysDictType.Columns().DictType, req.DictType). + Where(dao.SysDictType.Columns().Status, 1).Fields(model.DictTypeRes{}).Scan(&dict.Info) + liberr.ErrIsNil(ctx, err, "获取字典类型失败") + err = dao.SysDictData.Ctx(ctx).Fields(model.DictDataRes{}). + Where(dao.SysDictData.Columns().DictType, req.DictType). + Order(dao.SysDictData.Columns().DictSort + " asc," + + dao.SysDictData.Columns().DictCode + " asc"). + Scan(&dict.Values) + liberr.ErrIsNil(ctx, err, "获取字典数据失败") + }) + value = dict + return + }, 0, consts.CacheSysDictTag) + if iDict != nil { + err = gconv.Struct(iDict, &dict) + if err != nil { + return + } + } + //设置给定的默认值 + for _, v := range dict.Values { + if req.DefaultValue != "" { + if gstr.Equal(req.DefaultValue, v.DictValue) { + v.IsDefault = 1 + } else { + v.IsDefault = 0 + } + } + } + return +} + +// List 获取字典数据 +func (s *sSysDictData) List(ctx context.Context, req *system.DictDataSearchReq) (res *system.DictDataSearchRes, err error) { + res = new(system.DictDataSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SysDictData.Ctx(ctx) + if req != nil { + if req.DictLabel != "" { + m = m.Where(dao.SysDictData.Columns().DictLabel+" like ?", "%"+req.DictLabel+"%") + } + if req.Status != "" { + m = m.Where(dao.SysDictData.Columns().Status+" = ", gconv.Int(req.Status)) + } + if req.DictType != "" { + m = m.Where(dao.SysDictData.Columns().DictType+" = ?", req.DictType) + } + res.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取字典数据失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + res.CurrentPage = req.PageNum + } + if req.PageSize == 0 { + req.PageSize = systemConsts.PageSize + } + err = m.Page(req.PageNum, req.PageSize).Order(dao.SysDictData.Columns().DictSort + " asc," + + dao.SysDictData.Columns().DictCode + " asc").Scan(&res.List) + liberr.ErrIsNil(ctx, err, "获取字典数据失败") + }) + return +} + +func (s *sSysDictData) Add(ctx context.Context, req *system.DictDataAddReq, userId uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysDictData.Ctx(ctx).Insert(do.SysDictData{ + DictSort: req.DictSort, + DictLabel: req.DictLabel, + DictValue: req.DictValue, + DictType: req.DictType, + CssClass: req.CssClass, + ListClass: req.ListClass, + IsDefault: req.IsDefault, + Status: req.Status, + CreateBy: userId, + Remark: req.Remark, + }) + liberr.ErrIsNil(ctx, err, "添加字典数据失败") + //清除缓存 + service.Cache().RemoveByTag(ctx, consts.CacheSysDictTag) + }) + return +} + +// Get 获取字典数据 +func (s *sSysDictData) Get(ctx context.Context, dictCode uint) (res *system.DictDataGetRes, err error) { + res = new(system.DictDataGetRes) + err = g.Try(ctx, func(ctx context.Context) { + err = dao.SysDictData.Ctx(ctx).WherePri(dictCode).Scan(&res.Dict) + liberr.ErrIsNil(ctx, err, "获取字典数据失败") + }) + return +} + +// Edit 修改字典数据 +func (s *sSysDictData) Edit(ctx context.Context, req *system.DictDataEditReq, userId uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysDictData.Ctx(ctx).WherePri(req.DictCode).Update(do.SysDictData{ + DictSort: req.DictSort, + DictLabel: req.DictLabel, + DictValue: req.DictValue, + DictType: req.DictType, + CssClass: req.CssClass, + ListClass: req.ListClass, + IsDefault: req.IsDefault, + Status: req.Status, + UpdateBy: userId, + Remark: req.Remark, + }) + liberr.ErrIsNil(ctx, err, "修改字典数据失败") + //清除缓存 + service.Cache().RemoveByTag(ctx, consts.CacheSysDictTag) + }) + return +} + +// Delete 删除字典数据 +func (s *sSysDictData) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysDictData.Ctx(ctx).Where(dao.SysDictData.Columns().DictCode+" in(?)", ids).Delete() + liberr.ErrIsNil(ctx, err, "删除字典数据失败") + //清除缓存 + service.Cache().RemoveByTag(ctx, consts.CacheSysDictTag) + }) + return +} diff --git a/internal/app/common/logic/sysDictType/sys_dict_type.go b/internal/app/common/logic/sysDictType/sys_dict_type.go new file mode 100644 index 0000000..9657106 --- /dev/null +++ b/internal/app/common/logic/sysDictType/sys_dict_type.go @@ -0,0 +1,186 @@ +/* +* @desc:字典类型管理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/9/28 9:26 + */ + +package sysDictType + +import ( + "context" + "github.com/gogf/gf/v2/container/garray" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/common/consts" + "github.com/tiger1103/gfast/v3/internal/app/common/dao" + "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/common/model/do" + "github.com/tiger1103/gfast/v3/internal/app/common/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/common/service" + systemConsts "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterSysDictType(New()) +} + +func New() *sSysDictType { + return &sSysDictType{} +} + +type sSysDictType struct { +} + +// List 字典类型列表 +func (s *sSysDictType) List(ctx context.Context, req *system.DictTypeSearchReq) (res *system.DictTypeSearchRes, err error) { + res = new(system.DictTypeSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SysDictType.Ctx(ctx) + if req.DictName != "" { + m = m.Where(dao.SysDictType.Columns().DictName+" like ?", "%"+req.DictName+"%") + } + if req.DictType != "" { + m = m.Where(dao.SysDictType.Columns().DictType+" like ?", "%"+req.DictType+"%") + } + if req.Status != "" { + m = m.Where(dao.SysDictType.Columns().Status+" = ", gconv.Int(req.Status)) + } + res.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取字典类型失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + res.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = systemConsts.PageSize + } + err = m.Fields(model.SysDictTypeInfoRes{}).Page(req.PageNum, req.PageSize). + Order(dao.SysDictType.Columns().DictId + " asc").Scan(&res.DictTypeList) + liberr.ErrIsNil(ctx, err, "获取字典类型失败") + }) + return +} + +// Add 添加字典类型 +func (s *sSysDictType) Add(ctx context.Context, req *system.DictTypeAddReq, userId uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = s.ExistsDictType(ctx, req.DictType) + liberr.ErrIsNil(ctx, err) + _, err = dao.SysDictType.Ctx(ctx).Insert(do.SysDictType{ + DictName: req.DictName, + DictType: req.DictType, + Status: req.Status, + CreateBy: userId, + Remark: req.Remark, + }) + liberr.ErrIsNil(ctx, err, "添加字典类型失败") + //清除缓存 + service.Cache().RemoveByTag(ctx, consts.CacheSysDictTag) + }) + return +} + +// Edit 修改字典类型 +func (s *sSysDictType) Edit(ctx context.Context, req *system.DictTypeEditReq, userId uint64) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + err = s.ExistsDictType(ctx, req.DictType, req.DictId) + liberr.ErrIsNil(ctx, err) + dictType := (*entity.SysDictType)(nil) + e := dao.SysDictType.Ctx(ctx).Fields(dao.SysDictType.Columns().DictType).WherePri(req.DictId).Scan(&dictType) + liberr.ErrIsNil(ctx, e, "获取字典类型失败") + liberr.ValueIsNil(dictType, "字典类型不存在") + //修改字典类型 + _, e = dao.SysDictType.Ctx(ctx).TX(tx).WherePri(req.DictId).Update(do.SysDictType{ + DictName: req.DictName, + DictType: req.DictType, + Status: req.Status, + UpdateBy: userId, + Remark: req.Remark, + }) + liberr.ErrIsNil(ctx, e, "修改字典类型失败") + //修改字典数据 + _, e = dao.SysDictData.Ctx(ctx).TX(tx).Data(do.SysDictData{DictType: req.DictType}). + Where(dao.SysDictData.Columns().DictType, dictType.DictType).Update() + liberr.ErrIsNil(ctx, e, "修改字典数据失败") + //清除缓存 + service.Cache().RemoveByTag(ctx, consts.CacheSysDictTag) + }) + return err + }) + return +} + +func (s *sSysDictType) Get(ctx context.Context, req *system.DictTypeGetReq) (dictType *entity.SysDictType, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.SysDictType.Ctx(ctx).Where(dao.SysDictType.Columns().DictId, req.DictId).Scan(&dictType) + liberr.ErrIsNil(ctx, err, "获取字典类型失败") + }) + return +} + +// ExistsDictType 检查类型是否已经存在 +func (s *sSysDictType) ExistsDictType(ctx context.Context, dictType string, dictId ...int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SysDictType.Ctx(ctx).Fields(dao.SysDictType.Columns().DictId). + Where(dao.SysDictType.Columns().DictType, dictType) + if len(dictId) > 0 { + m = m.Where(dao.SysDictType.Columns().DictId+" !=? ", dictId[0]) + } + res, e := m.One() + liberr.ErrIsNil(ctx, e, "sql err") + if !res.IsEmpty() { + liberr.ErrIsNil(ctx, gerror.New("字典类型已存在")) + } + }) + return +} + +// Delete 删除字典类型 +func (s *sSysDictType) Delete(ctx context.Context, dictIds []int) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + discs := ([]*entity.SysDictType)(nil) + err = dao.SysDictType.Ctx(ctx).Fields(dao.SysDictType.Columns().DictType). + Where(dao.SysDictType.Columns().DictId+" in (?) ", dictIds).Scan(&discs) + liberr.ErrIsNil(ctx, err, "删除失败") + types := garray.NewStrArray() + for _, dt := range discs { + types.Append(dt.DictType) + } + if types.Len() > 0 { + _, err = dao.SysDictType.Ctx(ctx).TX(tx).Delete(dao.SysDictType.Columns().DictId+" in (?) ", dictIds) + liberr.ErrIsNil(ctx, err, "删除类型失败") + _, err = dao.SysDictData.Ctx(ctx).TX(tx).Delete(dao.SysDictData.Columns().DictType+" in (?) ", types.Slice()) + liberr.ErrIsNil(ctx, err, "删除字典数据失败") + } + //清除缓存 + service.Cache().RemoveByTag(ctx, consts.CacheSysDictTag) + }) + return err + }) + return +} + +// GetAllDictType 获取所有正常状态下的字典类型 +func (s *sSysDictType) GetAllDictType(ctx context.Context) (list []*entity.SysDictType, err error) { + cache := service.Cache() + //从缓存获取 + data := cache.Get(ctx, consts.CacheSysDict+"_dict_type_all") + if !data.IsNil() { + err = data.Structs(&list) + return + } + err = g.Try(ctx, func(ctx context.Context) { + err = dao.SysDictType.Ctx(ctx).Where("status", 1).Order("dict_id ASC").Scan(&list) + liberr.ErrIsNil(ctx, err, "获取字典类型数据出错") + //缓存 + cache.Set(ctx, consts.CacheSysDict+"_dict_type_all", list, 0, consts.CacheSysDictTag) + }) + return +} diff --git a/internal/app/common/logic/upload/upload.go b/internal/app/common/logic/upload/upload.go new file mode 100644 index 0000000..8e5e1c4 --- /dev/null +++ b/internal/app/common/logic/upload/upload.go @@ -0,0 +1,201 @@ +/* +* @desc:上传处理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/9/28 9:37 + */ + +package upload + +import ( + "context" + "errors" + "fmt" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/text/gregex" + "github.com/gogf/gf/v2/text/gstr" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/common/consts" + "github.com/tiger1103/gfast/v3/internal/app/common/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/common/service" + "github.com/tiger1103/gfast/v3/library/upload" +) + +func init() { + service.RegisterUpload(New()) +} + +func New() *sUpload { + return &sUpload{} +} + +type sUpload struct{} + +// UploadFiles 上传多文件 +func (s *sUpload) UploadFiles(ctx context.Context, files []*ghttp.UploadFile, checkFileType string, source int) (result system.UploadMultipleRes, err error) { + for _, item := range files { + f, e := s.UploadFile(ctx, item, checkFileType, source) + if e != nil { + return + } + result = append(result, &f) + } + return +} + +// UploadFile 上传单文件 +func (s *sUpload) UploadFile(ctx context.Context, file *ghttp.UploadFile, checkFileType string, source int) (result system.UploadResponse, err error) { + + // 检查文件类型 + err = s.CheckType(ctx, checkFileType, file) + if err != nil { + return + } + + // 检查文件大小 + err = s.CheckSize(ctx, checkFileType, file) + if err != nil { + return + } + + uploader := upload.GetUploader(upload.UploaderType(source)) + if uploader == nil { + err = errors.New("没有找到上传适配器") + return + } + return uploader.Upload(ctx, file) +} + +// CheckSize 检查上传文件大小 +func (s *sUpload) CheckSize(ctx context.Context, checkFileType string, file *ghttp.UploadFile) (err error) { + + var ( + configSize *entity.SysConfig + ) + + if checkFileType == consts.CheckFileTypeFile { + + //获取上传大小配置 + configSize, err = s.getUpConfig(ctx, consts.FileSizeKey) + if err != nil { + return + } + } else if checkFileType == consts.CheckFileTypeImg { + + //获取上传大小配置 + configSize, err = s.getUpConfig(ctx, consts.ImgSizeKey) + if err != nil { + return + } + } else { + return errors.New(fmt.Sprintf("文件检查类型错误:%s|%s", consts.CheckFileTypeFile, consts.CheckFileTypeImg)) + } + + var rightSize bool + rightSize, err = s.checkSize(configSize.ConfigValue, file.Size) + if err != nil { + return + } + if !rightSize { + err = gerror.New("上传文件超过最大尺寸:" + configSize.ConfigValue) + return + } + return +} + +// CheckType 检查上传文件类型 +func (s *sUpload) CheckType(ctx context.Context, checkFileType string, file *ghttp.UploadFile) (err error) { + + var ( + configType *entity.SysConfig + ) + + if checkFileType == consts.CheckFileTypeFile { + //获取上传类型配置 + configType, err = s.getUpConfig(ctx, consts.FileTypeKey) + if err != nil { + return + } + + } else if checkFileType == consts.CheckFileTypeImg { + //获取上传类型配置 + configType, err = s.getUpConfig(ctx, consts.ImgTypeKey) + if err != nil { + return + } + } else { + return errors.New(fmt.Sprintf("文件检查类型错误:%s|%s", consts.CheckFileTypeFile, consts.CheckFileTypeImg)) + } + + rightType := s.checkFileType(file.Filename, configType.ConfigValue) + if !rightType { + err = gerror.New("上传文件类型错误,只能包含后缀为:" + configType.ConfigValue + "的文件。") + return + } + return +} + +// 获取上传配置 +func (s *sUpload) getUpConfig(ctx context.Context, key string) (config *entity.SysConfig, err error) { + config, err = service.SysConfig().GetConfigByKey(ctx, key) + if err != nil { + return + } + if config == nil { + err = gerror.New("上传文件类型未设置,请在后台配置") + return + } + return +} + +// 判断上传文件类型是否合法 +func (s *sUpload) checkFileType(fileName, typeString string) bool { + suffix := gstr.SubStrRune(fileName, gstr.PosRRune(fileName, ".")+1, gstr.LenRune(fileName)-1) + imageType := gstr.Split(typeString, ",") + rightType := false + for _, v := range imageType { + if gstr.Equal(suffix, v) { + rightType = true + break + } + } + return rightType +} + +// 检查文件大小是否合法 +func (s *sUpload) checkSize(configSize string, fileSize int64) (bool, error) { + match, err := gregex.MatchString(`^([0-9]+)(?i:([a-z]*))$`, configSize) + if err != nil { + return false, err + } + if len(match) == 0 { + err = gerror.New("上传文件大小未设置,请在后台配置,格式为(30M,30k,30MB)") + return false, err + } + var cfSize int64 + switch gstr.ToUpper(match[2]) { + case "MB", "M": + cfSize = gconv.Int64(match[1]) * 1024 * 1024 + case "KB", "K": + cfSize = gconv.Int64(match[1]) * 1024 + case "": + cfSize = gconv.Int64(match[1]) + } + if cfSize == 0 { + err = gerror.New("上传文件大小未设置,请在后台配置,格式为(30M,30k,30MB),最大单位为MB") + return false, err + } + return cfSize >= fileSize, nil +} + +// 静态文件夹目录 +func (s *sUpload) getStaticPath(ctx context.Context) string { + value, _ := g.Cfg().Get(ctx, "server.serverRoot") + if !value.IsEmpty() { + return value.String() + } + return "" +} diff --git a/internal/app/common/model/do/casbin_rule.go b/internal/app/common/model/do/casbin_rule.go new file mode 100644 index 0000000..3e9ec42 --- /dev/null +++ b/internal/app/common/model/do/casbin_rule.go @@ -0,0 +1,21 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" +) + +// CasbinRule is the golang structure of table casbin_rule for DAO operations like Where/Data. +type CasbinRule struct { + g.Meta `orm:"table:casbin_rule, do:true"` + Ptype interface{} // + V0 interface{} // + V1 interface{} // + V2 interface{} // + V3 interface{} // + V4 interface{} // + V5 interface{} // +} diff --git a/internal/app/common/model/do/sys_config.go b/internal/app/common/model/do/sys_config.go new file mode 100644 index 0000000..c8d2aff --- /dev/null +++ b/internal/app/common/model/do/sys_config.go @@ -0,0 +1,25 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. Created at 2022-04-18 21:09:17 +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// SysConfig is the golang structure of table sys_config for DAO operations like Where/Data. +type SysConfig struct { + g.Meta `orm:"table:sys_config, do:true"` + ConfigId interface{} // 参数主键 + ConfigName interface{} // 参数名称 + ConfigKey interface{} // 参数键名 + ConfigValue interface{} // 参数键值 + ConfigType interface{} // 系统内置(Y是 N否) + CreateBy interface{} // 创建者 + UpdateBy interface{} // 更新者 + Remark interface{} // 备注 + CreatedAt *gtime.Time // 创建时间 + UpdatedAt *gtime.Time // 修改时间 +} diff --git a/internal/app/common/model/do/sys_dict_data.go b/internal/app/common/model/do/sys_dict_data.go new file mode 100644 index 0000000..dc355eb --- /dev/null +++ b/internal/app/common/model/do/sys_dict_data.go @@ -0,0 +1,29 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. Created at 2022-04-16 16:32:52 +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// SysDictData is the golang structure of table sys_dict_data for DAO operations like Where/Data. +type SysDictData struct { + g.Meta `orm:"table:sys_dict_data, do:true"` + DictCode interface{} // 字典编码 + DictSort interface{} // 字典排序 + DictLabel interface{} // 字典标签 + DictValue interface{} // 字典键值 + DictType interface{} // 字典类型 + CssClass interface{} // 样式属性(其他样式扩展) + ListClass interface{} // 表格回显样式 + IsDefault interface{} // 是否默认(1是 0否) + Status interface{} // 状态(0正常 1停用) + CreateBy interface{} // 创建者 + UpdateBy interface{} // 更新者 + Remark interface{} // 备注 + CreatedAt *gtime.Time // 创建时间 + UpdatedAt *gtime.Time // 修改时间 +} diff --git a/internal/app/common/model/do/sys_dict_type.go b/internal/app/common/model/do/sys_dict_type.go new file mode 100644 index 0000000..682264d --- /dev/null +++ b/internal/app/common/model/do/sys_dict_type.go @@ -0,0 +1,24 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. Created at 2022-04-16 16:32:52 +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// SysDictType is the golang structure of table sys_dict_type for DAO operations like Where/Data. +type SysDictType struct { + g.Meta `orm:"table:sys_dict_type, do:true"` + DictId interface{} // 字典主键 + DictName interface{} // 字典名称 + DictType interface{} // 字典类型 + Status interface{} // 状态(0正常 1停用) + CreateBy interface{} // 创建者 + UpdateBy interface{} // 更新者 + Remark interface{} // 备注 + CreatedAt *gtime.Time // 创建日期 + UpdatedAt *gtime.Time // 修改日期 +} diff --git a/internal/app/common/model/entity/casbin_rule.go b/internal/app/common/model/entity/casbin_rule.go new file mode 100644 index 0000000..99ad458 --- /dev/null +++ b/internal/app/common/model/entity/casbin_rule.go @@ -0,0 +1,16 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +// CasbinRule is the golang structure for table casbin_rule. +type CasbinRule struct { + Ptype string `json:"ptype" description:""` + V0 string `json:"v0" description:""` + V1 string `json:"v1" description:""` + V2 string `json:"v2" description:""` + V3 string `json:"v3" description:""` + V4 string `json:"v4" description:""` + V5 string `json:"v5" description:""` +} diff --git a/internal/app/common/model/entity/sys_config.go b/internal/app/common/model/entity/sys_config.go new file mode 100644 index 0000000..cb3e446 --- /dev/null +++ b/internal/app/common/model/entity/sys_config.go @@ -0,0 +1,23 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. Created at 2022-04-18 21:09:17 +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// SysConfig is the golang structure for table sys_config. +type SysConfig struct { + ConfigId uint `json:"configId" description:"参数主键"` + ConfigName string `json:"configName" description:"参数名称"` + ConfigKey string `json:"configKey" description:"参数键名"` + ConfigValue string `json:"configValue" description:"参数键值"` + ConfigType int `json:"configType" description:"系统内置(Y是 N否)"` + CreateBy uint `json:"createBy" description:"创建者"` + UpdateBy uint `json:"updateBy" description:"更新者"` + Remark string `json:"remark" description:"备注"` + CreatedAt *gtime.Time `json:"createdAt" description:"创建时间"` + UpdatedAt *gtime.Time `json:"updatedAt" description:"修改时间"` +} diff --git a/internal/app/common/model/entity/sys_dict_data.go b/internal/app/common/model/entity/sys_dict_data.go new file mode 100644 index 0000000..e1ebfa1 --- /dev/null +++ b/internal/app/common/model/entity/sys_dict_data.go @@ -0,0 +1,27 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. Created at 2022-04-16 16:32:52 +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// SysDictData is the golang structure for table sys_dict_data. +type SysDictData struct { + DictCode int64 `json:"dictCode" description:"字典编码"` + DictSort int `json:"dictSort" description:"字典排序"` + DictLabel string `json:"dictLabel" description:"字典标签"` + DictValue string `json:"dictValue" description:"字典键值"` + DictType string `json:"dictType" description:"字典类型"` + CssClass string `json:"cssClass" description:"样式属性(其他样式扩展)"` + ListClass string `json:"listClass" description:"表格回显样式"` + IsDefault int `json:"isDefault" description:"是否默认(1是 0否)"` + Status int `json:"status" description:"状态(0正常 1停用)"` + CreateBy uint64 `json:"createBy" description:"创建者"` + UpdateBy uint64 `json:"updateBy" description:"更新者"` + Remark string `json:"remark" description:"备注"` + CreatedAt *gtime.Time `json:"createdAt" description:"创建时间"` + UpdatedAt *gtime.Time `json:"updatedAt" description:"修改时间"` +} diff --git a/internal/app/common/model/entity/sys_dict_type.go b/internal/app/common/model/entity/sys_dict_type.go new file mode 100644 index 0000000..142d2f8 --- /dev/null +++ b/internal/app/common/model/entity/sys_dict_type.go @@ -0,0 +1,22 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. Created at 2022-04-16 16:32:52 +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// SysDictType is the golang structure for table sys_dict_type. +type SysDictType struct { + DictId uint64 `json:"dictId" description:"字典主键"` + DictName string `json:"dictName" description:"字典名称"` + DictType string `json:"dictType" description:"字典类型"` + Status uint `json:"status" description:"状态(0正常 1停用)"` + CreateBy uint `json:"createBy" description:"创建者"` + UpdateBy uint `json:"updateBy" description:"更新者"` + Remark string `json:"remark" description:"备注"` + CreatedAt *gtime.Time `json:"createdAt" description:"创建日期"` + UpdatedAt *gtime.Time `json:"updatedAt" description:"修改日期"` +} diff --git a/internal/app/common/model/sys_config.go b/internal/app/common/model/sys_config.go new file mode 100644 index 0000000..737fb8f --- /dev/null +++ b/internal/app/common/model/sys_config.go @@ -0,0 +1,8 @@ +/* +* @desc:xxxx功能描述 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/18 11:56 + */ + +package model diff --git a/internal/app/common/model/sys_dict_data.go b/internal/app/common/model/sys_dict_data.go new file mode 100644 index 0000000..ce8434c --- /dev/null +++ b/internal/app/common/model/sys_dict_data.go @@ -0,0 +1,21 @@ +/* +* @desc:字典数据 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/18 11:56 + */ + +package model + +type DictTypeRes struct { + DictName string `json:"name"` + Remark string `json:"remark"` +} + +// DictDataRes 字典数据 +type DictDataRes struct { + DictValue string `json:"key"` + DictLabel string `json:"value"` + IsDefault int `json:"isDefault"` + Remark string `json:"remark"` +} diff --git a/internal/app/common/model/sys_dict_type.go b/internal/app/common/model/sys_dict_type.go new file mode 100644 index 0000000..0ff6150 --- /dev/null +++ b/internal/app/common/model/sys_dict_type.go @@ -0,0 +1,19 @@ +/* +* @desc:字典类型 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/18 11:56 + */ + +package model + +import "github.com/gogf/gf/v2/os/gtime" + +type SysDictTypeInfoRes struct { + DictId uint64 `orm:"dict_id,primary" json:"dictId"` // 字典主键 + DictName string `orm:"dict_name" json:"dictName"` // 字典名称 + DictType string `orm:"dict_type,unique" json:"dictType"` // 字典类型 + Status uint `orm:"status" json:"status"` // 状态(0正常 1停用) + Remark string `orm:"remark" json:"remark"` // 备注 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建日期 +} diff --git a/internal/app/common/model/token.go b/internal/app/common/model/token.go new file mode 100644 index 0000000..288e72d --- /dev/null +++ b/internal/app/common/model/token.go @@ -0,0 +1,32 @@ +/* +* @desc:token options +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/8 16:02 + */ + +package model + +import ( + "github.com/gogf/gf/v2/frame/g" +) + +type TokenOptions struct { + // server name + ServerName string `json:"serverName"` + // 缓存key (每创建一个实例CacheKey必须不相同) + CacheKey string `json:"cacheKey"` + // 超时时间 默认10天(秒) + Timeout int64 `json:"timeout"` + // 缓存刷新时间 默认5天(秒) + // 处理携带token的请求时当前时间大于超时时间并小于缓存刷新时间时token将自动刷新即重置token存活时间 + // MaxRefresh值为0时,token将不会自动刷新 + MaxRefresh int64 `json:"maxRefresh"` + // 是否允许多点登录 + MultiLogin bool `json:"multiLogin"` + // Token加密key 32位 + EncryptKey []byte `json:"encryptKey"` + // 拦截排除地址 + ExcludePaths g.SliceStr `json:"excludePaths"` + CacheModel string `json:"cacheModel"` +} diff --git a/internal/app/common/model/upload.go b/internal/app/common/model/upload.go new file mode 100644 index 0000000..65a27e1 --- /dev/null +++ b/internal/app/common/model/upload.go @@ -0,0 +1,15 @@ +/* +* @desc:上传文件model +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/12/6 15:29 + */ + +package model + +type UpFile struct { + Name string `json:"name"` + Url string `json:"url"` + FileType string `json:"fileType"` + Size uint64 `json:"size"` +} diff --git a/internal/app/common/router/router.go b/internal/app/common/router/router.go new file mode 100644 index 0000000..4519158 --- /dev/null +++ b/internal/app/common/router/router.go @@ -0,0 +1,28 @@ +/* +* @desc:后台路由 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/2/18 17:34 + */ + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/common/controller" +) + +var R = new(Router) + +type Router struct{} + +func (router *Router) BindController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/pub", func(group *ghttp.RouterGroup) { + group.Group("/captcha", func(group *ghttp.RouterGroup) { + group.Bind( + controller.Captcha, + ) + }) + }) +} diff --git a/internal/app/common/service/big_upload.go b/internal/app/common/service/big_upload.go new file mode 100644 index 0000000..c246ad2 --- /dev/null +++ b/internal/app/common/service/big_upload.go @@ -0,0 +1,30 @@ +// ================================================================================ +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" +) + +type IBigUpload interface { + Upload(ctx context.Context, req *system.BigUploadReq) (res *system.BigUploadRes, err error) + UploadCheck(ctx context.Context, req *system.BigUploadCheckReq) (res *system.BigUploadCheckRes, err error) + UploadMerge(ctx context.Context, req *system.BigUploadMergeReq) (res *system.BigUploadRes, err error) +} + +var localBigUpload IBigUpload + +func BigUpload() IBigUpload { + if localBigUpload == nil { + panic("implement not found for interface IBigUpload, forgot register?") + } + return localBigUpload +} + +func RegisterBigUpload(i IBigUpload) { + localBigUpload = i +} diff --git a/internal/app/common/service/cache.go b/internal/app/common/service/cache.go new file mode 100644 index 0000000..5580e74 --- /dev/null +++ b/internal/app/common/service/cache.go @@ -0,0 +1,29 @@ +/* +* @desc:缓存处理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/9 11:15 + */ + +package service + +import ( + "github.com/tiger1103/gfast-cache/cache" +) + +type ICache interface { + cache.IGCache +} + +var c ICache + +func Cache() ICache { + if c == nil { + panic("implement not found for interface ICache, forgot register?") + } + return c +} + +func RegisterCache(che ICache) { + c = che +} diff --git a/internal/app/common/service/captcha.go b/internal/app/common/service/captcha.go new file mode 100644 index 0000000..c5227de --- /dev/null +++ b/internal/app/common/service/captcha.go @@ -0,0 +1,28 @@ +// ================================================================================ +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" +) + +type ICaptcha interface { + GetVerifyImgString(ctx context.Context) (idKeyC string, base64stringC string, err error) + VerifyString(id, answer string) bool +} + +var localCaptcha ICaptcha + +func Captcha() ICaptcha { + if localCaptcha == nil { + panic("implement not found for interface ICaptcha, forgot register?") + } + return localCaptcha +} + +func RegisterCaptcha(i ICaptcha) { + localCaptcha = i +} diff --git a/internal/app/common/service/casbin.go b/internal/app/common/service/casbin.go new file mode 100644 index 0000000..7f2008c --- /dev/null +++ b/internal/app/common/service/casbin.go @@ -0,0 +1,218 @@ +package service + +import ( + "context" + + "github.com/casbin/casbin/v2" + "github.com/casbin/casbin/v2/model" + "github.com/casbin/casbin/v2/persist" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/internal/app/common/dao" + "github.com/tiger1103/gfast/v3/internal/app/common/model/entity" +) + +type cabinImpl struct{} + +type adapterCasbin struct { + Enforcer *casbin.SyncedEnforcer + EnforcerErr error + ctx context.Context +} + +var ( + cb = cabinImpl{} + ac *adapterCasbin +) + +// CasbinEnforcer 获取adapter单例对象 +func CasbinEnforcer(ctx context.Context) (enforcer *casbin.SyncedEnforcer, err error) { + ac = cb.newAdapter(ctx) + enforcer = ac.Enforcer + err = ac.EnforcerErr + return +} + +// 初始化adapter操作 +func (s *cabinImpl) newAdapter(ctx context.Context) (a *adapterCasbin) { + a = new(adapterCasbin) + a.initPolicy(ctx) + a.ctx = ctx + return +} + +func (a *adapterCasbin) initPolicy(ctx context.Context) { + // Because the DB is empty at first, + // so we need to load the policy from the file adapter (.CSV) first. + e, err := casbin.NewSyncedEnforcer(g.Cfg().MustGet(ctx, "casbin.modelFile").String(), a) + if err != nil { + a.EnforcerErr = err + return + } + a.Enforcer = e +} + +// SavePolicy saves policy to database. +func (a *adapterCasbin) SavePolicy(model model.Model) (err error) { + err = a.dropTable() + if err != nil { + return + } + err = a.createTable() + if err != nil { + return + } + for ptype, ast := range model["p"] { + for _, rule := range ast.Policy { + line := savePolicyLine(ptype, rule) + _, err := dao.CasbinRule.Ctx(a.ctx).Data(line).Insert() + if err != nil { + return err + } + } + } + + for ptype, ast := range model["g"] { + for _, rule := range ast.Policy { + line := savePolicyLine(ptype, rule) + _, err := dao.CasbinRule.Ctx(a.ctx).Data(line).Insert() + if err != nil { + return err + } + } + } + return +} + +func (a *adapterCasbin) dropTable() (err error) { + return +} + +func (a *adapterCasbin) createTable() (err error) { + return +} + +// LoadPolicy loads policy from database. +func (a *adapterCasbin) LoadPolicy(model model.Model) error { + var lines []*entity.CasbinRule + if err := dao.CasbinRule.Ctx(a.ctx).Scan(&lines); err != nil { + return err + } + for _, line := range lines { + loadPolicyLine(line, model) + } + return nil +} + +// AddPolicy adds a policy rule to the storage. +func (a *adapterCasbin) AddPolicy(sec string, ptype string, rule []string) error { + line := savePolicyLine(ptype, rule) + _, err := dao.CasbinRule.Ctx(a.ctx).Data(line).Insert() + return err +} + +// RemovePolicy removes a policy rule from the storage. +func (a *adapterCasbin) RemovePolicy(sec string, ptype string, rule []string) error { + line := savePolicyLine(ptype, rule) + err := rawDelete(a, line) + return err +} + +// RemoveFilteredPolicy removes policy rules that match the filter from the storage. +func (a *adapterCasbin) RemoveFilteredPolicy(sec string, ptype string, + fieldIndex int, fieldValues ...string, +) error { + line := &entity.CasbinRule{} + line.Ptype = ptype + if fieldIndex <= 0 && 0 < fieldIndex+len(fieldValues) { + line.V0 = fieldValues[0-fieldIndex] + } + if fieldIndex <= 1 && 1 < fieldIndex+len(fieldValues) { + line.V1 = fieldValues[1-fieldIndex] + } + if fieldIndex <= 2 && 2 < fieldIndex+len(fieldValues) { + line.V2 = fieldValues[2-fieldIndex] + } + if fieldIndex <= 3 && 3 < fieldIndex+len(fieldValues) { + line.V3 = fieldValues[3-fieldIndex] + } + if fieldIndex <= 4 && 4 < fieldIndex+len(fieldValues) { + line.V4 = fieldValues[4-fieldIndex] + } + if fieldIndex <= 5 && 5 < fieldIndex+len(fieldValues) { + line.V5 = fieldValues[5-fieldIndex] + } + err := rawDelete(a, line) + return err +} + +func loadPolicyLine(line *entity.CasbinRule, model model.Model) { + lineText := line.Ptype + if line.V0 != "" { + lineText += ", " + line.V0 + } + if line.V1 != "" { + lineText += ", " + line.V1 + } + if line.V2 != "" { + lineText += ", " + line.V2 + } + if line.V3 != "" { + lineText += ", " + line.V3 + } + if line.V4 != "" { + lineText += ", " + line.V4 + } + if line.V5 != "" { + lineText += ", " + line.V5 + } + + persist.LoadPolicyLine(lineText, model) +} + +func savePolicyLine(ptype string, rule []string) *entity.CasbinRule { + line := &entity.CasbinRule{} + line.Ptype = ptype + if len(rule) > 0 { + line.V0 = rule[0] + } + if len(rule) > 1 { + line.V1 = rule[1] + } + if len(rule) > 2 { + line.V2 = rule[2] + } + if len(rule) > 3 { + line.V3 = rule[3] + } + if len(rule) > 4 { + line.V4 = rule[4] + } + if len(rule) > 5 { + line.V5 = rule[5] + } + return line +} + +func rawDelete(a *adapterCasbin, line *entity.CasbinRule) error { + db := dao.CasbinRule.Ctx(a.ctx).Where("ptype = ?", line.Ptype) + if line.V0 != "" { + db = db.Where("v0 = ?", line.V0) + } + if line.V1 != "" { + db = db.Where("v1 = ?", line.V1) + } + if line.V2 != "" { + db = db.Where("v2 = ?", line.V2) + } + if line.V3 != "" { + db = db.Where("v3 = ?", line.V3) + } + if line.V4 != "" { + db = db.Where("v4 = ?", line.V4) + } + if line.V5 != "" { + db = db.Where("v5 = ?", line.V5) + } + _, err := db.Delete() + return err +} diff --git a/internal/app/common/service/middleware.go b/internal/app/common/service/middleware.go new file mode 100644 index 0000000..da88600 --- /dev/null +++ b/internal/app/common/service/middleware.go @@ -0,0 +1,27 @@ +// ================================================================================ +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "github.com/gogf/gf/v2/net/ghttp" +) + +type IMiddleware interface { + MiddlewareCORS(r *ghttp.Request) +} + +var localMiddleware IMiddleware + +func Middleware() IMiddleware { + if localMiddleware == nil { + panic("implement not found for interface IMiddleware, forgot register?") + } + return localMiddleware +} + +func RegisterMiddleware(i IMiddleware) { + localMiddleware = i +} diff --git a/internal/app/common/service/sys_config.go b/internal/app/common/service/sys_config.go new file mode 100644 index 0000000..5154005 --- /dev/null +++ b/internal/app/common/service/sys_config.go @@ -0,0 +1,37 @@ +// ================================================================================ +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/common/model/entity" +) + +type ISysConfig interface { + List(ctx context.Context, req *system.ConfigSearchReq) (res *system.ConfigSearchRes, err error) + Add(ctx context.Context, req *system.ConfigAddReq, userId uint64) (err error) + CheckConfigKeyUnique(ctx context.Context, configKey string, configId ...int64) (err error) + Get(ctx context.Context, id int) (res *system.ConfigGetRes, err error) + Edit(ctx context.Context, req *system.ConfigEditReq, userId uint64) (err error) + Delete(ctx context.Context, ids []int) (err error) + GetConfigByKey(ctx context.Context, key string) (config *entity.SysConfig, err error) + GetByKey(ctx context.Context, key string) (config *entity.SysConfig, err error) +} + +var localSysConfig ISysConfig + +func SysConfig() ISysConfig { + if localSysConfig == nil { + panic("implement not found for interface ISysConfig, forgot register?") + } + return localSysConfig +} + +func RegisterSysConfig(i ISysConfig) { + localSysConfig = i +} diff --git a/internal/app/common/service/sys_dict_data.go b/internal/app/common/service/sys_dict_data.go new file mode 100644 index 0000000..76eb180 --- /dev/null +++ b/internal/app/common/service/sys_dict_data.go @@ -0,0 +1,34 @@ +// ================================================================================ +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" +) + +type ISysDictData interface { + GetDictWithDataByType(ctx context.Context, req *system.GetDictReq) (dict *system.GetDictRes, err error) + List(ctx context.Context, req *system.DictDataSearchReq) (res *system.DictDataSearchRes, err error) + Add(ctx context.Context, req *system.DictDataAddReq, userId uint64) (err error) + Get(ctx context.Context, dictCode uint) (res *system.DictDataGetRes, err error) + Edit(ctx context.Context, req *system.DictDataEditReq, userId uint64) (err error) + Delete(ctx context.Context, ids []int) (err error) +} + +var localSysDictData ISysDictData + +func SysDictData() ISysDictData { + if localSysDictData == nil { + panic("implement not found for interface ISysDictData, forgot register?") + } + return localSysDictData +} + +func RegisterSysDictData(i ISysDictData) { + localSysDictData = i +} diff --git a/internal/app/common/service/sys_dict_type.go b/internal/app/common/service/sys_dict_type.go new file mode 100644 index 0000000..ed905e3 --- /dev/null +++ b/internal/app/common/service/sys_dict_type.go @@ -0,0 +1,36 @@ +// ================================================================================ +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/common/model/entity" +) + +type ISysDictType interface { + List(ctx context.Context, req *system.DictTypeSearchReq) (res *system.DictTypeSearchRes, err error) + Add(ctx context.Context, req *system.DictTypeAddReq, userId uint64) (err error) + Edit(ctx context.Context, req *system.DictTypeEditReq, userId uint64) (err error) + Get(ctx context.Context, req *system.DictTypeGetReq) (dictType *entity.SysDictType, err error) + ExistsDictType(ctx context.Context, dictType string, dictId ...int64) (err error) + Delete(ctx context.Context, dictIds []int) (err error) + GetAllDictType(ctx context.Context) (list []*entity.SysDictType, err error) +} + +var localSysDictType ISysDictType + +func SysDictType() ISysDictType { + if localSysDictType == nil { + panic("implement not found for interface ISysDictType, forgot register?") + } + return localSysDictType +} + +func RegisterSysDictType(i ISysDictType) { + localSysDictType = i +} diff --git a/internal/app/common/service/upload.go b/internal/app/common/service/upload.go new file mode 100644 index 0000000..ac17829 --- /dev/null +++ b/internal/app/common/service/upload.go @@ -0,0 +1,33 @@ +// ================================================================================ +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + + "github.com/gogf/gf/v2/net/ghttp" +) + +type IUpload interface { + UploadFiles(ctx context.Context, files []*ghttp.UploadFile, checkFileType string, source int) (result system.UploadMultipleRes, err error) + UploadFile(ctx context.Context, file *ghttp.UploadFile, checkFileType string, source int) (result system.UploadResponse, err error) + CheckSize(ctx context.Context, checkFileType string, file *ghttp.UploadFile) (err error) + CheckType(ctx context.Context, checkFileType string, file *ghttp.UploadFile) (err error) +} + +var localUpload IUpload + +func Upload() IUpload { + if localUpload == nil { + panic("implement not found for interface IUpload, forgot register?") + } + return localUpload +} + +func RegisterUpload(i IUpload) { + localUpload = i +} diff --git a/internal/app/system/consts/cache.go b/internal/app/system/consts/cache.go new file mode 100644 index 0000000..7bc5ea4 --- /dev/null +++ b/internal/app/system/consts/cache.go @@ -0,0 +1,29 @@ +/* +* @desc:缓存键 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/9 12:06 + */ + +package consts + +const ( + // CacheSysAuthMenu 缓存菜单key + CacheSysAuthMenu = "sysAuthMenu" + // CacheSysDept 缓存部门key + CacheSysDept = "sysDept" + + // CacheSysRole 角色缓存key + CacheSysRole = "sysRole" + // CacheSysWebSet 站点配置缓存key + CacheSysWebSet = "sysWebSet" + // CacheSysCmsMenu cms缓存key + CacheSysCmsMenu = "sysCmsMenu" + + // CacheSysAuthTag 权限缓存TAG标签 + CacheSysAuthTag = "sysAuthTag" + // CacheSysModelTag 模型缓存标签 + CacheSysModelTag = "sysModelTag" + // CacheSysCmsTag cms缓存标签 + CacheSysCmsTag = "sysCmsTag" +) diff --git a/internal/app/system/consts/consts.go b/internal/app/system/consts/consts.go new file mode 100644 index 0000000..c0c0da5 --- /dev/null +++ b/internal/app/system/consts/consts.go @@ -0,0 +1,5 @@ +package consts + +const ( + PageSize = 10 //分页长度 +) diff --git a/internal/app/system/consts/context.go b/internal/app/system/consts/context.go new file mode 100644 index 0000000..827c13e --- /dev/null +++ b/internal/app/system/consts/context.go @@ -0,0 +1,13 @@ +/* +* @desc:context 相关常量 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/16 14:52 + */ + +package consts + +const ( + // CtxKey 上下文变量存储键名,前后端系统共享 + CtxKey = "GFastContext" +) diff --git a/internal/app/system/controller/app_menus.go b/internal/app/system/controller/app_menus.go new file mode 100644 index 0000000..f8fa426 --- /dev/null +++ b/internal/app/system/controller/app_menus.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-05-28 15:09:13 +// 生成路径: internal/app/system/controller/app_menus.go +// 生成人:gfast +// desc:app菜单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type appMenusController struct { + BaseController +} + +var AppMenus = new(appMenusController) + +// List 列表 +func (c *appMenusController) List(ctx context.Context, req *system.AppMenusSearchReq) (res *system.AppMenusSearchRes, err error) { + res, err = service.AppMenus().List(ctx, req) + return +} + +// Get 获取app菜单 +func (c *appMenusController) Get(ctx context.Context, req *system.AppMenusGetReq) (res *system.AppMenusGetRes, err error) { + res = new(system.AppMenusGetRes) + res.AppMenusInfoRes, err = service.AppMenus().GetByMenuId(ctx, req.MenuId) + return +} + +// Add 添加app菜单 +func (c *appMenusController) Add(ctx context.Context, req *system.AppMenusAddReq) (res *system.AppMenusAddRes, err error) { + err = service.AppMenus().Add(ctx, req) + return +} + +// Edit 修改app菜单 +func (c *appMenusController) Edit(ctx context.Context, req *system.AppMenusEditReq) (res *system.AppMenusEditRes, err error) { + err = service.AppMenus().Edit(ctx, req) + return +} + +// Delete 删除app菜单 +func (c *appMenusController) Delete(ctx context.Context, req *system.AppMenusDeleteReq) (res *system.AppMenusDeleteRes, err error) { + err = service.AppMenus().Delete(ctx, req.MenuIds) + return +} diff --git a/internal/app/system/controller/app_role_menus.go b/internal/app/system/controller/app_role_menus.go new file mode 100644 index 0000000..84699d9 --- /dev/null +++ b/internal/app/system/controller/app_role_menus.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-05-28 15:11:15 +// 生成路径: internal/app/system/controller/app_role_menus.go +// 生成人:gfast +// desc:app角色绑定菜单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type appRoleMenusController struct { + BaseController +} + +var AppRoleMenus = new(appRoleMenusController) + +// List 列表 +func (c *appRoleMenusController) List(ctx context.Context, req *system.AppRoleMenusSearchReq) (res *system.AppRoleMenusSearchRes, err error) { + res, err = service.AppRoleMenus().List(ctx, req) + return +} + +// Get 获取app角色绑定菜单 +func (c *appRoleMenusController) Get(ctx context.Context, req *system.AppRoleMenusGetReq) (res *system.AppRoleMenusGetRes, err error) { + res = new(system.AppRoleMenusGetRes) + res.AppRoleMenusInfoRes, err = service.AppRoleMenus().GetById(ctx, req.Id) + return +} + +// Add 添加app角色绑定菜单 +func (c *appRoleMenusController) Add(ctx context.Context, req *system.AppRoleMenusAddReq) (res *system.AppRoleMenusAddRes, err error) { + err = service.AppRoleMenus().Add(ctx, req) + return +} + +// Edit 修改app角色绑定菜单 +func (c *appRoleMenusController) Edit(ctx context.Context, req *system.AppRoleMenusEditReq) (res *system.AppRoleMenusEditRes, err error) { + err = service.AppRoleMenus().Edit(ctx, req) + return +} + +// Delete 删除app角色绑定菜单 +func (c *appRoleMenusController) Delete(ctx context.Context, req *system.AppRoleMenusDeleteReq) (res *system.AppRoleMenusDeleteRes, err error) { + err = service.AppRoleMenus().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/app_roles.go b/internal/app/system/controller/app_roles.go new file mode 100644 index 0000000..4b37e3b --- /dev/null +++ b/internal/app/system/controller/app_roles.go @@ -0,0 +1,117 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-05-28 15:11:36 +// 生成路径: internal/app/system/controller/app_roles.go +// 生成人:gfast +// desc:app角色 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "database/sql" + "errors" + + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +type appRolesController struct { + BaseController +} + +var AppRoles = new(appRolesController) + +// List 列表 +func (c *appRolesController) List(ctx context.Context, req *system.AppRolesSearchReq) (res *system.AppRolesSearchRes, err error) { + res, err = service.AppRoles().List(ctx, req) + return +} + +// Get 获取app角色 +func (c *appRolesController) Get(ctx context.Context, req *system.AppRolesGetReq) (res *system.AppRolesGetRes, err error) { + res = new(system.AppRolesGetRes) + res.AppRolesInfoRes, err = service.AppRoles().GetByRoleId(ctx, req.RoleId) + return +} + +// Add 添加app角色 +func (c *appRolesController) Add(ctx context.Context, req *system.AppRolesAddReq) (res *system.AppRolesAddRes, err error) { + err = service.AppRoles().Add(ctx, req) + return +} + +// Edit 修改app角色 +func (c *appRolesController) Edit(ctx context.Context, req *system.AppRolesEditReq) (res *system.AppRolesEditRes, err error) { + err = service.AppRoles().Edit(ctx, req) + return +} + +// Delete 删除app角色 +func (c *appRolesController) Delete(ctx context.Context, req *system.AppRolesDeleteReq) (res *system.AppRolesDeleteRes, err error) { + err = service.AppRoles().Delete(ctx, req.RoleIds) + return +} + +// AddMenu 添加角色时绑定菜单 +func (c *appRolesController) AddMenu(ctx context.Context, req *system.AppRolesAddMenuReq) (*system.AppRolesAddMenuRes, error) { + err := g.Try(ctx, func(ctx context.Context) { + var roleID uint + + // 判断角色名是否存在 + var appRoles entity.AppRoles + if err := dao.AppRoles.Ctx(ctx).Where(dao.AppRoles.Columns().RoleName, req.RoleName).Scan(&appRoles); errors.Is(err, sql.ErrNoRows) { + roleId, err := dao.AppRoles.Ctx(ctx).Data(do.AppRoles{ + RoleName: req.RoleName, + }).InsertAndGetId() + liberr.ErrIsNil(ctx, err, "添加角色失败") + roleID = uint(roleId) + } else { + roleID = appRoles.RoleId + } + + if len(req.MenuIds) > 0 { + insertData := make([]do.AppRoleMenus, 0, len(req.MenuIds)) + for _, menuId := range req.MenuIds { + insertData = append(insertData, do.AppRoleMenus{ + RoleId: roleID, + MenuId: menuId, + }) + } + + // 删除原有的角色菜单 + _, err := dao.AppRoleMenus.Ctx(ctx).Where("role_id", roleID).Delete() + liberr.ErrIsNil(ctx, err, "删除角色菜单失败") + _, err = dao.AppRoleMenus.Ctx(ctx).Where("role_id", roleID).Data(insertData).Insert() + liberr.ErrIsNil(ctx, err, "添加角色菜单失败") + } + }) + + return &system.AppRolesAddMenuRes{}, err +} + +// 获取一个角色的菜单 +func (c *appRolesController) GetRoleMenus(ctx context.Context, req *system.AppRolesGetMenuReq) (*system.AppRolesGetMenuRes, error) { + res := new(system.AppRolesGetMenuRes) + err := g.Try(ctx, func(ctx context.Context) { + err := dao.AppRoles.Ctx(ctx).WithAll().Where(dao.AppRoles.Columns().RoleId, req.RoleId).Scan(&res.List) + + // SELECT m.menu_id, m.menu_name + // FROM app_menus m + // JOIN app_role_menus rm ON m.menu_id = rm.menu_id + // WHERE rm.role_id = 3; + + dao.AppMenus.Ctx(ctx).As("m").Fields("m.menu_id, m.menu_name"). + InnerJoin("app_role_menus rm", "m.menu_id = rm.menu_id").Where("rm.role_id", req.RoleId).Scan(&res.List.Menus) + + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return res, err +} diff --git a/internal/app/system/controller/app_user_disable_menus.go b/internal/app/system/controller/app_user_disable_menus.go new file mode 100644 index 0000000..485af51 --- /dev/null +++ b/internal/app/system/controller/app_user_disable_menus.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-05-28 15:11:37 +// 生成路径: internal/app/system/controller/app_user_disable_menus.go +// 生成人:gfast +// desc:app用户禁用菜单关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type appUserDisableMenusController struct { + BaseController +} + +var AppUserDisableMenus = new(appUserDisableMenusController) + +// List 列表 +func (c *appUserDisableMenusController) List(ctx context.Context, req *system.AppUserDisableMenusSearchReq) (res *system.AppUserDisableMenusSearchRes, err error) { + res, err = service.AppUserDisableMenus().List(ctx, req) + return +} + +// Get 获取app用户禁用菜单关联 +func (c *appUserDisableMenusController) Get(ctx context.Context, req *system.AppUserDisableMenusGetReq) (res *system.AppUserDisableMenusGetRes, err error) { + res = new(system.AppUserDisableMenusGetRes) + res.AppUserDisableMenusInfoRes, err = service.AppUserDisableMenus().GetByUserDisabledMenuId(ctx, req.UserDisabledMenuId) + return +} + +// Add 添加app用户禁用菜单关联 +func (c *appUserDisableMenusController) Add(ctx context.Context, req *system.AppUserDisableMenusAddReq) (res *system.AppUserDisableMenusAddRes, err error) { + err = service.AppUserDisableMenus().Add(ctx, req) + return +} + +// Edit 修改app用户禁用菜单关联 +func (c *appUserDisableMenusController) Edit(ctx context.Context, req *system.AppUserDisableMenusEditReq) (res *system.AppUserDisableMenusEditRes, err error) { + err = service.AppUserDisableMenus().Edit(ctx, req) + return +} + +// Delete 删除app用户禁用菜单关联 +func (c *appUserDisableMenusController) Delete(ctx context.Context, req *system.AppUserDisableMenusDeleteReq) (res *system.AppUserDisableMenusDeleteRes, err error) { + err = service.AppUserDisableMenus().Delete(ctx, req.UserDisabledMenuIds) + return +} diff --git a/internal/app/system/controller/app_user_menus.go b/internal/app/system/controller/app_user_menus.go new file mode 100644 index 0000000..d891db0 --- /dev/null +++ b/internal/app/system/controller/app_user_menus.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-05-28 15:11:37 +// 生成路径: internal/app/system/controller/app_user_menus.go +// 生成人:gfast +// desc:app用户菜单关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type appUserMenusController struct { + BaseController +} + +var AppUserMenus = new(appUserMenusController) + +// List 列表 +func (c *appUserMenusController) List(ctx context.Context, req *system.AppUserMenusSearchReq) (res *system.AppUserMenusSearchRes, err error) { + res, err = service.AppUserMenus().List(ctx, req) + return +} + +// Get 获取app用户菜单关联 +func (c *appUserMenusController) Get(ctx context.Context, req *system.AppUserMenusGetReq) (res *system.AppUserMenusGetRes, err error) { + res = new(system.AppUserMenusGetRes) + res.AppUserMenusInfoRes, err = service.AppUserMenus().GetByUserMenuId(ctx, req.UserMenuId) + return +} + +// Add 添加app用户菜单关联 +func (c *appUserMenusController) Add(ctx context.Context, req *system.AppUserMenusAddReq) (res *system.AppUserMenusAddRes, err error) { + err = service.AppUserMenus().Add(ctx, req) + return +} + +// Edit 修改app用户菜单关联 +func (c *appUserMenusController) Edit(ctx context.Context, req *system.AppUserMenusEditReq) (res *system.AppUserMenusEditRes, err error) { + err = service.AppUserMenus().Edit(ctx, req) + return +} + +// Delete 删除app用户菜单关联 +func (c *appUserMenusController) Delete(ctx context.Context, req *system.AppUserMenusDeleteReq) (res *system.AppUserMenusDeleteRes, err error) { + err = service.AppUserMenus().Delete(ctx, req.UserMenuIds) + return +} diff --git a/internal/app/system/controller/app_user_roles.go b/internal/app/system/controller/app_user_roles.go new file mode 100644 index 0000000..8dda508 --- /dev/null +++ b/internal/app/system/controller/app_user_roles.go @@ -0,0 +1,132 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-05-28 15:11:37 +// 生成路径: internal/app/system/controller/app_user_roles.go +// 生成人:gfast +// desc:app用户角色关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type appUserRolesController struct { + BaseController +} + +var AppUserRoles = new(appUserRolesController) + +// List 列表 +func (c *appUserRolesController) List(ctx context.Context, req *system.AppUserRolesSearchReq) (res *system.AppUserRolesSearchRes, err error) { + res, err = service.AppUserRoles().List(ctx, req) + return +} + +// Get 获取app用户角色关联 +func (c *appUserRolesController) Get(ctx context.Context, req *system.AppUserRolesGetReq) (res *system.AppUserRolesGetRes, err error) { + res = new(system.AppUserRolesGetRes) + res.AppUserRolesInfoRes, err = service.AppUserRoles().GetById(ctx, req.Id) + return +} + +// Add 添加app用户角色关联 +func (c *appUserRolesController) Add(ctx context.Context, req *system.AppUserRolesAddReq) (res *system.AppUserRolesAddRes, err error) { + err = service.AppUserRoles().Add(ctx, req) + return +} + +// Edit 修改app用户角色关联 +func (c *appUserRolesController) Edit(ctx context.Context, req *system.AppUserRolesEditReq) (res *system.AppUserRolesEditRes, err error) { + err = service.AppUserRoles().Edit(ctx, req) + return +} + +// Delete 删除app用户角色关联 +func (c *appUserRolesController) Delete(ctx context.Context, req *system.AppUserRolesDeleteReq) (res *system.AppUserRolesDeleteRes, err error) { + err = service.AppUserRoles().Delete(ctx, req.Ids) + return +} + +// BindRole给用户绑定角色 +func (c *appUserRolesController) BindRole(ctx context.Context, req *system.AppUserRolesBindReq) (res *system.AppUserRolesBindRes, err error) { + err = service.AppUserRoles().BindRole(ctx, req) + return +} + +// 获取用户的角色 +func (c *appUserRolesController) GetUserRoles(ctx context.Context, req *system.AppUserRolesGetRolesReq) (*system.AppUserRolesGetRolesRes, error) { + // select ar.role_id,ar.role_name,aur.user_id,aur.major_role + // from app_user_roles aur + // join app_roles ar on aur.role_id = ar.role_id + // where aur.user_id = 112 and aur.major_role in (0,1); + query := dao.AppUserRoles.Ctx(ctx).As("aur"). + InnerJoin("app_roles ar", "aur.role_id = ar.role_id"). + Fields("ar.role_id, ar.role_name, aur.user_id, aur.major_role"). + Where("aur.user_id", req.UserID). + Where("aur.major_role IN (0, 1)") + + var roles []model.Ruler + if err := query.Scan(&roles); err != nil { + return nil, err + } + + roleMap := make(map[int][]model.Ruler) + for _, role := range roles { + roleMap[role.MajorRole] = append(roleMap[role.MajorRole], role) + } + + // 检查是否存在键 0 和 1 + adminRole, adminExists := roleMap[0] + constructionRole, constructionExists := roleMap[1] + + if !adminExists { + adminRole = []model.Ruler{} + } + + if !constructionExists { + constructionRole = []model.Ruler{} + } + + return &system.AppUserRolesGetRolesRes{ + AdminRole: adminRole, + ConstructionRole: constructionRole, + }, nil +} + +// GetRoles 获取用户的角色 +func (c *appUserRolesController) GetRoles(ctx context.Context, req *system.AppUserRolesGetAllRolesReq) (res *system.AppUserRolesGetAllRolesRes, err error) { + // select * from app_rules + var roles []model.AppRoles + if err := dao.AppRoles.Ctx(ctx).Scan(&roles); err != nil { + return nil, err + } + + roleMap := make(map[int][]model.AppRoles) + for _, role := range roles { + roleMap[role.Tag] = append(roleMap[role.Tag], role) + } + + // 检查是否存在键 0 和 1 + adminRole, adminExists := roleMap[0] + if !adminExists { + adminRole = []model.AppRoles{} + } + + constructionRole, constructionExists := roleMap[1] + if !constructionExists { + constructionRole = []model.AppRoles{} + } + + return &system.AppUserRolesGetAllRolesRes{ + AdminRole: adminRole, + ConstructionRole: constructionRole, + }, nil +} diff --git a/internal/app/system/controller/base.go b/internal/app/system/controller/base.go new file mode 100644 index 0000000..5dae69a --- /dev/null +++ b/internal/app/system/controller/base.go @@ -0,0 +1,22 @@ +/* +* @desc:system base controller +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/4 18:12 + */ + +package controller + +import ( + "github.com/gogf/gf/v2/net/ghttp" + commonController "github.com/tiger1103/gfast/v3/internal/app/common/controller" +) + +type BaseController struct { + commonController.BaseController +} + +// Init 自动执行的初始化方法 +func (c *BaseController) Init(r *ghttp.Request) { + c.BaseController.Init(r) +} diff --git a/internal/app/system/controller/big_file.go b/internal/app/system/controller/big_file.go new file mode 100644 index 0000000..d74bb4f --- /dev/null +++ b/internal/app/system/controller/big_file.go @@ -0,0 +1,38 @@ +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type bigFile struct{} + +var BigFile = new(bigFile) + +func (c *bigFile) List(ctx context.Context, req *system.BigFileSearchReq) (res *system.BigFileSearchRes, err error) { + return service.BigFile().List(ctx, req) +} + +// Add 添加系统参数 +func (c *bigFile) Add(ctx context.Context, req *system.BigFileAddReq) (res *system.BigFileAddRes, err error) { + err = service.BigFile().Add(ctx, req, service.Context().GetUserId(ctx)) + return +} + +// Get 获取文件信息 +func (c *bigFile) Get(ctx context.Context, req *system.BigFileGetReq) (res *system.BigFileGetRes, err error) { + return service.BigFile().Get(ctx, req.Id) +} + +// Edit 修改系统参数 +func (c *bigFile) Edit(ctx context.Context, req *system.BigFileEditReq) (res *system.BigFileEditRes, err error) { + err = service.BigFile().Edit(ctx, req, service.Context().GetUserId(ctx)) + return +} + +// Delete 删除系统参数 +func (c *bigFile) Delete(ctx context.Context, req *system.BigFileDeleteReq) (res *system.BigFileDeleteRes, err error) { + err = service.BigFile().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/big_upload.go b/internal/app/system/controller/big_upload.go new file mode 100644 index 0000000..2033b45 --- /dev/null +++ b/internal/app/system/controller/big_upload.go @@ -0,0 +1,46 @@ +package controller + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/common/service" +) + +var BigUpload = new(bigUploadController) + +type bigUploadController struct{} + +// 上传分片文件 +func (c *bigUploadController) Upload(ctx context.Context, req *system.BigUploadReq) (res *system.BigUploadRes, err error) { + r := g.RequestFromCtx(ctx) + req = new(system.BigUploadReq) + err = req.Bind(r.Request) + if err != nil { + return + } + res, err = service.BigUpload().Upload(ctx, req) + return +} + +// 上传文件检查 +func (c *bigUploadController) UploadCheck(ctx context.Context, req *system.BigUploadCheckReq) (res *system.BigUploadCheckRes, err error) { + r := g.RequestFromCtx(ctx) + req = new(system.BigUploadCheckReq) + err = req.Bind(r.Request) + if err != nil { + return + } + return service.BigUpload().UploadCheck(ctx, req) +} + +// 上传文件合并 +func (c *bigUploadController) UploadMerge(ctx context.Context, req *system.BigUploadMergeReq) (res *system.BigUploadRes, err error) { + r := g.RequestFromCtx(ctx) + req = new(system.BigUploadMergeReq) + err = req.Bind(r.Request) + if err != nil { + return + } + return service.BigUpload().UploadMerge(ctx, req) +} diff --git a/internal/app/system/controller/bus_askforleave.go b/internal/app/system/controller/bus_askforleave.go new file mode 100644 index 0000000..536b8c2 --- /dev/null +++ b/internal/app/system/controller/bus_askforleave.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2025-03-27 14:14:25 +// 生成路径: internal/app/wxApplet/controller/bus_askforleave.go +// 生成人:gfast +// desc:请假 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" +) + +type busAskforleaveController struct { + BaseController +} + +var BusAskforleave = new(busAskforleaveController) + +// List 列表 +func (c *busAskforleaveController) List(ctx context.Context, req *wxApplet.BusAskforleaveSearchReq) (res *wxApplet.BusAskforleaveSearchRes, err error) { + res, err = service.BusAskforleave().List(ctx, req) + return +} + +// Get 获取请假 +func (c *busAskforleaveController) Get(ctx context.Context, req *wxApplet.BusAskforleaveGetReq) (res *wxApplet.BusAskforleaveGetRes, err error) { + res = new(wxApplet.BusAskforleaveGetRes) + res.BusAskforleaveInfoRes, err = service.BusAskforleave().GetById(ctx, req.Id) + return +} + +//// Add 添加请假 +//func (c *busAskforleaveController) Add(ctx context.Context, req *wxApplet.BusAskforleaveAddReq) (res *wxApplet.BusAskforleaveAddRes, err error) { +// err = service.BusAskforleave().Add(ctx, req) +// return +//} + +// Edit 修改请假 +func (c *busAskforleaveController) Edit(ctx context.Context, req *wxApplet.BusAskforleaveEditReq) (res *wxApplet.BusAskforleaveEditRes, err error) { + err = service.BusAskforleave().Edit(ctx, req) + return +} + +//// Delete 删除请假 +//func (c *busAskforleaveController) Delete(ctx context.Context, req *wxApplet.BusAskforleaveDeleteReq) (res *wxApplet.BusAskforleaveDeleteRes, err error) { +// err = service.BusAskforleave().Delete(ctx, req.Ids) +// return +//} diff --git a/internal/app/system/controller/bus_attendance_machine.go b/internal/app/system/controller/bus_attendance_machine.go new file mode 100644 index 0000000..5408b29 --- /dev/null +++ b/internal/app/system/controller/bus_attendance_machine.go @@ -0,0 +1,83 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2025-03-03 10:32:47 +// 生成路径: internal/app/system/controller/bus_attendance_machine.go +// 生成人:gfast +// desc:考勤机 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busAttendanceMachineController struct { + BaseController +} + +var BusAttendanceMachine = new(busAttendanceMachineController) + +// List 列表 +func (c *busAttendanceMachineController) List(ctx context.Context, req *system.BusAttendanceMachineSearchReq) (res *system.BusAttendanceMachineSearchRes, err error) { + res, err = service.BusAttendanceMachine().List(ctx, req) + return +} + +// Get 获取考勤机 +func (c *busAttendanceMachineController) Get(ctx context.Context, req *system.BusAttendanceMachineGetReq) (res *system.BusAttendanceMachineGetRes, err error) { + res = new(system.BusAttendanceMachineGetRes) + res.BusAttendanceMachineExtendRes, err = service.BusAttendanceMachine().GetById(ctx, req.Id) + return +} + +// Add 添加考勤机 +func (c *busAttendanceMachineController) Add(ctx context.Context, req *system.BusAttendanceMachineAddReq) (res *system.BusAttendanceMachineAddRes, err error) { + err = service.BusAttendanceMachine().Add(ctx, req) + return +} + +// Edit 修改考勤机 +func (c *busAttendanceMachineController) Edit(ctx context.Context, req *system.BusAttendanceMachineEditReq) (res *system.BusAttendanceMachineEditRes, err error) { + err = service.BusAttendanceMachine().Edit(ctx, req) + return +} + +// Delete 删除考勤机 +func (c *busAttendanceMachineController) Delete(ctx context.Context, req *system.BusAttendanceMachineDeleteReq) (res *system.BusAttendanceMachineDeleteRes, err error) { + err = service.BusAttendanceMachine().Delete(ctx, req.Ids) + return +} + +// Change 变更考勤机状态 +func (c *busAttendanceMachineController) Change(ctx context.Context, req *system.BusAttendanceMachineChangeReq) (res *system.BusAttendanceMachineChangeRes, err error) { + err = service.BusAttendanceMachine().Change(ctx, req) + return +} + +// BindUserInformationToDevicesInBatches 批量将用户信息绑定到设备上 +func (c *busAttendanceMachineController) BindUserInformationToDevicesInBatches(ctx context.Context, req *system.BindUserInformationToDevicesInBatchesReq) (res *system.BindUserInformationToDevicesInBatchesRes, err error) { + err = service.BusAttendanceMachine().BindUserInformationToDevicesInBatches(ctx, req) + return +} + +// DeleteTheUserBoundToTheAttendanceMachineAndDevice 将考勤机和设备绑定的用户删除掉 +func (c *busAttendanceMachineController) DeleteTheUserBoundToTheAttendanceMachineAndDevice(ctx context.Context, req *system.DeleteTheUserBoundToTheAttendanceMachineAndDeviceReq) (res *system.DeleteTheUserBoundToTheAttendanceMachineAndDeviceRes, err error) { + err = service.BusAttendanceMachine().DeleteTheUserBoundToTheAttendanceMachineAndDevice(ctx, req) + return +} + +// SendTheUserInformationToTheAttendanceMachine 将用户信息下发到考勤机上 +func (c *busAttendanceMachineController) SendTheUserInformationToTheAttendanceMachine(ctx context.Context, req *system.SendTheUserInformationToTheAttendanceMachineReq) (res *system.SendTheUserInformationToTheAttendanceMachineRes, err error) { + err = service.BusAttendanceMachine().SendTheUserInformationToTheAttendanceMachine(ctx, req) + return +} + +// ObtainInformationAboutPersonnelAssociatedWithTheAttendanceDevice 获取考勤设备关联的人员信息 +func (c *busAttendanceMachineController) ObtainInformationAboutPersonnelAssociatedWithTheAttendanceDevice(ctx context.Context, req *system.ObtainInformationAboutPersonnelAssociatedWithTheAttendanceDeviceReq) (res *system.ObtainInformationAboutPersonnelAssociatedWithTheAttendanceDeviceRes, err error) { + return service.BusAttendanceMachine().ObtainInformationAboutPersonnelAssociatedWithTheAttendanceDevice(ctx, req) + return +} diff --git a/internal/app/system/controller/bus_attendance_machine_user.go b/internal/app/system/controller/bus_attendance_machine_user.go new file mode 100644 index 0000000..f4a141b --- /dev/null +++ b/internal/app/system/controller/bus_attendance_machine_user.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2025-03-03 10:33:17 +// 生成路径: internal/app/system/controller/bus_attendance_machine_user.go +// 生成人:gfast +// desc:考勤机用户列 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busAttendanceMachineUserController struct { + BaseController +} + +var BusAttendanceMachineUser = new(busAttendanceMachineUserController) + +// List 列表 +func (c *busAttendanceMachineUserController) List(ctx context.Context, req *system.BusAttendanceMachineUserSearchReq) (res *system.BusAttendanceMachineUserSearchRes, err error) { + res, err = service.BusAttendanceMachineUser().List(ctx, req) + return +} + +// Get 获取考勤机用户列 +func (c *busAttendanceMachineUserController) Get(ctx context.Context, req *system.BusAttendanceMachineUserGetReq) (res *system.BusAttendanceMachineUserGetRes, err error) { + res = new(system.BusAttendanceMachineUserGetRes) + res.BusAttendanceMachineUserInfoRes, err = service.BusAttendanceMachineUser().GetById(ctx, req.Id) + return +} + +// Add 添加考勤机用户列 +func (c *busAttendanceMachineUserController) Add(ctx context.Context, req *system.BusAttendanceMachineUserAddReq) (res *system.BusAttendanceMachineUserAddRes, err error) { + err = service.BusAttendanceMachineUser().Add(ctx, req) + return +} + +// Edit 修改考勤机用户列 +func (c *busAttendanceMachineUserController) Edit(ctx context.Context, req *system.BusAttendanceMachineUserEditReq) (res *system.BusAttendanceMachineUserEditRes, err error) { + err = service.BusAttendanceMachineUser().Edit(ctx, req) + return +} + +// Delete 删除考勤机用户列 +func (c *busAttendanceMachineUserController) Delete(ctx context.Context, req *system.BusAttendanceMachineUserDeleteReq) (res *system.BusAttendanceMachineUserDeleteRes, err error) { + err = service.BusAttendanceMachineUser().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/bus_category.go b/internal/app/system/controller/bus_category.go new file mode 100644 index 0000000..1de8577 --- /dev/null +++ b/internal/app/system/controller/bus_category.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-10-07 15:52:19 +// 生成路径: internal/app/system/controller/bus_category.go +// 生成人:gfast +// desc:题库_题库类别 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busCategoryController struct { + BaseController +} + +var BusCategory = new(busCategoryController) + +// List 列表 +func (c *busCategoryController) List(ctx context.Context, req *system.BusCategorySearchReq) (res *system.BusCategorySearchRes, err error) { + res, err = service.BusCategory().List(ctx, req) + return +} + +// Get 获取题库_题库类别 +func (c *busCategoryController) Get(ctx context.Context, req *system.BusCategoryGetReq) (res *system.BusCategoryGetRes, err error) { + res = new(system.BusCategoryGetRes) + res.BusCategoryInfoRes, err = service.BusCategory().GetById(ctx, req.Id) + return +} + +// Add 添加题库_题库类别 +func (c *busCategoryController) Add(ctx context.Context, req *system.BusCategoryAddReq) (res *system.BusCategoryAddRes, err error) { + err = service.BusCategory().Add(ctx, req) + return +} + +// Edit 修改题库_题库类别 +func (c *busCategoryController) Edit(ctx context.Context, req *system.BusCategoryEditReq) (res *system.BusCategoryEditRes, err error) { + err = service.BusCategory().Edit(ctx, req) + return +} + +// Delete 删除题库_题库类别 +func (c *busCategoryController) Delete(ctx context.Context, req *system.BusCategoryDeleteReq) (res *system.BusCategoryDeleteRes, err error) { + err = service.BusCategory().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/bus_company.go b/internal/app/system/controller/bus_company.go new file mode 100644 index 0000000..d163521 --- /dev/null +++ b/internal/app/system/controller/bus_company.go @@ -0,0 +1,60 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-07-28 14:08:14 +// 生成路径: internal/app/system/controller/bus_company.go +// 生成人:gfast +// desc:公司 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busCompanyController struct { + BaseController +} + +var BusCompany = new(busCompanyController) + +// List 列表 +func (c *busCompanyController) List(ctx context.Context, req *system.BusCompanySearchReq) (res *system.BusCompanySearchRes, err error) { + res, err = service.BusCompany().List(ctx, req) + return +} + +// Get 获取公司 +func (c *busCompanyController) Get(ctx context.Context, req *system.BusCompanyGetReq) (res *system.BusCompanyGetRes, err error) { + res = new(system.BusCompanyGetRes) + res.BusCompanyInfoRes, err = service.BusCompany().GetByCompanyId(ctx, req.CompanyId) + return +} + +// Add 添加公司 +func (c *busCompanyController) Add(ctx context.Context, req *system.BusCompanyAddReq) (res *system.BusCompanyAddRes, err error) { + err = service.BusCompany().Add(ctx, req) + return +} + +// Edit 修改公司 +func (c *busCompanyController) Edit(ctx context.Context, req *system.BusCompanyEditReq) (res *system.BusCompanyEditRes, err error) { + err = service.BusCompany().Edit(ctx, req) + return +} + +// Delete 删除公司 +func (c *busCompanyController) Delete(ctx context.Context, req *system.BusCompanyDeleteReq) (res *system.BusCompanyDeleteRes, err error) { + err = service.BusCompany().Delete(ctx, req.CompanyIds) + return +} + +//app + +func (c *busCompanyController) AppList(ctx context.Context, req *system.BusCompanyAppSearchReq) (res *system.BusCompanyAppSearchRes, err error) { + res, err = service.BusCompany().AppList(ctx, req) + return +} diff --git a/internal/app/system/controller/bus_complaint_box.go b/internal/app/system/controller/bus_complaint_box.go new file mode 100644 index 0000000..216e316 --- /dev/null +++ b/internal/app/system/controller/bus_complaint_box.go @@ -0,0 +1,60 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-12-04 18:09:50 +// 生成路径: internal/app/system/controller/bus_complaint_box.go +// 生成人:gfast +// desc:意见箱 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + wxSystem "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busComplaintBoxController struct { + BaseController +} + +var BusComplaintBox = new(busComplaintBoxController) + +// List 列表 +func (c *busComplaintBoxController) List(ctx context.Context, req *system.BusComplaintBoxSearchReq) (res *system.BusComplaintBoxSearchRes, err error) { + res, err = service.BusComplaintBox().List(ctx, req) + return +} + +// Get 获取意见箱 +func (c *busComplaintBoxController) Get(ctx context.Context, req *system.BusComplaintBoxGetReq) (res *system.BusComplaintBoxGetRes, err error) { + res = new(system.BusComplaintBoxGetRes) + res.BusComplaintBoxInfoRes, err = service.BusComplaintBox().GetById(ctx, req.Id) + return +} + +// Edit 修改意见箱 +func (c *busComplaintBoxController) Edit(ctx context.Context, req *system.BusComplaintBoxEditReq) (res *system.BusComplaintBoxEditRes, err error) { + err = service.BusComplaintBox().Edit(ctx, req) + return +} + +// Delete 删除意见箱 +func (c *busComplaintBoxController) Delete(ctx context.Context, req *system.BusComplaintBoxDeleteReq) (res *system.BusComplaintBoxDeleteRes, err error) { + err = service.BusComplaintBox().Delete(ctx, req.Ids) + return +} + +// AppletList 获取当前人的所有意见(根据openid查询) +func (c *busComplaintBoxController) AppletList(ctx context.Context, req *wxSystem.AppletComplaintBoxSearchReq) (res *wxSystem.AppletComplaintBoxSearchRes, err error) { + res, err = service.BusComplaintBox().AppletList(ctx, req) + return +} + +// AppletAdd 添加意见箱 +func (c *busComplaintBoxController) AppletAdd(ctx context.Context, req *wxSystem.AppletComplaintBoxAddReq) (res *wxSystem.AppletComplaintBoxAddRes, err error) { + err = service.BusComplaintBox().AppletAdd(ctx, req) + return +} diff --git a/internal/app/system/controller/bus_construction_blacklist.go b/internal/app/system/controller/bus_construction_blacklist.go new file mode 100644 index 0000000..da1d46b --- /dev/null +++ b/internal/app/system/controller/bus_construction_blacklist.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-11-10 14:08:39 +// 生成路径: internal/app/system/controller/bus_construction_blacklist.go +// 生成人:gfast +// desc:黑名单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busConstructionBlacklistController struct { + BaseController +} + +var BusConstructionBlacklist = new(busConstructionBlacklistController) + +// List 列表 +func (c *busConstructionBlacklistController) List(ctx context.Context, req *system.BusConstructionBlacklistSearchReq) (res *system.BusConstructionBlacklistSearchRes, err error) { + res, err = service.BusConstructionBlacklist().List(ctx, req) + return +} + +// Get 获取黑名单 +func (c *busConstructionBlacklistController) Get(ctx context.Context, req *system.BusConstructionBlacklistGetReq) (res *system.BusConstructionBlacklistGetRes, err error) { + res = new(system.BusConstructionBlacklistGetRes) + res.BusConstructionBlacklistInfoRes, err = service.BusConstructionBlacklist().GetByOpenid(ctx, req.Openid) + return +} + +// Add 添加黑名单 +func (c *busConstructionBlacklistController) Add(ctx context.Context, req *system.BusConstructionBlacklistAddReq) (res *system.BusConstructionBlacklistAddRes, err error) { + err = service.BusConstructionBlacklist().Add(ctx, req) + return +} + +// Delete 删除黑名单 +func (c *busConstructionBlacklistController) Delete(ctx context.Context, req *system.BusConstructionBlacklistDeleteReq) (res *system.BusConstructionBlacklistDeleteRes, err error) { + err = service.BusConstructionBlacklist().Delete(ctx, req.Openids) + return +} + +// BlackListFunc 黑名单人员列表查询 +func (c *busConstructionBlacklistController) BlackListFunc(ctx context.Context, req *system.BlackListReq) (res *system.BlackListRes, err error) { + res, err = service.BusConstructionBlacklist().BlackListFunc(ctx, req) + return +} diff --git a/internal/app/system/controller/bus_construction_log.go b/internal/app/system/controller/bus_construction_log.go new file mode 100644 index 0000000..a967d99 --- /dev/null +++ b/internal/app/system/controller/bus_construction_log.go @@ -0,0 +1,74 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-03-22 16:27:43 +// 生成路径: internal/app/system/controller/bus_construction_log.go +// 生成人:gfast +// desc:施工日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busConstructionLogController struct { + BaseController +} + +var BusConstructionLog = new(busConstructionLogController) + +// ConstructionLogAdd 小程序-新增 +func (c *busConstructionLogController) ConstructionLogAdd(ctx context.Context, req *wxApplet.ConstructionLogAddReq) (res *wxApplet.ConstructionLogAddRes, err error) { + err = service.BusConstructionLog().ConstructionLogAdd(ctx, req) + return +} + +// ConstructionLogDetails 小程序-详情 +func (c *busConstructionLogController) ConstructionLogDetails(ctx context.Context, req *wxApplet.ConstructionLogDetailsReq) (res *wxApplet.ConstructionLogDetailsRes, err error) { + res = new(wxApplet.ConstructionLogDetailsRes) + res, err = service.BusConstructionLog().ConstructionLogDetails(ctx, req) + return +} + +// ConstructionLogList 小程序-列表 +func (c *busConstructionLogController) ConstructionLogList(ctx context.Context, req *wxApplet.ConstructionLogListReq) (res *wxApplet.ConstructionLogListRes, err error) { + res = new(wxApplet.ConstructionLogListRes) + res, err = service.BusConstructionLog().ConstructionLogList(ctx, req) + return +} + +// List 列表 +func (c *busConstructionLogController) List(ctx context.Context, req *system.BusConstructionLogSearchReq) (res *system.BusConstructionLogSearchRes, err error) { + res, err = service.BusConstructionLog().List(ctx, req) + return +} + +// Get 获取施工日志 +func (c *busConstructionLogController) Get(ctx context.Context, req *system.BusConstructionLogGetReq) (res *system.BusConstructionLogGetRes, err error) { + res = new(system.BusConstructionLogGetRes) + res.DataEntity, err = service.BusConstructionLog().GetById(ctx, req.Id) + return +} + +// Add 添加施工日志 +func (c *busConstructionLogController) Add(ctx context.Context, req *system.BusConstructionLogAddReq) (res *system.BusConstructionLogAddRes, err error) { + err = service.BusConstructionLog().Add(ctx, req) + return +} + +// Edit 修改施工日志 +func (c *busConstructionLogController) Edit(ctx context.Context, req *system.BusConstructionLogEditReq) (res *system.BusConstructionLogEditRes, err error) { + err = service.BusConstructionLog().Edit(ctx, req) + return +} + +// Delete 删除施工日志 +func (c *busConstructionLogController) Delete(ctx context.Context, req *system.BusConstructionLogDeleteReq) (res *system.BusConstructionLogDeleteRes, err error) { + err = service.BusConstructionLog().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/bus_construction_project.go b/internal/app/system/controller/bus_construction_project.go new file mode 100644 index 0000000..60ea138 --- /dev/null +++ b/internal/app/system/controller/bus_construction_project.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-07 10:17:50 +// 生成路径: internal/app/system/controller/bus_construction_project.go +// 生成人:gfast +// desc:施工人员对应项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busConstructionProjectController struct { + BaseController +} + +var BusConstructionProject = new(busConstructionProjectController) + +// List 列表 +func (c *busConstructionProjectController) List(ctx context.Context, req *system.BusConstructionProjectSearchReq) (res *system.BusConstructionProjectSearchRes, err error) { + res, err = service.BusConstructionProject().List(ctx, req) + return +} + +// Get 获取施工人员对应项目 +func (c *busConstructionProjectController) Get(ctx context.Context, req *system.BusConstructionProjectGetReq) (res *system.BusConstructionProjectGetRes, err error) { + res = new(system.BusConstructionProjectGetRes) + res.BusConstructionProjectInfoRes, err = service.BusConstructionProject().GetById(ctx, req.Id) + return +} + +// Add 添加施工人员对应项目 +func (c *busConstructionProjectController) Add(ctx context.Context, req *system.BusConstructionProjectAddReq) (res *system.BusConstructionProjectAddRes, err error) { + err = service.BusConstructionProject().Add(ctx, req) + return +} + +// Edit 修改施工人员对应项目 +func (c *busConstructionProjectController) Edit(ctx context.Context, req *system.BusConstructionProjectEditReq) (res *system.BusConstructionProjectEditRes, err error) { + err = service.BusConstructionProject().Edit(ctx, req) + return +} + +// Delete 删除施工人员对应项目 +func (c *busConstructionProjectController) Delete(ctx context.Context, req *system.BusConstructionProjectDeleteReq) (res *system.BusConstructionProjectDeleteRes, err error) { + err = service.BusConstructionProject().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/bus_construction_user.go b/internal/app/system/controller/bus_construction_user.go new file mode 100644 index 0000000..47009fe --- /dev/null +++ b/internal/app/system/controller/bus_construction_user.go @@ -0,0 +1,274 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-07 10:31:18 +// 生成路径: internal/app/system/controller/bus_construction_user.go +// 生成人:gfast +// desc:施工人员 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "encoding/json" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + logic "github.com/tiger1103/gfast/v3/internal/app/system/logic/manageAirline" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + wxModel "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" + "github.com/tiger1103/gfast/v3/library/liberr" + "os" + "strconv" + "strings" +) + +type busConstructionUserController struct { + BaseController +} + +var BusConstructionUser = new(busConstructionUserController) + +// ExportDataFunc 导出施工人员数据查询 +func (c *busConstructionUserController) ExportDataFunc(ctx context.Context, req *system.BusConstructionUserSearchReq) (res *system.BusConstructionUserSearchRes, err error) { + res, err = service.BusConstructionUser().List(ctx, req) + return +} + +// List 列表 +func (c *busConstructionUserController) List(ctx context.Context, req *system.BusConstructionUserSearchReq) (res *system.BusConstructionUserSearchRes, err error) { + res, err = service.BusConstructionUser().List(ctx, req) + return +} + +// Get 获取施工人员 +func (c *busConstructionUserController) Get(ctx context.Context, req *system.BusConstructionUserGetReq) (res *system.BusConstructionUserGetRes, err error) { + res = new(system.BusConstructionUserGetRes) + res.BusConstructionUserInfoRes, err = service.BusConstructionUser().GetById(ctx, req.Id) + return +} + +//// Add 添加施工人员 +//func (c *busConstructionUserController) Add(ctx context.Context, req *system.BusConstructionUserAddReq) (res *system.BusConstructionUserAddRes, err error) { +// err = service.BusConstructionUser().Add(ctx, req) +// return +//} + +// Edit 修改施工人员 +func (c *busConstructionUserController) Edit(ctx context.Context, req *system.BusConstructionUserEditReq) (res *system.BusConstructionUserEditRes, err error) { + err = service.BusConstructionUser().Edit(ctx, req) + return +} + +//// Delete 删除施工人员 +//func (c *busConstructionUserController) Delete(ctx context.Context, req *system.BusConstructionUserDeleteReq) (res *system.BusConstructionUserDeleteRes, err error) { +// err = service.BusConstructionUser().Delete(ctx, req.Ids) +// return +//} + +// BatchImportDataFunc 批量导入施工人员的资料 +func (c *busConstructionUserController) BatchImportDataFunc(ctx context.Context, req *system.BatchImportDataReq) (res *system.BatchImportDataRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + //2、调用java那边的接口,得到文件里面的内容 + rpath := coryCommon.ResourcePublicToFunc("/"+req.File.Url, 2) + cwd := "/" + coryCommon.Ynr(coryCommon.GetCWD()+coryCommon.Helmet) + jsonData, err := logic.ExcelConvert(ctx, rpath, cwd) + //3、根据文件里的内容转成对应的实体类 + var nestedList []map[int]model.ExcelEntity + err = json.Unmarshal([]byte(jsonData), &nestedList) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + //7、删除文件 + os.Remove(rpath) + //4、查询到对应数据的id,返回id+身份证号码 + var identityCard []string + for i, m := range nestedList { + num := i + 1 + // 不看第一排的数据(表头不看) + if num > 1 { + //根据数据内容的身份证去获取到对应的数据ID + for key, value := range m { + if key == 0 { + identityCard = append(identityCard, value.Data) + } + } + } + } + var userEntity []*model.BusConstructionUserInfoRes + err = dao.BusConstructionUser.Ctx(ctx).WhereIn("sfz_number", identityCard).Fields("id,sfz_number").Scan(&userEntity) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + //5、将数据中的身份证号码替换成对应的ID. + dataList := make([]map[int]model.ExcelEntity, 0) //这里表示在数据库找到了的数据,这些用户的资料可以上传 + for i, m := range nestedList { + num := i + 1 + // 不看第一排的数据(表头不看) + if num > 1 { + for key, _ := range m { + //key为0表示身份证这一列,这一列不需要 + if key != 0 { + continue + } + temp := nestedList[i][key] + for j := range userEntity { + if userEntity[j].SfzNumber == temp.Data { + userId := strconv.FormatInt(userEntity[j].Id, 10) + temp.Data = userId + nestedList[i][key] = temp + dataList = append(dataList, nestedList[i]) + } + } + } + } + } + var updateSql = "" + for i, m := range dataList { + userId := dataList[i][0].Data + for key, _ := range m { + if key == 0 { + continue + } + itoa := strconv.Itoa(key + 3) + if key == 6 { + itoa = strconv.Itoa(key + 3 + 1) + } + toFunc := coryCommon.ResourcePublicToFunc(dataList[i][key].Data, 1) + updateSql = updateSql + "UPDATE bus_construction_user_file SET path = " + "'" + toFunc + "'" + " WHERE user_id = " + userId + " and user_img_type = " + itoa + ";" + } + } + //6、将数据存储到 + _, err = g.DB().Exec(ctx, updateSql) + liberr.ErrIsNil(ctx, err, "批量操作失败!") + }) + return +} + +// ExportSalaryTeamFunc 导出施工人员工资组成(项目) +func (c *busConstructionUserController) ExportSalaryTeamFunc(ctx context.Context, req *system.ExportSalaryTeamReq) (res *system.ExportSalaryRes, err error) { + res = new(system.ExportSalaryRes) + salaryReq := system.ExportSalaryReq{ + ProjectId: req.ProjectId, + TeamId: req.TeamId, + FuzzyQuery: req.FuzzyQuery, + TypeOfWork: req.TypeOfWork, + DateStr: req.DateStr, + } + res, err = service.BusConstructionUser().ExportSalaryFunc(ctx, &salaryReq) + return +} + +// ExportSalaryFunc 导出施工人员工资组成(班组) +func (c *busConstructionUserController) ExportSalaryFunc(ctx context.Context, req *system.ExportSalaryReq) (res *system.ExportSalaryRes, err error) { + res = new(system.ExportSalaryRes) + res, err = service.BusConstructionUser().ExportSalaryFunc(ctx, req) + return +} + +// SigningMessagesFunc 【签名】根据openid获取到指定小程序用户的签名信息 +func (c *busConstructionUserController) SigningMessagesFunc(ctx context.Context, req *system.SigningMessagesReq) (res *system.SigningMessagesRes, err error) { + res = new(system.SigningMessagesRes) + err = g.Try(ctx, func(ctx context.Context) { + var signature *wxModel.BusConstructiomUserSignatureRes + err = g.DB().Model("bus_constructiom_user_signature").Where("openid", req.Openid).Scan(&signature) + liberr.ErrIsNil(ctx, err, "获取数据失败") + if signature != nil { + signature.Signature = strings.Replace(signature.Signature, "resource/public", "/wxfile", 1) + res.Signature = signature + } + }) + return +} + +// SigningUpdateFunc 【签名】修改指定签名的状态(change是否更改签名(1不更改 2更改)) +func (c *busConstructionUserController) SigningUpdateFunc(ctx context.Context, req *system.SigningUpdateFuncReq) (res *system.SigningUpdateFuncRes, err error) { + res = new(system.SigningUpdateFuncRes) + err = g.Try(ctx, func(ctx context.Context) { + _, err := g.DB().Model("bus_constructiom_user_signature").WherePri(req.Id).Update(g.Map{"change": req.Change}) + liberr.ErrIsNil(ctx, err, "获取数据失败") + }) + return +} + +// OneClickOpenFunc 一键开启/关闭打开 +func (c *busConstructionUserController) OneClickOpenFunc(ctx context.Context, req *system.OneClickOpenReq) (res *system.OneClickOpenRes, err error) { + res = new(system.OneClickOpenRes) + err = service.BusConstructionUser().OneClickOpenFunc(ctx, req) + return +} + +// ClockingConditionFunc 开启/关闭打开(根据某个人) +func (c *busConstructionUserController) ClockingConditionFunc(ctx context.Context, req *system.ClockingConditionReq) (res *system.ClockingConditionRes, err error) { + res = new(system.ClockingConditionRes) + err = service.BusConstructionUser().ClockingConditionFunc(ctx, req) + return +} + +// TemplateExportFunc 施工人员资料文件上传模板导出 +func (c *busConstructionUserController) TemplateExportFunc(ctx context.Context, req *system.TemplateExportReq) (res *system.TemplateExportRes, err error) { + res = new(system.TemplateExportRes) + res.Path, err = service.BusConstructionUser().TemplateExportFunc(ctx, req) + return +} + +// ZipFolderuploadFunc 批量上传施工人员的资料(压缩文件zip上传) +func (c *busConstructionUserController) ZipFolderuploadFunc(ctx context.Context, req *system.ZipFolderuploadReq) (res *system.ZipFolderuploadRes, err error) { + res = new(system.ZipFolderuploadRes) + err = service.BusConstructionUser().ZipFolderuploadFunc(ctx, req) + return +} + +// DepartureFunc 离场(成员离开班组) +func (c *busConstructionUserController) DepartureFunc(ctx context.Context, req *system.DepartureReq) (res *system.DepartureRes, err error) { + err = service.BusConstructionUser().DepartureFunc(ctx, req) + return +} + +// DepartureRecordFunc 施工人员入场退场历史记录信息(根据身份证信息查询) +func (c *busConstructionUserController) DepartureRecordFunc(ctx context.Context, req *system.DepartureRecordReq) (res *system.DepartureRecordRes, err error) { + res = new(system.DepartureRecordRes) + res, err = service.BusConstructionUser().DepartureRecordFunc(ctx, req) + return +} + +// PcCollectDataForTwoWeeksFunc 获取最近两周指定项目的考勤数据(统计全勤、半勤、缺勤) +func (c *busConstructionUserController) PcCollectDataForTwoWeeksFunc(ctx context.Context, req *system.PcCollectDataForTwoWeeksReq) (res *system.PcCollectDataForTwoWeeksRes, err error) { + res, err = service.BusConstructionUser().PcCollectDataForTwoWeeksFunc(ctx, req) + return +} + +//// PcEmployeeAttendanceFunc 员工考勤情况 +//func (c *busConstructionUserController) PcEmployeeAttendanceFunc(ctx context.Context, req *system.PcCollectDataForTwoWeeksReq) (res *system.PcCollectDataForTwoWeeksRes, err error) { +// res, err = service.BusConstructionUser().PcCollectDataForTwoWeeksFunc(ctx, req) +// return +//} + +// PcSelectBelowProjectOfPersonnelFunc 获取指定项目下的人员打卡信息 +func (c *busConstructionUserController) PcSelectBelowProjectOfPersonnelFunc(ctx context.Context, req *system.PcSelectBelowProjectOfPersonnelReq) (res *system.PcSelectBelowProjectOfPersonnelRes, err error) { + res, err = service.BusConstructionUser().PcSelectBelowProjectOfPersonnelFunc(ctx, req) + return +} + +// PcQueryBasedOnOpenidFunc 根据openid查询某人指定月份的打卡详情 +func (c *busConstructionUserController) PcQueryBasedOnOpenidFunc(ctx context.Context, req *system.PcQueryBasedOnOpenidReq) (res *system.PcQueryBasedOnOpenidRes, err error) { + res, err = service.BusConstructionUser().PcQueryBasedOnOpenidFunc(ctx, req) + return +} + +/* +==========================================================考勤机相关========================================================= +==========================================================考勤机相关========================================================= +==========================================================考勤机相关========================================================= +*/ + +// ListOfAttendanceMachinesFunc 考勤机列表 +func (c *busConstructionUserController) ListOfAttendanceMachinesFunc(ctx context.Context, req *system.ListOfAttendanceMachinesReq) (res *system.ListOfAttendanceMachinesRes, err error) { + + return +} diff --git a/internal/app/system/controller/bus_construction_user_file.go b/internal/app/system/controller/bus_construction_user_file.go new file mode 100644 index 0000000..436b329 --- /dev/null +++ b/internal/app/system/controller/bus_construction_user_file.go @@ -0,0 +1,60 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-07 10:17:41 +// 生成路径: internal/app/system/controller/bus_construction_user_file.go +// 生成人:gfast +// desc:微信用户的文件存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busConstructionUserFileController struct { + BaseController +} + +var BusConstructionUserFile = new(busConstructionUserFileController) + +// List 列表 +func (c *busConstructionUserFileController) List(ctx context.Context, req *system.BusConstructionUserFileSearchReq) (res *system.BusConstructionUserFileSearchRes, err error) { + res, err = service.BusConstructionUserFile().List(ctx, req) + return +} + +// Get 获取微信用户的文件存储 +func (c *busConstructionUserFileController) Get(ctx context.Context, req *system.BusConstructionUserFileGetReq) (res *system.BusConstructionUserFileGetRes, err error) { + res = new(system.BusConstructionUserFileGetRes) + res.BusConstructionUserFileInfoRes, err = service.BusConstructionUserFile().GetById(ctx, req.Id) + return +} + +// GetBySafetyId 根据主键id获取安全考试信息GetBySafetyId(ctx context.Context, req *system.BusConstructionUserFileGetSafetyFileReq) (res *model.ModelWeChatPdfWoRes, err error) +func (c *busConstructionUserFileController) GetBySafetyId(ctx context.Context, req *system.BusConstructionUserFileGetSafetyFileReq) (res *system.BusConstructionUserFileGetSafetyFileRes, err error) { + res = new(system.BusConstructionUserFileGetSafetyFileRes) + res, err = service.BusConstructionUserFile().GetBySafetyId(ctx, req) + return +} + +// Add 添加微信用户的文件存储 +func (c *busConstructionUserFileController) Add(ctx context.Context, req *system.BusConstructionUserFileAddReq) (res *system.BusConstructionUserFileAddRes, err error) { + err = service.BusConstructionUserFile().Add(ctx, req) + return +} + +// Edit 修改微信用户的文件存储 +func (c *busConstructionUserFileController) Edit(ctx context.Context, req *system.BusConstructionUserFileEditReq) (res *system.BusConstructionUserFileEditRes, err error) { + err = service.BusConstructionUserFile().Edit(ctx, req) + return +} + +// Delete 删除微信用户的文件存储 +func (c *busConstructionUserFileController) Delete(ctx context.Context, req *system.BusConstructionUserFileDeleteReq) (res *system.BusConstructionUserFileDeleteRes, err error) { + err = service.BusConstructionUserFile().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/bus_construction_user_post.go b/internal/app/system/controller/bus_construction_user_post.go new file mode 100644 index 0000000..da5fe2d --- /dev/null +++ b/internal/app/system/controller/bus_construction_user_post.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-07 10:06:34 +// 生成路径: internal/app/system/controller/bus_construction_user_post.go +// 生成人:gfast +// desc:施工人员岗位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busConstructionUserPostController struct { + BaseController +} + +var BusConstructionUserPost = new(busConstructionUserPostController) + +// List 列表 +func (c *busConstructionUserPostController) List(ctx context.Context, req *system.BusConstructionUserPostSearchReq) (res *system.BusConstructionUserPostSearchRes, err error) { + res, err = service.BusConstructionUserPost().List(ctx, req) + return +} + +// Get 获取施工人员岗位 +func (c *busConstructionUserPostController) Get(ctx context.Context, req *system.BusConstructionUserPostGetReq) (res *system.BusConstructionUserPostGetRes, err error) { + res = new(system.BusConstructionUserPostGetRes) + res.BusConstructionUserPostInfoRes, err = service.BusConstructionUserPost().GetById(ctx, req.Id) + return +} + +// Add 添加施工人员岗位 +func (c *busConstructionUserPostController) Add(ctx context.Context, req *system.BusConstructionUserPostAddReq) (res *system.BusConstructionUserPostAddRes, err error) { + err = service.BusConstructionUserPost().Add(ctx, req) + return +} + +// Edit 修改施工人员岗位 +func (c *busConstructionUserPostController) Edit(ctx context.Context, req *system.BusConstructionUserPostEditReq) (res *system.BusConstructionUserPostEditRes, err error) { + err = service.BusConstructionUserPost().Edit(ctx, req) + return +} + +// Delete 删除施工人员岗位 +func (c *busConstructionUserPostController) Delete(ctx context.Context, req *system.BusConstructionUserPostDeleteReq) (res *system.BusConstructionUserPostDeleteRes, err error) { + err = service.BusConstructionUserPost().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/bus_corporate_events.go b/internal/app/system/controller/bus_corporate_events.go new file mode 100644 index 0000000..95bea25 --- /dev/null +++ b/internal/app/system/controller/bus_corporate_events.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-03-20 16:49:36 +// 生成路径: internal/app/system/controller/bus_corporate_events.go +// 生成人:gfast +// desc:企业大事记 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busCorporateEventsController struct { + BaseController +} + +var BusCorporateEvents = new(busCorporateEventsController) + +// List 列表 +func (c *busCorporateEventsController) List(ctx context.Context, req *system.BusCorporateEventsSearchReq) (res *system.BusCorporateEventsSearchRes, err error) { + res, err = service.BusCorporateEvents().List(ctx, req) + return +} + +// Get 获取企业大事记 +func (c *busCorporateEventsController) Get(ctx context.Context, req *system.BusCorporateEventsGetReq) (res *system.BusCorporateEventsGetRes, err error) { + res = new(system.BusCorporateEventsGetRes) + res.BusCorporateEventsInfoRes, err = service.BusCorporateEvents().GetById(ctx, req.Id) + return +} + +// Add 添加企业大事记 +func (c *busCorporateEventsController) Add(ctx context.Context, req *system.BusCorporateEventsAddReq) (res *system.BusCorporateEventsAddRes, err error) { + err = service.BusCorporateEvents().Add(ctx, req) + return +} + +// Edit 修改企业大事记 +func (c *busCorporateEventsController) Edit(ctx context.Context, req *system.BusCorporateEventsEditReq) (res *system.BusCorporateEventsEditRes, err error) { + err = service.BusCorporateEvents().Edit(ctx, req) + return +} + +// Delete 删除企业大事记 +func (c *busCorporateEventsController) Delete(ctx context.Context, req *system.BusCorporateEventsDeleteReq) (res *system.BusCorporateEventsDeleteRes, err error) { + err = service.BusCorporateEvents().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/bus_design_audit.go b/internal/app/system/controller/bus_design_audit.go new file mode 100644 index 0000000..e4cb550 --- /dev/null +++ b/internal/app/system/controller/bus_design_audit.go @@ -0,0 +1,70 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-04-09 15:40:16 +// 生成路径: internal/app/system/controller/bus_design_audit.go +// 生成人:gfast +// desc:设计审核(竣工、施工、可研) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +type busDesignAuditController struct { + BaseController +} + +var BusDesignAudit = new(busDesignAuditController) + +// List 列表 +func (c *busDesignAuditController) List(ctx context.Context, req *system.BusDesignAuditSearchReq) (res *system.BusDesignAuditSearchRes, err error) { + res, err = service.BusDesignAudit().List(ctx, req) + return +} + +// Get 获取设计审核(竣工、施工、可研) +func (c *busDesignAuditController) Get(ctx context.Context, req *system.BusDesignAuditGetReq) (res *system.BusDesignAuditGetRes, err error) { + res = new(system.BusDesignAuditGetRes) + res.BusDesignAuditInfoRes, err = service.BusDesignAudit().GetById(ctx, req.Id) + return +} + +//// Add 添加设计审核(竣工、施工、可研) +//func (c *busDesignAuditController) Add(ctx context.Context, req *system.BusDesignAuditAddReq) (res *system.BusDesignAuditAddRes, err error) { +// err = service.BusDesignAudit().Add(ctx, req) +// return +//} + +// Edit 修改设计审核(竣工、施工、可研) +func (c *busDesignAuditController) Edit(ctx context.Context, req *system.BusDesignAuditEditReq) (res *system.BusDesignAuditEditRes, err error) { + err = service.BusDesignAudit().Edit(ctx, req) + return +} + +// Delete 删除设计审核(竣工、施工、可研) +func (c *busDesignAuditController) Delete(ctx context.Context, req *system.BusDesignAuditDeleteReq) (res *system.BusDesignAuditDeleteRes, err error) { + err = service.BusDesignAudit().Delete(ctx, req.Id) + return +} + +// DesignAuditFileDownload 单文件下载 +func (c *busDesignAuditController) DesignAuditFileDownload(ctx context.Context, req *system.DesignAuditFileDownloadReq) (res *system.DesignAuditFileDownloadRes, err error) { + res = new(system.DesignAuditFileDownloadRes) + err = g.Try(ctx, func(ctx context.Context) { + value, err := g.DB().Model(req.TableName).Ctx(ctx).Unscoped().WherePri(req.TableId).Fields("filen_path").Value() + liberr.ErrIsNil(ctx, err, "下载失败") + //进行下载 + path, err := WpFileDownload(ctx, value.String(), req.Type, req.TableName, req.TableId, req.ProjectId) + if err == nil { + res.Path = path + } + }) + return +} diff --git a/internal/app/system/controller/bus_design_document.go b/internal/app/system/controller/bus_design_document.go new file mode 100644 index 0000000..994f73e --- /dev/null +++ b/internal/app/system/controller/bus_design_document.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-07-29 16:31:29 +// 生成路径: internal/app/system/controller/bus_design_document.go +// 生成人:gfast +// desc:设计管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busDesignDocumentController struct { + BaseController +} + +var BusDesignDocument = new(busDesignDocumentController) + +// List 列表 +func (c *busDesignDocumentController) List(ctx context.Context, req *system.BusDesignDocumentSearchReq) (res *system.BusDesignDocumentSearchRes, err error) { + res, err = service.BusDesignDocument().List(ctx, req) + return +} + +// Get 获取设计管理 +func (c *busDesignDocumentController) Get(ctx context.Context, req *system.BusDesignDocumentGetReq) (res *system.BusDesignDocumentGetRes, err error) { + res = new(system.BusDesignDocumentGetRes) + res.BusDesignDocumentInfoRes, err = service.BusDesignDocument().GetById(ctx, req.Id) + return +} + +// Add 添加设计管理 +func (c *busDesignDocumentController) Add(ctx context.Context, req *system.BusDesignDocumentAddReq) (res *system.BusDesignDocumentAddRes, err error) { + err = service.BusDesignDocument().Add(ctx, req) + return +} + +// Edit 修改设计管理 +func (c *busDesignDocumentController) Edit(ctx context.Context, req *system.BusDesignDocumentEditReq) (res *system.BusDesignDocumentEditRes, err error) { + err = service.BusDesignDocument().Edit(ctx, req) + return +} + +// Delete 删除设计管理 +func (c *busDesignDocumentController) Delete(ctx context.Context, req *system.BusDesignDocumentDeleteReq) (res *system.BusDesignDocumentDeleteRes, err error) { + err = service.BusDesignDocument().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/bus_design_period_range.go b/internal/app/system/controller/bus_design_period_range.go new file mode 100644 index 0000000..32872c5 --- /dev/null +++ b/internal/app/system/controller/bus_design_period_range.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-04-11 17:28:54 +// 生成路径: internal/app/system/controller/bus_design_period_range.go +// 生成人:gfast +// desc:设计-周期范围 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busDesignPeriodRangeController struct { + BaseController +} + +var BusDesignPeriodRange = new(busDesignPeriodRangeController) + +// List 列表 +func (c *busDesignPeriodRangeController) List(ctx context.Context, req *system.BusDesignPeriodRangeSearchReq) (res *system.BusDesignPeriodRangeSearchRes, err error) { + res, err = service.BusDesignPeriodRange().List(ctx, req) + return +} + +//// Get 获取设计-周期范围 +//func (c *busDesignPeriodRangeController) Get(ctx context.Context, req *system.BusDesignPeriodRangeGetReq) (res *system.BusDesignPeriodRangeGetRes, err error) { +// res = new(system.BusDesignPeriodRangeGetRes) +// res.BusDesignPeriodRangeInfoRes, err = service.BusDesignPeriodRange().GetById(ctx, req.Id) +// return +//} + +// Add 添加设计-周期范围 +func (c *busDesignPeriodRangeController) Add(ctx context.Context, req *system.BusDesignPeriodRangeAddReq) (res *system.BusDesignPeriodRangeAddRes, err error) { + err = service.BusDesignPeriodRange().Add(ctx, req) + return +} + +//// Edit 修改设计-周期范围 +//func (c *busDesignPeriodRangeController) Edit(ctx context.Context, req *system.BusDesignPeriodRangeEditReq) (res *system.BusDesignPeriodRangeEditRes, err error) { +// err = service.BusDesignPeriodRange().Edit(ctx, req) +// return +//} + +// Delete 删除设计-周期范围 +func (c *busDesignPeriodRangeController) Delete(ctx context.Context, req *system.BusDesignPeriodRangeDeleteReq) (res *system.BusDesignPeriodRangeDeleteRes, err error) { + err = service.BusDesignPeriodRange().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/bus_engineering_quality.go b/internal/app/system/controller/bus_engineering_quality.go new file mode 100644 index 0000000..4ce285f --- /dev/null +++ b/internal/app/system/controller/bus_engineering_quality.go @@ -0,0 +1,59 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-07-29 09:31:22 +// 生成路径: internal/app/system/controller/bus_engineering_quality.go +// 生成人:gfast +// desc:工程质量列 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busEngineeringQualityController struct { + BaseController +} + +var BusEngineeringQuality = new(busEngineeringQualityController) + +// List 列表 +func (c *busEngineeringQualityController) List(ctx context.Context, req *system.BusEngineeringQualitySearchReq) (res *system.BusEngineeringQualitySearchRes, err error) { + res, err = service.BusEngineeringQuality().List(ctx, req) + return +} + +// Get 获取工程质量列 +func (c *busEngineeringQualityController) Get(ctx context.Context, req *system.BusEngineeringQualityGetReq) (res *system.BusEngineeringQualityGetRes, err error) { + res = new(system.BusEngineeringQualityGetRes) + res.BusEngineeringQualityInfoRes, err = service.BusEngineeringQuality().GetById(ctx, req.Id) + return +} + +// Add 添加工程质量列 +func (c *busEngineeringQualityController) Add(ctx context.Context, req *system.BusEngineeringQualityAddReq) (res *system.BusEngineeringQualityAddRes, err error) { + err = service.BusEngineeringQuality().Add(ctx, req) + return +} + +// Edit 修改工程质量列 +func (c *busEngineeringQualityController) Edit(ctx context.Context, req *system.BusEngineeringQualityEditReq) (res *system.BusEngineeringQualityEditRes, err error) { + err = service.BusEngineeringQuality().Edit(ctx, req) + return +} + +// Delete 删除工程质量列 +func (c *busEngineeringQualityController) Delete(ctx context.Context, req *system.BusEngineeringQualityDeleteReq) (res *system.BusEngineeringQualityDeleteRes, err error) { + err = service.BusEngineeringQuality().Delete(ctx, req.Ids) + return +} + +// 文件上传 单文件 +func (c *busEngineeringQualityController) BusEngineeringQualityUploading(ctx context.Context, req *system.BusEngineeringQualityUploadingReq) (res *system.BusEngineeringQualityUploadingRes, err error) { + err = service.BusEngineeringQuality().BusEngineeringQualityUploading(ctx, req) + return +} diff --git a/internal/app/system/controller/bus_equipment_equipment_unpacking.go b/internal/app/system/controller/bus_equipment_equipment_unpacking.go new file mode 100644 index 0000000..5911fcb --- /dev/null +++ b/internal/app/system/controller/bus_equipment_equipment_unpacking.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-07-29 11:14:45 +// 生成路径: internal/app/system/controller/bus_equipment_equipment_unpacking.go +// 生成人:gfast +// desc:开箱记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busEquipmentEquipmentUnpackingController struct { + BaseController +} + +var BusEquipmentEquipmentUnpacking = new(busEquipmentEquipmentUnpackingController) + +// List 列表 +func (c *busEquipmentEquipmentUnpackingController) List(ctx context.Context, req *system.BusEquipmentEquipmentUnpackingSearchReq) (res *system.BusEquipmentEquipmentUnpackingSearchRes, err error) { + res, err = service.BusEquipmentEquipmentUnpacking().List(ctx, req) + return +} + +// Get 获取开箱记录 +func (c *busEquipmentEquipmentUnpackingController) Get(ctx context.Context, req *system.BusEquipmentEquipmentUnpackingGetReq) (res *system.BusEquipmentEquipmentUnpackingGetRes, err error) { + res = new(system.BusEquipmentEquipmentUnpackingGetRes) + res.BusEquipmentEquipmentUnpackingInfoRes, err = service.BusEquipmentEquipmentUnpacking().GetByUnpackingId(ctx, req.UnpackingId) + return +} + +// Add 添加开箱记录 +func (c *busEquipmentEquipmentUnpackingController) Add(ctx context.Context, req *system.BusEquipmentEquipmentUnpackingAddReq) (res *system.BusEquipmentEquipmentUnpackingAddRes, err error) { + err = service.BusEquipmentEquipmentUnpacking().Add(ctx, req) + return +} + +// Edit 修改开箱记录 +func (c *busEquipmentEquipmentUnpackingController) Edit(ctx context.Context, req *system.BusEquipmentEquipmentUnpackingEditReq) (res *system.BusEquipmentEquipmentUnpackingEditRes, err error) { + err = service.BusEquipmentEquipmentUnpacking().Edit(ctx, req) + return +} + +// Delete 删除开箱记录 +func (c *busEquipmentEquipmentUnpackingController) Delete(ctx context.Context, req *system.BusEquipmentEquipmentUnpackingDeleteReq) (res *system.BusEquipmentEquipmentUnpackingDeleteRes, err error) { + err = service.BusEquipmentEquipmentUnpacking().Delete(ctx, req.UnpackingIds) + return +} diff --git a/internal/app/system/controller/bus_equipment_materials.go b/internal/app/system/controller/bus_equipment_materials.go new file mode 100644 index 0000000..294a3d4 --- /dev/null +++ b/internal/app/system/controller/bus_equipment_materials.go @@ -0,0 +1,91 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-07-29 11:14:16 +// 生成路径: internal/app/system/controller/bus_equipment_materials.go +// 生成人:gfast +// desc:材料/设备名称 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busEquipmentMaterialsController struct { + BaseController +} + +var BusEquipmentMaterials = new(busEquipmentMaterialsController) + +// List 列表 +func (c *busEquipmentMaterialsController) List(ctx context.Context, req *system.BusEquipmentMaterialsSearchReq) (res *system.BusEquipmentMaterialsSearchRes, err error) { + res, err = service.BusEquipmentMaterials().List(ctx, req) + return +} + +// Get 获取材料/设备名称 +func (c *busEquipmentMaterialsController) Get(ctx context.Context, req *system.BusEquipmentMaterialsGetReq) (res *system.BusEquipmentMaterialsGetRes, err error) { + res = new(system.BusEquipmentMaterialsGetRes) + res.BusEquipmentMaterialsInfoRes, err = service.BusEquipmentMaterials().GetByEquipmentMaterialsId(ctx, req.EquipmentMaterialsId) + return +} + +// Add 添加材料/设备名称 +func (c *busEquipmentMaterialsController) Add(ctx context.Context, req *system.BusEquipmentMaterialsAddReq) (res *system.BusEquipmentMaterialsAddRes, err error) { + err = service.BusEquipmentMaterials().Add(ctx, req) + return +} + +// Edit 修改材料/设备名称 +func (c *busEquipmentMaterialsController) Edit(ctx context.Context, req *system.BusEquipmentMaterialsEditReq) (res *system.BusEquipmentMaterialsEditRes, err error) { + err = service.BusEquipmentMaterials().Edit(ctx, req) + return +} + +// Delete 删除材料/设备名称 +func (c *busEquipmentMaterialsController) Delete(ctx context.Context, req *system.BusEquipmentMaterialsDeleteReq) (res *system.BusEquipmentMaterialsDeleteRes, err error) { + err = service.BusEquipmentMaterials().Delete(ctx, req.EquipmentMaterialsIds) + return +} + +// MaterialsFunc 材料数量 +func (c *busEquipmentMaterialsController) MaterialsFunc(ctx context.Context, req *system.MaterialsReq) (res *system.MaterialsRes, err error) { + res, err = service.BusEquipmentMaterials().MaterialsFunc(ctx, req) + return +} + +// ConditionFunc 材料情况 +func (c *busEquipmentMaterialsController) ConditionFunc(ctx context.Context, req *system.ConditionReq) (res *system.ConditionRes, err error) { + res, err = service.BusEquipmentMaterials().ConditionFunc(ctx, req) + return +} + +// App +// AppAdd 添加材料/设备名称 +func (c *busEquipmentMaterialsController) AppAdd(ctx context.Context, req *system.BusEquipmentMaterialsAppAddReq) (res *system.BusEquipmentMaterialsAppAddRes, err error) { + err = service.BusEquipmentMaterials().AppAdd(ctx, req) + return +} + +// AppEdit 修改材料/设备名称 +func (c *busEquipmentMaterialsController) AppEdit(ctx context.Context, req *system.BusEquipmentMaterialsAppEditReq) (res *system.BusEquipmentMaterialsAppEditRes, err error) { + err = service.BusEquipmentMaterials().AppEdit(ctx, req) + return +} + +// AppList 列表 +func (c *busEquipmentMaterialsController) AppList(ctx context.Context, req *system.BusEquipmentMaterialsAppSearchReq) (res *system.BusEquipmentMaterialsAppSearchRes, err error) { + res, err = service.BusEquipmentMaterials().AppList(ctx, req) + return +} + +// AppGetById 获取材料/设备名称 +func (c *busEquipmentMaterialsController) AppGetById(ctx context.Context, req *system.BusEquipmentMaterialsAppGetReq) (res *system.BusEquipmentMaterialsAppGetRes, err error) { + res = new(system.BusEquipmentMaterialsAppGetRes) + res.BusEquipmentMaterialsAppFileInfoRes, err = service.BusEquipmentMaterials().AppGetById(ctx, req.EquipmentMaterialsId) + return +} diff --git a/internal/app/system/controller/bus_equipment_materials_excel.go b/internal/app/system/controller/bus_equipment_materials_excel.go new file mode 100644 index 0000000..8cf7890 --- /dev/null +++ b/internal/app/system/controller/bus_equipment_materials_excel.go @@ -0,0 +1,30 @@ +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busEquipmentMaterialsexcelController struct { + BaseController +} + +var BusEquipmentMaterialsExcel = new(busEquipmentMaterialsexcelController) + +func (c *busEquipmentMaterialsexcelController) Index(ctx context.Context, req *system.BusEquipmentMaterialsExcelIndexReq) (listRes *system.BusEquipmentMaterialsExcelIndexRes, err error) { + listRes, err = service.BusEquipmentMaterialsExcel().Index(ctx, req) + return +} + +// Excel List +func (c *busEquipmentMaterialsexcelController) List(ctx context.Context, req *system.BusEquipmentMaterialsExcelSearchReq) (res *system.BusEquipmentMaterialsExcelSearchRes, err error) { + res, err = service.BusEquipmentMaterialsExcel().List(ctx, req) + return +} + +// excel exit +func (c *busEquipmentMaterialsexcelController) Exit(ctx context.Context, req *system.BusEquipmentMaterialsExcelEditReq) (res *system.BusEquipmentMaterialsExcelEditRes, err error) { + err = service.BusEquipmentMaterialsExcel().Edit(ctx, req) + return +} diff --git a/internal/app/system/controller/bus_equipment_materials_inventory.go b/internal/app/system/controller/bus_equipment_materials_inventory.go new file mode 100644 index 0000000..ff85ca0 --- /dev/null +++ b/internal/app/system/controller/bus_equipment_materials_inventory.go @@ -0,0 +1,82 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-09-13 14:21:30 +// 生成路径: internal/app/system/controller/bus_equipment_materials_inventory.go +// 生成人:gfast +// desc:设备材料入库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busEquipmentMaterialsInventoryController struct { + BaseController +} + +var BusEquipmentMaterialsInventory = new(busEquipmentMaterialsInventoryController) + +// List 列表 +func (c *busEquipmentMaterialsInventoryController) List(ctx context.Context, req *system.BusEquipmentMaterialsInventorySearchReq) (res *system.BusEquipmentMaterialsInventorySearchRes, err error) { + res, err = service.BusEquipmentMaterialsInventory().List(ctx, req) + return +} + +// Get 获取设备材料入库 +func (c *busEquipmentMaterialsInventoryController) Get(ctx context.Context, req *system.BusEquipmentMaterialsInventoryGetReq) (res *system.BusEquipmentMaterialsInventoryGetRes, err error) { + res = new(system.BusEquipmentMaterialsInventoryGetRes) + res.BusEquipmentMaterialsInventoryInfoRes, err = service.BusEquipmentMaterialsInventory().GetById(ctx, req.Id) + return +} + +// Add 添加设备材料入库 +func (c *busEquipmentMaterialsInventoryController) Add(ctx context.Context, req *system.BusEquipmentMaterialsInventoryAddReq) (res *system.BusEquipmentMaterialsInventoryAddRes, err error) { + err = service.BusEquipmentMaterialsInventory().Add(ctx, req) + return +} + +// Edit 修改设备材料入库 +func (c *busEquipmentMaterialsInventoryController) Edit(ctx context.Context, req *system.BusEquipmentMaterialsInventoryEditReq) (res *system.BusEquipmentMaterialsInventoryEditRes, err error) { + err = service.BusEquipmentMaterialsInventory().Edit(ctx, req) + return +} + +// Delete 删除设备材料入库 +func (c *busEquipmentMaterialsInventoryController) Delete(ctx context.Context, req *system.BusEquipmentMaterialsInventoryDeleteReq) (res *system.BusEquipmentMaterialsInventoryDeleteRes, err error) { + err = service.BusEquipmentMaterialsInventory().Delete(ctx, req.Ids) + return +} + +//app + +func (c *busEquipmentMaterialsInventoryController) AppAdd(ctx context.Context, req *system.BusEquipmentMaterialsInventoryAppAddReq) (res *system.BusEquipmentMaterialsInventoryAppAddRes, err error) { + err = service.BusEquipmentMaterialsInventory().AppAdd(ctx, req) + return +} + +func (c *busEquipmentMaterialsInventoryController) AppEdit(ctx context.Context, req *system.BusEquipmentMaterialsInventoryAppEditReq) (res *system.BusEquipmentMaterialsInventoryAppEditRes, err error) { + err = service.BusEquipmentMaterialsInventory().AppEdit(ctx, req) + return +} + +func (c *busEquipmentMaterialsInventoryController) AppList(ctx context.Context, req *system.BusEquipmentMaterialsInventoryAppSearchReq) (res *system.BusEquipmentMaterialsInventoryAppSearchRes, err error) { + res, err = service.BusEquipmentMaterialsInventory().AppList(ctx, req) + return +} + +func (c *busEquipmentMaterialsInventoryController) AppGetById(ctx context.Context, req *system.BusEquipmentMaterialsInventoryAppGetReq) (res *system.BusEquipmentMaterialsInventoryAppGetRes, err error) { + res = new(system.BusEquipmentMaterialsInventoryAppGetRes) + res.BusEquipmentMaterialsInventoryAppInfoRes, err = service.BusEquipmentMaterialsInventory().AppGetById(ctx, req.Id) + return +} + +// Delete 删除设备材料入库 +func (c *busEquipmentMaterialsInventoryController) AppDelete(ctx context.Context, req *system.BusEquipmentMaterialsInventoryAppDeleteReq) (res *system.BusEquipmentMaterialsInventoryAppDeleteRes, err error) { + err = service.BusEquipmentMaterialsInventory().AppDelete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/bus_essential_information.go b/internal/app/system/controller/bus_essential_information.go new file mode 100644 index 0000000..398ac15 --- /dev/null +++ b/internal/app/system/controller/bus_essential_information.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-03-20 19:38:54 +// 生成路径: internal/app/system/controller/bus_essential_information.go +// 生成人:gfast +// desc:项目基本信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busEssentialInformationController struct { + BaseController +} + +var BusEssentialInformation = new(busEssentialInformationController) + +// List 列表 +func (c *busEssentialInformationController) List(ctx context.Context, req *system.BusEssentialInformationSearchReq) (res *system.BusEssentialInformationSearchRes, err error) { + res, err = service.BusEssentialInformation().List(ctx, req) + return +} + +// Get 获取项目基本信息 +func (c *busEssentialInformationController) Get(ctx context.Context, req *system.BusEssentialInformationGetReq) (res *system.BusEssentialInformationGetRes, err error) { + res = new(system.BusEssentialInformationGetRes) + res.BusEssentialInformationInfoRes, err = service.BusEssentialInformation().GetById(ctx, req.Id) + return +} + +// Add 添加项目基本信息 +func (c *busEssentialInformationController) Add(ctx context.Context, req *system.BusEssentialInformationAddReq) (res *system.BusEssentialInformationAddRes, err error) { + err = service.BusEssentialInformation().Add(ctx, req) + return +} + +// Edit 修改项目基本信息 +func (c *busEssentialInformationController) Edit(ctx context.Context, req *system.BusEssentialInformationEditReq) (res *system.BusEssentialInformationEditRes, err error) { + err = service.BusEssentialInformation().Edit(ctx, req) + return +} + +// Delete 删除项目基本信息 +func (c *busEssentialInformationController) Delete(ctx context.Context, req *system.BusEssentialInformationDeleteReq) (res *system.BusEssentialInformationDeleteRes, err error) { + err = service.BusEssentialInformation().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/bus_folder.go b/internal/app/system/controller/bus_folder.go new file mode 100644 index 0000000..791c89a --- /dev/null +++ b/internal/app/system/controller/bus_folder.go @@ -0,0 +1,59 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-09-15 17:15:59 +// 生成路径: internal/app/system/controller/bus_folder.go +// 生成人:gfast +// desc:文件夹 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busFolderController struct { + BaseController +} + +var BusFolder = new(busFolderController) + +// List 列表 +func (c *busFolderController) List(ctx context.Context, req *system.BusFolderSearchReq) (res *system.BusFolderSearchRes, err error) { + res, err = service.BusFolder().List(ctx, req) + return +} + +// TreeFormListFunc 树形结构列表(系统文件夹的虚拟树形结构) +func (c *busFolderController) TreeFormListFunc(ctx context.Context, req *system.TreeFormListFuncReq) (res *system.TreeFormListFuncRes, err error) { + res, err = service.BusFolder().TreeFormListFunc(ctx, req) + return +} + +// Get 获取文件夹 +func (c *busFolderController) Get(ctx context.Context, req *system.BusFolderGetReq) (res *system.BusFolderGetRes, err error) { + res = new(system.BusFolderGetRes) + res.BusFolderInfoRes, err = service.BusFolder().GetById(ctx, req.Id) + return +} + +// Add 添加文件夹 +func (c *busFolderController) Add(ctx context.Context, req *system.BusFolderAddReq) (res *system.BusFolderAddRes, err error) { + err = service.BusFolder().Add(ctx, req) + return +} + +// Edit 修改文件夹 +func (c *busFolderController) Edit(ctx context.Context, req *system.BusFolderEditReq) (res *system.BusFolderEditRes, err error) { + err = service.BusFolder().Edit(ctx, req) + return +} + +// Delete 删除文件夹 +func (c *busFolderController) Delete(ctx context.Context, req *system.BusFolderDeleteReq) (res *system.BusFolderDeleteRes, err error) { + err = service.BusFolder().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/bus_folder_file.go b/internal/app/system/controller/bus_folder_file.go new file mode 100644 index 0000000..308748d --- /dev/null +++ b/internal/app/system/controller/bus_folder_file.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-09-15 17:16:00 +// 生成路径: internal/app/system/controller/bus_folder_file.go +// 生成人:gfast +// desc:文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busFolderFileController struct { + BaseController +} + +var BusFolderFile = new(busFolderFileController) + +// List 列表 +func (c *busFolderFileController) List(ctx context.Context, req *system.BusFolderFileSearchReq) (res *system.BusFolderFileSearchRes, err error) { + res, err = service.BusFolderFile().List(ctx, req) + return +} + +// Get 获取文件 +func (c *busFolderFileController) Get(ctx context.Context, req *system.BusFolderFileGetReq) (res *system.BusFolderFileGetRes, err error) { + res = new(system.BusFolderFileGetRes) + res.BusFolderFileInfoRes, err = service.BusFolderFile().GetById(ctx, req.Id) + return +} + +// Add 添加文件 +func (c *busFolderFileController) Add(ctx context.Context, req *system.BusFolderFileAddReq) (res *system.BusFolderFileAddRes, err error) { + err = service.BusFolderFile().Add(ctx, req) + return +} + +// Edit 修改文件 +func (c *busFolderFileController) Edit(ctx context.Context, req *system.BusFolderFileEditReq) (res *system.BusFolderFileEditRes, err error) { + err = service.BusFolderFile().Edit(ctx, req) + return +} + +// Delete 删除文件 +func (c *busFolderFileController) Delete(ctx context.Context, req *system.BusFolderFileDeleteReq) (res *system.BusFolderFileDeleteRes, err error) { + err = service.BusFolderFile().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/bus_hse_management.go b/internal/app/system/controller/bus_hse_management.go new file mode 100644 index 0000000..0ca1468 --- /dev/null +++ b/internal/app/system/controller/bus_hse_management.go @@ -0,0 +1,108 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-03-28 14:53:05 +// 生成路径: internal/app/system/controller/bus_hse_management.go +// 生成人:gfast +// desc:HSE-巡检工单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + wxSystem "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busHseManagementController struct { + BaseController +} + +var BusHseManagement = new(busHseManagementController) + +// List 列表 +func (c *busHseManagementController) List(ctx context.Context, req *system.BusHseManagementSearchReq) (res *system.BusHseManagementSearchRes, err error) { + res, err = service.BusHseManagement().List(ctx, req) + return +} + +// Get 获取HSE-巡检工单 +func (c *busHseManagementController) Get(ctx context.Context, req *system.BusHseManagementGetReq) (res *system.BusHseManagementGetRes, err error) { + res = new(system.BusHseManagementGetRes) + res.BusHseManagementDetailsRes, err = service.BusHseManagement().GetById(ctx, req.Id) + return +} + +// Add 添加HSE-巡检工单-通知 +func (c *busHseManagementController) Add(ctx context.Context, req *system.BusHseManagementAddReq) (res *system.BusHseManagementAddRes, err error) { + err = service.BusHseManagement().Add(ctx, req) + return +} + +//// Edit 修改HSE-巡检工单-整改 +//func (c *busHseManagementController) Edit(ctx context.Context, req *system.BusHseManagementEditReq) (res *system.BusHseManagementEditRes, err error) { +// err = service.BusHseManagement().Edit(ctx, req) +// return +//} + +// EditReview 修改HSE-巡检工单-复查 +func (c *busHseManagementController) EditReview(ctx context.Context, req *system.EditReviewReq) (res *system.EditReviewRes, err error) { + err = service.BusHseManagement().EditReview(ctx, req) + return +} + +// Delete 删除HSE-巡检工单 +func (c *busHseManagementController) Delete(ctx context.Context, req *system.BusHseManagementDeleteReq) (res *system.BusHseManagementDeleteRes, err error) { + err = service.BusHseManagement().Delete(ctx, req.Ids) + return +} + +// HseManagementAppletAddFunc 微信小程序-新增 +func (c *busHseManagementController) HseManagementAppletAddFunc(ctx context.Context, req *wxSystem.HseManagementAppletAddReq) (res *wxSystem.HseManagementAppletAddRes, err error) { + err = service.BusHseManagement().HseManagementAppletAddFunc(ctx, req) + return +} + +// HseManagementAppletAbarbeitungFunc 微信小程序-整改 +func (c *busHseManagementController) HseManagementAppletAbarbeitungFunc(ctx context.Context, req *wxSystem.HseManagementAppletAbarbeitungReq) (res *wxSystem.HseManagementAppletAbarbeitungRes, err error) { + err = service.BusHseManagement().HseManagementAppletAbarbeitungFunc(ctx, req) + return +} + +// HseManagementAppletVerifyFunc 微信小程序-验证 +func (c *busHseManagementController) HseManagementAppletVerifyFunc(ctx context.Context, req *wxSystem.HseManagementAppletVerifyReq) (res *wxSystem.HseManagementAppletVerifyRes, err error) { + err = service.BusHseManagement().HseManagementAppletVerifyFunc(ctx, req) + return +} + +// HseManagementAppletListFunc 微信小程序-列表 +func (c *busHseManagementController) HseManagementAppletListFunc(ctx context.Context, req *wxSystem.HseManagementAppletListReq) (res *wxSystem.HseManagementAppletListRes, err error) { + res, err = service.BusHseManagement().HseManagementAppletListFunc(ctx, req) + return +} + +// HseManagementAppletDetailsFunc 微信小程序-详情 +func (c *busHseManagementController) HseManagementAppletDetailsFunc(ctx context.Context, req *wxSystem.HseManagementAppletDetailsReq) (res *wxSystem.HseManagementAppletDetailsRes, err error) { + res, err = service.BusHseManagement().HseManagementAppletDetailsFunc(ctx, req) + return +} + +// GisSafetyManagementFunc Gis安全管理统计 +func (c *busHseManagementController) GisSafetyManagementFunc(ctx context.Context, req *system.GisSafetyManagementReq) (res *system.GisSafetyManagementRes, err error) { + res, err = service.BusHseManagement().GisSafetyManagementFunc(ctx, req) + return +} + +// GisSafetyManagementListFunc Gis质量管理列表 +func (c *busHseManagementController) GisSafetyManagementListFunc(ctx context.Context, req *system.GisSafetyManagementListReq) (res *system.GisSafetyManagementListRes, err error) { + res, err = service.BusHseManagement().GisSafetyManagementListFunc(ctx, req) + return +} + +// SafetyLargeScreenDetailsFunc 大屏详情 +func (c *busInspectionTicketController) SafetyLargeScreenDetailsFunc(ctx context.Context, req *system.SafetyLargeScreenDetailsReq) (res *system.SafetyLargeScreenDetailsRes, err error) { + res, err = service.BusHseManagement().SafetyLargeScreenDetails(ctx, req) + return +} diff --git a/internal/app/system/controller/bus_hse_security_log.go b/internal/app/system/controller/bus_hse_security_log.go new file mode 100644 index 0000000..967801a --- /dev/null +++ b/internal/app/system/controller/bus_hse_security_log.go @@ -0,0 +1,78 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-04-07 17:00:45 +// 生成路径: internal/app/system/controller/bus_hse_security_log.go +// 生成人:gfast +// desc:HSE安全日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + wxSystem "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busHseSecurityLogController struct { + BaseController +} + +var BusHseSecurityLog = new(busHseSecurityLogController) + +// List 列表 +func (c *busHseSecurityLogController) List(ctx context.Context, req *system.BusHseSecurityLogSearchReq) (res *system.BusHseSecurityLogSearchRes, err error) { + res, err = service.BusHseSecurityLog().List(ctx, req) + return +} + +// Get 获取HSE安全日志 +func (c *busHseSecurityLogController) Get(ctx context.Context, req *system.BusHseSecurityLogGetReq) (res *system.BusHseSecurityLogGetRes, err error) { + res = new(system.BusHseSecurityLogGetRes) + res.BusHseSecurityLogInfoTwoRes, err = service.BusHseSecurityLog().GetById(ctx, req.Id) + return +} + +// AddText 添加HSE安全日志--文字 +func (c *busHseSecurityLogController) AddText(ctx context.Context, req *system.BusHseSecurityLogAddTxetReq) (res *system.BusHseSecurityLogAddTxetRes, err error) { + err = service.BusHseSecurityLog().AddText(ctx, req) + return +} + +// AddFile 添加HSE安全日志--附件 +func (c *busHseSecurityLogController) AddFile(ctx context.Context, req *system.BusHseSecurityLogAddFileReq) (res *system.BusHseSecurityLogAddFileRes, err error) { + err = service.BusHseSecurityLog().AddFile(ctx, req) + return +} + +//// Edit 修改HSE安全日志 +//func (c *busHseSecurityLogController) Edit(ctx context.Context, req *system.BusHseSecurityLogEditReq) (res *system.BusHseSecurityLogEditRes, err error) { +// err = service.BusHseSecurityLog().Edit(ctx, req) +// return +//} + +// Delete 删除HSE安全日志 +func (c *busHseSecurityLogController) Delete(ctx context.Context, req *system.BusHseSecurityLogDeleteReq) (res *system.BusHseSecurityLogDeleteRes, err error) { + err = service.BusHseSecurityLog().Delete(ctx, req.Ids) + return +} + +// HseSecurityLogAppletAddFunc 微信小程序-新增 +func (c *busHseSecurityLogController) HseSecurityLogAppletAddFunc(ctx context.Context, req *wxSystem.HseSecurityLogAppletAddReq) (res *wxSystem.HseSecurityLogAppletAddRes, err error) { + err = service.BusHseSecurityLog().HseSecurityLogAppletAdd(ctx, req) + return +} + +// HseSecurityLogAppletListFunc 微信小程序-列表分页 +func (c *busHseSecurityLogController) HseSecurityLogAppletListFunc(ctx context.Context, req *wxSystem.HseSecurityLogAppletListReq) (res *wxSystem.HseSecurityLogAppletListRes, err error) { + res, err = service.BusHseSecurityLog().HseSecurityLogAppletList(ctx, req) + return +} + +// HseSecurityLogAppletDetailsFunc 微信小程序-详情 +func (c *busHseSecurityLogController) HseSecurityLogAppletDetailsFunc(ctx context.Context, req *wxSystem.HseSecurityLogAppletDetailsReq) (res *wxSystem.HseSecurityLogAppletDetailsRes, err error) { + res, err = service.BusHseSecurityLog().HseSecurityLogAppletDetails(ctx, req) + return +} diff --git a/internal/app/system/controller/bus_inspection_ticket.go b/internal/app/system/controller/bus_inspection_ticket.go new file mode 100644 index 0000000..e8b8341 --- /dev/null +++ b/internal/app/system/controller/bus_inspection_ticket.go @@ -0,0 +1,122 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-03-21 15:23:59 +// 生成路径: internal/app/system/controller/bus_inspection_ticket.go +// 生成人:gfast +// desc:质量工单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + wxSystem "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busInspectionTicketController struct { + BaseController +} + +var BusInspectionTicket = new(busInspectionTicketController) + +// UpdataCorrector pc网页版本:工单状态在通知状态下,可更改整改人(需要删除之前整改人通知和待办的数据) +func (c *busInspectionTicketController) UpdataCorrector(ctx context.Context, req *system.UpdataCorrectorReq) (res *system.UpdataCorrectorRes, err error) { + err = service.BusInspectionTicket().UpdataCorrector(ctx, req) + return +} + +// List 列表 +func (c *busInspectionTicketController) List(ctx context.Context, req *system.BusInspectionTicketSearchReq) (res *system.BusInspectionTicketSearchRes, err error) { + res, err = service.BusInspectionTicket().List(ctx, req) + return +} + +// Get 获取质量工单 +func (c *busInspectionTicketController) Get(ctx context.Context, req *system.BusInspectionTicketGetReq) (res *system.BusInspectionTicketGetRes, err error) { + res = new(system.BusInspectionTicketGetRes) + entity, err := service.BusInspectionTicket().GetById(ctx, req.Id) + res.Details = entity + return +} + +// LargeScreenDetailsFunc 大屏详情 +func (c *busInspectionTicketController) LargeScreenDetailsFunc(ctx context.Context, req *system.LargeScreenDetailsReq) (res *system.LargeScreenDetailsRes, err error) { + res, err = service.BusInspectionTicket().LargeScreenDetails(ctx, req) + return +} + +// Add 添加质量工单 +func (c *busInspectionTicketController) Add(ctx context.Context, req *system.BusInspectionTicketAddReq) (res *system.BusInspectionTicketAddRes, err error) { + err = service.BusInspectionTicket().Add(ctx, req) + return +} + +// Edit 整改 +func (c *busInspectionTicketController) Edit(ctx context.Context, req *system.BusInspectionTicketAbarbeitungReq) (res *system.BusInspectionTicketAbarbeitungRes, err error) { + err = service.BusInspectionTicket().Edit(ctx, req) + return +} + +// EditVerification 验证 +func (c *busInspectionTicketController) EditVerification(ctx context.Context, req *system.BusInspectionTicketVerificationReq) (res *system.BusInspectionTicketVerificationRes, err error) { + err = service.BusInspectionTicket().EditVerification(ctx, req) + return +} + +// Delete 删除质量工单 +func (c *busInspectionTicketController) Delete(ctx context.Context, req *system.BusInspectionTicketDeleteReq) (res *system.BusInspectionTicketDeleteRes, err error) { + err = service.BusInspectionTicket().Delete(ctx, req.Ids) + return +} + +// InspectionTicketAppletAddFunc 微信小程序-新增 +func (c *busInspectionTicketController) InspectionTicketAppletAddFunc(ctx context.Context, req *wxSystem.InspectionTicketAppletAddReq) (res *wxSystem.InspectionTicketAppletAddRes, err error) { + + err = service.BusInspectionTicket().InspectionTicketAppletAddFunc(ctx, req) + return +} + +// InspectionTicketAppletAbarbeitungFunc 微信小程序-整改 +func (c *busInspectionTicketController) InspectionTicketAppletAbarbeitungFunc(ctx context.Context, req *wxSystem.InspectionTicketAppletAbarbeitungReq) (res *wxSystem.InspectionTicketAppletAbarbeitungRes, err error) { + err = service.BusInspectionTicket().InspectionTicketAppletAbarbeitungFunc(ctx, req) + return +} + +// InspectionTicketAppletVerifyFunc 微信小程序-验证 +func (c *busInspectionTicketController) InspectionTicketAppletVerifyFunc(ctx context.Context, req *wxSystem.InspectionTicketAppletVerifyReq) (res *wxSystem.InspectionTicketAppletVerifyRes, err error) { + err = service.BusInspectionTicket().InspectionTicketAppletVerifyFunc(ctx, req) + return +} + +// InspectionTicketAppletListFunc 微信小程序-列表 +func (c *busInspectionTicketController) InspectionTicketAppletListFunc(ctx context.Context, req *wxSystem.InspectionTicketAppletListReq) (res *wxSystem.InspectionTicketAppletListRes, err error) { + res, err = service.BusInspectionTicket().InspectionTicketAppletListFunc(ctx, req) + return +} + +// AcquisitionOfCorrectivePersonnelFunc 微信小程序-获取整改人(整改人为当前项目的所有班组长) +func (c *busInspectionTicketController) AcquisitionOfCorrectivePersonnelFunc(ctx context.Context, req *wxSystem.AcquisitionOfCorrectivePersonnelReq) (res *wxSystem.AcquisitionOfCorrectivePersonnelRes, err error) { + res, err = service.BusInspectionTicket().AcquisitionOfCorrectivePersonnelFunc(ctx, req) + return +} + +// InspectionTicketAppletDetailsFunc 微信小程序-详情 +func (c *busInspectionTicketController) InspectionTicketAppletDetailsFunc(ctx context.Context, req *wxSystem.InspectionTicketAppletDetailsReq) (res *wxSystem.InspectionTicketAppletDetailsRes, err error) { + res, err = service.BusInspectionTicket().InspectionTicketAppletDetailsFunc(ctx, req) + return +} + +// GisQualityManagementResFunc Gis质量管理统计 +func (c *busInspectionTicketController) GisQualityManagementResFunc(ctx context.Context, req *system.GisQualityManagementReq) (res *system.GisQualityManagementRes, err error) { + res, err = service.BusInspectionTicket().GisQualityManagementResFunc(ctx, req) + return +} + +// GisQualityManagementListFunc Gis质量管理列表 +func (c *busInspectionTicketController) GisQualityManagementListFunc(ctx context.Context, req *system.GisQualityManagementListReq) (res *system.GisQualityManagementListRes, err error) { + res, err = service.BusInspectionTicket().GisQualityManagementListFunc(ctx, req) + return +} diff --git a/internal/app/system/controller/bus_machinery.go b/internal/app/system/controller/bus_machinery.go new file mode 100644 index 0000000..7b1073b --- /dev/null +++ b/internal/app/system/controller/bus_machinery.go @@ -0,0 +1,71 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-07-29 14:02:01 +// 生成路径: internal/app/system/controller/bus_machinery.go +// 生成人:gfast +// desc:机械 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busMachineryController struct { + BaseController +} + +var BusMachinery = new(busMachineryController) + +// List 列表 +func (c *busMachineryController) List(ctx context.Context, req *system.BusMachinerySearchReq) (res *system.BusMachinerySearchRes, err error) { + res, err = service.BusMachinery().List(ctx, req) + return +} + +// Get 获取机械 +func (c *busMachineryController) Get(ctx context.Context, req *system.BusMachineryGetReq) (res *system.BusMachineryGetRes, err error) { + res = new(system.BusMachineryGetRes) + res.BusMachineryInfoRes, err = service.BusMachinery().GetById(ctx, req.Id) + return +} + +// Add 添加机械 +func (c *busMachineryController) Add(ctx context.Context, req *system.BusMachineryAddReq) (res *system.BusMachineryAddRes, err error) { + err = service.BusMachinery().Add(ctx, req) + return +} + +// Edit 修改机械 +func (c *busMachineryController) Edit(ctx context.Context, req *system.BusMachineryEditReq) (res *system.BusMachineryEditRes, err error) { + err = service.BusMachinery().Edit(ctx, req) + return +} + +// Delete 删除机械 +func (c *busMachineryController) Delete(ctx context.Context, req *system.BusMachineryDeleteReq) (res *system.BusMachineryDeleteRes, err error) { + err = service.BusMachinery().Delete(ctx, req.Ids) + return +} + +// MachineNumberFunc 机械数量 +func (c *busMachineryController) MachineNumberFunc(ctx context.Context, req *system.MachineNumberReq) (res *system.MachineNumberRes, err error) { + res, err = service.BusMachinery().MachineNumberFunc(ctx, req) + return +} + +// MechanicalConditionFunc 机械情况 +func (c *busMachineryController) MechanicalConditionFunc(ctx context.Context, req *system.MechanicalConditionReq) (res *system.MechanicalConditionRes, err error) { + res, err = service.BusMachinery().MechanicalConditionFunc(ctx, req) + return +} + +// app列表 +func (c *busMachineryController) AppList(ctx context.Context, req *system.BusMachineryAppSearchReq) (res *system.BusMachineryAppSearchRes, err error) { + res, err = service.BusMachinery().AppList(ctx, req) + return +} diff --git a/internal/app/system/controller/bus_machinery_detail.go b/internal/app/system/controller/bus_machinery_detail.go new file mode 100644 index 0000000..3973458 --- /dev/null +++ b/internal/app/system/controller/bus_machinery_detail.go @@ -0,0 +1,139 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-10-12 11:41:32 +// 生成路径: internal/app/system/controller/bus_machinery_detail.go +// 生成人:gfast +// desc:机械详情 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/os/gtime" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + logic "github.com/tiger1103/gfast/v3/internal/app/system/logic/busMachineryDetail" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +type busMachineryDetailController struct { + BaseController +} + +var BusMachineryDetail = new(busMachineryDetailController) + +// List 列表 +func (c *busMachineryDetailController) List(ctx context.Context, req *system.BusMachineryDetailSearchReq) (res *system.BusMachineryDetailSearchRes, err error) { + res, err = service.BusMachineryDetail().List(ctx, req) + return +} + +// Get 获取机械详情 +func (c *busMachineryDetailController) Get(ctx context.Context, req *system.BusMachineryDetailGetReq) (res *system.BusMachineryDetailGetRes, err error) { + res = new(system.BusMachineryDetailGetRes) + res.BusMachineryDetailGetIdInfoRes, err = service.BusMachineryDetail().GetById(ctx, req.Id) + return +} + +// Add 添加机械详情 +func (c *busMachineryDetailController) Add(ctx context.Context, req *system.BusMachineryDetailAddReq) (res *system.BusMachineryDetailAddRes, err error) { + err = service.BusMachineryDetail().Add(ctx, req) + return +} + +// Edit 修改机械详情 +func (c *busMachineryDetailController) Edit(ctx context.Context, req *system.BusMachineryDetailEditReq) (res *system.BusMachineryDetailEditRes, err error) { + err = service.BusMachineryDetail().Edit(ctx, req) + return +} + +// Delete 删除机械详情 +func (c *busMachineryDetailController) Delete(ctx context.Context, req *system.BusMachineryDetailDeleteReq) (res *system.BusMachineryDetailDeleteRes, err error) { + err = service.BusMachineryDetail().Delete(ctx, req.Ids) + return +} + +//app + +func (c *busMachineryDetailController) AppList(ctx context.Context, req *system.BusMachineryDetailAppSearchReq) (res *system.BusMachineryDetailAppSearchRes, err error) { + res, err = service.BusMachineryDetail().AppList(ctx, req) + return +} + +// app新增 +func (c *busMachineryDetailController) AppAdd(ctx context.Context, req *system.BusMachineryDetailAppAddReq) (res *system.BusMachineryDetailGetRes, err error) { + err = service.BusMachineryDetail().AppAdd(ctx, req) + return +} + +// app 修改 +func (c *busMachineryDetailController) AppEdit(ctx context.Context, req *system.BusMachineryDetailAppEditReq) (res *system.BusMachineryDetailAppEditRes, err error) { + err = service.BusMachineryDetail().AppEdit(ctx, req) + return +} + +// appgetid +func (c *busMachineryDetailController) AppGetById(ctx context.Context, req *system.BusMachineryDetailAppGetReq) (res *system.BusMachineryDetailAppGetRes, err error) { + res = new(system.BusMachineryDetailAppGetRes) + res.BusMachineryDetailAppGetIdInfoRes, err = service.BusMachineryDetail().AppGetById(ctx, req.Id) + return +} + +// app一键退场 +func (c *busMachineryDetailController) AppExitId(ctx context.Context, req *system.BusMachineryDetailAppExitReq) (res *system.BusMachineryDetailAppExitRes, err error) { + machineryId, err := dao.BusMachineryDetail.Ctx(ctx).Where(dao.BusMachineryDetail.Columns().Id, req.Id).Count() + if machineryId != 0 { + Nowtime := gtime.Now() + detail := do.BusMachineryDetail{ + Type: logic.Exarch, + EntryTime: Nowtime, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + } + _, err = dao.BusMachineryDetail.Ctx(ctx).WherePri(req.Id).Update(detail) + liberr.ErrIsNil(ctx, err, "获取信息失败") + //机械设备详细新增记录 + if err == nil { + dao.BusMachineryRecord.Ctx(ctx).Insert(do.BusMachineryRecord{ + MachineryDetailId: req.Id, + RecordTime: Nowtime, + Type: logic.Exarch, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + } + } else { + return nil, errors.New("此信息不存在") + } + return +} + +func (c *busMachineryDetailController) AppEntranceId(ctx context.Context, req *system.BusMachineryDetailAppEntranceReq) (res *system.BusMachineryDetailAppEntranceRes, err error) { + machineryId, err := dao.BusMachineryDetail.Ctx(ctx).Where(dao.BusMachineryDetail.Columns().Id, req.Id).Count() + if machineryId != 0 { + Nowtime := gtime.Now() + detail := do.BusMachineryDetail{ + Type: logic.Entry, + EntryTime: Nowtime, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + } + _, err = dao.BusMachineryDetail.Ctx(ctx).WherePri(req.Id).Update(detail) + liberr.ErrIsNil(ctx, err, "获取信息失败") + //机械设备详细新增记录 + if err == nil { + dao.BusMachineryRecord.Ctx(ctx).Insert(do.BusMachineryRecord{ + MachineryDetailId: req.Id, + RecordTime: Nowtime, + Type: logic.Entry, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + } + } else { + return nil, errors.New("此信息不存在") + } + return +} diff --git a/internal/app/system/controller/bus_payroll_list.go b/internal/app/system/controller/bus_payroll_list.go new file mode 100644 index 0000000..ce74de6 --- /dev/null +++ b/internal/app/system/controller/bus_payroll_list.go @@ -0,0 +1,89 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-11-20 13:51:38 +// 生成路径: internal/app/system/controller/bus_payroll_list.go +// 生成人:gfast +// desc:工资(excel导入形成的) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busPayrollListController struct { + BaseController +} + +var BusPayrollList = new(busPayrollListController) + +// =============工资表列表============= +// =============工资表列表============= +// =============工资表列表============= + +// ImportExcelPaySheet 导入excel工资表 +func (c *busPayrollListController) ImportExcelPaySheet(ctx context.Context, req *system.ImportExcelPaySheetReq) (res *system.ImportExcelPaySheetRes, err error) { + err = service.BusPayrollList().ImportExcelPaySheet(ctx, req) + return +} + +// ReadAllImportedListData 读取所有导入列表数据(汇总) +func (c *busPayrollListController) ReadAllImportedListData(ctx context.Context, req *system.ReadAllImportedListDataReq) (res *system.ReadAllImportedListDataRes, err error) { + res, err = service.BusPayrollList().ReadAllImportedListData(ctx, req) + return +} + +// DeletePayroll 删除工资表目录 +func (c *busPayrollListController) DeletePayroll(ctx context.Context, req *system.BusDeletePayrollReq) (res *system.BusDeletePayrollRes, err error) { + service.BusPayrollList().DeletePayroll(ctx, req) + return +} + +//=============工资表文件资源============= +//=============工资表文件资源============= +//=============工资表文件资源============= + +// GetTheSourceExcelAccordingToTheIdOfThePayroll 根据工资表的id获取到源excel(只允许查看) +func (c *busPayrollListController) GetTheSourceExcelAccordingToTheIdOfThePayroll(ctx context.Context, req *system.GetTheSourceExcelAccordingToTheIdOfThePayrollReq) (res *system.GetTheSourceExcelAccordingToTheIdOfThePayrollRes, err error) { + res, err = service.BusPayrollList().GetTheSourceExcelAccordingToTheIdOfThePayroll(ctx, req) + return +} + +//=============工资表excel导入数据============= +//=============工资表excel导入数据============= +//=============工资表excel导入数据============= + +// List 读取工资 +func (c *busPayrollListController) List(ctx context.Context, req *system.BusPayrollListSearchReq) (res *system.BusPayrollListSearchRes, err error) { + res, err = service.BusPayrollList().List(ctx, req) + return +} + +//// Get 获取工资(excel导入形成的) +//func (c *busPayrollListController) Get(ctx context.Context, req *system.BusPayrollListGetReq) (res *system.BusPayrollListGetRes, err error) { +// res = new(system.BusPayrollListGetRes) +// res.BusPayrollListInfoRes, err = service.BusPayrollList().GetById(ctx, req.Id) +// return +//} + +//// Add 添加工资(excel导入形成的) +//func (c *busPayrollListController) Add(ctx context.Context, req *system.BusPayrollListAddReq) (res *system.BusPayrollListAddRes, err error) { +// err = service.BusPayrollList().Add(ctx, req) +// return +//} +// +//// Edit 修改工资(excel导入形成的) +//func (c *busPayrollListController) Edit(ctx context.Context, req *system.BusPayrollListEditReq) (res *system.BusPayrollListEditRes, err error) { +// err = service.BusPayrollList().Edit(ctx, req) +// return +//} +// +//// Delete 删除工资(excel导入形成的) +//func (c *busPayrollListController) Delete(ctx context.Context, req *system.BusPayrollListDeleteReq) (res *system.BusPayrollListDeleteRes, err error) { +// err = service.BusPayrollList().Delete(ctx, req.Ids) +// return +//} diff --git a/internal/app/system/controller/bus_projectin_progress.go b/internal/app/system/controller/bus_projectin_progress.go new file mode 100644 index 0000000..bf719cc --- /dev/null +++ b/internal/app/system/controller/bus_projectin_progress.go @@ -0,0 +1,77 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-03-20 19:45:19 +// 生成路径: internal/app/system/controller/bus_projectin_progress.go +// 生成人:gfast +// desc:在建项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busProjectinProgressController struct { + BaseController +} + +var BusProjectinProgress = new(busProjectinProgressController) + +// ListALLFunc 在建项目 +func (c *busProjectinProgressController) ListALLFunc(ctx context.Context, req *system.BusProjectinProgressSearchAllReq) (res *system.BusProjectinProgressSearchAllRes, err error) { + res = new(system.BusProjectinProgressSearchAllRes) + var eneity []*model.SysProjectListRes + err = dao.SysProject.Ctx(ctx).Where("show_hidden", "1").Scan(&eneity) + if eneity != nil { + res.SumNum = len(eneity) + for _, data := range eneity { + if data.IsType == "1" { + res.Photovoltaic = res.Photovoltaic + 1 + } + if data.IsType == "2" { + res.WindPower = res.WindPower + 1 + } + } + } + + value, err := dao.BusProjectinProgress.Ctx(ctx).Fields("sum(parallel_in)").Value() + res.ParallelIn = value.Float64() + return +} + +// List 列表 +func (c *busProjectinProgressController) List(ctx context.Context, req *system.BusProjectinProgressSearchReq) (res *system.BusProjectinProgressSearchRes, err error) { + res, err = service.BusProjectinProgress().List(ctx, req) + return +} + +// Get 获取在建项目 +func (c *busProjectinProgressController) Get(ctx context.Context, req *system.BusProjectinProgressGetReq) (res *system.BusProjectinProgressGetRes, err error) { + res = new(system.BusProjectinProgressGetRes) + res.BusProjectinProgressInfoRes, err = service.BusProjectinProgress().GetById(ctx, req.Id) + return +} + +// Add 添加在建项目 +func (c *busProjectinProgressController) Add(ctx context.Context, req *system.BusProjectinProgressAddReq) (res *system.BusProjectinProgressAddRes, err error) { + err = service.BusProjectinProgress().Add(ctx, req) + return +} + +// Edit 修改在建项目 +func (c *busProjectinProgressController) Edit(ctx context.Context, req *system.BusProjectinProgressEditReq) (res *system.BusProjectinProgressEditRes, err error) { + err = service.BusProjectinProgress().Edit(ctx, req) + return +} + +// Delete 删除在建项目 +func (c *busProjectinProgressController) Delete(ctx context.Context, req *system.BusProjectinProgressDeleteReq) (res *system.BusProjectinProgressDeleteRes, err error) { + err = service.BusProjectinProgress().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/bus_quality.go b/internal/app/system/controller/bus_quality.go new file mode 100644 index 0000000..9f15543 --- /dev/null +++ b/internal/app/system/controller/bus_quality.go @@ -0,0 +1,83 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-02 17:11:39 +// 生成路径: internal/app/system/controller/bus_quality.go +// 生成人:gfast +// desc:质量文档管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busQualityController struct { + BaseController +} + +var BusQuality = new(busQualityController) + +// List 列表 +func (c *busQualityController) List(ctx context.Context, req *system.BusQualitySearchReq) (res *system.BusQualitySearchRes, err error) { + res, err = service.BusQuality().List(ctx, req) + return +} + +// Get 获取质量文档管理 +func (c *busQualityController) Get(ctx context.Context, req *system.BusQualityGetReq) (res *system.BusQualityGetRes, err error) { + res = new(system.BusQualityGetRes) + res.BusQualityInfoRes, err = service.BusQuality().GetById(ctx, req.Id) + return +} + +// Add 添加质量文档管理 +func (c *busQualityController) Add(ctx context.Context, req *system.BusQualityAddReq) (res *system.BusQualityAddRes, err error) { + err = service.BusQuality().Add(ctx, req) + return +} + +// WxAddFunc 添加质量文档管理 +func (c *busQualityController) WxAddFunc(ctx context.Context, req *system.WxBusQualityAddReq) (res *system.WxBusQualityAddRes, err error) { + err = service.BusQuality().WxAddFunc(ctx, req) + return +} + +// Edit 修改质量文档管理 +func (c *busQualityController) Edit(ctx context.Context, req *system.BusQualityEditReq) (res *system.BusQualityEditRes, err error) { + err = service.BusQuality().Edit(ctx, req) + return +} + +// Delete 删除质量文档管理 +func (c *busQualityController) Delete(ctx context.Context, req *system.BusQualityDeleteReq) (res *system.BusQualityDeleteRes, err error) { + err = service.BusQuality().Delete(ctx, req.Ids) + return +} + +// GraphFunc 图标统计 +func (c *busQualityController) GraphFunc(ctx context.Context, req *system.GraphReq) (res *system.GraphRes, err error) { + res, err = service.BusQuality().GraphFunc(ctx, req) + return +} + +// GraphDataListFunc 图标统计列表 +func (c *busQualityController) GraphDataListFunc(ctx context.Context, req *system.GraphDataListReq) (res *system.GraphDataListRes, err error) { + res, err = service.BusQuality().GraphDataListFunc(ctx, req) + return +} + +// QualityFunc 质量监控统计 +func (c *busQualityController) QualityFunc(ctx context.Context, req *system.QualityReq) (res *system.QualityRes, err error) { + res, err = service.BusQuality().QualityFunc(ctx, req) + return +} + +// QualityDataListFunc 质量监控统计列表 +func (c *busQualityController) QualityDataListFunc(ctx context.Context, req *system.QualityDataListReq) (res *system.QualityDataListRes, err error) { + res, err = service.BusQuality().QualityDataListFunc(ctx, req) + return +} diff --git a/internal/app/system/controller/bus_question_bank.go b/internal/app/system/controller/bus_question_bank.go new file mode 100644 index 0000000..57aaf16 --- /dev/null +++ b/internal/app/system/controller/bus_question_bank.go @@ -0,0 +1,107 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-10-07 15:52:18 +// 生成路径: internal/app/system/controller/bus_question_bank.go +// 生成人:gfast +// desc:题库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "strconv" +) + +type busQuestionBankController struct { + BaseController +} + +var BusQuestionBank = new(busQuestionBankController) + +// List 列表 +func (c *busQuestionBankController) List(ctx context.Context, req *system.BusQuestionBankSearchReq) (res *system.BusQuestionBankSearchRes, err error) { + res, err = service.BusQuestionBank().List(ctx, req) + return +} + +// Get 获取题库 +func (c *busQuestionBankController) Get(ctx context.Context, req *system.BusQuestionBankGetReq) (res *system.BusQuestionBankGetRes, err error) { + res = new(system.BusQuestionBankGetRes) + res.BusQuestionBankInfoRes, err = service.BusQuestionBank().GetById(ctx, req.Id) + return +} + +// Add 添加题库 +func (c *busQuestionBankController) Add(ctx context.Context, req *system.BusQuestionBankAddReq) (res *system.BusQuestionBankAddRes, err error) { + err = service.BusQuestionBank().Add(ctx, req) + return +} + +// Edit 修改题库 +func (c *busQuestionBankController) Edit(ctx context.Context, req *system.BusQuestionBankEditReq) (res *system.BusQuestionBankEditRes, err error) { + err = service.BusQuestionBank().Edit(ctx, req) + return +} + +// Delete 删除题库 +func (c *busQuestionBankController) Delete(ctx context.Context, req *system.BusQuestionBankDeleteReq) (res *system.BusQuestionBankDeleteRes, err error) { + err = service.BusQuestionBank().Delete(ctx, req.Ids) + return +} + +// ExaminationPaper 随机生成试卷 +func (c *busQuestionBankController) ExaminationPaper(ctx context.Context, req *system.ExaminationPaperReq) (res *system.ExaminationPaperRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + res = new(system.ExaminationPaperRes) + //1、获取配置信息 + var configurationEntity *model.BusQuestionsConfigurationInfoRes + err = dao.BusQuestionsConfiguration.Ctx(ctx).Limit(1).Scan(&configurationEntity) + //2、随机获取数据,返回id和score + s := configurationEntity.SingleChoice + m := configurationEntity.MultipleChoice + e := configurationEntity.Estimate + var sEntity []*system.ExaminationPaperTwo + var mEntity []*system.ExaminationPaperTwo + var eEntity []*system.ExaminationPaperTwo + err = dao.BusQuestionBank.Ctx(ctx).Where("question_type", "1").OrderRandom().Limit(s).Scan(&sEntity) + err = dao.BusQuestionBank.Ctx(ctx).Where("question_type", "2").OrderRandom().Limit(m).Scan(&mEntity) + err = dao.BusQuestionBank.Ctx(ctx).Where("question_type", "3").OrderRandom().Limit(e).Scan(&eEntity) + //3、组装数据 + var one = new(system.ExaminationPaperOne) + one.Topic = "一、单选题,共" + strconv.Itoa(s) + "道题,每小题" + strconv.FormatFloat(configurationEntity.SingleScore, 'f', -1, 64) + "分,共计" + strconv.FormatFloat(float64(s)*configurationEntity.SingleScore, 'f', -1, 64) + "分" + for _, data := range sEntity { + data.Score = configurationEntity.SingleScore + } + one.List = sEntity + res.Single = one + + var two = new(system.ExaminationPaperOne) + two.Topic = "二、多选题,共" + strconv.Itoa(m) + "道题,每小题" + strconv.FormatFloat(configurationEntity.MultipleScore, 'f', -1, 64) + "分,共计" + strconv.FormatFloat(float64(m)*configurationEntity.MultipleScore, 'f', -1, 64) + "分" + for _, data := range mEntity { + data.Score = configurationEntity.MultipleScore + } + two.List = mEntity + res.Multiple = two + + var three = new(system.ExaminationPaperOne) + three.Topic = "三、判断题,共" + strconv.Itoa(e) + "道题,每小题" + strconv.FormatFloat(configurationEntity.EstimateScore, 'f', -1, 64) + "分,共计" + strconv.FormatFloat(float64(e)*configurationEntity.EstimateScore, 'f', -1, 64) + "分" + for _, data := range eEntity { + data.Score = configurationEntity.EstimateScore + } + three.List = eEntity + res.Estimate = three + //4、设置最大考试时间 + res.Maximum = configurationEntity.AnswerTime + //4、需要将生成的数据存储到记录表中 + liberr.ErrIsNil(ctx, err, "试卷生成失败!") + }) + return +} diff --git a/internal/app/system/controller/bus_question_save.go b/internal/app/system/controller/bus_question_save.go new file mode 100644 index 0000000..d3fac56 --- /dev/null +++ b/internal/app/system/controller/bus_question_save.go @@ -0,0 +1,344 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-11-01 17:33:04 +// 生成路径: internal/app/system/controller/bus_question_save.go +// 生成人:gfast +// desc:用户试卷存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "errors" + "fmt" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "os" + "path" + "path/filepath" + "strconv" + "strings" +) + +type busQuestionSaveController struct { + BaseController +} + +type UploadZipFileEntity struct { + Openid string `p:"openid" ` + SfzNumber string `p:"sfzNumber" ` + ProjectId int64 `p:"projectId" ` +} + +var BusQuestionSave = new(busQuestionSaveController) + +// List 列表 +func (c *busQuestionSaveController) List(ctx context.Context, req *system.BusQuestionSaveSearchReq) (res *system.BusQuestionSaveSearchRes, err error) { + res, err = service.BusQuestionSave().List(ctx, req) + return +} + +// Get 获取用户试卷存储 +func (c *busQuestionSaveController) Get(ctx context.Context, req *system.BusQuestionSaveGetReq) (res *system.BusQuestionSaveGetRes, err error) { + res = new(system.BusQuestionSaveGetRes) + res.BusQuestionSaveInfoRes, err = service.BusQuestionSave().GetById(ctx, req.Id) + return +} + +// Add 添加用户试卷存储 +func (c *busQuestionSaveController) Add(ctx context.Context, req *system.BusQuestionSaveAddReq) (res *system.BusQuestionSaveAddRes, err error) { + res = new(system.BusQuestionSaveAddRes) + res, err = service.BusQuestionSave().Add(ctx, req) + return +} + +// Delete 删除用户试卷存储 +func (c *busQuestionSaveController) Delete(ctx context.Context, req *system.BusQuestionSaveDeleteReq) (res *system.BusQuestionSaveDeleteRes, err error) { + err = service.BusQuestionSave().Delete(ctx, req.Ids) + return +} + +// PassOrNotFunc 查询用户的考试是否已达到及格线 +func (c *busQuestionSaveController) PassOrNotFunc(ctx context.Context, req *system.PassOrNotReq) (res *system.PassOrNotRes, err error) { + res = new(system.PassOrNotRes) + res, err = service.BusQuestionSave().PassOrNotFunc(ctx, req.Openid) + return +} + +// WeChatPdfWoFunc 根据项目id+班组id 查询到当前用户的考试信息-(安全考试) +func (c *busQuestionSaveController) WeChatPdfWoFunc(ctx context.Context, req *system.WeChatPdfWoReq) (res *system.WeChatPdfWoRes, err error) { + res = new(system.WeChatPdfWoRes) + res, err = service.BusQuestionSave().WeChatPdfWoFunc(ctx, req) + return +} + +// MultifileDownloadFunc 批量下载pdf +func (c *busQuestionSaveController) MultifileDownloadFunc(ctx context.Context, req *system.MultifileDownloadReq) (res *system.MultifileDownloadRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + res = new(system.MultifileDownloadRes) + //1、根据条件获取到数据 + var mw []*model.ModelWeChatPdfWoRes + if len(req.Openids) > 0 { + downloadFunc, err := DownloadFunc(ctx, req.Openids) + liberr.ErrIsNil(ctx, err, "获取数据失败") + mw = append(mw, downloadFunc...) + } + //else { + // //array, err = g.DB().Model("bus_question_save_pdf").As("a"). + // // LeftJoin("bus_construction_user", "b", "b.openid = a.openid and b.project_id = '"+strconv.FormatInt(req.ProjectId, 10)+"' and team_id = '"+strconv.FormatInt(req.TeamId, 10)+"'"). + // // WhereNotNull("a.openid").Fields("a.path").Array() + //} + path, err := coryCommon.CustomizationMultifileDownload(coryCommon.Temporary, mw) + if err != nil { + liberr.ErrIsNil(ctx, err, "下载失败") + } + path = filepath.ToSlash(coryCommon.ResourcePublicToFunc(path, 1)) + res.Path = path + }) + return +} + +func DownloadFunc(ctx context.Context, openids []string) (res []*model.ModelWeChatPdfWoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + mp := make(map[string]*model.ModelWeChatPdfWoRes) + //0、获取配置信息 + var configurationEntity *model.BusQuestionsConfigurationInfoRes + err = dao.BusQuestionsConfiguration.Ctx(ctx).Limit(1).Scan(&configurationEntity) + liberr.ErrIsNil(ctx, err, "查询失败") + //1、获取线上的试卷信息 + var mwor []*model.ModelWeChatPdfWoRes + err = dao.BusQuestionSave.Ctx(ctx).As("a").Fields(`a.openid, + b.user_name as userName, + a.pass, + (select sum( score ) from bus_question_save WHERE correct = 1 and openid = a.openid) as sumScore, + c.path`). + RightJoin("bus_construction_user", "b", "b.openid = a.openid"). + LeftJoin("bus_question_save_pdf", "c", "c.openid = b.openid"). + Where("a.openid in (?)", openids). + Where(`a.pass is not null`). + Order("a.created_at"). + Scan(&mwor) + for i := range mwor { + mwor[i].Type = "1" //pdf + mp[mwor[i].Openid] = mwor[i] + } + liberr.ErrIsNil(ctx, err, "查询失败") + //2、获取线下的试卷信息 + var offlineEnitnty []*model.ModelWeChatPdfWoRes + err = g.DB().Model("bus_question_offline").As("a"). + Fields( + "a.openid,"+ + "b.user_name as userName,"+ + "concat_ws( ',',a.pass,a.full_mark ) as pass,"+ + "a.score as sumScore,"+ + "a.img as path,"). + LeftJoin("bus_construction_user", "b", "b.openid = a.openid"). + Where("a.openid in (?)", openids). + Scan(&offlineEnitnty) + liberr.ErrIsNil(ctx, err, "查询失败") + //3、数据信息合并(同一个人选取最大分数的试卷信息) + for i := range offlineEnitnty { + //如果发现有重复的openid,那么就选取得分最大的 + mpdata, ok := mp[offlineEnitnty[i].Openid] + if ok { + mpdataSplit := strings.Split(mpdata.Pass, ",") + mpdataFloat, _ := strconv.ParseFloat(mpdataSplit[1], 64) + mpdataScore, _ := strconv.ParseFloat(mpdata.SumScore, 64) + mpdataScoreOne := 100.00 / mpdataFloat * mpdataScore + offlineSplit := strings.Split(offlineEnitnty[i].Pass, ",") + offlineFloat, _ := strconv.ParseFloat(offlineSplit[1], 64) + offlineScore, _ := strconv.ParseFloat(offlineEnitnty[i].SumScore, 64) + offlineScoreTwo := 100.00 / offlineFloat * offlineScore + if mpdataScoreOne < offlineScoreTwo { + offlineEnitnty[i].Type = "2" //图片 + mp[offlineEnitnty[i].Openid] = offlineEnitnty[i] + } + } + } + for _, v := range mp { + res = append(res, v) + } + liberr.ErrIsNil(ctx, err, "获取数据失败") + }) + return +} + +// UploadZipFileFunc 上传施工人员线下安全考试的资料信息(上传压缩zip文件) +func (c *busQuestionSaveController) UploadZipFileFunc(ctx context.Context, req *system.UploadZipFileReq) (res *system.UploadZipFileRes, err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 初始化 res 变量 + res = &system.UploadZipFileRes{} + ////1、上传压缩文件 + //file := req.File + //path, err := coryCommon.UploadFile(ctx, file, coryCommon.Temporary+"/") + //liberr.ErrIsNil(ctx, err) + const old = "/resource/public/" + if !strings.Contains(req.FilePath, old) { + req.FilePath = old + req.FilePath + } + rpath := strings.Replace(req.FilePath, old, coryCommon.GetCWD()+old, 1) + str := "/" + coryCommon.Ynr(coryCommon.Temporary+"/") + coryCommon.FileName("del") + //2、解压文件 删除解压文件 + folderPath, err := coryCommon.FileZipFunc(rpath, "", str) + liberr.ErrIsNil(ctx, err) + //3、读取文件目录 + offline, err := ReadDirectory(ctx, folderPath) + liberr.ErrIsNil(ctx, err) + //4、获取身份证信息对应的openid + var sfz []string + for _, data := range offline { + // 根据身份证获取到指定用户所在的项目 + sfz = append(sfz, data.IdentityCard) + } + if len(sfz) > 0 { + var entity []*UploadZipFileEntity + err = dao.BusConstructionUser.Ctx(ctx).Where("sfz_number in (?)", sfz).Fields("project_id as projectId,openid,sfz_number as sfzNumber").Scan(&entity) + liberr.ErrIsNil(ctx, err, "上传失败") + for _, one := range entity { + for j, two := range offline { + if one.SfzNumber == two.IdentityCard { + offline[j].Openid = one.Openid + offline[j].ProjectId = one.ProjectId + } + } + } + //5、查询原本的数据,然后对比哪个分数大就保留哪个 + var offlineEntity []*model.BusQuestionOfflineRes + err = g.DB().Model("bus_question_offline").Ctx(ctx).Scan(&offlineEntity) + liberr.ErrIsNil(ctx, err, "上传失败") + var ids []int64 + for _, one := range offlineEntity { + scoreOne := 100.00 / one.FullMark * one.Score + for _, two := range offline { + if one.Openid == two.Openid { + scoreTwo := 100.00 / two.FullMark * two.Score + if scoreOne <= scoreTwo { + //记录需要删除的id + ids = append(ids, one.Id) + if one.Img != "" { + os.Remove(coryCommon.FileToFunc(one.Img, 2)) + } + } + } + } + } + //6、删除分数小的对比数据 + if len(ids) > 0 { + value, err := g.DB().Model("bus_question_offline").Ctx(ctx). + Fields("GROUP_CONCAT(img)"). + Where("id in (?)", ids).Value() + liberr.ErrIsNil(ctx, err, "上传失败") + _, err = g.DB().Model("bus_question_offline").Ctx(ctx).Where("id in (?)", ids).Delete() + liberr.ErrIsNil(ctx, err, "上传失败") + if err == nil { + split := strings.Split(value.String(), ",") + for _, files := range split { + var f = coryCommon.FileToFunc(files, 2) + os.Remove(f) + } + } + } + //7、插入数据 + if offline != nil { + var oe []*model.BusQuestionOfflineRes + for i := range offline { + if offline[i].Openid != "" { + oe = append(oe, offline[i]) + } + } + _, err = g.DB().Model("bus_question_offline").Ctx(ctx).Insert(oe) + liberr.ErrIsNil(ctx, err, "上传失败") + } + } + defer func() { + os.RemoveAll(rpath) + os.RemoveAll(coryCommon.GetCWD() + str) + }() + return + }) + return err + }) + return +} + +// ReadDirectory 获取文件夹下面的所有文件 +func ReadDirectory(ctx context.Context, folderPath string) (entity []*model.BusQuestionOfflineRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 读取文件夹下的所有文件和子文件夹 + files, err := os.ReadDir(folderPath) + if err != nil { + fmt.Println("读取文件夹失败: ", err) + return + } + for _, file := range files { + // 获取文件或子文件夹的名称 + fileName := file.Name() + //fileName, err = coryCommon.GbkDecode(fileName) + //if err != nil { + // fmt.Println("解码文件名称失败: ", err) + // return + //} + // 获取文件或子文件夹的绝对路径 + filePath := filepath.Join(folderPath, fileName) + // 检查文件是否为文件夹 + if file.IsDir() { + split := strings.Split(fileName, "-") + if len(split) < 5 { + err := errors.New("您的文件【" + filePath + "】不符合规格!(示例:小明-5130112333654X-100-59-60)") + liberr.ErrIsNil(ctx, err) + return + } + fullMark, err := strconv.ParseFloat(split[2], 64) + liberr.ErrIsNil(ctx, err, "满分转换失败") + score, err := strconv.ParseFloat(split[3], 64) + liberr.ErrIsNil(ctx, err, "得分转换失败") + pass, err := strconv.ParseFloat(split[4], 64) + liberr.ErrIsNil(ctx, err, "及格分转换失败") + res := model.BusQuestionOfflineRes{ + FullMark: fullMark, + Score: score, + Pass: pass, + IdentityCard: split[1], + //CreatedAt: gtime.New(time.Now()), + } + offlineRes, err := ReadDirectory(ctx, filePath) + imgStr := "" + for i := range offlineRes { + s2 := filepath.ToSlash(offlineRes[i].Img) + var s1 = filepath.ToSlash(coryCommon.GetCWD() + "/" + coryCommon.Ynr(coryCommon.Helmet) + coryCommon.FileName("aqks") + path.Ext(s2)) + os.Rename(s2, s1) + all := strings.ReplaceAll(s1, coryCommon.GetCWD()+"/resource/public/", "/file/") + imgStr = imgStr + all + "," + } + if len(imgStr) > 0 { + imgStr = imgStr[0 : len(imgStr)-1] + } + res.Img = imgStr + entity = append(entity, &res) + } else { + var suffix = ".jpg,.jpeg,.png,.pdf,.doc,.docx" + flag := coryCommon.FormatRestrictionFunc(filePath, suffix) + if !flag { + err = errors.New("仅支持的格式为:" + suffix) + liberr.ErrIsNil(ctx, err) + return + } else { + res := model.BusQuestionOfflineRes{ + Img: filePath, + } + entity = append(entity, &res) + } + } + } + }) + return +} diff --git a/internal/app/system/controller/bus_questions_configuration.go b/internal/app/system/controller/bus_questions_configuration.go new file mode 100644 index 0000000..9f5b463 --- /dev/null +++ b/internal/app/system/controller/bus_questions_configuration.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-10-07 17:11:20 +// 生成路径: internal/app/system/controller/bus_questions_configuration.go +// 生成人:gfast +// desc:题库配置 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busQuestionsConfigurationController struct { + BaseController +} + +var BusQuestionsConfiguration = new(busQuestionsConfigurationController) + +// List 列表 +func (c *busQuestionsConfigurationController) List(ctx context.Context, req *system.BusQuestionsConfigurationSearchReq) (res *system.BusQuestionsConfigurationSearchRes, err error) { + res, err = service.BusQuestionsConfiguration().List(ctx, req) + return +} + +// Get 获取题库配置 +func (c *busQuestionsConfigurationController) Get(ctx context.Context, req *system.BusQuestionsConfigurationGetReq) (res *system.BusQuestionsConfigurationGetRes, err error) { + res = new(system.BusQuestionsConfigurationGetRes) + res.BusQuestionsConfigurationInfoRes, err = service.BusQuestionsConfiguration().GetById(ctx, req.Id) + return +} + +// Add 添加题库配置 +func (c *busQuestionsConfigurationController) Add(ctx context.Context, req *system.BusQuestionsConfigurationAddReq) (res *system.BusQuestionsConfigurationAddRes, err error) { + err = service.BusQuestionsConfiguration().Add(ctx, req) + return +} + +// Edit 修改题库配置 +func (c *busQuestionsConfigurationController) Edit(ctx context.Context, req *system.BusQuestionsConfigurationEditReq) (res *system.BusQuestionsConfigurationEditRes, err error) { + err = service.BusQuestionsConfiguration().Edit(ctx, req) + return +} + +// Delete 删除题库配置 +func (c *busQuestionsConfigurationController) Delete(ctx context.Context, req *system.BusQuestionsConfigurationDeleteReq) (res *system.BusQuestionsConfigurationDeleteRes, err error) { + err = service.BusQuestionsConfiguration().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/bus_reissue_a_card.go b/internal/app/system/controller/bus_reissue_a_card.go new file mode 100644 index 0000000..0cdaaa3 --- /dev/null +++ b/internal/app/system/controller/bus_reissue_a_card.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-02-02 15:18:48 +// 生成路径: internal/app/system/controller/bus_reissue_a_card.go +// 生成人:gfast +// desc:施工人员补卡申请 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busReissueACardController struct { + BaseController +} + +var BusReissueACard = new(busReissueACardController) + +// List 列表 +func (c *busReissueACardController) List(ctx context.Context, req *system.BusReissueACardSearchReq) (res *system.BusReissueACardSearchRes, err error) { + res, err = service.BusReissueACard().List(ctx, req) + return +} + +// Get 获取施工人员补卡申请 +func (c *busReissueACardController) Get(ctx context.Context, req *system.BusReissueACardGetReq) (res *system.BusReissueACardGetRes, err error) { + res = new(system.BusReissueACardGetRes) + res.BusReissueACardInfoRes, err = service.BusReissueACard().GetById(ctx, req.Id) + return +} + +//// Add 添加施工人员补卡申请 +//func (c *busReissueACardController) Add(ctx context.Context, req *system.BusReissueACardAddReq) (res *system.BusReissueACardAddRes, err error) { +// err = service.BusReissueACard().Add(ctx, req) +// return +//} + +// Edit 修改施工人员补卡申请 +func (c *busReissueACardController) Edit(ctx context.Context, req *system.BusReissueACardEditReq) (res *system.BusReissueACardEditRes, err error) { + err = service.BusReissueACard().Edit(ctx, req) + return +} + +//// Delete 删除施工人员补卡申请 +//func (c *busReissueACardController) Delete(ctx context.Context, req *system.BusReissueACardDeleteReq) (res *system.BusReissueACardDeleteRes, err error) { +// err = service.BusReissueACard().Delete(ctx, req.Ids) +// return +//} diff --git a/internal/app/system/controller/bus_research_document.go b/internal/app/system/controller/bus_research_document.go new file mode 100644 index 0000000..5b41bde --- /dev/null +++ b/internal/app/system/controller/bus_research_document.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-07-29 16:04:06 +// 生成路径: internal/app/system/controller/bus_research_document.go +// 生成人:gfast +// desc:科研文档 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busResearchDocumentController struct { + BaseController +} + +var BusResearchDocument = new(busResearchDocumentController) + +// List 列表 +func (c *busResearchDocumentController) List(ctx context.Context, req *system.BusResearchDocumentSearchReq) (res *system.BusResearchDocumentSearchRes, err error) { + res, err = service.BusResearchDocument().List(ctx, req) + return +} + +// Get 获取科研文档 +func (c *busResearchDocumentController) Get(ctx context.Context, req *system.BusResearchDocumentGetReq) (res *system.BusResearchDocumentGetRes, err error) { + res = new(system.BusResearchDocumentGetRes) + res.BusResearchDocumentInfoRes, err = service.BusResearchDocument().GetById(ctx, req.Id) + return +} + +// Add 添加科研文档 +func (c *busResearchDocumentController) Add(ctx context.Context, req *system.BusResearchDocumentAddReq) (res *system.BusResearchDocumentAddRes, err error) { + err = service.BusResearchDocument().Add(ctx, req) + return +} + +// Edit 修改科研文档 +func (c *busResearchDocumentController) Edit(ctx context.Context, req *system.BusResearchDocumentEditReq) (res *system.BusResearchDocumentEditRes, err error) { + err = service.BusResearchDocument().Edit(ctx, req) + return +} + +// Delete 删除科研文档 +func (c *busResearchDocumentController) Delete(ctx context.Context, req *system.BusResearchDocumentDeleteReq) (res *system.BusResearchDocumentDeleteRes, err error) { + err = service.BusResearchDocument().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/bus_safety.go b/internal/app/system/controller/bus_safety.go new file mode 100644 index 0000000..c6a82e5 --- /dev/null +++ b/internal/app/system/controller/bus_safety.go @@ -0,0 +1,59 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-02 15:40:48 +// 生成路径: internal/app/system/controller/bus_safety.go +// 生成人:gfast +// desc:安全例会管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busSafetyController struct { + BaseController +} + +var BusSafety = new(busSafetyController) + +// List 列表 +func (c *busSafetyController) List(ctx context.Context, req *system.BusSafetySearchReq) (res *system.BusSafetySearchRes, err error) { + res, err = service.BusSafety().List(ctx, req) + return +} + +// Get 获取安全例会管理 +func (c *busSafetyController) Get(ctx context.Context, req *system.BusSafetyGetReq) (res *system.BusSafetyGetRes, err error) { + res = new(system.BusSafetyGetRes) + res.BusSafetyInfoRes, err = service.BusSafety().GetById(ctx, req.Id) + return +} + +// Add 添加安全例会管理 +func (c *busSafetyController) Add(ctx context.Context, req *system.BusSafetyAddReq) (res *system.BusSafetyAddRes, err error) { + err = service.BusSafety().Add(ctx, req) + return +} + +// WxAddFunc 微信小程序添加安全例会管理 +func (c *busSafetyController) WxAddFunc(ctx context.Context, req *system.WxBusSafetyAddReq) (res *system.WxBusSafetyAddRes, err error) { + err = service.BusSafety().WxAddFunc(ctx, req) + return +} + +// Edit 修改安全例会管理 +func (c *busSafetyController) Edit(ctx context.Context, req *system.BusSafetyEditReq) (res *system.BusSafetyEditRes, err error) { + err = service.BusSafety().Edit(ctx, req) + return +} + +// Delete 删除安全例会管理 +func (c *busSafetyController) Delete(ctx context.Context, req *system.BusSafetyDeleteReq) (res *system.BusSafetyDeleteRes, err error) { + err = service.BusSafety().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/bus_salary_details.go b/internal/app/system/controller/bus_salary_details.go new file mode 100644 index 0000000..c5e7176 --- /dev/null +++ b/internal/app/system/controller/bus_salary_details.go @@ -0,0 +1,67 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-02-01 16:39:01 +// 生成路径: internal/app/system/controller/bus_salary_details.go +// 生成人:gfast +// desc:员工工资考核记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busSalaryDetailsController struct { + BaseController +} + +var BusSalaryDetails = new(busSalaryDetailsController) + +// List 列表 +func (c *busSalaryDetailsController) List(ctx context.Context, req *system.BusSalaryDetailsSearchReq) (res *system.BusSalaryDetailsSearchRes, err error) { + res, err = service.BusSalaryDetails().List(ctx, req) + return +} + +// Get 获取员工工资考核记录 +func (c *busSalaryDetailsController) Get(ctx context.Context, req *system.BusSalaryDetailsGetReq) (res *system.BusSalaryDetailsGetRes, err error) { + res = new(system.BusSalaryDetailsGetRes) + res.BusSalaryDetailsInfoRes, err = service.BusSalaryDetails().GetById(ctx, req.Id) + return +} + +// Add 添加员工工资考核记录 +func (c *busSalaryDetailsController) Add(ctx context.Context, req *system.BusSalaryDetailsAddReq) (res *system.BusSalaryDetailsAddRes, err error) { + err = service.BusSalaryDetails().Add(ctx, req) + return +} + +// Edit 修改员工工资考核记录 +func (c *busSalaryDetailsController) Edit(ctx context.Context, req *system.BusSalaryDetailsEditReq) (res *system.BusSalaryDetailsEditRes, err error) { + err = service.BusSalaryDetails().Edit(ctx, req) + return +} + +// Delete 删除员工工资考核记录 +func (c *busSalaryDetailsController) Delete(ctx context.Context, req *system.BusSalaryDetailsDeleteReq) (res *system.BusSalaryDetailsDeleteRes, err error) { + err = service.BusSalaryDetails().Delete(ctx, req.Ids) + return +} + +// GetByIdDetailFunc 获取当前考勤记录的明细 +func (c *busSalaryDetailsController) GetByIdDetailFunc(ctx context.Context, req *system.GetByIdDetailFuncReq) (res *system.GetByIdDetailFuncRes, err error) { + res = new(system.GetByIdDetailFuncRes) + res, err = service.BusSalaryDetails().GetByIdDetailFunc(ctx, req) + return +} + +// SalarySheetFunc 工资条获取(可根据项目or班组or施工人员) +func (c *busSalaryDetailsController) SalarySheetFunc(ctx context.Context, req *system.SalarySheetFuncReq) (res *system.SalarySheetFuncRes, err error) { + res = new(system.SalarySheetFuncRes) + res, err = service.BusSalaryDetails().SalarySheetFunc(ctx, req) + return +} diff --git a/internal/app/system/controller/bus_scheduled_plan_type.go b/internal/app/system/controller/bus_scheduled_plan_type.go new file mode 100644 index 0000000..5201420 --- /dev/null +++ b/internal/app/system/controller/bus_scheduled_plan_type.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-07-29 17:39:12 +// 生成路径: internal/app/system/controller/bus_scheduled_plan_type.go +// 生成人:gfast +// desc:施工进度分类 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busScheduledPlanTypeController struct { + BaseController +} + +var BusScheduledPlanType = new(busScheduledPlanTypeController) + +// List 列表 +func (c *busScheduledPlanTypeController) List(ctx context.Context, req *system.BusScheduledPlanTypeSearchReq) (res *system.BusScheduledPlanTypeSearchRes, err error) { + res, err = service.BusScheduledPlanType().List(ctx, req) + return +} + +// Get 获取施工进度分类 +func (c *busScheduledPlanTypeController) Get(ctx context.Context, req *system.BusScheduledPlanTypeGetReq) (res *system.BusScheduledPlanTypeGetRes, err error) { + res = new(system.BusScheduledPlanTypeGetRes) + res.BusScheduledPlanTypeInfoRes, err = service.BusScheduledPlanType().GetByPlanTypeId(ctx, req.PlanTypeId) + return +} + +// Add 添加施工进度分类 +func (c *busScheduledPlanTypeController) Add(ctx context.Context, req *system.BusScheduledPlanTypeAddReq) (res *system.BusScheduledPlanTypeAddRes, err error) { + err = service.BusScheduledPlanType().Add(ctx, req) + return +} + +// Edit 修改施工进度分类 +func (c *busScheduledPlanTypeController) Edit(ctx context.Context, req *system.BusScheduledPlanTypeEditReq) (res *system.BusScheduledPlanTypeEditRes, err error) { + err = service.BusScheduledPlanType().Edit(ctx, req) + return +} + +// Delete 删除施工进度分类 +func (c *busScheduledPlanTypeController) Delete(ctx context.Context, req *system.BusScheduledPlanTypeDeleteReq) (res *system.BusScheduledPlanTypeDeleteRes, err error) { + err = service.BusScheduledPlanType().Delete(ctx, req.PlanTypeIds) + return +} diff --git a/internal/app/system/controller/bus_scheduled_plan_type_detail.go b/internal/app/system/controller/bus_scheduled_plan_type_detail.go new file mode 100644 index 0000000..b8d2ae1 --- /dev/null +++ b/internal/app/system/controller/bus_scheduled_plan_type_detail.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-07-29 17:15:27 +// 生成路径: internal/app/system/controller/bus_scheduled_plan_type_detail.go +// 生成人:gfast +// desc:施工进度月报,年报分类 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busScheduledPlanTypeDetailController struct { + BaseController +} + +var BusScheduledPlanTypeDetail = new(busScheduledPlanTypeDetailController) + +// List 列表 +func (c *busScheduledPlanTypeDetailController) List(ctx context.Context, req *system.BusScheduledPlanTypeDetailSearchReq) (res *system.BusScheduledPlanTypeDetailSearchRes, err error) { + res, err = service.BusScheduledPlanTypeDetail().List(ctx, req) + return +} + +// Get 获取施工进度月报,年报分类 +func (c *busScheduledPlanTypeDetailController) Get(ctx context.Context, req *system.BusScheduledPlanTypeDetailGetReq) (res *system.BusScheduledPlanTypeDetailGetRes, err error) { + res = new(system.BusScheduledPlanTypeDetailGetRes) + res.BusScheduledPlanTypeDetailInfoRes, err = service.BusScheduledPlanTypeDetail().GetByPlanTypeDetailId(ctx, req.PlanTypeDetailId) + return +} + +// Add 添加施工进度月报,年报分类 +func (c *busScheduledPlanTypeDetailController) Add(ctx context.Context, req *system.BusScheduledPlanTypeDetailAddReq) (res *system.BusScheduledPlanTypeDetailAddRes, err error) { + err = service.BusScheduledPlanTypeDetail().Add(ctx, req) + return +} + +// Edit 修改施工进度月报,年报分类 +func (c *busScheduledPlanTypeDetailController) Edit(ctx context.Context, req *system.BusScheduledPlanTypeDetailEditReq) (res *system.BusScheduledPlanTypeDetailEditRes, err error) { + err = service.BusScheduledPlanTypeDetail().Edit(ctx, req) + return +} + +// Delete 删除施工进度月报,年报分类 +func (c *busScheduledPlanTypeDetailController) Delete(ctx context.Context, req *system.BusScheduledPlanTypeDetailDeleteReq) (res *system.BusScheduledPlanTypeDetailDeleteRes, err error) { + err = service.BusScheduledPlanTypeDetail().Delete(ctx, req.PlanTypeDetailIds) + return +} diff --git a/internal/app/system/controller/bus_scheduled_weekly.go b/internal/app/system/controller/bus_scheduled_weekly.go new file mode 100644 index 0000000..90b7c88 --- /dev/null +++ b/internal/app/system/controller/bus_scheduled_weekly.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-02 15:28:49 +// 生成路径: internal/app/system/controller/bus_scheduled_weekly.go +// 生成人:gfast +// desc:周报 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busScheduledWeeklyController struct { + BaseController +} + +var BusScheduledWeekly = new(busScheduledWeeklyController) + +// List 列表 +func (c *busScheduledWeeklyController) List(ctx context.Context, req *system.BusScheduledWeeklySearchReq) (res *system.BusScheduledWeeklySearchRes, err error) { + res, err = service.BusScheduledWeekly().List(ctx, req) + return +} + +// Get 获取周报 +func (c *busScheduledWeeklyController) Get(ctx context.Context, req *system.BusScheduledWeeklyGetReq) (res *system.BusScheduledWeeklyGetRes, err error) { + res = new(system.BusScheduledWeeklyGetRes) + res.BusScheduledWeeklyInfoRes, err = service.BusScheduledWeekly().GetByPlanWeeklyId(ctx, req.PlanWeeklyId) + return +} + +// Add 添加周报 +func (c *busScheduledWeeklyController) Add(ctx context.Context, req *system.BusScheduledWeeklyAddReq) (res *system.BusScheduledWeeklyAddRes, err error) { + err = service.BusScheduledWeekly().Add(ctx, req) + return +} + +// Edit 修改周报 +func (c *busScheduledWeeklyController) Edit(ctx context.Context, req *system.BusScheduledWeeklyEditReq) (res *system.BusScheduledWeeklyEditRes, err error) { + err = service.BusScheduledWeekly().Edit(ctx, req) + return +} + +// Delete 删除周报 +func (c *busScheduledWeeklyController) Delete(ctx context.Context, req *system.BusScheduledWeeklyDeleteReq) (res *system.BusScheduledWeeklyDeleteRes, err error) { + err = service.BusScheduledWeekly().Delete(ctx, req.PlanWeeklyIds) + return +} diff --git a/internal/app/system/controller/bus_scheduled_weekly_photovoltaic.go b/internal/app/system/controller/bus_scheduled_weekly_photovoltaic.go new file mode 100644 index 0000000..692ad52 --- /dev/null +++ b/internal/app/system/controller/bus_scheduled_weekly_photovoltaic.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-02 15:21:55 +// 生成路径: internal/app/system/controller/bus_scheduled_weekly_photovoltaic.go +// 生成人:gfast +// desc:周报-光伏板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busScheduledWeeklyPhotovoltaicController struct { + BaseController +} + +var BusScheduledWeeklyPhotovoltaic = new(busScheduledWeeklyPhotovoltaicController) + +// List 列表 +func (c *busScheduledWeeklyPhotovoltaicController) List(ctx context.Context, req *system.BusScheduledWeeklyPhotovoltaicSearchReq) (res *system.BusScheduledWeeklyPhotovoltaicSearchRes, err error) { + res, err = service.BusScheduledWeeklyPhotovoltaic().List(ctx, req) + return +} + +// Get 获取周报-光伏板 +func (c *busScheduledWeeklyPhotovoltaicController) Get(ctx context.Context, req *system.BusScheduledWeeklyPhotovoltaicGetReq) (res *system.BusScheduledWeeklyPhotovoltaicGetRes, err error) { + res = new(system.BusScheduledWeeklyPhotovoltaicGetRes) + res.BusScheduledWeeklyPhotovoltaicInfoRes, err = service.BusScheduledWeeklyPhotovoltaic().GetByPhotovoltaicId(ctx, req.PhotovoltaicId) + return +} + +// Add 添加周报-光伏板 +func (c *busScheduledWeeklyPhotovoltaicController) Add(ctx context.Context, req *system.BusScheduledWeeklyPhotovoltaicAddReq) (res *system.BusScheduledWeeklyPhotovoltaicAddRes, err error) { + err = service.BusScheduledWeeklyPhotovoltaic().Add(ctx, req) + return +} + +// Edit 修改周报-光伏板 +func (c *busScheduledWeeklyPhotovoltaicController) Edit(ctx context.Context, req *system.BusScheduledWeeklyPhotovoltaicEditReq) (res *system.BusScheduledWeeklyPhotovoltaicEditRes, err error) { + err = service.BusScheduledWeeklyPhotovoltaic().Edit(ctx, req) + return +} + +// Delete 删除周报-光伏板 +func (c *busScheduledWeeklyPhotovoltaicController) Delete(ctx context.Context, req *system.BusScheduledWeeklyPhotovoltaicDeleteReq) (res *system.BusScheduledWeeklyPhotovoltaicDeleteRes, err error) { + err = service.BusScheduledWeeklyPhotovoltaic().Delete(ctx, req.PhotovoltaicIds) + return +} diff --git a/internal/app/system/controller/bus_standing_book.go b/internal/app/system/controller/bus_standing_book.go new file mode 100644 index 0000000..30c1792 --- /dev/null +++ b/internal/app/system/controller/bus_standing_book.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-07-29 11:36:04 +// 生成路径: internal/app/system/controller/bus_standing_book.go +// 生成人:gfast +// desc:台账 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busStandingBookController struct { + BaseController +} + +var BusStandingBook = new(busStandingBookController) + +// List 列表 +func (c *busStandingBookController) List(ctx context.Context, req *system.BusStandingBookSearchReq) (res *system.BusStandingBookSearchRes, err error) { + res, err = service.BusStandingBook().List(ctx, req) + return +} + +// Get 获取台账 +func (c *busStandingBookController) Get(ctx context.Context, req *system.BusStandingBookGetReq) (res *system.BusStandingBookGetRes, err error) { + res = new(system.BusStandingBookGetRes) + res.BusStandingBookInfoRes, err = service.BusStandingBook().GetByStandingBookId(ctx, req.StandingBookId) + return +} + +// Add 添加台账 +func (c *busStandingBookController) Add(ctx context.Context, req *system.BusStandingBookAddReq) (res *system.BusStandingBookAddRes, err error) { + err = service.BusStandingBook().Add(ctx, req) + return +} + +// Edit 修改台账 +func (c *busStandingBookController) Edit(ctx context.Context, req *system.BusStandingBookEditReq) (res *system.BusStandingBookEditRes, err error) { + err = service.BusStandingBook().Edit(ctx, req) + return +} + +// Delete 删除台账 +func (c *busStandingBookController) Delete(ctx context.Context, req *system.BusStandingBookDeleteReq) (res *system.BusStandingBookDeleteRes, err error) { + err = service.BusStandingBook().Delete(ctx, req.StandingBookIds) + return +} diff --git a/internal/app/system/controller/bus_tour.go b/internal/app/system/controller/bus_tour.go new file mode 100644 index 0000000..29f823a --- /dev/null +++ b/internal/app/system/controller/bus_tour.go @@ -0,0 +1,59 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-10-10 12:11:05 +// 生成路径: internal/app/system/controller/bus_tour.go +// 生成人:gfast +// desc:煤科巡视-故障记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busTourController struct { + BaseController +} + +var BusTour = new(busTourController) + +// List 列表 +func (c *busTourController) List(ctx context.Context, req *system.BusTourSearchReq) (res *system.BusTourSearchRes, err error) { + res, err = service.BusTour().List(ctx, req) + return +} + +// Get 获取煤科巡视-故障记录 +func (c *busTourController) Get(ctx context.Context, req *system.BusTourGetReq) (res *system.BusTourGetRes, err error) { + res = new(system.BusTourGetRes) + res.BusTourInfoRes, err = service.BusTour().GetById(ctx, req.Id) + return +} + +// Add 添加煤科巡视-故障记录 +func (c *busTourController) Add(ctx context.Context, req *system.BusTourAddReq) (res *system.BusTourAddRes, err error) { + err = service.BusTour().Add(ctx, req) + return +} + +// Edit 修改煤科巡视-故障记录 +func (c *busTourController) Edit(ctx context.Context, req *system.BusTourEditReq) (res *system.BusTourEditRes, err error) { + err = service.BusTour().Edit(ctx, req) + return +} + +// Delete 删除煤科巡视-故障记录 +func (c *busTourController) Delete(ctx context.Context, req *system.BusTourDeleteReq) (res *system.BusTourDeleteRes, err error) { + err = service.BusTour().Delete(ctx, req.Ids) + return +} + +// ListAll GIS大屏展示所有ai +func (c *busTourController) ListAll(ctx context.Context, req *system.BusTourSearchAllReq) (res *system.BusTourSearchAllRes, err error) { + res, err = service.BusTour().ListAll(ctx, req) + return +} diff --git a/internal/app/system/controller/bus_type_of_wage.go b/internal/app/system/controller/bus_type_of_wage.go new file mode 100644 index 0000000..1362550 --- /dev/null +++ b/internal/app/system/controller/bus_type_of_wage.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-09-05 10:07:11 +// 生成路径: internal/app/system/controller/bus_type_of_wage.go +// 生成人:gfast +// desc:工种薪水 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busTypeOfWageController struct { + BaseController +} + +var BusTypeOfWage = new(busTypeOfWageController) + +// List 列表 +func (c *busTypeOfWageController) List(ctx context.Context, req *system.BusTypeOfWageSearchReq) (res *system.BusTypeOfWageSearchRes, err error) { + res, err = service.BusTypeOfWage().List(ctx, req) + return +} + +// Get 获取工种薪水 +func (c *busTypeOfWageController) Get(ctx context.Context, req *system.BusTypeOfWageGetReq) (res *system.BusTypeOfWageGetRes, err error) { + res = new(system.BusTypeOfWageGetRes) + res.BusTypeOfWageInfoRes, err = service.BusTypeOfWage().GetById(ctx, req.Id) + return +} + +// Add 添加工种薪水 +func (c *busTypeOfWageController) Add(ctx context.Context, req *system.BusTypeOfWageAddReq) (res *system.BusTypeOfWageAddRes, err error) { + err = service.BusTypeOfWage().Add(ctx, req) + return +} + +// Edit 修改工种薪水 +func (c *busTypeOfWageController) Edit(ctx context.Context, req *system.BusTypeOfWageEditReq) (res *system.BusTypeOfWageEditRes, err error) { + err = service.BusTypeOfWage().Edit(ctx, req) + return +} + +// Delete 删除工种薪水 +func (c *busTypeOfWageController) Delete(ctx context.Context, req *system.BusTypeOfWageDeleteReq) (res *system.BusTypeOfWageDeleteRes, err error) { + err = service.BusTypeOfWage().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/bus_violation_level.go b/internal/app/system/controller/bus_violation_level.go new file mode 100644 index 0000000..ed693e5 --- /dev/null +++ b/internal/app/system/controller/bus_violation_level.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-11-20 11:18:36 +// 生成路径: internal/app/system/controller/bus_violation_level.go +// 生成人:gfast +// desc:违章等级 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busViolationLevelController struct { + BaseController +} + +var BusViolationLevel = new(busViolationLevelController) + +// List 列表 +func (c *busViolationLevelController) List(ctx context.Context, req *system.BusViolationLevelSearchReq) (res *system.BusViolationLevelSearchRes, err error) { + res, err = service.BusViolationLevel().List(ctx, req) + return +} + +// Get 获取违章等级 +func (c *busViolationLevelController) Get(ctx context.Context, req *system.BusViolationLevelGetReq) (res *system.BusViolationLevelGetRes, err error) { + res = new(system.BusViolationLevelGetRes) + res.BusViolationLevelInfoRes, err = service.BusViolationLevel().GetById(ctx, req.Id) + return +} + +// Add 添加违章等级 +func (c *busViolationLevelController) Add(ctx context.Context, req *system.BusViolationLevelAddReq) (res *system.BusViolationLevelAddRes, err error) { + err = service.BusViolationLevel().Add(ctx, req) + return +} + +// Edit 修改违章等级 +func (c *busViolationLevelController) Edit(ctx context.Context, req *system.BusViolationLevelEditReq) (res *system.BusViolationLevelEditRes, err error) { + err = service.BusViolationLevel().Edit(ctx, req) + return +} + +// Delete 删除违章等级 +func (c *busViolationLevelController) Delete(ctx context.Context, req *system.BusViolationLevelDeleteReq) (res *system.BusViolationLevelDeleteRes, err error) { + err = service.BusViolationLevel().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/bus_violation_record.go b/internal/app/system/controller/bus_violation_record.go new file mode 100644 index 0000000..cf43671 --- /dev/null +++ b/internal/app/system/controller/bus_violation_record.go @@ -0,0 +1,103 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-11-20 11:18:37 +// 生成路径: internal/app/system/controller/bus_violation_record.go +// 生成人:gfast +// desc:违章记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/jinzhu/copier" + "github.com/tiger1103/gfast/v3/api/v1/system" + wxSystem "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "strconv" + //serviceWxApplet "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" +) + +type busViolationRecordController struct { + BaseController +} + +var BusViolationRecord = new(busViolationRecordController) + +// List 列表 +func (c *busViolationRecordController) List(ctx context.Context, req *system.BusViolationRecordSearchReq) (res *system.BusViolationRecordSearchRes, err error) { + res, err = service.BusViolationRecord().List(ctx, req) + return +} + +// Get 获取违章记录 +func (c *busViolationRecordController) Get(ctx context.Context, req *system.BusViolationRecordGetReq) (res *wxSystem.AppWorkOrderParticularsRes, err error) { + res = new(wxSystem.AppWorkOrderParticularsRes) + r := wxSystem.AppWorkOrderParticularsReq{} + err = copier.Copy(&r, &req) + particularsFunc, err := service.BusViolationRecord().AppWorkOrderParticularsFunc(ctx, &r) + res = particularsFunc + //res.BusViolationRecordInfoRes, err = service.BusViolationRecord().GetById(ctx, req.Id) + return +} + +// +//// Add 添加违章记录 +//func (c *busViolationRecordController) Add(ctx context.Context, req *system.BusViolationRecordAddReq) (res *system.BusViolationRecordAddRes, err error) { +// err = service.BusViolationRecord().Add(ctx, req) +// return +//} + +// Delete 删除违章记录 +func (c *busViolationRecordController) Delete(ctx context.Context, req *system.BusViolationRecordDeleteReq) (res *system.BusViolationRecordDeleteRes, err error) { + err = service.BusViolationRecord().Delete(ctx, req.Ids) + return +} + +// SelectTheViolatorFunc 选择违章处理人 +func (c *busViolationRecordController) SelectTheViolatorFunc(ctx context.Context, req *system.BSelectTheViolatorReq) (res *system.SelectTheViolatorRes, err error) { + err = service.BusViolationRecord().SelectTheViolatorFunc(ctx, req) + return +} + +// ReviewFunc 复查 +func (c *busViolationRecordController) ReviewFunc(ctx context.Context, req *system.ReviewReq) (res *wxSystem.AppReviewRes, err error) { + r := wxSystem.AppReviewReq{} + err = copier.Copy(&r, &req) + r.Operator = strconv.FormatInt(int64(ct.New().GetLoginUser(ctx).Id), 10) + err = service.BusViolationRecord().AppReviewFuncFunc(ctx, &r) + return +} + +//// WxList 提供给小程序---》获取当前用户所需处理的违章记录 +//func (c *busViolationRecordController) WxList(ctx context.Context, req *wxSystem.BusViolationRecordSearchReq) (res *wxSystem.BusViolationRecordSearchRes, err error) { +// res, err = service.BusViolationRecord().WxList(ctx, req) +// return +//} +// +//// WxEdit 提供给小程序---》修改违章记录 +//func (c *busViolationRecordController) WxEdit(ctx context.Context, req *wxSystem.BusViolationRecordEditReq) (res *wxSystem.BusViolationRecordEditRes, err error) { +// err = service.BusViolationRecord().WxEdit(ctx, req) +// return +//} +// +//// WxAdd 提供给小程序---》风险管控新增 +//func (c *busViolationRecordController) WxAdd(ctx context.Context, req *wxSystem.WxBusViolationRecordAddReq) (res *wxSystem.WxBusViolationRecordAddRes, err error) { +// err = service.BusViolationRecord().WxAdd(ctx, req) +// return +//} +// +//// WxListTwo 提供给小程序---》获取当前用户所上传的违章记录 +//func (c *busViolationRecordController) WxListTwo(ctx context.Context, req *wxSystem.BusViolationRecordSearchTwoReq) (res *wxSystem.BusViolationRecordSearchTwoRes, err error) { +// res, err = service.BusViolationRecord().WxListTwo(ctx, req) +// return +//} +// +//// WxDetails 提供给小程序---》获取风险管控详情 +//func (c *busViolationRecordController) WxDetails(ctx context.Context, req *wxSystem.WxBusViolationRecordDetailsReq) (res *wxSystem.WxBusViolationRecordDetailsRes, err error) { +// res = new(wxSystem.WxBusViolationRecordDetailsRes) +// res, err = service.BusViolationRecord().WxDetails(ctx, req) +// return +//} diff --git a/internal/app/system/controller/bus_weekly_security_report.go b/internal/app/system/controller/bus_weekly_security_report.go new file mode 100644 index 0000000..01c76f8 --- /dev/null +++ b/internal/app/system/controller/bus_weekly_security_report.go @@ -0,0 +1,59 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-04-02 18:03:23 +// 生成路径: internal/app/system/controller/bus_weekly_security_report.go +// 生成人:gfast +// desc:安全周期 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type busWeeklySecurityReportController struct { + BaseController +} + +var BusWeeklySecurityReport = new(busWeeklySecurityReportController) + +// List 列表 +func (c *busWeeklySecurityReportController) List(ctx context.Context, req *system.BusWeeklySecurityReportSearchReq) (res *system.BusWeeklySecurityReportSearchRes, err error) { + res, err = service.BusWeeklySecurityReport().List(ctx, req) + return +} + +// Get 获取安全周期 +func (c *busWeeklySecurityReportController) Get(ctx context.Context, req *system.BusWeeklySecurityReportGetReq) (res *system.BusWeeklySecurityReportGetRes, err error) { + res = new(system.BusWeeklySecurityReportGetRes) + res.BusWeeklySecurityReportInfoRes, err = service.BusWeeklySecurityReport().GetById(ctx, req.Id) + return +} + +// Add 添加安全周期 +func (c *busWeeklySecurityReportController) Add(ctx context.Context, req *system.BusWeeklySecurityReportAddReq) (res *system.BusWeeklySecurityReportAddRes, err error) { + err = service.BusWeeklySecurityReport().Add(ctx, req) + return +} + +// Edit 修改安全周期 +func (c *busWeeklySecurityReportController) Edit(ctx context.Context, req *system.BusWeeklySecurityReportEditReq) (res *system.BusWeeklySecurityReportEditRes, err error) { + err = service.BusWeeklySecurityReport().Edit(ctx, req) + return +} + +// Delete 删除安全周期 +func (c *busWeeklySecurityReportController) Delete(ctx context.Context, req *system.BusWeeklySecurityReportDeleteReq) (res *system.BusWeeklySecurityReportDeleteRes, err error) { + err = service.BusWeeklySecurityReport().Delete(ctx, req.Ids) + return +} + +func (c *busWeeklySecurityReportController) ExposeSingleFileUploads(ctx context.Context, req *system.SecurityReportReq) (res *system.WriteFreelyRes, err error) { + res = new(system.WriteFreelyRes) + res, err = SingleFileUploads(ctx, req.Path) + return +} diff --git a/internal/app/system/controller/cache.go b/internal/app/system/controller/cache.go new file mode 100644 index 0000000..565c20b --- /dev/null +++ b/internal/app/system/controller/cache.go @@ -0,0 +1,60 @@ +/* +* @desc:缓存处理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2023/2/1 18:14 + */ + +package controller + +import ( + "context" + "github.com/gogf/gf/v2/container/gvar" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + commonConsts "github.com/tiger1103/gfast/v3/internal/app/common/consts" + "github.com/tiger1103/gfast/v3/internal/app/common/service" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" +) + +var Cache = new(cacheController) + +type cacheController struct { + BaseController +} + +func (c *cacheController) Remove(ctx context.Context, req *system.CacheRemoveReq) (res *system.CacheRemoveRes, err error) { + service.Cache().RemoveByTag(ctx, commonConsts.CacheSysDictTag) + service.Cache().RemoveByTag(ctx, commonConsts.CacheSysConfigTag) + service.Cache().RemoveByTag(ctx, consts.CacheSysAuthTag) + cacheRedis := g.Cfg().MustGet(ctx, "system.cache.model").String() + if cacheRedis == commonConsts.CacheModelRedis { + cursor := 0 + cachePrefix := g.Cfg().MustGet(ctx, "system.cache.prefix").String() + for { + var v *gvar.Var + v, err = g.Redis().Do(ctx, "scan", cursor, "match", cachePrefix+"*", "count", "100") + if err != nil { + return + } + data := gconv.SliceAny(v) + var dataSlice []string + err = gconv.Structs(data[1], &dataSlice) + if err != nil { + return + } + for _, d := range dataSlice { + _, err = g.Redis().Do(ctx, "del", d) + if err != nil { + return + } + } + cursor = gconv.Int(data[0]) + if cursor == 0 { + break + } + } + } + return +} diff --git a/internal/app/system/controller/comment_list.go b/internal/app/system/controller/comment_list.go new file mode 100644 index 0000000..6c65d4c --- /dev/null +++ b/internal/app/system/controller/comment_list.go @@ -0,0 +1,60 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-05-14 10:21:06 +// 生成路径: internal/app/system/controller/comment_list.go +// 生成人:gfast +// desc:App消息-评论 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type commentListController struct { + BaseController +} + +var CommentList = new(commentListController) + +// 获取自己的评论列表 +func (c *commentListController) Self(ctx context.Context, req *system.CommentListSelfReq) (res *system.CommentListSelfRes, err error) { + res, err = service.CommentList().GetSelfList(ctx, req) + return +} + +// List 列表 +func (c *commentListController) List(ctx context.Context, req *system.CommentListSearchReq) (res *system.CommentListSearchRes, err error) { + res, err = service.CommentList().List(ctx, req) + return +} + +// Get 获取App消息-评论 +func (c *commentListController) Get(ctx context.Context, req *system.CommentListGetReq) (res *system.CommentListGetRes, err error) { + res = new(system.CommentListGetRes) + res.CommentListInfoRes, err = service.CommentList().GetById(ctx, req.Id) + return +} + +// Add 添加App消息-评论 +func (c *commentListController) Add(ctx context.Context, req *system.CommentListAddReq) (res *system.CommentListAddRes, err error) { + err = service.CommentList().Add(ctx, req) + return +} + +// Edit 修改App消息-评论 +func (c *commentListController) Edit(ctx context.Context, req *system.CommentListEditReq) (res *system.CommentListEditRes, err error) { + err = service.CommentList().Edit(ctx, req) + return +} + +// Delete 删除App消息-评论 +func (c *commentListController) Delete(ctx context.Context, req *system.CommentListDeleteReq) (res *system.CommentListDeleteRes, err error) { + err = service.CommentList().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/comments.go b/internal/app/system/controller/comments.go new file mode 100644 index 0000000..4446898 --- /dev/null +++ b/internal/app/system/controller/comments.go @@ -0,0 +1,108 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-04-23 14:47:24 +// 生成路径: internal/app/system/controller/comments.go +// 生成人:gfast +// desc:App通知公告评论 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +type commentsController struct { + BaseController +} + +var Comments = new(commentsController) + +// List 列表 +func (c *commentsController) List(ctx context.Context, req *system.CommentsSearchReq) (res *system.CommentsSearchRes, err error) { + res, err = service.Comments().List(ctx, req) + return +} + +// Get 获取App通知公告评论 +func (c *commentsController) Get(ctx context.Context, req *system.CommentsGetReq) (res *system.CommentsGetRes, err error) { + res = new(system.CommentsGetRes) + res.CommentsInfoRes, err = service.Comments().GetById(ctx, req.Id) + return +} + +// Add 添加App通知公告评论 +func (c *commentsController) Add(ctx context.Context, req *system.CommentsAddReq) (res *system.CommentsAddRes, err error) { + err = service.Comments().Add(ctx, req) + return +} + +// Edit 修改App通知公告评论 +func (c *commentsController) Edit(ctx context.Context, req *system.CommentsEditReq) (res *system.CommentsEditRes, err error) { + err = service.Comments().Edit(ctx, req) + return +} + +// Delete 删除App通知公告评论 +func (c *commentsController) Delete(ctx context.Context, req *system.CommentsDeleteReq) (res *system.CommentsDeleteRes, err error) { + err = service.Comments().Delete(ctx, req.Ids) + return +} + +// Publish 通知公告发布一条评论 +func (c *commentsController) Publish(ctx context.Context, req *system.CommentsPublishReq) (*system.CommentsPublishRes, error) { + // 获取用户的主键ID + userID := ct.New().GetUserId(ctx) + + err := g.Try(ctx, func(ctx context.Context) { + _, err := dao.Comments.Ctx(ctx).Insert(do.Comments{ + NotificationId: req.NotificationId, // 关联的通知ID + CommentText: req.CommentText, // 评论内容 + CommentId: userID, // 用户ID + }) + liberr.ErrIsNil(ctx, err, "添加评论失败") + }) + liberr.ErrIsNil(ctx, err) + return &system.CommentsPublishRes{}, nil +} + +// 获取指定一个通知公告的评论列表 +func (c *commentsController) GetListByNotificationId(ctx context.Context, req *system.CommentsGetListByNotificationIdReq) (res *system.CommentsGetListByNotificationIdRes, err error) { + res = new(system.CommentsGetListByNotificationIdRes) + + err = g.Try(ctx, func(ctx context.Context) { + m := dao.Comments.Ctx(ctx).WithAll() + + // 获取总页数 + res.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取数据失败") + + res.CurrentPage = req.PageNum + + if req.PageNum == 0 { + req.PageNum = 1 + } + + if req.PageSize == 0 { + req.PageSize = 30 + } + + m = m.As("cs").LeftJoin("sys_user as su", "su.id = cs.comment_id"). + Where("cs.notification_id", req.NotificationId) + + err = m.Page(req.PageNum, req.PageSize).Order("id asc"). + Fields(`cs.id,notification_id,comment_text,comment_id,cs.created_at,su.user_nickname`).Scan(&res.List) + liberr.ErrIsNil(ctx, err, "获取数据失败") + }) + + return +} diff --git a/internal/app/system/controller/construction_details.go b/internal/app/system/controller/construction_details.go new file mode 100644 index 0000000..98d4356 --- /dev/null +++ b/internal/app/system/controller/construction_details.go @@ -0,0 +1,74 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-03-13 18:10:56 +// 生成路径: internal/app/system/controller/construction_details.go +// 生成人:gfast +// desc:施工类别详情 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/third/create" +) + +type constructionDetailsController struct { + BaseController +} + +var ConstructionDetails = new(constructionDetailsController) + +// List 列表 +func (c *constructionDetailsController) List(ctx context.Context, req *system.ConstructionDetailsSearchReq) (res *system.ConstructionDetailsSearchRes, err error) { + res, err = service.ConstructionDetails().List(ctx, req) + return +} + +// Get 获取施工类别详情 +func (c *constructionDetailsController) Get(ctx context.Context, req *system.ConstructionDetailsGetReq) (res *system.ConstructionDetailsGetRes, err error) { + res = new(system.ConstructionDetailsGetRes) + res.ConstructionDetailsInfoRes, err = service.ConstructionDetails().GetById(ctx, req.Id) + return +} + +// Add 添加施工类别详情 +func (c *constructionDetailsController) Add(ctx context.Context, req *system.ConstructionDetailsAddReq) (res *system.ConstructionDetailsAddRes, err error) { + err = service.ConstructionDetails().Add(ctx, req) + return +} + +// Edit 修改施工类别详情 +func (c *constructionDetailsController) Edit(ctx context.Context, req *system.ConstructionDetailsEditReq) (res *system.ConstructionDetailsEditRes, err error) { + err = service.ConstructionDetails().Edit(ctx, req) + return +} + +// Delete 删除施工类别详情 +func (c *constructionDetailsController) Delete(ctx context.Context, req *system.ConstructionDetailsDeleteReq) (res *system.ConstructionDetailsDeleteRes, err error) { + err = service.ConstructionDetails().Delete(ctx, req.Ids) + return +} + +// 查询指定方阵下,设施的可选择余量 +// func (c *constructionDetailsController) GetByConstruction(ctx context.Context, req *system.ConstructionDetailsListReq) (res *system.ConstructionDetailsListRes, err error) { +// res = new(system.ConstructionDetailsListRes) +// } + +// 返回指定方阵ID下的 gannt json +func (c *constructionDetailsController) GetByFangzhen(ctx context.Context, req *system.GanntJsonReq) (*system.GanntJsonRes, error) { + data, err := create.FetchGanttData(ctx, req.FangzhenID) + if err != nil { + return nil, err + } + + res := new(system.GanntJsonRes) + + res.List = data + + return res, nil +} diff --git a/internal/app/system/controller/construction_project.go b/internal/app/system/controller/construction_project.go new file mode 100644 index 0000000..aeac4fe --- /dev/null +++ b/internal/app/system/controller/construction_project.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-03-13 17:36:45 +// 生成路径: internal/app/system/controller/construction_project.go +// 生成人:gfast +// desc:施工项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type constructionProjectController struct { + BaseController +} + +var ConstructionProject = new(constructionProjectController) + +// List 列表 +func (c *constructionProjectController) List(ctx context.Context, req *system.ConstructionProjectSearchReq) (res *system.ConstructionProjectSearchRes, err error) { + res, err = service.ConstructionProject().List(ctx, req) + return +} + +// Get 获取施工项目 +func (c *constructionProjectController) Get(ctx context.Context, req *system.ConstructionProjectGetReq) (res *system.ConstructionProjectGetRes, err error) { + res = new(system.ConstructionProjectGetRes) + res.ConstructionProjectInfoRes, err = service.ConstructionProject().GetByConstructionId(ctx, req.ConstructionId) + return +} + +// Add 添加施工项目 +func (c *constructionProjectController) Add(ctx context.Context, req *system.ConstructionProjectAddReq) (res *system.ConstructionProjectAddRes, err error) { + err = service.ConstructionProject().Add(ctx, req) + return +} + +// Edit 修改施工项目 +func (c *constructionProjectController) Edit(ctx context.Context, req *system.ConstructionProjectEditReq) (res *system.ConstructionProjectEditRes, err error) { + err = service.ConstructionProject().Edit(ctx, req) + return +} + +// Delete 删除施工项目 +func (c *constructionProjectController) Delete(ctx context.Context, req *system.ConstructionProjectDeleteReq) (res *system.ConstructionProjectDeleteRes, err error) { + err = service.ConstructionProject().Delete(ctx, req.ConstructionIds) + return +} diff --git a/internal/app/system/controller/device.go b/internal/app/system/controller/device.go new file mode 100644 index 0000000..a69ca5f --- /dev/null +++ b/internal/app/system/controller/device.go @@ -0,0 +1,182 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-11-24 09:57:07 +// 生成路径: internal/app/system/controller/device.go +// 生成人:gfast +// desc:安全帽设备(java) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "encoding/json" + "github.com/gogf/gf/v2/database/gredis" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/os/glog" + "github.com/gogf/gf/v2/os/gmutex" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "log" + "sync" + "time" +) + +type deviceController struct { + BaseController +} + +var Device = new(deviceController) + +// 全局map +var clientMap = make(map[string]*wsClient) + +const RedisHelmetKey = "safety_helmet:" + +type wsClient struct { + Socket *ghttp.WebSocket +} + +type BusUserEntity struct { + NickName string ` json:"nickName" dc:"微信名称"` + HeadIcon string ` json:"headIcon" dc:"登录头像"` + UserName string ` json:"userName" dc:"人员姓名"` + DevNum string `json:"devNum" dc:"设备标识"` + LatAndLon string ` json:"LatAndLon" dc:"纬度经度(格式:29.101,180.101)"` +} + +// List 列表 +func (c *deviceController) List(ctx context.Context, req *system.DeviceSearchReq) (res *system.DeviceSearchRes, err error) { + res, err = service.Device().List(ctx, req) + return +} + +// AllList 返回当前项目下。设备和用户关联到的所有设备 +func (c *deviceController) AllList(ctx context.Context, req *system.DeviceSearchAllReq) (res *system.DeviceSearchAllRes, err error) { + res, err = service.Device().AllList(ctx, req) + return +} + +// HelmetListFunc 安全帽列表 +func (c *deviceController) HelmetListFunc(ctx context.Context, req *system.HelmetListReq) (res *system.HelmetListRes, err error) { + res, err = service.Device().HelmetListFunc(ctx, req) + return +} + +// Get 获取安全帽设备(java) +func (c *deviceController) Get(ctx context.Context, req *system.DeviceGetReq) (res *system.DeviceGetRes, err error) { + res = new(system.DeviceGetRes) + res, err = service.Device().GetByDevNum(ctx, req) + return +} + +// Add 添加安全帽设备(java) +func (c *deviceController) Add(ctx context.Context, req *system.DeviceAddReq) (res *system.DeviceAddRes, err error) { + err = service.Device().Add(ctx, req) + return +} + +// RemoveRelationFunc 移除人员 +func (c *deviceController) RemoveRelationFunc(ctx context.Context, req *system.RemoveRelationReq) (res *system.RemoveRelationRes, err error) { + err = service.Device().RemoveRelationFunc(ctx, req) + return +} + +// Delete 删除安全帽设备(java) +func (c *deviceController) Delete(ctx context.Context, req *system.DeviceDeleteReq) (res *system.DeviceDeleteRes, err error) { + err = service.Device().Delete(ctx, req.DevNums) + return +} + +// ScheduleTimeFunc 根据指定时间段去查询有足迹的日期 +func (c *deviceController) ScheduleTimeFunc(ctx context.Context, req *system.ScheduleTimeReq) (res *system.ScheduleTimeRes, err error) { + res = new(system.ScheduleTimeRes) + res, err = service.Device().ScheduleTimeFunc(ctx, req) + return +} + +var ( + once sync.Once + subscribe gredis.Conn + subscribeMu sync.Mutex +) + +// 初始化订阅 +func InitSubscription() { + subscribeMu.Lock() + defer subscribeMu.Unlock() + if subscribe == nil { + var err error + subscribe, _, err = g.Redis("helmetRedis").Subscribe(context.Background(), RedisHelmetKey) + if err != nil { + log.Fatal("Failed to subscribe to Redis:", err) + } + } +} + +func (c *deviceController) WebsocketFunc(ctx context.Context, req *system.WebsocketReq) (res *system.WebsocketRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + once.Do(InitSubscription) + reqWs := ghttp.RequestFromCtx(ctx) + ws, err := reqWs.WebSocket() + if err != nil { + glog.Error(ctx, err) + reqWs.Exit() + } + var strData = "" + var i = 0 + mutex := gmutex.New() + mutex.Lock() + defer mutex.Unlock() + for { + if strData != "" || i == 0 { + count, err := dao.BusConstructionUser.Ctx(ctx).Where("dev_num", strData).Where("project_id", req.ProjectId).Count() + if err != nil { + liberr.ErrIsNil(ctx, err, "WebSocket服务出现问题!") + return + } + if count > 0 || i == 0 { + i = 1 + var busUser []*BusUserEntity + err = dao.BusConstructionUser.Ctx(ctx).Where("project_id", req.ProjectId).Where("dev_num <> ''").Fields("head_icon,nick_name,user_name,dev_num").Scan(&busUser) + if err != nil { + liberr.ErrIsNil(ctx, err, "WebSocket服务出现问题!") + return + } + for ii := range busUser { + get, _ := g.Redis("helmetRedis").Get(ctx, RedisHelmetKey+busUser[ii].DevNum) + if get != nil { + busUser[ii].LatAndLon = get.String() + } + } + marshal, err := json.Marshal(busUser) + if err != nil { + liberr.ErrIsNil(ctx, err, "WebSocket服务出现问题!") + return + } + if err = ws.WriteMessage(1, marshal); err != nil { + + return + } + } + } + _, _, err := ws.ReadMessage() + if err != nil { + return //断开就退出整个代码块 + } + //第一次先发数据、然后如果前端还活着,那么就继续走(走到redis阻塞,redis如果有消息发布就继续下一次循环,),如果死了就退出、 + msg, err := subscribe.ReceiveMessage(ctx) + if err != nil { + log.Println("Error receiving message:", err) + time.Sleep(time.Second) + continue + } + strData = msg.Payload + } + }) + return +} diff --git a/internal/app/system/controller/device_preset.go b/internal/app/system/controller/device_preset.go new file mode 100644 index 0000000..219fbb1 --- /dev/null +++ b/internal/app/system/controller/device_preset.go @@ -0,0 +1,75 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-03-01 12:50:08 +// 生成路径: internal/app/system/controller/device_preset.go +// 生成人:gfast +// desc:预置位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "fmt" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/third/ys7" +) + +type devicePresetController struct { + BaseController +} + +var DevicePreset = new(devicePresetController) + +// List 列表 +func (c *devicePresetController) List(ctx context.Context, req *system.DevicePresetSearchReq) (res *system.DevicePresetSearchRes, err error) { + res, err = service.DevicePreset().List(ctx, req) + return +} + +// Get 获取预置位 +func (c *devicePresetController) Get(ctx context.Context, req *system.DevicePresetGetReq) (res *system.DevicePresetGetRes, err error) { + res = new(system.DevicePresetGetRes) + res.DevicePresetInfoRes, err = service.DevicePreset().GetById(ctx, req.Id) + return +} + +// Add 添加预置位 +func (c *devicePresetController) Add(ctx context.Context, req *system.DevicePresetAddReq) (res *system.DevicePresetAddRes, err error) { + err = service.DevicePreset().Add(ctx, req) + return +} + +// Edit 修改预置位 +func (c *devicePresetController) Edit(ctx context.Context, req *system.DevicePresetEditReq) (res *system.DevicePresetEditRes, err error) { + err = service.DevicePreset().Edit(ctx, req) + return +} + +// Delete 删除预置位 +func (c *devicePresetController) Delete(ctx context.Context, req *system.DevicePresetDeleteReq) (res *system.DevicePresetDeleteRes, err error) { + err = service.DevicePreset().Delete(ctx, req.DeviceSerial, req.Ids) + return +} + +// 调用预置点 +func (c *devicePresetController) CallPreset(ctx context.Context, req *system.DevicePresetCallReq) (*system.DevicePresetCallRes, error) { + Device, err := ys7.GetDevice(req.DeviceSerial) + if err != nil { + return nil, fmt.Errorf("获取设备失败:%w", err) + } + + resp, err := Device.MovePreset(req.Index) + if err != nil { + return nil, err + } + + if resp.Code != "200" { + return nil, fmt.Errorf("调用失败:%s", resp.Msg) + } + + return &system.DevicePresetCallRes{}, nil +} diff --git a/internal/app/system/controller/document.go b/internal/app/system/controller/document.go new file mode 100644 index 0000000..b344a11 --- /dev/null +++ b/internal/app/system/controller/document.go @@ -0,0 +1,194 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-09-16 10:32:04 +// 生成路径: internal/app/system/controller/document.go +// 生成人:gfast +// desc:母板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "encoding/json" + "errors" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/tiger1103/gfast/v3/third/officeWeb365" + "io" + "net/http" + "os" + "strings" +) + +type documentController struct { + BaseController +} + +type Action struct { + Type int `json:"type"` + UserID string `json:"userid"` +} + +type MyStruct struct { + Actions []Action `json:"actions"` + ForceSaveType string `json:"forcesavetype"` + Key string `json:"key"` + Status int `json:"status"` + URL string `json:"url"` + Userdata string `json:"userdata"` + Users []string `json:"users"` +} + +var Document = new(documentController) + +func (c *documentController) SendFile(ctx context.Context, req *system.SendFileReq) (res *system.SendFileRes, err error) { + res = new(system.SendFileRes) + + err, path := officeWeb365.SendFile199(ctx, req.FilePath, req.FileType) + res.FilePath = path + return +} + +// List 列表 +func (c *documentController) List(ctx context.Context, req *system.DocumentSearchReq) (res *system.DocumentSearchRes, err error) { + res, err = service.Document().List(ctx, req) + return +} + +// AllList 列表 +func (c *documentController) AllList(ctx context.Context, req *system.AllDocumentSearchReq) (res *system.AllDocumentSearchRes, err error) { + res, err = service.Document().AllList(ctx, req) + return +} + +// Get 获取母板(根据id) +func (c *documentController) Get(ctx context.Context, req *system.DocumentGetReq) (res *system.DocumentGetRes, err error) { + res = new(system.DocumentGetRes) + res.DocumentInfoRes, err = service.Document().GetById(ctx, req.Id) + return +} + +// Add 本地导入(文件/压缩文件夹) +func (c *documentController) Add(ctx context.Context, req *system.DocumentAddReq) (res *system.DocumentAddRes, err error) { + err = service.Document().Add(ctx, req) + return +} + +// NewFolderFunc 新建文件夹 +func (c *documentController) NewFolderFunc(ctx context.Context, req *system.NewFolderReq) (res *system.NewFolderRes, err error) { + err = service.Document().NewFolderFunc(ctx, req) + return +} + +// Edit 修改母板 +func (c *documentController) Edit(ctx context.Context, req *system.DocumentEditReq) (res *system.DocumentEditRes, err error) { + err = service.Document().Edit(ctx, req) + return +} + +// Delete 删除母板 +func (c *documentController) Delete(ctx context.Context, req *system.DocumentDeleteReq) (res *system.DocumentDeleteRes, err error) { + err = service.Document().Delete(ctx, req.Ids) + return +} + +// TreeStructureFunc 树形结构 +func (c *documentController) TreeStructureFunc(ctx context.Context, req *system.TreeStructureReq) (res *system.TreeStructureRes, err error) { + res, err = service.Document().TreeStructureFunc(ctx, req) + return +} + +// CompressedDownload 根据文件目录进行下载压缩包 +func (c *documentController) CompressedDownload(ctx context.Context, req *system.CompressedDownloadReq) (res *system.CompressedDownloadRes, err error) { + res = new(system.CompressedDownloadRes) + download, err := ZIPDownload(ctx, req.RelativePath) + if err != nil { + return + } else { + res = download + return + } +} + +// ZIPDownload 生成压缩包 +func ZIPDownload(ctx context.Context, relativePath string) (res *system.CompressedDownloadRes, err error) { + res = new(system.CompressedDownloadRes) + sourceDir := strings.ReplaceAll(relativePath, "/file", coryCommon.GetCWD()+"/resource/public") // 指定要压缩的文件夹路径 + zipFile := coryCommon.GetCWD() + coryCommon.Temporary + "/" + coryCommon.FileName("") + ".zip" + err = coryCommon.CreateZipFile(sourceDir, zipFile) + if err != nil { + err = errors.New("下载失败!") + return + } else { + res.RelativePath = strings.Replace(zipFile, coryCommon.GetCWD()+"/resource/public", "/file", 1) + return + } +} + +// UniFileDownload 单文件下载 +func (c *documentController) UniFileDownload(ctx context.Context, req *system.UniFileDownloadReq) (res *system.UniFileDownloadRes, err error) { + res = new(system.UniFileDownloadRes) + rpath := coryCommon.FileToFunc(req.RelativePath, 2) + g.RequestFromCtx(ctx).Response.ServeFileDownload(rpath) + return +} + +// TemplateRecycleBinFunc 模板回收站 +func (c *documentDataController) TemplateRecycleBinFunc(ctx context.Context, req *system.TemplateRecycleBinReq) (res *system.TemplateRecycleBinRes, err error) { + err = service.Document().TemplateRecycleBinFunc(ctx, req) + return +} +func (c *busConstructionUserController) ExposeSingleFileUploads(ctx context.Context, req *system.WriteFreelyReq) (res *system.WriteFreelyRes, err error) { + res = new(system.WriteFreelyRes) + res, err = SingleFileUploads(ctx, req.Path) + return +} + +// SingleFileUploads 畅写回调地址 +func SingleFileUploads(ctx context.Context, path string) (res *system.WriteFreelyRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + var my MyStruct + r := ghttp.RequestFromCtx(ctx) + writer := r.Response.Writer + //正文 + body := r.GetBody() + err = json.Unmarshal(body, &my) + res = new(system.WriteFreelyRes) + status := my.Status + if status == 0 { + err = errors.New("Invalid status format") + } else if status == 2 || status == 6 { + downloadURL := my.URL + if downloadURL == "" { + err = errors.New("Invalid URL format") + } + resp, err := http.Get(downloadURL) + if err != nil { + err = errors.New("Error downloading file") + } + defer resp.Body.Close() + + fileContent, err := io.ReadAll(resp.Body) + if err != nil { + err = errors.New("Error reading file content") + } + pathForSave := coryCommon.FileToFunc(path, 2) + err = os.WriteFile(pathForSave, fileContent, 0644) + if err != nil { + err = errors.New("Error saving file") + } + } else if status == 3 || status == 7 { + writer.Write([]byte("{\"error\":-1}")) + return + } + writer.Write([]byte("{\"error\":0}")) + liberr.ErrIsNil(ctx, err) + }) + return +} diff --git a/internal/app/system/controller/document_completion.go b/internal/app/system/controller/document_completion.go new file mode 100644 index 0000000..d30171d --- /dev/null +++ b/internal/app/system/controller/document_completion.go @@ -0,0 +1,99 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-03-15 10:25:00 +// 生成路径: internal/app/system/controller/document_completion.go +// 生成人:gfast +// desc:竣工图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type documentCompletionController struct { + BaseController +} + +var DocumentCompletion = new(documentCompletionController) + +// List 列表 +func (c *documentCompletionController) List(ctx context.Context, req *system.DocumentCompletionSearchReq) (res *system.DocumentCompletionSearchRes, err error) { + res, err = service.DocumentCompletion().List(ctx, req) + return +} + +// Get 获取竣工图 +func (c *documentCompletionController) Get(ctx context.Context, req *system.DocumentCompletionGetReq) (res *system.DocumentCompletionGetRes, err error) { + res = new(system.DocumentCompletionGetRes) + res.List, err = service.DocumentCompletion().GetById(ctx, req.Id) + return +} + +// Add 添加文件或目录(压缩包) +func (c *documentCompletionController) Add(ctx context.Context, req *system.DocumentCompletionAddReq) (res *system.DocumentCompletionAddRes, err error) { + err = service.DocumentCompletion().Add(ctx, req) + return +} + +// Edit 修改文件或文件夹名称(重命名) +func (c *documentCompletionController) Edit(ctx context.Context, req *system.DocumentCompletionEditReq) (res *system.DocumentCompletionEditRes, err error) { + err = service.DocumentCompletion().Edit(ctx, req) + return +} + +// Delete 删除竣工图 +func (c *documentCompletionController) Delete(ctx context.Context, req *system.DocumentCompletionDeleteReq) (res *system.DocumentCompletionDeleteRes, err error) { + err = service.DocumentCompletion().Delete(ctx, req.Ids) + return +} + +// CompletionNewFolderDataFunc 新建文件夹 +func (c *documentCompletionController) CompletionNewFolderDataFunc(ctx context.Context, req *system.CompletionNewFolderDataReq) (res *system.CompletionNewFolderDataRes, err error) { + err = service.DocumentCompletion().CompletionNewFolderDataFunc(ctx, req) + return +} + +// CompletionDataUniFileDownload 单文件下载 +func (c *documentCompletionController) CompletionDataUniFileDownload(ctx context.Context, req *system.CompletionDataUniFileDownloadReq) (res *system.CompletionDataUniFileDownloadRes, err error) { + res = new(system.CompletionDataUniFileDownloadRes) + path, err := WpFileDownload(ctx, req.RelativePath, req.Type, req.TableName, req.TableId, req.ProjectId) + if err == nil { + res.Path = path + } + return +} + +// TreeStructureFunc 获取数据列表(懒加载的形式获取到数据) +func (c *documentCompletionController) TreeStructureFunc(ctx context.Context, req *system.DocumentTreeStructureReq) (res *system.DocumentTreeStructureRes, err error) { + res, err = service.DocumentCompletion().TreeStructureFunc(ctx, req) + return +} + +// SelectByPidFunc 根据路径获取到pid +func (c *documentCompletionController) SelectByPidFunc(ctx context.Context, req *system.SelectByPidReq) (res *system.SelectByPidRes, err error) { + res, err = service.DocumentCompletion().SelectByPidFunc(ctx, req) + return +} + +// CompletionDataRecyclingStationFunc 回收站 +func (c *documentCompletionController) CompletionDataRecyclingStationFunc(ctx context.Context, req *system.CompletionDataRecyclingStationReq) (res *system.CompletionDataRecyclingStationRes, err error) { + err = service.DocumentCompletion().CompletionDataRecyclingStationFunc(ctx, req) + return +} + +// RecycleBinListFunc 回收站列表(不分页) +func (c *documentCompletionController) RecycleBinListFunc(ctx context.Context, req *system.RecycleBinListReq) (res *system.RecycleBinListRes, err error) { + res, err = service.DocumentCompletion().RecycleBinListFunc(ctx, req) + return +} + +// AuditDataListFunc 审核数据 +func (c *documentCompletionController) AuditDataListFunc(ctx context.Context, req *system.AuditDataListReq) (res *system.AuditDataListRes, err error) { // 解析请求体,获取 multipart/form-data 数据 + res, err = service.DocumentCompletion().AuditDataListFunc(ctx, req) + return +} diff --git a/internal/app/system/controller/document_data.go b/internal/app/system/controller/document_data.go new file mode 100644 index 0000000..0cf4082 --- /dev/null +++ b/internal/app/system/controller/document_data.go @@ -0,0 +1,129 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-12-27 09:30:04 +// 生成路径: internal/app/system/controller/document_data.go +// 生成人:gfast +// desc:工程资料>资料 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type documentDataController struct { + BaseController +} + +var DocumentData = new(documentDataController) + +// List 列表 +func (c *documentDataController) List(ctx context.Context, req *system.DocumentDataSearchReq) (res *system.DocumentDataSearchRes, err error) { + res, err = service.DocumentData().List(ctx, req) + return +} + +// AllList 全部列表 +func (c *documentDataController) AllList(ctx context.Context, req *system.AllDocumentDataSearchReq) (res *system.AllDocumentDataSearchRes, err error) { + res, err = service.DocumentData().AllList(ctx, req) + return +} + +// SonFileList 获取某文件夹下的子文件 +func (c *documentDataController) SonFileList(ctx context.Context, req *system.SonFileReq) (res *system.SonFileRes, err error) { + res, err = service.DocumentData().SonFileList(ctx, req) + return +} + +// Get 获取工程资料>资料 +func (c *documentDataController) Get(ctx context.Context, req *system.DocumentDataGetReq) (res *system.DocumentDataGetRes, err error) { + res = new(system.DocumentDataGetRes) + res.DocumentDataInfoRes, err = service.DocumentData().GetById(ctx, req.Id) + return +} + +// Add 添加工程资料>资料 +func (c *documentDataController) Add(ctx context.Context, req *system.DocumentDataAddReq) (res *system.DocumentDataAddRes, err error) { + err = service.DocumentData().Add(ctx, req) + return +} + +// NewFolderDataFunc 新建文件夹 +func (c *documentDataController) NewFolderDataFunc(ctx context.Context, req *system.NewFolderDataReq) (res *system.NewFolderDataRes, err error) { + err = service.DocumentData().NewFolderDataFunc(ctx, req) + return +} + +// Edit 修改工程资料>资料 +func (c *documentDataController) Edit(ctx context.Context, req *system.DocumentDataEditReq) (res *system.DocumentDataEditRes, err error) { + err = service.DocumentData().Edit(ctx, req) + return +} + +// Delete 删除工程资料>资料 +func (c *documentDataController) Delete(ctx context.Context, req *system.DocumentDataDeleteReq) (res *system.DocumentDataDeleteRes, err error) { + err = service.DocumentData().Delete(ctx, req.Ids) + return +} + +// TreeStructureDataFunc 树形结构 +func (c *documentDataController) TreeStructureDataFunc(ctx context.Context, req *system.TreeStructureDataReq) (res *system.TreeStructureDataRes, err error) { + res, err = service.DocumentData().TreeStructureDataFunc(ctx, req) + return +} + +// OnlineImportFunc 在线模板导入|复制(复制文件或文件夹) +func (c *documentDataController) OnlineImportFunc(ctx context.Context, req *system.OnlineImportReq) (res *system.OnlineImportRes, err error) { + err = service.DocumentData().OnlineImportFunc(ctx, req) + return +} + +// OnlineMobileFunc 在线资料导入|移动(移动文件或文件夹) +func (c *documentDataController) OnlineMobileFunc(ctx context.Context, req *system.OnlineMobileReq) (res *system.OnlineMobileRes, err error) { + err = service.DocumentData().OnlineMobileFunc(ctx, req) + return +} + +// DataRecyclingStationFunc 资料回收站 +func (c *documentDataController) DataRecyclingStationFunc(ctx context.Context, req *system.DataRecyclingStationReq) (res *system.DataRecyclingStationRes, err error) { + err = service.DocumentData().DataRecyclingStationFunc(ctx, req) + return +} + +func (c *busConstructionUserController) ExposeDataSingleFileUploads(ctx context.Context, req *system.DataWriteFreelyReq) (res *system.WriteFreelyRes, err error) { + res = new(system.WriteFreelyRes) + res, err = SingleFileUploads(ctx, req.Path) + return +} + +// DataFileQueryFunc 资料文件查询(查询资料里面的所有文件,限制格式为ppt、excel、word) +func (c *documentDataController) DataFileQueryFunc(ctx context.Context, req *system.DataFileQueryReq) (res *system.DataFileQueryRes, err error) { + res, err = service.DocumentData().DataFileQueryFunc(ctx, req) + return +} + +// DataCompressedDownload 根据文件目录进行下载压缩包 +func (c *documentDataController) DataCompressedDownload(ctx context.Context, req *system.DataCompressedDownloadReq) (res *system.CompressedDownloadRes, err error) { + res = new(system.CompressedDownloadRes) + download, err := ZIPDownload(ctx, req.RelativePath) + if err != nil { + return + } else { + res = download + return + } +} + +// DataUniFileDownload 单文件下载 +func (c *documentDataController) DataUniFileDownload(ctx context.Context, req *system.DataUniFileDownloadReq) (res *system.DataUniFileDownloadRes, err error) { + res = new(system.DataUniFileDownloadRes) + rpath := coryCommon.FileToFunc(req.RelativePath, 2) + g.RequestFromCtx(ctx).Response.ServeFileDownload(rpath) + return +} diff --git a/internal/app/system/controller/document_production_drawing.go b/internal/app/system/controller/document_production_drawing.go new file mode 100644 index 0000000..8f30d7b --- /dev/null +++ b/internal/app/system/controller/document_production_drawing.go @@ -0,0 +1,118 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-03-15 10:24:54 +// 生成路径: internal/app/system/controller/document_production_drawing.go +// 生成人:gfast +// desc:施工图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + busDesignAuditLogic "github.com/tiger1103/gfast/v3/internal/app/system/logic/busDesignAudit" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "path/filepath" +) + +type documentProductionDrawingController struct { + BaseController +} + +var DocumentProductionDrawing = new(documentProductionDrawingController) + +// List 列表 +func (c *documentProductionDrawingController) List(ctx context.Context, req *system.DocumentProductionDrawingSearchReq) (res *system.DocumentProductionDrawingSearchRes, err error) { + res, err = service.DocumentProductionDrawing().List(ctx, req) + return +} + +// Get 获取施工图 +func (c *documentProductionDrawingController) Get(ctx context.Context, req *system.DocumentProductionDrawingGetReq) (res *system.DocumentProductionDrawingGetRes, err error) { + res = new(system.DocumentProductionDrawingGetRes) + res.List, err = service.DocumentProductionDrawing().GetById(ctx, req.Id) + return +} + +// Add 添加施工图 +func (c *documentProductionDrawingController) Add(ctx context.Context, req *system.DocumentProductionDrawingAddReq) (res *system.DocumentProductionDrawingAddRes, err error) { + err = service.DocumentProductionDrawing().Add(ctx, req) + return +} + +// Edit 修改施工图 +func (c *documentProductionDrawingController) Edit(ctx context.Context, req *system.DocumentProductionDrawingEditReq) (res *system.DocumentProductionDrawingEditRes, err error) { + err = service.DocumentProductionDrawing().Edit(ctx, req) + return +} + +// Delete 删除施工图 +func (c *documentProductionDrawingController) Delete(ctx context.Context, req *system.DocumentProductionDrawingDeleteReq) (res *system.DocumentProductionDrawingDeleteRes, err error) { + err = service.DocumentProductionDrawing().Delete(ctx, req.Ids) + return +} + +// ProductionDrawingNewFolderDataFunc 新建文件夹 +func (c *documentProductionDrawingController) ProductionDrawingNewFolderDataFunc(ctx context.Context, req *system.ProductionDrawingNewFolderDataReq) (res *system.ProductionDrawingNewFolderDataRes, err error) { + err = service.DocumentProductionDrawing().NewFolderDataFunc(ctx, req) + return +} + +// ProductionDrawingDataUniFileDownload 单文件下载 +func (c *documentProductionDrawingController) ProductionDrawingDataUniFileDownload(ctx context.Context, req *system.ProductionDrawingDataUniFileDownloadReq) (res *system.ProductionDrawingDataUniFileDownloadRes, err error) { + res = new(system.ProductionDrawingDataUniFileDownloadRes) + path, err := WpFileDownload(ctx, req.RelativePath, req.Type, req.TableName, req.TableId, req.ProjectId) + if err != nil { + res.Path = path + } + return +} + +// TreeStructureFunc 获取数据列表(懒加载的形式获取到数据) +func (c *documentProductionDrawingController) TreeStructureFunc(ctx context.Context, req *system.ProductionDrawingTreeStructureReq) (res *system.ProductionDrawingTreeStructureRes, err error) { + res, err = service.DocumentProductionDrawing().TreeStructureFunc(ctx, req) + return +} + +// SelectByPidFunc 根据路径获取到pid +func (c *documentProductionDrawingController) SelectByPidFunc(ctx context.Context, req *system.ProductionDrawingSelectByPidReq) (res *system.ProductionDrawingSelectByPidRes, err error) { + res, err = service.DocumentProductionDrawing().SelectByPidFunc(ctx, req) + return +} + +// ProductionDrawingRecyclingStationFunc 回收站 +func (c *documentProductionDrawingController) ProductionDrawingRecyclingStationFunc(ctx context.Context, req *system.ProductionDrawingDataRecyclingStationReq) (res *system.ProductionDrawingDataRecyclingStationRes, err error) { + err = service.DocumentProductionDrawing().RecyclingStationFunc(ctx, req) + return +} + +// ProductionDrawingRecycleBinListFunc 回收站列表(不分页) +func (c *documentCompletionController) ProductionDrawingRecycleBinListFunc(ctx context.Context, req *system.ProductionDrawingRecycleBinListReq) (res *system.ProductionDrawingRecycleBinListRes, err error) { + res, err = service.DocumentProductionDrawing().RecycleBinListFunc(ctx, req) + return +} + +func WpFileDownload(ctx context.Context, relativePath, typeStr, tableName string, tableId, projectId int64) (path string, err error) { + rpath := coryCommon.FileToFunc(relativePath, 2) + if typeStr == "1" { + g.RequestFromCtx(ctx).Response.ServeFileDownload(rpath) + } else { + zipFile := coryCommon.ResourcePublicToFunc("/"+coryCommon.Ynr(coryCommon.Temporary+"/")+coryCommon.FileName("wp")+".zip", 2) + err = coryCommon.FolderToZip(rpath, zipFile) + if err == nil { + path = coryCommon.ResourcePublicToFunc(filepath.ToSlash(zipFile), 1) + } else { + return "", err + } + } + if tableName != "" && tableId != 0 && projectId != 0 { + fmt.Println("44---------", path) + err = busDesignAuditLogic.AddApprovedMemo(ctx, tableId, projectId, tableName, "5") //下载记录 + } + return +} diff --git a/internal/app/system/controller/document_quality_meeting.go b/internal/app/system/controller/document_quality_meeting.go new file mode 100644 index 0000000..fff12b1 --- /dev/null +++ b/internal/app/system/controller/document_quality_meeting.go @@ -0,0 +1,94 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-03-25 16:43:56 +// 生成路径: internal/app/system/controller/document_quality_meeting.go +// 生成人:gfast +// desc:质量会议 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type documentQualityMeetingController struct { + BaseController +} + +var DocumentQualityMeeting = new(documentQualityMeetingController) + +// List 列表 +func (c *documentQualityMeetingController) List(ctx context.Context, req *system.DocumentQualityMeetingSearchReq) (res *system.DocumentQualityMeetingSearchRes, err error) { + res, err = service.DocumentQualityMeeting().List(ctx, req) + return +} + +// Get 获取质量会议 +func (c *documentQualityMeetingController) Get(ctx context.Context, req *system.DocumentQualityMeetingGetReq) (res *system.DocumentQualityMeetingGetRes, err error) { + res = new(system.DocumentQualityMeetingGetRes) + res.List, err = service.DocumentQualityMeeting().GetById(ctx, req.Id) + return +} + +// Add 添加质量会议 +func (c *documentQualityMeetingController) Add(ctx context.Context, req *system.DocumentQualityMeetingAddReq) (res *system.DocumentQualityMeetingAddRes, err error) { + err = service.DocumentQualityMeeting().Add(ctx, req) + return +} + +// Edit 修改质量会议 +func (c *documentQualityMeetingController) Edit(ctx context.Context, req *system.DocumentQualityMeetingEditReq) (res *system.DocumentQualityMeetingEditRes, err error) { + err = service.DocumentQualityMeeting().Edit(ctx, req) + return +} + +// Delete 删除质量会议 +func (c *documentQualityMeetingController) Delete(ctx context.Context, req *system.DocumentQualityMeetingDeleteReq) (res *system.DocumentQualityMeetingDeleteRes, err error) { + err = service.DocumentQualityMeeting().Delete(ctx, req.Ids) + return +} + +// DocumentQualityNewFolderDataFunc 新建文件夹 +func (c *documentQualityMeetingController) DocumentQualityNewFolderDataFunc(ctx context.Context, req *system.DocumentQualityNewFolderDataReq) (res *system.DocumentQualityNewFolderDataRes, err error) { + err = service.DocumentQualityMeeting().CompletionNewFolderDataFunc(ctx, req) + return +} + +// DocumentQualityDataUniFileDownload 单文件下载 +func (c *documentQualityMeetingController) DocumentQualityDataUniFileDownload(ctx context.Context, req *system.DocumentQualityDataUniFileDownloadReq) (res *system.DocumentQualityDataUniFileDownloadRes, err error) { + res = new(system.DocumentQualityDataUniFileDownloadRes) + path, err := WpFileDownload(ctx, req.RelativePath, req.Type, "", 0, 0) + if err != nil { + res.Path = path + } + return +} + +// DocumentQualityTreeStructureFunc 获取数据列表(懒加载的形式获取到数据) +func (c *documentQualityMeetingController) DocumentQualityTreeStructureFunc(ctx context.Context, req *system.DocumentQualityTreeStructureReq) (res *system.DocumentQualityTreeStructureRes, err error) { + res, err = service.DocumentQualityMeeting().TreeStructureFunc(ctx, req) + return +} + +// DocumentQualitySelectByPidFunc 根据路径获取到pid +func (c *documentQualityMeetingController) DocumentQualitySelectByPidFunc(ctx context.Context, req *system.DocumentQualitySelectByPidReq) (res *system.DocumentQualitySelectByPidRes, err error) { + res, err = service.DocumentQualityMeeting().SelectByPidFunc(ctx, req) + return +} + +// DocumentQualityDataRecyclingStationFunc 回收站 +func (c *documentQualityMeetingController) DocumentQualityDataRecyclingStationFunc(ctx context.Context, req *system.DocumentQualityDataRecyclingStationReq) (res *system.DocumentQualityDataRecyclingStationRes, err error) { + err = service.DocumentQualityMeeting().CompletionDataRecyclingStationFunc(ctx, req) + return +} + +// DocumentQualityRecycleBinListFunc 回收站列表(不分页) +func (c *documentQualityMeetingController) DocumentQualityRecycleBinListFunc(ctx context.Context, req *system.DocumentQualityRecycleBinListReq) (res *system.DocumentQualityRecycleBinListRes, err error) { + res, err = service.DocumentQualityMeeting().RecycleBinListFunc(ctx, req) + return +} diff --git a/internal/app/system/controller/document_report.go b/internal/app/system/controller/document_report.go new file mode 100644 index 0000000..e9da49f --- /dev/null +++ b/internal/app/system/controller/document_report.go @@ -0,0 +1,91 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-03-15 10:24:21 +// 生成路径: internal/app/system/controller/document_report.go +// 生成人:gfast +// desc:科研及专题报告 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type documentReportController struct { + BaseController +} + +var DocumentReport = new(documentReportController) + +// List 列表 +func (c *documentReportController) List(ctx context.Context, req *system.DocumentReportSearchReq) (res *system.DocumentReportSearchRes, err error) { + res, err = service.DocumentReport().List(ctx, req) + return +} + +// Get 获取科研及专题报告 +func (c *documentReportController) Get(ctx context.Context, req *system.DocumentReportGetReq) (res *system.DocumentReportGetRes, err error) { + res = new(system.DocumentReportGetRes) + res.DocumentReportInfoRes, err = service.DocumentReport().GetById(ctx, req.Id) + return +} + +// Add 添加科研及专题报告 +func (c *documentReportController) Add(ctx context.Context, req *system.DocumentReportAddReq) (res *system.DocumentReportAddRes, err error) { + err = service.DocumentReport().Add(ctx, req) + return +} + +// Edit 修改科研及专题报告 +func (c *documentReportController) Edit(ctx context.Context, req *system.DocumentReportEditReq) (res *system.DocumentReportEditRes, err error) { + err = service.DocumentReport().Edit(ctx, req) + return +} + +// Delete 删除科研及专题报告 +func (c *documentReportController) Delete(ctx context.Context, req *system.DocumentReportDeleteReq) (res *system.DocumentReportDeleteRes, err error) { + err = service.DocumentReport().Delete(ctx, req.Ids) + return +} + +// ReportNewFolderDataFunc 新建文件夹 +func (c *documentReportController) ReportNewFolderDataFunc(ctx context.Context, req *system.ReportNewFolderDataReq) (res *system.ReportNewFolderDataRes, err error) { + err = service.DocumentReport().CompletionNewFolderDataFunc(ctx, req) + return +} + +// ReportDataUniFileDownload 单文件下载 +func (c *documentReportController) ReportDataUniFileDownload(ctx context.Context, req *system.ReportDataUniFileDownloadReq) (res *system.ReportDataUniFileDownloadRes, err error) { + res = new(system.ReportDataUniFileDownloadRes) + path, err := WpFileDownload(ctx, req.RelativePath, req.Type, req.TableName, req.TableId, req.ProjectId) + res.Path = path + return +} + +// ReportTreeStructureFunc 获取数据列表(懒加载的形式获取到数据) +func (c *documentReportController) ReportTreeStructureFunc(ctx context.Context, req *system.ReportTreeStructureReq) (res *system.ReportTreeStructureRes, err error) { + res, err = service.DocumentReport().TreeStructureFunc(ctx, req) + return +} + +// ReportSelectByPidFunc 根据路径获取到pid +func (c *documentReportController) ReportSelectByPidFunc(ctx context.Context, req *system.ReportSelectByPidReq) (res *system.ReportSelectByPidRes, err error) { + res, err = service.DocumentReport().SelectByPidFunc(ctx, req) + return +} + +// ReportDataRecyclingStationFunc 回收站 +func (c *documentReportController) ReportDataRecyclingStationFunc(ctx context.Context, req *system.ReportDataRecyclingStationReq) (res *system.ReportDataRecyclingStationRes, err error) { + err = service.DocumentReport().CompletionDataRecyclingStationFunc(ctx, req) + return +} + +// ReportRecycleBinListFunc 回收站列表(不分页) +func (c *documentReportController) ReportRecycleBinListFunc(ctx context.Context, req *system.ReportRecycleBinListReq) (res *system.ReportRecycleBinListRes, err error) { + res, err = service.DocumentReport().RecycleBinListFunc(ctx, req) + return +} diff --git a/internal/app/system/controller/document_safety_meeting.go b/internal/app/system/controller/document_safety_meeting.go new file mode 100644 index 0000000..1c79184 --- /dev/null +++ b/internal/app/system/controller/document_safety_meeting.go @@ -0,0 +1,94 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-04-09 11:40:21 +// 生成路径: internal/app/system/controller/document_safety_meeting.go +// 生成人:gfast +// desc:安全会议 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type documentSafetyMeetingController struct { + BaseController +} + +var DocumentSafetyMeeting = new(documentSafetyMeetingController) + +// List 列表 +func (c *documentSafetyMeetingController) List(ctx context.Context, req *system.DocumentSafetyMeetingSearchReq) (res *system.DocumentSafetyMeetingSearchRes, err error) { + res, err = service.DocumentSafetyMeeting().List(ctx, req) + return +} + +// Get 获取安全会议 +func (c *documentSafetyMeetingController) Get(ctx context.Context, req *system.DocumentSafetyMeetingGetReq) (res *system.DocumentSafetyMeetingGetRes, err error) { + res = new(system.DocumentSafetyMeetingGetRes) + res.DocumentSafetyMeetingInfoRes, err = service.DocumentSafetyMeeting().GetById(ctx, req.Id) + return +} + +// Add 添加安全会议 +func (c *documentSafetyMeetingController) Add(ctx context.Context, req *system.DocumentSafetyMeetingAddReq) (res *system.DocumentSafetyMeetingAddRes, err error) { + err = service.DocumentSafetyMeeting().Add(ctx, req) + return +} + +// Edit 修改安全会议 +func (c *documentSafetyMeetingController) Edit(ctx context.Context, req *system.DocumentSafetyMeetingEditReq) (res *system.DocumentSafetyMeetingEditRes, err error) { + err = service.DocumentSafetyMeeting().Edit(ctx, req) + return +} + +// Delete 删除安全会议 +func (c *documentSafetyMeetingController) Delete(ctx context.Context, req *system.DocumentSafetyMeetingDeleteReq) (res *system.DocumentSafetyMeetingDeleteRes, err error) { + err = service.DocumentSafetyMeeting().Delete(ctx, req.Ids) + return +} + +// DocumenttSafetyNewFolderDataFunc 新建文件夹 +func (c *documentSafetyMeetingController) DocumentSafetyNewFolderDataFunc(ctx context.Context, req *system.DocumentSafetyNewFolderDataReq) (res *system.DocumentQualityNewFolderDataRes, err error) { + err = service.DocumentSafetyMeeting().CompletionNewFolderDataFunc(ctx, req) + return +} + +// DocumenttSafetyDataUniFileDownload 单文件下载 +func (c *documentSafetyMeetingController) DocumentSafetyDataUniFileDownload(ctx context.Context, req *system.DocumentSafetyDataUniFileDownloadReq) (res *system.DocumentQualityDataUniFileDownloadRes, err error) { + res = new(system.DocumentQualityDataUniFileDownloadRes) + path, err := WpFileDownload(ctx, req.RelativePath, req.Type, "", 0, 0) + if err != nil { + res.Path = path + } + return +} + +// DocumentQualityTreeStructureFunc 获取数据列表(懒加载的形式获取到数据) +func (c *documentSafetyMeetingController) DocumentSafetyTreeStructureFunc(ctx context.Context, req *system.DocumentSafetyTreeStructureReq) (res *system.DocumentQualityTreeStructureRes, err error) { + res, err = service.DocumentSafetyMeeting().TreeStructureFunc(ctx, req) + return +} + +// DocumentQualitySelectByPidFunc 根据路径获取到pid +func (c *documentSafetyMeetingController) DocumentSafetySelectByPidFunc(ctx context.Context, req *system.DocumentSafetySelectByPidReq) (res *system.DocumentQualitySelectByPidRes, err error) { + res, err = service.DocumentSafetyMeeting().SelectByPidFunc(ctx, req) + return +} + +// DocumentQualityDataRecyclingStationFunc 回收站 +func (c *documentSafetyMeetingController) DocumentSafetyDataRecyclingStationFunc(ctx context.Context, req *system.DocumentSafetyDataRecyclingStationReq) (res *system.DocumentQualityDataRecyclingStationRes, err error) { + err = service.DocumentSafetyMeeting().CompletionDataRecyclingStationFunc(ctx, req) + return +} + +// DocumentQualityRecycleBinListFunc 回收站列表(不分页) +func (c *documentSafetyMeetingController) DocumentSafetyRecycleBinListFunc(ctx context.Context, req *system.DocumentSafetyRecycleBinListReq) (res *system.DocumentQualityRecycleBinListRes, err error) { + res, err = service.DocumentSafetyMeeting().RecycleBinListFunc(ctx, req) + return +} diff --git a/internal/app/system/controller/manage_airline.go b/internal/app/system/controller/manage_airline.go new file mode 100644 index 0000000..3776704 --- /dev/null +++ b/internal/app/system/controller/manage_airline.go @@ -0,0 +1,59 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-12-11 16:10:19 +// 生成路径: internal/app/system/controller/manage_airline.go +// 生成人:gfast +// desc:航线 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type manageAirlineController struct { + BaseController +} + +var ManageAirline = new(manageAirlineController) + +// List 列表 +func (c *manageAirlineController) List(ctx context.Context, req *system.ManageAirlineSearchReq) (res *system.ManageAirlineSearchRes, err error) { + res, err = service.ManageAirline().List(ctx, req) + return +} + +// Get 获取航线 +func (c *manageAirlineController) Get(ctx context.Context, req *system.ManageAirlineGetReq) (res *system.ManageAirlineGetRes, err error) { + res = new(system.ManageAirlineGetRes) + res.ManageAirlineInfoRes, err = service.ManageAirline().GetById(ctx, req.Id) + return +} + +// Add 添加航线 +func (c *manageAirlineController) Add(ctx context.Context, req *system.ManageAirlineAddReq) (res *system.ManageAirlineAddRes, err error) { + err = service.ManageAirline().Add(ctx, req) + return +} + +// Edit 修改航线 +func (c *manageAirlineController) Edit(ctx context.Context, req *system.ManageAirlineEditReq) (res *system.ManageAirlineEditRes, err error) { + err = service.ManageAirline().Edit(ctx, req) + return +} + +// Delete 删除航线 +func (c *manageAirlineController) Delete(ctx context.Context, req *system.ManageAirlineDeleteReq) (res *system.ManageAirlineDeleteRes, err error) { + err = service.ManageAirline().Delete(ctx, req.Ids) + return +} + +// RouteUploadFunc 上传航线 +func (c *manageAirlineController) RouteUploadFunc(ctx context.Context, req *system.RouteUploadReq) (res *system.RouteUploadRes, err error) { + err = service.ManageAirline().RouteUploadFunc(ctx, req) + return +} diff --git a/internal/app/system/controller/manage_device.go b/internal/app/system/controller/manage_device.go new file mode 100644 index 0000000..dad661b --- /dev/null +++ b/internal/app/system/controller/manage_device.go @@ -0,0 +1,125 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-11-14 10:53:21 +// 生成路径: internal/app/system/controller/manage_device.go +// 生成人:gfast +// desc:设备信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/tiger1103/gfast/v3/third/plane/mqtt" +) + +type manageDeviceController struct { + BaseController +} + +var ManageDevice = new(manageDeviceController) + +// List 列表 +func (c *manageDeviceController) List(ctx context.Context, req *system.ManageDeviceSearchReq) (res *system.ManageDeviceSearchRes, err error) { + res, err = service.ManageDevice().List(ctx, req) + return +} + +// NoPageList 不分页列表 +func (c *manageDeviceController) NoPageList(ctx context.Context, req *system.NoPageListSearchReq) (res *system.NoPageListSearchRes, err error) { + res, err = service.ManageDevice().NoPageList(ctx, req) + return +} + +// Get 获取设备信息 +func (c *manageDeviceController) Get(ctx context.Context, req *system.ManageDeviceGetReq) (res *system.ManageDeviceGetRes, err error) { + res = new(system.ManageDeviceGetRes) + res.ManageDeviceInfoRes, err = service.ManageDevice().GetById(ctx, req.Id) + return +} + +// Add 添加设备信息 +func (c *manageDeviceController) Add(ctx context.Context, req *system.ManageDeviceAddReq) (res *system.ManageDeviceAddRes, err error) { + err = service.ManageDevice().Add(ctx, req) + return +} + +// Edit 修改设备信息 +func (c *manageDeviceController) Edit(ctx context.Context, req *system.ManageDeviceEditReq) (res *system.ManageDeviceEditRes, err error) { + err = service.ManageDevice().Edit(ctx, req) + return +} + +// Delete 删除设备信息 +func (c *manageDeviceController) Delete(ctx context.Context, req *system.ManageDeviceDeleteReq) (res *system.ManageDeviceDeleteRes, err error) { + err = service.ManageDevice().Delete(ctx, req.Ids) + return +} + +// ProductEnumerationFunc 设备产品枚举(固定的东西),目前 +func (c *manageDeviceController) ProductEnumerationFunc(ctx context.Context, req *system.ProductEnumerationFuncReq) (res *system.ProductEnumerationFuncRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + res = new(system.ProductEnumerationFuncRes) + var mdi []*model.ManageDeviceDictionaryInfo + err = g.DB().Model("manage_device_dictionary").Ctx(ctx).Where("id", 2).Scan(&mdi) + res.List = mdi + liberr.ErrIsNil(ctx, err, "获取失败") + }) + return +} + +// CameraPhotoTakeFunc 无人机抓拍 +func (c *manageDeviceController) CameraPhotoTakeFunc(ctx context.Context, req *system.CameraPhotoTakeFuncReq) (res *system.CameraPhotoTakeFuncRes, err error) { + //0、根据航迹ID获取到当前正在执行任务的状态(是手动飞行还是自动飞行?只有手动才能拍照,因为涉及到大图合并) + count, err := dao.ManageTaskRecord.Ctx(ctx).Where("track_id", req.TrackId).Where("is_voluntarily = 1").Count() + if err != nil { + return + } + if count == 0 { + err = errors.New("当前任务为定时任务,无法执行手动拍照功能!") + return nil, err + } + //1、组装数据 + err, d := mqtt.Camera_photo_take(ctx, req.GatewaySn, req.PayloadIndex) + if err != nil { + return nil, err + } + if d.Data.Result > 0 { + err = mqtt.Geterror(d.Data.Result) + } + return +} + +// LiveSetQualityFunc 设置直播清晰度 +func (c *manageDeviceController) LiveSetQualityFunc(ctx context.Context, req *system.LiveSetQualityReq) (res *system.LiveSetQualityRes, err error) { + //1、组装数据 + err, d := mqtt.Live_set_quality(ctx, req.GatewaySn, req.Two, req.PayloadIndex, req.Enum) + if err != nil { + return nil, err + } + if d.Data.Result > 0 { + err = mqtt.Geterror(d.Data.Result) + } + return +} + +// ButtonStateFunc 调试模式按钮状态 +func (c *manageDeviceController) ButtonStateFunc(ctx context.Context, req *system.ButtonStateReq) (res *system.ButtonStateRes, err error) { + res = new(system.ButtonStateRes) + var be *model.ButtonEntity + err = g.DB().Model("manage_button_state").Where("mq_client_id", req.MqClientId).Scan(&be) + if err != nil { + err = errors.New("获取调试模式按钮状态失败!") + } else { + res.ButtonEntity = be + } + return +} diff --git a/internal/app/system/controller/manage_operation_log.go b/internal/app/system/controller/manage_operation_log.go new file mode 100644 index 0000000..a7a3160 --- /dev/null +++ b/internal/app/system/controller/manage_operation_log.go @@ -0,0 +1,54 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-06-21 15:23:29 +// 生成路径: internal/app/system/controller/manage_operation_log.go +// 生成人:gfast +// desc:无人机指令日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type manageOperationLogController struct { + BaseController +} + +var ManageOperationLog = new(manageOperationLogController) + +// List 列表 +func (c *manageOperationLogController) List(ctx context.Context, req *system.ManageOperationLogSearchReq) (res *system.ManageOperationLogSearchRes, err error) { + res, err = service.ManageOperationLog().List(ctx, req) + return +} + +// Get 获取无人机指令日志 +func (c *manageOperationLogController) Get(ctx context.Context, req *system.ManageOperationLogGetReq) (res *system.ManageOperationLogGetRes, err error) { + res = new(system.ManageOperationLogGetRes) + res.ManageOperationLogInfoRes, err = service.ManageOperationLog().GetById(ctx, req.Id) + return +} + +// +//// Add 添加无人机指令日志 +//func (c *manageOperationLogController) Add(ctx context.Context, req *system.ManageOperationLogAddReq) (res *system.ManageOperationLogAddRes, err error) { +// err = service.ManageOperationLog().Add(ctx, req) +// return +//} + +//// Edit 修改无人机指令日志 +//func (c *manageOperationLogController) Edit(ctx context.Context, req *system.ManageOperationLogEditReq) (res *system.ManageOperationLogEditRes, err error) { +// err = service.ManageOperationLog().Edit(ctx, req) +// return +//} + +// Delete 删除无人机指令日志 +func (c *manageOperationLogController) Delete(ctx context.Context, req *system.ManageOperationLogDeleteReq) (res *system.ManageOperationLogDeleteRes, err error) { + err = service.ManageOperationLog().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/manage_task.go b/internal/app/system/controller/manage_task.go new file mode 100644 index 0000000..1435fc0 --- /dev/null +++ b/internal/app/system/controller/manage_task.go @@ -0,0 +1,195 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-12-12 15:21:22 +// 生成路径: internal/app/system/controller/manage_task.go +// 生成人:gfast +// desc:航线任务下发 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + uuid "github.com/satori/go.uuid" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + logic "github.com/tiger1103/gfast/v3/internal/app/system/logic/manageTaskRecord" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/tiger1103/gfast/v3/third/plane/dj" + "github.com/tiger1103/gfast/v3/third/plane/mqtt" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" + "strconv" + "strings" + "time" +) + +type manageTaskController struct { + BaseController +} + +var ManageTask = new(manageTaskController) + +// List 列表 +func (c *manageTaskController) List(ctx context.Context, req *system.ManageTaskSearchReq) (res *system.ManageTaskSearchRes, err error) { + res, err = service.ManageTask().List(ctx, req) + return +} + +// Get 获取航线任务下发 +func (c *manageTaskController) Get(ctx context.Context, req *system.ManageTaskGetReq) (res *system.ManageTaskGetRes, err error) { + res = new(system.ManageTaskGetRes) + res.ManageTaskInfoRes, err = service.ManageTask().GetById(ctx, req.Id) + return +} + +// Add 添加航线任务下发 +func (c *manageTaskController) Add(ctx context.Context, req *system.ManageTaskAddReq) (res *system.ManageTaskAddRes, err error) { + err = service.ManageTask().Add(ctx, req) + return +} + +// Edit 修改航线任务下发 +func (c *manageTaskController) Edit(ctx context.Context, req *system.ManageTaskEditReq) (res *system.ManageTaskEditRes, err error) { + err = service.ManageTask().Edit(ctx, req) + return +} + +// Delete 删除航线任务下发 +func (c *manageTaskController) Delete(ctx context.Context, req *system.ManageTaskDeleteReq) (res *system.ManageTaskDeleteRes, err error) { + err = service.ManageTask().Delete(ctx, req.Ids) + return +} + +// FlighttaskPrepare 航线任务下发 +func (c *manageTaskController) FlighttaskPrepare(ctx context.Context, req *system.FlighttaskPrepareReq) (res *system.FlighttaskPrepareRes, err error) { + _, err = FlighttaskPrepareFunc(ctx, req) + return +} + +// FlighttaskPrepareFunc 下发任务 or 断点续飞 +func FlighttaskPrepareFunc(ctx context.Context, req *system.FlighttaskPrepareReq) (id int64, err error) { + get, err := g.Redis().Get(ctx, mqtt.RainfallStr+req.GatewaySn) + if err == nil && get.String() == " " { + err = errors.New("无法获取降雨量") + return + } else if get.Int() > 0 { + err = errors.New("机舱外正在下雨,无法下发任务!") + return + } + + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + var mt *model.ManageTaskInfoRes + err = dao.ManageTask.Ctx(ctx).WherePri(req.Id).Scan(&mt) + if mt != nil { + all := strings.ReplaceAll(uuid.NewV4().String(), "-", "") + if req.BreakpointRenewalUUID != "" { + all = req.BreakpointRenewalUUID + } + //1、组装数据。发送mq + line := mt.AirLine + var ma *model.ManageAirlineInfoRes + err = dao.ManageAirline.Ctx(ctx).WherePri(line).Scan(&ma) + if ma == nil { + liberr.ErrIsNil(ctx, err) + return + } + prepareRes := dj.FlighttaskPrepareRes{} + prepareRes.Data.FlightId = all + atoi, _ := strconv.Atoi(req.TaskType) + prepareRes.Data.TaskType = atoi + prepareRes.Data.TaskType = atoi + prepareRes.Data.ExecuteTime = req.ExecuteTime + prepareRes.Data.WaylineType = mt.WaylineType + prepareRes.Data.File = &dj.FileEntity{Url: coryCommon.GlobalPath + "/" + ma.FilePath, Fingerprint: ma.Fingerprint} + prepareRes.Data.RthAltitude = mt.RthAltitude + prepareRes.Data.RthMode = mt.RthMode + prepareRes.Data.OutOfControlAction = mt.OutOfControlAction + prepareRes.Data.ExitWaylineWhenRcLost = mt.ExitWaylineWhenRcLost + if req.BreakPoint != nil { //断点续飞 + point := dj.BreakPoint{ + Index: req.BreakPoint.Index, + State: req.BreakPoint.State, + Progress: req.BreakPoint.Progress, + WaylineId: req.BreakPoint.WaylineId, + } + prepareRes.Data.BreakPoint = &point + } + _, _, err2, reply := mqtt.Flighttask_prepare(ctx, req.GatewaySn, &prepareRes) + if err2 != nil { + liberr.ErrIsNil(ctx, err2, "下发任务失败!") + return + } + if reply.Data.Result > 0 { + err = mqtt.Geterror(reply.Data.Result) + liberr.ErrIsNil(ctx, err) + return + } + var idd uint64 + user := ct.New().GetLoginUser(ctx) + if user == nil { + idd = 0 + } else { + idd = user.Id + } + if req.BreakPoint == nil { + // 预估回传数量 + number, numberErr := logic.GetTheTaskDataBasedOnTheTaskId(ctx, mt.Id) + if numberErr != nil { + g.Log("uav").Error(ctx, "预估回传数量错误") + liberr.ErrIsNil(ctx, numberErr) + return + } + //2、新增历史记录 + infoRes := model.ManageTaskRecordInfoRes{ + TaskId: mt.Id, + TaskType: req.TaskType, + ExecuteTime: req.ExecuteTime, + FlightId: all, + Remark: req.Remark, + MqClientId: mt.MqClientId, + ProjectId: mt.ProjectId, + CreateBy: strconv.FormatUint(idd, 10), + TaskName: mt.TaskName, + Waypoint: number, + } + //不为空代表定时自动飞行 + if req.TimedFlight != "" { + infoRes.IsVoluntarily = "0" + } else { + infoRes.IsVoluntarily = "1" + } + insertData, err := dao.ManageTaskRecord.Ctx(ctx).OmitEmpty().Insert(infoRes) + liberr.ErrIsNil(ctx, err, "任务下发失败!") + id, err = insertData.LastInsertId() + liberr.ErrIsNil(ctx, err) + } else { //断点续飞 + time.Sleep(1 * time.Second) + errDd, replyDd := mqtt.Flighttask_execute(ctx, req.GatewaySn, all) + if errDd != nil { + return + } + if replyDd.Data.Result > 0 { + err = mqtt.Geterror(replyDd.Data.Result) + } else { + dao.ManageTaskRecord.Ctx(ctx).Where("flight_id", req.BreakpointRenewalUUID).Update(g.Map{"execute_the_task": tool.MillisecondTimestamp()}) + } + return + } + } + liberr.ErrIsNil(ctx, err) + return + }) + return err + }) + return + +} diff --git a/internal/app/system/controller/manage_task_cron.go b/internal/app/system/controller/manage_task_cron.go new file mode 100644 index 0000000..967253d --- /dev/null +++ b/internal/app/system/controller/manage_task_cron.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-06-04 14:33:05 +// 生成路径: internal/app/system/controller/manage_task_cron.go +// 生成人:gfast +// desc:航线任务定时飞行 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "golang.org/x/net/context" +) + +type manageTaskCronController struct { + BaseController +} + +var ManageTaskCron = new(manageTaskCronController) + +// Add 添加航线任务定时飞行 +func (c *manageTaskCronController) Add(ctx context.Context, req *system.ManageTaskCronAddReq) (res *system.ManageTaskCronAddRes, err error) { + err = service.ManageTaskCron().Add(ctx, req) + return +} + +// Delete 删除航线任务定时飞行 +func (c *manageTaskCronController) Delete(ctx context.Context, req *system.ManageTaskCronDeleteReq) (res *system.ManageTaskCronDeleteRes, err error) { + err = service.ManageTaskCron().Delete(ctx, req.MqClientId) + return +} + +// Edit 修改航线任务定时飞行 +func (c *manageTaskCronController) Edit(ctx context.Context, req *system.ManageTaskCronEditReq) (res *system.ManageTaskCronEditRes, err error) { + err = service.ManageTaskCron().Edit(ctx, req) + return +} + +// Get 获取航线任务定时飞行 +func (c *manageTaskCronController) Get(ctx context.Context, req *system.ManageTaskCronGetReq) (res *system.ManageTaskCronGetRes, err error) { + res = new(system.ManageTaskCronGetRes) + res.ManageTaskCronInfoRes, err = service.ManageTaskCron().GetById(ctx, req.MqClientId) + return +} + +//// List 列表 +//func (c *manageTaskCronController) List(ctx context.Context, req *system.ManageTaskCronSearchReq) (res *system.ManageTaskCronSearchRes, err error) { +// res, err = service.ManageTaskCron().List(ctx, req) +// return +//} diff --git a/internal/app/system/controller/manage_task_record.go b/internal/app/system/controller/manage_task_record.go new file mode 100644 index 0000000..b00414d --- /dev/null +++ b/internal/app/system/controller/manage_task_record.go @@ -0,0 +1,291 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-12-12 17:56:19 +// 生成路径: internal/app/system/controller/manage_task_record.go +// 生成人:gfast +// desc:航线任务下发-记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "errors" + "os" + "path/filepath" + "strconv" + "strings" + "time" + + "github.com/tiger1103/gfast/v3/api/webodm" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/tiger1103/gfast/v3/third/plane/dj" + "github.com/tiger1103/gfast/v3/third/plane/mqtt" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +type manageTaskRecordController struct { + BaseController +} + +var ManageTaskRecord = new(manageTaskRecordController) + +// List 列表 +func (c *manageTaskRecordController) List(ctx context.Context, req *system.ManageTaskRecordSearchReq) (res *system.ManageTaskRecordSearchRes, err error) { + res, err = service.ManageTaskRecord().List(ctx, req) + return +} + +// @Title UpDataResource 2024/8/7 15:26:00 +// @Description 更新大图合并的资源 +// @Auth Cory +func (c *manageTaskRecordController) UpDataResource(ctx context.Context, req *system.UpDataResourceReq) (res *system.UpDataResourceRes, err error) { + err = service.ManageTaskRecord().UpDataResource(ctx, req) + return +} + +func (c *manageTaskRecordController) GetAiResult(ctx context.Context, req *system.GetAiResultReq) (res *system.GetAiResultRes, err error) { + return service.ManageTaskRecord().GetAiResult(ctx, req) +} + +// 提交AI识别结果 +func (c *manageTaskRecordController) ConfirmAiResult(ctx context.Context, req *system.ConfirmAiResultReq) (res *system.ConfirmAiResultRes, err error) { + err = service.ManageTaskRecord().ConfirmAiResult(ctx, req) + return +} + +// Get 获取航线任务下发-记录 +func (c *manageTaskRecordController) Get(ctx context.Context, req *system.ManageTaskRecordGetReq) (res *system.ManageTaskRecordGetRes, err error) { + res = new(system.ManageTaskRecordGetRes) + res.ManageTaskRecordInfoRes, err = service.ManageTaskRecord().GetById(ctx, req.Id) + return +} + +// PerformATaskFunc 执行任务 +func (c *manageTaskRecordController) PerformATaskFunc(ctx context.Context, req *system.PerformATaskReq) (res *system.PerformATaskRes, err error) { + var mtr *model.ManageTaskRecordInfoRes + dao.ManageTaskRecord.Ctx(ctx).WherePri(req.Id).Scan(&mtr) + err, reply := mqtt.Flighttask_execute(ctx, req.GatewaySn, mtr.FlightId) + if err != nil { + return nil, err + } + if reply.Data.Result > 0 { + err = mqtt.Geterror(reply.Data.Result) + } else { + dao.ManageTaskRecord.Ctx(ctx).Where("flight_id", mtr.FlightId).Update(g.Map{"execute_the_task": tool.MillisecondTimestamp()}) + } + return +} + +//// CancelATaskFunc 取消任务 +//func (c *manageTaskRecordController) CancelATaskFunc(ctx context.Context, req *system.CancelATaskReq) (res *system.PerformATaskRes, err error) { +// var mtr *model.ManageTaskRecordInfoRes +// dao.ManageTaskRecord.Ctx(ctx).WherePri(req.Id).Scan(&mtr) +// err, reply := mqtt.Flighttask_undo(req.GatewaySn, strings.Split(mtr.FlightId, ",")) +// if err != nil { +// return nil, err +// } +// if reply.Data.Result > 0 { +// err = mqtt.Geterror(reply.Data.Result) +// } else { +// dao.ManageTaskRecord.Ctx(ctx).Where("flight_id", mtr.FlightId).Update(g.Map{"cancel_time": tool.MillisecondTimestamp()}) +// } +// return +//} + +// RouteSuspensionFunc 航线暂停 +func (c *manageTaskRecordController) RouteSuspensionFunc(ctx context.Context, req *system.RouteSuspensionReq) (res *system.PerformATaskRes, err error) { + var mtr *model.ManageTaskRecordInfoRes + dao.ManageTaskRecord.Ctx(ctx).WherePri(req.Id).Scan(&mtr) + err, reply := mqtt.Flighttask_pause(ctx, req.GatewaySn) + if err != nil { + return nil, err + } + if reply.Data.Result > 0 { + err = mqtt.Geterror(reply.Data.Result) + } else { + dao.ManageTaskRecord.Ctx(ctx).Where("flight_id", mtr.FlightId).Update(g.Map{"suspend": tool.MillisecondTimestamp(), "is_suspend": "1"}) + } + return +} + +// CourseResumptionFunc 航线恢复 +func (c *manageTaskRecordController) CourseResumptionFunc(ctx context.Context, req *system.CourseResumptionReq) (res *system.PerformATaskRes, err error) { + var mtr *model.ManageTaskRecordInfoRes + dao.ManageTaskRecord.Ctx(ctx).WherePri(req.Id).Scan(&mtr) + err, reply := mqtt.Flighttask_recovery(ctx, req.GatewaySn) + if err != nil { + return nil, err + } + if reply.Data.Result > 0 { + err = mqtt.Geterror(reply.Data.Result) + } else { + dao.ManageTaskRecord.Ctx(ctx).Where("flight_id", mtr.FlightId).Update(g.Map{"recover": tool.MillisecondTimestamp(), "is_suspend": "0"}) + } + return +} + +// OneClickBackFunc 一键返航 +func (c *manageTaskRecordController) OneClickBackFunc(ctx context.Context, req *system.OneClickBackReq) (res *system.PerformATaskRes, err error) { + var mtr *model.ManageTaskRecordInfoRes + dao.ManageTaskRecord.Ctx(ctx).WherePri(req.Id).Scan(&mtr) + err, reply := mqtt.Return_home(ctx, req.GatewaySn) + if err != nil { + return nil, err + } + if reply.Data.Result > 0 { + err = mqtt.Geterror(reply.Data.Result) + } else { + dao.ManageTaskRecord.Ctx(ctx).Where("flight_id", mtr.FlightId).Update(g.Map{"course_reversal": tool.MillisecondTimestamp(), "accomplish": tool.MillisecondTimestamp()}) + } + return +} + +// CancelHomingFunc 取消返航 +func (c *manageTaskRecordController) CancelHomingFunc(ctx context.Context, req *system.CancelHomingReq) (res *system.PerformATaskRes, err error) { + var mtr *model.ManageTaskRecordInfoRes + dao.ManageTaskRecord.Ctx(ctx).WherePri(req.Id).Scan(&mtr) + err, reply := mqtt.Return_home_cancel(ctx, req.GatewaySn) + if err != nil { + return nil, err + } + if reply.Data.Result > 0 { + err = mqtt.Geterror(reply.Data.Result) + } else { + dao.ManageTaskRecord.Ctx(ctx).Where("flight_id", mtr.FlightId).Update(g.Map{"cancel_homing": tool.MillisecondTimestamp()}) + } + return +} + +// FlighttaskResourceGetFunc 删除任务 +func (c *manageTaskRecordController) FlighttaskResourceGetFunc(ctx context.Context, req *system.ManageTaskRecordDeleteReq) (res *system.ManageTaskRecordDeleteRes, err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 1、取消任务 + for _, id := range req.Ids { + // 查询 + var mtr *model.ManageTaskRecordInfoRes + err = dao.ManageTaskRecord.Ctx(ctx).WherePri(id).Scan(&mtr) + liberr.ErrIsNil(ctx, err) + if mtr.IsResourceReady == "1" { // 资源准备好了才删 + if mtr.MergeProjectId == "" || mtr.MergeId == "" { + liberr.ErrIsNil(ctx, errors.New("删除数据失败,未获取到webDom的项目ID或任务ID")) + return + } + // 删除webdom资源 + webodm.DelUuidFunc(mtr.MergeProjectId, mtr.MergeId) + // 删除tif、大图合并 + img := coryCommon.FileToFunc(mtr.WImg, 2) + os.Remove(img) + tif := coryCommon.FileToFunc(mtr.WTif, 2) + os.Remove(tif) + } + // 取消任务 + err, reply := mqtt.Flighttask_undo(ctx, mtr.MqClientId, strings.Split(mtr.FlightId, ",")) + liberr.ErrIsNil(ctx, err, "取消任务失败") + if reply.Data.Result > 0 { + err = mqtt.Geterror(reply.Data.Result) + liberr.ErrIsNil(ctx, err) + return + } + // 获取飞机回传下载的资源的目录,进行数据删除(下载到本地的资源和minio的资源) + sql := `select + SUBSTRING_INDEX(object_key, '/', 2) as extracted_part + from + manage_task_record_resource + where + flight_id = ` + "'" + mtr.FlightId + "'" + ` + limit 1` + if value, err := g.DB().GetValue(ctx, sql); err == nil { + if value.String() != "" { + deleteDirectory(coryCommon.GetCWD() + "/" + coryCommon.Uav + value.String()) + client, _ := dj.PublicMinioClient() + dj.DeletesTheFileWithTheSpecifiedPrefixBasedOnTheObjectSet(ctx, client, dj.BucketName, value.String(), true) + } + } + } + // 3、刪除数据库记录数据 + _, err = dao.ManageTaskRecord.Ctx(ctx).Delete(dao.ManageTaskRecord.Columns().Id+" in (?)", req.Ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return err + }) + return +} + +func deleteDirectory(dir string) error { + d, err := os.Open(dir) + if err != nil { + return err + } + defer d.Close() + names, err := d.Readdirnames(-1) + if err != nil { + return err + } + for _, name := range names { + path := filepath.Join(dir, name) + if info, err := os.Stat(path); err == nil && info.IsDir() { + if err := deleteDirectory(path); err != nil { + return err + } + } else { + if err := os.Remove(path); err != nil { + return err + } + } + } + return os.Remove(dir) +} + +// BreakpointContinuaionFunc 断点续飞 +func (c *manageTaskRecordController) BreakpointContinuaionFunc(ctx context.Context, req *system.BreakpointContinuationReq) (res *system.PerformATaskRes, err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 1、断点续飞需要清除上一次飞行的部分数据 + _, err = dao.ManageTaskRecord.Ctx(ctx).Where("id", req.Id).Update( + g.Map{ + "execute_time": nil, + //"execute_the_task": nil, + "suspend": nil, + "recover": nil, + "course_reversal": nil, + "accomplish": nil, + "is_suspend": nil, + }) + liberr.ErrIsNil(ctx, err) + // 2、获取当前需要断点续飞的数据 + var ddEntity model.ManageTaskRecordInfoRes + err = dao.ManageTaskRecord.Ctx(ctx).WherePri(req.Id).Scan(&ddEntity) + liberr.ErrIsNil(ctx, err) + prepareReq := system.FlighttaskPrepareReq{ + Id: strconv.FormatInt(ddEntity.TaskId, 10), + GatewaySn: req.GatewaySn, + TaskType: "0", + ExecuteTime: time.Now().UnixNano() / int64(time.Millisecond), + BreakpointRenewalUUID: ddEntity.FlightId, + } + pointReq := system.BreakPointReq{ + Index: ddEntity.DdIndex, + State: ddEntity.DdState, + Progress: ddEntity.DdProgress, + WaylineId: ddEntity.RouteId, + } + prepareReq.BreakPoint = &pointReq + prepareReq.Id = strconv.FormatInt(ddEntity.TaskId, 10) + _, err = FlighttaskPrepareFunc(ctx, &prepareReq) + liberr.ErrIsNil(ctx, err) + }) + return err + }) + return +} diff --git a/internal/app/system/controller/manage_task_record_resource.go b/internal/app/system/controller/manage_task_record_resource.go new file mode 100644 index 0000000..f165d36 --- /dev/null +++ b/internal/app/system/controller/manage_task_record_resource.go @@ -0,0 +1,315 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-05-30 17:07:01 +// 生成路径: internal/app/system/controller/manage_task_record_resource.go +// 生成人:gfast +// desc:下发记录回传的媒体文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gctx" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/api/webodm" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + logic "github.com/tiger1103/gfast/v3/internal/app/system/logic/manageTaskRecordResource" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/tiger1103/gfast/v3/third/plane/dj" + "golang.org/x/exp/rand" + "os" + "path/filepath" + "strconv" + "time" +) + +type manageTaskRecordResourceController struct { + BaseController +} + +var ManageTaskRecordResource = new(manageTaskRecordResourceController) + +// List 列表 +func (c *manageTaskRecordResourceController) List(ctx context.Context, req *system.ManageTaskRecordResourceSearchReq) (res *system.ManageTaskRecordResourceSearchRes, err error) { + res, err = service.ManageTaskRecordResource().List(ctx, req) + return +} + +// Get 获取下发记录回传的媒体文件 +func (c *manageTaskRecordResourceController) Get(ctx context.Context, req *system.ManageTaskRecordResourceGetReq) (res *system.ManageTaskRecordResourceGetRes, err error) { + res = new(system.ManageTaskRecordResourceGetRes) + res.ManageTaskRecordResourceInfoRes, err = service.ManageTaskRecordResource().GetByFlightId(ctx, req.FlightId) + return +} + +// Add 添加下发记录回传的媒体文件 +func (c *manageTaskRecordResourceController) Add(ctx context.Context, req *system.ManageTaskRecordResourceAddReq) (res *system.ManageTaskRecordResourceAddRes, err error) { + err = service.ManageTaskRecordResource().Add(ctx, req) + return +} + +// Edit 修改下发记录回传的媒体文件 +func (c *manageTaskRecordResourceController) Edit(ctx context.Context, req *system.ManageTaskRecordResourceEditReq) (res *system.ManageTaskRecordResourceEditRes, err error) { + err = service.ManageTaskRecordResource().Edit(ctx, req) + return +} + +// Delete 删除下发记录回传的媒体文件 +func (c *manageTaskRecordResourceController) Delete(ctx context.Context, req *system.ManageTaskRecordResourceDeleteReq) (res *system.ManageTaskRecordResourceDeleteRes, err error) { + err = service.ManageTaskRecordResource().Delete(ctx, req.FlightIds) + return +} + +// DownloadAccordingToMysqlFunc 根据计划ID批量下载(准备)数据图片 +func (c *manageTaskRecordResourceController) DownloadAccordingToMysqlFunc(ctx context.Context, req *system.DownloadAccordingToMysqlReq) (res *system.DownloadAccordingToMysqlRes, err error) { + err = service.ManageTaskRecordResource().DownloadAccordingToMysqlFunc(ctx, req.FlightId) + return +} + +// @Title ObtainResourcesAccordingToFlightId 2024/8/19 17:42:00 +// @Description 获取大图合并需要的资源路径 +// @Auth Cory +// @param 输入参数名 ---> "参数解释" +// @Return error ---> "错误信息" +func (c *manageTaskRecordResourceController) ObtainResourcesAccordingToFlightId(ctx context.Context, req *system.ObtainResourcesAccordingToFlightIdReq) (*system.ObtainResourcesAccordingToFlightIdRes, error) { + res, err := service.ManageTaskRecordResource().ObtainResourcesAccordingToFlightId(ctx, req.FlightId) + return res, err +} + +// FlightIdByProgressQueryFunc 根据计划ID查询下载(准备)数据图片进度 +func (c *manageTaskRecordResourceController) FlightIdByProgressQueryFunc(ctx context.Context, req *system.FlightIdByProgressQueryReq) (res *system.FlightIdByProgressQueryRes, err error) { + res = new(system.FlightIdByProgressQueryRes) + get, err := g.Redis().Get(ctx, logic.UavRedisKey+req.FlightId) + if err != nil { + err = errors.New("当前进度已被销毁!") + } else { + res.Percentage = get.String() + //如果查询出来的进度为百分之百,那么将改变当前计划id的状态为下载完成,然后删除当前redis存储 + if res.Percentage == "100" { + _, err = dao.ManageTaskRecord.Ctx(ctx).Where("flight_id", req.FlightId).Update(g.Map{"is_resource_ready": "1"}) + if err == nil { + g.Redis().Del(ctx, logic.UavRedisKey+req.FlightId) + } + } + } + return +} + +/* +1、根据路径下载文件到本地 +2、根据文件名字分为w和z两个文件夹 +3、压缩文件,提供下载路径 +*/ +func (c *manageTaskRecordResourceController) UavImgDownLoad(ctx context.Context, req *system.DownLoadImgReq) (res *system.DownLoadImgRes, err error) { + res = new(system.DownLoadImgRes) + err = g.Try(ctx, func(ctx context.Context) { + // 1、创建目录 + dirPath := filepath.ToSlash(coryCommon.GetCWD() + "/" + coryCommon.Ynr(coryCommon.Temporary+"/") + coryCommon.FileName("zy")) + err = os.Mkdir(dirPath, 0755) + liberr.ErrIsNil(ctx, err, "创建目录失败") + // 2、下载资源到指定目录 + minioClient, _ := dj.PublicMinioClient() + err = dj.DownloadTheFileWithTheSpecifiedPrefixBasedOnTheObjectSet(ctx, minioClient, dj.BucketName, req.ObjectKey, dirPath, true) + liberr.ErrIsNil(ctx, err, "下载资源失败") + // 3、对资源进行分类并打成压缩文件(临时目录过一段时间会自动删除数据) + //err = ResourceArrangement(ctx, dirPath) + //liberr.ErrIsNil(ctx, err, "文件分类失败") + zipFile := coryCommon.ResourcePublicToFunc(filepath.ToSlash("/"+coryCommon.Ynr(coryCommon.Temporary+"/")+coryCommon.FileName("wp")+".zip"), 2) + err = coryCommon.FolderToZip(dirPath, zipFile) + liberr.ErrIsNil(ctx, err, "压缩文件失败") + res.Path = coryCommon.ResourcePublicToFunc(filepath.ToSlash(zipFile), 1) + }) + return res, err +} + +func ResourceArrangement(ctx context.Context, sourceDir string) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 创建目标文件夹w和z + err = os.MkdirAll(filepath.Join(sourceDir, "w"), 0755) + liberr.ErrIsNil(ctx, err) + err = os.MkdirAll(filepath.Join(sourceDir, "z"), 0755) + liberr.ErrIsNil(ctx, err) + var wFiles []string + var zFiles []string + // 遍历源文件夹下的所有文件 + err = filepath.Walk(sourceDir, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if info.IsDir() { + return nil + } + // 判断文件名是否包含_W后缀,若是则添加到wFiles切片 + if filepath.Ext(path) == ".jpeg" && filepath.Base(path)[len(filepath.Base(path))-6:] == "W.jpeg" { + wFiles = append(wFiles, path) + } + // 判断文件名是否包含_Z后缀,若是则添加到zFiles切片 + if filepath.Ext(path) == ".jpeg" && filepath.Base(path)[len(filepath.Base(path))-6:] == "Z.jpeg" { + zFiles = append(zFiles, path) + } + return nil + }) + liberr.ErrIsNil(ctx, err) + // 将带有_W后缀的文件移动到w文件夹 + for _, file := range wFiles { + newPath := filepath.Join(sourceDir, "w", filepath.Base(file)) + os.Rename(file, newPath) + } + + // 将带有_Z后缀的文件移动到z文件夹 + for _, file := range zFiles { + newPath := filepath.Join(sourceDir, "z", filepath.Base(file)) + os.Rename(file, newPath) + } + }) + return nil +} + +// @Title DownloadMergeLargeImageFunc 2024/8/20 10:42:00 +// @Description 大图合并等一系列逻辑业务 +// @Auth Cory +func (c *manageTaskRecordResourceController) DownloadMergeLargeImageFunc(ctx context.Context, req *system.VoluntarilyReq) (res *system.VoluntarilyRes, err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + //0、如果有合并项目及合并任务id,证明已操作过合并,就不允许再次操作 + count, _ := dao.ManageTaskRecord.Ctx(ctx).WherePri(req.Id).Where("merge_project_id <> '' and merge_id <> ''").Count() + if count >= 1 { + err = errors.New("此功能无法重复操作!") + return err + } + res = new(system.VoluntarilyRes) + //1、从minio下载文件到本地服务器中 + err = service.ManageTaskRecordResource().DownloadAccordingToMysqlFunc(ctx, req.FlightId) + if err != nil { + err = errors.New("从minio下载文件到本地服务器中失败") + return err + } + //2、查询下载进度 + queryReq := system.FlightIdByProgressQueryReq{ + FlightId: req.FlightId, + } + for { + queryFunc, errFunc := c.FlightIdByProgressQueryFunc(ctx, &queryReq) + if errFunc != nil { + errFunc = errors.New("从minio下载文件到本地服务器中,进度读取失败") + return errFunc + } + if queryFunc.Percentage == "100" { + break + } + // 增加一个短暂的等待,避免频繁查询 + time.Sleep(500 * time.Millisecond) + } + //3、获取项目列表(从中随机选择一个项目) + listFunc, err := webodm.ProjectListFunc() + if err != nil { + g.Log().Error(gctx.New(), err) + return err + } + if len(listFunc.Results) == 0 { + err = errors.New("webDom中未找到项目") + return err + } + //4、创建任务 + files, err := service.ManageTaskRecordResource().ObtainResourcesAccordingToFlightId(ctx, req.FlightId) + if err != nil { + return err + } + if len(files.List) == 0 { + liberr.ErrIsNil(ctx, err, "服务器本地未找到无人机回传媒体文件") + return err + } else { + for i, v := range files.List { + files.List[i] = coryCommon.GlobalPath + v + } + } + //随机数生成器;生成一个在 0 到 数组长度 - 1 之间的随机索引 + rand.Seed(uint64(time.Now().UnixNano())) + projectId := strconv.Itoa(listFunc.Results[rand.Intn(len(listFunc.Results))].ID) + resTaskCreate, errTaskCreate := webodm.TaskCreateFunc(ctx, &webodm.TaskCreateReq{ + ProjectId: projectId, + UrlList: files.List, + }) + if errTaskCreate != nil { + return err + } + taskId := resTaskCreate.TaskId + res.TaskId = taskId + res.ProjectId = projectId + //4-1、记录webdom的项目id和任务id + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + _, err = dao.ManageTaskRecord.Ctx(ctx).Where("id", req.Id).Update( + g.Map{ + "merge_project_id": projectId, + "merge_id": taskId, + }) + if err == nil { + return nil + } else { + return err + } + }) + if err != nil { + return err + } + //5、开启携程以 轮询的方式进行进度查询,到达百分之百过后,需要调用ai等一系列操作 + go func() { + ctx2 := gctx.New() + for { + resTaskProcess, errTaskProcess := webodm.TaskProcessFunc(ctx2, &webodm.TaskProcessReq{ + TaskId: taskId, + ProjectId: projectId, + }) + if errTaskProcess != nil { + g.Log("uav").Error(ctx, "1----------"+errTaskProcess.Error()) + return + } + lastError := resTaskProcess.LastError //表示这个图片合成任务的处理过程中是否出错,出错的话这个字段就不是 null + if lastError != nil { + g.Log("uav").Error(ctx, lastError) + return + } + progress := resTaskProcess.RunningProgress //这个字段表示图片合成任务的处理进度,如果这个为 1 则证明任务已经处理完成了 + if progress == 1 { + //6、查看任务处理的结果 + goReq := &webodm.TaskDownloadReq{ + TaskId: taskId, + Format: "gtiff-rgb", + ProjectId: req.ProjectId, + } + one, errDownOne := webodm.DownloadTask(ctx2, goReq) + if errDownOne != nil { + g.Log("uav").Error(ctx, "2----------"+errDownOne.Error()) + return + } + goReq.Format = "png" + two, errDownTwo := webodm.DownloadTask(ctx2, goReq) + if errDownTwo != nil { + g.Log("uav").Error(ctx, "3----------"+errDownTwo.Error()) + return + } + //7、将得到数据存储到数据中 + service.ManageTaskRecord().UpDataResource(ctx, &system.UpDataResourceReq{ + Id: req.Id, + MergeProjectId: projectId, + MergeId: taskId, + WImg: two.FileUrl, + WTif: one.FileUrl, + ProjectId: req.ProjectId, + }) + return + } + // 增加一个短暂的等待,避免频繁查询 + time.Sleep(500 * time.Millisecond) + } + }() + return err + }) + return +} diff --git a/internal/app/system/controller/manage_task_result.go b/internal/app/system/controller/manage_task_result.go new file mode 100644 index 0000000..43cbeea --- /dev/null +++ b/internal/app/system/controller/manage_task_result.go @@ -0,0 +1,54 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-10-21 11:29:13 +// 生成路径: internal/app/system/controller/manage_task_result.go +// 生成人:gfast +// desc:AI识别到的数据 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type manageTaskResultController struct { + BaseController +} + +var ManageTaskResult = new(manageTaskResultController) + +// List 列表 +func (c *manageTaskResultController) List(ctx context.Context, req *system.ManageTaskResultSearchReq) (res *system.ManageTaskResultSearchRes, err error) { + res, err = service.ManageTaskResult().List(ctx, req) + return +} + +// Get 获取AI识别到的数据 +func (c *manageTaskResultController) Get(ctx context.Context, req *system.ManageTaskResultGetReq) (res *system.ManageTaskResultGetRes, err error) { + res = new(system.ManageTaskResultGetRes) + res.ManageTaskResultInfoRes, err = service.ManageTaskResult().GetById(ctx, req.Id) + return +} + +// Add 添加AI识别到的数据 +func (c *manageTaskResultController) Add(ctx context.Context, req *system.ManageTaskResultAddReq) (res *system.ManageTaskResultAddRes, err error) { + err = service.ManageTaskResult().Add(ctx, req) + return +} + +// Edit 修改AI识别到的数据 +func (c *manageTaskResultController) Edit(ctx context.Context, req *system.ManageTaskResultEditReq) (res *system.ManageTaskResultEditRes, err error) { + err = service.ManageTaskResult().Edit(ctx, req) + return +} + +// Delete 删除AI识别到的数据 +func (c *manageTaskResultController) Delete(ctx context.Context, req *system.ManageTaskResultDeleteReq) (res *system.ManageTaskResultDeleteRes, err error) { + err = service.ManageTaskResult().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/manage_workspace.go b/internal/app/system/controller/manage_workspace.go new file mode 100644 index 0000000..d9c5de2 --- /dev/null +++ b/internal/app/system/controller/manage_workspace.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-11-14 10:53:20 +// 生成路径: internal/app/system/controller/manage_workspace.go +// 生成人:gfast +// desc:工作空间 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type manageWorkspaceController struct { + BaseController +} + +var ManageWorkspace = new(manageWorkspaceController) + +// List 列表 +func (c *manageWorkspaceController) List(ctx context.Context, req *system.ManageWorkspaceSearchReq) (res *system.ManageWorkspaceSearchRes, err error) { + res, err = service.ManageWorkspace().List(ctx, req) + return +} + +// Get 获取工作空间 +func (c *manageWorkspaceController) Get(ctx context.Context, req *system.ManageWorkspaceGetReq) (res *system.ManageWorkspaceGetRes, err error) { + res = new(system.ManageWorkspaceGetRes) + res.ManageWorkspaceInfoRes, err = service.ManageWorkspace().GetById(ctx, req.Id) + return +} + +// Add 添加工作空间 +func (c *manageWorkspaceController) Add(ctx context.Context, req *system.ManageWorkspaceAddReq) (res *system.ManageWorkspaceAddRes, err error) { + err = service.ManageWorkspace().Add(ctx, req) + return +} + +// Edit 修改工作空间 +func (c *manageWorkspaceController) Edit(ctx context.Context, req *system.ManageWorkspaceEditReq) (res *system.ManageWorkspaceEditRes, err error) { + err = service.ManageWorkspace().Edit(ctx, req) + return +} + +// Delete 删除工作空间 +func (c *manageWorkspaceController) Delete(ctx context.Context, req *system.ManageWorkspaceDeleteReq) (res *system.ManageWorkspaceDeleteRes, err error) { + err = service.ManageWorkspace().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/master_schedule.go b/internal/app/system/controller/master_schedule.go new file mode 100644 index 0000000..772d3f7 --- /dev/null +++ b/internal/app/system/controller/master_schedule.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-10-08 09:38:35 +// 生成路径: internal/app/system/controller/master_schedule.go +// 生成人:gfast +// desc:总进度计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type masterScheduleController struct { + BaseController +} + +var MasterSchedule = new(masterScheduleController) + +// List 列表 +func (c *masterScheduleController) List(ctx context.Context, req *system.MasterScheduleSearchReq) (res *system.MasterScheduleSearchRes, err error) { + res, err = service.MasterSchedule().List(ctx, req) + return +} + +// Get 获取总进度计划 +func (c *masterScheduleController) Get(ctx context.Context, req *system.MasterScheduleGetReq) (res *system.MasterScheduleGetRes, err error) { + res = new(system.MasterScheduleGetRes) + res.MasterScheduleInfoRes, err = service.MasterSchedule().GetById(ctx, req.Id) + return +} + +// Add 添加总进度计划 +func (c *masterScheduleController) Add(ctx context.Context, req *system.MasterScheduleAddReq) (res *system.MasterScheduleAddRes, err error) { + err = service.MasterSchedule().Add(ctx, req) + return +} + +// Edit 修改总进度计划 +func (c *masterScheduleController) Edit(ctx context.Context, req *system.MasterScheduleEditReq) (res *system.MasterScheduleEditRes, err error) { + err = service.MasterSchedule().Edit(ctx, req) + return +} + +// Delete 删除总进度计划 +func (c *masterScheduleController) Delete(ctx context.Context, req *system.MasterScheduleDeleteReq) (res *system.MasterScheduleDeleteRes, err error) { + err = service.MasterSchedule().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/notification_recipients.go b/internal/app/system/controller/notification_recipients.go new file mode 100644 index 0000000..f0bfe3c --- /dev/null +++ b/internal/app/system/controller/notification_recipients.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-04-11 16:58:12 +// 生成路径: internal/app/system/controller/notification_recipients.go +// 生成人:gfast +// desc:通知接收 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type notificationRecipientsController struct { + BaseController +} + +var NotificationRecipients = new(notificationRecipientsController) + +// List 列表 +func (c *notificationRecipientsController) List(ctx context.Context, req *system.NotificationRecipientsSearchReq) (res *system.NotificationRecipientsSearchRes, err error) { + res, err = service.NotificationRecipients().List(ctx, req) + return +} + +// Get 获取通知接收 +func (c *notificationRecipientsController) Get(ctx context.Context, req *system.NotificationRecipientsGetReq) (res *system.NotificationRecipientsGetRes, err error) { + res = new(system.NotificationRecipientsGetRes) + res.NotificationRecipientsInfoRes, err = service.NotificationRecipients().GetById(ctx, req.Id) + return +} + +// Add 添加通知接收 +func (c *notificationRecipientsController) Add(ctx context.Context, req *system.NotificationRecipientsAddReq) (res *system.NotificationRecipientsAddRes, err error) { + err = service.NotificationRecipients().Add(ctx, req) + return +} + +// Edit 修改通知接收 +func (c *notificationRecipientsController) Edit(ctx context.Context, req *system.NotificationRecipientsEditReq) (res *system.NotificationRecipientsEditRes, err error) { + err = service.NotificationRecipients().Edit(ctx, req) + return +} + +// Delete 删除通知接收 +func (c *notificationRecipientsController) Delete(ctx context.Context, req *system.NotificationRecipientsDeleteReq) (res *system.NotificationRecipientsDeleteRes, err error) { + err = service.NotificationRecipients().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/notifications.go b/internal/app/system/controller/notifications.go new file mode 100644 index 0000000..d12ebc7 --- /dev/null +++ b/internal/app/system/controller/notifications.go @@ -0,0 +1,489 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-04-11 16:56:36 +// 生成路径: internal/app/system/controller/notifications.go +// 生成人:gfast +// desc:通知信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "fmt" + "strings" + "time" + + "github.com/gogf/gf/v2/container/gvar" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/jinzhu/copier" + "github.com/samber/lo" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + wxDao "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + "github.com/tiger1103/gfast/v3/library/liberr" + richtext "github.com/tiger1103/gfast/v3/third/richText" +) + +type notificationsController struct { + BaseController +} + +var Notifications = new(notificationsController) + +// List 列表 +func (c *notificationsController) List(ctx context.Context, req *system.NotificationsSearchReq) (res *system.NotificationsSearchRes, err error) { + res, err = service.Notifications().List(ctx, req) + return +} + +// Get 获取通知信息 +func (c *notificationsController) Get(ctx context.Context, req *system.NotificationsGetReq) (res *system.NotificationsGetRes, err error) { + res = new(system.NotificationsGetRes) + res.NotificationsInfoRes, err = service.Notifications().GetById(ctx, req.Id) + return +} + +// Add 添加通知信息 +func (c *notificationsController) Add(ctx context.Context, req *system.NotificationsAddReq) (res *system.NotificationsAddRes, err error) { + err = service.Notifications().Add(ctx, req) + return +} + +// Edit 修改通知信息 +func (c *notificationsController) Edit(ctx context.Context, req *system.NotificationsEditReq) (res *system.NotificationsEditRes, err error) { + err = service.Notifications().Edit(ctx, req) + return +} + +// Delete 删除通知信息 +func (c *notificationsController) Delete(ctx context.Context, req *system.NotificationsDeleteReq) (res *system.NotificationsDeleteRes, err error) { + err = service.Notifications().Delete(ctx, req.Ids) + return +} + +// NotificationsPublishReq 发布通知请求参数 +func (c *notificationsController) Publish(ctx context.Context, req *system.NotificationsPublishReq) (*system.NotificationsPublishRes, error) { + // 获取当前用户的 ID + userID := ct.New().GetUserId(ctx) + err := PublicPublish(ctx, req, userID) + liberr.ErrIsNil(ctx, err) + return &system.NotificationsPublishRes{}, nil +} + +// NotificationsGetUserReq 获取当前用户的通知信息 +func (c *notificationsController) GetNotify(ctx context.Context, req *system.NotificationsGetUserReq) (res *system.NotificationsGetUserRes, err error) { + res = new(system.NotificationsGetUserRes) + + // 获取当前用户的 ID + userID := ct.New().GetUserId(ctx) + + // 当前用户的通知列表 + notification := []model.Notifications{} + err = g.Try(ctx, func(ctx context.Context) { + // 获取当前用户的通知信息 + m := dao.NotificationRecipients.Ctx(ctx).As("nf"). + InnerJoin("notifications as ns", "ns.id = notification_id"). + LeftJoin("sys_user as su", "ns.initiator = su.id"). + Where("nf.recipient_id", userID). + //Where("nf.notification_status", 0). + Where("ns.is_app", req.IsApp). + Where("ns.project_id", req.ProjectId) + + if req.PageNum == 0 { + req.PageNum = 1 + } + + if req.PageSize == 0 { + req.PageSize = 10 + } + + // 获取当前页的数据 + res.Total, err = m.Count() + liberr.ErrIsNil(ctx, err) + + // 更新当前页 + res.CurrentPage = req.PageNum + + err = m.Page(req.PageNum, req.PageSize).Fields("ns.route,ns.notification_text,ns.notification_time,nf.notification_status,nf.id,ns.title,ns.files,su.user_nickname"). + OrderDesc("ns.id"). + Scan(¬ification) + liberr.ErrIsNil(ctx, err) + }) + + // 初始化通知列表 + res.List = make([]system.Notifications, 0, len(notification)) + copier.CopyWithOption(&res.List, ¬ification, copier.Option{ + Converters: []copier.TypeConverter{ + { + SrcType: copier.String, + DstType: []string{}, + Fn: func(src interface{}) (dst interface{}, err error) { + s, ok := src.(string) + if !ok { + return nil, fmt.Errorf("转换失败") + } + if s == "" { + return []string{}, nil + } + return lo.Compact(strings.Split(s, "|")), nil + }, + }, + }, + }) + + return res, nil +} + +// NotificationsReadReq 标记通知为已读 +func (c *notificationsController) Read(ctx context.Context, req *system.NotificationsReadReq) (*system.NotificationsReadRes, error) { + // 获取当前用户的 ID + userID := ct.New().GetUserId(ctx) + + err := g.Try(ctx, func(ctx context.Context) { + // select * + // from notification_recipients nr + // join notifications ns on nr.notification_id = ns.id + // where nr.recipient_id = 1 and ns.project_id = 37 and is_app = 0 and nr.notification_status = 0; + + _, err := dao.NotificationRecipients.Ctx(ctx).As("nr"). + InnerJoin("notifications as ns", "nr.notification_id = ns.id"). + Where("nr.recipient_id", userID). + Where("ns.project_id", req.ProjectId). + Where("ns.is_app", 0). + Where("nr.notification_status", 0). + Data(g.Map{ + dao.NotificationRecipients.Columns().NotificationStatus: 1, + dao.NotificationRecipients.Columns().ReadTime: time.Now().Format("2006-01-02 15:04:05"), + }).Update() + liberr.ErrIsNil(ctx, err) + }) + liberr.ErrIsNil(ctx, err) + + return &system.NotificationsReadRes{}, nil +} + +// 查看通知公告详情 +func (c *notificationsController) Detail(ctx context.Context, req *system.NotificationsDetailReq) (*system.NotificationsDetailRes, error) { + // 获取当前用户的 ID + currentUserID := ct.New().GetUserId(ctx) + + // 初始化 NotificationsDetail + notificationDetails := system.NotificationsDetail{} + + // 获取通知详情 + notificationInfo := model.Notifications{} + err := g.Try(ctx, func(ctx context.Context) { + err := dao.NotificationRecipients.Ctx(ctx).As("nf"). + InnerJoin("notifications as ns", "ns.id = nf.notification_id"). + LeftJoin("sys_user as su", "ns.initiator = su.id"). + Where("nf.id", req.Id). + Fields("ns.route,ns.notification_text,ns.notification_time,nf.notification_status,ns.id,ns.title,su.user_nickname"). + Scan(¬ificationInfo) + liberr.ErrIsNil(ctx, err) + + // SELECT * + // FROM notification_files + // WHERE notification_id = ( + // SELECT nr.notification_id + // FROM notification_files AS file + // LEFT JOIN notification_recipients AS nr ON nr.notification_id = file.notification_id + // WHERE nr.id = 775 + // LIMIT 1 + // ); + + // 获取对应的文件 + dao.NotificationFiles.Ctx(ctx).Where("notification_id = ?", + dao.NotificationFiles.Ctx(ctx).As("file"). + LeftJoin("notification_recipients AS nr", "nr.notification_id = file.notification_id"). + Where("nr.id", req.Id).Fields("nr.notification_id").Limit(1)). + Fields("file_name, file_path, file_type, file_size").Scan(¬ificationInfo.Files) + + // 更新通知状态为已读 + _, err = dao.NotificationRecipients.Ctx(ctx). + Where(dao.NotificationRecipients.Columns().RecipientId, currentUserID). + Where(dao.NotificationRecipients.Columns().Id, req.Id). + Where(dao.NotificationRecipients.Columns().NotificationStatus, 0). + Data(g.Map{ + dao.NotificationRecipients.Columns().NotificationStatus: 1, + dao.NotificationRecipients.Columns().ReadTime: time.Now().Format("2006-01-02 15:04:05"), + }). + Update() + liberr.ErrIsNil(ctx, err) + + key := "notification:" + notificationInfo.Id + exist, _ := g.Redis().Exists(ctx, key) + if exist == 0 { + g.Redis().Set(ctx, key, 1) + } else { + g.Redis().IncrBy(ctx, key, 1) + } + }) + liberr.ErrIsNil(ctx, err) + + copier.Copy(¬ificationDetails, ¬ificationInfo) + + return &system.NotificationsDetailRes{ + List: notificationDetails, + }, nil +} + +// NotificationsGetPeople 获取通知公告的未读人员或已读人员 +func (c *notificationsController) GetPeople(ctx context.Context, req *system.NotificationsGetPeopleReq) (*system.NotificationsGetPeopleRes, error) { + // 初始化 NotificationsGetPeopleRes + notificationGetPeople := system.NotificationsGetPeopleRes{} + + err := g.Try(ctx, func(ctx context.Context) { + var err error + + // 根据通知ID获取通知详情 + m := dao.NotificationRecipients.Ctx(ctx).As("nr"). + Where("nr.notification_id = ?", dao.NotificationRecipients.Ctx(ctx). + Where(dao.NotificationRecipients.Columns().Id, req.Id). + Fields(dao.NotificationRecipients.Columns().NotificationId)). + Where("nr.notification_status", req.Status) + + // 分页 + if req.PageNum == 0 { + req.PageNum = 1 + } + + if req.PageSize == 0 { + req.PageSize = 20 + } + + // 更新总数量和当前页 + notificationGetPeople.Total, err = m.Fields("DISTINCT nr.id").Count() + notificationGetPeople.CurrentPage = req.PageNum + + // 用户信息 + notificationInfo := []model.NotificationsGetRes{} + // 获取数据 + err = m.Page(req.PageNum, req.PageSize). + InnerJoin("sys_user as su", "nr.recipient_id = su.id"). + Fields("nr.recipient_id,su.user_nickname,nr.read_time,su.mobile"). + Scan(¬ificationInfo) + liberr.ErrIsNil(ctx, err) + + // 根据用户 ID 去重 + notificationInfo = lo.UniqBy(notificationInfo, func(item model.NotificationsGetRes) int { + return int(item.Id) + }) + + // 获取所有的用户的手机号 + userMobiles := lo.FilterMap(notificationInfo, func(item model.NotificationsGetRes, _ int) (string, bool) { + if item.OrmMobile == "" { // 如果手机号为空则跳过 + return "", false + } + return item.OrmMobile, true + }) + + // 根据手机号在 bus_construction_user 表中获取用户的信息 + userInfoList := make([]entity.BusConstructionUser, 0, len(userMobiles)) + err = dao.BusConstructionUser.Ctx(ctx).WhereIn(dao.BusConstructionUser.Columns().Phone, userMobiles). + Fields("phone,head_icon,pace_photo,user_name").Scan(&userInfoList) + liberr.ErrIsNil(ctx, err) + + // Slice To Map + // Key 为手机号,Value 为用户信息 + userMap := lo.Associate(userInfoList, func(user entity.BusConstructionUser) (string, entity.BusConstructionUser) { + return user.Phone, user + }) + + for i, user := range notificationInfo { + if cUser, ok := userMap[user.OrmMobile]; ok { // 如果小程序中存在与PC端用户相同的手机号 + // 如果在 "PC端" 中没有设置用户名 + if notificationInfo[i].Username == "" { + // 优先使用小程序的真实姓名 + notificationInfo[i].Username = cUser.UserName + + if cUser.UserName == "" { + notificationInfo[i].Username = cUser.NickName // 小程序的昵称作为备选 + } + } + + var facePhoto string + if cUser.PacePhoto != "" { + facePhoto = cUser.PacePhoto // 优先使用实名人脸照 + } else if strings.Contains(cUser.HeadIcon, "data") { + // 如果 Head_icon 是 Base64 编码的图片 + // 则将其转换为图片后保存到本地并更新数据库 + newHeadIcon, err := coryCommon.Base64ToImgFunc(cUser.HeadIcon, "1", coryCommon.Helmet) + if err == nil { + // 更新数据库仅当转换成功时 + _, err = dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().Phone, cUser.Phone).Data(g.Map{ + dao.BusConstructionUser.Columns().HeadIcon: newHeadIcon, + }).Update() + facePhoto = newHeadIcon + } + } else { + facePhoto = cUser.HeadIcon // Head_icon 登陆照片作为备选 + } + + // 设置 FacePhoto + notificationInfo[i].FacePhoto = facePhoto + } + } + copier.Copy(¬ificationGetPeople.List, ¬ificationInfo) + }) + liberr.ErrIsNil(ctx, err) + + return ¬ificationGetPeople, nil +} + +func PublicPublish(ctx context.Context, req *system.NotificationsPublishReq, userID uint64) error { + err := g.Try(ctx, func(ctx context.Context) { + var ( + // 当前时间 + timeNow = time.Now().Format("2006-01-02 15:04:05") + // 岗位名 + positions = strings.Builder{} + ) + + // PC 通知消息 + // 按岗位发布通知 + if len(req.Positions) > 0 { + // 获取岗位下的所有用户 + userIDs, err := dao.SysUserPost.Ctx(ctx).Where("post_id in (?)", req.Positions).Fields(dao.SysUserPost.Columns().UserId).Distinct().Array() + req.Users = lo.Map(userIDs, func(item *gvar.Var, _ int) int { + return item.Int() + }) + + // 获取岗位对应的岗位名称 + postNames, err := dao.SysPost.Ctx(ctx).Where("post_id in (?)", req.Positions).Fields(dao.SysPost.Columns().PostName).Distinct().Array() + // 拼接岗位名 + lo.ForEach(postNames, func(position *gvar.Var, _ int) { + positions.WriteString(position.String()) + positions.WriteString(",") + }) + + liberr.ErrIsNil(ctx, err) + } + + // App 通知 + // 如果 Users 和 Positions 都为空则通知该项目下的所有人 + if len(req.Users) == 0 && len(req.Positions) == 0 { + // 获取项目下的所有用户 + projectUserIDs, err := wxDao.SysUserProjectRelevancy.Ctx(ctx). + Where(wxDao.SysUserProjectRelevancy.Columns().ProjectId, req.ProjectId). + Fields(wxDao.SysUserProjectRelevancy.Columns().UserId).Distinct().Array() + liberr.ErrIsNil(ctx, err) + + constructionUserIDs, err := dao.BusConstructionUser.Ctx(ctx).As("bcs"). + InnerJoin("sys_user as su", "bcs.phone = su.mobile"). + Where("bcs.project_id", req.ProjectId). + Fields("su.id").Distinct().Array() + liberr.ErrIsNil(ctx, err) + + // 将两个用户ID列表合并并去重 + req.Users = lo.Uniq(lo.Map(append(projectUserIDs, constructionUserIDs...), func(item *gvar.Var, _ int) int { + return item.Int() + })) + } + + // 在 Notifications 表中插入本次通知的数据 + notification := do.Notifications{ + Title: req.NotificationTitle, // 通知标题 + NotificationText: req.NotificationText, // 通知正文 + Route: req.Route, // 跳转的路由 + NotificationTime: timeNow, // 通知时间 + Initiator: userID, // 发起人 + ProjectId: req.ProjectId, // 项目ID + Positions: positions.String(), // 岗位名称 + IntroduceId: req.ProjectNewsId, // 关联的 PC 端项目新闻ID + } + + // 如果是来自 App 的发布通知 + if req.IsApp != 0 { + notification.IsApp = req.IsApp // 修改通知类型 + } + + // 如果是来自 App 的项目新闻 + // 需要同步一份给 PC 端 + if req.IsApp <= 2 && req.IsApp >= 1 { + // 同步的项目新闻 + notificationText := req.NotificationText + + // 如果 req.file 不为空,则将其包装为富文本标签 + if len(req.Files) > 0 { + images := lo.Map(req.Files, func(file *comModel.UpFile, _ int) string { + return file.Url + }) + + // 将图片链接转换为富文本标签后附加到通知正文中 + notificationText += richtext.ConvertImageURLsToRichText(images) + } + + // 为后台插入一份项目新闻 + introduceID, err := dao.SysProjectIntroduce.Ctx(ctx).Data(entity.SysProjectIntroduce{ + ProjectId: int64(req.ProjectId), + Headline: req.NotificationTitle, + RichText: notificationText, + CreatedBy: gconv.String(userID), + }).InsertAndGetId() + liberr.ErrIsNil(ctx, err) + + // App 关联的项目新闻ID并移除富文本 + notification.IntroduceId = introduceID + notification.NotificationText = richtext.RemoveRichText(req.NotificationText) + } + + // 插入数据库后返回其`主键ID` + lastInsertID, err := dao.Notifications.Ctx(ctx).InsertAndGetId(notification) + liberr.ErrIsNil(ctx, err) + + // 如果不存在接收人则返回错误 + if len(req.Users) == 0 { + liberr.ErrIsNil(ctx, fmt.Errorf("接收人不能为空")) + } + + // 如果是 App 通知包含附件的的情况下 + if len(req.Files) > 0 { + if err := saveNotificationFiles(ctx, lastInsertID, req.Files); err != nil { + liberr.ErrIsNil(ctx, err) + } + } + + // 在 notification_recipients 表中为每个接收者插入一条数据 + var notificationsList []do.NotificationRecipients + lo.ForEach(req.Users, func(item int, _ int) { + notificationsList = append(notificationsList, do.NotificationRecipients{ + NotificationId: lastInsertID, // 通知ID + RecipientId: item, // 接收者ID + NotificationStatus: 0, // 0 未读 + IntroduceId: req.ProjectNewsId, // 关联的PC 端项目新闻ID + }) + }) + + // 批量插入 + _, err = dao.NotificationRecipients.Ctx(ctx).Insert(notificationsList) + liberr.ErrIsNil(ctx, err) + }) + return err +} + +// saveNotificationFiles 将上传的文件的信息保存到数据库 +func saveNotificationFiles(ctx context.Context, notificationID int64, files []*comModel.UpFile) error { + notificationFileList := make([]do.NotificationFiles, 0, len(files)) + for i := 0; i < len(files); i++ { + notificationFileList = append(notificationFileList, do.NotificationFiles{ + NotificationId: notificationID, + FileName: files[i].Name, + FilePath: files[i].Url, + FileType: files[i].FileType, + FileSize: files[i].Size, + }) + } + + _, err := dao.NotificationFiles.Ctx(ctx).Insert(notificationFileList) + return err +} diff --git a/internal/app/system/controller/personal.go b/internal/app/system/controller/personal.go new file mode 100644 index 0000000..b09a95f --- /dev/null +++ b/internal/app/system/controller/personal.go @@ -0,0 +1,50 @@ +/* +* @desc:xxxx功能描述 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/11/3 10:32 + */ + +package controller + +import ( + "context" + "github.com/gogf/gf/v2/crypto/gmd5" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/libUtils" +) + +var Personal = new(personalController) + +type personalController struct { +} + +func (c *personalController) GetPersonal(ctx context.Context, req *system.PersonalInfoReq) (res *system.PersonalInfoRes, err error) { + res, err = service.Personal().GetPersonalInfo(ctx, req) + return +} + +func (c *personalController) EditPersonal(ctx context.Context, req *system.PersonalEditReq) (res *system.PersonalEditRes, err error) { + ip := libUtils.GetClientIp(ctx) + userAgent := libUtils.GetUserAgent(ctx) + res = new(system.PersonalEditRes) + res.UserInfo, err = service.Personal().EditPersonal(ctx, req) + if err != nil { + return + } + key := gconv.String(res.UserInfo.Id) + "-" + gmd5.MustEncryptString(res.UserInfo.UserName) + gmd5.MustEncryptString(res.UserInfo.UserPassword) + if g.Cfg().MustGet(ctx, "gfToken.multiLogin").Bool() { + key = gconv.String(res.UserInfo.Id) + "-" + gmd5.MustEncryptString(res.UserInfo.UserName) + gmd5.MustEncryptString(res.UserInfo.UserPassword+ip+userAgent) + } + res.UserInfo.UserPassword = "" + res.Token, err = service.GfToken().GenerateToken(ctx, key, res.UserInfo) + return +} + +func (c *personalController) ResetPwdPersonal(ctx context.Context, req *system.PersonalResetPwdReq) (res *system.PersonalResetPwdRes, err error) { + res, err = service.Personal().ResetPwdPersonal(ctx, req) + return +} diff --git a/internal/app/system/controller/plan_daily.go b/internal/app/system/controller/plan_daily.go new file mode 100644 index 0000000..9e7c32d --- /dev/null +++ b/internal/app/system/controller/plan_daily.go @@ -0,0 +1,117 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-09-26 14:31:07 +// 生成路径: internal/app/system/controller/plan_daily.go +// 生成人:gfast +// desc:日报 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gctx" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "math/rand" + "strconv" + "strings" + "time" +) + +type planDailyController struct { + BaseController +} + +var PlanDaily = new(planDailyController) + +// List 列表 +func (c *planDailyController) List(ctx context.Context, req *system.PlanDailySearchReq) (res *system.PlanDailySearchRes, err error) { + res, err = service.PlanDaily().List(ctx, req) + return +} + +// Get 获取日报 +func (c *planDailyController) Get(ctx context.Context, req *system.PlanDailyGetReq) (res *system.PlanDailyGetRes, err error) { + res = new(system.PlanDailyGetRes) + res.PlanDailyInfoRes, err = service.PlanDaily().GetById(ctx, req.Id) + return +} + +// Add 添加日报 +func (c *planDailyController) Add(ctx context.Context, req *system.PlanDailyAddReq) (res *system.PlanDailyAddRes, err error) { + err = service.PlanDaily().Add(ctx, req) + return +} + +// Edit 修改日报 +func (c *planDailyController) Edit(ctx context.Context, req *system.PlanDailyEditReq) (res *system.PlanDailyEditRes, err error) { + err = service.PlanDaily().Edit(ctx, req) + return +} + +// Delete 删除日报 +func (c *planDailyController) Delete(ctx context.Context, req *system.PlanDailyDeleteReq) (res *system.PlanDailyDeleteRes, err error) { + err = service.PlanDaily().Delete(ctx, req.Ids) + return +} + +var mp = make(map[string]string) + +type DayEntity struct { + ProjectId string `json:"project_id"` + SourceId string `json:"source_id"` + Name string `json:"name"` + Table string `json:"table"` + //PlanName string `json:"plan_name"` + //PlanId string `json:"plan_id"` + //WeekRealityId string `json:"week_reality_id"` + SourceType string `json:"source_type"` + Cnt int `json:"cnt"` + DataTime string `json:"data_time"` +} + +// 模拟日报-自动生成数据 +func myTask(ctx context.Context) { + //1、随机哪几张表 + mp["1"] = "qianqi_xiangbian" + mp["2"] = "qianqi_nibianqi" + mp["3"] = "qianqi_guangfuban_ids_zhuangdian" + mp["4"] = "qianqi_guangfuban_ids_zhijia" + mp["5"] = "qianqi_guangfuban_ids_lizhu" + mp["6"] = "qianqi_guangfuban_ids" + //2、创建随机种子 + rand.Seed(time.Now().Unix()) + intn := rand.Intn(6) + 1 + intnTwo := rand.Intn(6) + 1 + //3、随机挑选一个表查询,随机获取数据 + table := mp[strconv.Itoa(intn)] + array, _ := g.DB().Model(table).Ctx(ctx).OrderRandom().Limit(intnTwo).All() + var oneEntity []*DayEntity + for _, data := range array { + var twoEntity = new(DayEntity) + data.Struct(twoEntity) + twoEntity.Table = table + twoEntity.SourceType = strings.ReplaceAll(table, "qianqi_", "") + twoEntity.Cnt = intnTwo + twoEntity.DataTime = time.Unix(1621741532, 0).Format("2006-01-02") + oneEntity = append(oneEntity, twoEntity) + } + g.DB().Model("plan_daily").Ctx(ctx).Insert(oneEntity) + +} + +func init() { + ctx := gctx.New() + ticker := time.NewTicker(6 * time.Hour) + go func() { + for { + select { + case <-ticker.C: + myTask(ctx) + } + } + }() +} diff --git a/internal/app/system/controller/plan_week.go b/internal/app/system/controller/plan_week.go new file mode 100644 index 0000000..bcd0335 --- /dev/null +++ b/internal/app/system/controller/plan_week.go @@ -0,0 +1,73 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-04 17:26:59 +// 生成路径: internal/app/system/controller/plan_week.go +// 生成人:gfast +// desc:周计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type planWeekController struct { + BaseController +} + +var PlanWeek = new(planWeekController) + +// List 列表 +func (c *planWeekController) List(ctx context.Context, req *system.PlanWeekSearchReq) (res *system.PlanWeekSearchRes, err error) { + res, err = service.PlanWeek().List(ctx, req) + return +} + +func (c *planWeekController) PlanWeekGetInfoByPlanID(ctx context.Context, req *system.PlanWeekGetInfoByPlanIDReq) (res *system.PlanWeekGetInfoByPlanIDRes, err error) { + res, err = service.PlanWeek().PlanWeekGetInfoByPlanID(ctx, req) + return +} + +// Get 获取周计划 +func (c *planWeekController) Get(ctx context.Context, req *system.PlanWeekGetReq) (res *system.PlanWeekGetRes, err error) { + res = new(system.PlanWeekGetRes) + res.PlanWeekInfoRes, err = service.PlanWeek().GetById(ctx, req.Id) + return +} + +// Add 添加周计划 +func (c *planWeekController) Add(ctx context.Context, req *system.PlanWeekAddReq) (res *system.PlanWeekAddRes, err error) { + err = service.PlanWeek().Add(ctx, req) + return +} + +// Edit 修改周计划 +func (c *planWeekController) Edit(ctx context.Context, req *system.PlanWeekEditReq) (res *system.PlanWeekEditRes, err error) { + err = service.PlanWeek().Edit(ctx, req) + return +} + +// Delete 删除周计划 +func (c *planWeekController) Delete(ctx context.Context, req *system.PlanWeekDeleteReq) (res *system.PlanWeekDeleteRes, err error) { + err = service.PlanWeek().Delete(ctx, req.PlanID) + return +} + +// WeekAndWeekRealityListFunc 根据条件获取到计划于实际的数据 +func (c *planWeekController) WeekAndWeekRealityListFunc(ctx context.Context, req *system.WeekAndWeekRealityListReq) (res *system.WeekAndWeekRealityListRes, err error) { + res = new(system.WeekAndWeekRealityListRes) + res, err = service.PlanWeek().WeekAndWeekRealityListFunc(ctx, req) + return +} + +// WeeklyAndMonthlyReportDataGenerationFunc 周报/月报数据生成(周报生成word,月报生成压缩包文件夹) +func (c *planWeekController) WeeklyAndMonthlyReportDataGenerationFunc(ctx context.Context, req *system.WeeklyAndMonthlyReportDataGenerationReq) (res *system.WeeklyAndMonthlyReportDataGenerationRes, err error) { + //1、查询数据 + res = new(system.WeeklyAndMonthlyReportDataGenerationRes) + res, err = service.PlanWeek().WeeklyAndMonthlyReportDataGenerationFunc(ctx, req) + return +} diff --git a/internal/app/system/controller/plan_week_reality.go b/internal/app/system/controller/plan_week_reality.go new file mode 100644 index 0000000..20340d3 --- /dev/null +++ b/internal/app/system/controller/plan_week_reality.go @@ -0,0 +1,57 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-17 17:23:07 +// 生成路径: internal/app/system/controller/plan_week_reality.go +// 生成人:xyb +// desc:实际完成的周计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type planWeekRealityController struct { + BaseController +} + +var PlanWeekReality = new(planWeekRealityController) + +// List 列表 +func (c *planWeekRealityController) List(ctx context.Context, req *system.PlanWeekRealitySearchReq) (res *system.PlanWeekRealitySearchRes, err error) { + res, err = service.PlanWeekReality().List(ctx, req) + return +} +func (c *planWeekRealityController) Compare(ctx context.Context, req *system.PlanWeekRealityCompareReq) (res *system.PlanWeekRealityCompareRes, err error) { + res, err = service.PlanWeekReality().PlanWeekRealityCompare(ctx, req) + return +} + +// Get 获取实际完成的周计划 +func (c *planWeekRealityController) Get(ctx context.Context, req *system.PlanWeekRealityGetReq) (res *system.PlanWeekRealityGetRes, err error) { + res = new(system.PlanWeekRealityGetRes) + res.PlanWeekRealityInfoRes, err = service.PlanWeekReality().GetById(ctx, req.Id) + return +} + +// Add 添加实际完成的周计划 +func (c *planWeekRealityController) Add(ctx context.Context, req *system.PlanWeekRealityAddReq) (res *system.PlanWeekRealityAddRes, err error) { + err = service.PlanWeekReality().Add(ctx, req) + return +} + +// Edit 修改实际完成的周计划 +func (c *planWeekRealityController) Edit(ctx context.Context, req *system.PlanWeekRealityEditReq) (res *system.PlanWeekRealityEditRes, err error) { + err = service.PlanWeekReality().Edit(ctx, req) + return +} + +// Delete 删除实际完成的周计划 +func (c *planWeekRealityController) Delete(ctx context.Context, req *system.PlanWeekRealityDeleteReq) (res *system.PlanWeekRealityDeleteRes, err error) { + err = service.PlanWeekReality().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/plant.go b/internal/app/system/controller/plant.go new file mode 100644 index 0000000..79041bd --- /dev/null +++ b/internal/app/system/controller/plant.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-04-12 10:38:43 +// 生成路径: internal/app/system/controller/plant.go +// 生成人:gfast +// desc:电站信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type plantController struct { + BaseController +} + +var Plant = new(plantController) + +// List 列表 +func (c *plantController) List(ctx context.Context, req *system.PlantSearchReq) (res *system.PlantSearchRes, err error) { + res, err = service.Plant().List(ctx, req) + return +} + +// Get 获取电站信息 +func (c *plantController) Get(ctx context.Context, req *system.PlantGetReq) (res *system.PlantGetRes, err error) { + res = new(system.PlantGetRes) + res.PlantInfoRes, err = service.Plant().GetById(ctx, req.Id) + return +} + +// Add 添加电站信息 +func (c *plantController) Add(ctx context.Context, req *system.PlantAddReq) (res *system.PlantAddRes, err error) { + err = service.Plant().Add(ctx, req) + return +} + +// Edit 修改电站信息 +func (c *plantController) Edit(ctx context.Context, req *system.PlantEditReq) (res *system.PlantEditRes, err error) { + err = service.Plant().Edit(ctx, req) + return +} + +// Delete 删除电站信息 +func (c *plantController) Delete(ctx context.Context, req *system.PlantDeleteReq) (res *system.PlantDeleteRes, err error) { + err = service.Plant().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/project_finance.go b/internal/app/system/controller/project_finance.go new file mode 100644 index 0000000..216d5ed --- /dev/null +++ b/internal/app/system/controller/project_finance.go @@ -0,0 +1,65 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-04-29 12:01:01 +// 生成路径: internal/app/system/controller/project_finance.go +// 生成人:gfast +// desc:项目财务 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type projectFinanceController struct { + BaseController +} + +var ProjectFinance = new(projectFinanceController) + +// List 列表 +func (c *projectFinanceController) List(ctx context.Context, req *system.ProjectFinanceSearchReq) (res *system.ProjectFinanceSearchRes, err error) { + res, err = service.ProjectFinance().List(ctx, req) + return +} + +// Get 获取项目财务 +func (c *projectFinanceController) Get(ctx context.Context, req *system.ProjectFinanceGetReq) (res *system.ProjectFinanceGetRes, err error) { + res = new(system.ProjectFinanceGetRes) + if req.Id != 0 { + res.ProjectFinanceInfoResVo, err = service.ProjectFinance().GetById(ctx, req.Id) + return + } else if req.ProjectId != 0 { + res.ProjectFinanceInfoResVo, err = service.ProjectFinance().GetByProjectId(ctx, req.ProjectId) + return + } + return +} + +// Add 添加项目财务 +func (c *projectFinanceController) Add(ctx context.Context, req *system.ProjectFinanceAddReq) (res *system.ProjectFinanceAddRes, err error) { + err = service.ProjectFinance().Add(ctx, req) + return +} + +// Edit 修改项目财务 +func (c *projectFinanceController) Edit(ctx context.Context, req *system.ProjectFinanceEditReq) (res *system.ProjectFinanceEditRes, err error) { + err = service.ProjectFinance().Edit(ctx, req) + return +} + +// Delete 删除项目财务 +func (c *projectFinanceController) Delete(ctx context.Context, req *system.ProjectFinanceDeleteReq) (res *system.ProjectFinanceDeleteRes, err error) { + err = service.ProjectFinance().Delete(ctx, req.Ids) + return +} + +// 文件Excel上传 +func (c *projectFinanceController) UploadExcel(ctx context.Context, req *system.UploadExcelReq) (res *system.UploadExcelRes, err error) { + res, err = service.ProjectFinance().UploadExcel(ctx, req.ProjectId) + return +} diff --git a/internal/app/system/controller/project_schedule.go b/internal/app/system/controller/project_schedule.go new file mode 100644 index 0000000..e80a2af --- /dev/null +++ b/internal/app/system/controller/project_schedule.go @@ -0,0 +1,121 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-03-13 18:17:32 +// 生成路径: internal/app/system/controller/project_schedule.go +// 生成人:gfast +// desc:项目排期 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +type projectScheduleController struct { + BaseController +} + +var ProjectSchedule = new(projectScheduleController) + +// List 列表 +func (c *projectScheduleController) List(ctx context.Context, req *system.ProjectScheduleSearchReq) (res *system.ProjectScheduleSearchRes, err error) { + res, err = service.ProjectSchedule().List(ctx, req) + return +} + +// Get 获取项目排期 +func (c *projectScheduleController) Get(ctx context.Context, req *system.ProjectScheduleGetReq) (res *system.ProjectScheduleGetRes, err error) { + res = new(system.ProjectScheduleGetRes) + res.ProjectScheduleInfoRes, err = service.ProjectSchedule().GetById(ctx, req.Id) + return +} + +// Add 添加项目排期 +func (c *projectScheduleController) Add(ctx context.Context, req *system.ProjectScheduleAddReq) (res *system.ProjectScheduleAddRes, err error) { + err = service.ProjectSchedule().Add(ctx, req) + return +} + +// Edit 修改项目排期 +func (c *projectScheduleController) Edit(ctx context.Context, req *system.ProjectScheduleEditReq) (res *system.ProjectScheduleEditRes, err error) { + err = service.ProjectSchedule().Edit(ctx, req) + return +} + +// Delete 删除项目排期 +func (c *projectScheduleController) Delete(ctx context.Context, req *system.ProjectScheduleDeleteReq) (res *system.ProjectScheduleDeleteRes, err error) { + err = service.ProjectSchedule().Delete(ctx, req.Ids) + return +} + +// 添加一个计划 +func (s *projectScheduleController) AddSchedule(ctx context.Context, req *system.ProjectScheduleAddPlanReq) (res *system.ProjectScheduleAddPlanRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + if req.Types == 1 { + // 如果添加计划时,发现父级的 type ==0 的数据不存在,则将其父项目的开始时间修改为,第一个子任务的开始时间 + // 查询父级的 type == 0 的数据 + parentData, err := dao.ProjectSchedule.Ctx(ctx).Where(dao.ProjectSchedule.Columns().ParentId, req.ConstructionId).Where(dao.ProjectSchedule.Columns().Types, 0).One() + liberr.ErrIsNil(ctx, err, "查询失败") + if parentData == nil { + // 如果父级的 type == 0 的数据不存在,则添加一条 parent_id = req.ConstructionId, types = 0 的数据 + _, err = dao.ProjectSchedule.Ctx(ctx).Insert(do.ProjectSchedule{ + ParentId: req.ConstructionId, + StartDate: req.StartDate, + EndDate: req.EndDate, + Name: req.Name, + PlaneNum: req.PlaneNum, + Types: 0, + }) + liberr.ErrIsNil(ctx, err, "更新失败") + } + + // 插入一条 type = 1 的数据 + _, err = dao.ProjectSchedule.Ctx(ctx).Insert(do.ProjectSchedule{ + ParentId: req.ConstructionId, + StartDate: req.StartDate, + EndDate: req.EndDate, + Name: req.Name, + PlaneNum: req.PlaneNum, + Types: 1, + }) + liberr.ErrIsNil(ctx, err, "更新失败") + return + } + // 如果数据不存在,则添加 + count, err := dao.ProjectSchedule.Ctx(ctx).Where(dao.ProjectSchedule.Columns().ParentId, req.ConstructionId).Count() + liberr.ErrIsNil(ctx, err, "查询失败") + if count == 0 { + _, err = dao.ProjectSchedule.Ctx(ctx).Insert(do.ProjectSchedule{ + ParentId: req.ConstructionId, + StartDate: req.StartDate, + EndDate: req.EndDate, + Name: req.Name, + PlaneNum: req.PlaneNum, + Types: req.Types, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + } else { + // 如果数据存在,则更新 + _, err = dao.ProjectSchedule.Ctx(ctx).Where(dao.ProjectSchedule.Columns().ParentId, req.ConstructionId).Update(do.ProjectSchedule{ + ParentId: req.ConstructionId, + StartDate: req.StartDate, + EndDate: req.EndDate, + Name: req.Name, + PlaneNum: req.PlaneNum, + Types: req.Types, + }) + liberr.ErrIsNil(ctx, err, "更新失败") + } + }) + + return +} diff --git a/internal/app/system/controller/pv_ module.go b/internal/app/system/controller/pv_ module.go new file mode 100644 index 0000000..883f04b --- /dev/null +++ b/internal/app/system/controller/pv_ module.go @@ -0,0 +1,224 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-03-23 10:25:39 +// 生成路径: internal/app/system/controller/pv_ module.go +// 生成人:gfast +// desc:光伏组件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "path/filepath" + "strings" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/common/shp" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/xuri/excelize/v2" +) + +type pvModuleController struct { + BaseController +} + +var PvModule = new(pvModuleController) + +// List 列表 +func (c *pvModuleController) List(ctx context.Context, req *system.PvModuleSearchReq) (res *system.PvModuleSearchRes, err error) { + res, err = service.PvModule().List(ctx, req) + return +} + +// Get 获取光伏组件 +func (c *pvModuleController) Get(ctx context.Context, req *system.PvModuleGetReq) (res *system.PvModuleGetRes, err error) { + res = new(system.PvModuleGetRes) + res.PvModuleInfoRes, err = service.PvModule().GetById(ctx, req.Id) + return +} + +// Add 添加光伏组件 +func (c *pvModuleController) Add(ctx context.Context, req *system.PvModuleAddReq) (res *system.PvModuleAddRes, err error) { + err = service.PvModule().Add(ctx, req) + return +} + +// Edit 修改光伏组件 +func (c *pvModuleController) Edit(ctx context.Context, req *system.PvModuleEditReq) (res *system.PvModuleEditRes, err error) { + err = service.PvModule().Edit(ctx, req) + return +} + +// Delete 删除光伏组件 +func (c *pvModuleController) Delete(ctx context.Context, req *system.PvModuleDeleteReq) (res *system.PvModuleDeleteRes, err error) { + err = service.PvModule().Delete(ctx, req.Ids) + return +} + +// Import 导入 +func (c *pvModuleController) Import(ctx context.Context, req *system.PvModuleImportReq) (res *system.PvModuleImportRes, err error) { + err = service.PvModule().Import(ctx, req) + return +} + +// 导入逆变器 +func (c *pvModuleController) ImportInverter(ctx context.Context, req *system.PvModuleImportInverterReq) (res *system.PvModuleImportRes, err error) { + err = service.PvModule().ImportInverter(ctx, req) + return +} + +// 导入光伏板 +func (c *pvModuleController) ImportPvBoard(ctx context.Context, req *system.PvModuleImportPvBoardReq) (res *system.PvModuleImportRes, err error) { + err = service.PvModule().ImportPvBoard(ctx, req) + return +} + +func (c *pvModuleController) AddWorkSchedule(ctx context.Context, req *system.PvModuleAddDailyReq) (res *system.PvModuleAddDailyRes, err error) { + err = service.PvModule().AddWorkSchedule(ctx, req) + return +} + +// 获取日报 +func (c *pvModuleController) GetWorkSchedule(ctx context.Context, req *system.PvModuleGetDailyReq) (res *system.PvModuleGetDailyRes, err error) { + return service.PvModule().GetDaily(ctx, req) +} + +// 删除日报 +func (c *pvModuleController) DeleteWorkSchedule(ctx context.Context, req *system.PvModuleDeleteDailyReq) (res *system.PvModuleDeleteDailyRes, err error) { + err = service.PvModule().DeleteDaily(ctx, req) + return +} + +type Zhuangdian struct { + Position shp.Point `json:"position"` +} + +func ProcessFiles(ctx context.Context, files []*ghttp.UploadFile) (*shp.ShpObj, error) { + var filePaths string + + // 遍历请求中的所有文件 + for _, file := range files { + // 保存文件后返回其路径 + uploadedFilePath, err := coryCommon.UploadFile(ctx, file, coryCommon.LargeFileShp) + if err != nil { + return nil, err + } + + // 将文件路径按"."分割成切片 + filePathParts := strings.Split(uploadedFilePath, ".") + // 如果切片长度大于1,将最后一个元素(文件扩展名)改为"shp" + if len(filePathParts) > 1 { + filePathParts[len(filePathParts)-1] = "shp" + } + // 将修改后的切片重新组合成文件路径,并将其添加到文件路径中 + updatedFilePath := strings.Join(filePathParts, ".") + filePaths = updatedFilePath + } + + err, shp := shp.ReadShp(filePaths) + if err != nil { + return nil, err + } + + return shp, nil +} + +// 上传 excel 为指定项目添加数据 +func (c *pvModuleController) AddExcel(ctx context.Context, req *system.PvModuleAddExcelReq) (res *system.PvModuleAddExcelRes, err error) { + filePath, err := coryCommon.UploadFile(ctx, req.File, coryCommon.Temporary+"/") + if err != nil { + return nil, err + } + + filePath = coryCommon.ResourcePublicToFunc(filepath.ToSlash(filePath), 2) + f, err := excelize.OpenFile(filePath) + if err != nil { + return nil, err + } + + defer func(f *excelize.File) { + f.Close() + }(f) + + type group struct { + Name string + MatrixNumber string + NominalTiltAngle string + } + + rows, err := f.GetRows("方阵统计分析") + if err != nil { + return nil, err + } + + groups := map[string][]group{} + + for _, row := range rows[1:] { + // 方阵编号 + matrixName := row[0] + // 标称倾角 + nominalTiltAngle := row[2] + // 标称方位角 + nominalAzimuthAngle := row[3] + + if len(strings.Split(matrixName, ".")) != 3 { + continue + } + + transName := strings.ReplaceAll(strings.Split(matrixName, ".")[0], "G", "T") + + groups[transName] = append(groups[transName], group{ + Name: matrixName, + MatrixNumber: nominalTiltAngle, + NominalTiltAngle: nominalAzimuthAngle, + }) + } + + // 根据子项目获取其所拥有的方阵 + fangzhenList := []entity.QianqiFangzhen{} + if err := dao.QianqiFangzhen.Ctx(ctx). + Where(dao.QianqiFangzhen.Columns().ProjectId, req.SubProjectID). + Scan(&fangzhenList); err != nil { + return nil, err + } + + // TODO: 统一更新具有相同标称倾角和标称方位角的名字 + for i := 0; i < len(fangzhenList); i++ { + v := fangzhenList[i] + // 遍历方阵 + for _, k := range groups[v.Name] { + dao.PvModule.Ctx(ctx).Where(dao.PvModule.Columns().SubProjectid, v.ProjectId). + Where(dao.PvModule.Columns().Name, k.Name). + Data( + g.Map{ + dao.PvModule.Columns().Tilt: k.MatrixNumber, + dao.PvModule.Columns().Azimuth: k.NominalTiltAngle, + }, + ).Update() + } + } + + return &system.PvModuleAddExcelRes{}, nil +} + +// 为逆变器绑定设备ID +func (c *pvModuleController) BindInverterDeviceID(ctx context.Context, req *system.PvModuleBindDeviceIDReq) (*system.PvModuleBindDeviceIDRes, error) { + err := g.Try(ctx, func(ctx context.Context) { + _, err := dao.PvModule.Ctx(ctx).Where(dao.PvModule.Columns().Id, req.ID). + Data(g.Map{ + dao.PvModule.Columns().DeviceId: req.DeviceID, + }).Update() + liberr.ErrIsNil(ctx, err, "添加失败") + }) + liberr.ErrIsNil(ctx, err, "添加失败") + + return &system.PvModuleBindDeviceIDRes{}, nil +} diff --git a/internal/app/system/controller/qianqi_bubantu.go b/internal/app/system/controller/qianqi_bubantu.go new file mode 100644 index 0000000..b2a815c --- /dev/null +++ b/internal/app/system/controller/qianqi_bubantu.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-07-31 11:44:41 +// 生成路径: internal/app/system/controller/qianqi_bubantu.go +// 生成人:gfast +// desc:布板图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type qianqiBubantuController struct { + BaseController +} + +var QianqiBubantu = new(qianqiBubantuController) + +// List 列表 +func (c *qianqiBubantuController) List(ctx context.Context, req *system.QianqiBubantuSearchReq) (res *system.QianqiBubantuSearchRes, err error) { + res, err = service.QianqiBubantu().List(ctx, req) + return +} + +// Get 获取布板图 +func (c *qianqiBubantuController) Get(ctx context.Context, req *system.QianqiBubantuGetReq) (res *system.QianqiBubantuGetRes, err error) { + res = new(system.QianqiBubantuGetRes) + res.QianqiBubantuInfoRes, err = service.QianqiBubantu().GetById(ctx, req.Id) + return +} + +// Add 添加布板图 +func (c *qianqiBubantuController) Add(ctx context.Context, req *system.QianqiBubantuAddReq) (res *system.QianqiBubantuAddRes, err error) { + err = service.QianqiBubantu().Add(ctx, req) + return +} + +// Edit 修改布板图 +func (c *qianqiBubantuController) Edit(ctx context.Context, req *system.QianqiBubantuEditReq) (res *system.QianqiBubantuEditRes, err error) { + err = service.QianqiBubantu().Edit(ctx, req) + return +} + +// Delete 删除布板图 +func (c *qianqiBubantuController) Delete(ctx context.Context, req *system.QianqiBubantuDeleteReq) (res *system.QianqiBubantuDeleteRes, err error) { + err = service.QianqiBubantu().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/qianqi_camera.go b/internal/app/system/controller/qianqi_camera.go new file mode 100644 index 0000000..b7de012 --- /dev/null +++ b/internal/app/system/controller/qianqi_camera.go @@ -0,0 +1,65 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-09-30 22:37:34 +// 生成路径: internal/app/system/controller/qianqi_camera.go +// 生成人:gfast +// desc:摄像头 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type qianqiCameraController struct { + BaseController +} + +var QianqiCamera = new(qianqiCameraController) + +// List 列表 +func (c *qianqiCameraController) List(ctx context.Context, req *system.QianqiCameraSearchReq) (res *system.QianqiCameraSearchRes, err error) { + res, err = service.QianqiCamera().List(ctx, req) + return +} + +// Get 获取摄像头 +func (c *qianqiCameraController) Get(ctx context.Context, req *system.QianqiCameraGetReq) (res *system.QianqiCameraGetRes, err error) { + res = new(system.QianqiCameraGetRes) + res.QianqiCameraInfoRes, err = service.QianqiCamera().GetById(ctx, req.Id) + return +} + +// Add 添加摄像头 +func (c *qianqiCameraController) Add(ctx context.Context, req *system.QianqiCameraAddReq) (res *system.QianqiCameraAddRes, err error) { + err = service.QianqiCamera().Add(ctx, req) + return +} + +// EditCameraFunc 修改摄像头信息 +func (c *qianqiCameraController) EditCameraFunc(ctx context.Context, req *system.EditCameraReq) (res *system.EditCameraRes, err error) { + err = service.QianqiCamera().EditCameraFunc(ctx, req) + return +} + +// Edit 视频融合 +func (c *qianqiCameraController) Edit(ctx context.Context, req *system.QianqiCameraEditReq) (res *system.QianqiCameraEditRes, err error) { + err = service.QianqiCamera().Edit(ctx, req) + return +} + +// EditNameAndDetail 摄像头修改名称和坐标详情数据 +func (c *qianqiCameraController) EditNameAndDetail(ctx context.Context, req *system.QianqiCameraEditNameAndDetailReq) (res *system.QianqiCameraEditNameAndDetailRes, err error) { + err = service.QianqiCamera().EditNameAndDetail(ctx, req) + return +} + +// Delete 删除摄像头 +func (c *qianqiCameraController) Delete(ctx context.Context, req *system.QianqiCameraDeleteReq) (res *system.QianqiCameraDeleteRes, err error) { + err = service.QianqiCamera().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/qianqi_dixing.go b/internal/app/system/controller/qianqi_dixing.go new file mode 100644 index 0000000..8e2126e --- /dev/null +++ b/internal/app/system/controller/qianqi_dixing.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-07-31 11:44:56 +// 生成路径: internal/app/system/controller/qianqi_dixing.go +// 生成人:gfast +// desc:地形 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type qianqiDixingController struct { + BaseController +} + +var QianqiDixing = new(qianqiDixingController) + +// List 列表 +func (c *qianqiDixingController) List(ctx context.Context, req *system.QianqiDixingSearchReq) (res *system.QianqiDixingSearchRes, err error) { + res, err = service.QianqiDixing().List(ctx, req) + return +} + +// Get 获取地形 +func (c *qianqiDixingController) Get(ctx context.Context, req *system.QianqiDixingGetReq) (res *system.QianqiDixingGetRes, err error) { + res = new(system.QianqiDixingGetRes) + res.QianqiDixingInfoRes, err = service.QianqiDixing().GetById(ctx, req.Id) + return +} + +// Add 添加地形 +func (c *qianqiDixingController) Add(ctx context.Context, req *system.QianqiDixingAddReq) (res *system.QianqiDixingAddRes, err error) { + err = service.QianqiDixing().Add(ctx, req) + return +} + +// Edit 修改地形 +func (c *qianqiDixingController) Edit(ctx context.Context, req *system.QianqiDixingEditReq) (res *system.QianqiDixingEditRes, err error) { + err = service.QianqiDixing().Edit(ctx, req) + return +} + +// Delete 删除地形 +func (c *qianqiDixingController) Delete(ctx context.Context, req *system.QianqiDixingDeleteReq) (res *system.QianqiDixingDeleteRes, err error) { + err = service.QianqiDixing().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/qianqi_dxf.go b/internal/app/system/controller/qianqi_dxf.go new file mode 100644 index 0000000..27fff03 --- /dev/null +++ b/internal/app/system/controller/qianqi_dxf.go @@ -0,0 +1,801 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-07-31 11:20:54 +// 生成路径: internal/app/system/controller/qianqi_fangzhen.go +// 生成人:gfast +// desc:方阵 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "github.com/gogf/gf/v2/crypto/gmd5" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/google/uuid" + "github.com/jinzhu/copier" + "github.com/tiger1103/gfast/v3/api/v1/common/shp" + tool2 "github.com/tiger1103/gfast/v3/api/v1/common/tool" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/tiger1103/gfast/v3/third/create" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" + "math/rand" + "os" + "os/exec" + "strconv" + "strings" + "time" +) + +type qianqiDxfController struct { + BaseController +} + +var QianqiDxf = new(qianqiDxfController) + +func (c *qianqiDxfController) FzFunc(ctx context.Context, req *system.FzReq) (res *system.FzRes, err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //1、获取数据 + point := req.Point + plane := req.Plane + //2、合并名称 + var listE []system.FacFeatureByPlane //面 + for _, data := range plane { + adata := system.FacFeatureByPlane{} + for _, bdata := range data.Features { + copier.Copy(&adata, &bdata) + listE = append(listE, adata) + } + + } + var listT []system.FacFeatureByPoint //点 + for _, data := range point { + adata := system.FacFeatureByPoint{} + for _, bdata := range data.Features { + copier.Copy(&adata, &bdata) + listT = append(listT, adata) + } + } + var templateDataList []do.WorkStatus + //3、循环判断坐标是否在点内 + for _, i := range listE { + var minVal float64 + var fzName string + for num, j := range listT { + inPolygon := tool.FanWei(i.Geometry.Coordinates[0], j.Geometry.Coordinates) + //如果为true,说明在多边形内 + if inPolygon { + //直接确认数据 + fzName = j.Properties.Text //名字 + } else { + distance := tool.PointToPolygonDistance(i.Geometry.Coordinates[0], j.Geometry.Coordinates) + fmt.Printf("点到多边形的最短距离(单位米):%.2f m\n", distance) + if num == 0 { + if len(listT) == 1 { //只有一个情况下直接赋值 + minVal = distance + fzName = j.Properties.Text //名字 + break + } + minVal = distance + fzName = j.Properties.Text //名字 + } else { + if distance < minVal { + minVal = distance + fzName = j.Properties.Text //名字 + } + } + } + } + //得到详情数据(方阵) + points := []shp.Point{} + for _, jwd := range i.Geometry.Coordinates[0] { + points = append(points, shp.Point{ + Lng: jwd[0], + Lat: jwd[1], + }) + } + polygon := shp.Polygon{ + Positions: points, + } + marshal, err := json.Marshal(polygon) + if err != nil { + liberr.ErrIsNil(ctx, err, "详情获取失败") + } + //分割名称 + if fzName != "" { + fzName = strings.Split(fzName, " ")[0] + } + // 将方阵的名称 作为方阵的id + fangzhen, err := dao.QianqiFangzhen.Ctx(ctx).Insert(&do.QianqiFangzhen{ + ProjectId: req.SubProjectId, + Name: fzName, + SourceId: tool2.GetUuid(), + CreateBy: ct.New().GetLoginUser(ctx).Id, + Detail: string(marshal), + }) + templateID, err := fangzhen.LastInsertId() + if err != nil { + continue + } + templateData, err := create.FetchTemplateData(ctx, templateID) + if err != nil { + continue + } + templateDataList = append(templateDataList, templateData...) + } + _, err = dao.WorkStatus.Ctx(ctx).Data(templateDataList).Batch(50).Insert() + }) + return err + }) + return +} + +func (c *qianqiDxfController) XbFunc(ctx context.Context, req *system.XbReq) (res *system.XbRes, err error) { + var xbList []shp.Polyline + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + /** + 一、箱变的录入 + */ + var listE []system.FacFeatureByPoint //面 + for _, data := range req.Plane { + adata := system.FacFeatureByPoint{} + for _, bdata := range data.Features { + copier.Copy(&adata, &bdata) + listE = append(listE, adata) + } + } + var listT []system.FacFeatureByPoint //点 + for _, data := range req.Point { + adata := system.FacFeatureByPoint{} + for _, bdata := range data.Features { + copier.Copy(&adata, &bdata) + listT = append(listT, adata) + } + } + var xiangbianArray []do.QianqiXiangbian + //3、循环判断坐标是否在点内 + for _, i := range listE { + var minVal float64 + var fzName string + for num, j := range listT { + distance := tool.PointToPointDistance(i.Geometry.Coordinates, j.Geometry.Coordinates) + if num == 0 { + if len(listT) == 1 { //只有一个情况下直接赋值 + minVal = distance + fzName = j.Properties.Text //名字 + break + } + minVal = distance + fzName = j.Properties.Text //名字 + } else { + if distance < minVal { + minVal = distance + fzName = j.Properties.Text //名字 + } + } + } + if fzName != "" { + fzName = strings.Split(fzName, " ")[0] + } + //得到详情数据(箱变) + points := []shp.Point{ + { + Lng: i.Geometry.Coordinates[0], + Lat: i.Geometry.Coordinates[1], + Property: shp.Property{ + Name: fzName, + }, + }, + } + polylines := shp.Polyline{ + Positions: points, + Property: shp.Property{ + Name: fzName, + }, + } + xbList = append(xbList, polylines) + marshal, err := json.Marshal(polylines) + if err != nil { + liberr.ErrIsNil(ctx, err, "详情获取失败") + } + xb := do.QianqiXiangbian{ + ProjectId: req.SubProjectId, + SourceId: gmd5.MustEncryptString(req.ProjectId + fzName), + Name: fzName, + ModelId: "518bb3c165e22097ebbf2c2c42c8e308", + CreateBy: ct.New().GetLoginUser(ctx).Id, + Detail: string(marshal), + } + // 判断是否已经存在了该方阵,存在了就不再添加 + count, _ := dao.QianqiXiangbian.Ctx(ctx).Where(dao.QianqiXiangbian.Columns().SourceId, xb.SourceId).Count() + if count == 0 { + xiangbianArray = append(xiangbianArray, xb) + } + } + if len(xiangbianArray) > 0 { + _, err = dao.QianqiXiangbian.Ctx(ctx).Insert(&xiangbianArray) + liberr.ErrIsNil(ctx, err, "添加失败") + } + /** + 二、需要操作pvmodel + */ + if err == nil { + //1、获取当前项目的所有方阵,然后判断箱变是否在方阵内(或最近),然后记录方阵id + var fzres []*model.QianqiFangzhenInfoRes + dao.QianqiFangzhen.Ctx(ctx).Where(dao.QianqiFangzhen.Columns().ProjectId, req.SubProjectId).Scan(&fzres) + for _, fz := range fzres { + var minVal float64 + var fzId int + var data *shp.Polyline + // 解析JSON数据 + var polygon shp.Polygon + err = json.Unmarshal([]byte(fz.Detail), &polygon) + array := tool.ConvertPolygonToFloatArray(polygon) + for num, xb := range xbList { + numbers := []float64{xb.Positions[0].Lng, xb.Positions[0].Lat} + wei := tool.FanWei(array, numbers) + //如果为true,说明在多边形内 + if wei { + fzId = fz.Id + data = &xb + } else { + distance := tool.PointToPolygonDistance(array, numbers) + if num == 0 { + if len(xbList) == 1 { //只有一个情况下直接赋值 + minVal = distance + fzId = fz.Id + data = &xb + break + } + minVal = distance + fzId = fz.Id + data = &xb + } else { + if distance < minVal { + minVal = distance + fzId = fz.Id + data = &xb + } + } + } + } + if data != nil { + err := service.PvModule().ImportCory(ctx, &system.PvModuleImportCory{ + FangZhenID: strconv.Itoa(fzId), + ProjectID: req.ProjectId, + SubProjectID: req.SubProjectId, + Shapes: &shp.ShpObj{ + Polylines: []shp.Polyline{ + *data, + }, + }, + }) + liberr.ErrIsNil(ctx, err, "pvmodel箱变录入失败") + } + } + } + }) + return err + }) + return +} + +func (c *qianqiDxfController) NbqFunc(ctx context.Context, req *system.NbqReq) (res *system.NbqRes, err error) { + var nbqList []shp.Polyline + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + /** + 一、处理逆变器数据 + */ + //1、获取数据 + point := req.Point + plane := req.Plane + //2、合并名称 + var listE []system.FacFeatureByPoint //面 + for _, data := range plane { + adata := system.FacFeatureByPoint{} + for _, bdata := range data.Features { + copier.Copy(&adata, &bdata) + listE = append(listE, adata) + } + } + var listT []system.FacFeatureByPoint //点 + for _, data := range point { + adata := system.FacFeatureByPoint{} + for _, bdata := range data.Features { + copier.Copy(&adata, &bdata) + listT = append(listT, adata) + } + } + var arr []do.QianqiNibianqi + //3、循环判断坐标是否在点内 + for _, i := range listE { + var minVal float64 + var fzName string + for num, j := range listT { + distance := tool.PointToPointDistance(i.Geometry.Coordinates, j.Geometry.Coordinates) + if num == 0 { + if len(listT) == 1 { //只有一个情况下直接赋值 + minVal = distance + fzName = j.Properties.Text //名字 + break + } + minVal = distance + fzName = j.Properties.Text //名字 + } else { + if distance < minVal { + minVal = distance + fzName = j.Properties.Text //名字 + } + } + //} + } + if fzName != "" { + fzName = strings.Split(fzName, " ")[0] + } + //得到详情数据(方阵) + points := []shp.Point{ + { + Lng: i.Geometry.Coordinates[0], + Lat: i.Geometry.Coordinates[1], + Property: shp.Property{ + Name: fzName, + }, + }, + } + polylines := shp.Polyline{ + Positions: points, + Property: shp.Property{ + Name: fzName, + }, + } + nbqList = append(nbqList, polylines) + marshal, err := json.Marshal(polylines) + if err != nil { + liberr.ErrIsNil(ctx, err, "详情获取失败") + } + nibianqi := do.QianqiNibianqi{} + nibianqi.ProjectId = req.SubProjectId + nibianqi.SourceId = gmd5.MustEncryptString(req.ProjectId + fzName) + nibianqi.Name = fzName + nibianqi.ModelId = "41b366a9bae250098716da675d3ae26d" + nibianqi.CreateBy = ct.New().GetLoginUser(ctx).Id + nibianqi.Detail = string(marshal) + // 判断是否已经存在了该方阵,存在了就不再添加 + count, _ := dao.QianqiNibianqi.Ctx(ctx).Where(dao.QianqiNibianqi.Columns().SourceId, nibianqi.SourceId).Count() + if count == 0 { + arr = append(arr, nibianqi) + } + } + if len(arr) > 0 { + _, err = dao.QianqiNibianqi.Ctx(ctx).Insert(&arr) + liberr.ErrIsNil(ctx, err, "添加失败") + } + /** + 二、进行pvmodel数据处理 + */ + if err == nil { + //1、获取当前项目的所有方阵,然后判断箱变是否在方阵内(或最近),然后记录方阵id + var fzres []*model.QianqiFangzhenInfoRes + dao.QianqiFangzhen.Ctx(ctx).Where(dao.QianqiFangzhen.Columns().ProjectId, req.SubProjectId).Scan(&fzres) + for _, fz := range fzres { + var minVal float64 + var fzId int + var data *shp.Polyline + // 解析JSON数据 + var polygon shp.Polygon + err = json.Unmarshal([]byte(fz.Detail), &polygon) + array := tool.ConvertPolygonToFloatArray(polygon) + for num, xb := range nbqList { + numbers := []float64{xb.Positions[0].Lng, xb.Positions[0].Lat} + wei := tool.FanWei(array, numbers) + //如果为true,说明在多边形内 + if wei { + fzId = fz.Id + } else { + distance := tool.PointToPolygonDistance(array, numbers) + if num == 0 { + if len(nbqList) == 1 { //只有一个情况下直接赋值 + minVal = distance + fzId = fz.Id + data = &xb + break + } + minVal = distance + fzId = fz.Id + data = &xb + } else { + if distance < minVal { + minVal = distance + fzId = fz.Id + data = &xb + } + } + } + } + if data != nil { + err := service.PvModule().ImportInverterCory(ctx, &system.ImportInverterCory{ + FangZhenID: strconv.Itoa(fzId), + ProjectID: req.ProjectId, + SubProjectID: req.SubProjectId, + Shapes: &shp.ShpObj{ + Polylines: []shp.Polyline{ + *data, + }, + }, + }) + liberr.ErrIsNil(ctx, err, "pvmodel逆变器录入失败") + } + } + } + }) + return err + }) + return +} + +func (c *qianqiDxfController) GfbFunc(ctx context.Context, req *system.GfbReq) (res *system.GfbRes, err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + var gfbList []shp.Polyline + var eles []do.QianqiGuangfubanIds + /** + 一、处理光伏板数据 + */ + //1、获取数据 + point := req.Point + plane := req.Plane + //2、合并名称 + var listE []system.FacFeatureByPlane //面 + for _, data := range plane { + adata := system.FacFeatureByPlane{} + for _, bdata := range data.Features { + copier.Copy(&adata, &bdata) + listE = append(listE, adata) + } + } + var listT []system.FacFeatureByPoint //点 + for _, data := range point { + adata := system.FacFeatureByPoint{} + for _, bdata := range data.Features { + copier.Copy(&adata, &bdata) + listT = append(listT, adata) + } + } + //3、循环判断坐标是否在点内 + for _, i := range listE { + var minVal float64 + var fzName string + for num, j := range listT { + inPolygon := tool.FanWei(i.Geometry.Coordinates[0], j.Geometry.Coordinates) + //如果为true,说明在多边形内 + if inPolygon { + //直接确认数据 + fzName = j.Properties.Text //名字 + break + } else { + distance := tool.PointToPolygonDistance(i.Geometry.Coordinates[0], j.Geometry.Coordinates) + if num == 0 { + if len(listT) == 1 { //只有一个情况下直接赋值 + minVal = distance + fzName = j.Properties.Text //名字 + break + } + minVal = distance + fzName = j.Properties.Text //名字 + } else { + if distance < minVal { + minVal = distance + fzName = j.Properties.Text //名字 + } + } + } + } + if fzName != "" { + fzName = strings.Split(fzName, " ")[0] + } + //得到详情数据(方阵) + points := []shp.Point{} + for _, jwd := range i.Geometry.Coordinates[0] { + points = append(points, shp.Point{ + Lng: jwd[0], + Lat: jwd[1], + Property: shp.Property{ + Name: fzName, + }, + }) + } + polylines := shp.Polyline{ + Positions: points, + Property: shp.Property{ + Name: fzName, + }, + } + gfbList = append(gfbList, polylines) + marshal, err := json.Marshal(polylines) + if err != nil { + liberr.ErrIsNil(ctx, err, "详情获取失败") + } + //=================== + if !strings.HasPrefix(fzName, "G") { + continue + } + // 设置随机数种子 + rand.Seed(time.Now().UnixNano()) + randomNum := rand.Intn(6) + 1 + randomStr1 := strconv.Itoa(randomNum) + ele := do.QianqiGuangfubanIds{ + Name: fzName, + DevType: "1", + CreateBy: ct.New().GetLoginUser(ctx).Id, + SourceType: "guangfuban", + SourceId: tool2.GetUuid() + randomStr1, + ProjectId: req.SubProjectId, + Range: string(marshal), + } + eles = append(eles, ele) + if len(eles) > 500 { + dao.QianqiGuangfubanIds.Ctx(ctx).Insert(eles) + eles = []do.QianqiGuangfubanIds{} + } + } + + /** + 二、进行pvmodel数据处理 + */ + if err == nil { + //1、获取当前项目的所有方阵,然后判断箱变是否在方阵内(或最近),然后记录方阵id + fzres := []entity.QianqiFangzhen{} + queryErr := dao.QianqiFangzhen.Ctx(ctx). + Where(dao.QianqiFangzhen.Columns().ProjectId, req.SubProjectId). + Scan(&fzres) + if queryErr != nil { + liberr.ErrIsNil(ctx, queryErr, "方阵获取失败") + return + } + for _, fz := range fzres { + var data []shp.Polyline + // 解析JSON数据 + var polygon shp.Polygon + err = json.Unmarshal([]byte(fz.Detail), &polygon) + array := tool.ConvertPolygonToFloatArray(polygon) + for _, xb := range gfbList { + numbers := []float64{xb.Positions[0].Lng, xb.Positions[0].Lat} + wei := tool.FanWei(array, numbers) + //如果为true,说明在多边形内 + if wei { + polyline := shp.Polyline{} + polyline = xb + data = append(data, polyline) + } + } + if data != nil { + err := service.PvModule().ImportPvBoardCory(ctx, &system.ImportPvBoardCory{ + FangZhenID: strconv.Itoa(fz.Id), + ProjectID: req.ProjectId, + SubProjectID: req.SubProjectId, + Shapes: &shp.ShpObj{ + Polylines: data, + }, + Fangzhens: fzres, + }) + liberr.ErrIsNil(ctx, err, "pvmodel光伏板录入失败") + } + } + } + + }) + return err + }) + return +} + +// 传入 point 构建出 detail 和 SourceID +func buildDetailAndSourceID(point shp.Point, name string) (string, string) { + // 生成 SourceID + sourceID := fmt.Sprintf("%s.%s", point.Name, strings.ReplaceAll(uuid.New().String(), "-", "")) + + detail := Zhuangdian{ + Position: point, + } + detail.Position.SourceId = sourceID + + // 序列化后传回 + data, err := json.Marshal(detail) + if err != nil { + return "", "" + } + return string(data), sourceID +} + +func (c *qianqiDxfController) ZhuangDianFunc(ctx context.Context, req *system.ZdReq) (res *system.ZdRes, err error) { + //1、获取数据 + plane := req.Plane + //2、合并名称 + var listE []system.FacFeatureByPoint //面 + for _, data := range plane { + adata := system.FacFeatureByPoint{} + for _, bdata := range data.Features { + copier.Copy(&adata, &bdata) + listE = append(listE, adata) + } + } + //3-1、获取到所有的方阵、光伏板,获取到方阵id根布版图绑定 + fzres := []entity.QianqiFangzhen{} + queryErr := dao.QianqiFangzhen.Ctx(ctx). + Where(dao.QianqiFangzhen.Columns().ProjectId, req.SubProjectid). + Scan(&fzres) + if queryErr != nil { + liberr.ErrIsNil(ctx, queryErr, "方阵获取失败") + return + } + columns := dao.QianqiGuangfubanIds.Columns() + var resData []*model.QianqiGuangfubanIdsInfoRes + dao.QianqiGuangfubanIds.Ctx(ctx).Where(columns.ProjectId, req.SubProjectid).Scan(&resData) + if resData == nil && len(resData) == 0 { + liberr.ErrIsNil(ctx, errors.New("光伏板获取失败")) + return + } + for i, datum := range resData { + //布版图 + var polygon1 shp.Polygon + err = json.Unmarshal([]byte(datum.Range), &polygon1) + if err != nil { + liberr.ErrIsNil(ctx, err, "详情获取失败") + return + } + f64 := []float64{polygon1.Positions[0].Lng, polygon1.Positions[0].Lat} + for _, fzre := range fzres { //方阵 + //解析JSON数据 + var polygon shp.Polygon + err = json.Unmarshal([]byte(fzre.Detail), &polygon) + if err != nil { + liberr.ErrIsNil(ctx, err, "详情获取失败") + return + } + array2 := tool.ConvertPolygonToFloatArray(polygon) + if tool.FanWei(array2, f64) { + resData[i].FzId = fzre.Id + } + } + } + //3-2、获取布版图 + if resData != nil && len(resData) > 0 { + insertList := []do.QianqiGuangfubanIdsZhuangdian{} + for _, i := range resData { //面 + num := 0 + r := i.Range + // 解析JSON数据 + var polygon shp.Polygon + err = json.Unmarshal([]byte(r), &polygon) + if err != nil { + return nil, err + } + //判断点是否在多边形内 + array := tool.ConvertPolygonToFloatArray(polygon) + for _, j := range listE { //坐标点() + inPolygon := tool.FanWei(array, j.Geometry.Coordinates) + if inPolygon { + num = num + 1 + // 调用 buildDetailAndSourceID 生成 detail 和 SourceID + pointcory := shp.Point{ + Lng: j.Geometry.Coordinates[0], + Lat: j.Geometry.Coordinates[1], + Property: shp.Property{ + Name: j.Geometry.Type, + }, + } + _, sourceID := buildDetailAndSourceID(pointcory, j.Geometry.Type) + points := []shp.Point{pointcory} + polylines := shp.Polyline{Positions: points} + marshal, err := json.Marshal(polylines) + if err != nil { + liberr.ErrIsNil(ctx, err, "详情获取失败") + } + zhuangdian := do.QianqiGuangfubanIdsZhuangdian{ + Name: i.Name + "." + strconv.Itoa(num), + SourceId: sourceID, + ProjectId: req.ProjectId, + Status: "0", + Detail: marshal, + SubProjectid: req.SubProjectid, + FangzhenId: i.FzId, + } + insertList = append(insertList, zhuangdian) + } + + } + } + if len(insertList) > 0 { + batchNumber := 700 + _, err = dao.QianqiGuangfubanIdsZhuangdian.Ctx(ctx).Batch(batchNumber).Insert(&insertList) + liberr.ErrIsNil(ctx, err, "光伏板插入失败") + _, err = dao.QianqiGuangfubanIdsLizhu.Ctx(ctx).Batch(batchNumber).Insert(&insertList) + liberr.ErrIsNil(ctx, err, "立柱插入失败") + _, err = dao.QianqiGuangfubanIdsZhijia.Ctx(ctx).Batch(batchNumber).Insert(&insertList) + liberr.ErrIsNil(ctx, err, "支架失败") + } + } + return +} + +func (c *qianqiDxfController) DxfGet(ctx context.Context, req *system.DxfGetReq) (res *system.DxfGetRes, err error) { + // 定义 exe <结果 JS0N 文件的绝对路径><源 EPSG 代码><目标 EPSG 代码> + cmd := exec.Command("E:\\cory\\project\\go\\zmkgC\\resource\\public\\zmFiles\\pythonDxf.exe", + "E:\\cory\\project\\go\\zmkgC\\resource\\public\\zmFiles\\b93ba1d7008247a79503e8a80fe1de62.dxf", + "E:\\cory\\project\\go\\zmkgC\\resource\\public\\zmFiles\\nr.json", + "4524", + "4326", + ) + // 执行并获取输出 + output, err := cmd.CombinedOutput() + if err != nil { + fmt.Println("执行出错:", err) + } + fmt.Println("输出内容:", string(output)) + return +} + +func (c *qianqiDxfController) DxfData(ctx context.Context, req *system.DxfDataReq) (res *system.DxfDataRes, err error) { + res = &system.DxfDataRes{} + + err = g.Try(ctx, func(ctx context.Context) { + // 指定要读取的JSON文件路径 + filePath := "E:\\cory\\project\\go\\zmkgC\\resource\\public\\zmFiles\\nr.json" + // 读取文件内容 + data, err := os.ReadFile(filePath) + if err != nil { + liberr.ErrIsNil(ctx, err, "读取失败") + } + + // 用于存储解析后的JSON数据 + var result map[string]interface{} + + // 解析JSON数据 + if err := json.Unmarshal(data, &result); err != nil { + liberr.ErrIsNil(ctx, err, "解析JSON失败") + } + res.Map = result + }) + return +} + +// +//func FanWei(mian [][]float64, dian [][]float64) bool { +// +// // 定义多边形范围 (经纬度点的顺序很重要,需要闭合:首尾点相同) +// polygon := orb.Polygon{ +// { +// {106.518314, 29.627223}, // 起始位置 +// {106.519419, 29.627223}, +// {106.518238, 29.626399}, +// {106.519491, 29.626435}, +// {106.518314, 29.627223}, // 回到起始 +// }, +// } +// // 目标点 +// point := orb.Point{106.518907, 29.626458} // 假设是一个经纬度点 +// +// // 判断点是否在多边形内 +// if planar.PolygonContains(polygon, point) { +// fmt.Println("点在多边形范围内") +// return true +// } else { +// fmt.Println("点不在多边形范围内") +// return false +// } +//} diff --git a/internal/app/system/controller/qianqi_fangzhen.go b/internal/app/system/controller/qianqi_fangzhen.go new file mode 100644 index 0000000..e21d50a --- /dev/null +++ b/internal/app/system/controller/qianqi_fangzhen.go @@ -0,0 +1,65 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-07-31 11:20:54 +// 生成路径: internal/app/system/controller/qianqi_fangzhen.go +// 生成人:gfast +// desc:方阵 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type qianqiFangzhenController struct { + BaseController +} + +var QianqiFangzhen = new(qianqiFangzhenController) + +// List 列表 +func (c *qianqiFangzhenController) List(ctx context.Context, req *system.QianqiFangzhenSearchReq) (res *system.QianqiFangzhenSearchRes, err error) { + res, err = service.QianqiFangzhen().List(ctx, req) + return +} + +// Get 获取方阵 +func (c *qianqiFangzhenController) Get(ctx context.Context, req *system.QianqiFangzhenGetReq) (res *system.QianqiFangzhenGetRes, err error) { + res = new(system.QianqiFangzhenGetRes) + res.QianqiFangzhenInfoRes, err = service.QianqiFangzhen().GetById(ctx, req.Id) + return +} + +// Add 添加方阵 +func (c *qianqiFangzhenController) Add(ctx context.Context, req *system.QianqiFangzhenAddReq) (res *system.QianqiFangzhenAddRes, err error) { + err = service.QianqiFangzhen().Add(ctx, req) + return +} + +// Edit 修改方阵 +func (c *qianqiFangzhenController) Edit(ctx context.Context, req *system.QianqiFangzhenEditReq) (res *system.QianqiFangzhenEditRes, err error) { + err = service.QianqiFangzhen().Edit(ctx, req) + return +} + +// Delete 删除方阵 +func (c *qianqiFangzhenController) Delete(ctx context.Context, req *system.QianqiFangzhenDeleteReq) (res *system.QianqiFangzhenDeleteRes, err error) { + err = service.QianqiFangzhen().Delete(ctx, req.Ids) + return +} + +func (c *qianqiFangzhenController) EditDetail(ctx context.Context, req *system.QianqiFangzhenEditDetailReq) (res *system.QianqiFangzhenEditDetailRes, err error) { + err = service.QianqiFangzhen().EditDetail(ctx, req) + return +} + +// 传入方阵的主键ID 并将其 ViewName 更新到表中 +func (c *qianqiFangzhenController) UpdateViewName(ctx context.Context, req *system.QianqiFangzhenUpdateViewNameReq) (res *system.QianqiFangzhenUpdateViewNameRes, err error) { + err = service.QianqiFangzhen().UpdateViewName(ctx, req) + return +} diff --git a/internal/app/system/controller/qianqi_guangfuban.go b/internal/app/system/controller/qianqi_guangfuban.go new file mode 100644 index 0000000..69730b4 --- /dev/null +++ b/internal/app/system/controller/qianqi_guangfuban.go @@ -0,0 +1,79 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-07-31 11:31:49 +// 生成路径: internal/app/system/controller/qianqi_guangfuban.go +// 生成人:gfast +// desc:光伏板模型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type qianqiGuangfubanController struct { + BaseController +} + +var QianqiGuangfuban = new(qianqiGuangfubanController) + +// List 列表 +func (c *qianqiGuangfubanController) List(ctx context.Context, req *system.QianqiGuangfubanSearchReq) (res *system.QianqiGuangfubanSearchRes, err error) { + res, err = service.QianqiGuangfuban().List(ctx, req) + return +} + +// Get 获取光伏板模型 +func (c *qianqiGuangfubanController) Get(ctx context.Context, req *system.QianqiGuangfubanGetReq) (res *system.QianqiGuangfubanGetRes, err error) { + res = new(system.QianqiGuangfubanGetRes) + res.QianqiGuangfubanInfoRes, err = service.QianqiGuangfuban().GetById(ctx, req.Id) + return +} + +// Add 添加光伏板模型 +func (c *qianqiGuangfubanController) Add(ctx context.Context, req *system.QianqiGuangfubanAddReq) (res *system.QianqiGuangfubanAddRes, err error) { + err = service.QianqiGuangfuban().Add(ctx, req) + return +} + +// Edit 修改光伏板模型 +func (c *qianqiGuangfubanController) Edit(ctx context.Context, req *system.QianqiGuangfubanEditReq) (res *system.QianqiGuangfubanEditRes, err error) { + err = service.QianqiGuangfuban().Edit(ctx, req) + return +} + +// Delete 删除光伏板模型 +func (c *qianqiGuangfubanController) Delete(ctx context.Context, req *system.QianqiGuangfubanDeleteReq) (res *system.QianqiGuangfubanDeleteRes, err error) { + err = service.QianqiGuangfuban().Delete(ctx, req.SourceIDs) + return +} + +// QianqiGuangfubanImportZuchuan +func (c *qianqiGuangfubanController) QianqiGuangfubanImportZuchuan(ctx context.Context, req *system.QianqiGuangfubanImportZuchuanReq) (res *system.QianqiGuangfubanImportZuchuanRes, err error) { + err = service.QianqiGuangfuban().ImportZuchuan(ctx, req) + return +} + +// QianqiGuangfubanCalZuchuan +func (c *qianqiGuangfubanController) QianqiGuangfubanCalZuchuan(ctx context.Context, req *system.QianqiGuangfubanCalZuchuanReq) (res *system.QianqiGuangfubanCalZuchuanRes, err error) { + err = service.QianqiGuangfuban().CaculateZuchuan(ctx, req) + return +} + +// CorrectFunc 光伏板数据纠正 +func (c *qianqiGuangfubanController) CorrectFunc(ctx context.Context, req *system.CorrectFuncReq) (res *system.CorrectFuncRes, err error) { + err = service.QianqiGuangfuban().CorrectFunc(ctx, req) + return +} + +// CorrectQueryFunc 光伏板数据纠正查询 +func (c *qianqiGuangfubanController) CorrectQueryFunc(ctx context.Context, req *system.CorrectQueryFuncReq) (res *system.CorrectQueryFuncRes, err error) { + res = new(system.CorrectQueryFuncRes) + queryFunc, err := service.QianqiGuangfuban().CorrectQueryFunc(ctx, req) + res = queryFunc + return +} diff --git a/internal/app/system/controller/qianqi_guangfuban_ids.go b/internal/app/system/controller/qianqi_guangfuban_ids.go new file mode 100644 index 0000000..b950191 --- /dev/null +++ b/internal/app/system/controller/qianqi_guangfuban_ids.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-05 16:00:23 +// 生成路径: internal/app/system/controller/qianqi_guangfuban_ids.go +// 生成人:gfast +// desc:光伏板模型的id +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type qianqiGuangfubanIdsController struct { + BaseController +} + +var QianqiGuangfubanIds = new(qianqiGuangfubanIdsController) + +// List 列表 +func (c *qianqiGuangfubanIdsController) List(ctx context.Context, req *system.QianqiGuangfubanIdsSearchReq) (res *system.QianqiGuangfubanIdsSearchRes, err error) { + res, err = service.QianqiGuangfubanIds().List(ctx, req) + return +} + +// Get 获取光伏板模型的id +func (c *qianqiGuangfubanIdsController) Get(ctx context.Context, req *system.QianqiGuangfubanIdsGetReq) (res *system.QianqiGuangfubanIdsGetRes, err error) { + res = new(system.QianqiGuangfubanIdsGetRes) + res, err = service.QianqiGuangfubanIds().GetById(ctx, req) + return +} + +// Add 添加光伏板模型的id +func (c *qianqiGuangfubanIdsController) Add(ctx context.Context, req *system.QianqiGuangfubanIdsAddReq) (res *system.QianqiGuangfubanIdsAddRes, err error) { + err = service.QianqiGuangfubanIds().Add(ctx, req) + return +} + +// Edit 修改光伏板模型的id +func (c *qianqiGuangfubanIdsController) Edit(ctx context.Context, req *system.QianqiGuangfubanIdsEditReq) (res *system.QianqiGuangfubanIdsEditRes, err error) { + err = service.QianqiGuangfubanIds().Edit(ctx, req) + return +} + +// Delete 删除光伏板模型的id +func (c *qianqiGuangfubanIdsController) Delete(ctx context.Context, req *system.QianqiGuangfubanIdsDeleteReq) (res *system.QianqiGuangfubanIdsDeleteRes, err error) { + err = service.QianqiGuangfubanIds().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/qianqi_guangfuban_ids_lizhu.go b/internal/app/system/controller/qianqi_guangfuban_ids_lizhu.go new file mode 100644 index 0000000..191ce94 --- /dev/null +++ b/internal/app/system/controller/qianqi_guangfuban_ids_lizhu.go @@ -0,0 +1,72 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-09-05 12:10:40 +// 生成路径: internal/app/system/controller/qianqi_guangfuban_ids_lizhu.go +// 生成人:gfast +// desc:光伏板立柱 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type qianqiGuangfubanIdsLizhuController struct { + BaseController +} + +var QianqiGuangfubanIdsLizhu = new(qianqiGuangfubanIdsLizhuController) + +// FlowListFunc 流程图列表 +// func (c *qianqiGuangfubanIdsLizhuController) FlowListFunc(ctx context.Context, req *system.FlowListReq) (res *system.GisListLizhuRes, err error) { +// res, err = service.QianqiGuangfubanIdsLizhu().GisListFunc(ctx, req, "2") +// return +// } + +// GisListFunc GIS云图列表 +func (c *qianqiGuangfubanIdsLizhuController) GisListFunc(ctx context.Context, req *system.GisListLizhuReq) (res *system.GisListLizhuRes, err error) { + res, err = service.QianqiGuangfubanIdsLizhu().GisListFunc(ctx, req, "1") + return +} + +// List 列表 +func (c *qianqiGuangfubanIdsLizhuController) List(ctx context.Context, req *system.QianqiGuangfubanIdsLizhuSearchReq) (res *system.QianqiGuangfubanIdsLizhuSearchRes, err error) { + res, err = service.QianqiGuangfubanIdsLizhu().List(ctx, req) + return +} + +// Get 获取光伏板立柱 +func (c *qianqiGuangfubanIdsLizhuController) Get(ctx context.Context, req *system.QianqiGuangfubanIdsLizhuGetReq) (res *system.QianqiGuangfubanIdsLizhuGetRes, err error) { + res = new(system.QianqiGuangfubanIdsLizhuGetRes) + res.QianqiGuangfubanIdsLizhuInfoRes, err = service.QianqiGuangfubanIdsLizhu().GetById(ctx, req.Id) + return +} + +// Add 添加光伏板立柱 +func (c *qianqiGuangfubanIdsLizhuController) Add(ctx context.Context, req *system.QianqiGuangfubanIdsLizhuAddReq) (res *system.QianqiGuangfubanIdsLizhuAddRes, err error) { + err = service.QianqiGuangfubanIdsLizhu().Add(ctx, req) + return +} + +// Edit 修改光伏板立柱 +func (c *qianqiGuangfubanIdsLizhuController) Edit(ctx context.Context, req *system.QianqiGuangfubanIdsLizhuEditReq) (res *system.QianqiGuangfubanIdsLizhuEditRes, err error) { + err = service.QianqiGuangfubanIdsLizhu().Edit(ctx, req) + return +} + +// Delete 删除光伏板立柱 +func (c *qianqiGuangfubanIdsLizhuController) Delete(ctx context.Context, req *system.QianqiGuangfubanIdsLizhuDeleteReq) (res *system.QianqiGuangfubanIdsLizhuDeleteRes, err error) { + err = service.QianqiGuangfubanIdsLizhu().Delete(ctx, req.Ids) + return +} + +// BooleanValueFunc 对立柱高度进行加减 +func (c *qianqiGuangfubanIdsLizhuController) BooleanValueFunc(ctx context.Context, req *system.BooleanValueEditReq) (res *system.BooleanValueEditRes, err error) { + err = service.QianqiGuangfubanIdsLizhu().BooleanValueFunc(ctx, req) + return +} diff --git a/internal/app/system/controller/qianqi_guangfuban_ids_zhijia.go b/internal/app/system/controller/qianqi_guangfuban_ids_zhijia.go new file mode 100644 index 0000000..d270dcb --- /dev/null +++ b/internal/app/system/controller/qianqi_guangfuban_ids_zhijia.go @@ -0,0 +1,85 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-09-05 12:10:51 +// 生成路径: internal/app/system/controller/qianqi_guangfuban_ids_zhijia.go +// 生成人:gfast +// desc:光伏板支架 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type qianqiGuangfubanIdsZhijiaController struct { + BaseController +} + +var QianqiGuangfubanIdsZhijia = new(qianqiGuangfubanIdsZhijiaController) + +// FlowZhijiaFunc 流程图支架列表 +// func (c *qianqiGuangfubanIdsZhijiaController) FlowZhijiaFunc(ctx context.Context, req *system.FlowZhijiaReq) (res *system.GisZhijiaRes, err error) { +// res, err = service.QianqiGuangfubanIdsZhijia().GisListFunc(ctx, (*system.GisZhijiaReq)(req), "2") +// return +// } + +// GisListFunc GIS云图列表 +func (c *qianqiGuangfubanIdsZhijiaController) GisListFunc(ctx context.Context, req *system.GisZhijiaReq) (res *system.GisZhijiaRes, err error) { + res, err = service.QianqiGuangfubanIdsZhijia().GisListFunc(ctx, req, "1") + return +} + +// List 列表 +func (c *qianqiGuangfubanIdsZhijiaController) List(ctx context.Context, req *system.QianqiGuangfubanIdsZhijiaSearchReq) (res *system.QianqiGuangfubanIdsZhijiaSearchRes, err error) { + res, err = service.QianqiGuangfubanIdsZhijia().List(ctx, req) + return +} + +// Get 获取光伏板支架 +func (c *qianqiGuangfubanIdsZhijiaController) Get(ctx context.Context, req *system.QianqiGuangfubanIdsZhijiaGetReq) (res *system.QianqiGuangfubanIdsZhijiaGetRes, err error) { + res = new(system.QianqiGuangfubanIdsZhijiaGetRes) + res.QianqiGuangfubanIdsZhijiaInfoRes, err = service.QianqiGuangfubanIdsZhijia().GetById(ctx, req.Id) + return +} + +// Add 添加光伏板支架 +func (c *qianqiGuangfubanIdsZhijiaController) Add(ctx context.Context, req *system.QianqiGuangfubanIdsZhijiaAddReq) (res *system.QianqiGuangfubanIdsZhijiaAddRes, err error) { + err = service.QianqiGuangfubanIdsZhijia().Add(ctx, req) + return +} + +// Edit 修改光伏板支架 +func (c *qianqiGuangfubanIdsZhijiaController) Edit(ctx context.Context, req *system.QianqiGuangfubanIdsZhijiaEditReq) (res *system.QianqiGuangfubanIdsZhijiaEditRes, err error) { + err = service.QianqiGuangfubanIdsZhijia().Edit(ctx, req) + return +} + +// Delete 删除光伏板支架 +func (c *qianqiGuangfubanIdsZhijiaController) Delete(ctx context.Context, req *system.QianqiGuangfubanIdsZhijiaDeleteReq) (res *system.QianqiGuangfubanIdsZhijiaDeleteRes, err error) { + err = service.QianqiGuangfubanIdsZhijia().Delete(ctx, req.Ids) + return +} + +// EditDetailFunc 更新高点 +func (c *qianqiGuangfubanIdsZhijiaController) EditDetailFunc(ctx context.Context, req *system.QianqiGuangfubanIdsZhijiaDetailReq) (res *system.QianqiGuangfubanIdsZhijiaDetailRes, err error) { + err = service.QianqiGuangfubanIdsZhijia().EditDetail(ctx, req) + return +} + +// PrewarningValueFunc 获取树形结构数据 +func (c *qianqiGuangfubanIdsZhijiaController) PrewarningValueFunc(ctx context.Context, req *system.PrewarningValueReq) (res *system.PrewarningValueRes, err error) { + valueFunc, err := service.QianqiGuangfubanIdsZhijia().PrewarningValueFunc(ctx, req) + res = valueFunc + return +} + +// QueryDetailsFunc 查询details数据 根据组串名和项目id +func (c *qianqiGuangfubanIdsZhijiaController) QueryDetailsFunc(ctx context.Context, req *system.QueryDetailsReq) (res *system.QueryDetailsRes, err error) { + res, err = service.QianqiGuangfubanIdsZhijia().QueryDetailsFunc(ctx, req) + return +} diff --git a/internal/app/system/controller/qianqi_guangfuban_ids_zhuangdian.go b/internal/app/system/controller/qianqi_guangfuban_ids_zhuangdian.go new file mode 100644 index 0000000..8c76f47 --- /dev/null +++ b/internal/app/system/controller/qianqi_guangfuban_ids_zhuangdian.go @@ -0,0 +1,70 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-09-05 12:07:41 +// 生成路径: internal/app/system/controller/qianqi_guangfuban_ids_zhuangdian.go +// 生成人:gfast +// desc:光伏板桩点 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type qianqiGuangfubanIdsZhuangdianController struct { + BaseController +} + +var QianqiGuangfubanIdsZhuangdian = new(qianqiGuangfubanIdsZhuangdianController) + +// FlowZhuangdianFunc Gis列表 +func (c *qianqiGuangfubanIdsZhuangdianController) FlowZhuangdianFunc(ctx context.Context, req *system.GisListReq) (res *system.GisListRes, err error) { + res, err = service.QianqiGuangfubanIdsZhuangdian().GisListFunc(ctx, req, "2") + return +} + +// GisListFunc Gis列表 +func (c *qianqiGuangfubanIdsZhuangdianController) GisListFunc(ctx context.Context, req *system.GisListReq) (res *system.GisListRes, err error) { + res, err = service.QianqiGuangfubanIdsZhuangdian().GisListFunc(ctx, req, "1") + return +} + +// List 列表 +func (c *qianqiGuangfubanIdsZhuangdianController) List(ctx context.Context, req *system.QianqiGuangfubanIdsZhuangdianSearchReq) (res *system.QianqiGuangfubanIdsZhuangdianSearchRes, err error) { + res, err = service.QianqiGuangfubanIdsZhuangdian().List(ctx, req) + return +} + +// Get 获取光伏板桩点 +func (c *qianqiGuangfubanIdsZhuangdianController) Get(ctx context.Context, req *system.QianqiGuangfubanIdsZhuangdianGetReq) (res *system.QianqiGuangfubanIdsZhuangdianGetRes, err error) { + res = new(system.QianqiGuangfubanIdsZhuangdianGetRes) + res.QianqiGuangfubanIdsZhuangdianInfoRes, err = service.QianqiGuangfubanIdsZhuangdian().GetById(ctx, req.Id) + return +} + +// Add 添加光伏板桩点 +func (c *qianqiGuangfubanIdsZhuangdianController) Add(ctx context.Context, req *system.QianqiGuangfubanIdsZhuangdianAddReq) (res *system.QianqiGuangfubanIdsZhuangdianAddRes, err error) { + err = service.QianqiGuangfubanIdsZhuangdian().Add(ctx, req) + return +} + +// Edit 修改光伏板桩点 +func (c *qianqiGuangfubanIdsZhuangdianController) Edit(ctx context.Context, req *system.QianqiGuangfubanIdsZhuangdianEditReq) (res *system.QianqiGuangfubanIdsZhuangdianEditRes, err error) { + err = service.QianqiGuangfubanIdsZhuangdian().Edit(ctx, req) + return +} + +func (c *qianqiGuangfubanIdsZhuangdianController) EditDetail(ctx context.Context, req *system.QianqiGuangfubanIdsZhuangdianEditDetailReq) (res *system.QianqiGuangfubanIdsZhuangdianEditDetailRes, err error) { + err = service.QianqiGuangfubanIdsZhuangdian().EditDetail(ctx, req) + return +} + +// Delete 删除光伏板桩点 +func (c *qianqiGuangfubanIdsZhuangdianController) Delete(ctx context.Context, req *system.QianqiGuangfubanIdsZhuangdianDeleteReq) (res *system.QianqiGuangfubanIdsZhuangdianDeleteRes, err error) { + err = service.QianqiGuangfubanIdsZhuangdian().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/qianqi_guangfuban_zuchuan.go b/internal/app/system/controller/qianqi_guangfuban_zuchuan.go new file mode 100644 index 0000000..c600680 --- /dev/null +++ b/internal/app/system/controller/qianqi_guangfuban_zuchuan.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-17 10:37:21 +// 生成路径: internal/app/system/controller/qianqi_guangfuban_zuchuan.go +// 生成人:xyb +// desc:组串 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type qianqiGuangfubanZuchuanController struct { + BaseController +} + +var QianqiGuangfubanZuchuan = new(qianqiGuangfubanZuchuanController) + +// List 列表 +func (c *qianqiGuangfubanZuchuanController) List(ctx context.Context, req *system.QianqiGuangfubanZuchuanSearchReq) (res *system.QianqiGuangfubanZuchuanSearchRes, err error) { + res, err = service.QianqiGuangfubanZuchuan().List(ctx, req) + return +} + +// Get 获取组串 +func (c *qianqiGuangfubanZuchuanController) Get(ctx context.Context, req *system.QianqiGuangfubanZuchuanGetReq) (res *system.QianqiGuangfubanZuchuanGetRes, err error) { + res = new(system.QianqiGuangfubanZuchuanGetRes) + res.QianqiGuangfubanZuchuanInfoRes, err = service.QianqiGuangfubanZuchuan().GetById(ctx, req.Id) + return +} + +// Add 添加组串 +func (c *qianqiGuangfubanZuchuanController) Add(ctx context.Context, req *system.QianqiGuangfubanZuchuanAddReq) (res *system.QianqiGuangfubanZuchuanAddRes, err error) { + err = service.QianqiGuangfubanZuchuan().Add(ctx, req) + return +} + +// Edit 修改组串 +func (c *qianqiGuangfubanZuchuanController) Edit(ctx context.Context, req *system.QianqiGuangfubanZuchuanEditReq) (res *system.QianqiGuangfubanZuchuanEditRes, err error) { + err = service.QianqiGuangfubanZuchuan().Edit(ctx, req) + return +} + +// Delete 删除组串 +func (c *qianqiGuangfubanZuchuanController) Delete(ctx context.Context, req *system.QianqiGuangfubanZuchuanDeleteReq) (res *system.QianqiGuangfubanZuchuanDeleteRes, err error) { + err = service.QianqiGuangfubanZuchuan().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/qianqi_jidianxianlu.go b/internal/app/system/controller/qianqi_jidianxianlu.go new file mode 100644 index 0000000..13d5d9a --- /dev/null +++ b/internal/app/system/controller/qianqi_jidianxianlu.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-04 16:29:44 +// 生成路径: internal/app/system/controller/qianqi_jidianxianlu.go +// 生成人:gfast +// desc:集电线路 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type qianqiJidianxianluController struct { + BaseController +} + +var QianqiJidianxianlu = new(qianqiJidianxianluController) + +// List 列表 +func (c *qianqiJidianxianluController) List(ctx context.Context, req *system.QianqiJidianxianluSearchReq) (res *system.QianqiJidianxianluSearchRes, err error) { + res, err = service.QianqiJidianxianlu().List(ctx, req) + return +} + +// Get 获取集电线路 +func (c *qianqiJidianxianluController) Get(ctx context.Context, req *system.QianqiJidianxianluGetReq) (res *system.QianqiJidianxianluGetRes, err error) { + res = new(system.QianqiJidianxianluGetRes) + res.QianqiJidianxianluInfoRes, err = service.QianqiJidianxianlu().GetById(ctx, req.Id) + return +} + +// Add 添加集电线路 +func (c *qianqiJidianxianluController) Add(ctx context.Context, req *system.QianqiJidianxianluAddReq) (res *system.QianqiJidianxianluAddRes, err error) { + err = service.QianqiJidianxianlu().Add(ctx, req) + return +} + +// Edit 修改集电线路 +func (c *qianqiJidianxianluController) Edit(ctx context.Context, req *system.QianqiJidianxianluEditReq) (res *system.QianqiJidianxianluEditRes, err error) { + err = service.QianqiJidianxianlu().Edit(ctx, req) + return +} + +// Delete 删除集电线路 +func (c *qianqiJidianxianluController) Delete(ctx context.Context, req *system.QianqiJidianxianluDeleteReq) (res *system.QianqiJidianxianluDeleteRes, err error) { + err = service.QianqiJidianxianlu().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/qianqi_moxing.go b/internal/app/system/controller/qianqi_moxing.go new file mode 100644 index 0000000..5d83ce4 --- /dev/null +++ b/internal/app/system/controller/qianqi_moxing.go @@ -0,0 +1,64 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-07-31 11:09:26 +// 生成路径: internal/app/system/controller/qianqi_moxing.go +// 生成人:gfast +// desc:倾斜模型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type qianqiMoxingController struct { + BaseController +} + +var QianqiMoxing = new(qianqiMoxingController) + +// List 列表 +func (c *qianqiMoxingController) List(ctx context.Context, req *system.QianqiMoxingSearchReq) (res *system.QianqiMoxingSearchRes, err error) { + res, err = service.QianqiMoxing().List(ctx, req) + return +} + +// Get 获取倾斜模型 +func (c *qianqiMoxingController) Get(ctx context.Context, req *system.QianqiMoxingGetReq) (res *system.QianqiMoxingGetRes, err error) { + res = new(system.QianqiMoxingGetRes) + res.QianqiMoxingInfoRes, err = service.QianqiMoxing().GetById(ctx, req.Id) + return +} + +// Add 添加倾斜模型 +func (c *qianqiMoxingController) Add(ctx context.Context, req *system.QianqiMoxingAddReq) (res *system.QianqiMoxingAddRes, err error) { + err = service.QianqiMoxing().Add(ctx, req) + return +} + +// Edit 修改倾斜模型 +func (c *qianqiMoxingController) Edit(ctx context.Context, req *system.QianqiMoxingEditReq) (res *system.QianqiMoxingEditRes, err error) { + err = service.QianqiMoxing().Edit(ctx, req) + return +} + +// Delete 删除倾斜模型 +func (c *qianqiMoxingController) Delete(ctx context.Context, req *system.QianqiMoxingDeleteReq) (res *system.QianqiMoxingDeleteRes, err error) { + err = service.QianqiMoxing().Delete(ctx, req.Ids) + return +} + +func (c *qianqiMoxingController) MxUpload(ctx context.Context, req *system.UploadFileReq) (res *system.UploadFileRes, err error) { + // 初始化 res 变量 + res = &system.UploadFileRes{} + file := req.File + str, err := coryCommon.UploadFile(ctx, file, coryCommon.LargeFileClt) + res.FileName = file.Filename + res.FilePath = str + return +} diff --git a/internal/app/system/controller/qianqi_nibianqi.go b/internal/app/system/controller/qianqi_nibianqi.go new file mode 100644 index 0000000..d427795 --- /dev/null +++ b/internal/app/system/controller/qianqi_nibianqi.go @@ -0,0 +1,59 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-07-31 09:40:17 +// 生成路径: internal/app/system/controller/qianqi_nibianqi.go +// 生成人:gfast +// desc:逆变器 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type qianqiNibianqiController struct { + BaseController +} + +var QianqiNibianqi = new(qianqiNibianqiController) + +// List 列表 +func (c *qianqiNibianqiController) List(ctx context.Context, req *system.QianqiNibianqiSearchReq) (res *system.QianqiNibianqiSearchRes, err error) { + res, err = service.QianqiNibianqi().List(ctx, req) + return +} + +// Get 获取逆变器 +func (c *qianqiNibianqiController) Get(ctx context.Context, req *system.QianqiNibianqiGetReq) (res *system.QianqiNibianqiGetRes, err error) { + res = new(system.QianqiNibianqiGetRes) + res.QianqiNibianqiInfoRes, err = service.QianqiNibianqi().GetById(ctx, req.Id) + return +} + +// Add 添加逆变器 +func (c *qianqiNibianqiController) Add(ctx context.Context, req *system.QianqiNibianqiAddReq) (res *system.QianqiNibianqiAddRes, err error) { + err = service.QianqiNibianqi().Add(ctx, req) + return +} + +// Edit 修改逆变器 +func (c *qianqiNibianqiController) Edit(ctx context.Context, req *system.QianqiNibianqiEditReq) (res *system.QianqiNibianqiEditRes, err error) { + err = service.QianqiNibianqi().Edit(ctx, req) + return +} + +// Edit 修改逆变器 +func (c *qianqiNibianqiController) EditDetail(ctx context.Context, req *system.QianqiNibianqiEditDetailReq) (res *system.QianqiNibianqiEditDetailRes, err error) { + err = service.QianqiNibianqi().EditDetail(ctx, req) + return +} + +// Delete 删除逆变器 +func (c *qianqiNibianqiController) Delete(ctx context.Context, req *system.QianqiNibianqiDeleteReq) (res *system.QianqiNibianqiDeleteRes, err error) { + err = service.QianqiNibianqi().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/qianqi_pingchang.go b/internal/app/system/controller/qianqi_pingchang.go new file mode 100644 index 0000000..86547ed --- /dev/null +++ b/internal/app/system/controller/qianqi_pingchang.go @@ -0,0 +1,288 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-08 10:08:24 +// 生成路径: internal/app/system/controller/qianqi_pingchang.go +// 生成人:gfast +// desc:平场数据 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "encoding/json" + "errors" + "github.com/gogf/gf/v2/crypto/gmd5" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/api/v1/common/globe" + "github.com/tiger1103/gfast/v3/api/v1/common/shp" + "github.com/tiger1103/gfast/v3/api/v1/common/tool" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tomchavakis/turf-go/constants" + "github.com/tomchavakis/turf-go/measurement" + "math" + "strings" +) + +const MaxNeighborsLen = 8 //最大邻居个数 +type qianqiPingchangController struct { + BaseController +} + +var QianqiPingchang = new(qianqiPingchangController) + +func (c *qianqiPingchangController) PingchangImport(ctx context.Context, req *system.PingchangImportReq) (res *system.UsualRes, err error) { + r := ghttp.RequestFromCtx(ctx) + files := r.GetUploadFiles("file") + names, err := files.Save(globe.SOURCE) + if err != nil { + return nil, err + } + //fmt.Println(names) + prefix := strings.Split(names[0], ".")[0] + + shpfile := globe.SOURCE + "/" + prefix + ".shp" + + err, s := shp.ReadShp(shpfile) + if err != nil { + return nil, err + } + var pcs []system.PC + //name := strings.Split(shpfile, ".")[0] + //导入平场区域时,只处理线部分 + //marshal, err := json.Marshal(s.Polylines) + //if err != nil { + // return nil, err + //} + + for _, v := range s.Polylines { + pc := system.PC{ + ProjectID: req.ProjectID, + PCName: v.Name, + GridWidth: 3, + SHP: shpfile, + } + marshal, err := json.Marshal(v.Positions) + if err != nil { + continue + } + pc.Range = string(marshal) + pc.PcID = gmd5.MustEncryptString(string(marshal)) + count, err := dao.QianqiPingchang.Ctx(ctx).Where(dao.QianqiPingchang.Columns().PcId, pc.PcID).Count() + if err != nil { + continue + } + if count == 0 { + pcs = append(pcs, pc) + } + } + if len(pcs) > 0 { + dao.QianqiPingchang.Ctx(ctx).Insert(&pcs) + } + return +} + +func (c *qianqiPingchangController) PingchangUpdate(ctx context.Context, req *system.PingchangUpdateReq) (res *system.UsualRes, err error) { + var pc system.PC + if len(req.Points) > 0 { + marshal, err := json.Marshal(req.Points) + if err != nil { + return nil, err + } + pc.Points = string(marshal) + } + pc.GridWidth = req.GridWidth + pc.PCName = req.PCName + dao.QianqiPingchang.Ctx(ctx).Where("pc_id", req.PcID).Update(&gdb.Map{ + dao.QianqiPingchang.Columns().PcName: req.PCName, + dao.QianqiPingchang.Columns().GridWidth: req.GridWidth, + dao.QianqiPingchang.Columns().Points: pc.Points, + }) + return +} + +func (c *qianqiPingchangController) PingChangList(ctx context.Context, req *system.PingChangListReq) (res *system.PingChangListRes, err error) { + var pcs []system.PC + dao.QianqiPingchang.Ctx(ctx).Where("project_id", req.ProjectID).Offset((req.Page - 1) * req.PageSize).Limit(req.PageSize).Order("pc_name asc,created_at desc").Scan(&pcs) + res = &system.PingChangListRes{} + for _, v := range pcs { + pc1 := system.PC1{ + ProjectID: v.ProjectID, + PCName: v.PCName, + Progress: v.Progress, + GridWidth: v.GridWidth, + PcID: v.PcID, + Cut: v.Cut, + Fill: v.Fill, + Total: v.Total, + Area: v.Area, + Shp: v.SHP, + } + if len(v.Range) > 0 { + err1 := json.Unmarshal([]byte(v.Range), &pc1.Range) + if err1 != nil { + continue + } + } + pc1.Points = []system.Point{} + if len(v.Points) > 0 { + err2 := json.Unmarshal([]byte(v.Points), &pc1.Points) + if err2 != nil { + continue + } + } + pc1.SmoothPoints = []system.Point{} + if len(v.SmoothPoints) > 0 { + err3 := json.Unmarshal([]byte(v.SmoothPoints), &pc1.SmoothPoints) + if err3 != nil { + continue + } + } + res.Range = append(res.Range, pc1) + } + return +} + +func (c *qianqiPingchangController) PingChangAdd(ctx context.Context, req *system.PingChangAddReq) (res *system.UsualRes, err error) { + marshal, errs := json.Marshal(req.Range) + if errs != nil { + return nil, errs + } + dao.QianqiPingchang.Ctx(ctx).Insert(&system.PC{ + ProjectID: req.ProjectID, + PcID: tool.GetUuid(), + PCName: req.PCName, + GridWidth: req.GridWidth, + Range: string(marshal), + }) + return +} + +func (c *qianqiPingchangController) PingchangDel(ctx context.Context, req *system.PingchangDelReq) (res *system.UsualRes, err error) { + _, err = dao.QianqiPingchang.Ctx(ctx).Unscoped().Delete(dao.QianqiPingchang.Columns().PcId, req.PcID) + return +} +func (c *qianqiPingchangController) PingchangCalculate(ctx context.Context, req *system.PingchangCalculateReq) (res *system.UsualRes, err error) { + pc := &system.PC{} + err = dao.QianqiPingchang.Ctx(ctx).Where(dao.QianqiPingchang.Columns().PcId, req.PcID).Scan(pc) + if err != nil { + return nil, err + } + if pc == nil { + return nil, errors.New("资源不存在") + } + + widthNeighbors := CalNeighbors(req.Locations, float64(pc.GridWidth*math.Sqrt(float64(2)))+2) + /* res = &SHPCreateRes{Points: widthNeighbors} + filename := pcs.PCName + "_" + strconv.Itoa(int(req.GridWidth)) + "m精度" + CreateSHP(widthNeighbors, filename)*/ + //CreateSHP(widthNeighbors, "test") + var smoothPoints []system.Point + for i, v := range widthNeighbors { + var s_p system.Point + s_p.Alt = v.Avrage + s_p.Lng = v.Lng + s_p.Lat = v.Lat + smoothPoints = append(smoothPoints, s_p) + widthNeighbors[i].Neighbors = []system.Point{} + } + marshal, err := json.Marshal(smoothPoints) + if err != nil { + return nil, err + } + locs, err := json.Marshal(req.Locations) + if err != nil { + return nil, err + } + /* _, err = dao.QianqiPingchang.Ctx(ctx).Where(dao.QianqiPingchang.Columns().PcId, req.PcID).Update(&system.PC{ + SmoothPoints: string(marshal), + Points: string(locs), + })*/ + _, err = dao.QianqiPingchang.Ctx(ctx).Where(dao.QianqiPingchang.Columns().PcId, req.PcID).Update(g.Map{ + "smooth_points": string(marshal), + "points": string(locs), + }) + + return +} + +type Point struct { + system.Point + //WeightMap gmap.ListMap `json:"weight_map" dc:"权重表"` + Neighbors []system.Point `json:"neighbors" dc:"相邻的点"` + Avrage float64 `json:"avrage" dc:"区域内的平均高度"` + Total float64 `json:"total" dc:"总高度"` +} + +func CalNeighbors(locations []system.Point, dis float64) []*Point { + var widthNeighbors []*Point + for i, v := range locations { + var point Point + point.Lng = v.Lng + point.Lat = v.Lat + point.Alt = v.Alt + for j, v2 := range locations { + if i != j { + //如果已经最多找到了8个临近点,就不再进行寻找,减少计算量 + if len(point.Neighbors) == MaxNeighborsLen { + break + } + //排除自己,计算与其他点的权重 + distance, err := measurement.Distance(v.Lng, v.Lat, v2.Lng, v2.Lat, constants.UnitMeters) + if err != nil { + continue + } + //如果距离小于网格距离的2倍,代表是邻居 + if distance < dis { + point.Total += v2.Alt + point.Neighbors = append(point.Neighbors, v2) + } + } + } + widthNeighbors = append(widthNeighbors, &point) + } + for i, v := range widthNeighbors { + num := len(v.Neighbors) + if num > 0 { + widthNeighbors[i].Avrage = v.Total / float64(num) + //fmt.Println(i+1, "个点", "总高度", v.Total, "平均高度", widthNeighbors[i].Avrage, "邻居数量", num) + } + } + return widthNeighbors +} + +// +//// List 列表 +//func (c *qianqiPingchangController) List(ctx context.Context, req *system.QianqiPingchangSearchReq) (res *system.QianqiPingchangSearchRes, err error) { +// res, err = service.QianqiPingchang().List(ctx, req) +// return +//} +// +//// Get 获取平场数据 +//func (c *qianqiPingchangController) Get(ctx context.Context, req *system.QianqiPingchangGetReq) (res *system.QianqiPingchangGetRes, err error) { +// res = new(system.QianqiPingchangGetRes) +// res.QianqiPingchangInfoRes, err = service.QianqiPingchang().GetById(ctx, req.Id) +// return +//} +// +//// Add 添加平场数据 +//func (c *qianqiPingchangController) Add(ctx context.Context, req *system.QianqiPingchangAddReq) (res *system.QianqiPingchangAddRes, err error) { +// err = service.QianqiPingchang().Add(ctx, req) +// return +//} +// +//// Edit 修改平场数据 +//func (c *qianqiPingchangController) Edit(ctx context.Context, req *system.QianqiPingchangEditReq) (res *system.QianqiPingchangEditRes, err error) { +// err = service.QianqiPingchang().Edit(ctx, req) +// return +//} +// +//// Delete 删除平场数据 +//func (c *qianqiPingchangController) Delete(ctx context.Context, req *system.QianqiPingchangDeleteReq) (res *system.QianqiPingchangDeleteRes, err error) { +// err = service.QianqiPingchang().Delete(ctx, req.Ids) +// return +//} diff --git a/internal/app/system/controller/qianqi_redline.go b/internal/app/system/controller/qianqi_redline.go new file mode 100644 index 0000000..0002429 --- /dev/null +++ b/internal/app/system/controller/qianqi_redline.go @@ -0,0 +1,77 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-07-31 11:45:12 +// 生成路径: internal/app/system/controller/qianqi_redline.go +// 生成人:gfast +// desc:红线 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type qianqiRedlineController struct { + BaseController +} + +var QianqiRedline = new(qianqiRedlineController) + +// List 列表 +func (c *qianqiRedlineController) List(ctx context.Context, req *system.QianqiRedlineSearchReq) (res *system.QianqiRedlineSearchRes, err error) { + res, err = service.QianqiRedline().List(ctx, req) + return +} + +// Get 获取红线 +func (c *qianqiRedlineController) Get(ctx context.Context, req *system.QianqiRedlineGetReq) (res *system.QianqiRedlineGetRes, err error) { + res = new(system.QianqiRedlineGetRes) + res.QianqiRedlineInfoRes, err = service.QianqiRedline().GetById(ctx, req.Id) + return +} + +// Add 添加红线 +func (c *qianqiRedlineController) Add(ctx context.Context, req *system.QianqiRedlineAddReq) (res *system.QianqiRedlineAddRes, err error) { + err = service.QianqiRedline().Add(ctx, req) + return +} + +// Edit 修改红线 +func (c *qianqiRedlineController) Edit(ctx context.Context, req *system.QianqiRedlineEditReq) (res *system.QianqiRedlineEditRes, err error) { + err = service.QianqiRedline().Edit(ctx, req) + return +} + +// Delete 删除红线 +func (c *qianqiRedlineController) Delete(ctx context.Context, req *system.QianqiRedlineDeleteReq) (res *system.QianqiRedlineDeleteRes, err error) { + err = service.QianqiRedline().Delete(ctx, req.Ids) + return +} + +//func (c *qianqiMoxingController) ReadRedlineFile(ctx context.Context, req *system.ReadFileRedlineReq) (res *system.ReadFileRedlineRes, err error) { +// //1、请求到数据源 +// var infoDate *model.QianqiRedlineInfoRes +// err = dao.QianqiRedline.Ctx(ctx).WherePri(req.Id).Scan(&infoDate) +// //2、解析shp文件内容得到数据 +// name := infoDate.Name +// err, s := shp.ReadShp(name) +// if err != nil { +// return nil, err +// } +// fmt.Println("???????", s.Polylines) +// if len(s.Polylines) > 0 { +// marshal, err := json.Marshal(s.Polylines[0].Positions) +// if err != nil { +// return nil, err +// } +// //3、修改数据进行保存 +// fmt.Println("========", string(marshal)) +// infoDate. +// } +// +// return +//} diff --git a/internal/app/system/controller/qianqi_redline_tudiliuzhuan.go b/internal/app/system/controller/qianqi_redline_tudiliuzhuan.go new file mode 100644 index 0000000..1b22fd9 --- /dev/null +++ b/internal/app/system/controller/qianqi_redline_tudiliuzhuan.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-04 11:47:15 +// 生成路径: internal/app/system/controller/qianqi_redline_tudiliuzhuan.go +// 生成人:gfast +// desc:土地流转 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type qianqiRedlineTudiliuzhuanController struct { + BaseController +} + +var QianqiRedlineTudiliuzhuan = new(qianqiRedlineTudiliuzhuanController) + +// List 列表 +func (c *qianqiRedlineTudiliuzhuanController) List(ctx context.Context, req *system.QianqiRedlineTudiliuzhuanSearchReq) (res *system.QianqiRedlineTudiliuzhuanSearchRes, err error) { + res, err = service.QianqiRedlineTudiliuzhuan().List(ctx, req) + return +} + +// Get 获取土地流转 +func (c *qianqiRedlineTudiliuzhuanController) Get(ctx context.Context, req *system.QianqiRedlineTudiliuzhuanGetReq) (res *system.QianqiRedlineTudiliuzhuanGetRes, err error) { + res = new(system.QianqiRedlineTudiliuzhuanGetRes) + res.QianqiRedlineTudiliuzhuanInfoRes, err = service.QianqiRedlineTudiliuzhuan().GetById(ctx, req.Id) + return +} + +// Add 添加土地流转 +func (c *qianqiRedlineTudiliuzhuanController) Add(ctx context.Context, req *system.QianqiRedlineTudiliuzhuanAddReq) (res *system.QianqiRedlineTudiliuzhuanAddRes, err error) { + err = service.QianqiRedlineTudiliuzhuan().Add(ctx, req) + return +} + +// Edit 修改土地流转 +func (c *qianqiRedlineTudiliuzhuanController) Edit(ctx context.Context, req *system.QianqiRedlineTudiliuzhuanEditReq) (res *system.QianqiRedlineTudiliuzhuanEditRes, err error) { + err = service.QianqiRedlineTudiliuzhuan().Edit(ctx, req) + return +} + +// Delete 删除土地流转 +func (c *qianqiRedlineTudiliuzhuanController) Delete(ctx context.Context, req *system.QianqiRedlineTudiliuzhuanDeleteReq) (res *system.QianqiRedlineTudiliuzhuanDeleteRes, err error) { + err = service.QianqiRedlineTudiliuzhuan().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/qianqi_road.go b/internal/app/system/controller/qianqi_road.go new file mode 100644 index 0000000..3f5fcd5 --- /dev/null +++ b/internal/app/system/controller/qianqi_road.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-04 16:24:38 +// 生成路径: internal/app/system/controller/qianqi_road.go +// 生成人:gfast +// desc:道路 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type qianqiRoadController struct { + BaseController +} + +var QianqiRoad = new(qianqiRoadController) + +// List 列表 +func (c *qianqiRoadController) List(ctx context.Context, req *system.QianqiRoadSearchReq) (res *system.QianqiRoadSearchRes, err error) { + res, err = service.QianqiRoad().List(ctx, req) + return +} + +// Get 获取道路 +func (c *qianqiRoadController) Get(ctx context.Context, req *system.QianqiRoadGetReq) (res *system.QianqiRoadGetRes, err error) { + res = new(system.QianqiRoadGetRes) + res.QianqiRoadInfoRes, err = service.QianqiRoad().GetById(ctx, req.Id) + return +} + +// Add 添加道路 +func (c *qianqiRoadController) Add(ctx context.Context, req *system.QianqiRoadAddReq) (res *system.QianqiRoadAddRes, err error) { + err = service.QianqiRoad().Add(ctx, req) + return +} + +// Edit 修改道路 +func (c *qianqiRoadController) Edit(ctx context.Context, req *system.QianqiRoadEditReq) (res *system.QianqiRoadEditRes, err error) { + err = service.QianqiRoad().Edit(ctx, req) + return +} + +// Delete 删除道路 +func (c *qianqiRoadController) Delete(ctx context.Context, req *system.QianqiRoadDeleteReq) (res *system.QianqiRoadDeleteRes, err error) { + err = service.QianqiRoad().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/qianqi_xiangbian.go b/internal/app/system/controller/qianqi_xiangbian.go new file mode 100644 index 0000000..f5f92dd --- /dev/null +++ b/internal/app/system/controller/qianqi_xiangbian.go @@ -0,0 +1,59 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-07-31 09:52:13 +// 生成路径: internal/app/system/controller/qianqi_xiangbian.go +// 生成人:gfast +// desc:箱变 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type qianqiXiangbianController struct { + BaseController +} + +var QianqiXiangbian = new(qianqiXiangbianController) + +// List 列表 +func (c *qianqiXiangbianController) List(ctx context.Context, req *system.QianqiXiangbianSearchReq) (res *system.QianqiXiangbianSearchRes, err error) { + res, err = service.QianqiXiangbian().List(ctx, req) + return +} + +// Get 获取箱变 +func (c *qianqiXiangbianController) Get(ctx context.Context, req *system.QianqiXiangbianGetReq) (res *system.QianqiXiangbianGetRes, err error) { + res = new(system.QianqiXiangbianGetRes) + res.QianqiXiangbianInfoRes, err = service.QianqiXiangbian().GetById(ctx, req.Id) + return +} + +// Add 添加箱变 +func (c *qianqiXiangbianController) Add(ctx context.Context, req *system.QianqiXiangbianAddReq) (res *system.QianqiXiangbianAddRes, err error) { + err = service.QianqiXiangbian().Add(ctx, req) + return +} + +// Edit 修改箱变 +func (c *qianqiXiangbianController) Edit(ctx context.Context, req *system.QianqiXiangbianEditReq) (res *system.QianqiXiangbianEditRes, err error) { + err = service.QianqiXiangbian().Edit(ctx, req) + return +} + +// Edit 修改箱变 +func (c *qianqiXiangbianController) EditDetail(ctx context.Context, req *system.QianqiXiangbianEditDetailReq) (res *system.QianqiNibianqiEditDetailRes, err error) { + err = service.QianqiXiangbian().EditDetail(ctx, req) + return +} + +// Delete 删除箱变 +func (c *qianqiXiangbianController) Delete(ctx context.Context, req *system.QianqiXiangbianDeleteReq) (res *system.QianqiXiangbianDeleteRes, err error) { + err = service.QianqiXiangbian().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/reminders.go b/internal/app/system/controller/reminders.go new file mode 100644 index 0000000..f9a8d3c --- /dev/null +++ b/internal/app/system/controller/reminders.go @@ -0,0 +1,54 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-05-14 14:55:52 +// 生成路径: internal/app/system/controller/reminders.go +// 生成人:gfast +// desc:App-消息-提醒 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type remindersController struct { + BaseController +} + +var Reminders = new(remindersController) + +// List 列表 +func (c *remindersController) List(ctx context.Context, req *system.RemindersSearchReq) (res *system.RemindersSearchRes, err error) { + res, err = service.Reminders().List(ctx, req) + return +} + +// Get 获取App-消息-提醒 +func (c *remindersController) Get(ctx context.Context, req *system.RemindersGetReq) (res *system.RemindersGetRes, err error) { + res = new(system.RemindersGetRes) + res.RemindersInfoRes, err = service.Reminders().GetById(ctx, req.Id) + return +} + +// Add 添加App-消息-提醒 +func (c *remindersController) Add(ctx context.Context, req *system.RemindersAddReq) (res *system.RemindersAddRes, err error) { + err = service.Reminders().Add(ctx, req) + return +} + +// Edit 修改App-消息-提醒 +func (c *remindersController) Edit(ctx context.Context, req *system.RemindersEditReq) (res *system.RemindersEditRes, err error) { + err = service.Reminders().Edit(ctx, req) + return +} + +// Delete 删除App-消息-提醒 +func (c *remindersController) Delete(ctx context.Context, req *system.RemindersDeleteReq) (res *system.RemindersDeleteRes, err error) { + err = service.Reminders().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/sub_project.go b/internal/app/system/controller/sub_project.go new file mode 100644 index 0000000..abf03cd --- /dev/null +++ b/internal/app/system/controller/sub_project.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-03-21 18:53:15 +// 生成路径: internal/app/system/controller/sub_project.go +// 生成人:gfast +// desc:子项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type subProjectController struct { + BaseController +} + +var SubProject = new(subProjectController) + +// List 列表 +func (c *subProjectController) List(ctx context.Context, req *system.SubProjectSearchReq) (res *system.SubProjectSearchRes, err error) { + res, err = service.SubProject().List(ctx, req) + return +} + +// Get 获取子项目 +func (c *subProjectController) Get(ctx context.Context, req *system.SubProjectGetReq) (res *system.SubProjectGetRes, err error) { + res = new(system.SubProjectGetRes) + res.SubProjectInfoRes, err = service.SubProject().GetById(ctx, req.Id) + return +} + +// Add 添加子项目 +func (c *subProjectController) Add(ctx context.Context, req *system.SubProjectAddReq) (res *system.SubProjectAddRes, err error) { + err = service.SubProject().Add(ctx, req) + return +} + +// Edit 修改子项目 +func (c *subProjectController) Edit(ctx context.Context, req *system.SubProjectEditReq) (res *system.SubProjectEditRes, err error) { + err = service.SubProject().Edit(ctx, req) + return +} + +// Delete 删除子项目 +func (c *subProjectController) Delete(ctx context.Context, req *system.SubProjectDeleteReq) (res *system.SubProjectDeleteRes, err error) { + err = service.SubProject().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/sys_auth_rule.go b/internal/app/system/controller/sys_auth_rule.go new file mode 100644 index 0000000..59141fc --- /dev/null +++ b/internal/app/system/controller/sys_auth_rule.go @@ -0,0 +1,79 @@ +/* +* @desc:菜单 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/16 10:36 + */ + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +var Menu = menuController{} + +type menuController struct { + BaseController +} + +func (c *menuController) List(ctx context.Context, req *system.RuleSearchReq) (res *system.RuleListRes, err error) { + var list []*model.SysAuthRuleInfoRes + res = &system.RuleListRes{ + Rules: make([]*model.SysAuthRuleTreeRes, 0), + } + list, err = service.SysAuthRule().GetMenuListSearch(ctx, req) + if req.Title != "" || req.Component != "" { + for _, menu := range list { + res.Rules = append(res.Rules, &model.SysAuthRuleTreeRes{ + SysAuthRuleInfoRes: menu, + }) + } + } else { + res.Rules = service.SysAuthRule().GetMenuListTree(0, list) + } + return +} + +func (c *menuController) Add(ctx context.Context, req *system.RuleAddReq) (res *system.RuleAddRes, err error) { + err = service.SysAuthRule().Add(ctx, req) + return +} + +// GetAddParams 获取菜单添加及编辑相关参数 +func (c *menuController) GetAddParams(ctx context.Context, req *system.RuleGetParamsReq) (res *system.RuleGetParamsRes, err error) { + // 获取角色列表 + res = new(system.RuleGetParamsRes) + res.Roles, err = service.SysRole().GetRoleList(ctx) + if err != nil { + return + } + res.Menus, err = service.SysAuthRule().GetIsMenuList(ctx) + return +} + +// Get 获取菜单信息 +func (c *menuController) Get(ctx context.Context, req *system.RuleInfoReq) (res *system.RuleInfoRes, err error) { + res = new(system.RuleInfoRes) + res.Rule, err = service.SysAuthRule().Get(ctx, req.Id) + if err != nil { + return + } + res.RoleIds, err = service.SysAuthRule().GetMenuRoles(ctx, req.Id) + return +} + +// Update 菜单修改 +func (c *menuController) Update(ctx context.Context, req *system.RuleUpdateReq) (res *system.RuleUpdateRes, err error) { + err = service.SysAuthRule().Update(ctx, req) + return +} + +// Delete 删除菜单 +func (c *menuController) Delete(ctx context.Context, req *system.RuleDeleteReq) (res *system.RuleDeleteRes, err error) { + err = service.SysAuthRule().DeleteMenuByIds(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/sys_config.go b/internal/app/system/controller/sys_config.go new file mode 100644 index 0000000..081478b --- /dev/null +++ b/internal/app/system/controller/sys_config.go @@ -0,0 +1,51 @@ +/* +* @desc:系统参数配置 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/4/18 21:17 + */ + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + commonService "github.com/tiger1103/gfast/v3/internal/app/common/service" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +var Config = configController{} + +type configController struct { + BaseController +} + +// List 系统参数列表 +func (c *configController) List(ctx context.Context, req *system.ConfigSearchReq) (res *system.ConfigSearchRes, err error) { + res, err = commonService.SysConfig().List(ctx, req) + return +} + +// Add 添加系统参数 +func (c *configController) Add(ctx context.Context, req *system.ConfigAddReq) (res *system.ConfigAddRes, err error) { + err = commonService.SysConfig().Add(ctx, req, service.Context().GetUserId(ctx)) + return +} + +// Get 获取系统参数 +func (c *configController) Get(ctx context.Context, req *system.ConfigGetReq) (res *system.ConfigGetRes, err error) { + res, err = commonService.SysConfig().Get(ctx, req.Id) + return +} + +// Edit 修改系统参数 +func (c *configController) Edit(ctx context.Context, req *system.ConfigEditReq) (res *system.ConfigEditRes, err error) { + err = commonService.SysConfig().Edit(ctx, req, service.Context().GetUserId(ctx)) + return +} + +// Delete 删除系统参数 +func (c *configController) Delete(ctx context.Context, req *system.ConfigDeleteReq) (res *system.ConfigDeleteRes, err error) { + err = commonService.SysConfig().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/sys_dept.go b/internal/app/system/controller/sys_dept.go new file mode 100644 index 0000000..b7b993c --- /dev/null +++ b/internal/app/system/controller/sys_dept.go @@ -0,0 +1,60 @@ +/* +* @desc:部门管理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/4/6 15:15 + */ + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +var Dept = sysDeptController{} + +type sysDeptController struct { + BaseController +} + +// List 部门列表 +func (c *sysDeptController) List(ctx context.Context, req *system.DeptSearchReq) (res *system.DeptSearchRes, err error) { + res = new(system.DeptSearchRes) + res.DeptList, err = service.SysDept().GetList(ctx, req) + return +} + +// Add 添加部门 +func (c *sysDeptController) Add(ctx context.Context, req *system.DeptAddReq) (res *system.DeptAddRes, err error) { + err = service.SysDept().Add(ctx, req) + return +} + +// Edit 修改部门 +func (c *sysDeptController) Edit(ctx context.Context, req *system.DeptEditReq) (res *system.DeptEditRes, err error) { + err = service.SysDept().Edit(ctx, req) + return +} + +// Delete 删除部门 +func (c *sysDeptController) Delete(ctx context.Context, req *system.DeptDeleteReq) (res *system.DeptDeleteRes, err error) { + err = service.SysDept().Delete(ctx, req.Id) + return +} + +// TreeSelect 获取部门数据结构数据 +func (c *sysDeptController) TreeSelect(ctx context.Context, req *system.DeptTreeSelectReq) (res *system.DeptTreeSelectRes, err error) { + var deptList []*entity.SysDept + deptList, err = service.SysDept().GetList(ctx, &system.DeptSearchReq{ + Status: "1", //正常状态数据 + }) + if err != nil { + return + } + res = new(system.DeptTreeSelectRes) + res.Deps = service.SysDept().GetListTree(0, deptList) + return +} diff --git a/internal/app/system/controller/sys_dict_data.go b/internal/app/system/controller/sys_dict_data.go new file mode 100644 index 0000000..98d4f68 --- /dev/null +++ b/internal/app/system/controller/sys_dict_data.go @@ -0,0 +1,55 @@ +/* +* @desc:字典数据管理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/18 11:57 + */ + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + commonService "github.com/tiger1103/gfast/v3/internal/app/common/service" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +var DictData = dictDataController{} + +type dictDataController struct { +} + +// GetDictData 获取字典数据 +func (c *dictDataController) GetDictData(ctx context.Context, req *system.GetDictReq) (res *system.GetDictRes, err error) { + res, err = commonService.SysDictData().GetDictWithDataByType(ctx, req) + return +} + +// List 获取字典数据列表 +func (c *dictDataController) List(ctx context.Context, req *system.DictDataSearchReq) (res *system.DictDataSearchRes, err error) { + res, err = commonService.SysDictData().List(ctx, req) + return +} + +// Add 添加字典数据 +func (c *dictDataController) Add(ctx context.Context, req *system.DictDataAddReq) (res *system.DictDataAddRes, err error) { + err = commonService.SysDictData().Add(ctx, req, service.Context().GetUserId(ctx)) + return +} + +// Get 获取对应的字典数据 +func (c *dictDataController) Get(ctx context.Context, req *system.DictDataGetReq) (res *system.DictDataGetRes, err error) { + res, err = commonService.SysDictData().Get(ctx, req.DictCode) + return +} + +// Edit 修改字典数据 +func (c *dictDataController) Edit(ctx context.Context, req *system.DictDataEditReq) (res *system.DictDataEditRes, err error) { + err = commonService.SysDictData().Edit(ctx, req, service.Context().GetUserId(ctx)) + return +} + +func (c *dictDataController) Delete(ctx context.Context, req *system.DictDataDeleteReq) (res *system.DictDataDeleteRes, err error) { + err = commonService.SysDictData().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/sys_dict_type.go b/internal/app/system/controller/sys_dict_type.go new file mode 100644 index 0000000..e10d324 --- /dev/null +++ b/internal/app/system/controller/sys_dict_type.go @@ -0,0 +1,57 @@ +/* +* @desc:字典类型 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/18 11:57 + */ + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + commonService "github.com/tiger1103/gfast/v3/internal/app/common/service" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +var DictType = &SysDictTypeController{} + +type SysDictTypeController struct { +} + +// List 字典类型列表 +func (c *SysDictTypeController) List(ctx context.Context, req *system.DictTypeSearchReq) (res *system.DictTypeSearchRes, err error) { + res, err = commonService.SysDictType().List(ctx, req) + return +} + +// Add 添加字典类型 +func (c *SysDictTypeController) Add(ctx context.Context, req *system.DictTypeAddReq) (res *system.DictTypeAddRes, err error) { + err = commonService.SysDictType().Add(ctx, req, service.Context().GetUserId(ctx)) + return +} + +// Get 获取字典类型 +func (c *SysDictTypeController) Get(ctx context.Context, req *system.DictTypeGetReq) (res *system.DictTypeGetRes, err error) { + res = new(system.DictTypeGetRes) + res.DictType, err = commonService.SysDictType().Get(ctx, req) + return +} + +// Edit 修改字典数据 +func (c *SysDictTypeController) Edit(ctx context.Context, req *system.DictTypeEditReq) (res *system.DictTypeEditRes, err error) { + err = commonService.SysDictType().Edit(ctx, req, service.Context().GetUserId(ctx)) + return +} + +func (c *SysDictTypeController) Delete(ctx context.Context, req *system.DictTypeDeleteReq) (res *system.DictTypeDeleteRes, err error) { + err = commonService.SysDictType().Delete(ctx, req.DictIds) + return +} + +// OptionSelect 获取字典选择框列表 +func (c *SysDictTypeController) OptionSelect(ctx context.Context, req *system.DictTypeAllReq) (res *system.DictTYpeAllRes, err error) { + res = new(system.DictTYpeAllRes) + res.DictType, err = commonService.SysDictType().GetAllDictType(ctx) + return +} diff --git a/internal/app/system/controller/sys_file.go b/internal/app/system/controller/sys_file.go new file mode 100644 index 0000000..5d271a5 --- /dev/null +++ b/internal/app/system/controller/sys_file.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-07-29 15:32:09 +// 生成路径: internal/app/system/controller/sys_file.go +// 生成人:gfast +// desc:文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type sysFileController struct { + BaseController +} + +var SysFile = new(sysFileController) + +// List 列表 +func (c *sysFileController) List(ctx context.Context, req *system.SysFileSearchReq) (res *system.SysFileSearchRes, err error) { + res, err = service.SysFile().List(ctx, req) + return +} + +// Get 获取文件 +func (c *sysFileController) Get(ctx context.Context, req *system.SysFileGetReq) (res *system.SysFileGetRes, err error) { + res = new(system.SysFileGetRes) + res.SysFileInfoRes, err = service.SysFile().GetByFileId(ctx, req.FileId) + return +} + +// Add 添加文件 +func (c *sysFileController) Add(ctx context.Context, req *system.SysFileAddReq) (res *system.SysFileAddRes, err error) { + err = service.SysFile().Add(ctx, req) + return +} + +// Edit 修改文件 +func (c *sysFileController) Edit(ctx context.Context, req *system.SysFileEditReq) (res *system.SysFileEditRes, err error) { + err = service.SysFile().Edit(ctx, req) + return +} + +// Delete 删除文件 +func (c *sysFileController) Delete(ctx context.Context, req *system.SysFileDeleteReq) (res *system.SysFileDeleteRes, err error) { + err = service.SysFile().Delete(ctx, req.FileIds) + return +} diff --git a/internal/app/system/controller/sys_file_type.go b/internal/app/system/controller/sys_file_type.go new file mode 100644 index 0000000..896780d --- /dev/null +++ b/internal/app/system/controller/sys_file_type.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-07-29 15:27:54 +// 生成路径: internal/app/system/controller/sys_file_type.go +// 生成人:gfast +// desc:文件类型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type sysFileTypeController struct { + BaseController +} + +var SysFileType = new(sysFileTypeController) + +// List 列表 +func (c *sysFileTypeController) List(ctx context.Context, req *system.SysFileTypeSearchReq) (res *system.SysFileTypeSearchRes, err error) { + res, err = service.SysFileType().List(ctx, req) + return +} + +// Get 获取文件类型 +func (c *sysFileTypeController) Get(ctx context.Context, req *system.SysFileTypeGetReq) (res *system.SysFileTypeGetRes, err error) { + res = new(system.SysFileTypeGetRes) + res.SysFileTypeInfoRes, err = service.SysFileType().GetById(ctx, req.Id) + return +} + +// Add 添加文件类型 +func (c *sysFileTypeController) Add(ctx context.Context, req *system.SysFileTypeAddReq) (res *system.SysFileTypeAddRes, err error) { + err = service.SysFileType().Add(ctx, req) + return +} + +// Edit 修改文件类型 +func (c *sysFileTypeController) Edit(ctx context.Context, req *system.SysFileTypeEditReq) (res *system.SysFileTypeEditRes, err error) { + err = service.SysFileType().Edit(ctx, req) + return +} + +// Delete 删除文件类型 +func (c *sysFileTypeController) Delete(ctx context.Context, req *system.SysFileTypeDeleteReq) (res *system.SysFileTypeDeleteRes, err error) { + err = service.SysFileType().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/sys_job.go b/internal/app/system/controller/sys_job.go new file mode 100644 index 0000000..ded3f8b --- /dev/null +++ b/internal/app/system/controller/sys_job.go @@ -0,0 +1,82 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-01-12 17:43:50 +// 生成路径: internal/app/system/controller/sys_job.go +// 生成人:gfast +// desc:定时任务 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type sysJobController struct { + BaseController +} + +var SysJob = new(sysJobController) + +// List 列表 +func (c *sysJobController) List(ctx context.Context, req *system.SysJobSearchReq) (res *system.SysJobSearchRes, err error) { + res, err = service.SysJob().List(ctx, req) + return +} + +// Get 获取定时任务 +func (c *sysJobController) Get(ctx context.Context, req *system.SysJobGetReq) (res *system.SysJobGetRes, err error) { + res = new(system.SysJobGetRes) + res.SysJobInfoRes, err = service.SysJob().GetByJobId(ctx, req.JobId) + return +} + +// Add 添加定时任务 +func (c *sysJobController) Add(ctx context.Context, req *system.SysJobAddReq) (res *system.SysJobAddRes, err error) { + err = service.SysJob().Add(ctx, req) + return +} + +// Edit 修改定时任务 +func (c *sysJobController) Edit(ctx context.Context, req *system.SysJobEditReq) (res *system.SysJobEditRes, err error) { + err = service.SysJob().Edit(ctx, req) + return +} + +// Delete 删除定时任务 +func (c *sysJobController) Delete(ctx context.Context, req *system.SysJobDeleteReq) (res *system.SysJobDeleteRes, err error) { + err = service.SysJob().Delete(ctx, req.JobIds) + return +} + +// Start 启动任务 +func (c *sysJobController) Start(ctx context.Context, req *system.SysJobStartReq) (res *system.SysJobStartRes, err error) { + err = service.SysJob().Start(ctx, req.JobId) + return +} + +// Stop 停止任务 +func (c *sysJobController) Stop(ctx context.Context, req *system.SysJobStopReq) (res *system.SysJobStopRes, err error) { + err = service.SysJob().Stop(ctx, req.JobId) + return +} + +// Run 运行任务 +func (c *sysJobController) Run(ctx context.Context, req *system.SysJobRunReq) (res *system.SysJobRunRes, err error) { + err = service.SysJob().Run(ctx, req.JobId) + return +} + +// Log 获取执行日志列表 +func (c *sysJobController) Log(ctx context.Context, req *system.SysJobLogListReq) (res *system.SysJobLogListRes, err error) { + res, err = service.SysJobLog().List(ctx, req) + return +} + +func (c *sysJobController) LogDelete(ctx context.Context, req *system.SysJobLogDeleteReq) (res *system.SysJobLogDeleteRes, err error) { + err = service.SysJobLog().Delete(ctx, req.LogIds) + return +} diff --git a/internal/app/system/controller/sys_login.go b/internal/app/system/controller/sys_login.go new file mode 100644 index 0000000..6dc9a48 --- /dev/null +++ b/internal/app/system/controller/sys_login.go @@ -0,0 +1,506 @@ +/* +* @desc:登录 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/4/27 21:52 + */ + +package controller + +import ( + "context" + "database/sql" + "errors" + "fmt" + "regexp" + + "github.com/bwmarrin/snowflake" + "github.com/gogf/gf/v2/crypto/gmd5" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/gogf/gf/v2/util/gmode" + "github.com/gogf/gf/v2/util/grand" + "github.com/jinzhu/copier" + "github.com/samber/lo" + "github.com/tiger1103/gfast/v3/api/v1/system" + commonService "github.com/tiger1103/gfast/v3/internal/app/common/service" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/internal/consts" + "github.com/tiger1103/gfast/v3/library/libUtils" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/tiger1103/gfast/v3/third/ys7" + + logic "github.com/tiger1103/gfast/v3/internal/app/wxApplet/logic/busConstructionUser" +) + +var Login = loginController{} + +type loginController struct { + BaseController +} + +func (c *loginController) Login(ctx context.Context, req *system.UserLoginReq) (res *system.UserLoginRes, err error) { + var ( + user *model.LoginUserRes + token string + permissions []string + menuList []*model.UserMenus + ) + // 判断验证码是否正确 + debug := gmode.IsDevelop() + if !debug { + if !commonService.Captcha().VerifyString(req.VerifyKey, req.VerifyCode) { + err = gerror.New("验证码输入错误") + return + } + } + ip := libUtils.GetClientIp(ctx) + userAgent := libUtils.GetUserAgent(ctx) + user, err = service.SysUser().GetAdminUserByUsernamePassword(ctx, req) + if err != nil { + // 保存登录失败的日志信息 + service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{ + Status: 0, + Username: req.Username, + Ip: ip, + UserAgent: userAgent, + Msg: err.Error(), + Module: "系统后台", + }) + return + } + err = service.SysUser().UpdateLoginInfo(ctx, user.Id, ip) + if err != nil { + return + } + // 报存登录成功的日志信息 + service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{ + Status: 1, + Username: req.Username, + Ip: ip, + UserAgent: userAgent, + Msg: "登录成功", + Module: "系统后台", + }) + key := gconv.String(user.Id) + "-" + gmd5.MustEncryptString(user.UserName) + gmd5.MustEncryptString(user.UserPassword) + if g.Cfg().MustGet(ctx, "gfToken.multiLogin").Bool() { + key = gconv.String(user.Id) + "-" + gmd5.MustEncryptString(user.UserName) + gmd5.MustEncryptString(user.UserPassword+ip+userAgent) + } + user.UserPassword = "" + token, err = service.GfToken().GenerateToken(ctx, key, user) + if err != nil { + g.Log().Error(ctx, err) + err = gerror.New("登录失败,后端服务出现错误") + return + } + // 获取用户菜单数据 + menuList, permissions, err = service.SysUser().GetAdminRules(ctx, user.Id) + if err != nil { + return + } + res = &system.UserLoginRes{ + UserInfo: user, + Token: token, + MenuList: menuList, + Permissions: permissions, + } + // 用户在线状态保存 + service.SysUserOnline().Invoke(ctx, &model.SysUserOnlineParams{ + UserAgent: userAgent, + Uuid: gmd5.MustEncrypt(token), + Token: token, + Username: user.UserName, + Ip: ip, + }) + + return +} + +// LoginOut 退出登录 +func (c *loginController) LoginOut(ctx context.Context, req *system.UserLoginOutReq) (res *system.UserLoginOutRes, err error) { + err = service.GfToken().RemoveToken(ctx, service.GfToken().GetRequestToken(g.RequestFromCtx(ctx))) + return +} + +// AppLogin App 登录 +func (c *loginController) AppLogin(ctx context.Context, req *system.AppLoginReq) (*system.AppLoginRes, error) { + // 为了公用后台登录方法,将 AppLoginReq 中的字段数据拷贝到 UserLoginReq 中 + loginCopy := &system.UserLoginReq{} + copier.Copy(&loginCopy, req) + + // 判断 UserName 是否是手机号 + if isPhoneNumber(req.Username) { + ctx = context.WithValue(ctx, "mobile", req.Username) + } + + // 因为是 App 登录,需要公用原本的后台登录方法 + // 所以需要传递 is_app 作为标识,给后续获取功能菜单列表使用 + ctx = context.WithValue(ctx, "is_app", true) + + // 获取用户信息 + userInfo, err := service.SysUser().GetAdminUserByUsernamePassword(ctx, loginCopy) + if err != nil { + return nil, err + } + + // 获取用户的 IP 和 UserAgent + ip := libUtils.GetClientIp(ctx) + userAgent := libUtils.GetUserAgent(ctx) + + var key string + // baseKey 由用户ID和用户名组合而成,之后通过MD5加密 + baseKey := gconv.String(userInfo.Id) + "-" + gmd5.MustEncryptString(userInfo.UserName) + // 根据配置决定是否允许多地登录 + if g.Cfg().MustGet(ctx, "gfToken.multiLogin").Bool() { + // 如果允许多地登录,key将包括用户密码、IP和用户代理信息的MD5加密串 + key = baseKey + gmd5.MustEncryptString(userInfo.UserPassword+ip+userAgent) + } else { + // 如果不允许多地登录,key仅包括用户密码的MD5加密串 + key = baseKey + gmd5.MustEncryptString(userInfo.UserPassword) + } + + // 获取该用户对应的微信小程序 OpenID + userOpenID, err := dao.BusConstructionUser.Ctx(ctx). + Where(dao.BusConstructionUser.Columns().Phone, userInfo.Mobile). + Fields(dao.BusConstructionUser.Columns().Openid).Value() + openID := userOpenID.String() + + userInfo.UserPassword = "" + userInfo.UserSalt = "" + userInfo.OpenId = openID // 微信小程序 OpenID + + // 生成 Token + token, err := service.GfToken().GenerateToken(ctx, key, userInfo) + if err != nil { + return nil, fmt.Errorf("生成 token 失败:%w", err) + } + + // 获取用户的菜单和权限 + menuList, permissions, err := service.SysUser().GetAdminRules(ctx, userInfo.Id) + if err != nil { + return nil, fmt.Errorf("获取用户菜单和权限失败:%w", err) + } + + return &system.AppLoginRes{ + Token: token, // Jwt Token + AccessToken: ys7.Ys72Instance.GetAccessToken(), // 萤石云 AccessToken + UserInfo: userInfo, // 用户信息 + MenuList: menuList, // 菜单列表 + OpenID: openID, // 微信小程序 OpenID + Permissions: permissions, // 原本 PC 权限列表 + }, nil +} + +// AppCreateUser 注册用户 +func (c *loginController) AppCreateUser(ctx context.Context, req *system.AppCreateUserReq) (*system.AppCreateUserRes, error) { + // 判断手机号是否已经注册 + if err := service.SysUser().UserNameOrMobileExists(ctx, req.Mobile, req.Mobile); err != nil { + return nil, err + } + + userSalt := grand.S(10) // 生成 10 位随机字符串作为盐值 + password := libUtils.EncryptPassword(req.Password, userSalt) // 加密密码 + + var id int64 + var openid string + err := g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err := g.Try(ctx, func(ctx context.Context) { + // 在 sys_user 中新增用户 + userID, err := dao.SysUser.Ctx(ctx).TX(tx).InsertAndGetId(do.SysUser{ + Mobile: req.Mobile, // 手机号 + UserPassword: password, // 密码 + UserSalt: userSalt, // 盐值 + IsAdmin: 0, // 非管理员 + }) + liberr.ErrIsNil(ctx, err, "新增用户失败") + + // 将用户添加到 [施工人员] 菜单角色中 + _, err = dao.AppUserRoles.Ctx(ctx).Insert(do.AppUserRoles{ + UserId: userID, + RoleId: consts.PostConstruction, // 施工人员 + MajorRole: 1, + }) + liberr.ErrIsNil(ctx, err, "将用户添加到施工人员角色失败") + + // 获取用户在小程序中的信息 + busConstructionUser := &entity.BusConstructionUser{} + if err := dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().Phone, req.Mobile).Scan(&busConstructionUser); errors.Is(err, sql.ErrNoRows) { + busConstructionUser = nil + } + + if busConstructionUser == nil { // 如果该用户在小程序中不存在 + node, err := snowflake.NewNode(1) + liberr.ErrIsNil(ctx, err, "初始化 snowflake 失败") + + // 生成一个 Fake OpenID + openID := node.Generate().Base64() + + // 保证生成的 OpenID 在 bus_construction_user 表中唯一 + _, err = lo.Attempt(3, func(_ int) error { + exist, err := dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().Openid, openID).Count() + if err != nil { + openID = node.Generate().Base64() + return err + } + + if exist > 0 { + openID = node.Generate().Base64() + return errors.New("OpenID 已存在") + } + + return nil + }) + liberr.ErrIsNil(ctx, err, "生成 OpenID 失败") + + // 将用户信息插入到小程序的表中 + busUserId, err := dao.BusConstructionUser.Ctx(ctx).TX(tx).Where(dao.BusConstructionUser.Columns().Phone, req.Mobile). + Data(do.BusConstructionUser{ + Openid: openID, // OpenID + Phone: req.Mobile, // 手机号 + ProjectRecord: 2, + WxOrPc: 3, + Subscription: 2, + }).InsertAndGetId() + liberr.ErrIsNil(ctx, err, "新增小程序用户失败") + busConstructionUser = &entity.BusConstructionUser{ + Id: busUserId, + Openid: openID, + } + + err = logic.InitializationDataFunc(ctx, busUserId) // 为用户初始化实名数据 + liberr.ErrIsNil(ctx, err, "为用户初始化身份证数据失败") + } else { // 如果该用户在小程序中已存在 + // 为 sys_user 表中的用户更新用户名 + userName := busConstructionUser.UserName // 优先使用真实姓名 + if userName == "" { + userName = busConstructionUser.NickName // 其次使用昵称 + } + if userName != "" { + _, err = dao.SysUser.Ctx(ctx).TX(tx).Where(dao.SysUser.Columns().Id, userID). + Data(dao.SysUser.Columns().UserNickname, userName).Update() + liberr.ErrIsNil(ctx, err, "更新用户名失败") + } + + // 为用户新增历史项目新闻和公告 + // 根据小程序中已绑定的 "项目ID" 查询项目新闻和公告 + notificationList := []entity.Notifications{} + err = dao.Notifications.Ctx(ctx).Where(dao.Notifications.Columns().ProjectId, busConstructionUser.ProjectId). + WhereNot(dao.Notifications.Columns().IsApp, 0).Scan(¬ificationList) + liberr.ErrIsNil(ctx, err, "查询项目新闻和公告失败") + + // 新增历史项目新闻和公告 + notificationRecipients := make([]do.NotificationRecipients, 0, len(notificationList)) + for i := 0; i < len(notificationList); i++ { + notification := notificationList[i] + notificationRecipients = append(notificationRecipients, do.NotificationRecipients{ + NotificationId: notification.Id, // 通知 ID + RecipientId: userID, // 接收者 ID + NotificationStatus: 0, // 未读 + }) + } + + if len(notificationRecipients) > 0 { + // 插入历史项目新闻和公告 + _, err = dao.NotificationRecipients.Ctx(ctx).TX(tx).Insert(notificationRecipients) + liberr.ErrIsNil(ctx, err, "新增历史公告和新闻失败") + } + } + id = busConstructionUser.Id + openid = busConstructionUser.Openid + }) + return err + }) + + return &system.AppCreateUserRes{Id: id, Openid: openid}, err +} + +// AppUpdatePwd 修改用户密码 +func (c *loginController) AppUpdatePwd(ctx context.Context, req *system.AppUpdatePwdReq) (*system.AppUpdatePwdRes, error) { + // 获取用户信息 + userInfo, err := service.SysUser().GetUserById(ctx, ct.New().GetUserId(ctx)) + if err != nil { + return nil, fmt.Errorf("获取用户信息失败:%w", err) + } + + // 判断原始密码是否正确 + if libUtils.EncryptPassword(req.Password, userInfo.UserSalt) != userInfo.UserPassword { + return nil, fmt.Errorf("原始密码错误") + } + + // 账号状态 + if userInfo.UserStatus == 0 { + return nil, fmt.Errorf("账号已被冻结") + } + + // 加密新密码 + newPassword := libUtils.EncryptPassword(req.NewPassword, userInfo.UserSalt) + + // 更新密码 + _, err = dao.SysUser.Ctx(ctx).Where(dao.SysUser.Columns().Id, userInfo.Id).Data(dao.SysUser.Columns().UserPassword, newPassword).Update() + if err != nil { + return nil, fmt.Errorf("更新密码失败:%w", err) + } + + return &system.AppUpdatePwdRes{}, nil +} + +// AppCheckToken 检查 Token 是否有效 +func (c *loginController) AppCheckToken(ctx context.Context, req *system.AppCheckTokenReq) (*system.AppCheckTokenRes, error) { + // 判断 Token 是否有效 + isValid, _ := service.GfToken().IsLogin(g.RequestFromCtx(ctx)) + if !isValid { + return &system.AppCheckTokenRes{IsValid: 0}, nil + } + + return &system.AppCheckTokenRes{IsValid: 1}, nil +} + +// GetUserInfo 获取用户信息 +func (c *loginController) GetUserInfo(ctx context.Context, req *system.AppGetUserInfoReq) (*system.AppGetUserInfoRes, error) { + // 获取用户信息 + user := ct.New().Get(ctx).User + + // 获取手机号 + mobile := user.Mobile + if mobile == "" { + return nil, fmt.Errorf("并未绑定手机号") + } + + err := g.Try(ctx, func(ctx context.Context) { + exist, err := dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().Phone, mobile).Count() + liberr.ErrIsNil(ctx, err, "查询用户是否存在错误") + if exist == 0 { + openID, err := libUtils.GetFakeOpenID() + if err != nil { + return + } + + busUserId, err := dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().Phone, mobile). + Data(do.BusConstructionUser{ + Openid: openID, + Phone: mobile, + ProjectRecord: 2, + WxOrPc: 3, + Subscription: 2, + }).InsertAndGetId() + liberr.ErrIsNil(ctx, err, "新增 bus_construction_user 失败") + + err = logic.InitializationDataFunc(ctx, busUserId) // 为用户初始化实名数据 + liberr.ErrIsNil(ctx, err, "为用户初始化身份证数据失败") + } + }) + liberr.ErrIsNil(ctx, err, "查询手机号是否存在失败") + + // 查询用户信息 + var userInfo model.AppUserInfo + dao.BusConstructionUser.Ctx(ctx).As("bu"). + Fields(`bu.openid,bu.head_icon, bu.nick_name,bu.user_name,bu.sfz_number, bu.phone, bu.sex, bu.status, bu.entry_date, bu.leave_date, bu.team_id, sptm.post_id, sp.project_name,sp.id, bl.name AS constructionUnitName, sdd.dict_label, + spt.name AS team,sp.lng,sp.lat,CASE WHEN ua.user_id IS NULL THEN '1' ELSE '0' END AS is_new_user`). + LeftJoin("sys_project AS sp", "bu.project_id = sp.id AND sp.deleted_at IS NULL"). + LeftJoin("bus_labourservice as bl", "bu.labourservice_id = bl.id AND bl.deleted_at IS NULL"). + LeftJoin("sys_dict_data AS sdd", "bu.type_of_work = sdd.dict_value AND sdd.dict_type = 'type_of_work'"). + LeftJoin("sys_project_team AS spt", "bu.team_id = spt.id AND spt.deleted_at IS NULL"). + LeftJoin("user_activity as ua", fmt.Sprintf("%d = ua.user_id", user.Id)). + LeftJoin("sys_project_team_member as sptm", "bu.openid = sptm.openid and sptm.deleted_at IS NULL"). + Where("bu.phone", mobile).WhereNull("bu.deleted_at").Unscoped().Scan(&userInfo) + + // 判断是否为新用户 + if userInfo.IsNewUser == 1 { + _, err := dao.UserActivity.Ctx(ctx).Where(dao.UserActivity.Columns().UserId, ct.New().Get(ctx).User.Id). + Data(do.UserActivity{ + UserId: user.Id, + }).Insert() + liberr.ErrIsNil(ctx, err, "更新用户是否为新用户的状态失败") + } + + res := &system.AppGetUserInfoRes{ + UserID: ct.New().Get(ctx).User.Id, + } + copier.Copy(&res, &userInfo) + + return res, nil +} + +func isPhoneNumber(str string) bool { + re := regexp.MustCompile(`^1[3-9]\d{9}$`) + return re.MatchString(str) +} + +// UpdateAvatar 修改用户头像 +func (c *loginController) UpdateAvatar(ctx context.Context, req *system.AppUpdateAvatarReq) (*system.AppUpdateAvatarRes, error) { + // 获取手机号 + mobile := ct.New().Get(ctx).User.Mobile + + // 更新 + g.Try(ctx, func(ctx context.Context) { + _, err := dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().Phone, mobile). + Data(do.BusConstructionUser{ + HeadIcon: req.Image, + }).Update() + liberr.ErrIsNil(ctx, err, "更新头像失败") + }) + + return &system.AppUpdateAvatarRes{}, nil +} + +// AppUserType 用户是否拥有 PC 端管理员权限或仅为施工人员 +func (c *loginController) AppUserType(ctx context.Context, req *system.AppUserTypeReq) (*system.AppUserTypeRes, error) { + // 获取用户信息 + user := ct.New().Get(ctx).User + + if user == nil { + return nil, fmt.Errorf("用户信息为空") + } + + var roles []int + + // 如果用户在施工人员菜单中拥有任意一个角色,则为数组添加 1。 如果在管理员菜单中拥有任意一个角色,则为数组添加 0 + var userRoles []entity.AppUserRoles + if err := dao.AppUserRoles.Ctx(ctx).Where(dao.AppUserRoles.Columns().UserId, user.Id). + WhereIn(dao.AppUserRoles.Columns().MajorRole, []int{0, 1}). + Scan(&userRoles); err != nil { + return nil, fmt.Errorf("查询用户角色失败:%w", err) + } + + for _, role := range userRoles { + if role.MajorRole == 1 { + roles = append(roles, 1) + } + + if role.MajorRole == 0 { + roles = append(roles, 0) + } + } + + return &system.AppUserTypeRes{ + UserType: lo.Uniq(roles), + }, nil +} + +// GetUserRole 获取用户角色 +func (c *loginController) GetUserRole(ctx context.Context, req *system.AppGetUserRoleReq) (*system.AppGetUserRoleRes, error) { + // 获取用户信息 + user := ct.New().Get(ctx).User + + var roles []int + + // 获取用户角色 + roleIds, err := service.SysUser().GetAdminRoleIds(ctx, user.Id) + if err != nil { + return nil, fmt.Errorf("获取用户角色失败:%w", err) + } + + // 判断是否拥有 [管理员] 角色,如果有,则返回用户为后台管理人员 + if lo.Contains(roleIds, 16) { + roles = append(roles, 0) + } + + return nil, nil +} diff --git a/internal/app/system/controller/sys_login_log.go b/internal/app/system/controller/sys_login_log.go new file mode 100644 index 0000000..c38bc21 --- /dev/null +++ b/internal/app/system/controller/sys_login_log.go @@ -0,0 +1,35 @@ +/* +* @desc:登录日志管理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/4/24 22:14 + */ + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +var LoginLog = loginLogController{} + +type loginLogController struct { + BaseController +} + +func (c *loginLogController) List(ctx context.Context, req *system.LoginLogSearchReq) (res *system.LoginLogSearchRes, err error) { + res, err = service.SysLoginLog().List(ctx, req) + return +} + +func (c *loginLogController) Delete(ctx context.Context, req *system.LoginLogDelReq) (res *system.LoginLogDelRes, err error) { + err = service.SysLoginLog().DeleteLoginLogByIds(ctx, req.Ids) + return +} + +func (c *loginLogController) Clear(ctx context.Context, req *system.LoginLogClearReq) (res *system.LoginLogClearRes, err error) { + err = service.SysLoginLog().ClearLoginLog(ctx) + return +} diff --git a/internal/app/system/controller/sys_monitor.go b/internal/app/system/controller/sys_monitor.go new file mode 100644 index 0000000..a039db2 --- /dev/null +++ b/internal/app/system/controller/sys_monitor.go @@ -0,0 +1,142 @@ +package controller + +import ( + "context" + "fmt" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gconv" + "github.com/shirou/gopsutil/v3/cpu" + "github.com/shirou/gopsutil/v3/disk" + "github.com/shirou/gopsutil/v3/host" + "github.com/shirou/gopsutil/v3/load" + "github.com/shirou/gopsutil/v3/mem" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/library/libUtils" + "os" + "runtime" + "strconv" + "time" +) + +var Monitor = sysMonitorController{ + startTime: gtime.Now(), +} + +type sysMonitorController struct { + BaseController + startTime *gtime.Time +} + +func (c *sysMonitorController) List(ctx context.Context, req *system.MonitorSearchReq) (res *system.MonitorSearchRes, err error) { + cpuNum := runtime.NumCPU() //核心数 + var cpuUsed float64 = 0 //用户使用率 + var cpuAvg5 float64 = 0 //CPU负载5 + var cpuAvg15 float64 = 0 //当前空闲率 + + cpuInfo, err := cpu.Percent(time.Duration(time.Second), false) + if err == nil { + cpuUsed, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", cpuInfo[0]), 64) + } + + loadInfo, err := load.Avg() + if err == nil { + cpuAvg5, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", loadInfo.Load5), 64) + cpuAvg15, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", loadInfo.Load5), 64) + } + + var memTotal uint64 = 0 //总内存 + var memUsed uint64 = 0 //总内存 := 0 //已用内存 + var memFree uint64 = 0 //剩余内存 + var memUsage float64 = 0 //使用率 + + v, err := mem.VirtualMemory() + if err == nil { + memTotal = v.Total + memUsed = v.Used + memFree = memTotal - memUsed + memUsage, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", v.UsedPercent), 64) + } + + var goTotal uint64 = 0 //go分配的总内存数 + var goUsed uint64 = 0 //go使用的内存数 + var goFree uint64 = 0 //go剩余的内存数 + var goUsage float64 = 0 //使用率 + + var gomem runtime.MemStats + runtime.ReadMemStats(&gomem) + goUsed = gomem.Sys + goUsage = gconv.Float64(fmt.Sprintf("%.2f", gconv.Float64(goUsed)/gconv.Float64(memTotal)*100)) + sysComputerIp := "" //服务器IP + + ip, err := libUtils.GetLocalIP() + if err == nil { + sysComputerIp = ip + } + + sysComputerName := "" //服务器名称 + sysOsName := "" //操作系统 + sysOsArch := "" //系统架构 + + sysInfo, err := host.Info() + + if err == nil { + sysComputerName = sysInfo.Hostname + sysOsName = sysInfo.OS + sysOsArch = sysInfo.KernelArch + } + + goName := "GoLang" //语言环境 + goVersion := runtime.Version() //版本 + gtime.Date() + goStartTime := c.startTime //启动时间 + + goRunTime := gtime.Now().Timestamp() - c.startTime.Timestamp() //运行时长(秒) + goHome := runtime.GOROOT() //安装路径 + goUserDir := "" //项目路径 + + curDir, err := os.Getwd() + + if err == nil { + goUserDir = curDir + } + + //服务器磁盘信息 + diskList := make([]disk.UsageStat, 0) + diskInfo, err := disk.Partitions(true) //所有分区 + if err == nil { + for _, p := range diskInfo { + diskDetail, err := disk.Usage(p.Mountpoint) + if err == nil { + diskDetail.UsedPercent, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", diskDetail.UsedPercent), 64) + diskList = append(diskList, *diskDetail) + } + } + } + res = new(system.MonitorSearchRes) + res = &system.MonitorSearchRes{ + "cpuNum": cpuNum, + "cpuUsed": cpuUsed, + "cpuAvg5": gconv.String(cpuAvg5), + "cpuAvg15": gconv.String(cpuAvg15), + "memTotal": memTotal, + "goTotal": goTotal, + "memUsed": memUsed, + "goUsed": goUsed, + "memFree": memFree, + "goFree": goFree, + "memUsage": memUsage, + "goUsage": goUsage, + "sysComputerName": sysComputerName, + "sysOsName": sysOsName, + "sysComputerIp": sysComputerIp, + "sysOsArch": sysOsArch, + "goName": goName, + "goVersion": goVersion, + "goStartTime": goStartTime, + "goRunTime": goRunTime, + "goHome": goHome, + "goUserDir": goUserDir, + "diskList": diskList, + } + return +} diff --git a/internal/app/system/controller/sys_oper_log.go b/internal/app/system/controller/sys_oper_log.go new file mode 100644 index 0000000..ac9bd7d --- /dev/null +++ b/internal/app/system/controller/sys_oper_log.go @@ -0,0 +1,43 @@ +/* +* @desc:系统后台操作日志 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/9/21 16:10 + */ + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +var OperLog = new(operateLogController) + +type operateLogController struct { + BaseController +} + +// List 列表 +func (c *operateLogController) List(ctx context.Context, req *system.SysOperLogSearchReq) (res *system.SysOperLogSearchRes, err error) { + res, err = service.OperateLog().List(ctx, req) + return +} + +// Get 获取操作日志 +func (c *operateLogController) Get(ctx context.Context, req *system.SysOperLogGetReq) (res *system.SysOperLogGetRes, err error) { + res = new(system.SysOperLogGetRes) + res.SysOperLogInfoRes, err = service.OperateLog().GetByOperId(ctx, req.OperId) + return +} + +func (c *operateLogController) Delete(ctx context.Context, req *system.SysOperLogDeleteReq) (res *system.SysOperLogDeleteRes, err error) { + err = service.OperateLog().DeleteByIds(ctx, req.OperIds) + return +} + +func (c *operateLogController) Clear(ctx context.Context, req *system.SysOperLogClearReq) (res *system.SysOperLogClearRes, err error) { + err = service.OperateLog().ClearLog(ctx) + return +} diff --git a/internal/app/system/controller/sys_post.go b/internal/app/system/controller/sys_post.go new file mode 100644 index 0000000..8586e89 --- /dev/null +++ b/internal/app/system/controller/sys_post.go @@ -0,0 +1,44 @@ +/* +* @desc:岗位管理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/4/7 23:12 + */ + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +var Post = postController{} + +type postController struct { + BaseController +} + +// List 岗位列表 +func (c *postController) List(ctx context.Context, req *system.PostSearchReq) (res *system.PostSearchRes, err error) { + res, err = service.SysPost().List(ctx, req) + return +} + +// Add 添加岗位 +func (c *postController) Add(ctx context.Context, req *system.PostAddReq) (res *system.PostAddRes, err error) { + err = service.SysPost().Add(ctx, req) + return +} + +// Edit 修改岗位 +func (c *postController) Edit(ctx context.Context, req *system.PostEditReq) (res *system.PostEditRes, err error) { + err = service.SysPost().Edit(ctx, req) + return +} + +// Delete 删除岗位 +func (c *postController) Delete(ctx context.Context, req *system.PostDeleteReq) (res *system.PostDeleteRes, err error) { + err = service.SysPost().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/sys_project.go b/internal/app/system/controller/sys_project.go new file mode 100644 index 0000000..e1fb81d --- /dev/null +++ b/internal/app/system/controller/sys_project.go @@ -0,0 +1,138 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-07-27 15:20:49 +// 生成路径: internal/app/system/controller/sys_project.go +// 生成人:gfast +// desc:项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type sysProjectController struct { + BaseController +} + +var SysProject = new(sysProjectController) + +// List 列表 +func (c *sysProjectController) List(ctx context.Context, req *system.SysProjectSearchReq) (res *system.SysProjectSearchRes, err error) { + res, err = service.SysProject().List(ctx, req) + return +} + +// AllList 查询所有项目 +func (c *sysProjectController) AllList(ctx context.Context, req *system.SysProjectSearchAllReq) (res *system.SysProjectSearchAllRes, err error) { + res, err = service.SysProject().AllList(ctx, req) + return +} + +// Get 获取项目 +func (c *sysProjectController) Get(ctx context.Context, req *system.SysProjectGetReq) (res *system.SysProjectGetRes, err error) { + res = new(system.SysProjectGetRes) + res.SysProjectInfoRes, err = service.SysProject().GetById(ctx, req.Id) + //获取原本的方正的范围 + var fzList []*system.FangzhengListRes + err = dao.QianqiFangzhen.Ctx(ctx).Where("project_id", res.Id).Fields("name,source_id,detail").Scan(&fzList) + if err != nil { + err = errors.New("获取数据失败!") + return + } else { + res.FangzhengList = fzList + } + //获取打卡范围,如果没有就不显示 + var pprr []*system.ProjectPunchRangeRes + err = g.DB().Model("sys_project_punch_range").Where("project_id", res.Id).Scan(&pprr) + if err != nil { + err = errors.New("获取数据失败!") + return + } else { + res.PunchRangeList = pprr + return + } +} + +// Add 添加项目 +func (c *sysProjectController) Add(ctx context.Context, req *system.SysProjectAddReq) (res *system.SysProjectAddRes, err error) { + err = service.SysProject().Add(ctx, req) + return +} + +// Edit 修改项目 +func (c *sysProjectController) Edit(ctx context.Context, req *system.SysProjectEditReq) (res *system.SysProjectEditRes, err error) { + err = service.SysProject().Edit(ctx, req) + return +} + +// Delete 删除项目 +func (c *sysProjectController) Delete(ctx context.Context, req *system.SysProjectDeleteReq) (res *system.SysProjectDeleteRes, err error) { + err = service.SysProject().Delete(ctx, req.Ids) + return +} + +// CountProjectFunc 项目数据的统计 +func (c *sysProjectController) CountProjectFunc(ctx context.Context, req *system.ParticipantNumberReq) (res *system.ParticipantNumberRes, err error) { + res, err = service.SysProject().CountProjectFunc(ctx, req) + return +} + +// ProgressOfWorksFunc 合同容量 +func (c *sysProjectController) ProgressOfWorksFunc(ctx context.Context, req *system.ProgressOfWorksReq) (res *system.ProgressOfWorksRes, err error) { + res, err = service.SysProject().ProgressOfWorksFunc(ctx, req) + return +} + +// ProjectCapacityFunc 项目容量 +func (c *sysProjectController) ProjectCapacityFunc(ctx context.Context, req *system.ProjectCapacityReq) (res *system.ProjectCapacityRes, err error) { + res, err = service.SysProject().ProjectCapacityFunc(ctx, req) + return +} + +// ProjectCapacityTwoFunc 项目容量 +func (c *sysProjectController) ProjectCapacityTwoFunc(ctx context.Context, req *system.ProjectCapacityTwoReq) (res *system.ProjectCapacityTwoRes, err error) { + res, err = service.SysProject().ProjectCapacityTwoFunc(ctx, req) + return +} + +// OneProjectFunc 单项目情况 +func (c *sysProjectController) OneProjectFunc(ctx context.Context, req *system.OneProjectReq) (res *system.OneProjectRes, err error) { + res, err = service.SysProject().OneProjectFunc(ctx, req) + return +} + +// SafetyReqFunc 安全生产天数 +func (c *sysProjectController) SafetyReqFunc(ctx context.Context, req *system.SafetyReq) (res *system.SafetyRes, err error) { + res, err = service.SysProject().SafetyReqFunc(ctx, req) + return +} + +// BriefIntroductionFunc 获取项目简介 +func (c *busConstructionUserController) BriefIntroductionFunc(ctx context.Context, req *system.BriefIntroductionReq) (res *system.BriefIntroductionRes, err error) { + res = new(system.BriefIntroductionRes) + err = g.DB().Model("sys_project_introduce").As("a"). + LeftJoin(`(SELECT id,project_name,short_name FROM sys_project) as b on a.project_id = b.id`). + Fields(`b.id as project_id, + b.project_name, + b.short_name, + a.rich_text`). + Where("a.project_id", req.ProjectId).Scan(res) + if err != nil { + err = errors.New("获取失败!") + } + return +} + +// SecurityAgreementFunc 上传安全协议书(每个项目都有一个安全协议书) +func (c *busConstructionUserController) SecurityAgreementFunc(ctx context.Context, req *system.SecurityAgreementReq) (res *system.SecurityAgreementRes, err error) { + err = service.SysProject().SecurityAgreementFunc(ctx, req) + return +} diff --git a/internal/app/system/controller/sys_project_introduce.go b/internal/app/system/controller/sys_project_introduce.go new file mode 100644 index 0000000..422d47c --- /dev/null +++ b/internal/app/system/controller/sys_project_introduce.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-03-29 10:05:03 +// 生成路径: internal/app/system/controller/sys_project_introduce.go +// 生成人:gfast +// desc:项目新闻 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type sysProjectIntroduceController struct { + BaseController +} + +var SysProjectIntroduce = new(sysProjectIntroduceController) + +// List 列表 +func (c *sysProjectIntroduceController) List(ctx context.Context, req *system.SysProjectIntroduceSearchReq) (res *system.SysProjectIntroduceSearchRes, err error) { + res, err = service.SysProjectIntroduce().List(ctx, req) + return +} + +// Get 获取项目新闻 +func (c *sysProjectIntroduceController) Get(ctx context.Context, req *system.SysProjectIntroduceGetReq) (res *system.SysProjectIntroduceGetRes, err error) { + res = new(system.SysProjectIntroduceGetRes) + res.SysProjectIntroduceInfoRes, err = service.SysProjectIntroduce().GetByProjectId(ctx, req.Id) + return +} + +// Add 添加项目新闻 +func (c *sysProjectIntroduceController) Add(ctx context.Context, req *system.SysProjectIntroduceAddReq) (res *system.SysProjectIntroduceAddRes, err error) { + err = service.SysProjectIntroduce().Add(ctx, req) + return +} + +// Edit 修改项目新闻 +func (c *sysProjectIntroduceController) Edit(ctx context.Context, req *system.SysProjectIntroduceEditReq) (res *system.SysProjectIntroduceEditRes, err error) { + err = service.SysProjectIntroduce().Edit(ctx, req) + return +} + +// Delete 删除项目新闻 +func (c *sysProjectIntroduceController) Delete(ctx context.Context, req *system.SysProjectIntroduceDeleteReq) (res *system.SysProjectIntroduceDeleteRes, err error) { + err = service.SysProjectIntroduce().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/sys_project_value.go b/internal/app/system/controller/sys_project_value.go new file mode 100644 index 0000000..00d6f48 --- /dev/null +++ b/internal/app/system/controller/sys_project_value.go @@ -0,0 +1,59 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-03-27 12:55:26 +// 生成路径: internal/app/system/controller/sys_project_value.go +// 生成人:xiaoyang +// desc:projectValue +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type sysProjectValueController struct { + BaseController +} + +var SysProjectValue = new(sysProjectValueController) + +func (c *sysProjectValueController) EveryList(ctx context.Context, req *system.EveryProjectValueSearchReq) (listRes *system.EveryProjectValueSearchRes, err error) { + listRes, err = service.SysProjectValue().EveryList(ctx, req) + return +} + +// List 列表 +func (c *sysProjectValueController) List(ctx context.Context, req *system.SysProjectValueSearchReq) (res *system.SysProjectValueSearchRes, err error) { + res, err = service.SysProjectValue().List(ctx, req) + return +} + +// Get 获取projectValue +func (c *sysProjectValueController) Get(ctx context.Context, req *system.SysProjectValueGetReq) (res *system.SysProjectValueGetRes, err error) { + res = new(system.SysProjectValueGetRes) + res.SysProjectValueListRes, err = service.SysProjectValue().GetById(ctx, req.Id) + return +} + +// Add 添加projectValue +func (c *sysProjectValueController) Add(ctx context.Context, req *system.SysProjectValueAddReq) (res *system.SysProjectValueAddRes, err error) { + + err = service.SysProjectValue().Add(ctx, req) + return +} + +// Edit 修改projectValue +func (c *sysProjectValueController) Edit(ctx context.Context, req *system.SysProjectValueEditReq) (res *system.SysProjectValueEditRes, err error) { + err = service.SysProjectValue().Edit(ctx, req) + return +} + +// Delete 删除projectValue +func (c *sysProjectValueController) Delete(ctx context.Context, req *system.SysProjectValueDeleteReq) (res *system.SysProjectValueDeleteRes, err error) { + err = service.SysProjectValue().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/sys_role.go b/internal/app/system/controller/sys_role.go new file mode 100644 index 0000000..275a507 --- /dev/null +++ b/internal/app/system/controller/sys_role.go @@ -0,0 +1,74 @@ +/* +* @desc:角色管理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/30 9:08 + */ + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +var Role = roleController{} + +type roleController struct { + BaseController +} + +// List 角色列表 +func (c *roleController) List(ctx context.Context, req *system.RoleListReq) (res *system.RoleListRes, err error) { + res, err = service.SysRole().GetRoleListSearch(ctx, req) + return +} + +// GetParams 获取角色表单参数 +func (c *roleController) GetParams(ctx context.Context, req *system.RoleGetParamsReq) (res *system.RoleGetParamsRes, err error) { + res = new(system.RoleGetParamsRes) + res.Menu, err = service.SysAuthRule().GetMenuList(ctx) + return +} + +// Add 添加角色信息 +func (c *roleController) Add(ctx context.Context, req *system.RoleAddReq) (res *system.RoleAddRes, err error) { + err = service.SysRole().AddRole(ctx, req) + return +} + +// Get 获取角色信息 +func (c *roleController) Get(ctx context.Context, req *system.RoleGetReq) (res *system.RoleGetRes, err error) { + res = new(system.RoleGetRes) + res.Role, err = service.SysRole().Get(ctx, req.Id) + if err != nil { + return + } + res.MenuIds, err = service.SysRole().GetFilteredNamedPolicy(ctx, req.Id) + return +} + +// Edit 修改角色信息 +func (c *roleController) Edit(ctx context.Context, req *system.RoleEditReq) (res *system.RoleEditRes, err error) { + err = service.SysRole().EditRole(ctx, req) + return +} + +// Delete 删除角色 +func (c *roleController) Delete(ctx context.Context, req *system.RoleDeleteReq) (res *system.RoleDeleteRes, err error) { + err = service.SysRole().DeleteByIds(ctx, req.Ids) + return +} + +// DeptTreeSelect 获取数据权限 +func (c *roleController) DeptTreeSelect(ctx context.Context, req *system.RoleDeptTreeSelectReq) (res *system.RoleDeptTreeSelectRes, err error) { + res, err = service.SysRole().RoleDeptTreeSelect(ctx, req.RoleId) + return +} + +// RoleDataScope 设置角色数据权限 +func (c *roleController) RoleDataScope(ctx context.Context, req *system.DataScopeReq) (res *system.DataScopeRes, err error) { + err = service.SysRole().RoleDataScope(ctx, req) + return +} diff --git a/internal/app/system/controller/sys_user.go b/internal/app/system/controller/sys_user.go new file mode 100644 index 0000000..f7e4b4c --- /dev/null +++ b/internal/app/system/controller/sys_user.go @@ -0,0 +1,102 @@ +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +var ( + User = userController{} +) + +type userController struct { + BaseController +} + +// GetUserMenus 获取用户菜单及按钮权限 +func (c *userController) GetUserMenus(ctx context.Context, req *system.UserMenusReq) (res *system.UserMenusRes, err error) { + var ( + permissions []string + menuList []*model.UserMenus + ) + userId := service.Context().GetUserId(ctx) + menuList, permissions, err = service.SysUser().GetAdminRules(ctx, userId) + res = &system.UserMenusRes{ + MenuList: menuList, + Permissions: permissions, + } + return +} + +// List 用户列表 +func (c *userController) List(ctx context.Context, req *system.UserSearchReq) (res *system.UserSearchRes, err error) { + var ( + total interface{} + userList []*entity.SysUser + ) + res = new(system.UserSearchRes) + total, userList, err = service.SysUser().List(ctx, req) + if err != nil || total == 0 { + return + } + res.Total = total + res.UserList, err = service.SysUser().GetUsersRoleDept(ctx, userList) + return +} + +// GetParams 获取用户维护相关参数 +func (c *userController) GetParams(ctx context.Context, req *system.UserGetParamsReq) (res *system.UserGetParamsRes, err error) { + res = new(system.UserGetParamsRes) + res.RoleList, err = service.SysRole().GetRoleList(ctx) + if err != nil { + return + } + res.Posts, err = service.SysPost().GetUsedPost(ctx) + return +} + +// Add 添加用户 +func (c *userController) Add(ctx context.Context, req *system.UserAddReq) (res *system.UserAddRes, err error) { + err = service.SysUser().Add(ctx, req) + return +} + +// GetEditUser 获取修改用户信息 +func (c *userController) GetEditUser(ctx context.Context, req *system.UserGetEditReq) (res *system.UserGetEditRes, err error) { + res, err = service.SysUser().GetEditUser(ctx, req.Id) + return +} + +// Edit 修改用户 +func (c *userController) Edit(ctx context.Context, req *system.UserEditReq) (res *system.UserEditRes, err error) { + err = service.SysUser().Edit(ctx, req) + return +} + +// ResetPwd 重置密码 +func (c *userController) ResetPwd(ctx context.Context, req *system.UserResetPwdReq) (res *system.UserResetPwdRes, err error) { + err = service.SysUser().ResetUserPwd(ctx, req) + return +} + +// SetStatus 修改用户状态 +func (c *userController) SetStatus(ctx context.Context, req *system.UserStatusReq) (res *system.UserStatusRes, err error) { + err = service.SysUser().ChangeUserStatus(ctx, req) + return +} + +// Delete 删除用户 +func (c *userController) Delete(ctx context.Context, req *system.UserDeleteReq) (res *system.UserDeleteRes, err error) { + err = service.SysUser().Delete(ctx, req.Ids) + return +} + +// GetUsers 通过用户id批量获取用户信息 +func (c *userController) GetUsers(ctx context.Context, req *system.UserGetByIdsReq) (res *system.UserGetByIdsRes, err error) { + res = new(system.UserGetByIdsRes) + res.List, err = service.SysUser().GetUsers(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/sys_user_online.go b/internal/app/system/controller/sys_user_online.go new file mode 100644 index 0000000..e13b172 --- /dev/null +++ b/internal/app/system/controller/sys_user_online.go @@ -0,0 +1,28 @@ +/* +* @desc:在线用户管理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2023/1/10 17:23 + */ + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +var UserOnline = new(SysUserOnlineController) + +type SysUserOnlineController struct{} + +func (c *SysUserOnlineController) List(ctx context.Context, req *system.SysUserOnlineSearchReq) (res *system.SysUserOnlineSearchRes, err error) { + res, err = service.SysUserOnline().GetOnlineListPage(ctx, req) + return +} + +func (c *SysUserOnlineController) ForceLogout(ctx context.Context, req *system.SysUserOnlineForceLogoutReq) (res *system.SysUserOnlineForceLogoutRes, err error) { + err = service.SysUserOnline().ForceLogout(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/sys_user_project.go b/internal/app/system/controller/sys_user_project.go new file mode 100644 index 0000000..8c63f41 --- /dev/null +++ b/internal/app/system/controller/sys_user_project.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-07-27 15:20:52 +// 生成路径: internal/app/system/controller/sys_user_project.go +// 生成人:gfast +// desc:用户和项目关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type sysUserProjectController struct { + BaseController +} + +var SysUserProject = new(sysUserProjectController) + +// List 列表 +func (c *sysUserProjectController) List(ctx context.Context, req *system.SysUserProjectSearchReq) (res *system.SysUserProjectSearchRes, err error) { + res, err = service.SysUserProject().List(ctx, req) + return +} + +// Get 获取用户和项目关联 +func (c *sysUserProjectController) Get(ctx context.Context, req *system.SysUserProjectGetReq) (res *system.SysUserProjectGetRes, err error) { + res = new(system.SysUserProjectGetRes) + res.SysUserProjectInfoRes, err = service.SysUserProject().GetById(ctx, req.Id) + return +} + +// Add 添加用户和项目关联 +func (c *sysUserProjectController) Add(ctx context.Context, req *system.SysUserProjectAddReq) (res *system.SysUserProjectAddRes, err error) { + err = service.SysUserProject().Add(ctx, req) + return +} + +// Edit 修改用户和项目关联 +func (c *sysUserProjectController) Edit(ctx context.Context, req *system.SysUserProjectEditReq) (res *system.SysUserProjectEditRes, err error) { + err = service.SysUserProject().Edit(ctx, req) + return +} + +// Delete 删除用户和项目关联 +func (c *sysUserProjectController) Delete(ctx context.Context, req *system.SysUserProjectDeleteReq) (res *system.SysUserProjectDeleteRes, err error) { + err = service.SysUserProject().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/sys_wechat_role.go b/internal/app/system/controller/sys_wechat_role.go new file mode 100644 index 0000000..a7c1f3b --- /dev/null +++ b/internal/app/system/controller/sys_wechat_role.go @@ -0,0 +1,65 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-01-22 15:05:43 +// 生成路径: internal/app/system/controller/sys_wechat_role.go +// 生成人:gfast +// desc:微信角色 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type sysWechatRoleController struct { + BaseController +} + +var SysWechatRole = new(sysWechatRoleController) + +// List 列表 +func (c *sysWechatRoleController) List(ctx context.Context, req *system.SysWechatRoleSearchReq) (res *system.SysWechatRoleSearchRes, err error) { + res, err = service.SysWechatRole().List(ctx, req) + return +} + +// Get 获取微信角色 +func (c *sysWechatRoleController) Get(ctx context.Context, req *system.SysWechatRoleGetReq) (res *system.SysWechatRoleGetRes, err error) { + res = new(system.SysWechatRoleGetRes) + res.SysWechatRoleListTwoRes, err = service.SysWechatRole().GetById(ctx, req.Id) + return +} + +// Add 添加微信角色 +func (c *sysWechatRoleController) Add(ctx context.Context, req *system.SysWechatRoleAddReq) (res *system.SysWechatRoleAddRes, err error) { + err = service.SysWechatRole().Add(ctx, req) + return +} + +// Edit 修改微信角色 +func (c *sysWechatRoleController) Edit(ctx context.Context, req *system.SysWechatRoleEditReq) (res *system.SysWechatRoleEditRes, err error) { + err = service.SysWechatRole().Edit(ctx, req) + return +} + +// Delete 删除微信角色 +func (c *sysWechatRoleController) Delete(ctx context.Context, req *system.SysWechatRoleDeleteReq) (res *system.SysWechatRoleDeleteRes, err error) { + err = service.SysWechatRole().Delete(ctx, req.Ids) + return +} + +// ModuleList 获取模型列表 +func (c *sysWechatRoleController) ModuleList(ctx context.Context, req *system.SysWechatModuleSearchReq) (res *system.SysWechatModuleSearchRes, err error) { + res, err = service.SysWechatRole().ModuleList(ctx, req) + return +} + +// RoleList 获取模型列表 +func (c *sysWechatRoleController) RoleList(ctx context.Context, req *system.SysWechatRoleSearchNoPageReq) (res *system.SysWechatRoleSearchNoPageRes, err error) { + res, err = service.SysWechatRole().RoleList(ctx, req) + return +} diff --git a/internal/app/system/controller/todo_tasks.go b/internal/app/system/controller/todo_tasks.go new file mode 100644 index 0000000..da60409 --- /dev/null +++ b/internal/app/system/controller/todo_tasks.go @@ -0,0 +1,60 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-05-15 17:30:14 +// 生成路径: internal/app/system/controller/todo_tasks.go +// 生成人:gfast +// desc:App-待办 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type todoTasksController struct { + BaseController +} + +var TodoTasks = new(todoTasksController) + +// MyList 获取自己的待办列表 +func (c *todoTasksController) MyList(ctx context.Context, req *system.TodoTasksMyListReq) (res *system.TodoTasksMyListRes, err error) { + res, err = service.TodoTasks().MyList(ctx, req) + return +} + +// List 列表 +func (c *todoTasksController) List(ctx context.Context, req *system.TodoTasksSearchReq) (res *system.TodoTasksSearchRes, err error) { + res, err = service.TodoTasks().List(ctx, req) + return +} + +// Get 获取App-待办 +func (c *todoTasksController) Get(ctx context.Context, req *system.TodoTasksGetReq) (res *system.TodoTasksGetRes, err error) { + res = new(system.TodoTasksGetRes) + res.TodoTasksInfoRes, err = service.TodoTasks().GetById(ctx, req.Id) + return +} + +// Add 添加App-待办 +func (c *todoTasksController) Add(ctx context.Context, req *system.TodoTasksAddReq) (res *system.TodoTasksAddRes, err error) { + err = service.TodoTasks().Add(ctx, req) + return +} + +// Edit 修改App-待办 +func (c *todoTasksController) Edit(ctx context.Context, req *system.TodoTasksEditReq) (res *system.TodoTasksEditRes, err error) { + err = service.TodoTasks().Edit(ctx, req) + return +} + +// Delete 删除App-待办 +func (c *todoTasksController) Delete(ctx context.Context, req *system.TodoTasksDeleteReq) (res *system.TodoTasksDeleteRes, err error) { + err = service.TodoTasks().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/tools_gen_table.go b/internal/app/system/controller/tools_gen_table.go new file mode 100644 index 0000000..67394b3 --- /dev/null +++ b/internal/app/system/controller/tools_gen_table.go @@ -0,0 +1,88 @@ +/* +* @desc:代码生成 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/10/26 16:55 + */ + +package controller + +import ( + "context" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +var ToolsGenTable = new(toolsGenTableController) + +type toolsGenTableController struct { + BaseController +} + +// List 获取表数据 +func (c *toolsGenTableController) List(ctx context.Context, req *system.ToolsGenTableSearchReq) (res *system.ToolsGenTableSearchRes, err error) { + res, err = service.ToolsGenTable().List(ctx, req) + return +} + +// GetImportTableList 获取要导入的数据表列表 +func (c *toolsGenTableController) GetImportTableList(ctx context.Context, req *system.ToolsGenTableImportSearchReq) (res *system.ToolsGenTableSearchRes, err error) { + res, err = service.ToolsGenTable().SelectDbTableList(ctx, req) + return +} + +// ImportTableSave 导入表结构数据操作 +func (c *toolsGenTableController) ImportTableSave(ctx context.Context, req *system.ToolsGenTableImportTableReq) (res *common.EmptyRes, err error) { + var tableList []*entity.ToolsGenTable + tableList, err = service.ToolsGenTable().SelectDbTableListByNames(ctx, req.Tables) + if err != nil { + return + } + if tableList == nil { + err = gerror.New("表信息不存在") + return + } + err = service.ToolsGenTable().ImportGenTable(ctx, tableList) + return +} + +// DeleteTable 删除已导入的表数据 +func (c *toolsGenTableController) DeleteTable(ctx context.Context, req *system.ToolsGenTableDeleteReq) (res *common.EmptyRes, err error) { + err = service.ToolsGenTable().DeleteTable(ctx, req) + return +} + +// GenColumnList 获取编辑页面返回数据 +func (c *toolsGenTableController) GenColumnList(ctx context.Context, req *system.ToolsGenTableEditReq) (res *system.ToolsGenTableEditRes, err error) { + res, err = service.ToolsGenTable().ColumnList(ctx, req) + return +} + +// RelationTable 获取关联表数据 +func (c *toolsGenTableController) RelationTable(ctx context.Context, req *system.ToolsGenRelationTableReq) (res *system.ToolsGenRelationTableRes, err error) { + res = new(system.ToolsGenRelationTableRes) + res.Data, err = service.ToolsGenTable().GetRelationTable(ctx) + return +} + +// EditSave 生成配置编辑保存 +func (c *toolsGenTableController) EditSave(ctx context.Context, req *system.ToolsGenTableColumnsEditReq) (res *system.ToolsGenTableColumnsEditRes, err error) { + err = service.ToolsGenTable().SaveEdit(ctx, req) + return +} + +// Preview 代码预览 +func (c *toolsGenTableController) Preview(ctx context.Context, req *system.ToolsGenTablePreviewReq) (res *system.ToolsGenTablePreviewRes, err error) { + res = new(system.ToolsGenTablePreviewRes) + res.Data, _, err = service.ToolsGenTable().GenData(ctx, req.TableId) + return +} + +// BatchGenCode 代码生成 +func (c *toolsGenTableController) BatchGenCode(ctx context.Context, req *system.ToolsGenTableBatchGenCodeReq) (res *system.ToolsGenTableBatchGenCodeRes, err error) { + err = service.ToolsGenTable().GenCode(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/ueditor.go b/internal/app/system/controller/ueditor.go new file mode 100644 index 0000000..c724fcf --- /dev/null +++ b/internal/app/system/controller/ueditor.go @@ -0,0 +1,201 @@ +/* +* @desc:UEditor处理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/11/17 14:40 + */ + +package controller + +import ( + "context" + "fmt" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/common/consts" + "github.com/tiger1103/gfast/v3/internal/app/common/service" +) + +var UEditor = new(uEditorController) + +type uEditorController struct { + BaseController +} + +func (c *uEditorController) GetConfig(ctx context.Context, req *system.UEditorConfigReq) (res *system.UEditorRes, err error) { + return c.action(ctx, &req.UEditorReq) +} + +func (c *uEditorController) UpFile(ctx context.Context, req *system.UEditorUpFileReq) (res *system.UEditorRes, err error) { + if req.File == nil { + err = gerror.New("请选择文件上传") + return + } + return c.action(ctx, &req.UEditorReq) +} + +func (c *uEditorController) action(ctx context.Context, req *system.UEditorReq) (res *system.UEditorRes, err error) { + r := g.RequestFromCtx(ctx) + switch req.Action { + //获取配置 + case "config": + c.ueditorConfig(ctx, req.Callback) + //上传图片 上传涂鸦 + case "uploadimage", "uploadscrawl": + c.uEditorUpload(ctx, req.File, "image") + //上传视频 上传文件 + case "uploadvideo", "uploadfile": + c.uEditorUpload(ctx, req.File, "file") + //列出图片 列出文件 + case "listimage", "listfile": + r.Response.WriteJson(g.Map{ + "state": "SUCCESS", + "total": 0, + "start": 0, + "list": g.Slice{}, + }) + //抓取远端图片 + case "catchimage": + r.Response.WriteJson(g.Map{ + "state": "抓取失败", + }) + default: + r.Response.WriteJson(g.Map{ + "state": "请求地址出错", + }) + } + return +} + +var coryPath = "/resource/public/upload_file" + +// 获取ueditor配置 +func (c *uEditorController) ueditorConfig(ctx context.Context, callback string) { + config := g.Map{ + /* 上传图片配置项 */ + "imageActionName": "uploadimage", /* 执行上传图片的action名称 */ + "imageFieldName": "upfile", /* 提交的图片表单名称 */ + "imageMaxSize": 2048000, /* 上传大小限制,单位B */ + "imageAllowFiles": g.Slice{".png", ".jpg", ".jpeg", ".gif", ".bmp"}, /* 上传图片格式显示 */ + "imageCompressEnable": true, /* 是否压缩图片,默认是true */ + "imageCompressBorder": 1600, /* 图片压缩最长边限制 */ + "imageInsertAlign": "none", /* 插入的图片浮动方式 */ + "imageUrlPrefix": "", /* 图片访问路径前缀 */ + "imagePathFormat": coryPath + "/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + /* {filename} 会替换成原文件名,配置这项需要注意中文乱码问题 */ + /* {rand:6} 会替换成随机数,后面的数字是随机数的位数 */ + /* {time} 会替换成时间戳 */ + /* {yyyy} 会替换成四位年份 */ + /* {yy} 会替换成两位年份 */ + /* {mm} 会替换成两位月份 */ + /* {dd} 会替换成两位日期 */ + /* {hh} 会替换成两位小时 */ + /* {ii} 会替换成两位分钟 */ + /* {ss} 会替换成两位秒 */ + /* 非法字符 \ : * ? " < > | */ + /* 具请体看线上文档: fex.baidu.com/ueditor/#use-format_upload_filename */ + + /* 涂鸦图片上传配置项 */ + "scrawlActionName": "uploadscrawl", /* 执行上传涂鸦的action名称 */ + "scrawlFieldName": "upfile", /* 提交的图片表单名称 */ + "scrawlPathFormat": coryPath + "/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "scrawlMaxSize": 2048000, /* 上传大小限制,单位B */ + "scrawlUrlPrefix": "", /* 图片访问路径前缀 */ + "scrawlInsertAlign": "none", + + /* 截图工具上传 */ + "snapscreenActionName": "uploadimage", /* 执行上传截图的action名称 */ + "snapscreenPathFormat": coryPath + "/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "snapscreenUrlPrefix": "", /* 图片访问路径前缀 */ + "snapscreenInsertAlign": "none", /* 插入的图片浮动方式 */ + + /* 抓取远程图片配置 */ + "catcherLocalDomain": g.Slice{"127.0.0.1", "localhost", "img.baidu.com"}, + "catcherActionName": "catchimage", /* 执行抓取远程图片的action名称 */ + "catcherFieldName": "source", /* 提交的图片列表表单名称 */ + "catcherPathFormat": coryPath + "/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "catcherUrlPrefix": "", /* 图片访问路径前缀 */ + "catcherMaxSize": 2048000, /* 上传大小限制,单位B */ + "catcherAllowFiles": g.Slice{".png", ".jpg", ".jpeg", ".gif", ".bmp"}, /* 抓取图片格式显示 */ + + /* 上传视频配置 */ + "videoActionName": "uploadvideo", /* 执行上传视频的action名称 */ + "videoFieldName": "upfile", /* 提交的视频表单名称 */ + "videoPathFormat": coryPath + "/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "videoUrlPrefix": "", /* 视频访问路径前缀 */ + "videoMaxSize": 1024000000, /* 上传大小限制,单位B,默认1000MB */ + "videoAllowFiles": g.Slice{ + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid"}, /* 上传视频格式显示 */ + + /* 上传文件配置 */ + "fileActionName": "uploadfile", /* controller里,执行上传视频的action名称 */ + "fileFieldName": "upfile", /* 提交的文件表单名称 */ + "filePathFormat": coryPath + "/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "fileUrlPrefix": "", /* 文件访问路径前缀 */ + "fileMaxSize": 51200000, /* 上传大小限制,单位B,默认50MB */ + "fileAllowFiles": g.Slice{ + ".png", ".jpg", ".jpeg", ".gif", ".bmp", + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", + ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", + ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml", + }, /* 上传文件格式显示 */ + + /* 列出指定目录下的图片 */ + "imageManagerActionName": "listimage", /* 执行图片管理的action名称 */ + "imageManagerListPath": "", /* 指定要列出图片的目录 */ + "imageManagerListSize": 20, /* 每次列出文件数量 */ + "imageManagerUrlPrefix": "", /* 图片访问路径前缀 */ + "imageManagerInsertAlign": "none", /* 插入的图片浮动方式 */ + "imageManagerAllowFiles": g.Slice{".png", ".jpg", ".jpeg", ".gif", ".bmp"}, /* 列出的文件类型 */ + + /* 列出指定目录下的文件 */ + "fileManagerActionName": "listfile", /* 执行文件管理的action名称 */ + "fileManagerListPath": "/ueditor/php/upload/file/", /* 指定要列出文件的目录 */ + "fileManagerUrlPrefix": "", /* 文件访问路径前缀 */ + "fileManagerListSize": 20, /* 每次列出文件数量 */ + "fileManagerAllowFiles": g.Slice{ + ".png", ".jpg", ".jpeg", ".gif", ".bmp", + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", + ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", + ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml", + }, /* 列出的文件类型 */ + } + r := g.RequestFromCtx(ctx) + r.Response.Write(fmt.Sprintf("%s(%s)", callback, gconv.String(config))) + r.Exit() +} + +// ueditor上传图片 +func (c *uEditorController) uEditorUpload(ctx context.Context, upFile *ghttp.UploadFile, fType string) { + var ( + info system.UploadResponse + err error + r = g.RequestFromCtx(ctx) + ) + v, _ := g.Cfg().Get(ctx, "upload.default") + if fType == "image" { + info, err = service.Upload().UploadFile(ctx, upFile, consts.CheckFileTypeImg, v.Int()) + } else if fType == "file" { + info, err = service.Upload().UploadFile(ctx, upFile, consts.CheckFileTypeFile, v.Int()) + } + + if err != nil { + r.Response.WriteJson(g.Map{ + "state": err.Error(), + }) + } else { + r.Response.WriteJson(g.Map{ + "state": "SUCCESS", + "url": "/file/" + info.Path, + "title": info.Name, + "original": info.Name, + }) + } + r.Exit() +} diff --git a/internal/app/system/controller/upload.go b/internal/app/system/controller/upload.go new file mode 100644 index 0000000..9bfec76 --- /dev/null +++ b/internal/app/system/controller/upload.go @@ -0,0 +1,74 @@ +package controller + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/common/consts" + "github.com/tiger1103/gfast/v3/internal/app/common/service" +) + +var Upload = new(uploadController) + +type uploadController struct{} + +// 上传单图 +func (c *uploadController) SingleImg(ctx context.Context, req *system.UploadSingleImgReq) (res *system.UploadSingleRes, err error) { + file := req.File + v, _ := g.Cfg().Get(ctx, "upload.default") + response, err := service.Upload().UploadFile(ctx, file, consts.CheckFileTypeImg, v.Int()) + if err != nil { + return + } + response.Path = "/file/" + response.Path + res = &system.UploadSingleRes{ + UploadResponse: response, + } + // 上传第三方 + return +} + +// 上传多图 +func (c *uploadController) MultipleImg(ctx context.Context, req *system.UploadMultipleImgReq) (res *system.UploadMultipleRes, err error) { + files := req.File + v, _ := g.Cfg().Get(ctx, "upload.default") + mf, err := service.Upload().UploadFiles(ctx, files, consts.CheckFileTypeImg, v.Int()) + if err != nil { + return + } + for _, data := range mf { + data.Path = "/file/" + data.Path + } + res = &mf + return +} + +// 上传单文件 +func (c *uploadController) SingleFile(ctx context.Context, req *system.UploadSingleFileReq) (res *system.UploadSingleRes, err error) { + file := req.File + v, _ := g.Cfg().Get(ctx, "upload.default") + response, err := service.Upload().UploadFile(ctx, file, consts.CheckFileTypeFile, v.Int()) + if err != nil { + return + } + response.Path = "/file/" + response.Path + res = &system.UploadSingleRes{ + UploadResponse: response, + } + return +} + +// 上传多文件 +func (c *uploadController) MultipleFile(ctx context.Context, req *system.UploadMultipleFileReq) (res *system.UploadMultipleRes, err error) { + files := req.File + v, _ := g.Cfg().Get(ctx, "upload.default") + mf, err := service.Upload().UploadFiles(ctx, files, consts.CheckFileTypeFile, v.Int()) + if err != nil { + return + } + for _, data := range mf { + data.Path = "/file/" + data.Path + } + res = &mf + return +} diff --git a/internal/app/system/controller/user_registration.go b/internal/app/system/controller/user_registration.go new file mode 100644 index 0000000..2ec9134 --- /dev/null +++ b/internal/app/system/controller/user_registration.go @@ -0,0 +1,87 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-07-26 15:32:12 +// 生成路径: internal/app/system/controller/user_registration.go +// 生成人:gfast +// desc:极光推送 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "errors" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type userRegistrationController struct { + BaseController +} + +var UserRegistration = new(userRegistrationController) + +// List 列表 +func (c *userRegistrationController) List(ctx context.Context, req *system.UserRegistrationSearchReq) (res *system.UserRegistrationSearchRes, err error) { + res, err = service.UserRegistration().List(ctx, req) + return +} + +// Get 获取极光推送 +func (c *userRegistrationController) Get(ctx context.Context, req *system.UserRegistrationGetReq) (res *system.UserRegistrationGetRes, err error) { + res = new(system.UserRegistrationGetRes) + res.UserRegistrationInfoRes, err = service.UserRegistration().GetById(ctx, req.Id) + return +} + +// Add 添加极光推送 +func (c *userRegistrationController) Add(ctx context.Context, req *system.UserRegistrationAddReq) (res *system.UserRegistrationAddRes, err error) { + err = service.UserRegistration().Add(ctx, req) + return +} + +// Edit 修改极光推送 +func (c *userRegistrationController) Edit(ctx context.Context, req *system.UserRegistrationEditReq) (res *system.UserRegistrationEditRes, err error) { + err = service.UserRegistration().Edit(ctx, req) + return +} + +// Delete 删除极光推送 +func (c *userRegistrationController) Delete(ctx context.Context, req *system.UserRegistrationDeleteReq) (res *system.UserRegistrationDeleteRes, err error) { + err = service.UserRegistration().Delete(ctx, req.Ids) + return +} + +// 为当前用户设备绑定极光推送 +func (c *userRegistrationController) BindRegistration(ctx context.Context, req *system.UserRegistrationRegisterReq) (res *system.UserRegistrationRegisterRes, err error) { + // 获取用户信息 + userInfo := ct.New().GetLoginUser(ctx) + if userInfo == nil { + return nil, errors.New("用户未登录") + } + + // 极光推送设备唯一标识 + registrationID := req.RegistrationId + + // sys_user 表中的用户 ID + userID := int(userInfo.Id) + openID := userInfo.OpenId + + // 如果用户已经绑定过了则更新,否则添加 + if service.UserRegistration().IsBind(ctx, userID) { + _, err = dao.UserRegistration.Ctx(ctx).Data(dao.UserRegistration.Columns().RegistrationId, registrationID). + Where(dao.UserRegistration.Columns().UserId, userID).Update() + } else { + err = service.UserRegistration().Add(ctx, &system.UserRegistrationAddReq{ + UserId: userID, + OpenId: openID, + RegistrationId: registrationID, + }) + } + + return +} diff --git a/internal/app/system/controller/work_schedule.go b/internal/app/system/controller/work_schedule.go new file mode 100644 index 0000000..0f5a1bc --- /dev/null +++ b/internal/app/system/controller/work_schedule.go @@ -0,0 +1,761 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-03-20 10:02:26 +// 生成路径: internal/app/system/controller/work_schedule.go +// 生成人:gfast +// desc:工作计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "encoding/json" + "fmt" + "math/rand" + "os" + "path/filepath" + "sort" + "time" + "unsafe" + + "github.com/gogf/gf/v2/errors/gcode" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + "github.com/samber/lo" + lop "github.com/samber/lo/parallel" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/tiger1103/gfast/v3/third/excel" + "github.com/xuri/excelize/v2" +) + +type workScheduleController struct { + BaseController +} + +var WorkSchedule = new(workScheduleController) + +// List 列表 +func (c *workScheduleController) List(ctx context.Context, req *system.WorkScheduleSearchReq) (res *system.WorkScheduleSearchRes, err error) { + res, err = service.WorkSchedule().List(ctx, req) + return +} + +// Get 获取工作计划 +func (c *workScheduleController) Get(ctx context.Context, req *system.WorkScheduleGetReq) (res *system.WorkScheduleGetRes, err error) { + res = new(system.WorkScheduleGetRes) + res.WorkScheduleInfoRes, err = service.WorkSchedule().GetById(ctx, req.Id) + return +} + +// Add 添加工作计划 +func (c *workScheduleController) Add(ctx context.Context, req *system.WorkScheduleAddReq) (res *system.WorkScheduleAddRes, err error) { + err = service.WorkSchedule().Add(ctx, req) + return +} + +// Edit 修改工作计划 +func (c *workScheduleController) Edit(ctx context.Context, req *system.WorkScheduleEditReq) (res *system.WorkScheduleEditRes, err error) { + err = service.WorkSchedule().Edit(ctx, req) + return +} + +// Delete 删除工作计划 +func (c *workScheduleController) Delete(ctx context.Context, req *system.WorkScheduleDeleteReq) (res *system.WorkScheduleDeleteRes, err error) { + err = service.WorkSchedule().Delete(ctx, req) + return +} + +// AddWorkSchedule 新增工作计划 +func (c *workScheduleController) AddWorkSchedule(ctx context.Context, req *system.WorkScheduleAdddReq) (res *system.WorkScheduleAdddRes, err error) { + // getWorkDetail 根据 workID 获取主项目ID,子项目ID,方阵ID + getWorkDetail := func(workID string) (int, int, int, error) { // 主项目ID,子项目ID,方阵ID + type WorkDetail struct { + SubProjectID int `json:"sub_project_id"` + ProjectID int `json:"project_id"` + FangzhenID int `json:"id"` + } + + workDetail := WorkDetail{} + err := dao.WorkStatus.Ctx(context.Background()).As("workStatusAlias").Where("workStatusAlias.work_id", workID). + InnerJoin("qianqi_fangzhen as fangzhenAlias", "workStatusAlias.fangzhen_id = fangzhenAlias.id"). + InnerJoin("sub_project as subProjectAlias", "fangzhenAlias.project_id = subProjectAlias.id"). + Fields("subProjectAlias.id as sub_project_id", "subProjectAlias.project_id as project_id", "fangzhenAlias.id").Scan(&workDetail) + + return workDetail.ProjectID, workDetail.SubProjectID, workDetail.FangzhenID, err + } + + // 获取任务状态 + workStatus := entity.WorkStatus{} + err = dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().WorkId, req.WorkID).Scan(&workStatus) + if err != nil { + return nil, err + } + + // 参数校验 + // 1. 验证计划总数是否有效 + if req.PlanNum <= 0 { + return nil, fmt.Errorf("无效的计划数量:%d,计划数量必须大于0", req.PlanNum) + } + + // 计算所有日计划的数量总和 + totalDailyPlans := lo.SumBy(req.PlanTime, func(detail system.ScheduleDetail) int { + return detail.PlanNum // 返回每个日计划的数量 + }) + + // 2. 确保日计划数量之和与总计划数量一致 + if totalDailyPlans != req.PlanNum { + return nil, fmt.Errorf("日计划数量总和:%d 与总计划数量:%d 不一致", totalDailyPlans, req.PlanNum) + } + + // 实际逻辑 + err = g.Try(ctx, func(ctx context.Context) { + detailedWorkSchedules := []*model.WorkScheduleDetail{} // 作为 Work_Schdule 的 Detail 字段 + + // 遍历传入的计划工期,构建每日工作计划详情 + for _, timePlan := range req.PlanTime { + scheduledDate, err := gtime.StrToTime(timePlan.Date) + liberr.ErrIsNil(ctx, err, "时间格式错误") + + // 添加到列表中 + detailedWorkSchedules = append(detailedWorkSchedules, &model.WorkScheduleDetail{ + Date: scheduledDate.Format("Y-m-d"), + PlanNum: timePlan.PlanNum, + }) + } + + // 序列化工作计划详情为 JSON 字符串 + schedulesJSON, _ := json.Marshal(detailedWorkSchedules) + schedulesJSONStr := *(*string)(unsafe.Pointer(&schedulesJSON)) + + // 解析出计划的开始时间和结束时间 + startDate, err := gtime.StrToTime(req.PlanTime[0].Date) // 开始时间 + liberr.ErrIsNil(ctx, err, "开始时间格式错误") + + endDate, err := gtime.StrToTime(req.PlanTime[len(req.PlanTime)-1].Date) // 结束时间 + liberr.ErrIsNil(ctx, err, "结束时间格式错误") + + // 获取该计划所拥有的 [主项目ID,子项目ID,方阵ID] + projectID, subProjectID, fangzhenID, err := getWorkDetail(req.WorkID) + liberr.ErrIsNil(ctx, err, "获取主项目ID,子项目ID,方阵ID失败") + + // 设置计划状态,默认为0,如果是延期则为3 + planStatus := 0 + if req.IsDelay != 0 { + planStatus = 3 + } + + // 添加计划 + _, err = dao.WorkSchedule.Ctx(ctx).Insert(&do.WorkSchedule{ + ProjectId: projectID, // 项目ID + SubProjectid: subProjectID, // 子项目ID + FangzhenId: fangzhenID, // 方阵ID + WorkId: req.WorkID, // 工作ID + StartAt: startDate, // 开始时间 + Detail: schedulesJSONStr, // 详情 + Status: planStatus, // 状态 + PlanNum: req.PlanNum, // 计划数量 + EndAt: endDate, // 结束时间 + }) + liberr.ErrIsNil(ctx, err, "保存到数据库失败") + + // 更新任务状态为进行中 + _, updateStatusErr := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().WorkId, req.WorkID).Data(g.Map{ + dao.WorkStatus.Columns().Status: 1, + }).Update() + liberr.ErrIsNil(ctx, updateStatusErr, "更新任务状态失败") + + // 检查是否为延期计划 + if req.IsDelay == 1 { + // 更新任务为延期状态 + _, err = dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().WorkId, req.WorkID). + Data(g.Map{ + dao.WorkStatus.Columns().IsDelay: 1, + }).Update() + liberr.ErrIsNil(ctx, err, "该 Work_status 修改为延期失败") + } + }) + + return &system.WorkScheduleAdddRes{}, err +} + +// GetLastWorkScheduleTime 获取指定 WorkID 下最后一个任务的结束时间 +func (c *workScheduleController) GetLastWorkScheduleTime(ctx context.Context, req *system.WorkScheduleLastTimeReq) (*system.WorkScheduleLastTimeRes, error) { + // 初始化结束时间 + var endAt *gtime.Time + + // 获取最新的工作计划 + lastWorkSchedule := entity.WorkSchedule{} + err := dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().WorkId, req.WorkID). + Fields(dao.WorkSchedule.Columns().EndAt).OrderDesc(dao.WorkSchedule.Columns().Id).Scan(&lastWorkSchedule) + + // 如果没有找到最新的工作计划,则设置结束时间为今日 + if err != nil { + endAt = gtime.Now().FormatTo("") // 设置结束时间为当前时间 + } else { + endAt = lastWorkSchedule.EndAt // 设置结束时间为最后的工作计划的结束时间 + } + + // 获取任务状态 + workState := entity.WorkStatus{} + err = dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().WorkId, req.WorkID).Scan(&workState) + if err != nil { + return nil, err + } + + // 延期计划 + if req.IsDelay == 1 { + // 非百分比计数 + if !isPercentage(workState.Type) { + // 剩余可选数量:WorkId 未绑定的设备总数 | SUM(PV_Module).Status = 0 + maxCapacity, err := dao.PvModule.Ctx(ctx).Where(dao.PvModule.Columns().WorkId, req.WorkID). + Where(dao.PvModule.Columns().Status, 0).Count() + if err != nil { + return nil, err + } + return &system.WorkScheduleLastTimeRes{EndAt: lastWorkSchedule.EndAt, RemainingNum: maxCapacity}, nil + } + + // 如果是百分比计数 + // 获取的剩余可选数量: (任务总量 - SUM(所有计划)的实际完成数量) | WorkStatus.Total - SUM(WorkSchedule.FinishedNum) + totalFinishedNum, err := dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().WorkId, req.WorkID). + Sum(dao.WorkSchedule.Columns().FinishedNum) + if err != nil { + return nil, fmt.Errorf("获取所有计划的实际完成数量失败") + } + + remainingWork := workState.Total - int(totalFinishedNum) // 剩余可选数量 + return &system.WorkScheduleLastTimeRes{EndAt: lastWorkSchedule.EndAt, RemainingNum: remainingWork}, nil + } + + // 当任务未延期时 + // 剩余可选数量: 任务总量 - ( SUM(所有计划)的计划数量 ) | WorkStatus.Total - SUM(WorkSchedule.PlanNum) + + totalScheduled, err := dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().WorkId, req.WorkID). + Sum(dao.WorkSchedule.Columns().PlanNum) // 所有计划的计划数量 + if err != nil { + return nil, fmt.Errorf("获取已存在排期所占用的容量失败") + } + + remainingWork := workState.Total - int(totalScheduled) // 剩余可选数量 + + return &system.WorkScheduleLastTimeRes{EndAt: endAt, RemainingNum: remainingWork}, nil +} + +// 如果是百分比 +func isPercentage(t int) bool { + return t >= 6 && t <= 10 +} + +// FetchWorkSchedule 对指定的工作计划进行提交日报 +func (c *workScheduleController) FetchWorkSchedule(ctx context.Context, req *system.WorkScheduleSubmitReq) (*system.WorkScheduleSubmitRes, error) { + var ( + requestedWorkID = req.WorkID + requestedScheduleID = req.ID + requestedSubmitTime = req.SubmitTime // 本次计划的提交时间 + requestedFinishedNum = req.FinishedNum // 本次计划的提交数量 + ) + + // 从数据库中获取 WorkSchedule 的数据 + var workSchedule model.WorkSchedule + if dao.WorkSchedule.Ctx(ctx).Fields(model.WorkSchedule{}).Where(dao.WorkSchedule.Columns().WorkId, requestedWorkID).Where(dao.WorkSchedule.Columns().Id, requestedScheduleID). + LeftJoin(`work_status`, "work_schedule.work_id = work_status.work_id").Scan(&workSchedule) != nil { + return nil, fmt.Errorf("获取计划详情失败") + } + + workStatusTotal := workSchedule.Total // 任务总量 + planTargetCount := workSchedule.PlanNum // 计划的目标数量 + + var scheduleDetails []model.WorkScheduleDetail + if err := json.Unmarshal([]byte(workSchedule.Detail), &scheduleDetails); err != nil { + return nil, fmt.Errorf("解析计划详情失败: %w", err) + } + + var ( + planStatus = 1 // 计划的状态 + taskStatus = 1 // 任务的状态 + + totalFinishedNum = 0 // 实际完成数量 + schedulesJSONStr string // 序列化后的计划详情 + ) + + func() { + // 更新指定日期的计划完成数量 + for i, schedule := range scheduleDetails { + if schedule.Date == requestedSubmitTime { + scheduleDetails[i].FinishedNum = requestedFinishedNum + } + totalFinishedNum += scheduleDetails[i].FinishedNum // 叠加实际完成数量 + } + + // 如果提交的完成数量等于计划的总数,将计划标记为已完成 + if totalFinishedNum >= workSchedule.PlanNum { + planStatus = 2 + } + + schedulesJSON, _ := json.Marshal(scheduleDetails) + schedulesJSONStr = *(*string)(unsafe.Pointer(&schedulesJSON)) + }() + + // 计算指定 WorkID 下所有工作计划的实际完成总数 + completedTasks, err := dao.WorkSchedule.Ctx(ctx). + WhereNot(dao.WorkSchedule.Columns().Id, requestedScheduleID). // 排除当前计划 + Where(dao.WorkSchedule.Columns().WorkId, requestedWorkID).Sum(dao.WorkSchedule.Columns().FinishedNum) + if err != nil { + return nil, fmt.Errorf("统计所有计划的实际完成数量失败: %w", err) + } + + // 所有计划的实际完成数量 + totalCompletedOrScheduled := int(completedTasks) + workSchedule.FinishedNum + + // 计算本次提交后的总完成数量 + totalAfterSubmission := totalCompletedOrScheduled + requestedFinishedNum + + // 如果本次提交的数量加上已完成的数量超过了任务总量 + if totalAfterSubmission >= workStatusTotal { + taskStatus = 2 // 任务状态标记为已完成 + planTargetCount = workStatusTotal // 如果一个计划的计划数量为 50,但是实际却提交了 100 个,那么修改计划的目标数量为 100 + } + + remainingTasks := workStatusTotal - totalCompletedOrScheduled // 剩余可选数量: 任务总量 - totalCompletedOrScheduled + // 禁止提交超过剩余任务量的任务 + if requestedFinishedNum > remainingTasks { + return nil, fmt.Errorf("本地提交的任务数量 %d 超过了剩余提交量 %d", requestedFinishedNum, remainingTasks) + } + + err = g.Try(ctx, func(ctx context.Context) { + workScheduleUpdates := g.Map{ + dao.WorkSchedule.Columns().PlanNum: planTargetCount, + dao.WorkSchedule.Columns().FinishedNum: totalFinishedNum, + dao.WorkSchedule.Columns().Detail: schedulesJSONStr, + dao.WorkSchedule.Columns().Status: planStatus, + } + + _, err = dao.WorkSchedule.Ctx(ctx). + Where(dao.WorkSchedule.Columns().WorkId, requestedWorkID). + Where(dao.WorkSchedule.Columns().Id, requestedScheduleID). + Data(workScheduleUpdates). + Update() + liberr.ErrIsNil(ctx, err, "更新计划表中的数据失败") + + _, err = dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().WorkId, requestedWorkID). + Data(g.Map{ + dao.WorkStatus.Columns().Finished: totalFinishedNum, // 实际完成数量 + dao.WorkStatus.Columns().Status: taskStatus, // 状态 + }).Update() + liberr.ErrIsNil(ctx, err, "更新表失败") + }) + return &system.WorkScheduleSubmitRes{}, err +} + +// 获取指定 WorkID 的日报详情 +func (s *workScheduleController) GetWorkScheduleDetail(ctx context.Context, req *system.WorkScheduleDetailReq) (*system.WorkScheduleDetailRes, error) { + // 获取指定 WorkID 的所有计划 + workSchedule := []entity.WorkSchedule{} + if err := dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().WorkId, req.WorkID).Scan(&workSchedule); err != nil { + return nil, err + } + + // 遍历 workSchedule 将其转换为 []ScheduleDetail + workScheduleDetails := []model.WorkScheduleDetail{} + lop.ForEach(workSchedule, func(item entity.WorkSchedule, _ int) { + // 反序列化 Detail + var scheduleDetails []model.WorkScheduleDetail + if err := json.Unmarshal([]byte(item.Detail), &scheduleDetails); err != nil { + return + } + + // 添加到列表中 + workScheduleDetails = append(workScheduleDetails, scheduleDetails...) + }) + + for i, schedule := range workScheduleDetails { + // 计算手动填充数量 + 识别数量 + workScheduleDetails[i].Total = schedule.AutoFill + schedule.FinishedNum + } + + // 按时间排序 + sort.Slice(workScheduleDetails, func(i, j int) bool { + return workScheduleDetails[i].Date < workScheduleDetails[j].Date + }) + + return &system.WorkScheduleDetailRes{List: workScheduleDetails}, nil +} + +// 获取导出的日报的可选日期 +func (s *workScheduleController) GetWorkScheduleDate(ctx context.Context, req *system.WorkScheduleExportDateReq) (*system.WorkScheduleExportDateRes, error) { + var ( + id string // 子项目ID 或者 方阵ID + column string + ) + + // 获取子项目ID 或者 方阵ID + if req.SubProjectID != "" { + id = req.SubProjectID + column = dao.WorkSchedule.Columns().SubProjectid + } else if req.FangzhenID != "" { + id = req.FangzhenID + column = dao.WorkSchedule.Columns().FangzhenId + } else { + return nil, nil + } + + // 获取下的所有工作计划 + workSchedule := []entity.WorkSchedule{} + if err := dao.WorkSchedule.Ctx(ctx).Where(column, id).Scan(&workSchedule); err != nil { + return nil, err + } + + // 遍历 workSchedule 将其转换为 []ScheduleDetail + workScheduleDetails := []model.WorkScheduleDetail{} + lop.ForEach(workSchedule, func(item entity.WorkSchedule, _ int) { + // 反序列化 Detail + var scheduleDetails []model.WorkScheduleDetail + if err := json.Unmarshal([]byte(item.Detail), &scheduleDetails); err != nil { + return + } + + // 添加到列表中 + workScheduleDetails = append(workScheduleDetails, scheduleDetails...) + }) + + // 按时间排序 + sort.Slice(workScheduleDetails, func(i, j int) bool { + return workScheduleDetails[i].Date < workScheduleDetails[j].Date + }) + + // 取出所有的日期 + dates := lo.FilterMap(workScheduleDetails, func(item model.WorkScheduleDetail, _ int) (string, bool) { + return item.Date, true + }) + + // 去重 + dates = lo.Uniq(dates) + if len(dates) < 1 { + return nil, fmt.Errorf("没有可选日期") + } + + return &system.WorkScheduleExportDateRes{StartTime: dates[0], EndTime: dates[len(dates)-1]}, nil +} + +// 导出 Excel +func (s *workScheduleController) ExportWorkSchedule(ctx context.Context, req *system.WorkScheduleExportExcelReq) (*system.WorkScheduleExportExcelRes, error) { + var ( + list []*model.WorkStatusProgressRes + err error + + projectName, subProjectName string + ) + + // 判断传入的方阵或子项目是否为空 + if !service.WorkSchedule().IsExistWorkSchedule(ctx, req.SubProjectID, req.FangzhenID, req.StartTime, req.EndTime) { + return nil, gerror.NewCode(gcode.New(0, fmt.Sprintf("%s 至 %s 日内没有可导出计划", req.StartTime, req.EndTime), nil)) + } + + // 导出指定方阵的情况下 + if req.FangzhenID != "" { + // 获取方阵下的所有工作计划 + list, _, err = excel.ExportExcel(req.FangzhenID, req.StartTime, req.EndTime) + if err != nil { + return nil, err + } + + // 子项目名,方阵名 + projectName, subProjectName = excel.GetSubProjectName(req.FangzhenID) + } else { + // 导出一个子项目的情况 + list, _, _ = excel.AccumulateProject(req.SubProjectID, req.StartTime, req.EndTime) + + // 大项目名,子项目名 + projectName, subProjectName = excel.GetNameById(req.SubProjectID) + } + + // 拼接表头 + tableName := fmt.Sprintf("%s (%s) %s-%s", projectName, subProjectName, req.StartTime, req.EndTime) + + // 获取由 AI 填报的部分 + autoFill, err := getAutoFill(list, req.StartTime, req.EndTime) + if err != nil { + return nil, err + } + + // 写入到 Excel 中 + excel, err := excel.WriteExcel(tableName, list, autoFill) + if err != nil { + return nil, err + } + + // 生成随机文件名 + filename := fmt.Sprintf("%s-%d%d.xlsx", tableName, time.Now().Unix(), rand.Intn(1000)) + + // 拼接保存路径 + dirPath := filepath.Join(coryCommon.GetCWD(), coryCommon.Temporary, time.Now().Format("2006-01-02")) + savePath := filepath.Join(dirPath, filename) + + // 如果目录不存在则创建 + if _, err := os.Stat(dirPath); os.IsNotExist(err) { + if err := os.MkdirAll(dirPath, os.ModePerm); err != nil { + return nil, err + } + } + + // 保存Excel文件 + if err := excel.SaveAs(savePath); err != nil { + return nil, err + } + + // 获取相对路径 + relativePath, err := filepath.Rel(filepath.Join(coryCommon.GetCWD(), "resource/public"), savePath) + if err != nil { + return nil, err + } + + return &system.WorkScheduleExportExcelRes{ + FilePath: "/file/" + relativePath, + }, nil +} + +// 导出周报 +func (s *workScheduleController) ExportWeek(ctx context.Context, req *system.WorkScheduleExportWeekReq) (*system.WorkScheduleExportExcelRes, error) { + var ( + list []*model.WorkStatusProgressRes + err error + + // projectName, subProjectName string + + excelMap = make(map[string]excel.ExcelInfo) + ) + + // 判断传入的方阵或子项目是否为空 + if !service.WorkSchedule().IsExistWorkSchedule(ctx, req.SubProjectID, req.FangzhenID, req.StartTime, req.EndTime) { + list = []*model.WorkStatusProgressRes{} + } + + // 导出指定方阵的情况下 + if req.FangzhenID != "" { + // 获取方阵下的所有工作计划 + list, excelMap, err = excel.ExportExcel(req.FangzhenID, req.StartTime, req.EndTime) + if err != nil { + return nil, fmt.Errorf("获取方阵下的所有工作计划失败") + } + + // 子项目名,方阵名 + // projectName, subProjectName = excel.GetSubProjectName(req.FangzhenID) + } else { + // 导出一个子项目的情况 + list, excelMap, err = excel.AccumulateProject(req.SubProjectID, req.StartTime, req.EndTime) + if err != nil { + return nil, fmt.Errorf("导出一个子项目的情况失败") + } + + // 大项目名,子项目名 + // projectName, subProjectName = excel.GetNameById(req.SubProjectID) + } + sheetName := "Sheet1" + + // 创建 Excel 模板 + f, err := excel.CreateExcelTemplate() + if err != nil { + return nil, err + } + + // 设置表头 k2 日期 + // startat - endat + f.SetCellValue("Sheet1", "K2", fmt.Sprintf("%s - %s", req.StartTime, req.EndTime)) + + // 获取周数 + week, err := excel.GetWeekNumbers(req.EndTime) + if err != nil { + return nil, err + } + + // i2 周数 + f.SetCellValue("Sheet1", "I2", week) + + // D4 开工日期: 2023-03-20 + projectInfo := entity.SysProject{} + err = dao.SysProject.Ctx(ctx).Where(dao.SysProject.Columns().Id, req.ProjectID).Scan(&projectInfo) + if err != nil { + return nil, err + } + + // A1 项目名称 + "周报" + f.SetCellValue("Sheet1", "A1", projectInfo.ProjectName+"周报") + + // C2 项目名称 + f.SetCellValue("Sheet1", "C2", projectInfo.ProjectName) + + f.SetCellValue("Sheet1", "D4", projectInfo.OnStreamTime.Format("Y-m-d")) + + index := 10 + + // 处理施工进度 + for _, item := range list { + postionName := item.Name + + for _, child := range item.Children { + excel.SetExcelValue(f, sheetName, index, child, excelMap, postionName) + + if lo.Must(f.GetCellValue(sheetName, fmt.Sprintf("C%d", index+1))) == "设备材料名称" && index+1 != 38 { + f.InsertRows(sheetName, index+1, 1) + } + + index++ + } + } + + mergeAndStyle := func(col string) { + cellRange := fmt.Sprintf("%s9", col) + _ = f.MergeCell(sheetName, cellRange, fmt.Sprintf("%s%d", col, index-1)) + f.SetCellStyle(sheetName, cellRange, fmt.Sprintf("%s%d", col, index-1), lo.Must(f.NewStyle(excel.Style))) + } + + // A9 ,B9 向下合并到 index + mergeAndStyle("A") + mergeAndStyle("B") + + // 材料 + equipmentMaterials, err := excel.GetEquipmentMaterials(req.ProjectID, req.StartTime, req.EndTime) + + index = 39 // 从第 39 行开始 + + for _, item := range equipmentMaterials { + // 如果 B + index 为 "存在问题及需要协调的事项" 则新增一行 + if lo.Must(f.GetCellValue(sheetName, fmt.Sprintf("B%d", index))) == "存在问题及需要协调的事项" { + f.InsertRows(sheetName, index, 1) + } + + f.SetCellValue(sheetName, fmt.Sprintf("C%d", index), item.EquipmentMaterialsName) // 设备材料名称 + f.SetCellStyle(sheetName, fmt.Sprintf("C%d", index), fmt.Sprintf("C%d", index), lo.Must(f.NewStyle(excel.Style))) + + f.SetCellStyle(sheetName, fmt.Sprintf("D%d", index), fmt.Sprintf("D%d", index), lo.Must(f.NewStyle(excel.Style))) + f.SetCellStyle(sheetName, fmt.Sprintf("E%d", index), fmt.Sprintf("E%d", index), lo.Must(f.NewStyle(excel.Style))) + + f.SetCellValue(sheetName, fmt.Sprintf("F%d", index), item.TotalQuantityCount) // 设计数量 + f.SetCellStyle(sheetName, fmt.Sprintf("F%d", index), fmt.Sprintf("F%d", index), lo.Must(f.NewStyle(excel.Style))) + + f.SetCellValue(sheetName, fmt.Sprintf("G%d", index), item.TotalNumber) // 本周 + f.SetCellStyle(sheetName, fmt.Sprintf("G%d", index), fmt.Sprintf("G%d", index), lo.Must(f.NewStyle(excel.Style))) + + f.SetCellValue(sheetName, fmt.Sprintf("H%d", index), item.CumulativeArrivalQuantity) // 累计到货数量 + f.SetCellStyle(sheetName, fmt.Sprintf("H%d", index), fmt.Sprintf("H%d", index), lo.Must(f.NewStyle(excel.Style))) + + // 累计到货率 + cumulativeArrivalRate := 0.0 + if item.TotalQuantityCount != 0 { + cumulativeArrivalRate = float64(item.CumulativeArrivalQuantity) / float64(item.TotalQuantityCount) + } + f.SetCellValue(sheetName, fmt.Sprintf("I%d", index), cumulativeArrivalRate) + f.SetCellStyle(sheetName, fmt.Sprintf("I%d", index), fmt.Sprintf("I%d", index), lo.Must(f.NewStyle(excel.Style))) + + // 合并 jk 单元格 + _ = f.MergeCell(sheetName, fmt.Sprintf("J%d", index), fmt.Sprintf("K%d", index)) + f.SetCellStyle(sheetName, fmt.Sprintf("J%d", index), fmt.Sprintf("K%d", index), lo.Must(f.NewStyle(excel.Style))) + + // 水平居中 jk 单元格 + f.SetCellStyle(sheetName, fmt.Sprintf("J%d", index), fmt.Sprintf("K%d", index), lo.Must(f.NewStyle(&excelize.Style{ + Border: []excelize.Border{ + {Type: "left", Color: "000000", Style: 1}, + {Type: "top", Color: "000000", Style: 1}, + {Type: "bottom", Color: "000000", Style: 1}, + {Type: "right", Color: "000000", Style: 1}, + }, + Fill: excelize.Fill{}, + Font: nil, + Alignment: &excelize.Alignment{ + Horizontal: "center", // 水平居中 + Indent: 0, + JustifyLastLine: false, + ReadingOrder: 0, + RelativeIndent: 0, + ShrinkToFit: false, + TextRotation: 0, + Vertical: "", // 垂直居中 + WrapText: false, + }, + }))) + + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", "L", index), fmt.Sprintf("%s%d", "L", index), lo.Must(f.NewStyle(excel.Style))) + index++ + } + + // 合并 A38 和 B38 至 index + f.MergeCell(sheetName, "A38", fmt.Sprintf("A%d", index-1)) + f.SetCellStyle(sheetName, "A38", fmt.Sprintf("A%d", index-1), lo.Must(f.NewStyle(excel.Style))) + + f.MergeCell(sheetName, "B38", fmt.Sprintf("B%d", index-1)) + f.SetCellStyle(sheetName, "B38", fmt.Sprintf("B%d", index-1), lo.Must(f.NewStyle(excel.Style))) + + // j4 总进度完成率 + f.SetCellValue(sheetName, "J4", excel.CalculateTotalProgress(list)) + + // 生成随机文件名 + filename := fmt.Sprintf("%s-%d%d.xlsx", projectInfo.ProjectName, time.Now().Unix(), rand.Intn(1000)) + + dirPath := filepath.Join(coryCommon.GetCWD(), coryCommon.Temporary, time.Now().Format("2006-01-02")) + savePath := filepath.Join(dirPath, filename) + + // 如果目录不存在则创建 + if _, err := os.Stat(dirPath); os.IsNotExist(err) { + if err := os.MkdirAll(dirPath, os.ModePerm); err != nil { + return nil, err + } + } + + // 保存 Excel 文件 + if err := f.SaveAs(savePath); err != nil { + return nil, err + } + + // 获取相对路径 + relativePath, err := filepath.Rel(filepath.Join(coryCommon.GetCWD(), "resource/public"), savePath) + if err != nil { + return nil, err + } + + return &system.WorkScheduleExportExcelRes{ + FilePath: "/file/" + relativePath, + }, nil +} + +// 根据起始时间和结束时间,获取在此期间中由 AI 填报的部分 +// 传入 list 和起始时间和结束时间,对传入的 list 对修改 +func getAutoFill(list []*model.WorkStatusProgressRes, startTime, endTime string) (map[string]int, error) { + filteredList := []model.WorkStatusProgressRes{} + for _, item := range list { + filteredList = append(filteredList, item.Children...) + } + + // 获取 WorkIDS + workIDs := lo.FilterMap(filteredList, func(item model.WorkStatusProgressRes, _ int) (string, bool) { + if item.WorkType >= 13 && item.WorkType <= 15 { // 13-15 可被 AI 填报 + return item.WorkID, true + } + return "", false + }) + + // 在 Pv_Module 表中查找 WorkID 在 startTime 和 endTime 之间由 AI 填报的数量 + var modules []entity.PvModule + if dao.PvModule.Ctx(context.Background()).WhereIn(dao.PvModule.Columns().WorkId, workIDs).Where(dao.PvModule.Columns().Status, 3).Scan(&modules) != nil { + return nil, fmt.Errorf("获取 Pv_Module 数据失败") + } + + result := make(map[string]int) + // 筛选出在 startTime 和 endTime 之间的 modules + for _, module := range modules { + if module.DoneTime >= startTime && module.DoneTime <= endTime { + result[module.WorkId]++ + } + } + + return result, nil +} diff --git a/internal/app/system/controller/work_status.go b/internal/app/system/controller/work_status.go new file mode 100644 index 0000000..b91e492 --- /dev/null +++ b/internal/app/system/controller/work_status.go @@ -0,0 +1,255 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-03-19 11:45:09 +// 生成路径: internal/app/system/controller/work_status.go +// 生成人:gfast +// desc:工作状态 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "fmt" + "sort" + + "github.com/gogf/gf/v2/frame/g" + "github.com/samber/lo" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/third/schduler" +) + +type workStatusController struct { + BaseController +} + +var WorkStatus = new(workStatusController) + +// List 列表 +func (c *workStatusController) List(ctx context.Context, req *system.WorkStatusSearchReq) (res *system.WorkStatusSearchRes, err error) { + res, err = service.WorkStatus().List(ctx, req) + return +} + +// Get 获取工作状态 +func (c *workStatusController) Get(ctx context.Context, req *system.WorkStatusGetReq) (res *system.WorkStatusGetRes, err error) { + res = new(system.WorkStatusGetRes) + res.WorkStatusInfoRes, err = service.WorkStatus().GetById(ctx, req.Id) + return +} + +// Add 添加工作状态 +func (c *workStatusController) Add(ctx context.Context, req *system.WorkStatusAddReq) (res *system.WorkStatusAddRes, err error) { + err = service.WorkStatus().Add(ctx, req) + return +} + +// Edit 修改工作状态 +func (c *workStatusController) Edit(ctx context.Context, req *system.WorkStatusEditReq) (res *system.WorkStatusEditRes, err error) { + err = service.WorkStatus().Edit(ctx, req) + return +} + +// Delete 删除工作状态 +func (c *workStatusController) Delete(ctx context.Context, req *system.WorkStatusDeleteReq) (res *system.WorkStatusDeleteRes, err error) { + err = service.WorkStatus().Delete(ctx, req.Ids) + return +} + +// 传入方阵ID 获取对应的进度图 +func (c *workStatusController) Progress(ctx context.Context, req *system.WorkStatusGetProgressReq) (*system.WorkStatusGetProgressRes, error) { + list, err := service.WorkStatus().Progress(ctx, req.FangzhenId) + if err != nil { + return nil, err + } + return &system.WorkStatusGetProgressRes{Progress: list}, nil +} + +// App 获取指定父级 +func (c *workStatusController) GetSubProjectWorkStatus(ctx context.Context, req *system.WorkStatusGetSubProjectReq) (*system.WorkStatusGetSubProjectRes, error) { + sub := g.Model("work_status").Fields(dao.WorkStatus.Columns().Id).Where(dao.WorkStatus.Columns().WorkId, req.WorkID) + + // 获取父级项目下的所有子级项目 + workStatusList := []entity.WorkStatus{} + if err := dao.WorkStatus.Ctx(ctx).WhereIn(dao.WorkStatus.Columns().Parent, sub).Scan(&workStatusList); err != nil { + return nil, err + } + + if len(workStatusList) == 0 { + return nil, fmt.Errorf("未找到子级计划") + } + + // 从 workStatusList 中提取所有 WorkId + filteredWorkIds := lo.FilterMap(workStatusList, func(status entity.WorkStatus, _ int) (string, bool) { + return status.WorkId, true + }) + + // 根据 WorkId 获取所有工作计划 + workSchedules := []entity.WorkSchedule{} + if err := dao.WorkSchedule.Ctx(ctx).WhereIn(dao.WorkSchedule.Columns().WorkId, filteredWorkIds).Scan(&workSchedules); err != nil { + return nil, err + } + + scheduleMap, err := schduler.New(workSchedules) + if err != nil { + return nil, fmt.Errorf("初始化计划失败: %w", err) + } + + // 构造为 []*model.WorkStatusProgressRes + workStatusProgressRes := make([]*model.WorkStatusProgressRes, len(workStatusList)) + for i, WorkStatus := range workStatusList { + + // 根据 WorkID 获取计划总量和实际进度 + finishedPtr, total := scheduleMap.Get(WorkStatus.WorkId) + + // 判断是否延期 + isDelay := scheduleMap.GetStatus(WorkStatus.WorkId, WorkStatus.Total) + + // 如果总量和实际完成量相等 + if WorkStatus.Total == WorkStatus.Finished && WorkStatus.Status != 3 { + if WorkStatus.Total != 0 && WorkStatus.Finished != 0 { // 防止两者都为初始化值 + WorkStatus.Status = 2 // 修改状态为已完成 + } + } + + // 如果计划总量大于实际进度,则取实际总量 + if total > WorkStatus.Total { + total = WorkStatus.Total + } + + workStatusProgressRes[i] = &model.WorkStatusProgressRes{ + ID: int(WorkStatus.Id), // ID + WorkID: WorkStatus.WorkId, // 工作ID + Name: WorkStatus.WorkName, // 工作名称 + Total: WorkStatus.Total, // 总量 + Finished: WorkStatus.Finished, // 完成量 + Startat: WorkStatus.StartAt.String(), // 开始时间 + Endat: WorkStatus.EndAt.String(), // 结束时间 + Status: WorkStatus.Status, // 状态 + IsPercent: WorkStatus.IsPercent, // 是否为百分比 + WorkType: WorkStatus.Type, // 工作类型 + IsDelay: &isDelay, // 是否延期 + PlanProgress: &model.PlanProgress{ + Total: &total, // 计划总量 + Finished: &finishedPtr, // 实际完成量 + }, + } + } + + return &system.WorkStatusGetSubProjectRes{ + Progress: workStatusProgressRes, + }, nil +} + +// 获取父级进度 +func (c *workStatusController) GetParentProgress(ctx context.Context, req *system.WorkStatusGetParentProgressReq) (*system.WorkStatusGetProgressRes, error) { + return service.WorkStatus().GetParentProgress(ctx, req) +} + +// 删除父项目或子项目 +func (c *workStatusController) DeleteParent(ctx context.Context, req *system.WorkStatusDeleteParentReq) (*system.WorkStatusDeleteParentRes, error) { + // 如果传入的是父级ID,那么删除父级ID下的所有子级 + + // 判断是否是父级 + exist, err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().WorkId, req.WorkID).WhereNull(dao.WorkStatus.Columns().Parent).Count() + if err != nil { + return nil, err + } + + if exist > 0 { + // 删除父级 + if _, err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().WorkId, req.WorkID).Delete(); err != nil { + return nil, err + } + + // 删除子级 + if _, err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().Parent, req.WorkID).Delete(); err != nil { + return nil, err + } + + return &system.WorkStatusDeleteParentRes{}, nil + } + + // 删除子级 + if _, err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().WorkId, req.WorkID).Delete(); err != nil { + return nil, err + } + + return &system.WorkStatusDeleteParentRes{}, nil +} + +// 获取主项目下的子项目和子项目下的所有方阵 +func (c *workStatusController) GetTree(ctx context.Context, req *system.WorkStatusGetTreeReq) (*system.WorkStatusGetTreeRes, error) { + subProjects := []entity.SubProject{} + if err := dao.SubProject.Ctx(context.Background()).Where(dao.SubProject.Columns().ProjectId, req.ProjectID).Scan(&subProjects); err != nil { + return nil, nil + } + + // 树形结构 WorkStatusTreeRes + workStatusTree := []model.WorkStatusTreeRes{} + + // 遍历子项目 + for _, subProject := range subProjects { + // 根据子项目ID获取所有方阵 + fangzhens := []entity.QianqiFangzhen{} + if err := dao.QianqiFangzhen.Ctx(context.Background()).Where(dao.QianqiFangzhen.Columns().ProjectId, subProject.Id).Scan(&fangzhens); err != nil { + return nil, err + } + + workStatusTree = append(workStatusTree, model.WorkStatusTreeRes{ + Name: subProject.ProjectName, + ProjectID: int(subProject.Id), + Children: func() []model.WorkStatusChild { + workStatusChildren := make([]model.WorkStatusChild, len(fangzhens)) + for i := 0; i < len(fangzhens); i++ { + fangzhen := fangzhens[i] + workStatusChildren[i] = model.WorkStatusChild{ + SubProjectID: fangzhen.Id, + Name: fangzhen.Name, + } + } + + // 对 workStatusChildren 排序 + // Name 为 T01,T02 字符串 要求按照 T01,T02 排序 + sort.Slice(workStatusChildren, func(i, j int) bool { + return workStatusChildren[i].Name > workStatusChildren[j].Name + //return workStatusChildren[i].Name < workStatusChildren[j].Name + }) + + return workStatusChildren + }(), + }) + } + + return &system.WorkStatusGetTreeRes{ + Tree: workStatusTree, + }, nil +} + +func (c *workStatusController) GetWorkStatus(ctx context.Context, req *system.WorkStatusQueryReq) (res *system.WorkStatusQueryRes, err error) { + // 获取主项目下的子项目和子项目下的所有方阵 + subProjects := []entity.SubProject{} + if err := dao.SubProject.Ctx(context.Background()).Where(dao.SubProject.Columns().ProjectId, req.ProjectID).Scan(&subProjects); err != nil { + return nil, nil + } + + // 遍历子项目 + for _, subProject := range subProjects { + // 根据子项目ID获取所有方阵 + fangzhens := []entity.QianqiFangzhen{} + if err := dao.QianqiFangzhen.Ctx(context.Background()).Where(dao.QianqiFangzhen.Columns().ProjectId, subProject.Id).Scan(&fangzhens); err != nil { + return nil, nil + } + + // // 遍历方阵 + // for _, fangzhen := range fangzhens { + // } + } + + return nil, nil +} diff --git a/internal/app/system/controller/xiangmuhuafenbiao.go b/internal/app/system/controller/xiangmuhuafenbiao.go new file mode 100644 index 0000000..eb5c2f4 --- /dev/null +++ b/internal/app/system/controller/xiangmuhuafenbiao.go @@ -0,0 +1,85 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-10-07 16:08:10 +// 生成路径: internal/app/system/controller/xiangmuhuafenbiao.go +// 生成人:gfast +// desc:项目划分 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type xiangmuhuafenbiaoController struct { + BaseController +} + +var Xiangmuhuafenbiao = new(xiangmuhuafenbiaoController) + +// List 列表 +func (c *xiangmuhuafenbiaoController) List(ctx context.Context, req *system.XiangmuhuafenbiaoSearchReq) (res *system.XiangmuhuafenbiaoSearchRes, err error) { + res, err = service.Xiangmuhuafenbiao().List(ctx, req) + return +} + +// Get 获取项目划分 +func (c *xiangmuhuafenbiaoController) Get(ctx context.Context, req *system.XiangmuhuafenbiaoGetReq) (res *system.XiangmuhuafenbiaoGetRes, err error) { + res = new(system.XiangmuhuafenbiaoGetRes) + res.XiangmuhuafenbiaoInfoRes, err = service.Xiangmuhuafenbiao().GetById(ctx, req.Id) + return +} + +// Add 添加项目划分 +func (c *xiangmuhuafenbiaoController) Add(ctx context.Context, req *system.XiangmuhuafenbiaoAddReq) (res *system.XiangmuhuafenbiaoAddRes, err error) { + err = service.Xiangmuhuafenbiao().Add(ctx, req) + return +} + +// Edit 修改项目划分 +func (c *xiangmuhuafenbiaoController) Edit(ctx context.Context, req *system.XiangmuhuafenbiaoEditReq) (res *system.XiangmuhuafenbiaoEditRes, err error) { + err = service.Xiangmuhuafenbiao().Edit(ctx, req) + return +} + +// Delete 删除项目划分 +func (c *xiangmuhuafenbiaoController) Delete(ctx context.Context, req *system.XiangmuhuafenbiaoDeleteReq) (res *system.XiangmuhuafenbiaoDeleteRes, err error) { + err = service.Xiangmuhuafenbiao().Delete(ctx, req.Ids) + return +} + +// EditExcelFunc 修改excel数据 +func (c *xiangmuhuafenbiaoController) EditExcelFunc(ctx context.Context, req *system.EditExcelFuncReq) (res *system.XiangmuhuafenbiaoEditRes, err error) { + err = service.Xiangmuhuafenbiao().EditExcelFunc(ctx, req) + return +} + +// MultipleProjectsListFunc 返回当前项目下所有相同zhixingbiaohao的excel数据 +func (c *xiangmuhuafenbiaoController) MultipleProjectsListFunc(ctx context.Context, req *system.MultipleProjectsListFuncReq) (res *system.MultipleProjectsListFuncRes, err error) { + res = new(system.MultipleProjectsListFuncRes) + var entity []*system.MultipleProjectsListFuncOne + dao.Xiangmuhuafenbiao.Ctx(ctx).As("a"). + Fields("a.id,a.json,b.filen_path as filenPath,a.name,a.zhixingbiaohao"). + LeftJoin("document as b on b.`name` = a.zhixingbiaohao"). + Where("a.zhixingbiaohao", req.ExecutionTableNumber). + Where("a.project_id", req.ProjectId). + Scan(&entity) + for _, da := range entity { + json := da.Json + if json != "" { + data, err2 := coryCommon.PutJson(json) + if err2 != nil { + err = err2 + } + da.Json = data + } + } + res.List = entity + return +} diff --git a/internal/app/system/controller/ys7devices.go b/internal/app/system/controller/ys7devices.go new file mode 100644 index 0000000..caf0585 --- /dev/null +++ b/internal/app/system/controller/ys7devices.go @@ -0,0 +1,921 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-03-01 12:49:32 +// 生成路径: internal/app/system/controller/ys7devices.go +// 生成人:gfast +// desc:荧石摄像头 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/os/gctx" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/common/shp" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + logic "github.com/tiger1103/gfast/v3/internal/app/system/logic/busViolationLevel" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/tiger1103/gfast/v3/third/arithmetic/SpartaApi" + "github.com/tiger1103/gfast/v3/third/ys7" + "log" + "os" + "path/filepath" + "strconv" + "strings" + "sync" + "time" +) + +type ys7DevicesController struct { + BaseController +} + +var Ys7Devices = new(ys7DevicesController) + +// List 列表 +func (c *ys7DevicesController) List(ctx context.Context, req *system.Ys7DevicesSearchReq) (res *system.Ys7DevicesSearchRes, err error) { + res, err = service.Ys7Devices().List(ctx, req) + return +} + +// Get 获取荧石摄像头 +func (c *ys7DevicesController) Get(ctx context.Context, req *system.Ys7DevicesGetReq) (res *system.Ys7DevicesGetRes, err error) { + res = new(system.Ys7DevicesGetRes) + res.Ys7DevicesInfoRes, err = service.Ys7Devices().GetById(ctx, req.Id) + return +} + +// Add 添加荧石摄像头 +func (c *ys7DevicesController) Add(ctx context.Context, req *system.Ys7DevicesAddReq) (res *system.Ys7DevicesAddRes, err error) { + err = service.Ys7Devices().Add(ctx, req) + return +} + +// Edit 修改荧石摄像头 +func (c *ys7DevicesController) Edit(ctx context.Context, req *system.Ys7DevicesEditReq) (res *system.Ys7DevicesEditRes, err error) { + err = service.Ys7Devices().Edit(ctx, req) + return +} + +// Delete 删除荧石摄像头 +func (c *ys7DevicesController) Delete(ctx context.Context, req *system.Ys7DevicesDeleteReq) (res *system.Ys7DevicesDeleteRes, err error) { + err = service.Ys7Devices().Delete(ctx, req.Ids) + return +} + +// BindProject摄像头绑定项目 +func (c *ys7DevicesController) BindProject(ctx context.Context, req *system.Ys7DevicesBindProjectReq) (*system.Ys7DevicesBindProjectRes, error) { + // 遍历 DeviceSerial 更新项目ID + for _, deviceSerial := range req.List.DeviceSerial { + _, err := dao.Ys7Devices.Ctx(ctx).Where("DeviceSerial", deviceSerial). + Update(g.Map{ + "ProjectId": req.List.ProjectId, + }) + if err != nil { + return nil, err + } + } + + return &system.Ys7DevicesBindProjectRes{}, nil +} + +func (s *ys7DevicesController) EditPosition(ctx context.Context, req *system.Ys7DevicesEditPositionReq) (*system.Ys7DevicesEditPositionRes, error) { + err := g.Try(ctx, func(ctx context.Context) { + dt := shp.Detail{} + if err := json.Unmarshal([]byte(req.Position), &dt); err != nil { + return + } + + dt.Position.Lng, dt.Position.Lat = coryCommon.GCJ02toWGS84(dt.Position.Lng, dt.Position.Lat) + data, err := json.Marshal(dt) + if err != nil { + return + } + _, err = dao.Ys7Devices.Ctx(ctx).WherePri(req.Id).Update(g.Map{ + "Detail": string(data), + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + + return &system.Ys7DevicesEditPositionRes{}, err +} + +// 根据项目ID获取摄像头列表 +func (s *ys7DevicesController) GetListByProjectId(ctx context.Context, req *system.Ys7DevicesGetByProjectIdReq) (listRes *system.Ys7DevicesGetByProjectIdRes, err error) { + listRes = new(system.Ys7DevicesGetByProjectIdRes) + + m := dao.Ys7Devices.Ctx(ctx).WithAll().Where(dao.Ys7Devices.Columns().ProjectId, req.ProjectId) + + listRes.Total, err = m.Count() + if err != nil { + return nil, err + } + + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "sort desc,id desc" + + var res []*model.Ys7DevicesInfoRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + if err != nil { + return nil, err + } + + listRes.List = make([]*model.Ys7DevicesList2Res, len(res)) + for k, v := range res { + listRes.List[k] = &model.Ys7DevicesList2Res{ + Id: v.Id, + DeviceSerial: v.DeviceSerial, + DeviceName: v.DeviceName, + ProjectId: v.ProjectId, + Token: ys7.Ys72Instance.GetAccessToken(), + } + } + + return +} + +// 获取视频播放地址 +func (s *ys7DevicesController) GetVideoUrl(ctx context.Context, req *system.Ys7DevicesGetVideoUrlReq) (res *system.Ys7DevicesGetVideoUrlRes, err error) { + Device, err := ys7.Ys72Instance.GetDevice(req.DeviecesSerial) + if err != nil { + return nil, err + } + + liveUrl, err := Device.GetLiveAddress() + if err != nil { + return nil, err + } + + return &system.Ys7DevicesGetVideoUrlRes{ + VideoUrl: liveUrl, + }, nil +} + +// 获取AccessToken +func (s *ys7DevicesController) GetAccessToken(ctx context.Context, req *system.Ys7DevicesGetAccessTokenReq) (res *system.Ys7DevicesGetAccessTokenRes, err error) { + return &system.Ys7DevicesGetAccessTokenRes{ + Token: ys7.GetAccessToken(), + }, nil +} + +// GIS 前端调用修改摄像头信息 +func (s *ys7DevicesController) EditGis(ctx context.Context, req *system.Ys7DevicesEditGisReq) (res *system.Ys7DevicesEditGisRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err := dao.Ys7Devices.Ctx(ctx).WherePri(req.Id).Update(do.Ys7Devices{ + DeviceSerial: req.DeviceSerial, + DeviceName: req.DeviceName, + Detail: req.Detail, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return &system.Ys7DevicesEditGisRes{}, err +} + +// 开启视频加密 +func (s *ys7DevicesController) OpenEncrypt(ctx context.Context, req *system.Ys7DevicesOpenEncryptReq) (res *system.Ys7DevicesOpenEncryptRes, err error) { + Device, err := ys7.Ys72Instance.GetDevice(req.DeviceSerial) + if err != nil { + return nil, err + } + + r := ghttp.RequestFromCtx(ctx) + r.Response.ClearBuffer() + + err = Device.OpenEncrypt() + if err != nil { + r.Response.WriteJson(fmt.Sprintf(`{"code":1,"message":"开启加密失败:%s"}`, err.Error())) + return nil, err + } + + r.Response.WriteJson(`{"code":0,"message":"开启加密成功"}`) + return &system.Ys7DevicesOpenEncryptRes{}, nil +} + +// 关闭视频加密 +func (s *ys7DevicesController) CloseEncrypt(ctx context.Context, req *system.Ys7DevicesCloseEncryptReq) (res *system.Ys7DevicesCloseEncryptRes, err error) { + Device, err := ys7.Ys72Instance.GetDevice(req.DeviceSerial) + if err != nil { + return nil, err + } + + r := ghttp.RequestFromCtx(ctx) + r.Response.ClearBuffer() + + err = Device.CloseEncrypt() + if err != nil { + r.Response.WriteJson(fmt.Sprintf(`{"code":1,"message":"%s"}`, err.Error())) + return nil, err + } + + r.Response.WriteJson(`{"code":0,"message":"关闭加密成功"}`) + return &system.Ys7DevicesCloseEncryptRes{}, nil +} + +// 小程序获取设备列表 +func (s *ys7DevicesController) GetListByProjectIdForMini(ctx context.Context, req *system.Ys7DevicesGetListReq) (listRes *system.Ys7DevicesGetListRes, err error) { + listRes = new(system.Ys7DevicesGetListRes) + + m := dao.Ys7Devices.Ctx(ctx).WithAll() + + if req.Id != "" { + m = m.Where(dao.Ys7Devices.Columns().Id+" = ?", req.Id) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.Ys7Devices.Columns().CreatedAt+" >=? AND "+dao.Ys7Devices.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.DeviceSerial != "" { + m = m.Where(dao.Ys7Devices.Columns().DeviceSerial+" = ?", req.DeviceSerial) + } + if req.DeviceName != "" { + m = m.Where(dao.Ys7Devices.Columns().DeviceName+" like ?", "%"+req.DeviceName+"%") + } + if req.DeviceType != "" { + m = m.Where(dao.Ys7Devices.Columns().DeviceType+" = ?", req.DeviceType) + } + if req.Status != "" { + m = m.Where(dao.Ys7Devices.Columns().Status+" = ?", gconv.Int(req.Status)) + } + if req.Defence != "" { + m = m.Where(dao.Ys7Devices.Columns().Defence+" = ?", gconv.Int64(req.Defence)) + } + if req.DeviceVersion != "" { + m = m.Where(dao.Ys7Devices.Columns().DeviceVersion+" = ?", req.DeviceVersion) + } + if req.ProjectId != "" { + m = m.Where(dao.Ys7Devices.Columns().ProjectId+" = ?", req.ProjectId) + } + + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + + var res []*model.Ys7DevicesInfoRes + err = m.Fields(system.Ys7DevicesSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + + listRes.List = make([]*model.Ys7DevicesList3Res, len(res)) + for k, v := range res { + // redis 中获取封面图 + value, err := g.Redis().Get(ctx, "ys7:capture:"+v.DeviceSerial) + cover := value.String() + if err != nil { + cover = "" + } + + listRes.List[k] = &model.Ys7DevicesList3Res{ + Id: v.Id, + CreatedAt: v.CreatedAt, + DeviceSerial: v.DeviceSerial, + DeviceName: v.DeviceName, + DeviceType: v.DeviceType, + Status: v.Status, + Defence: v.Defence, + DeviceVersion: v.DeviceVersion, + ProjectId: v.ProjectId, + Detail: v.Detail, + Token: ys7.Ys72Instance.GetAccessToken(), + Cover: cover, + } + } + + return +} + +// ManualSnapshotInterfaceFunc 手动摄像头抓拍 +func (s *ys7DevicesController) ManualSnapshotInterfaceFunc(ctx context.Context, req *system.ManualSnapshotInterfaceReq) (res *system.ManualSnapshotInterfaceRes, err error) { + err = ManualSnapshotFunc(ctx, req.DeviceSerial) + return +} + +// PtzStartFunc 开启云台控制 +func (s *ys7DevicesController) PtzStartFunc(ctx context.Context, req *system.PtzStartReq) (res *system.PtzStartRes, err error) { + flag := true + err = StartOrEndFunc(ctx, req.DeviceSerial, req.Direction, flag) + return +} + +// PtzEndFunc 关闭云台控制 +func (s *ys7DevicesController) PtzEndFunc(ctx context.Context, req *system.PtzEndReq) (res *system.PtzEndRes, err error) { + flag := false + err = StartOrEndFunc(ctx, req.DeviceSerial, req.Direction, flag) + return +} + +func StartOrEndFunc(ctx context.Context, deviceSerial string, direction int, isStart bool) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、得到设备 + device, err := ys7.GetDevice(deviceSerial) + if err != nil { + liberr.ErrIsNil(ctx, err, "获取信息失败") + } + //2、判断设备是否在线 + if device.Online() { + var start *ys7.Public + if isStart { //true 为开启 + start, err = device.PTZStart(direction) + } else { //flase 为停止 + start, err = device.PTZEnd(direction) + } + liberr.ErrIsNil(ctx, err) + if start.Code != ys7.Ok { + err = errors.New(start.Msg) + liberr.ErrIsNil(ctx, err) + } + } else { + err = errors.New("设备不在线") + liberr.ErrIsNil(ctx, err) + } + }) + return err +} + +// ManualSnapshotFunc 摄像头手动快照 +func ManualSnapshotFunc(ctx context.Context, serial string) error { + var str []string + err := g.Try(ctx, func(ctx context.Context) { + str = append(str, serial) + entity, err := SelectBySerial(ctx, str) + liberr.ErrIsNil(ctx, err, "获取信息失败") + for _, res := range entity { + ProjectId, _ := strconv.ParseInt(res.ProjectId, 10, 64) + tableID := int64(res.Id) + _, err = StatrDevice(ctx, res.DeviceSerial, ProjectId, tableID, "1", res.DeviceName) + liberr.ErrIsNil(ctx, err) + } + }) + return err +} + +// PeriodicSnapshotFunc 摄像头定时快照 +func PeriodicSnapshotFunc(ctx context.Context) { + err := g.Try(ctx, func(ctx context.Context) { + //1、获取到摄像头列表 + _map := ys7.GetDeviceMap() + //2、遍历获取在线的-设备串号 + var str []string + for _, entity := range _map { + if entity.Online() { + str = append(str, entity.DeviceSerial) + } + } + //3、定时抓拍 + if len(str) > 0 { + entity, err := SelectBySerial(ctx, str) + liberr.ErrIsNil(ctx, err, "获取信息失败") + for _, res := range entity { + ProjectId, _ := strconv.ParseInt(res.ProjectId, 10, 64) + tableID := int64(res.Id) + _, err = StatrDevice(ctx, res.DeviceSerial, ProjectId, tableID, "2", res.DeviceName) + } + } + }) + fmt.Println("摄像头定时快照:", err) + return +} + +func SelectBySerial(ctx context.Context, serial []string) (entity []*model.Ys7DevicesInfoRes, err error) { + dao.Ys7Devices.Ctx(ctx).Where("DeviceSerial in (?)", serial).Scan(&entity) + return +} + +func StatrDevice(ctx context.Context, serial string, projectId int64, table int64, typeStr string, sxtName string) (device ys7.Ys7Device, err error) { + device, err = ys7.GetDevice(serial) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + if typeStr == "1" { //手动拍照 + //err = TakAPictureFunc(ctx, device, projectId, table, sxtName) + err = CaptureAndEnqueue(ctx, cameraQueue, device, projectId, table, sxtName) + } else { + go func() { + goFunc(ctx, device, projectId, table, sxtName) + }() + } + return +} + +func goFunc(ctx context.Context, device ys7.Ys7Device, projectId int64, table int64, sxtName string) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、查询预置位 + var devicePresetEntity []*model.DevicePresetInfoRes + _ = dao.DevicePreset.Ctx(ctx).Where("deviceSerial", device.DeviceSerial).Scan(&devicePresetEntity) + //2、将在线的摄像头预置位进行遍历,每个预置点停留20秒 + for _, one := range devicePresetEntity { + res, err := device.MovePreset(one.Index) + if err != nil { + g.Log("camera").Error(ctx, res.Msg) + continue + } + if res.Code != "200" { + g.Log("camera").Error(ctx, res.Msg) + continue + } + //停留20秒 + time.Sleep(time.Second * 20) + //err = TakAPictureFunc(ctx, device, projectId, table, sxtName) + // 在每个摄像头抓图回调中调用: + err = CaptureAndEnqueue(ctx, cameraQueue, device, projectId, table, sxtName) + if err != nil { + g.Log("camera").Error(ctx, res.Msg) + continue + } + } + return + }) + return +} + +//func TakAPictureFunc(ctx context.Context, device ys7.Ys7Device, projectId int64, table int64, sxtName string) (err error) { +// err = g.Try(ctx, func(ctx context.Context) { +// //3、预置位停留的时候进行抓图 +// capture, err := device.Capture() +// if err != nil { +// var str = "定时快照错误:" + err.Error() +// err = errors.New(str) +// return +// } +// if capture.Code != "200" { +// var str = "抓图操作失败,错误码为:" + capture.Code + ",错误描述:" + capture.Msg +// err = errors.New(str) +// return +// } +// //4、把图片存储到本地(临时地址)、把临时地址图片给到AI进行识别 +// lsPath, err := DownloadTheImagToLocalViaUrl(ctx, capture.Data.PicUrl, coryCommon.Temporary+"/") +// if err != nil { +// g.Log("camera").Error(ctx, err) +// return +// } else { +// rpath := coryCommon.ResourcePublicToFunc(lsPath, 1) +// lsPath = coryCommon.GlobalPath + rpath +// +// //5、需要记录摄像头的工作(拍摄的所有图片),让用户知道摄像头在正常工作 +// addReq := system.Ys7DevicesImgAddReq{ +// FatherId: uint64(table), +// Name: sxtName, +// Path: rpath, +// } +// if err = service.Ys7DevicesImg().Add(ctx, &addReq); err != nil { +// g.Log("camera").Error(ctx, "记录摄像头工作记录失败") +// } +// } +// //6、抓图完毕将URL给到AI那边进行算法操作 +// result, flag, err := RequestToSendFunc(ctx, lsPath, SpartaApi.YJCAMERA) +// if err != nil { +// return +// } +// if flag { +// num, path, mp, err := BlockDiagramFunc(ctx, result, flag, lsPath) +// if err != nil { +// return +// } +// //5、通过算法且满足要求就进行数据存储 +// AddCameraImg(ctx, projectId, num, table, path, mp, sxtName) +// } +// return +// }) +// return err +//} + +// AddCameraImg 项目id,违规次数,表的主键ID,算法图片 +func AddCameraImg(ctx context.Context, projectId int64, num int, table int64, imgPath string, mp map[string]string, sxtName string, result *SpartaApi.RecognizeRes) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + mpkStr := "" + mpvStr := "" + for key, value := range mp { + mpkStr = mpkStr + key + "," + mpvStr = mpvStr + value + "、" + } + mpkStr = strings.TrimRight(mpkStr, ",") + mpvStr = strings.TrimRight(mpvStr, "、") + //5、生成数据存储到数据表中(识别记录) + path := coryCommon.ResourcePublicToFunc(imgPath, 1) + addReq := system.BusTourAddReq{ + ProjectId: projectId, + TourCategory: "2", + TourType: mpkStr, + Picture: path, + Describe: mpvStr, + Num: num, + TableName: dao.Ys7Devices.Table(), + TableId: table, + SxtName: sxtName, + } + err2 := service.BusTour().Add(ctx, &addReq) + if err2 == nil { + //1、本地创建一个text来记录日志 + // 定义文件路径 + filePath := coryCommon.GetCWD() + "/coryLogs/logs/ai_log.txt" + // 打开文件,如果文件不存在则创建 + file, err := os.OpenFile(filePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + log.Fatal(err) + } + defer file.Close() + // 写入日志信息 + marshal, _ := json.Marshal(result) + _, err = file.WriteString(fmt.Sprintf("项目ID:%d,违规次数:%d,表的主键ID:%d,算法图片:%s,识别结果:%s,----------%s\n", projectId, num, table, imgPath, mpvStr, string(marshal))) + if err != nil { + log.Fatal(err) + } + } + //6、生成数据存储到违规记录里面 + var bvl *model.BusViolationLevelInfoRes + llike := dao.BusViolationLevel.Ctx(ctx).As("a").Safe() + for _, zd := range strings.Split(mpkStr, ",") { + llike = llike.WhereOr("a.tour_type like ?", "%"+zd+"%") + } + err := llike.LeftJoin("sys_dict_data", "c", "c.dict_type = 'risx' and c.dict_value = a.risx").Fields("a.id,a.grade,c.dict_label").Scan(&bvl) + liberr.ErrIsNil(ctx, err) + if bvl == nil { + err = errors.New("请设置违章等级!") + g.Log().Error(ctx, "请设置违章等级!") + return + } + recordAddReq := do.BusViolationRecord{ + ProjectId: projectId, + LevelId: bvl.Id, + Level: bvl.Grade + ":" + bvl.DictLabel, + TourType: mpkStr, + DataSource: "camera", + SxtName: sxtName, + //Picture: path, + //WxOrPc: "1", + } + info, err := dao.BusViolationRecord.Ctx(ctx).Insert(recordAddReq) + liberr.ErrIsNil(ctx, err) + id, _ := info.LastInsertId() + if path != "" { //给BusViolationRecord插入附件信息 + pathSplit := strings.Split(path, "/") + fileInfo := strings.Split(pathSplit[len(pathSplit)-1], ".") + _, err = g.DB().Model("bus_violation_record_path").Ctx(ctx).Insert( + g.Map{ + "ticket_id": id, + "type": 1, + "name": fileInfo[0], + "path": path, + "file_type": fileInfo[1]}) + liberr.ErrIsNil(ctx, err) + } + //7、通过违章记录拿到等级关联的岗位信息,再根据岗位拿到具体需要通知的人(需要存储通知的人),然后给他们发通知信息 + err, posts := logic.SelectLevelByPostInfo(ctx, bvl.Id) + liberr.ErrIsNil(ctx, err) + var violationRecordCorrelationEntity []*model.ViolationRecordCorrelation + var postId []int + for _, post := range posts { + userIDs, _ := dao.SysUserPost.Ctx(ctx).Where("post_id", post.PostId).Fields(dao.SysUserPost.Columns().UserId).Distinct().Array() + for _, d := range userIDs { + violationRecordCorrelationEntity = append(violationRecordCorrelationEntity, &model.ViolationRecordCorrelation{ + RecordId: id, + UserId: d.Int64(), + PostId: int64(post.PostId), + }) + postId = append(postId, int(post.PostId)) + } + } + _, err = g.DB().Model("bus_violation_record_correlation").Ctx(ctx).Insert(violationRecordCorrelationEntity) + liberr.ErrIsNil(ctx, err, "存储通知的人失败") + var userId uint64 = 1 + err = PublicPublish(ctx, &system.NotificationsPublishReq{ + NotificationText: "【您有一份重要的违章需要处理!】工单号为:" + strconv.FormatInt(id, 10), + Positions: postId, + ProjectId: int(projectId), + }, userId) + liberr.ErrIsNil(ctx, err) + }) + return err + }) + return err +} + +// DownloadTheImagToLocalViaUrl 通过url下载图片到本地 +func DownloadTheImagToLocalViaUrl(ctx context.Context, picUrl string, lj string) (imgPath string, err error) { + get, err := g.Client().Get(gctx.New(), picUrl) + if err != nil { + return "", err + } + st := strings.Split(picUrl, ".") + sp := strings.Split(st[len(st)-1], "?") + imgPath = coryCommon.GetCWD() + "/" + coryCommon.Ynr(lj) + coryCommon.FileName("sxt_") + "." + sp[0] + imgPath = filepath.ToSlash(imgPath) + err = os.WriteFile(imgPath, get.ReadAll(), 0666) + if err != nil { + err = errors.New("存储图片失败") + } + return +} + +func RequestToSendFunc(ctx context.Context, lsPath, recType string) (result *SpartaApi.RecognizeRes, flag bool, err error) { + req := SpartaApi.RecognizeReq{ + CapUrl: lsPath, + RecType: recType, + Async: "False", + CallBackUrl: "", + AreaHigh: "", + } + result, flag, err = SpartaApi.CommonAlgorithmTwoFunc(ctx, &req) + if err != nil { + return + } else { + ewflag := false + //把精度不高的数据剔除 + if result.HasTarget == 1 { + for i := 0; i < len(result.Targets); i++ { + if result.Targets[i].Score < SpartaApi.Sensitivity { + result.Targets = append(result.Targets[:i], result.Targets[i+1:]...) + i-- + } else { + ewflag = true + } + } + } + if ewflag == false { + flag = false + result.HasTarget = 0 + } + } + return +} + +// @Title BlockDiagramFunc 2024/8/7 17:12:00 +// @Description 函数的详细描述 +// @Auth Cory +// @param 输入参数名 ---> "参数解释" +// @Return error ---> "错误信息" +func BlockDiagramFunc(ctx context.Context, result *SpartaApi.RecognizeRes, flag bool, lsPath string) (num int, imgPath string, mp map[string]string, err error) { + imgPath, err = DownloadTheImagToLocalViaUrl(ctx, lsPath, coryCommon.Helmet) + if err != nil { + return + } + /** + 框出图片中有错误的地方 + */ + num = 0 + mp = make(map[string]string) + entity := coryCommon.TestDrawRectTextEntity{ + ImPath: imgPath, + } + var zuobiao []*coryCommon.CoordinatesListEntity + for _, data := range result.Targets { + if data.Score >= SpartaApi.Sensitivity { + tp := data.Type + mp[tp] = SpartaApi.GetDescription(tp) + flag = true + num = num + 1 + zuobiao = append(zuobiao, &coryCommon.CoordinatesListEntity{ + X: data.LeftTopPoint[0], + Y: data.LeftTopPoint[1], + W: data.Size[0], + H: data.Size[1], + }) + } + } + entity.Coordinates = zuobiao + coryCommon.TestDrawRectTextFunc(&entity) + //coryCommon.Test_draw_rect_text(imgPath, data.LeftTopPoint[0], data.LeftTopPoint[1], data.Size[0], data.Size[1]) + return +} + +/** +================================================ +固定协程池(Worker Pool)并发处理,外加无限队列 +================================================ +*/ + +var cameraQueue *TaskQueue + +func init() { + fmt.Println("初始化摄像头算法队列*8") + once.Do(func() { + cameraQueue = InitCameraQueueSystem(gctx.New()) + }) +} + +type TaskQueue struct { + lock sync.Mutex + cond *sync.Cond + tasks []CameraImageTask +} + +func NewTaskQueue() *TaskQueue { + q := &TaskQueue{} + q.cond = sync.NewCond(&q.lock) + return q +} + +func (q *TaskQueue) Enqueue(task CameraImageTask) { + q.lock.Lock() + q.tasks = append(q.tasks, task) + q.cond.Signal() // 通知一个等待的 worker + q.lock.Unlock() +} + +func (q *TaskQueue) Dequeue() CameraImageTask { + q.lock.Lock() + for len(q.tasks) == 0 { + q.cond.Wait() // 等待入队 + } + task := q.tasks[0] + q.tasks = q.tasks[1:] + q.lock.Unlock() + return task +} + +type CameraImageTask struct { + ProjectId int64 + Table int64 + SxtName string + LsPath string +} + +// StartWorkerPool 启动协程池消费任务 +func StartWorkerPool(ctx context.Context, queue *TaskQueue, workerNum int) { + for i := 0; i < workerNum; i++ { + go func(workerId int) { + for { + task := queue.Dequeue() // 阻塞直到有任务 + err := ProcessCameraImageTask(ctx, task) + if err != nil { + g.Log("camera").Errorf(ctx, "Worker %d 执行任务失败: %v", workerId, err) + } + } + }(i) + } +} + +// CaptureAndEnqueue 抓图后入队 +func CaptureAndEnqueue(ctx context.Context, queue *TaskQueue, device ys7.Ys7Device, projectId, table int64, sxtName string) error { + capture, err := device.Capture() + if err != nil { + return fmt.Errorf("定时快照错误:%w", err) + } + if capture.Code != "200" { + return fmt.Errorf("抓图操作失败,错误码为:%s, 错误描述:%s", capture.Code, capture.Msg) + } + + lsPath, err := DownloadTheImagToLocalViaUrl(ctx, capture.Data.PicUrl, coryCommon.Temporary+"/") + if err != nil { + return fmt.Errorf("图片下载失败:%w", err) + } + + rpath := coryCommon.ResourcePublicToFunc(lsPath, 1) + fullPath := coryCommon.GlobalPath + rpath + + addReq := system.Ys7DevicesImgAddReq{ + FatherId: uint64(table), + Name: sxtName, + Path: rpath, + } + if err = service.Ys7DevicesImg().Add(ctx, &addReq); err != nil { + g.Log("camera").Error(ctx, "记录摄像头工作记录失败:", err) + } + + // 入队 + queue.Enqueue(CameraImageTask{ + ProjectId: projectId, + Table: table, + SxtName: sxtName, + LsPath: fullPath, + }) + + return nil +} + +// ProcessCameraImageTask 处理任务逻辑 +func ProcessCameraImageTask(ctx context.Context, task CameraImageTask) error { + fmt.Println("已进入队列算法---------》", task.SxtName) + result, flag, err := RequestToSendFunc(ctx, task.LsPath, SpartaApi.YJCAMERA) + fmt.Println("==>", result) + if err != nil { + return fmt.Errorf("AI识别失败:%w", err) + } + if flag { + num, path, mp, err := BlockDiagramFunc(ctx, result, flag, task.LsPath) + if err != nil { + return fmt.Errorf("图像分析失败:%w", err) + } + AddCameraImg(ctx, task.ProjectId, num, task.Table, path, mp, task.SxtName, result) + } + return nil +} + +// 启动 +func InitCameraQueueSystem(ctx context.Context) *TaskQueue { + queue := NewTaskQueue() + StartWorkerPool(ctx, queue, 1) + return queue // 🔁 返回 queue 供调用者使用 +} + +// +// +//func init() { +// fmt.Println("初始化队列形式处理算法(同时10个协程来跑数据)") +// ctx := gctx.New() +// StartCameraImageWorkerPool(ctx, 10) // 启动10个工作协程 +//} +// +//type CameraImageTask struct { +// ProjectId int64 +// Table int64 +// SxtName string +// LsPath string +//} +// +//var cameraImageQueue = make(chan CameraImageTask, 100) // 队列容量视实际情况设置 +// +//func TakAPictureFunc(ctx context.Context, device ys7.Ys7Device, projectId, table int64, sxtName string) error { +// capture, err := device.Capture() +// if err != nil { +// return fmt.Errorf("定时快照错误:%w", err) +// } +// if capture.Code != "200" { +// return fmt.Errorf("抓图操作失败,错误码为:%s, 错误描述:%s", capture.Code, capture.Msg) +// } +// +// lsPath, err := DownloadTheImagToLocalViaUrl(ctx, capture.Data.PicUrl, coryCommon.Temporary+"/") +// if err != nil { +// return fmt.Errorf("图片下载失败:%w", err) +// } +// +// rpath := coryCommon.ResourcePublicToFunc(lsPath, 1) +// fullPath := coryCommon.GlobalPath + rpath +// +// addReq := system.Ys7DevicesImgAddReq{ +// FatherId: uint64(table), +// Name: sxtName, +// Path: rpath, +// } +// if err = service.Ys7DevicesImg().Add(ctx, &addReq); err != nil { +// g.Log("camera").Error(ctx, "记录摄像头工作记录失败:", err) +// } +// +// // 入队任务 +// cameraImageQueue <- CameraImageTask{ +// ProjectId: projectId, +// Table: table, +// SxtName: sxtName, +// LsPath: fullPath, +// } +// return nil +//} +// +//func StartCameraImageWorkerPool(ctx context.Context, workerNum int) { +// for i := 0; i < workerNum; i++ { +// go func(workerId int) { +// for task := range cameraImageQueue { +// err := ProcessCameraImageTask(ctx, task) +// if err != nil { +// g.Log("camera").Errorf(ctx, "Worker %d 处理任务出错: %v", workerId, err) +// } +// } +// }(i) +// } +//} +// +//func ProcessCameraImageTask(ctx context.Context, task CameraImageTask) error { +// result, flag, err := RequestToSendFunc(ctx, task.LsPath, SpartaApi.YJCAMERA) +// if err != nil { +// return fmt.Errorf("AI 请求失败:%w", err) +// } +// if flag { +// num, path, mp, err := BlockDiagramFunc(ctx, result, flag, task.LsPath) +// if err != nil { +// return fmt.Errorf("图像处理失败:%w", err) +// } +// AddCameraImg(ctx, task.ProjectId, num, task.Table, path, mp, task.SxtName) +// } +// return nil +//} diff --git a/internal/app/system/controller/ys7devices_img.go b/internal/app/system/controller/ys7devices_img.go new file mode 100644 index 0000000..c342f0b --- /dev/null +++ b/internal/app/system/controller/ys7devices_img.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2024-08-19 11:51:53 +// 生成路径: internal/app/system/controller/ys7devices_img.go +// 生成人:gfast +// desc:摄像头所拍摄到的所有图片(每月会定时清除) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type ys7DevicesImgController struct { + BaseController +} + +var Ys7DevicesImg = new(ys7DevicesImgController) + +// List 列表 +func (c *ys7DevicesImgController) List(ctx context.Context, req *system.Ys7DevicesImgSearchReq) (res *system.Ys7DevicesImgSearchRes, err error) { + res, err = service.Ys7DevicesImg().List(ctx, req) + return +} + +//// Get 获取摄像头所拍摄到的所有图片(每月会定时清除) +//func (c *ys7DevicesImgController) Get(ctx context.Context, req *system.Ys7DevicesImgGetReq) (res *system.Ys7DevicesImgGetRes, err error) { +// res = new(system.Ys7DevicesImgGetRes) +// res.Ys7DevicesImgInfoRes, err = service.Ys7DevicesImg().GetById(ctx, req.Id) +// return +//} + +//// Add 添加摄像头所拍摄到的所有图片(每月会定时清除) +//func (c *ys7DevicesImgController) Add(ctx context.Context, req *system.Ys7DevicesImgAddReq) (res *system.Ys7DevicesImgAddRes, err error) { +// err = service.Ys7DevicesImg().Add(ctx, req) +// return +//} + +//// Edit 修改摄像头所拍摄到的所有图片(每月会定时清除) +//func (c *ys7DevicesImgController) Edit(ctx context.Context, req *system.Ys7DevicesImgEditReq) (res *system.Ys7DevicesImgEditRes, err error) { +// err = service.Ys7DevicesImg().Edit(ctx, req) +// return +//} + +// Delete 删除摄像头所拍摄到的所有图片(每月会定时清除) +func (c *ys7DevicesImgController) Delete(ctx context.Context, req *system.Ys7DevicesImgDeleteReq) (res *system.Ys7DevicesImgDeleteRes, err error) { + err = service.Ys7DevicesImg().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/controller/zmkg_gis_model_lib.go b/internal/app/system/controller/zmkg_gis_model_lib.go new file mode 100644 index 0000000..e81ed0f --- /dev/null +++ b/internal/app/system/controller/zmkg_gis_model_lib.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-07-31 10:18:14 +// 生成路径: internal/app/system/controller/zmkg_gis_model_lib.go +// 生成人:gfast +// desc:模型库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +type zmkgGisModelLibController struct { + BaseController +} + +var ZmkgGisModelLib = new(zmkgGisModelLibController) + +// List 列表 +func (c *zmkgGisModelLibController) List(ctx context.Context, req *system.ZmkgGisModelLibSearchReq) (res *system.ZmkgGisModelLibSearchRes, err error) { + res, err = service.ZmkgGisModelLib().List(ctx, req) + return +} + +// Get 获取模型库 +func (c *zmkgGisModelLibController) Get(ctx context.Context, req *system.ZmkgGisModelLibGetReq) (res *system.ZmkgGisModelLibGetRes, err error) { + res = new(system.ZmkgGisModelLibGetRes) + res.ZmkgGisModelLibInfoRes, err = service.ZmkgGisModelLib().GetById(ctx, req.Id) + return +} + +// Add 添加模型库 +func (c *zmkgGisModelLibController) Add(ctx context.Context, req *system.ZmkgGisModelLibAddReq) (res *system.ZmkgGisModelLibAddRes, err error) { + err = service.ZmkgGisModelLib().Add(ctx, req) + return +} + +// Edit 修改模型库 +func (c *zmkgGisModelLibController) Edit(ctx context.Context, req *system.ZmkgGisModelLibEditReq) (res *system.ZmkgGisModelLibEditRes, err error) { + err = service.ZmkgGisModelLib().Edit(ctx, req) + return +} + +// Delete 删除模型库 +func (c *zmkgGisModelLibController) Delete(ctx context.Context, req *system.ZmkgGisModelLibDeleteReq) (res *system.ZmkgGisModelLibDeleteRes, err error) { + err = service.ZmkgGisModelLib().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/system/dao/app_menus.go b/internal/app/system/dao/app_menus.go new file mode 100644 index 0000000..028ecfb --- /dev/null +++ b/internal/app/system/dao/app_menus.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// internalAppMenusDao is internal type for wrapping internal DAO implements. +type internalAppMenusDao = *internal.AppMenusDao + +// appMenusDao is the data access object for table app_menus. +// You can define custom methods on it to extend its functionality as you wish. +type appMenusDao struct { + internalAppMenusDao +} + +var ( + // AppMenus is globally public accessible object for table app_menus operations. + AppMenus = appMenusDao{ + internal.NewAppMenusDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/app_role_menus.go b/internal/app/system/dao/app_role_menus.go new file mode 100644 index 0000000..3dff675 --- /dev/null +++ b/internal/app/system/dao/app_role_menus.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-05-28 15:11:14 +// 生成路径: internal/app/system/dao/app_role_menus.go +// 生成人:gfast +// desc:app角色绑定菜单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// appRoleMenusDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type appRoleMenusDao struct { + *internal.AppRoleMenusDao +} + +var ( + // AppRoleMenus is globally public accessible object for table tools_gen_table operations. + AppRoleMenus = appRoleMenusDao{ + internal.NewAppRoleMenusDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/app_roles.go b/internal/app/system/dao/app_roles.go new file mode 100644 index 0000000..24870ae --- /dev/null +++ b/internal/app/system/dao/app_roles.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// internalAppRolesDao is internal type for wrapping internal DAO implements. +type internalAppRolesDao = *internal.AppRolesDao + +// appRolesDao is the data access object for table app_roles. +// You can define custom methods on it to extend its functionality as you wish. +type appRolesDao struct { + internalAppRolesDao +} + +var ( + // AppRoles is globally public accessible object for table app_roles operations. + AppRoles = appRolesDao{ + internal.NewAppRolesDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/app_user_disable_menus.go b/internal/app/system/dao/app_user_disable_menus.go new file mode 100644 index 0000000..746fb4c --- /dev/null +++ b/internal/app/system/dao/app_user_disable_menus.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// internalAppUserDisableMenusDao is internal type for wrapping internal DAO implements. +type internalAppUserDisableMenusDao = *internal.AppUserDisableMenusDao + +// appUserDisableMenusDao is the data access object for table app_user_disable_menus. +// You can define custom methods on it to extend its functionality as you wish. +type appUserDisableMenusDao struct { + internalAppUserDisableMenusDao +} + +var ( + // AppUserDisableMenus is globally public accessible object for table app_user_disable_menus operations. + AppUserDisableMenus = appUserDisableMenusDao{ + internal.NewAppUserDisableMenusDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/app_user_menus.go b/internal/app/system/dao/app_user_menus.go new file mode 100644 index 0000000..01e5be8 --- /dev/null +++ b/internal/app/system/dao/app_user_menus.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// internalAppUserMenusDao is internal type for wrapping internal DAO implements. +type internalAppUserMenusDao = *internal.AppUserMenusDao + +// appUserMenusDao is the data access object for table app_user_menus. +// You can define custom methods on it to extend its functionality as you wish. +type appUserMenusDao struct { + internalAppUserMenusDao +} + +var ( + // AppUserMenus is globally public accessible object for table app_user_menus operations. + AppUserMenus = appUserMenusDao{ + internal.NewAppUserMenusDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/app_user_roles.go b/internal/app/system/dao/app_user_roles.go new file mode 100644 index 0000000..8cfb980 --- /dev/null +++ b/internal/app/system/dao/app_user_roles.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// internalAppUserRolesDao is internal type for wrapping internal DAO implements. +type internalAppUserRolesDao = *internal.AppUserRolesDao + +// appUserRolesDao is the data access object for table app_user_roles. +// You can define custom methods on it to extend its functionality as you wish. +type appUserRolesDao struct { + internalAppUserRolesDao +} + +var ( + // AppUserRoles is globally public accessible object for table app_user_roles operations. + AppUserRoles = appUserRolesDao{ + internal.NewAppUserRolesDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/app_versions.go b/internal/app/system/dao/app_versions.go new file mode 100644 index 0000000..8c59cbd --- /dev/null +++ b/internal/app/system/dao/app_versions.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// internalAppVersionsDao is internal type for wrapping internal DAO implements. +type internalAppVersionsDao = *internal.AppVersionsDao + +// appVersionsDao is the data access object for table app_versions. +// You can define custom methods on it to extend its functionality as you wish. +type appVersionsDao struct { + internalAppVersionsDao +} + +var ( + // AppVersions is globally public accessible object for table app_versions operations. + AppVersions = appVersionsDao{ + internal.NewAppVersionsDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/big_file.go b/internal/app/system/dao/big_file.go new file mode 100644 index 0000000..f7db449 --- /dev/null +++ b/internal/app/system/dao/big_file.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// internalBigFileDao is internal type for wrapping internal DAO implements. +type internalBigFileDao = *internal.BigFileDao + +// bigFileDao is the data access object for table big_file. +// You can define custom methods on it to extend its functionality as you wish. +type bigFileDao struct { + internalBigFileDao +} + +var ( + // BigFile is globally public accessible object for table big_file operations. + BigFile = bigFileDao{ + internal.NewBigFileDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_attendance_machine.go b/internal/app/system/dao/bus_attendance_machine.go new file mode 100644 index 0000000..032430c --- /dev/null +++ b/internal/app/system/dao/bus_attendance_machine.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2025-03-03 10:32:47 +// 生成路径: internal/app/system/dao/bus_attendance_machine.go +// 生成人:gfast +// desc:考勤机 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busAttendanceMachineDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busAttendanceMachineDao struct { + *internal.BusAttendanceMachineDao +} + +var ( + // BusAttendanceMachine is globally public accessible object for table tools_gen_table operations. + BusAttendanceMachine = busAttendanceMachineDao{ + internal.NewBusAttendanceMachineDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_attendance_machine_user.go b/internal/app/system/dao/bus_attendance_machine_user.go new file mode 100644 index 0000000..1ff80c2 --- /dev/null +++ b/internal/app/system/dao/bus_attendance_machine_user.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2025-03-03 10:33:17 +// 生成路径: internal/app/system/dao/bus_attendance_machine_user.go +// 生成人:gfast +// desc:考勤机用户列 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busAttendanceMachineUserDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busAttendanceMachineUserDao struct { + *internal.BusAttendanceMachineUserDao +} + +var ( + // BusAttendanceMachineUser is globally public accessible object for table tools_gen_table operations. + BusAttendanceMachineUser = busAttendanceMachineUserDao{ + internal.NewBusAttendanceMachineUserDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_camera_channel.go b/internal/app/system/dao/bus_camera_channel.go new file mode 100644 index 0000000..c6c0ebd --- /dev/null +++ b/internal/app/system/dao/bus_camera_channel.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-09-20 14:55:42 +// 生成路径: internal/app/system/dao/bus_camera_channel.go +// 生成人:gfast +// desc:摄像头(国标通道) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busCameraChannelDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busCameraChannelDao struct { + *internal.BusCameraChannelDao +} + +var ( + // BusCameraChannel is globally public accessible object for table tools_gen_table operations. + BusCameraChannel = busCameraChannelDao{ + internal.NewBusCameraChannelDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_camera_chinese_standard.go b/internal/app/system/dao/bus_camera_chinese_standard.go new file mode 100644 index 0000000..7b52dcc --- /dev/null +++ b/internal/app/system/dao/bus_camera_chinese_standard.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-09-20 14:55:24 +// 生成路径: internal/app/system/dao/bus_camera_chinese_standard.go +// 生成人:gfast +// desc:摄像头(国标) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busCameraChineseStandardDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busCameraChineseStandardDao struct { + *internal.BusCameraChineseStandardDao +} + +var ( + // BusCameraChineseStandard is globally public accessible object for table tools_gen_table operations. + BusCameraChineseStandard = busCameraChineseStandardDao{ + internal.NewBusCameraChineseStandardDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_category.go b/internal/app/system/dao/bus_category.go new file mode 100644 index 0000000..177484c --- /dev/null +++ b/internal/app/system/dao/bus_category.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-10-07 15:52:19 +// 生成路径: internal/app/system/dao/bus_category.go +// 生成人:gfast +// desc:题库_题库类别 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busCategoryDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busCategoryDao struct { + *internal.BusCategoryDao +} + +var ( + // BusCategory is globally public accessible object for table tools_gen_table operations. + BusCategory = busCategoryDao{ + internal.NewBusCategoryDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_company.go b/internal/app/system/dao/bus_company.go new file mode 100644 index 0000000..4031894 --- /dev/null +++ b/internal/app/system/dao/bus_company.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-28 14:08:14 +// 生成路径: internal/app/system/dao/bus_company.go +// 生成人:gfast +// desc:公司 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busCompanyDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busCompanyDao struct { + *internal.BusCompanyDao +} + +var ( + // BusCompany is globally public accessible object for table tools_gen_table operations. + BusCompany = busCompanyDao{ + internal.NewBusCompanyDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_complaint_box.go b/internal/app/system/dao/bus_complaint_box.go new file mode 100644 index 0000000..20963ea --- /dev/null +++ b/internal/app/system/dao/bus_complaint_box.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-12-04 18:09:50 +// 生成路径: internal/app/system/dao/bus_complaint_box.go +// 生成人:gfast +// desc:意见箱 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busComplaintBoxDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busComplaintBoxDao struct { + *internal.BusComplaintBoxDao +} + +var ( + // BusComplaintBox is globally public accessible object for table tools_gen_table operations. + BusComplaintBox = busComplaintBoxDao{ + internal.NewBusComplaintBoxDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_construction_blacklist.go b/internal/app/system/dao/bus_construction_blacklist.go new file mode 100644 index 0000000..b281d9c --- /dev/null +++ b/internal/app/system/dao/bus_construction_blacklist.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-11-10 14:08:39 +// 生成路径: internal/app/system/dao/bus_construction_blacklist.go +// 生成人:gfast +// desc:黑名单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busConstructionBlacklistDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busConstructionBlacklistDao struct { + *internal.BusConstructionBlacklistDao +} + +var ( + // BusConstructionBlacklist is globally public accessible object for table tools_gen_table operations. + BusConstructionBlacklist = busConstructionBlacklistDao{ + internal.NewBusConstructionBlacklistDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_construction_log.go b/internal/app/system/dao/bus_construction_log.go new file mode 100644 index 0000000..85ddff2 --- /dev/null +++ b/internal/app/system/dao/bus_construction_log.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-03-22 16:27:43 +// 生成路径: internal/app/system/dao/bus_construction_log.go +// 生成人:gfast +// desc:施工日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busConstructionLogDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busConstructionLogDao struct { + *internal.BusConstructionLogDao +} + +var ( + // BusConstructionLog is globally public accessible object for table tools_gen_table operations. + BusConstructionLog = busConstructionLogDao{ + internal.NewBusConstructionLogDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_construction_project.go b/internal/app/system/dao/bus_construction_project.go new file mode 100644 index 0000000..18b6802 --- /dev/null +++ b/internal/app/system/dao/bus_construction_project.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-07 10:17:50 +// 生成路径: internal/app/system/dao/bus_construction_project.go +// 生成人:gfast +// desc:施工人员对应项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busConstructionProjectDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busConstructionProjectDao struct { + *internal.BusConstructionProjectDao +} + +var ( + // BusConstructionProject is globally public accessible object for table tools_gen_table operations. + BusConstructionProject = busConstructionProjectDao{ + internal.NewBusConstructionProjectDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_construction_user.go b/internal/app/system/dao/bus_construction_user.go new file mode 100644 index 0000000..ec692bd --- /dev/null +++ b/internal/app/system/dao/bus_construction_user.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-07 10:31:18 +// 生成路径: internal/app/system/dao/bus_construction_user.go +// 生成人:gfast +// desc:施工人员 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busConstructionUserDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busConstructionUserDao struct { + *internal.BusConstructionUserDao +} + +var ( + // BusConstructionUser is globally public accessible object for table tools_gen_table operations. + BusConstructionUser = busConstructionUserDao{ + internal.NewBusConstructionUserDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_construction_user_file.go b/internal/app/system/dao/bus_construction_user_file.go new file mode 100644 index 0000000..b7a08a4 --- /dev/null +++ b/internal/app/system/dao/bus_construction_user_file.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-07 10:17:41 +// 生成路径: internal/app/system/dao/bus_construction_user_file.go +// 生成人:gfast +// desc:微信用户的文件存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busConstructionUserFileDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busConstructionUserFileDao struct { + *internal.BusConstructionUserFileDao +} + +var ( + // BusConstructionUserFile is globally public accessible object for table tools_gen_table operations. + BusConstructionUserFile = busConstructionUserFileDao{ + internal.NewBusConstructionUserFileDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_construction_user_post.go b/internal/app/system/dao/bus_construction_user_post.go new file mode 100644 index 0000000..f1caa65 --- /dev/null +++ b/internal/app/system/dao/bus_construction_user_post.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-07 10:06:34 +// 生成路径: internal/app/system/dao/bus_construction_user_post.go +// 生成人:gfast +// desc:施工人员岗位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busConstructionUserPostDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busConstructionUserPostDao struct { + *internal.BusConstructionUserPostDao +} + +var ( + // BusConstructionUserPost is globally public accessible object for table tools_gen_table operations. + BusConstructionUserPost = busConstructionUserPostDao{ + internal.NewBusConstructionUserPostDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_corporate_events.go b/internal/app/system/dao/bus_corporate_events.go new file mode 100644 index 0000000..25451d3 --- /dev/null +++ b/internal/app/system/dao/bus_corporate_events.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-03-20 16:49:36 +// 生成路径: internal/app/system/dao/bus_corporate_events.go +// 生成人:gfast +// desc:企业大事记 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busCorporateEventsDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busCorporateEventsDao struct { + *internal.BusCorporateEventsDao +} + +var ( + // BusCorporateEvents is globally public accessible object for table tools_gen_table operations. + BusCorporateEvents = busCorporateEventsDao{ + internal.NewBusCorporateEventsDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_design_audit.go b/internal/app/system/dao/bus_design_audit.go new file mode 100644 index 0000000..2df5ce8 --- /dev/null +++ b/internal/app/system/dao/bus_design_audit.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-04-09 15:40:16 +// 生成路径: internal/app/system/dao/bus_design_audit.go +// 生成人:gfast +// desc:设计审核(竣工、施工、可研) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busDesignAuditDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busDesignAuditDao struct { + *internal.BusDesignAuditDao +} + +var ( + // BusDesignAudit is globally public accessible object for table tools_gen_table operations. + BusDesignAudit = busDesignAuditDao{ + internal.NewBusDesignAuditDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_design_document.go b/internal/app/system/dao/bus_design_document.go new file mode 100644 index 0000000..54f423a --- /dev/null +++ b/internal/app/system/dao/bus_design_document.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-29 16:31:29 +// 生成路径: internal/app/system/dao/bus_design_document.go +// 生成人:gfast +// desc:设计管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busDesignDocumentDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busDesignDocumentDao struct { + *internal.BusDesignDocumentDao +} + +var ( + // BusDesignDocument is globally public accessible object for table tools_gen_table operations. + BusDesignDocument = busDesignDocumentDao{ + internal.NewBusDesignDocumentDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_design_period_range.go b/internal/app/system/dao/bus_design_period_range.go new file mode 100644 index 0000000..2d18706 --- /dev/null +++ b/internal/app/system/dao/bus_design_period_range.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-04-11 17:28:54 +// 生成路径: internal/app/system/dao/bus_design_period_range.go +// 生成人:gfast +// desc:设计-周期范围 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busDesignPeriodRangeDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busDesignPeriodRangeDao struct { + *internal.BusDesignPeriodRangeDao +} + +var ( + // BusDesignPeriodRange is globally public accessible object for table tools_gen_table operations. + BusDesignPeriodRange = busDesignPeriodRangeDao{ + internal.NewBusDesignPeriodRangeDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_engineering_quality.go b/internal/app/system/dao/bus_engineering_quality.go new file mode 100644 index 0000000..b47e83d --- /dev/null +++ b/internal/app/system/dao/bus_engineering_quality.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-29 09:31:22 +// 生成路径: internal/app/system/dao/bus_engineering_quality.go +// 生成人:gfast +// desc:工程质量列 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busEngineeringQualityDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busEngineeringQualityDao struct { + *internal.BusEngineeringQualityDao +} + +var ( + // BusEngineeringQuality is globally public accessible object for table tools_gen_table operations. + BusEngineeringQuality = busEngineeringQualityDao{ + internal.NewBusEngineeringQualityDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_equipment_equipment_unpacking.go b/internal/app/system/dao/bus_equipment_equipment_unpacking.go new file mode 100644 index 0000000..3c6c292 --- /dev/null +++ b/internal/app/system/dao/bus_equipment_equipment_unpacking.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-29 11:14:45 +// 生成路径: internal/app/system/dao/bus_equipment_equipment_unpacking.go +// 生成人:gfast +// desc:开箱记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busEquipmentEquipmentUnpackingDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busEquipmentEquipmentUnpackingDao struct { + *internal.BusEquipmentEquipmentUnpackingDao +} + +var ( + // BusEquipmentEquipmentUnpacking is globally public accessible object for table tools_gen_table operations. + BusEquipmentEquipmentUnpacking = busEquipmentEquipmentUnpackingDao{ + internal.NewBusEquipmentEquipmentUnpackingDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_equipment_materials.go b/internal/app/system/dao/bus_equipment_materials.go new file mode 100644 index 0000000..b60d30f --- /dev/null +++ b/internal/app/system/dao/bus_equipment_materials.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-29 11:14:16 +// 生成路径: internal/app/system/dao/bus_equipment_materials.go +// 生成人:gfast +// desc:材料/设备名称 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busEquipmentMaterialsDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busEquipmentMaterialsDao struct { + *internal.BusEquipmentMaterialsDao +} + +var ( + // BusEquipmentMaterials is globally public accessible object for table tools_gen_table operations. + BusEquipmentMaterials = busEquipmentMaterialsDao{ + internal.NewBusEquipmentMaterialsDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_equipment_materials_inventory.go b/internal/app/system/dao/bus_equipment_materials_inventory.go new file mode 100644 index 0000000..0cafb80 --- /dev/null +++ b/internal/app/system/dao/bus_equipment_materials_inventory.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-09-13 14:21:30 +// 生成路径: internal/app/system/dao/bus_equipment_materials_inventory.go +// 生成人:gfast +// desc:设备材料入库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busEquipmentMaterialsInventoryDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busEquipmentMaterialsInventoryDao struct { + *internal.BusEquipmentMaterialsInventoryDao +} + +var ( + // BusEquipmentMaterialsInventory is globally public accessible object for table tools_gen_table operations. + BusEquipmentMaterialsInventory = busEquipmentMaterialsInventoryDao{ + internal.NewBusEquipmentMaterialsInventoryDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_equipment_materials_inventory_file.go b/internal/app/system/dao/bus_equipment_materials_inventory_file.go new file mode 100644 index 0000000..3d536e2 --- /dev/null +++ b/internal/app/system/dao/bus_equipment_materials_inventory_file.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// internalBusEquipmentMaterialsInventoryFileDao is internal type for wrapping internal DAO implements. +type internalBusEquipmentMaterialsInventoryFileDao = *internal.BusEquipmentMaterialsInventoryFileDao + +// busEquipmentMaterialsInventoryFileDao is the data access object for table bus_equipment_materials_inventory_file. +// You can define custom methods on it to extend its functionality as you wish. +type busEquipmentMaterialsInventoryFileDao struct { + internalBusEquipmentMaterialsInventoryFileDao +} + +var ( + // BusEquipmentMaterialsInventoryFile is globally public accessible object for table bus_equipment_materials_inventory_file operations. + BusEquipmentMaterialsInventoryFile = busEquipmentMaterialsInventoryFileDao{ + internal.NewBusEquipmentMaterialsInventoryFileDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_equipment_materials_weight.go b/internal/app/system/dao/bus_equipment_materials_weight.go new file mode 100644 index 0000000..897e7ca --- /dev/null +++ b/internal/app/system/dao/bus_equipment_materials_weight.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-28 15:27:53 +// 生成路径: internal/app/system/dao/bus_equipment_materials_weight.go +// 生成人:gfast +// desc:计量单位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busEquipmentMaterialsWeightDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busEquipmentMaterialsWeightDao struct { + *internal.BusEquipmentMaterialsWeightDao +} + +var ( + // BusEquipmentMaterialsWeight is globally public accessible object for table tools_gen_table operations. + BusEquipmentMaterialsWeight = busEquipmentMaterialsWeightDao{ + internal.NewBusEquipmentMaterialsWeightDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_essential_information.go b/internal/app/system/dao/bus_essential_information.go new file mode 100644 index 0000000..f259075 --- /dev/null +++ b/internal/app/system/dao/bus_essential_information.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-03-20 19:38:54 +// 生成路径: internal/app/system/dao/bus_essential_information.go +// 生成人:gfast +// desc:项目基本信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busEssentialInformationDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busEssentialInformationDao struct { + *internal.BusEssentialInformationDao +} + +var ( + // BusEssentialInformation is globally public accessible object for table tools_gen_table operations. + BusEssentialInformation = busEssentialInformationDao{ + internal.NewBusEssentialInformationDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_folder.go b/internal/app/system/dao/bus_folder.go new file mode 100644 index 0000000..545862a --- /dev/null +++ b/internal/app/system/dao/bus_folder.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-09-15 17:15:59 +// 生成路径: internal/app/system/dao/bus_folder.go +// 生成人:gfast +// desc:文件夹 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busFolderDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busFolderDao struct { + *internal.BusFolderDao +} + +var ( + // BusFolder is globally public accessible object for table tools_gen_table operations. + BusFolder = busFolderDao{ + internal.NewBusFolderDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_folder_file.go b/internal/app/system/dao/bus_folder_file.go new file mode 100644 index 0000000..1ddaf2e --- /dev/null +++ b/internal/app/system/dao/bus_folder_file.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-09-15 17:16:00 +// 生成路径: internal/app/system/dao/bus_folder_file.go +// 生成人:gfast +// desc:文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busFolderFileDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busFolderFileDao struct { + *internal.BusFolderFileDao +} + +var ( + // BusFolderFile is globally public accessible object for table tools_gen_table operations. + BusFolderFile = busFolderFileDao{ + internal.NewBusFolderFileDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_hse_management.go b/internal/app/system/dao/bus_hse_management.go new file mode 100644 index 0000000..a506669 --- /dev/null +++ b/internal/app/system/dao/bus_hse_management.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-03-28 14:53:05 +// 生成路径: internal/app/system/dao/bus_hse_management.go +// 生成人:gfast +// desc:HSE-巡检工单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busHseManagementDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busHseManagementDao struct { + *internal.BusHseManagementDao +} + +var ( + // BusHseManagement is globally public accessible object for table tools_gen_table operations. + BusHseManagement = busHseManagementDao{ + internal.NewBusHseManagementDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_hse_security_log.go b/internal/app/system/dao/bus_hse_security_log.go new file mode 100644 index 0000000..cd6422e --- /dev/null +++ b/internal/app/system/dao/bus_hse_security_log.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-04-07 17:00:45 +// 生成路径: internal/app/system/dao/bus_hse_security_log.go +// 生成人:gfast +// desc:HSE安全日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busHseSecurityLogDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busHseSecurityLogDao struct { + *internal.BusHseSecurityLogDao +} + +var ( + // BusHseSecurityLog is globally public accessible object for table tools_gen_table operations. + BusHseSecurityLog = busHseSecurityLogDao{ + internal.NewBusHseSecurityLogDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_inspection_ticket.go b/internal/app/system/dao/bus_inspection_ticket.go new file mode 100644 index 0000000..6000a73 --- /dev/null +++ b/internal/app/system/dao/bus_inspection_ticket.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-03-21 15:23:58 +// 生成路径: internal/app/system/dao/bus_inspection_ticket.go +// 生成人:gfast +// desc:质量工单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busInspectionTicketDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busInspectionTicketDao struct { + *internal.BusInspectionTicketDao +} + +var ( + // BusInspectionTicket is globally public accessible object for table tools_gen_table operations. + BusInspectionTicket = busInspectionTicketDao{ + internal.NewBusInspectionTicketDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_machinery.go b/internal/app/system/dao/bus_machinery.go new file mode 100644 index 0000000..91b47ba --- /dev/null +++ b/internal/app/system/dao/bus_machinery.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-29 14:02:01 +// 生成路径: internal/app/system/dao/bus_machinery.go +// 生成人:gfast +// desc:机械 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busMachineryDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busMachineryDao struct { + *internal.BusMachineryDao +} + +var ( + // BusMachinery is globally public accessible object for table tools_gen_table operations. + BusMachinery = busMachineryDao{ + internal.NewBusMachineryDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_machinery_detail.go b/internal/app/system/dao/bus_machinery_detail.go new file mode 100644 index 0000000..3422362 --- /dev/null +++ b/internal/app/system/dao/bus_machinery_detail.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-10-12 11:41:31 +// 生成路径: internal/app/system/dao/bus_machinery_detail.go +// 生成人:gfast +// desc:机械详情 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busMachineryDetailDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busMachineryDetailDao struct { + *internal.BusMachineryDetailDao +} + +var ( + // BusMachineryDetail is globally public accessible object for table tools_gen_table operations. + BusMachineryDetail = busMachineryDetailDao{ + internal.NewBusMachineryDetailDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_machinery_detail_file.go b/internal/app/system/dao/bus_machinery_detail_file.go new file mode 100644 index 0000000..15fb011 --- /dev/null +++ b/internal/app/system/dao/bus_machinery_detail_file.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// internalBusMachineryDetailFileDao is internal type for wrapping internal DAO implements. +type internalBusMachineryDetailFileDao = *internal.BusMachineryDetailFileDao + +// busMachineryDetailFileDao is the data access object for table bus_machinery_detail_file. +// You can define custom methods on it to extend its functionality as you wish. +type busMachineryDetailFileDao struct { + internalBusMachineryDetailFileDao +} + +var ( + // BusMachineryDetailFile is globally public accessible object for table bus_machinery_detail_file operations. + BusMachineryDetailFile = busMachineryDetailFileDao{ + internal.NewBusMachineryDetailFileDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_machinery_record.go b/internal/app/system/dao/bus_machinery_record.go new file mode 100644 index 0000000..4a5478a --- /dev/null +++ b/internal/app/system/dao/bus_machinery_record.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// internalBusMachineryRecordDao is internal type for wrapping internal DAO implements. +type internalBusMachineryRecordDao = *internal.BusMachineryRecordDao + +// busMachineryRecordDao is the data access object for table bus_machinery_record. +// You can define custom methods on it to extend its functionality as you wish. +type busMachineryRecordDao struct { + internalBusMachineryRecordDao +} + +var ( + // BusMachineryRecord is globally public accessible object for table bus_machinery_record operations. + BusMachineryRecord = busMachineryRecordDao{ + internal.NewBusMachineryRecordDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_payroll_list.go b/internal/app/system/dao/bus_payroll_list.go new file mode 100644 index 0000000..48e9d90 --- /dev/null +++ b/internal/app/system/dao/bus_payroll_list.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-11-20 13:51:38 +// 生成路径: internal/app/system/dao/bus_payroll_list.go +// 生成人:gfast +// desc:工资(excel导入形成的) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busPayrollListDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busPayrollListDao struct { + *internal.BusPayrollListDao +} + +var ( + // BusPayrollList is globally public accessible object for table tools_gen_table operations. + BusPayrollList = busPayrollListDao{ + internal.NewBusPayrollListDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_presetting_bit.go b/internal/app/system/dao/bus_presetting_bit.go new file mode 100644 index 0000000..bc5fe21 --- /dev/null +++ b/internal/app/system/dao/bus_presetting_bit.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-10-19 15:17:27 +// 生成路径: internal/app/system/dao/bus_presetting_bit.go +// 生成人:gfast +// desc:摄像头预置位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busPresettingBitDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busPresettingBitDao struct { + *internal.BusPresettingBitDao +} + +var ( + // BusPresettingBit is globally public accessible object for table tools_gen_table operations. + BusPresettingBit = busPresettingBitDao{ + internal.NewBusPresettingBitDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_projectin_progress.go b/internal/app/system/dao/bus_projectin_progress.go new file mode 100644 index 0000000..dc21032 --- /dev/null +++ b/internal/app/system/dao/bus_projectin_progress.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-03-20 19:45:19 +// 生成路径: internal/app/system/dao/bus_projectin_progress.go +// 生成人:gfast +// desc:在建项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busProjectinProgressDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busProjectinProgressDao struct { + *internal.BusProjectinProgressDao +} + +var ( + // BusProjectinProgress is globally public accessible object for table tools_gen_table operations. + BusProjectinProgress = busProjectinProgressDao{ + internal.NewBusProjectinProgressDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_quality.go b/internal/app/system/dao/bus_quality.go new file mode 100644 index 0000000..1c43ff4 --- /dev/null +++ b/internal/app/system/dao/bus_quality.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-02 17:11:39 +// 生成路径: internal/app/system/dao/bus_quality.go +// 生成人:gfast +// desc:质量文档管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busQualityDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busQualityDao struct { + *internal.BusQualityDao +} + +var ( + // BusQuality is globally public accessible object for table tools_gen_table operations. + BusQuality = busQualityDao{ + internal.NewBusQualityDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_question_bank.go b/internal/app/system/dao/bus_question_bank.go new file mode 100644 index 0000000..3ded35c --- /dev/null +++ b/internal/app/system/dao/bus_question_bank.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-10-07 15:52:18 +// 生成路径: internal/app/system/dao/bus_question_bank.go +// 生成人:gfast +// desc:题库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busQuestionBankDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busQuestionBankDao struct { + *internal.BusQuestionBankDao +} + +var ( + // BusQuestionBank is globally public accessible object for table tools_gen_table operations. + BusQuestionBank = busQuestionBankDao{ + internal.NewBusQuestionBankDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_question_save.go b/internal/app/system/dao/bus_question_save.go new file mode 100644 index 0000000..afcf050 --- /dev/null +++ b/internal/app/system/dao/bus_question_save.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-11-01 17:33:04 +// 生成路径: internal/app/system/dao/bus_question_save.go +// 生成人:gfast +// desc:用户试卷存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busQuestionSaveDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busQuestionSaveDao struct { + *internal.BusQuestionSaveDao +} + +var ( + // BusQuestionSave is globally public accessible object for table tools_gen_table operations. + BusQuestionSave = busQuestionSaveDao{ + internal.NewBusQuestionSaveDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_questions_configuration.go b/internal/app/system/dao/bus_questions_configuration.go new file mode 100644 index 0000000..f89f416 --- /dev/null +++ b/internal/app/system/dao/bus_questions_configuration.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-10-07 17:11:20 +// 生成路径: internal/app/system/dao/bus_questions_configuration.go +// 生成人:gfast +// desc:题库配置 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busQuestionsConfigurationDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busQuestionsConfigurationDao struct { + *internal.BusQuestionsConfigurationDao +} + +var ( + // BusQuestionsConfiguration is globally public accessible object for table tools_gen_table operations. + BusQuestionsConfiguration = busQuestionsConfigurationDao{ + internal.NewBusQuestionsConfigurationDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_reissue_a_card.go b/internal/app/system/dao/bus_reissue_a_card.go new file mode 100644 index 0000000..2aa30fc --- /dev/null +++ b/internal/app/system/dao/bus_reissue_a_card.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-02-02 15:18:48 +// 生成路径: internal/app/system/dao/bus_reissue_a_card.go +// 生成人:gfast +// desc:施工人员补卡申请 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busReissueACardDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busReissueACardDao struct { + *internal.BusReissueACardDao +} + +var ( + // BusReissueACard is globally public accessible object for table tools_gen_table operations. + BusReissueACard = busReissueACardDao{ + internal.NewBusReissueACardDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_research_document.go b/internal/app/system/dao/bus_research_document.go new file mode 100644 index 0000000..5b18a4c --- /dev/null +++ b/internal/app/system/dao/bus_research_document.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-29 16:04:06 +// 生成路径: internal/app/system/dao/bus_research_document.go +// 生成人:gfast +// desc:科研文档 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busResearchDocumentDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busResearchDocumentDao struct { + *internal.BusResearchDocumentDao +} + +var ( + // BusResearchDocument is globally public accessible object for table tools_gen_table operations. + BusResearchDocument = busResearchDocumentDao{ + internal.NewBusResearchDocumentDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_safety.go b/internal/app/system/dao/bus_safety.go new file mode 100644 index 0000000..01dd73d --- /dev/null +++ b/internal/app/system/dao/bus_safety.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-02 15:40:48 +// 生成路径: internal/app/system/dao/bus_safety.go +// 生成人:gfast +// desc:安全例会管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busSafetyDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busSafetyDao struct { + *internal.BusSafetyDao +} + +var ( + // BusSafety is globally public accessible object for table tools_gen_table operations. + BusSafety = busSafetyDao{ + internal.NewBusSafetyDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_salary_details.go b/internal/app/system/dao/bus_salary_details.go new file mode 100644 index 0000000..cf3d529 --- /dev/null +++ b/internal/app/system/dao/bus_salary_details.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-02-01 16:39:01 +// 生成路径: internal/app/system/dao/bus_salary_details.go +// 生成人:gfast +// desc:员工工资考核记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busSalaryDetailsDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busSalaryDetailsDao struct { + *internal.BusSalaryDetailsDao +} + +var ( + // BusSalaryDetails is globally public accessible object for table tools_gen_table operations. + BusSalaryDetails = busSalaryDetailsDao{ + internal.NewBusSalaryDetailsDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_scheduled_plan_type.go b/internal/app/system/dao/bus_scheduled_plan_type.go new file mode 100644 index 0000000..0cd10eb --- /dev/null +++ b/internal/app/system/dao/bus_scheduled_plan_type.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-29 17:39:12 +// 生成路径: internal/app/system/dao/bus_scheduled_plan_type.go +// 生成人:gfast +// desc:施工进度分类 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busScheduledPlanTypeDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busScheduledPlanTypeDao struct { + *internal.BusScheduledPlanTypeDao +} + +var ( + // BusScheduledPlanType is globally public accessible object for table tools_gen_table operations. + BusScheduledPlanType = busScheduledPlanTypeDao{ + internal.NewBusScheduledPlanTypeDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_scheduled_plan_type_detail.go b/internal/app/system/dao/bus_scheduled_plan_type_detail.go new file mode 100644 index 0000000..4fcdffd --- /dev/null +++ b/internal/app/system/dao/bus_scheduled_plan_type_detail.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-29 17:15:27 +// 生成路径: internal/app/system/dao/bus_scheduled_plan_type_detail.go +// 生成人:gfast +// desc:施工进度月报,年报分类 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busScheduledPlanTypeDetailDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busScheduledPlanTypeDetailDao struct { + *internal.BusScheduledPlanTypeDetailDao +} + +var ( + // BusScheduledPlanTypeDetail is globally public accessible object for table tools_gen_table operations. + BusScheduledPlanTypeDetail = busScheduledPlanTypeDetailDao{ + internal.NewBusScheduledPlanTypeDetailDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_scheduled_weekly.go b/internal/app/system/dao/bus_scheduled_weekly.go new file mode 100644 index 0000000..7d08f35 --- /dev/null +++ b/internal/app/system/dao/bus_scheduled_weekly.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-02 15:28:49 +// 生成路径: internal/app/system/dao/bus_scheduled_weekly.go +// 生成人:gfast +// desc:周报 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busScheduledWeeklyDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busScheduledWeeklyDao struct { + *internal.BusScheduledWeeklyDao +} + +var ( + // BusScheduledWeekly is globally public accessible object for table tools_gen_table operations. + BusScheduledWeekly = busScheduledWeeklyDao{ + internal.NewBusScheduledWeeklyDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_scheduled_weekly_photovoltaic.go b/internal/app/system/dao/bus_scheduled_weekly_photovoltaic.go new file mode 100644 index 0000000..e8aee88 --- /dev/null +++ b/internal/app/system/dao/bus_scheduled_weekly_photovoltaic.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-02 15:21:55 +// 生成路径: internal/app/system/dao/bus_scheduled_weekly_photovoltaic.go +// 生成人:gfast +// desc:周报-光伏板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busScheduledWeeklyPhotovoltaicDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busScheduledWeeklyPhotovoltaicDao struct { + *internal.BusScheduledWeeklyPhotovoltaicDao +} + +var ( + // BusScheduledWeeklyPhotovoltaic is globally public accessible object for table tools_gen_table operations. + BusScheduledWeeklyPhotovoltaic = busScheduledWeeklyPhotovoltaicDao{ + internal.NewBusScheduledWeeklyPhotovoltaicDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_standing_book.go b/internal/app/system/dao/bus_standing_book.go new file mode 100644 index 0000000..a24251d --- /dev/null +++ b/internal/app/system/dao/bus_standing_book.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-29 11:36:04 +// 生成路径: internal/app/system/dao/bus_standing_book.go +// 生成人:gfast +// desc:台账 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busStandingBookDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busStandingBookDao struct { + *internal.BusStandingBookDao +} + +var ( + // BusStandingBook is globally public accessible object for table tools_gen_table operations. + BusStandingBook = busStandingBookDao{ + internal.NewBusStandingBookDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_tour.go b/internal/app/system/dao/bus_tour.go new file mode 100644 index 0000000..96eca46 --- /dev/null +++ b/internal/app/system/dao/bus_tour.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-10-10 12:11:05 +// 生成路径: internal/app/system/dao/bus_tour.go +// 生成人:gfast +// desc:煤科巡视-故障记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busTourDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busTourDao struct { + *internal.BusTourDao +} + +var ( + // BusTour is globally public accessible object for table tools_gen_table operations. + BusTour = busTourDao{ + internal.NewBusTourDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_type_of_wage.go b/internal/app/system/dao/bus_type_of_wage.go new file mode 100644 index 0000000..0d8f5c5 --- /dev/null +++ b/internal/app/system/dao/bus_type_of_wage.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-09-05 10:07:11 +// 生成路径: internal/app/system/dao/bus_type_of_wage.go +// 生成人:gfast +// desc:工种薪水 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busTypeOfWageDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busTypeOfWageDao struct { + *internal.BusTypeOfWageDao +} + +var ( + // BusTypeOfWage is globally public accessible object for table tools_gen_table operations. + BusTypeOfWage = busTypeOfWageDao{ + internal.NewBusTypeOfWageDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_violation_level.go b/internal/app/system/dao/bus_violation_level.go new file mode 100644 index 0000000..0aef27a --- /dev/null +++ b/internal/app/system/dao/bus_violation_level.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-11-20 11:18:36 +// 生成路径: internal/app/system/dao/bus_violation_level.go +// 生成人:gfast +// desc:违章等级 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busViolationLevelDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busViolationLevelDao struct { + *internal.BusViolationLevelDao +} + +var ( + // BusViolationLevel is globally public accessible object for table tools_gen_table operations. + BusViolationLevel = busViolationLevelDao{ + internal.NewBusViolationLevelDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_violation_record.go b/internal/app/system/dao/bus_violation_record.go new file mode 100644 index 0000000..67dc509 --- /dev/null +++ b/internal/app/system/dao/bus_violation_record.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-11-20 11:18:37 +// 生成路径: internal/app/system/dao/bus_violation_record.go +// 生成人:gfast +// desc:违章记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busViolationRecordDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busViolationRecordDao struct { + *internal.BusViolationRecordDao +} + +var ( + // BusViolationRecord is globally public accessible object for table tools_gen_table operations. + BusViolationRecord = busViolationRecordDao{ + internal.NewBusViolationRecordDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/bus_weekly_security_report.go b/internal/app/system/dao/bus_weekly_security_report.go new file mode 100644 index 0000000..ea2f47a --- /dev/null +++ b/internal/app/system/dao/bus_weekly_security_report.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-04-02 18:03:23 +// 生成路径: internal/app/system/dao/bus_weekly_security_report.go +// 生成人:gfast +// desc:安全周期 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// busWeeklySecurityReportDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busWeeklySecurityReportDao struct { + *internal.BusWeeklySecurityReportDao +} + +var ( + // BusWeeklySecurityReport is globally public accessible object for table tools_gen_table operations. + BusWeeklySecurityReport = busWeeklySecurityReportDao{ + internal.NewBusWeeklySecurityReportDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/comment_list.go b/internal/app/system/dao/comment_list.go new file mode 100644 index 0000000..59a79d8 --- /dev/null +++ b/internal/app/system/dao/comment_list.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-05-14 10:21:06 +// 生成路径: internal/app/system/dao/comment_list.go +// 生成人:gfast +// desc:App消息-评论 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// commentListDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type commentListDao struct { + *internal.CommentListDao +} + +var ( + // CommentList is globally public accessible object for table tools_gen_table operations. + CommentList = commentListDao{ + internal.NewCommentListDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/comments.go b/internal/app/system/dao/comments.go new file mode 100644 index 0000000..c939d7e --- /dev/null +++ b/internal/app/system/dao/comments.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// internalCommentsDao is internal type for wrapping internal DAO implements. +type internalCommentsDao = *internal.CommentsDao + +// commentsDao is the data access object for table comments. +// You can define custom methods on it to extend its functionality as you wish. +type commentsDao struct { + internalCommentsDao +} + +var ( + // Comments is globally public accessible object for table comments operations. + Comments = commentsDao{ + internal.NewCommentsDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/construction_details.go b/internal/app/system/dao/construction_details.go new file mode 100644 index 0000000..6cdb17f --- /dev/null +++ b/internal/app/system/dao/construction_details.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-03-13 18:10:56 +// 生成路径: internal/app/system/dao/construction_details.go +// 生成人:gfast +// desc:施工类别详情 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// constructionDetailsDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type constructionDetailsDao struct { + *internal.ConstructionDetailsDao +} + +var ( + // ConstructionDetails is globally public accessible object for table tools_gen_table operations. + ConstructionDetails = constructionDetailsDao{ + internal.NewConstructionDetailsDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/construction_project.go b/internal/app/system/dao/construction_project.go new file mode 100644 index 0000000..17b0a7b --- /dev/null +++ b/internal/app/system/dao/construction_project.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-03-13 17:36:45 +// 生成路径: internal/app/system/dao/construction_project.go +// 生成人:gfast +// desc:施工项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// constructionProjectDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type constructionProjectDao struct { + *internal.ConstructionProjectDao +} + +var ( + // ConstructionProject is globally public accessible object for table tools_gen_table operations. + ConstructionProject = constructionProjectDao{ + internal.NewConstructionProjectDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/device.go b/internal/app/system/dao/device.go new file mode 100644 index 0000000..6c9a74d --- /dev/null +++ b/internal/app/system/dao/device.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-11-24 09:57:07 +// 生成路径: internal/app/system/dao/device.go +// 生成人:gfast +// desc:安全帽设备(java) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// deviceDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type deviceDao struct { + *internal.DeviceDao +} + +var ( + // Device is globally public accessible object for table tools_gen_table operations. + Device = deviceDao{ + internal.NewDeviceDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/device_preset.go b/internal/app/system/dao/device_preset.go new file mode 100644 index 0000000..f6e3bcb --- /dev/null +++ b/internal/app/system/dao/device_preset.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-03-01 12:50:08 +// 生成路径: internal/app/system/dao/device_preset.go +// 生成人:gfast +// desc:预置位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// devicePresetDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type devicePresetDao struct { + *internal.DevicePresetDao +} + +var ( + // DevicePreset is globally public accessible object for table tools_gen_table operations. + DevicePreset = devicePresetDao{ + internal.NewDevicePresetDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/document.go b/internal/app/system/dao/document.go new file mode 100644 index 0000000..7914182 --- /dev/null +++ b/internal/app/system/dao/document.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-09-16 10:32:04 +// 生成路径: internal/app/system/dao/document.go +// 生成人:gfast +// desc:母板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// documentDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type documentDao struct { + *internal.DocumentDao +} + +var ( + // Document is globally public accessible object for table tools_gen_table operations. + Document = documentDao{ + internal.NewDocumentDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/document_completion.go b/internal/app/system/dao/document_completion.go new file mode 100644 index 0000000..b1e5a47 --- /dev/null +++ b/internal/app/system/dao/document_completion.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-03-15 10:25:00 +// 生成路径: internal/app/system/dao/document_completion.go +// 生成人:gfast +// desc:竣工图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// documentCompletionDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type documentCompletionDao struct { + *internal.DocumentCompletionDao +} + +var ( + // DocumentCompletion is globally public accessible object for table tools_gen_table operations. + DocumentCompletion = documentCompletionDao{ + internal.NewDocumentCompletionDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/document_data.go b/internal/app/system/dao/document_data.go new file mode 100644 index 0000000..d64285c --- /dev/null +++ b/internal/app/system/dao/document_data.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-12-27 09:30:03 +// 生成路径: internal/app/system/dao/document_data.go +// 生成人:gfast +// desc:工程资料>资料 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// documentDataDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type documentDataDao struct { + *internal.DocumentDataDao +} + +var ( + // DocumentData is globally public accessible object for table tools_gen_table operations. + DocumentData = documentDataDao{ + internal.NewDocumentDataDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/document_production_drawing.go b/internal/app/system/dao/document_production_drawing.go new file mode 100644 index 0000000..9de6331 --- /dev/null +++ b/internal/app/system/dao/document_production_drawing.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-03-15 10:24:54 +// 生成路径: internal/app/system/dao/document_production_drawing.go +// 生成人:gfast +// desc:施工图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// documentProductionDrawingDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type documentProductionDrawingDao struct { + *internal.DocumentProductionDrawingDao +} + +var ( + // DocumentProductionDrawing is globally public accessible object for table tools_gen_table operations. + DocumentProductionDrawing = documentProductionDrawingDao{ + internal.NewDocumentProductionDrawingDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/document_project.go b/internal/app/system/dao/document_project.go new file mode 100644 index 0000000..a7f0e4f --- /dev/null +++ b/internal/app/system/dao/document_project.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-09-16 10:32:03 +// 生成路径: internal/app/system/dao/document_project.go +// 生成人:gfast +// desc:项目模板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// documentProjectDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type documentProjectDao struct { + *internal.DocumentProjectDao +} + +var ( + // DocumentProject is globally public accessible object for table tools_gen_table operations. + DocumentProject = documentProjectDao{ + internal.NewDocumentProjectDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/document_quality_meeting.go b/internal/app/system/dao/document_quality_meeting.go new file mode 100644 index 0000000..21de607 --- /dev/null +++ b/internal/app/system/dao/document_quality_meeting.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-03-25 16:43:56 +// 生成路径: internal/app/system/dao/document_quality_meeting.go +// 生成人:gfast +// desc:质量会议 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// documentQualityMeetingDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type documentQualityMeetingDao struct { + *internal.DocumentQualityMeetingDao +} + +var ( + // DocumentQualityMeeting is globally public accessible object for table tools_gen_table operations. + DocumentQualityMeeting = documentQualityMeetingDao{ + internal.NewDocumentQualityMeetingDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/document_report.go b/internal/app/system/dao/document_report.go new file mode 100644 index 0000000..a1c64f9 --- /dev/null +++ b/internal/app/system/dao/document_report.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-03-15 10:24:21 +// 生成路径: internal/app/system/dao/document_report.go +// 生成人:gfast +// desc:科研及专题报告 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// documentReportDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type documentReportDao struct { + *internal.DocumentReportDao +} + +var ( + // DocumentReport is globally public accessible object for table tools_gen_table operations. + DocumentReport = documentReportDao{ + internal.NewDocumentReportDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/document_safety_meeting.go b/internal/app/system/dao/document_safety_meeting.go new file mode 100644 index 0000000..22f075e --- /dev/null +++ b/internal/app/system/dao/document_safety_meeting.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-04-09 11:40:20 +// 生成路径: internal/app/system/dao/document_safety_meeting.go +// 生成人:gfast +// desc:安全会议 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// documentSafetyMeetingDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type documentSafetyMeetingDao struct { + *internal.DocumentSafetyMeetingDao +} + +var ( + // DocumentSafetyMeeting is globally public accessible object for table tools_gen_table operations. + DocumentSafetyMeeting = documentSafetyMeetingDao{ + internal.NewDocumentSafetyMeetingDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/equipment.go b/internal/app/system/dao/equipment.go new file mode 100644 index 0000000..6d428f3 --- /dev/null +++ b/internal/app/system/dao/equipment.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// internalEquipmentDao is internal type for wrapping internal DAO implements. +type internalEquipmentDao = *internal.EquipmentDao + +// equipmentDao is the data access object for table equipment. +// You can define custom methods on it to extend its functionality as you wish. +type equipmentDao struct { + internalEquipmentDao +} + +var ( + // Equipment is globally public accessible object for table equipment operations. + Equipment = equipmentDao{ + internal.NewEquipmentDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/extend_dao.go b/internal/app/system/dao/extend_dao.go new file mode 100644 index 0000000..27fd865 --- /dev/null +++ b/internal/app/system/dao/extend_dao.go @@ -0,0 +1,37 @@ +package dao + +import ( + "reflect" +) + +// 解决多表排除字段不能用的情况 +// 例:FieldsEx(internal.SysUser,"a","ex_col1","ex_col2") +func FieldsEx(obj interface{}, preFix string, exFields ...string) []string { + v := reflect.ValueOf(obj) + columnsMethod := v.MethodByName("Columns") + if !columnsMethod.IsValid() { + return []string{} + } + result := columnsMethod.Call([]reflect.Value{}) + + var fields []string + for i := 0; i < result[0].NumField(); i++ { + f := result[0].Field(i) + if f.Kind() == reflect.String { + + if !isInArray(f.String(), exFields) { + fields = append(fields, preFix+"."+f.String()) + } + } + } + return fields +} + +func isInArray(str string, arr []string) bool { + for _, v := range arr { + if v == str { + return true + } + } + return false +} diff --git a/internal/app/system/dao/internal/app_menus.go b/internal/app/system/dao/internal/app_menus.go new file mode 100644 index 0000000..3b7342d --- /dev/null +++ b/internal/app/system/dao/internal/app_menus.go @@ -0,0 +1,77 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// AppMenusDao is the data access object for table app_menus. +type AppMenusDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns AppMenusColumns // columns contains all the column names of Table for convenient usage. +} + +// AppMenusColumns defines and stores column names for table app_menus. +type AppMenusColumns struct { + MenuId string // + MenuName string // 菜单名 + CreatedAt string // +} + +// appMenusColumns holds the columns for table app_menus. +var appMenusColumns = AppMenusColumns{ + MenuId: "menu_id", + MenuName: "menu_name", + CreatedAt: "created_at", +} + +// NewAppMenusDao creates and returns a new DAO object for table data access. +func NewAppMenusDao() *AppMenusDao { + return &AppMenusDao{ + group: "default", + table: "app_menus", + columns: appMenusColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *AppMenusDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *AppMenusDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *AppMenusDao) Columns() AppMenusColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *AppMenusDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *AppMenusDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *AppMenusDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/app_role_menus.go b/internal/app/system/dao/internal/app_role_menus.go new file mode 100644 index 0000000..b107b46 --- /dev/null +++ b/internal/app/system/dao/internal/app_role_menus.go @@ -0,0 +1,82 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-05-28 15:11:14 +// 生成路径: internal/app/system/dao/internal/app_role_menus.go +// 生成人:gfast +// desc:app角色绑定菜单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// AppRoleMenusDao is the manager for logic model data accessing and custom defined data operations functions management. +type AppRoleMenusDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns AppRoleMenusColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// AppRoleMenusColumns defines and stores column names for table app_role_menus. +type AppRoleMenusColumns struct { + Id string // + RoleId string // 角色ID + MenuId string // 菜单ID + CreatedAt string // +} + +var appRoleMenusColumns = AppRoleMenusColumns{ + Id: "id", + RoleId: "role_id", + MenuId: "menu_id", + CreatedAt: "created_at", +} + +// NewAppRoleMenusDao creates and returns a new DAO object for table data access. +func NewAppRoleMenusDao() *AppRoleMenusDao { + return &AppRoleMenusDao{ + group: "default", + table: "app_role_menus", + columns: appRoleMenusColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *AppRoleMenusDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *AppRoleMenusDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *AppRoleMenusDao) Columns() AppRoleMenusColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *AppRoleMenusDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *AppRoleMenusDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *AppRoleMenusDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/app_roles.go b/internal/app/system/dao/internal/app_roles.go new file mode 100644 index 0000000..0af3abc --- /dev/null +++ b/internal/app/system/dao/internal/app_roles.go @@ -0,0 +1,79 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// AppRolesDao is the data access object for table app_roles. +type AppRolesDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns AppRolesColumns // columns contains all the column names of Table for convenient usage. +} + +// AppRolesColumns defines and stores column names for table app_roles. +type AppRolesColumns struct { + RoleId string // + RoleName string // 角色名 + CreatedAt string // + Tag string // 0 管理员 | 1 施工人员 +} + +// appRolesColumns holds the columns for table app_roles. +var appRolesColumns = AppRolesColumns{ + RoleId: "role_id", + RoleName: "role_name", + CreatedAt: "created_at", + Tag: "tag", +} + +// NewAppRolesDao creates and returns a new DAO object for table data access. +func NewAppRolesDao() *AppRolesDao { + return &AppRolesDao{ + group: "default", + table: "app_roles", + columns: appRolesColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *AppRolesDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *AppRolesDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *AppRolesDao) Columns() AppRolesColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *AppRolesDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *AppRolesDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *AppRolesDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/app_user_disable_menus.go b/internal/app/system/dao/internal/app_user_disable_menus.go new file mode 100644 index 0000000..891cc5d --- /dev/null +++ b/internal/app/system/dao/internal/app_user_disable_menus.go @@ -0,0 +1,79 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// AppUserDisableMenusDao is the data access object for table app_user_disable_menus. +type AppUserDisableMenusDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns AppUserDisableMenusColumns // columns contains all the column names of Table for convenient usage. +} + +// AppUserDisableMenusColumns defines and stores column names for table app_user_disable_menus. +type AppUserDisableMenusColumns struct { + UserDisabledMenuId string // + UserId string // 用户ID + MenuId string // 菜单ID + CreatedAt string // +} + +// appUserDisableMenusColumns holds the columns for table app_user_disable_menus. +var appUserDisableMenusColumns = AppUserDisableMenusColumns{ + UserDisabledMenuId: "user_disabled_menu_id", + UserId: "user_id", + MenuId: "menu_id", + CreatedAt: "created_at", +} + +// NewAppUserDisableMenusDao creates and returns a new DAO object for table data access. +func NewAppUserDisableMenusDao() *AppUserDisableMenusDao { + return &AppUserDisableMenusDao{ + group: "default", + table: "app_user_disable_menus", + columns: appUserDisableMenusColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *AppUserDisableMenusDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *AppUserDisableMenusDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *AppUserDisableMenusDao) Columns() AppUserDisableMenusColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *AppUserDisableMenusDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *AppUserDisableMenusDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *AppUserDisableMenusDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/app_user_menus.go b/internal/app/system/dao/internal/app_user_menus.go new file mode 100644 index 0000000..ae2a261 --- /dev/null +++ b/internal/app/system/dao/internal/app_user_menus.go @@ -0,0 +1,79 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// AppUserMenusDao is the data access object for table app_user_menus. +type AppUserMenusDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns AppUserMenusColumns // columns contains all the column names of Table for convenient usage. +} + +// AppUserMenusColumns defines and stores column names for table app_user_menus. +type AppUserMenusColumns struct { + UserMenuId string // + UserId string // 用户ID + MenuId string // 菜单ID + CreatedAt string // +} + +// appUserMenusColumns holds the columns for table app_user_menus. +var appUserMenusColumns = AppUserMenusColumns{ + UserMenuId: "user_menu_id", + UserId: "user_id", + MenuId: "menu_id", + CreatedAt: "created_at", +} + +// NewAppUserMenusDao creates and returns a new DAO object for table data access. +func NewAppUserMenusDao() *AppUserMenusDao { + return &AppUserMenusDao{ + group: "default", + table: "app_user_menus", + columns: appUserMenusColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *AppUserMenusDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *AppUserMenusDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *AppUserMenusDao) Columns() AppUserMenusColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *AppUserMenusDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *AppUserMenusDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *AppUserMenusDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/app_user_roles.go b/internal/app/system/dao/internal/app_user_roles.go new file mode 100644 index 0000000..26dcf86 --- /dev/null +++ b/internal/app/system/dao/internal/app_user_roles.go @@ -0,0 +1,81 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// AppUserRolesDao is the data access object for table app_user_roles. +type AppUserRolesDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns AppUserRolesColumns // columns contains all the column names of Table for convenient usage. +} + +// AppUserRolesColumns defines and stores column names for table app_user_roles. +type AppUserRolesColumns struct { + Id string // + UserId string // 用户ID + RoleId string // 关联的角色ID + CreatedAt string // + MajorRole string // 0 后台管理人员 | 1 施工人员 +} + +// appUserRolesColumns holds the columns for table app_user_roles. +var appUserRolesColumns = AppUserRolesColumns{ + Id: "id", + UserId: "user_id", + RoleId: "role_id", + CreatedAt: "created_at", + MajorRole: "major_role", +} + +// NewAppUserRolesDao creates and returns a new DAO object for table data access. +func NewAppUserRolesDao() *AppUserRolesDao { + return &AppUserRolesDao{ + group: "default", + table: "app_user_roles", + columns: appUserRolesColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *AppUserRolesDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *AppUserRolesDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *AppUserRolesDao) Columns() AppUserRolesColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *AppUserRolesDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *AppUserRolesDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *AppUserRolesDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/app_versions.go b/internal/app/system/dao/internal/app_versions.go new file mode 100644 index 0000000..5fa35a5 --- /dev/null +++ b/internal/app/system/dao/internal/app_versions.go @@ -0,0 +1,81 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// AppVersionsDao is the data access object for table app_versions. +type AppVersionsDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns AppVersionsColumns // columns contains all the column names of Table for convenient usage. +} + +// AppVersionsColumns defines and stores column names for table app_versions. +type AppVersionsColumns struct { + Id string // + Version string // 版本号 + FilePath string // 版本文件的路径 + CreatedAt string // + Platform string // 0 安卓 | 1 IOS +} + +// appVersionsColumns holds the columns for table app_versions. +var appVersionsColumns = AppVersionsColumns{ + Id: "id", + Version: "version", + FilePath: "file_path", + CreatedAt: "created_at", + Platform: "platform", +} + +// NewAppVersionsDao creates and returns a new DAO object for table data access. +func NewAppVersionsDao() *AppVersionsDao { + return &AppVersionsDao{ + group: "default", + table: "app_versions", + columns: appVersionsColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *AppVersionsDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *AppVersionsDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *AppVersionsDao) Columns() AppVersionsColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *AppVersionsDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *AppVersionsDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *AppVersionsDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/big_file.go b/internal/app/system/dao/internal/big_file.go new file mode 100644 index 0000000..4f60cb0 --- /dev/null +++ b/internal/app/system/dao/internal/big_file.go @@ -0,0 +1,98 @@ +// ========================================================================== +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BigFileDao is the data access object for table big_file. +type BigFileDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns BigFileColumns // columns contains all the column names of Table for convenient usage. +} + +// BigFileColumns defines and stores column names for table big_file. +type BigFileColumns struct { + Id string // + Name string // 文件名称 + Size string // 文件大小 + Path string // 文件相对路径 + FullPath string // 文件绝对路径 + MimeType string // 文件类型 + Source string // 文件来源 0 - 本地,1 - 腾讯云 2 - 七牛云 + Describe string // 描述 + Md5 string // md5 + CreatedBy string // + UpdatedBy string // + CreatedAt string // + UpdatedAt string // + DeletedAt string // +} + +// bigFileColumns holds the columns for table big_file. +var bigFileColumns = BigFileColumns{ + Id: "id", + Name: "name", + Size: "size", + Path: "path", + FullPath: "full_path", + MimeType: "mime_type", + Source: "source", + Describe: "describe", + Md5: "md5", + CreatedBy: "created_by", + UpdatedBy: "updated_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBigFileDao creates and returns a new DAO object for table data access. +func NewBigFileDao() *BigFileDao { + return &BigFileDao{ + group: "default", + table: "big_file", + columns: bigFileColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BigFileDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BigFileDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BigFileDao) Columns() BigFileColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BigFileDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BigFileDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BigFileDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_attendance_machine.go b/internal/app/system/dao/internal/bus_attendance_machine.go new file mode 100644 index 0000000..aad4848 --- /dev/null +++ b/internal/app/system/dao/internal/bus_attendance_machine.go @@ -0,0 +1,88 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2025-03-03 10:32:47 +// 生成路径: internal/app/system/dao/internal/bus_attendance_machine.go +// 生成人:gfast +// desc:考勤机 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusAttendanceMachineDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusAttendanceMachineDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusAttendanceMachineColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusAttendanceMachineColumns defines and stores column names for table bus_attendance_machine. +type BusAttendanceMachineColumns struct { + Id string // 主键ID + ProjectId string // 项目ID + Sn string // 设备sn + Teams string // 班组id,多个逗号分隔 + CreateBy string // 创建人 + CreatedAt string // 创建时间 + Remark string // 备注 +} + +var busAttendanceMachineColumns = BusAttendanceMachineColumns{ + Id: "id", + ProjectId: "project_id", + Sn: "sn", + Teams: "teams", + CreateBy: "create_by", + CreatedAt: "created_at", + Remark: "remark", +} + +// NewBusAttendanceMachineDao creates and returns a new DAO object for table data access. +func NewBusAttendanceMachineDao() *BusAttendanceMachineDao { + return &BusAttendanceMachineDao{ + group: "default", + table: "bus_attendance_machine", + columns: busAttendanceMachineColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusAttendanceMachineDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusAttendanceMachineDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusAttendanceMachineDao) Columns() BusAttendanceMachineColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusAttendanceMachineDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusAttendanceMachineDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusAttendanceMachineDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_attendance_machine_user.go b/internal/app/system/dao/internal/bus_attendance_machine_user.go new file mode 100644 index 0000000..133a6dc --- /dev/null +++ b/internal/app/system/dao/internal/bus_attendance_machine_user.go @@ -0,0 +1,84 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2025-03-03 10:33:17 +// 生成路径: internal/app/system/dao/internal/bus_attendance_machine_user.go +// 生成人:gfast +// desc:考勤机用户列 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusAttendanceMachineUserDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusAttendanceMachineUserDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusAttendanceMachineUserColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusAttendanceMachineUserColumns defines and stores column names for table bus_attendance_machine_user. +type BusAttendanceMachineUserColumns struct { + Id string // 主键ID + MachineId string // 考勤机主键ID + TeamId string // 班组ID + UserId string // 用户ID + Identifying string // 标识(是否下发) +} + +var busAttendanceMachineUserColumns = BusAttendanceMachineUserColumns{ + Id: "id", + MachineId: "machine_id", + TeamId: "team_id", + UserId: "user_id", + Identifying: "identifying", +} + +// NewBusAttendanceMachineUserDao creates and returns a new DAO object for table data access. +func NewBusAttendanceMachineUserDao() *BusAttendanceMachineUserDao { + return &BusAttendanceMachineUserDao{ + group: "default", + table: "bus_attendance_machine_user", + columns: busAttendanceMachineUserColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusAttendanceMachineUserDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusAttendanceMachineUserDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusAttendanceMachineUserDao) Columns() BusAttendanceMachineUserColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusAttendanceMachineUserDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusAttendanceMachineUserDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusAttendanceMachineUserDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_camera_channel.go b/internal/app/system/dao/internal/bus_camera_channel.go new file mode 100644 index 0000000..e476f0a --- /dev/null +++ b/internal/app/system/dao/internal/bus_camera_channel.go @@ -0,0 +1,108 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-09-20 14:55:42 +// 生成路径: internal/app/system/dao/internal/bus_camera_channel.go +// 生成人:gfast +// desc:摄像头(国标通道) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusCameraChannelDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusCameraChannelDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusCameraChannelColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusCameraChannelColumns defines and stores column names for table bus_camera_channel. +type BusCameraChannelColumns struct { + Id string // 序号 + CountryId string // 摄像头ID + ProjectId string // 项目id + ChannelNumber string // 国标通道号 + ChannelName string // 通道名称 + ChannelPath string // 视频路径 + ChannelPathWs string // 视频路径 + ChannelPathRtc string // 视频路径 + ChannelPathHls string // 视频路径 + ChannelFormat string // 视频格式(字典) + ChannelState string // 在线状态(字典) + Remark string // 备注 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busCameraChannelColumns = BusCameraChannelColumns{ + Id: "id", + CountryId: "country_id", + ProjectId: "project_id", + ChannelNumber: "channel_number", + ChannelName: "channel_name", + ChannelPath: "channel_path", + ChannelPathWs: "channel_path_ws", + ChannelPathRtc: "channel_path_rtc", + ChannelPathHls: "channel_path_hls", + ChannelFormat: "channel_format", + ChannelState: "channel_state", + Remark: "remark", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusCameraChannelDao creates and returns a new DAO object for table data access. +func NewBusCameraChannelDao() *BusCameraChannelDao { + return &BusCameraChannelDao{ + group: "default", + table: "bus_camera_channel", + columns: busCameraChannelColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusCameraChannelDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusCameraChannelDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusCameraChannelDao) Columns() BusCameraChannelColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusCameraChannelDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusCameraChannelDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusCameraChannelDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_camera_chinese_standard.go b/internal/app/system/dao/internal/bus_camera_chinese_standard.go new file mode 100644 index 0000000..c9829ad --- /dev/null +++ b/internal/app/system/dao/internal/bus_camera_chinese_standard.go @@ -0,0 +1,96 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-09-20 14:55:24 +// 生成路径: internal/app/system/dao/internal/bus_camera_chinese_standard.go +// 生成人:gfast +// desc:摄像头(国标) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusCameraChineseStandardDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusCameraChineseStandardDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusCameraChineseStandardColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusCameraChineseStandardColumns defines and stores column names for table bus_camera_chinese_standard. +type BusCameraChineseStandardColumns struct { + Id string // 序号 + CountryNumber string // 国标号 + CountryName string // 摄像头名称 + CountryState string // 在线状态(字典) + Remark string // 备注 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + ProjectId string // 项目id +} + +var busCameraChineseStandardColumns = BusCameraChineseStandardColumns{ + Id: "id", + CountryNumber: "country_number", + ProjectId: "project_id", + CountryName: "country_name", + CountryState: "country_state", + Remark: "remark", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusCameraChineseStandardDao creates and returns a new DAO object for table data access. +func NewBusCameraChineseStandardDao() *BusCameraChineseStandardDao { + return &BusCameraChineseStandardDao{ + group: "default", + table: "bus_camera_chinese_standard", + columns: busCameraChineseStandardColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusCameraChineseStandardDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusCameraChineseStandardDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusCameraChineseStandardDao) Columns() BusCameraChineseStandardColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusCameraChineseStandardDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusCameraChineseStandardDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusCameraChineseStandardDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_category.go b/internal/app/system/dao/internal/bus_category.go new file mode 100644 index 0000000..f923a75 --- /dev/null +++ b/internal/app/system/dao/internal/bus_category.go @@ -0,0 +1,78 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-10-07 15:52:19 +// 生成路径: internal/app/system/dao/internal/bus_category.go +// 生成人:gfast +// desc:题库_题库类别 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusCategoryDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusCategoryDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusCategoryColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusCategoryColumns defines and stores column names for table bus_category. +type BusCategoryColumns struct { + Id string // 序号 + CategoryName string // 题库类别 +} + +var busCategoryColumns = BusCategoryColumns{ + Id: "id", + CategoryName: "category_name", +} + +// NewBusCategoryDao creates and returns a new DAO object for table data access. +func NewBusCategoryDao() *BusCategoryDao { + return &BusCategoryDao{ + group: "default", + table: "bus_category", + columns: busCategoryColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusCategoryDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusCategoryDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusCategoryDao) Columns() BusCategoryColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusCategoryDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusCategoryDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusCategoryDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_company.go b/internal/app/system/dao/internal/bus_company.go new file mode 100644 index 0000000..2898e04 --- /dev/null +++ b/internal/app/system/dao/internal/bus_company.go @@ -0,0 +1,92 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-07-28 14:08:14 +// 生成路径: internal/app/system/dao/internal/bus_company.go +// 生成人:gfast +// desc:公司 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusCompanyDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusCompanyDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusCompanyColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusCompanyColumns defines and stores column names for table bus_company. +type BusCompanyColumns struct { + CompanyId string // 序号 + CompanyName string // 公司名称 + ProjectId string // 项目id + Status string // 帐号状态 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busCompanyColumns = BusCompanyColumns{ + CompanyId: "company_id", + CompanyName: "company_name", + ProjectId: "project_id", + Status: "status", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusCompanyDao creates and returns a new DAO object for table data access. +func NewBusCompanyDao() *BusCompanyDao { + return &BusCompanyDao{ + group: "default", + table: "bus_company", + columns: busCompanyColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusCompanyDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusCompanyDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusCompanyDao) Columns() BusCompanyColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusCompanyDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusCompanyDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusCompanyDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_complaint_box.go b/internal/app/system/dao/internal/bus_complaint_box.go new file mode 100644 index 0000000..08b8ddc --- /dev/null +++ b/internal/app/system/dao/internal/bus_complaint_box.go @@ -0,0 +1,92 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-12-04 18:09:50 +// 生成路径: internal/app/system/dao/internal/bus_complaint_box.go +// 生成人:gfast +// desc:意见箱 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusComplaintBoxDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusComplaintBoxDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusComplaintBoxColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusComplaintBoxColumns defines and stores column names for table bus_complaint_box. +type BusComplaintBoxColumns struct { + Id string // 主键ID + ProjectId string // 项目id + Openid string // openid + Opinion string // 意见 + Status string // 状态(0未读,1已读) + Dispose string // 处理时间 + Remark string // 备注 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 +} + +var busComplaintBoxColumns = BusComplaintBoxColumns{ + Id: "id", + ProjectId: "project_id", + Openid: "openid", + Opinion: "opinion", + Status: "status", + Dispose: "dispose", + Remark: "remark", + CreatedAt: "created_at", + UpdatedAt: "updated_at", +} + +// NewBusComplaintBoxDao creates and returns a new DAO object for table data access. +func NewBusComplaintBoxDao() *BusComplaintBoxDao { + return &BusComplaintBoxDao{ + group: "default", + table: "bus_complaint_box", + columns: busComplaintBoxColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusComplaintBoxDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusComplaintBoxDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusComplaintBoxDao) Columns() BusComplaintBoxColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusComplaintBoxDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusComplaintBoxDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusComplaintBoxDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_construction_blacklist.go b/internal/app/system/dao/internal/bus_construction_blacklist.go new file mode 100644 index 0000000..ea25381 --- /dev/null +++ b/internal/app/system/dao/internal/bus_construction_blacklist.go @@ -0,0 +1,84 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-11-10 14:08:39 +// 生成路径: internal/app/system/dao/internal/bus_construction_blacklist.go +// 生成人:gfast +// desc:黑名单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusConstructionBlacklistDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusConstructionBlacklistDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusConstructionBlacklistColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusConstructionBlacklistColumns defines and stores column names for table bus_construction_blacklist. +type BusConstructionBlacklistColumns struct { + Openid string // openid + Name string // 名字 + SfzNumber string // 身份证号码 + Remark string // 备注 + CreatedAt string // 创建时间 +} + +var busConstructionBlacklistColumns = BusConstructionBlacklistColumns{ + Openid: "openid", + Name: "name", + SfzNumber: "sfz_number", + Remark: "remark", + CreatedAt: "created_at", +} + +// NewBusConstructionBlacklistDao creates and returns a new DAO object for table data access. +func NewBusConstructionBlacklistDao() *BusConstructionBlacklistDao { + return &BusConstructionBlacklistDao{ + group: "default", + table: "bus_construction_blacklist", + columns: busConstructionBlacklistColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusConstructionBlacklistDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusConstructionBlacklistDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusConstructionBlacklistDao) Columns() BusConstructionBlacklistColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusConstructionBlacklistDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusConstructionBlacklistDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusConstructionBlacklistDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_construction_log.go b/internal/app/system/dao/internal/bus_construction_log.go new file mode 100644 index 0000000..8b77024 --- /dev/null +++ b/internal/app/system/dao/internal/bus_construction_log.go @@ -0,0 +1,98 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-03-22 16:27:43 +// 生成路径: internal/app/system/dao/internal/bus_construction_log.go +// 生成人:gfast +// desc:施工日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusConstructionLogDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusConstructionLogDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusConstructionLogColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusConstructionLogColumns defines and stores column names for table bus_construction_log. +type BusConstructionLogColumns struct { + Id string // 主键ID + ProjectId string // 项目ID + DateOfOccurrence string // 发生日期 + Condition string // 生产情况 + TechnologyQuality string // 技术质量安全工作 + Remark string // 备注 + Path string // 附件(多个逗号分割) + CreatedBy string // 创建人 + UpdatedBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busConstructionLogColumns = BusConstructionLogColumns{ + Id: "id", + ProjectId: "project_id", + DateOfOccurrence: "date_of_occurrence", + Condition: "condition", + TechnologyQuality: "technology_quality", + Remark: "remark", + Path: "path", + CreatedBy: "created_by", + UpdatedBy: "updated_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusConstructionLogDao creates and returns a new DAO object for table data access. +func NewBusConstructionLogDao() *BusConstructionLogDao { + return &BusConstructionLogDao{ + group: "default", + table: "bus_construction_log", + columns: busConstructionLogColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusConstructionLogDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusConstructionLogDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusConstructionLogDao) Columns() BusConstructionLogColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusConstructionLogDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusConstructionLogDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusConstructionLogDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_construction_project.go b/internal/app/system/dao/internal/bus_construction_project.go new file mode 100644 index 0000000..4c70de5 --- /dev/null +++ b/internal/app/system/dao/internal/bus_construction_project.go @@ -0,0 +1,80 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-07 10:17:50 +// 生成路径: internal/app/system/dao/internal/bus_construction_project.go +// 生成人:gfast +// desc:施工人员对应项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusConstructionProjectDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusConstructionProjectDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusConstructionProjectColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusConstructionProjectColumns defines and stores column names for table bus_construction_project. +type BusConstructionProjectColumns struct { + Id string // 序号 + ConstructionUserId string // 微信用户id + ProjectId string // 项目id +} + +var busConstructionProjectColumns = BusConstructionProjectColumns{ + Id: "id", + ConstructionUserId: "construction_user_id", + ProjectId: "project_id", +} + +// NewBusConstructionProjectDao creates and returns a new DAO object for table data access. +func NewBusConstructionProjectDao() *BusConstructionProjectDao { + return &BusConstructionProjectDao{ + group: "default", + table: "bus_construction_project", + columns: busConstructionProjectColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusConstructionProjectDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusConstructionProjectDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusConstructionProjectDao) Columns() BusConstructionProjectColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusConstructionProjectDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusConstructionProjectDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusConstructionProjectDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_construction_user.go b/internal/app/system/dao/internal/bus_construction_user.go new file mode 100644 index 0000000..db050f0 --- /dev/null +++ b/internal/app/system/dao/internal/bus_construction_user.go @@ -0,0 +1,147 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusConstructionUserDao is the data access object for table bus_construction_user. +type BusConstructionUserDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns BusConstructionUserColumns // columns contains all the column names of Table for convenient usage. +} + +// BusConstructionUserColumns defines and stores column names for table bus_construction_user. +type BusConstructionUserColumns struct { + Id string // + Openid string // 微信id + NickName string // 微信名称 + TeamId string // 班组id + HeadIcon string // 登陆照片 + PacePhoto string // 人脸照 + UserName string // 人员姓名 + ProjectId string // 项目id + Status string // 状态(0在职 1离职)-字典position_status + IsPinch string // 是否代打 + IfManagement string // 是否班组管理 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + Phone string // 电话 + Sex string // 1:男,2女,3保密 + SfzNation string // 身份证民族 + SfzNumber string // 身份证号码 + SfzStart string // 身份证有效开始期 + SfzEnd string // 身份证有效结束期 + SfzSite string // 身份证地址 + SfzBirth string // 身份证出生日期 + NativePlace string // 籍贯 + YhkNumber string // 银行卡号 + YhkOpeningBank string // 开户行 + YhkCardholder string // 持卡人 + TypeOfWork string // 工种(字典) + Clock string // 打卡(1启用打卡 2禁止打卡) + LabourserviceId string // 劳务公司id + EntryDate string // 入场时间 + LeaveDate string // 离场时间 + Salary string // 薪水(此字段为0表示此字段无效) + ProjectRecord string // 是否开启项目备案(小程序)1开启 2不开启 + WxOrPc string // 哪添加的(1表示pc 2表示小程序) + Subscription string // 消息订阅状态(1订阅 2无订阅) + DevNum string // 安全帽设备标识 +} + +// busConstructionUserColumns holds the columns for table bus_construction_user. +var busConstructionUserColumns = BusConstructionUserColumns{ + Id: "id", + Openid: "openid", + NickName: "nick_name", + TeamId: "team_id", + HeadIcon: "head_icon", + PacePhoto: "pace_photo", + UserName: "user_name", + ProjectId: "project_id", + Status: "status", + IsPinch: "is_pinch", + IfManagement: "if_management", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + Phone: "phone", + Sex: "sex", + SfzNation: "sfz_nation", + SfzNumber: "sfz_number", + SfzStart: "sfz_start", + SfzEnd: "sfz_end", + SfzSite: "sfz_site", + SfzBirth: "sfz_birth", + NativePlace: "native_place", + YhkNumber: "yhk_number", + YhkOpeningBank: "yhk_opening_bank", + YhkCardholder: "yhk_cardholder", + TypeOfWork: "type_of_work", + Clock: "clock", + LabourserviceId: "labourservice_id", + EntryDate: "entry_date", + LeaveDate: "leave_date", + Salary: "salary", + ProjectRecord: "project_record", + WxOrPc: "wx_or_pc", + Subscription: "subscription", + DevNum: "dev_num", +} + +// NewBusConstructionUserDao creates and returns a new DAO object for table data access. +func NewBusConstructionUserDao() *BusConstructionUserDao { + return &BusConstructionUserDao{ + group: "default", + table: "bus_construction_user", + columns: busConstructionUserColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusConstructionUserDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusConstructionUserDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusConstructionUserDao) Columns() BusConstructionUserColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusConstructionUserDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusConstructionUserDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusConstructionUserDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_construction_user_file.go b/internal/app/system/dao/internal/bus_construction_user_file.go new file mode 100644 index 0000000..57f826d --- /dev/null +++ b/internal/app/system/dao/internal/bus_construction_user_file.go @@ -0,0 +1,94 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-07 10:17:41 +// 生成路径: internal/app/system/dao/internal/bus_construction_user_file.go +// 生成人:gfast +// desc:微信用户的文件存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusConstructionUserFileDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusConstructionUserFileDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusConstructionUserFileColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusConstructionUserFileColumns defines and stores column names for table bus_construction_user_file. +type BusConstructionUserFileColumns struct { + Id string // 主键ID + UserId string // 用户id + UserImgType string // 图片类型 + Path string // 图片路径 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + Remark string // 备注 +} + +var busConstructionUserFileColumns = BusConstructionUserFileColumns{ + Id: "id", + UserId: "user_id", + UserImgType: "user_img_type", + Path: "path", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + Remark: "remark", +} + +// NewBusConstructionUserFileDao creates and returns a new DAO object for table data access. +func NewBusConstructionUserFileDao() *BusConstructionUserFileDao { + return &BusConstructionUserFileDao{ + group: "default", + table: "bus_construction_user_file", + columns: busConstructionUserFileColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusConstructionUserFileDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusConstructionUserFileDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusConstructionUserFileDao) Columns() BusConstructionUserFileColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusConstructionUserFileDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusConstructionUserFileDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusConstructionUserFileDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_construction_user_post.go b/internal/app/system/dao/internal/bus_construction_user_post.go new file mode 100644 index 0000000..ee4de9e --- /dev/null +++ b/internal/app/system/dao/internal/bus_construction_user_post.go @@ -0,0 +1,80 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-07 10:06:34 +// 生成路径: internal/app/system/dao/internal/bus_construction_user_post.go +// 生成人:gfast +// desc:施工人员岗位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusConstructionUserPostDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusConstructionUserPostDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusConstructionUserPostColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusConstructionUserPostColumns defines and stores column names for table bus_construction_user_post. +type BusConstructionUserPostColumns struct { + Id string // + ConstructionUserId string // 施工人员id + PostId string // 岗位id +} + +var busConstructionUserPostColumns = BusConstructionUserPostColumns{ + Id: "id", + ConstructionUserId: "construction_user_id", + PostId: "post_id", +} + +// NewBusConstructionUserPostDao creates and returns a new DAO object for table data access. +func NewBusConstructionUserPostDao() *BusConstructionUserPostDao { + return &BusConstructionUserPostDao{ + group: "default", + table: "bus_construction_user_post", + columns: busConstructionUserPostColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusConstructionUserPostDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusConstructionUserPostDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusConstructionUserPostDao) Columns() BusConstructionUserPostColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusConstructionUserPostDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusConstructionUserPostDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusConstructionUserPostDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_corporate_events.go b/internal/app/system/dao/internal/bus_corporate_events.go new file mode 100644 index 0000000..a041a8a --- /dev/null +++ b/internal/app/system/dao/internal/bus_corporate_events.go @@ -0,0 +1,90 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-03-20 16:49:36 +// 生成路径: internal/app/system/dao/internal/bus_corporate_events.go +// 生成人:gfast +// desc:企业大事记 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusCorporateEventsDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusCorporateEventsDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusCorporateEventsColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusCorporateEventsColumns defines and stores column names for table bus_corporate_events. +type BusCorporateEventsColumns struct { + Id string // 主键ID + Headline string // 标题 + Content string // 内容 + CreatedBy string // 创建人 + UpdatedBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busCorporateEventsColumns = BusCorporateEventsColumns{ + Id: "id", + Headline: "headline", + Content: "content", + CreatedBy: "created_by", + UpdatedBy: "updated_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusCorporateEventsDao creates and returns a new DAO object for table data access. +func NewBusCorporateEventsDao() *BusCorporateEventsDao { + return &BusCorporateEventsDao{ + group: "default", + table: "bus_corporate_events", + columns: busCorporateEventsColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusCorporateEventsDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusCorporateEventsDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusCorporateEventsDao) Columns() BusCorporateEventsColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusCorporateEventsDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusCorporateEventsDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusCorporateEventsDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_design_audit.go b/internal/app/system/dao/internal/bus_design_audit.go new file mode 100644 index 0000000..6f546c2 --- /dev/null +++ b/internal/app/system/dao/internal/bus_design_audit.go @@ -0,0 +1,94 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-04-09 15:40:16 +// 生成路径: internal/app/system/dao/internal/bus_design_audit.go +// 生成人:gfast +// desc:设计审核(竣工、施工、可研) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusDesignAuditDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusDesignAuditDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusDesignAuditColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusDesignAuditColumns defines and stores column names for table bus_design_audit. +type BusDesignAuditColumns struct { + Id string // 主键ID + ProjectId string // 项目ID + TableName string // 表名 + TableId string // 表ID + Status string // 审核状态(1未读 2拒绝 3通过) + Cause string // 拒绝原因 + Auditor string // 审核人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busDesignAuditColumns = BusDesignAuditColumns{ + Id: "id", + ProjectId: "project_id", + TableName: "table_name", + TableId: "table_id", + Status: "status", + Cause: "cause", + Auditor: "auditor", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusDesignAuditDao creates and returns a new DAO object for table data access. +func NewBusDesignAuditDao() *BusDesignAuditDao { + return &BusDesignAuditDao{ + group: "default", + table: "bus_design_audit", + columns: busDesignAuditColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusDesignAuditDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusDesignAuditDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusDesignAuditDao) Columns() BusDesignAuditColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusDesignAuditDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusDesignAuditDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusDesignAuditDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_design_document.go b/internal/app/system/dao/internal/bus_design_document.go new file mode 100644 index 0000000..3e215eb --- /dev/null +++ b/internal/app/system/dao/internal/bus_design_document.go @@ -0,0 +1,98 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-07-29 16:31:29 +// 生成路径: internal/app/system/dao/internal/bus_design_document.go +// 生成人:gfast +// desc:设计管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusDesignDocumentDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusDesignDocumentDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusDesignDocumentColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusDesignDocumentColumns defines and stores column names for table bus_design_document. +type BusDesignDocumentColumns struct { + Id string // 序号 + DocumenName string // 文档名称 + Remark string // 备注 + DocumentUrl string // 文件路径 + FileId string // 文件夹id + ProjectId string // 项目id + Status string // 状态 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 上传时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busDesignDocumentColumns = BusDesignDocumentColumns{ + Id: "id", + DocumenName: "documen_name", + Remark: "remark", + DocumentUrl: "document_url", + FileId: "file_id", + ProjectId: "project_id", + Status: "status", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusDesignDocumentDao creates and returns a new DAO object for table data access. +func NewBusDesignDocumentDao() *BusDesignDocumentDao { + return &BusDesignDocumentDao{ + group: "default", + table: "bus_design_document", + columns: busDesignDocumentColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusDesignDocumentDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusDesignDocumentDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusDesignDocumentDao) Columns() BusDesignDocumentColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusDesignDocumentDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusDesignDocumentDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusDesignDocumentDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_design_period_range.go b/internal/app/system/dao/internal/bus_design_period_range.go new file mode 100644 index 0000000..e807b86 --- /dev/null +++ b/internal/app/system/dao/internal/bus_design_period_range.go @@ -0,0 +1,100 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-04-11 17:28:54 +// 生成路径: internal/app/system/dao/internal/bus_design_period_range.go +// 生成人:gfast +// desc:设计-周期范围 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusDesignPeriodRangeDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusDesignPeriodRangeDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusDesignPeriodRangeColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusDesignPeriodRangeColumns defines and stores column names for table bus_design_period_range. +type BusDesignPeriodRangeColumns struct { + Id string // 主键ID + ProjectId string // 项目id + TableType string // 记录类型(1竣工 2施工 3可研) + FileName string // 文件名称 + FilePath string // 文件路径 + IsEntering string // 路径内容是否存在(1否 2是) + StartTime string // 起始时间 + EndTime string // 结束时间 + CreateBy string // 创建者 + UpdateBy string // 录入者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busDesignPeriodRangeColumns = BusDesignPeriodRangeColumns{ + Id: "id", + ProjectId: "project_id", + TableType: "table_type", + FileName: "file_name", + FilePath: "file_path", + IsEntering: "is_entering", + StartTime: "start_time", + EndTime: "end_time", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusDesignPeriodRangeDao creates and returns a new DAO object for table data access. +func NewBusDesignPeriodRangeDao() *BusDesignPeriodRangeDao { + return &BusDesignPeriodRangeDao{ + group: "default", + table: "bus_design_period_range", + columns: busDesignPeriodRangeColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusDesignPeriodRangeDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusDesignPeriodRangeDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusDesignPeriodRangeDao) Columns() BusDesignPeriodRangeColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusDesignPeriodRangeDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusDesignPeriodRangeDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusDesignPeriodRangeDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_engineering_quality.go b/internal/app/system/dao/internal/bus_engineering_quality.go new file mode 100644 index 0000000..0ea7133 --- /dev/null +++ b/internal/app/system/dao/internal/bus_engineering_quality.go @@ -0,0 +1,106 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-07-29 09:31:22 +// 生成路径: internal/app/system/dao/internal/bus_engineering_quality.go +// 生成人:gfast +// desc:工程质量列 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusEngineeringQualityDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusEngineeringQualityDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusEngineeringQualityColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusEngineeringQualityColumns defines and stores column names for table bus_engineering_quality. +type BusEngineeringQualityColumns struct { + Id string // 序号 + UnitName1 string // 单位工程 + UnitName2 string // 子单位工程 + UnitName3 string // 分部工程 + UnitName4 string // 子分部工程 + UnitName5 string // 分项工程 + UnitName6 string // 检验批 + QualityName string // 工程项目名称 + ProjectId string // 项目id + Status string // 施工类型状态 + FileUrl string // 文件地址 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreateTime string // 创建时间 + UpdateTime string // 更新时间 + DeletedAt string // 删除时间 +} + +var busEngineeringQualityColumns = BusEngineeringQualityColumns{ + Id: "id", + UnitName1: "unit_name1", + UnitName2: "unit_name2", + UnitName3: "unit_name3", + UnitName4: "unit_name4", + UnitName5: "unit_name5", + UnitName6: "unit_name6", + QualityName: "quality_name", + ProjectId: "project_id", + Status: "status", + FileUrl: "file_url", + CreateBy: "create_by", + UpdateBy: "update_by", + CreateTime: "create_time", + UpdateTime: "update_time", + DeletedAt: "deleted_at", +} + +// NewBusEngineeringQualityDao creates and returns a new DAO object for table data access. +func NewBusEngineeringQualityDao() *BusEngineeringQualityDao { + return &BusEngineeringQualityDao{ + group: "default", + table: "bus_engineering_quality", + columns: busEngineeringQualityColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusEngineeringQualityDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusEngineeringQualityDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusEngineeringQualityDao) Columns() BusEngineeringQualityColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusEngineeringQualityDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusEngineeringQualityDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusEngineeringQualityDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_equipment_equipment_unpacking.go b/internal/app/system/dao/internal/bus_equipment_equipment_unpacking.go new file mode 100644 index 0000000..07aa597 --- /dev/null +++ b/internal/app/system/dao/internal/bus_equipment_equipment_unpacking.go @@ -0,0 +1,96 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-07-29 11:14:45 +// 生成路径: internal/app/system/dao/internal/bus_equipment_equipment_unpacking.go +// 生成人:gfast +// desc:开箱记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusEquipmentEquipmentUnpackingDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusEquipmentEquipmentUnpackingDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusEquipmentEquipmentUnpackingColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusEquipmentEquipmentUnpackingColumns defines and stores column names for table bus_equipment_equipment_unpacking. +type BusEquipmentEquipmentUnpackingColumns struct { + UnpackingId string // 序号 + EquipmentMaterialsId string // 设备id + UnpackingName string // 开箱名称 + UnpackingUrl string // 开箱上传文件 + ProjectId string // 项目id + Status string // 状态 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busEquipmentEquipmentUnpackingColumns = BusEquipmentEquipmentUnpackingColumns{ + UnpackingId: "unpacking_id", + EquipmentMaterialsId: "equipment_materials_id", + UnpackingName: "unpacking_name", + UnpackingUrl: "unpacking_url", + ProjectId: "project_id", + Status: "status", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusEquipmentEquipmentUnpackingDao creates and returns a new DAO object for table data access. +func NewBusEquipmentEquipmentUnpackingDao() *BusEquipmentEquipmentUnpackingDao { + return &BusEquipmentEquipmentUnpackingDao{ + group: "default", + table: "bus_equipment_equipment_unpacking", + columns: busEquipmentEquipmentUnpackingColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusEquipmentEquipmentUnpackingDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusEquipmentEquipmentUnpackingDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusEquipmentEquipmentUnpackingDao) Columns() BusEquipmentEquipmentUnpackingColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusEquipmentEquipmentUnpackingDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusEquipmentEquipmentUnpackingDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusEquipmentEquipmentUnpackingDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_equipment_materials.go b/internal/app/system/dao/internal/bus_equipment_materials.go new file mode 100644 index 0000000..3994fb1 --- /dev/null +++ b/internal/app/system/dao/internal/bus_equipment_materials.go @@ -0,0 +1,122 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-07-29 11:14:16 +// 生成路径: internal/app/system/dao/internal/bus_equipment_materials.go +// 生成人:gfast +// desc:材料/设备名称 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusEquipmentMaterialsDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusEquipmentMaterialsDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusEquipmentMaterialsColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusEquipmentMaterialsColumns defines and stores column names for table bus_equipment_materials. +type BusEquipmentMaterialsColumns struct { + EquipmentMaterialsId string // 序号 + EquipmentMaterialsName string // 材料/设备 + CompanyId string // 公司 + ProjectId string // 项目 + TypeSpecificationName string // 规格型号 + TypeSpecificationUrl string // 规格型号文件 + CertificateConformityName string // 合格证编号 + CertificateConformityUrl string // 合格证编号文件 + QualityName string // 质量说明书编号 + QualityUrl string // 质量说明书文件 + InspectionReportName string // 检验报告编号 + InspectionReportUrl string // 检验报告文件 + ReexamineReportName string // 复试报告编号 + ReexamineReportUrl string // 复试报告文件 + UsePart string // 使用部位 + WeightId string // 计量单位 + Remark string // 备注 + QuantityCount string // 材料数量 + Status string // 状态 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除视角 +} + +var busEquipmentMaterialsColumns = BusEquipmentMaterialsColumns{ + EquipmentMaterialsId: "equipment_materials_id", + EquipmentMaterialsName: "equipment_materials_name", + CompanyId: "company_id", + ProjectId: "project_id", + TypeSpecificationName: "type_specification_name", + TypeSpecificationUrl: "type_specification_url", + CertificateConformityName: "certificate_conformity_name", + CertificateConformityUrl: "certificate_conformity_url", + QualityName: "quality_name", + QualityUrl: "quality_url", + InspectionReportName: "inspection_report_name", + InspectionReportUrl: "inspection_report_url", + ReexamineReportName: "reexamine_report_name", + ReexamineReportUrl: "reexamine_report_url", + UsePart: "use_part", + WeightId: "weight_id", + Remark: "remark", + QuantityCount: "quantity_count", + Status: "status", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusEquipmentMaterialsDao creates and returns a new DAO object for table data access. +func NewBusEquipmentMaterialsDao() *BusEquipmentMaterialsDao { + return &BusEquipmentMaterialsDao{ + group: "default", + table: "bus_equipment_materials", + columns: busEquipmentMaterialsColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusEquipmentMaterialsDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusEquipmentMaterialsDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusEquipmentMaterialsDao) Columns() BusEquipmentMaterialsColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusEquipmentMaterialsDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusEquipmentMaterialsDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusEquipmentMaterialsDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_equipment_materials_inventory.go b/internal/app/system/dao/internal/bus_equipment_materials_inventory.go new file mode 100644 index 0000000..a35166c --- /dev/null +++ b/internal/app/system/dao/internal/bus_equipment_materials_inventory.go @@ -0,0 +1,98 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-09-13 14:21:30 +// 生成路径: internal/app/system/dao/internal/bus_equipment_materials_inventory.go +// 生成人:gfast +// desc:设备材料入库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusEquipmentMaterialsInventoryDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusEquipmentMaterialsInventoryDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusEquipmentMaterialsInventoryColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusEquipmentMaterialsInventoryColumns defines and stores column names for table bus_equipment_materials_inventory. +type BusEquipmentMaterialsInventoryColumns struct { + Id string // 主键ID + EquipmentMaterialsId string // 材料ID + OutPut string // 出入库 + Number string // 数量 + Residue string // 剩余库存数量 + Operator string // 出入库负责人 + Remark string // 备注 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除视角 +} + +var busEquipmentMaterialsInventoryColumns = BusEquipmentMaterialsInventoryColumns{ + Id: "id", + EquipmentMaterialsId: "equipment_materials_id", + OutPut: "out_put", + Number: "number", + Residue: "residue", + Operator: "operator", + Remark: "remark", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusEquipmentMaterialsInventoryDao creates and returns a new DAO object for table data access. +func NewBusEquipmentMaterialsInventoryDao() *BusEquipmentMaterialsInventoryDao { + return &BusEquipmentMaterialsInventoryDao{ + group: "default", + table: "bus_equipment_materials_inventory", + columns: busEquipmentMaterialsInventoryColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusEquipmentMaterialsInventoryDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusEquipmentMaterialsInventoryDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusEquipmentMaterialsInventoryDao) Columns() BusEquipmentMaterialsInventoryColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusEquipmentMaterialsInventoryDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusEquipmentMaterialsInventoryDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusEquipmentMaterialsInventoryDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_equipment_materials_inventory_file.go b/internal/app/system/dao/internal/bus_equipment_materials_inventory_file.go new file mode 100644 index 0000000..7102c19 --- /dev/null +++ b/internal/app/system/dao/internal/bus_equipment_materials_inventory_file.go @@ -0,0 +1,85 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusEquipmentMaterialsInventoryFileDao is the data access object for table bus_equipment_materials_inventory_file. +type BusEquipmentMaterialsInventoryFileDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns BusEquipmentMaterialsInventoryFileColumns // columns contains all the column names of Table for convenient usage. +} + +// BusEquipmentMaterialsInventoryFileColumns defines and stores column names for table bus_equipment_materials_inventory_file. +type BusEquipmentMaterialsInventoryFileColumns struct { + Id string // 主键 + MaterialsInventoryId string // 设备材料Id + Name string // 文件名字 + Path string // 文件路径 + Suffix string // 文件后缀 + Size string // 文件大小 + CreatedAt string // 创建时间 +} + +// busEquipmentMaterialsInventoryFileColumns holds the columns for table bus_equipment_materials_inventory_file. +var busEquipmentMaterialsInventoryFileColumns = BusEquipmentMaterialsInventoryFileColumns{ + Id: "id", + MaterialsInventoryId: "materials_inventory_id", + Name: "name", + Path: "path", + Suffix: "suffix", + Size: "size", + CreatedAt: "created_at", +} + +// NewBusEquipmentMaterialsInventoryFileDao creates and returns a new DAO object for table data access. +func NewBusEquipmentMaterialsInventoryFileDao() *BusEquipmentMaterialsInventoryFileDao { + return &BusEquipmentMaterialsInventoryFileDao{ + group: "default", + table: "bus_equipment_materials_inventory_file", + columns: busEquipmentMaterialsInventoryFileColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusEquipmentMaterialsInventoryFileDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusEquipmentMaterialsInventoryFileDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusEquipmentMaterialsInventoryFileDao) Columns() BusEquipmentMaterialsInventoryFileColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusEquipmentMaterialsInventoryFileDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusEquipmentMaterialsInventoryFileDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusEquipmentMaterialsInventoryFileDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_equipment_materials_weight.go b/internal/app/system/dao/internal/bus_equipment_materials_weight.go new file mode 100644 index 0000000..2021ab8 --- /dev/null +++ b/internal/app/system/dao/internal/bus_equipment_materials_weight.go @@ -0,0 +1,90 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-07-28 15:27:53 +// 生成路径: internal/app/system/dao/internal/bus_equipment_materials_weight.go +// 生成人:gfast +// desc:计量单位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusEquipmentMaterialsWeightDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusEquipmentMaterialsWeightDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusEquipmentMaterialsWeightColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusEquipmentMaterialsWeightColumns defines and stores column names for table bus_equipment_materials_weight. +type BusEquipmentMaterialsWeightColumns struct { + WeightId string // 序号 + Weight string // 计量单位名称 + Status string // 状态 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busEquipmentMaterialsWeightColumns = BusEquipmentMaterialsWeightColumns{ + WeightId: "weight_id", + Weight: "weight", + Status: "status", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusEquipmentMaterialsWeightDao creates and returns a new DAO object for table data access. +func NewBusEquipmentMaterialsWeightDao() *BusEquipmentMaterialsWeightDao { + return &BusEquipmentMaterialsWeightDao{ + group: "default", + table: "bus_equipment_materials_weight", + columns: busEquipmentMaterialsWeightColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusEquipmentMaterialsWeightDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusEquipmentMaterialsWeightDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusEquipmentMaterialsWeightDao) Columns() BusEquipmentMaterialsWeightColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusEquipmentMaterialsWeightDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusEquipmentMaterialsWeightDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusEquipmentMaterialsWeightDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_essential_information.go b/internal/app/system/dao/internal/bus_essential_information.go new file mode 100644 index 0000000..262360c --- /dev/null +++ b/internal/app/system/dao/internal/bus_essential_information.go @@ -0,0 +1,86 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-03-20 19:38:54 +// 生成路径: internal/app/system/dao/internal/bus_essential_information.go +// 生成人:gfast +// desc:项目基本信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusEssentialInformationDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusEssentialInformationDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusEssentialInformationColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusEssentialInformationColumns defines and stores column names for table bus_essential_information. +type BusEssentialInformationColumns struct { + Id string // 主键ID + One string // 发电量 + Two string // 年发电量 + Three string // 当前发电量 + Four string // 减排量 + Five string // 预估发电量 +} + +var busEssentialInformationColumns = BusEssentialInformationColumns{ + Id: "id", + One: "one", + Two: "two", + Three: "three", + Four: "four", + Five: "five", +} + +// NewBusEssentialInformationDao creates and returns a new DAO object for table data access. +func NewBusEssentialInformationDao() *BusEssentialInformationDao { + return &BusEssentialInformationDao{ + group: "default", + table: "bus_essential_information", + columns: busEssentialInformationColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusEssentialInformationDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusEssentialInformationDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusEssentialInformationDao) Columns() BusEssentialInformationColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusEssentialInformationDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusEssentialInformationDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusEssentialInformationDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_folder.go b/internal/app/system/dao/internal/bus_folder.go new file mode 100644 index 0000000..d5a2875 --- /dev/null +++ b/internal/app/system/dao/internal/bus_folder.go @@ -0,0 +1,98 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-09-15 17:15:59 +// 生成路径: internal/app/system/dao/internal/bus_folder.go +// 生成人:gfast +// desc:文件夹 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusFolderDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusFolderDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusFolderColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusFolderColumns defines and stores column names for table bus_folder. +type BusFolderColumns struct { + Id string // 序号 + Father string // 大于0表示当前文件夹有父级 + FolderType string // 文件夹类型 + Icon string // 文件夹图标 + Name string // 文件夹名称 + ProjectId string // 项目id + Remark string // 备注 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busFolderColumns = BusFolderColumns{ + Id: "id", + Father: "father", + FolderType: "folder_type", + Icon: "icon", + Name: "name", + ProjectId: "project_id", + Remark: "remark", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusFolderDao creates and returns a new DAO object for table data access. +func NewBusFolderDao() *BusFolderDao { + return &BusFolderDao{ + group: "default", + table: "bus_folder", + columns: busFolderColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusFolderDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusFolderDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusFolderDao) Columns() BusFolderColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusFolderDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusFolderDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusFolderDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_folder_file.go b/internal/app/system/dao/internal/bus_folder_file.go new file mode 100644 index 0000000..0df5230 --- /dev/null +++ b/internal/app/system/dao/internal/bus_folder_file.go @@ -0,0 +1,102 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-09-15 17:16:00 +// 生成路径: internal/app/system/dao/internal/bus_folder_file.go +// 生成人:gfast +// desc:文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusFolderFileDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusFolderFileDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusFolderFileColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusFolderFileColumns defines and stores column names for table bus_folder_file. +type BusFolderFileColumns struct { + Id string // 序号 + ProjectId string // 序号 + FolderId string // 所属文件夹 + FileType string // 文件类型 + Name string // 文件名称 + Size string // 文件大小 + Suffix string // 文件后缀 + Path string // 文件路径 + Remark string // 备注 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busFolderFileColumns = BusFolderFileColumns{ + Id: "id", + ProjectId: "project_id", + FolderId: "folder_id", + FileType: "file_type", + Name: "name", + Size: "size", + Suffix: "suffix", + Path: "path", + Remark: "remark", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusFolderFileDao creates and returns a new DAO object for table data access. +func NewBusFolderFileDao() *BusFolderFileDao { + return &BusFolderFileDao{ + group: "default", + table: "bus_folder_file", + columns: busFolderFileColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusFolderFileDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusFolderFileDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusFolderFileDao) Columns() BusFolderFileColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusFolderFileDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusFolderFileDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusFolderFileDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_hse_management.go b/internal/app/system/dao/internal/bus_hse_management.go new file mode 100644 index 0000000..0d690bc --- /dev/null +++ b/internal/app/system/dao/internal/bus_hse_management.go @@ -0,0 +1,118 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-03-28 14:53:05 +// 生成路径: internal/app/system/dao/internal/bus_hse_management.go +// 生成人:gfast +// desc:HSE-巡检工单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusHseManagementDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusHseManagementDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusHseManagementColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusHseManagementColumns defines and stores column names for table bus_hse_management. +type BusHseManagementColumns struct { + Id string // 你 + ProjectId string // 项目ID + StudyType string // 检查类型 + TourType string // 违章类型字典 + InspectionResult string // 巡检结果 + TeamName string // 名称(班组/部门) + Corrector string // 整改人(班组长) + IsReply string // 是否回复(1回复 2不回复) + ReplyDate string // 回复日期 + Status string // 工单状态(1通知 2整改 3复查) + HiddenDanger string // 问题隐患 + Measure string // 整改措施 + Review string // 复查情况 + ReviewType string // 复查状态 + CreatedBy string // 创建人 + UpdatedBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + CheckTime string // 检查时间 + RectificationTime string // 整改时间 + ReviewTime string // 复查时间 +} + +var busHseManagementColumns = BusHseManagementColumns{ + Id: "id", + ProjectId: "project_id", + StudyType: "study_type", + TourType: "tour_type", + InspectionResult: "inspection_result", + TeamName: "team_name", + Corrector: "corrector", + IsReply: "is_reply", + ReplyDate: "reply_date", + Status: "status", + HiddenDanger: "hidden_danger", + Measure: "measure", + Review: "review", + ReviewType: "review_type", + CreatedBy: "created_by", + UpdatedBy: "updated_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + CheckTime: "check_time", + RectificationTime: "rectification_time", + ReviewTime: "review_time", +} + +// NewBusHseManagementDao creates and returns a new DAO object for table data access. +func NewBusHseManagementDao() *BusHseManagementDao { + return &BusHseManagementDao{ + group: "default", + table: "bus_hse_management", + columns: busHseManagementColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusHseManagementDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusHseManagementDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusHseManagementDao) Columns() BusHseManagementColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusHseManagementDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusHseManagementDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusHseManagementDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_hse_security_log.go b/internal/app/system/dao/internal/bus_hse_security_log.go new file mode 100644 index 0000000..c97d157 --- /dev/null +++ b/internal/app/system/dao/internal/bus_hse_security_log.go @@ -0,0 +1,116 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-04-07 17:00:45 +// 生成路径: internal/app/system/dao/internal/bus_hse_security_log.go +// 生成人:gfast +// desc:HSE安全日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusHseSecurityLogDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusHseSecurityLogDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusHseSecurityLogColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusHseSecurityLogColumns defines and stores column names for table bus_hse_security_log. +type BusHseSecurityLogColumns struct { + Id string // 主键ID + ProjectId string // 项目ID + DateOfOccurrence string // 发生日期 + AirTemperatureMax string // 最高气温 + AirTemperatureMin string // 最低气温 + Climate string // 气候(字典) + Progress string // 进展情况 + JobContent string // 作业内容 + DiscloseTheFacts string // 交底情况 + ProgressOfActivity string // 活动情况 + Examine string // 检查情况 + Implementation string // 实施情况 + SafetyInspectionSituation string // 安全检查情况 + StoppageOrOvertime string // 停工或加班情况 + OtherRecords string // 其他情况 + Remark string // 备注 + CreatedBy string // 创建人 + UpdatedBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busHseSecurityLogColumns = BusHseSecurityLogColumns{ + Id: "id", + ProjectId: "project_id", + DateOfOccurrence: "date_of_occurrence", + AirTemperatureMax: "air_temperature_max", + AirTemperatureMin: "air_temperature_min", + Climate: "climate", + Progress: "progress", + JobContent: "job_content", + DiscloseTheFacts: "disclose_the_facts", + ProgressOfActivity: "progress_of_activity", + Examine: "examine", + Implementation: "implementation", + SafetyInspectionSituation: "safety_inspection_situation", + StoppageOrOvertime: "stoppage_or_overtime", + OtherRecords: "other_records", + Remark: "remark", + CreatedBy: "created_by", + UpdatedBy: "updated_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusHseSecurityLogDao creates and returns a new DAO object for table data access. +func NewBusHseSecurityLogDao() *BusHseSecurityLogDao { + return &BusHseSecurityLogDao{ + group: "default", + table: "bus_hse_security_log", + columns: busHseSecurityLogColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusHseSecurityLogDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusHseSecurityLogDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusHseSecurityLogDao) Columns() BusHseSecurityLogColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusHseSecurityLogDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusHseSecurityLogDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusHseSecurityLogDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_inspection_ticket.go b/internal/app/system/dao/internal/bus_inspection_ticket.go new file mode 100644 index 0000000..62845f5 --- /dev/null +++ b/internal/app/system/dao/internal/bus_inspection_ticket.go @@ -0,0 +1,104 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-03-21 15:23:58 +// 生成路径: internal/app/system/dao/internal/bus_inspection_ticket.go +// 生成人:gfast +// desc:质量工单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusInspectionTicketDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusInspectionTicketDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusInspectionTicketColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusInspectionTicketColumns defines and stores column names for table bus_inspection_ticket. +type BusInspectionTicketColumns struct { + Id string // 主键ID + ProjectId string // 项目ID + InspectionType string // 巡检类型(关联字典) + InspectionResult string // 巡检结果 + Corrector string // 整改人(班组长) + IsReply string // 是否回复(1回复 2不回复) + ReplyDate string // 回复日期 + Status string // 工单状态(1通知 2整改 3验证) + Feedback string // 整改反馈 + VerificationResult string // 验证结果 + CreatedBy string // 创建人 + UpdatedBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busInspectionTicketColumns = BusInspectionTicketColumns{ + Id: "id", + ProjectId: "project_id", + InspectionType: "Inspection_type", + InspectionResult: "Inspection_result", + Corrector: "corrector", + IsReply: "is_reply", + ReplyDate: "reply_date", + Status: "status", + Feedback: "feedback", + VerificationResult: "verification_result", + CreatedBy: "created_by", + UpdatedBy: "updated_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusInspectionTicketDao creates and returns a new DAO object for table data access. +func NewBusInspectionTicketDao() *BusInspectionTicketDao { + return &BusInspectionTicketDao{ + group: "default", + table: "bus_inspection_ticket", + columns: busInspectionTicketColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusInspectionTicketDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusInspectionTicketDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusInspectionTicketDao) Columns() BusInspectionTicketColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusInspectionTicketDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusInspectionTicketDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusInspectionTicketDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_machinery.go b/internal/app/system/dao/internal/bus_machinery.go new file mode 100644 index 0000000..85a2cf6 --- /dev/null +++ b/internal/app/system/dao/internal/bus_machinery.go @@ -0,0 +1,100 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-07-29 14:02:01 +// 生成路径: internal/app/system/dao/internal/bus_machinery.go +// 生成人:gfast +// desc:机械 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusMachineryDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusMachineryDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusMachineryColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusMachineryColumns defines and stores column names for table bus_machinery. +type BusMachineryColumns struct { + Id string // 序号 + MachineryName string // 机械名称 + MachineryNumber string // 编号 + ProjectId string // 项目id + CheckoutNumber string // 检验证编号 + CheckoutUnit string // 检验单位 + CheckoutDate string // 检定日期/有效期 + Status string // 施工类型状态 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busMachineryColumns = BusMachineryColumns{ + Id: "id", + MachineryName: "machinery_name", + MachineryNumber: "machinery_number", + ProjectId: "project_id", + CheckoutNumber: "checkout_number", + CheckoutUnit: "checkout_unit", + CheckoutDate: "checkout_date", + Status: "status", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusMachineryDao creates and returns a new DAO object for table data access. +func NewBusMachineryDao() *BusMachineryDao { + return &BusMachineryDao{ + group: "default", + table: "bus_machinery", + columns: busMachineryColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusMachineryDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusMachineryDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusMachineryDao) Columns() BusMachineryColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusMachineryDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusMachineryDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusMachineryDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_machinery_detail.go b/internal/app/system/dao/internal/bus_machinery_detail.go new file mode 100644 index 0000000..4df803b --- /dev/null +++ b/internal/app/system/dao/internal/bus_machinery_detail.go @@ -0,0 +1,102 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-10-12 11:41:31 +// 生成路径: internal/app/system/dao/internal/bus_machinery_detail.go +// 生成人:gfast +// desc:机械详情 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusMachineryDetailDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusMachineryDetailDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusMachineryDetailColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusMachineryDetailColumns defines and stores column names for table bus_machinery_detail. +type BusMachineryDetailColumns struct { + Id string // 序号 + MachineryId string // 检验证编号 + CheckoutNumber string // 检验证编号 + CheckoutUnit string // 检验单位 + CheckoutDate string // 检定日期/有效期 + Status string // 施工类型状态 + EntryTime string // 入场时间 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + Remark string // 备注 + Picture string // 4张图片,逗号分隔 +} + +var busMachineryDetailColumns = BusMachineryDetailColumns{ + Id: "id", + MachineryId: "machinery_Id", + CheckoutNumber: "checkout_number", + CheckoutUnit: "checkout_unit", + CheckoutDate: "checkout_date", + Status: "status", + EntryTime: "entry_time", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + Remark: "remark", + Picture: "picture", +} + +// NewBusMachineryDetailDao creates and returns a new DAO object for table data access. +func NewBusMachineryDetailDao() *BusMachineryDetailDao { + return &BusMachineryDetailDao{ + group: "default", + table: "bus_machinery_detail", + columns: busMachineryDetailColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusMachineryDetailDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusMachineryDetailDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusMachineryDetailDao) Columns() BusMachineryDetailColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusMachineryDetailDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusMachineryDetailDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusMachineryDetailDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_machinery_detail_file.go b/internal/app/system/dao/internal/bus_machinery_detail_file.go new file mode 100644 index 0000000..659433f --- /dev/null +++ b/internal/app/system/dao/internal/bus_machinery_detail_file.go @@ -0,0 +1,85 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusMachineryDetailFileDao is the data access object for table bus_machinery_detail_file. +type BusMachineryDetailFileDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns BusMachineryDetailFileColumns // columns contains all the column names of Table for convenient usage. +} + +// BusMachineryDetailFileColumns defines and stores column names for table bus_machinery_detail_file. +type BusMachineryDetailFileColumns struct { + Id string // 主键 + MachineryDetailId string // 机械设备详情id + Name string // 文件名字 + Path string // 文件路径 + Type string // 文件类型 + Size string // 文件大小 + SourceType string // 文件来源类型(1合格校验单 2租赁校验单) +} + +// busMachineryDetailFileColumns holds the columns for table bus_machinery_detail_file. +var busMachineryDetailFileColumns = BusMachineryDetailFileColumns{ + Id: "id", + MachineryDetailId: "machinery_detail_id", + Name: "name", + Path: "path", + Type: "type", + Size: "size", + SourceType: "source_type", +} + +// NewBusMachineryDetailFileDao creates and returns a new DAO object for table data access. +func NewBusMachineryDetailFileDao() *BusMachineryDetailFileDao { + return &BusMachineryDetailFileDao{ + group: "default", + table: "bus_machinery_detail_file", + columns: busMachineryDetailFileColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusMachineryDetailFileDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusMachineryDetailFileDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusMachineryDetailFileDao) Columns() BusMachineryDetailFileColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusMachineryDetailFileDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusMachineryDetailFileDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusMachineryDetailFileDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_machinery_record.go b/internal/app/system/dao/internal/bus_machinery_record.go new file mode 100644 index 0000000..a514ffb --- /dev/null +++ b/internal/app/system/dao/internal/bus_machinery_record.go @@ -0,0 +1,85 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusMachineryRecordDao is the data access object for table bus_machinery_record. +type BusMachineryRecordDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns BusMachineryRecordColumns // columns contains all the column names of Table for convenient usage. +} + +// BusMachineryRecordColumns defines and stores column names for table bus_machinery_record. +type BusMachineryRecordColumns struct { + Id string // id + MachineryDetailId string // 机械详情id + Status string // 施工类型状态(0正常 1停用) + Type string // 1出场 2入场 + RecordTime string // 记录出入场时间 + CreateBy string // 创建人 + CreatedAt string // 创建时间 +} + +// busMachineryRecordColumns holds the columns for table bus_machinery_record. +var busMachineryRecordColumns = BusMachineryRecordColumns{ + Id: "id", + MachineryDetailId: "machinery_detail_id", + Status: "status", + Type: "type", + RecordTime: "record_time", + CreateBy: "create_by", + CreatedAt: "created_at", +} + +// NewBusMachineryRecordDao creates and returns a new DAO object for table data access. +func NewBusMachineryRecordDao() *BusMachineryRecordDao { + return &BusMachineryRecordDao{ + group: "default", + table: "bus_machinery_record", + columns: busMachineryRecordColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusMachineryRecordDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusMachineryRecordDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusMachineryRecordDao) Columns() BusMachineryRecordColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusMachineryRecordDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusMachineryRecordDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusMachineryRecordDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_payroll_list.go b/internal/app/system/dao/internal/bus_payroll_list.go new file mode 100644 index 0000000..2509bad --- /dev/null +++ b/internal/app/system/dao/internal/bus_payroll_list.go @@ -0,0 +1,126 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-11-20 13:51:38 +// 生成路径: internal/app/system/dao/internal/bus_payroll_list.go +// 生成人:gfast +// desc:工资(excel导入形成的) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusPayrollListDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusPayrollListDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusPayrollListColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusPayrollListColumns defines and stores column names for table bus_payroll_list. +type BusPayrollListColumns struct { + Id string // + XNumber string // 编号 + Name string // 姓名 + IdentityCard string // 身份证号码 + ContactWay string // 联系方式 + TeamOrGroup string // 班组 + TypeOfWork string // 工种 + AttendanceTime string // 当月考勤工作时间 + ActualWorkload string // 当月产生实际工作量 + Quantity string // 元量 + XDay string // 元天 + XMonth string // 元月 + OvertimeWage string // 加班工资 + Salary string // 应发 + AmountWithheld string // 代扣金额 + AmountPaid string // 代缴金额 + DeductOther string // 扣除其他项目金额(如:预支) + AmountPaidOut string // 实发金额 + ReleaseMode string // 发放方式 + CreditCardNumbers string // 银行卡号 + OpeningBank string // 开户行(具体到分行) + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busPayrollListColumns = BusPayrollListColumns{ + Id: "id", + XNumber: "x_number", + Name: "name", + IdentityCard: "identity_card", + ContactWay: "contact_way", + TeamOrGroup: "team_or_group", + TypeOfWork: "type_of_work", + AttendanceTime: "attendance_time", + ActualWorkload: "actual_workload", + Quantity: "quantity", + XDay: "x_day", + XMonth: "x_month", + OvertimeWage: "overtime_wage", + Salary: "salary", + AmountWithheld: "amount_withheld", + AmountPaid: "amount_paid", + DeductOther: "deduct_other", + AmountPaidOut: "amount_paid_out", + ReleaseMode: "release_mode", + CreditCardNumbers: "credit_card_numbers", + OpeningBank: "opening_bank", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusPayrollListDao creates and returns a new DAO object for table data access. +func NewBusPayrollListDao() *BusPayrollListDao { + return &BusPayrollListDao{ + group: "default", + table: "bus_payroll_list", + columns: busPayrollListColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusPayrollListDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusPayrollListDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusPayrollListDao) Columns() BusPayrollListColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusPayrollListDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusPayrollListDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusPayrollListDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_presetting_bit.go b/internal/app/system/dao/internal/bus_presetting_bit.go new file mode 100644 index 0000000..3d631ab --- /dev/null +++ b/internal/app/system/dao/internal/bus_presetting_bit.go @@ -0,0 +1,98 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-10-19 15:17:27 +// 生成路径: internal/app/system/dao/internal/bus_presetting_bit.go +// 生成人:gfast +// desc:摄像头预置位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusPresettingBitDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusPresettingBitDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusPresettingBitColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusPresettingBitColumns defines and stores column names for table bus_presetting_bit. +type BusPresettingBitColumns struct { + Id string // 序号 + CameraId string // 摄像头ID + Serial string // 国标号 + Code string // 通道号 + Command string // 指令 + Preset string // 预置位编号 + Name string // 预置位名称 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busPresettingBitColumns = BusPresettingBitColumns{ + Id: "id", + CameraId: "camera_id", + Serial: "serial", + Code: "code", + Command: "command", + Preset: "preset", + Name: "name", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusPresettingBitDao creates and returns a new DAO object for table data access. +func NewBusPresettingBitDao() *BusPresettingBitDao { + return &BusPresettingBitDao{ + group: "default", + table: "bus_presetting_bit", + columns: busPresettingBitColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusPresettingBitDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusPresettingBitDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusPresettingBitDao) Columns() BusPresettingBitColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusPresettingBitDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusPresettingBitDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusPresettingBitDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_projectin_progress.go b/internal/app/system/dao/internal/bus_projectin_progress.go new file mode 100644 index 0000000..a0f95d6 --- /dev/null +++ b/internal/app/system/dao/internal/bus_projectin_progress.go @@ -0,0 +1,82 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-03-20 19:45:19 +// 生成路径: internal/app/system/dao/internal/bus_projectin_progress.go +// 生成人:gfast +// desc:在建项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusProjectinProgressDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusProjectinProgressDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusProjectinProgressColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusProjectinProgressColumns defines and stores column names for table bus_projectin_progress. +type BusProjectinProgressColumns struct { + Id string // 主键ID + ProjectId string // 项目ID + ParallelIn string // 并网容量 + CreatedBy string // 创建时间 +} + +var busProjectinProgressColumns = BusProjectinProgressColumns{ + Id: "id", + ProjectId: "project_id", + ParallelIn: "parallel_in", + CreatedBy: "created_by", +} + +// NewBusProjectinProgressDao creates and returns a new DAO object for table data access. +func NewBusProjectinProgressDao() *BusProjectinProgressDao { + return &BusProjectinProgressDao{ + group: "default", + table: "bus_projectin_progress", + columns: busProjectinProgressColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusProjectinProgressDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusProjectinProgressDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusProjectinProgressDao) Columns() BusProjectinProgressColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusProjectinProgressDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusProjectinProgressDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusProjectinProgressDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_quality.go b/internal/app/system/dao/internal/bus_quality.go new file mode 100644 index 0000000..a326bd4 --- /dev/null +++ b/internal/app/system/dao/internal/bus_quality.go @@ -0,0 +1,98 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-02 17:11:39 +// 生成路径: internal/app/system/dao/internal/bus_quality.go +// 生成人:gfast +// desc:质量文档管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusQualityDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusQualityDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusQualityColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusQualityColumns defines and stores column names for table bus_quality. +type BusQualityColumns struct { + Id string // 序号 + QualityName string // 质量检查名称 + QualityExplain string // 质量说明 + QualityDocument string // 质量检查文件 + QualityType string // 质量类型 + ProjectId string // 项目id + Status string // 帐号状态 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busQualityColumns = BusQualityColumns{ + Id: "id", + QualityName: "quality_name", + QualityExplain: "quality_explain", + QualityDocument: "quality_document", + QualityType: "quality_type", + ProjectId: "project_id", + Status: "status", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusQualityDao creates and returns a new DAO object for table data access. +func NewBusQualityDao() *BusQualityDao { + return &BusQualityDao{ + group: "default", + table: "bus_quality", + columns: busQualityColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusQualityDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusQualityDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusQualityDao) Columns() BusQualityColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusQualityDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusQualityDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusQualityDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_question_bank.go b/internal/app/system/dao/internal/bus_question_bank.go new file mode 100644 index 0000000..898a541 --- /dev/null +++ b/internal/app/system/dao/internal/bus_question_bank.go @@ -0,0 +1,100 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-10-07 15:52:18 +// 生成路径: internal/app/system/dao/internal/bus_question_bank.go +// 生成人:gfast +// desc:题库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusQuestionBankDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusQuestionBankDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusQuestionBankColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusQuestionBankColumns defines and stores column names for table bus_question_bank. +type BusQuestionBankColumns struct { + Id string // 序号 + CategoryId string // 题目类别 + QuestionType string // 题目类型(1单选、2多选、3判断、4填空、5问答) + QuestionText string // 题目内容 + Options string // 选项(对单选、多选、判断这种固定答案有效,以JSON数组形式存储) + CorrectAnswer string // 正确答案 + Score string // 得分 + WxOrPc string // 创建人类型(1pc、2小程序) + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busQuestionBankColumns = BusQuestionBankColumns{ + Id: "id", + CategoryId: "category_id", + QuestionType: "question_type", + QuestionText: "question_text", + Options: "options", + CorrectAnswer: "correct_answer", + Score: "score", + WxOrPc: "wx_or_pc", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusQuestionBankDao creates and returns a new DAO object for table data access. +func NewBusQuestionBankDao() *BusQuestionBankDao { + return &BusQuestionBankDao{ + group: "default", + table: "bus_question_bank", + columns: busQuestionBankColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusQuestionBankDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusQuestionBankDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusQuestionBankDao) Columns() BusQuestionBankColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusQuestionBankDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusQuestionBankDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusQuestionBankDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_question_save.go b/internal/app/system/dao/internal/bus_question_save.go new file mode 100644 index 0000000..315a216 --- /dev/null +++ b/internal/app/system/dao/internal/bus_question_save.go @@ -0,0 +1,100 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-11-01 17:33:04 +// 生成路径: internal/app/system/dao/internal/bus_question_save.go +// 生成人:gfast +// desc:用户试卷存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusQuestionSaveDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusQuestionSaveDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusQuestionSaveColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusQuestionSaveColumns defines and stores column names for table bus_question_save. +type BusQuestionSaveColumns struct { + Id string // 主键ID + Openid string // openid + BankId string // 题库ID + Answer string // 答案 + Correct string // 答题是否正确(1正确 2错误) + Score string // 得分(当前题) + Sign string // 签名路径 + TakeTime string // 用时时间(时间戳/秒) + TimeOut string // 最大超时时间(单位/分钟) + Pass string // 及格线/总分(格式:60,100) + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busQuestionSaveColumns = BusQuestionSaveColumns{ + Id: "id", + Openid: "openid", + BankId: "bank_id", + Answer: "answer", + Correct: "correct", + Score: "score", + Sign: "sign", + TakeTime: "take_time", + TimeOut: "time_out", + Pass: "pass", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusQuestionSaveDao creates and returns a new DAO object for table data access. +func NewBusQuestionSaveDao() *BusQuestionSaveDao { + return &BusQuestionSaveDao{ + group: "default", + table: "bus_question_save", + columns: busQuestionSaveColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusQuestionSaveDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusQuestionSaveDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusQuestionSaveDao) Columns() BusQuestionSaveColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusQuestionSaveDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusQuestionSaveDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusQuestionSaveDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_questions_configuration.go b/internal/app/system/dao/internal/bus_questions_configuration.go new file mode 100644 index 0000000..8368553 --- /dev/null +++ b/internal/app/system/dao/internal/bus_questions_configuration.go @@ -0,0 +1,92 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-10-07 17:11:20 +// 生成路径: internal/app/system/dao/internal/bus_questions_configuration.go +// 生成人:gfast +// desc:题库配置 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusQuestionsConfigurationDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusQuestionsConfigurationDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusQuestionsConfigurationColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusQuestionsConfigurationColumns defines and stores column names for table bus_questions_configuration. +type BusQuestionsConfigurationColumns struct { + Id string // 主键ID + SingleChoice string // 单选题(单位/道) + SingleScore string // 单选分数 + MultipleChoice string // 多选题(单位/道) + MultipleScore string // 多选分数 + Estimate string // 判断题(单位/道) + EstimateScore string // 判断分数 + FullMark string // 满分 + PassingScore string // 及格线 +} + +var busQuestionsConfigurationColumns = BusQuestionsConfigurationColumns{ + Id: "id", + SingleChoice: "single_choice", + SingleScore: "single_score", + MultipleChoice: "multiple_choice", + MultipleScore: "multiple_score", + Estimate: "estimate", + EstimateScore: "estimate_score", + FullMark: "full_mark", + PassingScore: "passing_score", +} + +// NewBusQuestionsConfigurationDao creates and returns a new DAO object for table data access. +func NewBusQuestionsConfigurationDao() *BusQuestionsConfigurationDao { + return &BusQuestionsConfigurationDao{ + group: "default", + table: "bus_questions_configuration", + columns: busQuestionsConfigurationColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusQuestionsConfigurationDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusQuestionsConfigurationDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusQuestionsConfigurationDao) Columns() BusQuestionsConfigurationColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusQuestionsConfigurationDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusQuestionsConfigurationDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusQuestionsConfigurationDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_reissue_a_card.go b/internal/app/system/dao/internal/bus_reissue_a_card.go new file mode 100644 index 0000000..c8574a0 --- /dev/null +++ b/internal/app/system/dao/internal/bus_reissue_a_card.go @@ -0,0 +1,100 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-02-02 15:18:48 +// 生成路径: internal/app/system/dao/internal/bus_reissue_a_card.go +// 生成人:gfast +// desc:施工人员补卡申请 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusReissueACardDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusReissueACardDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusReissueACardColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusReissueACardColumns defines and stores column names for table bus_reissue_a_card. +type BusReissueACardColumns struct { + Id string // 主键ID + Openid string // 申请人 + Scope string // 申请补卡范围 + Explain string // 申请补卡说明 + Ganger string // 班组长 + GangerOpinion string // 班组长意见(1未读 2同意 3拒绝) + GangerExplain string // 班组长说明 + GangerTime string // 班组长操作时间 + ManagerOpinion string // 管理员意见(1未读 2同意 3拒绝) + ManagerExplain string // 管理员说明 + UpdateBy string // 后台操作人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 +} + +var busReissueACardColumns = BusReissueACardColumns{ + Id: "id", + Openid: "openid", + Scope: "scope", + Explain: "explain", + Ganger: "ganger", + GangerOpinion: "ganger_opinion", + GangerExplain: "ganger_explain", + GangerTime: "ganger_time", + ManagerOpinion: "manager_opinion", + ManagerExplain: "manager_explain", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", +} + +// NewBusReissueACardDao creates and returns a new DAO object for table data access. +func NewBusReissueACardDao() *BusReissueACardDao { + return &BusReissueACardDao{ + group: "default", + table: "bus_reissue_a_card", + columns: busReissueACardColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusReissueACardDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusReissueACardDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusReissueACardDao) Columns() BusReissueACardColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusReissueACardDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusReissueACardDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusReissueACardDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_research_document.go b/internal/app/system/dao/internal/bus_research_document.go new file mode 100644 index 0000000..b07e9c2 --- /dev/null +++ b/internal/app/system/dao/internal/bus_research_document.go @@ -0,0 +1,98 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-07-29 16:04:06 +// 生成路径: internal/app/system/dao/internal/bus_research_document.go +// 生成人:gfast +// desc:科研文档 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusResearchDocumentDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusResearchDocumentDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusResearchDocumentColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusResearchDocumentColumns defines and stores column names for table bus_research_document. +type BusResearchDocumentColumns struct { + Id string // 序号 + DocumenName string // 文档名称 + Remark string // 备注 + DocumentUrl string // 文件路径 + FileId string // 文件夹id + ProjectId string // 项目id + Status string // 状态 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 上传时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busResearchDocumentColumns = BusResearchDocumentColumns{ + Id: "id", + DocumenName: "documen_name", + Remark: "remark", + DocumentUrl: "document_url", + FileId: "file_id", + ProjectId: "project_id", + Status: "status", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusResearchDocumentDao creates and returns a new DAO object for table data access. +func NewBusResearchDocumentDao() *BusResearchDocumentDao { + return &BusResearchDocumentDao{ + group: "default", + table: "bus_research_document", + columns: busResearchDocumentColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusResearchDocumentDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusResearchDocumentDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusResearchDocumentDao) Columns() BusResearchDocumentColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusResearchDocumentDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusResearchDocumentDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusResearchDocumentDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_safety.go b/internal/app/system/dao/internal/bus_safety.go new file mode 100644 index 0000000..53c5feb --- /dev/null +++ b/internal/app/system/dao/internal/bus_safety.go @@ -0,0 +1,98 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-02 15:40:48 +// 生成路径: internal/app/system/dao/internal/bus_safety.go +// 生成人:gfast +// desc:安全例会管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusSafetyDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusSafetyDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusSafetyColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusSafetyColumns defines and stores column names for table bus_safety. +type BusSafetyColumns struct { + Id string // 序号 + SafetyName string // 安全检查名称 + SafetyExplain string // 安全说明 + SafetyDocument string // 安全检查文件 + SafetyType string // 安全类型 + ProjectId string // 项目id + Status string // 帐号状态 + CreateBy string // 创建者 + UpdateAt string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busSafetyColumns = BusSafetyColumns{ + Id: "id", + SafetyName: "safety_name", + SafetyExplain: "safety_explain", + SafetyDocument: "safety_document", + SafetyType: "safety_type", + ProjectId: "project_id", + Status: "status", + CreateBy: "create_by", + UpdateAt: "update_at", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusSafetyDao creates and returns a new DAO object for table data access. +func NewBusSafetyDao() *BusSafetyDao { + return &BusSafetyDao{ + group: "default", + table: "bus_safety", + columns: busSafetyColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusSafetyDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusSafetyDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusSafetyDao) Columns() BusSafetyColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusSafetyDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusSafetyDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusSafetyDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_salary_details.go b/internal/app/system/dao/internal/bus_salary_details.go new file mode 100644 index 0000000..2bb8e6f --- /dev/null +++ b/internal/app/system/dao/internal/bus_salary_details.go @@ -0,0 +1,104 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-02-01 16:39:01 +// 生成路径: internal/app/system/dao/internal/bus_salary_details.go +// 生成人:gfast +// desc:员工工资考核记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusSalaryDetailsDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusSalaryDetailsDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusSalaryDetailsColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusSalaryDetailsColumns defines and stores column names for table bus_salary_details. +type BusSalaryDetailsColumns struct { + Id string // 主键ID + SfzNumber string // 身份证 + Name string // 户名 + Account string // 账户 + SumDuration string // 当月总时长 + Salary string // 薪水(天) + ProjectId string // 项目id + TeamId string // 班组id + ProjectName string // 项目名称 + TeamName string // 班组名称 + DateOfIssue string // 发放年月 + Lister string // 制表人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busSalaryDetailsColumns = BusSalaryDetailsColumns{ + Id: "id", + SfzNumber: "sfz_number", + Name: "name", + Account: "account", + SumDuration: "sum_duration", + Salary: "salary", + ProjectId: "project_id", + TeamId: "team_id", + ProjectName: "project_name", + TeamName: "team_name", + DateOfIssue: "date_of_issue", + Lister: "lister", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusSalaryDetailsDao creates and returns a new DAO object for table data access. +func NewBusSalaryDetailsDao() *BusSalaryDetailsDao { + return &BusSalaryDetailsDao{ + group: "default", + table: "bus_salary_details", + columns: busSalaryDetailsColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusSalaryDetailsDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusSalaryDetailsDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusSalaryDetailsDao) Columns() BusSalaryDetailsColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusSalaryDetailsDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusSalaryDetailsDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusSalaryDetailsDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_scheduled_plan_type.go b/internal/app/system/dao/internal/bus_scheduled_plan_type.go new file mode 100644 index 0000000..140ffdf --- /dev/null +++ b/internal/app/system/dao/internal/bus_scheduled_plan_type.go @@ -0,0 +1,106 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-07-29 17:39:12 +// 生成路径: internal/app/system/dao/internal/bus_scheduled_plan_type.go +// 生成人:gfast +// desc:施工进度分类 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusScheduledPlanTypeDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusScheduledPlanTypeDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusScheduledPlanTypeColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusScheduledPlanTypeColumns defines and stores column names for table bus_scheduled_plan_type. +type BusScheduledPlanTypeColumns struct { + PlanTypeId string // 施工类型id + ParentId string // 父文件id + Ancestors string // 祖级列表 + PlanTypeName string // 施工类型名称 + PlannedTime string // 计划施工持续时间 + PlanStartTime string // 计划工期开始时间 + PlanEndTime string // 计划工期结束时间 + OrderNum string // 显示顺序 + ProjectId string // 项目id + Leader string // 负责人 + Status string // 施工类型状态 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busScheduledPlanTypeColumns = BusScheduledPlanTypeColumns{ + PlanTypeId: "plan_type_id", + ParentId: "parent_id", + Ancestors: "ancestors", + PlanTypeName: "plan_type_name", + PlannedTime: "planned_time", + PlanStartTime: "plan_start_time", + PlanEndTime: "plan_end_time", + OrderNum: "order_num", + ProjectId: "project_id", + Leader: "leader", + Status: "status", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusScheduledPlanTypeDao creates and returns a new DAO object for table data access. +func NewBusScheduledPlanTypeDao() *BusScheduledPlanTypeDao { + return &BusScheduledPlanTypeDao{ + group: "default", + table: "bus_scheduled_plan_type", + columns: busScheduledPlanTypeColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusScheduledPlanTypeDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusScheduledPlanTypeDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusScheduledPlanTypeDao) Columns() BusScheduledPlanTypeColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusScheduledPlanTypeDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusScheduledPlanTypeDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusScheduledPlanTypeDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_scheduled_plan_type_detail.go b/internal/app/system/dao/internal/bus_scheduled_plan_type_detail.go new file mode 100644 index 0000000..0b2a756 --- /dev/null +++ b/internal/app/system/dao/internal/bus_scheduled_plan_type_detail.go @@ -0,0 +1,110 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-07-29 17:15:27 +// 生成路径: internal/app/system/dao/internal/bus_scheduled_plan_type_detail.go +// 生成人:gfast +// desc:施工进度月报,年报分类 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusScheduledPlanTypeDetailDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusScheduledPlanTypeDetailDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusScheduledPlanTypeDetailColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusScheduledPlanTypeDetailColumns defines and stores column names for table bus_scheduled_plan_type_detail. +type BusScheduledPlanTypeDetailColumns struct { + PlanTypeDetailId string // 施工类型id + ParentId string // 父文件id + Ancestors string // 祖级列表 + PlanTypeName string // 施工类型名称 + PlannedTime string // 计划施工持续时间 + PlanStartTime string // 计划工期开始时间 + PlanEndTime string // 计划工期结束时间 + OrderNum string // 显示顺序 + DateValue string // 时间 + DateType string // 日期类型状态 + ProjectId string // 项目id + Leader string // 负责人 + Status string // 施工类型状态 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busScheduledPlanTypeDetailColumns = BusScheduledPlanTypeDetailColumns{ + PlanTypeDetailId: "plan_type_detail_id", + ParentId: "parent_id", + Ancestors: "ancestors", + PlanTypeName: "plan_type_name", + PlannedTime: "planned_time", + PlanStartTime: "plan_start_time", + PlanEndTime: "plan_end_time", + OrderNum: "order_num", + DateValue: "date_value", + DateType: "date_type", + ProjectId: "project_id", + Leader: "leader", + Status: "status", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusScheduledPlanTypeDetailDao creates and returns a new DAO object for table data access. +func NewBusScheduledPlanTypeDetailDao() *BusScheduledPlanTypeDetailDao { + return &BusScheduledPlanTypeDetailDao{ + group: "default", + table: "bus_scheduled_plan_type_detail", + columns: busScheduledPlanTypeDetailColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusScheduledPlanTypeDetailDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusScheduledPlanTypeDetailDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusScheduledPlanTypeDetailDao) Columns() BusScheduledPlanTypeDetailColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusScheduledPlanTypeDetailDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusScheduledPlanTypeDetailDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusScheduledPlanTypeDetailDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_scheduled_weekly.go b/internal/app/system/dao/internal/bus_scheduled_weekly.go new file mode 100644 index 0000000..9da5064 --- /dev/null +++ b/internal/app/system/dao/internal/bus_scheduled_weekly.go @@ -0,0 +1,110 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-02 15:28:49 +// 生成路径: internal/app/system/dao/internal/bus_scheduled_weekly.go +// 生成人:gfast +// desc:周报 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusScheduledWeeklyDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusScheduledWeeklyDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusScheduledWeeklyColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusScheduledWeeklyColumns defines and stores column names for table bus_scheduled_weekly. +type BusScheduledWeeklyColumns struct { + PlanWeeklyId string // 施工周报id + PlanPeriodId string // 施工分类id + WeeklyPlanName string // 施工分类下第几周 + WeeklyStartTime string // 周开始时间 + WeeklyEndTime string // 周完成时间 + WeeklyPlanFinish string // 周计划完成量 + WeeklyRealityFinish string // 周实际完成量 + WeekyAccumulativeFinish string // 累计完成量 + WeekyAccumulativeTotal string // 总量 + CompletionRate string // 累计完成比例 + Leader string // 负责人 + Status string // 施工类型状态 + WeeklyDocumentUrl string // 施工周报文档地址 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busScheduledWeeklyColumns = BusScheduledWeeklyColumns{ + PlanWeeklyId: "plan_weekly_id", + PlanPeriodId: "plan_period_id", + WeeklyPlanName: "weekly_plan_name", + WeeklyStartTime: "weekly_start_time", + WeeklyEndTime: "weekly_end_time", + WeeklyPlanFinish: "weekly_plan_finish", + WeeklyRealityFinish: "weekly_reality_finish", + WeekyAccumulativeFinish: "weeky_accumulative_finish", + WeekyAccumulativeTotal: "weeky_accumulative_total", + CompletionRate: "completion_rate", + Leader: "leader", + Status: "status", + WeeklyDocumentUrl: "weekly_document_url", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusScheduledWeeklyDao creates and returns a new DAO object for table data access. +func NewBusScheduledWeeklyDao() *BusScheduledWeeklyDao { + return &BusScheduledWeeklyDao{ + group: "default", + table: "bus_scheduled_weekly", + columns: busScheduledWeeklyColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusScheduledWeeklyDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusScheduledWeeklyDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusScheduledWeeklyDao) Columns() BusScheduledWeeklyColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusScheduledWeeklyDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusScheduledWeeklyDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusScheduledWeeklyDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_scheduled_weekly_photovoltaic.go b/internal/app/system/dao/internal/bus_scheduled_weekly_photovoltaic.go new file mode 100644 index 0000000..b2e1839 --- /dev/null +++ b/internal/app/system/dao/internal/bus_scheduled_weekly_photovoltaic.go @@ -0,0 +1,100 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-02 15:21:55 +// 生成路径: internal/app/system/dao/internal/bus_scheduled_weekly_photovoltaic.go +// 生成人:gfast +// desc:周报-光伏板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusScheduledWeeklyPhotovoltaicDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusScheduledWeeklyPhotovoltaicDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusScheduledWeeklyPhotovoltaicColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusScheduledWeeklyPhotovoltaicColumns defines and stores column names for table bus_scheduled_weekly_photovoltaic. +type BusScheduledWeeklyPhotovoltaicColumns struct { + PhotovoltaicId string // 序号 + PlanWeeklyId string // 周报id + PhotovoltaicNumber string // 光伏板编号 + PhotovoltaicNumberGis string // gis地图中使用的真实的光伏板id + InstallNot string // 是否安装 + InstallCreateTime string // 安装时间 + Status string // 光伏板状态 + ProjectId string // '项目id' + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busScheduledWeeklyPhotovoltaicColumns = BusScheduledWeeklyPhotovoltaicColumns{ + PhotovoltaicId: "photovoltaic_id", + PlanWeeklyId: "plan_weekly_id", + PhotovoltaicNumber: "photovoltaic_number", + PhotovoltaicNumberGis: "photovoltaic_number_gis", + InstallNot: "install_not", + InstallCreateTime: "install_createTime", + Status: "status", + ProjectId: "project_id", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusScheduledWeeklyPhotovoltaicDao creates and returns a new DAO object for table data access. +func NewBusScheduledWeeklyPhotovoltaicDao() *BusScheduledWeeklyPhotovoltaicDao { + return &BusScheduledWeeklyPhotovoltaicDao{ + group: "default", + table: "bus_scheduled_weekly_photovoltaic", + columns: busScheduledWeeklyPhotovoltaicColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusScheduledWeeklyPhotovoltaicDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusScheduledWeeklyPhotovoltaicDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusScheduledWeeklyPhotovoltaicDao) Columns() BusScheduledWeeklyPhotovoltaicColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusScheduledWeeklyPhotovoltaicDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusScheduledWeeklyPhotovoltaicDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusScheduledWeeklyPhotovoltaicDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_standing_book.go b/internal/app/system/dao/internal/bus_standing_book.go new file mode 100644 index 0000000..789fdf5 --- /dev/null +++ b/internal/app/system/dao/internal/bus_standing_book.go @@ -0,0 +1,110 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-07-29 11:36:04 +// 生成路径: internal/app/system/dao/internal/bus_standing_book.go +// 生成人:gfast +// desc:台账 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusStandingBookDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusStandingBookDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusStandingBookColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusStandingBookColumns defines and stores column names for table bus_standing_book. +type BusStandingBookColumns struct { + StandingBookId string // 序号 + EquipmentMaterialsId string // 材料/设备 + ProjectId string // 项目id + StandingBookType string // 台账类型 + ApproachTime string // 进场时间 + ClaimingDate string // 领用时间 + Quantity string // 数量 + Gross string // 总量 + Status string // 状态 + SignerRecipient string // 签收领用人 + RecipientUnit string // 使用单位 + StoreIssue string // 发料人 + ProcessMode string // 处理方式 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busStandingBookColumns = BusStandingBookColumns{ + StandingBookId: "standing_book_id", + EquipmentMaterialsId: "equipment_materials_id", + ProjectId: "project_id", + StandingBookType: "standing_book_type", + ApproachTime: "approach_time", + ClaimingDate: "claiming_date", + Quantity: "quantity", + Gross: "gross", + Status: "status", + SignerRecipient: "signer_recipient", + RecipientUnit: "recipient_unit", + StoreIssue: "store_issue", + ProcessMode: "process_mode", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusStandingBookDao creates and returns a new DAO object for table data access. +func NewBusStandingBookDao() *BusStandingBookDao { + return &BusStandingBookDao{ + group: "default", + table: "bus_standing_book", + columns: busStandingBookColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusStandingBookDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusStandingBookDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusStandingBookDao) Columns() BusStandingBookColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusStandingBookDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusStandingBookDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusStandingBookDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_tour.go b/internal/app/system/dao/internal/bus_tour.go new file mode 100644 index 0000000..3d14d1f --- /dev/null +++ b/internal/app/system/dao/internal/bus_tour.go @@ -0,0 +1,92 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-10-10 12:11:05 +// 生成路径: internal/app/system/dao/internal/bus_tour.go +// 生成人:gfast +// desc:煤科巡视-故障记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusTourDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusTourDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusTourColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusTourColumns defines and stores column names for table bus_tour. +type BusTourColumns struct { + Id string // 序号 + ProjectId string // 序号 + TourCategory string // 类别字典 + TourType string // 类型字典 + Picture string // 图片路径 + Describe string // 故障描述 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busTourColumns = BusTourColumns{ + Id: "id", + ProjectId: "project_id", + TourCategory: "tour_category", + TourType: "tour_type", + Picture: "picture", + Describe: "describe", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusTourDao creates and returns a new DAO object for table data access. +func NewBusTourDao() *BusTourDao { + return &BusTourDao{ + group: "default", + table: "bus_tour", + columns: busTourColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusTourDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusTourDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusTourDao) Columns() BusTourColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusTourDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusTourDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusTourDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_type_of_wage.go b/internal/app/system/dao/internal/bus_type_of_wage.go new file mode 100644 index 0000000..234de4f --- /dev/null +++ b/internal/app/system/dao/internal/bus_type_of_wage.go @@ -0,0 +1,90 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-09-05 10:07:11 +// 生成路径: internal/app/system/dao/internal/bus_type_of_wage.go +// 生成人:gfast +// desc:工种薪水 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusTypeOfWageDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusTypeOfWageDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusTypeOfWageColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusTypeOfWageColumns defines and stores column names for table bus_type_of_wage. +type BusTypeOfWageColumns struct { + Id string // 主键ID + TypeOfWork string // 工种字典 + Standard string // 工资标准 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busTypeOfWageColumns = BusTypeOfWageColumns{ + Id: "id", + TypeOfWork: "type_of_work", + Standard: "standard", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusTypeOfWageDao creates and returns a new DAO object for table data access. +func NewBusTypeOfWageDao() *BusTypeOfWageDao { + return &BusTypeOfWageDao{ + group: "default", + table: "bus_type_of_wage", + columns: busTypeOfWageColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusTypeOfWageDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusTypeOfWageDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusTypeOfWageDao) Columns() BusTypeOfWageColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusTypeOfWageDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusTypeOfWageDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusTypeOfWageDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_violation_level.go b/internal/app/system/dao/internal/bus_violation_level.go new file mode 100644 index 0000000..6c4f642 --- /dev/null +++ b/internal/app/system/dao/internal/bus_violation_level.go @@ -0,0 +1,94 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-11-20 11:18:36 +// 生成路径: internal/app/system/dao/internal/bus_violation_level.go +// 生成人:gfast +// desc:违章等级 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusViolationLevelDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusViolationLevelDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusViolationLevelColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusViolationLevelColumns defines and stores column names for table bus_violation_level. +type BusViolationLevelColumns struct { + Id string // 主键ID + Grade string // 违章等级 + Color string // 颜色 + TourType string // 违章类型 + WxOrPc string // 来源:1pc 2小程序 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busViolationLevelColumns = BusViolationLevelColumns{ + Id: "id", + Grade: "grade", + Color: "color", + TourType: "tour_type", + WxOrPc: "wx_or_pc", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusViolationLevelDao creates and returns a new DAO object for table data access. +func NewBusViolationLevelDao() *BusViolationLevelDao { + return &BusViolationLevelDao{ + group: "default", + table: "bus_violation_level", + columns: busViolationLevelColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusViolationLevelDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusViolationLevelDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusViolationLevelDao) Columns() BusViolationLevelColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusViolationLevelDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusViolationLevelDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusViolationLevelDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_violation_record.go b/internal/app/system/dao/internal/bus_violation_record.go new file mode 100644 index 0000000..a5ccfbb --- /dev/null +++ b/internal/app/system/dao/internal/bus_violation_record.go @@ -0,0 +1,98 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-11-20 11:18:37 +// 生成路径: internal/app/system/dao/internal/bus_violation_record.go +// 生成人:gfast +// desc:违章记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusViolationRecordDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusViolationRecordDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusViolationRecordColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusViolationRecordColumns defines and stores column names for table bus_violation_record. +type BusViolationRecordColumns struct { + Id string // 主键ID + Openid string // 处理人 + LevelId string // 违章等级主键ID + TourType string // 违章类型 + IsDispose string // 是否处理(1待处理 2已处理) + TourId string // 违章详情(关联bus_tour) + WxOrPc string // 来源:1pc 2小程序 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busViolationRecordColumns = BusViolationRecordColumns{ + Id: "id", + Openid: "openid", + LevelId: "level_id", + TourType: "tour_type", + IsDispose: "is_dispose", + TourId: "tour_id", + WxOrPc: "wx_or_pc", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusViolationRecordDao creates and returns a new DAO object for table data access. +func NewBusViolationRecordDao() *BusViolationRecordDao { + return &BusViolationRecordDao{ + group: "default", + table: "bus_violation_record", + columns: busViolationRecordColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusViolationRecordDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusViolationRecordDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusViolationRecordDao) Columns() BusViolationRecordColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusViolationRecordDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusViolationRecordDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusViolationRecordDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/bus_weekly_security_report.go b/internal/app/system/dao/internal/bus_weekly_security_report.go new file mode 100644 index 0000000..5bd83d3 --- /dev/null +++ b/internal/app/system/dao/internal/bus_weekly_security_report.go @@ -0,0 +1,96 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-04-02 18:03:23 +// 生成路径: internal/app/system/dao/internal/bus_weekly_security_report.go +// 生成人:gfast +// desc:安全周期 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusWeeklySecurityReportDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusWeeklySecurityReportDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusWeeklySecurityReportColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusWeeklySecurityReportColumns defines and stores column names for table bus_weekly_security_report. +type BusWeeklySecurityReportColumns struct { + Id string // 主键ID + ProjectId string // 项目ID + ProjectName string // 项目名称 + Scope string // 周期范围 + ScopeEnd string // 周期范围结束 + Path string // 文件位置 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var busWeeklySecurityReportColumns = BusWeeklySecurityReportColumns{ + Id: "id", + ProjectId: "project_id", + ProjectName: "project_name", + Scope: "scope", + ScopeEnd: "scope_end", + Path: "path", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewBusWeeklySecurityReportDao creates and returns a new DAO object for table data access. +func NewBusWeeklySecurityReportDao() *BusWeeklySecurityReportDao { + return &BusWeeklySecurityReportDao{ + group: "default", + table: "bus_weekly_security_report", + columns: busWeeklySecurityReportColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusWeeklySecurityReportDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusWeeklySecurityReportDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusWeeklySecurityReportDao) Columns() BusWeeklySecurityReportColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusWeeklySecurityReportDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusWeeklySecurityReportDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusWeeklySecurityReportDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/comment_list.go b/internal/app/system/dao/internal/comment_list.go new file mode 100644 index 0000000..837d703 --- /dev/null +++ b/internal/app/system/dao/internal/comment_list.go @@ -0,0 +1,85 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// CommentListDao is the data access object for table comment_list. +type CommentListDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns CommentListColumns // columns contains all the column names of Table for convenient usage. +} + +// CommentListColumns defines and stores column names for table comment_list. +type CommentListColumns struct { + Id string // + ProjectId string // 项目ID + Receiver string // 消息接收者 + Content string // 评论内容 + CreatedAt string // + Sender string // 消息的发起人 + IsRead string // 0 未读 | 1 已读 +} + +// commentListColumns holds the columns for table comment_list. +var commentListColumns = CommentListColumns{ + Id: "id", + ProjectId: "project_id", + Receiver: "receiver", + Content: "content", + CreatedAt: "created_at", + Sender: "sender", + IsRead: "is_read", +} + +// NewCommentListDao creates and returns a new DAO object for table data access. +func NewCommentListDao() *CommentListDao { + return &CommentListDao{ + group: "default", + table: "comment_list", + columns: commentListColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *CommentListDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *CommentListDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *CommentListDao) Columns() CommentListColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *CommentListDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *CommentListDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *CommentListDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/comments.go b/internal/app/system/dao/internal/comments.go new file mode 100644 index 0000000..899879a --- /dev/null +++ b/internal/app/system/dao/internal/comments.go @@ -0,0 +1,81 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// CommentsDao is the data access object for table comments. +type CommentsDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns CommentsColumns // columns contains all the column names of Table for convenient usage. +} + +// CommentsColumns defines and stores column names for table comments. +type CommentsColumns struct { + Id string // 评论的主键 + NotificationId string // 关联的通知ID + CommentText string // 评论内容 + CommentId string // 用户ID + CreatedAt string // +} + +// commentsColumns holds the columns for table comments. +var commentsColumns = CommentsColumns{ + Id: "id", + NotificationId: "notification_id", + CommentText: "comment_text", + CommentId: "comment_id", + CreatedAt: "created_at", +} + +// NewCommentsDao creates and returns a new DAO object for table data access. +func NewCommentsDao() *CommentsDao { + return &CommentsDao{ + group: "default", + table: "comments", + columns: commentsColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *CommentsDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *CommentsDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *CommentsDao) Columns() CommentsColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *CommentsDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *CommentsDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *CommentsDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/construction_details.go b/internal/app/system/dao/internal/construction_details.go new file mode 100644 index 0000000..e28a5cb --- /dev/null +++ b/internal/app/system/dao/internal/construction_details.go @@ -0,0 +1,108 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-03-13 18:10:56 +// 生成路径: internal/app/system/dao/internal/construction_details.go +// 生成人:gfast +// desc:施工类别详情 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// ConstructionDetailsDao is the manager for logic model data accessing and custom defined data operations functions management. +type ConstructionDetailsDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns ConstructionDetailsColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// ConstructionDetailsColumns defines and stores column names for table construction_details. +type ConstructionDetailsColumns struct { + Id string // + CreatedBy string // + UpdatedBy string // + CreatedAt string // + UpdatedAt string // + DeletedAt string // + Name string // 施工名称 + Types string // 施工类别 + Total string // 总量 + ConstructionId string // 施工id(父级id) + Remark string // 备注 + IsPercentage string // 数据类型是否为百分比 + StartTime string // 开始时间 + EndTime string // 结束时间 + Completed string // 完成量 + Selectable string // 可选择余量 + Overall string // 总余量 +} + +var constructionDetailsColumns = ConstructionDetailsColumns{ + Id: "id", + CreatedBy: "created_by", + UpdatedBy: "updated_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + Name: "name", + Types: "types", + Total: "total", + ConstructionId: "construction_id", + Remark: "remark", + IsPercentage: "isPercentage", + StartTime: "start_time", + EndTime: "end_time", + Completed: "completed", + Selectable: "selectable", + Overall: "overall", +} + +// NewConstructionDetailsDao creates and returns a new DAO object for table data access. +func NewConstructionDetailsDao() *ConstructionDetailsDao { + return &ConstructionDetailsDao{ + group: "default", + table: "construction_details", + columns: constructionDetailsColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *ConstructionDetailsDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *ConstructionDetailsDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *ConstructionDetailsDao) Columns() ConstructionDetailsColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *ConstructionDetailsDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *ConstructionDetailsDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *ConstructionDetailsDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/construction_project.go b/internal/app/system/dao/internal/construction_project.go new file mode 100644 index 0000000..3588a9f --- /dev/null +++ b/internal/app/system/dao/internal/construction_project.go @@ -0,0 +1,100 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-03-13 17:36:45 +// 生成路径: internal/app/system/dao/internal/construction_project.go +// 生成人:gfast +// desc:施工项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// ConstructionProjectDao is the manager for logic model data accessing and custom defined data operations functions management. +type ConstructionProjectDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns ConstructionProjectColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// ConstructionProjectColumns defines and stores column names for table construction_project. +type ConstructionProjectColumns struct { + ConstructionId string // 主键id + CreatedBy string // + UpdatedBy string // + CreatedAt string // + UpdatedAt string // + DeletedAt string // + FangzhenId string // 方阵id + ConstructionName string // 施工名称 + Total string // 总量 + Remark string // 备注 + IsPercentage string // 数据类型是否为百分比 + EndTime string // 结束时间 + StartTime string // 开始时间 +} + +var constructionProjectColumns = ConstructionProjectColumns{ + ConstructionId: "construction_id", + CreatedBy: "created_by", + UpdatedBy: "updated_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + FangzhenId: "fangzhen_id", + ConstructionName: "construction_name", + Total: "total", + Remark: "remark", + IsPercentage: "isPercentage", + EndTime: "end_time", + StartTime: "start_time", +} + +// NewConstructionProjectDao creates and returns a new DAO object for table data access. +func NewConstructionProjectDao() *ConstructionProjectDao { + return &ConstructionProjectDao{ + group: "default", + table: "construction_project", + columns: constructionProjectColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *ConstructionProjectDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *ConstructionProjectDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *ConstructionProjectDao) Columns() ConstructionProjectColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *ConstructionProjectDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *ConstructionProjectDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *ConstructionProjectDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/device.go b/internal/app/system/dao/internal/device.go new file mode 100644 index 0000000..80a7dff --- /dev/null +++ b/internal/app/system/dao/internal/device.go @@ -0,0 +1,86 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-11-24 09:57:07 +// 生成路径: internal/app/system/dao/internal/device.go +// 生成人:gfast +// desc:安全帽设备(java) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// DeviceDao is the manager for logic model data accessing and custom defined data operations functions management. +type DeviceDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns DeviceColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// DeviceColumns defines and stores column names for table device. +type DeviceColumns struct { + DevNum string // 设备编号 + DevName string // 设备名称 + Status string // 状态 + CreateTime string // 添加时间 + UpdateTime string // 修改时间 + ProjectId string // 项目id +} + +var deviceColumns = DeviceColumns{ + DevNum: "dev_num", + DevName: "dev_name", + Status: "status", + CreateTime: "create_time", + UpdateTime: "update_time", + ProjectId: "project_id", +} + +// NewDeviceDao creates and returns a new DAO object for table data access. +func NewDeviceDao() *DeviceDao { + return &DeviceDao{ + group: "default", + table: "device", + columns: deviceColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *DeviceDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *DeviceDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *DeviceDao) Columns() DeviceColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *DeviceDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *DeviceDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *DeviceDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/device_preset.go b/internal/app/system/dao/internal/device_preset.go new file mode 100644 index 0000000..08aaffe --- /dev/null +++ b/internal/app/system/dao/internal/device_preset.go @@ -0,0 +1,83 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// DevicePresetDao is the data access object for table device_preset. +type DevicePresetDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns DevicePresetColumns // columns contains all the column names of Table for convenient usage. +} + +// DevicePresetColumns defines and stores column names for table device_preset. +type DevicePresetColumns struct { + Id string // 主键ID + CreatedAt string // 创建时间 + DeviceSerial string // 设备序列号 + ChannelNo string // 通道号 + Index string // 预置点序号 + Name string // 预置点 +} + +// devicePresetColumns holds the columns for table device_preset. +var devicePresetColumns = DevicePresetColumns{ + Id: "id", + CreatedAt: "created_at", + DeviceSerial: "deviceSerial", + ChannelNo: "channelNo", + Index: "index", + Name: "name", +} + +// NewDevicePresetDao creates and returns a new DAO object for table data access. +func NewDevicePresetDao() *DevicePresetDao { + return &DevicePresetDao{ + group: "default", + table: "device_preset", + columns: devicePresetColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *DevicePresetDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *DevicePresetDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *DevicePresetDao) Columns() DevicePresetColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *DevicePresetDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *DevicePresetDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *DevicePresetDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/document.go b/internal/app/system/dao/internal/document.go new file mode 100644 index 0000000..4478f81 --- /dev/null +++ b/internal/app/system/dao/internal/document.go @@ -0,0 +1,94 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-09-16 10:32:04 +// 生成路径: internal/app/system/dao/internal/document.go +// 生成人:gfast +// desc:母板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// DocumentDao is the manager for logic model data accessing and custom defined data operations functions management. +type DocumentDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns DocumentColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// DocumentColumns defines and stores column names for table document. +type DocumentColumns struct { + Id string // 序号 + Pid string // 父级(0代表顶级) + Name string // 模板名称 + FilenPath string // 模板路径 + Type string // 类型(1文件-2文件夹) + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var documentColumns = DocumentColumns{ + Id: "id", + Pid: "pid", + Name: "name", + FilenPath: "filen_path", + Type: "type", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewDocumentDao creates and returns a new DAO object for table data access. +func NewDocumentDao() *DocumentDao { + return &DocumentDao{ + group: "default", + table: "document", + columns: documentColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *DocumentDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *DocumentDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *DocumentDao) Columns() DocumentColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *DocumentDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *DocumentDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *DocumentDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/document_completion.go b/internal/app/system/dao/internal/document_completion.go new file mode 100644 index 0000000..f480748 --- /dev/null +++ b/internal/app/system/dao/internal/document_completion.go @@ -0,0 +1,100 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-03-15 10:25:00 +// 生成路径: internal/app/system/dao/internal/document_completion.go +// 生成人:gfast +// desc:竣工图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// DocumentCompletionDao is the manager for logic model data accessing and custom defined data operations functions management. +type DocumentCompletionDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns DocumentCompletionColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// DocumentCompletionColumns defines and stores column names for table document_completion. +type DocumentCompletionColumns struct { + Id string // + IdStr string // 模板id + Pid string // 父级(0代表顶级) + Name string // 模板名称 + FilenPath string // 模板文件名 + Type string // 类型(1文件-2文件夹) + Suffix string // 后缀 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + ProjectId string // 项目id +} + +var documentCompletionColumns = DocumentCompletionColumns{ + Id: "id", + IdStr: "id_str", + Pid: "pid", + Name: "name", + FilenPath: "filen_path", + Type: "type", + Suffix: "suffix", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + ProjectId: "project_id", +} + +// NewDocumentCompletionDao creates and returns a new DAO object for table data access. +func NewDocumentCompletionDao() *DocumentCompletionDao { + return &DocumentCompletionDao{ + group: "default", + table: "document_completion", + columns: documentCompletionColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *DocumentCompletionDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *DocumentCompletionDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *DocumentCompletionDao) Columns() DocumentCompletionColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *DocumentCompletionDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *DocumentCompletionDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *DocumentCompletionDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/document_data.go b/internal/app/system/dao/internal/document_data.go new file mode 100644 index 0000000..af29bb1 --- /dev/null +++ b/internal/app/system/dao/internal/document_data.go @@ -0,0 +1,100 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-12-27 09:30:03 +// 生成路径: internal/app/system/dao/internal/document_data.go +// 生成人:gfast +// desc:工程资料>资料 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// DocumentDataDao is the manager for logic model data accessing and custom defined data operations functions management. +type DocumentDataDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns DocumentDataColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// DocumentDataColumns defines and stores column names for table document_data. +type DocumentDataColumns struct { + Id string // + ProjectId string // + IdStr string // 模板id + Pid string // 父级(0代表顶级) + Name string // 模板名称 + FilenPath string // 模板文件名 + Type string // 类型(1文件-2文件夹) + Suffix string // 后缀 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var documentDataColumns = DocumentDataColumns{ + Id: "id", + ProjectId: "project_id", + IdStr: "id_str", + Pid: "pid", + Name: "name", + FilenPath: "filen_path", + Type: "type", + Suffix: "suffix", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewDocumentDataDao creates and returns a new DAO object for table data access. +func NewDocumentDataDao() *DocumentDataDao { + return &DocumentDataDao{ + group: "default", + table: "document_data", + columns: documentDataColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *DocumentDataDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *DocumentDataDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *DocumentDataDao) Columns() DocumentDataColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *DocumentDataDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *DocumentDataDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *DocumentDataDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/document_production_drawing.go b/internal/app/system/dao/internal/document_production_drawing.go new file mode 100644 index 0000000..4752766 --- /dev/null +++ b/internal/app/system/dao/internal/document_production_drawing.go @@ -0,0 +1,100 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-03-15 10:24:54 +// 生成路径: internal/app/system/dao/internal/document_production_drawing.go +// 生成人:gfast +// desc:施工图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// DocumentProductionDrawingDao is the manager for logic model data accessing and custom defined data operations functions management. +type DocumentProductionDrawingDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns DocumentProductionDrawingColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// DocumentProductionDrawingColumns defines and stores column names for table document_production_drawing. +type DocumentProductionDrawingColumns struct { + Id string // + IdStr string // 模板id + Pid string // 父级(0代表顶级) + Name string // 模板名称 + FilenPath string // 模板文件名 + Type string // 类型(1文件-2文件夹) + Suffix string // 后缀 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + ProjectId string // 项目id +} + +var documentProductionDrawingColumns = DocumentProductionDrawingColumns{ + Id: "id", + IdStr: "id_str", + Pid: "pid", + Name: "name", + FilenPath: "filen_path", + Type: "type", + Suffix: "suffix", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + ProjectId: "project_id", +} + +// NewDocumentProductionDrawingDao creates and returns a new DAO object for table data access. +func NewDocumentProductionDrawingDao() *DocumentProductionDrawingDao { + return &DocumentProductionDrawingDao{ + group: "default", + table: "document_production_drawing", + columns: documentProductionDrawingColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *DocumentProductionDrawingDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *DocumentProductionDrawingDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *DocumentProductionDrawingDao) Columns() DocumentProductionDrawingColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *DocumentProductionDrawingDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *DocumentProductionDrawingDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *DocumentProductionDrawingDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/document_project.go b/internal/app/system/dao/internal/document_project.go new file mode 100644 index 0000000..1fc871e --- /dev/null +++ b/internal/app/system/dao/internal/document_project.go @@ -0,0 +1,98 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-09-16 10:32:03 +// 生成路径: internal/app/system/dao/internal/document_project.go +// 生成人:gfast +// desc:项目模板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// DocumentProjectDao is the manager for logic model data accessing and custom defined data operations functions management. +type DocumentProjectDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns DocumentProjectColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// DocumentProjectColumns defines and stores column names for table document_project. +type DocumentProjectColumns struct { + Id string // 序号 + Pid string // 父级(0代表顶级) + Name string // 模板名称 + FilePath string // 模板路径 + Type string // 类型(1文件-2文件夹) + Json string // 保存后的json文件名 + ProjectId string // 项目id + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var documentProjectColumns = DocumentProjectColumns{ + Id: "id", + Pid: "pid", + Name: "name", + FilePath: "file_path", + Type: "type", + Json: "json", + ProjectId: "project_id", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewDocumentProjectDao creates and returns a new DAO object for table data access. +func NewDocumentProjectDao() *DocumentProjectDao { + return &DocumentProjectDao{ + group: "default", + table: "document_project", + columns: documentProjectColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *DocumentProjectDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *DocumentProjectDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *DocumentProjectDao) Columns() DocumentProjectColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *DocumentProjectDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *DocumentProjectDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *DocumentProjectDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/document_quality_meeting.go b/internal/app/system/dao/internal/document_quality_meeting.go new file mode 100644 index 0000000..18a9302 --- /dev/null +++ b/internal/app/system/dao/internal/document_quality_meeting.go @@ -0,0 +1,100 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-03-25 16:43:56 +// 生成路径: internal/app/system/dao/internal/document_quality_meeting.go +// 生成人:gfast +// desc:质量会议 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// DocumentQualityMeetingDao is the manager for logic model data accessing and custom defined data operations functions management. +type DocumentQualityMeetingDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns DocumentQualityMeetingColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// DocumentQualityMeetingColumns defines and stores column names for table document_quality_meeting. +type DocumentQualityMeetingColumns struct { + Id string // + IdStr string // 模板id + Pid string // 父级(0代表顶级) + Name string // 模板名称 + FilenPath string // 模板文件名 + Type string // 类型(1文件-2文件夹) + Suffix string // 后缀 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + ProjectId string // 项目id +} + +var documentQualityMeetingColumns = DocumentQualityMeetingColumns{ + Id: "id", + IdStr: "id_str", + Pid: "pid", + Name: "name", + FilenPath: "filen_path", + Type: "type", + Suffix: "suffix", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + ProjectId: "project_id", +} + +// NewDocumentQualityMeetingDao creates and returns a new DAO object for table data access. +func NewDocumentQualityMeetingDao() *DocumentQualityMeetingDao { + return &DocumentQualityMeetingDao{ + group: "default", + table: "document_quality_meeting", + columns: documentQualityMeetingColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *DocumentQualityMeetingDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *DocumentQualityMeetingDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *DocumentQualityMeetingDao) Columns() DocumentQualityMeetingColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *DocumentQualityMeetingDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *DocumentQualityMeetingDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *DocumentQualityMeetingDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/document_report.go b/internal/app/system/dao/internal/document_report.go new file mode 100644 index 0000000..08ebfad --- /dev/null +++ b/internal/app/system/dao/internal/document_report.go @@ -0,0 +1,100 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-03-15 10:24:21 +// 生成路径: internal/app/system/dao/internal/document_report.go +// 生成人:gfast +// desc:科研及专题报告 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// DocumentReportDao is the manager for logic model data accessing and custom defined data operations functions management. +type DocumentReportDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns DocumentReportColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// DocumentReportColumns defines and stores column names for table document_report. +type DocumentReportColumns struct { + Id string // + IdStr string // 模板id + Pid string // 父级(0代表顶级) + Name string // 模板名称 + FilenPath string // 模板文件名 + Type string // 类型(1文件-2文件夹) + Suffix string // 后缀 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + ProjectId string // 项目id +} + +var documentReportColumns = DocumentReportColumns{ + Id: "id", + IdStr: "id_str", + Pid: "pid", + Name: "name", + FilenPath: "filen_path", + Type: "type", + Suffix: "suffix", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + ProjectId: "project_id", +} + +// NewDocumentReportDao creates and returns a new DAO object for table data access. +func NewDocumentReportDao() *DocumentReportDao { + return &DocumentReportDao{ + group: "default", + table: "document_report", + columns: documentReportColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *DocumentReportDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *DocumentReportDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *DocumentReportDao) Columns() DocumentReportColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *DocumentReportDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *DocumentReportDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *DocumentReportDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/document_safety_meeting.go b/internal/app/system/dao/internal/document_safety_meeting.go new file mode 100644 index 0000000..bc2eeb1 --- /dev/null +++ b/internal/app/system/dao/internal/document_safety_meeting.go @@ -0,0 +1,100 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-04-09 11:40:21 +// 生成路径: internal/app/system/dao/internal/document_safety_meeting.go +// 生成人:gfast +// desc:安全会议 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// DocumentSafetyMeetingDao is the manager for logic model data accessing and custom defined data operations functions management. +type DocumentSafetyMeetingDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns DocumentSafetyMeetingColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// DocumentSafetyMeetingColumns defines and stores column names for table document_safety_meeting. +type DocumentSafetyMeetingColumns struct { + Id string // + IdStr string // 模板id + Pid string // 父级(0代表顶级) + Name string // 模板名称 + FilenPath string // 模板文件名 + Type string // 类型(1文件-2文件夹) + Suffix string // 后缀 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + ProjectId string // 项目id +} + +var documentSafetyMeetingColumns = DocumentSafetyMeetingColumns{ + Id: "id", + IdStr: "id_str", + Pid: "pid", + Name: "name", + FilenPath: "filen_path", + Type: "type", + Suffix: "suffix", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + ProjectId: "project_id", +} + +// NewDocumentSafetyMeetingDao creates and returns a new DAO object for table data access. +func NewDocumentSafetyMeetingDao() *DocumentSafetyMeetingDao { + return &DocumentSafetyMeetingDao{ + group: "default", + table: "document_safety_meeting", + columns: documentSafetyMeetingColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *DocumentSafetyMeetingDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *DocumentSafetyMeetingDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *DocumentSafetyMeetingDao) Columns() DocumentSafetyMeetingColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *DocumentSafetyMeetingDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *DocumentSafetyMeetingDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *DocumentSafetyMeetingDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/equipment.go b/internal/app/system/dao/internal/equipment.go new file mode 100644 index 0000000..dade17d --- /dev/null +++ b/internal/app/system/dao/internal/equipment.go @@ -0,0 +1,119 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// EquipmentDao is the data access object for table equipment. +type EquipmentDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns EquipmentColumns // columns contains all the column names of Table for convenient usage. +} + +// EquipmentColumns defines and stores column names for table equipment. +type EquipmentColumns struct { + PlantId string // 所属电站ID + DivertorId string // 分流器ID + DivertorName string // 分流器名称 + EquipmentName string // 设备名称 + EquipmentPn string // 设备型号 + EquipmentSn string // 设备序列号 + Id string // 设备ID + Kwp string // 总容量kwp + MonKwh string // 当月发电量 + NowKw string // 实时功率 + ParamDcacCode string // DC/AC参数代码 + ParamDcdcCode string // DC/DC参数代码 + PowerPlantId string // 电站ID + PowerPlantName string // 电站名称 + RatedPower string // 额定功率 + SoftDcacCode string // 软件DC/AC代码 + SoftDcdcCode string // 软件DC/DC代码 + Status string // 状态 + SumKwh string // 总发电量 + TodayKwh string // 当日发电量 + UpdateTime string // 更新时间 + UserId string // 用户ID + UserName string // 用户名 + YearKwh string // 年发电量 +} + +// equipmentColumns holds the columns for table equipment. +var equipmentColumns = EquipmentColumns{ + PlantId: "plantId", + DivertorId: "divertorId", + DivertorName: "divertorName", + EquipmentName: "equipmentName", + EquipmentPn: "equipmentPn", + EquipmentSn: "equipmentSn", + Id: "id", + Kwp: "kwp", + MonKwh: "monKwh", + NowKw: "nowKw", + ParamDcacCode: "paramDcacCode", + ParamDcdcCode: "paramDcdcCode", + PowerPlantId: "powerPlantId", + PowerPlantName: "powerPlantName", + RatedPower: "ratedPower", + SoftDcacCode: "softDcacCode", + SoftDcdcCode: "softDcdcCode", + Status: "status", + SumKwh: "sumKwh", + TodayKwh: "todayKwh", + UpdateTime: "updateTime", + UserId: "userId", + UserName: "userName", + YearKwh: "yearKwh", +} + +// NewEquipmentDao creates and returns a new DAO object for table data access. +func NewEquipmentDao() *EquipmentDao { + return &EquipmentDao{ + group: "default", + table: "equipment", + columns: equipmentColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *EquipmentDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *EquipmentDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *EquipmentDao) Columns() EquipmentColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *EquipmentDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *EquipmentDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *EquipmentDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/manage_airline.go b/internal/app/system/dao/internal/manage_airline.go new file mode 100644 index 0000000..77e0016 --- /dev/null +++ b/internal/app/system/dao/internal/manage_airline.go @@ -0,0 +1,95 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-12-11 16:10:18 +// 生成路径: internal/app/system/dao/internal/manage_airline.go +// 生成人:gfast +// desc:航线 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// ManageAirlineDao is the manager for logic model data accessing and custom defined data operations functions management. +type ManageAirlineDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns ManageAirlineColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// ManageAirlineColumns defines and stores column names for table manage_airline. +type ManageAirlineColumns struct { + Id string // 序号 + ProjectId string // 项目id + MqClientId string // 关联机场 + AirLine string // 航线名称 + FilePath string // 航线文件 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + Remark string // 备注 +} + +var manageAirlineColumns = ManageAirlineColumns{ + Id: "id", + ProjectId: "project_id", + AirLine: "air_line", + FilePath: "file_path", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + Remark: "remark", +} + +// NewManageAirlineDao creates and returns a new DAO object for table data access. +func NewManageAirlineDao() *ManageAirlineDao { + return &ManageAirlineDao{ + group: "default", + table: "manage_airline", + columns: manageAirlineColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *ManageAirlineDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *ManageAirlineDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *ManageAirlineDao) Columns() ManageAirlineColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *ManageAirlineDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *ManageAirlineDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *ManageAirlineDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/manage_device.go b/internal/app/system/dao/internal/manage_device.go new file mode 100644 index 0000000..9e54c1d --- /dev/null +++ b/internal/app/system/dao/internal/manage_device.go @@ -0,0 +1,122 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-11-14 10:53:21 +// 生成路径: internal/app/system/dao/internal/manage_device.go +// 生成人:gfast +// desc:设备信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// ManageDeviceDao is the manager for logic model data accessing and custom defined data operations functions management. +type ManageDeviceDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns ManageDeviceColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// ManageDeviceColumns defines and stores column names for table manage_device. +type ManageDeviceColumns struct { + Id string // 自增ID + DeviceSn string // 对接站点、无人机或遥控器的序列号 + MqClientId string // + DeviceName string // 设备的型号。该参数对应设备字典表中的设备名称 + UserId string // 设备绑定时使用的账号 + Nickname string // 设备的自定义名称 + WorkspaceId string // 当前设备所属的工作区 + DeviceType string // 该参数对应设备字典表中的设备类型 + SubType string // 该参数对应设备字典表中的子类型 + Domain string // 该参数对应设备字典表中的域 + FirmwareVersion string // 设备的固件版本 + CompatibleStatus string // 1: 一致;0: 不一致;固件版本是否一致 + Version string // 协议版本。该字段目前没有用处。 + DeviceIndex string // 无人机的控制,A控制或B控制 + ChildSn string // 由网关控制的设备 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + BoundTime string // 设备绑定工作区的时间 + BoundStatus string // 设备绑定工作区的状态。1: 已绑定;0: 未绑定 + LoginTime string // 设备的上次登录时间 + DeviceDesc string // 设备描述 + UrlNormal string // 遥控器上显示的图标 + UrlSelect string // 选中遥控器时显示的图标 + ProjectId string // 项目id +} + +var manageDeviceColumns = ManageDeviceColumns{ + Id: "id", + DeviceSn: "device_sn", + DeviceName: "device_name", + MqClientId: "mq_client_id", + UserId: "user_id", + Nickname: "nickname", + WorkspaceId: "workspace_id", + DeviceType: "device_type", + SubType: "sub_type", + Domain: "domain", + FirmwareVersion: "firmware_version", + CompatibleStatus: "compatible_status", + Version: "version", + DeviceIndex: "device_index", + ChildSn: "child_sn", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + BoundTime: "bound_time", + BoundStatus: "bound_status", + LoginTime: "login_time", + DeviceDesc: "device_desc", + UrlNormal: "url_normal", + UrlSelect: "url_select", + ProjectId: "project_id", +} + +// NewManageDeviceDao creates and returns a new DAO object for table data access. +func NewManageDeviceDao() *ManageDeviceDao { + return &ManageDeviceDao{ + group: "default", + table: "manage_device", + columns: manageDeviceColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *ManageDeviceDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *ManageDeviceDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *ManageDeviceDao) Columns() ManageDeviceColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *ManageDeviceDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *ManageDeviceDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *ManageDeviceDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/manage_operation_log.go b/internal/app/system/dao/internal/manage_operation_log.go new file mode 100644 index 0000000..6156820 --- /dev/null +++ b/internal/app/system/dao/internal/manage_operation_log.go @@ -0,0 +1,86 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-06-21 15:23:29 +// 生成路径: internal/app/system/dao/internal/manage_operation_log.go +// 生成人:gfast +// desc:无人机指令日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// ManageOperationLogDao is the manager for logic model data accessing and custom defined data operations functions management. +type ManageOperationLogDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns ManageOperationLogColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// ManageOperationLogColumns defines and stores column names for table manage_operation_log. +type ManageOperationLogColumns struct { + Id string // 主键ID + Sn string // sn + Method string // 方法名 + Direction string // 上发/下发命令 + Code string // 状态码 + Operator string // 操作人ID(默认为0表示系统操作) +} + +var manageOperationLogColumns = ManageOperationLogColumns{ + Id: "id", + Sn: "sn", + Method: "method", + Direction: "direction", + Code: "code", + Operator: "operator", +} + +// NewManageOperationLogDao creates and returns a new DAO object for table data access. +func NewManageOperationLogDao() *ManageOperationLogDao { + return &ManageOperationLogDao{ + group: "default", + table: "manage_operation_log", + columns: manageOperationLogColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *ManageOperationLogDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *ManageOperationLogDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *ManageOperationLogDao) Columns() ManageOperationLogColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *ManageOperationLogDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *ManageOperationLogDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *ManageOperationLogDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/manage_task.go b/internal/app/system/dao/internal/manage_task.go new file mode 100644 index 0000000..269a6ed --- /dev/null +++ b/internal/app/system/dao/internal/manage_task.go @@ -0,0 +1,112 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-12-12 15:21:22 +// 生成路径: internal/app/system/dao/internal/manage_task.go +// 生成人:gfast +// desc:航线任务下发 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// ManageTaskDao is the manager for logic model data accessing and custom defined data operations functions management. +type ManageTaskDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns ManageTaskColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// ManageTaskColumns defines and stores column names for table manage_task. +type ManageTaskColumns struct { + Id string // 主键ID + TaskName string // 任务名称 + FlightId string // 计划ID(uuid) + TaskType string // 任务类型("0":"立即任务","1":"定时任务","2":"条件任务") + ExecuteTime string // 任务开始执行时间毫秒时间戳 + WaylineType string // 0普通航线 + MqClientId string // 关联机场 + AirLine string // 关联航线 + ProjectId string // 关联项目 + RthAltitude string // 返航高度 + RthMode string // (默认为0)"0":"智能高度","1":"设定高度" + OutOfControlAction string // (默认为0)"0":"返航","1":"悬停","2":"降落" + ExitWaylineWhenRcLost string // (默认为0)"0":"继续执行航线任务","1":"退出航线任务,执行遥控器失控动作" + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + Remark string // 备注 +} + +var manageTaskColumns = ManageTaskColumns{ + Id: "id", + TaskName: "task_name", + FlightId: "flight_id", + TaskType: "task_type", + ExecuteTime: "execute_time", + WaylineType: "wayline_type", + MqClientId: "mq_client_id", + AirLine: "air_line", + ProjectId: "project_id", + RthAltitude: "rth_altitude", + RthMode: "rth_mode", + OutOfControlAction: "out_of_control_action", + ExitWaylineWhenRcLost: "exit_wayline_when_rc_lost", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + Remark: "remark", +} + +// NewManageTaskDao creates and returns a new DAO object for table data access. +func NewManageTaskDao() *ManageTaskDao { + return &ManageTaskDao{ + group: "default", + table: "manage_task", + columns: manageTaskColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *ManageTaskDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *ManageTaskDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *ManageTaskDao) Columns() ManageTaskColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *ManageTaskDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *ManageTaskDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *ManageTaskDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/manage_task_cron.go b/internal/app/system/dao/internal/manage_task_cron.go new file mode 100644 index 0000000..71189d5 --- /dev/null +++ b/internal/app/system/dao/internal/manage_task_cron.go @@ -0,0 +1,85 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-06-04 14:33:05 +// 生成路径: internal/app/system/dao/internal/manage_task_cron.go +// 生成人:gfast +// desc:航线任务定时飞行 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + + "github.com/gogf/gf/v2/frame/g" +) + +// ManageTaskCronDao is the manager for logic model data accessing and custom defined data operations functions management. +type ManageTaskCronDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns ManageTaskCronColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// ManageTaskCronColumns defines and stores column names for table manage_task_cron. +type ManageTaskCronColumns struct { + Id string // 主键ID + MqClientId string // sn + TaskId string // 任务模板ID + Cron string // 表达式 + CronId string // cronID +} + +var manageTaskCronColumns = ManageTaskCronColumns{ + Id: "id", + MqClientId: "mq_client_id", + TaskId: "task_id", + Cron: "cron", + CronId: "cron_id", +} + +// NewManageTaskCronDao creates and returns a new DAO object for table data access. +func NewManageTaskCronDao() *ManageTaskCronDao { + return &ManageTaskCronDao{ + group: "default", + table: "manage_task_cron", + columns: manageTaskCronColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *ManageTaskCronDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *ManageTaskCronDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *ManageTaskCronDao) Columns() ManageTaskCronColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *ManageTaskCronDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *ManageTaskCronDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *ManageTaskCronDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/manage_task_record.go b/internal/app/system/dao/internal/manage_task_record.go new file mode 100644 index 0000000..6d51c9f --- /dev/null +++ b/internal/app/system/dao/internal/manage_task_record.go @@ -0,0 +1,110 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-12-12 17:56:19 +// 生成路径: internal/app/system/dao/internal/manage_task_record.go +// 生成人:gfast +// desc:航线任务下发-记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// ManageTaskRecordDao is the manager for logic model data accessing and custom defined data operations functions management. +type ManageTaskRecordDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns ManageTaskRecordColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// ManageTaskRecordColumns defines and stores column names for table manage_task_record. +type ManageTaskRecordColumns struct { + Id string // 主键ID + TaskId string // 任务主键ID + TaskType string // 任务类型("0":"立即任务","1":"定时任务","2":"条件任务") + IsVoluntarily string // 0自动飞行 1手动飞行 + ExecuteTime string // 任务开始执行时间(毫秒) + CancelTime string // 任务取消时间戳 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + Remark string // 备注 + Suspend string // 航线暂停时间戳 + Recover string // 航线恢复时间戳 + CourseReversal string // 返航时间戳 + CancelHoming string // 取消返航时间戳 + MqClientId string // 关联机场 + ProjectId string // 项目id +} + +var manageTaskRecordColumns = ManageTaskRecordColumns{ + Id: "id", + TaskId: "task_id", + TaskType: "task_type", + IsVoluntarily: "is_voluntarily", + ExecuteTime: "execute_time", + CancelTime: "cancel_time", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + Remark: "remark", + Suspend: "suspend", + Recover: "recover", + CourseReversal: "course_reversal", + CancelHoming: "cancel_homing", + MqClientId: "mq_client_id", + ProjectId: "project_id", +} + +// NewManageTaskRecordDao creates and returns a new DAO object for table data access. +func NewManageTaskRecordDao() *ManageTaskRecordDao { + return &ManageTaskRecordDao{ + group: "default", + table: "manage_task_record", + columns: manageTaskRecordColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *ManageTaskRecordDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *ManageTaskRecordDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *ManageTaskRecordDao) Columns() ManageTaskRecordColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *ManageTaskRecordDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *ManageTaskRecordDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *ManageTaskRecordDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/manage_task_record_resource.go b/internal/app/system/dao/internal/manage_task_record_resource.go new file mode 100644 index 0000000..385b224 --- /dev/null +++ b/internal/app/system/dao/internal/manage_task_record_resource.go @@ -0,0 +1,102 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-05-30 17:07:01 +// 生成路径: internal/app/system/dao/internal/manage_task_record_resource.go +// 生成人:gfast +// desc:下发记录回传的媒体文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// ManageTaskRecordResourceDao is the manager for logic model data accessing and custom defined data operations functions management. +type ManageTaskRecordResourceDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns ManageTaskRecordResourceColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// ManageTaskRecordResourceColumns defines and stores column names for table manage_task_record_resource. +type ManageTaskRecordResourceColumns struct { + FlightId string // 计划ID + FileName string // 文件名称 + ObjectKey string // 文件在对象存储桶的 Key + Path string // 文件的业务路径 + DroneModelKey string // 飞行器产品枚举值 + PayloadModelKey string // 负载产品枚举值 + AbsoluteAltitude string // 拍摄绝对高度 + RelativeAltitude string // 拍摄相对高度 + CreateTime string // 媒体拍摄时间 + ShootPosition string // 拍摄位置 + Lat string // 拍摄位置纬度 + Lng string // 拍摄位置经度 + Img string // 图片位置 + ImgSize string // 图片大小 +} + +var manageTaskRecordResourceColumns = ManageTaskRecordResourceColumns{ + FlightId: "flight_id", + FileName: "file_name", + ObjectKey: "object_key", + Path: "path", + DroneModelKey: "drone_model_key", + PayloadModelKey: "payload_model_key", + AbsoluteAltitude: "absolute_altitude", + RelativeAltitude: "relative_altitude", + CreateTime: "create_time", + ShootPosition: "shoot_position", + Lat: "lat", + Lng: "lng", + Img: "img", + ImgSize: "img_size", +} + +// NewManageTaskRecordResourceDao creates and returns a new DAO object for table data access. +func NewManageTaskRecordResourceDao() *ManageTaskRecordResourceDao { + return &ManageTaskRecordResourceDao{ + group: "default", + table: "manage_task_record_resource", + columns: manageTaskRecordResourceColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *ManageTaskRecordResourceDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *ManageTaskRecordResourceDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *ManageTaskRecordResourceDao) Columns() ManageTaskRecordResourceColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *ManageTaskRecordResourceDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *ManageTaskRecordResourceDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *ManageTaskRecordResourceDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/manage_task_result.go b/internal/app/system/dao/internal/manage_task_result.go new file mode 100644 index 0000000..0d33630 --- /dev/null +++ b/internal/app/system/dao/internal/manage_task_result.go @@ -0,0 +1,81 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// ManageTaskResultDao is the data access object for table manage_task_result. +type ManageTaskResultDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns ManageTaskResultColumns // columns contains all the column names of Table for convenient usage. +} + +// ManageTaskResultColumns defines and stores column names for table manage_task_result. +type ManageTaskResultColumns struct { + Id string // + TaskId string // 航线任务ID + PvId string // pv_module 的主键 + CreatedAt string // + DeletedAt string // +} + +// manageTaskResultColumns holds the columns for table manage_task_result. +var manageTaskResultColumns = ManageTaskResultColumns{ + Id: "id", + TaskId: "task_id", + PvId: "pv_id", + CreatedAt: "created_at", + DeletedAt: "deleted_at", +} + +// NewManageTaskResultDao creates and returns a new DAO object for table data access. +func NewManageTaskResultDao() *ManageTaskResultDao { + return &ManageTaskResultDao{ + group: "default", + table: "manage_task_result", + columns: manageTaskResultColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *ManageTaskResultDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *ManageTaskResultDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *ManageTaskResultDao) Columns() ManageTaskResultColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *ManageTaskResultDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *ManageTaskResultDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *ManageTaskResultDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/manage_workspace.go b/internal/app/system/dao/internal/manage_workspace.go new file mode 100644 index 0000000..8e79217 --- /dev/null +++ b/internal/app/system/dao/internal/manage_workspace.go @@ -0,0 +1,92 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-11-14 10:53:20 +// 生成路径: internal/app/system/dao/internal/manage_workspace.go +// 生成人:gfast +// desc:工作空间 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// ManageWorkspaceDao is the manager for logic model data accessing and custom defined data operations functions management. +type ManageWorkspaceDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns ManageWorkspaceColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// ManageWorkspaceColumns defines and stores column names for table manage_workspace. +type ManageWorkspaceColumns struct { + Id string // 自增ID + WorkspaceId string // 工作区的UUID + WorkspaceName string // 工作区的名称 + WorkspaceDesc string // 工作区的描述 + PlatformName string // 工作区的平台名称 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + BindCode string // 当停机坪连接到第三方云时,需要提供该工作区的绑定码 + ProjectId string // 项目id +} + +var manageWorkspaceColumns = ManageWorkspaceColumns{ + Id: "id", + WorkspaceId: "workspace_id", + WorkspaceName: "workspace_name", + WorkspaceDesc: "workspace_desc", + PlatformName: "platform_name", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + BindCode: "bind_code", + ProjectId: "project_id", +} + +// NewManageWorkspaceDao creates and returns a new DAO object for table data access. +func NewManageWorkspaceDao() *ManageWorkspaceDao { + return &ManageWorkspaceDao{ + group: "default", + table: "manage_workspace", + columns: manageWorkspaceColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *ManageWorkspaceDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *ManageWorkspaceDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *ManageWorkspaceDao) Columns() ManageWorkspaceColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *ManageWorkspaceDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *ManageWorkspaceDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *ManageWorkspaceDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/master_schedule.go b/internal/app/system/dao/internal/master_schedule.go new file mode 100644 index 0000000..edb1286 --- /dev/null +++ b/internal/app/system/dao/internal/master_schedule.go @@ -0,0 +1,98 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-10-08 09:38:35 +// 生成路径: internal/app/system/dao/internal/master_schedule.go +// 生成人:gfast +// desc:总进度计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// MasterScheduleDao is the manager for logic model data accessing and custom defined data operations functions management. +type MasterScheduleDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns MasterScheduleColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// MasterScheduleColumns defines and stores column names for table master_schedule. +type MasterScheduleColumns struct { + Id string // + ProjectId string // 项目id + Name string // 工作名称 + Start string // 开始时间 + End string // 结束时间 + Content string // 备注 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + Sequence string // 顺序编号 +} + +var masterScheduleColumns = MasterScheduleColumns{ + Id: "id", + ProjectId: "project_id", + Name: "name", + Start: "start", + End: "end", + Content: "content", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + Sequence: "sequence", +} + +// NewMasterScheduleDao creates and returns a new DAO object for table data access. +func NewMasterScheduleDao() *MasterScheduleDao { + return &MasterScheduleDao{ + group: "default", + table: "master_schedule", + columns: masterScheduleColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *MasterScheduleDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *MasterScheduleDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *MasterScheduleDao) Columns() MasterScheduleColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *MasterScheduleDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *MasterScheduleDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *MasterScheduleDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/notification_files.go b/internal/app/system/dao/internal/notification_files.go new file mode 100644 index 0000000..daf448f --- /dev/null +++ b/internal/app/system/dao/internal/notification_files.go @@ -0,0 +1,85 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// NotificationFilesDao is the data access object for table notification_files. +type NotificationFilesDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns NotificationFilesColumns // columns contains all the column names of Table for convenient usage. +} + +// NotificationFilesColumns defines and stores column names for table notification_files. +type NotificationFilesColumns struct { + Id string // 主键ID + CreatedAt string // + NotificationId string // 关联的通知或新闻ID + FileName string // 文件名 + FilePath string // 保存路径 + FileType string // 文件类型 + FileSize string // 文件大小 +} + +// notificationFilesColumns holds the columns for table notification_files. +var notificationFilesColumns = NotificationFilesColumns{ + Id: "id", + CreatedAt: "created_at", + NotificationId: "notification_id", + FileName: "file_name", + FilePath: "file_path", + FileType: "file_type", + FileSize: "file_size", +} + +// NewNotificationFilesDao creates and returns a new DAO object for table data access. +func NewNotificationFilesDao() *NotificationFilesDao { + return &NotificationFilesDao{ + group: "default", + table: "notification_files", + columns: notificationFilesColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *NotificationFilesDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *NotificationFilesDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *NotificationFilesDao) Columns() NotificationFilesColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *NotificationFilesDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *NotificationFilesDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *NotificationFilesDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/notification_recipients.go b/internal/app/system/dao/internal/notification_recipients.go new file mode 100644 index 0000000..20d91f9 --- /dev/null +++ b/internal/app/system/dao/internal/notification_recipients.go @@ -0,0 +1,87 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// NotificationRecipientsDao is the data access object for table notification_recipients. +type NotificationRecipientsDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns NotificationRecipientsColumns // columns contains all the column names of Table for convenient usage. +} + +// NotificationRecipientsColumns defines and stores column names for table notification_recipients. +type NotificationRecipientsColumns struct { + Id string // + CreatedAt string // + NotificationId string // 关联的通知ID + RecipientId string // 接收者ID + RecipientRole string // 接收者权限 + NotificationStatus string // 0 未读 | 1 已读 + ReadTime string // 消息已读时间 + IntroduceId string // 关联的项目新闻ID +} + +// notificationRecipientsColumns holds the columns for table notification_recipients. +var notificationRecipientsColumns = NotificationRecipientsColumns{ + Id: "id", + CreatedAt: "created_at", + NotificationId: "notification_id", + RecipientId: "recipient_id", + RecipientRole: "recipient_role", + NotificationStatus: "notification_status", + ReadTime: "read_time", + IntroduceId: "introduce_id", +} + +// NewNotificationRecipientsDao creates and returns a new DAO object for table data access. +func NewNotificationRecipientsDao() *NotificationRecipientsDao { + return &NotificationRecipientsDao{ + group: "default", + table: "notification_recipients", + columns: notificationRecipientsColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *NotificationRecipientsDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *NotificationRecipientsDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *NotificationRecipientsDao) Columns() NotificationRecipientsColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *NotificationRecipientsDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *NotificationRecipientsDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *NotificationRecipientsDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/notifications.go b/internal/app/system/dao/internal/notifications.go new file mode 100644 index 0000000..cbb1a9b --- /dev/null +++ b/internal/app/system/dao/internal/notifications.go @@ -0,0 +1,95 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// NotificationsDao is the data access object for table notifications. +type NotificationsDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns NotificationsColumns // columns contains all the column names of Table for convenient usage. +} + +// NotificationsColumns defines and stores column names for table notifications. +type NotificationsColumns struct { + Id string // + CreatedAt string // + NotificationText string // 通知正文 + Route string // 跳转的路由 + NotificationTime string // 通知时间 + Initiator string // 发起人 + ProjectId string // 项目ID + Positions string // 通知岗位列表 + Title string // 通知标题 + IsApp string // 0 PC | 1 App | 2 新闻 + Files string // 附件 + IntroduceId string // 项目新闻的ID +} + +// notificationsColumns holds the columns for table notifications. +var notificationsColumns = NotificationsColumns{ + Id: "id", + CreatedAt: "created_at", + NotificationText: "notification_text", + Route: "route", + NotificationTime: "notification_time", + Initiator: "initiator", + ProjectId: "project_id", + Positions: "positions", + Title: "title", + IsApp: "is_app", + Files: "files", + IntroduceId: "introduce_id", +} + +// NewNotificationsDao creates and returns a new DAO object for table data access. +func NewNotificationsDao() *NotificationsDao { + return &NotificationsDao{ + group: "default", + table: "notifications", + columns: notificationsColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *NotificationsDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *NotificationsDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *NotificationsDao) Columns() NotificationsColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *NotificationsDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *NotificationsDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *NotificationsDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/plan_daily.go b/internal/app/system/dao/internal/plan_daily.go new file mode 100644 index 0000000..3e408a9 --- /dev/null +++ b/internal/app/system/dao/internal/plan_daily.go @@ -0,0 +1,108 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-09-26 14:31:07 +// 生成路径: internal/app/system/dao/internal/plan_daily.go +// 生成人:gfast +// desc:日报 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// PlanDailyDao is the manager for logic model data accessing and custom defined data operations functions management. +type PlanDailyDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns PlanDailyColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// PlanDailyColumns defines and stores column names for table plan_daily. +type PlanDailyColumns struct { + Id string // 主键ID + ProjectId string // 项目id + SourceId string // 资源id + Name string // 资源名称 + Table string // source_id的数据对应的数据表 + PlanName string // 计划名称 + PlanId string // 周id + WeekRealityId string // 周主键ID + SourceType string // 资源类型 + Cnt string // 资源数量 + DataTime string // 日计划时间 + Status string // 工作状态 + CreateBy string // + UpdateBy string // + CreatedAt string // + UpdatedAt string // + DeletedAt string // +} + +var planDailyColumns = PlanDailyColumns{ + Id: "id", + ProjectId: "project_id", + SourceId: "source_id", + Name: "name", + Table: "table", + PlanName: "plan_name", + PlanId: "plan_id", + WeekRealityId: "week_reality_id", + SourceType: "source_type", + Cnt: "cnt", + DataTime: "data_time", + Status: "status", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewPlanDailyDao creates and returns a new DAO object for table data access. +func NewPlanDailyDao() *PlanDailyDao { + return &PlanDailyDao{ + group: "default", + table: "plan_daily", + columns: planDailyColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *PlanDailyDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *PlanDailyDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *PlanDailyDao) Columns() PlanDailyColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *PlanDailyDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *PlanDailyDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *PlanDailyDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/plan_week.go b/internal/app/system/dao/internal/plan_week.go new file mode 100644 index 0000000..187c2ea --- /dev/null +++ b/internal/app/system/dao/internal/plan_week.go @@ -0,0 +1,108 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-04 17:26:59 +// 生成路径: internal/app/system/dao/internal/plan_week.go +// 生成人:gfast +// desc:周计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// PlanWeekDao is the manager for logic model data accessing and custom defined data operations functions management. +type PlanWeekDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns PlanWeekColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// PlanWeekColumns defines and stores column names for table plan_week. +type PlanWeekColumns struct { + Id string // + ProjectId string // 项目id + SourceId string // 资源id + Name string // 资源名称 + Start string // 开始时间 + End string // 结束时间 + PlanName string // 计划名称 + PlanId string // 周id + CreateBy string // + UpdateBy string // + CreateAt string // + UpdateAt string // + DeletedAt string // + Table string // source_id的数据对应的数据表 + Status string // 工作状态,0:未开始,1:进行中,2:已完成 + SourceType string + Cnt string +} + +var planWeekColumns = PlanWeekColumns{ + Id: "id", + ProjectId: "project_id", + SourceId: "source_id", + Name: "name", + Start: "start", + End: "end", + PlanName: "plan_name", + PlanId: "plan_id", + CreateBy: "create_by", + UpdateBy: "update_by", + CreateAt: "create_at", + UpdateAt: "update_at", + DeletedAt: "deleted_at", + Table: "table", + Status: "status", + SourceType: "source_type", + Cnt: "cnt", +} + +// NewPlanWeekDao creates and returns a new DAO object for table data access. +func NewPlanWeekDao() *PlanWeekDao { + return &PlanWeekDao{ + group: "default", + table: "plan_week", + columns: planWeekColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *PlanWeekDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *PlanWeekDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *PlanWeekDao) Columns() PlanWeekColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *PlanWeekDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *PlanWeekDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *PlanWeekDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/plan_week_reality.go b/internal/app/system/dao/internal/plan_week_reality.go new file mode 100644 index 0000000..94acf1e --- /dev/null +++ b/internal/app/system/dao/internal/plan_week_reality.go @@ -0,0 +1,108 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-17 17:23:07 +// 生成路径: internal/app/system/dao/internal/plan_week_reality.go +// 生成人:xyb +// desc:实际完成的周计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// PlanWeekRealityDao is the manager for logic model data accessing and custom defined data operations functions management. +type PlanWeekRealityDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns PlanWeekRealityColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// PlanWeekRealityColumns defines and stores column names for table plan_week_reality. +type PlanWeekRealityColumns struct { + Id string // + ProjectId string // 项目id + SourceId string // 资源id + Name string // 资源名称 + Start string // 开始时间 + End string // 结束时间 + PlanName string // 计划名称 + PlanId string // 周id + CreateBy string // + UpdateBy string // + CreateAt string // + UpdateAt string // + DeletedAt string // + Table string // source_id的数据对应的数据表 + Status string // 工作状态,0:未开始,1:进行中,2:已完成 + SourceType string // 资源类型 + Cnt string +} + +var planWeekRealityColumns = PlanWeekRealityColumns{ + Id: "id", + ProjectId: "project_id", + SourceId: "source_id", + Name: "name", + Start: "start", + End: "end", + PlanName: "plan_name", + PlanId: "plan_id", + CreateBy: "create_by", + UpdateBy: "update_by", + CreateAt: "create_at", + UpdateAt: "update_at", + DeletedAt: "deleted_at", + Table: "table", + Status: "status", + SourceType: "source_type", + Cnt: "cnt", +} + +// NewPlanWeekRealityDao creates and returns a new DAO object for table data access. +func NewPlanWeekRealityDao() *PlanWeekRealityDao { + return &PlanWeekRealityDao{ + group: "default", + table: "plan_week_reality", + columns: planWeekRealityColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *PlanWeekRealityDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *PlanWeekRealityDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *PlanWeekRealityDao) Columns() PlanWeekRealityColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *PlanWeekRealityDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *PlanWeekRealityDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *PlanWeekRealityDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/plant.go b/internal/app/system/dao/internal/plant.go new file mode 100644 index 0000000..1c3a62f --- /dev/null +++ b/internal/app/system/dao/internal/plant.go @@ -0,0 +1,144 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-04-12 10:38:43 +// 生成路径: internal/app/system/dao/internal/plant.go +// 生成人:gfast +// desc:电站信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// PlantDao is the manager for logic model data accessing and custom defined data operations functions management. +type PlantDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns PlantColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// PlantColumns defines and stores column names for table plant. +type PlantColumns struct { + Id string // 电站Id + Name string // 电站名称 + Address string // 详细地址 + City string // 市 + District string // 区 + Province string // 省 + Latitude string // 纬度 + Longitude string // 经度 + Kwp string // 总容量kwp + MonKwh string // 当月发电量 + NowKw string // 实时功率 + SumKwh string // 总发电量 + TodayKwh string // 当日发电量 + YearKwh string // 当年发电量 + NetworkTime string // 并网日期 + UpdateTime string // 修改时间 + CompanyId string // 渠道商Id + CompanyName string // 渠道商名称 + OwnerId string // 业主Id + OwnerName string // 业主姓名 + ServiceProviderName string // 安装商名称 + ServiceProviderPhone string // 安装服务商电话 + NetworkType string // 并网类型 1:全额上网 2:自发自用余电上网 3:自发自用无馈网 4:离网 + PowerPlantType string // 电站类型 1:家庭户用 2:工商业屋顶 3:地面电站 4:扶贫电站 5:储能电站 + Status string // 电站状态 0:未绑定 1:在线 2:停机 3:停机告警 4:运行告警 5:故障 6:离线 + PaymentType string // 出资方式 + PlantContact string // 电站联系人 + PlantContactPhone string // 电站联系人电话 + PlantImg string // 电站图片 + Remark string // 备注 + DipAngle string // 倾角度数 + OrientationAngle string // 方位角度数 + SubassemblyNumber string // 组件数量 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 +} + +var plantColumns = PlantColumns{ + Id: "id", + Name: "name", + Address: "address", + City: "city", + District: "district", + Province: "province", + Latitude: "latitude", + Longitude: "longitude", + Kwp: "kwp", + MonKwh: "monKwh", + NowKw: "nowKw", + SumKwh: "sumKwh", + TodayKwh: "todayKwh", + YearKwh: "yearKwh", + NetworkTime: "networkTime", + UpdateTime: "updateTime", + CompanyId: "companyId", + CompanyName: "companyName", + OwnerId: "ownerId", + OwnerName: "ownerName", + ServiceProviderName: "serviceProviderName", + ServiceProviderPhone: "serviceProviderPhone", + NetworkType: "networkType", + PowerPlantType: "powerPlantType", + Status: "status", + PaymentType: "paymentType", + PlantContact: "plantContact", + PlantContactPhone: "plantContactPhone", + PlantImg: "plantImg", + Remark: "remark", + DipAngle: "dipAngle", + OrientationAngle: "orientationAngle", + SubassemblyNumber: "subassemblyNumber", + CreatedAt: "created_at", + UpdatedAt: "updated_at", +} + +// NewPlantDao creates and returns a new DAO object for table data access. +func NewPlantDao() *PlantDao { + return &PlantDao{ + group: "default", + table: "plant", + columns: plantColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *PlantDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *PlantDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *PlantDao) Columns() PlantColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *PlantDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *PlantDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *PlantDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/project_finance.go b/internal/app/system/dao/internal/project_finance.go new file mode 100644 index 0000000..f8784bb --- /dev/null +++ b/internal/app/system/dao/internal/project_finance.go @@ -0,0 +1,104 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-04-29 12:01:01 +// 生成路径: internal/app/system/dao/internal/project_finance.go +// 生成人:gfast +// desc:项目财务 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// ProjectFinanceDao is the manager for logic model data accessing and custom defined data operations functions management. +type ProjectFinanceDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns ProjectFinanceColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// ProjectFinanceColumns defines and stores column names for table project_finance. +type ProjectFinanceColumns struct { + Id string // 主键 + ProjectId string // 项目ID + ContractAmount string // 承包合同金额 + SubcontractAmount string // 分包合同金额 + AmountReceived string // 已收款 + AmountPaid string // 已付款 + ExpensesReimbursed string // 已费用报销 + EstimatedGrossProfit string // 预计毛利润 + CurrentProfit string // 目前利润 + CurrentRemainingFunds string // 目前结余资金 + ProjectedIncreaseInRemainingFunds string // 至项目完成应增加的结余资金 + NetPresentValueOfProjectOperation string // 项目经营净现值 + CreatedAt string // 填报时间 + CreatedBy string // 填报人 + UpdatedAt string // 更新时间 +} + +var projectFinanceColumns = ProjectFinanceColumns{ + Id: "id", + ProjectId: "project_id", + ContractAmount: "contract_amount", + SubcontractAmount: "subcontract_amount", + AmountReceived: "amount_received", + AmountPaid: "amount_paid", + ExpensesReimbursed: "expenses_reimbursed", + EstimatedGrossProfit: "estimated_gross_profit", + CurrentProfit: "current_profit", + CurrentRemainingFunds: "current_remaining_funds", + ProjectedIncreaseInRemainingFunds: "projected_increase_in_remaining_funds", + NetPresentValueOfProjectOperation: "net_present_value_of_project_operation", + CreatedAt: "created_at", + CreatedBy: "created_by", + UpdatedAt: "updated_at", +} + +// NewProjectFinanceDao creates and returns a new DAO object for table data access. +func NewProjectFinanceDao() *ProjectFinanceDao { + return &ProjectFinanceDao{ + group: "default", + table: "project_finance", + columns: projectFinanceColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *ProjectFinanceDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *ProjectFinanceDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *ProjectFinanceDao) Columns() ProjectFinanceColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *ProjectFinanceDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *ProjectFinanceDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *ProjectFinanceDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/project_schedule.go b/internal/app/system/dao/internal/project_schedule.go new file mode 100644 index 0000000..9d46503 --- /dev/null +++ b/internal/app/system/dao/internal/project_schedule.go @@ -0,0 +1,87 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// ProjectScheduleDao is the data access object for table project_schedule. +type ProjectScheduleDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns ProjectScheduleColumns // columns contains all the column names of Table for convenient usage. +} + +// ProjectScheduleColumns defines and stores column names for table project_schedule. +type ProjectScheduleColumns struct { + Id string // + ParentId string // 设施ID + StartDate string // 开始时间 + EndDate string // 结束时间 + CreatedAt string // + Name string // 项目名 + PlaneNum string // 计划持有量 + Types string // 计划类型 +} + +// projectScheduleColumns holds the columns for table project_schedule. +var projectScheduleColumns = ProjectScheduleColumns{ + Id: "id", + ParentId: "parent_id", + StartDate: "start_date", + EndDate: "end_date", + CreatedAt: "created_at", + Name: "name", + PlaneNum: "plane_num", + Types: "types", +} + +// NewProjectScheduleDao creates and returns a new DAO object for table data access. +func NewProjectScheduleDao() *ProjectScheduleDao { + return &ProjectScheduleDao{ + group: "default", + table: "project_schedule", + columns: projectScheduleColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *ProjectScheduleDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *ProjectScheduleDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *ProjectScheduleDao) Columns() ProjectScheduleColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *ProjectScheduleDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *ProjectScheduleDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *ProjectScheduleDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/pv_module.go b/internal/app/system/dao/internal/pv_module.go new file mode 100644 index 0000000..ad65a22 --- /dev/null +++ b/internal/app/system/dao/internal/pv_module.go @@ -0,0 +1,95 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// PvModuleDao is the data access object for table pv_module. +type PvModuleDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns PvModuleColumns // columns contains all the column names of Table for convenient usage. +} + +// PvModuleColumns defines and stores column names for table pv_module. +type PvModuleColumns struct { + Id string // + FangzhenId string // 方阵ID + SubProjectid string // 子项目ID + WorkId string // 工作ID + Name string // 名字 + Status string // 状态 0未开始 1 进行中 2 已完成 + DoneTime string // 完成时间 + Detail string // 坐标详细信息 + Type string // 类型 + Tilt string // 标称倾角 + Azimuth string // 标称方位角 + DeviceId string // 设备编号 +} + +// pvModuleColumns holds the columns for table pv_module. +var pvModuleColumns = PvModuleColumns{ + Id: "id", + FangzhenId: "fangzhen_id", + SubProjectid: "sub_projectid", + WorkId: "work_id", + Name: "name", + Status: "status", + DoneTime: "done_time", + Detail: "detail", + Type: "type", + Tilt: "tilt", + Azimuth: "azimuth", + DeviceId: "device_id", +} + +// NewPvModuleDao creates and returns a new DAO object for table data access. +func NewPvModuleDao() *PvModuleDao { + return &PvModuleDao{ + group: "default", + table: "pv_module", + columns: pvModuleColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *PvModuleDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *PvModuleDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *PvModuleDao) Columns() PvModuleColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *PvModuleDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *PvModuleDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *PvModuleDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/qianqi_bubantu.go b/internal/app/system/dao/internal/qianqi_bubantu.go new file mode 100644 index 0000000..3b071a4 --- /dev/null +++ b/internal/app/system/dao/internal/qianqi_bubantu.go @@ -0,0 +1,94 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-07-31 11:44:41 +// 生成路径: internal/app/system/dao/internal/qianqi_bubantu.go +// 生成人:gfast +// desc:布板图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// QianqiBubantuDao is the manager for logic model data accessing and custom defined data operations functions management. +type QianqiBubantuDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns QianqiBubantuColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// QianqiBubantuColumns defines and stores column names for table qianqi_bubantu. +type QianqiBubantuColumns struct { + Id string // 序号 + ProjectId string // 项目id + Name string // 名称 + SourceId string // 资源ID + SourcePath string // 资源路径 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var qianqiBubantuColumns = QianqiBubantuColumns{ + Id: "id", + ProjectId: "project_id", + Name: "name", + SourceId: "source_id", + SourcePath: "source_path", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewQianqiBubantuDao creates and returns a new DAO object for table data access. +func NewQianqiBubantuDao() *QianqiBubantuDao { + return &QianqiBubantuDao{ + group: "default", + table: "qianqi_bubantu", + columns: qianqiBubantuColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *QianqiBubantuDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *QianqiBubantuDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *QianqiBubantuDao) Columns() QianqiBubantuColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *QianqiBubantuDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *QianqiBubantuDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *QianqiBubantuDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/qianqi_camera.go b/internal/app/system/dao/internal/qianqi_camera.go new file mode 100644 index 0000000..2da5380 --- /dev/null +++ b/internal/app/system/dao/internal/qianqi_camera.go @@ -0,0 +1,112 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-09-30 22:37:34 +// 生成路径: internal/app/system/dao/internal/qianqi_camera.go +// 生成人:gfast +// desc:摄像头 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// QianqiCameraDao is the manager for logic model data accessing and custom defined data operations functions management. +type QianqiCameraDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns QianqiCameraColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// QianqiCameraColumns defines and stores column names for table qianqi_camera. +type QianqiCameraColumns struct { + Id string // + CameraName string // 摄像头名称 + CameraCode string // 摄像头编码 + Detail string // 摄像头坐标信息 + ProjectId string // 项目id + Status string // 在线情况(1、在线,0、离线),字典on_line_status + Poster string // 封面图 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreateddAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + SourceType string // + Serial string // 国标id + Code string // 通道号 + Flv string // flv地址 + Hls string // hls地址 + Share string // 分享地址 + Rtc string // webrtc地址 +} + +var qianqiCameraColumns = QianqiCameraColumns{ + Id: "id", + CameraName: "camera_name", + CameraCode: "camera_code", + Detail: "detail", + ProjectId: "project_id", + Status: "status", + Poster: "poster", + CreateBy: "create_by", + UpdateBy: "update_by", + CreateddAt: "createdd_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + SourceType: "source_type", + Serial: "serial", + Code: "code", + Flv: "flv", + Hls: "hls", + Share: "share", + Rtc: "rtc", +} + +// NewQianqiCameraDao creates and returns a new DAO object for table data access. +func NewQianqiCameraDao() *QianqiCameraDao { + return &QianqiCameraDao{ + group: "default", + table: "qianqi_camera", + columns: qianqiCameraColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *QianqiCameraDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *QianqiCameraDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *QianqiCameraDao) Columns() QianqiCameraColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *QianqiCameraDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *QianqiCameraDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *QianqiCameraDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/qianqi_cameras.go b/internal/app/system/dao/internal/qianqi_cameras.go new file mode 100644 index 0000000..5f9f798 --- /dev/null +++ b/internal/app/system/dao/internal/qianqi_cameras.go @@ -0,0 +1,98 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-07-31 09:48:11 +// 生成路径: internal/app/system/dao/internal/qianqi_cameras.go +// 生成人:gfast +// desc:所有摄像头列 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// QianqiCamerasDao is the manager for logic model data accessing and custom defined data operations functions management. +type QianqiCamerasDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns QianqiCamerasColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// QianqiCamerasColumns defines and stores column names for table qianqi_cameras. +type QianqiCamerasColumns struct { + Id string // 序号 + CameraName string // 摄像头名称 + CameraCode string // 摄像头编码 + Detail string // 摄像头坐标信息 + ProjectId string // 项目id + Status string // 在线情况 + Poster string // 封面图 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var qianqiCamerasColumns = QianqiCamerasColumns{ + Id: "id", + CameraName: "camera_name", + CameraCode: "camera_code", + Detail: "detail", + ProjectId: "project_id", + Status: "status", + Poster: "poster", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewQianqiCamerasDao creates and returns a new DAO object for table data access. +func NewQianqiCamerasDao() *QianqiCamerasDao { + return &QianqiCamerasDao{ + group: "default", + table: "qianqi_cameras", + columns: qianqiCamerasColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *QianqiCamerasDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *QianqiCamerasDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *QianqiCamerasDao) Columns() QianqiCamerasColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *QianqiCamerasDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *QianqiCamerasDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *QianqiCamerasDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/qianqi_dixing.go b/internal/app/system/dao/internal/qianqi_dixing.go new file mode 100644 index 0000000..4e555b6 --- /dev/null +++ b/internal/app/system/dao/internal/qianqi_dixing.go @@ -0,0 +1,94 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-07-31 11:44:56 +// 生成路径: internal/app/system/dao/internal/qianqi_dixing.go +// 生成人:gfast +// desc:地形 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// QianqiDixingDao is the manager for logic model data accessing and custom defined data operations functions management. +type QianqiDixingDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns QianqiDixingColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// QianqiDixingColumns defines and stores column names for table qianqi_dixing. +type QianqiDixingColumns struct { + Id string // 序号 + ProjectId string // 项目id + Name string // 名称 + SourceId string // 资源ID + SourcePath string // 资源路径 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var qianqiDixingColumns = QianqiDixingColumns{ + Id: "id", + ProjectId: "project_id", + Name: "name", + SourceId: "source_id", + SourcePath: "source_path", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewQianqiDixingDao creates and returns a new DAO object for table data access. +func NewQianqiDixingDao() *QianqiDixingDao { + return &QianqiDixingDao{ + group: "default", + table: "qianqi_dixing", + columns: qianqiDixingColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *QianqiDixingDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *QianqiDixingDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *QianqiDixingDao) Columns() QianqiDixingColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *QianqiDixingDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *QianqiDixingDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *QianqiDixingDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/qianqi_fangzhen.go b/internal/app/system/dao/internal/qianqi_fangzhen.go new file mode 100644 index 0000000..aa42f16 --- /dev/null +++ b/internal/app/system/dao/internal/qianqi_fangzhen.go @@ -0,0 +1,99 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// QianqiFangzhenDao is the data access object for table qianqi_fangzhen. +type QianqiFangzhenDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns QianqiFangzhenColumns // columns contains all the column names of Table for convenient usage. +} + +// QianqiFangzhenColumns defines and stores column names for table qianqi_fangzhen. +type QianqiFangzhenColumns struct { + Id string // + ProjectId string // 项目id + Name string // + SourceId string // + SourcePath string // + XiangbianId string // 箱变id + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + Detail string // 坐标信息 + SourceType string // + View string // 每个方阵的视角 +} + +// qianqiFangzhenColumns holds the columns for table qianqi_fangzhen. +var qianqiFangzhenColumns = QianqiFangzhenColumns{ + Id: "id", + ProjectId: "project_id", + Name: "name", + SourceId: "source_id", + SourcePath: "source_path", + XiangbianId: "xiangbian_id", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + Detail: "detail", + SourceType: "source_type", + View: "view", +} + +// NewQianqiFangzhenDao creates and returns a new DAO object for table data access. +func NewQianqiFangzhenDao() *QianqiFangzhenDao { + return &QianqiFangzhenDao{ + group: "default", + table: "qianqi_fangzhen", + columns: qianqiFangzhenColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *QianqiFangzhenDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *QianqiFangzhenDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *QianqiFangzhenDao) Columns() QianqiFangzhenColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *QianqiFangzhenDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *QianqiFangzhenDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *QianqiFangzhenDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/qianqi_guangfuban.go b/internal/app/system/dao/internal/qianqi_guangfuban.go new file mode 100644 index 0000000..c76b30c --- /dev/null +++ b/internal/app/system/dao/internal/qianqi_guangfuban.go @@ -0,0 +1,102 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-07-31 11:31:49 +// 生成路径: internal/app/system/dao/internal/qianqi_guangfuban.go +// 生成人:gfast +// desc:光伏板模型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// QianqiGuangfubanDao is the manager for logic model data accessing and custom defined data operations functions management. +type QianqiGuangfubanDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns QianqiGuangfubanColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// QianqiGuangfubanColumns defines and stores column names for table qianqi_guangfuban. +type QianqiGuangfubanColumns struct { + Id string // 序号 + ProjectId string // 项目id + Name string // 倾斜模型 + SourcePath string // 资源路径 + Detail string // 坐标信息等 + SourceId string // 资源id + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + Zuchuan_path string + Src_point string + SourceType string +} + +var qianqiGuangfubanColumns = QianqiGuangfubanColumns{ + Id: "id", + ProjectId: "project_id", + Name: "name", + SourcePath: "source_path", + SourceType: "source_type", + Detail: "detail", + SourceId: "source_id", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + Zuchuan_path: "zuchuan_path", + Src_point: "src_point", +} + +// NewQianqiGuangfubanDao creates and returns a new DAO object for table data access. +func NewQianqiGuangfubanDao() *QianqiGuangfubanDao { + return &QianqiGuangfubanDao{ + group: "default", + table: "qianqi_guangfuban", + columns: qianqiGuangfubanColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *QianqiGuangfubanDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *QianqiGuangfubanDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *QianqiGuangfubanDao) Columns() QianqiGuangfubanColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *QianqiGuangfubanDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *QianqiGuangfubanDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *QianqiGuangfubanDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/qianqi_guangfuban_ids.go b/internal/app/system/dao/internal/qianqi_guangfuban_ids.go new file mode 100644 index 0000000..715d90f --- /dev/null +++ b/internal/app/system/dao/internal/qianqi_guangfuban_ids.go @@ -0,0 +1,102 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-05 16:00:23 +// 生成路径: internal/app/system/dao/internal/qianqi_guangfuban_ids.go +// 生成人:gfast +// desc:光伏板模型的id +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// QianqiGuangfubanIdsDao is the manager for logic model data accessing and custom defined data operations functions management. +type QianqiGuangfubanIdsDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns QianqiGuangfubanIdsColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// QianqiGuangfubanIdsColumns defines and stores column names for table qianqi_guangfuban_ids. +type QianqiGuangfubanIdsColumns struct { + Id string // + Name string // 名称 + DevId string // 光伏板模型的id + DevType string // 光伏板、支架类型 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + SourceType string // + SourceId string // 资源id + ProjectId string // 项目id + Sphere string + Range string +} + +var qianqiGuangfubanIdsColumns = QianqiGuangfubanIdsColumns{ + Id: "id", + Name: "name", + DevId: "dev_id", + DevType: "dev_type", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + SourceType: "source_type", + SourceId: "source_id", + ProjectId: "project_id", + Sphere: "sphere", + Range: "range", +} + +// NewQianqiGuangfubanIdsDao creates and returns a new DAO object for table data access. +func NewQianqiGuangfubanIdsDao() *QianqiGuangfubanIdsDao { + return &QianqiGuangfubanIdsDao{ + group: "default", + table: "qianqi_guangfuban_ids", + columns: qianqiGuangfubanIdsColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *QianqiGuangfubanIdsDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *QianqiGuangfubanIdsDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *QianqiGuangfubanIdsDao) Columns() QianqiGuangfubanIdsColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *QianqiGuangfubanIdsDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *QianqiGuangfubanIdsDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *QianqiGuangfubanIdsDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/qianqi_guangfuban_ids_lizhu.go b/internal/app/system/dao/internal/qianqi_guangfuban_ids_lizhu.go new file mode 100644 index 0000000..6730454 --- /dev/null +++ b/internal/app/system/dao/internal/qianqi_guangfuban_ids_lizhu.go @@ -0,0 +1,99 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// QianqiGuangfubanIdsLizhuDao is the data access object for table qianqi_guangfuban_ids_lizhu. +type QianqiGuangfubanIdsLizhuDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns QianqiGuangfubanIdsLizhuColumns // columns contains all the column names of Table for convenient usage. +} + +// QianqiGuangfubanIdsLizhuColumns defines and stores column names for table qianqi_guangfuban_ids_lizhu. +type QianqiGuangfubanIdsLizhuColumns struct { + Id string // + Name string // 名称 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + SourceType string // + SourceId string // 资源id + ProjectId string // 项目id + Status string // 状态:0:未完成;1:计划中;2:已完成 + Detail string // 坐标信息 + SubProjectid string // 子项目ID + FangzhenId string // 方阵ID +} + +// qianqiGuangfubanIdsLizhuColumns holds the columns for table qianqi_guangfuban_ids_lizhu. +var qianqiGuangfubanIdsLizhuColumns = QianqiGuangfubanIdsLizhuColumns{ + Id: "id", + Name: "name", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + SourceType: "source_type", + SourceId: "source_id", + ProjectId: "project_id", + Status: "status", + Detail: "detail", + SubProjectid: "sub_projectid", + FangzhenId: "fangzhen_id", +} + +// NewQianqiGuangfubanIdsLizhuDao creates and returns a new DAO object for table data access. +func NewQianqiGuangfubanIdsLizhuDao() *QianqiGuangfubanIdsLizhuDao { + return &QianqiGuangfubanIdsLizhuDao{ + group: "default", + table: "qianqi_guangfuban_ids_lizhu", + columns: qianqiGuangfubanIdsLizhuColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *QianqiGuangfubanIdsLizhuDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *QianqiGuangfubanIdsLizhuDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *QianqiGuangfubanIdsLizhuDao) Columns() QianqiGuangfubanIdsLizhuColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *QianqiGuangfubanIdsLizhuDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *QianqiGuangfubanIdsLizhuDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *QianqiGuangfubanIdsLizhuDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/qianqi_guangfuban_ids_zhijia.go b/internal/app/system/dao/internal/qianqi_guangfuban_ids_zhijia.go new file mode 100644 index 0000000..2aa710f --- /dev/null +++ b/internal/app/system/dao/internal/qianqi_guangfuban_ids_zhijia.go @@ -0,0 +1,99 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// QianqiGuangfubanIdsZhijiaDao is the data access object for table qianqi_guangfuban_ids_zhijia. +type QianqiGuangfubanIdsZhijiaDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns QianqiGuangfubanIdsZhijiaColumns // columns contains all the column names of Table for convenient usage. +} + +// QianqiGuangfubanIdsZhijiaColumns defines and stores column names for table qianqi_guangfuban_ids_zhijia. +type QianqiGuangfubanIdsZhijiaColumns struct { + Id string // + Name string // 名称 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + SourceType string // + SourceId string // 资源id + ProjectId string // 项目id + Status string // 状态:0:未完成;1:计划中;2:已完成 + Detail string // 坐标信息 + SubProjectid string // 子项目ID + FangzhenId string // 方阵ID +} + +// qianqiGuangfubanIdsZhijiaColumns holds the columns for table qianqi_guangfuban_ids_zhijia. +var qianqiGuangfubanIdsZhijiaColumns = QianqiGuangfubanIdsZhijiaColumns{ + Id: "id", + Name: "name", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + SourceType: "source_type", + SourceId: "source_id", + ProjectId: "project_id", + Status: "status", + Detail: "detail", + SubProjectid: "sub_projectid", + FangzhenId: "fangzhen_id", +} + +// NewQianqiGuangfubanIdsZhijiaDao creates and returns a new DAO object for table data access. +func NewQianqiGuangfubanIdsZhijiaDao() *QianqiGuangfubanIdsZhijiaDao { + return &QianqiGuangfubanIdsZhijiaDao{ + group: "default", + table: "qianqi_guangfuban_ids_zhijia", + columns: qianqiGuangfubanIdsZhijiaColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *QianqiGuangfubanIdsZhijiaDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *QianqiGuangfubanIdsZhijiaDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *QianqiGuangfubanIdsZhijiaDao) Columns() QianqiGuangfubanIdsZhijiaColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *QianqiGuangfubanIdsZhijiaDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *QianqiGuangfubanIdsZhijiaDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *QianqiGuangfubanIdsZhijiaDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/qianqi_guangfuban_ids_zhuangdian.go b/internal/app/system/dao/internal/qianqi_guangfuban_ids_zhuangdian.go new file mode 100644 index 0000000..e0971f8 --- /dev/null +++ b/internal/app/system/dao/internal/qianqi_guangfuban_ids_zhuangdian.go @@ -0,0 +1,99 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// QianqiGuangfubanIdsZhuangdianDao is the data access object for table qianqi_guangfuban_ids_zhuangdian. +type QianqiGuangfubanIdsZhuangdianDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns QianqiGuangfubanIdsZhuangdianColumns // columns contains all the column names of Table for convenient usage. +} + +// QianqiGuangfubanIdsZhuangdianColumns defines and stores column names for table qianqi_guangfuban_ids_zhuangdian. +type QianqiGuangfubanIdsZhuangdianColumns struct { + Id string // + Name string // 名称 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + SourceType string // + SourceId string // 资源id + ProjectId string // 项目id + Status string // 状态:0:未完成;1:计划中;2:已完成 + Detail string // 坐标信息 + SubProjectid string // 子项目ID + FangzhenId string // 方阵ID +} + +// qianqiGuangfubanIdsZhuangdianColumns holds the columns for table qianqi_guangfuban_ids_zhuangdian. +var qianqiGuangfubanIdsZhuangdianColumns = QianqiGuangfubanIdsZhuangdianColumns{ + Id: "id", + Name: "name", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + SourceType: "source_type", + SourceId: "source_id", + ProjectId: "project_id", + Status: "status", + Detail: "detail", + SubProjectid: "sub_projectid", + FangzhenId: "fangzhen_id", +} + +// NewQianqiGuangfubanIdsZhuangdianDao creates and returns a new DAO object for table data access. +func NewQianqiGuangfubanIdsZhuangdianDao() *QianqiGuangfubanIdsZhuangdianDao { + return &QianqiGuangfubanIdsZhuangdianDao{ + group: "default", + table: "qianqi_guangfuban_ids_zhuangdian", + columns: qianqiGuangfubanIdsZhuangdianColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *QianqiGuangfubanIdsZhuangdianDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *QianqiGuangfubanIdsZhuangdianDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *QianqiGuangfubanIdsZhuangdianDao) Columns() QianqiGuangfubanIdsZhuangdianColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *QianqiGuangfubanIdsZhuangdianDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *QianqiGuangfubanIdsZhuangdianDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *QianqiGuangfubanIdsZhuangdianDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/qianqi_guangfuban_zuchuan.go b/internal/app/system/dao/internal/qianqi_guangfuban_zuchuan.go new file mode 100644 index 0000000..8794769 --- /dev/null +++ b/internal/app/system/dao/internal/qianqi_guangfuban_zuchuan.go @@ -0,0 +1,96 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-17 10:37:21 +// 生成路径: internal/app/system/dao/internal/qianqi_guangfuban_zuchuan.go +// 生成人:xyb +// desc:组串 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// QianqiGuangfubanZuchuanDao is the manager for logic model data accessing and custom defined data operations functions management. +type QianqiGuangfubanZuchuanDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns QianqiGuangfubanZuchuanColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// QianqiGuangfubanZuchuanColumns defines and stores column names for table qianqi_guangfuban_zuchuan. +type QianqiGuangfubanZuchuanColumns struct { + Id string // + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + SourceType string // + SourceId string // 资源id,为project_id拼接上组串编号 + ProjectId string // 项目id + ZuchuanId string // 组串编号 + GuangfubanId string // 光伏板模型的id +} + +var qianqiGuangfubanZuchuanColumns = QianqiGuangfubanZuchuanColumns{ + Id: "id", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + SourceType: "source_type", + SourceId: "source_id", + ProjectId: "project_id", + ZuchuanId: "zuchuan_id", + GuangfubanId: "guangfuban_id", +} + +// NewQianqiGuangfubanZuchuanDao creates and returns a new DAO object for table data access. +func NewQianqiGuangfubanZuchuanDao() *QianqiGuangfubanZuchuanDao { + return &QianqiGuangfubanZuchuanDao{ + group: "default", + table: "qianqi_guangfuban_zuchuan", + columns: qianqiGuangfubanZuchuanColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *QianqiGuangfubanZuchuanDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *QianqiGuangfubanZuchuanDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *QianqiGuangfubanZuchuanDao) Columns() QianqiGuangfubanZuchuanColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *QianqiGuangfubanZuchuanDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *QianqiGuangfubanZuchuanDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *QianqiGuangfubanZuchuanDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/qianqi_jidianxianlu.go b/internal/app/system/dao/internal/qianqi_jidianxianlu.go new file mode 100644 index 0000000..50666cb --- /dev/null +++ b/internal/app/system/dao/internal/qianqi_jidianxianlu.go @@ -0,0 +1,98 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-04 16:29:44 +// 生成路径: internal/app/system/dao/internal/qianqi_jidianxianlu.go +// 生成人:gfast +// desc:集电线路 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// QianqiJidianxianluDao is the manager for logic model data accessing and custom defined data operations functions management. +type QianqiJidianxianluDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns QianqiJidianxianluColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// QianqiJidianxianluColumns defines and stores column names for table qianqi_jidianxianlu. +type QianqiJidianxianluColumns struct { + Id string // 序号 + ProjectId string // 项目id + Name string // 线路名称 + SourceId string // 资源id + SourcePath string // 资源路径 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + SourceType string // 资源类型 + Detail string +} + +var qianqiJidianxianluColumns = QianqiJidianxianluColumns{ + Id: "id", + ProjectId: "project_id", + Name: "name", + SourceId: "source_id", + SourcePath: "source_path", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + SourceType: "source_type", + Detail: "detail", +} + +// NewQianqiJidianxianluDao creates and returns a new DAO object for table data access. +func NewQianqiJidianxianluDao() *QianqiJidianxianluDao { + return &QianqiJidianxianluDao{ + group: "default", + table: "qianqi_jidianxianlu", + columns: qianqiJidianxianluColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *QianqiJidianxianluDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *QianqiJidianxianluDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *QianqiJidianxianluDao) Columns() QianqiJidianxianluColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *QianqiJidianxianluDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *QianqiJidianxianluDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *QianqiJidianxianluDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/qianqi_moxing.go b/internal/app/system/dao/internal/qianqi_moxing.go new file mode 100644 index 0000000..0eb900b --- /dev/null +++ b/internal/app/system/dao/internal/qianqi_moxing.go @@ -0,0 +1,96 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-07-31 11:09:26 +// 生成路径: internal/app/system/dao/internal/qianqi_moxing.go +// 生成人:gfast +// desc:倾斜模型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// QianqiMoxingDao is the manager for logic model data accessing and custom defined data operations functions management. +type QianqiMoxingDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns QianqiMoxingColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// QianqiMoxingColumns defines and stores column names for table qianqi_moxing. +type QianqiMoxingColumns struct { + Id string // 序号 + ProjectId string // 项目id + Name string // 倾斜模型 + SourcePath string // 资源路径 + Detail string // 坐标信息等 + SourceId string // 资源id + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var qianqiMoxingColumns = QianqiMoxingColumns{ + Id: "id", + ProjectId: "project_id", + Name: "name", + SourcePath: "source_path", + Detail: "detail", + SourceId: "source_id", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewQianqiMoxingDao creates and returns a new DAO object for table data access. +func NewQianqiMoxingDao() *QianqiMoxingDao { + return &QianqiMoxingDao{ + group: "default", + table: "qianqi_moxing", + columns: qianqiMoxingColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *QianqiMoxingDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *QianqiMoxingDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *QianqiMoxingDao) Columns() QianqiMoxingColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *QianqiMoxingDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *QianqiMoxingDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *QianqiMoxingDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/qianqi_nibianqi.go b/internal/app/system/dao/internal/qianqi_nibianqi.go new file mode 100644 index 0000000..2310545 --- /dev/null +++ b/internal/app/system/dao/internal/qianqi_nibianqi.go @@ -0,0 +1,98 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-07-31 09:40:17 +// 生成路径: internal/app/system/dao/internal/qianqi_nibianqi.go +// 生成人:gfast +// desc:逆变器 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// QianqiNibianqiDao is the manager for logic model data accessing and custom defined data operations functions management. +type QianqiNibianqiDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns QianqiNibianqiColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// QianqiNibianqiColumns defines and stores column names for table qianqi_nibianqi. +type QianqiNibianqiColumns struct { + Id string // 序号 + ProjectId string // 项目id + Name string // 名称 + SourceId string // 资源id + ModelId string // 模型id + Detail string // 地图上的参数信息 + Xiangbianid string // 箱变id + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var qianqiNibianqiColumns = QianqiNibianqiColumns{ + Id: "id", + ProjectId: "project_id", + Name: "name", + SourceId: "source_id", + ModelId: "model_id", + Detail: "detail", + Xiangbianid: "xiangbianid", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewQianqiNibianqiDao creates and returns a new DAO object for table data access. +func NewQianqiNibianqiDao() *QianqiNibianqiDao { + return &QianqiNibianqiDao{ + group: "default", + table: "qianqi_nibianqi", + columns: qianqiNibianqiColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *QianqiNibianqiDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *QianqiNibianqiDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *QianqiNibianqiDao) Columns() QianqiNibianqiColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *QianqiNibianqiDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *QianqiNibianqiDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *QianqiNibianqiDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/qianqi_pingchang.go b/internal/app/system/dao/internal/qianqi_pingchang.go new file mode 100644 index 0000000..adb7565 --- /dev/null +++ b/internal/app/system/dao/internal/qianqi_pingchang.go @@ -0,0 +1,110 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-08 10:08:24 +// 生成路径: internal/app/system/dao/internal/qianqi_pingchang.go +// 生成人:gfast +// desc:平场数据 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// QianqiPingchangDao is the manager for logic model data accessing and custom defined data operations functions management. +type QianqiPingchangDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns QianqiPingchangColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// QianqiPingchangColumns defines and stores column names for table qianqi_pingchang. +type QianqiPingchangColumns struct { + Id string // + CreateAt string // + UpdateAt string // + DeleteAt string // + ProjectId string // '项目id' + PcId string // '平场id' + PcName string // '平场范围名称' + GridWidth string // '采点精度' + Progress string // '计算进度' + Range string // '平场范围' + Points string // '平滑处理前的高程点' + SmoothPoints string // '平滑处理后的高程点' + Shp string // '经过计算生成的shp文件' + Area string // '面积' + Cut string // '挖方' + Fill string // '填方' + Total string // '挖填平衡值' + Imported string // '是否为导入的值' +} + +var qianqiPingchangColumns = QianqiPingchangColumns{ + Id: "id", + CreateAt: "create_at", + UpdateAt: "update_at", + DeleteAt: "delete_at", + ProjectId: "project_id", + PcId: "pc_id", + PcName: "pc_name", + GridWidth: "grid_width", + Progress: "progress", + Range: "range", + Points: "points", + SmoothPoints: "smooth_points", + Shp: "shp", + Area: "area", + Cut: "cut", + Fill: "fill", + Total: "total", + Imported: "imported", +} + +// NewQianqiPingchangDao creates and returns a new DAO object for table data access. +func NewQianqiPingchangDao() *QianqiPingchangDao { + return &QianqiPingchangDao{ + group: "default", + table: "qianqi_pingchang", + columns: qianqiPingchangColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *QianqiPingchangDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *QianqiPingchangDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *QianqiPingchangDao) Columns() QianqiPingchangColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *QianqiPingchangDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *QianqiPingchangDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *QianqiPingchangDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/qianqi_redline.go b/internal/app/system/dao/internal/qianqi_redline.go new file mode 100644 index 0000000..474e94b --- /dev/null +++ b/internal/app/system/dao/internal/qianqi_redline.go @@ -0,0 +1,94 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-07-31 11:45:12 +// 生成路径: internal/app/system/dao/internal/qianqi_redline.go +// 生成人:gfast +// desc:红线 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// QianqiRedlineDao is the manager for logic model data accessing and custom defined data operations functions management. +type QianqiRedlineDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns QianqiRedlineColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// QianqiRedlineColumns defines and stores column names for table qianqi_redline. +type QianqiRedlineColumns struct { + Id string // 序号 + ProjectId string // 项目id + Name string // 名称 + SourceId string // 资源ID + SourcePath string // 资源路径 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var qianqiRedlineColumns = QianqiRedlineColumns{ + Id: "id", + ProjectId: "project_id", + Name: "name", + SourceId: "source_id", + SourcePath: "source_path", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewQianqiRedlineDao creates and returns a new DAO object for table data access. +func NewQianqiRedlineDao() *QianqiRedlineDao { + return &QianqiRedlineDao{ + group: "default", + table: "qianqi_redline", + columns: qianqiRedlineColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *QianqiRedlineDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *QianqiRedlineDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *QianqiRedlineDao) Columns() QianqiRedlineColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *QianqiRedlineDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *QianqiRedlineDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *QianqiRedlineDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/qianqi_redline_tudiliuzhuan.go b/internal/app/system/dao/internal/qianqi_redline_tudiliuzhuan.go new file mode 100644 index 0000000..8b953f8 --- /dev/null +++ b/internal/app/system/dao/internal/qianqi_redline_tudiliuzhuan.go @@ -0,0 +1,96 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-04 11:47:15 +// 生成路径: internal/app/system/dao/internal/qianqi_redline_tudiliuzhuan.go +// 生成人:gfast +// desc:土地流转 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// QianqiRedlineTudiliuzhuanDao is the manager for logic model data accessing and custom defined data operations functions management. +type QianqiRedlineTudiliuzhuanDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns QianqiRedlineTudiliuzhuanColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// QianqiRedlineTudiliuzhuanColumns defines and stores column names for table qianqi_redline_tudiliuzhuan. +type QianqiRedlineTudiliuzhuanColumns struct { + Id string // 序号 + ProjectId string // 项目id + Name string // 红线名称 + SourceId string // 资源id + SourcePath string // 资源路径 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + SourceType string // +} + +var qianqiRedlineTudiliuzhuanColumns = QianqiRedlineTudiliuzhuanColumns{ + Id: "id", + ProjectId: "project_id", + Name: "name", + SourceId: "source_id", + SourcePath: "source_path", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + SourceType: "source_type", +} + +// NewQianqiRedlineTudiliuzhuanDao creates and returns a new DAO object for table data access. +func NewQianqiRedlineTudiliuzhuanDao() *QianqiRedlineTudiliuzhuanDao { + return &QianqiRedlineTudiliuzhuanDao{ + group: "default", + table: "qianqi_redline_tudiliuzhuan", + columns: qianqiRedlineTudiliuzhuanColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *QianqiRedlineTudiliuzhuanDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *QianqiRedlineTudiliuzhuanDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *QianqiRedlineTudiliuzhuanDao) Columns() QianqiRedlineTudiliuzhuanColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *QianqiRedlineTudiliuzhuanDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *QianqiRedlineTudiliuzhuanDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *QianqiRedlineTudiliuzhuanDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/qianqi_road.go b/internal/app/system/dao/internal/qianqi_road.go new file mode 100644 index 0000000..74678e2 --- /dev/null +++ b/internal/app/system/dao/internal/qianqi_road.go @@ -0,0 +1,98 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-04 16:24:38 +// 生成路径: internal/app/system/dao/internal/qianqi_road.go +// 生成人:gfast +// desc:道路 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// QianqiRoadDao is the manager for logic model data accessing and custom defined data operations functions management. +type QianqiRoadDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns QianqiRoadColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// QianqiRoadColumns defines and stores column names for table qianqi_road. +type QianqiRoadColumns struct { + Id string // 序号 + ProjectId string // 项目id + Name string // 名称 + SourceId string // 资源id + SourcePath string // 资源路径 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + SourceType string // 资源类型 + Detail string // 坐标信息 +} + +var qianqiRoadColumns = QianqiRoadColumns{ + Id: "id", + ProjectId: "project_id", + Name: "name", + SourceId: "source_id", + SourcePath: "source_path", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + SourceType: "source_type", + Detail: "detail", +} + +// NewQianqiRoadDao creates and returns a new DAO object for table data access. +func NewQianqiRoadDao() *QianqiRoadDao { + return &QianqiRoadDao{ + group: "default", + table: "qianqi_road", + columns: qianqiRoadColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *QianqiRoadDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *QianqiRoadDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *QianqiRoadDao) Columns() QianqiRoadColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *QianqiRoadDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *QianqiRoadDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *QianqiRoadDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/qianqi_xiangbian.go b/internal/app/system/dao/internal/qianqi_xiangbian.go new file mode 100644 index 0000000..14104dd --- /dev/null +++ b/internal/app/system/dao/internal/qianqi_xiangbian.go @@ -0,0 +1,96 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-07-31 09:52:13 +// 生成路径: internal/app/system/dao/internal/qianqi_xiangbian.go +// 生成人:gfast +// desc:箱变 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// QianqiXiangbianDao is the manager for logic model data accessing and custom defined data operations functions management. +type QianqiXiangbianDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns QianqiXiangbianColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// QianqiXiangbianColumns defines and stores column names for table qianqi_xiangbian. +type QianqiXiangbianColumns struct { + Id string // 序号 + ProjectId string // 项目id + Name string // 名称 + SourceId string // 资源ID + ModelId string // 模型ID + Detail string // 详情 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var qianqiXiangbianColumns = QianqiXiangbianColumns{ + Id: "id", + ProjectId: "project_id", + Name: "name", + SourceId: "source_id", + ModelId: "model_id", + Detail: "detail", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewQianqiXiangbianDao creates and returns a new DAO object for table data access. +func NewQianqiXiangbianDao() *QianqiXiangbianDao { + return &QianqiXiangbianDao{ + group: "default", + table: "qianqi_xiangbian", + columns: qianqiXiangbianColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *QianqiXiangbianDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *QianqiXiangbianDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *QianqiXiangbianDao) Columns() QianqiXiangbianColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *QianqiXiangbianDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *QianqiXiangbianDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *QianqiXiangbianDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/reminders.go b/internal/app/system/dao/internal/reminders.go new file mode 100644 index 0000000..ed2c1cd --- /dev/null +++ b/internal/app/system/dao/internal/reminders.go @@ -0,0 +1,91 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// RemindersDao is the data access object for table reminders. +type RemindersDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns RemindersColumns // columns contains all the column names of Table for convenient usage. +} + +// RemindersColumns defines and stores column names for table reminders. +type RemindersColumns struct { + Id string // + UserId string // 消息接收者ID + ReminderType string // 提醒类型 0 安全整改 | 1 质量整改 | 2 AI | 3 钉钉上班 | 4 钉钉下班 + Title string // 标题 + ViolationType string // 违章类型 + ProjectId string // 项目ID + CreatedAt string // + IsRead string // 0 未读 | 1 已读 + Status string // 0 提醒 | 1 整改 | 2 复检 + OrderId string // 对应跳转的主键ID +} + +// remindersColumns holds the columns for table reminders. +var remindersColumns = RemindersColumns{ + Id: "id", + UserId: "user_id", + ReminderType: "reminder_type", + Title: "title", + ViolationType: "violation_type", + ProjectId: "project_id", + CreatedAt: "created_at", + IsRead: "is_read", + Status: "status", + OrderId: "order_id", +} + +// NewRemindersDao creates and returns a new DAO object for table data access. +func NewRemindersDao() *RemindersDao { + return &RemindersDao{ + group: "default", + table: "reminders", + columns: remindersColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *RemindersDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *RemindersDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *RemindersDao) Columns() RemindersColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *RemindersDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *RemindersDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *RemindersDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/sub_project.go b/internal/app/system/dao/internal/sub_project.go new file mode 100644 index 0000000..6129f96 --- /dev/null +++ b/internal/app/system/dao/internal/sub_project.go @@ -0,0 +1,81 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SubProjectDao is the data access object for table sub_project. +type SubProjectDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns SubProjectColumns // columns contains all the column names of Table for convenient usage. +} + +// SubProjectColumns defines and stores column names for table sub_project. +type SubProjectColumns struct { + Id string // 主键ID + ProjectId string // 项目ID + ProjectName string // 子项目名 + CreatedAt string // + DoneTime string // 结束日期 +} + +// subProjectColumns holds the columns for table sub_project. +var subProjectColumns = SubProjectColumns{ + Id: "id", + ProjectId: "project_id", + ProjectName: "project_name", + CreatedAt: "created_at", + DoneTime: "done_time", +} + +// NewSubProjectDao creates and returns a new DAO object for table data access. +func NewSubProjectDao() *SubProjectDao { + return &SubProjectDao{ + group: "default", + table: "sub_project", + columns: subProjectColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SubProjectDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SubProjectDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SubProjectDao) Columns() SubProjectColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SubProjectDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SubProjectDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SubProjectDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/sys_auth_rule.go b/internal/app/system/dao/internal/sys_auth_rule.go new file mode 100644 index 0000000..0aa5a05 --- /dev/null +++ b/internal/app/system/dao/internal/sys_auth_rule.go @@ -0,0 +1,114 @@ +// ========================================================================== +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysAuthRuleDao is the data access object for table sys_auth_rule. +type SysAuthRuleDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns SysAuthRuleColumns // columns contains all the column names of Table for convenient usage. +} + +// SysAuthRuleColumns defines and stores column names for table sys_auth_rule. +type SysAuthRuleColumns struct { + Id string // + Pid string // 父ID + Name string // 规则名称 + Title string // 规则名称 + Icon string // 图标 + Condition string // 条件 + Remark string // 备注 + MenuType string // 类型 0目录 1菜单 2按钮 + Weigh string // 权重 + IsHide string // 显示状态 + Path string // 路由地址 + Component string // 组件路径 + IsLink string // 是否外链 1是 0否 + ModuleType string // 所属模块 + ModelId string // 模型ID + IsIframe string // 是否内嵌iframe + IsCached string // 是否缓存 + Redirect string // 路由重定向地址 + IsAffix string // 是否固定 + LinkUrl string // 链接地址 + CreatedAt string // 创建日期 + UpdatedAt string // 修改日期 +} + +// sysAuthRuleColumns holds the columns for table sys_auth_rule. +var sysAuthRuleColumns = SysAuthRuleColumns{ + Id: "id", + Pid: "pid", + Name: "name", + Title: "title", + Icon: "icon", + Condition: "condition", + Remark: "remark", + MenuType: "menu_type", + Weigh: "weigh", + IsHide: "is_hide", + Path: "path", + Component: "component", + IsLink: "is_link", + ModuleType: "module_type", + ModelId: "model_id", + IsIframe: "is_iframe", + IsCached: "is_cached", + Redirect: "redirect", + IsAffix: "is_affix", + LinkUrl: "link_url", + CreatedAt: "created_at", + UpdatedAt: "updated_at", +} + +// NewSysAuthRuleDao creates and returns a new DAO object for table data access. +func NewSysAuthRuleDao() *SysAuthRuleDao { + return &SysAuthRuleDao{ + group: "default", + table: "sys_auth_rule", + columns: sysAuthRuleColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysAuthRuleDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysAuthRuleDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysAuthRuleDao) Columns() SysAuthRuleColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysAuthRuleDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysAuthRuleDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysAuthRuleDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/sys_dept.go b/internal/app/system/dao/internal/sys_dept.go new file mode 100644 index 0000000..ca166b7 --- /dev/null +++ b/internal/app/system/dao/internal/sys_dept.go @@ -0,0 +1,98 @@ +// ========================================================================== +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysDeptDao is the data access object for table sys_dept. +type SysDeptDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns SysDeptColumns // columns contains all the column names of Table for convenient usage. +} + +// SysDeptColumns defines and stores column names for table sys_dept. +type SysDeptColumns struct { + DeptId string // 部门id + ParentId string // 父部门id + Ancestors string // 祖级列表 + DeptName string // 部门名称 + OrderNum string // 显示顺序 + Leader string // 负责人 + Phone string // 联系电话 + Email string // 邮箱 + Status string // 部门状态(0正常 1停用) + CreatedBy string // 创建人 + UpdatedBy string // 修改人 + CreatedAt string // 创建时间 + UpdatedAt string // 修改时间 + DeletedAt string // 删除时间 +} + +// sysDeptColumns holds the columns for table sys_dept. +var sysDeptColumns = SysDeptColumns{ + DeptId: "dept_id", + ParentId: "parent_id", + Ancestors: "ancestors", + DeptName: "dept_name", + OrderNum: "order_num", + Leader: "leader", + Phone: "phone", + Email: "email", + Status: "status", + CreatedBy: "created_by", + UpdatedBy: "updated_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewSysDeptDao creates and returns a new DAO object for table data access. +func NewSysDeptDao() *SysDeptDao { + return &SysDeptDao{ + group: "default", + table: "sys_dept", + columns: sysDeptColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysDeptDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysDeptDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysDeptDao) Columns() SysDeptColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysDeptDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysDeptDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysDeptDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/sys_file.go b/internal/app/system/dao/internal/sys_file.go new file mode 100644 index 0000000..7340cbe --- /dev/null +++ b/internal/app/system/dao/internal/sys_file.go @@ -0,0 +1,102 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-07-29 15:32:09 +// 生成路径: internal/app/system/dao/internal/sys_file.go +// 生成人:gfast +// desc:文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysFileDao is the manager for logic model data accessing and custom defined data operations functions management. +type SysFileDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns SysFileColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// SysFileColumns defines and stores column names for table sys_file. +type SysFileColumns struct { + FileId string // 文件id + ParentId string // 父文件id + Ancestors string // 祖级列表 + FileName string // 文件名称 + OrderNum string // 显示顺序 + ProjectId string // 项目id + FileTypeId string // 文件夹类型id + Leader string // 负责人 + Status string // 文件状态 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var sysFileColumns = SysFileColumns{ + FileId: "file_id", + ParentId: "parent_id", + Ancestors: "ancestors", + FileName: "file_name", + OrderNum: "order_num", + ProjectId: "project_id", + FileTypeId: "file_type_id", + Leader: "leader", + Status: "status", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewSysFileDao creates and returns a new DAO object for table data access. +func NewSysFileDao() *SysFileDao { + return &SysFileDao{ + group: "default", + table: "sys_file", + columns: sysFileColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysFileDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysFileDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysFileDao) Columns() SysFileColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysFileDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysFileDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysFileDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/sys_file_type.go b/internal/app/system/dao/internal/sys_file_type.go new file mode 100644 index 0000000..6a2fec6 --- /dev/null +++ b/internal/app/system/dao/internal/sys_file_type.go @@ -0,0 +1,90 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-07-29 15:27:54 +// 生成路径: internal/app/system/dao/internal/sys_file_type.go +// 生成人:gfast +// desc:文件类型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysFileTypeDao is the manager for logic model data accessing and custom defined data operations functions management. +type SysFileTypeDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns SysFileTypeColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// SysFileTypeColumns defines and stores column names for table sys_file_type. +type SysFileTypeColumns struct { + Id string // 序号 + FileTypeName string // 文件类型 + Status string // 文件状态 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var sysFileTypeColumns = SysFileTypeColumns{ + Id: "id", + FileTypeName: "file_type_name", + Status: "status", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewSysFileTypeDao creates and returns a new DAO object for table data access. +func NewSysFileTypeDao() *SysFileTypeDao { + return &SysFileTypeDao{ + group: "default", + table: "sys_file_type", + columns: sysFileTypeColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysFileTypeDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysFileTypeDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysFileTypeDao) Columns() SysFileTypeColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysFileTypeDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysFileTypeDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysFileTypeDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/sys_job.go b/internal/app/system/dao/internal/sys_job.go new file mode 100644 index 0000000..21ebcc9 --- /dev/null +++ b/internal/app/system/dao/internal/sys_job.go @@ -0,0 +1,102 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-01-12 17:43:50 +// 生成路径: internal/app/system/dao/internal/sys_job.go +// 生成人:gfast +// desc:定时任务 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysJobDao is the manager for logic model data accessing and custom defined data operations functions management. +type SysJobDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns SysJobColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// SysJobColumns defines and stores column names for table sys_job. +type SysJobColumns struct { + JobId string // 任务ID + JobName string // 任务名称 + JobParams string // 参数 + JobGroup string // 任务组名 + InvokeTarget string // 任务方法 + CronExpression string // cron执行表达式 + MisfirePolicy string // 计划执行策略 + Concurrent string // 是否并发执行 + Status string // 状态 + CreatedBy string // 创建者 + UpdatedBy string // 更新者 + Remark string // 备注信息 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 +} + +var sysJobColumns = SysJobColumns{ + JobId: "job_id", + JobName: "job_name", + JobParams: "job_params", + JobGroup: "job_group", + InvokeTarget: "invoke_target", + CronExpression: "cron_expression", + MisfirePolicy: "misfire_policy", + Concurrent: "concurrent", + Status: "status", + CreatedBy: "created_by", + UpdatedBy: "updated_by", + Remark: "remark", + CreatedAt: "created_at", + UpdatedAt: "updated_at", +} + +// NewSysJobDao creates and returns a new DAO object for table data access. +func NewSysJobDao() *SysJobDao { + return &SysJobDao{ + group: "default", + table: "sys_job", + columns: sysJobColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysJobDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysJobDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysJobDao) Columns() SysJobColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysJobDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysJobDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysJobDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/sys_job_log.go b/internal/app/system/dao/internal/sys_job_log.go new file mode 100644 index 0000000..463364b --- /dev/null +++ b/internal/app/system/dao/internal/sys_job_log.go @@ -0,0 +1,79 @@ +// ========================================================================== +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysJobLogDao is the data access object for table sys_job_log. +type SysJobLogDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns SysJobLogColumns // columns contains all the column names of Table for convenient usage. +} + +// SysJobLogColumns defines and stores column names for table sys_job_log. +type SysJobLogColumns struct { + Id string // 主键 + TargetName string // 方法名 + CreatedAt string // 执行日期 + Result string // 执行结果 +} + +// sysJobLogColumns holds the columns for table sys_job_log. +var sysJobLogColumns = SysJobLogColumns{ + Id: "id", + TargetName: "target_name", + CreatedAt: "created_at", + Result: "result", +} + +// NewSysJobLogDao creates and returns a new DAO object for table data access. +func NewSysJobLogDao() *SysJobLogDao { + return &SysJobLogDao{ + group: "default", + table: "sys_job_log", + columns: sysJobLogColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysJobLogDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysJobLogDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysJobLogDao) Columns() SysJobLogColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysJobLogDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysJobLogDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysJobLogDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/sys_login_log.go b/internal/app/system/dao/internal/sys_login_log.go new file mode 100644 index 0000000..110fde2 --- /dev/null +++ b/internal/app/system/dao/internal/sys_login_log.go @@ -0,0 +1,90 @@ +// ========================================================================== +// Code generated by GoFrame CLI tool. DO NOT EDIT. Created at 2022-03-08 11:31:48 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysLoginLogDao is the data access object for table sys_login_log. +type SysLoginLogDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns SysLoginLogColumns // columns contains all the column names of Table for convenient usage. +} + +// SysLoginLogColumns defines and stores column names for table sys_login_log. +type SysLoginLogColumns struct { + InfoId string // 访问ID + LoginName string // 登录账号 + Ipaddr string // 登录IP地址 + LoginLocation string // 登录地点 + Browser string // 浏览器类型 + Os string // 操作系统 + Status string // 登录状态(0成功 1失败) + Msg string // 提示消息 + LoginTime string // 登录时间 + Module string // 登录模块 +} + +// sysLoginLogColumns holds the columns for table sys_login_log. +var sysLoginLogColumns = SysLoginLogColumns{ + InfoId: "info_id", + LoginName: "login_name", + Ipaddr: "ipaddr", + LoginLocation: "login_location", + Browser: "browser", + Os: "os", + Status: "status", + Msg: "msg", + LoginTime: "login_time", + Module: "module", +} + +// NewSysLoginLogDao creates and returns a new DAO object for table data access. +func NewSysLoginLogDao() *SysLoginLogDao { + return &SysLoginLogDao{ + group: "default", + table: "sys_login_log", + columns: sysLoginLogColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysLoginLogDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysLoginLogDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysLoginLogDao) Columns() SysLoginLogColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysLoginLogDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysLoginLogDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysLoginLogDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/sys_oper_log.go b/internal/app/system/dao/internal/sys_oper_log.go new file mode 100644 index 0000000..ec36f6a --- /dev/null +++ b/internal/app/system/dao/internal/sys_oper_log.go @@ -0,0 +1,99 @@ +// ========================================================================== +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysOperLogDao is the data access object for table sys_oper_log. +type SysOperLogDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns SysOperLogColumns // columns contains all the column names of Table for convenient usage. +} + +// SysOperLogColumns defines and stores column names for table sys_oper_log. +type SysOperLogColumns struct { + OperId string // 日志主键 + Title string // 模块标题 + BusinessType string // 业务类型(0其它 1新增 2修改 3删除) + Method string // 方法名称 + RequestMethod string // 请求方式 + OperatorType string // 操作类别(0其它 1后台用户 2手机端用户) + OperName string // 操作人员 + DeptName string // 部门名称 + OperUrl string // 请求URL + OperIp string // 主机地址 + OperLocation string // 操作地点 + OperParam string // 请求参数 + ErrorMsg string // 错误消息 + OperTime string // 操作时间 +} + +// sysOperLogColumns holds the columns for table sys_oper_log. +var sysOperLogColumns = SysOperLogColumns{ + OperId: "oper_id", + Title: "title", + BusinessType: "business_type", + Method: "method", + RequestMethod: "request_method", + OperatorType: "operator_type", + OperName: "oper_name", + DeptName: "dept_name", + OperUrl: "oper_url", + OperIp: "oper_ip", + OperLocation: "oper_location", + OperParam: "oper_param", + ErrorMsg: "error_msg", + OperTime: "oper_time", +} + +// NewSysOperLogDao creates and returns a new DAO object for table data access. +func NewSysOperLogDao() *SysOperLogDao { + return &SysOperLogDao{ + group: "default", + table: "sys_oper_log", + columns: sysOperLogColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysOperLogDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysOperLogDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysOperLogDao) Columns() SysOperLogColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysOperLogDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysOperLogDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysOperLogDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/sys_post.go b/internal/app/system/dao/internal/sys_post.go new file mode 100644 index 0000000..6c2afab --- /dev/null +++ b/internal/app/system/dao/internal/sys_post.go @@ -0,0 +1,92 @@ +// ========================================================================== +// Code generated by GoFrame CLI tool. DO NOT EDIT. Created at 2022-04-07 23:26:21 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysPostDao is the data access object for table sys_post. +type SysPostDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns SysPostColumns // columns contains all the column names of Table for convenient usage. +} + +// SysPostColumns defines and stores column names for table sys_post. +type SysPostColumns struct { + PostId string // 岗位ID + PostCode string // 岗位编码 + PostName string // 岗位名称 + PostSort string // 显示顺序 + Status string // 状态(0正常 1停用) + Remark string // 备注 + CreatedBy string // 创建人 + UpdatedBy string // 修改人 + CreatedAt string // 创建时间 + UpdatedAt string // 修改时间 + DeletedAt string // 删除时间 +} + +// sysPostColumns holds the columns for table sys_post. +var sysPostColumns = SysPostColumns{ + PostId: "post_id", + PostCode: "post_code", + PostName: "post_name", + PostSort: "post_sort", + Status: "status", + Remark: "remark", + CreatedBy: "created_by", + UpdatedBy: "updated_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewSysPostDao creates and returns a new DAO object for table data access. +func NewSysPostDao() *SysPostDao { + return &SysPostDao{ + group: "default", + table: "sys_post", + columns: sysPostColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysPostDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysPostDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysPostDao) Columns() SysPostColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysPostDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysPostDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysPostDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/sys_project.go b/internal/app/system/dao/internal/sys_project.go new file mode 100644 index 0000000..d5de7bf --- /dev/null +++ b/internal/app/system/dao/internal/sys_project.go @@ -0,0 +1,114 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-07-27 15:20:49 +// 生成路径: internal/app/system/dao/internal/sys_project.go +// 生成人:gfast +// desc:项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysProjectDao is the manager for logic model data accessing and custom defined data operations functions management. +type SysProjectDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns SysProjectColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// SysProjectColumns defines and stores column names for table sys_project. +type SysProjectColumns struct { + Id string // 序号 + ProjectName string // 项目名称 + ShortName string // 项目名称 + PId string // 父id + Status string // 状态(0正常 1停用) + PicUrl string // 项目图片 + CreateBy string // 创建者 + CreateTime string // 创建时间 + UpdateBy string // 更新者 + UpdateTime string // 更新时间 + Lng string // 经度 + Lat string // 纬度 + Remark string // 备注 + Type string // 项目类型 + IsType string // 项目类别 + ColourRgb string // 展示颜色 + ProjectId string + Principal string + PrincipalXz string + ShowHidden string +} + +var sysProjectColumns = SysProjectColumns{ + Id: "id", + ProjectName: "project_name", + ShortName: "short_name", + ProjectId: "project_id", + PId: "p_id", + Status: "status", + PicUrl: "pic_url", + CreateBy: "create_by", + CreateTime: "create_time", + UpdateBy: "update_by", + UpdateTime: "update_time", + Lng: "lng", + Lat: "lat", + Remark: "remark", + Type: "type", + ColourRgb: "colour_rgb", + Principal: "principal", + PrincipalXz: "principal_xz", + ShowHidden: "show_hidden", + IsType: "is_type", +} + +// NewSysProjectDao creates and returns a new DAO object for table data access. +func NewSysProjectDao() *SysProjectDao { + return &SysProjectDao{ + group: "default", + table: "sys_project", + columns: sysProjectColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysProjectDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysProjectDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysProjectDao) Columns() SysProjectColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysProjectDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysProjectDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysProjectDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/sys_project_introduce.go b/internal/app/system/dao/internal/sys_project_introduce.go new file mode 100644 index 0000000..8d1b743 --- /dev/null +++ b/internal/app/system/dao/internal/sys_project_introduce.go @@ -0,0 +1,92 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-03-29 10:05:02 +// 生成路径: internal/app/system/dao/internal/sys_project_introduce.go +// 生成人:gfast +// desc:项目新闻 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysProjectIntroduceDao is the manager for logic model data accessing and custom defined data operations functions management. +type SysProjectIntroduceDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns SysProjectIntroduceColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// SysProjectIntroduceColumns defines and stores column names for table sys_project_introduce. +type SysProjectIntroduceColumns struct { + Id string // 项目id + ProjectId string // 项目id + Headline string // 标题 + RichText string // 富文本 + CreatedBy string // 创建人 + UpdatedBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var sysProjectIntroduceColumns = SysProjectIntroduceColumns{ + Id: "id", + ProjectId: "project_id", + Headline: "headline", + RichText: "rich_text", + CreatedBy: "created_by", + UpdatedBy: "updated_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewSysProjectIntroduceDao creates and returns a new DAO object for table data access. +func NewSysProjectIntroduceDao() *SysProjectIntroduceDao { + return &SysProjectIntroduceDao{ + group: "default", + table: "sys_project_introduce", + columns: sysProjectIntroduceColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysProjectIntroduceDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysProjectIntroduceDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysProjectIntroduceDao) Columns() SysProjectIntroduceColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysProjectIntroduceDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysProjectIntroduceDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysProjectIntroduceDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/sys_project_value.go b/internal/app/system/dao/internal/sys_project_value.go new file mode 100644 index 0000000..df8c609 --- /dev/null +++ b/internal/app/system/dao/internal/sys_project_value.go @@ -0,0 +1,86 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-03-27 12:55:26 +// 生成路径: internal/app/system/dao/internal/sys_project_value.go +// 生成人:xiaoyang +// desc:projectValue +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysProjectValueDao is the manager for logic model data accessing and custom defined data operations functions management. +type SysProjectValueDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns SysProjectValueColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// SysProjectValueColumns defines and stores column names for table sys_project_value. +type SysProjectValueColumns struct { + Id string // 主键id + ProId string // 项目id + Year string // 年 + Month string // 月 + ProValue string // 项目产值 + CreatedAt string // 创建时间 +} + +var sysProjectValueColumns = SysProjectValueColumns{ + Id: "id", + ProId: "pro_id", + Year: "year", + Month: "month", + ProValue: "pro_value", + CreatedAt: "created_at", +} + +// NewSysProjectValueDao creates and returns a new DAO object for table data access. +func NewSysProjectValueDao() *SysProjectValueDao { + return &SysProjectValueDao{ + group: "default", + table: "sys_project_value", + columns: sysProjectValueColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysProjectValueDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysProjectValueDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysProjectValueDao) Columns() SysProjectValueColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysProjectValueDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysProjectValueDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysProjectValueDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/sys_role.go b/internal/app/system/dao/internal/sys_role.go new file mode 100644 index 0000000..d07aede --- /dev/null +++ b/internal/app/system/dao/internal/sys_role.go @@ -0,0 +1,86 @@ +// ========================================================================== +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysRoleDao is the data access object for table sys_role. +type SysRoleDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns SysRoleColumns // columns contains all the column names of Table for convenient usage. +} + +// SysRoleColumns defines and stores column names for table sys_role. +type SysRoleColumns struct { + Id string // + Status string // 状态;0:禁用;1:正常 + ListOrder string // 排序 + Name string // 角色名称 + Remark string // 备注 + DataScope string // 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 +} + +// sysRoleColumns holds the columns for table sys_role. +var sysRoleColumns = SysRoleColumns{ + Id: "id", + Status: "status", + ListOrder: "list_order", + Name: "name", + Remark: "remark", + DataScope: "data_scope", + CreatedAt: "created_at", + UpdatedAt: "updated_at", +} + +// NewSysRoleDao creates and returns a new DAO object for table data access. +func NewSysRoleDao() *SysRoleDao { + return &SysRoleDao{ + group: "default", + table: "sys_role", + columns: sysRoleColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysRoleDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysRoleDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysRoleDao) Columns() SysRoleColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysRoleDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysRoleDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysRoleDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/sys_role_dept.go b/internal/app/system/dao/internal/sys_role_dept.go new file mode 100644 index 0000000..19e2f0e --- /dev/null +++ b/internal/app/system/dao/internal/sys_role_dept.go @@ -0,0 +1,75 @@ +// ========================================================================== +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysRoleDeptDao is the data access object for table sys_role_dept. +type SysRoleDeptDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns SysRoleDeptColumns // columns contains all the column names of Table for convenient usage. +} + +// SysRoleDeptColumns defines and stores column names for table sys_role_dept. +type SysRoleDeptColumns struct { + RoleId string // 角色ID + DeptId string // 部门ID +} + +// sysRoleDeptColumns holds the columns for table sys_role_dept. +var sysRoleDeptColumns = SysRoleDeptColumns{ + RoleId: "role_id", + DeptId: "dept_id", +} + +// NewSysRoleDeptDao creates and returns a new DAO object for table data access. +func NewSysRoleDeptDao() *SysRoleDeptDao { + return &SysRoleDeptDao{ + group: "default", + table: "sys_role_dept", + columns: sysRoleDeptColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysRoleDeptDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysRoleDeptDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysRoleDeptDao) Columns() SysRoleDeptColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysRoleDeptDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysRoleDeptDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysRoleDeptDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/sys_user.go b/internal/app/system/dao/internal/sys_user.go new file mode 100644 index 0000000..53c4d5b --- /dev/null +++ b/internal/app/system/dao/internal/sys_user.go @@ -0,0 +1,112 @@ +// ========================================================================== +// Code generated by GoFrame CLI tool. DO NOT EDIT. Created at 2022-03-02 16:48:23 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysUserDao is the data access object for table sys_user. +type SysUserDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns SysUserColumns // columns contains all the column names of Table for convenient usage. +} + +// SysUserColumns defines and stores column names for table sys_user. +type SysUserColumns struct { + Id string // + UserName string // 用户名 + Mobile string // 中国手机不带国家代码,国际手机号格式为:国家代码-手机号 + UserNickname string // 用户昵称 + Birthday string // 生日 + UserPassword string // 登录密码;cmf_password加密 + UserSalt string // 加密盐 + UserStatus string // 用户状态;0:禁用,1:正常,2:未验证 + UserEmail string // 用户登录邮箱 + Sex string // 性别;0:保密,1:男,2:女 + Avatar string // 用户头像 + DeptId string // 部门id + Remark string // 备注 + IsAdmin string // 是否后台管理员 1 是 0 否 + Address string // 联系地址 + Describe string // 描述信息 + LastLoginIp string // 最后登录ip + LastLoginTime string // 最后登录时间 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +// sysUserColumns holds the columns for table sys_user. +var sysUserColumns = SysUserColumns{ + Id: "id", + UserName: "user_name", + Mobile: "mobile", + UserNickname: "user_nickname", + Birthday: "birthday", + UserPassword: "user_password", + UserSalt: "user_salt", + UserStatus: "user_status", + UserEmail: "user_email", + Sex: "sex", + Avatar: "avatar", + DeptId: "dept_id", + Remark: "remark", + IsAdmin: "is_admin", + Address: "address", + Describe: "describe", + LastLoginIp: "last_login_ip", + LastLoginTime: "last_login_time", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewSysUserDao creates and returns a new DAO object for table data access. +func NewSysUserDao() *SysUserDao { + return &SysUserDao{ + group: "default", + table: "sys_user", + columns: sysUserColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysUserDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysUserDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysUserDao) Columns() SysUserColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysUserDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysUserDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysUserDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/sys_user_online.go b/internal/app/system/dao/internal/sys_user_online.go new file mode 100644 index 0000000..775ccd5 --- /dev/null +++ b/internal/app/system/dao/internal/sys_user_online.go @@ -0,0 +1,87 @@ +// ========================================================================== +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysUserOnlineDao is the data access object for table sys_user_online. +type SysUserOnlineDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns SysUserOnlineColumns // columns contains all the column names of Table for convenient usage. +} + +// SysUserOnlineColumns defines and stores column names for table sys_user_online. +type SysUserOnlineColumns struct { + Id string // + Uuid string // 用户标识 + Token string // 用户token + CreateTime string // 登录时间 + UserName string // 用户名 + Ip string // 登录ip + Explorer string // 浏览器 + Os string // 操作系统 +} + +// sysUserOnlineColumns holds the columns for table sys_user_online. +var sysUserOnlineColumns = SysUserOnlineColumns{ + Id: "id", + Uuid: "uuid", + Token: "token", + CreateTime: "create_time", + UserName: "user_name", + Ip: "ip", + Explorer: "explorer", + Os: "os", +} + +// NewSysUserOnlineDao creates and returns a new DAO object for table data access. +func NewSysUserOnlineDao() *SysUserOnlineDao { + return &SysUserOnlineDao{ + group: "default", + table: "sys_user_online", + columns: sysUserOnlineColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysUserOnlineDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysUserOnlineDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysUserOnlineDao) Columns() SysUserOnlineColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysUserOnlineDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysUserOnlineDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysUserOnlineDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/sys_user_post.go b/internal/app/system/dao/internal/sys_user_post.go new file mode 100644 index 0000000..4385fd5 --- /dev/null +++ b/internal/app/system/dao/internal/sys_user_post.go @@ -0,0 +1,74 @@ +// ========================================================================== +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysUserPostDao is the data access object for table sys_user_post. +type SysUserPostDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns SysUserPostColumns // columns contains all the column names of Table for convenient usage. +} + +// SysUserPostColumns defines and stores column names for table sys_user_post. +type SysUserPostColumns struct { + UserId string // 用户ID + PostId string // 岗位ID +} + +// sysUserPostColumns holds the columns for table sys_user_post. +var sysUserPostColumns = SysUserPostColumns{ + UserId: "user_id", + PostId: "post_id", +} + +// NewSysUserPostDao creates and returns a new DAO object for table data access. +func NewSysUserPostDao() *SysUserPostDao { + return &SysUserPostDao{ + group: "default", + table: "sys_user_post", + columns: sysUserPostColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysUserPostDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysUserPostDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysUserPostDao) Columns() SysUserPostColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysUserPostDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysUserPostDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysUserPostDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/sys_user_project.go b/internal/app/system/dao/internal/sys_user_project.go new file mode 100644 index 0000000..f9c1715 --- /dev/null +++ b/internal/app/system/dao/internal/sys_user_project.go @@ -0,0 +1,80 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-07-27 15:20:52 +// 生成路径: internal/app/system/dao/internal/sys_user_project.go +// 生成人:gfast +// desc:用户和项目关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysUserProjectDao is the manager for logic model data accessing and custom defined data operations functions management. +type SysUserProjectDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns SysUserProjectColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// SysUserProjectColumns defines and stores column names for table sys_user_project. +type SysUserProjectColumns struct { + Id string // 序号 + UserId string // 用户 + ProjectId string // 项目 +} + +var sysUserProjectColumns = SysUserProjectColumns{ + Id: "id", + UserId: "user_id", + ProjectId: "project_id", +} + +// NewSysUserProjectDao creates and returns a new DAO object for table data access. +func NewSysUserProjectDao() *SysUserProjectDao { + return &SysUserProjectDao{ + group: "default", + table: "sys_user_project", + columns: sysUserProjectColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysUserProjectDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysUserProjectDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysUserProjectDao) Columns() SysUserProjectColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysUserProjectDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysUserProjectDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysUserProjectDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/sys_wechat_role.go b/internal/app/system/dao/internal/sys_wechat_role.go new file mode 100644 index 0000000..d5c2be0 --- /dev/null +++ b/internal/app/system/dao/internal/sys_wechat_role.go @@ -0,0 +1,86 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-01-22 15:05:42 +// 生成路径: internal/app/system/dao/internal/sys_wechat_role.go +// 生成人:gfast +// desc:微信角色 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysWechatRoleDao is the manager for logic model data accessing and custom defined data operations functions management. +type SysWechatRoleDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns SysWechatRoleColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// SysWechatRoleColumns defines and stores column names for table sys_wechat_role. +type SysWechatRoleColumns struct { + Id string // 主键ID + Name string // 角色名称 + ListOrder string // 排序 + Remark string // 备注 + CreatedAt string // 创建时间 + UpdatedAt string // 修改时间 +} + +var sysWechatRoleColumns = SysWechatRoleColumns{ + Id: "id", + Name: "name", + ListOrder: "list_order", + Remark: "remark", + CreatedAt: "created_at", + UpdatedAt: "updated_at", +} + +// NewSysWechatRoleDao creates and returns a new DAO object for table data access. +func NewSysWechatRoleDao() *SysWechatRoleDao { + return &SysWechatRoleDao{ + group: "default", + table: "sys_wechat_role", + columns: sysWechatRoleColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysWechatRoleDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysWechatRoleDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysWechatRoleDao) Columns() SysWechatRoleColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysWechatRoleDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysWechatRoleDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysWechatRoleDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/template_data.go b/internal/app/system/dao/internal/template_data.go new file mode 100644 index 0000000..78308ad --- /dev/null +++ b/internal/app/system/dao/internal/template_data.go @@ -0,0 +1,90 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-12-08 14:21:01 +// 生成路径: internal/app/system/dao/internal/template_data.go +// 生成人:gfast +// desc:工程资料>资料 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// TemplateDataDao is the manager for logic model data accessing and custom defined data operations functions management. +type TemplateDataDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns TemplateDataColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// TemplateDataColumns defines and stores column names for table template_data. +type TemplateDataColumns struct { + Id string // 主键id + DataName string // 名称 + DataType string // 1编写 2存储 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var templateDataColumns = TemplateDataColumns{ + Id: "id", + DataName: "data_name", + DataType: "data_type", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewTemplateDataDao creates and returns a new DAO object for table data access. +func NewTemplateDataDao() *TemplateDataDao { + return &TemplateDataDao{ + group: "default", + table: "template_data", + columns: templateDataColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *TemplateDataDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *TemplateDataDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *TemplateDataDao) Columns() TemplateDataColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *TemplateDataDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *TemplateDataDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *TemplateDataDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/template_data_junior.go b/internal/app/system/dao/internal/template_data_junior.go new file mode 100644 index 0000000..90b5d6b --- /dev/null +++ b/internal/app/system/dao/internal/template_data_junior.go @@ -0,0 +1,92 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-12-08 14:21:01 +// 生成路径: internal/app/system/dao/internal/template_data_junior.go +// 生成人:gfast +// desc:工程资料>资料>下级模板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// TemplateDataJuniorDao is the manager for logic model data accessing and custom defined data operations functions management. +type TemplateDataJuniorDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns TemplateDataJuniorColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// TemplateDataJuniorColumns defines and stores column names for table template_data_junior. +type TemplateDataJuniorColumns struct { + Id string // 主键ID + Name string // 模板名称 + FilenPath string // 模板文件名 + Suffix string // 后缀 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var templateDataJuniorColumns = TemplateDataJuniorColumns{ + Id: "id", + Name: "name", + FilenPath: "filen_path", + Suffix: "suffix", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewTemplateDataJuniorDao creates and returns a new DAO object for table data access. +func NewTemplateDataJuniorDao() *TemplateDataJuniorDao { + return &TemplateDataJuniorDao{ + group: "default", + table: "template_data_junior", + columns: templateDataJuniorColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *TemplateDataJuniorDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *TemplateDataJuniorDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *TemplateDataJuniorDao) Columns() TemplateDataJuniorColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *TemplateDataJuniorDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *TemplateDataJuniorDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *TemplateDataJuniorDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/template_data_source_data.go b/internal/app/system/dao/internal/template_data_source_data.go new file mode 100644 index 0000000..656498e --- /dev/null +++ b/internal/app/system/dao/internal/template_data_source_data.go @@ -0,0 +1,98 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-12-08 10:06:54 +// 生成路径: internal/app/system/dao/internal/template_data_source_data.go +// 生成人:gfast +// desc:模板资料源数据 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// TemplateDataSourceDataDao is the manager for logic model data accessing and custom defined data operations functions management. +type TemplateDataSourceDataDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns TemplateDataSourceDataColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// TemplateDataSourceDataColumns defines and stores column names for table template_data_source_data. +type TemplateDataSourceDataColumns struct { + Id string // 主键ID + Type string // 1模板 2资料 + TypeId string // 对应数据id + ProjectId string // 项目id + SourceName string // 资源名称 + SourceId string // 资源ID + SourcePath string // 资源路径 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var templateDataSourceDataColumns = TemplateDataSourceDataColumns{ + Id: "id", + Type: "type", + TypeId: "type_id", + ProjectId: "project_id", + SourceName: "source_name", + SourceId: "source_id", + SourcePath: "source_path", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewTemplateDataSourceDataDao creates and returns a new DAO object for table data access. +func NewTemplateDataSourceDataDao() *TemplateDataSourceDataDao { + return &TemplateDataSourceDataDao{ + group: "default", + table: "template_data_source_data", + columns: templateDataSourceDataColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *TemplateDataSourceDataDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *TemplateDataSourceDataDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *TemplateDataSourceDataDao) Columns() TemplateDataSourceDataColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *TemplateDataSourceDataDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *TemplateDataSourceDataDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *TemplateDataSourceDataDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/todo_tasks.go b/internal/app/system/dao/internal/todo_tasks.go new file mode 100644 index 0000000..72bef16 --- /dev/null +++ b/internal/app/system/dao/internal/todo_tasks.go @@ -0,0 +1,95 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// TodoTasksDao is the data access object for table todo_tasks. +type TodoTasksDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns TodoTasksColumns // columns contains all the column names of Table for convenient usage. +} + +// TodoTasksColumns defines and stores column names for table todo_tasks. +type TodoTasksColumns struct { + Id string // + MissingCardTime string // 缺卡时间 + Applicant string // 申请人 + ProjectId string // 项目ID + TaskType string // 0 补卡提醒 | 1 考勤审批 + OrderId string // 对应跳转的主键ID + CreatedAt string // + UserId string // 用户ID + Status string // 0 未处理 | 1 已处理 + Role string // 0 管理员 1 施工人员 + Uuid string // 一组具有相同UUID的消息 + UpdatedAt string // 更新时间 +} + +// todoTasksColumns holds the columns for table todo_tasks. +var todoTasksColumns = TodoTasksColumns{ + Id: "id", + MissingCardTime: "missing_card_time", + Applicant: "applicant", + ProjectId: "project_id", + TaskType: "task_type", + OrderId: "order_id", + CreatedAt: "created_at", + UserId: "user_id", + Status: "status", + Role: "role", + Uuid: "uuid", + UpdatedAt: "updated_at", +} + +// NewTodoTasksDao creates and returns a new DAO object for table data access. +func NewTodoTasksDao() *TodoTasksDao { + return &TodoTasksDao{ + group: "default", + table: "todo_tasks", + columns: todoTasksColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *TodoTasksDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *TodoTasksDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *TodoTasksDao) Columns() TodoTasksColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *TodoTasksDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *TodoTasksDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *TodoTasksDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/tools_gen_table.go b/internal/app/system/dao/internal/tools_gen_table.go new file mode 100644 index 0000000..839b963 --- /dev/null +++ b/internal/app/system/dao/internal/tools_gen_table.go @@ -0,0 +1,107 @@ +// ========================================================================== +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// ToolsGenTableDao is the data access object for table tools_gen_table. +type ToolsGenTableDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns ToolsGenTableColumns // columns contains all the column names of Table for convenient usage. +} + +// ToolsGenTableColumns defines and stores column names for table tools_gen_table. +type ToolsGenTableColumns struct { + TableId string // 编号 + TableName string // 表名称 + TableComment string // 表描述 + ClassName string // 实体类名称 + TplCategory string // 使用的模板(crud单表操作 tree树表操作) + PackageName string // 生成包路径 + ModuleName string // 生成模块名 + BusinessName string // 生成业务名 + FunctionName string // 生成功能名 + FunctionAuthor string // 生成功能作者 + Options string // 其它生成选项 + CreateTime string // 创建时间 + UpdateTime string // 更新时间 + Remark string // 备注 + Overwrite string // 是否覆盖原有文件 + SortColumn string // 排序字段名 + SortType string // 排序方式 (asc顺序 desc倒序) + ShowDetail string // 是否有查看详情功能 +} + +// toolsGenTableColumns holds the columns for table tools_gen_table. +var toolsGenTableColumns = ToolsGenTableColumns{ + TableId: "table_id", + TableName: "table_name", + TableComment: "table_comment", + ClassName: "class_name", + TplCategory: "tpl_category", + PackageName: "package_name", + ModuleName: "module_name", + BusinessName: "business_name", + FunctionName: "function_name", + FunctionAuthor: "function_author", + Options: "options", + CreateTime: "create_time", + UpdateTime: "update_time", + Remark: "remark", + Overwrite: "overwrite", + SortColumn: "sort_column", + SortType: "sort_type", + ShowDetail: "show_detail", +} + +// NewToolsGenTableDao creates and returns a new DAO object for table data access. +func NewToolsGenTableDao() *ToolsGenTableDao { + return &ToolsGenTableDao{ + group: "default", + table: "tools_gen_table", + columns: toolsGenTableColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *ToolsGenTableDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *ToolsGenTableDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *ToolsGenTableDao) Columns() ToolsGenTableColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *ToolsGenTableDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *ToolsGenTableDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *ToolsGenTableDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/tools_gen_table_column.go b/internal/app/system/dao/internal/tools_gen_table_column.go new file mode 100644 index 0000000..313f9e4 --- /dev/null +++ b/internal/app/system/dao/internal/tools_gen_table_column.go @@ -0,0 +1,151 @@ +// ========================================================================== +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// ToolsGenTableColumnDao is the data access object for table tools_gen_table_column. +type ToolsGenTableColumnDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns ToolsGenTableColumnColumns // columns contains all the column names of Table for convenient usage. +} + +// ToolsGenTableColumnColumns defines and stores column names for table tools_gen_table_column. +type ToolsGenTableColumnColumns struct { + ColumnId string // 编号 + TableId string // 归属表编号 + ColumnName string // 列名称 + ColumnComment string // 列描述 + ColumnType string // 列类型 + GoType string // Go类型 + TsType string // TS类型 + GoField string // Go字段名 + HtmlField string // html字段名 + IsPk string // 是否主键(1是) + IsIncrement string // 是否自增(1是) + IsRequired string // 是否必填(1是) + IsInsert string // 是否为插入字段(1是) + IsEdit string // 是否编辑字段(1是) + IsList string // 是否列表字段(1是) + IsDetail string // 是否详情字段 + IsQuery string // 是否查询字段(1是) + SortOrderEdit string // 插入编辑显示顺序 + SortOrderList string // 列表显示顺序 + SortOrderDetail string // 详情显示顺序 + SortOrderQuery string // 查询显示顺序 + QueryType string // 查询方式(等于、不等于、大于、小于、范围) + HtmlType string // 显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件) + DictType string // 字典类型 + LinkTableName string // 关联表名 + LinkTableClass string // 关联表类名 + LinkTableModuleName string // 关联表模块名 + LinkTableBusinessName string // 关联表业务名 + LinkTablePackage string // 关联表包名 + LinkLabelId string // 关联表键名 + LinkLabelName string // 关联表字段值 + ColSpan string // 详情页占列数 + RowSpan string // 详情页占行数 + IsRowStart string // 详情页为行首 + MinWidth string // 表格最小宽度 + IsFixed string // 是否表格列左固定 + IsOverflowTooltip string // 是否过长自动隐藏 + IsCascade string // 是否级联查询 + ParentColumnName string // 上级字段名 + CascadeColumnName string // 级联查询字段 +} + +// toolsGenTableColumnColumns holds the columns for table tools_gen_table_column. +var toolsGenTableColumnColumns = ToolsGenTableColumnColumns{ + ColumnId: "column_id", + TableId: "table_id", + ColumnName: "column_name", + ColumnComment: "column_comment", + ColumnType: "column_type", + GoType: "go_type", + TsType: "ts_type", + GoField: "go_field", + HtmlField: "html_field", + IsPk: "is_pk", + IsIncrement: "is_increment", + IsRequired: "is_required", + IsInsert: "is_insert", + IsEdit: "is_edit", + IsList: "is_list", + IsDetail: "is_detail", + IsQuery: "is_query", + SortOrderEdit: "sort_order_edit", + SortOrderList: "sort_order_list", + SortOrderDetail: "sort_order_detail", + SortOrderQuery: "sort_order_query", + QueryType: "query_type", + HtmlType: "html_type", + DictType: "dict_type", + LinkTableName: "link_table_name", + LinkTableClass: "link_table_class", + LinkTableModuleName: "link_table_module_name", + LinkTableBusinessName: "link_table_business_name", + LinkTablePackage: "link_table_package", + LinkLabelId: "link_label_id", + LinkLabelName: "link_label_name", + ColSpan: "col_span", + RowSpan: "row_span", + IsRowStart: "is_row_start", + MinWidth: "min_width", + IsFixed: "is_fixed", + IsOverflowTooltip: "is_overflow_tooltip", + IsCascade: "is_cascade", + ParentColumnName: "parent_column_name", + CascadeColumnName: "cascade_column_name", +} + +// NewToolsGenTableColumnDao creates and returns a new DAO object for table data access. +func NewToolsGenTableColumnDao() *ToolsGenTableColumnDao { + return &ToolsGenTableColumnDao{ + group: "default", + table: "tools_gen_table_column", + columns: toolsGenTableColumnColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *ToolsGenTableColumnDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *ToolsGenTableColumnDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *ToolsGenTableColumnDao) Columns() ToolsGenTableColumnColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *ToolsGenTableColumnDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *ToolsGenTableColumnDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *ToolsGenTableColumnDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/user_activity.go b/internal/app/system/dao/internal/user_activity.go new file mode 100644 index 0000000..ab834da --- /dev/null +++ b/internal/app/system/dao/internal/user_activity.go @@ -0,0 +1,77 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// UserActivityDao is the data access object for table user_activity. +type UserActivityDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns UserActivityColumns // columns contains all the column names of Table for convenient usage. +} + +// UserActivityColumns defines and stores column names for table user_activity. +type UserActivityColumns struct { + Id string // + UserId string // 用户ID + CreatedAt string // +} + +// userActivityColumns holds the columns for table user_activity. +var userActivityColumns = UserActivityColumns{ + Id: "id", + UserId: "user_id", + CreatedAt: "created_at", +} + +// NewUserActivityDao creates and returns a new DAO object for table data access. +func NewUserActivityDao() *UserActivityDao { + return &UserActivityDao{ + group: "default", + table: "user_activity", + columns: userActivityColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *UserActivityDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *UserActivityDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *UserActivityDao) Columns() UserActivityColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *UserActivityDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *UserActivityDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *UserActivityDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/user_registration.go b/internal/app/system/dao/internal/user_registration.go new file mode 100644 index 0000000..cfedb47 --- /dev/null +++ b/internal/app/system/dao/internal/user_registration.go @@ -0,0 +1,84 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-07-26 15:32:12 +// 生成路径: internal/app/system/dao/internal/user_registration.go +// 生成人:gfast +// desc:极光推送 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// UserRegistrationDao is the manager for logic model data accessing and custom defined data operations functions management. +type UserRegistrationDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns UserRegistrationColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// UserRegistrationColumns defines and stores column names for table user_registration. +type UserRegistrationColumns struct { + Id string // + UserId string // 用户ID + OpenId string // 微信 open_id + RegistrationId string // 极光推送 设备唯一标识 + CreatedAt string // +} + +var userRegistrationColumns = UserRegistrationColumns{ + Id: "id", + UserId: "user_id", + OpenId: "open_id", + RegistrationId: "registration_id", + CreatedAt: "created_at", +} + +// NewUserRegistrationDao creates and returns a new DAO object for table data access. +func NewUserRegistrationDao() *UserRegistrationDao { + return &UserRegistrationDao{ + group: "default", + table: "user_registration", + columns: userRegistrationColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *UserRegistrationDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *UserRegistrationDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *UserRegistrationDao) Columns() UserRegistrationColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *UserRegistrationDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *UserRegistrationDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *UserRegistrationDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/work_schedule.go b/internal/app/system/dao/internal/work_schedule.go new file mode 100644 index 0000000..956ceca --- /dev/null +++ b/internal/app/system/dao/internal/work_schedule.go @@ -0,0 +1,93 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// WorkScheduleDao is the data access object for table work_schedule. +type WorkScheduleDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns WorkScheduleColumns // columns contains all the column names of Table for convenient usage. +} + +// WorkScheduleColumns defines and stores column names for table work_schedule. +type WorkScheduleColumns struct { + Id string // + WorkId string // 关联的工作ID + StartAt string // 开始时间 + Detail string // 每天详细数据 + Status string // 状态 + PlanNum string // 计划数量 + FinishedNum string // 完成量 + EndAt string // 结束时间 + ProjectId string // 主项目ID + SubProjectid string // 子项目ID + FangzhenId string // 方阵ID +} + +// workScheduleColumns holds the columns for table work_schedule. +var workScheduleColumns = WorkScheduleColumns{ + Id: "id", + WorkId: "work_id", + StartAt: "start_at", + Detail: "detail", + Status: "status", + PlanNum: "plan_num", + FinishedNum: "finished_num", + EndAt: "end_at", + ProjectId: "project_id", + SubProjectid: "sub_projectid", + FangzhenId: "fangzhen_id", +} + +// NewWorkScheduleDao creates and returns a new DAO object for table data access. +func NewWorkScheduleDao() *WorkScheduleDao { + return &WorkScheduleDao{ + group: "default", + table: "work_schedule", + columns: workScheduleColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *WorkScheduleDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *WorkScheduleDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *WorkScheduleDao) Columns() WorkScheduleColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *WorkScheduleDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *WorkScheduleDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *WorkScheduleDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/work_status.go b/internal/app/system/dao/internal/work_status.go new file mode 100644 index 0000000..cfb5216 --- /dev/null +++ b/internal/app/system/dao/internal/work_status.go @@ -0,0 +1,103 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// WorkStatusDao is the data access object for table work_status. +type WorkStatusDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of current DAO. + columns WorkStatusColumns // columns contains all the column names of Table for convenient usage. +} + +// WorkStatusColumns defines and stores column names for table work_status. +type WorkStatusColumns struct { + Id string // + FangzhenId string // 方阵ID + Parent string // 父节点 + WorkId string // 工作id + WorkName string // 工作名称 + Total string // 总量 + Finished string // 完成量 + StartAt string // 开始时间 + EndAt string // 工作结束时间 + Status string // 状态 0未开始 1 进行中 2 已完成 3 已延期 + CreatedAt string // + Type string // 类型 + IsPercent string // 是否为百分比 + ProjectId string // 项目ID + SubProjectid string // 子项目ID + IsDelay string // 0 未延期 | 1 延期 +} + +// workStatusColumns holds the columns for table work_status. +var workStatusColumns = WorkStatusColumns{ + Id: "id", + FangzhenId: "fangzhen_id", + Parent: "parent", + WorkId: "work_id", + WorkName: "work_name", + Total: "total", + Finished: "finished", + StartAt: "start_at", + EndAt: "end_at", + Status: "status", + CreatedAt: "created_at", + Type: "type", + IsPercent: "is_percent", + ProjectId: "project_id", + SubProjectid: "sub_projectid", + IsDelay: "is_delay", +} + +// NewWorkStatusDao creates and returns a new DAO object for table data access. +func NewWorkStatusDao() *WorkStatusDao { + return &WorkStatusDao{ + group: "default", + table: "work_status", + columns: workStatusColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *WorkStatusDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *WorkStatusDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *WorkStatusDao) Columns() WorkStatusColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *WorkStatusDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *WorkStatusDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *WorkStatusDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/xiangmuhuafenbiao.go b/internal/app/system/dao/internal/xiangmuhuafenbiao.go new file mode 100644 index 0000000..ae7be47 --- /dev/null +++ b/internal/app/system/dao/internal/xiangmuhuafenbiao.go @@ -0,0 +1,108 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-10-07 16:08:10 +// 生成路径: internal/app/system/dao/internal/xiangmuhuafenbiao.go +// 生成人:gfast +// desc:项目划分 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// XiangmuhuafenbiaoDao is the manager for logic model data accessing and custom defined data operations functions management. +type XiangmuhuafenbiaoDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns XiangmuhuafenbiaoColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// XiangmuhuafenbiaoColumns defines and stores column names for table xiangmuhuafenbiao. +type XiangmuhuafenbiaoColumns struct { + Id string // + Danweigongcheng string // 单位 工程 + Zidanweigongcheng string // 子单位工程 + Fenbugongcheng string // 分部 工程 + Zifenbugongcheng string // 子分部工程 + Fenxianggongcheng string // 分项 工程 + Jianyanpi string // 检验批 + Name string // 工 程 项 目 名 称 + Zhixingbiaohao string // 执行表号 + Json string // json数据文件路径 + PrintStatus string // 打印状态 + ProjectId string // 项目id + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreateddAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var xiangmuhuafenbiaoColumns = XiangmuhuafenbiaoColumns{ + Id: "id", + Danweigongcheng: "danweigongcheng", + Zidanweigongcheng: "zidanweigongcheng", + Fenbugongcheng: "fenbugongcheng", + Zifenbugongcheng: "zifenbugongcheng", + Fenxianggongcheng: "fenxianggongcheng", + Jianyanpi: "jianyanpi", + Name: "name", + Zhixingbiaohao: "zhixingbiaohao", + Json: "json", + PrintStatus: "print_status", + ProjectId: "project_id", + CreateBy: "create_by", + UpdateBy: "update_by", + CreateddAt: "createdd_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewXiangmuhuafenbiaoDao creates and returns a new DAO object for table data access. +func NewXiangmuhuafenbiaoDao() *XiangmuhuafenbiaoDao { + return &XiangmuhuafenbiaoDao{ + group: "default", + table: "xiangmuhuafenbiao", + columns: xiangmuhuafenbiaoColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *XiangmuhuafenbiaoDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *XiangmuhuafenbiaoDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *XiangmuhuafenbiaoDao) Columns() XiangmuhuafenbiaoColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *XiangmuhuafenbiaoDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *XiangmuhuafenbiaoDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *XiangmuhuafenbiaoDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/ys7devices.go b/internal/app/system/dao/internal/ys7devices.go new file mode 100644 index 0000000..3752745 --- /dev/null +++ b/internal/app/system/dao/internal/ys7devices.go @@ -0,0 +1,92 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-03-01 12:49:32 +// 生成路径: internal/app/system/dao/internal/ys7devices.go +// 生成人:gfast +// desc:荧石摄像头 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// Ys7DevicesDao is the manager for logic model data accessing and custom defined data operations functions management. +type Ys7DevicesDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns Ys7DevicesColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// Ys7DevicesColumns defines and stores column names for table ys7devices. +type Ys7DevicesColumns struct { + Id string // id + CreatedAt string // + DeviceSerial string // 设备串号 + DeviceName string // 设备名称 + DeviceType string // 设备类型 + Status string // 状态 + Defence string // + DeviceVersion string // 设备版本 + ProjectId string // 项目ID +} + +var ys7DevicesColumns = Ys7DevicesColumns{ + Id: "id", + CreatedAt: "created_at", + DeviceSerial: "DeviceSerial", + DeviceName: "DeviceName", + DeviceType: "DeviceType", + Status: "Status", + Defence: "Defence", + DeviceVersion: "DeviceVersion", + ProjectId: "ProjectId", +} + +// NewYs7DevicesDao creates and returns a new DAO object for table data access. +func NewYs7DevicesDao() *Ys7DevicesDao { + return &Ys7DevicesDao{ + group: "default", + table: "ys7devices", + columns: ys7DevicesColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *Ys7DevicesDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *Ys7DevicesDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *Ys7DevicesDao) Columns() Ys7DevicesColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *Ys7DevicesDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *Ys7DevicesDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *Ys7DevicesDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/ys7devices_img.go b/internal/app/system/dao/internal/ys7devices_img.go new file mode 100644 index 0000000..2372295 --- /dev/null +++ b/internal/app/system/dao/internal/ys7devices_img.go @@ -0,0 +1,84 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2024-08-19 11:51:53 +// 生成路径: internal/app/system/dao/internal/ys7devices_img.go +// 生成人:gfast +// desc:摄像头所拍摄到的所有图片(每月会定时清除) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// Ys7DevicesImgDao is the manager for logic model data accessing and custom defined data operations functions management. +type Ys7DevicesImgDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns Ys7DevicesImgColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// Ys7DevicesImgColumns defines and stores column names for table ys7devices_img. +type Ys7DevicesImgColumns struct { + Id string // 主键ID + FatherId string // 父id + Name string // 摄像头名称 + Path string // 图片路径 + CreatedAt string // 拍摄时间 +} + +var ys7DevicesImgColumns = Ys7DevicesImgColumns{ + Id: "id", + FatherId: "father_id", + Name: "name", + Path: "path", + CreatedAt: "created_at", +} + +// NewYs7DevicesImgDao creates and returns a new DAO object for table data access. +func NewYs7DevicesImgDao() *Ys7DevicesImgDao { + return &Ys7DevicesImgDao{ + group: "default", + table: "ys7devices_img", + columns: ys7DevicesImgColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *Ys7DevicesImgDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *Ys7DevicesImgDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *Ys7DevicesImgDao) Columns() Ys7DevicesImgColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *Ys7DevicesImgDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *Ys7DevicesImgDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *Ys7DevicesImgDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/internal/zmkg_gis_model_lib.go b/internal/app/system/dao/internal/zmkg_gis_model_lib.go new file mode 100644 index 0000000..aa10274 --- /dev/null +++ b/internal/app/system/dao/internal/zmkg_gis_model_lib.go @@ -0,0 +1,92 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-07-31 10:18:14 +// 生成路径: internal/app/system/dao/internal/zmkg_gis_model_lib.go +// 生成人:gfast +// desc:模型库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// ZmkgGisModelLibDao is the manager for logic model data accessing and custom defined data operations functions management. +type ZmkgGisModelLibDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns ZmkgGisModelLibColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// ZmkgGisModelLibColumns defines and stores column names for table zmkg_gis_model_lib. +type ZmkgGisModelLibColumns struct { + Id string // 序号 + ModelId string // 模型id + ModelName string // 模型名称 + Url string // 模型地址 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreateAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var zmkgGisModelLibColumns = ZmkgGisModelLibColumns{ + Id: "id", + ModelId: "model_id", + ModelName: "model_name", + Url: "url", + CreateBy: "create_by", + UpdateBy: "update_by", + CreateAt: "create_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewZmkgGisModelLibDao creates and returns a new DAO object for table data access. +func NewZmkgGisModelLibDao() *ZmkgGisModelLibDao { + return &ZmkgGisModelLibDao{ + group: "default", + table: "zmkg_gis_model_lib", + columns: zmkgGisModelLibColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *ZmkgGisModelLibDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *ZmkgGisModelLibDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *ZmkgGisModelLibDao) Columns() ZmkgGisModelLibColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *ZmkgGisModelLibDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *ZmkgGisModelLibDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *ZmkgGisModelLibDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/system/dao/manage_airline.go b/internal/app/system/dao/manage_airline.go new file mode 100644 index 0000000..049d709 --- /dev/null +++ b/internal/app/system/dao/manage_airline.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-12-11 16:10:18 +// 生成路径: internal/app/system/dao/manage_airline.go +// 生成人:gfast +// desc:航线 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// manageAirlineDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type manageAirlineDao struct { + *internal.ManageAirlineDao +} + +var ( + // ManageAirline is globally public accessible object for table tools_gen_table operations. + ManageAirline = manageAirlineDao{ + internal.NewManageAirlineDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/manage_device.go b/internal/app/system/dao/manage_device.go new file mode 100644 index 0000000..2a937e0 --- /dev/null +++ b/internal/app/system/dao/manage_device.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-11-14 10:53:21 +// 生成路径: internal/app/system/dao/manage_device.go +// 生成人:gfast +// desc:设备信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// manageDeviceDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type manageDeviceDao struct { + *internal.ManageDeviceDao +} + +var ( + // ManageDevice is globally public accessible object for table tools_gen_table operations. + ManageDevice = manageDeviceDao{ + internal.NewManageDeviceDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/manage_operation_log.go b/internal/app/system/dao/manage_operation_log.go new file mode 100644 index 0000000..b99e057 --- /dev/null +++ b/internal/app/system/dao/manage_operation_log.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-06-21 15:23:29 +// 生成路径: internal/app/system/dao/manage_operation_log.go +// 生成人:gfast +// desc:无人机指令日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// manageOperationLogDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type manageOperationLogDao struct { + *internal.ManageOperationLogDao +} + +var ( + // ManageOperationLog is globally public accessible object for table tools_gen_table operations. + ManageOperationLog = manageOperationLogDao{ + internal.NewManageOperationLogDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/manage_task.go b/internal/app/system/dao/manage_task.go new file mode 100644 index 0000000..cf89cf9 --- /dev/null +++ b/internal/app/system/dao/manage_task.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-12-12 15:21:22 +// 生成路径: internal/app/system/dao/manage_task.go +// 生成人:gfast +// desc:航线任务下发 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// manageTaskDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type manageTaskDao struct { + *internal.ManageTaskDao +} + +var ( + // ManageTask is globally public accessible object for table tools_gen_table operations. + ManageTask = manageTaskDao{ + internal.NewManageTaskDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/manage_task_cron.go b/internal/app/system/dao/manage_task_cron.go new file mode 100644 index 0000000..5d66a6f --- /dev/null +++ b/internal/app/system/dao/manage_task_cron.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-06-04 14:33:05 +// 生成路径: internal/app/system/dao/manage_task_cron.go +// 生成人:gfast +// desc:航线任务定时飞行 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// manageTaskCronDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type manageTaskCronDao struct { + *internal.ManageTaskCronDao +} + +var ( + // ManageTaskCron is globally public accessible object for table tools_gen_table operations. + ManageTaskCron = manageTaskCronDao{ + internal.NewManageTaskCronDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/manage_task_record.go b/internal/app/system/dao/manage_task_record.go new file mode 100644 index 0000000..471e668 --- /dev/null +++ b/internal/app/system/dao/manage_task_record.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-12-12 17:56:19 +// 生成路径: internal/app/system/dao/manage_task_record.go +// 生成人:gfast +// desc:航线任务下发-记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// manageTaskRecordDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type manageTaskRecordDao struct { + *internal.ManageTaskRecordDao +} + +var ( + // ManageTaskRecord is globally public accessible object for table tools_gen_table operations. + ManageTaskRecord = manageTaskRecordDao{ + internal.NewManageTaskRecordDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/manage_task_record_resource.go b/internal/app/system/dao/manage_task_record_resource.go new file mode 100644 index 0000000..1f6579e --- /dev/null +++ b/internal/app/system/dao/manage_task_record_resource.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-05-30 17:07:01 +// 生成路径: internal/app/system/dao/manage_task_record_resource.go +// 生成人:gfast +// desc:下发记录回传的媒体文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// manageTaskRecordResourceDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type manageTaskRecordResourceDao struct { + *internal.ManageTaskRecordResourceDao +} + +var ( + // ManageTaskRecordResource is globally public accessible object for table tools_gen_table operations. + ManageTaskRecordResource = manageTaskRecordResourceDao{ + internal.NewManageTaskRecordResourceDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/manage_task_result.go b/internal/app/system/dao/manage_task_result.go new file mode 100644 index 0000000..b392ddc --- /dev/null +++ b/internal/app/system/dao/manage_task_result.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// internalManageTaskResultDao is internal type for wrapping internal DAO implements. +type internalManageTaskResultDao = *internal.ManageTaskResultDao + +// manageTaskResultDao is the data access object for table manage_task_result. +// You can define custom methods on it to extend its functionality as you wish. +type manageTaskResultDao struct { + internalManageTaskResultDao +} + +var ( + // ManageTaskResult is globally public accessible object for table manage_task_result operations. + ManageTaskResult = manageTaskResultDao{ + internal.NewManageTaskResultDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/manage_workspace.go b/internal/app/system/dao/manage_workspace.go new file mode 100644 index 0000000..50689a1 --- /dev/null +++ b/internal/app/system/dao/manage_workspace.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-11-14 10:53:20 +// 生成路径: internal/app/system/dao/manage_workspace.go +// 生成人:gfast +// desc:工作空间 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// manageWorkspaceDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type manageWorkspaceDao struct { + *internal.ManageWorkspaceDao +} + +var ( + // ManageWorkspace is globally public accessible object for table tools_gen_table operations. + ManageWorkspace = manageWorkspaceDao{ + internal.NewManageWorkspaceDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/master_schedule.go b/internal/app/system/dao/master_schedule.go new file mode 100644 index 0000000..e5be871 --- /dev/null +++ b/internal/app/system/dao/master_schedule.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-10-08 09:38:35 +// 生成路径: internal/app/system/dao/master_schedule.go +// 生成人:gfast +// desc:总进度计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// masterScheduleDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type masterScheduleDao struct { + *internal.MasterScheduleDao +} + +var ( + // MasterSchedule is globally public accessible object for table tools_gen_table operations. + MasterSchedule = masterScheduleDao{ + internal.NewMasterScheduleDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/notification_files.go b/internal/app/system/dao/notification_files.go new file mode 100644 index 0000000..9c5186d --- /dev/null +++ b/internal/app/system/dao/notification_files.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// internalNotificationFilesDao is internal type for wrapping internal DAO implements. +type internalNotificationFilesDao = *internal.NotificationFilesDao + +// notificationFilesDao is the data access object for table notification_files. +// You can define custom methods on it to extend its functionality as you wish. +type notificationFilesDao struct { + internalNotificationFilesDao +} + +var ( + // NotificationFiles is globally public accessible object for table notification_files operations. + NotificationFiles = notificationFilesDao{ + internal.NewNotificationFilesDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/notification_recipients.go b/internal/app/system/dao/notification_recipients.go new file mode 100644 index 0000000..6946304 --- /dev/null +++ b/internal/app/system/dao/notification_recipients.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-04-11 16:58:12 +// 生成路径: internal/app/system/dao/notification_recipients.go +// 生成人:gfast +// desc:通知接收 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// notificationRecipientsDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type notificationRecipientsDao struct { + *internal.NotificationRecipientsDao +} + +var ( + // NotificationRecipients is globally public accessible object for table tools_gen_table operations. + NotificationRecipients = notificationRecipientsDao{ + internal.NewNotificationRecipientsDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/notifications.go b/internal/app/system/dao/notifications.go new file mode 100644 index 0000000..ea1458e --- /dev/null +++ b/internal/app/system/dao/notifications.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-04-11 16:56:36 +// 生成路径: internal/app/system/dao/notifications.go +// 生成人:gfast +// desc:通知信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// notificationsDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type notificationsDao struct { + *internal.NotificationsDao +} + +var ( + // Notifications is globally public accessible object for table tools_gen_table operations. + Notifications = notificationsDao{ + internal.NewNotificationsDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/plan_daily.go b/internal/app/system/dao/plan_daily.go new file mode 100644 index 0000000..893b651 --- /dev/null +++ b/internal/app/system/dao/plan_daily.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-09-26 14:31:07 +// 生成路径: internal/app/system/dao/plan_daily.go +// 生成人:gfast +// desc:日报 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// planDailyDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type planDailyDao struct { + *internal.PlanDailyDao +} + +var ( + // PlanDaily is globally public accessible object for table tools_gen_table operations. + PlanDaily = planDailyDao{ + internal.NewPlanDailyDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/plan_week.go b/internal/app/system/dao/plan_week.go new file mode 100644 index 0000000..0be09e3 --- /dev/null +++ b/internal/app/system/dao/plan_week.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-04 17:26:59 +// 生成路径: internal/app/system/dao/plan_week.go +// 生成人:gfast +// desc:周计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// planWeekDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type planWeekDao struct { + *internal.PlanWeekDao +} + +var ( + // PlanWeek is globally public accessible object for table tools_gen_table operations. + PlanWeek = planWeekDao{ + internal.NewPlanWeekDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/plan_week_reality.go b/internal/app/system/dao/plan_week_reality.go new file mode 100644 index 0000000..9687aac --- /dev/null +++ b/internal/app/system/dao/plan_week_reality.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-17 17:23:07 +// 生成路径: internal/app/system/dao/plan_week_reality.go +// 生成人:xyb +// desc:实际完成的周计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// planWeekRealityDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type planWeekRealityDao struct { + *internal.PlanWeekRealityDao +} + +var ( + // PlanWeekReality is globally public accessible object for table tools_gen_table operations. + PlanWeekReality = planWeekRealityDao{ + internal.NewPlanWeekRealityDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/plant.go b/internal/app/system/dao/plant.go new file mode 100644 index 0000000..378f185 --- /dev/null +++ b/internal/app/system/dao/plant.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-04-12 10:38:43 +// 生成路径: internal/app/system/dao/plant.go +// 生成人:gfast +// desc:电站信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// plantDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type plantDao struct { + *internal.PlantDao +} + +var ( + // Plant is globally public accessible object for table tools_gen_table operations. + Plant = plantDao{ + internal.NewPlantDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/project_finance.go b/internal/app/system/dao/project_finance.go new file mode 100644 index 0000000..0e76a53 --- /dev/null +++ b/internal/app/system/dao/project_finance.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-04-29 12:01:01 +// 生成路径: internal/app/system/dao/project_finance.go +// 生成人:gfast +// desc:项目财务 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// projectFinanceDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type projectFinanceDao struct { + *internal.ProjectFinanceDao +} + +var ( + // ProjectFinance is globally public accessible object for table tools_gen_table operations. + ProjectFinance = projectFinanceDao{ + internal.NewProjectFinanceDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/project_schedule.go b/internal/app/system/dao/project_schedule.go new file mode 100644 index 0000000..c13e14d --- /dev/null +++ b/internal/app/system/dao/project_schedule.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-03-13 18:17:32 +// 生成路径: internal/app/system/dao/project_schedule.go +// 生成人:gfast +// desc:项目排期 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// projectScheduleDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type projectScheduleDao struct { + *internal.ProjectScheduleDao +} + +var ( + // ProjectSchedule is globally public accessible object for table tools_gen_table operations. + ProjectSchedule = projectScheduleDao{ + internal.NewProjectScheduleDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/pv_module.go b/internal/app/system/dao/pv_module.go new file mode 100644 index 0000000..2f1e6a4 --- /dev/null +++ b/internal/app/system/dao/pv_module.go @@ -0,0 +1,25 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// internalPvModuleDao is internal type for wrapping internal DAO implements. +type internalPvModuleDao = *internal.PvModuleDao + +// pvModuleDao is the data access object for table pv_module. +// You can define custom methods on it to extend its functionality as you wish. +type pvModuleDao struct { + internalPvModuleDao +} + +// PvModule is globally public accessible object for table pv_module operations. +var PvModule = pvModuleDao{ + internal.NewPvModuleDao(), +} + +// Fill with you ideas below. diff --git a/internal/app/system/dao/qianqi_bubantu.go b/internal/app/system/dao/qianqi_bubantu.go new file mode 100644 index 0000000..2ff23eb --- /dev/null +++ b/internal/app/system/dao/qianqi_bubantu.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-31 11:44:41 +// 生成路径: internal/app/system/dao/qianqi_bubantu.go +// 生成人:gfast +// desc:布板图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// qianqiBubantuDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type qianqiBubantuDao struct { + *internal.QianqiBubantuDao +} + +var ( + // QianqiBubantu is globally public accessible object for table tools_gen_table operations. + QianqiBubantu = qianqiBubantuDao{ + internal.NewQianqiBubantuDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/qianqi_camera.go b/internal/app/system/dao/qianqi_camera.go new file mode 100644 index 0000000..2820f23 --- /dev/null +++ b/internal/app/system/dao/qianqi_camera.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-09-30 22:37:34 +// 生成路径: internal/app/system/dao/qianqi_camera.go +// 生成人:gfast +// desc:摄像头 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// qianqiCameraDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type qianqiCameraDao struct { + *internal.QianqiCameraDao +} + +var ( + // QianqiCamera is globally public accessible object for table tools_gen_table operations. + QianqiCamera = qianqiCameraDao{ + internal.NewQianqiCameraDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/qianqi_cameras.go b/internal/app/system/dao/qianqi_cameras.go new file mode 100644 index 0000000..ab6e140 --- /dev/null +++ b/internal/app/system/dao/qianqi_cameras.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-31 09:48:11 +// 生成路径: internal/app/system/dao/qianqi_cameras.go +// 生成人:gfast +// desc:所有摄像头列 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// qianqiCamerasDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type qianqiCamerasDao struct { + *internal.QianqiCamerasDao +} + +var ( + // QianqiCameras is globally public accessible object for table tools_gen_table operations. + QianqiCameras = qianqiCamerasDao{ + internal.NewQianqiCamerasDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/qianqi_dixing.go b/internal/app/system/dao/qianqi_dixing.go new file mode 100644 index 0000000..32f4fc0 --- /dev/null +++ b/internal/app/system/dao/qianqi_dixing.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-31 11:44:56 +// 生成路径: internal/app/system/dao/qianqi_dixing.go +// 生成人:gfast +// desc:地形 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// qianqiDixingDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type qianqiDixingDao struct { + *internal.QianqiDixingDao +} + +var ( + // QianqiDixing is globally public accessible object for table tools_gen_table operations. + QianqiDixing = qianqiDixingDao{ + internal.NewQianqiDixingDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/qianqi_fangzhen.go b/internal/app/system/dao/qianqi_fangzhen.go new file mode 100644 index 0000000..a0da020 --- /dev/null +++ b/internal/app/system/dao/qianqi_fangzhen.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-31 11:20:54 +// 生成路径: internal/app/system/dao/qianqi_fangzhen.go +// 生成人:gfast +// desc:方阵 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// qianqiFangzhenDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type qianqiFangzhenDao struct { + *internal.QianqiFangzhenDao +} + +var ( + // QianqiFangzhen is globally public accessible object for table tools_gen_table operations. + QianqiFangzhen = qianqiFangzhenDao{ + internal.NewQianqiFangzhenDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/qianqi_guangfuban.go b/internal/app/system/dao/qianqi_guangfuban.go new file mode 100644 index 0000000..bbd9162 --- /dev/null +++ b/internal/app/system/dao/qianqi_guangfuban.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-31 11:31:49 +// 生成路径: internal/app/system/dao/qianqi_guangfuban.go +// 生成人:gfast +// desc:光伏板模型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// qianqiGuangfubanDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type qianqiGuangfubanDao struct { + *internal.QianqiGuangfubanDao +} + +var ( + // QianqiGuangfuban is globally public accessible object for table tools_gen_table operations. + QianqiGuangfuban = qianqiGuangfubanDao{ + internal.NewQianqiGuangfubanDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/qianqi_guangfuban_ids.go b/internal/app/system/dao/qianqi_guangfuban_ids.go new file mode 100644 index 0000000..337f76a --- /dev/null +++ b/internal/app/system/dao/qianqi_guangfuban_ids.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-05 16:00:23 +// 生成路径: internal/app/system/dao/qianqi_guangfuban_ids.go +// 生成人:gfast +// desc:光伏板模型的id +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// qianqiGuangfubanIdsDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type qianqiGuangfubanIdsDao struct { + *internal.QianqiGuangfubanIdsDao +} + +var ( + // QianqiGuangfubanIds is globally public accessible object for table tools_gen_table operations. + QianqiGuangfubanIds = qianqiGuangfubanIdsDao{ + internal.NewQianqiGuangfubanIdsDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/qianqi_guangfuban_ids_lizhu.go b/internal/app/system/dao/qianqi_guangfuban_ids_lizhu.go new file mode 100644 index 0000000..2953c9b --- /dev/null +++ b/internal/app/system/dao/qianqi_guangfuban_ids_lizhu.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-09-05 12:10:40 +// 生成路径: internal/app/system/dao/qianqi_guangfuban_ids_lizhu.go +// 生成人:gfast +// desc:光伏板立柱 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// qianqiGuangfubanIdsLizhuDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type qianqiGuangfubanIdsLizhuDao struct { + *internal.QianqiGuangfubanIdsLizhuDao +} + +var ( + // QianqiGuangfubanIdsLizhu is globally public accessible object for table tools_gen_table operations. + QianqiGuangfubanIdsLizhu = qianqiGuangfubanIdsLizhuDao{ + internal.NewQianqiGuangfubanIdsLizhuDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/qianqi_guangfuban_ids_zhijia.go b/internal/app/system/dao/qianqi_guangfuban_ids_zhijia.go new file mode 100644 index 0000000..36086e3 --- /dev/null +++ b/internal/app/system/dao/qianqi_guangfuban_ids_zhijia.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-09-05 12:10:51 +// 生成路径: internal/app/system/dao/qianqi_guangfuban_ids_zhijia.go +// 生成人:gfast +// desc:光伏板支架 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// qianqiGuangfubanIdsZhijiaDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type qianqiGuangfubanIdsZhijiaDao struct { + *internal.QianqiGuangfubanIdsZhijiaDao +} + +var ( + // QianqiGuangfubanIdsZhijia is globally public accessible object for table tools_gen_table operations. + QianqiGuangfubanIdsZhijia = qianqiGuangfubanIdsZhijiaDao{ + internal.NewQianqiGuangfubanIdsZhijiaDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/qianqi_guangfuban_ids_zhuangdian.go b/internal/app/system/dao/qianqi_guangfuban_ids_zhuangdian.go new file mode 100644 index 0000000..9b6417e --- /dev/null +++ b/internal/app/system/dao/qianqi_guangfuban_ids_zhuangdian.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-09-05 12:07:41 +// 生成路径: internal/app/system/dao/qianqi_guangfuban_ids_zhuangdian.go +// 生成人:gfast +// desc:光伏板桩点 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// qianqiGuangfubanIdsZhuangdianDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type qianqiGuangfubanIdsZhuangdianDao struct { + *internal.QianqiGuangfubanIdsZhuangdianDao +} + +var ( + // QianqiGuangfubanIdsZhuangdian is globally public accessible object for table tools_gen_table operations. + QianqiGuangfubanIdsZhuangdian = qianqiGuangfubanIdsZhuangdianDao{ + internal.NewQianqiGuangfubanIdsZhuangdianDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/qianqi_guangfuban_zuchuan.go b/internal/app/system/dao/qianqi_guangfuban_zuchuan.go new file mode 100644 index 0000000..4df4a49 --- /dev/null +++ b/internal/app/system/dao/qianqi_guangfuban_zuchuan.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-17 10:37:21 +// 生成路径: internal/app/system/dao/qianqi_guangfuban_zuchuan.go +// 生成人:xyb +// desc:组串 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// qianqiGuangfubanZuchuanDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type qianqiGuangfubanZuchuanDao struct { + *internal.QianqiGuangfubanZuchuanDao +} + +var ( + // QianqiGuangfubanZuchuan is globally public accessible object for table tools_gen_table operations. + QianqiGuangfubanZuchuan = qianqiGuangfubanZuchuanDao{ + internal.NewQianqiGuangfubanZuchuanDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/qianqi_jidianxianlu.go b/internal/app/system/dao/qianqi_jidianxianlu.go new file mode 100644 index 0000000..1f1bc39 --- /dev/null +++ b/internal/app/system/dao/qianqi_jidianxianlu.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-04 16:29:44 +// 生成路径: internal/app/system/dao/qianqi_jidianxianlu.go +// 生成人:gfast +// desc:集电线路 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// qianqiJidianxianluDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type qianqiJidianxianluDao struct { + *internal.QianqiJidianxianluDao +} + +var ( + // QianqiJidianxianlu is globally public accessible object for table tools_gen_table operations. + QianqiJidianxianlu = qianqiJidianxianluDao{ + internal.NewQianqiJidianxianluDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/qianqi_moxing.go b/internal/app/system/dao/qianqi_moxing.go new file mode 100644 index 0000000..aea931f --- /dev/null +++ b/internal/app/system/dao/qianqi_moxing.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-31 11:09:26 +// 生成路径: internal/app/system/dao/qianqi_moxing.go +// 生成人:gfast +// desc:倾斜模型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// qianqiMoxingDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type qianqiMoxingDao struct { + *internal.QianqiMoxingDao +} + +var ( + // QianqiMoxing is globally public accessible object for table tools_gen_table operations. + QianqiMoxing = qianqiMoxingDao{ + internal.NewQianqiMoxingDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/qianqi_nibianqi.go b/internal/app/system/dao/qianqi_nibianqi.go new file mode 100644 index 0000000..1f72a41 --- /dev/null +++ b/internal/app/system/dao/qianqi_nibianqi.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-31 09:40:17 +// 生成路径: internal/app/system/dao/qianqi_nibianqi.go +// 生成人:gfast +// desc:逆变器 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// qianqiNibianqiDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type qianqiNibianqiDao struct { + *internal.QianqiNibianqiDao +} + +var ( + // QianqiNibianqi is globally public accessible object for table tools_gen_table operations. + QianqiNibianqi = qianqiNibianqiDao{ + internal.NewQianqiNibianqiDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/qianqi_pingchang.go b/internal/app/system/dao/qianqi_pingchang.go new file mode 100644 index 0000000..effd097 --- /dev/null +++ b/internal/app/system/dao/qianqi_pingchang.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-08 10:08:24 +// 生成路径: internal/app/system/dao/qianqi_pingchang.go +// 生成人:gfast +// desc:平场数据 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// qianqiPingchangDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type qianqiPingchangDao struct { + *internal.QianqiPingchangDao +} + +var ( + // QianqiPingchang is globally public accessible object for table tools_gen_table operations. + QianqiPingchang = qianqiPingchangDao{ + internal.NewQianqiPingchangDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/qianqi_redline.go b/internal/app/system/dao/qianqi_redline.go new file mode 100644 index 0000000..9e5accd --- /dev/null +++ b/internal/app/system/dao/qianqi_redline.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-31 11:45:12 +// 生成路径: internal/app/system/dao/qianqi_redline.go +// 生成人:gfast +// desc:红线 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// qianqiRedlineDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type qianqiRedlineDao struct { + *internal.QianqiRedlineDao +} + +var ( + // QianqiRedline is globally public accessible object for table tools_gen_table operations. + QianqiRedline = qianqiRedlineDao{ + internal.NewQianqiRedlineDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/qianqi_redline_tudiliuzhuan.go b/internal/app/system/dao/qianqi_redline_tudiliuzhuan.go new file mode 100644 index 0000000..51b5c6e --- /dev/null +++ b/internal/app/system/dao/qianqi_redline_tudiliuzhuan.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-04 11:47:15 +// 生成路径: internal/app/system/dao/qianqi_redline_tudiliuzhuan.go +// 生成人:gfast +// desc:土地流转 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// qianqiRedlineTudiliuzhuanDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type qianqiRedlineTudiliuzhuanDao struct { + *internal.QianqiRedlineTudiliuzhuanDao +} + +var ( + // QianqiRedlineTudiliuzhuan is globally public accessible object for table tools_gen_table operations. + QianqiRedlineTudiliuzhuan = qianqiRedlineTudiliuzhuanDao{ + internal.NewQianqiRedlineTudiliuzhuanDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/qianqi_road.go b/internal/app/system/dao/qianqi_road.go new file mode 100644 index 0000000..9d232b5 --- /dev/null +++ b/internal/app/system/dao/qianqi_road.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-04 16:24:38 +// 生成路径: internal/app/system/dao/qianqi_road.go +// 生成人:gfast +// desc:道路 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// qianqiRoadDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type qianqiRoadDao struct { + *internal.QianqiRoadDao +} + +var ( + // QianqiRoad is globally public accessible object for table tools_gen_table operations. + QianqiRoad = qianqiRoadDao{ + internal.NewQianqiRoadDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/qianqi_xiangbian.go b/internal/app/system/dao/qianqi_xiangbian.go new file mode 100644 index 0000000..460fe4c --- /dev/null +++ b/internal/app/system/dao/qianqi_xiangbian.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-31 09:52:13 +// 生成路径: internal/app/system/dao/qianqi_xiangbian.go +// 生成人:gfast +// desc:箱变 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// qianqiXiangbianDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type qianqiXiangbianDao struct { + *internal.QianqiXiangbianDao +} + +var ( + // QianqiXiangbian is globally public accessible object for table tools_gen_table operations. + QianqiXiangbian = qianqiXiangbianDao{ + internal.NewQianqiXiangbianDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/reminders.go b/internal/app/system/dao/reminders.go new file mode 100644 index 0000000..a34f3ea --- /dev/null +++ b/internal/app/system/dao/reminders.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-05-14 14:55:52 +// 生成路径: internal/app/system/dao/reminders.go +// 生成人:gfast +// desc:App-消息-提醒 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// remindersDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type remindersDao struct { + *internal.RemindersDao +} + +var ( + // Reminders is globally public accessible object for table tools_gen_table operations. + Reminders = remindersDao{ + internal.NewRemindersDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/sub_project.go b/internal/app/system/dao/sub_project.go new file mode 100644 index 0000000..635a188 --- /dev/null +++ b/internal/app/system/dao/sub_project.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-03-21 18:53:15 +// 生成路径: internal/app/system/dao/sub_project.go +// 生成人:gfast +// desc:子项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// subProjectDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type subProjectDao struct { + *internal.SubProjectDao +} + +var ( + // SubProject is globally public accessible object for table tools_gen_table operations. + SubProject = subProjectDao{ + internal.NewSubProjectDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/sys_auth_rule.go b/internal/app/system/dao/sys_auth_rule.go new file mode 100644 index 0000000..de4dfd0 --- /dev/null +++ b/internal/app/system/dao/sys_auth_rule.go @@ -0,0 +1,24 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// sysAuthRuleDao is the data access object for table sys_auth_rule. +// You can define custom methods on it to extend its functionality as you wish. +type sysAuthRuleDao struct { + *internal.SysAuthRuleDao +} + +var ( + // SysAuthRule is globally public accessible object for table sys_auth_rule operations. + SysAuthRule = sysAuthRuleDao{ + internal.NewSysAuthRuleDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/sys_dept.go b/internal/app/system/dao/sys_dept.go new file mode 100644 index 0000000..4a40ace --- /dev/null +++ b/internal/app/system/dao/sys_dept.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// internalSysDeptDao is internal type for wrapping internal DAO implements. +type internalSysDeptDao = *internal.SysDeptDao + +// sysDeptDao is the data access object for table sys_dept. +// You can define custom methods on it to extend its functionality as you wish. +type sysDeptDao struct { + internalSysDeptDao +} + +var ( + // SysDept is globally public accessible object for table sys_dept operations. + SysDept = sysDeptDao{ + internal.NewSysDeptDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/sys_file.go b/internal/app/system/dao/sys_file.go new file mode 100644 index 0000000..725d4c1 --- /dev/null +++ b/internal/app/system/dao/sys_file.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-29 15:32:09 +// 生成路径: internal/app/system/dao/sys_file.go +// 生成人:gfast +// desc:文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// sysFileDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type sysFileDao struct { + *internal.SysFileDao +} + +var ( + // SysFile is globally public accessible object for table tools_gen_table operations. + SysFile = sysFileDao{ + internal.NewSysFileDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/sys_file_type.go b/internal/app/system/dao/sys_file_type.go new file mode 100644 index 0000000..437221d --- /dev/null +++ b/internal/app/system/dao/sys_file_type.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-29 15:27:54 +// 生成路径: internal/app/system/dao/sys_file_type.go +// 生成人:gfast +// desc:文件类型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// sysFileTypeDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type sysFileTypeDao struct { + *internal.SysFileTypeDao +} + +var ( + // SysFileType is globally public accessible object for table tools_gen_table operations. + SysFileType = sysFileTypeDao{ + internal.NewSysFileTypeDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/sys_job.go b/internal/app/system/dao/sys_job.go new file mode 100644 index 0000000..0bd7cbc --- /dev/null +++ b/internal/app/system/dao/sys_job.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-01-12 17:43:50 +// 生成路径: internal/app/system/dao/sys_job.go +// 生成人:gfast +// desc:定时任务 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// sysJobDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type sysJobDao struct { + *internal.SysJobDao +} + +var ( + // SysJob is globally public accessible object for table tools_gen_table operations. + SysJob = sysJobDao{ + internal.NewSysJobDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/sys_job_log.go b/internal/app/system/dao/sys_job_log.go new file mode 100644 index 0000000..e69ffdf --- /dev/null +++ b/internal/app/system/dao/sys_job_log.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// internalSysJobLogDao is internal type for wrapping internal DAO implements. +type internalSysJobLogDao = *internal.SysJobLogDao + +// sysJobLogDao is the data access object for table sys_job_log. +// You can define custom methods on it to extend its functionality as you wish. +type sysJobLogDao struct { + internalSysJobLogDao +} + +var ( + // SysJobLog is globally public accessible object for table sys_job_log operations. + SysJobLog = sysJobLogDao{ + internal.NewSysJobLogDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/sys_login_log.go b/internal/app/system/dao/sys_login_log.go new file mode 100644 index 0000000..1b7359f --- /dev/null +++ b/internal/app/system/dao/sys_login_log.go @@ -0,0 +1,24 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// sysLoginLogDao is the data access object for table sys_login_log. +// You can define custom methods on it to extend its functionality as you wish. +type sysLoginLogDao struct { + *internal.SysLoginLogDao +} + +var ( + // SysLoginLog is globally public accessible object for table sys_login_log operations. + SysLoginLog = sysLoginLogDao{ + internal.NewSysLoginLogDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/sys_oper_log.go b/internal/app/system/dao/sys_oper_log.go new file mode 100644 index 0000000..26e1291 --- /dev/null +++ b/internal/app/system/dao/sys_oper_log.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// internalSysOperLogDao is internal type for wrapping internal DAO implements. +type internalSysOperLogDao = *internal.SysOperLogDao + +// sysOperLogDao is the data access object for table sys_oper_log. +// You can define custom methods on it to extend its functionality as you wish. +type sysOperLogDao struct { + internalSysOperLogDao +} + +var ( + // SysOperLog is globally public accessible object for table sys_oper_log operations. + SysOperLog = sysOperLogDao{ + internal.NewSysOperLogDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/sys_post.go b/internal/app/system/dao/sys_post.go new file mode 100644 index 0000000..a3bb45f --- /dev/null +++ b/internal/app/system/dao/sys_post.go @@ -0,0 +1,24 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// sysPostDao is the data access object for table sys_post. +// You can define custom methods on it to extend its functionality as you wish. +type sysPostDao struct { + *internal.SysPostDao +} + +var ( + // SysPost is globally public accessible object for table sys_post operations. + SysPost = sysPostDao{ + internal.NewSysPostDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/sys_project.go b/internal/app/system/dao/sys_project.go new file mode 100644 index 0000000..1738183 --- /dev/null +++ b/internal/app/system/dao/sys_project.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-27 15:20:49 +// 生成路径: internal/app/system/dao/sys_project.go +// 生成人:gfast +// desc:项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// sysProjectDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type sysProjectDao struct { + *internal.SysProjectDao +} + +var ( + // SysProject is globally public accessible object for table tools_gen_table operations. + SysProject = sysProjectDao{ + internal.NewSysProjectDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/sys_project_introduce.go b/internal/app/system/dao/sys_project_introduce.go new file mode 100644 index 0000000..04e174c --- /dev/null +++ b/internal/app/system/dao/sys_project_introduce.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-03-29 10:05:02 +// 生成路径: internal/app/system/dao/sys_project_introduce.go +// 生成人:gfast +// desc:项目新闻 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// sysProjectIntroduceDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type sysProjectIntroduceDao struct { + *internal.SysProjectIntroduceDao +} + +var ( + // SysProjectIntroduce is globally public accessible object for table tools_gen_table operations. + SysProjectIntroduce = sysProjectIntroduceDao{ + internal.NewSysProjectIntroduceDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/sys_project_value.go b/internal/app/system/dao/sys_project_value.go new file mode 100644 index 0000000..14c20ef --- /dev/null +++ b/internal/app/system/dao/sys_project_value.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-03-27 12:55:26 +// 生成路径: internal/app/system/dao/sys_project_value.go +// 生成人:xiaoyang +// desc:projectValue +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// sysProjectValueDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type sysProjectValueDao struct { + *internal.SysProjectValueDao +} + +var ( + // SysProjectValue is globally public accessible object for table tools_gen_table operations. + SysProjectValue = sysProjectValueDao{ + internal.NewSysProjectValueDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/sys_role.go b/internal/app/system/dao/sys_role.go new file mode 100644 index 0000000..edb6eaa --- /dev/null +++ b/internal/app/system/dao/sys_role.go @@ -0,0 +1,24 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// sysRoleDao is the data access object for table sys_role. +// You can define custom methods on it to extend its functionality as you wish. +type sysRoleDao struct { + *internal.SysRoleDao +} + +var ( + // SysRole is globally public accessible object for table sys_role operations. + SysRole = sysRoleDao{ + internal.NewSysRoleDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/sys_role_dept.go b/internal/app/system/dao/sys_role_dept.go new file mode 100644 index 0000000..cf7785d --- /dev/null +++ b/internal/app/system/dao/sys_role_dept.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// internalSysRoleDeptDao is internal type for wrapping internal DAO implements. +type internalSysRoleDeptDao = *internal.SysRoleDeptDao + +// sysRoleDeptDao is the data access object for table sys_role_dept. +// You can define custom methods on it to extend its functionality as you wish. +type sysRoleDeptDao struct { + internalSysRoleDeptDao +} + +var ( + // SysRoleDept is globally public accessible object for table sys_role_dept operations. + SysRoleDept = sysRoleDeptDao{ + internal.NewSysRoleDeptDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/sys_user.go b/internal/app/system/dao/sys_user.go new file mode 100644 index 0000000..0eb491b --- /dev/null +++ b/internal/app/system/dao/sys_user.go @@ -0,0 +1,24 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// sysUserDao is the data access object for table sys_user. +// You can define custom methods on it to extend its functionality as you wish. +type sysUserDao struct { + *internal.SysUserDao +} + +var ( + // SysUser is globally public accessible object for table sys_user operations. + SysUser = sysUserDao{ + internal.NewSysUserDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/sys_user_online.go b/internal/app/system/dao/sys_user_online.go new file mode 100644 index 0000000..1b43938 --- /dev/null +++ b/internal/app/system/dao/sys_user_online.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// internalSysUserOnlineDao is internal type for wrapping internal DAO implements. +type internalSysUserOnlineDao = *internal.SysUserOnlineDao + +// sysUserOnlineDao is the data access object for table sys_user_online. +// You can define custom methods on it to extend its functionality as you wish. +type sysUserOnlineDao struct { + internalSysUserOnlineDao +} + +var ( + // SysUserOnline is globally public accessible object for table sys_user_online operations. + SysUserOnline = sysUserOnlineDao{ + internal.NewSysUserOnlineDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/sys_user_post.go b/internal/app/system/dao/sys_user_post.go new file mode 100644 index 0000000..b31dfbd --- /dev/null +++ b/internal/app/system/dao/sys_user_post.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// internalSysUserPostDao is internal type for wrapping internal DAO implements. +type internalSysUserPostDao = *internal.SysUserPostDao + +// sysUserPostDao is the data access object for table sys_user_post. +// You can define custom methods on it to extend its functionality as you wish. +type sysUserPostDao struct { + internalSysUserPostDao +} + +var ( + // SysUserPost is globally public accessible object for table sys_user_post operations. + SysUserPost = sysUserPostDao{ + internal.NewSysUserPostDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/sys_user_project.go b/internal/app/system/dao/sys_user_project.go new file mode 100644 index 0000000..6a57482 --- /dev/null +++ b/internal/app/system/dao/sys_user_project.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-27 15:20:52 +// 生成路径: internal/app/system/dao/sys_user_project.go +// 生成人:gfast +// desc:用户和项目关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// sysUserProjectDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type sysUserProjectDao struct { + *internal.SysUserProjectDao +} + +var ( + // SysUserProject is globally public accessible object for table tools_gen_table operations. + SysUserProject = sysUserProjectDao{ + internal.NewSysUserProjectDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/sys_wechat_role.go b/internal/app/system/dao/sys_wechat_role.go new file mode 100644 index 0000000..f3da250 --- /dev/null +++ b/internal/app/system/dao/sys_wechat_role.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-01-22 15:05:42 +// 生成路径: internal/app/system/dao/sys_wechat_role.go +// 生成人:gfast +// desc:微信角色 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// sysWechatRoleDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type sysWechatRoleDao struct { + *internal.SysWechatRoleDao +} + +var ( + // SysWechatRole is globally public accessible object for table tools_gen_table operations. + SysWechatRole = sysWechatRoleDao{ + internal.NewSysWechatRoleDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/template_data.go b/internal/app/system/dao/template_data.go new file mode 100644 index 0000000..6cb061c --- /dev/null +++ b/internal/app/system/dao/template_data.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-12-08 14:21:01 +// 生成路径: internal/app/system/dao/template_data.go +// 生成人:gfast +// desc:工程资料>资料 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// templateDataDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type templateDataDao struct { + *internal.TemplateDataDao +} + +var ( + // TemplateData is globally public accessible object for table tools_gen_table operations. + TemplateData = templateDataDao{ + internal.NewTemplateDataDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/template_data_junior.go b/internal/app/system/dao/template_data_junior.go new file mode 100644 index 0000000..558cb7a --- /dev/null +++ b/internal/app/system/dao/template_data_junior.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-12-08 14:21:01 +// 生成路径: internal/app/system/dao/template_data_junior.go +// 生成人:gfast +// desc:工程资料>资料>下级模板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// templateDataJuniorDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type templateDataJuniorDao struct { + *internal.TemplateDataJuniorDao +} + +var ( + // TemplateDataJunior is globally public accessible object for table tools_gen_table operations. + TemplateDataJunior = templateDataJuniorDao{ + internal.NewTemplateDataJuniorDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/template_data_source_data.go b/internal/app/system/dao/template_data_source_data.go new file mode 100644 index 0000000..987af33 --- /dev/null +++ b/internal/app/system/dao/template_data_source_data.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-12-08 10:06:54 +// 生成路径: internal/app/system/dao/template_data_source_data.go +// 生成人:gfast +// desc:模板资料源数据 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// templateDataSourceDataDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type templateDataSourceDataDao struct { + *internal.TemplateDataSourceDataDao +} + +var ( + // TemplateDataSourceData is globally public accessible object for table tools_gen_table operations. + TemplateDataSourceData = templateDataSourceDataDao{ + internal.NewTemplateDataSourceDataDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/todo_tasks.go b/internal/app/system/dao/todo_tasks.go new file mode 100644 index 0000000..8cfe175 --- /dev/null +++ b/internal/app/system/dao/todo_tasks.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-05-15 17:30:14 +// 生成路径: internal/app/system/dao/todo_tasks.go +// 生成人:gfast +// desc:App-待办 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// todoTasksDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type todoTasksDao struct { + *internal.TodoTasksDao +} + +var ( + // TodoTasks is globally public accessible object for table tools_gen_table operations. + TodoTasks = todoTasksDao{ + internal.NewTodoTasksDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/tools_gen_table.go b/internal/app/system/dao/tools_gen_table.go new file mode 100644 index 0000000..bb727c5 --- /dev/null +++ b/internal/app/system/dao/tools_gen_table.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// internalToolsGenTableDao is internal type for wrapping internal DAO implements. +type internalToolsGenTableDao = *internal.ToolsGenTableDao + +// toolsGenTableDao is the data access object for table tools_gen_table. +// You can define custom methods on it to extend its functionality as you wish. +type toolsGenTableDao struct { + internalToolsGenTableDao +} + +var ( + // ToolsGenTable is globally public accessible object for table tools_gen_table operations. + ToolsGenTable = toolsGenTableDao{ + internal.NewToolsGenTableDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/tools_gen_table_column.go b/internal/app/system/dao/tools_gen_table_column.go new file mode 100644 index 0000000..984fb20 --- /dev/null +++ b/internal/app/system/dao/tools_gen_table_column.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// internalToolsGenTableColumnDao is internal type for wrapping internal DAO implements. +type internalToolsGenTableColumnDao = *internal.ToolsGenTableColumnDao + +// toolsGenTableColumnDao is the data access object for table tools_gen_table_column. +// You can define custom methods on it to extend its functionality as you wish. +type toolsGenTableColumnDao struct { + internalToolsGenTableColumnDao +} + +var ( + // ToolsGenTableColumn is globally public accessible object for table tools_gen_table_column operations. + ToolsGenTableColumn = toolsGenTableColumnDao{ + internal.NewToolsGenTableColumnDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/user_activity.go b/internal/app/system/dao/user_activity.go new file mode 100644 index 0000000..d11e6f8 --- /dev/null +++ b/internal/app/system/dao/user_activity.go @@ -0,0 +1,27 @@ +// ================================================================================= +// This is auto-generated by GoFrame CLI tool only once. Fill this file as you wish. +// ================================================================================= + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// internalUserActivityDao is internal type for wrapping internal DAO implements. +type internalUserActivityDao = *internal.UserActivityDao + +// userActivityDao is the data access object for table user_activity. +// You can define custom methods on it to extend its functionality as you wish. +type userActivityDao struct { + internalUserActivityDao +} + +var ( + // UserActivity is globally public accessible object for table user_activity operations. + UserActivity = userActivityDao{ + internal.NewUserActivityDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/user_registration.go b/internal/app/system/dao/user_registration.go new file mode 100644 index 0000000..49ea695 --- /dev/null +++ b/internal/app/system/dao/user_registration.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-07-26 15:32:12 +// 生成路径: internal/app/system/dao/user_registration.go +// 生成人:gfast +// desc:极光推送 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// userRegistrationDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type userRegistrationDao struct { + *internal.UserRegistrationDao +} + +var ( + // UserRegistration is globally public accessible object for table tools_gen_table operations. + UserRegistration = userRegistrationDao{ + internal.NewUserRegistrationDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/work_schedule.go b/internal/app/system/dao/work_schedule.go new file mode 100644 index 0000000..d772fcb --- /dev/null +++ b/internal/app/system/dao/work_schedule.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-03-20 10:02:26 +// 生成路径: internal/app/system/dao/work_schedule.go +// 生成人:gfast +// desc:工作计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// workScheduleDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type workScheduleDao struct { + *internal.WorkScheduleDao +} + +var ( + // WorkSchedule is globally public accessible object for table tools_gen_table operations. + WorkSchedule = workScheduleDao{ + internal.NewWorkScheduleDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/work_status.go b/internal/app/system/dao/work_status.go new file mode 100644 index 0000000..a902433 --- /dev/null +++ b/internal/app/system/dao/work_status.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-03-19 11:45:09 +// 生成路径: internal/app/system/dao/work_status.go +// 生成人:gfast +// desc:工作状态 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// workStatusDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type workStatusDao struct { + *internal.WorkStatusDao +} + +var ( + // WorkStatus is globally public accessible object for table tools_gen_table operations. + WorkStatus = workStatusDao{ + internal.NewWorkStatusDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/xiangmuhuafenbiao.go b/internal/app/system/dao/xiangmuhuafenbiao.go new file mode 100644 index 0000000..cc943cd --- /dev/null +++ b/internal/app/system/dao/xiangmuhuafenbiao.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-10-07 16:08:10 +// 生成路径: internal/app/system/dao/xiangmuhuafenbiao.go +// 生成人:gfast +// desc:项目划分 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// xiangmuhuafenbiaoDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type xiangmuhuafenbiaoDao struct { + *internal.XiangmuhuafenbiaoDao +} + +var ( + // Xiangmuhuafenbiao is globally public accessible object for table tools_gen_table operations. + Xiangmuhuafenbiao = xiangmuhuafenbiaoDao{ + internal.NewXiangmuhuafenbiaoDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/ys7devices.go b/internal/app/system/dao/ys7devices.go new file mode 100644 index 0000000..f275748 --- /dev/null +++ b/internal/app/system/dao/ys7devices.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-03-01 12:49:32 +// 生成路径: internal/app/system/dao/ys7devices.go +// 生成人:gfast +// desc:荧石摄像头 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// ys7DevicesDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type ys7DevicesDao struct { + *internal.Ys7DevicesDao +} + +var ( + // Ys7Devices is globally public accessible object for table tools_gen_table operations. + Ys7Devices = ys7DevicesDao{ + internal.NewYs7DevicesDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/ys7devices_img.go b/internal/app/system/dao/ys7devices_img.go new file mode 100644 index 0000000..2da20af --- /dev/null +++ b/internal/app/system/dao/ys7devices_img.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2024-08-19 11:51:53 +// 生成路径: internal/app/system/dao/ys7devices_img.go +// 生成人:gfast +// desc:摄像头所拍摄到的所有图片(每月会定时清除) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// ys7DevicesImgDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type ys7DevicesImgDao struct { + *internal.Ys7DevicesImgDao +} + +var ( + // Ys7DevicesImg is globally public accessible object for table tools_gen_table operations. + Ys7DevicesImg = ys7DevicesImgDao{ + internal.NewYs7DevicesImgDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/dao/zmkg_gis_model_lib.go b/internal/app/system/dao/zmkg_gis_model_lib.go new file mode 100644 index 0000000..b321d4d --- /dev/null +++ b/internal/app/system/dao/zmkg_gis_model_lib.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-07-31 10:18:14 +// 生成路径: internal/app/system/dao/zmkg_gis_model_lib.go +// 生成人:gfast +// desc:模型库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/dao/internal" +) + +// zmkgGisModelLibDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type zmkgGisModelLibDao struct { + *internal.ZmkgGisModelLibDao +} + +var ( + // ZmkgGisModelLib is globally public accessible object for table tools_gen_table operations. + ZmkgGisModelLib = zmkgGisModelLibDao{ + internal.NewZmkgGisModelLibDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/system/logic/appMenus/app_menus.go b/internal/app/system/logic/appMenus/app_menus.go new file mode 100644 index 0000000..320329b --- /dev/null +++ b/internal/app/system/logic/appMenus/app_menus.go @@ -0,0 +1,110 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-05-28 15:09:13 +// 生成路径: internal/app/system/logic/app_menus.go +// 生成人:gfast +// desc:app菜单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterAppMenus(New()) +} + +func New() *sAppMenus { + return &sAppMenus{} +} + +type sAppMenus struct{} + +func (s *sAppMenus) List(ctx context.Context, req *system.AppMenusSearchReq) (listRes *system.AppMenusSearchRes, err error) { + listRes = new(system.AppMenusSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.AppMenus.Ctx(ctx).WithAll() + if req.MenuId != "" { + m = m.Where(dao.AppMenus.Columns().MenuId+" = ?", req.MenuId) + } + if req.MenuName != "" { + m = m.Where(dao.AppMenus.Columns().MenuName+" like ?", "%"+req.MenuName+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.AppMenus.Columns().CreatedAt+" >=? AND "+dao.AppMenus.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "menu_id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.AppMenusInfoRes + err = m.Fields(system.AppMenusSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.AppMenusListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.AppMenusListRes{ + MenuId: v.MenuId, + MenuName: v.MenuName, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sAppMenus) GetByMenuId(ctx context.Context, menuId uint) (res *model.AppMenusInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.AppMenus.Ctx(ctx).WithAll().Where(dao.AppMenus.Columns().MenuId, menuId).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sAppMenus) Add(ctx context.Context, req *system.AppMenusAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.AppMenus.Ctx(ctx).Insert(do.AppMenus{ + MenuName: req.MenuName, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sAppMenus) Edit(ctx context.Context, req *system.AppMenusEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.AppMenus.Ctx(ctx).WherePri(req.MenuId).Update(do.AppMenus{ + MenuName: req.MenuName, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sAppMenus) Delete(ctx context.Context, menuIds []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.AppMenus.Ctx(ctx).Delete(dao.AppMenus.Columns().MenuId+" in (?)", menuIds) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/appRoleMenus/app_role_menus.go b/internal/app/system/logic/appRoleMenus/app_role_menus.go new file mode 100644 index 0000000..c53708d --- /dev/null +++ b/internal/app/system/logic/appRoleMenus/app_role_menus.go @@ -0,0 +1,116 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-05-28 15:11:15 +// 生成路径: internal/app/system/logic/app_role_menus.go +// 生成人:gfast +// desc:app角色绑定菜单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterAppRoleMenus(New()) +} + +func New() *sAppRoleMenus { + return &sAppRoleMenus{} +} + +type sAppRoleMenus struct{} + +func (s *sAppRoleMenus) List(ctx context.Context, req *system.AppRoleMenusSearchReq) (listRes *system.AppRoleMenusSearchRes, err error) { + listRes = new(system.AppRoleMenusSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.AppRoleMenus.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.AppRoleMenus.Columns().Id+" = ?", req.Id) + } + if req.RoleId != "" { + m = m.Where(dao.AppRoleMenus.Columns().RoleId+" = ?", gconv.Int(req.RoleId)) + } + if req.MenuId != "" { + m = m.Where(dao.AppRoleMenus.Columns().MenuId+" = ?", gconv.Int(req.MenuId)) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.AppRoleMenus.Columns().CreatedAt+" >=? AND "+dao.AppRoleMenus.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.AppRoleMenusInfoRes + err = m.Fields(system.AppRoleMenusSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.AppRoleMenusListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.AppRoleMenusListRes{ + Id: v.Id, + RoleId: v.RoleId, + MenuId: v.MenuId, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sAppRoleMenus) GetById(ctx context.Context, id uint) (res *model.AppRoleMenusInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.AppRoleMenus.Ctx(ctx).WithAll().Where(dao.AppRoleMenus.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sAppRoleMenus) Add(ctx context.Context, req *system.AppRoleMenusAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.AppRoleMenus.Ctx(ctx).Insert(do.AppRoleMenus{ + RoleId: req.RoleId, + MenuId: req.MenuId, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sAppRoleMenus) Edit(ctx context.Context, req *system.AppRoleMenusEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.AppRoleMenus.Ctx(ctx).WherePri(req.Id).Update(do.AppRoleMenus{ + RoleId: req.RoleId, + MenuId: req.MenuId, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sAppRoleMenus) Delete(ctx context.Context, ids []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.AppRoleMenus.Ctx(ctx).Delete(dao.AppRoleMenus.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/appRoles/app_roles.go b/internal/app/system/logic/appRoles/app_roles.go new file mode 100644 index 0000000..bc01f1e --- /dev/null +++ b/internal/app/system/logic/appRoles/app_roles.go @@ -0,0 +1,127 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-05-28 15:11:36 +// 生成路径: internal/app/system/logic/app_roles.go +// 生成人:gfast +// desc:app角色 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterAppRoles(New()) +} + +func New() *sAppRoles { + return &sAppRoles{} +} + +type sAppRoles struct{} + +func (s *sAppRoles) List(ctx context.Context, req *system.AppRolesSearchReq) (listRes *system.AppRolesSearchRes, err error) { + listRes = new(system.AppRolesSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.AppRoles.Ctx(ctx).WithAll() + if req.RoleId != "" { + m = m.Where(dao.AppRoles.Columns().RoleId+" = ?", req.RoleId) + } + if req.RoleName != "" { + m = m.Where(dao.AppRoles.Columns().RoleName+" like ?", "%"+req.RoleName+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.AppRoles.Columns().CreatedAt+" >=? AND "+dao.AppRoles.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "role_id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.AppRolesInfoRes + err = m.Fields(system.AppRolesSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.AppRolesListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.AppRolesListRes{ + RoleId: v.RoleId, + RoleName: v.RoleName, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sAppRoles) GetByRoleId(ctx context.Context, roleId uint) (res *model.AppRolesInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.AppRoles.Ctx(ctx).WithAll().Where(dao.AppRoles.Columns().RoleId, roleId).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sAppRoles) Add(ctx context.Context, req *system.AppRolesAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.AppRoles.Ctx(ctx).Insert(do.AppRoles{ + RoleName: req.RoleName, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sAppRoles) Edit(ctx context.Context, req *system.AppRolesEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.AppRoles.Ctx(ctx).WherePri(req.RoleId).Update(do.AppRoles{ + RoleName: req.RoleName, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + + // 修改角色菜单 + if len(req.MenuIds) > 0 { + insertData := make([]do.AppRoleMenus, 0, len(req.MenuIds)) + for _, menuId := range req.MenuIds { + insertData = append(insertData, do.AppRoleMenus{ + RoleId: req.RoleId, + MenuId: menuId, + }) + } + + // 删除原有的角色菜单 + _, err := dao.AppRoleMenus.Ctx(ctx).Where("role_id", req.RoleId).Delete() + liberr.ErrIsNil(ctx, err, "删除角色菜单失败") + _, err = dao.AppRoleMenus.Ctx(ctx).Data(insertData).Insert() + liberr.ErrIsNil(ctx, err, "添加角色菜单失败") + } + }) + return +} + +func (s *sAppRoles) Delete(ctx context.Context, roleIds []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.AppRoles.Ctx(ctx).Delete(dao.AppRoles.Columns().RoleId+" in (?)", roleIds) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/appUserDisableMenus/app_user_disable_menus.go b/internal/app/system/logic/appUserDisableMenus/app_user_disable_menus.go new file mode 100644 index 0000000..fa3f42b --- /dev/null +++ b/internal/app/system/logic/appUserDisableMenus/app_user_disable_menus.go @@ -0,0 +1,116 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-05-28 15:11:37 +// 生成路径: internal/app/system/logic/app_user_disable_menus.go +// 生成人:gfast +// desc:app用户禁用菜单关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterAppUserDisableMenus(New()) +} + +func New() *sAppUserDisableMenus { + return &sAppUserDisableMenus{} +} + +type sAppUserDisableMenus struct{} + +func (s *sAppUserDisableMenus) List(ctx context.Context, req *system.AppUserDisableMenusSearchReq) (listRes *system.AppUserDisableMenusSearchRes, err error) { + listRes = new(system.AppUserDisableMenusSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.AppUserDisableMenus.Ctx(ctx).WithAll() + if req.UserDisabledMenuId != "" { + m = m.Where(dao.AppUserDisableMenus.Columns().UserDisabledMenuId+" = ?", req.UserDisabledMenuId) + } + if req.UserId != "" { + m = m.Where(dao.AppUserDisableMenus.Columns().UserId+" = ?", gconv.Int(req.UserId)) + } + if req.MenuId != "" { + m = m.Where(dao.AppUserDisableMenus.Columns().MenuId+" = ?", gconv.Int(req.MenuId)) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.AppUserDisableMenus.Columns().CreatedAt+" >=? AND "+dao.AppUserDisableMenus.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "user_disabled_menu_id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.AppUserDisableMenusInfoRes + err = m.Fields(system.AppUserDisableMenusSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.AppUserDisableMenusListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.AppUserDisableMenusListRes{ + UserDisabledMenuId: v.UserDisabledMenuId, + UserId: v.UserId, + MenuId: v.MenuId, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sAppUserDisableMenus) GetByUserDisabledMenuId(ctx context.Context, userDisabledMenuId uint) (res *model.AppUserDisableMenusInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.AppUserDisableMenus.Ctx(ctx).WithAll().Where(dao.AppUserDisableMenus.Columns().UserDisabledMenuId, userDisabledMenuId).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sAppUserDisableMenus) Add(ctx context.Context, req *system.AppUserDisableMenusAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.AppUserDisableMenus.Ctx(ctx).Insert(do.AppUserDisableMenus{ + UserId: req.UserId, + MenuId: req.MenuId, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sAppUserDisableMenus) Edit(ctx context.Context, req *system.AppUserDisableMenusEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.AppUserDisableMenus.Ctx(ctx).WherePri(req.UserDisabledMenuId).Update(do.AppUserDisableMenus{ + UserId: req.UserId, + MenuId: req.MenuId, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sAppUserDisableMenus) Delete(ctx context.Context, userDisabledMenuIds []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.AppUserDisableMenus.Ctx(ctx).Delete(dao.AppUserDisableMenus.Columns().UserDisabledMenuId+" in (?)", userDisabledMenuIds) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/appUserMenus/app_user_menus.go b/internal/app/system/logic/appUserMenus/app_user_menus.go new file mode 100644 index 0000000..108bb37 --- /dev/null +++ b/internal/app/system/logic/appUserMenus/app_user_menus.go @@ -0,0 +1,116 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-05-28 15:11:37 +// 生成路径: internal/app/system/logic/app_user_menus.go +// 生成人:gfast +// desc:app用户菜单关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterAppUserMenus(New()) +} + +func New() *sAppUserMenus { + return &sAppUserMenus{} +} + +type sAppUserMenus struct{} + +func (s *sAppUserMenus) List(ctx context.Context, req *system.AppUserMenusSearchReq) (listRes *system.AppUserMenusSearchRes, err error) { + listRes = new(system.AppUserMenusSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.AppUserMenus.Ctx(ctx).WithAll() + if req.UserMenuId != "" { + m = m.Where(dao.AppUserMenus.Columns().UserMenuId+" = ?", req.UserMenuId) + } + if req.UserId != "" { + m = m.Where(dao.AppUserMenus.Columns().UserId+" = ?", gconv.Int(req.UserId)) + } + if req.MenuId != "" { + m = m.Where(dao.AppUserMenus.Columns().MenuId+" = ?", gconv.Int(req.MenuId)) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.AppUserMenus.Columns().CreatedAt+" >=? AND "+dao.AppUserMenus.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "user_menu_id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.AppUserMenusInfoRes + err = m.Fields(system.AppUserMenusSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.AppUserMenusListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.AppUserMenusListRes{ + UserMenuId: v.UserMenuId, + UserId: v.UserId, + MenuId: v.MenuId, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sAppUserMenus) GetByUserMenuId(ctx context.Context, userMenuId uint) (res *model.AppUserMenusInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.AppUserMenus.Ctx(ctx).WithAll().Where(dao.AppUserMenus.Columns().UserMenuId, userMenuId).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sAppUserMenus) Add(ctx context.Context, req *system.AppUserMenusAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.AppUserMenus.Ctx(ctx).Insert(do.AppUserMenus{ + UserId: req.UserId, + MenuId: req.MenuId, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sAppUserMenus) Edit(ctx context.Context, req *system.AppUserMenusEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.AppUserMenus.Ctx(ctx).WherePri(req.UserMenuId).Update(do.AppUserMenus{ + UserId: req.UserId, + MenuId: req.MenuId, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sAppUserMenus) Delete(ctx context.Context, userMenuIds []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.AppUserMenus.Ctx(ctx).Delete(dao.AppUserMenus.Columns().UserMenuId+" in (?)", userMenuIds) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/appUserRoles/app_user_roles.go b/internal/app/system/logic/appUserRoles/app_user_roles.go new file mode 100644 index 0000000..00b3268 --- /dev/null +++ b/internal/app/system/logic/appUserRoles/app_user_roles.go @@ -0,0 +1,221 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-05-28 15:11:37 +// 生成路径: internal/app/system/logic/app_user_roles.go +// 生成人:gfast +// desc:app用户角色关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "fmt" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterAppUserRoles(New()) +} + +func New() *sAppUserRoles { + return &sAppUserRoles{} +} + +type sAppUserRoles struct{} + +func (s *sAppUserRoles) List(ctx context.Context, req *system.AppUserRolesSearchReq) (listRes *system.AppUserRolesSearchRes, err error) { + listRes = new(system.AppUserRolesSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.AppUserRoles.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.AppUserRoles.Columns().Id+" = ?", req.Id) + } + if req.UserId != "" { + m = m.Where(dao.AppUserRoles.Columns().UserId+" = ?", gconv.Int(req.UserId)) + } + if req.RoleId != "" { + m = m.Where(dao.AppUserRoles.Columns().RoleId+" = ?", gconv.Int(req.RoleId)) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.AppUserRoles.Columns().CreatedAt+" >=? AND "+dao.AppUserRoles.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.AppUserRolesInfoRes + err = m.Fields(system.AppUserRolesSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.AppUserRolesListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.AppUserRolesListRes{ + Id: v.Id, + UserId: v.UserId, + RoleId: v.RoleId, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sAppUserRoles) GetById(ctx context.Context, id uint) (res *model.AppUserRolesInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.AppUserRoles.Ctx(ctx).WithAll().Where(dao.AppUserRoles.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sAppUserRoles) Add(ctx context.Context, req *system.AppUserRolesAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.AppUserRoles.Ctx(ctx).Insert(do.AppUserRoles{ + UserId: req.UserId, + RoleId: req.RoleId, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sAppUserRoles) Edit(ctx context.Context, req *system.AppUserRolesEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.AppUserRoles.Ctx(ctx).WherePri(req.Id).Update(do.AppUserRoles{ + UserId: req.UserId, + RoleId: req.RoleId, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sAppUserRoles) Delete(ctx context.Context, ids []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.AppUserRoles.Ctx(ctx).Delete(dao.AppUserRoles.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +func (s *sAppUserRoles) BindRole(ctx context.Context, req *system.AppUserRolesBindReq) error { + return g.Try(ctx, func(ctx context.Context) { + bindOrDeleteRoles := func(roles []int, majorRole int) error { + // 删除用户当前绑定的所有指定类型的角色 + _, err := dao.AppUserRoles.Ctx(ctx).Where(dao.AppUserRoles.Columns().UserId, req.UserId). + Where(dao.AppUserRoles.Columns().MajorRole, majorRole).Delete() + if err != nil { + return err + } + + if len(roles) > 0 { + data := make([]do.AppUserRoles, 0, len(roles)) + for _, v := range roles { + data = append(data, do.AppUserRoles{ + UserId: req.UserId, + RoleId: v, + MajorRole: majorRole, + }) + } + _, err = dao.AppUserRoles.Ctx(ctx).Data(data).Insert() + if err != nil { + return err + } + } + return nil + } + + if len(req.ConstructionRole) == 0 && len(req.AdminRole) == 0 { + liberr.ErrIsNil(ctx, fmt.Errorf("至少需要绑定一个角色")) + } + + // select sptm.post_id + // from sys_user as su + // left join bus_construction_user bcu on su.mobile = bcu.phone + // left join sys_project_team_member sptm on sptm.openid = bcu.openid + // where su.id = 145 ; + + //var user struct { + // PostId int `orm:"post_id"` + //} + //err := dao.SysUser.Ctx(ctx).As("su"). + // LeftJoin("bus_construction_user bcu", "su.mobile = bcu.phone"). + // LeftJoin("sys_project_team_member sptm", "sptm.openid = bcu.openid"). + // Fields("sptm.post_id"). + // Where("su.id", req.UserId).Scan(&user) + //liberr.ErrIsNil(ctx, err, "该用户没有加入班组") + // + //// 如果用户的 postID != 10 且本次绑定的角色为班组长,则报错 + //if user.PostId != 10 && lo.Contains(req.ConstructionRole, 1) { + // liberr.ErrIsNil(ctx, fmt.Errorf("该用户不是班组长,不能为其绑定班组长角色菜单")) + //} + + // 绑定管理员角色 + err := bindOrDeleteRoles(req.AdminRole, 0) + liberr.ErrIsNil(ctx, err, "绑定或删除管理员角色失败") + + // 绑定施工人员角色 + err = bindOrDeleteRoles(req.ConstructionRole, 1) + liberr.ErrIsNil(ctx, err, "绑定或删除施工人员角色失败") + + result, err := g.Redis().Do(ctx, "KEYS", fmt.Sprintf("gfToken:%d-*", req.UserId)) + liberr.ErrIsNil(ctx, err, "获取Token失败") + for _, key := range result.Array() { + g.Redis().Do(ctx, "DEL", key) + } + }) +} + +// wrapProjectTeamMemberEdit 项目组成员 +// func wrapProjectTeamMemberEdit(ctx context.Context, userID int) error { +// // OpenID +// openID := lo.Must(dao.BusConstructionUser.Ctx(ctx).As("bcu"). +// LeftJoin("sys_user su", "bcu.phone = su.mobile"). +// Fields("bcu.openid"). +// Where("su.id", userID).Value()).String() + +// // TeamID +// teamID := lo.Must(sdao.SysProjectTeamMember.Ctx(ctx).As("sptm"). +// Fields("sptm.team_id"). +// Where("sptm.openid", openID).Value()).Int() +// } + +func (s *sAppUserRoles) GetUserRoles(ctx context.Context, userID int) (roles model.AppUserRoleDetails, err error) { + err = g.Try(ctx, func(ctx context.Context) { + // TODO: 分为两大类,一类是施工人员,一类是管理人员 + // 施工人员:班组长、普通人员 + // 管理人员:项目管理员、公司管理员 + + // select ar.role_id,ar.role_name,aur.user_id + // from app_user_roles aur + // join app_roles ar on aur.role_id = ar.role_id + // where aur.user_id = 144; + + err = dao.AppUserRoles.Ctx(ctx).As("aur"). + InnerJoin("app_roles ar", "aur.role_id = ar.role_id"). + Fields("ar.role_id,ar.role_name,aur.user_id"). + Where("aur.user_id", userID). + Scan(&roles.Rules) + liberr.ErrIsNil(ctx, err, "获取用户角色失败") + }) + return +} diff --git a/internal/app/system/logic/busAttendanceMachine/bus_attendance_machine.go b/internal/app/system/logic/busAttendanceMachine/bus_attendance_machine.go new file mode 100644 index 0000000..0b102c6 --- /dev/null +++ b/internal/app/system/logic/busAttendanceMachine/bus_attendance_machine.go @@ -0,0 +1,372 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2025-03-03 10:32:47 +// 生成路径: internal/app/system/logic/bus_attendance_machine.go +// 生成人:gfast +// desc:考勤机 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + wxDao "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/tiger1103/gfast/v3/third/ws" + "strings" +) + +func init() { + service.RegisterBusAttendanceMachine(New()) +} + +func New() *sBusAttendanceMachine { + return &sBusAttendanceMachine{} +} + +type sBusAttendanceMachine struct{} + +func (s *sBusAttendanceMachine) DeleteTheUserBoundToTheAttendanceMachineAndDevice(ctx context.Context, req *system.DeleteTheUserBoundToTheAttendanceMachineAndDeviceReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、将考勤机的用户信息删除掉 + _, err = ws.DelByUserId(req.Sn, req.UserId) + liberr.ErrIsNil(ctx, err, "将用户从考勤机中删除失败!") + //2、将数据库绑定的数据删除掉 + _, err = dao.BusAttendanceMachineUser.Ctx(ctx). + Where(dao.BusAttendanceMachineUser.Columns().MachineId, req.MachineId). + Where(dao.BusAttendanceMachineUser.Columns().TeamId, req.TeamId). + Where(dao.BusAttendanceMachineUser.Columns().UserId, req.UserId).Delete() + liberr.ErrIsNil(ctx, err, "将用户与设备的绑定取消失败!") + }) + return +} + +func (s *sBusAttendanceMachine) ObtainInformationAboutPersonnelAssociatedWithTheAttendanceDevice(ctx context.Context, req *system.ObtainInformationAboutPersonnelAssociatedWithTheAttendanceDeviceReq) (listRes *system.ObtainInformationAboutPersonnelAssociatedWithTheAttendanceDeviceRes, err error) { + listRes = new(system.ObtainInformationAboutPersonnelAssociatedWithTheAttendanceDeviceRes) + err = g.Try(ctx, func(ctx context.Context) { + //1、根据班组ID去获取对应的成员, + m := dao.BusConstructionUser.Ctx(ctx).WithAll().Fields("openid,user_name as userName,team_id as teamId,pace_photo as pacePhoto") + if req.TeamId != "" { + m = m.Where(dao.BusConstructionUser.Columns().TeamId, req.TeamId) + } + if req.UserName != "" { + m = m.Where(dao.BusConstructionUser.Columns().UserName+" = ?", req.UserName) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusConstructionUser.Columns().CreatedAt+" >=? AND "+dao.BusConstructionUser.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if strings.EqualFold(req.IsPaging, "YES") { + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + m = m.Page(req.PageNum, req.PageSize) + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var userList []*system.ObtainInformationAboutPersonnelAssociatedWithTheAttendanceDeviceTwo + err = m.Order(order).Scan(&userList) + liberr.ErrIsNil(ctx, err, "获取数据失败") + //2、根据考勤机sn获取设备中存储在的用户ID(openid) + all, err := ws.SelectUserAll(req.Sn) + liberr.ErrIsNil(ctx, err, "考勤机连接异常!人员信息获取失败!") + //3、根据用户ID比对考勤机的ID 以此得到用户是否在考勤机的状态 + ids := all.Data.UserIds + for i, idata := range userList { + userList[i].Status = "0" + for _, jdata := range ids { + if idata.Openid == jdata { + userList[i].Status = "1" + break + } + } + } + //4、根据获取到指定班组的id人员,然后对比是否已将人员下发到考勤机了 + array, err := dao.BusAttendanceMachineUser.Ctx(ctx). + Where(dao.BusAttendanceMachineUser.Columns().MachineId, req.MachineId). + Where(dao.BusAttendanceMachineUser.Columns().TeamId, req.TeamId). + Fields(dao.BusAttendanceMachineUser.Columns().UserId).Array() + liberr.ErrIsNil(ctx, err, "获取下发考勤机中存储的人员ID失败!") + for i, idata := range userList { + userList[i].XFStatus = "0" + for _, jdata := range array { + if idata.Openid == jdata.String() { + userList[i].XFStatus = "1" + break + } + } + } + listRes.UserList = userList + }) + return +} + +func (s *sBusAttendanceMachine) SendTheUserInformationToTheAttendanceMachine(ctx context.Context, req *system.SendTheUserInformationToTheAttendanceMachineReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + + //1、获取下发人员 + g2 := dao.BusAttendanceMachineUser.Ctx(ctx).Safe() + if req.Type == 1 { + g2 = g2.Where(dao.BusAttendanceMachineUser.Columns().MachineId, req.MachineId) + } + if req.Type == 2 || req.Type == 3 { + g2 = g2.WhereIn(dao.BusAttendanceMachineUser.Columns().UserId, req.UserId) + } + array, err2 := g2.Fields(dao.BusAttendanceMachineUser.Columns().UserId).Array() + liberr.ErrIsNil(ctx, err2, "获取下发人员!") + //2、获取用户得到用户ID、头像、名称、人脸等信息 + var userList []*model.BusConstructionUserListRes + err2 = dao.BusConstructionUser.Ctx(ctx).WhereIn(dao.BusConstructionUser.Columns().Openid, array).Fields("openid,user_name,pace_photo").Scan(&userList) + liberr.ErrIsNil(ctx, err2, "获取用户信息失败!") + go xiaFaKaoQinJi(userList, req.Sn) + }) + return +} + +func xiaFaKaoQinJi(userList []*model.BusConstructionUserListRes, sn string) { + for _, data := range userList { + //赋值有人脸为空的数据 + if data.PacePhoto != "" { + ws.TheSenderInformationOfTheAssemblyPersonnel(sn, data.Openid, data.UserName, coryCommon.GlobalPath+data.PacePhoto) + } + } +} + +func (s *sBusAttendanceMachine) BindUserInformationToDevicesInBatches(ctx context.Context, req *system.BindUserInformationToDevicesInBatchesReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + var listEntity []*do.BusAttendanceMachineUser + for _, data := range req.Bind { + count, _ := dao.BusAttendanceMachineUser.Ctx(ctx). + Where(dao.BusAttendanceMachineUser.Columns().MachineId, data.MachineId). + Where(dao.BusAttendanceMachineUser.Columns().TeamId, data.TeamId). + Where(dao.BusAttendanceMachineUser.Columns().UserId, data.UserId).Count() + if count == 0 { + listEntity = append(listEntity, &do.BusAttendanceMachineUser{ + MachineId: data.MachineId, + TeamId: data.TeamId, + UserId: data.UserId, + }) + } + } + if len(listEntity) > 0 { + _, err := g.DB().Insert(ctx, dao.BusAttendanceMachineUser.Table(), listEntity, 50) + liberr.ErrIsNil(ctx, err) + } + }) + return err + }) + return +} + +func (s *sBusAttendanceMachine) Change(ctx context.Context, req *system.BusAttendanceMachineChangeReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + machine := dao.BusAttendanceMachine + _, err = machine.Ctx(ctx).Where(machine.Columns().Sn, req.Sn).Update(do.BusAttendanceMachine{ + Sn: req.Sn, + Status: req.Status, + }) + liberr.ErrIsNil(ctx, err, "修改考勤设备状态失败") + }) + return err + }) + return +} + +func (s *sBusAttendanceMachine) Register(ctx context.Context, req *system.BusAttendanceMachineRegisterReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + count, _ := dao.BusAttendanceMachine.Ctx(ctx).Where(dao.BusAttendanceMachine.Columns().Sn, req.Sn).Count() + if count > 0 { + err = s.Change(ctx, &system.BusAttendanceMachineChangeReq{ + Sn: req.Sn, + Status: "1", + }) + liberr.ErrIsNil(ctx, err) + return + } + _, err := dao.BusAttendanceMachine.Ctx(ctx).WithAll().Data(do.BusAttendanceMachine{ + Sn: req.Sn, + Status: "1", + }).Insert() + liberr.ErrIsNil(ctx, err, "注册考勤设备失败") + }) + return +} + +func (s *sBusAttendanceMachine) List(ctx context.Context, req *system.BusAttendanceMachineSearchReq) (listRes *system.BusAttendanceMachineSearchRes, err error) { + listRes = new(system.BusAttendanceMachineSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusAttendanceMachine.Ctx(ctx).WithAll().As("a"). + LeftJoin(dao.SysProject.Table(), "b", "b.id = a.project_id").Fields("a.*,b.project_name as projectName") + if req.ProjectId != "" { + m = m.Where("a."+dao.BusAttendanceMachine.Columns().ProjectId+" = ?", gconv.Uint64(req.ProjectId)) + } + if req.Sn != "" { + m = m.Where("a."+dao.BusAttendanceMachine.Columns().Sn+" = ?", req.Sn) + } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.BusAttendanceMachine.Columns().CreatedAt+" >=? AND "+"a."+dao.BusAttendanceMachine.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + array, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + listRes.Total = len(array) + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusAttendanceMachineExtendRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + for i := range res { + //查询设备的班组 + teamIds := strings.Split(res[i].Teams, ",") + teamName := "" + for _, id := range teamIds { + name, err := wxDao.SysProjectTeam.Ctx(ctx).WherePri(wxDao.SysProjectTeam.Columns().Id, id).Fields("name").Value() + if err != nil { + liberr.ErrIsNil(ctx, err, "班组获取失败!") + } + teamName = teamName + "," + name.String() + } + res[i].TeamsName = strings.Trim(teamName, ",") + } + listRes.List = res + }) + return +} + +func (s *sBusAttendanceMachine) GetById(ctx context.Context, id uint64) (res *model.BusAttendanceMachineExtendRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusAttendanceMachine.Ctx(ctx).WithAll().Where(dao.BusAttendanceMachine.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusAttendanceMachine) Add(ctx context.Context, req *system.BusAttendanceMachineAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusAttendanceMachine.Ctx(ctx).Insert(do.BusAttendanceMachine{ + ProjectId: req.ProjectId, + Sn: req.Sn, + Teams: req.Teams, + CreateBy: req.CreateBy, + Remark: req.Remark, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusAttendanceMachine) Edit(ctx context.Context, req *system.BusAttendanceMachineEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //1、查询出上一次的数据 + var att *model.BusAttendanceMachineInfoRes + err = dao.BusAttendanceMachine.Ctx(ctx). + WherePri(req.Id).WhereNotNull(dao.BusAttendanceMachine.Columns().ProjectId).WhereNotNull(dao.BusAttendanceMachine.Columns().Teams). + Fields(dao.BusAttendanceMachine.Columns().ProjectId, dao.BusAttendanceMachine.Columns().Teams).Scan(&att) + liberr.ErrIsNil(ctx, err) + if att != nil { + attProject := att.ProjectId + if req.ProjectId != attProject { + //删除考勤机绑定用户 + _, err = dao.BusAttendanceMachineUser.Ctx(ctx).Delete(dao.BusAttendanceMachineUser.Columns().MachineId, req.Id) + liberr.ErrIsNil(ctx, err, "删除失败") + //删除考勤机打卡用户 + ws.DelAll(req.Sn) + } else { + attTeams := att.Teams + //上一次的班组 + oneTeamIds := strings.Split(attTeams, ",") + //此次要修改的班组 + twoTeamIds := strings.Split(req.Teams, ",") + //查找oneTeamIds和twoTeamIds是否有一致的 + ids := make([]string, 0) + for _, oneTeamId := range oneTeamIds { + for _, twoTeamId := range twoTeamIds { + if oneTeamId == twoTeamId { + ids = append(ids, oneTeamId) + } + } + } + columns := dao.BusAttendanceMachineUser.Columns() + sqlDel := dao.BusAttendanceMachineUser.Ctx(ctx).Where(columns.MachineId, req.Id).Safe() + if len(ids) == 0 { + //删除所有 + _, err = sqlDel.Delete() + liberr.ErrIsNil(ctx, err) + ws.DelAll(req.Sn) + } + if len(ids) > 0 { + //删除部分 + _, err = sqlDel.WhereNotIn(columns.TeamId, ids).Delete() + liberr.ErrIsNil(ctx, err) + array, err := sqlDel.WhereNotIn(columns.TeamId, ids).Fields(columns.UserId).Array() + liberr.ErrIsNil(ctx, err) + delUserIds := make([]string, 0) + for i := range array { + delUserIds = append(delUserIds, array[i].String()) + } + if len(delUserIds) > 0 { + ws.BatchDelete(req.Sn, delUserIds) + } + } + } + } + //2、如果twoTeamIds + _, err = dao.BusAttendanceMachine.Ctx(ctx).WherePri(req.Id).Update(do.BusAttendanceMachine{ + ProjectId: req.ProjectId, + Teams: req.Teams, + Remark: req.Remark, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return err + }) + return +} + +func (s *sBusAttendanceMachine) Delete(ctx context.Context, ids []uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //查询所有考勤机的sn + array, err := dao.BusAttendanceMachine.Ctx(ctx).Where(dao.BusAttendanceMachine.Columns().Id+" in (?)", ids).Fields(dao.BusAttendanceMachine.Columns().Sn).Array() + liberr.ErrIsNil(ctx, err) + //删除考勤机 + _, err = dao.BusAttendanceMachine.Ctx(ctx).Delete(dao.BusAttendanceMachine.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + //删除考勤机绑定用户 + _, err = dao.BusAttendanceMachineUser.Ctx(ctx).Delete(dao.BusAttendanceMachineUser.Columns().MachineId+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + //删除考勤机打卡用户 + for i := range array { + go ws.DelAll(array[i].String()) + } + }) + return +} diff --git a/internal/app/system/logic/busAttendanceMachineUser/bus_attendance_machine_user.go b/internal/app/system/logic/busAttendanceMachineUser/bus_attendance_machine_user.go new file mode 100644 index 0000000..a5fa09d --- /dev/null +++ b/internal/app/system/logic/busAttendanceMachineUser/bus_attendance_machine_user.go @@ -0,0 +1,125 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2025-03-03 10:33:17 +// 生成路径: internal/app/system/logic/bus_attendance_machine_user.go +// 生成人:gfast +// desc:考勤机用户列 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterBusAttendanceMachineUser(New()) +} + +func New() *sBusAttendanceMachineUser { + return &sBusAttendanceMachineUser{} +} + +type sBusAttendanceMachineUser struct{} + +func (s *sBusAttendanceMachineUser) List(ctx context.Context, req *system.BusAttendanceMachineUserSearchReq) (listRes *system.BusAttendanceMachineUserSearchRes, err error) { + listRes = new(system.BusAttendanceMachineUserSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusAttendanceMachineUser.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.BusAttendanceMachineUser.Columns().Id+" = ?", req.Id) + } + if req.MachineId != "" { + m = m.Where(dao.BusAttendanceMachineUser.Columns().MachineId+" = ?", gconv.Int64(req.MachineId)) + } + if req.TeamId != "" { + m = m.Where(dao.BusAttendanceMachineUser.Columns().TeamId+" = ?", gconv.Int64(req.TeamId)) + } + if req.UserId != "" { + m = m.Where(dao.BusAttendanceMachineUser.Columns().UserId+" = ?", gconv.Int64(req.UserId)) + } + if req.Identifying != "" { + m = m.Where(dao.BusAttendanceMachineUser.Columns().Identifying+" = ?", gconv.Int(req.Identifying)) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusAttendanceMachineUserInfoRes + err = m.Fields(system.BusAttendanceMachineUserSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusAttendanceMachineUserListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusAttendanceMachineUserListRes{ + Id: v.Id, + MachineId: v.MachineId, + TeamId: v.TeamId, + UserId: v.UserId, + Identifying: v.Identifying, + } + } + }) + return +} + +func (s *sBusAttendanceMachineUser) GetById(ctx context.Context, id int64) (res *model.BusAttendanceMachineUserInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusAttendanceMachineUser.Ctx(ctx).WithAll().Where(dao.BusAttendanceMachineUser.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusAttendanceMachineUser) Add(ctx context.Context, req *system.BusAttendanceMachineUserAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusAttendanceMachineUser.Ctx(ctx).Insert(do.BusAttendanceMachineUser{ + Id: req.Id, + MachineId: req.MachineId, + TeamId: req.TeamId, + UserId: req.UserId, + Identifying: req.Identifying, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusAttendanceMachineUser) Edit(ctx context.Context, req *system.BusAttendanceMachineUserEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusAttendanceMachineUser.Ctx(ctx).WherePri(req.Id).Update(do.BusAttendanceMachineUser{ + MachineId: req.MachineId, + TeamId: req.TeamId, + UserId: req.UserId, + Identifying: req.Identifying, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusAttendanceMachineUser) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusAttendanceMachineUser.Ctx(ctx).Delete(dao.BusAttendanceMachineUser.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busCameraChannel/bus_camera_channel.go b/internal/app/system/logic/busCameraChannel/bus_camera_channel.go new file mode 100644 index 0000000..d4e8fa6 --- /dev/null +++ b/internal/app/system/logic/busCameraChannel/bus_camera_channel.go @@ -0,0 +1,213 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-09-20 14:55:42 +// 生成路径: internal/app/system/logic/bus_camera_channel.go +// 生成人:gfast +// desc:摄像头(国标通道) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" + "strings" +) + +func init() { + service.RegisterBusCameraChannel(New()) +} + +func New() *sBusCameraChannel { + return &sBusCameraChannel{} +} + +type sBusCameraChannel struct{} + +func (s *sBusCameraChannel) List(ctx context.Context, req *system.BusCameraChannelSearchReq) (listRes *system.BusCameraChannelSearchRes, err error) { + listRes = new(system.BusCameraChannelSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusCameraChannel.Ctx(ctx).WithAll() + m = m.Where(dao.BusCameraChannel.Columns().ProjectId+" = ?", req.ProjectId) + if req.CountryId != "" { + m = m.Where(dao.BusCameraChannel.Columns().CountryId, req.CountryId) + } + if req.ChannelName != "" { + m = m.Where(dao.BusCameraChannel.Columns().ChannelName+" like ?", "%"+req.ChannelName+"%") + } + if req.ChannelFormat != "" { + m = m.Where(dao.BusCameraChannel.Columns().ChannelFormat+" = ?", req.ChannelFormat) + } + if req.ChannelState != "" { + m = m.Where(dao.BusCameraChannel.Columns().ChannelState+" = ?", req.ChannelState) + } + //创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.BusCameraChannel.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusCameraChannel.Columns().CreatedAt+" >=? AND "+dao.BusCameraChannel.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusCameraChannelInfoRes + err = m.Fields(system.BusCameraChannelSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusCameraChannelListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusCameraChannelListRes{ + Id: v.Id, + CountryId: v.CountryId, + ChannelNumber: v.ChannelNumber, + ChannelName: v.ChannelName, + ChannelPath: v.ChannelPath, + ChannelPathWs: v.ChannelPathWs, + ChannelPathRtc: v.ChannelPathRtc, + ChannelPathHls: v.ChannelPathHls, + ChannelFormat: v.ChannelFormat, + ChannelState: v.ChannelState, + SourceType: v.SourceType, + Remark: v.Remark, + CreatedAt: v.CreatedAt, + Detail: v.Detail, + Imei: v.Imei, + Iccid: v.Iccid, + } + } + }) + return +} + +func (s *sBusCameraChannel) GetById(ctx context.Context, id int64) (res *model.BusCameraChannelInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusCameraChannel.Ctx(ctx).WithAll().Where(dao.BusCameraChannel.Columns().Id, id).Scan(&res) + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusCameraChannelInfoRes) + res = &infoRes + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func PJFunc(ctx context.Context, number string, channelFormat, channelNumber string) (path string, err error) { + path = number + //2、循环判断视频拼接的参数 + statr := "" + end := "" + if channelFormat == "flv/hls" { + statr = "http" + end = ".flv" + } else if channelFormat == "ws-flv/hls" { + statr = "ws" + end = ".flv" + } else if channelFormat == "rtc" { + statr = "webrtc" + end = "" + } else if channelFormat == "hls" { + statr = "http" + end = "/live.m3u8" + } else { + err = errors.New("代码错误,请联系管理员!") + return + } + api, _ := g.Cfg().Get(ctx, "LiveGBS.safety.api") + sms, _ := g.Cfg().Get(ctx, "LiveGBS.safety.sms") + apiStr := api.String() + sms.String() + //2、拼接视频地址 + path = strings.ReplaceAll(apiStr, "http", statr) + channelFormat + "/" + path + "_" + channelNumber + end + return +} + +func (s *sBusCameraChannel) Add(ctx context.Context, req *system.BusCameraChannelAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、获取摄像头的国标 + number, err := dao.BusCameraChineseStandard.Ctx(ctx).WherePri(req.CountryId).Fields(dao.BusCameraChineseStandard.Columns().CountryNumber).Value() + path1, err := PJFunc(ctx, number.String(), "flv/hls", req.ChannelNumber) + path2, err := PJFunc(ctx, number.String(), "ws-flv/hls", req.ChannelNumber) + path3, err := PJFunc(ctx, number.String(), "rtc", req.ChannelNumber) + path4, err := PJFunc(ctx, number.String(), "hls", req.ChannelNumber) + //2、新增 + _, err = dao.BusCameraChannel.Ctx(ctx).Insert(do.BusCameraChannel{ + CountryId: req.CountryId, + ProjectId: req.ProjectId, + ChannelNumber: req.ChannelNumber, + ChannelName: req.ChannelName, + ChannelPath: path1, + ChannelPathWs: path2, + ChannelPathRtc: path3, + ChannelPathHls: path4, + ChannelFormat: req.ChannelFormat, + Remark: req.Remark, + Imei: req.Imei, + Iccid: req.Iccid, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusCameraChannel) Edit(ctx context.Context, req *system.BusCameraChannelEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、获取摄像头的国标 + number, err := dao.BusCameraChineseStandard.Ctx(ctx).WherePri(req.CountryId).Fields(dao.BusCameraChineseStandard.Columns().CountryNumber).Value() + path1, err := PJFunc(ctx, number.String(), "flv/hls", req.ChannelNumber) + path2, err := PJFunc(ctx, number.String(), "ws-flv/hls", req.ChannelNumber) + path3, err := PJFunc(ctx, number.String(), "rtc", req.ChannelNumber) + path4, err := PJFunc(ctx, number.String(), "hls", req.ChannelNumber) + //2、修改 + _, err = dao.BusCameraChannel.Ctx(ctx).WherePri(req.Id).Update(do.BusCameraChannel{ + CountryId: req.CountryId, + ProjectId: req.ProjectId, + ChannelNumber: req.ChannelNumber, + ChannelName: req.ChannelName, + ChannelPath: path1, + ChannelPathWs: path2, + ChannelPathRtc: path3, + ChannelPathHls: path4, + ChannelFormat: req.ChannelFormat, + ChannelState: req.ChannelState, + Remark: req.Remark, + Detail: req.Detail, + Imei: req.Imei, + Iccid: req.Iccid, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusCameraChannel) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusCameraChannel.Ctx(ctx).Delete(dao.BusCameraChannel.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busCameraChineseStandard/bus_camera_chinese_standard.go b/internal/app/system/logic/busCameraChineseStandard/bus_camera_chinese_standard.go new file mode 100644 index 0000000..c202ba6 --- /dev/null +++ b/internal/app/system/logic/busCameraChineseStandard/bus_camera_chinese_standard.go @@ -0,0 +1,138 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-09-20 14:55:24 +// 生成路径: internal/app/system/logic/bus_camera_chinese_standard.go +// 生成人:gfast +// desc:摄像头(国标) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterBusCameraChineseStandard(New()) +} + +func New() *sBusCameraChineseStandard { + return &sBusCameraChineseStandard{} +} + +type sBusCameraChineseStandard struct{} + +func (s *sBusCameraChineseStandard) List(ctx context.Context, req *system.BusCameraChineseStandardSearchReq) (listRes *system.BusCameraChineseStandardSearchRes, err error) { + listRes = new(system.BusCameraChineseStandardSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusCameraChineseStandard.Ctx(ctx).WithAll() + m = m.Where(dao.BusCameraChineseStandard.Columns().ProjectId+" = ?", req.ProjectId) + if req.CountryState != "" { + m = m.Where(dao.BusCameraChineseStandard.Columns().CountryState+" = ?", req.CountryState) + } + if req.CountryNumber != "" { + m = m.Where(dao.BusCameraChineseStandard.Columns().CountryNumber+" like ?", "%"+req.CountryNumber+"%") + } + if req.CountryName != "" { + m = m.Where(dao.BusCameraChineseStandard.Columns().CountryName+" like ?", "%"+req.CountryName+"%") + } + //创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.BusCameraChineseStandard.Columns().CreatedAt+" like ?", "%"+date+"%") + } + + if len(req.DateRange) != 0 { + m = m.Where(dao.BusCameraChineseStandard.Columns().CreatedAt+" >=? AND "+dao.BusCameraChineseStandard.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusCameraChineseStandardInfoRes + err = m.Fields(system.BusCameraChineseStandardSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusCameraChineseStandardListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusCameraChineseStandardListRes{ + Id: v.Id, + CountryNumber: v.CountryNumber, + CountryName: v.CountryName, + CountryState: v.CountryState, + ProjectId: v.ProjectId, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusCameraChineseStandard) GetById(ctx context.Context, id int64) (res *model.BusCameraChineseStandardInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusCameraChineseStandard.Ctx(ctx).WithAll().Where(dao.BusCameraChineseStandard.Columns().Id, id).Scan(&res) + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusCameraChineseStandardInfoRes) + res = &infoRes + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusCameraChineseStandard) Add(ctx context.Context, req *system.BusCameraChineseStandardAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusCameraChineseStandard.Ctx(ctx).Insert(do.BusCameraChineseStandard{ + CountryNumber: req.CountryNumber, + CountryName: req.CountryName, + ProjectId: req.ProjectId, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusCameraChineseStandard) Edit(ctx context.Context, req *system.BusCameraChineseStandardEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusCameraChineseStandard.Ctx(ctx).WherePri(req.Id).Update(do.BusCameraChineseStandard{ + CountryNumber: req.CountryNumber, + CountryName: req.CountryName, + CountryState: req.CountryState, + ProjectId: req.ProjectId, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusCameraChineseStandard) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusCameraChannel.Ctx(ctx).Delete(dao.BusCameraChannel.Columns().CountryId+" in(?)", ids) + _, err = dao.BusCameraChineseStandard.Ctx(ctx).Delete(dao.BusCameraChineseStandard.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busCategory/bus_category.go b/internal/app/system/logic/busCategory/bus_category.go new file mode 100644 index 0000000..5703105 --- /dev/null +++ b/internal/app/system/logic/busCategory/bus_category.go @@ -0,0 +1,105 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-10-07 15:52:19 +// 生成路径: internal/app/system/logic/bus_category.go +// 生成人:gfast +// desc:题库_题库类别 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterBusCategory(New()) +} + +func New() *sBusCategory { + return &sBusCategory{} +} + +type sBusCategory struct{} + +func (s *sBusCategory) List(ctx context.Context, req *system.BusCategorySearchReq) (listRes *system.BusCategorySearchRes, err error) { + listRes = new(system.BusCategorySearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusCategory.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.BusCategory.Columns().Id+" = ?", req.Id) + } + if req.CategoryName != "" { + m = m.Where(dao.BusCategory.Columns().CategoryName+" like ?", "%"+req.CategoryName+"%") + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusCategoryInfoRes + err = m.Fields(system.BusCategorySearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusCategoryListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusCategoryListRes{ + Id: v.Id, + CategoryName: v.CategoryName, + } + } + }) + return +} + +func (s *sBusCategory) GetById(ctx context.Context, id int64) (res *model.BusCategoryInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusCategory.Ctx(ctx).WithAll().Where(dao.BusCategory.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusCategory) Add(ctx context.Context, req *system.BusCategoryAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusCategory.Ctx(ctx).Insert(do.BusCategory{ + CategoryName: req.CategoryName, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusCategory) Edit(ctx context.Context, req *system.BusCategoryEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusCategory.Ctx(ctx).WherePri(req.Id).Update(do.BusCategory{ + CategoryName: req.CategoryName, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusCategory) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusCategory.Ctx(ctx).Delete(dao.BusCategory.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busCompany/bus_company.go b/internal/app/system/logic/busCompany/bus_company.go new file mode 100644 index 0000000..8635833 --- /dev/null +++ b/internal/app/system/logic/busCompany/bus_company.go @@ -0,0 +1,156 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-07-28 14:08:14 +// 生成路径: internal/app/system/logic/bus_company.go +// 生成人:gfast +// desc:公司 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterBusCompany(New()) +} + +func New() *sBusCompany { + return &sBusCompany{} +} + +type sBusCompany struct{} + +func (s *sBusCompany) List(ctx context.Context, req *system.BusCompanySearchReq) (listRes *system.BusCompanySearchRes, err error) { + listRes = new(system.BusCompanySearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusCompany.Ctx(ctx).WithAll() + if req.CompanyId != "" { + m = m.Where(dao.BusCompany.Columns().CompanyId+" = ?", req.CompanyId) + } + if req.CompanyName != "" { + m = m.Where(dao.BusCompany.Columns().CompanyName+" like ?", "%"+req.CompanyName+"%") + } + if req.Status != "" { + m = m.Where(dao.BusCompany.Columns().Status+" = ?", req.Status) + } + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.BusCompany.Columns().CreatedAt+" like ?", "%"+date+"%") + } + //if len(req.DateRange) != 0 { + // m = m.Where(dao.BusCompany.Columns().CreatedAt+" >=? AND "+dao.BusCompany.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + //} + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "company_id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusCompanyInfoRes + err = m.Fields(system.BusCompanySearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusCompanyListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusCompanyListRes{ + CompanyId: v.CompanyId, + CompanyName: v.CompanyName, + Status: v.Status, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusCompany) GetByCompanyId(ctx context.Context, companyId int64) (res *model.BusCompanyInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusCompany.Ctx(ctx).WithAll().Where(dao.BusCompany.Columns().CompanyId, companyId).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusCompanyInfoRes) + res = &infoRes + }) + return +} + +func (s *sBusCompany) Add(ctx context.Context, req *system.BusCompanyAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + name := ct.New().GetLoginUser(ctx).Id + _, err = dao.BusCompany.Ctx(ctx).Insert(do.BusCompany{ + CompanyName: req.CompanyName, + Status: req.Status, + CreateBy: name, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusCompany) Edit(ctx context.Context, req *system.BusCompanyEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + name := ct.New().GetLoginUser(ctx).Id + _, err = dao.BusCompany.Ctx(ctx).WherePri(req.CompanyId).Update(do.BusCompany{ + CompanyName: req.CompanyName, + Status: req.Status, + UpdateBy: name, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusCompany) Delete(ctx context.Context, companyIds []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusCompany.Ctx(ctx).Delete(dao.BusCompany.Columns().CompanyId+" in (?)", companyIds) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +//app + +func (s *sBusCompany) AppList(ctx context.Context, req *system.BusCompanyAppSearchReq) (listRes *system.BusCompanyAppSearchRes, err error) { + listRes = new(system.BusCompanyAppSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusCompany.Ctx(ctx).WithAll().Where(dao.BusCompany.Columns().Status+" != ?", 1) //1停用 0正常使用 + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + order := "company_id desc" + var res []*model.BusCompanyAppListRes + err = m.Fields(system.BusCompanyAppSearchRes{}).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusCompanyAppListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusCompanyAppListRes{ + CompanyId: v.CompanyId, + CompanyName: v.CompanyName, + } + } + }) + return +} diff --git a/internal/app/system/logic/busComplaintBox/bus_complaint_box.go b/internal/app/system/logic/busComplaintBox/bus_complaint_box.go new file mode 100644 index 0000000..2bb1f0f --- /dev/null +++ b/internal/app/system/logic/busComplaintBox/bus_complaint_box.go @@ -0,0 +1,322 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-12-04 18:09:50 +// 生成路径: internal/app/system/logic/bus_complaint_box.go +// 生成人:gfast +// desc:意见箱 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterBusComplaintBox(New()) +} + +func New() *sBusComplaintBox { + return &sBusComplaintBox{} +} + +type sBusComplaintBox struct{} + +func (s *sBusComplaintBox) AppletAdd(ctx context.Context, req *wxApplet.AppletComplaintBoxAddReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + info, err := dao.BusComplaintBox.Ctx(ctx).Insert(do.BusComplaintBox{ + ProjectId: req.ProjectId, + Openid: req.Openid, + Opinion: req.Opinion, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + // 2、存储文件 + if len(req.File) > 0 { + id, _ := info.LastInsertId() + err = UploadAndSaveFunc(ctx, req.File, id) // 巡检 + liberr.ErrIsNil(ctx, err) + } + }) + return err + }) + + return +} + +func (s *sBusComplaintBox) AppletList(ctx context.Context, req *wxApplet.AppletComplaintBoxSearchReq) (listRes *wxApplet.AppletComplaintBoxSearchRes, err error) { + listRes = new(wxApplet.AppletComplaintBoxSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusComplaintBox.Ctx(ctx).As("a"). + LeftJoin("sys_project", "b", "a.openid = b.id"). + Fields("a.*,b.project_name,b.short_name"). + Where("a."+dao.BusComplaintBox.Columns().Openid+" = ?", req.Openid) + if req.Status != "" { + m = m.Where("a."+dao.BusComplaintBox.Columns().Status+" = ?", req.Status) + } + if req.Dispose != "" { + m = m.Where("a."+dao.BusComplaintBox.Columns().Dispose+" = ?", gconv.Time(req.Dispose)) + } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.BusComplaintBox.Columns().CreatedAt+" >=? AND "+"a."+dao.BusComplaintBox.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + array, err2 := m.Array() + listRes.Total = array + liberr.ErrIsNil(ctx, err2, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusComplaintBoxInfoRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusComplaintBoxListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusComplaintBoxListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + Opinion: v.Opinion, + Status: v.Status, + Dispose: v.Dispose, + CreatedAt: v.CreatedAt, + ProjectName: v.ProjectName, + ShortName: v.ShortName, + } + } + }) + return +} + +func (s *sBusComplaintBox) List(ctx context.Context, req *system.BusComplaintBoxSearchReq) (listRes *system.BusComplaintBoxSearchRes, err error) { + listRes = new(system.BusComplaintBoxSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusComplaintBox.Ctx(ctx).WithAll().As("a"). + LeftJoin(dao.BusConstructionUser.Table(), "b", "a.openid = b.openid"). + Fields("a.*,b.phone") + if req.ProjectId != "" { + m = m.Where("a."+dao.BusComplaintBox.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + if req.Openid != "" { + m = m.Where("a."+dao.BusComplaintBox.Columns().Openid+" = ?", req.Openid) + } + if req.Status != "" { + // m = m.Where("a."+dao.BusComplaintBox.Columns().Status+" = ?", req.Status) + + // 如果 status 为 0 未读,那么 dispose 为 null + if req.Status == "0" { + m = m.Where("a." + dao.BusComplaintBox.Columns().Dispose + " is null") + } + + if req.Status == "1" { + m = m.Where("a." + dao.BusComplaintBox.Columns().Dispose + " is not null") + } + } + // if req.Dispose != "" { + // m = m.Where("a."+dao.BusComplaintBox.Columns().Dispose+" = ?", gconv.Time(req.Dispose)) + // } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.BusComplaintBox.Columns().CreatedAt+" >=? AND "+dao.BusComplaintBox.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + + if req.Phone != "" { + m = m.Where("b.phone", req.Phone) + } + + array, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + listRes.Total = len(array) + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusComplaintBoxInfoRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusComplaintBoxListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusComplaintBoxListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + Openid: v.Openid, + Opinion: v.Opinion, + Status: v.Status, + Dispose: v.Dispose, + Remark: v.Remark, + CreatedAt: v.CreatedAt, + Phone: v.Phone, + } + } + }) + return +} + +func (s *sBusComplaintBox) GetById(ctx context.Context, id int64) (res *model.BusComplaintBoxInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 1、获取数据 + err = dao.BusComplaintBox.Ctx(ctx).WithAll().Where(dao.BusComplaintBox.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + // 2、获取附件下的附件信息 + var fjEntity []*model.FileEntityRes + err = g.DB().Model("bus_complaint_box_path").Ctx(ctx).Where("ticket_id", id).Scan(&fjEntity) + liberr.ErrIsNil(ctx, err, "获取附近信息失败") + res.FileEntityList = fjEntity + }) + return +} + +//func (s *sBusComplaintBox) Add(ctx context.Context, req *system.BusComplaintBoxAddReq) (err error) { +// err = g.Try(ctx, func(ctx context.Context) { +// _, err = dao.BusComplaintBox.Ctx(ctx).Insert(do.BusComplaintBox{ +// ProjectId: req.ProjectId, +// Openid: req.Openid, +// Opinion: req.Opinion, +// }) +// liberr.ErrIsNil(ctx, err, "添加失败") +// }) +// return +//} + +func (s *sBusComplaintBox) Edit(ctx context.Context, req *system.BusComplaintBoxEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusComplaintBox.Ctx(ctx).WherePri(req.Id).Update(do.BusComplaintBox{ + ProjectId: req.ProjectId, + Openid: req.Openid, + Opinion: req.Opinion, + Status: req.Status, + Dispose: req.Dispose, + Remark: req.Remark, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusComplaintBox) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 1、获取当前需要删除数据的附件 + array, _ := g.DB().Model("bus_complaint_box_path").Ctx(ctx).Where("ticket_id in (?)", ids).Fields("path").Array() + if len(array) > 0 { + var filePath []string + for i := range array { + filePath = append(filePath, array[i].String()) + } + coryCommon.BatchFile(filePath) + } + // 3、删除数据 + _, err = dao.BusComplaintBox.Ctx(ctx).Delete(dao.BusComplaintBox.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +type FileEntity struct { + TicketId int64 `p:"ticket_id" dc:"主键ID"` + Name string `p:"name" dc:"文件名称"` + Path string `p:"path" dc:"文件路径"` + FileType string `p:"file_type" dc:"文件类型(后缀)"` +} + +// UploadAndSaveFunc 上传并存储文件 +func UploadAndSaveFunc(ctx context.Context, File []*wxApplet.Files, id int64) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 2、获取文件数据,然后对文件进行上传 + var fileEntitys []*FileEntity + for i := range File { + rpath := coryCommon.FileToFunc(File[i].Path, 2) + _, ext, _ := coryCommon.FileInfo(rpath) + entity := FileEntity{ + TicketId: id, + Name: File[i].Name, + Path: File[i].Path, + FileType: ext, + } + fileEntitys = append(fileEntitys, &entity) + } + // 3、上传文件的附件信息 + _, err = g.DB().Model("bus_complaint_box_path").Ctx(ctx).Insert(fileEntitys) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return err + }) + return err +} + +//// UploadAndSaveFunc 上传并存储文件 +//func UploadAndSaveFunc(ctx context.Context, File []*ghttp.UploadFile, id int64) (err error) { +// err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { +// err = g.Try(ctx, func(ctx context.Context) { +// //2、获取文件数据,然后对文件进行上传 +// var fileEntitys []*FileEntity +// for i := range File { +// str, err := coryCommon.UploadFileTwo(ctx, File[i], coryCommon.Helmet) +// liberr.ErrIsNil(ctx, err, "上传附件失败!") +// str = filepath.ToSlash(str) +// rpath := coryCommon.ResourcePublicToFunc("/"+str, 0) +// _, ext, _ := coryCommon.FileInfo(rpath) +// entity := FileEntity{ +// TicketId: id, +// Name: File[i].Filename, +// Path: rpath, +// FileType: ext, +// } +// fileEntitys = append(fileEntitys, &entity) +// } +// //3、上传文件的附件信息 +// _, err = g.DB().Model("bus_complaint_box_path").Ctx(ctx).Insert(fileEntitys) +// liberr.ErrIsNil(ctx, err, "添加失败") +// }) +// return err +// }) +// return err +//} + +//// ComplaintBoxPath 附件新增 +//func ComplaintBoxPath(ctx context.Context, fileInfo []*comModel.UpFile, id int64) (err error) { +// err = g.Try(ctx, func(ctx context.Context) { +// //2、获取文件数据,然后对文件进行上传 +// var fileEntitys []*FileEntity +// for i := range fileInfo { +// rpath := coryCommon.FileToFunc(filepath.ToSlash(fileInfo[i].Url), 3) +// entity := FileEntity{ +// TicketId: id, +// Name: fileInfo[i].Name, +// Path: rpath, +// FileType: fileInfo[i].FileType, +// } +// fileEntitys = append(fileEntitys, &entity) +// } +// //3、上传文件的附件信息 +// _, err = g.DB().Model("bus_complaint_box_path").Ctx(ctx).Insert(fileEntitys) +// liberr.ErrIsNil(ctx, err, "意见反馈附件上传失败") +// }) +// return +//} diff --git a/internal/app/system/logic/busConstructionBlacklist/bus_construction_blacklist.go b/internal/app/system/logic/busConstructionBlacklist/bus_construction_blacklist.go new file mode 100644 index 0000000..3434cdd --- /dev/null +++ b/internal/app/system/logic/busConstructionBlacklist/bus_construction_blacklist.go @@ -0,0 +1,161 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-11-10 14:08:39 +// 生成路径: internal/app/system/logic/bus_construction_blacklist.go +// 生成人:gfast +// desc:黑名单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + wxDao "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterBusConstructionBlacklist(New()) +} + +func New() *sBusConstructionBlacklist { + return &sBusConstructionBlacklist{} +} + +type sBusConstructionBlacklist struct{} + +func (s *sBusConstructionBlacklist) BlackListFunc(ctx context.Context, req *system.BlackListReq) (listRes *system.BlackListRes, err error) { + listRes = new(system.BlackListRes) + err = g.Try(ctx, func(ctx context.Context) { + m := wxDao.BusConstructionUser.Ctx(ctx).WithAll() + + if req.SfzNumber != "" { + m = m.Where(dao.BusConstructionBlacklist.Columns().SfzNumber+" like ?", "%"+req.SfzNumber+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusConstructionBlacklist.Columns().CreatedAt+" >=? AND "+dao.BusConstructionBlacklist.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "openid desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.ModBlackListRes + err = m.Fields(system.BusConstructionBlacklistSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.ModBlackListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.ModBlackListRes{ + Openid: v.Openid, + UserName: v.UserName, + SfzNumber: v.SfzNumber, + } + } + }) + return +} + +func (s *sBusConstructionBlacklist) List(ctx context.Context, req *system.BusConstructionBlacklistSearchReq) (listRes *system.BusConstructionBlacklistSearchRes, err error) { + listRes = new(system.BusConstructionBlacklistSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusConstructionBlacklist.Ctx(ctx).WithAll() + if req.Name != "" { + m = m.Where(dao.BusConstructionBlacklist.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.SfzNumber != "" { + m = m.Where(dao.BusConstructionBlacklist.Columns().SfzNumber+" like ?", "%"+req.SfzNumber+"%") + } + if req.CreatedAt != "" { + m = m.Where(dao.BusConstructionBlacklist.Columns().CreatedAt+" like ?", req.CreatedAt+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusConstructionBlacklist.Columns().CreatedAt+" >=? AND "+dao.BusConstructionBlacklist.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "openid desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusConstructionBlacklistInfoRes + err = m.Fields(system.BusConstructionBlacklistSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusConstructionBlacklistListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusConstructionBlacklistListRes{ + Openid: v.Openid, + Name: v.Name, + SfzNumber: v.SfzNumber, + Remark: v.Remark, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusConstructionBlacklist) GetByOpenid(ctx context.Context, openid string) (res *model.BusConstructionBlacklistInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusConstructionBlacklist.Ctx(ctx).WithAll().Where(dao.BusConstructionBlacklist.Columns().Openid, openid).Scan(&res) + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusConstructionBlacklistInfoRes) + res = &infoRes + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusConstructionBlacklist) Add(ctx context.Context, req *system.BusConstructionBlacklistAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + count, _ := dao.BusConstructionBlacklist.Ctx(ctx).Where("openid", req.Openid).Count() + if count > 0 { + err = errors.New("当前用户已在黑名单中存在!") + liberr.ErrIsNil(ctx, err) + return + } + _, err = dao.BusConstructionBlacklist.Ctx(ctx).Insert(do.BusConstructionBlacklist{ + Openid: req.Openid, + Name: req.Name, + SfzNumber: req.SfzNumber, + Remark: req.Remark, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusConstructionBlacklist) Delete(ctx context.Context, openids []string) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionBlacklist.Ctx(ctx).Delete(dao.BusConstructionBlacklist.Columns().Openid+" in (?)", openids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busConstructionLog/bus_construction_log.go b/internal/app/system/logic/busConstructionLog/bus_construction_log.go new file mode 100644 index 0000000..55a488b --- /dev/null +++ b/internal/app/system/logic/busConstructionLog/bus_construction_log.go @@ -0,0 +1,258 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-03-22 16:27:43 +// 生成路径: internal/app/system/logic/bus_construction_log.go +// 生成人:gfast +// desc:施工日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + systemService "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "strings" +) + +func init() { + service.RegisterBusConstructionLog(New()) +} + +func New() *sBusConstructionLog { + return &sBusConstructionLog{} +} + +type sBusConstructionLog struct{} + +func (s *sBusConstructionLog) ConstructionLogList(ctx context.Context, req *wxApplet.ConstructionLogListReq) (listRes *wxApplet.ConstructionLogListRes, err error) { + listRes = new(wxApplet.ConstructionLogListRes) + err = g.Try(ctx, func(ctx context.Context) { + //1、根据名字模糊搜索到项目id + var projectIds []string + if req.ProjectName != "" { + value, err := dao.SysProject.Ctx(ctx). + Where("(project_name like ? or short_name like ?)", "%"+req.ProjectName+"%", "%"+req.ProjectName+"%"). + Fields("GROUP_CONCAT(id)").Value() + liberr.ErrIsNil(ctx, err, "模糊查询失败") + split := strings.Split(value.String(), ",") + for i := range split { + projectIds = append(projectIds, split[i]) + } + } + //2、查询数据 + m := dao.BusConstructionLog.Ctx(ctx).As("a"). + LeftJoin(dao.SysProject.Table(), "b", "b.id = a.project_id"). + Where("a.created_by", req.OpenId). + Fields("a.*,b.project_name") + if req.CreatedAt != "" { + //m = m.Where("DATE_FORMAT(a.created_at,'%Y-%m-%d') = ?", req.CreatedAt) + m = m.Where("a.date_of_occurrence = ?", req.CreatedAt) + } + if len(projectIds) > 0 { + m = m.Where("b.id in (?)", projectIds) + } + if len(req.ProjectId) > 0 { + m = m.Where("b.id", req.ProjectId) + } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.BusConstructionLog.Columns().CreatedAt+" >=? AND "+"a."+dao.BusConstructionLog.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + array, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + listRes.Total = len(array) + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "date_of_occurrence desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.AppletList + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + //3、获取当前数据的新增人(创建人) + for i := range res { + ve := coryCommon.SelectByString(ctx, coryCommon.IsNumeric(res[i].CreatedBy), res[i].CreatedBy) + res[i].CreatedBy = ve + } + listRes.List = res + }) + return +} + +func (s *sBusConstructionLog) ConstructionLogDetails(ctx context.Context, req *wxApplet.ConstructionLogDetailsReq) (listRes *wxApplet.ConstructionLogDetailsRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusConstructionLog.Ctx(ctx).As("a"). + LeftJoin(dao.SysProject.Table(), "b", "b.id = a.project_id"). + Fields("a.*,b.project_name").Where("a.id", req.Id).Scan(&listRes) + liberr.ErrIsNil(ctx, err, "查询失败") + //3、获取创建人 + ve := coryCommon.SelectByString(ctx, coryCommon.IsNumeric(listRes.CreatedBy), listRes.CreatedBy) + listRes.CreatedBy = ve + }) + return +} + +func (s *sBusConstructionLog) ConstructionLogAdd(ctx context.Context, req *wxApplet.ConstructionLogAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + var str string + if len(req.File) > 0 { + for i := range req.File { + replace := strings.Replace(req.File[i].Url, "/file/", "/wxfile/", 1) + str = str + replace + "," + } + } + if len(str) > 0 { + str = str[:len(str)-1] + } + liberr.ErrIsNil(ctx, err) + _, err = dao.BusConstructionLog.Ctx(ctx).Insert(do.BusConstructionLog{ + ProjectId: req.ProjectId, + DateOfOccurrence: req.DateOfOccurrence, + Condition: req.Condition, + TechnologyQuality: req.TechnologyQuality, + Remark: req.Remark, + Path: str, + CreatedBy: req.OpenId, + }) + //如果错误,删除图片 + if err != nil { + if len(str) > 0 { + var sg []string + split := strings.Split(str, ",") + for i := range split { + sg = append(sg, split[i]) + } + coryCommon.BatchFile(sg) + } + } + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusConstructionLog) List(ctx context.Context, req *system.BusConstructionLogSearchReq) (listRes *system.BusConstructionLogSearchRes, err error) { + + listRes = new(system.BusConstructionLogSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + ////1、根据名字模糊搜索到项目id + //var projectIds []string + //if req.ProjectName != "" { + // value, err := dao.SysProject.Ctx(ctx). + // Where("(project_name like ? or short_name like ?)", "%"+req.ProjectName+"%", "%"+req.ProjectName+"%"). + // Fields("GROUP_CONCAT(id)").Value() + // liberr.ErrIsNil(ctx, err, "模糊查询失败") + // split := strings.Split(value.String(), ",") + // for i := range split { + // projectIds = append(projectIds, split[i]) + // } + //} + //2、请求分页数据 + m := dao.BusConstructionLog.Ctx(ctx).As("a"). + LeftJoin(dao.SysProject.Table(), "b", "b.id = a.project_id"). + Fields("a.*,b.project_name as projectName") + if req.ProjectId > 0 { + m = m.Where("a."+dao.BusConstructionLog.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.DateOfOccurrence != "" { + m = m.Where("a."+dao.BusConstructionLog.Columns().DateOfOccurrence, req.DateOfOccurrence) + } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.BusConstructionLog.Columns().CreatedAt+" >=? AND a."+dao.BusConstructionLog.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + array, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + listRes.Total = len(array) + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "date_of_occurrence desc,a.id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.AppletDetails + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + if res != nil { + listRes.List = res + } + for i := range res { + res[i].CreatedBy = coryCommon.SelectByString(ctx, coryCommon.IsNumeric(res[i].CreatedBy), res[i].CreatedBy) + } + }) + return +} + +func (s *sBusConstructionLog) GetById(ctx context.Context, id int64) (res *model.AppletDetails, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusConstructionLog.Ctx(ctx).As("a"). + LeftJoin(dao.SysProject.Table(), "b", "b.id = a.project_id"). + Fields("a.*,b.project_name as projectName"). + Where("a."+dao.BusConstructionLog.Columns().Id, id).Scan(&res) + if res != nil { + //获取创建人 更新人名称 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.AppletDetails) + res = &infoRes + } + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusConstructionLog) Add(ctx context.Context, req *system.BusConstructionLogAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionLog.Ctx(ctx).Insert(do.BusConstructionLog{ + ProjectId: req.ProjectId, + DateOfOccurrence: req.DateOfOccurrence, + Condition: req.Condition, + TechnologyQuality: req.TechnologyQuality, + Remark: req.Remark, + Path: req.Path, + CreatedBy: systemService.Context().GetUserId(ctx), + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusConstructionLog) Edit(ctx context.Context, req *system.BusConstructionLogEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionLog.Ctx(ctx).WherePri(req.Id).Update(do.BusConstructionLog{ + DateOfOccurrence: req.DateOfOccurrence, + Condition: req.Condition, + TechnologyQuality: req.TechnologyQuality, + Remark: req.Remark, + UpdatedBy: systemService.Context().GetUserId(ctx), + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusConstructionLog) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionLog.Ctx(ctx).Delete(dao.BusConstructionLog.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busConstructionProject/bus_construction_project.go b/internal/app/system/logic/busConstructionProject/bus_construction_project.go new file mode 100644 index 0000000..721538a --- /dev/null +++ b/internal/app/system/logic/busConstructionProject/bus_construction_project.go @@ -0,0 +1,112 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-07 10:17:50 +// 生成路径: internal/app/system/logic/bus_construction_project.go +// 生成人:gfast +// desc:施工人员对应项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterBusConstructionProject(New()) +} + +func New() *sBusConstructionProject { + return &sBusConstructionProject{} +} + +type sBusConstructionProject struct{} + +func (s *sBusConstructionProject) List(ctx context.Context, req *system.BusConstructionProjectSearchReq) (listRes *system.BusConstructionProjectSearchRes, err error) { + listRes = new(system.BusConstructionProjectSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusConstructionProject.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.BusConstructionProject.Columns().Id+" = ?", req.Id) + } + if req.ConstructionUserId != "" { + m = m.Where(dao.BusConstructionProject.Columns().ConstructionUserId+" = ?", gconv.Int64(req.ConstructionUserId)) + } + if req.ProjectId != "" { + m = m.Where(dao.BusConstructionProject.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusConstructionProjectInfoRes + err = m.Fields(system.BusConstructionProjectSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusConstructionProjectListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusConstructionProjectListRes{ + Id: v.Id, + ConstructionUserId: v.ConstructionUserId, + ProjectId: v.ProjectId, + } + } + }) + return +} + +func (s *sBusConstructionProject) GetById(ctx context.Context, id uint64) (res *model.BusConstructionProjectInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusConstructionProject.Ctx(ctx).WithAll().Where(dao.BusConstructionProject.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusConstructionProject) Add(ctx context.Context, req *system.BusConstructionProjectAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionProject.Ctx(ctx).Insert(do.BusConstructionProject{ + ConstructionUserId: req.ConstructionUserId, + ProjectId: req.ProjectId, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusConstructionProject) Edit(ctx context.Context, req *system.BusConstructionProjectEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionProject.Ctx(ctx).WherePri(req.Id).Update(do.BusConstructionProject{ + ConstructionUserId: req.ConstructionUserId, + ProjectId: req.ProjectId, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusConstructionProject) Delete(ctx context.Context, ids []uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionProject.Ctx(ctx).Delete(dao.BusConstructionProject.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busConstructionUser/bus_construction_user.go b/internal/app/system/logic/busConstructionUser/bus_construction_user.go new file mode 100644 index 0000000..3fc1dfd --- /dev/null +++ b/internal/app/system/logic/busConstructionUser/bus_construction_user.go @@ -0,0 +1,1252 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-07 10:31:18 +// 生成路径: internal/app/system/logic/bus_construction_user.go +// 生成人:gfast +// desc:施工人员 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "database/sql" + "errors" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "regexp" + "sort" + "strconv" + "strings" + "time" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gconv" + "github.com/jinzhu/copier" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/common/controller" + commonDao "github.com/tiger1103/gfast/v3/internal/app/common/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + systemController "github.com/tiger1103/gfast/v3/internal/app/system/controller" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + wxDao "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + wxSysProjectTeam "github.com/tiger1103/gfast/v3/internal/app/wxApplet/logic/sysProjectTeam" + wxModel "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterBusConstructionUser(New()) +} + +func New() *sBusConstructionUser { + return &sBusConstructionUser{} +} + +type sBusConstructionUser struct{} + +func (s *sBusConstructionUser) AppRegisteredButNotVerifiedWithRealNameFunc(ctx context.Context, req *wxApplet.AppRegisteredButNotVerifiedWithRealNameReq) (listRes *wxApplet.AppRegisteredButNotVerifiedWithRealNameRes, err error) { + listRes = new(wxApplet.AppRegisteredButNotVerifiedWithRealNameRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusConstructionUser.Ctx(ctx).Where("sfz_number IS NULL or sfz_number = ''") + y := dao.BusConstructionUser.Ctx(ctx).Fields("id").Where("sfz_number IS NULL or sfz_number = ''") + if req.Phone != "" { + m = m.Where(dao.BusConstructionUser.Columns().Phone+" like ?", "%"+req.Phone+"%") + y = y.Where(dao.BusConstructionUser.Columns().Phone+" like ?", "%"+req.Phone+"%") + } + listRes.Total, err = y.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*wxApplet.RegisteredButNotVerifiedWithRealNameRes + err = m.Fields("id,openid,phone").Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = res + }) + return +} + +type PcQueryBasedOnOpenid struct { + commonApi.EmptyRes + Id string `json:"id" dc:"打卡主键ID"` + Openid string `json:"openid" dc:"openid"` + ProjectId int64 `json:"projectId" dc:"项目ID"` + ProjectName string `json:"projectName" dc:"班组名称"` + TeamId int64 `json:"teamId" dc:"班组ID"` + TeamName string `json:"teamName" dc:"班组名称"` + PrintingDate string `json:"printingDate" dc:"年月日"` + IsPinch string `json:"isPinch" dc:"1正常,2迟到,3早退,4缺勤,5补卡"` + ClockOn string `json:"clockOn" dc:"打卡时间"` + Commuter string `p:"commuter" dc:"1上班2下班"` +} + +func (s *sBusConstructionUser) PcQueryBasedOnOpenidFunc(ctx context.Context, req *system.PcQueryBasedOnOpenidReq) (res *system.PcQueryBasedOnOpenidRes, err error) { + res = new(system.PcQueryBasedOnOpenidRes) + err = g.Try(ctx, func(ctx context.Context) { + // 1、获取指定人与指定月份的所有打卡数据 + // var one []*system.PcQueryBasedOnOpenidRes + var one []*PcQueryBasedOnOpenid + err := wxDao.BusAttendance.Ctx(ctx).As("a"). + LeftJoin(wxDao.BusConstructionUser.Table(), "b", "b.openid = a.openid"). + LeftJoin(wxDao.SysProjectTeam.Table(), "c", "c.id = b.team_id"). + LeftJoin(dao.SysProject.Table(), "d", "d.id = b.project_id"). + Fields("a.*,"+ + //"a.openid,"+ + //"a.printing_date as printingDate,"+ + "b.project_id as projectId,"+ + "d.project_name as projectName,"+ + "b.team_id as teamId,"+ + "c.name as teamName"). + Where("a.openid", req.Openid). + Where("DATE_FORMAT(printing_date,'%Y-%m') = ?", req.DateStr).Scan(&one) + liberr.ErrIsNil(ctx, err, "获取数据失败") + if len(one) == 0 { + return + } + // 2、数据分类,然后统计出状态 + mp := make(map[string][]*PcQueryBasedOnOpenid) + for _, data := range one { + keyStr := data.Openid + "," + data.PrintingDate + _, ok := mp[keyStr] + if ok { + openids := mp[keyStr] + openids = append(openids, data) + mp[keyStr] = openids + } else { + pcQueryBasedOnOpenidEntity := []*PcQueryBasedOnOpenid{} + pcQueryBasedOnOpenidEntity = append(pcQueryBasedOnOpenidEntity, data) + mp[keyStr] = pcQueryBasedOnOpenidEntity + } + } + var aList []*system.PcQueryBasedOnOpenidTwoRes + for _, v := range mp { + var statusArr []string + num := 0 // 打卡次数 + n2 := 0 // 迟到、早退、缺卡 + n3 := 0 // 补卡 + aEntity := system.PcQueryBasedOnOpenidTwoRes{ + Openid: v[0].Openid, + ProjectId: v[0].ProjectId, + ProjectName: v[0].ProjectName, + TeamId: v[0].TeamId, + TeamName: v[0].TeamName, + PrintingDate: v[0].PrintingDate, + } + var bList []*system.PcQueryBasedOnOpenidThreeRes + for _, vdata := range v { + num = num + 1 + if vdata.IsPinch == "5" { + n3 = n3 + 1 + } else if vdata.IsPinch == "2" || vdata.IsPinch == "3" || vdata.IsPinch == "4" { + n2 = n2 + 1 + } + bEntity := system.PcQueryBasedOnOpenidThreeRes{ + Commuter: vdata.Commuter, + Clock: vdata.ClockOn, + IsPinch: vdata.IsPinch, + } + bList = append(bList, &bEntity) + } + if num == 2 && n2 == 0 && n3 == 0 { + statusArr = append(statusArr, "1") + } + if n2 > 0 { + statusArr = append(statusArr, "2") + } + if n3 > 0 { + statusArr = append(statusArr, "3") + } + aEntity.Status = statusArr + aEntity.ThreeList = bList + aList = append(aList, &aEntity) + } + res.List = aList + }) + return +} + +func (s *sBusConstructionUser) PcSelectBelowProjectOfPersonnelFunc(ctx context.Context, req *system.PcSelectBelowProjectOfPersonnelReq) (res *system.PcSelectBelowProjectOfPersonnelRes, err error) { + res = new(system.PcSelectBelowProjectOfPersonnelRes) + err = g.Try(ctx, func(ctx context.Context) { + // 2、根据openid等条件获取到所有打卡的数据信息 + var one []*system.PcSelectBelowProjectOfPersonnelTwoRes + g := wxDao.BusAttendance.Ctx(ctx).As("a"). + LeftJoin(wxDao.BusConstructionUser.Table(), "b", "b.openid = a.openid"). + LeftJoin(wxDao.SysProjectTeam.Table(), "c", "c.id = b.team_id"). + Fields("a.id,a.openid,b.type_of_work as typeOfWork,b.user_name as userName,c.name as teamName"). + Group("a.openid") + if req.ProjectId > 0 { + g = g.Where("b.project_id", req.ProjectId) + } + if req.TeamId > 0 { + g = g.Where("b.team_id", req.TeamId) + } + if req.TypeOfWork != "" { + g = g.Where("b.type_of_work", req.TypeOfWork) + } + if req.FuzzyQuery != "" { + g = g.Where("b.user_name like ?", "%"+req.FuzzyQuery+"%") + } + if req.DateStr != "" { + g = g.Where("DATE_FORMAT(a.printing_date,'%Y-%m') = ?", req.DateStr) + } + values, err := g.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + res.Total = len(values) + if req.PageNum == 0 { + req.PageNum = 1 + } + res.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + err = g.Page(req.PageNum, req.PageSize).Order(order).Scan(&one) + // 3、获取打卡人的详细数据(当月的所有数据) + for i := range one { + var entity []*wxModel.BusAttendanceInfoRes + err = wxDao.BusAttendance.Ctx(ctx). + Where("openid", one[i].Openid). + Where("DATE_FORMAT(printing_date,'%Y-%m') = ?", req.DateStr). + Scan(&entity) + if err != nil { + err = errors.New("查询子数据失败") + return + } + one[i].List = entity + } + mp := make(map[string][]*wxModel.BusAttendanceInfoRes) + for _, data := range one { + var dataEntity []*wxModel.BusAttendanceInfoRes + for _, dataj := range data.List { + ddd := new(wxModel.BusAttendanceInfoRes) + copier.Copy(ddd, dataj) + dataEntity = append(dataEntity, ddd) + mp[dataj.Openid] = dataEntity + } + } + // 3-2、根据数据判断 + for i, data := range one { // 主数据 + mpTo := make(map[string]int) // 出勤天数 主数据下的N多副数据;计算当前当前出勤次数(只要有一次或多次打卡就算1) + n2 := 0 // 迟到 + n3 := 0 // 早退 + n4 := 0 // 缺卡 + for k, v := range mp { + if data.Openid == k { + for i := range v { // 根据副数据得出最终数据 + vOne := v[i].Openid + "," + v[i].PrintingDate + _, ok := mpTo[vOne] + if !ok { + mpTo[vOne] = 1 + } + + if v[i].IsPinch == "2" { + n2 = n2 + 1 + } else if v[i].IsPinch == "3" { + n3 = n3 + 1 + } else if v[i].IsPinch == "4" { + n4 = n4 + 1 + } + } + } + } + one[i].Attendance = len(mpTo) + one[i].BeLate = n2 + one[i].LeaveEarly = n3 + one[i].LackOfCard = n4 + } + for i := range one { + one[i].List = nil + } + res.List = one + }) + return +} + +func (s *sBusConstructionUser) PcCollectDataForTwoWeeksFunc(ctx context.Context, req *system.PcCollectDataForTwoWeeksReq) (res *system.PcCollectDataForTwoWeeksRes, err error) { + res = new(system.PcCollectDataForTwoWeeksRes) + err = g.Try(ctx, func(ctx context.Context) { + dates, max, min := getRecentTwoWeeksDates() + // 1、获取当前项目两周的打卡信息 + var at []*wxModel.BusAttendanceInfoRes + err := wxDao.BusAttendance.Ctx(ctx). + Where("project_id", req.ProjectId). + WhereBetween("printing_date", min, max).Scan(&at) + liberr.ErrIsNil(ctx, err, "获取近两周的打卡信息失败") + // 2、按照日期和openid来进行数据分类 + mp := make(map[string][]*wxModel.BusAttendanceInfoRes) + for i := range dates { // 日期 + for j := range at { // openid + if dates[i] == at[j].PrintingDate { + mpKey := at[j].Openid + "," + at[j].PrintingDate + _, ok := mp[mpKey] + if ok { + infoRes := mp[mpKey] + infoRes = append(infoRes, at[j]) + mp[mpKey] = infoRes + } else { + var twoRes []*wxModel.BusAttendanceInfoRes + twoRes = append(twoRes, at[j]) + mp[mpKey] = twoRes + } + } + } + } + // 3、将分类的数据进行分析统计,得到每天的全勤、半勤或缺卡统计 + var listEntity []*system.PcCollectDataForTwoWeeksTwoRes + for _, v := range mp { + thisN1 := 0 // 缺 + thisN2 := 0 // 半 + thisN3 := 0 // 全 + var dataStr string // 打卡时间 + num := 0 // 打卡次数 + flag := false // 是否缺卡 + // 计算打卡信息 + for i := range v { + dataStr = v[i].PrintingDate + if v[i].IsPinch == "4" { // 缺卡单独计算 + flag = true + } else { + flag = false + num = num + 1 + } + + if flag { + thisN1 = thisN1 + 1 + } + if num == 1 && flag == false { + thisN2 = thisN2 + 1 + } + if num > 1 && flag == false { + thisN3 = thisN3 + 1 + } + } + // 记录当前用户当天的打卡信息 + fh := system.PcCollectDataForTwoWeeksTwoRes{ + DateStr: dataStr, + Absenteeism: thisN1, + HalfDuty: thisN2, + Attendance: thisN3, + } + listEntity = append(listEntity, &fh) + } + fhMp := make(map[string]*system.PcCollectDataForTwoWeeksTwoRes) + for i := range listEntity { + v, ok := fhMp[listEntity[i].DateStr] + if ok { + fhMp[listEntity[i].DateStr] = &system.PcCollectDataForTwoWeeksTwoRes{ + DateStr: listEntity[i].DateStr, + Absenteeism: v.Absenteeism + listEntity[i].Absenteeism, + HalfDuty: v.HalfDuty + listEntity[i].HalfDuty, + Attendance: v.Attendance + listEntity[i].Attendance, + } + } else { + fhMp[listEntity[i].DateStr] = &system.PcCollectDataForTwoWeeksTwoRes{ + DateStr: listEntity[i].DateStr, + Absenteeism: listEntity[i].Absenteeism, + HalfDuty: listEntity[i].HalfDuty, + Attendance: listEntity[i].Attendance, + } + } + } + var fhEntity []*system.PcCollectDataForTwoWeeksTwoRes + for _, v := range fhMp { + fhEntity = append(fhEntity, v) + } + // 对 listEntity的dateStr排序 + sort.Slice(fhEntity, func(i, j int) bool { + return fhEntity[i].DateStr < fhEntity[j].DateStr + }) + res.List = fhEntity + }) + return +} + +// 获取到到当前时间最近两周的日期,并返回最大及最小日期 +func getRecentTwoWeeksDates() (dates []string, max string, min string) { + sj := "2006-01-02" + now := time.Now() + for i := 0; i < 14; i++ { + date := now.AddDate(0, 0, -i) + dates = append(dates, date.Format(sj)) + } + max = now.Format(sj) + min = now.AddDate(0, 0, -13).Format(sj) + return +} + +func (s *sBusConstructionUser) AppResubmitTheExitAttachmentFunc(ctx context.Context, req *wxApplet.AppResubmitTheExitAttachmentReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 0、上传文件 + var pathStr string + for i := range req.File { + pathStr = pathStr + req.File[i].Url + "," + } + if len(pathStr) > 0 { + pathStr = pathStr[0 : len(pathStr)-1] + } + // 2、查询原本数据 + value, err := dao.BusConstructionUser.Ctx(ctx).Where("openid", ct.New().GetLoginUser(ctx).OpenId).Fields("sfz_number").Value() + liberr.ErrIsNil(ctx, err, "获取身份证号失败") + var entity *model.BusConstructionUserDepartureInfoRes + err = g.DB().Model("bus_construction_user_departure").Ctx(ctx).Where("sfz_number", value.String()).Order("id desc").Limit(1).Scan(&entity) + liberr.ErrIsNil(ctx, err, "获取退场数据失败") + // 3、组装离场记录 + insertData := model.BusConstructionUserDepartureInfoRes{ + Path: entity.Path + "," + pathStr, + } + _, err = g.DB().Model("bus_construction_user_departure").Ctx(ctx).Where("id", entity.Id).OmitEmpty().Update(insertData) + liberr.ErrIsNil(ctx, err, "补交退场凭证失败!") + }) + return err + }) + return +} + +func (s *sBusConstructionUser) DepartureRecordFunc(ctx context.Context, req *system.DepartureRecordReq) (res *system.DepartureRecordRes, err error) { + res = new(system.DepartureRecordRes) + err = g.Try(ctx, func(ctx context.Context) { + var entity []model.BusConstructionUserDepartureInfoRes + err = g.DB().Model("bus_construction_user_departure").Ctx(ctx).Where("sfz_number", req.SfzNumber).OrderDesc("leave_date").Scan(&entity) + res.List = entity + liberr.ErrIsNil(ctx, err, "查询失败!") + }) + return +} + +// DepartureFunc 离场(成员离开班组) +func (s *sBusConstructionUser) DepartureFunc(ctx context.Context, req *system.DepartureReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 0、上传文件 + var pathStr string + for i := range req.File { + str, err := coryCommon.UploadFile(ctx, req.File[i], coryCommon.Helmet) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + //if req.WxOrPc == "1" { + // pathStr = pathStr + coryCommon.ResourcePublicToFunc("/"+str, 0) + "," + //} else { + // pathStr = pathStr + coryCommon.ResourcePublicToFunc("/"+str, 3) + "," + //} + pathStr = pathStr + coryCommon.ResourcePublicToFunc("/"+str, 3) + "," + } + pathStr = pathStr[0 : len(pathStr)-1] + // 1、根据主键ID获取到成员信息 + var memberEntity wxModel.SysProjectTeamMemberInfoRes + err = wxDao.SysProjectTeamMember.Ctx(ctx).WherePri(req.Id).Scan(&memberEntity) + liberr.ErrIsNil(ctx, err) + // 2、根据得到的openid获取到对应人的身份证号码,以此来保证以后换号不换人,能够正确加载到历史数据 + var userEntity model.BusConstructionUserInfoRes + err = dao.BusConstructionUser.Ctx(ctx).Where("openid", memberEntity.Openid).Fields("sfz_number,entry_date").Scan(&userEntity) + liberr.ErrIsNil(ctx, err) + // 3、组装离场记录 + dateTime := tool.New().GetFormattedDateTime(time.Now()) + insertData := model.BusConstructionUserDepartureInfoRes{ + SfzNumber: userEntity.SfzNumber, + ProjectId: memberEntity.ProjectId, + TeamId: memberEntity.TeamId, + EntryDate: userEntity.EntryDate, + LeaveDate: gtime.New(dateTime), + Path: pathStr, + Remark: req.Remark, + } + _, err = g.DB().Model("bus_construction_user_departure").Ctx(ctx).Insert(insertData) + liberr.ErrIsNil(ctx, err, "创建离场记录失败!") + // 4、组装退场信息 + _, err = dao.BusConstructionUser.Ctx(ctx).Where("openid", memberEntity.Openid).Update(g.Map{ + "leave_date": tool.New().GetFormattedDateTime(time.Now()), + "team_id": nil, + "if_management": nil, + }) + liberr.ErrIsNil(ctx, err, "修改离场信息失败!") + // 5、删除成员 + _, err = wxDao.SysProjectTeamMember.Ctx(ctx).Delete("id", req.Id) + // 6、删除当前人员的班组长角色 + v, err := dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().Openid, memberEntity.Openid).Fields("id").Value() + _, err = g.DB().Model("sys_wechat_user_role").Ctx(ctx). + Where("user_id", v). + Where("role_id = 4"). + Delete("user_id", v) + liberr.ErrIsNil(ctx, err, "离场失败!") + }) + return err + }) + return +} + +func (s *sBusConstructionUser) AppExitFunc(ctx context.Context, req *wxApplet.AppExitReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 判断当前人是否加入班组 + count, err := dao.BusConstructionUser.Ctx(ctx). + Where(dao.BusConstructionUser.Columns().Openid, req.Openid). + Where("team_id <> 0 and team_id is not NULL").Count() + liberr.ErrIsNil(ctx, err) + if count == 0 { + err = errors.New("当前用户暂无班组,无法进行此操作") + liberr.ErrIsNil(ctx, err) + return + } + // 0、上传文件 + var pathStr string + for i := range req.File { + pathStr = pathStr + req.File[i].Url + "," + } + if len(pathStr) > 0 { + pathStr = pathStr[0 : len(pathStr)-1] + } + // 4.2、根据主键ID获取到成员信息 + var memberEntity wxModel.SysProjectTeamMemberInfoRes + err = wxDao.SysProjectTeamMember.Ctx(ctx).Where("openid", req.Openid).Scan(&memberEntity) + liberr.ErrIsNil(ctx, err) + // 2、根据得到的openid获取到对应人的身份证号码,以此来保证以后换号不换人,能够正确加载到历史数据 + var userEntity model.BusConstructionUserInfoRes + err = dao.BusConstructionUser.Ctx(ctx).Where("openid", req.Openid).Fields("project_id,team_id,openid,sfz_number,entry_date").Scan(&userEntity) + liberr.ErrIsNil(ctx, err) + // 3、组装离场记录 + dateTime := tool.New().GetFormattedDateTime(time.Now()) + insertData := model.BusConstructionUserDepartureInfoRes{ + SfzNumber: userEntity.SfzNumber, + ProjectId: userEntity.ProjectId, + TeamId: userEntity.TeamId, + EntryDate: userEntity.EntryDate, + LeaveDate: gtime.New(dateTime), + Path: pathStr, + Remark: req.Remark, + } + _, err = g.DB().Model("bus_construction_user_departure").Ctx(ctx).Insert(insertData) + liberr.ErrIsNil(ctx, err, "创建离场记录失败!") + // 4、组装退场信息 + _, err = dao.BusConstructionUser.Ctx(ctx).Where("openid", userEntity.Openid).Update(g.Map{ + "leave_date": tool.New().GetFormattedDateTime(time.Now()), + "team_id": nil, + "if_management": nil, + }) + liberr.ErrIsNil(ctx, err, "修改离场信息失败!") + // 5、删除成员 + _, err = wxDao.SysProjectTeamMember.Ctx(ctx).Delete("id", memberEntity.Id) + // 6、删除当前人员的班组长角色 + v, err := dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().Openid, memberEntity.Openid).Fields("id").Value() + _, err = g.DB().Model("sys_wechat_user_role").Ctx(ctx). + Where("user_id", v). + Where("role_id = 4"). + Delete("user_id", v) + liberr.ErrIsNil(ctx, err, "离场失败!") + }) + return err + }) + return +} + +type File struct { + Name string + Path string + IsDir bool + Children []File +} + +type UserEntity struct { + Id int64 `json:"id"` + SfzNumber string `json:"sfz_number"` +} + +// ZipFolderuploadFunc 批量上传施工人员的资料(压缩文件zip上传) +func (s *sBusConstructionUser) ZipFolderuploadFunc(ctx context.Context, req *system.ZipFolderuploadReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //// 将 “\"改为“/” + //filePath := "/" + req.FilePath + //filePath = filepath.ToSlash(filePath) + + const old = "/resource/public/" + if !strings.Contains(req.FilePath, old) { + req.FilePath = old + req.FilePath + } + rpath := strings.Replace(req.FilePath, old, coryCommon.GetCWD()+old, 1) + // 2、文件解压 + str := "/" + coryCommon.Ynr(coryCommon.Helmet) + coryCommon.FileName("del") + folderPath, err := coryCommon.FileZipFunc(rpath, "", str) + liberr.ErrIsNil(ctx, err) + + // 3、读取文件 目录路径 路径下文件为children + files, err := getFiles(folderPath) + if err != nil { + return + } + // 安全文件路径 + safefile := coryCommon.Ynr(coryCommon.Temporary+"/") + coryCommon.FileName("aq") + safePath := filepath.ToSlash(coryCommon.GetCWD() + "/" + safefile) + // 根据身份证的id去获取到施工人员的id + data, errData := printFiles(files, safePath) + if err != nil { + liberr.ErrIsNil(ctx, errData) + return + } + var sfz []string + for i := range data { + sfz = append(sfz, data[i].IdentityCard) + } + var ue []*UserEntity + err = dao.BusConstructionUser.Ctx(ctx).Where("sfz_number in (?)", sfz).Fields("id,sfz_number").Scan(&ue) + var fileIds []int64 + for j := range data { + for i := range ue { + if ue[i].SfzNumber == data[j].IdentityCard { + data[j].UserId = ue[i].Id + fileIds = append(fileIds, data[j].UserId) + } + } + } + // 根据fileIds得到所有相关人员的数据 + var userFile []*model.BusConstructionUserFileListRes + if len(fileIds) > 0 { + _ = dao.BusConstructionUserFile.Ctx(ctx). + Where("user_id in (?)", fileIds). + Fields("user_id,user_img_type,path").Scan(&userFile) + } + sql := "" + for i := range data { + if data[i].Path != "" { + dateTime := tool.New().GetFormattedDateTime(time.Now()) + sql = sql + "UPDATE bus_construction_user_file " + + "SET updated_at = '" + gtime.New(dateTime).String() + "', path= '" + data[i].Path + "' " + + "WHERE user_id=" + strconv.FormatInt(data[i].UserId, 10) + " AND user_img_type=" + data[i].UserImgType + " AND deleted_at IS NULL;" + if userFile != nil { + for _, jData := range userFile { + if data[i].UserId == jData.UserId && data[i].UserImgType == jData.UserImgType && jData.Path != "" { + split := strings.Split(jData.Path, ",") + for j := range split { + os.RemoveAll(coryCommon.FileToFunc(split[j], 2)) + } + } + } + } + } + } + // 检查安全考试文件是否存在 存在err为空 + _, err = os.Stat(safePath) + if err == nil { + safePathZip := safePath + ".zip" // 安全考试文件压缩路径 + err = coryCommon.DeleteFolderToZip(safePath, safePathZip) + liberr.ErrIsNil(ctx, err, "安全考试文件压缩异常") + var uploadReq *system.UploadZipFileReq = new(system.UploadZipFileReq) + uploadReq.FilePath = filepath.ToSlash(safefile + ".zip") + _, err = systemController.BusQuestionSave.UploadZipFileFunc(context.TODO(), uploadReq) + liberr.ErrIsNil(ctx, err, "安全考试文件上传失败!") + } + _, err = g.DB().Exec(ctx, sql) + liberr.ErrIsNil(ctx, err, "批量操作失败!") + // 4、存储文件 + defer func() { + os.RemoveAll(rpath) + }() + }) + return err + }) + return +} + +func getFiles(path string) ([]File, error) { + var files []File + fileInfos, err := ioutil.ReadDir(path) + if err != nil { + return nil, err + } + for _, fileInfo := range fileInfos { + // 获取文件或子文件夹的绝对路径 + file := File{ + Name: fileInfo.Name(), // 文件或目录名 + IsDir: fileInfo.IsDir(), // 是否为目录 + Path: filepath.Join(path, fileInfo.Name()), // 文件或目录的绝对路径 + } + if fileInfo.IsDir() { + // 如果是目录,则递归调用getFiles读取该目录下的文件和子目录 + children, err := getFiles(filepath.Join(path, fileInfo.Name())) + if err != nil { + return nil, err + } + file.Children = children + } + files = append(files, file) + } + return files, nil +} + +var nameToUserImgType = map[string]string{ + "合同": "4", + "体检报告": "5", + "安全责任书": "6", + "岗位危险告知书": "7", + "安全技术交底": "8", + "三级安全教育": "10", +} + +func printFiles(files []File, safepath string) (data []*model.DataRes, err error) { + //我明确数据只有三层所以三重循环 + for _, one := range files { // 一级文件夹 + if strings.Contains(one.Name, "-") { // 检查文件夹名称是否包含"-" + split := strings.Split(one.Name, "-") + for _, two := range one.Children { + entity := new(model.DataRes) + imgType, exists := nameToUserImgType[two.Name] + if exists { + entity.UserImgType = imgType + } else if isSpecificFolder(two.Name) { + targetDir := filepath.ToSlash(filepath.Join(one.Path, two.Name)) + Dest := filepath.ToSlash(safepath + "/aaa/") // aaa这里是因为UploadZipFileFunc接口压缩文件上面需要一层文件夹 + err := os.MkdirAll(Dest, 0o775) // 创建文件夹 + if err != nil { + return nil, errors.New("创建目录出错:" + err.Error()) + } + Dest = filepath.ToSlash(safepath + "/aaa/" + two.Name) + err = coryCommon.MoveFile(targetDir, Dest) + if err != nil { + return nil, errors.New("文件移动异常:" + err.Error()) + } + continue + } else { + // 如果名称没有匹配到任何已知类型 + return nil, errors.New("请检查目录:" + two.Name) + } + entity.IdentityCard = split[1] + var str string + for _, three := range two.Children { // 三级文件 + // 将图片存储到另外一个地方 // 将图片文件复制到目标目录,并构建图片的访问路径 + p := coryCommon.GetCWD() + "/" + coryCommon.Ynr(coryCommon.Helmet) + coryCommon.FileName("tmp_") + filepath.Ext(filepath.ToSlash(three.Path)) + _ = coryCommon.CopyFile(filepath.ToSlash(three.Path), p) + rpath := coryCommon.ResourcePublicToFunc(filepath.ToSlash(p), 1) + str = str + rpath + "," + } + // 如果存在图片文件,则将其路径设置到模型中,并添加该模型到结果列 + if len(str) > 0 { + str = str[0 : len(str)-1] + entity.Path = str + data = append(data, entity) + } + + } + } + } + return +} + +// 安全考试文件夹正则匹配 dd-dd- +func isSpecificFolder(name string) bool { + pattern := `^[^\d]+(?:-\d+)+$` + match, _ := regexp.MatchString(pattern, name) + return match +} + +// TemplateExportFunc 施工人员资料文件上传模板导出 +func (s *sBusConstructionUser) TemplateExportFunc(ctx context.Context, req *system.TemplateExportReq) (p string, err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 0、根据项目id获取到项目名称 + value, err := dao.SysProject.Ctx(ctx).WherePri(req.ProjectId).Fields("CASE WHEN (short_name IS NULL OR project_name = '') THEN project_name ELSE short_name END AS project_name").Value() + liberr.ErrIsNil(ctx, err, "操作失败") + // 1、获取当前项目下所有的用户名+身份证+所需上传的资料 + var entity []*model.BusConstructionUserInfoRes + dao.BusConstructionUser.Ctx(ctx). + Where("project_id", req.ProjectId). + Where("team_id <> 0"). + Where("team_id is not null"). + Scan(&entity) + // 2、获取到施工人员的资料上传板块儿 + dictValue := []int{4, 5, 6, 7, 8, 10} + array, _ := commonDao.SysDictData.Ctx(ctx). + Where("dict_type", "user_img_type"). + Where("dict_value in (?)", dictValue).Fields("dict_label").Array() + // 2、创建文件夹到临时文件中,(结构:【主文件夹】-【名称+身份证】-【合同】-【文件】) + path := coryCommon.GetCWD() + "/" + coryCommon.Ynr(coryCommon.Temporary+"/") + path = path + coryCommon.FileName(value.String()+"aqks") + for _, one := range entity { + // 主文件夹下创建二级文件 + folderName := one.UserName + "-" + one.SfzNumber + pathTwo := path + "/" + folderName + for i := range array { + // 二级文件夹下有多个不同的三级文件夹 + arrPath := pathTwo + "/" + array[i].String() + err := os.MkdirAll(arrPath, 0o777) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + } + } + // 3、压缩成压缩包zip + zipFile := path + ".zip" + err = coryCommon.CreateZipFile(path, zipFile) + p = coryCommon.ResourcePublicToFunc(filepath.ToSlash(zipFile), 1) + }) + return +} + +// ClockingConditionFunc 开启/关闭打开(根据某个人操作) +func (s *sBusConstructionUser) ClockingConditionFunc(ctx context.Context, req *system.ClockingConditionReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 1、根据项目id去修改数据状态 + _, err := dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().Id, req.Id).Update(g.Map{"clock": req.Type}) + liberr.ErrIsNil(ctx, err, "操作失败") + }) + return +} + +// OneClickOpenFunc 一键开启/关闭打开 +func (s *sBusConstructionUser) OneClickOpenFunc(ctx context.Context, req *system.OneClickOpenReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 1、根据项目id去修改数据状态 + _, err := dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().ProjectId, req.ProjectId).Where("team_id <>0 and team_id is not NULL").Update(g.Map{"clock": req.Type}) + liberr.ErrIsNil(ctx, err, "操作失败") + }) + return +} + +// ExportSalaryFunc 根据项目或班组导出出勤记录(班组) +func (s *sBusConstructionUser) ExportSalaryFunc(ctx context.Context, req *system.ExportSalaryReq) (res *system.ExportSalaryRes, err error) { + res = new(system.ExportSalaryRes) + // 1、获取班组或项目的出勤数据 + if req.ProjectId > 0 && req.TeamId > 0 { + entity, err := wxSysProjectTeam.TeamFunc(ctx, req.TeamId) + liberr.ErrIsNil(ctx, err) + one, err := TeamOrGroupFunc(ctx, entity, req.ProjectId, req.DateStr, req.FuzzyQuery, req.TypeOfWork) + liberr.ErrIsNil(ctx, err) + res.AttendanceAllOne = one + } else { + // 获取所有班组信息 + entity, err := wxSysProjectTeam.TeamOrGroupFunc(ctx, req.ProjectId) + liberr.ErrIsNil(ctx, err) + // 获取导出信息 + one, err := TeamOrGroupFunc(ctx, entity, req.ProjectId, req.DateStr, req.FuzzyQuery, req.TypeOfWork) + liberr.ErrIsNil(ctx, err) + res.AttendanceAllOne = one + } + // 2、把退场的施工人员对象集给拿出来 + var attendanceOne []model.AttendanceEntity + var listEntity []*wxModel.BusAttendanceListRes // 指定月打卡情况 + statr, end := tool.TheBeginningAndTheEndOfTheMonthAssign(req.DateStr) + err = g.DB().Model("bus_attendance").Ctx(ctx). + WhereBetween("printing_date", statr, end).Scan(&listEntity) + if err != nil || len(listEntity) == 0 { + return + } + var userEntity []*model.BusConstructionUserInfoRes // 退场人员 + err = dao.BusConstructionUser.Ctx(ctx). + Fields("user_name,sfz_number,openid,entry_date,leave_date"). + Where("project_id", req.ProjectId). + Where("team_id = 0 or team_id is null"). + Where("leave_date <> '' and leave_date is not null"). + Scan(&userEntity) + if err != nil || len(userEntity) == 0 { + return + } + one, _ := PublicTeamOrGroupFunc(ctx, userEntity, listEntity, req.DateStr) + attendanceOne = append(attendanceOne, one...) + projectEntity := model.AttendanceAllEntity{ + TeamName: "退场人员(无班组)", + Team: attendanceOne, + } + if len(res.AttendanceAllOne) > 0 { + projectEntity.ProjectName = res.AttendanceAllOne[0].ProjectName + } + res.AttendanceAllOne = append(res.AttendanceAllOne, projectEntity) + return +} + +// TeamOrGroupFunc 根据班组ID获取到对应班组下施工人员的考勤信息 +func TeamOrGroupFunc(ctx context.Context, teamEntity []*wxModel.SysProjectTeamListRes, projectId int64, years, fuzzyQuery, typeOfWork string) (AttendanceAllOne []model.AttendanceAllEntity, err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 获取项目名称 + projectName, err := g.DB().Model("sys_project").Where("id", projectId).Fields("project_name").Value() + liberr.ErrIsNil(ctx, err, "导出失败!(获取项目信息失败)") + // 0、获取本月的所有打卡情况 + statr, end := tool.TheBeginningAndTheEndOfTheMonthAssign(years) + var listEntity []*wxModel.BusAttendanceListRes + err = g.DB().Model("bus_attendance").Ctx(ctx).WhereBetween("printing_date", statr, end).Scan(&listEntity) + liberr.ErrIsNil(ctx, err, "导出失败!(获取考勤信息失败)") + // var AttendanceAllOne []model.AttendanceAllEntity + // 1、循环获取每个班组下面的数据信息 + for iii := range teamEntity { + id := teamEntity[iii].Id + // 获取当前班组的 + var attendanceOne []model.AttendanceEntity // 班组数据 + // 2、获取到当前组成员的信息 + var userEntity []*model.BusConstructionUserInfoRes + ggg := dao.BusConstructionUser.Ctx(ctx). + Fields("user_name,sfz_number,openid,entry_date,leave_date") + if fuzzyQuery != "" { + ggg = ggg.Where("user_name", fuzzyQuery) + } + if typeOfWork != "" { + ggg = ggg.Where("type_of_work", typeOfWork) + } + err = ggg.Where("team_id", id). + Where("sfz_number <> ''"). + Scan(&userEntity) + liberr.ErrIsNil(ctx, err, "导出失败!(获取成员信息失败)") + // 3、和成员进行匹配,最后得出1(打卡)、0.5(异常)、0(正常) + one, _ := PublicTeamOrGroupFunc(ctx, userEntity, listEntity, years) + attendanceOne = append(attendanceOne, one...) + projectEntity := model.AttendanceAllEntity{ + ProjectName: projectName.String(), + TeamName: teamEntity[iii].Name, + Team: attendanceOne, + } + AttendanceAllOne = append(AttendanceAllOne, projectEntity) + } + }) + return +} + +func PublicTeamOrGroupFunc(ctx context.Context, + userEntity []*model.BusConstructionUserInfoRes, + listEntity []*wxModel.BusAttendanceListRes, + years string, +) (attendanceOne []model.AttendanceEntity, err error) { + for _, idata := range userEntity { + mpValue := make(map[string]float32) + for _, jdata := range listEntity { + if (idata.Openid == jdata.Openid || idata.Openid == jdata.PinchOpenId) && jdata.ClockOn != "缺卡" { + // 先获取有没有数据,没有返回0值,如果当前打卡两次,那么key为2024-1-01 value为2就证明打卡成功,为1就表示异常0.5,一次都没有就设置0 + i := mpValue[jdata.PrintingDate] + mpValue[jdata.PrintingDate] = i + 1 + } + } + for key := range mpValue { + i := mpValue[key] + if i >= 2 { + mpValue[key] = 1 + } else { + mpValue[key] = 0.5 + } + } + // currentTime := time.Now() + currentTime, err := time.Parse("2006-01", years) + liberr.ErrIsNil(ctx, err) + firstDay := time.Date(currentTime.Year(), currentTime.Month(), 1, 0, 0, 0, 0, currentTime.Location()) + lastDay := firstDay.AddDate(0, 1, 0).Add(-time.Second) + for day := firstDay; day.Before(lastDay); day = day.AddDate(0, 0, 1) { + dateStr := fmt.Sprintf("%d-%02d-%02d", day.Year(), day.Month(), day.Day()) + f := mpValue[dateStr] + if f == 0 { + mpValue[dateStr] = 0 + } + } + entity := model.AttendanceEntity{ // 成员数据 + Name: idata.UserName, + IdentityCard: idata.SfzNumber, + Attendance: mpValue, + } + if idata.EntryDate.String() != "" { + entity.Type = false + } + if idata.LeaveDate.String() != "" { + entity.Type = true + } + + attendanceOne = append(attendanceOne, entity) + } + return +} + +func (s *sBusConstructionUser) List(ctx context.Context, req *system.BusConstructionUserSearchReq) (listRes *system.BusConstructionUserSearchRes, err error) { + listRes = new(system.BusConstructionUserSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusConstructionUser.Ctx(ctx).WithAll() + if req.NickName != "" { + m = m.Where(dao.BusConstructionUser.Columns().NickName+" like ?", "%"+req.NickName+"%") + } + if req.UserName != "" { + m = m.Where(dao.BusConstructionUser.Columns().UserName+" like ?", "%"+req.UserName+"%") + } + if req.ProjectId != "" { + m = m.Where(dao.BusConstructionUser.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + if req.Status != "" { + m = m.Where(dao.BusConstructionUser.Columns().Status+" = ?", req.Status) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusConstructionUser.Columns().CreatedAt+" >=? AND "+dao.BusConstructionUser.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.Phone != "" { + m = m.Where(dao.BusConstructionUser.Columns().Phone+" like ?", "%"+req.Phone+"%") + } + if req.Sex != "" { + m = m.Where(dao.BusConstructionUser.Columns().Sex+" = ?", req.Sex) + } + if req.SfzNation != "" { + m = m.Where(dao.BusConstructionUser.Columns().SfzNation+" like ?", "%"+req.SfzNation+"%") + } + if req.NativePlace != "" { + m = m.Where(dao.BusConstructionUser.Columns().NativePlace+" like ?", "%"+req.NativePlace+"%") + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusConstructionUserInfoRes + err = m.Fields(system.BusConstructionUserSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusConstructionUserListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusConstructionUserListRes{ + Id: v.Id, + Openid: v.Openid, + NickName: v.NickName, + TeamId: v.TeamId, + HeadIcon: v.HeadIcon, + PacePhoto: v.PacePhoto, + UserName: v.UserName, + ProjectId: v.ProjectId, + Status: v.Status, + IsPinch: v.IsPinch, + IfManagement: v.IfManagement, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + Phone: v.Phone, + Sex: v.Sex, + SfzNation: v.SfzNation, + SfzNumber: v.SfzNumber, + SfzStart: v.SfzStart, + SfzEnd: v.SfzEnd, + SfzSite: v.SfzSite, + NativePlace: v.NativePlace, + YhkNumber: v.YhkNumber, + YhkOpeningBank: v.YhkOpeningBank, + YhkCardholder: v.YhkCardholder, + ProjectRecord: v.ProjectRecord, + } + } + }) + return +} + +func (s *sBusConstructionUser) GetById(ctx context.Context, id int64) (res *model.BusConstructionUserInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 1、获取施工人员 + err = dao.BusConstructionUser.Ctx(ctx).WithAll().Where(dao.BusConstructionUser.Columns().Id, id).Scan(&res) + // 2、获取是施工人员 + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +//func (s *sBusConstructionUser) Add(ctx context.Context, req *system.BusConstructionUserAddReq) (err error) { +// err = g.Try(ctx, func(ctx context.Context) { +// _, err := dao.BusConstructionUser.Ctx(ctx).InsertAndGetId(do.BusConstructionUser{ +// Openid: req.Openid, +// NickName: req.NickName, +// HeadIcon: req.HeadIcon, +// PacePhoto: req.PacePhoto, +// UserName: req.UserName, +// ProjectId: req.ProjectId, +// Status: req.Status, +// IsPinch: req.IsPinch, +// IfManagement: req.IfManagement, +// CreateBy: req.CreateBy, +// UpdateBy: req.UpdateBy, +// Phone: req.Phone, +// Sex: req.Sex, +// SfzNation: req.SfzNation, +// SfzNumber: req.SfzNumber, +// SfzStart: req.SfzStart, +// SfzEnd: req.SfzEnd, +// SfzSite: req.SfzSite, +// NativePlace: req.NativePlace, +// YhkNumber: req.YhkNumber, +// YhkOpeningBank: req.YhkOpeningBank, +// YhkCardholder: req.YhkCardholder, +// ProjectRecord: req.ProjectRecord, +// }) +// liberr.ErrIsNil(ctx, err, "添加失败") +// }) +// return +//} + +func (s *sBusConstructionUser) Edit(ctx context.Context, req *system.BusConstructionUserEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + var ( + _ sql.Result + err error + ) + if req.Status == "1" { // 如需离职,需要去查看当前用户是否已经离场了,如果没有,就代表无法离职 + count, _ := dao.BusConstructionUser.Ctx(ctx).Where("id", req.Id).Where("(team_id is null or team_id = 0)").Count() + if count == 0 { + err = errors.New("当前人员还未退场,请先退场再操作!") + liberr.ErrIsNil(ctx, err) + return + } + } + // 身份证不为空,那么就看看是否有人使用,如果有就不允许再次录入 + if req.SfzNumber != "" { + count, _ := dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().SfzNumber, req.SfzNumber).Where("openid <> ?", req.Openid).Count() + if count > 0 { + err = errors.New("当前身份证已被其他账号绑定使用!") + liberr.ErrIsNil(ctx, err) + return + } + } + if req.Phone != "" { + count, _ := dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().Phone, req.Phone).Where("openid <> ?", req.Openid).Count() + if count > 0 { + err = errors.New("当前手机号已被其他账号绑定使用!") + liberr.ErrIsNil(ctx, err) + return + } + } + // 1、修改 原数据 + user := do.BusConstructionUser{ + NickName: req.NickName, + //TeamId: req.TeamId, + UserName: req.UserName, + ProjectId: req.ProjectId, + Status: req.Status, + IsPinch: req.IsPinch, + IfManagement: req.IfManagement, + Phone: req.Phone, + Sex: req.Sex, + SfzNation: req.SfzNation, + SfzNumber: req.SfzNumber, + SfzStart: req.SfzStart, + SfzEnd: req.SfzEnd, + SfzSite: req.SfzSite, + NativePlace: req.NativePlace, + YhkNumber: req.YhkNumber, + YhkOpeningBank: req.YhkOpeningBank, + YhkCardholder: req.YhkCardholder, + SfzBirth: req.SfzBirth, + TypeOfWork: req.TypeOfWork, + ProjectRecord: req.ProjectRecord, + DevNum: req.DevNum, + // EntryDate: req.EntryDate, + // LeaveDate: req.LeaveDate, + } + if req.ProjectId > 0 { + user.ProjectId = req.ProjectId + } + if req.Openid != "" { + user.Openid = req.Openid + } + if req.Clock != "" { + user.Clock = req.Clock + } + if req.LabourserviceId > 0 { + user.LabourserviceId = req.LabourserviceId + } + if req.PacePhoto != "" { + user.PacePhoto = strings.Replace(req.PacePhoto, "/wxfile/", "/thispath/", 1) + // user.PacePhoto = coryCommon.FileToFunc(req.PacePhoto, 2) + } + if req.HeadIcon != "" { + user.HeadIcon = req.HeadIcon + } + _, err = dao.BusConstructionUser.Ctx(ctx).WherePri(req.Id).OmitEmpty().Update(user) + liberr.ErrIsNil(ctx, err, "修改失败") + id := req.Id + if err == nil { + // 2、修改微信用户与岗位关联 + if req.PostReq != nil && req.PostReq.PostId != 0 { + // 直接删除原本的数据再插入一条新的 + _, err = dao.BusConstructionUserPost.Ctx(ctx).Where(dao.BusConstructionUserPost.Columns().ConstructionUserId, id).Delete() + postEntity := req.PostReq + postEntity.ConstructionUserId = id + _, err = dao.BusConstructionUserPost.Ctx(ctx).Insert(postEntity) + } + // 3、施工人员对应项目 + if req.ProjectListReq != nil && len(req.ProjectListReq) > 0 { + listReq := req.ProjectListReq + req.ProjectId = listReq[0].ProjectId + var projectList []*model.BusConstructionProjectInfoRes + for _, data := range listReq { + if data.ProjectId != 0 { + // 删除 + _, err = dao.BusConstructionProject.Ctx(ctx).Where(dao.BusConstructionProject.Columns().ConstructionUserId, req.Id).Delete() + // 新增 + listReq := &model.BusConstructionProjectInfoRes{ + ConstructionUserId: req.Id, + } + projectList = append(projectList, listReq) + } + } + _, err = dao.BusConstructionProject.Ctx(ctx).Insert(projectList) + } + } + // 4、批量修改身份证等图片数据 + var wxUserFile []*wxModel.BusConstructionUserFileListRes + for _, oneData := range req.FilesListReq { + twoData := wxModel.BusConstructionUserFileListRes{ + Id: oneData.Id, + UserId: oneData.UserId, + UserImgType: oneData.UserImgType, + Path: oneData.Path, + CreatedAt: oneData.CreatedAt, + } + wxUserFile = append(wxUserFile, &twoData) + } + err = controller.CommmonUpdateFile(ctx, wxUserFile, id, req.WxOrPc, req.Openid, req.ProjectId) + liberr.ErrIsNil(ctx, err) + // 用户与角色管理 + if len(req.RoleIds) > 0 { + // 先删除再去新增数据 + _, err = g.DB().Model("sys_wechat_user_role").Ctx(ctx).Delete("user_id", req.Id) + liberr.ErrIsNil(ctx, err, "修改用户角色失败") + err = InsertRoleModuleFunc(ctx, req.RoleIds, req.Id) + liberr.ErrIsNil(ctx, err, "修改用户角色失败") + } + }) + return err + }) + return err +} + +func InsertRoleModuleFunc(ctx context.Context, roleIds []int64, insertId int64) (err error) { + var swrmi []model.SysWechatUserRoleInfoRes + for _, id := range roleIds { + res := model.SysWechatUserRoleInfoRes{ + UserId: insertId, + RoleId: id, + } + swrmi = append(swrmi, res) + } + _, err = g.DB().Model("sys_wechat_user_role").Ctx(ctx).Insert(swrmi) + return err +} + +func (s *sBusConstructionUser) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionUser.Ctx(ctx).Delete(dao.BusConstructionUser.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busConstructionUserFile/bus_construction_user_file.go b/internal/app/system/logic/busConstructionUserFile/bus_construction_user_file.go new file mode 100644 index 0000000..53ed96e --- /dev/null +++ b/internal/app/system/logic/busConstructionUserFile/bus_construction_user_file.go @@ -0,0 +1,152 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-07 10:17:41 +// 生成路径: internal/app/system/logic/bus_construction_user_file.go +// 生成人:gfast +// desc:微信用户的文件存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + logic "github.com/tiger1103/gfast/v3/internal/app/system/logic/busQuestionSave" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterBusConstructionUserFile(New()) +} + +func New() *sBusConstructionUserFile { + return &sBusConstructionUserFile{} +} + +type sBusConstructionUserFile struct{} + +func (s *sBusConstructionUserFile) List(ctx context.Context, req *system.BusConstructionUserFileSearchReq) (listRes *system.BusConstructionUserFileSearchRes, err error) { + listRes = new(system.BusConstructionUserFileSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusConstructionUserFile.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.BusConstructionUserFile.Columns().Id+" = ?", req.Id) + } + if req.UserId != "" { + m = m.Where(dao.BusConstructionUserFile.Columns().UserId+" = ?", gconv.Int64(req.UserId)) + } + if req.UserImgType != "" { + m = m.Where(dao.BusConstructionUserFile.Columns().UserImgType+" = ?", req.UserImgType) + } + if req.Path != "" { + m = m.Where(dao.BusConstructionUserFile.Columns().Path+" = ?", req.Path) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusConstructionUserFile.Columns().CreatedAt+" >=? AND "+dao.BusConstructionUserFile.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusConstructionUserFileInfoRes + err = m.Fields(system.BusConstructionUserFileSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusConstructionUserFileListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusConstructionUserFileListRes{ + Id: v.Id, + UserId: v.UserId, + UserImgType: v.UserImgType, + Path: v.Path, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusConstructionUserFile) GetById(ctx context.Context, id int64) (res *model.BusConstructionUserFileInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusConstructionUserFile.Ctx(ctx).WithAll().Where(dao.BusConstructionUserFile.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusConstructionUserFile) GetBySafetyId(ctx context.Context, req *system.BusConstructionUserFileGetSafetyFileReq) (res *system.BusConstructionUserFileGetSafetyFileRes, err error) { + res = new(system.BusConstructionUserFileGetSafetyFileRes) + err = g.Try(ctx, func(ctx context.Context) { + //施工人员表 openid 和名字 + var openidName *model.BusConstructionUserSafetyFileReq + dao.BusConstructionUser.Ctx(ctx).Fields("openid as openid,user_name as userName").Where("id = ?", req.Id).Scan(&openidName) + // 添加对openidName是否为空的判断 + if openidName == nil { + return + } + var weChatPdf *system.WeChatPdfWoReq = new(system.WeChatPdfWoReq) + weChatPdf.ProjectId = req.ProjectId + weChatPdf.Name = openidName.UserName + slienWechatPdf, err := logic.WeChatPdfWo(context.TODO(), weChatPdf) + liberr.ErrIsNil(ctx, err, "查询pdf失败") + var BusWechatFileRes *model.BusWechatFileRes + for _, k := range slienWechatPdf { + k.Openid = openidName.Openid + BusWechatFileRes = &model.BusWechatFileRes{ + Path: k.Path, + Type: k.Type, + } + } + res.List = BusWechatFileRes + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusConstructionUserFile) Add(ctx context.Context, req *system.BusConstructionUserFileAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionUserFile.Ctx(ctx).Insert(do.BusConstructionUserFile{ + UserId: req.UserId, + UserImgType: req.UserImgType, + Path: req.Path, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusConstructionUserFile) Edit(ctx context.Context, req *system.BusConstructionUserFileEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionUserFile.Ctx(ctx).WherePri(req.Id).Update(do.BusConstructionUserFile{ + UserId: req.UserId, + UserImgType: req.UserImgType, + Path: req.Path, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusConstructionUserFile) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionUserFile.Ctx(ctx).Delete(dao.BusConstructionUserFile.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busConstructionUserPost/bus_construction_user_post.go b/internal/app/system/logic/busConstructionUserPost/bus_construction_user_post.go new file mode 100644 index 0000000..4aae37a --- /dev/null +++ b/internal/app/system/logic/busConstructionUserPost/bus_construction_user_post.go @@ -0,0 +1,112 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-07 10:06:34 +// 生成路径: internal/app/system/logic/bus_construction_user_post.go +// 生成人:gfast +// desc:施工人员岗位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterBusConstructionUserPost(New()) +} + +func New() *sBusConstructionUserPost { + return &sBusConstructionUserPost{} +} + +type sBusConstructionUserPost struct{} + +func (s *sBusConstructionUserPost) List(ctx context.Context, req *system.BusConstructionUserPostSearchReq) (listRes *system.BusConstructionUserPostSearchRes, err error) { + listRes = new(system.BusConstructionUserPostSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusConstructionUserPost.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.BusConstructionUserPost.Columns().Id+" = ?", req.Id) + } + if req.ConstructionUserId != "" { + m = m.Where(dao.BusConstructionUserPost.Columns().ConstructionUserId+" = ?", gconv.Int64(req.ConstructionUserId)) + } + if req.PostId != "" { + m = m.Where(dao.BusConstructionUserPost.Columns().PostId+" = ?", gconv.Int64(req.PostId)) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusConstructionUserPostInfoRes + err = m.Fields(system.BusConstructionUserPostSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusConstructionUserPostListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusConstructionUserPostListRes{ + Id: v.Id, + ConstructionUserId: v.ConstructionUserId, + PostId: v.PostId, + } + } + }) + return +} + +func (s *sBusConstructionUserPost) GetById(ctx context.Context, id uint64) (res *model.BusConstructionUserPostInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusConstructionUserPost.Ctx(ctx).WithAll().Where(dao.BusConstructionUserPost.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusConstructionUserPost) Add(ctx context.Context, req *system.BusConstructionUserPostAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionUserPost.Ctx(ctx).Insert(do.BusConstructionUserPost{ + ConstructionUserId: req.ConstructionUserId, + PostId: req.PostId, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusConstructionUserPost) Edit(ctx context.Context, req *system.BusConstructionUserPostEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionUserPost.Ctx(ctx).WherePri(req.Id).Update(do.BusConstructionUserPost{ + ConstructionUserId: req.ConstructionUserId, + PostId: req.PostId, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusConstructionUserPost) Delete(ctx context.Context, ids []uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionUserPost.Ctx(ctx).Delete(dao.BusConstructionUserPost.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busCorporateEvents/bus_corporate_events.go b/internal/app/system/logic/busCorporateEvents/bus_corporate_events.go new file mode 100644 index 0000000..2265d57 --- /dev/null +++ b/internal/app/system/logic/busCorporateEvents/bus_corporate_events.go @@ -0,0 +1,126 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-03-20 16:49:36 +// 生成路径: internal/app/system/logic/bus_corporate_events.go +// 生成人:gfast +// desc:企业大事记 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + systemService "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterBusCorporateEvents(New()) +} + +func New() *sBusCorporateEvents { + return &sBusCorporateEvents{} +} + +type sBusCorporateEvents struct{} + +func (s *sBusCorporateEvents) List(ctx context.Context, req *system.BusCorporateEventsSearchReq) (listRes *system.BusCorporateEventsSearchRes, err error) { + listRes = new(system.BusCorporateEventsSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusCorporateEvents.Ctx(ctx).WithAll() + + if req.Headline != "" { + m = m.Where(dao.BusCorporateEvents.Columns().Headline+" = ?", req.Headline) + } + //创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.BusCorporateEvents.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusCorporateEvents.Columns().CreatedAt+" >=? AND "+dao.BusCorporateEvents.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusCorporateEventsInfoRes + err = m.Fields(system.BusCorporateEventsSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusCorporateEventsListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusCorporateEventsListRes{ + Id: v.Id, + Headline: v.Headline, + Content: v.Content, + CreatedBy: v.CreatedBy, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusCorporateEvents) GetById(ctx context.Context, id int64) (res *model.BusCorporateEventsInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusCorporateEvents.Ctx(ctx).WithAll().Where(dao.BusCorporateEvents.Columns().Id, id).Scan(&res) + //获取创建人 更新人名称 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusCorporateEventsInfoRes) + res = &infoRes + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusCorporateEvents) Add(ctx context.Context, req *system.BusCorporateEventsAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusCorporateEvents.Ctx(ctx).Insert(do.BusCorporateEvents{ + Headline: req.Headline, + Content: req.Content, + CreatedBy: systemService.Context().GetUserId(ctx), + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusCorporateEvents) Edit(ctx context.Context, req *system.BusCorporateEventsEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusCorporateEvents.Ctx(ctx).WherePri(req.Id).Update(do.BusCorporateEvents{ + Headline: req.Headline, + Content: req.Content, + UpdatedBy: systemService.Context().GetUserId(ctx), + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusCorporateEvents) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusCorporateEvents.Ctx(ctx).Delete(dao.BusCorporateEvents.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busDesignAudit/bus_design_audit.go b/internal/app/system/logic/busDesignAudit/bus_design_audit.go new file mode 100644 index 0000000..c474c02 --- /dev/null +++ b/internal/app/system/logic/busDesignAudit/bus_design_audit.go @@ -0,0 +1,346 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-04-09 15:40:16 +// 生成路径: internal/app/system/logic/bus_design_audit.go +// 生成人:gfast +// desc:设计审核(竣工、施工、可研) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + logicDocument "github.com/tiger1103/gfast/v3/internal/app/system/logic/document" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" + "os" + "strings" +) + +func init() { + service.RegisterBusDesignAudit(New()) +} + +func New() *sBusDesignAudit { + return &sBusDesignAudit{} +} + +type sBusDesignAudit struct{} + +func TableTypeFunc(num string) (tableName string) { + switch num { + case "1": + tableName = dao.DocumentCompletion.Table() + case "2": + tableName = dao.DocumentProductionDrawing.Table() + case "3": + tableName = dao.DocumentReport.Table() + default: + tableName = "" + } + return +} + +func (s *sBusDesignAudit) List(ctx context.Context, req *system.BusDesignAuditSearchReq) (listRes *system.BusDesignAuditSearchRes, err error) { + listRes = new(system.BusDesignAuditSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusDesignAudit.Ctx(ctx).WithAll() + if req.ProjectId != 0 { + m = m.Where(dao.BusDesignAudit.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.TableType != "" { + m = m.Where(dao.BusDesignAudit.Columns().TableName+" = ?", TableTypeFunc(req.TableType)) + } + if req.Status != "" && req.Status != "0" { + m = m.Where(dao.BusDesignAudit.Columns().Status+" = ?", req.Status) + } + //创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.BusDesignAudit.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusDesignAudit.Columns().CreatedAt+" >=? AND "+dao.BusDesignAudit.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.CoryAuditListRes + err = m.Fields(system.BusDesignAuditSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + //查询文件名称 与 文件路径 + type entity struct { + Name string `json:"name"` + FilenPath string `json:"filenPath"` + DeletedAt *gtime.Time `json:"deletedAt"` + } + for i, data := range res { + res[i].FileType = 1 //文件正常 + //获取文件名和路径 + var aEntity *entity + err = g.DB().Model(data.TableName).Ctx(ctx).Unscoped().WherePri(data.TableId).Scan(&aEntity) + liberr.ErrIsNil(ctx, err, "数组数据失败") + if aEntity != nil { + res[i].FileName = aEntity.Name + var path = "/" + split := strings.Split(aEntity.FilenPath, "/") + for j := range split { + if i == 5 { //5是固定的 + path = path + split[j] + } + } + res[i].FilePath = path + if aEntity.DeletedAt != nil { + res[i].FileType = 2 //文件进入回收站 + } + //判断文件类型 + rpath := coryCommon.FileToFunc(aEntity.FilenPath, 2) + info, err := os.Stat(rpath) + if err == nil { + if info.IsDir() { + res[i].Type = "2" + } else { + res[i].Type = "1" + } + } + } else { + res[i].FileType = 3 //文件已被彻底删除 + } + //获取审核人名称 + if data.Auditor != 0 { + value, _ := dao.SysUser.Ctx(ctx).WherePri(data.Auditor).Fields("user_name").Value() + res[i].AuditorName = value.String() + } + } + listRes.List = res + }) + return +} + +func (s *sBusDesignAudit) GetById(ctx context.Context, id int64) (res *model.BusDesignAuditInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusDesignAudit.Ctx(ctx).WithAll().Where(dao.BusDesignAudit.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusDesignAudit) Add(ctx context.Context, req *system.BusDesignAuditAddReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //1、将需要审核的记录插入到审核表中进行数据存储 + _, err = dao.BusDesignAudit.Ctx(ctx).Insert(do.BusDesignAudit{ + ProjectId: req.ProjectId, + TableName: req.TableName, + TableId: req.TableId, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + //2、并且将这条数据信息加入到文档记录表中进行记录 + err = AddApprovedMemo(ctx, req.TableId, req.ProjectId, req.TableName, "1") //新增记录 + liberr.ErrIsNil(ctx, err) + }) + return err + }) + return +} + +func (s *sBusDesignAudit) Edit(ctx context.Context, req *system.BusDesignAuditEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + var entity *model.BusDesignAuditInfoRes + dao.BusDesignAudit.Ctx(ctx).WherePri(req.Id).Scan(&entity) + //1、校验当前人员是否是项目经理 + user := ct.New().GetLoginUser(ctx) + count, err := dao.SysUserPost.Ctx(ctx). + Where(dao.SysUserPost.Columns().UserId, user.Id). + Where(dao.SysUserPost.Columns().PostId, "2").Count() //2 代表项目经理 + if count == 0 { + err = errors.New("抱歉,您未有操作权限!") + liberr.ErrIsNil(ctx, err) + return + } + //2、如果是项目经理那么就允许去修改当前数据(审核) + _, err = dao.BusDesignAudit.Ctx(ctx).OmitEmpty().WherePri(req.Id).Update(do.BusDesignAudit{ + Status: req.Status, + Cause: req.Cause, + Auditor: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + //3、审核完毕去修改对应文档的状态 + var ids []int64 + value, _ := g.DB().Model(entity.TableName).Ctx(ctx).WherePri(entity.TableId).Fields("id_str").Value() + if value.String() == "" { + ids = append(ids, entity.TableId) + } else { + sql := `WITH RECURSIVE cte AS ( + SELECT + id,filen_path,id_str + FROM + ` + entity.TableName + ` + WHERE + id_str = '` + value.String() + `' + UNION ALL + SELECT + u.id,u.filen_path,u.id_str + FROM + ` + entity.TableName + ` u + INNER JOIN cte ON u.pid = cte.id_str + ) + SELECT id FROM cte ORDER BY id` + var ey []*ThisDelEntity + err = g.DB().GetScan(ctx, &ey, sql) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + for i := range ey { + ids = append(ids, ey[i].Id) + } + } + if entity != nil { + _, err := g.DB().Model(entity.TableName).Ctx(ctx).Where("id in (?)", ids).Update(g.Map{"state": req.Status}) + liberr.ErrIsNil(ctx, err, "修改状态失败") + } + //4、审核完毕就需要存储当前审核的记录信息 + err = AddApprovedMemo(ctx, entity.TableId, entity.ProjectId, entity.TableName, "4") + liberr.ErrIsNil(ctx, err) + //5、如果是拒绝 + }) + return err + }) + return +} + +func (s *sBusDesignAudit) Delete(ctx context.Context, id int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //0、先查询到当前数据支持接下来的数据操作 + var entity *model.BusDesignAuditInfoRes + dao.BusDesignAudit.Ctx(ctx).WherePri(id).Scan(&entity) + if entity == nil { + return + } + //1、判断当前数据(1未读不允许删除 2拒绝删除当前数据信息并删除对应文档信息 3通过只能删除当前数据信息 ) + if entity.Status == "1" { + err = errors.New("未读状态下不允许删除数据!") + liberr.ErrIsNil(ctx, err) + } else if entity.Status == "2" { + err = DelCorrespondingData(ctx, id, entity) + liberr.ErrIsNil(ctx, err) + } else { + _, err = dao.BusDesignAudit.Ctx(ctx).WherePri(id).Delete() + liberr.ErrIsNil(ctx, err, "删除失败") + } + }) + return +} + +// AddApprovedMemo 操作文档,向文档操作记录表中追加数据信息 typeStr(1新增 2修改 3删除 4审核 5下载) +func AddApprovedMemo(ctx context.Context, tabId, projectId int64, tabName, typeStr string) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = g.DB().Model("bus_design_document_record").Ctx(ctx).Insert( + g.Map{ + "project_id": projectId, + "table_name": tabName, + "table_id": tabId, + "design_operate_type": typeStr, + "created_by": ct.New().GetLoginUser(ctx).Id, + }) + }) + return +} + +// SelectTabNameAndTabIdByDateFunc 根据表名+id获取当前文件夹的文档记录信息 +func SelectTabNameAndTabIdByDateFunc(ctx context.Context, data *model.SelectTabNameAndTabIdByDateReq) (entity []*model.SelectTabNameAndTabIdByDateRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + var ids []int64 + ids = append(ids, data.TableId) + if data.FatherId != 0 { + ids = append(ids, data.FatherId) + } + err = g.DB().Model("bus_design_document_record").Ctx(ctx). + Where("table_name", data.TableName). + Where("table_id in (?)", ids).Order("id desc").Scan(&entity) + liberr.ErrIsNil(ctx, err, "获取文件/文件夹记录失败") + }) + return +} + +type ThisDelEntity struct { + Id int64 `p:"id" dc:"主键ID"` + FilenPath string `p:"filenPath" dc:"文件路径"` +} + +// DelCorrespondingData 根据id删除当前审核数据与审核对应的文档数据 +func DelCorrespondingData(ctx context.Context, id int64, entity *model.BusDesignAuditInfoRes) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ectx context.Context) { + //删除审核记录 + _, err = dao.BusDesignAudit.Ctx(ctx).WherePri(id).Delete() + liberr.ErrIsNil(ctx, err) + //获取id_str用来作为递归查询参数 + value, err := g.DB().Model(entity.TableName).Ctx(ctx).WherePri(entity.TableId).Fields("id_str").Value() + liberr.ErrIsNil(ctx, err) + //获取需要删除的文档信息 + + var ey []*ThisDelEntity + sql := `WITH RECURSIVE cte AS ( + SELECT + id,filen_path,id_str + FROM + ` + entity.TableName + ` + WHERE + id_str = '` + value.String() + `' + UNION ALL + SELECT + u.id,u.filen_path,u.id_str + FROM + ` + entity.TableName + ` u + INNER JOIN cte ON u.pid = cte.id_str + ) + SELECT id FROM cte ORDER BY id` + err = g.DB().GetScan(ctx, &ey, sql) + liberr.ErrIsNil(ctx, err) + //删除第一个数据的路径(第一个就会删除所有文件夹的数据) + if len(ey) > 0 { + var idArrDlr []int64 + for _, data := range ey { + os.RemoveAll(coryCommon.FileToFunc(data.FilenPath, 2)) + idList := logicDocument.RecursiveDeletion(ctx, data.Id) + if idList != nil { + idArrDlr = append(idArrDlr, idList...) + } + idArrDlr = append(idArrDlr, data.Id) + } + //直接物理删除数据 + _, err = dao.Document.Ctx(ctx).Unscoped().Delete(dao.Document.Columns().Id+" in (?)", idArrDlr) + liberr.ErrIsNil(ctx, err, "删除失败") + } + }) + return err + }) + return +} diff --git a/internal/app/system/logic/busDesignDocument/bus_design_document.go b/internal/app/system/logic/busDesignDocument/bus_design_document.go new file mode 100644 index 0000000..141e0be --- /dev/null +++ b/internal/app/system/logic/busDesignDocument/bus_design_document.go @@ -0,0 +1,149 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-07-29 16:31:29 +// 生成路径: internal/app/system/logic/bus_design_document.go +// 生成人:gfast +// desc:设计管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/libUtils" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterBusDesignDocument(New()) +} + +func New() *sBusDesignDocument { + return &sBusDesignDocument{} +} + +type sBusDesignDocument struct{} + +func (s *sBusDesignDocument) List(ctx context.Context, req *system.BusDesignDocumentSearchReq) (listRes *system.BusDesignDocumentSearchRes, err error) { + listRes = new(system.BusDesignDocumentSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusDesignDocument.Ctx(ctx).WithAll() + if req.DocumenName != "" { + m = m.Where(dao.BusDesignDocument.Columns().DocumenName+" like ?", "%"+req.DocumenName+"%") + } + //创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.BusDesignDocument.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusDesignDocument.Columns().CreatedAt+" >=? AND "+dao.BusDesignDocument.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusDesignDocumentInfoRes + err = m.Fields(system.BusDesignDocumentSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusDesignDocumentListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusDesignDocumentListRes{ + Id: v.Id, + DocumenName: v.DocumenName, + Remark: v.Remark, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusDesignDocument) GetById(ctx context.Context, id int64) (res *model.BusDesignDocumentInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusDesignDocument.Ctx(ctx).WithAll().Where(dao.BusDesignDocument.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusDesignDocumentInfoRes) + res = &infoRes + }) + return +} + +func (s *sBusDesignDocument) Add(ctx context.Context, req *system.BusDesignDocumentAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + name := ct.New().GetLoginUser(ctx).Id + for _, obj := range req.FileUrl { + obj.Url, err = libUtils.GetFilesPath(ctx, obj.Url) + liberr.ErrIsNil(ctx, err) + } + if len(req.FileUrl) > 0 { + file := req.FileUrl[0] + _, err = dao.BusDesignDocument.Ctx(ctx).Insert(do.BusDesignDocument{ + DocumenName: file.Name, + DocumentUrl: file.Url, + FileId: req.FileId, + ProjectId: req.ProjectId, + CreateBy: name, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + return + } + liberr.ErrIsNil(ctx, err, coryCommon.ImportFile) + }) + return +} + +func (s *sBusDesignDocument) Edit(ctx context.Context, req *system.BusDesignDocumentEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + name := ct.New().GetLoginUser(ctx).Id + for _, obj := range req.FileUrl { + obj.Url, err = libUtils.GetFilesPath(ctx, obj.Url) + liberr.ErrIsNil(ctx, err) + } + if len(req.FileUrl) > 0 { + file := req.FileUrl[0] + _, err = dao.BusDesignDocument.Ctx(ctx).WherePri(req.Id).Update(do.BusDesignDocument{ + DocumenName: file.Name, + DocumentUrl: file.Url, + FileId: req.FileId, + ProjectId: req.ProjectId, + UpdateBy: name, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + return + } + liberr.ErrIsNil(ctx, err, coryCommon.ImportFile) + }) + return +} + +func (s *sBusDesignDocument) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusDesignDocument.Ctx(ctx).Delete(dao.BusDesignDocument.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busDesignPeriodRange/bus_design_period_range.go b/internal/app/system/logic/busDesignPeriodRange/bus_design_period_range.go new file mode 100644 index 0000000..8cbb3de --- /dev/null +++ b/internal/app/system/logic/busDesignPeriodRange/bus_design_period_range.go @@ -0,0 +1,164 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-04-11 17:28:54 +// 生成路径: internal/app/system/logic/bus_design_period_range.go +// 生成人:gfast +// desc:设计-周期范围 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "strconv" +) + +func init() { + service.RegisterBusDesignPeriodRange(New()) +} + +func New() *sBusDesignPeriodRange { + return &sBusDesignPeriodRange{} +} + +type sBusDesignPeriodRange struct{} + +func (s *sBusDesignPeriodRange) List(ctx context.Context, req *system.BusDesignPeriodRangeSearchReq) (listRes *system.BusDesignPeriodRangeSearchRes, err error) { + listRes = new(system.BusDesignPeriodRangeSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusDesignPeriodRange.Ctx(ctx).WithAll() + if req.ProjectId != "" { + m = m.Where(dao.BusDesignPeriodRange.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + if req.TableType != "" { + m = m.Where(dao.BusDesignPeriodRange.Columns().TableType+" = ?", req.TableType) + } + if req.FileName != "" { + m = m.Where(dao.BusDesignPeriodRange.Columns().FileName+" like ?", "%"+req.FileName+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusDesignPeriodRange.Columns().CreatedAt+" >=? AND "+dao.BusDesignPeriodRange.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusDesignPeriodRangeInfoRes + err = m.Fields(system.BusDesignPeriodRangeSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusDesignPeriodRangeListRes, len(res)) + for k, v := range res { + //1、根据项目ID判断某表下是否有一个叫【/**/**.docx】的文件或文件夹 + tableName := "" + if v.TableType == "1" { + tableName = dao.DocumentCompletion.Table() + } else if v.TableType == "2" { + tableName = dao.DocumentProductionDrawing.Table() + } else { + tableName = dao.DocumentReport.Table() + } + value, err := g.DB().Model(tableName).Ctx(ctx). + Where("project_id", v.ProjectId). + Where("filen_path like ?", "%"+strconv.FormatInt(v.ProjectId, 10)+v.FilePath).Fields("create_by").Value() + var cBy = value.String() + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + //2、如果有这个文件夹就获取创建人并变更状态,反之不动 + var isNum = "1" + if cBy != "" { + isNum = "2" + } + if isNum != v.IsEntering { + dao.BusDesignPeriodRange.Ctx(ctx).WherePri(v.Id).Update(g.Map{"create_by": cBy, "is_entering": isNum}) + } + //3、返回的数据信息 + listRes.List[k] = &model.BusDesignPeriodRangeListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + TableType: v.TableType, + FileName: v.FileName, + FilePath: v.FilePath, + IsEntering: isNum, + StartTime: v.StartTime, + EndTime: v.EndTime, + CreateBy: coryCommon.SelectByString(ctx, coryCommon.IsNumeric(v.CreateBy), v.CreateBy), + UpdateBy: coryCommon.SelectByString(ctx, coryCommon.IsNumeric(v.UpdateBy), v.UpdateBy), + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusDesignPeriodRange) GetById(ctx context.Context, id int64) (res *model.BusDesignPeriodRangeInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusDesignPeriodRange.Ctx(ctx).WithAll().Where(dao.BusDesignPeriodRange.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusDesignPeriodRange) Add(ctx context.Context, req *system.BusDesignPeriodRangeAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusDesignPeriodRange.Ctx(ctx).Insert(do.BusDesignPeriodRange{ + ProjectId: req.ProjectId, + TableType: req.TableType, + FileName: req.FileName, + FilePath: req.FilePath, + StartTime: req.StartTime, + EndTime: req.EndTime, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusDesignPeriodRange) Edit(ctx context.Context, req *system.BusDesignPeriodRangeEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusDesignPeriodRange.Ctx(ctx).WherePri(req.Id).Update(do.BusDesignPeriodRange{ + ProjectId: req.ProjectId, + TableType: req.TableType, + FileName: req.FileName, + FilePath: req.FilePath, + IsEntering: req.IsEntering, + StartTime: req.StartTime, + EndTime: req.EndTime, + CreateBy: req.CreateBy, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusDesignPeriodRange) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusDesignPeriodRange.Ctx(ctx).Delete(dao.BusDesignPeriodRange.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busEngineeringQuality/bus_engineering_quality.go b/internal/app/system/logic/busEngineeringQuality/bus_engineering_quality.go new file mode 100644 index 0000000..6fb8814 --- /dev/null +++ b/internal/app/system/logic/busEngineeringQuality/bus_engineering_quality.go @@ -0,0 +1,176 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-07-29 09:31:22 +// 生成路径: internal/app/system/logic/bus_engineering_quality.go +// 生成人:gfast +// desc:工程质量列 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/libUtils" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterBusEngineeringQuality(New()) +} + +func New() *sBusEngineeringQuality { + return &sBusEngineeringQuality{} +} + +type sBusEngineeringQuality struct{} + +// BusEngineeringQualityUploading 文件上传 单文件 +func (s *sBusEngineeringQuality) BusEngineeringQualityUploading(ctx context.Context, req *system.BusEngineeringQualityUploadingReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + name := ct.New().GetLoginUser(ctx).Id + for _, obj := range req.FileUrl { + obj.Url, err = libUtils.GetFilesPath(ctx, obj.Url) + liberr.ErrIsNil(ctx, err) + } + _, err = dao.BusEngineeringQuality.Ctx(ctx).WherePri(req.Id).Update(do.BusEngineeringQuality{ + FileUrl: req.FileUrl, + UpdateBy: name, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusEngineeringQuality) List(ctx context.Context, req *system.BusEngineeringQualitySearchReq) (listRes *system.BusEngineeringQualitySearchRes, err error) { + listRes = new(system.BusEngineeringQualitySearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusEngineeringQuality.Ctx(ctx).WithAll() + if req.UnitName1 != "" { + m = m.Where(dao.BusEngineeringQuality.Columns().UnitName1+" = ?", req.UnitName1) + } + if req.UnitName2 != "" { + m = m.Where(dao.BusEngineeringQuality.Columns().UnitName2+" = ?", req.UnitName2) + } + if req.UnitName3 != "" { + m = m.Where(dao.BusEngineeringQuality.Columns().UnitName3+" = ?", req.UnitName3) + } + if req.UnitName4 != "" { + m = m.Where(dao.BusEngineeringQuality.Columns().UnitName4+" = ?", req.UnitName4) + } + if req.UnitName5 != "" { + m = m.Where(dao.BusEngineeringQuality.Columns().UnitName5+" = ?", req.UnitName5) + } + if req.UnitName6 != "" { + m = m.Where(dao.BusEngineeringQuality.Columns().UnitName6+" = ?", req.UnitName6) + } + if req.QualityName != "" { + m = m.Where(dao.BusEngineeringQuality.Columns().QualityName+" like ?", "%"+req.QualityName+"%") + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusEngineeringQualityInfoRes + err = m.Fields(system.BusEngineeringQualitySearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusEngineeringQualityListRes, len(res)) + for k, v := range res { + //fileUrl := ([]*comModel.UpFile)(nil) + //err = gjson.DecodeTo(v.FileUrl, &fileUrl) + //liberr.ErrIsNil(ctx, err) + listRes.List[k] = &model.BusEngineeringQualityListRes{ + Id: v.Id, + UnitName1: v.UnitName1, + UnitName2: v.UnitName2, + UnitName3: v.UnitName3, + UnitName4: v.UnitName4, + UnitName5: v.UnitName5, + UnitName6: v.UnitName6, + QualityName: v.QualityName, + Status: v.Status, + CreateBy: v.CreateBy, + CreateTime: v.CreateTime, + UpdateTime: v.UpdateTime, + } + } + }) + return +} + +func (s *sBusEngineeringQuality) GetById(ctx context.Context, id uint64) (res *model.BusEngineeringQualityInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusEngineeringQuality.Ctx(ctx).WithAll().Where(dao.BusEngineeringQuality.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusEngineeringQualityInfoRes) + res = &infoRes + }) + return +} + +func (s *sBusEngineeringQuality) Add(ctx context.Context, req *system.BusEngineeringQualityAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + name := ct.New().GetLoginUser(ctx).Id + _, err = dao.BusEngineeringQuality.Ctx(ctx).Insert(do.BusEngineeringQuality{ + UnitName1: req.UnitName1, + UnitName2: req.UnitName2, + UnitName3: req.UnitName3, + UnitName4: req.UnitName4, + UnitName5: req.UnitName5, + UnitName6: req.UnitName6, + QualityName: req.QualityName, + ProjectId: req.ProjectId, + CreateBy: name, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusEngineeringQuality) Edit(ctx context.Context, req *system.BusEngineeringQualityEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + name := ct.New().GetLoginUser(ctx).Id + _, err = dao.BusEngineeringQuality.Ctx(ctx).WherePri(req.Id).Update(do.BusEngineeringQuality{ + UnitName1: req.UnitName1, + UnitName2: req.UnitName2, + UnitName3: req.UnitName3, + UnitName4: req.UnitName4, + UnitName5: req.UnitName5, + UnitName6: req.UnitName6, + QualityName: req.QualityName, + Status: req.Status, + UpdateBy: name, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusEngineeringQuality) Delete(ctx context.Context, ids []uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusEngineeringQuality.Ctx(ctx).Delete(dao.BusEngineeringQuality.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busEquipmentEquipmentUnpacking/bus_equipment_equipment_unpacking.go b/internal/app/system/logic/busEquipmentEquipmentUnpacking/bus_equipment_equipment_unpacking.go new file mode 100644 index 0000000..7d1d33e --- /dev/null +++ b/internal/app/system/logic/busEquipmentEquipmentUnpacking/bus_equipment_equipment_unpacking.go @@ -0,0 +1,146 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-07-29 11:14:45 +// 生成路径: internal/app/system/logic/bus_equipment_equipment_unpacking.go +// 生成人:gfast +// desc:开箱记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterBusEquipmentEquipmentUnpacking(New()) +} + +func New() *sBusEquipmentEquipmentUnpacking { + return &sBusEquipmentEquipmentUnpacking{} +} + +type sBusEquipmentEquipmentUnpacking struct{} + +func (s *sBusEquipmentEquipmentUnpacking) List(ctx context.Context, req *system.BusEquipmentEquipmentUnpackingSearchReq) (listRes *system.BusEquipmentEquipmentUnpackingSearchRes, err error) { + listRes = new(system.BusEquipmentEquipmentUnpackingSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusEquipmentEquipmentUnpacking.Ctx(ctx).WithAll() + if req.UnpackingName != "" { + m = m.Where(dao.BusEquipmentEquipmentUnpacking.Columns().UnpackingName+" like ?", "%"+req.UnpackingName+"%") + } + if req.Status != "" { + m = m.Where(dao.BusEquipmentEquipmentUnpacking.Columns().Status+" = ?", req.Status) + } + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.BusEquipmentEquipmentUnpacking.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusEquipmentEquipmentUnpacking.Columns().CreatedAt+" >=? AND "+dao.BusEquipmentEquipmentUnpacking.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "unpacking_id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusEquipmentEquipmentUnpackingInfoRes + err = m.Fields(system.BusEquipmentEquipmentUnpackingSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusEquipmentEquipmentUnpackingListRes, len(res)) + for k, v := range res { + //unpackingUrl := ([]*comModel.UpFile)(nil) + //err = gjson.DecodeTo(v.UnpackingUrl, &unpackingUrl) + //liberr.ErrIsNil(ctx, err) + listRes.List[k] = &model.BusEquipmentEquipmentUnpackingListRes{ + UnpackingId: v.UnpackingId, + EquipmentMaterialsId: v.EquipmentMaterialsId, + UnpackingName: v.UnpackingName, + UnpackingUrl: v.UnpackingUrl, + ProjectId: v.ProjectId, + Status: v.Status, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusEquipmentEquipmentUnpacking) GetByUnpackingId(ctx context.Context, unpackingId int64) (res *model.BusEquipmentEquipmentUnpackingInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusEquipmentEquipmentUnpacking.Ctx(ctx).WithAll().Where(dao.BusEquipmentEquipmentUnpacking.Columns().UnpackingId, unpackingId).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusEquipmentEquipmentUnpackingInfoRes) + res = &infoRes + }) + return +} + +func (s *sBusEquipmentEquipmentUnpacking) Add(ctx context.Context, req *system.BusEquipmentEquipmentUnpackingAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //for _, obj := range req.UnpackingUrl { + // obj.Url, err = libUtils.GetFilesPath(ctx, obj.Url) + // liberr.ErrIsNil(ctx, err) + //} + _, err = dao.BusEquipmentEquipmentUnpacking.Ctx(ctx).Insert(do.BusEquipmentEquipmentUnpacking{ + EquipmentMaterialsId: req.EquipmentMaterialsId, + UnpackingName: req.UnpackingName, + UnpackingUrl: req.UnpackingUrl[0].Url, + ProjectId: req.ProjectId, + Status: req.Status, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusEquipmentEquipmentUnpacking) Edit(ctx context.Context, req *system.BusEquipmentEquipmentUnpackingEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //for _, obj := range req.UnpackingUrl { + // obj.Url, err = libUtils.GetFilesPath(ctx, obj.Url) + // liberr.ErrIsNil(ctx, err) + //} + _, err = dao.BusEquipmentEquipmentUnpacking.Ctx(ctx).WherePri(req.UnpackingId).Update(do.BusEquipmentEquipmentUnpacking{ + EquipmentMaterialsId: req.EquipmentMaterialsId, + UnpackingName: req.UnpackingName, + UnpackingUrl: req.UnpackingUrl[0].Url, + Status: req.Status, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusEquipmentEquipmentUnpacking) Delete(ctx context.Context, unpackingIds []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusEquipmentEquipmentUnpacking.Ctx(ctx).Delete(dao.BusEquipmentEquipmentUnpacking.Columns().UnpackingId+" in (?)", unpackingIds) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busEquipmentMaterials/bus_equipment_materials.go b/internal/app/system/logic/busEquipmentMaterials/bus_equipment_materials.go new file mode 100644 index 0000000..cc91796 --- /dev/null +++ b/internal/app/system/logic/busEquipmentMaterials/bus_equipment_materials.go @@ -0,0 +1,621 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-07-29 11:14:16 +// 生成路径: internal/app/system/logic/bus_equipment_materials.go +// 生成人:gfast +// desc:材料/设备名称 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + sysUserLogic "github.com/tiger1103/gfast/v3/internal/app/system/logic/sysUser" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "strings" +) + +func init() { + service.RegisterBusEquipmentMaterials(New()) +} + +func New() *sBusEquipmentMaterials { + return &sBusEquipmentMaterials{} +} + +type sBusEquipmentMaterials struct{} + +func (s *sBusEquipmentMaterials) ConditionFunc(ctx context.Context, req *system.ConditionReq) (res *system.ConditionRes, err error) { + res = new(system.ConditionRes) + //1、获取材料列表 + var dateEntity []*model.BusEquipmentMaterialsInfoRes + sql := dao.BusEquipmentMaterials.Ctx(ctx). + As("a"). + LeftJoin("bus_equipment_materials_inventory", "b", "b.equipment_materials_id = a.equipment_materials_id AND out_put = 1"). + Where("a.project_id", req.ProjectId). + Fields("a.equipment_materials_id,a.equipment_materials_name,SUM(b.number) AS total_number"). + Group("a.equipment_materials_id,a.equipment_materials_name") + if req.IsPaging == "YES" || req.IsPaging == "yes" { + arr, err := sql.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + res.Total = len(arr) + if req.PageNum == 0 { + req.PageNum = 1 + } + res.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "a.equipment_materials_name desc,equipment_materials_id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + sql = sql.Page(req.PageNum, req.PageSize).Order(order) + } + err = sql.Scan(&dateEntity) + if dateEntity != nil { + var cl []*system.ConditionListRes + for _, de := range dateEntity { + var clTwo = new(system.ConditionListRes) + clTwo.Id = de.EquipmentMaterialsId + clTwo.Name = de.EquipmentMaterialsName + clTwo.Number = de.TotalNumber + cl = append(cl, clTwo) + } + res.List = cl + } + return +} + +//func (s *sBusEquipmentMaterials) ConditionFunc(ctx context.Context, req *system.ConditionReq) (res *system.ConditionRes, err error) { +// res = new(system.ConditionRes) +// var drOne []*system.DateListRes +// startDate, err := time.Parse("2006-01-02", req.DateRange[0]) +// if err != nil { +// fmt.Println("无法解析开始日期:", err) +// return +// } +// endDate, err := time.Parse("2006-01-02", req.DateRange[1]) +// if err != nil { +// fmt.Println("无法解析结束日期:", err) +// return +// } +// currentDate := startDate +// for currentDate.Before(endDate) || currentDate.Equal(endDate) { +// dateTime := currentDate.Format("2006-01-02") +// currentDate = currentDate.AddDate(0, 0, 1) +// var drTwo = new(system.DateListRes) +// drTwo.DateStr = dateTime +// //2、材料列表(材料列表分页) +// var dateEntity []*model.BusEquipmentMaterialsInfoRes +// sql := dao.BusEquipmentMaterials.Ctx(ctx). +// Where("project_id", req.ProjectId) +// if req.IsPaging == "YES" || req.IsPaging == "yes" { +// arr, err := sql.Array() +// liberr.ErrIsNil(ctx, err, "获取总行数失败") +// res.Total = len(arr) +// if req.PageNum == 0 { +// req.PageNum = 1 +// } +// res.CurrentPage = req.PageNum +// if req.PageSize == 0 { +// req.PageSize = consts.PageSize +// } +// order := "equipment_materials_id desc" +// if req.OrderBy != "" { +// order = req.OrderBy +// } +// sql = sql.Page(req.PageNum, req.PageSize).Order(order) +// } +// err = sql.Scan(&dateEntity) +// //3、根据材料获取到对应的出库数量 (最近7天的出库数量) +// if len(dateEntity) > 0 { +// var cl []*system.ConditionListRes +// for _, de := range dateEntity { +// //2、统计当前项目下 +// var clTwo = new(system.ConditionListRes) +// value, _ := dao.BusEquipmentMaterialsInventory.Ctx(ctx). +// Where("equipment_materials_id", de.EquipmentMaterialsId). +// Where("date_format(created_at,'%y%m%d') >= date_format(?,'%y%m%d')", dateTime). +// Where("out_put", "1"). +// Fields("sum(number)"). +// Value() +// clTwo.Id = de.EquipmentMaterialsId +// clTwo.Name = de.EquipmentMaterialsName +// clTwo.Number = value.Int() +// cl = append(cl, clTwo) +// } +// drTwo.List = cl +// } +// drOne = append(drOne, drTwo) +// } +// res.List = drOne +// return +//} + +func (s *sBusEquipmentMaterials) MaterialsFunc(ctx context.Context, req *system.MaterialsReq) (res *system.MaterialsRes, err error) { + res = new(system.MaterialsRes) + err = g.Try(ctx, func(ctx context.Context) { + var pneOne []*system.MaterialsNumberEntity + //1、获取当前用户的项目信息 (需要判断是否分页) + ids := sysUserLogic.ProjectAll(ctx) + var projectListEntity []*model.SysProjectListRes + sql := dao.SysProject.Ctx(ctx).Where("id in (" + ids + ")") + if req.IsPaging == "YES" || req.IsPaging == "yes" { + arr, err := sql.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + res.Total = len(arr) + if req.PageNum == 0 { + req.PageNum = 1 + } + res.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + sql = sql.Fields(system.SysProjectSearchRes{}).Page(req.PageNum, req.PageSize).Order(order) + } + err = sql.Scan(&projectListEntity) + //2、获取当前项目下材料的数量的统计 + for _, dataTwo := range projectListEntity { + var towOne []*system.Materials + var bm []*model.BusEquipmentMaterialsListRes + err = dao.BusEquipmentMaterials.Ctx(ctx).As("a"). + Fields("a.*,"+ + "(select sum(number) from bus_equipment_materials_inventory where equipment_materials_id = a.equipment_materials_id and out_put = '1') AS nr,"+ + "(select sum(number) from bus_equipment_materials_inventory where equipment_materials_id = a.equipment_materials_id and out_put = '2') AS rk"). + Where("a.project_id", dataTwo.Id). + Group("a.equipment_materials_id"). + Scan(&bm) + for _, dataOne := range bm { + var towTwo = new(system.Materials) + towTwo.StatusName = dataOne.EquipmentMaterialsName + towTwo.Predict = dataOne.Rk + towTwo.Practical = dataOne.Nr + towOne = append(towOne, towTwo) + } + var pneTwo = new(system.MaterialsNumberEntity) + pneTwo.ProjectId = dataTwo.Id + if dataTwo.ShortName != "" { + pneTwo.ProjectName = dataTwo.ShortName + } else { + pneTwo.ProjectName = dataTwo.ProjectName + } + pneTwo.MaterialsList = towOne + pneOne = append(pneOne, pneTwo) + } + res.List = pneOne + liberr.ErrIsNil(ctx, err, "代码错误,请联系管理员!") + }) + return +} + +func (s *sBusEquipmentMaterials) List(ctx context.Context, req *system.BusEquipmentMaterialsSearchReq) (listRes *system.BusEquipmentMaterialsSearchRes, err error) { + listRes = new(system.BusEquipmentMaterialsSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusEquipmentMaterials.Ctx(ctx).As("a").WithAll().Fields("a.*,(SELECT max(updated_at) from bus_equipment_materials_inventory where deleted_at IS NULL And equipment_materials_id = a.equipment_materials_id) AS timeOfEntryAndExit ") + if req.ProjectId != "" { + m = m.Where("a."+dao.BusEquipmentMaterials.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.EquipmentMaterialsName != "" { + m = m.Where("a."+dao.BusEquipmentMaterials.Columns().EquipmentMaterialsName+" like ?", "%"+req.EquipmentMaterialsName+"%") + } + if req.CompanyId != "" { + m = m.Where("a."+dao.BusEquipmentMaterials.Columns().CompanyId+" like ?", "%"+req.CompanyId+"%") + } + array, _ := m.Array() + listRes.Total = len(array) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "equipment_materials_id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusEquipmentMaterialsInfoRes + err = m.Fields(system.BusEquipmentMaterialsSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusEquipmentMaterialsListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusEquipmentMaterialsListRes{ + EquipmentMaterialsId: v.EquipmentMaterialsId, + EquipmentMaterialsName: v.EquipmentMaterialsName, + CompanyId: v.CompanyId, + ProjectId: v.ProjectId, + TypeSpecificationName: v.TypeSpecificationName, + TypeSpecificationUrl: v.TypeSpecificationUrl, + CertificateConformityName: v.CertificateConformityName, + CertificateConformityUrl: v.CertificateConformityUrl, + QualityName: v.QualityName, + QualityUrl: v.QualityUrl, + InspectionReportName: v.InspectionReportName, + InspectionReportUrl: v.InspectionReportUrl, + ReexamineReportName: v.ReexamineReportName, + ReexamineReportUrl: v.ReexamineReportUrl, + UsePart: v.UsePart, + WeightId: v.WeightId, + Remark: v.Remark, + QuantityCount: v.QuantityCount, + Status: v.Status, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + TimeOfEntryAndExit: v.TimeOfEntryAndExit, + } + } + }) + return +} + +func (s *sBusEquipmentMaterials) GetByEquipmentMaterialsId(ctx context.Context, equipmentMaterialsId int64) (res *model.BusEquipmentMaterialsInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusEquipmentMaterials.Ctx(ctx).WithAll().Where(dao.BusEquipmentMaterials.Columns().EquipmentMaterialsId, equipmentMaterialsId).Scan(&res) + ////获取创建人 更新人 + //by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + //infoRes := by.(model.BusEquipmentMaterialsInfoRes) + //res = &infoRes + //liberr.ErrIsNil(ctx, err, "获取信息失败") + + }) + return +} + +func (s *sBusEquipmentMaterials) Add(ctx context.Context, req *system.BusEquipmentMaterialsAddReq) (err error) { + defer func() { + if err := recover(); err != nil { + fmt.Println("发生错误:", err) + return + } + }() + //判断设备材料名称是否重复 + if req.EquipmentMaterialsName != "" { + emvalue, _ := dao.BusEquipmentMaterials.Ctx(ctx). + Where(dao.BusEquipmentMaterials.Columns().EquipmentMaterialsName, req.EquipmentMaterialsName). + Where(dao.BusEquipmentMaterials.Columns().CompanyId, req.CompanyId). + Where(dao.BusEquipmentMaterials.Columns().ProjectId, req.ProjectId). + Where(dao.BusEquipmentMaterials.Columns().TypeSpecificationName, req.TypeSpecificationName). + Where(dao.BusEquipmentMaterials.Columns().WeightId, req.WeightId).Count() + if emvalue != 0 { + err = errors.New("设备材料名称不能重复") + return err + } + } + materials := do.BusEquipmentMaterials{ + EquipmentMaterialsName: req.EquipmentMaterialsName, + CompanyId: req.CompanyId, + ProjectId: req.ProjectId, + TypeSpecificationName: req.TypeSpecificationName, + UsePart: req.UsePart, + WeightId: req.WeightId, + Remark: req.Remark, + QuantityCount: req.QuantityCount, + //Status: req.Status, + CreateBy: ct.New().GetLoginUser(ctx).Id, + } + if len(req.CertificateConformityUrl) > 0 { + materials.CertificateConformityName = strings.Split(req.CertificateConformityUrl[0].Name, ".")[0] + materials.CertificateConformityUrl = req.CertificateConformityUrl[0].Url + } + if len(req.QualityUrl) > 0 { + materials.QualityName = strings.Split(req.QualityUrl[0].Name, ".")[0] + materials.QualityUrl = req.QualityUrl[0].Url + } + if len(req.InspectionReportUrl) > 0 { + materials.InspectionReportName = strings.Split(req.InspectionReportUrl[0].Name, ".")[0] + materials.InspectionReportUrl = req.InspectionReportUrl[0].Url + } + if len(req.ReexamineReportUrl) > 0 { + materials.ReexamineReportName = strings.Split(req.ReexamineReportUrl[0].Name, ".")[0] + materials.ReexamineReportUrl = req.ReexamineReportUrl[0].Url + } + _, err = dao.BusEquipmentMaterials.Ctx(ctx).Insert(materials) + if err != nil { + panic("添加失败") + } + return +} + +func (s *sBusEquipmentMaterials) Edit(ctx context.Context, req *system.BusEquipmentMaterialsEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //判断设备材料名称是否重复 + emCount, _ := dao.BusEquipmentMaterials.Ctx(ctx). + Where(dao.BusEquipmentMaterials.Columns().EquipmentMaterialsName, req.EquipmentMaterialsName). + Where(dao.BusEquipmentMaterials.Columns().CompanyId, req.CompanyId). + Where(dao.BusEquipmentMaterials.Columns().ProjectId, req.ProjectId). + Where(dao.BusEquipmentMaterials.Columns().TypeSpecificationName, req.TypeSpecificationName). + Where(dao.BusEquipmentMaterials.Columns().WeightId, req.WeightId). + Where(dao.BusEquipmentMaterials.Columns().EquipmentMaterialsId+"!= ?", req.EquipmentMaterialsId). //排除当前记录 + Count() + if emCount > 0 { + err = errors.New("设备材料名称不能重复") + liberr.ErrIsNil(ctx, err) + return + } + + materials := do.BusEquipmentMaterials{ + EquipmentMaterialsName: req.EquipmentMaterialsName, + CompanyId: req.CompanyId, + ProjectId: req.ProjectId, + TypeSpecificationName: req.TypeSpecificationName, + //TypeSpecificationName: strings.Split(req.TypeSpecificationUrl[0].Name, ".")[0], + //TypeSpecificationUrl: req.TypeSpecificationUrl[0].Url, + UsePart: req.UsePart, + WeightId: req.WeightId, + Remark: req.Remark, + QuantityCount: req.QuantityCount, + Status: req.Status, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + } + if len(req.CertificateConformityUrl) > 0 { + materials.CertificateConformityName = strings.Split(req.CertificateConformityUrl[0].Name, ".")[0] + materials.CertificateConformityUrl = req.CertificateConformityUrl[0].Url + } + if len(req.QualityUrl) > 0 { + materials.QualityName = strings.Split(req.QualityUrl[0].Name, ".")[0] + materials.QualityUrl = req.QualityUrl[0].Url + } + if len(req.InspectionReportUrl) > 0 { + materials.InspectionReportName = strings.Split(req.InspectionReportUrl[0].Name, ".")[0] + materials.InspectionReportUrl = req.InspectionReportUrl[0].Url + } + if len(req.ReexamineReportUrl) > 0 { + materials.ReexamineReportName = strings.Split(req.ReexamineReportUrl[0].Name, ".")[0] + materials.ReexamineReportUrl = req.ReexamineReportUrl[0].Url + } + _, err = dao.BusEquipmentMaterials.Ctx(ctx).WherePri(req.EquipmentMaterialsId).Update(materials) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusEquipmentMaterials) Delete(ctx context.Context, equipmentMaterialsIds []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusEquipmentMaterials.Ctx(ctx).Delete(dao.BusEquipmentMaterials.Columns().EquipmentMaterialsId+" in (?)", equipmentMaterialsIds) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +// APP +func (s *sBusEquipmentMaterials) AppAdd(ctx context.Context, req *system.BusEquipmentMaterialsAppAddReq) (err error) { + defer func() { + if err := recover(); err != nil { + + return + } + }() + //判断设备材料名称是否重复 + if req.EquipmentMaterialsName != "" { + emvalue, _ := dao.BusEquipmentMaterials.Ctx(ctx). + Where(dao.BusEquipmentMaterials.Columns().EquipmentMaterialsName, req.EquipmentMaterialsName). + Where(dao.BusEquipmentMaterials.Columns().CompanyId, req.CompanyId). + Where(dao.BusEquipmentMaterials.Columns().ProjectId, req.ProjectId). + Where(dao.BusEquipmentMaterials.Columns().TypeSpecificationName, req.TypeSpecificationName). + Where(dao.BusEquipmentMaterials.Columns().WeightId, req.WeightId).Count() + if emvalue != 0 { + err = errors.New("设备材料名称不能重复") + return err + } + } + materials := do.BusEquipmentMaterials{ + EquipmentMaterialsName: req.EquipmentMaterialsName, + CompanyId: req.CompanyId, + ProjectId: req.ProjectId, + TypeSpecificationName: req.TypeSpecificationName, + UsePart: req.UsePart, + WeightId: req.WeightId, + Remark: req.Remark, + QuantityCount: req.QuantityCount, + //Status: req.Status, + CreateBy: ct.New().GetLoginUser(ctx).Id, + } + if len(req.CertificateConformityUrl) > 0 { + materials.CertificateConformityName = strings.Split(req.CertificateConformityUrl[0].Name, ".")[0] + materials.CertificateConformityUrl = req.CertificateConformityUrl[0].Url + } + if len(req.QualityUrl) > 0 { + materials.QualityName = strings.Split(req.QualityUrl[0].Name, ".")[0] + materials.QualityUrl = req.QualityUrl[0].Url + } + if len(req.InspectionReportUrl) > 0 { + materials.InspectionReportName = strings.Split(req.InspectionReportUrl[0].Name, ".")[0] + materials.InspectionReportUrl = req.InspectionReportUrl[0].Url + } + if len(req.ReexamineReportUrl) > 0 { + materials.ReexamineReportName = strings.Split(req.ReexamineReportUrl[0].Name, ".")[0] + materials.ReexamineReportUrl = req.ReexamineReportUrl[0].Url + } + _, err = dao.BusEquipmentMaterials.Ctx(ctx).Insert(materials) + if err != nil { + panic("添加失败") + } + return +} + +func (s *sBusEquipmentMaterials) AppEdit(ctx context.Context, req *system.BusEquipmentMaterialsAppEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //判断设备材料名称是否重复 + emCount, _ := dao.BusEquipmentMaterials.Ctx(ctx). + Where(dao.BusEquipmentMaterials.Columns().EquipmentMaterialsName, req.EquipmentMaterialsName). + Where(dao.BusEquipmentMaterials.Columns().CompanyId, req.CompanyId). + Where(dao.BusEquipmentMaterials.Columns().ProjectId, req.ProjectId). + Where(dao.BusEquipmentMaterials.Columns().TypeSpecificationName, req.TypeSpecificationName). + Where(dao.BusEquipmentMaterials.Columns().WeightId, req.WeightId). + Where(dao.BusEquipmentMaterials.Columns().EquipmentMaterialsId+"!= ?", req.EquipmentMaterialsId). //排除当前记录 + Count() + if emCount > 0 { + err = errors.New("设备材料名称不能重复") + liberr.ErrIsNil(ctx, err) + return + } + //初始化[]*comModel.UpFile 检查len是否为空数组 + fourFile := []*comModel.UpFile{ + new(comModel.UpFile), + } + if req.CertificateConformityUrl == nil || len(req.CertificateConformityUrl) == 0 { + req.CertificateConformityUrl = fourFile + } + if req.QualityUrl == nil || len(req.QualityUrl) == 0 { + req.QualityUrl = fourFile + } + if req.InspectionReportUrl == nil || len(req.InspectionReportUrl) == 0 { + req.InspectionReportUrl = fourFile + } + if req.ReexamineReportUrl == nil || len(req.ReexamineReportUrl) == 0 { + req.ReexamineReportUrl = fourFile + } + + _, err = dao.BusEquipmentMaterials.Ctx(ctx).WherePri(req.EquipmentMaterialsId).Update(do.BusEquipmentMaterials{ + EquipmentMaterialsName: req.EquipmentMaterialsName, + CompanyId: req.CompanyId, + ProjectId: req.ProjectId, + TypeSpecificationName: req.TypeSpecificationName, + CertificateConformityName: strings.Split(req.CertificateConformityUrl[0].Name, ".")[0], + CertificateConformityUrl: req.CertificateConformityUrl[0].Url, + QualityName: strings.Split(req.QualityUrl[0].Name, ".")[0], + QualityUrl: req.QualityUrl[0].Url, + InspectionReportName: strings.Split(req.InspectionReportUrl[0].Name, ".")[0], + InspectionReportUrl: req.InspectionReportUrl[0].Url, + ReexamineReportName: strings.Split(req.ReexamineReportUrl[0].Name, ".")[0], + ReexamineReportUrl: req.ReexamineReportUrl[0].Url, + UsePart: req.UsePart, + WeightId: req.WeightId, + Remark: req.Remark, + QuantityCount: req.QuantityCount, + Status: req.Status, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusEquipmentMaterials) AppList(ctx context.Context, req *system.BusEquipmentMaterialsAppSearchReq) (listRes *system.BusEquipmentMaterialsAppSearchRes, err error) { + listRes = new(system.BusEquipmentMaterialsAppSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusEquipmentMaterials.Ctx(ctx).As("bem").WithAll(). + FieldsPrefix("bem", model.BusEquipmentMaterialsAppNameRes{}). + FieldSum("CASE WHEN bei.out_put = 2 THEN bei.number ELSE 0 END", "allInventoryNumber"). + FieldSum("CASE WHEN bei.out_put = 1 THEN bei.number ELSE 0 END", "allOutboundNumber"). + LeftJoin("bus_equipment_materials_inventory bei ON bem.equipment_materials_id = bei.equipment_materials_id") + //Fields("bem.equipment_materials_id AS 'equipmentMaterialsId',") + //Fields("a.*,(SELECT max(updated_at) from bus_equipment_materials_inventory where deleted_at IS NULL And equipment_materials_id = a.equipment_materials_id) AS timeOfEntryAndExit ") + if req.ProjectId != "" { + m = m.Where("bem."+dao.BusEquipmentMaterials.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.EquipmentMaterialsName != "" { + m = m.Where("bem."+dao.BusEquipmentMaterials.Columns().EquipmentMaterialsName+" like ?", "%"+req.EquipmentMaterialsName+"%") + } + if req.CompanyId != "" { + m = m.Where("bem."+dao.BusEquipmentMaterials.Columns().CompanyId+" like ?", "%"+req.CompanyId+"%") + } + Sces := "bem.equipment_materials_id, bem.equipment_materials_name, bem.company_id, bem.project_id, bem.weight_id, bem.type_specification_name" + array, _ := m.Group(Sces).Array() + listRes.Total = len(array) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "equipment_materials_id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusEquipmentMaterialsAppListRes + err = m.Page(req.PageNum, req.PageSize).Group(Sces).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusEquipmentMaterialsAppListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusEquipmentMaterialsAppListRes{ + EquipmentMaterialsId: v.EquipmentMaterialsId, + EquipmentMaterialsName: v.EquipmentMaterialsName, + CompanyId: v.CompanyId, + ProjectId: v.ProjectId, + TypeSpecificationName: v.TypeSpecificationName, + WeightId: v.WeightId, + QuantityCount: v.QuantityCount, + AllInventoryNumber: v.AllInventoryNumber, + AllOutboundNumber: v.AllOutboundNumber, + } + } + }) + return +} + +func (s *sBusEquipmentMaterials) AppGetById(ctx context.Context, equipmentMaterialsId int64) (res *model.BusEquipmentMaterialsAppFileInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + var reslist *model.BusEquipmentMaterialsAppInfoRes + err = dao.BusEquipmentMaterials.Ctx(ctx).As("bem").Fields("bem.*,bc.company_name").LeftJoin("bus_company bc ON bc.company_id =bem.company_id"). + Where("bem.equipment_materials_id =?", equipmentMaterialsId).Scan(&reslist) + liberr.ErrIsNil(ctx, err, "获取信息失败") + // 使用封装的函数减少代码重复 + files := map[string][]model.FourFile{ + "CertificateConformityFile": {model.FourFile{Name: reslist.CertificateConformityName, Path: reslist.CertificateConformityUrl}}, + "QualityFile": {model.FourFile{Name: reslist.QualityName, Path: reslist.QualityUrl}}, + "InspectionReportFile": {model.FourFile{Name: reslist.InspectionReportName, Path: reslist.InspectionReportUrl}}, + "ReexamineReportFile": {model.FourFile{Name: reslist.ReexamineReportName, Path: reslist.ReexamineReportUrl}}, + } + //返回自己处理过后的数据 + res = &model.BusEquipmentMaterialsAppFileInfoRes{ + EquipmentMaterialsId: reslist.EquipmentMaterialsId, + EquipmentMaterialsName: reslist.EquipmentMaterialsName, + CompanyId: reslist.CompanyId, + CompanyName: reslist.CompanyName, + ProjectId: reslist.ProjectId, + TypeSpecificationName: reslist.TypeSpecificationName, + TypeSpecificationUrl: reslist.TypeSpecificationUrl, + // 使用循环和map简化文件数据的赋值 + CertificateConformityFile: fillFiles(files["CertificateConformityFile"]), + QualityFile: fillFiles(files["QualityFile"]), + InspectionReportFile: fillFiles(files["InspectionReportFile"]), + ReexamineReportFile: fillFiles(files["ReexamineReportFile"]), + UsePart: reslist.UsePart, + WeightId: reslist.WeightId, + Remark: reslist.Remark, + QuantityCount: reslist.QuantityCount, + Status: reslist.Status, + CreateBy: reslist.CreateBy, + UpdateBy: reslist.UpdateBy, + CreatedAt: reslist.CreatedAt, + UpdatedAt: reslist.UpdatedAt, + } + + ////获取创建人 更新人 + //by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + //infoRes := by.(model.BusEquipmentMaterialsInfoRes) + //res = &infoRes + //liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +// fillFiles 检查路径是否为空,如果非空,则将FourFile切片填充为非空切片 +func fillFiles(files []model.FourFile) []model.FourFile { + if len(files) > 0 && files[0].Path != "" { + return files + } + return nil +} diff --git a/internal/app/system/logic/busEquipmentMaterialsExcel/bus_equipment_materials_excel.go b/internal/app/system/logic/busEquipmentMaterialsExcel/bus_equipment_materials_excel.go new file mode 100644 index 0000000..ce84ed6 --- /dev/null +++ b/internal/app/system/logic/busEquipmentMaterialsExcel/bus_equipment_materials_excel.go @@ -0,0 +1,173 @@ +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "math" +) + +func init() { + service.RegisterBusEquipmentMaterialsExcel(New()) +} + +func New() *sBusEquipmentMaterialsExcel { + return &sBusEquipmentMaterialsExcel{} +} + +type sBusEquipmentMaterialsExcel struct{} + +// 首页材料展示 +func (s *sBusEquipmentMaterialsExcel) Index(ctx context.Context, req *system.BusEquipmentMaterialsExcelIndexReq) (listRes *system.BusEquipmentMaterialsExcelIndexRes, err error) { + listRes = new(system.BusEquipmentMaterialsExcelIndexRes) + var res []*model.BusEquimentIndexRes + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusEquipmentMaterialsInventory.Ctx(ctx) + sql := `SELECT + equipmentMaterialsName, + weightId, + SUM(EstimatedMaterialQuantity) AS quantityCount, + SUM(OutputQuantity) AS outboundNumber, + SUM(InputQuantity) AS inventoryNumber +FROM ( + SELECT + bem.equipment_materials_name AS equipmentMaterialsName, + bem.weight_id AS weightId, + bem.quantity_count AS EstimatedMaterialQuantity, + SUM(CASE WHEN bemi.out_put = '1' THEN bemi.number ELSE 0 END) AS OutputQuantity, + SUM(CASE WHEN bemi.out_put = '2' THEN bemi.number ELSE 0 END) AS InputQuantity + FROM + bus_equipment_materials bem + JOIN + bus_equipment_materials_inventory bemi ON bem.equipment_materials_id = bemi.equipment_materials_id + JOIN + sys_project sp on bem.project_id = sp.id + WHERE + bem.project_id = ? AND bem.deleted_at IS NULL AND bemi.deleted_at IS NULL AND sp.show_hidden = 1 + GROUP BY + bem.equipment_materials_id, bem.equipment_materials_name, bem.weight_id +) AS SubQuery +GROUP BY + equipmentMaterialsName, weightId;` + m.Raw(sql, req.ProjectId).Scan(&res) + listRes.List = res + }) + + return +} + +func (s *sBusEquipmentMaterialsExcel) List(ctx context.Context, req *system.BusEquipmentMaterialsExcelSearchReq) (listRes *system.BusEquipmentMaterialsExcelSearchRes, err error) { + listRes = new(system.BusEquipmentMaterialsExcelSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + // 先去查询所有的设备ID + var ids []int + m := dao.BusEquipmentMaterials.Ctx(ctx) + if req.ProjectId != 0 { + m = m.Where(dao.BusEquipmentMaterials.Columns().ProjectId, req.ProjectId) + } + if req.EquipmentMaterialsName != "" { + m = m.Where("equipment_materials_name like ?", "%"+req.EquipmentMaterialsName+"%") + } + Allids, err := m.Fields("equipment_materials_id As id").Array() + ids = gconv.Ints(Allids) + liberr.ErrIsNil(ctx, err, "获取设备材料ID失败") + var list []*model.BusEquimentRes + // 根据id 查询材料设备表 和材料设备入库表的的对应字段 根据名字 更新时间排序 + dao.BusEquipmentMaterialsInventory.Ctx(ctx).As("bmi"). + RightJoin("bus_equipment_materials em ON em.equipment_materials_id = bmi.equipment_materials_id"). + Where("bmi.equipment_materials_id in (?) ", ids). + Fields("ROW_NUMBER() OVER (ORDER BY em.equipment_materials_name) AS 'Serial',em.type_specification_name AS 'typeSpecificationName', bmi.id AS 'id'," + + "em.equipment_materials_name AS 'EquipmentMaterialsName', em.weight_id AS 'WeightId',em.quantity_count AS 'QuantityCount',bmi.out_put AS 'OutPut',bmi.number AS 'Number', bmi.operator AS 'Operator'," + + "bmi.out_put_time AS 'OutPutTime',bmi.updated_at AS 'UpdateAt', bmi.disposition AS 'Disposition',bmi.residue AS 'Residue',bmi.recipient AS 'Recipient' ,bmi.shipper AS 'Shipper'"). + Order("em.equipment_materials_name asc,bmi.out_put_time asc ,bmi.id asc"). + Scan(&list) + liberr.ErrIsNil(ctx, err, "获取材料id失败") + //序列号 + var x int + //获取总条数 插入 出库入库结构体 + listRes.List = make([]*model.BusEquipmentMaterialsExcelListRes, len(list)) + for k, v := range list { + x++ + listRes.List[k] = &model.BusEquipmentMaterialsExcelListRes{ + Id: v.Id, + SerialNumber: x, + EquipmentMaterialsName: v.EquipmentMaterialsName, + TypeSpecificationName: v.TypeSpecificationName, + WeightId: v.WeightId, + QuantityCount: v.QuantityCount, + Inventory: &model.Inventory{}, + Outbound: &model.Outbound{}, + Residue: v.Residue, + Disposition: v.Disposition, + } + switch v.Output { + //1是出库 + case "1": + Outbound := model.Outbound{ + Number: v.Number, + Operator: v.Operator, + Recipient: v.Recipient, + Shipper: v.Shipper, + OutPutTime: v.OutputTime} + listRes.List[k].Outbound = &Outbound + //2是入库 + case "2": + Inventory := model.Inventory{ + Number: v.Number, + Operator: v.Operator, + OutPutTime: v.OutputTime} + listRes.List[k].Inventory = &Inventory + } + + } + // 参数分页 如果pagenum为0返回项目所有数据 excel导出 + if req.PageNum > 0 { + list, total, totalPages := paginate(listRes.List, req.PageNum, req.PageSize) + listRes.CurrentPage = totalPages + listRes.Total = total + listRes.List = list + } else { + listRes.Total = len(listRes.List) + } + + }) + return +} + +// 数据分页 +func paginate(listRes []*model.BusEquipmentMaterialsExcelListRes, pagenum int, pagesize int) ([]*model.BusEquipmentMaterialsExcelListRes, int, int) { + total := len(listRes) + //总页数 + totalPages := int(math.Ceil(float64(total) / float64(pagesize))) + // 检查页码是否有效 + if pagenum <= 0 || pagenum > totalPages { + pagenum = 1 // 默认第一页 + } + + start := (pagenum - 1) * pagesize + end := start + pagesize + + if start >= total { + return []*model.BusEquipmentMaterialsExcelListRes{}, 0, 0 // 当前页码超过总页数,返回空数组 + } + if end > total { + end = total + } + return listRes[start:end], total, totalPages +} + +func (s *sBusEquipmentMaterialsExcel) Edit(ctx context.Context, req *system.BusEquipmentMaterialsExcelEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusEquipmentMaterialsInventory.Ctx(ctx).WherePri(req.Id).Update(do.BusEquipmentMaterialsInventory{ + Disposition: req.Disposition, + }) + liberr.ErrIsNil(ctx, err, "修改失败!") + }) + return +} diff --git a/internal/app/system/logic/busEquipmentMaterialsInventory/bus_equipment_materials_inventory.go b/internal/app/system/logic/busEquipmentMaterialsInventory/bus_equipment_materials_inventory.go new file mode 100644 index 0000000..b6417df --- /dev/null +++ b/internal/app/system/logic/busEquipmentMaterialsInventory/bus_equipment_materials_inventory.go @@ -0,0 +1,484 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-09-13 14:21:30 +// 生成路径: internal/app/system/logic/bus_equipment_materials_inventory.go +// 生成人:gfast +// desc:设备材料入库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/database/gdb" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" + "strings" +) + +func init() { + service.RegisterBusEquipmentMaterialsInventory(New()) +} + +func New() *sBusEquipmentMaterialsInventory { + return &sBusEquipmentMaterialsInventory{} +} + +type sBusEquipmentMaterialsInventory struct{} + +func (s *sBusEquipmentMaterialsInventory) List(ctx context.Context, req *system.BusEquipmentMaterialsInventorySearchReq) (listRes *system.BusEquipmentMaterialsInventorySearchRes, err error) { + listRes = new(system.BusEquipmentMaterialsInventorySearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusEquipmentMaterialsInventory.Ctx(ctx).WithAll() + if req.EquipmentMaterialsId != "" { + m = m.Where("equipment_materials_id", req.EquipmentMaterialsId) + } + // 创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.BusEquipmentMaterialsInventory.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusEquipmentMaterialsInventory.Columns().CreatedAt+" >=? AND "+dao.BusEquipmentMaterialsInventory.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusEquipmentMaterialsInventoryInfoRes + err = m.Fields(system.BusEquipmentMaterialsInventorySearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusEquipmentMaterialsInventoryListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusEquipmentMaterialsInventoryListRes{ + Id: v.Id, + OutPut: v.OutPut, + Number: v.Number, + Residue: v.Residue, + Operator: v.Operator, + Remark: v.Remark, + OutPutTime: v.OutPutTime, + CreatedAt: v.CreatedAt, + Recipient: v.Recipient, + Shipper: v.Shipper, + Path: v.Path, + } + } + }) + return +} + +func (s *sBusEquipmentMaterialsInventory) GetById(ctx context.Context, id int64) (res *model.BusEquipmentMaterialsInventoryInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusEquipmentMaterialsInventory.Ctx(ctx).WithAll().Where(dao.BusEquipmentMaterialsInventory.Columns().Id, id).Scan(&res) + // 获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusEquipmentMaterialsInventoryInfoRes) + res = &infoRes + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusEquipmentMaterialsInventory) Add(ctx context.Context, req *system.BusEquipmentMaterialsInventoryAddReq) (err error) { + var be *model.BusEquipmentMaterialsInventoryInfoRes + dao.BusEquipmentMaterialsInventory.Ctx(ctx). + Where("equipment_materials_id", req.EquipmentMaterialsId). + OrderDesc("id"). + Limit(1). + Scan(&be) + // 如果上一次的数量不够(不够现在减)或者没有数量,那么就新增失败! + if req.OutPut == "1" { + if be == nil { + err = errors.New("还未入库!") + return + } + if be.Residue < req.Number { + err = errors.New("剩余库存不足!") + return + } + } + //入库量超过设计量 提示 入库量超过设计量 新加入库量 + 旧入库 大于 设计量 提示入库量超过设计量 超过设计量 入库失败 + if req.OutPut == "2" { + var Num model.BemiInputLinkBemQCRes + dao.BusEquipmentMaterials.Ctx(ctx).As("bem").Fields("bem.quantity_count AS quantityCount,SUM( CASE WHEN bemi.out_put = '2' THEN bemi.number ELSE 0 END ) AS inputNumber "). + InnerJoin("bus_equipment_materials_inventory bemi ON bem.equipment_materials_id = bemi.equipment_materials_id "). + Where("bemi.equipment_materials_id = ?", req.EquipmentMaterialsId). + Group("bem.equipment_materials_id,bem.weight_id,bem.type_specification_name").Scan(&Num) + if Num.QuantityCount == "" { + dao.BusEquipmentMaterials.Ctx(ctx).Fields("quantity_count").Where("equipment_materials_id = ?", req.EquipmentMaterialsId).Scan(&Num) + } + inputNumber := Num.InputNumber + req.Number + if inputNumber > gconv.Int(Num.QuantityCount) { + err = errors.New("入库量超过预计用量") + return + } + } + // 获取上一次的数据,将上次剩余数量与这次的出入库数量进行加减,得出最终的当前剩余库存数量 + residue := 0 + if be != nil { + if req.OutPut == "1" { + residue = be.Residue - req.Number + } else if req.OutPut == "2" { + residue = be.Residue + req.Number + } + } + if residue == 0 && req.OutPut == "2" { + residue = req.Number + } + + // 0、上传文件 + var pathStr string + for i := range req.File { + str, err := coryCommon.UploadFile(ctx, req.File[i], coryCommon.Helmet) + if err != nil { + liberr.ErrIsNil(ctx, err) + return err + } + pathStr = pathStr + coryCommon.ResourcePublicToFunc("/"+str, 0) + "," + } + if len(pathStr) > 0 { + pathStr = pathStr[0 : len(pathStr)-1] + } + // 新增数据 + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusEquipmentMaterialsInventory.Ctx(ctx).Insert(do.BusEquipmentMaterialsInventory{ + EquipmentMaterialsId: req.EquipmentMaterialsId, + OutPut: req.OutPut, + Number: req.Number, + Residue: residue, + Operator: req.Operator, + Remark: req.Remark, + OutPutTime: req.OutPutTime, + Recipient: req.Recipient, + Shipper: req.Shipper, + CreateBy: ct.New().GetLoginUser(ctx).Id, + Path: pathStr, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusEquipmentMaterialsInventory) Edit(ctx context.Context, req *system.BusEquipmentMaterialsInventoryEditReq) (err error) { + // 0、上传文件 + var pathStr string + for i := range req.File { + //str, err := coryCommon.UploadFile(ctx, req.File[i], coryCommon.Helmet) + str, err := coryCommon.UploadFileTwo(ctx, req.File[i], coryCommon.Helmet) + if err != nil { + liberr.ErrIsNil(ctx, err) + return err + } + //将路径转换/resource/public/ 为 /flie + pathStr = pathStr + coryCommon.ResourcePublicToFunc("/"+str, 0) + "," + } + if req.Path != "" { + pathStr = pathStr + req.Path + "," + } + if len(pathStr) > 0 { + pathStr = pathStr[0 : len(pathStr)-1] + } + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusEquipmentMaterialsInventory.Ctx(ctx).WherePri(req.Id).Update(do.BusEquipmentMaterialsInventory{ + Remark: req.Remark, + Recipient: req.Recipient, + Shipper: req.Shipper, + Path: pathStr, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusEquipmentMaterialsInventory) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //err = errors.New("删除暂无") + safe := dao.BusEquipmentMaterialsInventory.Ctx(ctx).Safe() + //获取需要删除数据的附件 + array, _ := safe.Where(dao.BusEquipmentMaterialsInventory.Columns().Id+" in (?)", ids).Fields("path").Array() + //删除mysql数据 + _, err = safe.Delete(dao.BusEquipmentMaterialsInventory.Columns().Id+" in (?)", ids) + //清除附件 + if err != nil { + var str []string + for i := range array { + split := strings.Split(array[i].String(), ",") + str = append(str, split...) + } + coryCommon.BatchFile(str) + } + + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +func (s *sBusEquipmentMaterialsInventory) AppAdd(ctx context.Context, req *system.BusEquipmentMaterialsInventoryAppAddReq) (err error) { + var be *model.BusEquipmentMaterialsInventoryInfoRes + dao.BusEquipmentMaterialsInventory.Ctx(ctx). + Where("equipment_materials_id", req.EquipmentMaterialsId). + OrderDesc("id"). + Limit(1). + Scan(&be) + // 如果上一次的数量不够(不够现在减)或者没有数量,那么就新增失败! + if req.OutPut == "1" { + if be == nil { + err = errors.New("还未入库!") + return + } + if be.Residue < req.Number { + err = errors.New("剩余库存不足!") + return + } + } + //入库量超过设计量 提示 入库量超过设计量 新加入库量 + 旧入库 大于 设计量 提示入库量超过设计量 超过设计量 入库失败 + if req.OutPut == "2" { + var Num model.BemiInputLinkBemQCRes + dao.BusEquipmentMaterials.Ctx(ctx).As("bem").Fields("bem.quantity_count AS quantityCount,SUM( CASE WHEN bemi.out_put = '2' THEN bemi.number ELSE 0 END ) AS inputNumber "). + InnerJoin("bus_equipment_materials_inventory bemi ON bem.equipment_materials_id = bemi.equipment_materials_id "). + Where("bemi.equipment_materials_id = ?", req.EquipmentMaterialsId). + Group("bem.equipment_materials_id,bem.weight_id,bem.type_specification_name").Scan(&Num) + if Num.QuantityCount == "" { + dao.BusEquipmentMaterials.Ctx(ctx).Fields("quantity_count").Where("equipment_materials_id = ?", req.EquipmentMaterialsId).Scan(&Num) + } + inputNumber := Num.InputNumber + req.Number + if inputNumber > gconv.Int(Num.QuantityCount) { + err = errors.New("入库量超过预计用量") + return + } + } + // 获取上一次的数据,将上次剩余数量与这次的出入库数量进行加减,得出最终的当前剩余库存数量 + residue := 0 + if be != nil { + if req.OutPut == "1" { + residue = be.Residue - req.Number + } else if req.OutPut == "2" { + residue = be.Residue + req.Number + } + } + if residue == 0 && req.OutPut == "2" { + residue = req.Number + } + // 新增数据 开启事物 + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + InventoryId, err := dao.BusEquipmentMaterialsInventory.Ctx(ctx).InsertAndGetId(do.BusEquipmentMaterialsInventory{ + EquipmentMaterialsId: req.EquipmentMaterialsId, + OutPut: req.OutPut, + Number: req.Number, + Residue: residue, + Operator: req.Operator, + Remark: req.Remark, + OutPutTime: req.OutPutTime, + Recipient: req.Recipient, + Shipper: req.Shipper, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + //添加文件信息 + if req.File != nil && err == nil { + pathStr, err := insertAppFiles(ctx, req.File, InventoryId) + liberr.ErrIsNil(ctx, err, "有错误文件") + + //添加后台文件信息 + _, err = dao.BusEquipmentMaterialsInventory.Ctx(ctx).WherePri(InventoryId).Update(do.BusEquipmentMaterialsInventory{ + Path: pathStr, + }) + liberr.ErrIsNil(ctx, err, "更新后台文件有误") + } + }) + return err + }) + return +} + +func (s *sBusEquipmentMaterialsInventory) AppEdit(ctx context.Context, req *system.BusEquipmentMaterialsInventoryAppEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + /// 文件修改 + pathStr, err := editAppFiles(ctx, req.File, req.Id) + liberr.ErrIsNil(ctx, err, "文件插入失败") + _, err = dao.BusEquipmentMaterialsInventory.Ctx(ctx).WherePri(req.Id).Update(do.BusEquipmentMaterialsInventory{ + Remark: req.Remark, + Recipient: req.Recipient, + Shipper: req.Shipper, + Path: pathStr, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + + }) + return err + }) + //删除文件 + err = deleteAppFiles(ctx, req.DelFile) + liberr.ErrIsNil(ctx, err, "清楚文件有误") + + return +} + +// AppAdd函数 +func insertAppFiles(ctx context.Context, file []model.MaterialsInventoryFileAddApp, InventoryId int64) (pathStr string, err error) { + var pathStrs []string + bulkInsert := make([]do.BusEquipmentMaterialsInventoryFile, 0, len(file)) + for _, k := range file { + //拼接文件路径 + if k.Path == "" { + continue + } + pathStrs = append(pathStrs, k.Path) + bulkInsert = append(bulkInsert, do.BusEquipmentMaterialsInventoryFile{ + MaterialsInventoryId: InventoryId, + Suffix: k.Suffix, + Name: k.Name, + Path: k.Path, + Size: k.Size, + }) + } + if len(bulkInsert) <= 0 { + return "", nil + } + //批量插入 Batch分批写入条数数量 + _, err = dao.BusEquipmentMaterialsInventoryFile.Ctx(ctx).Data(bulkInsert).Batch(10).Insert() + liberr.ErrIsNil(ctx, err, "有错误文件") + pathStr = strings.Join(pathStrs, ",") + return pathStr, err +} + +// AppEdit +func editAppFiles(ctx context.Context, file []model.MaterialsInventoryFileEditApp, InventoryId int64) (pathStr string, err error) { + //file有两种值 有id的修改值 无id的新增 + var pathStrs []string + for _, k := range file { + if k.Path != "" { + pathStrs = append(pathStrs, k.Path) + } + if k.Id != 0 { + continue + } + _, err = dao.BusEquipmentMaterialsInventoryFile.Ctx(ctx).Insert(do.BusEquipmentMaterialsInventoryFile{ + MaterialsInventoryId: InventoryId, + Name: k.Name, + Path: k.Path, + Size: k.Size, + Suffix: k.Suffix, + }) + liberr.ErrIsNil(ctx, err, "有错误文件") + pathStr = strings.Join(pathStrs, ",") + } + return pathStr, err +} + +// AppEdit 删除真实文件和数据库文件路径 +func deleteAppFiles(ctx context.Context, file []model.MaterialsInventoryFileEditApp) (err error) { + var filepath []string + var ids []int64 + for _, K := range file { + if K.Path == "" { + continue + } + filepath = append(filepath, K.Path) + ids = append(ids, K.Id) + } + _, err = dao.BusEquipmentMaterialsInventoryFile.Ctx(ctx).Delete("id in (?)", ids) + liberr.ErrIsNil(ctx, err, "无记录值") + coryCommon.BatchFile(filepath) + return err +} + +func (s *sBusEquipmentMaterialsInventory) AppList(ctx context.Context, req *system.BusEquipmentMaterialsInventoryAppSearchReq) (listRes *system.BusEquipmentMaterialsInventoryAppSearchRes, err error) { + listRes = new(system.BusEquipmentMaterialsInventoryAppSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusEquipmentMaterialsInventory.Ctx(ctx).WithAll() + if req.EquipmentMaterialsId != "" { + m = m.Where("equipment_materials_id", req.EquipmentMaterialsId) + } + // 创建时间模糊查询 + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusEquipmentMaterialsInventoryInfoRes + err = m.Fields(system.BusEquipmentMaterialsInventorySearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusEquipmentMaterialsInventoryAppListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusEquipmentMaterialsInventoryAppListRes{ + Id: v.Id, + OutPut: v.OutPut, + Number: v.Number, + Residue: v.Residue, + OutPutTime: v.OutPutTime, + Recipient: v.Recipient, + Shipper: v.Shipper, + } + } + }) + return +} + +func (s *sBusEquipmentMaterialsInventory) AppGetById(ctx context.Context, id int64) (res *model.BusEquipmentMaterialsInventoryAppInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusEquipmentMaterialsInventory.Ctx(ctx).As("bemi").Fields("bem.equipment_materials_name,bemi.*"). + RightJoin("bus_equipment_materials bem on bemi.equipment_materials_id =bem.equipment_materials_id"). + Where("bemi."+dao.BusEquipmentMaterialsInventory.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + dao.BusEquipmentMaterialsInventoryFile.Ctx(ctx).Where(dao.BusEquipmentMaterialsInventoryFile.Columns().MaterialsInventoryId, id).Scan(&res.File) + // 获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusEquipmentMaterialsInventoryAppInfoRes) + res = &infoRes + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusEquipmentMaterialsInventory) AppDelete(ctx context.Context, ids []int64) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //根据id查询出BusEquipmentMaterialsInventoryFile信息 组合成数组InventoryFile数组 + var InventoryFile []model.MaterialsInventoryFileEditApp + dao.BusEquipmentMaterialsInventoryFile.Ctx(ctx).Where("materials_inventory_id in (?)", ids).Scan(&InventoryFile) + err = deleteAppFiles(ctx, InventoryFile) //删除BusEquipmentMaterialsInventoryFile信息和删除真实路径文件 + liberr.ErrIsNil(ctx, err, "删除失败") + //删除BusEquipmentMaterialsInventory信息 + _, err = dao.BusEquipmentMaterialsInventory.Ctx(ctx).Delete("id in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return err + }) + return err +} diff --git a/internal/app/system/logic/busEquipmentMaterialsWeight/bus_equipment_materials_weight.go b/internal/app/system/logic/busEquipmentMaterialsWeight/bus_equipment_materials_weight.go new file mode 100644 index 0000000..9de58a1 --- /dev/null +++ b/internal/app/system/logic/busEquipmentMaterialsWeight/bus_equipment_materials_weight.go @@ -0,0 +1,127 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-07-28 15:27:53 +// 生成路径: internal/app/system/logic/bus_equipment_materials_weight.go +// 生成人:gfast +// desc:计量单位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterBusEquipmentMaterialsWeight(New()) +} + +func New() *sBusEquipmentMaterialsWeight { + return &sBusEquipmentMaterialsWeight{} +} + +type sBusEquipmentMaterialsWeight struct{} + +func (s *sBusEquipmentMaterialsWeight) List(ctx context.Context, req *system.BusEquipmentMaterialsWeightSearchReq) (listRes *system.BusEquipmentMaterialsWeightSearchRes, err error) { + listRes = new(system.BusEquipmentMaterialsWeightSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusEquipmentMaterialsWeight.Ctx(ctx).WithAll() + if req.Weight != "" { + m = m.Where(dao.BusEquipmentMaterialsWeight.Columns().Weight+" like ?", "%"+req.Weight+"%") + } + if req.Status != "" { + m = m.Where(dao.BusEquipmentMaterialsWeight.Columns().Status+" = ?", req.Status) + } + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.BusEquipmentMaterialsWeight.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusEquipmentMaterialsWeight.Columns().CreatedAt+" >=? AND "+dao.BusEquipmentMaterialsWeight.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "weight_id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusEquipmentMaterialsWeightInfoRes + err = m.Fields(system.BusEquipmentMaterialsWeightSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusEquipmentMaterialsWeightListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusEquipmentMaterialsWeightListRes{ + WeightId: v.WeightId, + Weight: v.Weight, + Status: v.Status, + } + } + }) + return +} + +func (s *sBusEquipmentMaterialsWeight) GetByWeightId(ctx context.Context, weightId int64) (res *model.BusEquipmentMaterialsWeightInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusEquipmentMaterialsWeight.Ctx(ctx).WithAll().Where(dao.BusEquipmentMaterialsWeight.Columns().WeightId, weightId).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusEquipmentMaterialsWeightInfoRes) + res = &infoRes + }) + return +} + +func (s *sBusEquipmentMaterialsWeight) Add(ctx context.Context, req *system.BusEquipmentMaterialsWeightAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + name := ct.New().GetLoginUser(ctx).Id + _, err = dao.BusEquipmentMaterialsWeight.Ctx(ctx).Insert(do.BusEquipmentMaterialsWeight{ + Weight: req.Weight, + Status: req.Status, + CreateBy: name, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusEquipmentMaterialsWeight) Edit(ctx context.Context, req *system.BusEquipmentMaterialsWeightEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + name := ct.New().GetLoginUser(ctx).Id + _, err = dao.BusEquipmentMaterialsWeight.Ctx(ctx).WherePri(req.WeightId).Update(do.BusEquipmentMaterialsWeight{ + Weight: req.Weight, + Status: req.Status, + UpdateBy: name, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusEquipmentMaterialsWeight) Delete(ctx context.Context, weightIds []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusEquipmentMaterialsWeight.Ctx(ctx).Delete(dao.BusEquipmentMaterialsWeight.Columns().WeightId+" in (?)", weightIds) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busEssentialInformation/bus_essential_information.go b/internal/app/system/logic/busEssentialInformation/bus_essential_information.go new file mode 100644 index 0000000..147f7c7 --- /dev/null +++ b/internal/app/system/logic/busEssentialInformation/bus_essential_information.go @@ -0,0 +1,129 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-03-20 19:38:54 +// 生成路径: internal/app/system/logic/bus_essential_information.go +// 生成人:gfast +// desc:项目基本信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterBusEssentialInformation(New()) +} + +func New() *sBusEssentialInformation { + return &sBusEssentialInformation{} +} + +type sBusEssentialInformation struct{} + +func (s *sBusEssentialInformation) List(ctx context.Context, req *system.BusEssentialInformationSearchReq) (listRes *system.BusEssentialInformationSearchRes, err error) { + listRes = new(system.BusEssentialInformationSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusEssentialInformation.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.BusEssentialInformation.Columns().Id+" = ?", req.Id) + } + if req.One != "" { + m = m.Where(dao.BusEssentialInformation.Columns().One+" = ?", req.One) + } + if req.Two != "" { + m = m.Where(dao.BusEssentialInformation.Columns().Two+" = ?", req.Two) + } + if req.Three != "" { + m = m.Where(dao.BusEssentialInformation.Columns().Three+" = ?", req.Three) + } + if req.Four != "" { + m = m.Where(dao.BusEssentialInformation.Columns().Four+" = ?", req.Four) + } + if req.Five != "" { + m = m.Where(dao.BusEssentialInformation.Columns().Five+" = ?", req.Five) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusEssentialInformationInfoRes + err = m.Fields(system.BusEssentialInformationSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusEssentialInformationListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusEssentialInformationListRes{ + Id: v.Id, + One: v.One, + Two: v.Two, + Three: v.Three, + Four: v.Four, + Five: v.Five, + } + } + }) + return +} + +func (s *sBusEssentialInformation) GetById(ctx context.Context, id int64) (res *model.BusEssentialInformationInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusEssentialInformation.Ctx(ctx).WithAll().Where(dao.BusEssentialInformation.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusEssentialInformation) Add(ctx context.Context, req *system.BusEssentialInformationAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusEssentialInformation.Ctx(ctx).Insert(do.BusEssentialInformation{ + One: req.One, + Two: req.Two, + Three: req.Three, + Four: req.Four, + Five: req.Five, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusEssentialInformation) Edit(ctx context.Context, req *system.BusEssentialInformationEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusEssentialInformation.Ctx(ctx).WherePri(req.Id).Update(do.BusEssentialInformation{ + One: req.One, + Two: req.Two, + Three: req.Three, + Four: req.Four, + Five: req.Five, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusEssentialInformation) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusEssentialInformation.Ctx(ctx).Delete(dao.BusEssentialInformation.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busFolder/bus_folder.go b/internal/app/system/logic/busFolder/bus_folder.go new file mode 100644 index 0000000..c9303e9 --- /dev/null +++ b/internal/app/system/logic/busFolder/bus_folder.go @@ -0,0 +1,197 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-09-15 17:15:59 +// 生成路径: internal/app/system/logic/bus_folder.go +// 生成人:gfast +// desc:文件夹 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterBusFolder(New()) +} + +func New() *sBusFolder { + return &sBusFolder{} +} + +type sBusFolder struct{} + +type minOrMax struct { + Min string `json:"min"` + Max string `json:"max"` +} + +func (s *sBusFolder) TreeFormListFunc(ctx context.Context, req *system.TreeFormListFuncReq) (listRes *system.TreeFormListFuncRes, err error) { + listRes = new(system.TreeFormListFuncRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusFolder.Ctx(ctx).WithAll() + //if req.Name != "" { + // m = m.Where(dao.BusFolder.Columns().Name+" like ?", "%"+req.Name+"%") + //} + if req.ProjectId != "" { + m = m.Where("(project_id = ? or folder_type = '0')", req.ProjectId) + } + //创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.BusFolder.Columns().CreatedAt+" like ?", "%"+date+"%") + } + order := "sort desc,id desc" + var res []*model.BusFolderInfoRes + err = m.Fields(system.BusFolderSearchRes{}).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusFolderListRes, len(res)) + for k, v := range res { + var qp []string + if v.FolderType == "0" { + //生成虚拟日期树形结构文件夹;获取到当前文件夹下面最小和最大的时间日期 + var mm *minOrMax + err = dao.BusFolderFile.Ctx(ctx).Where("folder_id", v.Id).Fields("min(DATE_FORMAT(created_at,'%Y-%m')) as min,max(DATE_FORMAT(created_at,'%Y-%m')) as max").Scan(&mm) + if mm != nil { + qp = tool.RangeTime(mm.Min, mm.Max) + } + } + + listRes.List[k] = &model.BusFolderListRes{ + Id: v.Id, + FolderType: v.FolderType, + Icon: v.Icon, + Name: v.Name, + Remark: v.Remark, + CreatedAt: v.CreatedAt, + QiePian: qp, + } + } + }) + return +} + +func (s *sBusFolder) List(ctx context.Context, req *system.BusFolderSearchReq) (listRes *system.BusFolderSearchRes, err error) { + listRes = new(system.BusFolderSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusFolder.Ctx(ctx).WithAll() + if req.TypeNum == 1 { + m = m.Where(dao.BusFolder.Columns().Father, 0) + } + if req.TypeNum == 2 { + m = m.Where(dao.BusFolder.Columns().Father, req.FatherId) + } + if req.Name != "" { + m = m.Where(dao.BusFolder.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.ProjectId != "" { + m = m.Where("(project_id = ? or folder_type = '0')", req.ProjectId) + } + //创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.BusFolder.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusFolder.Columns().CreatedAt+" >=? AND "+dao.BusFolder.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "sort desc,id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusFolderInfoRes + err = m.Fields(system.BusFolderSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusFolderListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusFolderListRes{ + Id: v.Id, + FolderType: v.FolderType, + Icon: v.Icon, + Name: v.Name, + Remark: v.Remark, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusFolder) GetById(ctx context.Context, id int64) (res *model.BusFolderInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusFolder.Ctx(ctx).WithAll().Where(dao.BusFolder.Columns().Id, id).Scan(&res) + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusFolderInfoRes) + res = &infoRes + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusFolder) Add(ctx context.Context, req *system.BusFolderAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusFolder.Ctx(ctx).Insert(do.BusFolder{ + Icon: req.Icon, + Name: req.Name, + Remark: req.Remark, + ProjectId: req.ProjectId, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusFolder) Edit(ctx context.Context, req *system.BusFolderEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusFolder.Ctx(ctx).WherePri(req.Id).Update(do.BusFolder{ + Icon: req.Icon, + Name: req.Name, + Remark: req.Remark, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusFolder) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + for _, id := range ids { + num, _ := dao.BusFolder.Ctx(ctx).WherePri(id).Fields("folder_type").Value() + if num.String() == "0" { + err = errors.New("系统文件不可删除!") + liberr.ErrIsNil(ctx, err) + return + } + } + _, err = dao.BusFolder.Ctx(ctx).Delete(dao.BusFolder.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busFolderFile/bus_folder_file.go b/internal/app/system/logic/busFolderFile/bus_folder_file.go new file mode 100644 index 0000000..03c298b --- /dev/null +++ b/internal/app/system/logic/busFolderFile/bus_folder_file.go @@ -0,0 +1,246 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-09-15 17:16:00 +// 生成路径: internal/app/system/logic/bus_folder_file.go +// 生成人:gfast +// desc:文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + controllerModel "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" + "strconv" +) + +func init() { + service.RegisterBusFolderFile(New()) +} + +func New() *sBusFolderFile { + return &sBusFolderFile{} +} + +type sBusFolderFile struct{} + +func (s *sBusFolderFile) List(ctx context.Context, req *system.BusFolderFileSearchReq) (listRes *system.BusFolderFileSearchRes, err error) { + listRes = new(system.BusFolderFileSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusFolderFile.Ctx(ctx).WithAll() + if req.FolderId != "" { + m = m.Where(dao.BusFolderFile.Columns().FolderId, req.FolderId) + } + if req.ProjectId != "" { + m = m.Where(dao.BusFolderFile.Columns().ProjectId, req.ProjectId) + } + if req.Name != "" { + m = m.Where(dao.BusFolderFile.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.Size != "" { + m = m.Where(dao.BusFolderFile.Columns().Size+" = ?", req.Size) + } + if req.Suffix != "" { + m = m.Where(dao.BusFolderFile.Columns().Suffix+" = ?", req.Suffix) + } + //创建时间模糊查询 年月日 + if req.CreateAt != "" { + m = m.Where(dao.BusEquipmentEquipmentUnpacking.Columns().CreatedAt+" like ?", "%"+req.CreateAt+"%") + } + //创建时间模糊查询 年月日时分秒 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.BusEquipmentEquipmentUnpacking.Columns().CreatedAt+" like ?", "%"+date+"%") + } + + if len(req.DateRange) != 0 { + m = m.Where(dao.BusFolderFile.Columns().CreatedAt+" >=? AND "+dao.BusFolderFile.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusFolderFileInfoRes + err = m.Fields(system.BusFolderFileSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusFolderFileListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusFolderFileListRes{ + Id: v.Id, + FolderId: v.FolderId, + LinkedFolderId: v.LinkedFolderId, + FileType: v.FileType, + Name: v.Name, + Size: v.Size, + Suffix: v.Suffix, + Remark: v.Remark, + Path: v.Path, + TableName: v.TableName, + TableId: v.TableId, + UserType: v.UserType, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusFolderFile) GetById(ctx context.Context, id int64) (res *model.BusFolderFileInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusFolderFile.Ctx(ctx).WithAll().Where(dao.BusFolderFile.Columns().Id, id).Scan(&res) + if res.UserType == "1" { + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusFolderFileInfoRes) + res = &infoRes + } + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusFolderFile) Add(ctx context.Context, req *system.BusFolderFileAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusFolderFile.Ctx(ctx).Insert(do.BusFolderFile{ + ProjectId: req.ProjectId, + FolderId: req.FolderId, + FileType: "2", + Name: req.Name, + Size: req.Size, + Suffix: req.Suffix, + Path: req.Path, + UserType: "1", + Remark: req.Remark, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusFolderFile) Edit(ctx context.Context, req *system.BusFolderFileEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusFolderFile.Ctx(ctx).WherePri(req.Id).Update(do.BusFolderFile{ + FolderId: req.FolderId, + FileType: req.FileType, + Name: req.Name, + Remark: req.Remark, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusFolderFile) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusFolderFile.Ctx(ctx).Delete(dao.BusFolderFile.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +/* +AllPicture 通用图库上传 +picture:图片-数组 +folderId:当前图片的文件夹是谁 +tableName:哪张表的数据?表名 +tableId:哪张表的数据?表ID +userType:pc端上传还是小程序上传(1后台管理系统 2小程序) +idOrOpenId:后台传递id 小程序传递openid +*/ +func (s *sBusFolderFile) AllPicture( + ctx context.Context, + picture []string, + folderId int64, + tableName string, + tableId int64, + userType string, + idOrOpenId string, + remark string, + projectId int64, +) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + if !(userType == "1" || userType == "2") { + err = errors.New("用户类型错误!") + return + } + flag := false + var bffr []*controllerModel.BusFolderFileListRes + for _, path := range picture { + if path != "" { + //1、如果当前表,当前id有数据,就将当前数据给删除 + var bff *model.BusFolderFileInfoRes + err = dao.BusFolderFile.Ctx(ctx).Where("table_name", tableName).Where("table_id", tableId).OrderDesc("id").Limit(1).Scan(&bff) + if err != nil && bff != nil { + dao.BusFolderFile.Ctx(ctx).Where("table_name", bff.TableName).Where("table_id", bff.TableId).Delete() + } + flag = true + //根据文件路径获取到文件的名称,大小,后缀 + name, ext, size := coryCommon.FileInfo(path) + var bffrTwo = new(controllerModel.BusFolderFileListRes) + bffrTwo.FolderId = folderId + bffrTwo.FileType = "2" //2表示图片-固定 + bffrTwo.Name = name + bffrTwo.Suffix = ext + bffrTwo.ProjectId = projectId + bffrTwo.Size = strconv.FormatInt(size, 10) + bffrTwo.Path = path + if tableName != "" { + bffrTwo.TableName = tableName + } + if tableId > 0 { + bffrTwo.TableId = tableId + } + if remark != "" { + bffrTwo.Remark = remark + } + bffrTwo.UserType = userType + bffrTwo.CreateBy = idOrOpenId + bffr = append(bffr, bffrTwo) + } + + } + if flag { + dao.BusFolderFile.Ctx(ctx).Insert(bffr) + } + liberr.ErrIsNil(ctx, err, "操作失败") + }) + return +} + +/* +AllDelete 通用图库删除上传 +tableName:哪张表的数据?表名 +tableId:哪张表的数据?表ID +*/ +func (s *sBusFolderFile) AllDelete(ctx context.Context, tableName string, tableId []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //只删除了数据库存储数据,并没有删除实际图片(原因是小程序与pc端各自存放了图片,目前没有去研究如何在一个服务器去删除另外一个服务器的资源) + _, err = dao.BusFolderFile.Ctx(ctx). + Where("table_name", tableName). + Where("table_id in (?)", tableId). + Delete() + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busHseManagement/bus_hse_management.go b/internal/app/system/logic/busHseManagement/bus_hse_management.go new file mode 100644 index 0000000..6f4ea1b --- /dev/null +++ b/internal/app/system/logic/busHseManagement/bus_hse_management.go @@ -0,0 +1,932 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-03-28 14:53:05 +// 生成路径: internal/app/system/logic/bus_hse_management.go +// 生成人:gfast +// desc:HSE-巡检工单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/util/gmeta" + "github.com/jinzhu/copier" + "path/filepath" + "sort" + "strconv" + "strings" + "time" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + systemService "github.com/tiger1103/gfast/v3/internal/app/system/service" + wxDao "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/tiger1103/gfast/v3/third/reminders" +) + +func init() { + service.RegisterBusHseManagement(New()) +} + +func New() *sBusHseManagement { + return &sBusHseManagement{} +} + +type sBusHseManagement struct{} + +func (s *sBusHseManagement) SafetyLargeScreenDetails(ctx context.Context, req *system.SafetyLargeScreenDetailsReq) (res *system.SafetyLargeScreenDetailsRes, err error) { + res = new(system.SafetyLargeScreenDetailsRes) + err = g.Try(ctx, func(ctx context.Context) { + // 1、获取主体数据 + m := dao.BusHseManagement.Ctx(ctx).As("a"). + LeftJoin(dao.SysProject.Table(), "b", "b.id = a.project_id"). + LeftJoin("sys_dict_data", "c", "c.dict_type = 'study_type' and c.dict_value = a.study_type"). + LeftJoin("sys_dict_data", "e", "e.dict_type = 'tour_type' and e.dict_value = a.tour_type"). + LeftJoin(dao.BusConstructionUser.Table(), "d", "d.openid = a.corrector"). + // LeftJoin("sys_project_team", "f", "f.id = d.team_id"). + Fields( + "a.id,b.project_name as projectName," + // 主键ID、项目名称 + "c.dict_label as studyTypeName," + // 检查类型 + "e.dict_label as tourTypeName," + // 违章类型 + "a.inspection_result," + // 巡检结果 + "a.check_time," + // 检查时间 + "a.reply_date," + // 要求整改期限 + //"f.name as teamName," + //班组 + "a.team_name as teamName," + // 班组 + "d.user_name as abarbeitung," + // 整改人 + "a.rectification_time," + // 整改时间 + "a.hidden_danger," + // 问题隐患 + "a.measure," + // 整改措施 + "a.review_time," + // 复查时间 + "a.review," + // 复查情况 + "a.status," + // 工单状态 + "a.review_type," + // 复查状态 + "a.created_at," + // 创建人(检查、复查) + "a.created_by as fill") // 创建人(检查、复查) + err = m.Where("a.id", req.Id).Scan(&res) + if err != nil { + return + } + // 2、获取附件 + var pathEntity []*model.BusHseManagementPath + err = g.DB().Model("bus_hse_management_path").Ctx(ctx).Where("ticket_id", req.Id).Scan(&pathEntity) + liberr.ErrIsNil(ctx, err, "查询失败") + // 3、分类附件 + var one []*model.BusHseManagementPath + var two []*model.BusHseManagementPath + for i := range pathEntity { + if pathEntity[i].Type == "1" { + one = append(one, pathEntity[i]) + } else { + two = append(two, pathEntity[i]) + } + } + res.CheckAttachment = one + res.AbarbeitungAttachment = two + // 3、获取 + res.Fill = coryCommon.SelectByString(ctx, coryCommon.IsNumeric(res.Fill), res.Fill) + }) + return +} + +func (s *sBusHseManagement) GisSafetyManagementListFunc(ctx context.Context, req *system.GisSafetyManagementListReq) (listRes *system.GisSafetyManagementListRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + listRes = new(system.GisSafetyManagementListRes) + var entity []*system.GisSafetyManagementListEntityRes + if req.Type == "1" { + m := g.DB().Model("sys_project_team_squad").Ctx(ctx).As("a"). + LeftJoin("sys_project_team", "b", "b.id = a.team_id"). + Fields("a.id,"+ + "b.name as studyTypeName,"+ + "'站班会' as tourTypeName,"+ + "a.created_at as createdAt"). + Where("a.project_id", req.ProjectId) + array, err := m.Array() + listRes.Total = len(array) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&entity) + liberr.ErrIsNil(ctx, err, "获取数据失败") + } else { + i, _ := strconv.ParseInt(req.Type, 10, 64) + m := dao.BusHseManagement.Ctx(ctx).As("a"). + Fields("a.id,"+ + "b.dict_label as studyTypeName,"+ + "c.dict_label as tourTypeName,"+ + "a.team_name,"+ + "a.inspection_result,"+ + "a.status,"+ + "a.review_type,"+ + "a.created_at"). + LeftJoin("sys_dict_data", "b", "b.dict_type = 'study_type' and b.dict_value = a.study_type"). + LeftJoin("sys_dict_data", "c", "c.dict_type = 'tour_type' and c.dict_value = a.tour_type"). + Where("a.project_id", req.ProjectId). + Where("a.is_reply", i-1) + values, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + listRes.Total = len(values) + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "a.created_at desc" + if req.OrderBy != "" { + order = req.OrderBy + } + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&entity) + liberr.ErrIsNil(ctx, err, "获取数据失败") + } + listRes.List = entity + }) + return +} + +func (s *sBusHseManagement) GisSafetyManagementFunc(ctx context.Context, req *system.GisSafetyManagementReq) (res *system.GisSafetyManagementRes, err error) { + res = new(system.GisSafetyManagementRes) + err = g.Try(ctx, func(ctx context.Context) { + // 1、站班会 + count, err := g.DB().Model("sys_project_team_squad").Ctx(ctx).Where("project_id", req.ProjectId).Count() + res.TeamMeeting = count + // 2、获取巡检记录(质量工单不需要回复的所有数据) + safe := dao.BusHseManagement.Ctx(ctx). + Where("project_id", req.ProjectId).Safe() + countOne, err := safe.Where("is_reply", "2").Count() + liberr.ErrIsNil(ctx, err, "巡检记录统计失败") + res.InspectionRecord = countOne + // 3、整改情况统计(百分比) + countTwo, err := safe.Where("is_reply", "1").Count() + liberr.ErrIsNil(ctx, err, "情况统计情况统计失败") + countThree, err := safe.Where("is_reply", "1"). + Where("status", "3"). + Where("review_type", "1"). + Count() + liberr.ErrIsNil(ctx, err, "获取数据失败") + if float64(countTwo) == 0 || float64(countThree) == 0 { + res.ReorganizeTheSituation = float64(countTwo) + } else { + consequence, err := coryCommon.PercentageFunc(100, float64(countTwo), float64(countThree)) + liberr.ErrIsNil(ctx, err) + res.ReorganizeTheSituation = consequence + } + }) + return +} + +func (s *sBusHseManagement) HseManagementAppletDetailsFunc(ctx context.Context, req *wxApplet.HseManagementAppletDetailsReq) (res *wxApplet.HseManagementAppletDetailsRes, err error) { + res = new(wxApplet.HseManagementAppletDetailsRes) + err = g.Try(ctx, func(ctx context.Context) { + // 1、获取主体数据 + m := dao.BusHseManagement.Ctx(ctx).As("a"). + LeftJoin(dao.SysProject.Table(), "b", "b.id = a.project_id"). + LeftJoin("sys_dict_data", "c", "c.dict_type = 'study_type' and c.dict_value = a.study_type"). + LeftJoin("sys_dict_data", "e", "e.dict_type = 'tour_type' and e.dict_value = a.tour_type"). + LeftJoin(dao.BusConstructionUser.Table(), "d", "d.openid = a.corrector"). + Fields( + "a.id,b.project_name as projectName," + // 主键ID、项目名称 + "c.dict_label as studyTypeName," + // 检查类型 + "e.dict_label as tourTypeName," + // 违章类型 + "a.inspection_result," + // 巡检结果 + "a.check_time," + // 检查时间 + "a.reply_date," + // 要求整改期限 + "a.team_name as teamName," + // 班组 + "d.user_name as abarbeitung," + // 整改人 + "a.rectification_time," + // 整改时间 + "a.hidden_danger," + // 问题隐患 + "a.measure," + // 整改措施 + "a.review_time," + // 复查时间 + "a.review," + // 复查情况 + "a.status," + // 工单状态 + "a.review_type," + // 复查状态 + "a.created_by as fill," + // 复查状态 + "a.created_at") // 创建人(检查、复查) + err = m.Where("a.id", req.Id).Scan(&res) + liberr.ErrIsNil(ctx, err, "查询失败") + // 2、获取附件 + var pathEntity []*model.BusHseManagementPath + err = g.DB().Model("bus_hse_management_path").Ctx(ctx).Where("ticket_id", req.Id).Scan(&pathEntity) + liberr.ErrIsNil(ctx, err, "查询失败") + // 3、分类附件 + var one []*model.BusHseManagementPath + var two []*model.BusHseManagementPath + for i := range pathEntity { + if pathEntity[i].Type == "1" { + one = append(one, pathEntity[i]) + } else { + two = append(two, pathEntity[i]) + } + } + res.CheckAttachment = one + res.AbarbeitungAttachment = two + // 3、获取 + res.Fill = coryCommon.SelectByString(ctx, coryCommon.IsNumeric(res.Fill), res.Fill) + }) + return +} + +func (s *sBusHseManagement) HseManagementAppletListFunc(ctx context.Context, req *wxApplet.HseManagementAppletListReq) (listRes *wxApplet.HseManagementAppletListRes, err error) { + listRes = new(wxApplet.HseManagementAppletListRes) + err = g.Try(ctx, func(ctx context.Context) { + // 1、根据名字模糊搜索到项目id + var projectIds []string + if req.ProjectName != "" { + value, err := dao.SysProject.Ctx(ctx). + Where("(project_name like ? or short_name like ?)", "%"+req.ProjectName+"%", "%"+req.ProjectName+"%"). + Fields("GROUP_CONCAT(id)").Value() + liberr.ErrIsNil(ctx, err, "模糊查询失败") + split := strings.Split(value.String(), ",") + for i := range split { + projectIds = append(projectIds, split[i]) + } + } + // 2、根据项目id+openid获取到数据 + var appletList []*model.HseManagementAppletListRes + m := dao.BusHseManagement.Ctx(ctx).As("a"). + LeftJoin(dao.SysProject.Table(), "b", "b.id = a.project_id"). + LeftJoin("sys_dict_data", "c", "c.dict_type = 'study_type' and c.dict_value = a.study_type"). + LeftJoin("sys_dict_data", "e", "e.dict_type = 'tour_type' and e.dict_value = a.tour_type"). + LeftJoin(dao.BusConstructionUser.Table(), "d", "d.openid = a.corrector"). + Fields( + "a.id,b.project_name as projectName," + // 主键ID、项目名称 + "c.dict_label as studyTypeName," + // 检查类型 + "e.dict_label as tourTypeName," + // 违章类型 + "d.user_name as userName," + // 整改人 + "a.status,a.review_type as reviewType," + // 工单状态 + "a.created_by as createdBy," + + "a.is_reply as isReply," + + "a.created_at as createdAt", // 创建人、创建时间 + ) + if req.Flag == true { + m = m.Where("date_format(a.created_at,'%Y-%m-%d') = CURDATE()") + } + if req.StudyType != "" { + m = m.Where("a.study_type", req.StudyType) + } + if req.ProjectId != 0 { + m = m.Where("a.project_id = ?", req.ProjectId) + } + if req.Status != "" && req.Status != "0" { + m = m.Where("a.status", req.Status) + } else { + m = m.Where("a.pid", "0") + } + if req.CreatedAt != "" { + m = m.Where("DATE_FORMAT(a.created_at,'%Y-%m-%d') = ?", req.CreatedAt) + } + if req.ProjectId != 0 { + m = m.Where("a.project_id = ?", req.ProjectId) + } + if req.Type == "1" { + m = m.Where("a.created_by", req.OpenId) + } + if req.Type == "2" { + m = m.Where("a.corrector", req.OpenId).Where("a.is_reply <> 2") + } + if req.Type == "3" { + m = m.Where("a.created_by = ? or a.corrector = ?", req.OpenId, req.OpenId) + } + if len(projectIds) > 0 { + m = m.Where("b.id in (?)", projectIds) + } + array, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + listRes.Total = len(array) + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "a.status asc,a.created_at desc" + if req.OrderBy != "" { + order = req.OrderBy + } + m.Page(req.PageNum, req.PageSize).Order(order).Scan(&appletList) + // 3、获取 + for i := range appletList { + //当前工单如若被拒绝,那么就查询当前工单下最新的数据信息,然后把当前数据给替换掉(主要替换id、状态) + if appletList[i].ReviewType == "2" { + type zdmp struct { + gmeta.Meta `orm:"table:bus_hse_management"` + Id int64 `orm:"id" json:"id"` + ReviewType string `orm:"review_type" json:"reviewType"` + } + var zdmpData []zdmp + mysql := dao.BusHseManagement.Ctx(ctx).As("a"). + Where("a.pid", appletList[i].Id).Safe() + if err := mysql.Fields("a.id,a.review_type").Scan(&zdmpData); err != nil { + liberr.ErrIsNil(ctx, err, "无法获取安全工单拒绝数据") + return + } else { + for i2 := range zdmpData { + if zdmpData[i2].ReviewType == "" || zdmpData[i2].ReviewType == "1" { + zdmpData[i2].ReviewType = "true" + } else { + zdmpData[i2].ReviewType = "false" + } + } + zdmpData = append(zdmpData, zdmp{ + Id: appletList[i].Id, + ReviewType: "false", + }) + sort.Slice(zdmpData, func(i, j int) bool { + return zdmpData[i].Id > zdmpData[j].Id + }) + appletList[i].RefuseList = zdmpData + } + type zd struct { + gmeta.Meta `orm:"table:bus_hse_management"` + Id int64 `orm:"id" json:"id"` + Status string `orm:"status" json:"status"` + ReviewType string `orm:"review_type" json:"reviewType"` + } + zdData := new(zd) + err := mysql. + Where("(a.review_type != '2') OR (a.review_type IS NULL)"). + Fields("a.id,a.status,a.review_type"). + Scan(&zdData) + if err == nil { + appletList[i].Id = zdData.Id + appletList[i].Status = zdData.Status + appletList[i].ReviewType = zdData.ReviewType + } else { + liberr.ErrIsNil(ctx, err, "无法获取安全工单转换数据") + return + } + } + appletList[i].CreatedBy = coryCommon.SelectByString(ctx, coryCommon.IsNumeric(appletList[i].CreatedBy), appletList[i].CreatedBy) + } + listRes.List = appletList + }) + return +} + +func (s *sBusHseManagement) HseManagementAppletVerifyFunc(ctx context.Context, req *wxApplet.HseManagementAppletVerifyReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 1、更新数据 + _, err = dao.BusHseManagement.Ctx(ctx).WherePri(req.Id).OmitEmpty().Update(do.BusHseManagement{ + Review: req.Review, + ReviewType: req.ReviewType, + Status: "3", // 整改 + UpdatedBy: req.Openid, + }) + liberr.ErrIsNil(ctx, err, "验证提交失败") + // 2、查询数据 + var aData model.BusHseManagementInfoRes + err = dao.BusHseManagement.Ctx(ctx).WherePri(req.Id).Scan(&aData) + liberr.ErrIsNil(ctx, err) + // 3、消息提醒 + value, _ := g.DB().Model("sys_dict_data").Ctx(ctx).Where("dict_type", "study_type").Where("dict_value", aData.StudyType).Fields("dict_label").Value() + message := reminders.Reminder{ + Type: reminders.Security, + Status: reminders.Recheck, + Title: value.String(), + Content: aData.InspectionResult, + ProjectID: int(aData.ProjectId), + ReceiverID: aData.Corrector, + TargetID: int(req.Id), + } + err = reminders.PublishReminder(message, false) + if err != nil { + liberr.ErrIsNil(ctx, err) + } + }) + return +} + +func (s *sBusHseManagement) HseManagementAppletAbarbeitungFunc(ctx context.Context, req *wxApplet.HseManagementAppletAbarbeitungReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 1、更新数据 + _, err = dao.BusHseManagement.Ctx(ctx).WherePri(req.Id).OmitEmpty().Update(do.BusHseManagement{ + HiddenDanger: req.HiddenDanger, + Measure: req.Measure, + Status: "2", // 整改 + RectificationTime: gtime.New(time.Now()), + UpdatedBy: req.Openid, + }) + liberr.ErrIsNil(ctx, err, "整改提交失败") + // 2、存储文件 + if len(req.File) > 0 { + err = SaveFunc(ctx, req.File, req.Id, "2") // 整改 + liberr.ErrIsNil(ctx, err) + } + // 2、查询数据 + var aData model.BusHseManagementInfoRes + err = dao.BusHseManagement.Ctx(ctx).WherePri(req.Id).Scan(&aData) + liberr.ErrIsNil(ctx, err) + // 3、消息提醒 + value, _ := g.DB().Model("sys_dict_data").Ctx(ctx).Where("dict_type", "study_type").Where("dict_value", aData.StudyType).Fields("dict_label").Value() + message := reminders.Reminder{ + Type: reminders.Security, + Status: reminders.Reform, + Title: value.String(), + Content: aData.InspectionResult, + ProjectID: int(aData.ProjectId), + ReceiverID: aData.CreatedBy, + TargetID: int(req.Id), + } + err = reminders.PublishReminder(message, false) + if err != nil { + liberr.ErrIsNil(ctx, err) + } + }) + return err + }) + return +} + +func (s *sBusHseManagement) HseManagementAppletAddFunc(ctx context.Context, req *wxApplet.HseManagementAppletAddReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + var teamName string + value, _ := dao.BusConstructionUser.Ctx(ctx).Where("openid", req.Openid).Fields("team_id").Value() + if value != nil { + v, _ := g.DB().Model("sys_project_team").Ctx(ctx).Fields("name").WherePri(value).Value() + teamName = v.String() + } + if teamName == "" { + err = errors.New("无法获取到班组") + liberr.ErrIsNil(ctx, err) + } + isStatus := "1" // 默认为通知 + if req.IsReply == "2" { + isStatus = "3" + } + ticket := do.BusHseManagement{ + ProjectId: req.ProjectId, + StudyType: req.StudyType, + TourType: req.TourType, + InspectionResult: req.InspectionResult, + TeamName: TeamIdByNameFunc(ctx, req.Corrector), + Corrector: req.Corrector, + IsReply: req.IsReply, + ReplyDate: req.ReplyDate, + Status: isStatus, + CreatedBy: req.Openid, + CheckTime: gtime.New(time.Now()), + } + // 如果回复为否,那么工单状态为验证且通过 + if isStatus == "3" { + ticket.ReviewType = "1" + } + // 1、上传文件基本信息 + info, err := dao.BusHseManagement.Ctx(ctx).OmitEmpty().Insert(ticket) + liberr.ErrIsNil(ctx, err, "添加失败") + id, _ := info.LastInsertId() + + // 2、上传并存储文件 + if len(req.File) > 0 { + err = SaveFunc(ctx, req.File, id, "1") // 巡检 + liberr.ErrIsNil(ctx, err) + } + // 3、消息提醒 + value, _ = g.DB().Model("sys_dict_data").Ctx(ctx).Where("dict_type", "study_type").Where("dict_value", req.StudyType).Fields("dict_label").Value() + message := reminders.Reminder{ + Type: reminders.Security, + Status: reminders.Remind, + Title: value.String(), + Content: req.InspectionResult, + ProjectID: int(req.ProjectId), + ReceiverID: req.Corrector, + TargetID: int(id), + } + err = reminders.PublishReminder(message, false) + if err != nil { + liberr.ErrIsNil(ctx, err) + } + }) + return err + }) + return +} + +func (s *sBusHseManagement) List(ctx context.Context, req *system.BusHseManagementSearchReq) (listRes *system.BusHseManagementSearchRes, err error) { + listRes = new(system.BusHseManagementSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + // 根据名称模糊查询到openid 检查人 + var fillOpenIds []string + if req.Fill != "" { + array, _ := dao.BusConstructionUser.Ctx(ctx). + Where(dao.BusConstructionUser.Columns().UserName+" like ?", "%"+req.Fill+"%"). + Fields(dao.BusConstructionUser.Columns().Openid).Array() + if len(array) > 0 { + for i := range array { + fillOpenIds = append(fillOpenIds, array[i].String()) + } + } + } + var abarbeitungOpenIds []string // 整改人 + if req.Abarbeitung != "" { + array1, _ := dao.BusConstructionUser.Ctx(ctx). + Where(dao.BusConstructionUser.Columns().UserName+" like ?", "%"+req.Abarbeitung+"%"). + Fields(dao.BusConstructionUser.Columns().Openid).Array() + if len(array1) > 0 { + for i := range array1 { + abarbeitungOpenIds = append(abarbeitungOpenIds, array1[i].String()) + } + } + array2, _ := dao.SysUser.Ctx(ctx). + Where(dao.SysUser.Columns().UserName+" like ?", "%"+req.Abarbeitung+"%"). + Fields(dao.SysUser.Columns().Id).Array() + if len(array2) > 0 { + for i := range array2 { + abarbeitungOpenIds = append(abarbeitungOpenIds, array2[i].String()) + } + } + } + m := dao.BusHseManagement.Ctx(ctx).As("a"). + LeftJoin(dao.SysProject.Table(), "b", "b.id = a.project_id"). + LeftJoin(dao.BusConstructionUser.Table(), "c", "c.openid = a.corrector"). + Fields( + "a.*," + + "b.project_name as projectName," + + "c.user_name as abarbeitung") + m = m.Where("a.pid", "0") + if req.ProjectId != "" { + m = m.Where("a."+dao.BusHseManagement.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + if req.StudyType != "" { + m = m.Where("a."+dao.BusHseManagement.Columns().StudyType+" = ?", req.StudyType) + } + if req.TourType != "" { + m = m.Where("a."+dao.BusHseManagement.Columns().TourType+" = ?", req.TourType) + } + if len(fillOpenIds) > 0 { // 检查人 + m = m.Where("a."+dao.BusHseManagement.Columns().CreatedBy+" in (?)", fillOpenIds) + } + if len(abarbeitungOpenIds) > 0 { // 整改人 + m = m.Where("a."+dao.BusHseManagement.Columns().CreatedBy+" in (?)", abarbeitungOpenIds) + } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.BusHseManagement.Columns().CreatedAt+" >=? AND "+"a."+dao.BusHseManagement.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + array, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + listRes.Total = len(array) + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "a.check_time desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusHseManagementInfoTwoRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + for i := range res { + //当前工单如若被拒绝,那么就查询当前工单下最新的数据信息,然后把当前数据给替换掉(主要替换id、状态) + if res[i].ReviewType == "2" { + type zdmp struct { + gmeta.Meta `orm:"table:bus_hse_management"` + Id int64 `orm:"id" json:"id"` + ReviewType string `orm:"review_type" json:"reviewType"` + } + var zdmpData []zdmp + mysql := dao.BusHseManagement.Ctx(ctx).As("a"). + Where("a.pid", res[i].Id).Safe() + if err := mysql.Fields("a.id,a.review_type").Scan(&zdmpData); err != nil { + liberr.ErrIsNil(ctx, err, "无法获取安全工单拒绝数据") + return + } else { + for i2 := range zdmpData { + if zdmpData[i2].ReviewType == "" || zdmpData[i2].ReviewType == "1" { + zdmpData[i2].ReviewType = "true" + } else { + zdmpData[i2].ReviewType = "false" + } + } + zdmpData = append(zdmpData, zdmp{ + Id: res[i].Id, + ReviewType: "false", + }) + sort.Slice(zdmpData, func(i, j int) bool { + return zdmpData[i].Id > zdmpData[j].Id + }) + res[i].RefuseList = zdmpData + } + type zd struct { + gmeta.Meta `orm:"table:bus_hse_management"` + Id int64 `orm:"id" json:"id"` + Status string `orm:"status" json:"status"` + } + zdData := new(zd) + err := mysql. + Where("(a.review_type != '2') OR (a.review_type IS NULL)"). + Fields("a.id,a.status"). + Scan(&zdData) + if err == nil { + res[i].Id = zdData.Id + res[i].Status = zdData.Status + res[i].ReviewType = "" + } else { + liberr.ErrIsNil(ctx, err, "无法获取安全工单转换数据") + return + } + } + res[i].Fill = coryCommon.SelectByString(ctx, coryCommon.IsNumeric(res[i].CreatedBy), res[i].CreatedBy) + } + listRes.List = res + liberr.ErrIsNil(ctx, err, "获取数据失败") + }) + return +} + +func (s *sBusHseManagement) GetById(ctx context.Context, id int64) (res *model.BusHseManagementDetailsRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 1、获取主体数据 + m := dao.BusHseManagement.Ctx(ctx).As("a"). + LeftJoin(dao.SysProject.Table(), "b", "b.id = a.project_id"). + LeftJoin("sys_dict_data", "c", "c.dict_type = 'study_type' and c.dict_value = a.study_type"). + LeftJoin("sys_dict_data", "e", "e.dict_type = 'tour_type' and e.dict_value = a.tour_type"). + LeftJoin(dao.BusConstructionUser.Table(), "d", "d.openid = a.corrector"). + Fields( + "a.id,b.project_name as projectName," + // 主键ID、项目名称 + "c.dict_label as studyTypeName," + // 检查类型 + "e.dict_label as tourTypeName," + // 违章类型 + "a.inspection_result," + // 巡检结果 + "a.check_time," + // 检查时间 + "a.reply_date," + // 要求整改期限 + "a.team_name as teamName," + // 班组 + "d.user_name as abarbeitung," + // 整改人 + "a.rectification_time," + // 整改时间 + "a.hidden_danger," + // 问题隐患 + "a.measure," + // 整改措施 + "a.review_time," + // 复查时间 + "a.review," + // 复查情况 + "a.status," + // 工单状态 + "a.review_type," + // 复查状态 + "a.created_by as fill," + // 复查状态 + "a.is_reply as isReply," + // 是否回复 + "a.created_at") // 创建人(检查、复查) + err = m.Where("a.id", id).Scan(&res) + liberr.ErrIsNil(ctx, err, "查询失败") + // 2、获取附件 + var pathEntity []*model.BusHseManagementPath + err = g.DB().Model("bus_hse_management_path").Ctx(ctx).Where("ticket_id", id).Scan(&pathEntity) + liberr.ErrIsNil(ctx, err, "查询失败") + // 3、分类附件 + var one []*model.BusHseManagementPath + var two []*model.BusHseManagementPath + for i := range pathEntity { + if pathEntity[i].Type == "1" { + one = append(one, pathEntity[i]) + } else { + two = append(two, pathEntity[i]) + } + } + res.CheckAttachment = one + res.AbarbeitungAttachment = two + // 3、获取 + res.Fill = coryCommon.SelectByString(ctx, coryCommon.IsNumeric(res.Fill), res.Fill) + }) + return +} + +func TeamIdByNameFunc(ctx context.Context, corrector string) string { + teamIdv, _ := dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().Openid, corrector).Fields("team_id").Value() + fields, _ := wxDao.SysProjectTeam.Ctx(ctx).WherePri(teamIdv).Fields("name").Value() + return fields.String() +} + +func (s *sBusHseManagement) Add(ctx context.Context, req *system.BusHseManagementAddReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + ////获取当前时间的年月日 + //date := tool.New().GetFormattedDate(time.Now()) + info, err := dao.BusHseManagement.Ctx(ctx).Insert(do.BusHseManagement{ + ProjectId: req.ProjectId, + StudyType: req.StudyType, + TourType: req.TourType, + InspectionResult: req.InspectionResult, + CreatedBy: systemService.Context().GetUserId(ctx), + CheckTime: gtime.New(time.Now()), + TeamName: TeamIdByNameFunc(ctx, req.Corrector), + Corrector: req.Corrector, + Status: "1", + IsReply: "1", + ReplyDate: req.ReplyDate, + }) + + liberr.ErrIsNil(ctx, err, "添加失败") + id, _ := info.LastInsertId() + // 2、上传并存储文件 + if req.HseManagementAdd == 1 { + err = SaveFunc(ctx, req.FileTwo, id, "1") // 巡检 + liberr.ErrIsNil(ctx, err) + } else { + err = UploadAndSaveFunc(ctx, req.File, id, "1") // 巡检 + liberr.ErrIsNil(ctx, err) + } + // 3、消息提醒 + value, _ := g.DB().Model("sys_dict_data").Ctx(ctx).Where("dict_type", "study_type").Where("dict_value", req.StudyType).Fields("dict_label").Value() + message := reminders.Reminder{ + Type: reminders.Security, + Status: reminders.Remind, + Title: value.String(), + Content: req.InspectionResult, + ProjectID: int(req.ProjectId), + ReceiverID: req.Corrector, + TargetID: int(id), + } + err = reminders.PublishReminder(message, false) + if err != nil { + liberr.ErrIsNil(ctx, err) + } + }) + return err + }) + return +} + +func (s *sBusHseManagement) Edit(ctx context.Context, req *system.BusHseManagementEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusHseManagement.Ctx(ctx).WherePri(req.Id).Update(do.BusHseManagement{ + Status: "2", + RectificationTime: gtime.New(time.Now()), + UpdatedBy: systemService.Context().GetUserId(ctx), + }) + err = UploadAndSaveFunc(ctx, req.File, req.Id, "1") // 巡检 + liberr.ErrIsNil(ctx, err, "修改失败") + // 2、查询数据 + var aData model.BusHseManagementInfoRes + err = dao.BusHseManagement.Ctx(ctx).WherePri(req.Id).Scan(&aData) + liberr.ErrIsNil(ctx, err) + // 3、消息提醒 + value, _ := g.DB().Model("sys_dict_data").Ctx(ctx).Where("dict_type", "study_type").Where("dict_value", aData.StudyType).Fields("dict_label").Value() + message := reminders.Reminder{ + Type: reminders.Security, + Status: reminders.Reform, + Title: value.String(), + Content: aData.InspectionResult, + ProjectID: int(aData.ProjectId), + ReceiverID: aData.CreatedBy, + TargetID: int(req.Id), + } + err = reminders.PublishReminder(message, false) + if err != nil { + liberr.ErrIsNil(ctx, err) + } + }) + return err + }) + return +} + +func (s *sBusHseManagement) EditReview(ctx context.Context, req *system.EditReviewReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusHseManagement.Ctx(ctx).WherePri(req.Id).Update(do.BusHseManagement{ + ReviewType: req.ReviewType, + Review: req.Review, + Status: "3", + ReviewTime: gtime.New(time.Now()), + UpdatedBy: systemService.Context().GetUserId(ctx), + }) + liberr.ErrIsNil(ctx, err, "修改失败") + // 2-1、查询数据 + var aData model.BusHseManagementInfoRes + err = dao.BusHseManagement.Ctx(ctx).WherePri(req.Id).Scan(&aData) + liberr.ErrIsNil(ctx, err) + //2-2、如果拒绝那么就重新写入当前数据到整改人 + if req.ReviewType == "2" { + bData := new(model.InsertRejectionRes) + if err := copier.Copy(bData, aData); err != nil { + liberr.ErrIsNil(ctx, err) + return + } + if aData.Pid == 0 { + bData.Pid = aData.Id + } else { + bData.Pid = aData.Pid + } + bData.Status = "1" + bData.CreatedBy = strconv.FormatUint(systemService.Context().GetUserId(ctx), 10) + _, resultErr := dao.BusHseManagement.Ctx(ctx).OmitEmpty().Insert(bData) + if resultErr != nil { + liberr.ErrIsNil(ctx, resultErr) + return + } + } + // 3、消息提醒 + value, _ := g.DB().Model("sys_dict_data").Ctx(ctx).Where("dict_type", "study_type").Where("dict_value", aData.StudyType).Fields("dict_label").Value() + message := reminders.Reminder{ + Type: reminders.Security, + Status: reminders.Recheck, + Title: value.String(), + Content: aData.InspectionResult, + ProjectID: int(aData.ProjectId), + ReceiverID: aData.Corrector, + TargetID: int(req.Id), + } + err = reminders.PublishReminder(message, false) + if err != nil { + liberr.ErrIsNil(ctx, err) + } + }) + return +} + +func (s *sBusHseManagement) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusHseManagement.Ctx(ctx).Delete(dao.BusHseManagement.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +type FileEntity struct { + TicketId int64 `p:"ticket_id" dc:"质量工单主键ID(级联删除)"` + Type string `p:"type" dc:"类型(1巡检 2整改)"` + Name string `p:"name" dc:"文件名称"` + Path string `p:"path" dc:"文件路径"` + FileType string `p:"file_type" dc:"文件类型(后缀)"` +} + +// UploadAndSaveFunc 上传并存储文件 +func UploadAndSaveFunc(ctx context.Context, file []*ghttp.UploadFile, id int64, typeStr string) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + if len(file) == 0 { + return + } + // 2、获取文件数据,然后对文件进行上传 + var fileEntitys []*FileEntity + for i := range file { + str, err := coryCommon.UploadFileTwo(ctx, file[i], coryCommon.Helmet) + liberr.ErrIsNil(ctx, err, "上传附件失败!") + str = filepath.ToSlash(str) + rpath := coryCommon.ResourcePublicToFunc("/"+str, 0) + _, ext, _ := coryCommon.FileInfo(rpath) + entity := FileEntity{ + TicketId: id, + Type: typeStr, + Name: file[i].Filename, + Path: rpath, + FileType: ext, + } + fileEntitys = append(fileEntitys, &entity) + } + // 3、上传文件的附件信息 + _, err = g.DB().Model("bus_hse_management_path").Ctx(ctx).Insert(fileEntitys) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +// SaveFunc 存储文件 +func SaveFunc(ctx context.Context, fileInfo []*comModel.UpFile, id int64, typeStr string) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + if len(fileInfo) == 0 { + return + } + // 2、获取文件数据,然后对文件进行上传 + var fileEntitys []*FileEntity + for i := range fileInfo { + rpath := coryCommon.FileToFunc(filepath.ToSlash(fileInfo[i].Url), 3) + entity := FileEntity{ + TicketId: id, + Type: typeStr, + Name: fileInfo[i].Name, + Path: rpath, + FileType: fileInfo[i].FileType, + } + fileEntitys = append(fileEntitys, &entity) + } + // 3、上传文件的附件信息 + _, err = g.DB().Model("bus_hse_management_path").Ctx(ctx).Insert(fileEntitys) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} diff --git a/internal/app/system/logic/busHseSecurityLog/bus_hse_security_log.go b/internal/app/system/logic/busHseSecurityLog/bus_hse_security_log.go new file mode 100644 index 0000000..5557533 --- /dev/null +++ b/internal/app/system/logic/busHseSecurityLog/bus_hse_security_log.go @@ -0,0 +1,420 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-04-07 17:00:45 +// 生成路径: internal/app/system/logic/bus_hse_security_log.go +// 生成人:gfast +// desc:HSE安全日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "path/filepath" + "strings" + + "github.com/gogf/gf/v2/container/gvar" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/util/gconv" + "github.com/jinzhu/copier" + "github.com/samber/lo" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + wxSystem "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + systemService "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterBusHseSecurityLog(New()) +} + +func New() *sBusHseSecurityLog { + return &sBusHseSecurityLog{} +} + +type sBusHseSecurityLog struct{} + +var suffix = ".jpg,.jpeg,.png" + +func (s *sBusHseSecurityLog) HseSecurityLogAppletDetails(ctx context.Context, req *wxSystem.HseSecurityLogAppletDetailsReq) (res *wxSystem.HseSecurityLogAppletDetailsRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusHseSecurityLog.Ctx(ctx).As("a"). + LeftJoin("sys_dict_data", "b", "b.dict_type = 'climate' and b.dict_value = a.climate"). + LeftJoin(dao.SysProject.Table(), "c", "c.id = a.project_id"). + Fields("a.*,"+ + "b.dict_label as climateName,"+ + "c.project_name as projectName"). + Where("a."+dao.BusHseSecurityLog.Columns().Id, req.Id).Scan(&res) + // 获取创建人 更新人名称 + createdBy := res.CreatedBy + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(wxSystem.HseSecurityLogAppletDetailsRes) + infoRes.Fill = infoRes.CreatedBy + infoRes.CreatedBy = createdBy + res = &infoRes + liberr.ErrIsNil(ctx, err, "获取信息失败") + // 获取附件 + var pathEntity []*model.HseSecurityLogPath + err = g.DB().Model("bus_hse_security_log_path").Ctx(ctx).Where("ticket_id", req.Id).Scan(&pathEntity) + liberr.ErrIsNil(ctx, err, "查询失败") + res.FileList = pathEntity + }) + return +} + +func (s *sBusHseSecurityLog) HseSecurityLogAppletList(ctx context.Context, req *wxSystem.HseSecurityLogAppletListReq) (listRes *wxSystem.HseSecurityLogAppletListRes, err error) { + listRes = new(wxSystem.HseSecurityLogAppletListRes) + err = g.Try(ctx, func(ctx context.Context) { + // 1、根据名字模糊搜索到项目id + var projectIds []string + if req.ProjectName != "" { + value, err := dao.SysProject.Ctx(ctx). + Where("(project_name like ? or short_name like ?)", "%"+req.ProjectName+"%", "%"+req.ProjectName+"%"). + Fields("GROUP_CONCAT(id)").Value() + liberr.ErrIsNil(ctx, err, "模糊查询失败") + split := strings.Split(value.String(), ",") + for i := range split { + if split[i] != "" { + projectIds = append(projectIds, split[i]) + } + } + if len(projectIds) == 0 { + return + } + } + // 2、查询数据 + m := dao.BusHseSecurityLog.Ctx(ctx).As("a"). + LeftJoin(dao.SysProject.Table(), "c", "c.id = a.project_id"). + Fields("a.id,a.created_by,a.created_at,a.date_of_occurrence,c.project_name as projectName") + if req.CreatedAt != "" { + m = m.Where("a.date_of_occurrence = ?", req.CreatedAt) + //m = m.Where("DATE_FORMAT(a.created_at,'%Y-%m-%d') = ?", req.CreatedAt) + } + if req.OpenId != "" { + m = m.Where("a."+dao.BusHseSecurityLog.Columns().CreatedBy+" = ?", req.OpenId) + } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.BusHseSecurityLog.Columns().CreatedAt+" >=? AND "+"a."+dao.BusHseSecurityLog.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + array, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + listRes.Total = len(array) + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "a.id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusHseSecurityLogInfoTwoRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + for i := range res { + res[i].Fill = coryCommon.SelectByString(ctx, coryCommon.IsNumeric(res[i].CreatedBy), res[i].CreatedBy) + } + listRes.List = res + }) + return +} + +func (s *sBusHseSecurityLog) HseSecurityLogAppletAdd(ctx context.Context, req *wxSystem.HseSecurityLogAppletAddReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 1、初始新增数据 + entity := do.BusHseSecurityLog{ + ProjectId: req.ProjectId, + DateOfOccurrence: req.DateOfOccurrence, + Remark: req.Remark, + CreatedBy: req.Openid, + } + if len(req.File) == 0 { + securityLog := do.BusHseSecurityLog{ + AirTemperatureMax: req.AirTemperatureMax, + AirTemperatureMin: req.AirTemperatureMin, + Climate: req.Climate, + Progress: req.Progress, + JobContent: req.JobContent, + DiscloseTheFacts: req.DiscloseTheFacts, + ProgressOfActivity: req.ProgressOfActivity, + Examine: req.Examine, + Implementation: req.Implementation, + SafetyInspectionSituation: req.SafetyInspectionSituation, + StoppageOrOvertime: req.StoppageOrOvertime, + OtherRecords: req.OtherRecords, + } + err = copier.Copy(&entity, &securityLog) + if err == nil { + entity.ProjectId = req.ProjectId + entity.DateOfOccurrence = req.DateOfOccurrence + entity.Remark = req.Remark + entity.CreatedBy = req.Openid + } + } + // 2、新增数据 + info, err := dao.BusHseSecurityLog.Ctx(ctx).Insert(entity) + liberr.ErrIsNil(ctx, err, "添加失败") + // 3、有附件就新增附件信息 + if len(req.File) > 0 { + id, _ := info.LastInsertId() + err = SaveFunc(ctx, req.File, id, "1") + } + }) + return err + }) + return +} + +func (s *sBusHseSecurityLog) List(ctx context.Context, req *system.BusHseSecurityLogSearchReq) (listRes *system.BusHseSecurityLogSearchRes, err error) { + listRes = new(system.BusHseSecurityLogSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + // 1、查询人 + var openids []string + if req.Fill != "" { + values, err := dao.BusConstructionUser.Ctx(ctx).Where("user_name like ?", "%"+req.Fill+"%").Fields("openid").Array() + liberr.ErrIsNil(ctx, err, "获取数据失败") + if len(values) > 0 { + for i := range values { + vs := values[i].String() + if vs != "" { + openids = append(openids, vs) + } + } + } + } + + // 根据用户名从 sys_user 表中根据 user_nickname + if req.Fill != "" { + values, err := dao.SysUser.Ctx(ctx).Where("user_nickname like ?", "%"+req.Fill+"%").Fields("id").Array() + liberr.ErrIsNil(ctx, err, "获取数据失败") + if len(values) > 0 { + openids = append(openids, lo.Map(values, func(item *gvar.Var, _ int) string { + return item.String() + })...) + } + } + + // 2、查询具体数据 + m := dao.BusHseSecurityLog.Ctx(ctx).WithAll() + if req.ProjectId != "" { + m = m.Where(dao.BusHseSecurityLog.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + if len(req.DateOfOccurrence) != 0 { + m = m.Where(dao.BusHseSecurityLog.Columns().DateOfOccurrence+" >=? AND "+dao.BusHseSecurityLog.Columns().DateOfOccurrence+" <=?", req.DateRange[0], req.DateRange[1]) + } + if len(openids) != 0 { + m = m.Where(dao.BusHseSecurityLog.Columns().CreatedBy+" in (?)", openids) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusHseSecurityLog.Columns().CreatedAt+" >=? AND "+dao.BusHseSecurityLog.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusHseSecurityLogInfoTwoRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + for i := range res { + res[i].Fill = coryCommon.SelectByString(ctx, coryCommon.IsNumeric(res[i].CreatedBy), res[i].CreatedBy) + } + listRes.List = res + }) + return +} + +func (s *sBusHseSecurityLog) GetById(ctx context.Context, id int64) (res *model.BusHseSecurityLogInfoTwoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 1、获取数据 + err = dao.BusHseSecurityLog.Ctx(ctx).As("a"). + LeftJoin("sys_dict_data", "b", "b.dict_type = 'climate' and b.dict_value = a.climate"). + LeftJoin(dao.SysProject.Table(), "c", "c.id = a.project_id"). + Fields("a.*,"+ + "b.dict_label as climateName,"+ + "c.project_name as projectName"). + Where("a."+dao.BusHseSecurityLog.Columns().Id, id).Scan(&res) + // 获取创建人 更新人名称 + res.Fill = coryCommon.SelectByString(ctx, coryCommon.IsNumeric(res.CreatedBy), res.CreatedBy) + liberr.ErrIsNil(ctx, err, "获取信息失败") + // 2、获取附件 + var pathEntity []*model.HseSecurityLogPath + err = g.DB().Model("bus_hse_security_log_path").Ctx(ctx).Where("ticket_id", id).Scan(&pathEntity) + liberr.ErrIsNil(ctx, err, "查询失败") + res.FileList = pathEntity + }) + return +} + +func (s *sBusHseSecurityLog) AddText(ctx context.Context, req *system.BusHseSecurityLogAddTxetReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusHseSecurityLog.Ctx(ctx).OmitEmpty().Insert(do.BusHseSecurityLog{ + ProjectId: req.ProjectId, + DateOfOccurrence: req.DateOfOccurrence, + AirTemperatureMax: req.AirTemperatureMax, + AirTemperatureMin: req.AirTemperatureMin, + Climate: req.Climate, + Progress: req.Progress, + JobContent: req.JobContent, + DiscloseTheFacts: req.DiscloseTheFacts, + ProgressOfActivity: req.ProgressOfActivity, + Examine: req.Examine, + Implementation: req.Implementation, + SafetyInspectionSituation: req.SafetyInspectionSituation, + StoppageOrOvertime: req.StoppageOrOvertime, + OtherRecords: req.OtherRecords, + Remark: req.Remark, + CreatedBy: systemService.Context().GetUserId(ctx), + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusHseSecurityLog) AddFile(ctx context.Context, req *system.BusHseSecurityLogAddFileReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 1、新增文件信息 + info, err := dao.BusHseSecurityLog.Ctx(ctx).OmitEmpty().Insert(do.BusHseSecurityLog{ + ProjectId: req.ProjectId, + DateOfOccurrence: req.DateOfOccurrence, + Remark: req.Remark, + CreatedBy: systemService.Context().GetUserId(ctx), + }) + liberr.ErrIsNil(ctx, err) + id, _ := info.LastInsertId() + // 2、新增附件信息 + if len(req.File) > 0 { + err = UploadAndSaveFunc(ctx, req.File, id, "2") // 在不清楚的情况下直接是图片,具体是不是图片类型,方法内部去判断 + liberr.ErrIsNil(ctx, err) + } + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return err + }) + return +} + +func (s *sBusHseSecurityLog) Edit(ctx context.Context, req *system.BusHseSecurityLogEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusHseSecurityLog.Ctx(ctx).WherePri(req.Id).Update(do.BusHseSecurityLog{ + ProjectId: req.ProjectId, + DateOfOccurrence: req.DateOfOccurrence, + AirTemperatureMax: req.AirTemperatureMax, + AirTemperatureMin: req.AirTemperatureMin, + Climate: req.Climate, + Progress: req.Progress, + JobContent: req.JobContent, + DiscloseTheFacts: req.DiscloseTheFacts, + ProgressOfActivity: req.ProgressOfActivity, + Examine: req.Examine, + Implementation: req.Implementation, + SafetyInspectionSituation: req.SafetyInspectionSituation, + StoppageOrOvertime: req.StoppageOrOvertime, + OtherRecords: req.OtherRecords, + Remark: req.Remark, + UpdatedBy: systemService.Context().GetUserId(ctx), + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusHseSecurityLog) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusHseSecurityLog.Ctx(ctx).Delete(dao.BusHseSecurityLog.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +type FileEntity struct { + TicketId int64 `p:"ticket_id" dc:"父主键ID"` + Type string `p:"type" dc:"类型(1文件 2图片)"` + Name string `p:"name" dc:"文件名称"` + Path string `p:"path" dc:"文件路径"` + FileType string `p:"file_type" dc:"文件类型(后缀)"` +} + +// UploadAndSaveFunc 上传并存储文件 +func UploadAndSaveFunc(ctx context.Context, File []*ghttp.UploadFile, id int64, typeStr string) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 2、获取文件数据,然后对文件进行上传 + var fileEntitys []*FileEntity + for i := range File { + // 上传附件 + str, err := coryCommon.UploadFileTwo(ctx, File[i], coryCommon.Helmet) + liberr.ErrIsNil(ctx, err, "上传附件失败!") + str = filepath.ToSlash(str) + rpath := coryCommon.ResourcePublicToFunc("/"+str, 0) + // 获取文件信息 + _, ext, _ := coryCommon.FileInfo(rpath) + // 判断文件是否属于其中的一种(路径要绝对路径) + flag := coryCommon.FormatRestrictionFunc(coryCommon.FileToFunc(rpath, 2), suffix) + if flag { + typeStr = "1" + } + entity := FileEntity{ + TicketId: id, + Type: typeStr, + Name: File[i].Filename, + Path: rpath, + FileType: ext, + } + fileEntitys = append(fileEntitys, &entity) + } + // 3、上传文件的附件信息 + _, err = g.DB().Model("bus_hse_security_log_path").Ctx(ctx).Insert(fileEntitys) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +// SaveFunc 存储文件 +func SaveFunc(ctx context.Context, fileInfo []*comModel.UpFile, id int64, typeStr string) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 2、获取文件数据,然后对文件进行上传 + var fileEntitys []*FileEntity + for i := range fileInfo { + rpath := coryCommon.FileToFunc(filepath.ToSlash(fileInfo[i].Url), 3) + // 判断文件是否属于其中的一种(路径要绝对路径) + flag := coryCommon.FormatRestrictionFunc(coryCommon.FileToFunc(rpath, 4), suffix) + if flag { + typeStr = "2" + } + entity := FileEntity{ + TicketId: id, + Type: typeStr, + Name: fileInfo[i].Name, + Path: rpath, + FileType: fileInfo[i].FileType, + } + fileEntitys = append(fileEntitys, &entity) + } + // 3、上传文件的附件信息 + _, err = g.DB().Model("bus_hse_security_log_path").Ctx(ctx).Insert(fileEntitys) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} diff --git a/internal/app/system/logic/busInspectionTicket/bus_inspection_ticket.go b/internal/app/system/logic/busInspectionTicket/bus_inspection_ticket.go new file mode 100644 index 0000000..55d1e4b --- /dev/null +++ b/internal/app/system/logic/busInspectionTicket/bus_inspection_ticket.go @@ -0,0 +1,910 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-03-21 15:23:59 +// 生成路径: internal/app/system/logic/bus_inspection_ticket.go +// 生成人:gfast +// desc:质量工单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gconv" + "github.com/gogf/gf/v2/util/gmeta" + "github.com/jinzhu/copier" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + systemService "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/tiger1103/gfast/v3/third/reminders" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" + "path/filepath" + "sort" + "strconv" + "strings" + "time" +) + +func init() { + service.RegisterBusInspectionTicket(New()) +} + +type FileEntity struct { + TicketId int64 `p:"ticket_id" dc:"质量工单主键ID(级联删除)"` + Type string `p:"type" dc:"类型(1巡检 2整改)"` + Name string `p:"name" dc:"文件名称"` + Path string `p:"path" dc:"文件路径"` + FileType string `p:"file_type" dc:"文件类型(后缀)"` +} + +func New() *sBusInspectionTicket { + return &sBusInspectionTicket{} +} + +type sBusInspectionTicket struct{} + +func (s *sBusInspectionTicket) UpdataCorrector(ctx context.Context, req *system.UpdataCorrectorReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //1、先查看当前状态是否通知状态 + columns := dao.BusInspectionTicket.Columns() + var aData *model.BusInspectionTicketInfoRes + err = dao.BusInspectionTicket.Ctx(ctx).WherePri(req.Id).Scan(&aData) + liberr.ErrIsNil(ctx, err, "获取工单失败!") + if aData != nil && aData.Status != "1" { + liberr.ErrIsNil(ctx, errors.New("当前工单状态不是通知状态,无法更改整改人")) + return + } + //2、变更当前工单的整改人 + _, err = dao.BusInspectionTicket.Ctx(ctx).Data(columns.Corrector, req.Corrector).WherePri(req.Id).Update() + liberr.ErrIsNil(ctx, err, "变更整改人失败") + //3、删除当前工单的提醒失败 + err2 := reminders.UserIDOrderIDDel(aData.Corrector, aData.Id) + liberr.ErrIsNil(ctx, err2, "删除当前工单的提醒失败") + //3、发送通知 + value, _ := g.DB().Model("sys_dict_data").Ctx(ctx).Where("dict_type", "inspection_type").Where("dict_value", aData.InspectionType).Fields("dict_label").Value() + message := reminders.Reminder{ + Type: reminders.Quality, + Status: reminders.Reform, + Title: value.String(), + Content: aData.InspectionResult, + ProjectID: int(aData.ProjectId), + ReceiverID: aData.CreatedBy, + TargetID: int(req.Id), + } + err = reminders.PublishReminder(message, false) + if err != nil { + liberr.ErrIsNil(ctx, err) + } + }) + return err + }) + return err +} + +func (s *sBusInspectionTicket) LargeScreenDetails(ctx context.Context, req *system.LargeScreenDetailsReq) (res *system.LargeScreenDetailsRes, err error) { + res = new(system.LargeScreenDetailsRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusInspectionTicket.Ctx(ctx).As("a"). + LeftJoin(dao.SysProject.Table(), "b", "b.id = a.project_id"). + LeftJoin("sys_dict_data", "c", "c.dict_type = 'inspection_type' and c.dict_value = a.inspection_type") + //1、获取主体数据 + var zd = "a.id," + //主键ID + "b.project_name as projectName," + //项目名称 + "a.created_by as fill," + //检查人 + "a.check_time as checkTime," + //检查时间 + "a.rectification_time as rectificationTime," + //整改时间 + "a.review_time as reviewTime," + //验证时间 + "a.feedback as feedback," + //整改反馈 + "a.reply_date," + //回复时间 + "a.is_reply," + //是否回复 + "a.inspection_headline," + //巡检主题 + "a.inspection_result," + //巡检结果 + "c.dict_label as inspection_type," + //巡检类型 + "a.created_at," + //巡检记录时间 + "a.status,a.verification_type" + if req.Type == "2" { + m = m.LeftJoin(dao.BusConstructionUser.Table(), "d", "d.openid = a.corrector") + zd = zd + ",d.user_name as abarbeitung" //整改人 + } + m = m.Fields(zd) //巡检到整改为2表示回复、整改到验证1通过2拒绝 + err = m.Where("a.id", req.Id).Scan(&res) + if err != nil { + return + } + //2、获取附件 + var pathEntity []*model.BusInspectionTicketPath + err = g.DB().Model("bus_inspection_ticket_path").Ctx(ctx).Where("ticket_id", req.Id).Scan(&pathEntity) + liberr.ErrIsNil(ctx, err, "查询失败") + //3、分类附件 + var one []*model.BusInspectionTicketPath + var two []*model.BusInspectionTicketPath + for i := range pathEntity { + if pathEntity[i].Type == "1" { + one = append(one, pathEntity[i]) + } else { + two = append(two, pathEntity[i]) + } + } + res.Inspectionccessories = one + res.CorrectiveAttachment = two + //3、获取 + res.Fill = coryCommon.SelectByString(ctx, coryCommon.IsNumeric(res.Fill), res.Fill) + }) + return +} + +func (s *sBusInspectionTicket) GisQualityManagementListFunc(ctx context.Context, req *system.GisQualityManagementListReq) (listRes *system.GisQualityManagementListRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + listRes = new(system.GisQualityManagementListRes) + m := dao.BusInspectionTicket.Ctx(ctx).As("a"). + Fields("a.id,b.dict_label,a.inspection_headline,a.status,a.verification_type,a.created_at"). + LeftJoin("sys_dict_data", "b", "b.dict_type = 'inspection_type' and b.dict_value = a.inspection_type"). + Where("a.is_reply", req.Type).Where("a.project_id", req.ProjectId) + values, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + listRes.Total = len(values) + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "a.created_at desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var entity []*system.GisQualityManagementListEntityRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&entity) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = entity + }) + return +} + +func (s *sBusInspectionTicket) GisQualityManagementResFunc(ctx context.Context, req *system.GisQualityManagementReq) (res *system.GisQualityManagementRes, err error) { + res = new(system.GisQualityManagementRes) + err = g.Try(ctx, func(ctx context.Context) { + //1、获取巡检记录(质量工单不需要回复的所有数据) + safe := dao.BusInspectionTicket.Ctx(ctx). + Where("project_id", req.ProjectId).Safe() + count, err := safe.Where("is_reply", "2").Count() + liberr.ErrIsNil(ctx, err, "巡检记录统计失败") + res.InspectionRecord = count + //2、整改情况统计(百分比) + countTwo, err := safe.Where("is_reply", "1").Count() + liberr.ErrIsNil(ctx, err, "情况统计情况统计失败") + countThree, err := safe.Where("is_reply", "1"). + Where("status", "3"). + Where("verification_type", "1"). + Count() + liberr.ErrIsNil(ctx, err, "获取数据失败") + if float64(countThree) == 0 { + res.ReorganizeTheSituation = 0 + } else { + consequence, err := coryCommon.PercentageFunc(100, float64(countTwo), float64(countThree)) + liberr.ErrIsNil(ctx, err) + res.ReorganizeTheSituation = consequence + } + }) + return +} + +func (s *sBusInspectionTicket) InspectionTicketAppletDetailsFunc(ctx context.Context, req *wxApplet.InspectionTicketAppletDetailsReq) (res *wxApplet.InspectionTicketAppletDetailsRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、获取主体数据 + m := dao.BusInspectionTicket.Ctx(ctx).As("a"). + LeftJoin(dao.SysProject.Table(), "b", "b.id = a.project_id"). + LeftJoin("sys_dict_data", "c", "dict_type = 'inspection_type' and dict_value = a.Inspection_type"). + LeftJoin(dao.BusConstructionUser.Table(), "d", "d.openid = a.corrector"). + Fields( + "a.id,b.project_name as projectName," + //主键ID、项目名称 + "c.dict_label," + //巡检类型 + "a.inspection_headline," + //巡检主题 + "a.inspection_result," + //巡检结果 + "d.user_name as abarbeitung," + //整改人 + "a.is_reply,a.reply_date," + //是否回复、回复时间 + "a.created_by as fill,a.created_at," + //填报人、填报时间 + "a.feedback," + //整改反馈 + "a.verification_result," + //验证结果 + "a.status,a.verification_type," + //工单状态、验证状态 + "a.updated_at as updatedAt," + //更新时间 + "a.rectification_time as rectificationTime") //整改时间 + err = m.Where("a.id", req.Id).Scan(&res) + liberr.ErrIsNil(ctx, err, "查询失败") + //2、获取附件 + var pathEntity []*model.BusInspectionTicketPath + err = g.DB().Model("bus_inspection_ticket_path").Ctx(ctx).Where("ticket_id", req.Id).Scan(&pathEntity) + liberr.ErrIsNil(ctx, err, "查询失败") + //3、分类附件 + var one []*model.BusInspectionTicketPath + var two []*model.BusInspectionTicketPath + for i := range pathEntity { + if pathEntity[i].Type == "1" { + one = append(one, pathEntity[i]) + } else { + two = append(two, pathEntity[i]) + } + } + res.Inspectionccessories = one + res.CorrectiveAttachment = two + //3、获取 + res.Fill = coryCommon.SelectByString(ctx, coryCommon.IsNumeric(res.Fill), res.Fill) + }) + return +} + +func (s *sBusInspectionTicket) AcquisitionOfCorrectivePersonnelFunc(ctx context.Context, req *wxApplet.AcquisitionOfCorrectivePersonnelReq) (res *wxApplet.AcquisitionOfCorrectivePersonnelRes, err error) { + res = new(wxApplet.AcquisitionOfCorrectivePersonnelRes) + var listEntity []*model.AcquisitionOfCorrectivePersonnelEntityRes + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusConstructionUser.Ctx(ctx).As("a"). + LeftJoin("sys_project_team_member", "b", "b.openid = a.openid"). + Fields("a.openid,a.user_name"). + Where("a.project_id", req.ProjectId). + Where("b.post_id = 10"). + Where("a.team_id > 0"). + Where("a.team_id is not null") + if req.UserName != "" { + m = m.Where("a.user_name", "%"+req.UserName+"%") + } + m.Scan(&listEntity) + liberr.ErrIsNil(ctx, err, "查询失败") + }) + res.List = listEntity + return +} + +func (s *sBusInspectionTicket) InspectionTicketAppletListFunc(ctx context.Context, req *wxApplet.InspectionTicketAppletListReq) (listRes *wxApplet.InspectionTicketAppletListRes, err error) { + listRes = new(wxApplet.InspectionTicketAppletListRes) + err = g.Try(ctx, func(ctx context.Context) { + //1、根据名字模糊搜索到项目id + var projectIds []string + if req.ProjectName != "" { + value, err := dao.SysProject.Ctx(ctx). + Where("(project_name like ? or short_name like ?)", "%"+req.ProjectName+"%", "%"+req.ProjectName+"%"). + Fields("GROUP_CONCAT(id)").Value() + liberr.ErrIsNil(ctx, err, "模糊查询失败") + split := strings.Split(value.String(), ",") + for i := range split { + projectIds = append(projectIds, split[i]) + } + } + //2、根据项目id+openid获取到数据 + var appletList []*model.AppletListRes + m := dao.BusInspectionTicket.Ctx(ctx).As("a"). + LeftJoin(dao.SysProject.Table(), "b", "b.id = a.project_id"). + LeftJoin("sys_dict_data", "c", "dict_type = 'inspection_type' and dict_value = a.Inspection_type"). + LeftJoin(dao.BusConstructionUser.Table(), "d", "d.openid = a.corrector"). + //LeftJoin(dao.BusConstructionUser.Table(), "e", "e.openid = a.created_by"). + Fields( + "a.id,b.project_name as projectName," + //主键ID、项目名称 + "c.dict_label as dictLabel," + //巡检类型 + "d.user_name as userName," + //整改人 + "a.inspection_headline as inspectionHeadline," + //巡检主题 + "a.inspection_result as inspectionResult," + //巡检结果 + "a.status,a.verification_type as verificationType," + //工单状态 + //"e.user_name as createBy," + + "a.created_by as createdBy," + + "a.is_reply as isReply," + + "a.created_at as createdAt") //创建人、创建时间 + if req.StudyType != "" { + m = m.Where("a.inspection_type", req.StudyType) + } + if req.Status != "" && req.Status != "0" { + m = m.Where("a.status", req.Status) + } else { + m = m.Where("a.pid", "0") + } + if req.ProjectId != 0 { + m = m.Where("a.project_id = ?", req.ProjectId) + } + if req.CreatedAt != "" { + m = m.Where("DATE_FORMAT(a.created_at,'%Y-%m-%d') = ?", req.CreatedAt) + } + if req.Type == "1" { + m = m.Where("a.created_by", req.OpenId) + } + if req.Type == "2" { + m = m.Where("a.corrector", req.OpenId).Where("a.is_reply <> 2") + } + if req.Type == "3" { + m = m.Where("a.created_by = ? or a.corrector = ?", req.OpenId, req.OpenId) + } + if len(projectIds) > 0 { + m = m.Where("b.id in (?)", projectIds) + } + array, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + listRes.Total = len(array) + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "a.status asc,a.created_at desc" + if req.OrderBy != "" { + order = req.OrderBy + } + m.Page(req.PageNum, req.PageSize).Order(order).Scan(&appletList) + //3、获取 + for i := range appletList { + //当前工单如若被拒绝,那么就查询当前工单下最新的数据信息,然后把当前数据给替换掉(主要替换id、状态) + if appletList[i].VerificationType == "2" { + type zdmp struct { + gmeta.Meta `orm:"table:bus_inspection_ticket"` + Id int64 `orm:"id" json:"id"` + VerificationType string `orm:"verification_type" json:"verificationType"` + } + var zdmpData []zdmp + mysql := dao.BusInspectionTicket.Ctx(ctx).As("a"). + Where("a.pid", appletList[i].Id).Safe() + if err := mysql.Fields("a.id,a.verification_type").Scan(&zdmpData); err != nil { + liberr.ErrIsNil(ctx, err, "无法获取安全工单拒绝数据") + return + } else { + for i2 := range zdmpData { + if zdmpData[i2].VerificationType == "" || zdmpData[i2].VerificationType == "1" { + zdmpData[i2].VerificationType = "true" + } else { + zdmpData[i2].VerificationType = "false" + } + } + zdmpData = append(zdmpData, zdmp{ + Id: appletList[i].Id, + VerificationType: "false", + }) + sort.Slice(zdmpData, func(i, j int) bool { + return zdmpData[i].Id > zdmpData[j].Id + }) + appletList[i].RefuseList = zdmpData + } + type zd struct { + gmeta.Meta `orm:"table:bus_hse_management"` + Id int64 `orm:"id" json:"id"` + Status string `orm:"status" json:"status"` + VerificationType string `orm:"verification_type" json:"verificationType"` + } + zdData := new(zd) + err := mysql. + Where("(a.verification_type != '2') OR (a.verification_type IS NULL)"). + Fields("a.id,a.status,a.verification_type"). + Scan(&zdData) + if err == nil { + appletList[i].Id = zdData.Id + appletList[i].Status = zdData.Status + appletList[i].VerificationType = zdData.VerificationType + } else { + liberr.ErrIsNil(ctx, err, "无法获取安全工单转换数据") + return + } + } + appletList[i].CreatedById = appletList[i].CreatedBy + appletList[i].CreatedBy = coryCommon.SelectByString(ctx, coryCommon.IsNumeric(appletList[i].CreatedBy), appletList[i].CreatedBy) + } + listRes.List = appletList + }) + return +} + +func (s *sBusInspectionTicket) InspectionTicketAppletVerifyFunc(ctx context.Context, req *wxApplet.InspectionTicketAppletVerifyReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //1、更新数据 + _, err = dao.BusInspectionTicket.Ctx(ctx).WherePri(req.Id).OmitEmpty().Update(do.BusInspectionTicket{ + VerificationResult: req.VerificationResult, + VerificationType: req.VerificationType, + Status: "3", //整改 + ReviewTime: gtime.New(time.Now()), + UpdatedBy: req.Openid, + }) + liberr.ErrIsNil(ctx, err, "验证提交失败") + //2、查询数据 + var aData model.BusInspectionTicketInfoRes + err = dao.BusInspectionTicket.Ctx(ctx).WherePri(req.Id).Scan(&aData) + liberr.ErrIsNil(ctx, err) + //3、消息提醒 + value, _ := g.DB().Model("sys_dict_data").Ctx(ctx).Where("dict_type", "inspection_type").Where("dict_value", aData.InspectionType).Fields("dict_label").Value() + message := reminders.Reminder{ + Type: reminders.Quality, + Status: reminders.Recheck, + Title: value.String(), + Content: aData.InspectionResult, + ProjectID: int(aData.ProjectId), + ReceiverID: aData.Corrector, + TargetID: int(req.Id), + } + err = reminders.PublishReminder(message, false) + if err != nil { + liberr.ErrIsNil(ctx, err) + } + }) + return err + }) + return +} + +func (s *sBusInspectionTicket) InspectionTicketAppletAbarbeitungFunc(ctx context.Context, req *wxApplet.InspectionTicketAppletAbarbeitungReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //1、更新数据 + _, err = dao.BusInspectionTicket.Ctx(ctx).WherePri(req.Id).OmitEmpty().Update(do.BusInspectionTicket{ + Feedback: req.Feedback, + Status: "2", //整改 + RectificationTime: gtime.New(time.Now()), + UpdatedBy: req.Openid, + }) + liberr.ErrIsNil(ctx, err, "整改提交失败") + //2、存储文件 + if len(req.File) > 0 { + err = SaveFunc(ctx, req.File, req.Id, "2") //整改 + liberr.ErrIsNil(ctx, err) + } + //2、查询数据 + var aData model.BusInspectionTicketInfoRes + err = dao.BusInspectionTicket.Ctx(ctx).WherePri(req.Id).Scan(&aData) + liberr.ErrIsNil(ctx, err) + //3、消息提醒 + value, _ := g.DB().Model("sys_dict_data").Ctx(ctx).Where("dict_type", "inspection_type").Where("dict_value", aData.InspectionType).Fields("dict_label").Value() + message := reminders.Reminder{ + Type: reminders.Quality, + Status: reminders.Reform, + Title: value.String(), + Content: aData.InspectionResult, + ProjectID: int(aData.ProjectId), + ReceiverID: aData.CreatedBy, + TargetID: int(req.Id), + } + err = reminders.PublishReminder(message, false) + if err != nil { + liberr.ErrIsNil(ctx, err) + } + }) + return err + }) + return +} + +func (s *sBusInspectionTicket) InspectionTicketAppletAddFunc(ctx context.Context, req *wxApplet.InspectionTicketAppletAddReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + isStatus := "1" //默认为通知 + if req.IsReply == "2" { + isStatus = "3" + } + ticket := do.BusInspectionTicket{ + ProjectId: req.ProjectId, + InspectionType: req.InspectionType, + InspectionHeadline: req.InspectionHeadline, + InspectionResult: req.InspectionResult, + Corrector: req.Corrector, + IsReply: req.IsReply, + ReplyDate: req.ReplyDate, + Status: isStatus, + CreatedBy: req.Openid, + CheckTime: gtime.New(time.Now()), + } + //如果回复为否,那么工单状态为验证且通过 + if isStatus == "3" { + ticket.VerificationType = "1" + } + //1、上传文件基本信息 + info, err := dao.BusInspectionTicket.Ctx(ctx).OmitEmpty().Insert(ticket) + liberr.ErrIsNil(ctx, err, "添加失败") + id, _ := info.LastInsertId() + //2、上传并存储文件 + if len(req.File) > 0 { + err = SaveFunc(ctx, req.File, id, "1") //巡检 + liberr.ErrIsNil(ctx, err) + } + //3、消息提醒 + value, _ := g.DB().Model("sys_dict_data").Ctx(ctx).Where("dict_type", "inspection_type").Where("dict_value", req.InspectionType).Fields("dict_label").Value() + message := reminders.Reminder{ + Type: reminders.Quality, + Status: reminders.Remind, + + Title: value.String(), + Content: req.InspectionResult, + + ProjectID: int(req.ProjectId), + ReceiverID: req.Corrector, + TargetID: int(id), + } + err = reminders.PublishReminder(message, false) + if err != nil { + liberr.ErrIsNil(ctx, err) + } + }) + return err + }) + return +} + +func (s *sBusInspectionTicket) List(ctx context.Context, req *system.BusInspectionTicketSearchReq) (listRes *system.BusInspectionTicketSearchRes, err error) { + listRes = new(system.BusInspectionTicketSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusInspectionTicket.Ctx(ctx).As("a"). + LeftJoin(dao.SysProject.Table(), "b", "b.id = a.project_id"). + LeftJoin(dao.BusConstructionUser.Table(), "d", "d.openid = a.corrector"). + Fields(` + a.id, + a.feedback, + a.status, + b.project_name, + a.inspection_type, + a.inspection_headline, + a.inspection_result, + d.user_name as two, + a.created_at, + a.updated_at, + a.verification_type, + a.created_by, + a.is_reply, + a.rectification_time + `) + m = m.Where("a.pid", "0") + if req.ProjectId != "" { + m = m.Where("a."+dao.BusInspectionTicket.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + if req.InspectionType != "" { + m = m.Where("a."+dao.BusInspectionTicket.Columns().InspectionType+" = ?", req.InspectionType) + } + if req.Status != "" { + m = m.Where("a."+dao.BusInspectionTicket.Columns().Status+" = ?", req.Status) + } + //创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where("a."+dao.BusInspectionTicket.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.BusInspectionTicket.Columns().CreatedAt+" >=? AND "+"a."+dao.BusInspectionTicket.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + array, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + listRes.Total = len(array) + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "a.id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.PcListRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + for i := range res { + //当前工单如若被拒绝,那么就查询当前工单下最新的数据信息,然后把当前数据给替换掉(主要替换id、状态) + if res[i].VerificationType == "2" { + type zdmp struct { + gmeta.Meta `orm:"table:bus_inspection_ticket"` + Id int64 `orm:"id" json:"id"` + VerificationType string `orm:"verification_type" json:"verificationType"` + } + var zdmpData []zdmp + mysql := dao.BusInspectionTicket.Ctx(ctx).As("a"). + Where("a.pid", res[i].Id).Safe() + if err := mysql.Fields("a.id,a.verification_type").Scan(&zdmpData); err != nil { + liberr.ErrIsNil(ctx, err, "无法获取安全工单拒绝数据") + return + } else { + for i2 := range zdmpData { + if zdmpData[i2].VerificationType == "" || zdmpData[i2].VerificationType == "1" { + zdmpData[i2].VerificationType = "true" + } else { + zdmpData[i2].VerificationType = "false" + } + } + zdmpData = append(zdmpData, zdmp{ + Id: res[i].Id, + VerificationType: "false", + }) + sort.Slice(zdmpData, func(i, j int) bool { + return zdmpData[i].Id > zdmpData[j].Id + }) + res[i].RefuseList = zdmpData + } + type zd struct { + gmeta.Meta `orm:"table:bus_inspection_ticket"` + Id int64 `orm:"id" json:"id"` + Status string `orm:"status" json:"status"` + VerificationType string `orm:"verification_type" json:"verificationType"` + } + zdData := new(zd) + err := mysql. + Where("(a.verification_type != '2') OR (a.verification_type IS NULL)"). + Fields("a.id,a.status,a.verification_type"). + Scan(&zdData) + if err == nil { + res[i].Id = zdData.Id + res[i].Status = zdData.Status + res[i].VerificationType = zdData.VerificationType + } else { + liberr.ErrIsNil(ctx, err, "无法获取安全工单转换数据") + return + } + } + res[i].One = coryCommon.SelectByString(ctx, coryCommon.IsNumeric(res[i].CreatedBy), res[i].CreatedBy) + } + listRes.List = res + }) + return +} + +func (s *sBusInspectionTicket) GetById(ctx context.Context, id int64) (res *model.AppletDetailsRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、获取主体数据 + m := dao.BusInspectionTicket.Ctx(ctx).As("a"). + LeftJoin(dao.SysProject.Table(), "b", "b.id = a.project_id"). + LeftJoin("sys_dict_data", "c", "dict_type = 'inspection_type' and dict_value = a.Inspection_type"). + LeftJoin(dao.BusConstructionUser.Table(), "d", "d.openid = a.corrector"). + Fields( + "a.id,b.project_name as projectName," + //主键ID、项目名称 + "c.dict_label," + //巡检类型 + "a.inspection_headline," + //巡检主题 + "a.inspection_result," + //巡检结果 + "d.user_name as abarbeitung," + //整改人 + "a.is_reply,a.reply_date," + //是否回复、回复时间 + "a.created_by as fill,a.created_at," + //填报人、填报时间 + "a.feedback," + //整改反馈 + "a.verification_result," + //验证结果 + "a.status,a.verification_type," + //工单状态、验证状态 + "a.updated_at as updatedAt," + //更新时间 + "a.rectification_time as rectificationTime") //整改时间 + err = m.Where("a.id", id).Scan(&res) + liberr.ErrIsNil(ctx, err, "查询失败") + //2、获取附件 + var pathEntity []*model.BusInspectionTicketPath + err = g.DB().Model("bus_inspection_ticket_path").Ctx(ctx).Where("ticket_id", id).Scan(&pathEntity) + liberr.ErrIsNil(ctx, err, "查询失败") + //3、分类附件 + var one []*model.BusInspectionTicketPath + var two []*model.BusInspectionTicketPath + for i := range pathEntity { + if pathEntity[i].Type == "1" { + one = append(one, pathEntity[i]) + } else { + two = append(two, pathEntity[i]) + } + } + res.Inspectionccessories = one + res.CorrectiveAttachment = two + //3、获取 + res.Fill = coryCommon.SelectByString(ctx, coryCommon.IsNumeric(res.Fill), res.Fill) + + }) + return +} + +func (s *sBusInspectionTicket) Add(ctx context.Context, req *system.BusInspectionTicketAddReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //1、存储基本信息 + //date := tool.New().GetFormattedDate(time.Now()) + info, err := dao.BusInspectionTicket.Ctx(ctx).Insert(do.BusInspectionTicket{ + ProjectId: req.ProjectId, + InspectionType: req.InspectionType, + InspectionHeadline: req.InspectionHeadline, + InspectionResult: req.InspectionResult, + Corrector: req.Corrector, + Status: "1", + IsReply: req.IsReply, + ReplyDate: req.ReplyDate, + CheckTime: gtime.New(time.Now()), + CreatedBy: systemService.Context().GetUserId(ctx), + }) + liberr.ErrIsNil(ctx, err, "添加失败") + id, _ := info.LastInsertId() + //2、上传并存储文件 + if req.HseManagementAdd == 1 { + err = SaveFunc(ctx, req.FileTwo, id, "1") //巡检 + liberr.ErrIsNil(ctx, err) + } else { + err = UploadAndSaveFunc(ctx, req.File, id, "1") //巡检 + liberr.ErrIsNil(ctx, err) + } + //3、消息提醒 + value, _ := g.DB().Model("sys_dict_data").Ctx(ctx).Where("dict_type", "inspection_type").Where("dict_value", req.InspectionType).Fields("dict_label").Value() + message := reminders.Reminder{ + Type: reminders.Quality, + Status: reminders.Remind, + Title: value.String(), + Content: req.InspectionHeadline, + ProjectID: int(req.ProjectId), + ReceiverID: req.Corrector, + TargetID: int(id), + } + err = reminders.PublishReminder(message, false) + if err != nil { + liberr.ErrIsNil(ctx, err) + } + }) + return err + }) + return +} + +func (s *sBusInspectionTicket) Edit(ctx context.Context, req *system.BusInspectionTicketAbarbeitungReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //1、插入数据 + _, err = dao.BusInspectionTicket.Ctx(ctx).WherePri(req.Id).Update(do.BusInspectionTicket{ + Status: "2", + RectificationTime: gtime.New(time.Now()), + UpdatedBy: systemService.Context().GetUserId(ctx), + }) + err = UploadAndSaveFunc(ctx, req.File, req.Id, "1") //巡检 + liberr.ErrIsNil(ctx, err, "修改失败") + //2、查询数据 + var aData model.BusInspectionTicketInfoRes + err = dao.BusInspectionTicket.Ctx(ctx).WherePri(req.Id).Scan(&aData) + liberr.ErrIsNil(ctx, err) + //3、消息提醒 + value, _ := g.DB().Model("sys_dict_data").Ctx(ctx).Where("dict_type", "inspection_type").Where("dict_value", aData.InspectionType).Fields("dict_label").Value() + message := reminders.Reminder{ + Type: reminders.Quality, + Status: reminders.Reform, + Title: value.String(), + Content: aData.InspectionResult, + ProjectID: int(aData.ProjectId), + ReceiverID: aData.CreatedBy, + TargetID: int(req.Id), + } + err = reminders.PublishReminder(message, false) + if err != nil { + liberr.ErrIsNil(ctx, err) + } + }) + return err + }) + return +} + +func (s *sBusInspectionTicket) EditVerification(ctx context.Context, req *system.BusInspectionTicketVerificationReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusInspectionTicket.Ctx(ctx).WherePri(req.Id).Update(do.BusInspectionTicket{ + VerificationType: req.VerificationType, + VerificationResult: req.VerificationResult, + Status: "3", + ReviewTime: gtime.New(time.Now()), + UpdatedBy: systemService.Context().GetUserId(ctx), + }) + //2-1、查询数据 + var aData model.BusInspectionTicketInfoRes + err = dao.BusInspectionTicket.Ctx(ctx).WherePri(req.Id).Scan(&aData) + liberr.ErrIsNil(ctx, err) + //2-2、如果拒绝那么就重新写入当前数据到整改人 + if req.VerificationType == "2" { + bData := new(model.ReviewRejectionRes) + if err := copier.Copy(bData, aData); err != nil { + liberr.ErrIsNil(ctx, err) + return + } + if aData.Pid == 0 { + bData.Pid = aData.Id + } else { + bData.Pid = aData.Pid + } + bData.Status = "1" + bData.CreatedBy = strconv.FormatUint(systemService.Context().GetUserId(ctx), 10) + _, resultErr := dao.BusInspectionTicket.Ctx(ctx).OmitEmpty().Insert(bData) + if resultErr != nil { + liberr.ErrIsNil(ctx, resultErr) + return + } + } + //3、消息提醒 + value, _ := g.DB().Model("sys_dict_data").Ctx(ctx).Where("dict_type", "inspection_type").Where("dict_value", aData.InspectionType).Fields("dict_label").Value() + message := reminders.Reminder{ + Type: reminders.Quality, + Status: reminders.Recheck, + Title: value.String(), + Content: aData.InspectionResult, + ProjectID: int(aData.ProjectId), + ReceiverID: aData.Corrector, + TargetID: int(req.Id), + } + err = reminders.PublishReminder(message, false) + if err != nil { + liberr.ErrIsNil(ctx, err) + } + }) + return err + }) + return +} + +func (s *sBusInspectionTicket) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、删除数据 + _, err = dao.BusInspectionTicket.Ctx(ctx).Delete(dao.BusInspectionTicket.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + //2、删除文件 + var files []*model.BusInspectionTicketPath + err := g.DB().Model("bus_inspection_ticket_path").Ctx(ctx).Where("ticket_id in (?)", ids).Scan(&files) + liberr.ErrIsNil(ctx, err, "删除失败") + if files != nil { + var paths []string + for i := range files { + paths = append(paths, files[i].Path) + } + coryCommon.BatchFile(paths) + } + }) + return +} + +// UploadAndSaveFunc 上传并存储文件 +func UploadAndSaveFunc(ctx context.Context, File []*ghttp.UploadFile, id int64, typeStr string) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //2、获取文件数据,然后对文件进行上传 + var fileEntitys []*FileEntity + for i := range File { + str, err := coryCommon.UploadFileTwo(ctx, File[i], coryCommon.Helmet) + liberr.ErrIsNil(ctx, err, "上传附件失败!") + str = filepath.ToSlash(str) + rpath := coryCommon.ResourcePublicToFunc("/"+str, 0) + _, ext, _ := coryCommon.FileInfo(rpath) + entity := FileEntity{ + TicketId: id, + Type: typeStr, + Name: File[i].Filename, + Path: rpath, + FileType: ext, + } + fileEntitys = append(fileEntitys, &entity) + } + //3、上传文件的附件信息 + _, err = g.DB().Model("bus_inspection_ticket_path").Ctx(ctx).Insert(fileEntitys) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +// SaveFunc 存储文件 +func SaveFunc(ctx context.Context, fileInfo []*comModel.UpFile, id int64, typeStr string) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + if len(fileInfo) > 0 { + //2、获取文件数据,然后对文件进行上传 + var fileEntitys []*FileEntity + for i := range fileInfo { + rpath := coryCommon.FileToFunc(filepath.ToSlash(fileInfo[i].Url), 3) + entity := FileEntity{ + TicketId: id, + Type: typeStr, + Name: fileInfo[i].Name, + Path: rpath, + FileType: fileInfo[i].FileType, + } + fileEntitys = append(fileEntitys, &entity) + } + //3、上传文件的附件信息 + _, err = g.DB().Model("bus_inspection_ticket_path").Ctx(ctx).Insert(fileEntitys) + liberr.ErrIsNil(ctx, err, "添加失败") + } + + }) + return +} diff --git a/internal/app/system/logic/busMachinery/bus_machinery.go b/internal/app/system/logic/busMachinery/bus_machinery.go new file mode 100644 index 0000000..6a8b153 --- /dev/null +++ b/internal/app/system/logic/busMachinery/bus_machinery.go @@ -0,0 +1,359 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-07-29 14:02:01 +// 生成路径: internal/app/system/logic/bus_machinery.go +// 生成人:gfast +// desc:机械 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + sysUserLogic "github.com/tiger1103/gfast/v3/internal/app/system/logic/sysUser" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterBusMachinery(New()) +} + +func New() *sBusMachinery { + return &sBusMachinery{} +} + +type sBusMachinery struct{} + +func (s *sBusMachinery) MechanicalConditionFunc(ctx context.Context, req *system.MechanicalConditionReq) (res *system.MechanicalConditionRes, err error) { + res = new(system.MechanicalConditionRes) + err = g.Try(ctx, func(ctx context.Context) { + //2、获取当前项目下机械的数量的统计 + sql := dao.BusMachinery.Ctx(ctx).As("a"). + LeftJoin(`( + SELECT count(1)as ct,machinery_id FROM bus_machinery_detail WHERE type = 2 and status = 0 and deleted_at IS NULL GROUP BY machinery_id + ) as b on a.id = b.machinery_id`). + Where("a.project_id", req.ProjectId). + Fields("a.machinery_name as statusName,b.ct as statusNumber") + if req.IsPaging == "YES" || req.IsPaging == "yes" { + arr, err := sql.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + res.Total = len(arr) + if req.PageNum == 0 { + req.PageNum = 1 + } + res.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "b.ct desc" + if req.OrderBy != "" { + order = req.OrderBy + } + sql = sql.Page(req.PageNum, req.PageSize).Order(order) + } + var towOne []*system.MechanicalConditionListRes + err = sql.Scan(&towOne) + res.List = towOne + liberr.ErrIsNil(ctx, err, "代码错误,请联系管理员!") + }) + return +} + +func (s *sBusMachinery) MachineNumberFunc(ctx context.Context, req *system.MachineNumberReq) (res *system.MachineNumberRes, err error) { + res = new(system.MachineNumberRes) + err = g.Try(ctx, func(ctx context.Context) { + var pneOne []*system.MachineNumberEntity + //1、获取当前用户的项目信息 (需要判断是否分页) + ids := sysUserLogic.ProjectAll(ctx) + var projectListEntity []*model.SysProjectListRes + sql := dao.SysProject.Ctx(ctx).Where("id in (" + ids + ")") + if req.IsPaging == "YES" || req.IsPaging == "yes" { + arr, err := sql.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + res.Total = len(arr) + if req.PageNum == 0 { + req.PageNum = 1 + } + res.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + sql = sql.Fields(system.SysProjectSearchRes{}).Page(req.PageNum, req.PageSize).Order(order) + } + err = sql.Scan(&projectListEntity) + //2、获取当前项目下机械的数量的统计 + for _, dataTwo := range projectListEntity { + var towOne []*system.AccountStatus + var bm []*model.BusMachineryListRes + err = dao.BusMachinery.Ctx(ctx).Where("a.project_id", dataTwo.Id).As("a").Fields(` a.id, + a.machinery_name, + a.machinery_number, + a.checkout_number, + a.checkout_unit, + a.checkout_date, + a.status, + a.created_at, + a.number, + a.entry_time, + a.remark, + a.create_by, + b.ct, + b.machinery_id`). + LeftJoin(`(select IFNULL(count(id),0) ct,machinery_id from bus_machinery_detail WHERE type='2' and deleted_at is null GROUP BY machinery_id) as b on a.id = b.machinery_id`). + Scan(&bm) + for _, dataOne := range bm { + var towTwo = new(system.AccountStatus) + towTwo.StatusName = dataOne.MachineryName + towTwo.StatusNumber = dataOne.Ct + towOne = append(towOne, towTwo) + } + var pneTwo = new(system.MachineNumberEntity) + pneTwo.ProjectId = dataTwo.Id + if dataTwo.ShortName != "" { + pneTwo.ProjectName = dataTwo.ShortName + } else { + pneTwo.ProjectName = dataTwo.ProjectName + } + pneTwo.StatusList = towOne + pneOne = append(pneOne, pneTwo) + } + res.List = pneOne + liberr.ErrIsNil(ctx, err, "代码错误,请联系管理员!") + }) + return +} + +func (s *sBusMachinery) List(ctx context.Context, req *system.BusMachinerySearchReq) (listRes *system.BusMachinerySearchRes, err error) { + listRes = new(system.BusMachinerySearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusMachinery.Ctx(ctx).As("a"). + Fields("a.*,COALESCE(b.type2_ct, 0) AS ct"). + LeftJoin("(SELECT machinery_id, SUM(type = '2') AS type2_ct FROM bus_machinery_detail WHERE deleted_at IS NULL GROUP BY machinery_id) AS b ON a.id = b.machinery_id") + if req.ProjectId != "" { + m = m.Where("a."+dao.BusMachinery.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.Status != "" { + m = m.Where("a."+dao.BusMachinery.Columns().Status+" = ?", req.Status) + } + if req.MachineryName != "" { + m = m.Where("a."+dao.BusMachinery.Columns().MachineryName+" like ?", "%"+req.MachineryName+"%") + } + //创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where("a."+dao.BusMachinery.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.BusMachinery.Columns().CreatedAt+" >=? AND "+"a."+dao.BusMachinery.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + array, err := m.Array() + listRes.Total = len(array) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusMachineryInfoRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusMachineryListRes, len(res)) + for k, v := range res { + if v.Ct <= 0 { + v.Ct = 0 + } + listRes.List[k] = &model.BusMachineryListRes{ + Id: v.Id, + MachineryName: v.MachineryName, + MachineryNumber: v.MachineryNumber, + CheckoutNumber: v.CheckoutNumber, + //CheckoutUnit: v.CheckoutUnit, + CheckoutDate: v.CheckoutDate, + Status: v.Status, + CreatedAt: v.CreatedAt, + Ct: v.Ct, + EntryTime: v.EntryTime, + //Principal: v.Principal, + Remark: v.Remark, + } + } + }) + return +} + +func (s *sBusMachinery) GetById(ctx context.Context, id uint64) (res *model.BusMachineryInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusMachinery.Ctx(ctx).As("a"). + Where("a."+dao.BusMachinery.Columns().Id, id). + Fields("a.*,COALESCE(b.type2_ct, 0) AS ct"). + LeftJoin("(SELECT machinery_id, SUM(type = '2') AS type2_ct FROM bus_machinery_detail WHERE deleted_at IS NULL GROUP BY machinery_id) AS b ON a.id = b.machinery_id"). + Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusMachineryInfoRes) + if infoRes.Ct <= 0 { + infoRes.Ct = 0 + } + res = &infoRes + }) + return +} + +func (s *sBusMachinery) Add(ctx context.Context, req *system.BusMachineryAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、查询当前名字是否已经存在了,如果存在不允许添加 + count, _ := dao.BusMachinery.Ctx(ctx). + Where("project_id", req.ProjectId). + Where("machinery_name", req.MachineryName). + Where("machinery_number", req.MachineryNumber). + Count() + if count > 0 { + err = errors.New("当前机械已存在!") + liberr.ErrIsNil(ctx, err) + return + } + _, err = dao.BusMachinery.Ctx(ctx).Insert(do.BusMachinery{ + MachineryName: req.MachineryName, + MachineryNumber: req.MachineryNumber, + ProjectId: req.ProjectId, + CheckoutNumber: req.CheckoutNumber, + //CheckoutUnit: req.CheckoutUnit, + CheckoutDate: req.CheckoutDate, + //Number: req.Number, + CreateBy: ct.New().GetLoginUser(ctx).Id, + EntryTime: req.EntryTime, + //Principal: req.Principal, + Remark: req.Remark, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusMachinery) Edit(ctx context.Context, req *system.BusMachineryEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusMachinery.Ctx(ctx).WherePri(req.Id).Update(do.BusMachinery{ + MachineryName: req.MachineryName, + MachineryNumber: req.MachineryNumber, + CheckoutNumber: req.CheckoutNumber, + //CheckoutUnit: req.CheckoutUnit, + CheckoutDate: req.CheckoutDate, + Status: req.Status, + //Number: req.Number, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + EntryTime: req.EntryTime, + //Principal: req.Principal, + Remark: req.Remark, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusMachinery) Delete(ctx context.Context, ids []uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusMachinery.Ctx(ctx).Delete(dao.BusMachinery.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +func (s *sBusMachinery) AppList(ctx context.Context, req *system.BusMachineryAppSearchReq) (listRes *system.BusMachineryAppSearchRes, err error) { + listRes = new(system.BusMachineryAppSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusMachinery.Ctx(ctx).As("a") + if req.AppStatus == 0 { //0 全部 1入场 2停用 3出场 1出场 2入场 + m = m.Fields("a.*,COALESCE(b.type2_ct, 0) AS ct"). + LeftJoin("(SELECT machinery_id, SUM(type = '2') AS type2_ct FROM bus_machinery_detail WHERE deleted_at IS NULL GROUP BY machinery_id) AS b ON a.id = b.machinery_id") + } + if req.AppStatus == 1 { //入场数量 + m = m.Fields("a.*,COALESCE(b.type2_ct, 0) AS ct"). //ct 入场的 注 COALESCE为空时为0 + LeftJoin("(SELECT machinery_id, SUM(type = '2') AS type2_ct FROM bus_machinery_detail WHERE status = 0 AND deleted_at IS NULL GROUP BY machinery_id) AS b ON a.id = b.machinery_id"). + Where(" b.type2_ct !=0") + } + if req.AppStatus == 2 { //停用数量 + m = m.Fields("a.*, COALESCE(b.status_ct, 0) AS ct"). // ct 停用 + LeftJoin("(SELECT machinery_id, SUM(status = '1') AS status_ct FROM bus_machinery_detail WHERE type = 2 AND deleted_at IS NULL GROUP BY machinery_id) AS b ON a.id = b.machinery_id"). + Where(" b.status_ct !=0") + } + if req.AppStatus == 3 { //出场数量 + m = m.Fields("a.*, COALESCE(b.type1_ct, 0) AS ct"). //ct 出场 注 COALESCE为空时为0 + LeftJoin("(SELECT machinery_id,SUM(type = '1') AS type1_ct FROM bus_machinery_detail WHERE deleted_at IS NULL GROUP BY machinery_id) AS b ON a.id = b.machinery_id"). + Where(" b.type1_ct !=0") + } + + if req.ProjectId != "" { + m = m.Where("a."+dao.BusMachinery.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.ThreeSreach != "" { + m = m.WhereLike("a.machinery_name", "%"+req.ThreeSreach+"%"). + WhereOrLike("a.machinery_number", "%"+req.ThreeSreach+"%"). + WhereOrLike("a.principal", "%"+req.ThreeSreach+"%") + } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.BusMachinery.Columns().CreatedAt+" >=? AND "+"a."+dao.BusMachinery.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + array, err := m.Array() + listRes.Total = len(array) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusMachineryInfoRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusMachineryAppListRes, len(res)) + for k, v := range res { + if v.Ct <= 0 { + v.Ct = 0 + } + listRes.List[k] = &model.BusMachineryAppListRes{ + Id: v.Id, + MachineryName: v.MachineryName, + MachineryNumber: v.MachineryNumber, + //CheckoutNumber: v.CheckoutNumber, + //CheckoutUnit: v.CheckoutUnit, + //CheckoutDate: v.CheckoutDate, + //Status: v.Status, + CreatedAt: v.CreatedAt, + Ct: v.Ct, + EntryTime: v.EntryTime, + //Principal: v.Principal, + Remark: v.Remark, + } + } + }) + return +} diff --git a/internal/app/system/logic/busMachineryDetail/bus_machinery_detail.go b/internal/app/system/logic/busMachineryDetail/bus_machinery_detail.go new file mode 100644 index 0000000..448deb3 --- /dev/null +++ b/internal/app/system/logic/busMachineryDetail/bus_machinery_detail.go @@ -0,0 +1,599 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-10-12 11:41:32 +// 生成路径: internal/app/system/logic/bus_machinery_detail.go +// 生成人:gfast +// desc:机械详情 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" + "strings" +) + +func init() { + service.RegisterBusMachineryDetail(New()) +} + +func New() *sBusMachineryDetail { + return &sBusMachineryDetail{} +} + +type sBusMachineryDetail struct{} + +func (s *sBusMachineryDetail) List(ctx context.Context, req *system.BusMachineryDetailSearchReq) (listRes *system.BusMachineryDetailSearchRes, err error) { + listRes = new(system.BusMachineryDetailSearchRes) + //err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusMachineryDetail.Ctx(ctx).WithAll() + if req.MachineryId != "" { + m = m.Where(dao.BusMachineryDetail.Columns().MachineryId, req.MachineryId) + } + if req.CheckoutNumber != "" { + m = m.Where(dao.BusMachineryDetail.Columns().CheckoutNumber+" like ?", "%"+req.CheckoutNumber+"%") + } + if req.Status != "" { + m = m.Where(dao.BusMachineryDetail.Columns().Status+" = ?", req.Status) + } + if req.EntryTime != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.EntryTime)) + m = m.Where(dao.BusMachineryDetail.Columns().EntryTime+" like ?", "%"+date+"%") + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusMachineryDetailInfoRes + err = m.Fields(system.BusMachineryDetailSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusMachineryDetailListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusMachineryDetailListRes{ + Id: v.Id, + CheckoutNumber: v.CheckoutNumber, + CheckoutUnit: v.CheckoutUnit, + CheckoutDate: v.CheckoutDate, + Status: v.Status, + Type: v.Type, + EntryTime: v.EntryTime, + CreatedAt: v.CreatedAt, + Remark: v.Remark, + Picture: v.Picture, + MachineryId: v.MachineryId, + Principal: v.Principal, + } + } + //}) + return +} + +func (s *sBusMachineryDetail) GetById(ctx context.Context, id int64) (res *model.BusMachineryDetailGetIdInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusMachineryDetail.Ctx(ctx).WithAll().Where(dao.BusMachineryDetail.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + var record []*model.BusMachineryRecordList + err = dao.BusMachineryDetail.Ctx(ctx).As("bmd"). + Fields("bmr.*"). + LeftJoin(" bus_machinery_record AS bmr ON bmd.id=bmr.machinery_detail_id"). + Where("bmd.id = ?", id).Order("record_time DESC"). + Scan(&record) + liberr.ErrIsNil(ctx, err, "获取信息失败") + // 判断详细记录是否为空 获取创建人 更新人 + if len(record) == 0 { + res.RecordList = nil + } else { + for i := range record { + record[i].CreateBy = coryCommon.SelectByString(ctx, coryCommon.IsNumeric(record[i].CreateBy), record[i].CreateBy) + } + res.RecordList = record + } + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusMachineryDetailGetIdInfoRes) + res = &infoRes + + }) + return +} + +func (s *sBusMachineryDetail) Add(ctx context.Context, req *system.BusMachineryDetailAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + num, err := dao.BusMachineryDetail.Ctx(ctx).Where(dao.BusMachineryDetail.Columns().MachineryId, req.MachineryId). + Where(dao.BusMachineryDetail.Columns().CheckoutNumber, req.CheckoutNumber).Count() + var NowTime *gtime.Time + if req.EntryTime == "" { + NowTime = gtime.Now() + } else { + NowTime = gconv.GTime(req.EntryTime) + } + + if num == 0 { + //默认为入场 + req.Type = 2 + detail := do.BusMachineryDetail{ + MachineryId: req.MachineryId, + CheckoutNumber: req.CheckoutNumber, + CheckoutUnit: req.CheckoutUnit, + CheckoutDate: req.CheckoutDate, + Remark: req.Remark, + Type: req.Type, + EntryTime: NowTime, + Picture: req.Picture, + Principal: req.Principal, + CreateBy: ct.New().GetLoginUser(ctx).Id, + } + DetailId, err := dao.BusMachineryDetail.Ctx(ctx).InsertAndGetId(detail) + liberr.ErrIsNil(ctx, err, "添加失败") + //机械设备详细新增记录 + if err == nil { + dao.BusMachineryRecord.Ctx(ctx).Insert(do.BusMachineryRecord{ + MachineryDetailId: DetailId, + RecordTime: NowTime, + Type: req.Type, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + } + } else { + err = errors.New("编号已存在") + liberr.ErrIsNil(ctx, err) + return + } + + }) + return +} + +func (s *sBusMachineryDetail) Edit(ctx context.Context, req *system.BusMachineryDetailEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //优化 + machineryId, err := dao.BusMachineryDetail.Ctx(ctx).Where(dao.BusMachineryDetail.Columns().Id, req.Id). + Fields("machinery_id").Value() + // 检查同machineryId下是否有其他记录的CheckoutNumber与待更新的一致 + // 注意排除当前记录自身 + num, err := dao.BusMachineryDetail.Ctx(ctx). + Where(dao.BusMachineryDetail.Columns().MachineryId, gconv.Int(machineryId)). + Where(dao.BusMachineryDetail.Columns().CheckoutNumber, req.CheckoutNumber). + Where(dao.BusMachineryDetail.Columns().Id+"!= ?", req.Id). // 排除当前记录 + Count() + // 如果找到了重复的CheckoutNumber,则返回错误 + if num > 0 { + err = errors.New("该机械设备下已有相同的合格编号") + liberr.ErrIsNil(ctx, err) + return + } + // 没有重复,继续执行更新逻辑 + var NowTime *gtime.Time + if req.EntryTime == "" { + NowTime = gtime.Now() + } else { + NowTime = gconv.GTime(req.EntryTime) + } + detail := do.BusMachineryDetail{ + CheckoutNumber: req.CheckoutNumber, + CheckoutUnit: req.CheckoutUnit, + CheckoutDate: req.CheckoutDate, + Status: req.Status, + Type: req.Type, + EntryTime: NowTime, + Remark: req.Remark, + Picture: req.Picture, + Principal: req.Principal, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + } + _, err = dao.BusMachineryDetail.Ctx(ctx).WherePri(req.Id).Update(detail) + liberr.ErrIsNil(ctx, err, "修改失败") + //机械设备详细修改记录 + if err == nil { + _, err = dao.BusMachineryRecord.Ctx(ctx).Insert(do.BusMachineryRecord{ + MachineryDetailId: req.Id, + Status: req.Status, + Type: req.Type, + RecordTime: NowTime, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "记录修改日志失败") + } + + }) + + return err +} + +func (s *sBusMachineryDetail) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + safe := dao.BusMachineryDetail.Ctx(ctx).Safe() + //获取需要删除数据的附件 + array, _ := safe.Where(dao.BusMachineryDetail.Columns().Id+" in (?)", ids).Fields("picture").Array() + //删除mysql数据 + _, err = safe.Delete(dao.BusMachineryDetail.Columns().Id+" in (?)", ids) + //清除附件 + if err != nil { + var str []string + for i := range array { + split := strings.Split(array[i].String(), ",") + str = append(str, split...) + } + coryCommon.BatchFile(str) + } + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +// 详情记录 +func (s *sBusMachineryDetail) RecordGetById(ctx context.Context, id int64) (res *model.BusMachineryDetailGetIdInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusMachineryRecord.Ctx(ctx).WithAll().Where(dao.BusMachineryDetail.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + var record []*model.BusMachineryRecordList + err = dao.BusMachineryDetail.Ctx(ctx).As("bmd"). + Fields("bmr.*"). + LeftJoin(" bus_machinery_record AS bmr ON bmd.id=bmr.machinery_detail_id"). + Where("bmd.id = ?", id).Order("record_time DESC"). + Scan(&record) + liberr.ErrIsNil(ctx, err, "获取信息失败") + //获取创建人 更新人 + for i := range record { + record[i].CreateBy = coryCommon.SelectByString(ctx, coryCommon.IsNumeric(record[i].CreateBy), record[i].CreateBy) + } + res.RecordList = record + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusMachineryDetailGetIdInfoRes) + res = &infoRes + + }) + return +} + +//app + +func (s *sBusMachineryDetail) AppList(ctx context.Context, req *system.BusMachineryDetailAppSearchReq) (listRes *system.BusMachineryDetailAppSearchRes, err error) { + listRes = new(system.BusMachineryDetailAppSearchRes) + //err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusMachineryDetail.Ctx(ctx).WithAll() + if req.MachineryId != "" { + m = m.Where(dao.BusMachineryDetail.Columns().MachineryId, req.MachineryId) + } + switch req.AppStatus { //1入场 2停用 3出场 + case 1: //入场 + m = m.Where(" type = 2 ").Where("status = 0") + case 2: + m = m.Where("status = 1").Where("type = 2") + case 3: + m = m.Where(" type = 1") + case 0: + m = m + default: + return nil, errors.New("状态参数错误") + } + + //if req.EntryTime != "" { + // date := tool.New().GetFormattedDate(gconv.Time(req.EntryTime)) + // m = m.Where(dao.BusMachineryDetail.Columns().EntryTime+" like ?", "%"+date+"%") + //} + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + //BusMachineryDetailAppListRes + var res []*model.BusMachineryDetailInfoRes + err = m.Fields(system.BusMachineryDetailAppSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusMachineryDetailAppListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusMachineryDetailAppListRes{ + Id: v.Id, + CheckoutNumber: v.CheckoutNumber, + CheckoutUnit: v.CheckoutUnit, + CheckoutDate: v.CheckoutDate, + Status: v.Status, + Type: v.Type, + EntryTime: v.EntryTime, + CreatedAt: v.CreatedAt, + Remark: v.Remark, + Picture: v.Picture, + MachineryId: v.MachineryId, + UpdatedAt: v.UpdatedAt, + } + } + //}) + return +} + +const ( + Exarch = 1 //退场 + Entry = 2 //入场 + TrueStatus = 0 //正常 + FalseStatus = 1 //停用 + InspectionFile = 1 + LeaseFile = 2 +) + +func (s *sBusMachineryDetail) AppAdd(ctx context.Context, req *system.BusMachineryDetailAppAddReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + num, err := dao.BusMachineryDetail.Ctx(ctx).Where(dao.BusMachineryDetail.Columns().MachineryId, req.MachineryId). + Where(dao.BusMachineryDetail.Columns().CheckoutNumber, req.CheckoutNumber).Count() + //不存在重复 + if num == 0 { + var NowTime *gtime.Time + if req.EntryTime == "" { + NowTime = gtime.Now() + } else { + NowTime = gconv.GTime(req.EntryTime) + } + detail := do.BusMachineryDetail{ + MachineryId: req.MachineryId, + CheckoutNumber: req.CheckoutNumber, + CheckoutUnit: req.CheckoutUnit, + CheckoutDate: req.CheckoutDate, + Remark: req.Remark, + Status: req.Status, + Type: Entry, + EntryTime: NowTime, + Picture: req.Picture, + CreateBy: ct.New().GetLoginUser(ctx).Id, + } + DetailId, err := dao.BusMachineryDetail.Ctx(ctx).InsertAndGetId(detail) + liberr.ErrIsNil(ctx, err, "添加失败") + //机械设备详细新增记录 + if err == nil { + dao.BusMachineryRecord.Ctx(ctx).Insert(do.BusMachineryRecord{ + MachineryDetailId: DetailId, + RecordTime: NowTime, + Type: Entry, + Status: req.Status, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + } + //添加合格校验单 + if len(req.InspectionFile) > 0 { + if err := insertAppAddFiles(ctx, req.InspectionFile, DetailId, InspectionFile); err != nil { + liberr.ErrIsNil(ctx, err, "处理合格校验单错误") + } + } + // 处理租赁合同 + if len(req.LeaseFile) > 0 { + if err := insertAppAddFiles(ctx, req.LeaseFile, DetailId, LeaseFile); err != nil { + liberr.ErrIsNil(ctx, err, "处理租赁合同错误") + } + } + } else { + err = errors.New("编号已存在") + liberr.ErrIsNil(ctx, err) + return + } + + }) + return err + }) + return + +} + +// app Edit +func (s *sBusMachineryDetail) AppEdit(ctx context.Context, req *system.BusMachineryDetailAppEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //优化 + machineryId, err := dao.BusMachineryDetail.Ctx(ctx).Where(dao.BusMachineryDetail.Columns().Id, req.Id). + Fields("machinery_id").Value() + liberr.ErrIsNil(ctx, err, "查询有问题") + // 检查同machineryId下是否有其他记录的CheckoutNumber与待更新的一致,排除当前记录自身 + num, err := dao.BusMachineryDetail.Ctx(ctx). + Where(dao.BusMachineryDetail.Columns().MachineryId, gconv.Int(machineryId)). + Where(dao.BusMachineryDetail.Columns().CheckoutNumber, req.CheckoutNumber). + Where(dao.BusMachineryDetail.Columns().Id+"!= ?", req.Id). // 排除当前记录 + Count() + // 重复的CheckoutNumber,则返回错误 + if num > 0 { + err = errors.New("该机械设备下已有相同的合格编号") + liberr.ErrIsNil(ctx, err) + return + } + // 没有重复,继续执行更新逻辑 + //获取最新时间 + var NowTime *gtime.Time + if req.EntryTime == "" { + NowTime = gtime.Now() + } else { + NowTime = gconv.GTime(req.EntryTime) + } + //获取状态 + var Detail struct { + Status string + Type string + } + dao.BusMachineryDetail.Ctx(ctx).Fields("status,type").Where(dao.BusMachineryDetail.Columns().Id, req.Id).Scan(&Detail) + detail := do.BusMachineryDetail{ + CheckoutNumber: req.CheckoutNumber, + CheckoutUnit: req.CheckoutUnit, + CheckoutDate: req.CheckoutDate, + Status: req.Status, + Type: req.Type, + EntryTime: NowTime, + Remark: req.Remark, + Picture: req.Picture, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + } + _, err = dao.BusMachineryDetail.Ctx(ctx).WherePri(req.Id).Update(detail) + liberr.ErrIsNil(ctx, err, "修改失败") + //机械设备详细状态修改记录 + if err == nil { + if Detail.Status != req.Status || Detail.Type != gconv.String(req.Type) { + _, err = dao.BusMachineryRecord.Ctx(ctx).Insert(do.BusMachineryRecord{ + MachineryDetailId: req.Id, + Status: req.Status, + Type: req.Type, + RecordTime: NowTime, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "记录修改日志失败") + } + } + //删除真实文件和数据库文件路径 + if req.DelFile != nil { + if err := deleteAppEditFiles(ctx, req.DelFile); err != nil { + liberr.ErrIsNil(ctx, err, "文件删除失败") + } + } + //修改合格校验单 + if len(req.InspectionFile) > 0 { + if err := insertAppEditFiles(ctx, req.InspectionFile, req.Id, InspectionFile); err != nil { + liberr.ErrIsNil(ctx, err, "处理合格校验单错误") + } + } + // 处理租赁合同 + if len(req.LeaseFile) > 0 { + if err := insertAppEditFiles(ctx, req.LeaseFile, req.Id, LeaseFile); err != nil { + liberr.ErrIsNil(ctx, err, "处理租赁合同错误") + } + } + }) + return err + }) + return +} + +// app getid +func (s *sBusMachineryDetail) AppGetById(ctx context.Context, id int64) (res *model.BusMachineryDetailAppGetIdInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusMachineryDetail.Ctx(ctx).As("bmd").WithAll(). + Fields("bmd.*,bm.machinery_name,bm.principal"). + LeftJoin("bus_machinery as bm on bmd.machinery_id=bm.id").Where("bmd."+dao.BusMachineryDetail.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + var AllFile []*entity.BusMachineryDetailFile + err = dao.BusMachineryDetail.Ctx(ctx).As("bmd"). + Fields("bmdf.*"). + LeftJoin(" bus_machinery_detail_file AS bmdf on bmd.id=bmdf.machinery_detail_id"). + Where("bmd.id = ?", id). + Scan(&AllFile) + liberr.ErrIsNil(ctx, err, "获取信息失败") + if len(AllFile) != 0 { + for _, K := range AllFile { + if K.SourceType == "1" { + res.InspectionFile = append(res.InspectionFile, model.BusMachineryDetailFile{ + Name: K.Name, + Url: K.Path, + Size: gconv.Int64(K.Size), + FileType: K.Type, + Id: K.Id, + }) + } else if K.SourceType == "2" { + res.LeaseFile = append(res.LeaseFile, model.BusMachineryDetailFile{ + Name: K.Name, + Url: K.Path, + Size: gconv.Int64(K.Size), + FileType: K.Type, + Id: K.Id, + }) + } + } + } + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusMachineryDetailAppGetIdInfoRes) + res = &infoRes + + }) + return +} + +// AppAdd函数 +func insertAppAddFiles(ctx context.Context, file []model.BusMachineryDetailAddFile, detailId int64, sourceType int) error { + bulkInsert := make([]do.BusMachineryDetailFile, 0, len(file)) + for _, k := range file { + if k.Url == "" { + continue + } + bulkInsert = append(bulkInsert, do.BusMachineryDetailFile{ + MachineryDetailId: detailId, + SourceType: sourceType, + Name: k.Name, + Path: k.Url, + Size: k.Size, + Type: k.FileType, + }) + } + if len(bulkInsert) <= 0 { + return nil + } + //批量插入 Batch分批写入条数数量 + _, err := dao.BusMachineryDetailFile.Ctx(ctx).Data(bulkInsert).Batch(10).Insert() + liberr.ErrIsNil(ctx, err, "有错误文件") + return nil +} + +// AppEdit +func insertAppEditFiles(ctx context.Context, file []model.BusMachineryDetailFile, detailId int64, sourceType int) (err error) { + //file有两种值 有id的修改值 无id的新增 + for _, k := range file { + if k.Id != 0 { + continue + } + _, err = dao.BusMachineryDetailFile.Ctx(ctx).Insert(do.BusMachineryDetailFile{ + MachineryDetailId: detailId, + SourceType: sourceType, + Name: k.Name, + Path: k.Url, + Size: k.Size, + Type: k.FileType, + }) + liberr.ErrIsNil(ctx, err, "有错误文件") + } + return nil +} + +// AppEdit 删除真实文件和数据库文件路径 +func deleteAppEditFiles(ctx context.Context, file []model.BusMachineryDetailFile) (err error) { + var filepath []string + var ids []int64 + for _, K := range file { + if K.Url == "" { + continue + } + filepath = append(filepath, K.Url) + ids = append(ids, K.Id) + } + _, err = dao.BusMachineryDetailFile.Ctx(ctx).Delete("id in (?)", ids) + liberr.ErrIsNil(ctx, err, "无记录值") + coryCommon.BatchFile(filepath) + return nil +} diff --git a/internal/app/system/logic/busPayrollList/bus_payroll_list.go b/internal/app/system/logic/busPayrollList/bus_payroll_list.go new file mode 100644 index 0000000..2cda872 --- /dev/null +++ b/internal/app/system/logic/busPayrollList/bus_payroll_list.go @@ -0,0 +1,335 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-11-20 13:51:38 +// 生成路径: internal/app/system/logic/bus_payroll_list.go +// 生成人:gfast +// desc:工资(excel导入形成的) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "fmt" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/jinzhu/copier" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/xuri/excelize/v2" + "reflect" + "strings" +) + +func init() { + service.RegisterBusPayrollList(New()) +} + +func New() *sBusPayrollList { + return &sBusPayrollList{} +} + +type sBusPayrollList struct{} + +func (s *sBusPayrollList) DeletePayroll(ctx context.Context, req *system.BusDeletePayrollReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + m := g.DB().Model("bus_payroll").Ctx(ctx).WhereIn("id", req.Ids).Safe() + value, err := m.Fields("path").Value() + liberr.ErrIsNil(ctx, err) + _, err = m.Delete() + liberr.ErrIsNil(ctx, err, "删除失败") + coryCommon.BatchFile(strings.Split(value.String(), ",")) + }) + return +} + +func (s *sBusPayrollList) GetTheSourceExcelAccordingToTheIdOfThePayroll(ctx context.Context, req *system.GetTheSourceExcelAccordingToTheIdOfThePayrollReq) (res *system.GetTheSourceExcelAccordingToTheIdOfThePayrollRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + res = new(system.GetTheSourceExcelAccordingToTheIdOfThePayrollRes) + err := g.DB().Model("bus_payroll_source").Ctx(ctx).Where("pid").Fields("path,name,suffix").Scan(res) + liberr.ErrIsNil(ctx, err, "获取源excel文件失败") + }) + return +} + +func (s *sBusPayrollList) ReadAllImportedListData(ctx context.Context, req *system.ReadAllImportedListDataReq) (res *system.ReadAllImportedListDataRes, err error) { + res = new(system.ReadAllImportedListDataRes) + err = g.Try(ctx, func(ctx context.Context) { + var bp []*model.BusPayrollRes + err2 := g.DB().Model("bus_payroll").As("a").Ctx(ctx).Fields("a.id, a.title,create_by,created_at, (select sum(amount_paid_out) from bus_payroll_list where pid = a.id) as money").Scan(&bp) + liberr.ErrIsNil(ctx, err2, "获取数据失败") + res.List = bp + }) + return +} + +func (s *sBusPayrollList) ImportExcelPaySheet(ctx context.Context, req *system.ImportExcelPaySheetReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //1、插入数据 + result, errResult := g.DB().Model("bus_payroll").Ctx(ctx).Insert(g.Map{"title": req.YearToDate, "create_by": ct.New().GetLoginUser(ctx).Id}) + liberr.ErrIsNil(ctx, errResult, "插入数据失败") + //2、存储excel的源文件 + path := coryCommon.ResourcePublicToFunc(req.ExcelPath, 0) + id, _ := result.LastInsertId() + _, err = g.DB().Model("bus_payroll_source").Ctx(ctx).Insert(g.Map{"pid": id, "type": "1", "name": req.Name, "suffix": req.Suffix, "path": path}) + liberr.ErrIsNil(ctx, err, "导入excel失败") + //3、读取导入的excel数据 + jgts, err1 := ExcelRead(ctx, coryCommon.FileToFunc(path, 2)) + liberr.ErrIsNil(ctx, err1, "读取excel数据失败") + //4、存储excel数据 + payrollList := make([]model.BusPayrollListInfoRes, len(jgts)) + errResult = copier.Copy(&payrollList, jgts) + liberr.ErrIsNil(ctx, errResult, "复制数据失败") + for i := range payrollList { + payrollList[i].Pid = id + } + _, err2 := dao.BusPayrollList.Ctx(ctx).Insert(payrollList) + liberr.ErrIsNil(ctx, err2, "存储excel数据失败") + }) + return err + }) + return +} + +func (s *sBusPayrollList) List(ctx context.Context, req *system.BusPayrollListSearchReq) (listRes *system.BusPayrollListSearchRes, err error) { + listRes = new(system.BusPayrollListSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + var sfz []string + if req.LabourService > 0 && req.GroupID > 0 { + sfz, err = lb(ctx, req.LabourService, req.GroupID) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + } else if req.LabourService > 0 { + sfz, err = lw(ctx, req.LabourService) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + } else if req.GroupID > 0 { + sfz, err = bz(ctx, req.GroupID) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + } + + m := dao.BusPayrollList.Ctx(ctx).WithAll() + if len(sfz) > 0 { + m = m.WhereIn(dao.BusPayrollList.Columns().IdentityCard, sfz) + } else { + return + } + var res []*model.BusPayrollListInfoRes + err = m.Fields(system.BusPayrollListSearchRes{}).Order("id asc").Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusPayrollListListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusPayrollListListRes{ + Id: v.Id, + Name: v.Name, + IdentityCard: v.IdentityCard, + ContactWay: v.ContactWay, + TeamOrGroup: v.TeamOrGroup, + TypeOfWork: v.TypeOfWork, + AttendanceTime: v.AttendanceTime, + ActualWorkload: v.ActualWorkload, + Quantity: v.Quantity, + XDay: v.XDay, + XMonth: v.XMonth, + OvertimeWage: v.OvertimeWage, + Salary: v.Salary, + AmountWithheld: v.AmountWithheld, + AmountPaid: v.AmountPaid, + DeductOther: v.DeductOther, + AmountPaidOut: v.AmountPaidOut, + ReleaseMode: v.ReleaseMode, + CreditCardNumbers: v.CreditCardNumbers, + OpeningBank: v.OpeningBank, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + } + } + //对数据进行函数sum求和 + value, err2 := m.Fields("sum(amount_paid_out)").Value() + liberr.ErrIsNil(ctx, err2, "金额汇总失败") + listRes.Money = value.String() + //当前指定年月,有那些劳务或班组有数据(根据下面的身份证去查询用户,如何筛选出班组和劳务的主键ID) + sfzArray, _ := dao.BusPayrollList.Ctx(ctx).Where("pid", req.Pid).Fields(dao.BusPayrollList.Columns().IdentityCard).Group(dao.BusPayrollList.Columns().IdentityCard).Array() + var inSfz []string + for i := range sfzArray { + s2 := sfzArray[i].String() + if s2 == "" { + continue + } + inSfz = append(inSfz, s2) + } + if len(inSfz) == 0 { + return + } + var u []*model.BusConstructionUserInfoRes + columns := dao.BusConstructionUser.Columns() + dao.BusConstructionUser.Ctx(ctx).WhereIn(columns.SfzNumber, inSfz).Fields(columns.TeamId, columns.LabourserviceId).Scan(&u) + for _, userListRes := range u { + listRes.Lw = append(listRes.Lw, userListRes.LabourserviceId) + listRes.Bz = append(listRes.Bz, userListRes.TeamId) + } + listRes.Lw = removeDuplicates(listRes.Lw) + listRes.Bz = removeDuplicates(listRes.Bz) + }) + return +} + +func removeDuplicates(s []int64) []int64 { + // 创建一个map,键类型为切片元素类型,值类型这里用空结构体,因为只关心键的存在与否 + seen := make(map[int64]struct{}) + result := []int64{} + for _, v := range s { + if v == 0 { + continue + } + if _, ok := seen[v]; !ok { + seen[v] = struct{}{} + result = append(result, v) + } + } + return result +} + +func (s *sBusPayrollList) GetById(ctx context.Context, id int64) (res *model.BusPayrollListInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusPayrollList.Ctx(ctx).WithAll().Where(dao.BusPayrollList.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusPayrollList) Add(ctx context.Context, req *system.BusPayrollListAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusPayrollList.Ctx(ctx).Insert(do.BusPayrollList{}) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusPayrollList) Edit(ctx context.Context, req *system.BusPayrollListEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusPayrollList.Ctx(ctx).WherePri(req.Id).Update(do.BusPayrollList{}) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusPayrollList) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusPayrollList.Ctx(ctx).Delete(dao.BusPayrollList.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +//=================================================== +//=================================================== +//=================================================== + +// ExcelRead 读取excel数据 +func ExcelRead(ctx context.Context, path string) (jgts []*model.JieGouTi, err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、读取excel + f, err := excelize.OpenFile(path) + liberr.ErrIsNil(ctx, err, "无法读取excel") + defer func() { + f.Close() + }() + + //2、遍历所有工作簿 + sheetList := f.GetSheetList() + for i := range sheetList { + fmt.Println("? ", sheetList[i]) + //3、获取工作簿上的数据 + rows, err := f.GetRows(sheetList[i]) + liberr.ErrIsNil(ctx, err) + //4、数据转存到结构体 + for num, row := range rows { + //跳过标题 + if num < 7 { + continue + } + //达到合计表示结束了 + if row[0] == "合计" { + break + } + //将数据给到结构体 + var structData model.JieGouTi + for numj, colCell := range row { + structValue := reflect.ValueOf(&structData).Elem() + err = setFieldByIndex(structValue, numj, colCell) + liberr.ErrIsNil(ctx, err) + } + jgts = append(jgts, &structData) + } + } + return + }) + return +} + +// 通过反射直接给某个字段赋值 +func setFieldByIndex(structValue reflect.Value, index int, value interface{}) error { + structType := structValue.Type() + if index < 0 || index >= structType.NumField() { + //return fmt.Errorf("索引超出结构体字段范围") + return nil + } + field := structType.Field(index) + fieldValue := structValue.Field(index) + if !fieldValue.CanSet() { + return fmt.Errorf("字段不可设置") + } + newValue := reflect.ValueOf(value) + if newValue.Type() != field.Type { + return fmt.Errorf("%s -赋值类型不匹配,期望类型:%s,实际类型:%s", field.Name, field.Type, newValue.Type()) + } + fieldValue.Set(newValue) + return nil +} + +// 通过劳务获取到对应施工人员的身份证号码 +func lw(ctx context.Context, id int64) (sfzList []string, err error) { + array, err := dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().LabourserviceId, id).Fields("sfz_number").Array() + for i := range array { + sfzList = append(sfzList, array[i].String()) + } + return +} + +// 通过班组获取到对应施工人员的身份证号码 +func bz(ctx context.Context, id int64) (sfzList []string, err error) { + array, err := dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().TeamId, id).Fields("sfz_number").Array() + for i := range array { + sfzList = append(sfzList, array[i].String()) + } + return +} + +// 通过劳务+班组获取到对应施工人员的身份证号码 +func lb(ctx context.Context, lwID int64, bzId int64) (sfzList []string, err error) { + array, err := dao.BusConstructionUser.Ctx(ctx). + Where(dao.BusConstructionUser.Columns().LabourserviceId, lwID). + Where(dao.BusConstructionUser.Columns().TeamId, bzId). + Fields("sfz_number").Array() + for i := range array { + sfzList = append(sfzList, array[i].String()) + } + return +} diff --git a/internal/app/system/logic/busProjectinProgress/bus_projectin_progress.go b/internal/app/system/logic/busProjectinProgress/bus_projectin_progress.go new file mode 100644 index 0000000..a94efc8 --- /dev/null +++ b/internal/app/system/logic/busProjectinProgress/bus_projectin_progress.go @@ -0,0 +1,116 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-03-20 19:45:19 +// 生成路径: internal/app/system/logic/bus_projectin_progress.go +// 生成人:gfast +// desc:在建项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterBusProjectinProgress(New()) +} + +func New() *sBusProjectinProgress { + return &sBusProjectinProgress{} +} + +type sBusProjectinProgress struct{} + +func (s *sBusProjectinProgress) List(ctx context.Context, req *system.BusProjectinProgressSearchReq) (listRes *system.BusProjectinProgressSearchRes, err error) { + listRes = new(system.BusProjectinProgressSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusProjectinProgress.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.BusProjectinProgress.Columns().Id+" = ?", req.Id) + } + if req.ProjectId != "" { + m = m.Where(dao.BusProjectinProgress.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + if req.ParallelIn != "" { + m = m.Where(dao.BusProjectinProgress.Columns().ParallelIn+" = ?", gconv.Int(req.ParallelIn)) + } + if req.CreatedBy != "" { + m = m.Where(dao.BusProjectinProgress.Columns().CreatedBy+" = ?", gconv.Time(req.CreatedBy)) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusProjectinProgressInfoRes + err = m.Fields(system.BusProjectinProgressSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusProjectinProgressListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusProjectinProgressListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + ParallelIn: v.ParallelIn, + CreatedBy: v.CreatedBy, + } + } + }) + return +} + +func (s *sBusProjectinProgress) GetById(ctx context.Context, id int64) (res *model.BusProjectinProgressInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusProjectinProgress.Ctx(ctx).WithAll().Where(dao.BusProjectinProgress.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusProjectinProgress) Add(ctx context.Context, req *system.BusProjectinProgressAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusProjectinProgress.Ctx(ctx).Insert(do.BusProjectinProgress{ + ProjectId: req.ProjectId, + ParallelIn: req.ParallelIn, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusProjectinProgress) Edit(ctx context.Context, req *system.BusProjectinProgressEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusProjectinProgress.Ctx(ctx).WherePri(req.Id).Update(do.BusProjectinProgress{ + ProjectId: req.ProjectId, + ParallelIn: req.ParallelIn, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusProjectinProgress) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusProjectinProgress.Ctx(ctx).Delete(dao.BusProjectinProgress.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busQuality/bus_quality.go b/internal/app/system/logic/busQuality/bus_quality.go new file mode 100644 index 0000000..fdd167a --- /dev/null +++ b/internal/app/system/logic/busQuality/bus_quality.go @@ -0,0 +1,411 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-02 17:11:39 +// 生成路径: internal/app/system/logic/bus_quality.go +// 生成人:gfast +// desc:质量文档管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "encoding/json" + "errors" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + commonEntity "github.com/tiger1103/gfast/v3/internal/app/common/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + wxDao "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + wxModel "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" + "github.com/tiger1103/gfast/v3/library/liberr" + "strconv" + "strings" +) + +func init() { + service.RegisterBusQuality(New()) +} + +func New() *sBusQuality { + return &sBusQuality{} +} + +type sBusQuality struct{} + +func (s *sBusQuality) WxAddFunc(ctx context.Context, req *system.WxBusQualityAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + req.QualityDocument[0].Url = strings.ReplaceAll(req.QualityDocument[0].Url, "/file", "/wxfile") + "," + _, err = dao.BusQuality.Ctx(ctx).Insert(do.BusQuality{ + QualityName: req.QualityName, + QualityExplain: req.QualityExplain, + QualityDocument: req.QualityDocument[0].Url, + QualityType: req.QualityType, + ProjectId: req.ProjectId, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusQuality) QualityDataListFunc(ctx context.Context, req *system.QualityDataListReq) (listRes *system.QualityDataListRes, err error) { + var ufList []*comModel.UpFile + listRes = new(system.QualityDataListRes) + err = g.Try(ctx, func(ctx context.Context) { + sql := dao.BusQuality.Ctx(ctx).Where("quality_type", req.QualityType).Where("project_id", req.ProjectId) + + if req.IsPaging == "YES" || req.IsPaging == "yes" { + listRes.Total, err = sql.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + sql = sql.Page(req.PageNum, req.PageSize).Order(order) + } + + var res []*model.BusQualityListRes + err = sql.Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusQualityListRes, len(res)) + for k, v := range res { + if err == nil { + split := strings.Split(v.QualityDocument, ";") + for _, data := range split { + var uf *comModel.UpFile + err := json.Unmarshal([]byte(data), &uf) + if err != nil { + uf = new(comModel.UpFile) + uf.Name = v.QualityName + uf.Url = v.QualityDocument + } + ufList = append(ufList, uf) + } + } + listRes.List[k] = &model.BusQualityListRes{ + Id: v.Id, + QualityName: v.QualityName, + QualityExplain: v.QualityExplain, + QualityDocumentObj: ufList, + QualityType: v.QualityType, + ProjectId: v.ProjectId, + Status: v.Status, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusQuality) QualityFunc(ctx context.Context, req *system.QualityReq) (res *system.QualityRes, err error) { + res = new(system.QualityRes) + var dictList []*commonEntity.SysDictData + g.DB().Model("sys_dict_data").Ctx(ctx).Where("dict_type", "quality_type").Scan(&dictList) + if len(dictList) > 0 { + //1、计算得到数量 + var oneList []*system.QualityListRes + for _, data := range dictList { + sql := dao.BusQuality.Ctx(ctx).Where("project_id", req.ProjectId).Where("quality_type", data.DictValue) + //2、获取数量 + count, _ := sql.Count() + var twoList = new(system.QualityListRes) + twoList.QualityType = data.DictValue + twoList.QualityName = data.DictLabel + twoList.QualityNumber = count + oneList = append(oneList, twoList) + } + //总数累加 + num := 0.00 + for _, dada := range oneList { + num = num + float64(dada.QualityNumber) + dada.Proportion = "0" + } + //计算百分比 + if num != 0 { + for _, dada := range oneList { + bai := 100.00 / float64(num) * float64(dada.QualityNumber) + dada.Proportion = strconv.FormatFloat(bai, 'f', 2, 64) + } + } + res.List = oneList + } + return +} + +func (s *sBusQuality) GraphDataListFunc(ctx context.Context, req *system.GraphDataListReq) (listRes *system.GraphDataListRes, err error) { + listRes = new(system.GraphDataListRes) + + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + + var graphDataList []*system.GraphDataListTwoRes + if req.GraphStatus != "0" { //1、GraphStatus非0查询 + var DataList []*model.BusSafetyListRes + g1 := dao.BusSafety.Ctx(ctx).Where("safety_type", req.GraphStatus).Where("project_id", req.ProjectId).OrderDesc("created_at") + count, err := g1.Count() + listRes.Total = count + liberr.ErrIsNil(ctx, err, "获取总行数失败") + err = g1.Page(req.PageNum, req.PageSize).Order(order).Scan(&DataList) + for _, data := range DataList { + var graphDataOne = new(system.GraphDataListTwoRes) + graphDataOne.Id = data.Id + graphDataOne.Name = data.SafetyName + graphDataOne.DateTime = data.CreatedAt + graphDataOne.Type = "1" + graphDataList = append(graphDataList, graphDataOne) + } + } else { //2、GraphStatus 0查询 站班会 + var DataList []*wxModel.SysProjectTeamSquadListRes + g1 := wxDao.SysProjectTeamSquad.Ctx(ctx).Where("project_id", req.ProjectId).OrderDesc("created_at") + count, _ := g1.Count() + listRes.Total = count + err = g1.Page(req.PageNum, req.PageSize).Order(order).Scan(&DataList) + for _, data := range DataList { + var graphDataOne = new(system.GraphDataListTwoRes) + graphDataOne.Id = data.Id + graphDataOne.Name = "站班会" + graphDataOne.DateTime = data.CreatedAt + graphDataOne.Type = "0" + graphDataList = append(graphDataList, graphDataOne) + } + } + listRes.GraphDataList = graphDataList + return +} + +func (s *sBusQuality) GraphFunc(ctx context.Context, req *system.GraphReq) (listRes *system.GraphRes, err error) { + listRes = new(system.GraphRes) + var graphList []*system.GraphListRes + + //1、统计站班会 + count, err := wxDao.SysProjectTeamSquad.Ctx(ctx).Where("project_id", req.ProjectId).Count() + var graphData = new(system.GraphListRes) + graphData.GraphStatus = "0" + graphData.GraphName = "站班会" + graphData.GraphNumber = count + graphList = append(graphList, graphData) + //2、统计例会表bus_safety + var dictList []*commonEntity.SysDictData + g.DB().Model("sys_dict_data").Ctx(ctx).Where("dict_type", "safety_type").Scan(&dictList) + if len(dictList) > 0 { + for _, dataList := range dictList { + var graphData = new(system.GraphListRes) + count, err2 := dao.BusSafety.Ctx(ctx).Where("safety_type", dataList.DictValue).Where("project_id", req.ProjectId).Count() + if err2 != nil { + return + } + graphData.GraphStatus = dataList.DictValue + graphData.GraphName = dataList.DictLabel + graphData.GraphNumber = count + graphList = append(graphList, graphData) + } + } + //3、返回数据 + listRes.GraphList = graphList + return +} + +func (s *sBusQuality) List(ctx context.Context, req *system.BusQualitySearchReq) (listRes *system.BusQualitySearchRes, err error) { + listRes = new(system.BusQualitySearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusQuality.Ctx(ctx).WithAll() + if req.ProjectId != "" { + m = m.Where(dao.BusQuality.Columns().ProjectId, req.ProjectId) + } + if req.QualityName != "" { + m = m.Where(dao.BusQuality.Columns().QualityName+" like ?", "%"+req.QualityName+"%") + } + if req.QualityType != "" { + m = m.Where(dao.BusQuality.Columns().QualityType+" = ?", req.QualityType) + } + if req.Status != "" { + m = m.Where(dao.BusQuality.Columns().Status+" = ?", req.Status) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusQuality.Columns().CreatedAt+" >=? AND "+dao.BusQuality.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusQualityInfoRes + err = m.Fields(system.BusQualitySearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusQualityListRes, len(res)) + for k, v := range res { + //qualityDocument := ([]*comModel.UpFile)(nil) + //err = gjson.DecodeTo(v.QualityDocument, &qualityDocument) + //liberr.ErrIsNil(ctx, err) + listRes.List[k] = &model.BusQualityListRes{ + Id: v.Id, + QualityName: v.QualityName, + QualityExplain: v.QualityExplain, + QualityDocument: v.QualityDocument, + QualityType: v.QualityType, + ProjectId: v.ProjectId, + Status: v.Status, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusQuality) GetById(ctx context.Context, id uint64) (res *model.BusQualityInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + var ufList []*comModel.UpFile + err = dao.BusQuality.Ctx(ctx).WithAll().Where(dao.BusQuality.Columns().Id, id).Scan(&res) + if err == nil { + split := strings.Split(res.QualityDocument, ";") + for _, data := range split { + var uf *comModel.UpFile + err := json.Unmarshal([]byte(data), &uf) + if err != nil { + uf = new(comModel.UpFile) + uf.Name = res.QualityName + uf.Url = res.QualityDocument + } + ufList = append(ufList, uf) + } + } + res.QualityDocumentObj = ufList + liberr.ErrIsNil(ctx, err, "获取信息失败") + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusQualityInfoRes) + res = &infoRes + }) + return +} + +func (s *sBusQuality) Add(ctx context.Context, req *system.BusQualityAddReq) (err error) { + if len(req.QualityDocument) > 2 { + err = errors.New("最多仅支持2个文件!") + return err + } + err = g.Try(ctx, func(ctx context.Context) { + //for _, obj := range req.QualityDocument { + // obj.Url, err = libUtils.GetFilesPath(ctx, obj.Url) + // liberr.ErrIsNil(ctx, err) + //} + + quality := do.BusQuality{ + QualityName: req.QualityName, + QualityExplain: req.QualityExplain, + QualityType: req.QualityType, + ProjectId: req.ProjectId, + } + + if req.WxOrPc != "1" { + req.WxOrPc = "2" + quality.CreateBy = req.Openid + if len(req.QualityDocument) > 0 { + for i := range req.QualityDocument { + req.QualityDocument[i].Url = strings.Replace(req.QualityDocument[0].Url, "file", "wxfile", 1) + } + } + } else { + quality.CreateBy = ct.New().GetLoginUser(ctx).Id + } + quality.UserType = req.WxOrPc + if len(req.QualityDocument) > 0 { + var str = "" + for _, data := range req.QualityDocument { + marshal, _ := json.Marshal(data) + str = str + string(marshal) + ";" + } + if len(str) > 0 { + quality.QualityDocument = str[:len(str)-1] + } + } + + _, err = dao.BusQuality.Ctx(ctx).Insert(quality) + + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusQuality) Edit(ctx context.Context, req *system.BusQualityEditReq) (err error) { + if len(req.QualityDocument) > 2 { + err = errors.New("最多仅支持2个文件!") + return err + } + err = g.Try(ctx, func(ctx context.Context) { + quality := do.BusQuality{ + QualityName: req.QualityName, + QualityExplain: req.QualityExplain, + QualityType: req.QualityType, + ProjectId: req.ProjectId, + Status: req.Status, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + } + + if req.WxOrPc != "1" { + req.WxOrPc = "2" + quality.CreateBy = req.Openid + if len(req.QualityDocument) > 0 { + for i := range req.QualityDocument { + req.QualityDocument[i].Url = strings.Replace(req.QualityDocument[0].Url, "file", "wxfile", 1) + } + } + } else { + quality.UserType = ct.New().GetLoginUser(ctx).Id + } + quality.UserType = req.WxOrPc + if len(req.QualityDocument) > 0 { + var str = "" + for _, data := range req.QualityDocument { + marshal, _ := json.Marshal(data) + str = str + string(marshal) + ";" + } + if len(str) > 0 { + quality.QualityDocument = str[:len(str)-1] + } + } + _, err = dao.BusQuality.Ctx(ctx).WherePri(req.Id).Update(quality) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusQuality) Delete(ctx context.Context, ids []uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusQuality.Ctx(ctx).Delete(dao.BusQuality.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busQuestionBank/bus_question_bank.go b/internal/app/system/logic/busQuestionBank/bus_question_bank.go new file mode 100644 index 0000000..685e70f --- /dev/null +++ b/internal/app/system/logic/busQuestionBank/bus_question_bank.go @@ -0,0 +1,145 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-10-07 15:52:18 +// 生成路径: internal/app/system/logic/bus_question_bank.go +// 生成人:gfast +// desc:题库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterBusQuestionBank(New()) +} + +func New() *sBusQuestionBank { + return &sBusQuestionBank{} +} + +type sBusQuestionBank struct{} + +func (s *sBusQuestionBank) List(ctx context.Context, req *system.BusQuestionBankSearchReq) (listRes *system.BusQuestionBankSearchRes, err error) { + listRes = new(system.BusQuestionBankSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusQuestionBank.Ctx(ctx).WithAll() + if req.CategoryId != "" { + m = m.Where(dao.BusQuestionBank.Columns().CategoryId+" = ?", gconv.Int64(req.CategoryId)) + } + if req.QuestionType != "" { + m = m.Where(dao.BusQuestionBank.Columns().QuestionType+" = ?", req.QuestionType) + } + if req.QuestionText != "" { + m = m.Where(dao.BusQuestionBank.Columns().QuestionText+" like ?", "%"+req.QuestionText+"%") + } + //创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.BusQuestionBank.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusQuestionBank.Columns().CreatedAt+" >=? AND "+dao.BusQuestionBank.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusQuestionBankInfoRes + err = m.Fields(system.BusQuestionBankSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusQuestionBankListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusQuestionBankListRes{ + Id: v.Id, + CategoryId: v.CategoryId, + LinkedCategoryId: v.LinkedCategoryId, + QuestionType: v.QuestionType, + QuestionText: v.QuestionText, + Options: v.Options, + CorrectAnswer: v.CorrectAnswer, + Score: v.Score, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusQuestionBank) GetById(ctx context.Context, id int64) (res *model.BusQuestionBankInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusQuestionBank.Ctx(ctx).WithAll().Where(dao.BusQuestionBank.Columns().Id, id).Scan(&res) + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusQuestionBankInfoRes) + res = &infoRes + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusQuestionBank) Add(ctx context.Context, req *system.BusQuestionBankAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusQuestionBank.Ctx(ctx).Insert(do.BusQuestionBank{ + CategoryId: req.CategoryId, + QuestionType: req.QuestionType, + QuestionText: req.QuestionText, + Options: req.Options, + CorrectAnswer: req.CorrectAnswer, + //Score:req.Score, + WxOrPc: req.WxOrPc, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusQuestionBank) Edit(ctx context.Context, req *system.BusQuestionBankEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusQuestionBank.Ctx(ctx).WherePri(req.Id).Update(do.BusQuestionBank{ + CategoryId: req.CategoryId, + QuestionType: req.QuestionType, + QuestionText: req.QuestionText, + Options: req.Options, + CorrectAnswer: req.CorrectAnswer, + //Score:req.Score, + WxOrPc: req.WxOrPc, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusQuestionBank) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusQuestionBank.Ctx(ctx).Delete(dao.BusQuestionBank.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busQuestionSave/bus_question_save.go b/internal/app/system/logic/busQuestionSave/bus_question_save.go new file mode 100644 index 0000000..3a84033 --- /dev/null +++ b/internal/app/system/logic/busQuestionSave/bus_question_save.go @@ -0,0 +1,807 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-11-01 17:33:04 +// 生成路径: internal/app/system/logic/bus_question_save.go +// 生成人:gfast +// desc:用户试卷存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "fmt" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/jung-kurt/gofpdf" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + wxModel "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" + "github.com/tiger1103/gfast/v3/library/liberr" + "os" + "path/filepath" + "regexp" + "sort" + "strconv" + "strings" +) + +func init() { + service.RegisterBusQuestionSave(New()) +} + +func New() *sBusQuestionSave { + return &sBusQuestionSave{} +} + +type sBusQuestionSave struct{} + +//func (s *sBusQuestionSave) WeChatPdfWoFunc(ctx context.Context, req *system.WeChatPdfWoReq) (listRes *system.WeChatPdfWoRes, err error) { +// listRes = new(system.WeChatPdfWoRes) +// err = g.Try(ctx, func(ctx context.Context) { +// mp := make(map[string]*model.ModelWeChatPdfWoRes) +// //0、获取配置信息 +// var configurationEntity *model.BusQuestionsConfigurationInfoRes +// err = dao.BusQuestionsConfiguration.Ctx(ctx).Limit(1).Scan(&configurationEntity) +// liberr.ErrIsNil(ctx, err, "查询失败") +// leftjion := "" +// if req.ProjectId > 0 && req.TeamId == 0 { //查项目 +// leftjion = "b.openid = a.openid and b.project_id = '" + strconv.FormatInt(req.ProjectId, 10) + "' and b.deleted_at is null" +// } +// if req.ProjectId > 0 && req.TeamId > 0 { //查项目+班组 +// leftjion = "b.openid = a.openid and b.project_id = '" + strconv.FormatInt(req.ProjectId, 10) + "' and team_id = '" + strconv.FormatInt(req.TeamId, 10) + "' and b.deleted_at is null" +// } +// //1、获取线上的试卷信息 +// var mwor []*model.ModelWeChatPdfWoRes +// m := dao.BusQuestionSave.Ctx(ctx).As("a").Fields(`a.openid, +// b.user_name as userName, +// a.pass, +// (select sum( score ) from bus_question_save WHERE correct = 1 and openid = a.openid) as sumScore, +// c.path, +// a.time_out as timeOut, +// a.take_time as takeTime, +// a.created_at as createdAt`). +// RightJoin("bus_construction_user", "b", leftjion). +// LeftJoin("bus_question_save_pdf", "c", "c.openid = b.openid"). +// Where(`a.pass is not null`) +// //if strings.EqualFold(req.IsPaging, "YES") { +// array, err := m.Array() +// listRes.Total = len(array) +// if err != nil { +// liberr.ErrIsNil(ctx, err, "获取总行数失败") +// return +// } +// if req.PageNum == 0 { +// req.PageNum = 1 +// } +// listRes.CurrentPage = req.PageNum +// if req.PageSize == 0 { +// req.PageSize = consts.PageSize +// } +// m = m.Page(req.PageNum, req.PageSize) +// //} +// order := "a.created_at" +// if req.OrderBy != "" { +// order = req.OrderBy +// } +// err = m.Order(order).Scan(&mwor) +// for i := range mwor { +// mwor[i].TakeTimeStr = formatTime(mwor[i].TakeTime) +// mwor[i].TimeOutStr = formatTime(mwor[i].TimeOut * 60) +// mwor[i].Type = "1" //pdf +// mp[mwor[i].Openid] = mwor[i] +// } +// //2、获取线下的试卷信息 +// var tj = "b.openid = a.openid and b.project_id = '" + strconv.FormatInt(req.ProjectId, 10) + "'" +// if req.TeamId != 0 { +// tj = tj + " and team_id = '" + strconv.FormatInt(req.TeamId, 10) + "'" +// } +// tj = tj + " and b.deleted_at is null" +// var offlineEnitnty []*model.ModelWeChatPdfWoRes +// err = g.DB().Model("bus_question_offline").As("a"). +// Fields( +// "a.openid,"+ +// "b.user_name as userName,"+ +// "concat_ws( ',',a.pass,a.full_mark ) as pass,"+ +// "a.score as sumScore,"+ +// "a.img as path,"). +// LeftJoin("bus_construction_user", "b", tj).Scan(&offlineEnitnty) +// //3、数据信息合并(同一个人选取最大分数的试卷信息) +// for i := range offlineEnitnty { +// //如果发现有重复的openid,那么就选取得分最大的 +// mpdata, ok := mp[offlineEnitnty[i].Openid] +// if ok { +// mpdataSplit := strings.Split(mpdata.Pass, ",") +// mpdataFloat, _ := strconv.ParseFloat(mpdataSplit[1], 64) +// mpdataScore, _ := strconv.ParseFloat(mpdata.SumScore, 64) +// mpdataScoreOne := 100.00 / mpdataFloat * mpdataScore +// offlineSplit := strings.Split(offlineEnitnty[i].Pass, ",") +// offlineFloat, _ := strconv.ParseFloat(offlineSplit[1], 64) +// offlineScore, _ := strconv.ParseFloat(offlineEnitnty[i].SumScore, 64) +// offlineScoreTwo := 100.00 / offlineFloat * offlineScore +// if mpdataScoreOne < offlineScoreTwo { +// offlineEnitnty[i].Type = "2" //图片 +// mp[offlineEnitnty[i].Openid] = offlineEnitnty[i] +// } +// } else { //没有重复的就直接给 +// if offlineEnitnty[i].UserName != "" { +// offlineEnitnty[i].Type = "2" //图片 +// mp[offlineEnitnty[i].Openid] = offlineEnitnty[i] +// } +// } +// } +// var r []*model.ModelWeChatPdfWoRes +// for _, v := range mp { +// r = append(r, v) +// } +// listRes.List = r +// liberr.ErrIsNil(ctx, err, "获取数据失败") +// }) +// return +//} + +func (s *sBusQuestionSave) WeChatPdfWoFunc(ctx context.Context, req *system.WeChatPdfWoReq) (listRes *system.WeChatPdfWoRes, err error) { + listRes = new(system.WeChatPdfWoRes) + err = g.Try(ctx, func(ctx context.Context) { + r, err := WeChatPdfWo(ctx, req) + liberr.ErrIsNil(ctx, err, "获取数据失败") + //排序然后进行代码分页 + sortByNames(r) + lenI := len(r) + listRes.Total = lenI + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + var num = req.PageNum*req.PageSize - req.PageSize + var mun = req.PageSize + num + if mun > lenI { + mun = lenI + } else { + mun = req.PageSize + num + } + if req.Name != "" { //有查询条件就从第0个走 + r = r[0:mun] + } else { + r = r[num:mun] + } + listRes.List = r + liberr.ErrIsNil(ctx, err, "获取数据失败") + }) + return +} + +func WeChatPdfWo(ctx context.Context, req *system.WeChatPdfWoReq) (r []*model.ModelWeChatPdfWoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + mp := make(map[string]*model.ModelWeChatPdfWoRes) + //0、获取配置信息 + var configurationEntity *model.BusQuestionsConfigurationInfoRes + err = dao.BusQuestionsConfiguration.Ctx(ctx).Limit(1).Scan(&configurationEntity) + liberr.ErrIsNil(ctx, err, "查询失败") + //1、获取线上的试卷信息 + leftjion := "" + if req.ProjectId > 0 && req.TeamId == 0 { //查项目 + leftjion = "a.project_id = '" + strconv.FormatInt(req.ProjectId, 10) + "' and b.user_name like '%" + req.Name + "%'" + } + if req.ProjectId > 0 && req.TeamId > 0 { //查项目+班组 + leftjion = "a.project_id = '" + strconv.FormatInt(req.ProjectId, 10) + "' and b.team_id = '" + strconv.FormatInt(req.TeamId, 10) + "' and b.user_name like '%" + req.Name + "%'" + } + //2、获取线下的试卷信息 + var tj = "a.project_id = '" + strconv.FormatInt(req.ProjectId, 10) + "' and b.user_name like '%" + req.Name + "%'" + if req.TeamId != 0 { + tj = tj + " and b.team_id = '" + strconv.FormatInt(req.TeamId, 10) + "'" + } + //3、数据合并 + var mwor []*model.ModelWeChatPdfWoRes + sql := `SELECT + openid, + user_name AS userName, + pass, + sumScore, + path, + timeOut, + takeTime, + createdAt, + oto + FROM + ( + SELECT + a.openid, + b.user_name, + a.pass, + ( + SELECT + SUM(score) + FROM + bus_question_save + WHERE + correct = 1 + AND openid = a.openid + ) AS sumScore, + c.path, + a.time_out AS timeOut, + a.take_time AS takeTime, + a.created_at AS createdAt, + '1' as oto + FROM + bus_question_save AS a + RIGHT JOIN bus_construction_user AS b ON (` + "b.openid = a.openid and b.deleted_at is null" + `) + LEFT JOIN bus_question_save_pdf AS c ON (c.openid = b.openid) + WHERE + ` + leftjion + ` + AND a.pass IS NOT NULL + AND a.deleted_at IS NULL + AND b.deleted_at IS NULL + + UNION ALL + + SELECT + a.openid, + b.user_name, + CONCAT_WS(',', a.pass, a.full_mark) AS pass, + a.score AS sumScore, + a.img AS path, + NULL AS timeOut, + NULL AS takeTime, + a.created_at AS createdAt, + '2' as oto + FROM + bus_question_offline AS a + LEFT JOIN bus_construction_user AS b ON (` + "b.openid = a.openid and b.deleted_at is null" + `) + WHERE + ` + tj + ` + AND b.deleted_at IS NULL + ) AS merged_data;` + err := g.DB().Raw(sql).Scan(&mwor) + liberr.ErrIsNil(ctx, err, "获取数据失败") + for i := range mwor { + mwor[i].TakeTimeStr = formatTime(mwor[i].TakeTime) + mwor[i].TimeOutStr = formatTime(mwor[i].TimeOut * 60) + mwor[i].Type = "1" //pdf + mp[mwor[i].Openid] = mwor[i] + } + //3、数据信息合并(同一个人选取最大分数的试卷信息) + for i := range mwor { + //如果发现有重复的openid,那么就选取得分最大的 + mpdata, ok := mp[mwor[i].Openid] + if ok { + //mp里面的分数 + mpdataSplit := strings.Split(mpdata.Pass, ",") + mpdataFloat, _ := strconv.ParseFloat(mpdataSplit[1], 64) + mpdataScore, _ := strconv.ParseFloat(mpdata.SumScore, 64) + mpdataScoreOne := 100.00 / mpdataFloat * mpdataScore + //当前分数 + offlineSplit := strings.Split(mwor[i].Pass, ",") + offlineFloat, _ := strconv.ParseFloat(offlineSplit[1], 64) + offlineScore, _ := strconv.ParseFloat(mwor[i].SumScore, 64) + offlineScoreTwo := 100.00 / offlineFloat * offlineScore + if mpdataScoreOne < offlineScoreTwo { + mwor[i].Type = "2" //图片 + mp[mwor[i].Openid] = mwor[i] + } + } + //else { //没有重复的就直接给 + // if offlineEnitnty[i].UserName != "" { + // offlineEnitnty[i].Type = "2" //图片 + // mp[offlineEnitnty[i].Openid] = offlineEnitnty[i] + // } + //} + } + for _, v := range mp { + if v.UserName != "" { + r = append(r, v) + } + } + }) + return +} + +// 定义排序函数 +func sortByNames(slice []*model.ModelWeChatPdfWoRes) { + // 使用 sort.Slice 函数进行排序 + sort.Slice(slice, func(i, j int) bool { + return slice[i].UserName < slice[j].UserName // 按照 name 字段升序排序 + }) +} + +func formatTime(seconds int64) string { + hours := seconds / 3600 // 计算小时数 + minutes := (seconds % 3600) / 60 // 计算分钟数 + seconds = seconds % 60 // 计算剩余的秒数 + var result = "" + if minutes == 0 { + result = fmt.Sprintf("%02d秒", seconds) + } else if hours == 0 { + result = fmt.Sprintf("%02d分%02d秒", minutes, seconds) + } else { + result = fmt.Sprintf("%02d时%02d分%02d秒", hours, minutes, seconds) + } + return result +} + +func (s *sBusQuestionSave) PassOrNotFunc(ctx context.Context, openid string) (res *system.PassOrNotRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + res = new(system.PassOrNotRes) + bqs := dao.BusQuestionSave.Ctx(ctx).Where("openid", openid).Safe() + //1、查询及格分和满分 + value1, err := bqs.Fields("pass").Value() + if value1 == nil { + res.IsPass = "3" + return + } + liberr.ErrIsNil(ctx, err, "获取信息失败") + //2、查询用户所答对的分数 + value2, err := bqs.Fields("sum(score) as sumScore").Where("correct", "1").Value() + liberr.ErrIsNil(ctx, err, "获取信息失败") + //2.5、获取线下考试分数、计算得到最终及格线分数 + var offlineEnitnty *model.ModelWeChatPdfWoRes + err = g.DB().Model("bus_question_offline").As("a"). + Fields( + "a.openid,"+ + "b.user_name as userName,"+ + "concat_ws(a.pass,',',a.full_mark) asc pass,"+ + "a.score as sumScore,"+ + "a.img as path,"). + RightJoin( + "bus_construction_user", + "b", + "b.openid = a.openid and b.deleted_at is null"). + Where("a.openid", openid). + Scan(&offlineEnitnty) + liberr.ErrIsNil(ctx, err, "获取信息失败") + var scoreOne float64 + if offlineEnitnty != nil { + offlineSplit := strings.Split(offlineEnitnty.Pass, ",") + offlineFloat, _ := strconv.ParseFloat(offlineSplit[1], 64) + offlineScore, _ := strconv.ParseFloat(offlineEnitnty.SumScore, 64) + scoreOne = 100.00 / offlineFloat * offlineScore + } + //3、计算上次分数是否及格 + split := strings.Split(value1.String(), ",") + fullMark, _ := strconv.ParseFloat(split[1], 64) + passingGrade, _ := strconv.ParseFloat(split[0], 64) + score := 100.00 / fullMark * value2.Float64() + if scoreOne > score { + if scoreOne >= passingGrade { + res.IsPass = "1" + } else { + res.IsPass = "2" + } + res.PdfStr = offlineEnitnty.Path + res.Type = "2" //图片 + liberr.ErrIsNil(ctx, err, "获取信息失败") + } else { + if score >= passingGrade { + res.IsPass = "1" + } else { + res.IsPass = "2" + } + //4、返回上传试卷的pdf 供查看 + value3, err := g.DB().Model("bus_question_save_pdf").Ctx(ctx).Where("openid", openid).Fields("path").Value() + res.PdfStr = value3.String() + res.Type = "1" //pdf + liberr.ErrIsNil(ctx, err, "获取信息失败") + } + return + }) + return +} + +func (s *sBusQuestionSave) List(ctx context.Context, req *system.BusQuestionSaveSearchReq) (listRes *system.BusQuestionSaveSearchRes, err error) { + listRes = new(system.BusQuestionSaveSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusQuestionSave.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.BusQuestionSave.Columns().Id+" = ?", req.Id) + } + if req.Openid != "" { + m = m.Where(dao.BusQuestionSave.Columns().Openid+" = ?", req.Openid) + } + if req.BankId != "" { + m = m.Where(dao.BusQuestionSave.Columns().BankId+" = ?", gconv.Int64(req.BankId)) + } + if req.Answer != "" { + m = m.Where(dao.BusQuestionSave.Columns().Answer+" = ?", req.Answer) + } + if req.Correct != "" { + m = m.Where(dao.BusQuestionSave.Columns().Correct+" = ?", req.Correct) + } + if req.Sign != "" { + m = m.Where(dao.BusQuestionSave.Columns().Sign+" = ?", req.Sign) + } + if req.TakeTime != "" { + m = m.Where(dao.BusQuestionSave.Columns().TakeTime+" = ?", gconv.Int64(req.TakeTime)) + } + if req.TimeOut != "" { + m = m.Where(dao.BusQuestionSave.Columns().TimeOut+" = ?", gconv.Int(req.TimeOut)) + } + if req.Pass != "" { + m = m.Where(dao.BusQuestionSave.Columns().Pass+" = ?", req.Pass) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusQuestionSave.Columns().CreatedAt+" >=? AND "+dao.BusQuestionSave.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusQuestionSaveInfoRes + err = m.Fields(system.BusQuestionSaveSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusQuestionSaveListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusQuestionSaveListRes{ + Id: v.Id, + Openid: v.Openid, + BankId: v.BankId, + Answer: v.Answer, + Correct: v.Correct, + Score: v.Score, + Sign: v.Sign, + TakeTime: v.TakeTime, + TimeOut: v.TimeOut, + Pass: v.Pass, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusQuestionSave) GetById(ctx context.Context, id int64) (res *model.BusQuestionSaveInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusQuestionSave.Ctx(ctx).WithAll().Where(dao.BusQuestionSave.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusQuestionSave) Add(ctx context.Context, req *system.BusQuestionSaveAddReq) (res *system.BusQuestionSaveAddRes, err error) { + res = new(system.BusQuestionSaveAddRes) + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 获取当前用户所在的项目,将试卷与项目进行绑定(复制人员迁移将试卷也带到另外一个项目) + project, projectErr := dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().Openid, req.Openid).Fields("project_id").Value() + if projectErr != nil { + liberr.ErrIsNil(ctx, errors.New("无法确认当前用户所在项目!")) + return + } + /** + 第零部分:获取分数进行判断,判断是否存储此次试卷 + */ + var scoreOne = 0.00 //第一次分数 + var scoreTwo = 0.00 //当前考试的分数 + type spEntity struct { + SumScore float64 `p:"sumScore"` + Pass string `p:"pass"` + Sign string `p:"sign"` + } + var sp *spEntity + err = dao.BusQuestionSave.Ctx(ctx).Fields("sum( score ) AS sumScore,"+ + "( SELECT pass FROM bus_question_save WHERE openid = '"+req.Openid+"' AND deleted_at IS NULL ORDER BY id asc LIMIT 1) as pass,"+"( SELECT sign FROM bus_question_save WHERE openid = '"+req.Openid+"' AND deleted_at IS NULL ORDER BY id asc LIMIT 1) as sign"). + Where("correct", "1"). + Where("openid", req.Openid).Scan(&sp) + if err == nil { + if sp.Pass != "" { + split := strings.Split(sp.Pass, ",") + float1, _ := strconv.ParseFloat(split[1], 64) + scoreOne = 100.00 / float1 * sp.SumScore + } + } else { + return + } + /** + 第一部分:计算分数、存储 + */ + //1、获取配置信息 + var configurationEntity *model.BusQuestionsConfigurationInfoRes + err = dao.BusQuestionsConfiguration.Ctx(ctx).Limit(1).Scan(&configurationEntity) + liberr.ErrIsNil(ctx, err, "添加失败") + ////3、图片上传 + //str, err := coryCommon.UploadFile(ctx, req.Sign, coryCommon.Helmet) + //3、获取当前openid的签名,如果没有就提示“未查询到签名信息” + var signature *wxModel.BusConstructiomUserSignatureRes + err := g.DB().Model("bus_constructiom_user_signature").Where("openid", req.Openid).Scan(&signature) + liberr.ErrIsNil(ctx, err, "添加失败") + if signature == nil { + err = errors.New("未查询到签名信息") + liberr.ErrIsNil(ctx, err) + return + } + //4、存储用户答题信息 + var bqs []*do.BusQuestionSave + var fenshu = 0.0 + var number = 0 + for iii, data := range req.List { + var correct = "" + var pass = "" + //获取题库的正确答案,然后和用户的答案作对比 + var bqb *model.BusQuestionBankInfoRes + err = dao.BusQuestionBank.Ctx(ctx).WherePri(data.BankId).Scan(&bqb) + if err != nil { + err = errors.New("您的试卷被外星人卷走了!") + liberr.ErrIsNil(ctx, err) + return + } else { + if data.Answer == "" { + err = errors.New("您还有题未答完!") + liberr.ErrIsNil(ctx, err) + return + } + if strings.Contains(strings.ToLower(bqb.CorrectAnswer), strings.ToLower(data.Answer)) { + //if bqb.CorrectAnswer == data.Answer { + correct = "1" + fenshu = fenshu + data.Score + number = number + 1 + } else { + correct = "2" + } + } + //记录这次的及格线和总分 + float1 := strconv.FormatFloat(configurationEntity.PassingScore, 'f', -1, 64) + float2 := strconv.FormatFloat(configurationEntity.FullMark, 'f', -1, 64) + pass = float1 + "," + float2 + var bqsTwo = &do.BusQuestionSave{ + Openid: req.Openid, + BankId: data.BankId, + Answer: data.Answer, + Correct: correct, + Score: data.Score, + ProjectId: project, + } + if iii == 0 { //这几条数据只在每张试卷的第一条数据中存储(重复的没必要每条都存储) + //bqsTwo.Sign = str + bqsTwo.TakeTime = req.TakeTime + bqsTwo.TimeOut = configurationEntity.AnswerTime + bqsTwo.Pass = pass + } + bqs = append(bqs, bqsTwo) + } + scoreTwo = 100.00 / configurationEntity.FullMark * fenshu + //6、返回数据 + res.AnswerTime = configurationEntity.AnswerTime + res.TakeTime = req.TakeTime + res.FullMark = configurationEntity.FullMark + res.PassingScore = configurationEntity.PassingScore + res.Score = fenshu + res.Number = number + //7、两次卷子的分数对比,第一次的分数比第二次大那么第二次只返回结果;第二次的分数比第一次大那么删除第一次的数据再重新插入 + if scoreOne > scoreTwo { + return + } else { + //上面是比对 + //2、先查询当前用户是否有答题,有就把之前的删除(真删) + value, _ := g.DB().Model("bus_question_save_pdf").Ctx(ctx).Where("openid", req.Openid).Limit(1).Fields("path").Value() + if value != nil { + //os.Remove(coryCommon.GetCWD() + "/" + sp.Sign) //删除签名 + coryCommon.BatchFile(strings.Split(value.String(), ",")) //删除pdf + _, err = g.DB().Model("bus_question_save_pdf").Ctx(ctx).Where("openid", req.Openid).Delete() + _, err = dao.BusQuestionSave.Ctx(ctx).Unscoped().Where("openid", req.Openid).Delete() + } + _, err = dao.BusQuestionSave.Ctx(ctx).Insert(bqs) + } + /** + 第二部分:生成pdf试卷 + */ + //1、组装数据 + var we []*model.WoEntity + //获取 单选、多选、判断 + err = dao.BusQuestionSave.Ctx(ctx).As("a").Fields(` + c.question_type, + c.question_text, + c.options, + a.answer, + c.correct_answer, + a.correct, + a.score, + a.sign, + a.id, + a.pass, + b.user_name`). + LeftJoin(`(SELECT openid,user_name from bus_construction_user where deleted_at is null) as b on a.openid = CONVERT(b.openid USING utf8)`). + LeftJoin(`(SELECT id,question_type,question_text,options,correct_answer from bus_question_bank ) as c on a.bank_id = c.id`). + Where("a.openid", req.Openid).OrderAsc("a.id").Scan(&we) + if len(we) > 0 { + value, _ := dao.BusQuestionSave.Ctx(ctx).Where("openid", req.Openid).Where("correct", "1").Fields("sum(score)").Value() + s := configurationEntity.SingleChoice + m := configurationEntity.MultipleChoice + e := configurationEntity.Estimate + var rs *model.ExaminationPaperRes + rs = &model.ExaminationPaperRes{ + UserName: we[0].UserName, + Pass: we[0].Pass, + SumScore: value.String(), + Sign: signature.Signature, + Openid: req.Openid, + } + var one = new(model.ExaminationPaperOne) + var two = new(model.ExaminationPaperOne) + var three = new(model.ExaminationPaperOne) + one.Topic = "一、单选题,共" + strconv.Itoa(s) + "道题,每小题" + strconv.FormatFloat(configurationEntity.SingleScore, 'f', -1, 64) + "分,共计" + strconv.FormatFloat(float64(s)*configurationEntity.SingleScore, 'f', -1, 64) + "分" + two.Topic = "二、多选题,共" + strconv.Itoa(m) + "道题,每小题" + strconv.FormatFloat(configurationEntity.MultipleScore, 'f', -1, 64) + "分,共计" + strconv.FormatFloat(float64(m)*configurationEntity.MultipleScore, 'f', -1, 64) + "分" + three.Topic = "三、判断题,共" + strconv.Itoa(e) + "道题,每小题" + strconv.FormatFloat(configurationEntity.EstimateScore, 'f', -1, 64) + "分,共计" + strconv.FormatFloat(float64(e)*configurationEntity.EstimateScore, 'f', -1, 64) + "分" + var sEntity []*model.ExaminationPaperTwo + var mEntity []*model.ExaminationPaperTwo + var eEntity []*model.ExaminationPaperTwo + for _, data := range we { + var sy *model.ExaminationPaperTwo + sy = &model.ExaminationPaperTwo{ + QuestionText: data.QuestionText, + Options: data.Options, + Answer: data.Answer, + CorrectAnswer: data.CorrectAnswer, + Correct: data.Correct, + Score: data.Score, + } + if data.QuestionType == "1" { + sEntity = append(sEntity, sy) + } else if data.QuestionType == "2" { + mEntity = append(mEntity, sy) + } else if data.QuestionType == "3" { + eEntity = append(eEntity, sy) + } + } + one.List = sEntity + two.List = mEntity + three.List = eEntity + rs.Single = one + rs.Multiple = two + rs.Estimate = three + path, errPath := Wo(rs) + if errPath != nil { + errPath = errors.New("生成PDF试卷出现了意外,请重新提交!") + liberr.ErrIsNil(ctx, errPath) + return + } else { + path = strings.Replace(path, "resource/public", "/wxfile", 1) + _, err = g.DB().Insert(ctx, "bus_question_save_pdf", gdb.Map{ + "openid": req.Openid, + "path": path, + }) + res.PdfStr = path + } + } + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return err + }) + return +} + +func (s *sBusQuestionSave) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusQuestionSave.Ctx(ctx).Delete(dao.BusQuestionSave.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +func DeleteFunc(ctx context.Context, openidArr []string) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、查询需要删除的pdf + value, _ := g.DB().Model("bus_question_save_pdf").Ctx(ctx).Where("openid in (?)", openidArr).Fields("path").Array() + for i := range value { + coryCommon.BatchFile(strings.Split(value[i].String(), ",")) //删除pdf + } + //2、删除存储pdf的数据信息 + _, err = g.DB().Model("bus_question_save_pdf").Ctx(ctx).Where("openid in (?)", openidArr).Delete() + liberr.ErrIsNil(ctx, err, "安全考试-删除pdf试卷失败") + //3、删除用户存储的试卷信息 + _, err = dao.BusQuestionSave.Ctx(ctx).Unscoped().Where("openid in (?)", openidArr).Delete() + liberr.ErrIsNil(ctx, err, "安全考试-删除用户试卷信息失败") + //4、删除线下安全考试的用户信息 + _, err := g.DB().Model("bus_question_offline").Where("openid in (?)", openidArr).Delete() + liberr.ErrIsNil(ctx, err, "安全考试-线下数据删除失败") + }) + return +} + +// Wo 导出试卷PDF +func Wo(rs *model.ExaminationPaperRes) (path string, err error) { + //1、创建pdf 并新增pdf页 + pdf := gofpdf.New("P", "mm", "A4", "") + pdf.AddPage() + //2、设置字体 分别为不加粗和加粗 + //fontStr := coryCommon.GetCWD() + "/resource/font/simhei.ttf" + fontStr := "/resource/font/simhei.ttf" + pdf.AddUTF8Font("simhei", "", fontStr) + pdf.AddUTF8Font("simheiB", "B", fontStr) + // 标题居中加粗 + pdf.SetFont("simheiB", "B", 36) + pdf.CellFormat(190, 10, "中煤科工安全考试A卷", "0", 1, "C", false, 0, "") + pdf.Ln(10) + // 姓名、总分、实际得分 + pdf.SetFont("simhei", "", 16) + pdf.CellFormat(63, 10, "姓名: "+rs.UserName, "0", 0, "L", false, 0, "") + pdf.CellFormat(63, 10, "及格线/总分: "+rs.Pass, "0", 0, "L", false, 0, "") + pdf.CellFormat(63, 10, "实际得分: "+rs.SumScore, "0", 1, "L", false, 0, "") + pdf.Ln(6) + //内容 + for i := 1; i <= 3; i++ { + var ep = new(model.ExaminationPaperOne) + if i == 1 { + ep = rs.Single + } else if i == 2 { + ep = rs.Multiple + } else if i == 3 { + ep = rs.Estimate + } + //大题 单选、多选、判断 + pdf.SetFont("simhei", "", 20) + pdf.CellFormat(190, 10, ep.Topic, "0", 1, "L", false, 0, "") + pdf.SetFont("simhei", "", 12) + for iTwo, data := range ep.List { + //小题 + if i == 3 { + pdf.MultiCell(0, 5, strconv.Itoa(iTwo+1)+"、"+data.QuestionText+"( "+data.Answer+" )", "", "", false) + } else { + pdf.MultiCell(0, 5, strconv.Itoa(iTwo+1)+"、"+Bracket(data.QuestionText, data.Answer), "", "", false) + } + split := strings.Split(data.Options, "@") + num := len(split) + for j, dataTwo := range split { + //选项 + pdf.SetX(20) + pdf.MultiCell(0, 5, dataTwo, "", "", false) + if j == num-1 { + if data.Correct == "2" { + pdf.SetTextColor(255, 0, 0) // 设置文字颜色为红色 + pdf.SetX(20) + pdf.CellFormat(190, 10, "正确答案为:"+data.CorrectAnswer, "0", 1, "L", false, 0, "") + pdf.SetTextColor(35, 35, 35) // 设置文字颜色为红色 + } + pdf.Ln(3) + } + } + } + } + //签字 + pdf.Ln(20) + pdf.SetX(120) + pdf.SetFont("simheiB", "B", 16) + pdf.CellFormat(15, 10, "签字:", "0", 0, "L", false, 0, "") + //嵌入图片 + pdf.TransformBegin() + pdf.TransformRotate(90, pdf.GetX(), pdf.GetY()) // 逆时针旋转 45 度 + imageOptions := gofpdf.ImageOptions{ImageType: "png", ReadDpi: false} + getwd, err := os.Getwd() + getwd = filepath.ToSlash(getwd) + pathSign := getwd + "/" + rs.Sign + pdf.ImageOptions(pathSign, pdf.GetX()-10, pdf.GetY(), 24, 0, true, imageOptions, 0, "") + pdf.TransformEnd() + //导出pdf + fn := coryCommon.FileName("pdf") + str := coryCommon.Ynr(coryCommon.Helmet) + path = filepath.ToSlash(str + fn + ".pdf") + err = pdf.OutputFileAndClose(getwd + "/" + path) + return +} + +func Bracket(str string, replace string) (rn string) { + rn = "" + // 定义正则表达式模式,匹配不同的括号格式 + re := regexp.MustCompile(`\s*(\s*)\s*`) + // 使用正则表达式替换所有匹配的括号格式为"(abc)" + rn = re.ReplaceAllString(str, "( "+replace+" )") + return +} diff --git a/internal/app/system/logic/busQuestionsConfiguration/bus_questions_configuration.go b/internal/app/system/logic/busQuestionsConfiguration/bus_questions_configuration.go new file mode 100644 index 0000000..f09edf3 --- /dev/null +++ b/internal/app/system/logic/busQuestionsConfiguration/bus_questions_configuration.go @@ -0,0 +1,123 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-10-07 17:11:20 +// 生成路径: internal/app/system/logic/bus_questions_configuration.go +// 生成人:gfast +// desc:题库配置 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterBusQuestionsConfiguration(New()) +} + +func New() *sBusQuestionsConfiguration { + return &sBusQuestionsConfiguration{} +} + +type sBusQuestionsConfiguration struct{} + +func (s *sBusQuestionsConfiguration) List(ctx context.Context, req *system.BusQuestionsConfigurationSearchReq) (listRes *system.BusQuestionsConfigurationSearchRes, err error) { + listRes = new(system.BusQuestionsConfigurationSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusQuestionsConfiguration.Ctx(ctx).WithAll() + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusQuestionsConfigurationInfoRes + err = m.Fields(system.BusQuestionsConfigurationSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusQuestionsConfigurationListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusQuestionsConfigurationListRes{ + Id: v.Id, + SingleChoice: v.SingleChoice, + SingleScore: v.SingleScore, + MultipleChoice: v.MultipleChoice, + MultipleScore: v.MultipleScore, + Estimate: v.Estimate, + EstimateScore: v.EstimateScore, + FullMark: v.FullMark, + PassingScore: v.PassingScore, + AnswerTime: v.AnswerTime, + } + } + }) + return +} + +func (s *sBusQuestionsConfiguration) GetById(ctx context.Context, id int64) (res *model.BusQuestionsConfigurationInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusQuestionsConfiguration.Ctx(ctx).WithAll().Where(dao.BusQuestionsConfiguration.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusQuestionsConfiguration) Add(ctx context.Context, req *system.BusQuestionsConfigurationAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusQuestionsConfiguration.Ctx(ctx).Insert(do.BusQuestionsConfiguration{ + SingleChoice: req.SingleChoice, + SingleScore: req.SingleScore, + MultipleChoice: req.MultipleChoice, + MultipleScore: req.MultipleScore, + Estimate: req.Estimate, + EstimateScore: req.EstimateScore, + FullMark: req.FullMark, + PassingScore: req.PassingScore, + AnswerTime: req.AnswerTime, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusQuestionsConfiguration) Edit(ctx context.Context, req *system.BusQuestionsConfigurationEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusQuestionsConfiguration.Ctx(ctx).WherePri(req.Id).Update(do.BusQuestionsConfiguration{ + SingleChoice: req.SingleChoice, + SingleScore: req.SingleScore, + MultipleChoice: req.MultipleChoice, + MultipleScore: req.MultipleScore, + Estimate: req.Estimate, + EstimateScore: req.EstimateScore, + FullMark: req.FullMark, + PassingScore: req.PassingScore, + AnswerTime: req.AnswerTime, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusQuestionsConfiguration) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusQuestionsConfiguration.Ctx(ctx).Delete(dao.BusQuestionsConfiguration.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busReissueACard/bus_reissue_a_card.go b/internal/app/system/logic/busReissueACard/bus_reissue_a_card.go new file mode 100644 index 0000000..e7e959b --- /dev/null +++ b/internal/app/system/logic/busReissueACard/bus_reissue_a_card.go @@ -0,0 +1,701 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-02-02 15:18:48 +// 生成路径: internal/app/system/logic/bus_reissue_a_card.go +// 生成人:gfast +// desc:施工人员补卡申请 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "strconv" + "strings" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + wxDao "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + wxModel "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/tiger1103/gfast/v3/third/todo" +) + +func init() { + service.RegisterBusReissueACard(New()) +} + +func New() *sBusReissueACard { + return &sBusReissueACard{} +} + +type sBusReissueACard struct{} + +//func (s *sBusReissueACard) AdministratorApprovalFunc(ctx context.Context, req *wxApplet.AdministratorApprovalReq) (res *wxApplet.AdministratorApprovalRes, err error) { +// //TODO implement me +// panic("implement me") +//} + +func (s *sBusReissueACard) AppApprovalRecordDetailsFunc(ctx context.Context, req *wxApplet.AppApprovalRecordDetailsReq) (res *wxApplet.AppApprovalRecordDetailsRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 1、获取打卡数据 + err := dao.BusReissueACard.Ctx(ctx).WherePri(req.Id).Scan(&res) + liberr.ErrIsNil(ctx, err) + if res == nil { + return + } + // 2、获取申请补卡人信息 + value, _ := dao.BusConstructionUser.Ctx(ctx). + Where(dao.BusConstructionUser.Columns().Openid, res.Openid). + Fields("user_name").Value() + res.UserName = value.String() + // 3、获取当前申请补卡人所在项目 + sql := `SELECT GROUP_CONCAT(( SELECT project_name FROM sys_project WHERE id = ` + strconv.FormatInt(res.ProjectId, 10) + ` ),"-",( SELECT name FROM sys_project_team WHERE id = ` + strconv.FormatInt(res.TeamId, 10) + ` ) ) AS a` + v1, _ := g.DB().GetValue(ctx, sql) + res.ProjectWhereYouWork = v1.String() + // 4、获取班组长的信息 + if res.GangerOpinion != "1" && res.Ganger != "" { + var bzzEntity *model.BusConstructionUserInfoRes + err = dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().Openid, res.Ganger). + Fields("user_name,pace_photo").Scan(&bzzEntity) + liberr.ErrIsNil(ctx, err) + res.GangerHead = bzzEntity.PacePhoto + res.GangerName = bzzEntity.UserName + } + // 5、获取管理员的信息 + if res.ManagerOpinion != "1" && res.UpdateBy != "" { + type gly struct { + Avatar string `json:"avatar" dc:"头像"` + UserNickname string `json:"userNickname" dc:"昵称"` + } + var glyEntity *gly + err = dao.SysUser.Ctx(ctx).Where(dao.SysUser.Columns().Id, res.UpdateBy). + Fields("user_nickname,avatar").Scan(&glyEntity) + liberr.ErrIsNil(ctx, err) + flag := isHttpPath(glyEntity.Avatar) + if !flag && glyEntity.Avatar != "" { + glyEntity.Avatar = "/file/" + glyEntity.Avatar + } + res.ManagerHead = glyEntity.Avatar + res.ManagerName = glyEntity.UserNickname + } + // 6、 两个未读=待审核,一个同意=审核中,一个拒绝=拒绝,两个同意=已同意 + if res.GangerOpinion == "1" && res.ManagerOpinion == "1" { + res.CardMode = "待审核" + res.CardNumber = "1" + } + if res.GangerOpinion == "2" || res.ManagerOpinion == "2" { + res.CardMode = "审核中" + res.CardNumber = "2" + } + if res.GangerOpinion == "3" || res.ManagerOpinion == "3" { + res.CardMode = "已拒绝" + res.CardNumber = "3" + } + if res.GangerOpinion == "2" && res.ManagerOpinion == "2" { + res.CardMode = "已同意" + res.CardNumber = "4" + } + }) + return +} + +func isHttpPath(path string) bool { + return strings.HasPrefix(path, "http://") || strings.HasPrefix(path, "https://") +} + +func (s *sBusReissueACard) AppTheTeamLeaderSupplementCardApprovalListFun(ctx context.Context, req *model.AppTheTeamLeaderSupplementCardApprovalRes) (listRes *wxApplet.AppTheTeamLeaderSupplementCardApprovalListRes, err error) { + listRes = new(wxApplet.AppTheTeamLeaderSupplementCardApprovalListRes) + err = g.Try(ctx, func(ctx context.Context) { + value, _ := dao.BusConstructionUser.Ctx(ctx). + Where(dao.BusConstructionUser.Columns().Openid, req.Openid).Fields("team_id").Value() + // 1、去获取班组的班组长是否是当前openid + if value.String() != "" && value.String() != "0" { + count, _ := wxDao.SysProjectTeamMember.Ctx(ctx). + Where("team_id", value.String()). + Where("post_id", 10). + Where("openid", req.Openid).Count() + if count == 0 { + err = errors.New("请联系管理员,将您设置为班组长!") + } + } else { + err = errors.New("您还未加入班组!") + } + liberr.ErrIsNil(ctx, err) + // 2、查询主体数据 + m := dao.BusReissueACard.Ctx(ctx). + As("a"). + LeftJoin("bus_construction_user", "b", "a.openid=b.openid"). + Fields("a.id,a.scope,a.explain,a.ganger_opinion,a.manager_opinion,a.ganger_time as ganger_time,a.created_at as createdAt,b.head_icon,b.user_name"). + Where("a.team_id", value.String()) + if req.Type == "1" { + m = m.Where("a.ganger_opinion = 1") + } + if req.Type == "2" { + m = m.Where("a.ganger_opinion = 2 ") + } + if req.YearAndMonth != "" { + m = m.Where("DATE_FORMAT(a.created_at,'%Y-%m-%d') = ?", req.YearAndMonth) + } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.BusReissueACard.Columns().CreatedAt+" >=? AND "+"a."+dao.BusReissueACard.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + array, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + listRes.Total = len(array) + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "a.created_at desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var wbraclr []*model.AppTheTeamLeaderSupplementCardApprovalList + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&wbraclr) + liberr.ErrIsNil(ctx, err, "获取数据失败") + for i := range wbraclr { + + // 两个未读=待审核,一个同意=审核中,一个拒绝=拒绝,两个同意=已同意 + if wbraclr[i].GangerOpinion == "1" { + wbraclr[i].CardMode = "待审核" + wbraclr[i].CardNumber = "1" + } + if wbraclr[i].GangerOpinion == "2" { + wbraclr[i].CardMode = "已同意" + wbraclr[i].CardNumber = "4" + } + if wbraclr[i].GangerOpinion == "3" { + wbraclr[i].CardMode = "已拒绝" + wbraclr[i].CardNumber = "3" + } + } + listRes.List = wbraclr + }) + return +} + +func (s *sBusReissueACard) JobForemanSumnumberFunc(ctx context.Context, req *wxApplet.JobForemanSumnumberReq) (number int, err error) { + err = g.Try(ctx, func(ctx context.Context) { + value, _ := dao.BusConstructionUser.Ctx(ctx). + Where(dao.BusConstructionUser.Columns().Openid, req.Openid).Fields("team_id").Value() + if value.String() != "" && value.String() != "0" { + number, err = dao.BusReissueACard.Ctx(ctx).Where("team_id", value.String()).Where("ganger_opinion = 1").Count() + liberr.ErrIsNil(ctx, err, "获取总数失败") + } + }) + return +} + +func (s *sBusReissueACard) ReissueACardWxEditTeam(ctx context.Context, req *wxApplet.ReissueACardWxEditTeamReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 获取当前数据的班组,然后根据班组获取到班组长的openid + var aCard model.BusReissueACardInfoRes + err := dao.BusReissueACard.Ctx(ctx).WherePri(req.Id).Fields("id,openid,team_id,project_id").Scan(&aCard) + liberr.ErrIsNil(ctx, err) + fields, err := wxDao.SysProjectTeamMember.Ctx(ctx). + Where("team_id", aCard.TeamId). + Where("post_id", 10). + Fields("openid").Value() + liberr.ErrIsNil(ctx, err) + if fields.String() == "" { + err = errors.New("变更失败,申请人所在的班组未设置班组长") + return + } + UpdateG2 := g.Map{"ganger": fields, "ganger_opinion": req.GangerOpinion, "ganger_explain": req.GangerExplain, "ganger_time": gtime.Now()} + if req.GangerOpinion == "3" { + UpdateG2["attendance_id"] = nil + } + // 变更班组长对补卡的状态,并且填写班组长的openid + _, err = dao.BusReissueACard.Ctx(ctx).OmitEmpty().WherePri(req.Id).Update(UpdateG2) + liberr.ErrIsNil(ctx, err, "变更班组长失败") + // 标记特定的待办任务为已处理 + err = todo.MarkTaskAsProcessed(int(req.Id)) + liberr.ErrIsNil(ctx, err) + if req.GangerOpinion == "3" { + _, err = dao.BusReissueACard.Ctx(ctx).WherePri(req.Id).Update(g.Map{"attendance_id": nil}) + liberr.ErrIsNil(ctx, err, "修改失败") + return + } + // 然后将数据提交给管理员操作 + ids, err := GetAdministrator(ctx, aCard.ProjectId) + liberr.ErrIsNil(ctx, err) + if len(ids) == 0 { + liberr.ErrIsNil(ctx, errors.New("当前项目暂无后台管理人员可以进行审批,需要联系管理人员解决!")) + return + } + var listReissueReminder []todo.ReissueReminder + for i := range ids { + listReissueReminder = append(listReissueReminder, todo.ReissueReminder{ + UserID: strconv.Itoa(int(ids[i])), + Role: 0, + ProjectID: int(aCard.ProjectId), + CreatorID: aCard.Openid, + TargetID: int(aCard.Id), + }) + } + err = todo.CreateAttendanceApprovalGroup(listReissueReminder, todo.AttendanceApproval) + liberr.ErrIsNil(ctx, err) + }) + return err + }) + return +} + +// @Title getAdministrator 2024/7/29 14:11:00 +// @Description 获取所有的管理员 +// @Auth Cory +// @param 输入参数名 ---> "参数解释" +// @Return error ---> "错误信息" +func GetAdministrator(ctx context.Context, projectId int64) (ids []int64, err error) { + err = g.Try(ctx, func(ctx context.Context) { + array, err := g.DB().Model("sys_user_project_relevancy").Ctx(ctx).Where("project_id", projectId).Fields("user_id").Array() + //array, err := dao.SysUser.Ctx(ctx).Unscoped().Where("project_id", projectId) + liberr.ErrIsNil(ctx, err, "获取管理员失败") + for i := range array { + ids = append(ids, array[i].Int64()) + } + }) + return +} + +func (s *sBusReissueACard) ReissueACardWxGetByIdTeam(ctx context.Context, req *wxApplet.ReissueACardWxGetByIdTeamReq) (listRes *wxApplet.ReissueACardWxGetByIdTeamRes, err error) { + listRes = new(wxApplet.ReissueACardWxGetByIdTeamRes) + err = g.Try(ctx, func(ctx context.Context) { + // 1、获取当前用户所在班组 + value, _ := dao.BusConstructionUser.Ctx(ctx). + Where(dao.BusConstructionUser.Columns().Openid, req.Openid).Fields("team_id").Value() + // 2、去获取班组的班组长是否是当前openid + if value.String() != "" && value.String() != "0" { + count, _ := wxDao.SysProjectTeamMember.Ctx(ctx). + Where("team_id", value.String()). + Where("post_id", 10). + Where("openid", req.Openid).Count() + if count == 0 { + err = errors.New("请联系管理员,将您设置为班组长!") + } + } else { + err = errors.New("您还未加入班组!") + } + liberr.ErrIsNil(ctx, err) + // 3、根据班组ID去获取申请补卡的数据 + m := dao.BusReissueACard.Ctx(ctx). + As("a"). + LeftJoin("bus_construction_user", "b", "a.openid=b.openid"). + Fields("a.*,b.head_icon,b.user_name"). + Where("a.team_id", value.String()) + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.BusReissueACard.Columns().CreatedAt+" >=? AND "+"a."+dao.BusReissueACard.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + array, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + listRes.Total = len(array) + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "a.manager_opinion asc,a.id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var wbraclr []*model.WxBusReissueACardListRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&wbraclr) + liberr.ErrIsNil(ctx, err, "获取数据失败") + for i := range wbraclr { + value, _ := dao.BusConstructionUser.Ctx(ctx).Where("openid", req.Openid).Fields("user_name").Value() + wbraclr[i].GangerName = value.String() + // 两个未读=待审核,一个同意=审核中,一个拒绝=拒绝,两个同意=已同意 + if wbraclr[i].GangerOpinion == "1" { + wbraclr[i].CardMode = "待审核" + wbraclr[i].CardNumber = "1" + } + if wbraclr[i].GangerOpinion == "2" { + wbraclr[i].CardMode = "已同意" + wbraclr[i].CardNumber = "4" + } + if wbraclr[i].GangerOpinion == "3" { + wbraclr[i].CardMode = "已拒绝" + wbraclr[i].CardNumber = "3" + } + } + listRes.List = wbraclr + }) + return +} + +func (s *sBusReissueACard) ReissueACardWxGetByIdFunc(ctx context.Context, req *wxApplet.ReissueACardWxGetByIdReq) (listRes *wxApplet.ReissueACardWxGetByIdRes, err error) { + listRes = new(wxApplet.ReissueACardWxGetByIdRes) + err = g.Try(ctx, func(ctx context.Context) { + //value, _ := dao.BusConstructionUser.Ctx(ctx). + // Where(dao.BusConstructionUser.Columns().Openid, req.Openid).Fields("team_id").Value() + //if value.String() == "" || value.String() == "0" { + // return + //} + m := dao.BusReissueACard.Ctx(ctx).As("a"). + LeftJoin("bus_construction_user", "b", "a.openid=b.openid"). + Fields("a.*,b.head_icon,b.user_name"). + Where("a."+dao.BusReissueACard.Columns().Openid, req.Openid) + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.BusReissueACard.Columns().CreatedAt+" >=? AND "+"a."+dao.BusReissueACard.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + array, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + listRes.Total = len(array) + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "a.created_at desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var wbraclr []*model.WxBusReissueACardListRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&wbraclr) + liberr.ErrIsNil(ctx, err, "获取数据失败") + for i := range wbraclr { + // 获取项目+班组 + sql := `SELECT GROUP_CONCAT(( SELECT project_name FROM sys_project WHERE id = ` + strconv.FormatInt(wbraclr[i].ProjectId, 10) + ` ),"-",( SELECT name FROM sys_project_team WHERE id = ` + strconv.FormatInt(wbraclr[i].TeamId, 10) + ` ) ) AS a` + v, _ := g.DB().GetValue(ctx, sql) + wbraclr[i].ProjectWhereYouWork = v.String() + // 获取用户姓名 + value, _ := dao.BusConstructionUser.Ctx(ctx).Where("openid", wbraclr[i].Ganger).Fields("user_name").Value() + wbraclr[i].GangerName = value.String() + // 两个未读=待审核,一个同意=审核中,一个拒绝=拒绝,两个同意=已同意 + if wbraclr[i].GangerOpinion == "1" && wbraclr[i].ManagerOpinion == "1" { + wbraclr[i].CardMode = "待审核" + wbraclr[i].CardNumber = "1" + } + if wbraclr[i].GangerOpinion == "2" || wbraclr[i].ManagerOpinion == "2" { + wbraclr[i].CardMode = "审核中" + wbraclr[i].CardNumber = "2" + } + if wbraclr[i].GangerOpinion == "3" || wbraclr[i].ManagerOpinion == "3" { + wbraclr[i].CardMode = "已拒绝" + wbraclr[i].CardNumber = "3" + } + if wbraclr[i].GangerOpinion == "2" && wbraclr[i].ManagerOpinion == "2" { + wbraclr[i].CardMode = "已同意" + wbraclr[i].CardNumber = "4" + } + } + listRes.List = wbraclr + }) + return +} + +func (s *sBusReissueACard) ReissueACardWxAdd(ctx context.Context, req *wxApplet.ReissueACardWxAddReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + // 新增数据只获取到班组的ID,具体班组长是谁,要等班组长同意了过后才知道(此逻辑可以防止班组长变更,数据还在上一个班组长那里) + err = g.Try(ctx, func(ctx context.Context) { + // 1、根据openid获取到当前小程序用户所在班组的班组长 + var busUser *model.BusConstructionUserInfoRes + err := dao.BusConstructionUser.Ctx(ctx).Where("openid", req.Openid).Fields("project_id,team_id").Scan(&busUser) + liberr.ErrIsNil(ctx, err, "添加失败") + if busUser == nil || busUser.TeamId == 0 { + liberr.ErrIsNil(ctx, err, "请先加入班组!") + } + // 3、创建补卡申请信息 + info, err := dao.BusReissueACard.Ctx(ctx).OmitEmpty().Insert(do.BusReissueACard{ + Openid: req.Openid, + Scope: req.Scope, + Explain: req.Explain, + Type: req.Type, + // Ganger: gangerOpenid, + ProjectId: busUser.ProjectId, + TeamId: busUser.TeamId, + AttendanceId: req.AttendanceId, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + aId, _ := strconv.Atoi(req.AttendanceId) + // 标记特定的待办任务为已处理 + err = todo.MarkTaskAsProcessed(aId) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + // 4、发布一条考勤审批提醒 + keyId, _ := info.LastInsertId() + openidVal, err := wxDao.SysProjectTeamMember.Ctx(ctx). + Where("team_id", busUser.TeamId). + Where("post_id", 10). + Fields("openid").Value() + if openidVal.String() == "" || err != nil { + liberr.ErrIsNil(ctx, errors.New("当前班组未发现班组长职位")) + return + } + var listReissueReminder []todo.ReissueReminder + listReissueReminder = append(listReissueReminder, todo.ReissueReminder{ + UserID: openidVal.String(), + Role: 1, + ProjectID: int(busUser.ProjectId), + CreatorID: req.Openid, + TargetID: int(keyId), + }) + err = todo.CreateAttendanceApprovalGroup(listReissueReminder, todo.AttendanceApproval) + liberr.ErrIsNil(ctx, err) + }) + return err + }) + return +} + +func (s *sBusReissueACard) List(ctx context.Context, req *system.BusReissueACardSearchReq) (listRes *system.BusReissueACardSearchRes, err error) { + listRes = new(system.BusReissueACardSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + values, err2 := dao.BusConstructionUser.Ctx(ctx).Where("user_name like ?", "%"+req.Name+"%").Fields("openid").Array() + liberr.ErrIsNil(ctx, err2) + m := dao.BusReissueACard.Ctx(ctx).WithAll().As("a"). + LeftJoin("bus_construction_user", "b", "a.openid=b.openid"). + LeftJoin("sys_project", "c", "c.id=b.project_id"). + LeftJoin("sys_project_team", "d", "d.id=b.team_id"). + Fields("a.*,b.user_name,c.project_name,d.name as team_name") + if req.Name != "" { + m = m.Where("a."+dao.BusReissueACard.Columns().Openid+" in (?)", values) + } + if req.ProjectId > 0 { + m = m.Where("a.project_id", req.ProjectId) + } + if req.TeamId > 0 { + m = m.Where("a.team_id", req.TeamId) + } + if req.ManagerOpinion != "" { + m = m.Where("a."+dao.BusReissueACard.Columns().ManagerOpinion+" = ?", req.ManagerOpinion) + } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.BusReissueACard.Columns().CreatedAt+" >=? AND "+"a."+dao.BusReissueACard.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + array, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + listRes.Total = len(array) + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusReissueACardInfoRes + err = m.Fields(system.BusReissueACardSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusReissueACardListRes, len(res)) + for k, v := range res { + cardMode := "" + cardNumber := "" + if v.GangerOpinion == "1" && v.ManagerOpinion == "1" { + cardMode = "待审核" + cardNumber = "1" + } + if v.GangerOpinion == "2" || v.ManagerOpinion == "2" { + cardMode = "审核中" + cardNumber = "2" + } + if v.GangerOpinion == "3" || v.ManagerOpinion == "3" { + cardMode = "已拒绝" + cardNumber = "3" + } + if v.GangerOpinion == "2" && v.ManagerOpinion == "2" { + cardMode = "已同意" + cardNumber = "4" + } + + listRes.List[k] = &model.BusReissueACardListRes{ + Id: v.Id, + Openid: v.Openid, + Scope: v.Scope, + Explain: v.Explain, + Ganger: v.Ganger, + GangerOpinion: v.GangerOpinion, + GangerExplain: v.GangerExplain, + GangerTime: v.GangerTime, + ManagerOpinion: v.ManagerOpinion, + ManagerExplain: v.ManagerExplain, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + ProjectId: v.ProjectId, + TeamId: v.TeamId, + UserName: v.UserName, + ProjectName: v.ProjectName, + TeamName: v.TeamName, + CardMode: cardMode, + CardNumber: cardNumber, + } + } + }) + return +} + +func (s *sBusReissueACard) GetById(ctx context.Context, id int64) (res *model.BusReissueACardInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusReissueACard.Ctx(ctx).WithAll().Where(dao.BusReissueACard.Columns().Id, id).Scan(&res) + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusReissueACardInfoRes) + res = &infoRes + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusReissueACard) Add(ctx context.Context, req *system.BusReissueACardAddReq) (err error) { + //err = g.Try(ctx, func(ctx context.Context) { + // //判断当前人是否有加入项目及班组,如果没有无法进行补卡申请 + // var entity *model.BusConstructionUserInfoRes + // dao.BusConstructionUser.Ctx(ctx).Where("openid", req.Openid).Fields("project_id,team_id").Scan(&entity) + // if entity == nil || entity.ProjectId == 0 || entity.TeamId == 0 { + // err = errors.New("未检查到您有加入项目及班组,无法进入补卡流程!") + // liberr.ErrIsNil(ctx, err) + // return + // } + // _, err = dao.BusReissueACard.Ctx(ctx).Insert(do.BusReissueACard{ + // Openid: req.Openid, + // Scope: req.Scope, + // Explain: req.Explain, + // Ganger: req.Ganger, + // GangerOpinion: req.GangerOpinion, + // GangerExplain: req.GangerExplain, + // GangerTime: req.GangerTime, + // ManagerOpinion: req.ManagerOpinion, + // ManagerExplain: req.ManagerExplain, + // }) + // liberr.ErrIsNil(ctx, err, "添加失败") + //}) + return +} + +func (s *sBusReissueACard) Edit(ctx context.Context, req *system.BusReissueACardEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + // 1、更改打卡记录 + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusReissueACard.Ctx(ctx).WherePri(req.Id).Update(do.BusReissueACard{ + ManagerOpinion: req.ManagerOpinion, + ManagerExplain: req.ManagerExplain, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + // 2、查询打卡记录 + var br *model.BusReissueACardInfoRes + err = dao.BusReissueACard.Ctx(ctx).WherePri(req.Id).Scan(&br) + liberr.ErrIsNil(ctx, err, "修改失败") + // 3、判断是否都同意,都同意就修改考勤打卡的数据 + if br.GangerOpinion == "2" && br.ManagerOpinion == "2" { + split := strings.Split(br.Scope, ",") + scope := br.Scope[0:10] + var balr []*wxModel.BusAttendanceListRes + sql := g.DB().Model("bus_attendance"). + Where("openid", br.Openid). + Where("printing_date", scope) + if br.Type != "3" { + sql = sql.Where("commuter", br.Type) + } + err = sql.Scan(&balr) + liberr.ErrIsNil(ctx, err, "补卡失败,请稍后从试") + if len(balr) > 0 { + for i := range balr { + if balr[i].Commuter == "1" { + _, err = g.DB().Model("bus_attendance"). + WherePri(balr[i].Id). + Where("commuter = 1"). + Update(g.Map{"clock_on": split[0], "is_pinch": 5}) + liberr.ErrIsNil(ctx, err, "补卡失败,请稍后从试") + } else { + var timeStr string + if len(split) > 2 { + timeStr = split[1] + } else { + timeStr = split[0] + } + _, err = g.DB().Model("bus_attendance"). + WherePri(balr[i].Id). + Where("commuter = 2"). + Update(g.Map{"clock_on": timeStr, "is_pinch": 5}) + liberr.ErrIsNil(ctx, err, "补卡失败,请稍后从试") + } + } + } else { + // 获取此次打卡的日薪 + vl, err := dao.BusConstructionUser.Ctx(ctx).As("a"). + LeftJoin("bus_type_of_wage as f on a.type_of_work = f.type_of_work"). + Fields("if (a.salary>0, a.salary,f.standard) as salary"). + Where("a.openid", br.Openid).Value() + liberr.ErrIsNil(ctx, err, "获取薪资错误,补卡失败") + // 名字、项目id、打卡时间、打卡日期、5补卡、openid、上班or下班 + name, err := dao.BusConstructionUser.Ctx(ctx).Where("openid", br.Openid).Fields("user_name").Value() + liberr.ErrIsNil(ctx, err, "补卡失败,请稍后从试") + scope := br.Scope[0:10] + timeStr := strings.Split(br.Scope, ",") + var attendance []*wxModel.BusAttendanceListRes + one := wxModel.BusAttendanceListRes{ + UserName: name.String(), + ProjectId: br.ProjectId, + ClockOn: timeStr[0], + PrintingDate: scope, + IsPinch: "5", + Openid: br.Openid, + Commuter: "1", + DailyWage: vl.Float64(), + } + two := wxModel.BusAttendanceListRes{ + UserName: name.String(), + ProjectId: br.ProjectId, + ClockOn: timeStr[1], + PrintingDate: scope, + IsPinch: "5", + Openid: br.Openid, + Commuter: "2", + DailyWage: vl.Float64(), + } + attendance = append(attendance, &one, &two) + _, err = g.DB().Model("bus_attendance").OmitEmpty().Ctx(ctx).Insert(attendance) + liberr.ErrIsNil(ctx, err, "补卡失败,请稍后从试") + } + //批量同意 + err2 := todo.MarkTasksAsProcessedByUUID(req.Id) + liberr.ErrIsNil(ctx, err2) + } else { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusReissueACard.Ctx(ctx).WherePri(req.Id).Update(g.Map{"attendance_id": nil}) + liberr.ErrIsNil(ctx, err, "修改失败") + // 标记特定的待办任务为已处理 + err = todo.MarkTaskAsProcessed(int(req.Id)) + liberr.ErrIsNil(ctx, err) + }) + } + return err + }) + return +} + +func (s *sBusReissueACard) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusReissueACard.Ctx(ctx).Delete(dao.BusReissueACard.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busResearchDocument/bus_research_document.go b/internal/app/system/logic/busResearchDocument/bus_research_document.go new file mode 100644 index 0000000..39b6cfa --- /dev/null +++ b/internal/app/system/logic/busResearchDocument/bus_research_document.go @@ -0,0 +1,155 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-07-29 16:04:06 +// 生成路径: internal/app/system/logic/bus_research_document.go +// 生成人:gfast +// desc:科研文档 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/libUtils" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterBusResearchDocument(New()) +} + +func New() *sBusResearchDocument { + return &sBusResearchDocument{} +} + +type sBusResearchDocument struct{} + +func (s *sBusResearchDocument) List(ctx context.Context, req *system.BusResearchDocumentSearchReq) (listRes *system.BusResearchDocumentSearchRes, err error) { + listRes = new(system.BusResearchDocumentSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusResearchDocument.Ctx(ctx).WithAll() + if req.FileId != "" { + m = m.Where(dao.BusResearchDocument.Columns().FileId+" = ?", req.FileId) + } + if req.ProjectId != "" { + m = m.Where(dao.BusResearchDocument.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.DocumenName != "" { + m = m.Where(dao.BusResearchDocument.Columns().DocumenName+" like ?", "%"+req.DocumenName+"%") + } + //创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.BusResearchDocument.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusResearchDocument.Columns().CreatedAt+" >=? AND "+dao.BusResearchDocument.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusResearchDocumentInfoRes + err = m.Fields(system.BusResearchDocumentSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusResearchDocumentListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusResearchDocumentListRes{ + Id: v.Id, + DocumenName: v.DocumenName, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusResearchDocument) GetById(ctx context.Context, id int64) (res *model.BusResearchDocumentInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusResearchDocument.Ctx(ctx).WithAll().Where(dao.BusResearchDocument.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusResearchDocumentInfoRes) + res = &infoRes + }) + return +} + +func (s *sBusResearchDocument) Add(ctx context.Context, req *system.BusResearchDocumentAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + name := ct.New().GetLoginUser(ctx).Id + for _, obj := range req.FileUrl { + obj.Url, err = libUtils.GetFilesPath(ctx, obj.Url) + liberr.ErrIsNil(ctx, err) + } + if len(req.FileUrl) > 0 { + file := req.FileUrl[0] + _, err = dao.BusResearchDocument.Ctx(ctx).Insert(do.BusResearchDocument{ + DocumenName: file.Name, + DocumentUrl: file.Url, + FileId: req.FileId, + ProjectId: req.ProjectId, + CreateBy: name, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + return + } + liberr.ErrIsNil(ctx, err, coryCommon.ImportFile) + }) + return +} + +func (s *sBusResearchDocument) Edit(ctx context.Context, req *system.BusResearchDocumentEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + name := ct.New().GetLoginUser(ctx).Id + for _, obj := range req.FileUrl { + obj.Url, err = libUtils.GetFilesPath(ctx, obj.Url) + liberr.ErrIsNil(ctx, err) + } + if len(req.FileUrl) > 0 { + file := req.FileUrl[0] + _, err = dao.BusResearchDocument.Ctx(ctx).WherePri(req.Id).Update(do.BusResearchDocument{ + DocumenName: file.Name, + DocumentUrl: file.Url, + Remark: req.Remark, + FileId: req.FileId, + ProjectId: req.ProjectId, + UpdateBy: name, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + return + } + liberr.ErrIsNil(ctx, err, coryCommon.ImportFile) + }) + return +} + +func (s *sBusResearchDocument) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusResearchDocument.Ctx(ctx).Delete(dao.BusResearchDocument.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busSafety/bus_safety.go b/internal/app/system/logic/busSafety/bus_safety.go new file mode 100644 index 0000000..3fb5064 --- /dev/null +++ b/internal/app/system/logic/busSafety/bus_safety.go @@ -0,0 +1,251 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-02 15:40:48 +// 生成路径: internal/app/system/logic/bus_safety.go +// 生成人:gfast +// desc:安全例会管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "encoding/json" + "errors" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "strings" +) + +func init() { + service.RegisterBusSafety(New()) +} + +func New() *sBusSafety { + return &sBusSafety{} +} + +type sBusSafety struct{} + +func (s *sBusSafety) WxAddFunc(ctx context.Context, req *system.WxBusSafetyAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + req.SafetyDocument[0].Url = strings.ReplaceAll(req.SafetyDocument[0].Url, "/file", "/wxfile") + "," + _, err = dao.BusSafety.Ctx(ctx).Insert(do.BusSafety{ + SafetyName: req.SafetyName, + SafetyExplain: req.SafetyExplain, + SafetyDocument: req.SafetyDocument[0].Url, + SafetyType: req.SafetyType, + ProjectId: req.ProjectId, + SafetyGrade: req.SafetyGrade, + StartDate: req.StartDate, + UserType: "2", + CreateBy: req.Openid, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusSafety) List(ctx context.Context, req *system.BusSafetySearchReq) (listRes *system.BusSafetySearchRes, err error) { + listRes = new(system.BusSafetySearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusSafety.Ctx(ctx).WithAll() + if req.SafetyName != "" { + m = m.Where(dao.BusSafety.Columns().SafetyName+" like ?", "%"+req.SafetyName+"%") + } + if req.SafetyExplain != "" { + m = m.Where(dao.BusSafety.Columns().SafetyExplain+" = ?", req.SafetyExplain) + } + if req.SafetyDocument != "" { + m = m.Where(dao.BusSafety.Columns().SafetyDocument+" = ?", req.SafetyDocument) + } + if req.SafetyType != "" { + m = m.Where(dao.BusSafety.Columns().SafetyType+" = ?", req.SafetyType) + } + if req.ProjectId != "" { + m = m.Where(dao.BusSafety.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + if req.Status != "" { + m = m.Where(dao.BusSafety.Columns().Status+" = ?", req.Status) + } + if req.CreateBy != "" { + m = m.Where(dao.BusSafety.Columns().CreateBy+" = ?", req.CreateBy) + } + if req.UpdateAt != "" { + m = m.Where(dao.BusSafety.Columns().UpdateAt+" = ?", req.UpdateAt) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusSafety.Columns().CreatedAt+" >=? AND "+dao.BusSafety.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusSafetyInfoRes + err = m.Fields(system.BusSafetySearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusSafetyListRes, len(res)) + for k, v := range res { + //safetyDocument := ([]*comModel.UpFile)(nil) + //err = gjson.DecodeTo(v.SafetyDocument, &safetyDocument) + //liberr.ErrIsNil(ctx, err) + listRes.List[k] = &model.BusSafetyListRes{ + Id: v.Id, + SafetyName: v.SafetyName, + SafetyExplain: v.SafetyExplain, + //SafetyDocument: v.SafetyDocument, + SafetyType: v.SafetyType, + ProjectId: v.ProjectId, + Status: v.Status, + SafetyGrade: v.SafetyGrade, + StartDate: v.StartDate, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusSafety) GetById(ctx context.Context, id int64) (res *model.BusSafetyInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、查询原来数据进行删除 + var ufList []*comModel.UpFile + err = dao.BusSafety.Ctx(ctx).WithAll().Where(dao.BusSafety.Columns().Id, id).Scan(&res) + if err == nil { + split := strings.Split(res.SafetyDocument, ";") + for _, data := range split { + var uf *comModel.UpFile + err := json.Unmarshal([]byte(data), &uf) + if err != nil { + uf = new(comModel.UpFile) + uf.Name = res.SafetyName + uf.Url = res.SafetyDocument + } + ufList = append(ufList, uf) + } + } + res.SafetyDocumentObj = ufList + liberr.ErrIsNil(ctx, err, "获取信息失败") + if res.UserType == "1" { + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusSafetyInfoRes) + res = &infoRes + } + }) + return +} + +func (s *sBusSafety) Add(ctx context.Context, req *system.BusSafetyAddReq) (err error) { + if len(req.SafetyDocument) > 2 { + err = errors.New("最多仅支持2个文件!") + return err + } + err = g.Try(ctx, func(ctx context.Context) { + safety := do.BusSafety{ + SafetyName: req.SafetyName, + SafetyExplain: req.SafetyExplain, + SafetyType: req.SafetyType, + ProjectId: req.ProjectId, + SafetyGrade: req.SafetyGrade, + StartDate: req.StartDate, + } + //2为小程序,小程序要为wxfile开头 + if req.WxOrPc != "1" { + req.WxOrPc = "2" + safety.CreateBy = req.Openid + if len(req.SafetyDocument) > 0 { + for i := range req.SafetyDocument { + req.SafetyDocument[i].Url = strings.Replace(req.SafetyDocument[0].Url, "file", "wxfile", 1) + } + } + } else { + safety.CreateBy = ct.New().GetLoginUser(ctx).Id + } + safety.UserType = req.WxOrPc + if len(req.SafetyDocument) > 0 { + var str = "" + for _, data := range req.SafetyDocument { + marshal, _ := json.Marshal(data) + str = str + string(marshal) + ";" + } + if len(str) > 0 { + safety.SafetyDocument = str[:len(str)-1] + } + } + _, err = dao.BusSafety.Ctx(ctx).Insert(safety) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusSafety) Edit(ctx context.Context, req *system.BusSafetyEditReq) (err error) { + if len(req.SafetyDocument) > 2 { + err = errors.New("最多仅支持2个文件!") + return err + } + err = g.Try(ctx, func(ctx context.Context) { + safety := do.BusSafety{ + SafetyName: req.SafetyName, + SafetyExplain: req.SafetyExplain, + SafetyType: req.SafetyType, + Status: req.Status, + SafetyGrade: req.SafetyGrade, + } + //2、为小程序,小程序要为wxfile开头 + if req.WxOrPc != "1" { + req.WxOrPc = "2" + safety.CreateBy = req.Openid + if len(req.SafetyDocument) > 0 { + for i := range req.SafetyDocument { + req.SafetyDocument[i].Url = strings.Replace(req.SafetyDocument[0].Url, "file", "wxfile", 1) + } + } + } else { + safety.UpdateBy = ct.New().GetLoginUser(ctx).Id + } + //3、最终存储数据 + safety.UserType = req.WxOrPc + if len(req.SafetyDocument) > 0 { + var str = "" + for _, data := range req.SafetyDocument { + marshal, _ := json.Marshal(data) + str = str + string(marshal) + ";" + } + if len(str) > 0 { + safety.SafetyDocument = str[:len(str)-1] + } + } + _, err = dao.BusSafety.Ctx(ctx).WherePri(req.Id).Update(safety) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusSafety) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusSafety.Ctx(ctx).Delete(dao.BusSafety.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busSalaryDetails/bus_salary_details.go b/internal/app/system/logic/busSalaryDetails/bus_salary_details.go new file mode 100644 index 0000000..6c15de5 --- /dev/null +++ b/internal/app/system/logic/busSalaryDetails/bus_salary_details.go @@ -0,0 +1,266 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-02-01 16:39:01 +// 生成路径: internal/app/system/logic/bus_salary_details.go +// 生成人:gfast +// desc:员工工资考核记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/shopspring/decimal" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterBusSalaryDetails(New()) +} + +func New() *sBusSalaryDetails { + return &sBusSalaryDetails{} +} + +type sBusSalaryDetails struct{} + +func (s *sBusSalaryDetails) SalarySheetFunc(ctx context.Context, req *system.SalarySheetFuncReq) (res *system.SalarySheetFuncRes, err error) { + res = new(system.SalarySheetFuncRes) + var ssr []model.SalarySheetRes + err = g.Try(ctx, func(ctx context.Context) { + //1、获取数据 + var bsdlr []*model.BusSalaryDetailsInfoRes + sql := dao.BusSalaryDetails.Ctx(ctx).Where("a.date_of_issue", req.DateOfIssue).As("a"). + LeftJoin("sys_project", "b", "b.id = a.project_id"). + LeftJoin("sys_project_team", "c", "c.id = a.team_id") + if req.Project > 0 { + sql = sql.Where("a."+dao.BusSalaryDetails.Columns().ProjectId, req.Project) + } + if req.Team > 0 { + sql = sql.Where("a."+dao.BusSalaryDetails.Columns().TeamId, req.Team) + } + if req.SfzNumber != "" { + sql = sql.Where("a."+dao.BusSalaryDetails.Columns().SfzNumber, req.SfzNumber) + } + err := sql.Fields("a.name,a.account,a.banking_house,a.sum_duration,a.salary,b.project_name as projectName,c.name as teamName").Scan(&bsdlr) + liberr.ErrIsNil(ctx, err, "获取数据失败") + //2、组装需要导出为excel的数据 + for i := range bsdlr { + // 创建 Decimal 类型的金钱值 + one := decimal.NewFromFloat(bsdlr[i].SumDuration) + two := decimal.NewFromFloat(bsdlr[i].Salary) + product := one.Mul(two) + sheetRes := model.SalarySheetRes{ + YhkNumber: bsdlr[i].Account, + UserName: bsdlr[i].Name, + Money: product.String(), + BankingHouse: bsdlr[i].BankingHouse, + ProjectName: bsdlr[i].ProjectName, + TeamName: bsdlr[i].TeamName, + } + ssr = append(ssr, sheetRes) + } + return + }) + res.List = ssr + return +} + +func (s *sBusSalaryDetails) GetByIdDetailFunc(ctx context.Context, req *system.GetByIdDetailFuncReq) (listRes *system.GetByIdDetailFuncRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + listRes = new(system.GetByIdDetailFuncRes) + sql := g.DB().Model("bus_salary_details_record").Ctx(ctx).Where("sfz_number", req.SfzNumber) + if req.DateOfIssue != "" { + sql = sql.Where("date_of_issue", req.DateOfIssue) + } + listRes.Total, err = sql.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "date_of_issue desc,id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.DateTwoRes + err = sql.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = res + return + }) + return +} + +func (s *sBusSalaryDetails) List(ctx context.Context, req *system.BusSalaryDetailsSearchReq) (listRes *system.BusSalaryDetailsSearchRes, err error) { + listRes = new(system.BusSalaryDetailsSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusSalaryDetails.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.BusSalaryDetails.Columns().Id+" = ?", req.Id) + } + if req.SfzNumber != "" { + m = m.Where(dao.BusSalaryDetails.Columns().SfzNumber+" like ?", "%"+req.SfzNumber+"%") + } + if req.ProjectId != "" { + m = m.Where(dao.BusSalaryDetails.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.TeamId != "" { + m = m.Where(dao.BusSalaryDetails.Columns().TeamId+" = ?", req.TeamId) + } + if req.DateOfIssue != "" { + m = m.Where("date_of_issue = ?", req.DateOfIssue) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "date_of_issue desc,id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusSalaryDetailsInfoRes + err = m.Fields(system.BusSalaryDetailsSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusSalaryDetailsListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusSalaryDetailsListRes{ + Id: v.Id, + SfzNumber: v.SfzNumber, + Name: v.Name, + Account: v.Account, + SumDuration: v.SumDuration, + Salary: v.Salary, + DateOfIssue: v.DateOfIssue, + Lister: v.Lister, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusSalaryDetails) GetById(ctx context.Context, id int64) (res *model.BusSalaryDetailsInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusSalaryDetails.Ctx(ctx).WithAll().Where(dao.BusSalaryDetails.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusSalaryDetails) Add(ctx context.Context, req *system.BusSalaryDetailsAddReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //1、获取他们的身份证信息,然后去数据库里面查询到对应的项目+班组+银行卡+薪水+ + var sfz []string + for _, data := range req.DataList { + sfz = append(sfz, data.SfzNumber) + } + var realInformationTwo []*model.AttendanceImportTwoRes + err = dao.BusConstructionUser.Ctx(ctx).As("a"). + Fields(` + a.id, + a.user_name, + a.sfz_number, + a.yhk_number, + a.project_id, + a.team_id, + a.yhk_opening_bank, + CASE + WHEN a.salary > 0 THEN a.salary + ELSE b.standard + END AS final_salary`). + LeftJoin("bus_type_of_wage", "b", "a.type_of_work = b.type_of_work "). + WhereIn("a.sfz_number", sfz).Where("a.sfz_number <> ''").Scan(&realInformationTwo) + liberr.ErrIsNil(ctx, err) + //2、数据匹配 + var sfzs []string + var years string + var i = 0 + var bsd []do.BusSalaryDetails //最终插入到bus_salary_details的数据 + var dtr []model.DateTwoRes //最终插入到bus_salary_details的数据 + for _, dl := range req.DataList { + for _, ri := range realInformationTwo { + //身份证不匹配 + if dl.SfzNumber != ri.SfzNumber { + continue + } + if i == 0 { + years = dl.DateOfIssue + } + //主表数据 + details := do.BusSalaryDetails{ + SfzNumber: ri.SfzNumber, + Name: dl.Name, + Account: ri.YhkNumber, + BankingHouse: ri.YhkOpeningBank, + SumDuration: dl.SumDuration, + Salary: ri.FinalSalary, + ProjectId: ri.ProjectId, + TeamId: ri.TeamId, + DateOfIssue: dl.DateOfIssue, + Lister: dl.Lister, + } + bsd = append(bsd, details) + //副表数据 + for i := range dl.Dates { + res := model.DateTwoRes{ + SfzNumber: ri.SfzNumber, + WorkingDate: dl.Dates[i].WorkingDate, + Duration: dl.Dates[i].Duration, + DateOfIssue: dl.DateOfIssue, + } + dtr = append(dtr, res) + } + sfzs = append(sfzs, ri.SfzNumber) + } + } + + //先删除重复数据 + _, err = dao.BusSalaryDetails.Ctx(ctx).Where("date_of_issue", years).WhereIn("sfz_number", sfz).Delete() + liberr.ErrIsNil(ctx, err, "添加失败") + _, err := g.DB().Model("bus_salary_details_record").Ctx(ctx).Where("date_of_issue", years).WhereIn("sfz_number", sfz).Delete() + liberr.ErrIsNil(ctx, err, "添加失败") + //插入数据 + _, err = dao.BusSalaryDetails.Ctx(ctx).Data(bsd).Batch(100).Insert() + liberr.ErrIsNil(ctx, err, "添加失败") + _, err = g.DB().Model("bus_salary_details_record").Ctx(ctx).Data(dtr).Batch(100).Insert() + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return err + }) + return +} + +func (s *sBusSalaryDetails) Edit(ctx context.Context, req *system.BusSalaryDetailsEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusSalaryDetails.Ctx(ctx).WherePri(req.Id).Update(do.BusSalaryDetails{}) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusSalaryDetails) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusSalaryDetails.Ctx(ctx).Delete(dao.BusSalaryDetails.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busScheduledPlanType/bus_scheduled_plan_type.go b/internal/app/system/logic/busScheduledPlanType/bus_scheduled_plan_type.go new file mode 100644 index 0000000..12a5788 --- /dev/null +++ b/internal/app/system/logic/busScheduledPlanType/bus_scheduled_plan_type.go @@ -0,0 +1,176 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-07-29 17:39:12 +// 生成路径: internal/app/system/logic/bus_scheduled_plan_type.go +// 生成人:gfast +// desc:施工进度分类 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterBusScheduledPlanType(New()) +} + +func New() *sBusScheduledPlanType { + return &sBusScheduledPlanType{} +} + +type sBusScheduledPlanType struct{} + +func (s *sBusScheduledPlanType) List(ctx context.Context, req *system.BusScheduledPlanTypeSearchReq) (listRes *system.BusScheduledPlanTypeSearchRes, err error) { + listRes = new(system.BusScheduledPlanTypeSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusScheduledPlanType.Ctx(ctx).WithAll() + if req.PlanTypeId != "" { + m = m.Where(dao.BusScheduledPlanType.Columns().PlanTypeId+" = ?", req.PlanTypeId) + } + if req.ParentId != "" { + m = m.Where(dao.BusScheduledPlanType.Columns().ParentId+" = ?", gconv.Int(req.ParentId)) + } + if req.Ancestors != "" { + m = m.Where(dao.BusScheduledPlanType.Columns().Ancestors+" = ?", req.Ancestors) + } + if req.PlanTypeName != "" { + m = m.Where(dao.BusScheduledPlanType.Columns().PlanTypeName+" like ?", "%"+req.PlanTypeName+"%") + } + if req.PlannedTime != "" { + m = m.Where(dao.BusScheduledPlanType.Columns().PlannedTime+" = ?", gconv.Int64(req.PlannedTime)) + } + if req.PlanStartTime != "" { + m = m.Where(dao.BusScheduledPlanType.Columns().PlanStartTime+" = ?", req.PlanStartTime) + } + if req.PlanEndTime != "" { + m = m.Where(dao.BusScheduledPlanType.Columns().PlanEndTime+" = ?", req.PlanEndTime) + } + if req.OrderNum != "" { + m = m.Where(dao.BusScheduledPlanType.Columns().OrderNum+" = ?", gconv.Int(req.OrderNum)) + } + if req.ProjectId != "" { + m = m.Where(dao.BusScheduledPlanType.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + if req.Leader != "" { + m = m.Where(dao.BusScheduledPlanType.Columns().Leader+" = ?", req.Leader) + } + if req.Status != "" { + m = m.Where(dao.BusScheduledPlanType.Columns().Status+" = ?", req.Status) + } + if req.CreateBy != "" { + m = m.Where(dao.BusScheduledPlanType.Columns().CreateBy+" = ?", req.CreateBy) + } + if req.UpdateBy != "" { + m = m.Where(dao.BusScheduledPlanType.Columns().UpdateBy+" = ?", req.UpdateBy) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusScheduledPlanType.Columns().CreatedAt+" >=? AND "+dao.BusScheduledPlanType.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "plan_type_id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusScheduledPlanTypeInfoRes + err = m.Fields(system.BusScheduledPlanTypeSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusScheduledPlanTypeListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusScheduledPlanTypeListRes{ + PlanTypeId: v.PlanTypeId, + ParentId: v.ParentId, + Ancestors: v.Ancestors, + PlanTypeName: v.PlanTypeName, + PlannedTime: v.PlannedTime, + PlanStartTime: v.PlanStartTime, + PlanEndTime: v.PlanEndTime, + OrderNum: v.OrderNum, + ProjectId: v.ProjectId, + Leader: v.Leader, + Status: v.Status, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusScheduledPlanType) GetByPlanTypeId(ctx context.Context, planTypeId int) (res *model.BusScheduledPlanTypeInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusScheduledPlanType.Ctx(ctx).WithAll().Where(dao.BusScheduledPlanType.Columns().PlanTypeId, planTypeId).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusScheduledPlanType) Add(ctx context.Context, req *system.BusScheduledPlanTypeAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusScheduledPlanType.Ctx(ctx).Insert(do.BusScheduledPlanType{ + ParentId: req.ParentId, + Ancestors: req.Ancestors, + PlanTypeName: req.PlanTypeName, + PlannedTime: req.PlannedTime, + PlanStartTime: req.PlanStartTime, + PlanEndTime: req.PlanEndTime, + OrderNum: req.OrderNum, + ProjectId: req.ProjectId, + Leader: req.Leader, + Status: req.Status, + CreateBy: req.CreateBy, + UpdateBy: req.UpdateBy, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusScheduledPlanType) Edit(ctx context.Context, req *system.BusScheduledPlanTypeEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusScheduledPlanType.Ctx(ctx).WherePri(req.PlanTypeId).Update(do.BusScheduledPlanType{ + ParentId: req.ParentId, + Ancestors: req.Ancestors, + PlanTypeName: req.PlanTypeName, + PlannedTime: req.PlannedTime, + PlanStartTime: req.PlanStartTime, + PlanEndTime: req.PlanEndTime, + OrderNum: req.OrderNum, + ProjectId: req.ProjectId, + Leader: req.Leader, + Status: req.Status, + CreateBy: req.CreateBy, + UpdateBy: req.UpdateBy, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusScheduledPlanType) Delete(ctx context.Context, planTypeIds []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusScheduledPlanType.Ctx(ctx).Delete(dao.BusScheduledPlanType.Columns().PlanTypeId+" in (?)", planTypeIds) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busScheduledPlanTypeDetail/bus_scheduled_plan_type_detail.go b/internal/app/system/logic/busScheduledPlanTypeDetail/bus_scheduled_plan_type_detail.go new file mode 100644 index 0000000..ab0055d --- /dev/null +++ b/internal/app/system/logic/busScheduledPlanTypeDetail/bus_scheduled_plan_type_detail.go @@ -0,0 +1,143 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-07-29 17:15:27 +// 生成路径: internal/app/system/logic/bus_scheduled_plan_type_detail.go +// 生成人:gfast +// desc:施工进度月报,年报分类 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterBusScheduledPlanTypeDetail(New()) +} + +func New() *sBusScheduledPlanTypeDetail { + return &sBusScheduledPlanTypeDetail{} +} + +type sBusScheduledPlanTypeDetail struct{} + +func (s *sBusScheduledPlanTypeDetail) List(ctx context.Context, req *system.BusScheduledPlanTypeDetailSearchReq) (listRes *system.BusScheduledPlanTypeDetailSearchRes, err error) { + listRes = new(system.BusScheduledPlanTypeDetailSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusScheduledPlanTypeDetail.Ctx(ctx).WithAll() + if req.PlanTypeName != "" { + m = m.Where(dao.BusScheduledPlanTypeDetail.Columns().PlanTypeName+" like ?", "%"+req.PlanTypeName+"%") + } + if req.ProjectId != "" { + m = m.Where(dao.BusScheduledPlanTypeDetail.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusScheduledPlanTypeDetail.Columns().CreatedAt+" >=? AND "+dao.BusScheduledPlanTypeDetail.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "plan_type_detail_id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusScheduledPlanTypeDetailInfoRes + err = m.Fields(system.BusScheduledPlanTypeDetailSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusScheduledPlanTypeDetailListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusScheduledPlanTypeDetailListRes{ + PlanTypeDetailId: v.PlanTypeDetailId, + ParentId: v.ParentId, + Ancestors: v.Ancestors, + PlanTypeName: v.PlanTypeName, + PlannedTime: v.PlannedTime, + PlanStartTime: v.PlanStartTime, + PlanEndTime: v.PlanEndTime, + OrderNum: v.OrderNum, + DateValue: v.DateValue, + DateType: v.DateType, + ProjectId: v.ProjectId, + Leader: v.Leader, + Status: v.Status, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusScheduledPlanTypeDetail) GetByPlanTypeDetailId(ctx context.Context, planTypeDetailId int) (res *model.BusScheduledPlanTypeDetailInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusScheduledPlanTypeDetail.Ctx(ctx).WithAll().Where(dao.BusScheduledPlanTypeDetail.Columns().PlanTypeDetailId, planTypeDetailId).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusScheduledPlanTypeDetail) Add(ctx context.Context, req *system.BusScheduledPlanTypeDetailAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusScheduledPlanTypeDetail.Ctx(ctx).Insert(do.BusScheduledPlanTypeDetail{ + ParentId: req.ParentId, + Ancestors: req.Ancestors, + PlanTypeName: req.PlanTypeName, + PlannedTime: req.PlannedTime, + PlanStartTime: req.PlanStartTime, + PlanEndTime: req.PlanEndTime, + OrderNum: req.OrderNum, + DateValue: req.DateValue, + DateType: req.DateType, + ProjectId: req.ProjectId, + Leader: req.Leader, + Status: req.Status, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusScheduledPlanTypeDetail) Edit(ctx context.Context, req *system.BusScheduledPlanTypeDetailEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusScheduledPlanTypeDetail.Ctx(ctx).WherePri(req.PlanTypeDetailId).Update(do.BusScheduledPlanTypeDetail{ + ParentId: req.ParentId, + Ancestors: req.Ancestors, + PlanTypeName: req.PlanTypeName, + PlannedTime: req.PlannedTime, + PlanStartTime: req.PlanStartTime, + PlanEndTime: req.PlanEndTime, + OrderNum: req.OrderNum, + DateValue: req.DateValue, + DateType: req.DateType, + ProjectId: req.ProjectId, + Leader: req.Leader, + Status: req.Status, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusScheduledPlanTypeDetail) Delete(ctx context.Context, planTypeDetailIds []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusScheduledPlanTypeDetail.Ctx(ctx).Delete(dao.BusScheduledPlanTypeDetail.Columns().PlanTypeDetailId+" in (?)", planTypeDetailIds) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busScheduledWeekly/bus_scheduled_weekly.go b/internal/app/system/logic/busScheduledWeekly/bus_scheduled_weekly.go new file mode 100644 index 0000000..5cfce29 --- /dev/null +++ b/internal/app/system/logic/busScheduledWeekly/bus_scheduled_weekly.go @@ -0,0 +1,139 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-02 15:28:49 +// 生成路径: internal/app/system/logic/bus_scheduled_weekly.go +// 生成人:gfast +// desc:周报 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterBusScheduledWeekly(New()) +} + +func New() *sBusScheduledWeekly { + return &sBusScheduledWeekly{} +} + +type sBusScheduledWeekly struct{} + +func (s *sBusScheduledWeekly) List(ctx context.Context, req *system.BusScheduledWeeklySearchReq) (listRes *system.BusScheduledWeeklySearchRes, err error) { + listRes = new(system.BusScheduledWeeklySearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusScheduledWeekly.Ctx(ctx).WithAll() + if req.Status != "" { + m = m.Where(dao.BusScheduledWeekly.Columns().Status+" = ?", req.Status) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusScheduledWeekly.Columns().CreatedAt+" >=? AND "+dao.BusScheduledWeekly.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "plan_weekly_id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusScheduledWeeklyInfoRes + err = m.Fields(system.BusScheduledWeeklySearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusScheduledWeeklyListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusScheduledWeeklyListRes{ + PlanWeeklyId: v.PlanWeeklyId, + PlanPeriodId: v.PlanPeriodId, + WeeklyPlanName: v.WeeklyPlanName, + WeeklyStartTime: v.WeeklyStartTime, + WeeklyEndTime: v.WeeklyEndTime, + WeeklyPlanFinish: v.WeeklyPlanFinish, + WeeklyRealityFinish: v.WeeklyRealityFinish, + WeekyAccumulativeFinish: v.WeekyAccumulativeFinish, + WeekyAccumulativeTotal: v.WeekyAccumulativeTotal, + CompletionRate: v.CompletionRate, + Leader: v.Leader, + Status: v.Status, + WeeklyDocumentUrl: v.WeeklyDocumentUrl, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusScheduledWeekly) GetByPlanWeeklyId(ctx context.Context, planWeeklyId int64) (res *model.BusScheduledWeeklyInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusScheduledWeekly.Ctx(ctx).WithAll().Where(dao.BusScheduledWeekly.Columns().PlanWeeklyId, planWeeklyId).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusScheduledWeekly) Add(ctx context.Context, req *system.BusScheduledWeeklyAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusScheduledWeekly.Ctx(ctx).Insert(do.BusScheduledWeekly{ + PlanPeriodId: req.PlanPeriodId, + WeeklyPlanName: req.WeeklyPlanName, + WeeklyStartTime: req.WeeklyStartTime, + WeeklyEndTime: req.WeeklyEndTime, + WeeklyPlanFinish: req.WeeklyPlanFinish, + WeeklyRealityFinish: req.WeeklyRealityFinish, + WeekyAccumulativeFinish: req.WeekyAccumulativeFinish, + WeekyAccumulativeTotal: req.WeekyAccumulativeTotal, + CompletionRate: req.CompletionRate, + Leader: req.Leader, + Status: req.Status, + WeeklyDocumentUrl: req.WeeklyDocumentUrl, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusScheduledWeekly) Edit(ctx context.Context, req *system.BusScheduledWeeklyEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusScheduledWeekly.Ctx(ctx).WherePri(req.PlanWeeklyId).Update(do.BusScheduledWeekly{ + PlanPeriodId: req.PlanPeriodId, + WeeklyPlanName: req.WeeklyPlanName, + WeeklyStartTime: req.WeeklyStartTime, + WeeklyEndTime: req.WeeklyEndTime, + WeeklyPlanFinish: req.WeeklyPlanFinish, + WeeklyRealityFinish: req.WeeklyRealityFinish, + WeekyAccumulativeFinish: req.WeekyAccumulativeFinish, + WeekyAccumulativeTotal: req.WeekyAccumulativeTotal, + CompletionRate: req.CompletionRate, + Leader: req.Leader, + Status: req.Status, + WeeklyDocumentUrl: req.WeeklyDocumentUrl, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusScheduledWeekly) Delete(ctx context.Context, planWeeklyIds []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusScheduledWeekly.Ctx(ctx).Delete(dao.BusScheduledWeekly.Columns().PlanWeeklyId+" in (?)", planWeeklyIds) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busScheduledWeeklyPhotovoltaic/bus_scheduled_weekly_photovoltaic.go b/internal/app/system/logic/busScheduledWeeklyPhotovoltaic/bus_scheduled_weekly_photovoltaic.go new file mode 100644 index 0000000..aebee7c --- /dev/null +++ b/internal/app/system/logic/busScheduledWeeklyPhotovoltaic/bus_scheduled_weekly_photovoltaic.go @@ -0,0 +1,127 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-02 15:21:55 +// 生成路径: internal/app/system/logic/bus_scheduled_weekly_photovoltaic.go +// 生成人:gfast +// desc:周报-光伏板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterBusScheduledWeeklyPhotovoltaic(New()) +} + +func New() *sBusScheduledWeeklyPhotovoltaic { + return &sBusScheduledWeeklyPhotovoltaic{} +} + +type sBusScheduledWeeklyPhotovoltaic struct{} + +func (s *sBusScheduledWeeklyPhotovoltaic) List(ctx context.Context, req *system.BusScheduledWeeklyPhotovoltaicSearchReq) (listRes *system.BusScheduledWeeklyPhotovoltaicSearchRes, err error) { + listRes = new(system.BusScheduledWeeklyPhotovoltaicSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusScheduledWeeklyPhotovoltaic.Ctx(ctx).WithAll() + if req.PhotovoltaicNumber != "" { + m = m.Where(dao.BusScheduledWeeklyPhotovoltaic.Columns().PhotovoltaicNumber+" = ?", req.PhotovoltaicNumber) + } + if req.InstallNot != "" { + m = m.Where(dao.BusScheduledWeeklyPhotovoltaic.Columns().InstallNot+" = ?", req.InstallNot) + } + if req.Status != "" { + m = m.Where(dao.BusScheduledWeeklyPhotovoltaic.Columns().Status+" = ?", req.Status) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusScheduledWeeklyPhotovoltaic.Columns().CreatedAt+" >=? AND "+dao.BusScheduledWeeklyPhotovoltaic.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "photovoltaic_id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusScheduledWeeklyPhotovoltaicInfoRes + err = m.Fields(system.BusScheduledWeeklyPhotovoltaicSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusScheduledWeeklyPhotovoltaicListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusScheduledWeeklyPhotovoltaicListRes{ + PhotovoltaicId: v.PhotovoltaicId, + PlanWeeklyId: v.PlanWeeklyId, + PhotovoltaicNumber: v.PhotovoltaicNumber, + PhotovoltaicNumberGis: v.PhotovoltaicNumberGis, + InstallNot: v.InstallNot, + InstallCreateTime: v.InstallCreateTime, + Status: v.Status, + ProjectId: v.ProjectId, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusScheduledWeeklyPhotovoltaic) GetByPhotovoltaicId(ctx context.Context, photovoltaicId int64) (res *model.BusScheduledWeeklyPhotovoltaicInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusScheduledWeeklyPhotovoltaic.Ctx(ctx).WithAll().Where(dao.BusScheduledWeeklyPhotovoltaic.Columns().PhotovoltaicId, photovoltaicId).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusScheduledWeeklyPhotovoltaic) Add(ctx context.Context, req *system.BusScheduledWeeklyPhotovoltaicAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusScheduledWeeklyPhotovoltaic.Ctx(ctx).Insert(do.BusScheduledWeeklyPhotovoltaic{ + PlanWeeklyId: req.PlanWeeklyId, + PhotovoltaicNumber: req.PhotovoltaicNumber, + PhotovoltaicNumberGis: req.PhotovoltaicNumberGis, + ProjectId: req.ProjectId, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusScheduledWeeklyPhotovoltaic) Edit(ctx context.Context, req *system.BusScheduledWeeklyPhotovoltaicEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusScheduledWeeklyPhotovoltaic.Ctx(ctx).WherePri(req.PhotovoltaicId).Update(do.BusScheduledWeeklyPhotovoltaic{ + PlanWeeklyId: req.PlanWeeklyId, + PhotovoltaicNumber: req.PhotovoltaicNumber, + PhotovoltaicNumberGis: req.PhotovoltaicNumberGis, + InstallNot: req.InstallNot, + InstallCreateTime: req.InstallCreateTime, + Status: req.Status, + ProjectId: req.ProjectId, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusScheduledWeeklyPhotovoltaic) Delete(ctx context.Context, photovoltaicIds []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusScheduledWeeklyPhotovoltaic.Ctx(ctx).Delete(dao.BusScheduledWeeklyPhotovoltaic.Columns().PhotovoltaicId+" in (?)", photovoltaicIds) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busStandingBook/bus_standing_book.go b/internal/app/system/logic/busStandingBook/bus_standing_book.go new file mode 100644 index 0000000..c6e601f --- /dev/null +++ b/internal/app/system/logic/busStandingBook/bus_standing_book.go @@ -0,0 +1,144 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-07-29 11:36:04 +// 生成路径: internal/app/system/logic/bus_standing_book.go +// 生成人:gfast +// desc:台账 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterBusStandingBook(New()) +} + +func New() *sBusStandingBook { + return &sBusStandingBook{} +} + +type sBusStandingBook struct{} + +func (s *sBusStandingBook) List(ctx context.Context, req *system.BusStandingBookSearchReq) (listRes *system.BusStandingBookSearchRes, err error) { + listRes = new(system.BusStandingBookSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusStandingBook.Ctx(ctx).WithAll() + if req.EquipmentMaterialsId != "" { + m = m.Where(dao.BusStandingBook.Columns().EquipmentMaterialsId+" like ?", "%"+req.EquipmentMaterialsId+"%") + } + if req.StandingBookType != "" { + m = m.Where(dao.BusStandingBook.Columns().StandingBookType+" = ?", req.StandingBookType) + } + //创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.BusStandingBook.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusStandingBook.Columns().CreatedAt+" >=? AND "+dao.BusStandingBook.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "standing_book_id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusStandingBookInfoRes + err = m.Fields(system.BusStandingBookSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusStandingBookListRes, len(res)) + for k, v := range res { + fromString, _ := tool.New().FormatTimeString(v.ApproachTime, "2") + listRes.List[k] = &model.BusStandingBookListRes{ + StandingBookId: v.StandingBookId, + EquipmentMaterialsId: v.EquipmentMaterialsId, + StandingBookType: v.StandingBookType, + ApproachTime: fromString, + Quantity: v.Quantity, + Gross: v.Gross, + Status: v.Status, + SignerRecipient: v.SignerRecipient, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusStandingBook) GetByStandingBookId(ctx context.Context, standingBookId int64) (res *model.BusStandingBookInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusStandingBook.Ctx(ctx).WithAll().Where(dao.BusStandingBook.Columns().StandingBookId, standingBookId).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusStandingBookInfoRes) + res = &infoRes + return +} + +func (s *sBusStandingBook) Add(ctx context.Context, req *system.BusStandingBookAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + name := ct.New().GetLoginUser(ctx).Id + _, err = dao.BusStandingBook.Ctx(ctx).Insert(do.BusStandingBook{ + EquipmentMaterialsId: req.EquipmentMaterialsId, + ProjectId: req.ProjectId, + StandingBookType: req.StandingBookType, + ApproachTime: req.ApproachTime, + Quantity: req.Quantity, + Gross: req.Quantity, + SignerRecipient: req.SignerRecipient, + CreateBy: name, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusStandingBook) Edit(ctx context.Context, req *system.BusStandingBookEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + name := ct.New().GetLoginUser(ctx).Id + _, err = dao.BusStandingBook.Ctx(ctx).WherePri(req.StandingBookId).Update(do.BusStandingBook{ + EquipmentMaterialsId: req.EquipmentMaterialsId, + StandingBookType: req.StandingBookType, + ApproachTime: req.ApproachTime, + Quantity: req.Quantity, + SignerRecipient: req.SignerRecipient, + UpdateBy: name, + Status: req.Status, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusStandingBook) Delete(ctx context.Context, standingBookIds []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusStandingBook.Ctx(ctx).Delete(dao.BusStandingBook.Columns().StandingBookId+" in (?)", standingBookIds) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busTour/bus_tour.go b/internal/app/system/logic/busTour/bus_tour.go new file mode 100644 index 0000000..f2ead9e --- /dev/null +++ b/internal/app/system/logic/busTour/bus_tour.go @@ -0,0 +1,198 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-10-10 12:11:05 +// 生成路径: internal/app/system/logic/bus_tour.go +// 生成人:gfast +// desc:煤科巡视-故障记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "strings" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + busFolderFile "github.com/tiger1103/gfast/v3/internal/app/system/logic/busFolderFile" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterBusTour(New()) +} + +func New() *sBusTour { + return &sBusTour{} +} + +type sBusTour struct{} + +func (s *sBusTour) ListAll(ctx context.Context, req *system.BusTourSearchAllReq) (listRes *system.BusTourSearchAllRes, err error) { + listRes = new(system.BusTourSearchAllRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusTour.Ctx(ctx).WithAll() + if req.ProjectId != "" { + m = m.Where(dao.BusTour.Columns().ProjectId, req.ProjectId) + } + order := "created_at desc" + var res []*model.BusTourInfoRes + err = m.Order(order).Limit(18).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusTourListRes, len(res)) + for k, v := range res { + // 获取当前数据的违章图片 + // value, _ := g.DB().Model(v.TableName).Ctx(ctx).WherePri("id", v.TableId).Fields("camera_name as nickname").Value() + listRes.List[k] = &model.BusTourListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + TourCategory: v.TourCategory, + TourType: v.TourType, + Picture: v.Picture, + Describe: v.Describe, + Num: v.Num, + // Nickname: value.String(), + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusTour) List(ctx context.Context, req *system.BusTourSearchReq) (listRes *system.BusTourSearchRes, err error) { + listRes = new(system.BusTourSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusTour.Ctx(ctx).WithAll() + if req.ProjectId != "" { + m = m.Where(dao.BusTour.Columns().ProjectId, req.ProjectId) + } + if req.TourCategory != "" { + m = m.Where(dao.BusTour.Columns().TourCategory+" = ?", req.TourCategory) + } + if req.TourType != "" { + m = m.Where(dao.BusTour.Columns().TourType+" = ?", req.TourType) + } + if req.Describe != "" { + m = m.Where(dao.BusTour.Columns().Describe+" = ?", req.Describe) + } + // 创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.BusTour.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusTour.Columns().CreatedAt+" >=? AND "+dao.BusTour.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "created_at desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusTourInfoRes + err = m.Fields(system.BusTourSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusTourListRes, len(res)) + for k, v := range res { + // value, _ := g.DB().Model(v.TableName).Ctx(ctx).WherePri("id", v.TableId).Fields("camera_name as nickname").Value() + listRes.List[k] = &model.BusTourListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + TourCategory: v.TourCategory, + TourType: v.TourType, + Picture: v.Picture, + Describe: v.Describe, + Num: v.Num, + // Nickname: value.String(), + CreatedAt: v.CreatedAt, + SxtName: v.SxtName, + } + } + }) + return +} + +func (s *sBusTour) GetById(ctx context.Context, id int64) (res *model.BusTourInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusTour.Ctx(ctx).WithAll().Where(dao.BusTour.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusTour) Add(ctx context.Context, req *system.BusTourAddReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 1、新增数据 + idInfo, err := dao.BusTour.Ctx(ctx).Insert(do.BusTour{ + ProjectId: req.ProjectId, + TourCategory: req.TourCategory, + TourType: req.TourType, + Picture: req.Picture, + Describe: req.Describe, + Num: req.Num, + TableName: req.TableName, + TableId: req.TableId, + SxtName: req.SxtName, + }) + id, err := idInfo.LastInsertId() + // 2、将数据给到图库 + err = busFolderFile.New().AllPicture( + ctx, + strings.Split(req.Picture, ","), + 4, + dao.BusTour.Table(), + id, + "1", + "1", + "", + req.ProjectId, + ) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return err + }) + return +} + +func (s *sBusTour) Edit(ctx context.Context, req *system.BusTourEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusTour.Ctx(ctx).WherePri(req.Id).Update(do.BusTour{}) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusTour) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 1、删除资源文件 + var res []*model.BusTourInfoRes + dao.BusTour.Ctx(ctx).Where("id in (?)", ids).Fields("picture").Scan(&res) + if len(res) > 0 { + for _, data := range res { + coryCommon.BatchFile(strings.Split(data.Picture, ",")) + } + } + // 2、删除数据 + _, err = dao.BusTour.Ctx(ctx).Delete(dao.BusTour.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busTypeOfWage/bus_type_of_wage.go b/internal/app/system/logic/busTypeOfWage/bus_type_of_wage.go new file mode 100644 index 0000000..95c2af3 --- /dev/null +++ b/internal/app/system/logic/busTypeOfWage/bus_type_of_wage.go @@ -0,0 +1,119 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-09-05 10:07:11 +// 生成路径: internal/app/system/logic/bus_type_of_wage.go +// 生成人:gfast +// desc:工种薪水 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterBusTypeOfWage(New()) +} + +func New() *sBusTypeOfWage { + return &sBusTypeOfWage{} +} + +type sBusTypeOfWage struct{} + +func (s *sBusTypeOfWage) List(ctx context.Context, req *system.BusTypeOfWageSearchReq) (listRes *system.BusTypeOfWageSearchRes, err error) { + listRes = new(system.BusTypeOfWageSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusTypeOfWage.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.BusTypeOfWage.Columns().Id+" = ?", req.Id) + } + if req.TypeOfWork != "" { + m = m.Where(dao.BusTypeOfWage.Columns().TypeOfWork+" = ?", req.TypeOfWork) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusTypeOfWage.Columns().CreatedAt+" >=? AND "+dao.BusTypeOfWage.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusTypeOfWageInfoRes + err = m.Fields(system.BusTypeOfWageSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusTypeOfWageListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusTypeOfWageListRes{ + Id: v.Id, + TypeOfWork: v.TypeOfWork, + Standard: v.Standard, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusTypeOfWage) GetById(ctx context.Context, id int64) (res *model.BusTypeOfWageInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusTypeOfWage.Ctx(ctx).WithAll().Where(dao.BusTypeOfWage.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusTypeOfWage) Add(ctx context.Context, req *system.BusTypeOfWageAddReq) (err error) { + //1、查询数据是否存在 + count, err := dao.BusTypeOfWage.Ctx(ctx).WithAll().Where(dao.BusTypeOfWage.Columns().TypeOfWork, req.TypeOfWork).Count() + if count > 0 { + err = errors.New("当前工种薪资已存在!") + return + } + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusTypeOfWage.Ctx(ctx).Insert(do.BusTypeOfWage{ + TypeOfWork: req.TypeOfWork, + Standard: req.Standard, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusTypeOfWage) Edit(ctx context.Context, req *system.BusTypeOfWageEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusTypeOfWage.Ctx(ctx).WherePri(req.Id).Update(do.BusTypeOfWage{ + TypeOfWork: req.TypeOfWork, + Standard: req.Standard, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusTypeOfWage) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusTypeOfWage.Ctx(ctx).Unscoped().Delete(dao.BusTypeOfWage.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/busViolationLevel/bus_violation_level.go b/internal/app/system/logic/busViolationLevel/bus_violation_level.go new file mode 100644 index 0000000..9b44235 --- /dev/null +++ b/internal/app/system/logic/busViolationLevel/bus_violation_level.go @@ -0,0 +1,206 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-11-20 11:18:36 +// 生成路径: internal/app/system/logic/bus_violation_level.go +// 生成人:gfast +// desc:违章等级 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "strings" +) + +func init() { + service.RegisterBusViolationLevel(New()) +} + +func New() *sBusViolationLevel { + return &sBusViolationLevel{} +} + +type sBusViolationLevel struct{} + +func (s *sBusViolationLevel) List(ctx context.Context, req *system.BusViolationLevelSearchReq) (listRes *system.BusViolationLevelSearchRes, err error) { + listRes = new(system.BusViolationLevelSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusViolationLevel.Ctx(ctx).WithAll() + if req.TourType != "" { + m = m.Where(dao.BusViolationLevel.Columns().TourType+" = ?", req.TourType) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusViolationLevel.Columns().CreatedAt+" >=? AND "+dao.BusViolationLevel.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusViolationLevelInfoRes + err = m.Fields(system.BusViolationLevelSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusViolationLevelListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusViolationLevelListRes{ + Id: v.Id, + Grade: v.Grade, + Color: v.Color, + TourType: v.TourType, + CreatedAt: v.CreatedAt, + Risx: v.Risx, + } + } + }) + return +} + +func (s *sBusViolationLevel) GetById(ctx context.Context, id int64) (res *model.BusViolationLevelInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、获取等级信息 + err = dao.BusViolationLevel.Ctx(ctx).WithAll().Where(dao.BusViolationLevel.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + err, postEntity := SelectLevelByPostInfo(ctx, id) + liberr.ErrIsNil(ctx, err) + res.PostEntity = append(res.PostEntity, postEntity...) + }) + return +} + +func (s *sBusViolationLevel) Add(ctx context.Context, req *system.BusViolationLevelAddReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //1、级别不能重复、添加了的类别也不许重复、颜色也不许重复 + tourTypeStr := strings.Split(req.TourType, ",") + count, err := dao.BusViolationLevel.Ctx(ctx).Where("grade", req.Grade).WhereOr("color", req.Color).WhereOrIn("tour_type", tourTypeStr).Count() + if count > 0 { + err = errors.New("请检查当前等级、颜色、类型是否被重复添加!") + liberr.ErrIsNil(ctx, err) + return + } + //2、新增数据 + result, err := dao.BusViolationLevel.Ctx(ctx).Insert(do.BusViolationLevel{ + ProjectId: req.ProjectId, + Grade: req.Grade, + Color: req.Color, + TourType: req.TourType, + Risx: req.Risx, + WxOrPc: "1", + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + //3、等级与岗位进行关联 + if len(req.Posts) == 0 { + return + } + id, _ := result.LastInsertId() + err = InsertLevelPost(ctx, req.Posts, id) + liberr.ErrIsNil(ctx, err) + }) + return err + }) + return +} + +func (s *sBusViolationLevel) Edit(ctx context.Context, req *system.BusViolationLevelEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + ////1、级别不能重复、添加了的类别也不许重复、颜色也不许重复 + //tourTypeStr := strings.Split(req.TourType, ",") + //for i := range tourTypeStr { + // count, err := dao.BusViolationLevel.Ctx(ctx). + // WhereNot("id", req.Id). + // Where("grade = ? OR color = ? OR tour_type like (?)", req.Grade, req.Color, "%"+tourTypeStr[i]+"%").Count() + // if count > 0 { + // err = errors.New("请检查当前等级、颜色、类型是否被重复添加!") + // liberr.ErrIsNil(ctx, err) + // return + // } + //} + //2、修改数据 + _, err := dao.BusViolationLevel.Ctx(ctx).WherePri(req.Id).Update(do.BusViolationLevel{ + Grade: req.Grade, + Color: req.Color, + TourType: req.TourType, + Risx: req.Risx, + WxOrPc: "1", + UpdateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + //3、等级与岗位进行关联(先删再增加) + if len(req.Posts) == 0 { + return + } + //id, _ := result.LastInsertId() + _, err = g.DB().Model("bus_violation_level_post").Ctx(ctx).Where("level", req.Id).Delete() + liberr.ErrIsNil(ctx, err) + err = InsertLevelPost(ctx, req.Posts, req.Id) + liberr.ErrIsNil(ctx, err) + }) + return +} + +func (s *sBusViolationLevel) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusViolationLevel.Ctx(ctx).Delete(dao.BusViolationLevel.Columns().Id+" in (?)", ids) + _, err = g.DB().Model("bus_violation_level_post").Ctx(ctx).Unscoped().Delete(" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +// InsertLevelPost 插入数据(等级与岗位关联) +func InsertLevelPost(ctx context.Context, posts []int64, id int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + var violationLevelPostEntity []*model.ViolationLevelPost + for i := range posts { + violationLevelPostEntity = append(violationLevelPostEntity, &model.ViolationLevelPost{ + Level: id, + Post: posts[i], + }) + } + _, err = g.DB().Model("bus_violation_level_post").Ctx(ctx).Insert(violationLevelPostEntity) + liberr.ErrIsNil(ctx, err, "岗位关联失败") + }) + return err +} + +// SelectLevelByPostInfo 通过等级id获取到岗位信息 +func SelectLevelByPostInfo(ctx context.Context, id int64) (err error, postEntity []*entity.SysPost) { + err = g.Try(ctx, func(ctx context.Context) { + //2、获取到当前等级的岗位信息 + array, err := g.DB().Model("bus_violation_level_post").Ctx(ctx).Where("level", id).Fields("post").Array() + liberr.ErrIsNil(ctx, err, "获取岗位失败") + if len(array) > 0 { + //3、通过岗位信息得到岗位信息 + dao.SysPost.Ctx(ctx).Fields("post_id,post_code,post_name"). + Where("post_id in (?)", array). + Where("status = 1"). + OrderAsc("post_sort"). + Scan(&postEntity) + } + + }) + return +} diff --git a/internal/app/system/logic/busViolationRecord/bus_violation_record.go b/internal/app/system/logic/busViolationRecord/bus_violation_record.go new file mode 100644 index 0000000..2eabade --- /dev/null +++ b/internal/app/system/logic/busViolationRecord/bus_violation_record.go @@ -0,0 +1,966 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-11-20 11:18:37 +// 生成路径: internal/app/system/logic/bus_violation_record.go +// 生成人:gfast +// desc:违章记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gconv" + "github.com/gogf/gf/v2/util/gmeta" + "github.com/jinzhu/copier" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + wxSystem "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/tiger1103/gfast/v3/third/reminders" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" + "sort" + "strconv" + "strings" + "time" +) + +func init() { + service.RegisterBusViolationRecord(New()) +} + +func New() *sBusViolationRecord { + return &sBusViolationRecord{} +} + +type sBusViolationRecord struct{} + +func (s *sBusViolationRecord) AppSafetyHazardTodayFunc(ctx context.Context, req *wxSystem.AppSafetyHazardTodayReq) (listRes *wxSystem.AppSafetyHazardTodayRes, err error) { + listRes = new(wxSystem.AppSafetyHazardTodayRes) + err = g.Try(ctx, func(ctx context.Context) { + //2、查询违章记录 + var listEnity []*model.AppWorkOrderPcListLogicRes + m := dao.BusViolationRecord.Ctx(ctx).As("a"). + LeftJoin("sys_dict_data", "b", "b.dict_type = 'tour_type' and b.dict_value = a.tour_type"). + LeftJoin("sys_dict_data", "c", "c.dict_type = 'violation_record_data_source' and c.dict_value = a.data_source"). + LeftJoin("sys_project", "d", "d.id = a.project_id"). + Fields("a.id,a.created_at,b.dict_label as tt,c.dict_label as ds,d.project_name as projectName") + if req.FuzzyQuery != "" { //模糊查询 + array, _ := g.DB().Model("sys_dict_data").Ctx(ctx). + Where("dict_type", "tour_type"). + Where("dict_label like ?", "%"+req.FuzzyQuery+"%").Fields("dict_value").Array() + m = m.Where("a.tour_type in (?)", array) + } + if req.DateQuery != "" { + m = m.Where("DATE_FORMAT( a.created_at, '%Y-%m-%d' ) = ?", req.DateQuery) + } + array, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + listRes.Total = len(array) + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "a.created_at desc" + if req.OrderBy != "" { + order = req.OrderBy + } + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&listEnity) + liberr.ErrIsNil(ctx, err) + // 获取附件信息(通知) + for i := range listEnity { + var entity []*model.BusViolationRecordPathLogicRes + g.DB().Model("bus_violation_record_path").Ctx(ctx). + Where("ticket_id", listEnity[i].Id). + Where("type", 1). + Fields("path").Scan(&entity) + listEnity[i].CheckAttachment = entity + } + listRes.List = listEnity + }) + return +} + +func (s *sBusViolationRecord) AppWorkOrderAppListFunc(ctx context.Context, req *wxSystem.AppWorkOrderAppListReq) (listRes *wxSystem.AppWorkOrderPcListRes, err error) { + listRes = new(wxSystem.AppWorkOrderPcListRes) + err = g.Try(ctx, func(ctx context.Context) { + //2、查询违章记录 + var listEnity []*model.AppWorkOrderPcListLogicRes + m := dao.BusViolationRecord.Ctx(ctx).As("a"). + LeftJoin("sys_dict_data", "b", "b.dict_type = 'tour_type' and b.dict_value = a.tour_type"). + LeftJoin("sys_dict_data", "c", "c.dict_type = 'violation_record_data_source' and c.dict_value = a.data_source"). + LeftJoin("sys_project", "d", "d.id = a.project_id"). + Fields("a.*,b.dict_label as tt,c.dict_label as ds,d.project_name as projectName"). + Where("a.openid", req.Openid). + Where("a.project_id", req.ProjectId). + Where("a.pid", 0) + if req.FuzzyQuery != "" { //模糊查询 + array, _ := g.DB().Model("sys_dict_data").Ctx(ctx). + Where("dict_type", "tour_type"). + Where("dict_label like ?", "%"+req.FuzzyQuery+"%").Fields("dict_value").Array() + m = m.Where("a.tour_type in (?)", array) + } + array, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + listRes.Total = len(array) + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "a.status asc" + if req.OrderBy != "" { + order = req.OrderBy + } + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&listEnity) + liberr.ErrIsNil(ctx, err) + //3、获取 + for i := range listEnity { + + //当前工单如若被拒绝,那么就查询当前工单下最新的数据信息,然后把当前数据给替换掉(主要替换id、状态) + if listEnity[i].ReviewType == "2" { + type zdmp struct { + gmeta.Meta `orm:"table:bus_violation_record"` + Id int64 `orm:"id" json:"id"` + ReviewType string `orm:"review_type" json:"reviewType"` + } + var zdmpData []zdmp + mysql := dao.BusViolationRecord.Ctx(ctx).As("a"). + Where("a.pid", listEnity[i].Id).Safe() + if err := mysql.Fields("a.id,a.review_type").Scan(&zdmpData); err != nil { + liberr.ErrIsNil(ctx, err, "无法获取安全工单拒绝数据") + return + } else { + for i2 := range zdmpData { + if zdmpData[i2].ReviewType == "" || zdmpData[i2].ReviewType == "1" { + zdmpData[i2].ReviewType = "true" + } else { + zdmpData[i2].ReviewType = "false" + } + } + zdmpData = append(zdmpData, zdmp{ + Id: listEnity[i].Id, + ReviewType: "false", + }) + sort.Slice(zdmpData, func(i, j int) bool { + return zdmpData[i].Id > zdmpData[j].Id + }) + + listEnity[i].RefuseList = zdmpData + } + type zd struct { + gmeta.Meta `orm:"table:bus_hse_management"` + Id int64 `orm:"id" json:"id"` + Status string `orm:"status" json:"status"` + } + zdData := new(zd) + err := mysql. + Where("(a.review_type != '2') OR (a.review_type IS NULL)"). + Fields("a.id,a.status"). + Scan(&zdData) + if err == nil { + listEnity[i].Id = zdData.Id + listEnity[i].Status = zdData.Status + listEnity[i].ReviewType = "" + } else { + liberr.ErrIsNil(ctx, err, "无法获取安全工单转换数据") + return + } + } + + if listEnity[i].Openid != "" { //获取处理人名称 + value, _ := dao.BusConstructionUser.Ctx(ctx).Where("openid", listEnity[i].Openid).Fields("user_name").Value() + listEnity[i].OpenidName = value.String() + } + if listEnity[i].Status == "3" { //复查人名称 + value, _ := dao.SysUser.Ctx(ctx).Where("id", listEnity[i].SelectPeople).Fields("user_nickname").Value() + listEnity[i].ReviewName = value.String() + } + i2, _ := g.DB().Model("bus_violation_record_correlation").Ctx(ctx). + Where("a.record_id", listEnity[i].Id).As("a"). + LeftJoin(dao.SysUser.Table(), "b", "b.id = a.user_id"). + Fields("b.user_nickname").Array() + for i3 := range i2 { //哪些人可以复查(只需有一个复查就行了) + listEnity[i].SuperintendName = append(listEnity[i].SuperintendName, i2[i3].String()) + } + } + listRes.List = listEnity + }) + return +} + +func (s *sBusViolationRecord) AppReviewFuncFunc(ctx context.Context, req *wxSystem.AppReviewReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusViolationRecord.Ctx(ctx).WherePri(req.Id).Update(do.BusViolationRecord{ + ReviewType: req.ReviewType, + Status: "3", + ReviewTime: gtime.New(time.Now()), + Review: req.Review, + UpdateBy: req.Operator, + }) + liberr.ErrIsNil(ctx, err, "复查失败") + //如果拒绝那么就重新写入当前数据到整改人 + var aData model.BusViolationRecordInfoRes + err = dao.BusViolationRecord.Ctx(ctx).WherePri(req.Id).Scan(&aData) + if req.ReviewType == "2" { + bData := new(model.RefuseToAddRes) + if err := copier.Copy(bData, aData); err != nil { + liberr.ErrIsNil(ctx, err) + return + } + if aData.Pid == 0 { + bData.Pid = aData.Id + } else { + bData.Pid = aData.Pid + } + bData.Status = "1" + _, resultErr := dao.BusViolationRecord.Ctx(ctx).OmitEmpty().Insert(bData) + if resultErr != nil { + liberr.ErrIsNil(ctx, resultErr) + return + } + } + err = AiNotificationFunc(ctx, req.Id, reminders.Recheck) + if err != nil { + liberr.ErrIsNil(ctx, err) + } + }) + return err + }) + return +} + +func (s *sBusViolationRecord) AppRectificationReplyFunc(ctx context.Context, req *wxSystem.AppRectificationReplyReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusViolationRecord.Ctx(ctx).WherePri(req.Id).Update(do.BusViolationRecord{ + Status: "2", + RectificationTime: gtime.New(time.Now()), + UpdateBy: ct.New().GetLoginUser(ctx).OpenId, + }) + liberr.ErrIsNil(ctx, err, "整改回复失败") + if len(req.File) > 0 { + err = SaveFunc(ctx, req.File, req.Id, "2") + liberr.ErrIsNil(ctx, err, "整改附件存储失败") + } + err = AiNotificationFunc(ctx, req.Id, reminders.Reform) + if err != nil { + liberr.ErrIsNil(ctx, err) + } + }) + return err + }) + return +} + +func (s *sBusViolationRecord) AppWorkOrderParticularsFunc(ctx context.Context, req *wxSystem.AppWorkOrderParticularsReq) (enity *wxSystem.AppWorkOrderParticularsRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、获取主体信息 + err = dao.BusViolationRecord.Ctx(ctx).As("a"). + LeftJoin("sys_dict_data", "b", "b.dict_type = 'tour_type' and b.dict_value = a.tour_type"). + LeftJoin("sys_dict_data", "c", "c.dict_type = 'violation_record_data_source' and c.dict_value = a.data_source"). + LeftJoin("sys_project", "d", "d.id = a.project_id"). + Fields("a.*,b.dict_label as tt,c.dict_label as ds,d.project_name as projectName"). + Where("a.id", req.Id).Scan(&enity) + liberr.ErrIsNil(ctx, err, "获取当前AI数据失败") + if enity.Openid != "" { //获取处理人名称 + value, _ := dao.BusConstructionUser.Ctx(ctx).Where("openid", enity.Openid).Fields("user_name").Value() + enity.OpenidName = value.String() + } + if enity.Status == "3" { //复查人名称 + value, _ := dao.SysUser.Ctx(ctx).Where("id", enity.SelectPeople).Fields("user_nickname").Value() + enity.ReviewName = value.String() + } + i2, _ := g.DB().Model("bus_violation_record_correlation").Ctx(ctx). + Where("a.record_id", enity.Id).As("a"). + LeftJoin(dao.SysUser.Table(), "b", "b.id = a.user_id"). + Fields("b.user_nickname").Array() + for i3 := range i2 { //哪些人可以复查(只需有一个复查就行了) + enity.SuperintendName = append(enity.SuperintendName, i2[i3].String()) + } + //2、获取附件 + var pathEntity []*model.BusViolationRecordPathLogicRes + err = g.DB().Model("bus_violation_record_path").Ctx(ctx).Where("ticket_id", req.Id).Scan(&pathEntity) + liberr.ErrIsNil(ctx, err, "查询失败") + //3、分类附件 + var one []*model.BusViolationRecordPathLogicRes + var two []*model.BusViolationRecordPathLogicRes + for i := range pathEntity { + if pathEntity[i].Type == "1" { + one = append(one, pathEntity[i]) + } else { + two = append(two, pathEntity[i]) + } + } + enity.CheckAttachment = one + enity.AbarbeitungAttachment = two + }) + return +} + +func (s *sBusViolationRecord) AppWorkOrderPcListFunc(ctx context.Context, req *wxSystem.AppWorkOrderPcListReq) (listRes *wxSystem.AppWorkOrderPcListRes, err error) { + var uid = int64(ct.New().GetLoginUser(ctx).Id) + listRes = new(wxSystem.AppWorkOrderPcListRes) + err = g.Try(ctx, func(ctx context.Context) { + //1、查看当前pc用户需要督察哪些违章记录 + var ids []int64 + values, err := g.DB().Model("bus_violation_record_correlation").Ctx(ctx).Where("user_id", req.PcUserId).Fields("record_id").Array() + liberr.ErrIsNil(ctx, err, "获取当前AI数据失败") + if len(values) == 0 { + return + } else { + for i := range values { + ids = append(ids, values[i].Int64()) + } + } + //2、查询违章记录 + var listEnity []*model.AppWorkOrderPcListLogicRes + m := dao.BusViolationRecord.Ctx(ctx).As("a"). + LeftJoin("sys_dict_data", "b", "b.dict_type = 'tour_type' and b.dict_value = a.tour_type"). + LeftJoin("sys_dict_data", "c", "c.dict_type = 'violation_record_data_source' and c.dict_value = a.data_source"). + LeftJoin("sys_project", "d", "d.id = a.project_id"). + Fields("a.*,b.dict_label as tt,c.dict_label as ds,d.project_name as projectName"). + Where("a.project_id", req.ProjectId). + Where("a.id in (?)", ids) + if req.FuzzyQuery != "" { //模糊查询 + array, _ := g.DB().Model("sys_dict_data").Ctx(ctx). + Where("dict_type", "tour_type"). + Where("dict_label like ?", "%"+req.FuzzyQuery+"%").Fields("dict_value").Array() + m = m.Where("a.tour_type in (?)", array) + } + array, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + listRes.Total = len(array) + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "a.status asc" + if req.OrderBy != "" { + order = req.OrderBy + } + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&listEnity) + liberr.ErrIsNil(ctx, err) + //3、获取 + for i := range listEnity { + + //当前工单如若被拒绝,那么就查询当前工单下最新的数据信息,然后把当前数据给替换掉(主要替换id、状态) + if listEnity[i].ReviewType == "2" { + type zdmp struct { + gmeta.Meta `orm:"table:bus_violation_record"` + Id int64 `orm:"id" json:"id"` + ReviewType string `orm:"review_type" json:"reviewType"` + } + var zdmpData []zdmp + mysql := dao.BusViolationRecord.Ctx(ctx).As("a"). + Where("a.pid", listEnity[i].Id).Safe() + if err := mysql.Fields("a.id,a.review_type").Scan(&zdmpData); err != nil { + liberr.ErrIsNil(ctx, err, "无法获取安全工单拒绝数据") + return + } else { + for i2 := range zdmpData { + if zdmpData[i2].ReviewType == "" || zdmpData[i2].ReviewType == "1" { + zdmpData[i2].ReviewType = "true" + } else { + zdmpData[i2].ReviewType = "false" + } + } + zdmpData = append(zdmpData, zdmp{ + Id: listEnity[i].Id, + ReviewType: "false", + }) + sort.Slice(zdmpData, func(i, j int) bool { + return zdmpData[i].Id > zdmpData[j].Id + }) + listEnity[i].RefuseList = zdmpData + } + type zd struct { + gmeta.Meta `orm:"table:bus_hse_management"` + Id int64 `orm:"id" json:"id"` + Status string `orm:"status" json:"status"` + } + zdData := new(zd) + err := mysql. + Where("(a.review_type != '2') OR (a.review_type IS NULL)"). + Fields("a.id,a.status"). + Scan(&zdData) + if err == nil { + listEnity[i].Id = zdData.Id + listEnity[i].Status = zdData.Status + listEnity[i].ReviewType = "" + } else { + liberr.ErrIsNil(ctx, err, "无法获取安全工单转换数据") + return + } + } + + if listEnity[i].Openid != "" { //获取处理人名称 + value, _ := dao.BusConstructionUser.Ctx(ctx).Where("openid", listEnity[i].Openid).Fields("user_name").Value() + listEnity[i].OpenidName = value.String() + } + if listEnity[i].Status == "3" { //复查人名称 + value, _ := dao.SysUser.Ctx(ctx).Where("id", listEnity[i].SelectPeople).Fields("user_nickname").Value() + listEnity[i].ReviewName = value.String() + } + i2, _ := g.DB().Model("bus_violation_record_correlation").Ctx(ctx). + Where("a.record_id", listEnity[i].Id).As("a"). + LeftJoin(dao.SysUser.Table(), "b", "b.id = a.user_id"). + Fields("b.user_nickname").Array() + for i3 := range i2 { //哪些人可以复查(只需有一个复查就行了) + listEnity[i].SuperintendName = append(listEnity[i].SuperintendName, i2[i3].String()) + } + // 判断当前人是否可以进行复查 + if listEnity[i].SelectPeople == uid { + listEnity[i].IsReview = true + } else { + listEnity[i].IsReview = false + } + } + listRes.List = listEnity + }) + return +} + +func (s *sBusViolationRecord) AppGetsAllThePeopleUnderTheCurrentPersonsProjectFunc(ctx context.Context, req *wxSystem.AppGetsAllThePeopleUnderTheCurrentPersonsProjectReq) (listRes *wxSystem.AppGetsAllThePeopleUnderTheCurrentPersonsProjectRes, err error) { + listRes = new(wxSystem.AppGetsAllThePeopleUnderTheCurrentPersonsProjectRes) + err = g.Try(ctx, func(ctx context.Context) { + //1、获取当前人的项目ID + value, _ := dao.BusConstructionUser.Ctx(ctx).Where("openid", req.Openid).Fields("projectId").Value() + liberr.ErrIsNil(ctx, err) + //2、获取当前项目下的所有人(头像、名称、电话) + m := dao.BusConstructionUser.Ctx(ctx).Where("project_id", value.String()).Fields("openid,pace_photo,user_name,phone") + if req.Name != "" { + m = m.Where(dao.BusConstructionUser.Columns().UserName+" like ?", "%"+req.Name+"%") + } + //array, err := m.Array() + //liberr.ErrIsNil(ctx, err, "获取总行数失败") + //listRes.Total = len(array) + //if req.PageNum == 0 { + // req.PageNum = 1 + //} + //listRes.CurrentPage = req.PageNum + //if req.PageSize == 0 { + // req.PageSize = consts.PageSize + //} + //order := "user_name asc" + //if req.OrderBy != "" { + // order = req.OrderBy + //} + var personnelList []*wxSystem.AppPersonnelListRes + //err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&personnelList) + err = m.Scan(&personnelList) + liberr.ErrIsNil(ctx, err) + listRes.List = personnelList + }) + return +} + +func (s *sBusViolationRecord) AppAiInformFunc(ctx context.Context, req *wxSystem.AppAiInformReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusViolationRecord.Ctx(ctx).WherePri(req.Id).OmitEmpty().Update(do.BusViolationRecord{ + ProcessingPeriod: req.ProcessingPeriod, + Openid: req.Openid, + Remark: req.Remark, + SelectPeople: ct.New().GetLoginUser(ctx).Id, + UpdateBy: ct.New().GetLoginUser(ctx).OpenId, + }) + liberr.ErrIsNil(ctx, err, "选择处理人失败!") + err = AiNotificationFunc(ctx, req.Id, reminders.Remind) + if err != nil { + liberr.ErrIsNil(ctx, err) + } + }) + return err + }) + return +} + +func (s *sBusViolationRecord) WxDetails(ctx context.Context, req *wxSystem.WxBusViolationRecordDetailsReq) (res *wxSystem.WxBusViolationRecordDetailsRes, err error) { + err = dao.BusViolationRecord.Ctx(ctx).As("a"). + LeftJoin("bus_construction_user", "b", "a.openid = b.openid"). + Fields("a.*,b.nick_name,b.user_name").Where("a.id", req.Id).Scan(&res) + return +} + +func (s *sBusViolationRecord) SelectTheViolatorFunc(ctx context.Context, req *system.BSelectTheViolatorReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + i := ct.New().GetLoginUser(ctx).Id + _, err = dao.BusViolationRecord.Ctx(ctx).WherePri(req.Id).Update(do.BusViolationRecord{ + ProcessingPeriod: req.ProcessingPeriod, + Openid: req.Openid, + Remark: req.Remark, + UpdateBy: i, + SelectPeople: i, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + id, _ := strconv.ParseInt(req.Id, 10, 64) + err = AiNotificationFunc(ctx, id, reminders.Remind) + if err != nil { + liberr.ErrIsNil(ctx, err) + } + }) + return +} + +func (s *sBusViolationRecord) WxEdit(ctx context.Context, req *wxSystem.BusViolationRecordEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusViolationRecord.Ctx(ctx).WherePri(req.Id).Update(do.BusViolationRecord{ + //IsDispose: req.IsDispose, + //WxOrPc: req.WxOrPc, + UpdateBy: req.Openid, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusViolationRecord) WxListTwo(ctx context.Context, req *wxSystem.BusViolationRecordSearchTwoReq) (listRes *wxSystem.BusViolationRecordSearchTwoRes, err error) { + listRes = new(wxSystem.BusViolationRecordSearchTwoRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusViolationRecord.Ctx(ctx).As("a"). + LeftJoin("bus_construction_user", "b", "a.openid = b.openid"). + Fields("a.*,b.nick_name,b.user_name").Where("a.wx_or_pc = 2").Where("a.create_by", req.Openid) + if req.TourType != "" { + m = m.Where("a."+dao.BusViolationRecord.Columns().TourType+" = ?", req.TourType) + } + if req.IsDispose != "" { + m = m.Where("a."+dao.BusViolationRecord.Columns().IsDispose+" = ?", req.IsDispose) + } + //创建时间模糊查询 + if req.CreatedAt != "" { + //date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where("a."+dao.BusViolationRecord.Columns().CreatedAt+" like ?", "%"+req.CreatedAt+"%") + } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.BusViolationRecord.Columns().CreatedAt+" >=? AND "+"a."+dao.BusViolationRecord.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + array, _ := m.Array() + listRes.Total = len(array) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "a.is_dispose asc,a.id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusViolationRecordInfoRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusViolationRecordListRes, len(res)) + for k, v := range res { + //if v.Picture == "" { + // v.Picture = v.PictureTwo + //} + listRes.List[k] = &model.BusViolationRecordListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + Openid: v.Openid, + TourType: v.TourType, + //IsDispose: v.IsDispose, + CreatedAt: v.CreatedAt, + //LaborDate: v.LaborDate, + NickName: v.NickName, + UserName: v.UserName, + //Picture: v.Picture, + UpdatedAt: v.UpdatedAt, + Remark: v.Remark, + } + } + }) + return +} + +func (s *sBusViolationRecord) WxList(ctx context.Context, req *wxSystem.BusViolationRecordSearchReq) (listRes *wxSystem.BusViolationRecordSearchRes, err error) { + listRes = new(wxSystem.BusViolationRecordSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusViolationRecord.Ctx(ctx).As("a"). + LeftJoin("bus_construction_user", "b", "a.openid = b.openid"). + LeftJoin("bus_tour", "c", "a.tour_id = c.id"). + Fields("a.*,b.nick_name,c.picture as pictureTwo") + if req.TourType != "" { + m = m.Where("a."+dao.BusViolationRecord.Columns().TourType+" = ?", req.TourType) + } + if req.IsDispose != "" { + m = m.Where("a."+dao.BusViolationRecord.Columns().IsDispose+" = ?", req.IsDispose) + } + if req.Openid != "" { + m = m.Where("a."+dao.BusViolationRecord.Columns().Openid+" = ?", req.Openid) + } + //创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where("a."+dao.BusViolationRecord.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.BusViolationRecord.Columns().CreatedAt+" >=? AND "+"a."+dao.BusViolationRecord.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + array, _ := m.Array() + listRes.Total = len(array) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "a.is_dispose asc,a.id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusViolationRecordInfoRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusViolationRecordListRes, len(res)) + for k, v := range res { + //if v.Picture == "" { + // v.Picture = v.PictureTwo + //} + listRes.List[k] = &model.BusViolationRecordListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + Openid: v.Openid, + TourType: v.TourType, + //IsDispose: v.IsDispose, + CreatedAt: v.CreatedAt, + //LaborDate: v.LaborDate, + NickName: v.NickName, + //Picture: v.Picture, + } + } + }) + return +} + +func (s *sBusViolationRecord) List(ctx context.Context, req *system.BusViolationRecordSearchReq) (listRes *system.BusViolationRecordSearchRes, err error) { + var uid = int64(ct.New().GetLoginUser(ctx).Id) + listRes = new(system.BusViolationRecordSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusViolationRecord.Ctx(ctx).As("a"). + LeftJoin("bus_construction_user", "b", "a.openid = b.openid"). + LeftJoin("bus_tour", "c", "a.tour_id = c.id"). + Fields("a.*,b.nick_name,b.user_name,c.picture as pictureTwo"). + Where("a.project_id", req.ProjectId). + Where("a.pid", 0) + if req.Id > 0 { + m = m.Where("a."+dao.BusViolationRecord.Columns().Id, req.Id) + } + if req.TourType != "" { + m = m.Where("a."+dao.BusViolationRecord.Columns().TourType+" = ?", req.TourType) + } + if req.IsDispose != "" { + m = m.Where("a."+dao.BusViolationRecord.Columns().IsDispose+" = ?", req.IsDispose) + } + //创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where("a."+dao.BusViolationRecord.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.BusViolationRecord.Columns().CreatedAt+" >=? AND "+"a."+dao.BusViolationRecord.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + array, _ := m.Array() + listRes.Total = len(array) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "a.is_dispose asc,a.id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusViolationRecordInfoRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusViolationRecordListRes, len(res)) + for k, v := range res { + + //当前工单如若被拒绝,那么就查询当前工单下最新的数据信息,然后把当前数据给替换掉(主要替换id、状态) + if res[k].ReviewType == "2" { + type zdmp struct { + gmeta.Meta `orm:"table:bus_violation_record"` + Id int64 `orm:"id" json:"id"` + ReviewType string `orm:"review_type" json:"reviewType"` + } + var zdmpData []zdmp + mysql := dao.BusViolationRecord.Ctx(ctx).As("a"). + Where("a.pid", res[k].Id).Safe() + if err := mysql.Fields("a.id,a.review_type").Scan(&zdmpData); err != nil { + liberr.ErrIsNil(ctx, err, "无法获取安全工单拒绝数据") + return + } else { + for i2 := range zdmpData { + if zdmpData[i2].ReviewType == "" || zdmpData[i2].ReviewType == "1" { + zdmpData[i2].ReviewType = "true" + } else { + zdmpData[i2].ReviewType = "false" + } + } + zdmpData = append(zdmpData, zdmp{ + Id: res[k].Id, + ReviewType: "false", + }) + sort.Slice(zdmpData, func(i, j int) bool { + return zdmpData[i].Id > zdmpData[j].Id + }) + res[k].RefuseList = zdmpData + } + type zd struct { + gmeta.Meta `orm:"table:bus_hse_management"` + Id int64 `orm:"id" json:"id"` + Status string `orm:"status" json:"status"` + } + zdData := new(zd) + err := mysql. + Where("(a.review_type != '2') OR (a.review_type IS NULL)"). + Fields("a.id,a.status"). + Scan(&zdData) + if err == nil { + res[k].Id = zdData.Id + res[k].Status = zdData.Status + res[k].ReviewType = "" + } else { + liberr.ErrIsNil(ctx, err, "无法获取安全工单转换数据") + return + } + } + + listRes.List[k] = &model.BusViolationRecordListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + DataSource: v.DataSource, + Level: v.Level, + TourType: v.TourType, + Openid: v.Openid, + NickName: v.NickName, + UserName: v.UserName, + //IsDispose: v.IsDispose, + //Picture: v.Picture, + Remark: v.Remark, + CreatedAt: v.CreatedAt, + Status: v.Status, + ReviewType: v.ReviewType, + SxtName: v.SxtName, + RefuseList: v.RefuseList, + //LaborDate: v.LaborDate, + } + //状态为3 查询出复查人 + if v.Status == "3" { + ve := coryCommon.SelectByString(ctx, coryCommon.IsNumeric(v.UpdateBy), v.UpdateBy) + listRes.List[k].ReviewName = ve + } + // 判断当前人是否可以进行复查 + if v.SelectPeople == uid { + v.IsReview = true + } else { + v.IsReview = false + } + } + }) + return +} + +func (s *sBusViolationRecord) GetById(ctx context.Context, id int64) (res *model.BusViolationRecordInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusViolationRecord.Ctx(ctx).Where(dao.BusViolationRecord.Columns().Id, id).Scan(&res) + //获取创建人 更新人名称 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusViolationRecordInfoRes) + res = &infoRes + liberr.ErrIsNil(ctx, err, "获取信息失败") + //通知了谁? + var violationRecordCorrelationEntity []*model.ViolationRecordCorrelation + err = g.DB().Model("bus_violation_record_correlation").Ctx(ctx).As("a"). + LeftJoin(dao.SysUser.Table(), "b", "b.id = a.user_id"). + LeftJoin(dao.SysPost.Table(), "c", "c.post_id = a.post_id"). + Fields("a.*,b.user_nickname as user_name,c.post_name as post_name"). + Where("a.record_id", id).Scan(&violationRecordCorrelationEntity) + liberr.ErrIsNil(ctx, err, "获取通知人失败") + if len(violationRecordCorrelationEntity) > 0 { + res.ViolationRecordCorrelationList = violationRecordCorrelationEntity + } + //谁选择了处理人? + value, _ := dao.SysUser.Ctx(ctx).Where("id", res.SelectPeople).Fields("user_nickname").Value() + res.SelectPeople = value.Int64() + //谁处理了?处理时间?处理结果?内容(备注)? + value2, _ := dao.BusConstructionUser.Ctx(ctx).Where("openid", res.Openid).Fields("user_name").Value() + res.Openid = value2.String() + }) + return +} + +func (s *sBusViolationRecord) Add(ctx context.Context, req *system.BusViolationRecordAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、根据类型推断出违章/工单等级 + var levelEntity *model.BusViolationLevelInfoRes + err := dao.BusViolationLevel.Ctx(ctx).WhereLike("tour_type", "%"+req.TourType+"%").Scan(&levelEntity) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + if levelEntity == nil { + errors.New("请联系后台管理员,给该类型添加权重(等级)!") + liberr.ErrIsNil(ctx, err) + return + } + _, err = dao.BusViolationRecord.Ctx(ctx).Insert(do.BusViolationRecord{ + ProjectId: req.ProjectId, + Openid: req.Conductor, + LevelId: levelEntity.Id, + Level: levelEntity.Grade, + TourType: req.TourType, + DataSource: req.DataSource, + //Picture: req.Picture, + Remark: req.Remark, + //WxOrPc: "1", + //LaborDate: req.LaborDate, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusViolationRecord) WxAdd(ctx context.Context, req *wxSystem.WxBusViolationRecordAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、根据类型推断出违章/工单等级 + var levelEntity *model.BusViolationLevelInfoRes + err := dao.BusViolationLevel.Ctx(ctx).WhereLike("tour_type", "%"+req.TourType+"%").Scan(&levelEntity) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + if levelEntity == nil { + errors.New("请联系后台管理员,给该类型添加权重(等级)!") + liberr.ErrIsNil(ctx, err) + return + } + req.Picture = strings.Replace(req.Picture, "/file/", "/wxfile/", 1) + _, err = dao.BusViolationRecord.Ctx(ctx).Insert(do.BusViolationRecord{ + ProjectId: req.ProjectId, + LevelId: levelEntity.Id, + Level: levelEntity.Grade, + TourType: req.TourType, + DataSource: "artificial", + //Picture: req.Picture, + Remark: req.Remark, + //WxOrPc: "2", + //LaborDate: req.LaborDate, + CreateBy: req.ByOpenid, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusViolationRecord) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusViolationRecord.Ctx(ctx).Delete(dao.BusViolationRecord.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +//// UploadAndSaveFunc 上传并存储文件 +//func UploadAndSaveFunc(ctx context.Context, File []*ghttp.UploadFile, id int64, typeStr string) (err error) { +// err = g.Try(ctx, func(ctx context.Context) { +// //2、获取文件数据,然后对文件进行上传 +// var fileEntitys []*model.BusViolationRecordPathLogicRes +// for i := range File { +// str, err := coryCommon.UploadFileTwo(ctx, File[i], coryCommon.Helmet) +// liberr.ErrIsNil(ctx, err, "上传附件失败!") +// str = filepath.ToSlash(str) +// rpath := coryCommon.ResourcePublicToFunc("/"+str, 0) +// _, ext, _ := coryCommon.FileInfo(rpath) +// entity := model.BusViolationRecordPathLogicRes{ +// TicketId: id, +// Type: typeStr, +// Name: File[i].Filename, +// Path: rpath, +// FileType: ext, +// } +// fileEntitys = append(fileEntitys, &entity) +// } +// //3、上传文件的附件信息 +// _, err = g.DB().Model("bus_violation_record_path").Ctx(ctx).Insert(fileEntitys) +// liberr.ErrIsNil(ctx, err, "添加失败") +// }) +// return +//} + +// SaveFunc 存储文件 +func SaveFunc(ctx context.Context, fileInfo []*comModel.UpFile, id int64, typeStr string) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //2、获取文件数据,然后对文件进行上传 + var fileEntitys []*model.BusViolationRecordPathLogicRes + for i := range fileInfo { + entity := model.BusViolationRecordPathLogicRes{ + TicketId: id, + Type: typeStr, + Name: fileInfo[i].Name, + Path: fileInfo[i].Url, + FileType: fileInfo[i].FileType, + } + fileEntitys = append(fileEntitys, &entity) + } + //3、上传文件的附件信息 + _, err = g.DB().Model("bus_violation_record_path").Ctx(ctx).Insert(fileEntitys) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func AiNotificationFunc(ctx context.Context, id int64, status int) (err error) { + //2、获取对应数据 + var aData model.BusViolationRecordInfoRes + err = dao.BusViolationRecord.Ctx(ctx).WherePri(id).Scan(&aData) + //3、消息提醒 + value, _ := g.DB().Model("sys_dict_data").Ctx(ctx).Where("dict_type", "tour_type").Where("dict_value", aData.TourType).Fields("dict_label").Value() + message := reminders.Reminder{ + Type: reminders.AI, + Status: status, + Title: value.String(), //违章类型 + Content: aData.Level, //违章等级 + ProjectID: int(aData.ProjectId), + ReceiverID: aData.Openid, + TargetID: int(id), + } + if status == reminders.Remind || status == reminders.Recheck { + message.ReceiverID = aData.Openid + } else { + message.ReceiverID = strconv.FormatInt(aData.SelectPeople, 10) + } + err = reminders.PublishReminder(message, false) + return err +} diff --git a/internal/app/system/logic/busWeeklySecurityReport/bus_weekly_security_report.go b/internal/app/system/logic/busWeeklySecurityReport/bus_weekly_security_report.go new file mode 100644 index 0000000..e974f22 --- /dev/null +++ b/internal/app/system/logic/busWeeklySecurityReport/bus_weekly_security_report.go @@ -0,0 +1,511 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-04-02 18:03:23 +// 生成路径: internal/app/system/logic/bus_weekly_security_report.go +// 生成人:gfast +// desc:安全周期 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "path/filepath" + "strconv" + "strings" + "time" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + busQuestionSave "github.com/tiger1103/gfast/v3/internal/app/system/logic/busQuestionSave" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterBusWeeklySecurityReport(New()) +} + +func New() *sBusWeeklySecurityReport { + return &sBusWeeklySecurityReport{} +} + +type sBusWeeklySecurityReport struct{} + +func (s *sBusWeeklySecurityReport) List(ctx context.Context, req *system.BusWeeklySecurityReportSearchReq) (listRes *system.BusWeeklySecurityReportSearchRes, err error) { + listRes = new(system.BusWeeklySecurityReportSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusWeeklySecurityReport.Ctx(ctx).WithAll() + if req.ProjectId != "" { + m = m.Where(dao.BusWeeklySecurityReport.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + if req.ScopeDate != "" { + split := strings.Split(req.ScopeDate, ",") + m = m.Where("DATE_FORMAT(scope,'%Y-%m-%d') >=? AND DATE_FORMAT(scope,'%Y-%m-%d') <=?", split[0], split[1]) + } + //if req.Scope != "" { + // m = m.Where(dao.BusWeeklySecurityReport.Columns().Scope+" = ?", req.Scope) + //} + //if req.ScopeEnd != "" { + // m = m.Where(dao.BusWeeklySecurityReport.Columns().ScopeEnd+" = ?", req.ScopeEnd) + //} + if len(req.DateRange) != 0 { + m = m.Where(dao.BusWeeklySecurityReport.Columns().CreatedAt+" >=? AND "+dao.BusWeeklySecurityReport.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusWeeklySecurityReportInfoRes + err = m.Fields(system.BusWeeklySecurityReportSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusWeeklySecurityReportListRes, len(res)) + for k, v := range res { + ve := coryCommon.SelectByString(ctx, coryCommon.IsNumeric(v.CreateBy), v.CreateBy) + listRes.List[k] = &model.BusWeeklySecurityReportListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + ProjectName: v.ProjectName, + Week: v.Week, + Scope: v.Scope, + ScopeEnd: v.ScopeEnd, + Path: v.Path, + CreateBy: ve, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusWeeklySecurityReport) GetById(ctx context.Context, id int64) (res *model.BusWeeklySecurityReportInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusWeeklySecurityReport.Ctx(ctx).WithAll().Where(dao.BusWeeklySecurityReport.Columns().Id, id).Scan(&res) + // 获取创建人 更新人名称 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusWeeklySecurityReportInfoRes) + res = &infoRes + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusWeeklySecurityReport) Add(ctx context.Context, req *system.BusWeeklySecurityReportAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + split := strings.Split(req.TimeRange, ",") + // 1、获取周期 + weekFunc := WeekFunc(split[1]) + // 2、需要插入的数据 + report := do.BusWeeklySecurityReport{ + ProjectId: req.ProjectId, + Week: weekFunc, + Scope: split[0], + ScopeEnd: split[1], + CreateBy: ct.New().GetLoginUser(ctx).Id, + } + // 3、自动生成数据 + res, err := WeeklySecurityReportFunc(ctx, req) + liberr.ErrIsNil(ctx, err) + // 4、生成word返回路径 + jsonData, err := WeeklySecurityReportHttp(ctx, res) + str, err := SelectData(ctx, jsonData, strconv.FormatInt(req.ProjectId, 10)) + liberr.ErrIsNil(ctx, err) + if str == "" { + err = errors.New("添加失败") + liberr.ErrIsNil(ctx, err) + return + } + path := coryCommon.ResourcePublicToFunc(str, 1) + if path == "" { + err = errors.New("添加失败") + liberr.ErrIsNil(ctx, err) + return + } + report.Path = path + _, err = dao.BusWeeklySecurityReport.Ctx(ctx).Insert(report) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusWeeklySecurityReport) Edit(ctx context.Context, req *system.BusWeeklySecurityReportEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusWeeklySecurityReport.Ctx(ctx).WherePri(req.Id).Update(do.BusWeeklySecurityReport{ + ProjectId: req.ProjectId, + ProjectName: req.ProjectName, + Scope: req.Scope, + ScopeEnd: req.ScopeEnd, + Path: req.Path, + CreateBy: req.CreateBy, + UpdateBy: req.UpdateBy, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusWeeklySecurityReport) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 查询数据 + array, err := dao.BusWeeklySecurityReport.Ctx(ctx).Fields("path").Where("id in (?)", ids).Array() + liberr.ErrIsNil(ctx, err) + // 删除数据 + _, err = dao.BusWeeklySecurityReport.Ctx(ctx).Unscoped().Delete(dao.BusWeeklySecurityReport.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err) + // 删除文件 + var p []string + for i := range array { + p = append(p, array[i].String()) + } + coryCommon.BatchFile(p) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +func WeeklySecurityReportFunc(ctx context.Context, req *system.BusWeeklySecurityReportAddReq) (res *system.WeeklySecurityReportRes, err error) { + res = new(system.WeeklySecurityReportRes) + var entity []*system.WeeklySecurityReportEntity + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + te := strings.Split(req.TimeRange, ",") + ////0、获取到所有正常的项目 + //array, _ := dao.SysProject.Ctx(ctx).Where(dao.SysProject.Columns().Status, "0").Fields("id").Array() + var array []string + array = append(array, fmt.Sprintf("%d", req.ProjectId)) + if len(array) > 0 { + for i := range array { + v2, _ := dao.SysProject.Ctx(ctx).WherePri(array).Fields("project_name").Value() + projectId := array[i] + reportEntity := system.WeeklySecurityReportEntity{ + ProjectName: v2.String(), + } + pro, _ := strconv.ParseInt(projectId, 10, 64) + reportEntity.ProjectId = pro + reportEntity.Begin = te[0] + reportEntity.End = te[1] + /** + 一、本周项目人员投入情况 + */ + values, err := g.DB().Model("bus_attendance").Ctx(ctx). + Where("project_id", projectId). + WhereBetween("printing_date", te[0], te[1]). + Fields("openid").Array() + liberr.ErrIsNil(ctx, err) + var openids []string + if len(values) > 0 { + for i2 := range values { + openids = append(openids, values[i2].String()) + } + } + if len(openids) > 0 { + v, err := dao.BusConstructionUser.Ctx(ctx). + Fields(`COUNT( CASE WHEN type_of_work NOT IN ( "9" ) THEN 0 END ) AS builders`). + Where(dao.BusConstructionUser.Columns().ProjectId).Where("openid in (?)", openids).Value() + liberr.ErrIsNil(ctx, err) + reportEntity.Builders = v.Int() + } + /** + 二、本周项目人员投入情况 + */ + v, err := g.DB().Model("sys_project_team_member").Ctx(ctx). + Fields("count(id) as attendance"). + Where("project_id", projectId).WhereBetween("DATE_FORMAT(create_time,'%Y-%m-%d')", te[0], te[1]).Value() + liberr.ErrIsNil(ctx, err) + num := 0 + parseInt, _ := strconv.ParseInt(projectId, 10, 64) + r, err := busQuestionSave.WeChatPdfWo(ctx, &system.WeChatPdfWoReq{ProjectId: parseInt}) + for _, data := range r { + format := data.CreatedAt.Format("Y-m-d") + flag := tool.StringDateComparison(format, te[0], te[1]) + if flag { + num = num + 1 + } + } + reportEntity.Attendance = v.Int() + reportEntity.Education = num + /** + 三、本周特种设备投入情况 + */ + bt := "DATE_FORMAT(a.created_at,'%Y-%m-%d') BETWEEN '" + te[0] + "' and '" + te[1] + "'" + // exec, err := g.DB().Query(ctx, `SELECT + // a.machinery_name as machineName, + // a.machinery_number as machineType, + // (SELECT count(id) FROM bus_machinery_detail WHERE machinery_id = a.id and type = 2 and `+bt+`) as enter, + // (SELECT count(id) FROM bus_machinery_detail WHERE machinery_id = a.id and type = 1 and `+bt+`) as quit, + // (SELECT count(id) FROM bus_machinery_detail WHERE machinery_id = a.id and type = 2 ) as addUp + // FROM + // bus_machinery as a + // WHERE + // project_id = `+projectId+``) + + var lsEntity []*system.LargeScaleTwoEntity + exec, err := g.DB().Query(ctx, generateQuery(projectId, te[0], te[1])) + err = exec.Structs(&lsEntity) + liberr.ErrIsNil(ctx, err) + + if lsEntity != nil { + var ls []*system.LargeScaleEntity + for i2, datai2 := range lsEntity { + ls = append(ls, &system.LargeScaleEntity{ + Num: i2 + 1, + //Machine: datai2.MachineName + ":" + datai2.MachineType, + Machine: datai2.MachineName, + Numnber: datai2.Enter - datai2.Quit, + AddUp: datai2.AddUp, + }) + } + reportEntity.LargeScaleList = ls + } + /** + 四、本周安全检查记录 + */ + query, err := g.DB().Query(ctx, `SELECT + a.created_at as time, + c.dict_label as riskGrade, + d.dict_label as problemDescription + FROM + bus_violation_record as a + LEFT JOIN bus_violation_level as b on b.id = a.level_id + LEFT JOIN sys_dict_data as c on c.dict_type = 'risx' and c.dict_value = b.risx + LEFT JOIN sys_dict_data as d on d.dict_type = 'tour_type' and d.dict_value = a.tour_type + WHERE + a.project_id = `+projectId+` and `+bt) + var skEntity []*system.SecurityCheckEntity + err = query.Structs(&skEntity) + liberr.ErrIsNil(ctx, err) + if skEntity != nil { + for i3 := range skEntity { + skEntity[i3].Num = i3 + 1 + } + reportEntity.SecurityCheckList = skEntity + } + /** + 五、本周安全整改情况 + */ + row4or5 := `SELECT + a.inspection_result inspectionResult, + a.rectification_time as tiem, + a.status, + a.review_type + FROM + bus_hse_management as a + WHERE + a.project_id = ` + projectId + ` and ` + bt + result, err := g.DB().Query(ctx, row4or5+` and is_reply = 1 and status in ("2","3")`) + var agEntity []*system.AbarbeitungTwoEntity + err = result.Structs(&agEntity) + liberr.ErrIsNil(ctx, err) + if agEntity != nil { + var ag []*system.AbarbeitungEntity + for i2, datai2 := range agEntity { + abarbeitungEntity := system.AbarbeitungEntity{ + Num: i2 + 1, + Tiem: datai2.Tiem, + InspectionResult: datai2.InspectionResult, + Condition: datai2.InspectionResult, + } + if datai2.Status == "1" { + abarbeitungEntity.Condition = "通知" + } else if datai2.Status == "2" { + abarbeitungEntity.Condition = "整改" + } else { + if datai2.ReviewType == "1" { + abarbeitungEntity.Condition = "复检通过" + } else { + abarbeitungEntity.Condition = "复检拒绝" + } + } + ag = append(ag, &abarbeitungEntity) + } + reportEntity.AbarbeitungList = ag + } + /** + 六、本周可视化 + */ + var ig []*system.ImgEntity + //站班会 + var igEntity *system.ImgEntity + err = g.DB().Model("sys_project_team_squad").Ctx(ctx). + Fields("picture as path,content as text"). + Where("project_id", projectId). + WhereBetween("created_at", te[0], te[1]).OrderDesc("id").Limit(1).Scan(&igEntity) + liberr.ErrIsNil(ctx, err) + if igEntity != nil { + trim := strings.Trim(igEntity.Path, "") + if trim != "" { + split := strings.Split(trim, ",") + slash := filepath.ToSlash(split[0]) + if strings.Contains(slash, "/wxfile/") { + split[0] = strings.Replace(slash, "/wxfile/", coryCommon.GetCWD()+"/resource/public/", 1) + } else { + split[0] = strings.Replace(slash, "/file/", coryCommon.GetCWD()+"/resource/public/", 1) + } + ig = append(ig, &system.ImgEntity{ + Path: split[0], + Text: igEntity.Text, + }) + reportEntity.ImgList = ig + } + } + //hse安全工单 + sql := `SELECT + a.inspection_result as text, + b.path + FROM + bus_hse_management AS a + LEFT JOIN bus_hse_management_path as b on b.ticket_id = a.id + WHERE + a.project_id = ` + projectId + ` and ` + bt + ` and is_reply = '2' and path is not null + GROUP BY inspection_result + ` + var gdEntity []*system.ImgEntity + resultSix, errSix := g.DB().Query(ctx, sql) + err = resultSix.Structs(&gdEntity) + liberr.ErrIsNil(ctx, errSix) + if gdEntity != nil { + for i2 := range gdEntity { + slash := filepath.ToSlash(gdEntity[i2].Path) + if strings.Contains(slash, "/wxfile/") { + gdEntity[i2].Path = strings.Replace(slash, "/wxfile/", coryCommon.GetCWD()+"/resource/public/", 1) + } else { + gdEntity[i2].Path = strings.Replace(slash, "/file/", coryCommon.GetCWD()+"/resource/public/", 1) + } + } + ig = append(ig, gdEntity[0]) + ig = append(ig, gdEntity[len(gdEntity)-1]) + reportEntity.ImgList = ig + } + + // g.DB().Model("bus_construction_user_departure").Ctx(ctx).Wher + // r2, err := g.DB().Query(ctx, `SELECT + // b.path + // FROM + // bus_hse_management as a + // LEFT JOIN bus_hse_management_path as b on b.ticket_id = a.id + // WHERE + // a.project_id = `+projectId+`and`+bt+`ORDER BY RAND() LIMIT 1`) + // r2.Structs() + entity = append(entity, &reportEntity) + } + res.WeeklySecurityReport = entity + liberr.ErrIsNil(ctx, err) + } + }) + return err + }) + return +} + +func WeeklySecurityReportHttp(ctx context.Context, weekly *system.WeeklySecurityReportRes) (allString string, err error) { + uri := "http://" + coryCommon.Global + ":8899/airlineserver/" + "word/wordTemplateExport" + //uri := "127.0.0.1:9992/word/wordTemplateExport" + weekly.FilePath = coryCommon.ResourcePublicToFunc(filepath.ToSlash("/"+coryCommon.Ynr(coryCommon.Helmet)), 2) + // weekly.FilePath = "/project/zmkg/resource/public/upload_file/2024-04-03/" + airJson, err := json.Marshal(weekly) + response, err := g.Client().Post(ctx, uri, airJson) + allString = response.ReadAllString() + return +} + +func WeekFunc(timeStr string) string { + // 解析字符串时间为时间对象 + t, _ := time.Parse("2006-01-02", timeStr) + // 获取ISO周数 + _, week := t.ISOWeek() + //return fmt.Sprintf("%s 是第 %d 周\n", timeStr, week) + return fmt.Sprintf("第 %d 周\n", week) +} + +// 定义结构体来解析JSON +type Response struct { + Success bool `json:"success"` + Code int `json:"code"` + Message string `json:"message"` + Data map[string]interface{} `json:"data"` +} + +func SelectData(ctx context.Context, jsonData string, projectId string) (str string, err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 解析JSON数据 + var response Response + err := json.Unmarshal([]byte(jsonData), &response) + if err != nil { + fmt.Println("解析JSON失败:", err) + return + } + // 提取路径值 + path, ok := response.Data[projectId].(string) + if !ok { + err = errors.New("路径值无效") + return + } + str = filepath.ToSlash(path) + }) + return +} + +func generateQuery(projectId, startDate, endDate string) string { + return fmt.Sprintf(`SELECT + a.machinery_name AS machineName, + SUM( + (SELECT + count(id) + FROM + bus_machinery_detail + WHERE + machinery_id = a.id + AND TYPE = 2 + AND DATE_FORMAT(a.created_at, '%%Y-%%m-%%d') BETWEEN '%s' + AND '%s') + ) AS enter, + SUM( + (SELECT + count(id) + FROM + bus_machinery_detail + WHERE + machinery_id = a.id + AND TYPE = 1 + AND DATE_FORMAT(a.created_at, '%%Y-%%m-%%d') BETWEEN '%s' + AND '%s') + ) AS quit, + SUM( + (SELECT + count(id) + FROM + bus_machinery_detail + WHERE + machinery_id = a.id + AND TYPE = 2) + ) AS addUp + FROM + bus_machinery AS a + WHERE + project_id = %s + GROUP BY + a.machinery_name;`, startDate, endDate, startDate, endDate, projectId) +} diff --git a/internal/app/system/logic/commentList/comment_list.go b/internal/app/system/logic/commentList/comment_list.go new file mode 100644 index 0000000..715c157 --- /dev/null +++ b/internal/app/system/logic/commentList/comment_list.go @@ -0,0 +1,182 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-05-14 10:21:06 +// 生成路径: internal/app/system/logic/comment_list.go +// 生成人:gfast +// desc:App消息-评论 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/jinzhu/copier" + "github.com/samber/lo" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" +) + +func init() { + service.RegisterCommentList(New()) +} + +func New() *sCommentList { + return &sCommentList{} +} + +type sCommentList struct{} + +func (s *sCommentList) List(ctx context.Context, req *system.CommentListSearchReq) (listRes *system.CommentListSearchRes, err error) { + listRes = new(system.CommentListSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.CommentList.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.CommentList.Columns().Id+" = ?", req.Id) + } + if req.ProjectId != "" { + m = m.Where(dao.CommentList.Columns().ProjectId+" = ?", gconv.Int(req.ProjectId)) + } + if req.Receiver != "" { + m = m.Where(dao.CommentList.Columns().Receiver+" = ?", gconv.Int(req.Receiver)) + } + if req.Content != "" { + m = m.Where(dao.CommentList.Columns().Content+" = ?", req.Content) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.CommentList.Columns().CreatedAt+" >=? AND "+dao.CommentList.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.Sender != "" { + m = m.Where(dao.CommentList.Columns().Sender+" = ?", gconv.Int(req.Sender)) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.CommentListInfoRes + err = m.Fields(system.CommentListSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.CommentListListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.CommentListListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + Receiver: v.Receiver, + Content: v.Content, + CreatedAt: v.CreatedAt, + Sender: v.Sender, + } + } + }) + return +} + +func (s *sCommentList) GetSelfList(ctx context.Context, req *system.CommentListSelfReq) (res *system.CommentListSelfRes, err error) { + res = new(system.CommentListSelfRes) + + // 获取用户信息 + userInfo := ct.New().GetLoginUser(ctx) + + query := dao.CommentList.Ctx(ctx).As("cl"). + LeftJoin("sys_user as su", "cl.sender = su.id"). + LeftJoin("sys_project as sp", "cl.project_id = sp.id"). + Where("cl.project_id = ? and cl.receiver = ?", req.ProjectId, userInfo.Id) + + // 分页 + if req.PageNum == 0 { + req.PageNum = 1 + } + + res.ListRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + + // 获取总行数 + res.ListRes.Total, err = query.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + + // 准备查询字段 + fields := "cl.id, su.user_nickname as user_nickname, sp.project_name as project_name, cl.content, cl.created_at" + + // 获取数据 + var list []*model.CommentInfo + err = query.Fields(fields).Page(req.PageNum, req.PageSize).OrderDesc("cl.id").Scan(&list) + liberr.ErrIsNil(ctx, err, "获取数据失败") + + commenIDs := lo.FilterMap(list, func(comment *model.CommentInfo, _ int) (int, bool) { + return int(comment.Id), true + }) + _, err = dao.CommentList.Ctx(ctx).WhereIn(dao.CommentList.Columns().Id, commenIDs). + Data(g.Map{ + dao.CommentList.Columns().IsRead: 1, + }). + Update() + liberr.ErrIsNil(ctx, err, "更新已读状态失败") + + res.List = make([]*system.CommentListInfo, len(list)) + copier.Copy(&res.List, &list) + + return +} + +func (s *sCommentList) GetById(ctx context.Context, id uint) (res *model.CommentListInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.CommentList.Ctx(ctx).WithAll().Where(dao.CommentList.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sCommentList) Add(ctx context.Context, req *system.CommentListAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.CommentList.Ctx(ctx).Insert(do.CommentList{ + ProjectId: req.ProjectId, + Receiver: req.Receiver, + Content: req.Content, + Sender: req.Sender, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sCommentList) Edit(ctx context.Context, req *system.CommentListEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.CommentList.Ctx(ctx).WherePri(req.Id).Update(do.CommentList{ + ProjectId: req.ProjectId, + Receiver: req.Receiver, + Content: req.Content, + Sender: req.Sender, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sCommentList) Delete(ctx context.Context, ids []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.CommentList.Ctx(ctx).Delete(dao.CommentList.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/comments/comments.go b/internal/app/system/logic/comments/comments.go new file mode 100644 index 0000000..9be7d60 --- /dev/null +++ b/internal/app/system/logic/comments/comments.go @@ -0,0 +1,123 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-04-23 14:47:24 +// 生成路径: internal/app/system/logic/comments.go +// 生成人:gfast +// desc:App通知公告评论 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterComments(New()) +} + +func New() *sComments { + return &sComments{} +} + +type sComments struct{} + +func (s *sComments) List(ctx context.Context, req *system.CommentsSearchReq) (listRes *system.CommentsSearchRes, err error) { + listRes = new(system.CommentsSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.Comments.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.Comments.Columns().Id+" = ?", req.Id) + } + if req.NotificationId != "" { + m = m.Where(dao.Comments.Columns().NotificationId+" = ?", gconv.Int(req.NotificationId)) + } + if req.CommentText != "" { + m = m.Where(dao.Comments.Columns().CommentText+" = ?", req.CommentText) + } + if req.CommentId != "" { + m = m.Where(dao.Comments.Columns().CommentId+" = ?", req.CommentId) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.Comments.Columns().CreatedAt+" >=? AND "+dao.Comments.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.CommentsInfoRes + err = m.Fields(system.CommentsSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.CommentsInfoRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.CommentsInfoRes{ + Id: v.Id, + NotificationId: v.NotificationId, + CommentText: v.CommentText, + CommentId: v.CommentId, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sComments) GetById(ctx context.Context, id uint) (res *model.CommentsInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.Comments.Ctx(ctx).WithAll().Where(dao.Comments.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sComments) Add(ctx context.Context, req *system.CommentsAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.Comments.Ctx(ctx).Insert(do.Comments{ + NotificationId: req.NotificationId, + CommentText: req.CommentText, + CommentId: req.CommentId, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sComments) Edit(ctx context.Context, req *system.CommentsEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.Comments.Ctx(ctx).WherePri(req.Id).Update(do.Comments{ + NotificationId: req.NotificationId, + CommentText: req.CommentText, + CommentId: req.CommentId, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sComments) Delete(ctx context.Context, ids []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.Comments.Ctx(ctx).Delete(dao.Comments.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/constructionDetails/construction_details.go b/internal/app/system/logic/constructionDetails/construction_details.go new file mode 100644 index 0000000..2ebdbec --- /dev/null +++ b/internal/app/system/logic/constructionDetails/construction_details.go @@ -0,0 +1,175 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-03-13 18:10:56 +// 生成路径: internal/app/system/logic/construction_details.go +// 生成人:gfast +// desc:施工类别详情 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + systemService "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterConstructionDetails(New()) +} + +func New() *sConstructionDetails { + return &sConstructionDetails{} +} + +type sConstructionDetails struct{} + +func (s *sConstructionDetails) List(ctx context.Context, req *system.ConstructionDetailsSearchReq) (listRes *system.ConstructionDetailsSearchRes, err error) { + listRes = new(system.ConstructionDetailsSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.ConstructionDetails.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.ConstructionDetails.Columns().Id+" = ?", req.Id) + } + if req.CreatedBy != "" { + m = m.Where(dao.ConstructionDetails.Columns().CreatedBy+" = ?", gconv.Uint64(req.CreatedBy)) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.ConstructionDetails.Columns().CreatedAt+" >=? AND "+dao.ConstructionDetails.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.Name != "" { + m = m.Where(dao.ConstructionDetails.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.Types != "" { + m = m.Where(dao.ConstructionDetails.Columns().Types+" = ?", req.Types) + } + if req.Total != "" { + m = m.Where(dao.ConstructionDetails.Columns().Total+" = ?", gconv.Int(req.Total)) + } + if req.ConstructionId != "" { + m = m.Where(dao.ConstructionDetails.Columns().ConstructionId+" = ?", gconv.Int(req.ConstructionId)) + } + if req.IsPercentage != "" { + m = m.Where(dao.ConstructionDetails.Columns().IsPercentage+" = ?", gconv.Int(req.IsPercentage)) + } + if req.StartTime != "" { + m = m.Where(dao.ConstructionDetails.Columns().StartTime+" = ?", gconv.Time(req.StartTime)) + } + if req.EndTime != "" { + m = m.Where(dao.ConstructionDetails.Columns().EndTime+" = ?", gconv.Time(req.EndTime)) + } + if req.Completed != "" { + m = m.Where(dao.ConstructionDetails.Columns().Completed+" = ?", gconv.Int(req.Completed)) + } + if req.Selectable != "" { + m = m.Where(dao.ConstructionDetails.Columns().Selectable+" = ?", gconv.Int(req.Selectable)) + } + if req.Overall != "" { + m = m.Where(dao.ConstructionDetails.Columns().Overall+" = ?", gconv.Int(req.Overall)) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.ConstructionDetailsInfoRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.ConstructionDetailsListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.ConstructionDetailsListRes{ + Id: v.Id, + CreatedBy: v.CreatedBy, + CreatedAt: v.CreatedAt, + Name: v.Name, + Types: v.Types, + Total: v.Total, + ConstructionId: v.ConstructionId, + Remark: v.Remark, + IsPercentage: v.IsPercentage, + StartTime: v.StartTime, + EndTime: v.EndTime, + Completed: v.Completed, + Selectable: v.Selectable, + Overall: v.Overall, + } + } + }) + return +} + +func (s *sConstructionDetails) GetById(ctx context.Context, id uint64) (res *model.ConstructionDetailsInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.ConstructionDetails.Ctx(ctx).WithAll().Where(dao.ConstructionDetails.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sConstructionDetails) Add(ctx context.Context, req *system.ConstructionDetailsAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ConstructionDetails.Ctx(ctx).Insert(do.ConstructionDetails{ + Name: req.Name, + Types: req.Types, + Total: req.Total, + ConstructionId: req.ConstructionId, + Remark: req.Remark, + IsPercentage: req.IsPercentage, + StartTime: req.StartTime, + EndTime: req.EndTime, + Completed: req.Completed, + Selectable: req.Selectable, + Overall: req.Overall, + CreatedBy: systemService.Context().GetUserId(ctx), + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sConstructionDetails) Edit(ctx context.Context, req *system.ConstructionDetailsEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ConstructionDetails.Ctx(ctx).WherePri(req.Id).Update(do.ConstructionDetails{ + Name: req.Name, + Types: req.Types, + Total: req.Total, + ConstructionId: req.ConstructionId, + Remark: req.Remark, + IsPercentage: req.IsPercentage, + StartTime: req.StartTime, + EndTime: req.EndTime, + Completed: req.Completed, + Selectable: req.Selectable, + Overall: req.Overall, + UpdatedBy: systemService.Context().GetUserId(ctx), + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sConstructionDetails) Delete(ctx context.Context, ids []uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ConstructionDetails.Ctx(ctx).Delete(dao.ConstructionDetails.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/constructionProject/construction_project.go b/internal/app/system/logic/constructionProject/construction_project.go new file mode 100644 index 0000000..8fcb112 --- /dev/null +++ b/internal/app/system/logic/constructionProject/construction_project.go @@ -0,0 +1,150 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-03-13 17:36:45 +// 生成路径: internal/app/system/logic/construction_project.go +// 生成人:gfast +// desc:施工项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + systemService "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterConstructionProject(New()) +} + +func New() *sConstructionProject { + return &sConstructionProject{} +} + +type sConstructionProject struct{} + +func (s *sConstructionProject) List(ctx context.Context, req *system.ConstructionProjectSearchReq) (listRes *system.ConstructionProjectSearchRes, err error) { + listRes = new(system.ConstructionProjectSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.ConstructionProject.Ctx(ctx).WithAll() + if req.ConstructionId != "" { + m = m.Where(dao.ConstructionProject.Columns().ConstructionId+" = ?", req.ConstructionId) + } + if req.CreatedBy != "" { + m = m.Where(dao.ConstructionProject.Columns().CreatedBy+" = ?", gconv.Uint64(req.CreatedBy)) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.ConstructionProject.Columns().CreatedAt+" >=? AND "+dao.ConstructionProject.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.FangzhenId != "" { + m = m.Where(dao.ConstructionProject.Columns().FangzhenId+" = ?", gconv.Int(req.FangzhenId)) + } + if req.ConstructionName != "" { + m = m.Where(dao.ConstructionProject.Columns().ConstructionName+" like ?", "%"+req.ConstructionName+"%") + } + if req.Total != "" { + m = m.Where(dao.ConstructionProject.Columns().Total+" = ?", gconv.Int(req.Total)) + } + if req.IsPercentage != "" { + m = m.Where(dao.ConstructionProject.Columns().IsPercentage+" = ?", gconv.Int(req.IsPercentage)) + } + if req.EndTime != "" { + m = m.Where(dao.ConstructionProject.Columns().EndTime+" = ?", gconv.Time(req.EndTime)) + } + if req.StartTime != "" { + m = m.Where(dao.ConstructionProject.Columns().StartTime+" = ?", gconv.Time(req.StartTime)) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "construction_id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.ConstructionProjectInfoRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.ConstructionProjectListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.ConstructionProjectListRes{ + ConstructionId: v.ConstructionId, + CreatedBy: v.CreatedBy, + CreatedAt: v.CreatedAt, + FangzhenId: v.FangzhenId, + ConstructionName: v.ConstructionName, + Total: v.Total, + Remark: v.Remark, + IsPercentage: v.IsPercentage, + EndTime: v.EndTime, + StartTime: v.StartTime, + } + } + }) + return +} + +func (s *sConstructionProject) GetByConstructionId(ctx context.Context, constructionId uint64) (res *model.ConstructionProjectInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.ConstructionProject.Ctx(ctx).WithAll().Where(dao.ConstructionProject.Columns().ConstructionId, constructionId).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sConstructionProject) Add(ctx context.Context, req *system.ConstructionProjectAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ConstructionProject.Ctx(ctx).Insert(do.ConstructionProject{ + FangzhenId: req.FangzhenId, + ConstructionName: req.ConstructionName, + Total: req.Total, + Remark: req.Remark, + IsPercentage: req.IsPercentage, + EndTime: req.EndTime, + StartTime: req.StartTime, + CreatedBy: systemService.Context().GetUserId(ctx), + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sConstructionProject) Edit(ctx context.Context, req *system.ConstructionProjectEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ConstructionProject.Ctx(ctx).WherePri(req.ConstructionId).Update(do.ConstructionProject{ + FangzhenId: req.FangzhenId, + ConstructionName: req.ConstructionName, + Total: req.Total, + Remark: req.Remark, + IsPercentage: req.IsPercentage, + EndTime: req.EndTime, + StartTime: req.StartTime, + UpdatedBy: systemService.Context().GetUserId(ctx), + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sConstructionProject) Delete(ctx context.Context, constructionIds []uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ConstructionProject.Ctx(ctx).Delete(dao.ConstructionProject.Columns().ConstructionId+" in (?)", constructionIds) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/context/context.go b/internal/app/system/logic/context/context.go new file mode 100644 index 0000000..c74ea58 --- /dev/null +++ b/internal/app/system/logic/context/context.go @@ -0,0 +1,70 @@ +/* +* @desc:context-service +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/9/23 14:51 + */ + +package context + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +func init() { + service.RegisterContext(New()) +} + +type sContext struct{} + +func New() *sContext { + return &sContext{} +} + +// Init 初始化上下文对象指针到上下文对象中,以便后续的请求流程中可以修改。 +func (s *sContext) Init(r *ghttp.Request, customCtx *model.Context) { + r.SetCtxVar(consts.CtxKey, customCtx) +} + +// Get 获得上下文变量,如果没有设置,那么返回nil +func (s *sContext) Get(ctx context.Context) *model.Context { + value := ctx.Value(consts.CtxKey) + if value == nil { + return nil + } + if localCtx, ok := value.(*model.Context); ok { + return localCtx + } + return nil +} + +// SetUser 将上下文信息设置到上下文请求中,注意是完整覆盖 +func (s *sContext) SetUser(ctx context.Context, ctxUser *model.ContextUser) { + s.Get(ctx).User = ctxUser +} + +// GetLoginUser 获取当前登陆用户信息 +func (s *sContext) GetLoginUser(ctx context.Context) *model.ContextUser { + context := s.Get(ctx) + if context == nil { + return nil + } + return context.User + //user := model.ContextUser{} + //user.LoginUserRes = &model.LoginUserRes{} + //user.Id = 1 + //return &user +} + +// GetUserId 获取当前登录用户id +func (s *sContext) GetUserId(ctx context.Context) uint64 { + user := s.GetLoginUser(ctx) + if user != nil { + return user.Id + } + return 0 +} diff --git a/internal/app/system/logic/device/device.go b/internal/app/system/logic/device/device.go new file mode 100644 index 0000000..733e3d5 --- /dev/null +++ b/internal/app/system/logic/device/device.go @@ -0,0 +1,232 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-11-24 09:57:07 +// 生成路径: internal/app/system/logic/device.go +// 生成人:gfast +// desc:安全帽设备(java) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" + "time" +) + +func init() { + service.RegisterDevice(New()) +} + +func New() *sDevice { + return &sDevice{} +} + +type sDevice struct{} + +func (s *sDevice) ScheduleTimeFunc(ctx context.Context, req *system.ScheduleTimeReq) (res *system.ScheduleTimeRes, err error) { + res = new(system.ScheduleTimeRes) + var arrStr []string + err = g.Try(ctx, func(ctx context.Context) { + array, err := g.DB().Model("location").Ctx(ctx). + Fields("DISTINCT DATE_FORMAT( time, '%Y-%m-%d' ) as te"). + Where("dev_num", req.DevNum). + WhereBetween( + "time", + req.DateRange[0], + req.DateRange[1], + ). + Array() + for i := range array { + arrStr = append(arrStr, array[i].String()) + } + res.List = arrStr + liberr.ErrIsNil(ctx, err, "获取数据失败") + }) + return +} + +func (s *sDevice) AllList(ctx context.Context, req *system.DeviceSearchAllReq) (res *system.DeviceSearchAllRes, err error) { + res = new(system.DeviceSearchAllRes) + g.Try(ctx, func(ctx context.Context) { + var dir []*model.DeviceListRes + err := dao.Device.Ctx(ctx).As("a"). + LeftJoin("bus_construction_user", "b", "a.dev_num = b.dev_num"). + Fields("a.*,b.openid,b.nick_name,b.user_name"). + Where("b.project_id", req.ProjectId). + WhereNotNull("b.head_icon").Scan(&dir) + res.List = dir + liberr.ErrIsNil(ctx, err, "获取数据失败!") + }) + return +} + +func (s *sDevice) HelmetListFunc(ctx context.Context, req *system.HelmetListReq) (listRes *system.HelmetListRes, err error) { + listRes = new(system.HelmetListRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.Device.Ctx(ctx).As("a"). + Fields("a.dev_num,a.dev_name") + if req.ProjectId > 0 { + m = m.Where("a."+dao.Device.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.DevNum != "" { + m = m.Where("a."+dao.Device.Columns().DevNum+" like ?", "%"+req.DevNum+"%") + } + if req.DevName != "" { + m = m.Where("a."+dao.Device.Columns().DevName+" like ?", "%"+req.DevName+"%") + } + array, err := m.Array() + listRes.Total = len(array) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "a.dev_num desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.DeviceInfoRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.DeviceListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.DeviceListRes{ + DevNum: v.DevNum, + DevName: v.DevName, + } + } + }) + return +} + +func (s *sDevice) List(ctx context.Context, req *system.DeviceSearchReq) (listRes *system.DeviceSearchRes, err error) { + listRes = new(system.DeviceSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.Device.Ctx(ctx).As("a"). + LeftJoin("bus_construction_user", "b", "a.dev_num = b.dev_num"). + Fields("a.*,b.openid,b.head_icon,b.nick_name,b.user_name,b.phone") + if req.ProjectId > 0 { + m = m.Where("a."+dao.Device.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.Status != "" { + m = m.Where("a."+dao.Device.Columns().Status+" = ?", gconv.Int(req.Status)) + } + if req.DevNum != "" { + m = m.Where("a."+dao.Device.Columns().DevNum+" like ?", "%"+req.DevNum+"%") + } + if req.DevName != "" { + m = m.Where("a."+dao.Device.Columns().DevName+" like ?", "%"+req.DevName+"%") + } + array, err := m.Array() + listRes.Total = len(array) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "a.dev_num desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.DeviceInfoRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.DeviceListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.DeviceListRes{ + DevNum: v.DevNum, + DevName: v.DevName, + Status: v.Status, + CreateTime: v.CreateTime, + UpdateTime: v.UpdateTime, + ProjectId: v.ProjectId, + HeadIcon: v.HeadIcon, + NickName: v.NickName, + UserName: v.UserName, + Phone: v.Phone, + Openid: v.Openid, + BatteryLevel: v.BatteryLevel, + IsLowBattery: v.IsLowBattery, + BatteryOn: v.BatteryOn, + BatteryOff: v.BatteryOff, + } + } + }) + return +} + +func (s *sDevice) GetByDevNum(ctx context.Context, req *system.DeviceGetReq) (res *system.DeviceGetRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + + err = dao.Device.Ctx(ctx).As("a"). + LeftJoin("bus_construction_user", "b", "a.dev_num = b.dev_num"). + Fields("a.*,b.openid,b.head_icon,b.nick_name,b.user_name,b.phone"). + Where("a.dev_num", req.DevNum).Scan(&res) + //err = dao.Device.Ctx(ctx).WithAll().Where(dao.Device.Columns().DevNum, req.DevNum).Scan(&res) + //插叙当前用户的足迹,按照日期时间范围筛选 + var latAndLon []*system.ActionPathLatAndLonActionPathLatAndLon + m := g.DB().Model("location").Ctx(ctx).Where("dev_num", req.DevNum) + if len(req.DateRange) > 0 { + m = m.Where("DATE_FORMAT(time,'%Y-%m-%d') >=? AND DATE_FORMAT(time,'%Y-%m-%d') <=?", req.DateRange[0], req.DateRange[1]) + } + err = m.OrderAsc("time").Scan(&latAndLon) + res.LatAndLonList = latAndLon + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sDevice) Add(ctx context.Context, req *system.DeviceAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.Device.Ctx(ctx).Insert(do.Device{ + DevNum: req.DevNum, + DevName: req.DevName, + Status: req.Status, + ProjectId: req.ProjectId, + CreateTime: gtime.NewFromStr(tool.New().GetFormattedDateTime(time.Now())), + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sDevice) RemoveRelationFunc(ctx context.Context, req *system.RemoveRelationReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err := dao.BusConstructionUser.Ctx(ctx).Where("openid", req.Openid).Update(g.Map{"dev_num": ""}) + liberr.ErrIsNil(ctx, err, "移除失败!") + }) + return +} + +func (s *sDevice) Delete(ctx context.Context, devNums []string) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + for i := range devNums { + _, err = dao.BusConstructionUser.Ctx(ctx).Where("dev_num", devNums[i]).Update(g.Map{"dev_num": ""}) + if err != nil { + liberr.ErrIsNil(ctx, err, "删除失败") + return + } + } + _, err = dao.Device.Ctx(ctx).Delete(dao.Device.Columns().DevNum+" in (?)", devNums) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/devicePreset/device_preset.go b/internal/app/system/logic/devicePreset/device_preset.go new file mode 100644 index 0000000..f500ec2 --- /dev/null +++ b/internal/app/system/logic/devicePreset/device_preset.go @@ -0,0 +1,161 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-03-01 12:50:08 +// 生成路径: internal/app/system/logic/device_preset.go +// 生成人:gfast +// desc:预置位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/tiger1103/gfast/v3/third/ys7" +) + +func init() { + service.RegisterDevicePreset(New()) +} + +func New() *sDevicePreset { + return &sDevicePreset{} +} + +type sDevicePreset struct{} + +func (s *sDevicePreset) List(ctx context.Context, req *system.DevicePresetSearchReq) (listRes *system.DevicePresetSearchRes, err error) { + listRes = new(system.DevicePresetSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.DevicePreset.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.DevicePreset.Columns().Id+" = ?", req.Id) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.DevicePreset.Columns().CreatedAt+" >=? AND "+dao.DevicePreset.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.DeviceSerial != "" { + m = m.Where(dao.DevicePreset.Columns().DeviceSerial+" = ?", req.DeviceSerial) + } + // if req.ChannelNo != "" { + // m = m.Where(dao.DevicePreset.Columns().ChannelNo+" = ?", req.ChannelNo) + // } + + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.DevicePresetInfoRes + err = m.Fields(system.DevicePresetSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.DevicePresetListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.DevicePresetListRes{ + Id: v.Id, + CreatedAt: v.CreatedAt, + DeviceSerial: v.DeviceSerial, + ChannelNo: v.ChannelNo, + Index: v.Index, + Name: v.Name, + } + } + }) + return +} + +func (s *sDevicePreset) GetById(ctx context.Context, id uint) (res *model.DevicePresetInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.DevicePreset.Ctx(ctx).WithAll().Where(dao.DevicePreset.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sDevicePreset) Add(ctx context.Context, req *system.DevicePresetAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + Device, err := ys7.GetDevice(req.DeviceSerial) + if err != nil { + liberr.ErrIsNil(ctx, err, "设备不存在") + } + + resp, err := Device.AddPreset() + if err != nil { + liberr.ErrIsNil(ctx, err, "添加失败") + } + + // 200 为成功 + if resp.Code != "200" { + liberr.ErrIsNil(ctx, err, "添加失败") + } + + _, err = dao.DevicePreset.Ctx(ctx).Insert(do.DevicePreset{ + DeviceSerial: req.DeviceSerial, + ChannelNo: req.ChannelNo, + Index: resp.Data.Index, + Name: req.PresetName, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sDevicePreset) Edit(ctx context.Context, req *system.DevicePresetEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 根据传入的 deviceSerial,Name,Index 修改预置点名 + dao.DevicePreset.Ctx(ctx).Where(dao.DevicePreset.Columns().DeviceSerial, req.DeviceSerial). + Where(dao.DevicePreset.Columns().Id, req.Id). + Update(do.DevicePreset{ + Name: req.NewName, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sDevicePreset) Delete(ctx context.Context, DeviceSerial string, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + Device, err := ys7.GetDevice(DeviceSerial) + if err != nil { + liberr.ErrIsNil(ctx, err, "设备不存在") + } + + for _, id := range ids { + _, err := dao.DevicePreset.Ctx(ctx).Where(dao.DevicePreset.Columns().DeviceSerial, DeviceSerial). + Where(dao.DevicePreset.Columns().Id, id).One() + if err != nil { + liberr.ErrIsNil(ctx, err, "预置位不存在") + } + + resp, err := Device.ClearPreset(id) + if err != nil { + liberr.ErrIsNil(ctx, err, "删除失败") + } + + if resp.Code != "200" { + liberr.ErrIsNil(ctx, err, "删除失败") + } + } + + _, err = dao.DevicePreset.Ctx(ctx).Delete(dao.DevicePreset.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/document/document.go b/internal/app/system/logic/document/document.go new file mode 100644 index 0000000..ce871c5 --- /dev/null +++ b/internal/app/system/logic/document/document.go @@ -0,0 +1,573 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-09-16 10:32:04 +// 生成路径: internal/app/system/logic/document.go +// 生成人:gfast +// desc:母板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "net/url" + "os" + "path/filepath" + "strconv" + "strings" +) + +func init() { + service.RegisterDocument(New()) +} + +func New() *sDocument { + return &sDocument{} +} + +type sDocument struct{} + +func (s *sDocument) TemplateRecycleBinFunc(ctx context.Context, req *system.TemplateRecycleBinReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + if req.Type == "1" { + _, err = dao.Document.Ctx(ctx).Unscoped().Where(dao.DocumentData.Columns().Id+" in (?)", req.Ids).Update(g.Map{"deleted_at": nil}) + } else { + var pathArr []string + //删除还需要删除下面的所有子数据 + var idArr []int64 + for i := range req.Ids { + idList := RecursiveDeletion(ctx, req.Ids[i]) + if idList != nil { + idArr = append(idArr, idList...) + } + data, _ := dao.Document.Ctx(ctx).Unscoped().Where("id", req.Ids[i]).Fields("filen_path").Value() + pathArr = append(pathArr, data.String()) + } + idArr = append(idArr, req.Ids...) + _, err = dao.Document.Ctx(ctx).Unscoped().Delete(dao.Document.Columns().Id+" in (?)", idArr) + //如果删除成功,那么删除文件/文件夹 + for _, data := range pathArr { + os.RemoveAll(coryCommon.FileToFunc(data, 2)) + } + } + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +func RecursiveDeletion(ctx context.Context, id int64) (ids []int64) { + //1、获取某个文件的字符串id_str + value, _ := dao.Document.Ctx(ctx).Unscoped().Where("id", id).Fields("id_str").Value() + if value.String() == "" { + return nil + } + //2、查看当前需要删除的数据下面是否有子数据 + var dlr []*model.DocumentListRes + dao.Document.Ctx(ctx).Unscoped().Where("pid", value.String()).Fields("id,id_str").Scan(&dlr) + for i := range dlr { + ids = append(ids, dlr[i].Id) + deletion := RecursiveDeletion(ctx, dlr[i].Id) + ids = append(ids, deletion...) + } + return ids +} + +func (s *sDocument) AllList(ctx context.Context, req *system.AllDocumentSearchReq) (res *system.AllDocumentSearchRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + res = new(system.AllDocumentSearchRes) + var dataList []*model.DocumentInfoRes + m := dao.Document.Ctx(ctx) + if req.Type == "2" { + m = m.Unscoped().WhereNotNull("deleted_at") + } else if req.Type == "3" { + m = m.Unscoped() + } + err = m.Scan(&dataList) + res.List = dataList + liberr.ErrIsNil(ctx, err, "获取数据失败!") + }) + return +} + +func RecursiveQueryFunc(dr []*model.DocumentInfoRes, idStr string) (idStrs []string) { + for _, data := range dr { + if data.Pid == idStr { + idStrs = append(idStrs, data.IdStr) + strs := RecursiveQueryFunc(dr, data.IdStr) + if len(strs) > 0 { + idStrs = append(idStrs, strs...) + } + } + } + return +} + +func (s *sDocument) TreeStructureFunc(ctx context.Context, req *system.TreeStructureReq) (res *system.TreeStructureRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + res = new(system.TreeStructureRes) + var entity []*model.TreeStructureRes + err = dao.Document.Ctx(ctx).Where("pid = '0'").WithAll().Scan(&entity) + res.List = entity + liberr.ErrIsNil(ctx, err, "获取数据失败!") + }) + return +} + +func (s *sDocument) List(ctx context.Context, req *system.DocumentSearchReq) (listRes *system.DocumentSearchRes, err error) { + listRes = new(system.DocumentSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.Document.Ctx(ctx).Where(dao.Document.Columns().Type, "1") + //如果查询全部那么就先递归获取到所有的pid然后去查询,否则就只查询前端传递过来的数据 + if req.Switch == "1" { + var dr []*model.DocumentInfoRes + err = dao.Document.Ctx(ctx).Where("type = 2").Scan(&dr) + strs := RecursiveQueryFunc(dr, req.IdStr) + strs = append(strs, req.IdStr) + m = m.Where(dao.Document.Columns().Pid+" in (?)", strs) + } else { + m = m.Where(dao.Document.Columns().Pid, req.IdStr) + } + if req.Name != "" { + m = m.Where(dao.Document.Columns().Name+" like ?", "%"+req.Name+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.Document.Columns().CreatedAt+" >=? AND "+dao.Document.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if !strings.EqualFold(req.IsPaging, "YES") { + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + m = m.Fields(system.DocumentSearchRes{}).Page(req.PageNum, req.PageSize) + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.DocumentInfoRes + err = m.Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.DocumentListRes, len(res)) + for k, v := range res { + // 对 URL 进行编码 + //split := strings.Split(v.FilenPath, "/") + //s2 := split[len(split)-1] + //encodedPath := url.QueryEscape(s2) + s2 := v.FilenPath[6 : len(v.FilenPath)-1] + encodedPath := url.QueryEscape(s2) + listRes.List[k] = &model.DocumentListRes{ + Id: v.Id, + Name: v.Name, + FilenPath: v.FilenPath, + FilenPathCoding: strings.ReplaceAll(v.FilenPath, s2, encodedPath), + Suffix: v.Suffix, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sDocument) GetById(ctx context.Context, id int) (res *model.DocumentInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.Document.Ctx(ctx).WithAll().Where(dao.Document.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sDocument) Add(ctx context.Context, req *system.DocumentAddReq) (err error) { + //大文件上传 + req.FilePath.Url = strings.ReplaceAll(req.FilePath.Url, "/resource/public/", "/file/") + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + if req.FileType == "1" { //1、压缩文件夹导入 + filenPath := "" + if req.Pid != "" { + value, _ := dao.Document.Ctx(ctx).Where("id_str", req.Pid).Fields("filen_path").Value() + filenPath = value.String() + } + newPath := strings.ReplaceAll(req.FilePath.Url, "/file", coryCommon.GetCWD()+"/resource/public") + path, err := coryCommon.FileZipFunc(newPath, filenPath, coryCommon.Template) //解压相对路径,并删除压缩文件,返回解压后的相对路径 + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + one, err := coryCommon.Traversal(ctx, path, req.Pid, dao.Document.Table(), coryCommon.Template, 0, "1") //遍历解压后的文件,插入数据 + //err = Traversal(ctx, path, req.Pid) //遍历解压后的文件,插入数据 + liberr.ErrIsNil(ctx, err) + _, err = g.DB().Model(dao.Document.Table()).Ctx(ctx).Insert(one) + liberr.ErrIsNil(ctx, err, "新增失败!") + return + } else if req.FileType == "2" { //2、文件导入 + wornPath := filepath.ToSlash(strings.ReplaceAll(req.FilePath.Url, "/file/", coryCommon.GetCWD()+"/resource/public/")) + value, _ := dao.Document.Ctx(ctx).Where("id_str", req.Pid).Fields("filen_path").Value() + newPath := strings.Replace(value.String(), "/file/", coryCommon.GetCWD()+"/resource/public/", 1) + //2、文件存在就随机给一个文件名 + _, err = os.Stat(newPath + "/" + req.FilePath.Name) + if err == nil { + name := coryCommon.FileName("mb") + "." + strings.Split(req.FilePath.Name, ".")[1] + newPath = newPath + "/" + name + req.FilePath.Name = name + } else { + newPath = newPath + "/" + req.FilePath.Name + } + //3、文件移动 + err = os.Rename(wornPath, newPath) + //4、数据库记录文件 + _, err = dao.Document.Ctx(ctx).Insert(model.DocumentListRes{ + Pid: req.Pid, + Name: strings.Split(req.FilePath.Name, ".")[0], + Suffix: req.FilePath.FileType, + FilenPath: filepath.ToSlash(strings.Replace(newPath, coryCommon.GetCWD()+"/resource/public/", "/file/", 1)), + Type: "1", + }) + liberr.ErrIsNil(ctx, err, "新增失败!") + return + } + }) + return err + }) + return +} + +func (s *sDocument) NewFolderFunc(ctx context.Context, req *system.NewFolderReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、组装数据 + resEntity := model.DocumentListRes{ + Name: req.FileName, + Suffix: "", + Type: "2", + } + path := "" + if req.Pid != "" { + value, _ := dao.Document.Ctx(ctx).Where("id_str", req.Pid).Fields("filen_path").Value() + path = value.String() + "/" + req.FileName + resEntity.Pid = req.Pid + } else { + template := strings.Replace(coryCommon.Template, "/resource/public/", "/file/", 1) + path = template + "/" + req.FileName + resEntity.Pid = "0" + } + //2、判断是否重名,不重复就新增 + count, _ := dao.Document.Ctx(ctx).Unscoped().Where("filen_path", path).Count() + if count > 0 { + err = errors.New("文件夹已重复!") + liberr.ErrIsNil(ctx, err) + return + } else { + resEntity.IdStr = coryCommon.SHA256(path) + resEntity.FilenPath = path + _, insertDataErr := dao.Document.Ctx(ctx).Insert(resEntity) + if insertDataErr != nil { + err = errors.New("新增文件夹失败!") + liberr.ErrIsNil(ctx, err) + return + } + err = coryCommon.CreateDirectory(strings.Replace(path, "/file/", coryCommon.GetCWD()+"/resource/public/", 1)) + if err != nil { + err = errors.New("新增文件夹失败!") + liberr.ErrIsNil(ctx, err) + return + } + } + liberr.ErrIsNil(ctx, err, "新增文件夹失败!") + }) + return +} + +//// Traversal 遍历文件夹 +//func Traversal(ctx context.Context, root string, pidstr string) (err error) { +// +// var dataOne []*model.DocumentListRes +// +// template := strings.Replace(coryCommon.Template, "/resource/public", "/file", 1) +// err = filepath.Walk(root, func(path string, info os.FileInfo, err error) error { +// if err != nil { +// return err +// } +// // 获取相对路径 +// relativePath, err := filepath.Rel(root, path) +// if err != nil { +// return err +// } +// // 根目录下创建,还是指定文件夹下面创建? +// p := "" +// if pidstr != "" { +// value, _ := dao.Document.Ctx(ctx).Where("id_str", pidstr).Fields("filen_path").Value() +// split := strings.Split(root, "/") +// p = value.String() + "/" + split[len(split)-1] + "/" + relativePath +// } else { +// p = template + "/" + relativePath +// } +// p = strings.ReplaceAll(p, "\\", "/") +// // 获取当前项的深度 +// depth := strings.Count(relativePath, string(filepath.Separator)) +// // 判断父子关系并打印结果 +// if depth == 0 && info.IsDir() { +// if relativePath == "." { +// split := strings.Split(root, "/") +// n := split[len(split)-1] +// // 根目录下创建,还是指定文件夹下面创建? +// p := "" +// if pidstr != "" { +// value, _ := dao.Document.Ctx(ctx).Where("id_str", pidstr).Fields("filen_path").Value() +// p = value.String() + "/" + n +// } else { +// p = template + "/" + n +// } +// p = strings.ReplaceAll(p, "\\", "/") +// template = template + "/" + n +// var dataTwo = new(model.DocumentListRes) +// dataTwo.IdStr = SHA256(p) +// if pidstr != "" { +// dataTwo.Pid = pidstr +// } else { +// dataTwo.Pid = "0" +// } +// dataTwo.Name = n +// dataTwo.FilenPath = p +// ////如果文件夹路径重复,就提示 解压文件夹的时候就已经判断了,这里就不需要了 +// //err := IsFolderExist(ctx, p) +// //if err != nil { +// // return err +// //} +// dataTwo.Type = "2" +// dataOne = append(dataOne, dataTwo) +// } else { +// dir, n := filepath.Split(p) +// dir = strings.TrimSuffix(dir, "/") +// var dataTwo = new(model.DocumentListRes) +// dataTwo.IdStr = SHA256(p) +// dataTwo.Pid = SHA256(dir) +// dataTwo.Name = n +// dataTwo.FilenPath = p +// ////如果文件夹路径重复,就提示 +// //err := IsFolderExist(ctx, p) +// //if err != nil { +// // return err +// //} +// dataTwo.Type = "2" +// dataOne = append(dataOne, dataTwo) +// } +// } else if info.IsDir() { +// // 子文件夹 +// dir, n := filepath.Split(p) +// dir = strings.TrimSuffix(dir, "/") +// var dataTwo = new(model.DocumentListRes) +// dataTwo.IdStr = SHA256(p) +// dataTwo.Pid = SHA256(dir) +// dataTwo.Name = n +// dataTwo.FilenPath = p +// dataTwo.Type = "2" +// dataOne = append(dataOne, dataTwo) +// } else { +// dir, n := filepath.Split(p) +// dir = strings.TrimSuffix(dir, "/") +// var dataTwo = new(model.DocumentListRes) +// dataTwo.Pid = SHA256(dir) +// lastDotIndex := strings.LastIndex(n, ".") +// if lastDotIndex == -1 || lastDotIndex == 0 { +// dataTwo.Name = strings.Split(n, ".")[0] +// } else { +// dataTwo.Name = n[:lastDotIndex] +// } +// dataTwo.Suffix = n[lastDotIndex:] +// dataTwo.FilenPath = p +// dataTwo.Type = "1" +// //文件只能是这三种类型,其他类型进不来 +// s := n[lastDotIndex:] +// if strings.EqualFold(s, ".xlsx") || strings.EqualFold(s, ".docx") || strings.EqualFold(s, ".doc") || strings.EqualFold(s, ".ppt") { +// dataOne = append(dataOne, dataTwo) +// } +// } +// return err +// }) +// +// if err != nil { +// //fmt.Println("遍历文件夹时发生错误:", err) +// return +// } +// dao.Document.Ctx(ctx).Insert(dataOne) +// return err +//} +// +//func IsFolderExist(ctx context.Context, path string) (err error) { +// count, _ := dao.Document.Ctx(ctx).Where("filen_path", path).Count() +// if count > 0 { +// err = errors.New("文件夹已存在!") +// return +// } +// return nil +//} +// +//func SHA256(str string) (hx string) { +// // 创建 SHA-256 哈希对象 +// hash := sha256.New() +// // 将字符串转换为字节数组并进行哈希计算 +// hash.Write([]byte(str)) +// // 计算 SHA-256 哈希值 +// hashedBytes := hash.Sum(nil) +// // 将哈希值转换为十六进制字符串 +// hashStr := hex.EncodeToString(hashedBytes) +// return hashStr +//} + +func (s *sDocument) Edit(ctx context.Context, req *system.DocumentEditReq) (err error) { + if req.Type == "1" { + err = updateFile(ctx, req) + } else if req.Type == "2" { + err = updateFolder(ctx, req) + } + liberr.ErrIsNil(ctx, err) + return +} + +func RecursiveQueryEntityFunc(ctx context.Context, entity []*model.TreeStructureResTwo) (idStrs []int64) { + for i := range entity { + idStrs = append(idStrs, entity[i].Id) + if len(entity[i].TreeStructureResTwo) > 0 { + strs := RecursiveQueryEntityFunc(ctx, entity[i].TreeStructureResTwo) + idStrs = append(idStrs, strs...) + } + } + return +} + +// 修改文件夹 +func updateFolder(ctx context.Context, req *system.DocumentEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //1、判断修改后的文件夹是否有重复,如果有就提示当前文件夹已存在! + var dif *model.DocumentInfoRes + dao.Document.Ctx(ctx).WherePri(req.Id).Scan(&dif) + replace := strings.Replace(dif.FilenPath, dif.Name, req.Name, 1) + s2 := coryCommon.FileToFunc(replace, 2) + if _, err = os.Stat(s2); err == nil { + err = errors.New("当前文件夹已存在!") + liberr.ErrIsNil(ctx, err) + return + } else { + count := strings.Count(dif.FilenPath, dif.Name) + hx := coryCommon.SHA256(strings.ReplaceAll(dif.FilenPath, dif.FilenPath, replace)) + //2、如果不存在,那么就修改文件夹的同时,还得修改路径,以及及其子文件/文件夹下的所有路径 + var entity []*model.TreeStructureResTwo + err = dao.Document.Ctx(ctx).Unscoped().Where("pid", dif.IdStr).WithAll().Scan(&entity) + strs := RecursiveQueryEntityFunc(ctx, entity) + _, err = dao.Document.Ctx(ctx).Unscoped().Where("id in (?)", strs).Update(g.Map{"filen_path": gdb.Raw("CONCAT(" + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', " + strconv.Itoa(count) + ")," + + "'" + req.Name + "'," + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', -1)" + + ")")}) + if err != nil { + err = errors.New("修改失败!") + liberr.ErrIsNil(ctx, err) + return + } + //3、重新生成并修改文件夹的id_str等信息 + _, err = dao.Document.Ctx(ctx).Where("id", dif.Id).Update(g.Map{ + "id_str": hx, + "name": req.Name, + "filen_path": gdb.Raw("CONCAT(" + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', " + strconv.Itoa(count) + ")," + + "'" + req.Name + "'," + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', -1)" + + ")"), + }) + _, err = dao.Document.Ctx(ctx).Unscoped().Where("pid", dif.IdStr).Update(g.Map{"pid": hx}) + //4、修改文件夹 + oldPath := filepath.Join(coryCommon.FileToFunc(dif.FilenPath, 2)) + newPath := filepath.Join(filepath.Dir(oldPath), req.Name) + err = os.Rename(oldPath, newPath) + } + liberr.ErrIsNil(ctx, err, "修改失败") + return + }) + return err + }) + return +} + +// 修改文件 +func updateFile(ctx context.Context, req *system.DocumentEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + var dif *model.DocumentInfoRes + dao.Document.Ctx(ctx).WherePri(req.Id).Scan(&dif) + //1、判断修改后的名字是否有重复,如果有就提示当前文件名已存在! + replace := strings.Replace(dif.FilenPath, dif.Name, req.Name, 1) + s2 := coryCommon.FileToFunc(replace, 2) + if _, err = os.Stat(s2); err == nil { + err = errors.New("当前文件名已存在!") + liberr.ErrIsNil(ctx, err) + return + } + //2、如果不存在,那么就修改文件名的同时,还得修改路径 + _, err = dao.Document.Ctx(ctx).WherePri(req.Id).Update(do.Document{ + Name: req.Name, + FilenPath: replace, + }) + //3、修改具体文件的文件名 + if err == nil { + oldPath := coryCommon.FileToFunc(dif.FilenPath, 2) + newPath := filepath.Join(filepath.Dir(oldPath), req.Name+dif.Suffix) + err = os.Rename(oldPath, newPath) + if err != nil { + err = errors.New("修改失败") + liberr.ErrIsNil(ctx, err) + return + } + } + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return err + }) + return +} + +func (s *sDocument) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、先判断删除的是文件还是文件夹,然后进行修改需要删除的文件或文件夹名称 + var dataList []*model.DocumentInfoRes + err = dao.Document.Ctx(ctx).Where(dao.Document.Columns().Id+" in (?)", ids).Scan(&dataList) + liberr.ErrIsNil(ctx, err, "删除失败") + if len(dataList) > 0 { + for i := range dataList { + t := dataList[i].Type + upEntity := system.DocumentEditReq{ + Id: dataList[i].Id, + Name: dataList[i].Name + coryCommon.FileName("delete"), + Type: t, + } + if t == "1" { + err = updateFile(ctx, &upEntity) + liberr.ErrIsNil(ctx, err, "删除失败") + } else { + err = updateFolder(ctx, &upEntity) + liberr.ErrIsNil(ctx, err, "删除失败") + } + } + //1、删除文件夹 + _, err = dao.Document.Ctx(ctx).Delete(dao.Document.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + } + }) + return +} diff --git a/internal/app/system/logic/documentCompletion/document_completion.go b/internal/app/system/logic/documentCompletion/document_completion.go new file mode 100644 index 0000000..00a060a --- /dev/null +++ b/internal/app/system/logic/documentCompletion/document_completion.go @@ -0,0 +1,610 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-03-15 10:25:00 +// 生成路径: internal/app/system/logic/document_completion.go +// 生成人:gfast +// desc:竣工图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/gogf/gf/v2/util/gmeta" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + logic "github.com/tiger1103/gfast/v3/internal/app/system/logic/busDesignAudit" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "os" + "path/filepath" + "strconv" + "strings" +) + +func init() { + service.RegisterDocumentCompletion(New()) +} + +func New() *sDocumentCompletion { + return &sDocumentCompletion{} +} + +type sDocumentCompletion struct{} + +func (s *sDocumentCompletion) AuditDataListFunc(ctx context.Context, req *system.AuditDataListReq) (res *system.AuditDataListRes, err error) { + + return +} + +func (s *sDocumentCompletion) RecycleBinListFunc(ctx context.Context, req *system.RecycleBinListReq) (res *system.RecycleBinListRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + res = new(system.RecycleBinListRes) + var dataList []*model.DocumentCompletionInfoRes + m := dao.DocumentCompletion.Ctx(ctx) + if req.Type == "2" { + m = m.Unscoped().WhereNotNull("deleted_at") + } else if req.Type == "3" { + m = m.Unscoped() + } + err = m.Where(dao.DocumentCompletion.Columns().ProjectId, req.ProjectId).Scan(&dataList) + res.List = dataList + liberr.ErrIsNil(ctx, err, "获取数据失败!") + }) + return +} + +func (s *sDocumentCompletion) CompletionDataRecyclingStationFunc(ctx context.Context, req *system.CompletionDataRecyclingStationReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + if req.Type == "1" { + _, err = dao.DocumentCompletion.Ctx(ctx).Unscoped().Where(dao.DocumentCompletion.Columns().Id+" in (?)", req.Ids).Update(g.Map{"deleted_at": nil}) + } else { + var pathArr []string + //删除还需要删除下面的所有子数据 + var idArr []int64 + for i := range req.Ids { + idList := RecursiveDeletion(ctx, req.Ids[i]) + if idList != nil { + idArr = append(idArr, idList...) + } + data, _ := dao.DocumentCompletion.Ctx(ctx).Unscoped().Where("id", req.Ids[i]).Fields("filen_path").Value() + pathArr = append(pathArr, data.String()) + } + idArr = append(idArr, req.Ids...) + _, err = dao.DocumentCompletion.Ctx(ctx).Unscoped().Delete(dao.DocumentCompletion.Columns().Id+" in (?)", idArr) + //如果删除成功,那么删除文件/文件夹 + for _, data := range pathArr { + os.RemoveAll(coryCommon.FileToFunc(data, 2)) + } + } + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +func (s *sDocumentCompletion) SelectByPidFunc(ctx context.Context, req *system.SelectByPidReq) (res *system.SelectByPidRes, err error) { + res = new(system.SelectByPidRes) + //1、组装路径 + dataFolder := ct.New().GetLoginUser(ctx).UserName + dataFolder = coryCommon.Completion + "/" + dataFolder + req.PathName + //2、获取pid + err = g.Try(ctx, func(ctx context.Context) { + value, err := dao.DocumentCompletion.Ctx(ctx). + Where("project_id", req.ProjectId). + Where("filen_path", req.PathName). + Fields("pid"). + Value() + liberr.ErrIsNil(ctx, err, "获取数据失败") + res.Pid = value.String() + }) + return +} + +func (s *sDocumentCompletion) TreeStructureFunc(ctx context.Context, req *system.DocumentTreeStructureReq) (res *system.DocumentTreeStructureRes, err error) { + res = new(system.DocumentTreeStructureRes) + err = g.Try(ctx, func(ctx context.Context) { + var completion []*model.DocumentCompletionListRes + //1、获取到当前项目下的所有顶级文件及目录 + sql := dao.DocumentCompletion.Ctx(ctx). + Where("project_id", req.ProjectId).Where("state in ('3','4')") + if req.Pid != "" { + sql = sql.Where("pid", req.Pid) + } + sql = sql.WhereNull("deleted_at") + err := sql.Order("type desc").Scan(&completion) + for i := range completion { + completion[i].FilenPathCoding = coryCommon.URLCoding(completion[i].FilenPath) + } + res.List = completion + liberr.ErrIsNil(ctx, err, "获取数据失败") + }) + return +} + +func (s *sDocumentCompletion) CompletionNewFolderDataFunc(ctx context.Context, req *system.CompletionNewFolderDataReq) (err error) { + dataFolder, err := AddFileOperation(ctx, coryCommon.Completion, req.ProjectId) + err = g.Try(ctx, func(ctx context.Context) { + //1、组装数据 + resEntity := model.DocumentCompletionListRes{ + Name: req.FileName, + Suffix: "", + Type: "2", + } + path := "" + if req.Pid != "" { + value, _ := dao.DocumentCompletion.Ctx(ctx).Where("id_str", req.Pid).Fields("filen_path").Value() + path = value.String() + "/" + req.FileName + resEntity.Pid = req.Pid + } else { + template := strings.Replace(dataFolder, "/resource/public/", "/file/", 1) + path = template + "/" + req.FileName + resEntity.Pid = "0" + } + //2、判断是否重名,不重复就新增 + count, _ := dao.DocumentCompletion.Ctx(ctx).Unscoped().Where("filen_path", path).Count() + if count > 0 { + err = errors.New("文件夹已重复!") + liberr.ErrIsNil(ctx, err) + return + } else { + + resEntity.IdStr = coryCommon.SHA256(path) + resEntity.FilenPath = path + resEntity.ProjectId = req.ProjectId + resEntity.State = "4" + resEntity.CreateBy = strconv.FormatInt(int64(ct.New().GetLoginUser(ctx).Id), 10) + _, insertDataErr := dao.DocumentCompletion.Ctx(ctx).Insert(resEntity) + if insertDataErr != nil { + err = errors.New("新增文件夹失败!") + liberr.ErrIsNil(ctx, err) + return + } + err = coryCommon.CreateDirectory(strings.Replace(path, "/file/", coryCommon.GetCWD()+"/resource/public/", 1)) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + } + liberr.ErrIsNil(ctx, err, "新增文件夹失败!") + }) + return +} + +func (s *sDocumentCompletion) List(ctx context.Context, req *system.DocumentCompletionSearchReq) (listRes *system.DocumentCompletionSearchRes, err error) { + listRes = new(system.DocumentCompletionSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.DocumentCompletion.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.DocumentCompletion.Columns().Id+" = ?", req.Id) + } + if req.IdStr != "" { + m = m.Where(dao.DocumentCompletion.Columns().IdStr+" = ?", req.IdStr) + } + if req.Pid != "" { + m = m.Where(dao.DocumentCompletion.Columns().Pid+" = ?", req.Pid) + } + if req.Name != "" { + m = m.Where(dao.DocumentCompletion.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.FilenPath != "" { + m = m.Where(dao.DocumentCompletion.Columns().FilenPath+" = ?", req.FilenPath) + } + if req.Type != "" { + m = m.Where(dao.DocumentCompletion.Columns().Type+" = ?", req.Type) + } + if req.Suffix != "" { + m = m.Where(dao.DocumentCompletion.Columns().Suffix+" = ?", req.Suffix) + } + if req.CreateBy != "" { + m = m.Where(dao.DocumentCompletion.Columns().CreateBy+" = ?", req.CreateBy) + } + if req.UpdateBy != "" { + m = m.Where(dao.DocumentCompletion.Columns().UpdateBy+" = ?", req.UpdateBy) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.DocumentCompletion.Columns().CreatedAt+" >=? AND "+dao.DocumentCompletion.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.ProjectId != "" { + m = m.Where(dao.DocumentCompletion.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.DocumentCompletionInfoRes + err = m.Fields(system.DocumentCompletionSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.DocumentCompletionListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.DocumentCompletionListRes{ + Id: v.Id, + IdStr: v.IdStr, + Pid: v.Pid, + Name: v.Name, + FilenPath: v.FilenPath, + Type: v.Type, + Suffix: v.Suffix, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + ProjectId: v.ProjectId, + } + } + }) + return +} + +func (s *sDocumentCompletion) GetById(ctx context.Context, id int64) (res []*model.SelectTabNameAndTabIdByDateRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、获取当前数据的pid + value, err := dao.DocumentCompletion.Ctx(ctx).Where(dao.DocumentCompletion.Columns().Id, id).Fields("pid").Value() + liberr.ErrIsNil(ctx, err) + var pid = value.String() + //2、组装数据 + req := model.SelectTabNameAndTabIdByDateReq{ + TableName: dao.DocumentCompletion.Table(), + TableId: id, + } + if pid != "" { + //获取最终父节点id + byId, err := SelectRecursionById(ctx, req.TableName, pid) + liberr.ErrIsNil(ctx, err) + req.FatherId = byId + } + //3、得到最终文件/文件夹的操作记录 + res, err = logic.SelectTabNameAndTabIdByDateFunc(ctx, &req) + for i := range res { + res[i].CreatedBy = coryCommon.SelectByString(ctx, coryCommon.IsNumeric(res[i].CreatedBy), res[i].CreatedBy) + } + liberr.ErrIsNil(ctx, err) + }) + return +} + +func (s *sDocumentCompletion) Add(ctx context.Context, req *system.DocumentCompletionAddReq) (err error) { + if req.FilePath == nil { + errors.New("未识别到文件上传!") + return + } + //大文件上传 + req.FilePath.Url = strings.ReplaceAll(req.FilePath.Url, "/resource/public/", "/file/") + req.FilePath.Name = strings.Replace(req.FilePath.Name, " ", "", -1) + dataFolder, err := AddFileOperation(ctx, coryCommon.Completion, req.ProjectId) + if err != nil { + return err + } + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + designEntity := &system.BusDesignAuditAddReq{ + ProjectId: req.ProjectId, + TableName: dao.DocumentCompletion.Table(), + } + ct := ct.New().GetLoginUser(ctx).Id + formatInt := strconv.FormatInt(int64(ct), 10) + if req.FileType == "1" { //1、压缩文件夹导入 + filenPath := "" + if req.Pid != "" { + value, _ := dao.DocumentCompletion.Ctx(ctx).Where("id_str", req.Pid).Fields("filen_path").Value() + filenPath = value.String() + } + newPath := strings.ReplaceAll(req.FilePath.Url, "/file", coryCommon.GetCWD()+"/resource/public") + if filenPath == "" { + filenPath = coryCommon.ResourcePublicToFunc(dataFolder, 0) + } + path, err := coryCommon.FileZipFunc(newPath, filenPath, dataFolder) //解压相对路径,并删除压缩文件,返回解压后的相对路径 + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + one, err := coryCommon.Traversal(ctx, path, req.Pid, dao.DocumentCompletion.Table(), dataFolder, req.ProjectId, "2") //遍历解压后的文件,插入数据 + liberr.ErrIsNil(ctx, err) + for i := range one { + one[i].CreateBy = formatInt + } + insertData, err := g.DB().Model(dao.DocumentCompletion.Table()).Ctx(ctx).Insert(one) + id, err := insertData.LastInsertId() + liberr.ErrIsNil(ctx, err, "新增失败!") + designEntity.TableId = id + } else if req.FileType == "2" { //2、文件导入 + wornPath := filepath.ToSlash(strings.ReplaceAll(req.FilePath.Url, "/file/", coryCommon.GetCWD()+"/resource/public/")) + ve := "" + //不等于空,那么证明文件应该在根目录下面,否则是在某个文件夹下面 + if req.Pid != "" { + value, _ := dao.DocumentCompletion.Ctx(ctx).Where("id_str", req.Pid).Fields("filen_path").Value() + ve = value.String() + } else { + ve = strings.Replace(dataFolder+"/", "/resource/public/", "/file/", 1) + } + newPath := strings.Replace(ve, "/file/", coryCommon.GetCWD()+"/resource/public/", 1) + //2、文件存在就随机给一个文件名(当前文件名+随机文件名) + _, err = os.Stat(newPath + "/" + req.FilePath.Name) + if err == nil { + split := strings.Split(req.FilePath.Name, ".") + + name := strings.Join(split[0:len(split)-1], ",") + "" + coryCommon.FileName("completion") + "." + strings.Split(req.FilePath.Name, ".")[1] + newPath = newPath + "/" + name + req.FilePath.Name = name + } else { + newPath = newPath + "/" + req.FilePath.Name + } + //3、文件移动 + //newPath = filepath.ToSlash(newPath) + newPath = strings.ReplaceAll(filepath.ToSlash(newPath), "//", "/") + err = os.Rename(wornPath, newPath) + + //4、数据库记录文件 + sp := strings.Split(req.FilePath.Name, ".") + res := model.DocumentCompletionListRes{ + Name: strings.Join(sp[0:len(sp)-1], ","), + Suffix: req.FilePath.FileType, + FilenPath: filepath.ToSlash(strings.Replace(newPath, coryCommon.GetCWD()+"/resource/public/", "/file/", 1)), + Type: "1", + ProjectId: req.ProjectId, + CreateBy: formatInt, + } + if req.Pid == "" { + res.Pid = "0" + } else { + res.Pid = req.Pid + } + insertData, err := dao.DocumentCompletion.Ctx(ctx).Insert(res) + id, err := insertData.LastInsertId() + liberr.ErrIsNil(ctx, err, "新增失败!") + designEntity.TableId = id + } + //只要是新增的数据全都要进入到审核表中,提供给项目经理进行审核 + err = service.BusDesignAudit().Add(ctx, designEntity) + liberr.ErrIsNil(ctx, err, "数据进入审核流程失败") + }) + return err + }) + return +} + +func (s *sDocumentCompletion) Edit(ctx context.Context, req *system.DocumentCompletionEditReq) (err error) { + if req.Type == "1" { + err = updateFile(ctx, req) + } else if req.Type == "2" { + err = updateFolder(ctx, req) + } + liberr.ErrIsNil(ctx, err) + return +} + +func (s *sDocumentCompletion) Delete(ctx context.Context, ids []int64) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //1、先判断删除的是文件还是文件夹,然后进行修改需要删除的文件或文件夹名称 + var dataList []*model.DocumentCompletionInfoRes + err = dao.DocumentCompletion.Ctx(ctx).Where(dao.DocumentCompletion.Columns().Id+" in (?)", ids).Scan(&dataList) + liberr.ErrIsNil(ctx, err, "获取该数据失败") + if len(dataList) > 0 { + for i := range dataList { + //删除的数据是假删除,会将文件夹的名字添加一个前缀“delete” + t := dataList[i].Type + upEntity := system.DocumentCompletionEditReq{ + Id: dataList[i].Id, + Name: dataList[i].Name + coryCommon.FileName("delete"), + Type: t, + } + if t == "1" { + err = updateFile(ctx, &upEntity) + } else { + err = updateFolder(ctx, &upEntity) + } + liberr.ErrIsNil(ctx, err, "删除失败") + //需要记录删除数据的信息 + err = logic.AddApprovedMemo(ctx, dataList[i].Id, dataList[i].ProjectId, dao.DocumentCompletion.Table(), "3") //删除记录 + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + } + //1、删除文件夹 + _, err = dao.DocumentCompletion.Ctx(ctx).Delete(dao.DocumentCompletion.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + } + }) + return err + }) + return +} + +type TreeStructureResTwo struct { + gmeta.Meta `orm:"table:document_completion"` + Id int64 `json:"id"` + IdStr string `json:"idStr"` + Pid string `json:"pid"` + Name string `json:"name"` + Type string `json:"type"` + FilenPath string `json:"filenPath"` + TreeStructureResTwo []*TreeStructureResTwo `json:"treeStructureResTwo" orm:"with:pid=id_str"` +} + +func RecursiveQueryEntityFunc(ctx context.Context, entity []*TreeStructureResTwo) (idStrs []int64) { + for i := range entity { + idStrs = append(idStrs, entity[i].Id) + if len(entity[i].TreeStructureResTwo) > 0 { + strs := RecursiveQueryEntityFunc(ctx, entity[i].TreeStructureResTwo) + idStrs = append(idStrs, strs...) + } + } + return +} + +// AddFileOperation 对文件进行操作(公共) +func AddFileOperation(ctx context.Context, filePath string, projectId int64) (dataFolder string, err error) { + err = g.Try(ctx, func(ctx context.Context) { + //获取当前用户的用户名 + //dataFolder = ct.New().GetLoginUser(ctx).UserName + str := strconv.FormatInt(projectId, 10) + //dataFolder = filePath + "/" + dataFolder + str + dataFolder = filePath + "/" + str + // 判断文件夹是否存在,没有就新建 + mkPath := coryCommon.GetCWD() + dataFolder + if _, err := os.Stat(mkPath); os.IsNotExist(err) { + // 创建文件夹 + err := os.MkdirAll(mkPath, 0777) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + } + }) + return +} + +// 修改文件夹 +func updateFolder(ctx context.Context, req *system.DocumentCompletionEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + + //1、判断修改后的文件夹是否有重复,如果有就提示当前文件夹已存在! + var dif *model.DocumentCompletionInfoRes + dao.DocumentCompletion.Ctx(ctx).WherePri(req.Id).Scan(&dif) + replace := strings.Replace(dif.FilenPath, dif.Name, req.Name, 1) + s2 := coryCommon.FileToFunc(replace, 2) + if _, err = os.Stat(s2); err == nil { + err = errors.New("当前文件夹已存在!") + liberr.ErrIsNil(ctx, err) + return + } else { + count := strings.Count(dif.FilenPath, dif.Name) + hx := coryCommon.SHA256(strings.ReplaceAll(dif.FilenPath, dif.FilenPath, replace)) + //2、如果不存在,那么就修改文件夹的同时,还得修改路径,以及及其子文件/文件夹下的所有路径 + var entity []*TreeStructureResTwo + err = dao.DocumentCompletion.Ctx(ctx).Unscoped().Where("pid", dif.IdStr).WithAll().Scan(&entity) + strs := RecursiveQueryEntityFunc(ctx, entity) + _, err = dao.DocumentCompletion.Ctx(ctx).Unscoped().Where("id in (?)", strs).Update( + g.Map{ + "filen_path": gdb.Raw("CONCAT(" + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', " + strconv.Itoa(count) + ")," + + "'" + req.Name + "'," + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', -1)" + + ")"), + "update_by": ct.New().GetLoginUser(ctx).Id}) + if err != nil { + err = errors.New("修改失败!") + liberr.ErrIsNil(ctx, err) + return + } + //3、重新生成并修改文件夹的id_str等信息 + _, err = dao.DocumentCompletion.Ctx(ctx).Where("id", dif.Id).Update(g.Map{ + "id_str": hx, + "name": req.Name, + "filen_path": gdb.Raw("CONCAT(" + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', " + strconv.Itoa(count) + ")," + + "'" + req.Name + "'," + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', -1)" + + ")"), + }) + _, err = dao.DocumentCompletion.Ctx(ctx).Unscoped().Where("pid", dif.IdStr).Update(g.Map{"pid": hx}) + //4、修改文件夹 + oldPath := filepath.Join(coryCommon.FileToFunc(dif.FilenPath, 2)) + newPath := filepath.Join(filepath.Dir(oldPath), req.Name) + err = os.Rename(oldPath, newPath) + } + liberr.ErrIsNil(ctx, err, "修改失败") + return + }) + return err + }) + return +} + +// 修改文件 +func updateFile(ctx context.Context, req *system.DocumentCompletionEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + var dif *model.DocumentCompletionInfoRes + err = dao.DocumentCompletion.Ctx(ctx).WherePri(req.Id).Scan(&dif) + //1、判断修改后的名字是否有重复,如果有就提示当前文件名已存在! + replace := strings.Replace(dif.FilenPath, dif.Name, req.Name, 1) + s2 := coryCommon.FileToFunc(replace, 2) + if _, err = os.Stat(s2); err == nil { + err = errors.New("当前文件名已存在!") + liberr.ErrIsNil(ctx, err) + return + } + //2、如果不存在,那么就修改文件名的同时,还得修改路径 + _, err = dao.DocumentCompletion.Ctx(ctx).WherePri(req.Id).Update(do.DocumentCompletion{ + Name: req.Name, + FilenPath: replace, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + }) + //3、修改具体文件的文件名 + if err == nil { + oldPath := coryCommon.FileToFunc(dif.FilenPath, 2) + newPath := filepath.Join(filepath.Dir(oldPath), req.Name+dif.Suffix) + err = os.Rename(oldPath, newPath) + if err != nil { + err = errors.New("修改失败") + liberr.ErrIsNil(ctx, err) + return + } + } + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return err + }) + return +} + +func RecursiveDeletion(ctx context.Context, id int64) (ids []int64) { + //1、获取某个文件的字符串id_str + value, _ := dao.DocumentCompletion.Ctx(ctx).Unscoped().Where("id", id).Fields("id_str").Value() + if value.String() == "" { + return nil + } + //2、查看当前需要删除的数据下面是否有子数据 + var dlr []*model.DocumentCompletionListRes + dao.DocumentCompletion.Ctx(ctx).Unscoped().Where("pid", value.String()).Fields("id,id_str").Scan(&dlr) + for i := range dlr { + ids = append(ids, dlr[i].Id) + deletion := RecursiveDeletion(ctx, dlr[i].Id) + ids = append(ids, deletion...) + } + return ids +} + +// SelectRecursionById 递归获取父级的id +func SelectRecursionById(ctx context.Context, tableName, pid string) (id int64, err error) { + sql := `WITH RECURSIVE cte AS ( + SELECT * + FROM ` + tableName + ` + WHERE pid = '` + pid + `' + UNION ALL + SELECT u.* + FROM ` + tableName + ` u + INNER JOIN cte ON u.id_str = cte.pid + ) + SELECT id + FROM cte + ORDER BY id + LIMIT 1` + value, err := g.DB().GetValue(ctx, sql) + if err != nil { + return + } + id = value.Int64() + return +} diff --git a/internal/app/system/logic/documentData/document_data.go b/internal/app/system/logic/documentData/document_data.go new file mode 100644 index 0000000..7db1acb --- /dev/null +++ b/internal/app/system/logic/documentData/document_data.go @@ -0,0 +1,667 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-12-27 09:30:04 +// 生成路径: internal/app/system/logic/document_data.go +// 生成人:gfast +// desc:工程资料>资料 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gmeta" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "net/url" + "os" + "path/filepath" + "strconv" + "strings" +) + +func init() { + service.RegisterDocumentData(New()) +} + +func New() *sDocumentData { + return &sDocumentData{} +} + +type sDocumentData struct{} + +func (s *sDocumentData) SonFileList(ctx context.Context, req *system.SonFileReq) (res *system.SonFileRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + res = new(system.SonFileRes) + var dataList []*model.DocumentDataInfoRes + m := dao.DocumentData.Ctx(ctx). + Where("type", "1"). + Where("pid", req.IdStr) + err = m.Where(dao.DocumentData.Columns().ProjectId, req.Project).Scan(&dataList) + res.List = dataList + liberr.ErrIsNil(ctx, err, "获取数据失败!") + }) + return +} + +func (s *sDocumentData) DataFileQueryFunc(ctx context.Context, req *system.DataFileQueryReq) (res *system.DataFileQueryRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + res = new(system.DataFileQueryRes) + var dataList []*model.DocumentDataListTwoRes + m := dao.DocumentData.Ctx(ctx).As("a"). + LeftJoin("sys_project", "b", "a.project_id = b.id"). + Where("a."+dao.DocumentData.Columns().Type, "1"). + Where("a." + dao.DocumentData.Columns().Suffix + " in ('.docx','.xlsx','.pptx','.doc','.xls','.ppt')") + if req.Project > 0 { + m = m.Where("a."+dao.DocumentData.Columns().ProjectId, req.Project) + } + if strings.Trim(req.FileName, " ") != "" { + m = m.Where("a."+dao.DocumentData.Columns().Name+" like ?", "%"+req.FileName+"%") + } + m.Fields("a.*,b.project_name as projectName,b.short_name as shortName").Scan(&dataList) + for i := range dataList { + // 对 URL 进行编码 + //split := strings.Split(dataList[i].FilenPath, "/") + //s2 := split[len(split)-1] + s2 := dataList[i].FilenPath[6 : len(dataList[i].FilenPath)-1] + encodedPath := url.QueryEscape(s2) + dataList[i].FilenPathCoding = strings.ReplaceAll(dataList[i].FilenPath, s2, encodedPath) + } + res.List = dataList + liberr.ErrIsNil(ctx, err, "获取数据失败!") + }) + return +} + +func (s *sDocumentData) DataRecyclingStationFunc(ctx context.Context, req *system.DataRecyclingStationReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + if req.Type == "1" { + _, err = dao.DocumentData.Ctx(ctx).Unscoped().Where(dao.DocumentData.Columns().Id+" in (?)", req.Ids).Update(g.Map{"deleted_at": nil}) + } else { + var pathArr []string + //删除还需要删除下面的所有子数据 + var idArr []int64 + for i := range req.Ids { + idList := RecursiveDeletion(ctx, req.Ids[i]) + if idList != nil { + idArr = append(idArr, idList...) + } + data, _ := dao.DocumentData.Ctx(ctx).Unscoped().Where("id", req.Ids[i]).Fields("filen_path").Value() + pathArr = append(pathArr, data.String()) + } + idArr = append(idArr, req.Ids...) + _, err = dao.DocumentData.Ctx(ctx).Unscoped().Delete(dao.DocumentData.Columns().Id+" in (?)", idArr) + //如果删除成功,那么删除文件/文件夹 + for _, data := range pathArr { + os.RemoveAll(coryCommon.FileToFunc(data, 2)) + } + } + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +func RecursiveDeletion(ctx context.Context, id int64) (ids []int64) { + //1、获取某个文件的字符串id_str + value, _ := dao.DocumentData.Ctx(ctx).Unscoped().Where("id", id).Fields("id_str").Value() + if value.String() == "" { + return nil + } + //2、查看当前需要删除的数据下面是否有子数据 + var dlr []*model.DocumentDataListRes + dao.DocumentData.Ctx(ctx).Unscoped().Where("pid", value.String()).Fields("id,id_str").Scan(&dlr) + for i := range dlr { + ids = append(ids, dlr[i].Id) + deletion := RecursiveDeletion(ctx, dlr[i].Id) + ids = append(ids, deletion...) + } + return ids +} + +func (s *sDocumentData) AllList(ctx context.Context, req *system.AllDocumentDataSearchReq) (res *system.AllDocumentDataSearchRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + res = new(system.AllDocumentDataSearchRes) + var dataList []*model.DocumentDataInfoRes + m := dao.DocumentData.Ctx(ctx) + if req.Type == "2" { + m = m.Unscoped().WhereNotNull("deleted_at") + } else if req.Type == "3" { + m = m.Unscoped() + } + err = m.Where(dao.DocumentData.Columns().ProjectId, req.ProjectId).OrderDesc(dao.DocumentData.Columns().CreatedAt).Scan(&dataList) + res.List = dataList + liberr.ErrIsNil(ctx, err, "获取数据失败!") + }) + return +} + +func (s *sDocumentData) OnlineMobileFunc(ctx context.Context, req *system.OnlineMobileReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + //获取当前用户的用户名 + dataFolder := ct.New().GetLoginUser(ctx).UserName + str := strconv.FormatInt(req.ProjectId, 10) + dataFolder = coryCommon.Template2 + "/" + dataFolder + str + err = g.Try(ctx, func(ctx context.Context) { + var dir *model.DocumentDataInfoRes + err = dao.DocumentData.Ctx(ctx).WherePri(req.TemplateId).Scan(&dir) + var ddir *model.DocumentDataInfoRes + err = dao.DocumentData.Ctx(ctx).WherePri(req.DataId).Scan(&ddir) + src := coryCommon.FileToFunc(dir.FilenPath, 2) + num := req.Type + if num == "1" { + //1、将模板文件copy到资料文件夹下 + dst := coryCommon.FileToFunc(ddir.FilenPath, 2) + "/" + dir.Name + dir.Suffix + err = coryCommon.MoveFile(src, dst) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + res := model.DocumentDataInfoRes{ + Pid: coryCommon.SHA256(ddir.IdStr), + Name: dir.Name, + Suffix: dir.Suffix, + FilenPath: coryCommon.ResourcePublicToFunc(dst, 1), + Type: "1", + } + _, err = dao.DocumentData.Ctx(ctx).Insert(res) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + } else if num == "2" { + dst := coryCommon.FileToFunc(ddir.FilenPath, 2) + //复制文件夹到指定文件夹下 + split := strings.Split(src, "/") + err = coryCommon.MoveFolder(src, dst+"/"+split[len(split)-1]) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + //遍历文件夹,存储数据 + one, err := coryCommon.Traversal(ctx, dst+"/"+dir.Name, ddir.IdStr, dao.DocumentData.Table(), dataFolder, ddir.ProjectId, "2") + liberr.ErrIsNil(ctx, err) + _, err = g.DB().Model(dao.DocumentData.Table()).Ctx(ctx).Insert(one) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } else { + //删除原本的文件夹及下面的所有数据 + _, err = dao.DocumentData.Ctx(ctx).Unscoped().Where("filen_path like ?", "%"+dir.FilenPath+"%").Delete() + } + } + liberr.ErrIsNil(ctx, err, "操作失败!") + }) + return err + }) + return +} + +func (s *sDocumentData) OnlineImportFunc(ctx context.Context, req *system.OnlineImportReq) (err error) { + //获取当前用户的用户名 + dataFolder := ct.New().GetLoginUser(ctx).UserName + str := strconv.FormatInt(req.ProjectId, 10) + dataFolder = coryCommon.Template2 + "/" + dataFolder + str + + err = g.Try(ctx, func(ctx context.Context) { + var dir []*model.DocumentInfoRes + err = dao.Document.Ctx(ctx).WherePri(req.TemplateId).Scan(&dir) + var ddir *model.DocumentDataInfoRes + err = dao.DocumentData.Ctx(ctx).WherePri(req.DataId).Scan(&ddir) + for i := range dir { + src := coryCommon.FileToFunc(dir[i].FilenPath, 2) + num := req.Type + if num == "1" { + var fileName = dir[i].Name + //1、将模板文件copy到资料文件夹下 + dst := coryCommon.FileToFunc(ddir.FilenPath, 2) + "/" + fileName + dir[i].Suffix + // 检查源文件夹是否存在 + _, err := os.Stat(dst) + if err == nil { + fileName = fileName + coryCommon.FileName("zl") + dir[i].Suffix + dst = coryCommon.FileToFunc(ddir.FilenPath, 2) + "/" + fileName + } + err = coryCommon.CopyFile(src, dst) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + res := model.DocumentDataInfoRes{ + Pid: ddir.IdStr, + Name: fileName, + Suffix: dir[i].Suffix, + FilenPath: coryCommon.ResourcePublicToFunc(dst, 1), + Type: "1", + ProjectId: req.ProjectId, + } + _, err = dao.DocumentData.Ctx(ctx).Insert(res) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + } else if num == "2" { + dst := coryCommon.FileToFunc(ddir.FilenPath, 2) + "/" + dir[i].Name + // 检查源文件夹是否存在 + _, err := os.Stat(dst) + if err == nil { + err = errors.New("当前文件夹已存在!") + liberr.ErrIsNil(ctx, err) + return + } + //复制文件夹到指定文件夹下 + err = coryCommon.CopyDirectory(src, dst) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + //遍历文件夹,存储数据 + one, err := coryCommon.Traversal(ctx, dst, ddir.IdStr, dao.DocumentData.Table(), dataFolder, ddir.ProjectId, "2") + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + _, err = g.DB().Model(dao.DocumentData.Table()).Ctx(ctx).Insert(one) + liberr.ErrIsNil(ctx, err, "新增失败!") + } + } + liberr.ErrIsNil(ctx, err, "操作失败!") + }) + return +} + +func (s *sDocumentData) TreeStructureDataFunc(ctx context.Context, req *system.TreeStructureDataReq) (res *system.TreeStructureDataRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + res = new(system.TreeStructureDataRes) + var entity []*model.TreeStructureDataRes + err = dao.DocumentData.Ctx(ctx).Where("pid = '0'").Where("project_id", req.ProjectId).WithAll().Scan(&entity) + res.List = entity + liberr.ErrIsNil(ctx, err, "获取数据失败!") + }) + return +} + +func RecursiveQueryFunc(dr []*model.DocumentDataInfoRes, idStr string) (idStrs []string) { + for _, data := range dr { + if data.Pid == idStr { + idStrs = append(idStrs, data.IdStr) + strs := RecursiveQueryFunc(dr, data.IdStr) + if len(strs) > 0 { + idStrs = append(idStrs, strs...) + } + } + } + return +} + +func (s *sDocumentData) List(ctx context.Context, req *system.DocumentDataSearchReq) (listRes *system.DocumentDataSearchRes, err error) { + listRes = new(system.DocumentDataSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.DocumentData.Ctx(ctx).Where(dao.DocumentData.Columns().Type, "1").Where(dao.DocumentData.Columns().ProjectId, req.ProjectId) + //如果查询全部那么就先递归获取到所有的pid然后去查询,否则就只查询前端传递过来的数据 + //if req.Switch == "1" { + // var dr []*model.DocumentDataInfoRes + // err = dao.DocumentData.Ctx(ctx).Where("type = 2").Scan(&dr) + // strs := RecursiveQueryFunc(dr, req.IdStr) + // strs = append(strs, req.IdStr) + // m = m.Where(dao.DocumentData.Columns().Pid+" in (?)", strs) + //} else { + m = m.Where(dao.DocumentData.Columns().Pid, req.IdStr) + //} + if req.Name != "" { + m = m.Where(dao.DocumentData.Columns().Name+" like ?", "%"+req.Name+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.DocumentData.Columns().CreatedAt+" >=? AND "+dao.DocumentData.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if !strings.EqualFold(req.IsPaging, "YES") { + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + m = m.Fields(system.DocumentDataSearchRes{}).Page(req.PageNum, req.PageSize) + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.DocumentDataInfoRes + err = m.Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.DocumentDataListRes, len(res)) + for k, v := range res { + // 对 URL 进行编码 + s2 := v.FilenPath[6 : len(v.FilenPath)-1] + encodedPath := url.QueryEscape(s2) + listRes.List[k] = &model.DocumentDataListRes{ + Id: v.Id, + Name: v.Name, + FilenPath: v.FilenPath, + FilenPathCoding: strings.ReplaceAll(v.FilenPath, s2, encodedPath), + Suffix: v.Suffix, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sDocumentData) GetById(ctx context.Context, id int64) (res *model.DocumentDataInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.DocumentData.Ctx(ctx).WithAll().Where(dao.DocumentData.Columns().Id, id).Scan(&res) + // 对 URL 进行编码 + //split := strings.Split(res.FilenPath, "/") + //s2 := split[len(split)-1] + s2 := res.FilenPath[6 : len(res.FilenPath)-1] + encodedPath := url.QueryEscape(s2) + res.FilenPathCoding = strings.ReplaceAll(res.FilenPath, s2, encodedPath) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sDocumentData) Add(ctx context.Context, req *system.DocumentDataAddReq) (err error) { + //大文件上传 + req.FilePath.Url = strings.ReplaceAll(req.FilePath.Url, "/resource/public/", "/file/") + req.FilePath.Name = strings.Replace(req.FilePath.Name, " ", "", -1) + //获取当前用户的用户名 + dataFolder := ct.New().GetLoginUser(ctx).UserName + str := strconv.FormatInt(req.ProjectId, 10) + dataFolder = coryCommon.Template2 + "/" + dataFolder + str + // 判断文件夹是否存在,没有就新建 + mkPath := coryCommon.GetCWD() + dataFolder + if _, err := os.Stat(mkPath); os.IsNotExist(err) { + // 创建文件夹 + err := os.MkdirAll(mkPath, 0777) + if err != nil { + return err + } + } + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + if req.FileType == "1" { //1、压缩文件夹导入 + filenPath := "" + if req.Pid != "" { + value, _ := dao.DocumentData.Ctx(ctx).Where("id_str", req.Pid).Fields("filen_path").Value() + filenPath = value.String() + } + newPath := strings.ReplaceAll(req.FilePath.Url, "/file", coryCommon.GetCWD()+"/resource/public") + path, err := coryCommon.FileZipFunc(newPath, filenPath, dataFolder) //解压相对路径,并删除压缩文件,返回解压后的相对路径 + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + one, err := coryCommon.Traversal(ctx, path, req.Pid, dao.DocumentData.Table(), dataFolder, req.ProjectId, "2") //遍历解压后的文件,插入数据 + //err = Traversal(ctx, "resource/public/masterMask/资料模板") + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + _, err = g.DB().Model(dao.DocumentData.Table()).Ctx(ctx).Insert(one) + liberr.ErrIsNil(ctx, err, "新增失败!") + } else if req.FileType == "2" { //2、文件导入 + wornPath := filepath.ToSlash(strings.ReplaceAll(req.FilePath.Url, "/file/", coryCommon.GetCWD()+"/resource/public/")) + value, _ := dao.DocumentData.Ctx(ctx).Where("id_str", req.Pid).Fields("filen_path").Value() + newPath := strings.Replace(value.String(), "/file/", coryCommon.GetCWD()+"/resource/public/", 1) + //2、文件存在就随机给一个文件名(当前文件名+随机文件名) + _, err = os.Stat(newPath + "/" + req.FilePath.Name) + if err == nil { + split := strings.Split(req.FilePath.Name, ".") + name := split[0] + "" + coryCommon.FileName("zl") + "." + strings.Split(req.FilePath.Name, ".")[1] + newPath = newPath + "/" + name + req.FilePath.Name = name + } else { + newPath = newPath + "/" + req.FilePath.Name + } + //3、文件移动 + err = os.Rename(wornPath, newPath) + //4、数据库记录文件 + _, err = dao.DocumentData.Ctx(ctx).Insert(model.DocumentDataListRes{ + Pid: req.Pid, + Name: strings.Split(req.FilePath.Name, ".")[0], + Suffix: req.FilePath.FileType, + FilenPath: filepath.ToSlash(strings.Replace(newPath, coryCommon.GetCWD()+"/resource/public/", "/file/", 1)), + Type: "1", + ProjectId: req.ProjectId, + }) + } else { //3、新建文件夹 + + } + liberr.ErrIsNil(ctx, err, "新增失败!") + return + }) + return err + }) + return +} + +func (s *sDocumentData) NewFolderDataFunc(ctx context.Context, req *system.NewFolderDataReq) (err error) { + //获取当前用户的用户名 + dataFolder := ct.New().GetLoginUser(ctx).UserName + str := strconv.FormatInt(req.ProjectId, 10) + dataFolder = coryCommon.Template2 + "/" + dataFolder + str + // 判断文件夹是否存在,没有就新建 + mkPath := coryCommon.GetCWD() + dataFolder + if _, err := os.Stat(mkPath); os.IsNotExist(err) { + // 创建文件夹 + err := os.MkdirAll(mkPath, 0777) + if err != nil { + return err + } + } + err = g.Try(ctx, func(ctx context.Context) { + //1、组装数据 + resEntity := model.DocumentDataListRes{ + Name: req.FileName, + Suffix: "", + Type: "2", + } + path := "" + if req.Pid != "" { + value, _ := dao.DocumentData.Ctx(ctx).Where("id_str", req.Pid).Fields("filen_path").Value() + path = value.String() + "/" + req.FileName + resEntity.Pid = req.Pid + } else { + template := strings.Replace(dataFolder, "/resource/public/", "/file/", 1) + path = template + "/" + req.FileName + resEntity.Pid = "0" + } + //2、判断是否重名,不重复就新增 + count, _ := dao.DocumentData.Ctx(ctx).Unscoped().Where("filen_path", path).Count() + if count > 0 { + err = errors.New("文件夹已重复!") + liberr.ErrIsNil(ctx, err) + return + } else { + resEntity.IdStr = coryCommon.SHA256(path) + resEntity.FilenPath = path + resEntity.ProjectId = req.ProjectId + _, insertDataErr := dao.DocumentData.Ctx(ctx).Insert(resEntity) + if insertDataErr != nil { + err = errors.New("新增文件夹失败!") + liberr.ErrIsNil(ctx, err) + return + } + err = coryCommon.CreateDirectory(strings.Replace(path, "/file/", coryCommon.GetCWD()+"/resource/public/", 1)) + if err != nil { + //err = errors.New("新增文件夹失败!") + liberr.ErrIsNil(ctx, err) + return + } + } + liberr.ErrIsNil(ctx, err, "新增文件夹失败!") + }) + return + +} + +func (s *sDocumentData) Edit(ctx context.Context, req *system.DocumentDataEditReq) (err error) { + if len(strings.ReplaceAll(req.Name, " ", "")) == 0 { + err = errors.New("输入的名称不能为空!") + return err + } + if req.Type == "1" { + err = updateFile(ctx, req) + } else if req.Type == "2" { + err = updateFolder(ctx, req) + } + return err +} + +type TreeStructureResTwo struct { + gmeta.Meta `orm:"table:document_data"` + Id int64 `json:"id"` + IdStr string `json:"idStr"` + Pid string `json:"pid"` + Name string `json:"name"` + Type string `json:"type"` + FilenPath string `json:"filenPath"` + TreeStructureResTwo []*TreeStructureResTwo `json:"treeStructureResTwo" orm:"with:pid=id_str"` +} + +func RecursiveQueryEntityFunc(ctx context.Context, entity []*TreeStructureResTwo) (idStrs []int64) { + for i := range entity { + idStrs = append(idStrs, entity[i].Id) + if len(entity[i].TreeStructureResTwo) > 0 { + strs := RecursiveQueryEntityFunc(ctx, entity[i].TreeStructureResTwo) + idStrs = append(idStrs, strs...) + } + } + return +} + +// 修改文件夹 +func updateFolder(ctx context.Context, req *system.DocumentDataEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + + //1、判断修改后的文件夹是否有重复,如果有就提示当前文件夹已存在! + var dif *model.DocumentInfoRes + dao.DocumentData.Ctx(ctx).WherePri(req.Id).Scan(&dif) + replace := strings.Replace(dif.FilenPath, dif.Name, req.Name, 1) + s2 := coryCommon.FileToFunc(replace, 2) + if _, err = os.Stat(s2); err == nil { + err = errors.New("当前文件夹已存在!") + liberr.ErrIsNil(ctx, err) + return + } else { + count := strings.Count(dif.FilenPath, dif.Name) + hx := coryCommon.SHA256(strings.ReplaceAll(dif.FilenPath, dif.FilenPath, replace)) + //2、如果不存在,那么就修改文件夹的同时,还得修改路径,以及及其子文件/文件夹下的所有路径 + var entity []*TreeStructureResTwo + err = dao.DocumentData.Ctx(ctx).Unscoped().Where("pid", dif.IdStr).WithAll().Scan(&entity) + strs := RecursiveQueryEntityFunc(ctx, entity) + _, err = dao.DocumentData.Ctx(ctx).Unscoped().Where("id in (?)", strs).Update(g.Map{"filen_path": gdb.Raw("CONCAT(" + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', " + strconv.Itoa(count) + ")," + + "'" + req.Name + "'," + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', -1)" + + ")")}) + if err != nil { + err = errors.New("修改失败!") + liberr.ErrIsNil(ctx, err) + return + } + //3、重新生成并修改文件夹的id_str等信息 + _, err = dao.DocumentData.Ctx(ctx).Where("id", dif.Id).Update(g.Map{ + "id_str": hx, + "name": req.Name, + "filen_path": gdb.Raw("CONCAT(" + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', " + strconv.Itoa(count) + ")," + + "'" + req.Name + "'," + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', -1)" + + ")"), + }) + _, err = dao.DocumentData.Ctx(ctx).Unscoped().Where("pid", dif.IdStr).Update(g.Map{"pid": hx}) + //4、修改文件夹 + oldPath := filepath.Join(coryCommon.FileToFunc(dif.FilenPath, 2)) + newPath := filepath.Join(filepath.Dir(oldPath), req.Name) + err = os.Rename(oldPath, newPath) + } + liberr.ErrIsNil(ctx, err, "修改失败") + return + }) + return err + }) + return +} + +// 修改文件 +func updateFile(ctx context.Context, req *system.DocumentDataEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + var dif *model.DocumentDataInfoRes + err = dao.DocumentData.Ctx(ctx).WherePri(req.Id).Scan(&dif) + //1、判断修改后的名字是否有重复,如果有就提示当前文件名已存在! + replace := strings.Replace(dif.FilenPath, dif.Name, req.Name, 1) + s2 := coryCommon.FileToFunc(replace, 2) + if _, err = os.Stat(s2); err == nil { + err = errors.New("当前文件名已存在!") + liberr.ErrIsNil(ctx, err) + return + } + //2、如果不存在,那么就修改文件名的同时,还得修改路径 + _, err = dao.DocumentData.Ctx(ctx).WherePri(req.Id).Update(do.DocumentData{ + Name: req.Name, + FilenPath: replace, + }) + //3、修改具体文件的文件名 + if err == nil { + oldPath := coryCommon.FileToFunc(dif.FilenPath, 2) + newPath := filepath.Join(filepath.Dir(oldPath), req.Name+dif.Suffix) + err = os.Rename(oldPath, newPath) + if err != nil { + err = errors.New("修改失败") + liberr.ErrIsNil(ctx, err) + return + } + } + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return err + }) + return +} + +func (s *sDocumentData) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、先判断删除的是文件还是文件夹,然后进行修改需要删除的文件或文件夹名称 + var dataList []*model.DocumentDataInfoRes + err = dao.DocumentData.Ctx(ctx).Where(dao.DocumentData.Columns().Id+" in (?)", ids).Scan(&dataList) + liberr.ErrIsNil(ctx, err, "删除失败") + if len(dataList) > 0 { + for i := range dataList { + t := dataList[i].Type + upEntity := system.DocumentDataEditReq{ + Id: dataList[i].Id, + Name: dataList[i].Name + coryCommon.FileName("delete"), + Type: t, + } + if t == "1" { + err = updateFile(ctx, &upEntity) + liberr.ErrIsNil(ctx, err, "删除失败") + } else { + err = updateFolder(ctx, &upEntity) + liberr.ErrIsNil(ctx, err, "删除失败") + } + } + //1、删除文件夹 + _, err = dao.DocumentData.Ctx(ctx).Delete(dao.DocumentData.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + } + }) + return +} diff --git a/internal/app/system/logic/documentProductionDrawing/document_production_drawing.go b/internal/app/system/logic/documentProductionDrawing/document_production_drawing.go new file mode 100644 index 0000000..8e87d77 --- /dev/null +++ b/internal/app/system/logic/documentProductionDrawing/document_production_drawing.go @@ -0,0 +1,566 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-03-15 10:24:54 +// 生成路径: internal/app/system/logic/document_production_drawing.go +// 生成人:gfast +// desc:施工图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + busDesignAuditLogic "github.com/tiger1103/gfast/v3/internal/app/system/logic/busDesignAudit" + logic "github.com/tiger1103/gfast/v3/internal/app/system/logic/documentCompletion" + + "os" + "path/filepath" + "strconv" + "strings" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/gogf/gf/v2/util/gmeta" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterDocumentProductionDrawing(New()) +} + +func New() *sDocumentProductionDrawing { + return &sDocumentProductionDrawing{} +} + +type sDocumentProductionDrawing struct{} + +func (s *sDocumentProductionDrawing) RecycleBinListFunc(ctx context.Context, req *system.ProductionDrawingRecycleBinListReq) (res *system.ProductionDrawingRecycleBinListRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + res = new(system.ProductionDrawingRecycleBinListRes) + var dataList []*model.DocumentProductionDrawingInfoRes + m := dao.DocumentProductionDrawing.Ctx(ctx) + if req.Type == "2" { + m = m.Unscoped().WhereNotNull("deleted_at") + } else if req.Type == "3" { + m = m.Unscoped() + } + err = m.Where(dao.DocumentProductionDrawing.Columns().ProjectId, req.ProjectId).Scan(&dataList) + res.List = dataList + liberr.ErrIsNil(ctx, err, "获取数据失败!") + }) + return +} + +func (s *sDocumentProductionDrawing) NewFolderDataFunc(ctx context.Context, req *system.ProductionDrawingNewFolderDataReq) (err error) { + dataFolder, err := logic.AddFileOperation(ctx, coryCommon.Completion, req.ProjectId) + err = g.Try(ctx, func(ctx context.Context) { + // 1、组装数据 + resEntity := model.DocumentProductionDrawingListRes{ + Name: req.FileName, + Suffix: "", + Type: "2", + } + path := "" + if req.Pid != "" { + value, _ := dao.DocumentProductionDrawing.Ctx(ctx).Where("id_str", req.Pid).Fields("filen_path").Value() + path = value.String() + "/" + req.FileName + resEntity.Pid = req.Pid + } else { + template := strings.Replace(dataFolder, "/resource/public/", "/file/", 1) + path = template + "/" + req.FileName + resEntity.Pid = "0" + } + // 2、判断是否重名,不重复就新增 + count, _ := dao.DocumentProductionDrawing.Ctx(ctx).Unscoped().Where("filen_path", path).Count() + if count > 0 { + err = errors.New("文件夹已重复!") + liberr.ErrIsNil(ctx, err) + return + } else { + resEntity.IdStr = coryCommon.SHA256(path) + resEntity.FilenPath = path + resEntity.ProjectId = req.ProjectId + resEntity.State = "4" + resEntity.CreateBy = strconv.FormatInt(int64(ct.New().GetLoginUser(ctx).Id), 10) + _, insertDataErr := dao.DocumentProductionDrawing.Ctx(ctx).Insert(resEntity) + if insertDataErr != nil { + err = errors.New("新增文件夹失败!") + liberr.ErrIsNil(ctx, err) + return + } + err = coryCommon.CreateDirectory(strings.Replace(path, "/file/", coryCommon.GetCWD()+"/resource/public/", 1)) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + } + liberr.ErrIsNil(ctx, err, "新增文件夹失败!") + }) + return +} + +func (s *sDocumentProductionDrawing) TreeStructureFunc(ctx context.Context, req *system.ProductionDrawingTreeStructureReq) (res *system.ProductionDrawingTreeStructureRes, err error) { + res = new(system.ProductionDrawingTreeStructureRes) + err = g.Try(ctx, func(ctx context.Context) { + var completion []*model.DocumentProductionDrawingListRes + // 1、获取到当前项目下的所有顶级文件及目录 + sql := dao.DocumentProductionDrawing.Ctx(ctx). + Where("project_id", req.ProjectId).Where("state in ('3','4')") + if req.Pid != "" { + sql = sql.Where("pid", req.Pid) + } + sql = sql.WhereNull("deleted_at") + err := sql.Order("type desc").Scan(&completion) + for i := range completion { + completion[i].FilenPathCoding = coryCommon.URLCoding(completion[i].FilenPath) + } + res.List = completion + liberr.ErrIsNil(ctx, err, "获取数据失败") + }) + return +} + +func (s *sDocumentProductionDrawing) SelectByPidFunc(ctx context.Context, req *system.ProductionDrawingSelectByPidReq) (res *system.ProductionDrawingSelectByPidRes, err error) { + res = new(system.ProductionDrawingSelectByPidRes) + // 1、组装路径 + dataFolder := ct.New().GetLoginUser(ctx).UserName + dataFolder = coryCommon.Completion + "/" + dataFolder + req.PathName + // 2、获取pid + err = g.Try(ctx, func(ctx context.Context) { + value, err := dao.DocumentProductionDrawing.Ctx(ctx). + Where("project_id", req.ProjectId). + Where("filen_path", req.PathName). + Fields("pid"). + Value() + liberr.ErrIsNil(ctx, err, "获取数据失败") + res.Pid = value.String() + }) + return +} + +func (s *sDocumentProductionDrawing) RecyclingStationFunc(ctx context.Context, req *system.ProductionDrawingDataRecyclingStationReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + if req.Type == "1" { + _, err = dao.DocumentProductionDrawing.Ctx(ctx).Unscoped().Where(dao.DocumentProductionDrawing.Columns().Id+" in (?)", req.Ids).Update(g.Map{"deleted_at": nil}) + } else { + var pathArr []string + // 删除还需要删除下面的所有子数据 + var idArr []int64 + for i := range req.Ids { + idList := RecursiveDeletion(ctx, req.Ids[i]) + if idList != nil { + idArr = append(idArr, idList...) + } + data, _ := dao.DocumentProductionDrawing.Ctx(ctx).Unscoped().Where("id", req.Ids[i]).Fields("filen_path").Value() + pathArr = append(pathArr, data.String()) + } + idArr = append(idArr, req.Ids...) + _, err = dao.DocumentProductionDrawing.Ctx(ctx).Unscoped().Delete(dao.DocumentProductionDrawing.Columns().Id+" in (?)", idArr) + // 如果删除成功,那么删除文件/文件夹 + for _, data := range pathArr { + os.RemoveAll(coryCommon.FileToFunc(data, 2)) + } + } + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +func (s *sDocumentProductionDrawing) List(ctx context.Context, req *system.DocumentProductionDrawingSearchReq) (listRes *system.DocumentProductionDrawingSearchRes, err error) { + listRes = new(system.DocumentProductionDrawingSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.DocumentProductionDrawing.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.DocumentProductionDrawing.Columns().Id+" = ?", req.Id) + } + if req.IdStr != "" { + m = m.Where(dao.DocumentProductionDrawing.Columns().IdStr+" = ?", req.IdStr) + } + if req.Pid != "" { + m = m.Where(dao.DocumentProductionDrawing.Columns().Pid+" = ?", req.Pid) + } + if req.Name != "" { + m = m.Where(dao.DocumentProductionDrawing.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.FilenPath != "" { + m = m.Where(dao.DocumentProductionDrawing.Columns().FilenPath+" = ?", req.FilenPath) + } + if req.Type != "" { + m = m.Where(dao.DocumentProductionDrawing.Columns().Type+" = ?", req.Type) + } + if req.Suffix != "" { + m = m.Where(dao.DocumentProductionDrawing.Columns().Suffix+" = ?", req.Suffix) + } + if req.CreateBy != "" { + m = m.Where(dao.DocumentProductionDrawing.Columns().CreateBy+" = ?", req.CreateBy) + } + if req.UpdateBy != "" { + m = m.Where(dao.DocumentProductionDrawing.Columns().UpdateBy+" = ?", req.UpdateBy) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.DocumentProductionDrawing.Columns().CreatedAt+" >=? AND "+dao.DocumentProductionDrawing.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.ProjectId != "" { + m = m.Where(dao.DocumentProductionDrawing.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.DocumentProductionDrawingInfoRes + err = m.Fields(system.DocumentProductionDrawingSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.DocumentProductionDrawingListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.DocumentProductionDrawingListRes{ + Id: v.Id, + IdStr: v.IdStr, + Pid: v.Pid, + Name: v.Name, + FilenPath: v.FilenPath, + Type: v.Type, + Suffix: v.Suffix, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + ProjectId: v.ProjectId, + } + } + }) + return +} + +func (s *sDocumentProductionDrawing) GetById(ctx context.Context, id int64) (res []*model.SelectTabNameAndTabIdByDateRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、获取当前数据的pid + value, err := dao.DocumentProductionDrawing.Ctx(ctx).Where(dao.DocumentProductionDrawing.Columns().Id, id).Fields("pid").Value() + liberr.ErrIsNil(ctx, err) + var pid = value.String() + //2、组装数据 + req := model.SelectTabNameAndTabIdByDateReq{ + TableName: dao.DocumentProductionDrawing.Table(), + TableId: id, + } + if pid != "" { + //获取最终父节点id + byId, err := logic.SelectRecursionById(ctx, req.TableName, pid) + liberr.ErrIsNil(ctx, err) + req.FatherId = byId + } + //3、得到最终文件/文件夹的操作记录 + res, err = busDesignAuditLogic.SelectTabNameAndTabIdByDateFunc(ctx, &req) + for i := range res { + res[i].CreatedBy = coryCommon.SelectByString(ctx, coryCommon.IsNumeric(res[i].CreatedBy), res[i].CreatedBy) + } + liberr.ErrIsNil(ctx, err) + }) + return +} + +func (s *sDocumentProductionDrawing) Add(ctx context.Context, req *system.DocumentProductionDrawingAddReq) (err error) { + if req.FilePath == nil { + errors.New("未识别到文件上传!") + return + } + // 大文件上传 + req.FilePath.Url = strings.ReplaceAll(req.FilePath.Url, "/resource/public/", "/file/") + req.FilePath.Name = strings.Replace(req.FilePath.Name, " ", "", -1) + dataFolder, err := logic.AddFileOperation(ctx, coryCommon.ProductionDrawing, req.ProjectId) + if err != nil { + return err + } + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + designEntity := &system.BusDesignAuditAddReq{ + ProjectId: req.ProjectId, + TableName: dao.DocumentProductionDrawing.Table(), + } + ct := ct.New().GetLoginUser(ctx).Id + formatInt := strconv.FormatInt(int64(ct), 10) + if req.FileType == "1" { // 1、压缩文件夹导入 + filenPath := "" + if req.Pid != "" { + value, _ := dao.DocumentProductionDrawing.Ctx(ctx).Where("id_str", req.Pid).Fields("filen_path").Value() + filenPath = value.String() + } + newPath := strings.ReplaceAll(req.FilePath.Url, "/file", coryCommon.GetCWD()+"/resource/public") + if filenPath == "" { + filenPath = coryCommon.ResourcePublicToFunc(dataFolder, 0) + } + path, err := coryCommon.FileZipFunc(newPath, filenPath, dataFolder) // 解压相对路径,并删除压缩文件,返回解压后的相对路径 + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + one, err := coryCommon.Traversal(ctx, path, req.Pid, dao.DocumentProductionDrawing.Table(), dataFolder, req.ProjectId, "2") // 遍历解压后的文件,插入数据 + liberr.ErrIsNil(ctx, err) + for i := range one { + one[i].CreateBy = formatInt + } + insertData, err := g.DB().Model(dao.DocumentProductionDrawing.Table()).Ctx(ctx).Insert(one) + id, err := insertData.LastInsertId() + liberr.ErrIsNil(ctx, err, "新增失败!") + designEntity.TableId = id + } else if req.FileType == "2" { // 2、文件导入 + wornPath := filepath.ToSlash(strings.ReplaceAll(req.FilePath.Url, "/file/", coryCommon.GetCWD()+"/resource/public/")) + ve := "" + // 不等于空,那么证明文件应该在根目录下面,否则是在某个文件夹下面 + if req.Pid != "" { + value, _ := dao.DocumentProductionDrawing.Ctx(ctx).Where("id_str", req.Pid).Fields("filen_path").Value() + ve = value.String() + } else { + ve = strings.Replace(dataFolder+"/", "/resource/public/", "/file/", 1) + } + newPath := strings.Replace(ve, "/file/", coryCommon.GetCWD()+"/resource/public/", 1) + // 2、文件存在就随机给一个文件名(当前文件名+随机文件名) + _, err = os.Stat(newPath + "/" + req.FilePath.Name) + if err == nil { + split := strings.Split(req.FilePath.Name, ".") + name := strings.Join(split[0:len(split)-1], ",") + "" + coryCommon.FileName("completion") + "." + strings.Split(req.FilePath.Name, ".")[1] + newPath = newPath + "/" + name + req.FilePath.Name = name + } else { + newPath = newPath + "/" + req.FilePath.Name + } + // 3、文件移动 + // newPath = filepath.ToSlash(newPath) + newPath = strings.ReplaceAll(filepath.ToSlash(newPath), "//", "/") + err = os.Rename(wornPath, newPath) + + // 4、数据库记录文件 + sp := strings.Split(req.FilePath.Name, ".") + res := model.DocumentProductionDrawingListRes{ + Name: strings.Join(sp[0:len(sp)-1], ","), + Suffix: req.FilePath.FileType, + FilenPath: filepath.ToSlash(strings.Replace(newPath, coryCommon.GetCWD()+"/resource/public/", "/file/", 1)), + Type: "1", + ProjectId: req.ProjectId, + } + if req.Pid == "" { + res.Pid = "0" + } else { + res.Pid = req.Pid + } + insertData, err := dao.DocumentProductionDrawing.Ctx(ctx).Insert(res) + id, err := insertData.LastInsertId() + liberr.ErrIsNil(ctx, err, "新增失败!") + designEntity.TableId = id + } + //只要是新增的数据全都要进入到审核表中,提供给项目经理进行审核 + err = service.BusDesignAudit().Add(ctx, designEntity) + liberr.ErrIsNil(ctx, err, "数据进入审核流程失败") + }) + return err + }) + return +} + +func (s *sDocumentProductionDrawing) Edit(ctx context.Context, req *system.DocumentProductionDrawingEditReq) (err error) { + if req.Type == "1" { + err = updateFile(ctx, req) + } else if req.Type == "2" { + err = updateFolder(ctx, req) + } + liberr.ErrIsNil(ctx, err) + return +} + +func (s *sDocumentProductionDrawing) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 获取文件详情 + drawingInfoList := []*model.DocumentProductionDrawingInfoRes{} + err = dao.DocumentProductionDrawing.Ctx(ctx).Where(dao.DocumentProductionDrawing.Columns().Id+" in (?)", ids).Scan(&drawingInfoList) + liberr.ErrIsNil(ctx, err, "获取该数据失败") + + // 如果没有数据,那么就直接返回 + if len(drawingInfoList) == 0 { + return + } + + // 遍历每个文件 + for i := 0; i < len(drawingInfoList); i++ { + dataType := drawingInfoList[i].Type // 文件类型 + + upEntity := system.DocumentProductionDrawingEditReq{ + Id: drawingInfoList[i].Id, + Name: drawingInfoList[i].Name + coryCommon.FileName("delete"), + Type: dataType, + } + + // 根据文件类型进行操作 + switch dataType { + case "1": + err = updateFile(ctx, &upEntity) // 修改文件 + default: + err = updateFolder(ctx, &upEntity) // 修改目录 + } + liberr.ErrIsNil(ctx, err, "删除失败") + //需要记录删除数据的信息 + err = busDesignAuditLogic.AddApprovedMemo(ctx, drawingInfoList[i].Id, drawingInfoList[i].ProjectId, dao.DocumentQualityMeeting.Table(), "3") //删除记录 + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + } + _, err = dao.DocumentProductionDrawing.Ctx(ctx).Delete(dao.DocumentProductionDrawing.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除 DocumentProductionDrawing 表中数据失败") + }) + return +} + +type TreeStructureResTwo struct { + gmeta.Meta `orm:"table:document_production_drawing"` + Id int64 `json:"id"` + IdStr string `json:"idStr"` + Pid string `json:"pid"` + Name string `json:"name"` + Type string `json:"type"` + FilenPath string `json:"filenPath"` + TreeStructureResTwo []*TreeStructureResTwo `json:"treeStructureResTwo" orm:"with:pid=id_str"` +} + +func RecursiveQueryEntityFunc(ctx context.Context, entity []*TreeStructureResTwo) (idStrs []int64) { + for i := range entity { + idStrs = append(idStrs, entity[i].Id) + if len(entity[i].TreeStructureResTwo) > 0 { + strs := RecursiveQueryEntityFunc(ctx, entity[i].TreeStructureResTwo) + idStrs = append(idStrs, strs...) + } + } + return +} + +// 修改文件夹 +func updateFolder(ctx context.Context, req *system.DocumentProductionDrawingEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 1、判断修改后的文件夹是否有重复,如果有就提示当前文件夹已存在! + var dif *model.DocumentProductionDrawingInfoRes + dao.DocumentProductionDrawing.Ctx(ctx).WherePri(req.Id).Scan(&dif) + replace := strings.Replace(dif.FilenPath, dif.Name, req.Name, 1) + s2 := coryCommon.FileToFunc(replace, 2) + if _, err = os.Stat(s2); err == nil { + err = errors.New("当前文件夹已存在!") + liberr.ErrIsNil(ctx, err) + return + } else { + count := strings.Count(dif.FilenPath, dif.Name) + hx := coryCommon.SHA256(strings.ReplaceAll(dif.FilenPath, dif.FilenPath, replace)) + // 2、如果不存在,那么就修改文件夹的同时,还得修改路径,以及及其子文件/文件夹下的所有路径 + var entity []*TreeStructureResTwo + err = dao.DocumentProductionDrawing.Ctx(ctx).Unscoped().Where("pid", dif.IdStr).WithAll().Scan(&entity) + strs := RecursiveQueryEntityFunc(ctx, entity) + _, err = dao.DocumentProductionDrawing.Ctx(ctx).Unscoped().Where("id in (?)", strs).Update( + g.Map{ + "filen_path": gdb.Raw("CONCAT(" + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', " + strconv.Itoa(count) + ")," + + "'" + req.Name + "'," + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', -1)" + + ")"), + "update_by": ct.New().GetLoginUser(ctx).Id}) + if err != nil { + err = errors.New("修改失败!") + liberr.ErrIsNil(ctx, err) + return + } + // 3、重新生成并修改文件夹的id_str等信息 + _, err = dao.DocumentProductionDrawing.Ctx(ctx).Where("id", dif.Id).Update(g.Map{ + "id_str": hx, + "name": req.Name, + "filen_path": gdb.Raw("CONCAT(" + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', " + strconv.Itoa(count) + ")," + + "'" + req.Name + "'," + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', -1)" + + ")"), + }) + _, err = dao.DocumentProductionDrawing.Ctx(ctx).Unscoped().Where("pid", dif.IdStr).Update(g.Map{"pid": hx}) + // 4、修改文件夹 + oldPath := filepath.Join(coryCommon.FileToFunc(dif.FilenPath, 2)) + newPath := filepath.Join(filepath.Dir(oldPath), req.Name) + err = os.Rename(oldPath, newPath) + } + liberr.ErrIsNil(ctx, err, "修改失败") + return + }) + return err + }) + return +} + +// 修改文件 +func updateFile(ctx context.Context, req *system.DocumentProductionDrawingEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + var dif *model.DocumentProductionDrawingInfoRes + err = dao.DocumentProductionDrawing.Ctx(ctx).WherePri(req.Id).Scan(&dif) + // 1、判断修改后的名字是否有重复,如果有就提示当前文件名已存在! + replace := strings.Replace(dif.FilenPath, dif.Name, req.Name, 1) + s2 := coryCommon.FileToFunc(replace, 2) + if _, err = os.Stat(s2); err == nil { + err = errors.New("当前文件名已存在!") + liberr.ErrIsNil(ctx, err) + return + } + + // 2、如果不存在,那么就修改文件名的同时,还得修改路径 + _, err = dao.DocumentProductionDrawing.Ctx(ctx).WherePri(req.Id).Update(do.DocumentProductionDrawing{ + Name: req.Name, + FilenPath: replace, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + }) + + // 3、修改具体文件的文件名 + if err == nil { + oldPath := coryCommon.FileToFunc(dif.FilenPath, 2) + newPath := filepath.Join(filepath.Dir(oldPath), req.Name+dif.Suffix) + err = os.Rename(oldPath, newPath) + if err != nil { + err = errors.New("修改失败") + liberr.ErrIsNil(ctx, err) + return + } + } + + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return err + }) + return +} + +func RecursiveDeletion(ctx context.Context, id int64) (ids []int64) { + // 1、获取某个文件的字符串id_str + value, _ := dao.DocumentProductionDrawing.Ctx(ctx).Unscoped().Where("id", id).Fields("id_str").Value() + if value.String() == "" { + return nil + } + // 2、查看当前需要删除的数据下面是否有子数据 + var dlr []*model.DocumentProductionDrawingListRes + dao.DocumentProductionDrawing.Ctx(ctx).Unscoped().Where("pid", value.String()).Fields("id,id_str").Scan(&dlr) + for i := range dlr { + ids = append(ids, dlr[i].Id) + deletion := RecursiveDeletion(ctx, dlr[i].Id) + ids = append(ids, deletion...) + } + return ids +} diff --git a/internal/app/system/logic/documentProject/document_project.go b/internal/app/system/logic/documentProject/document_project.go new file mode 100644 index 0000000..e178156 --- /dev/null +++ b/internal/app/system/logic/documentProject/document_project.go @@ -0,0 +1,167 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-09-16 10:32:03 +// 生成路径: internal/app/system/logic/document_project.go +// 生成人:gfast +// desc:项目模板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterDocumentProject(New()) +} + +func New() *sDocumentProject { + return &sDocumentProject{} +} + +type sDocumentProject struct{} + +//func (s *sDocumentProject) TreeStructureFunc(ctx context.Context, req *system.TreeStructureReq) (res *system.TreeStructureRes, err error) { +// res = new(system.TreeStructureRes) +// var entity []*model.DocumentProjectListRes +// join := dao.DocumentProject.Ctx(ctx) +// if req.IdStr != "" { +// join = join.Where("pid", req.IdStr) +// } else { +// join = join.Where("pid", "0") +// } +// if req.ProjectId != "" { +// join = join.Where(dao.DocumentProject.Columns().ProjectId, req.ProjectId) +// } +// join.Scan(&entity) +// res.List = entity +// return +//} + +//func (s *sDocumentProject) List(ctx context.Context, req *system.DocumentProjectSearchReq) (listRes *system.DocumentProjectSearchRes, err error) { +// listRes = new(system.DocumentProjectSearchRes) +// err = g.Try(ctx, func(ctx context.Context) { +// m := dao.DocumentProject.Ctx(ctx).WithAll() +// if req.ProjectId != "" { +// m = m.Where(dao.DocumentProject.Columns().ProjectId+" = ?", req.ProjectId) +// } +// if req.Name != "" { +// m = m.Where(dao.DocumentProject.Columns().Name+" like ?", "%"+req.Name+"%") +// } +// if req.UpdateBy != "" { +// m = m.Where(dao.DocumentProject.Columns().UpdateBy+" = ?", req.UpdateBy) +// } +// if len(req.DateRange) != 0 { +// m = m.Where(dao.DocumentProject.Columns().CreatedAt+" >=? AND "+dao.DocumentProject.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) +// } +// listRes.Total, err = m.Count() +// liberr.ErrIsNil(ctx, err, "获取总行数失败") +// if req.PageNum == 0 { +// req.PageNum = 1 +// } +// listRes.CurrentPage = req.PageNum +// if req.PageSize == 0 { +// req.PageSize = consts.PageSize +// } +// order := "id desc" +// if req.OrderBy != "" { +// order = req.OrderBy +// } +// var res []*model.DocumentProjectInfoRes +// err = m.Fields(system.DocumentProjectSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) +// liberr.ErrIsNil(ctx, err, "获取数据失败") +// listRes.List = make([]*model.DocumentProjectListRes, len(res)) +// for k, v := range res { +// //filePath := ([]*comModel.UpFile)(nil) +// //err = gjson.DecodeTo(v.FilePath, &filePath) +// //liberr.ErrIsNil(ctx, err) +// //a := "https://www.yj-3d.com:8919" + v.FilePath +// listRes.List[k] = &model.DocumentProjectListRes{ +// Id: v.Id, +// Pid: v.Pid, +// Name: v.Name, +// FilePath: v.FilePath, +// Type: v.Type, +// ProjectId: v.ProjectId, +// CreatedAt: v.CreatedAt, +// } +// } +// }) +// return +//} +// +//func (s *sDocumentProject) GetById(ctx context.Context, id int) (res *model.DocumentProjectInfoRes, err error) { +// res = new(model.DocumentProjectInfoRes) +// err = g.Try(ctx, func(ctx context.Context) { +// err = dao.DocumentProject.Ctx(ctx).WithAll().Where(dao.DocumentProject.Columns().Id, id).Scan(&res) +// //json2 := res.FilePath +// //if json2 != "" { +// // data, _ := coryCommon.PutJson(json2) +// // res.FilePath = data +// //} +// json := res.Json +// if json != "" { +// data, _ := coryCommon.PutJson(json) +// res.Json = data +// } +// //res.FilePath = "/wx" + res.FilePath +// +// liberr.ErrIsNil(ctx, err, "获取信息失败") +// }) +// return +//} +// +//func (s *sDocumentProject) Add(ctx context.Context, req *system.DocumentProjectAddReq) (err error) { +// err = g.Try(ctx, func(ctx context.Context) { +// _, err = dao.DocumentProject.Ctx(ctx).Insert(do.DocumentProject{ +// IdStr: req.IdStr, +// Pid: req.Pid, +// Name: req.Name, +// Type: req.Type, +// Json: req.Json, +// ProjectId: req.ProjectId, +// }) +// liberr.ErrIsNil(ctx, err, "添加失败") +// }) +// return +//} +// +//func (s *sDocumentProject) Edit(ctx context.Context, req *system.DocumentProjectEditReq) (err error) { +// err = g.Try(ctx, func(ctx context.Context) { +// var ey *model.DocumentProjectInfoRes +// dao.DocumentProject.Ctx(ctx).WherePri(req.Id).Scan(&ey) +// var pathName = "" +// if ey != nil { +// dir := filepath.Dir(ey.FilePath) +// dir = strings.ReplaceAll(dir, "/file", coryCommon.GetCWD()+"/resource/public") +// timestamp := time.Now().UnixNano() / int64(time.Millisecond) +// sjc := strconv.FormatInt(timestamp, 10) +// pathName = dir + "/" + strconv.FormatInt(ey.ProjectId, 10) + strconv.FormatInt(ey.Id, 10) + sjc + ".txt" +// flag, err := coryCommon.OutJson([]byte(req.Json), pathName) +// +// if err != nil || flag == false { +// err = errors.New("修改失败") +// return +// } +// } +// _, err = dao.DocumentProject.Ctx(ctx).WherePri(req.Id).Update(do.DocumentProject{ +// Json: pathName, +// }) +// liberr.ErrIsNil(ctx, err, "修改失败") +// }) +// return +//} + +func (s *sDocumentProject) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.DocumentProject.Ctx(ctx).Delete(dao.DocumentProject.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/documentQualityMeeting/document_quality_meeting.go b/internal/app/system/logic/documentQualityMeeting/document_quality_meeting.go new file mode 100644 index 0000000..172b2e9 --- /dev/null +++ b/internal/app/system/logic/documentQualityMeeting/document_quality_meeting.go @@ -0,0 +1,554 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-03-25 16:43:56 +// 生成路径: internal/app/system/logic/document_quality_meeting.go +// 生成人:gfast +// desc:质量会议 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + busDesignAuditLogic "github.com/tiger1103/gfast/v3/internal/app/system/logic/busDesignAudit" + logic "github.com/tiger1103/gfast/v3/internal/app/system/logic/documentCompletion" + "os" + "path/filepath" + "strconv" + "strings" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/gogf/gf/v2/util/gmeta" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterDocumentQualityMeeting(New()) +} + +func New() *sDocumentQualityMeeting { + return &sDocumentQualityMeeting{} +} + +type sDocumentQualityMeeting struct{} + +func (s *sDocumentQualityMeeting) CompletionNewFolderDataFunc(ctx context.Context, req *system.DocumentQualityNewFolderDataReq) (err error) { + dataFolder, err := logic.AddFileOperation(ctx, coryCommon.Completion, req.ProjectId) + err = g.Try(ctx, func(ctx context.Context) { + // 1、组装数据 + resEntity := model.DocumentQualityMeetingListRes{ + Name: req.FileName, + Suffix: "", + Type: "2", + } + path := "" + if req.Pid != "" { + value, _ := dao.DocumentQualityMeeting.Ctx(ctx).Where("id_str", req.Pid).Fields("filen_path").Value() + path = value.String() + "/" + req.FileName + resEntity.Pid = req.Pid + } else { + template := strings.Replace(dataFolder, "/resource/public/", "/file/", 1) + path = template + "/" + req.FileName + resEntity.Pid = "0" + } + // 2、判断是否重名,不重复就新增 + count, _ := dao.DocumentQualityMeeting.Ctx(ctx).Unscoped().Where("filen_path", path).Count() + if count > 0 { + err = errors.New("文件夹已重复!") + liberr.ErrIsNil(ctx, err) + return + } else { + resEntity.IdStr = coryCommon.SHA256(path) + resEntity.FilenPath = path + resEntity.ProjectId = req.ProjectId + resEntity.CreateBy = strconv.FormatInt(int64(ct.New().GetLoginUser(ctx).Id), 10) + _, insertDataErr := dao.DocumentQualityMeeting.Ctx(ctx).Insert(resEntity) + if insertDataErr != nil { + err = errors.New("新增文件夹失败!") + liberr.ErrIsNil(ctx, err) + return + } + err = coryCommon.CreateDirectory(strings.Replace(path, "/file/", coryCommon.GetCWD()+"/resource/public/", 1)) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + } + liberr.ErrIsNil(ctx, err, "新增文件夹失败!") + }) + return +} + +func (s *sDocumentQualityMeeting) TreeStructureFunc(ctx context.Context, req *system.DocumentQualityTreeStructureReq) (res *system.DocumentQualityTreeStructureRes, err error) { + res = new(system.DocumentQualityTreeStructureRes) + err = g.Try(ctx, func(ctx context.Context) { + var completion []*model.DocumentQualityMeetingListRes + // 1、获取到当前项目下的所有顶级文件及目录 + sql := dao.DocumentQualityMeeting.Ctx(ctx). + Where("project_id", req.ProjectId) + if req.Pid != "" { + sql = sql.Where("pid", req.Pid) + } + sql = sql.WhereNull("deleted_at") + err := sql.Order("type desc").Scan(&completion) + for i := range completion { + completion[i].FilenPathCoding = coryCommon.URLCoding(completion[i].FilenPath) + } + res.List = completion + liberr.ErrIsNil(ctx, err, "获取数据失败") + }) + return +} + +func (s *sDocumentQualityMeeting) SelectByPidFunc(ctx context.Context, req *system.DocumentQualitySelectByPidReq) (res *system.DocumentQualitySelectByPidRes, err error) { + res = new(system.DocumentQualitySelectByPidRes) + // 1、组装路径 + dataFolder := ct.New().GetLoginUser(ctx).UserName + dataFolder = coryCommon.Completion + "/" + dataFolder + req.PathName + // 2、获取pid + err = g.Try(ctx, func(ctx context.Context) { + value, err := dao.DocumentQualityMeeting.Ctx(ctx). + Where("project_id", req.ProjectId). + Where("filen_path", req.PathName). + Fields("pid"). + Value() + liberr.ErrIsNil(ctx, err, "获取数据失败") + res.Pid = value.String() + }) + return +} + +func (s *sDocumentQualityMeeting) CompletionDataRecyclingStationFunc(ctx context.Context, req *system.DocumentQualityDataRecyclingStationReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + if req.Type == "1" { + _, err = dao.DocumentQualityMeeting.Ctx(ctx).Unscoped().Where(dao.DocumentQualityMeeting.Columns().Id+" in (?)", req.Ids).Update(g.Map{"deleted_at": nil}) + } else { + var pathArr []string + // 删除还需要删除下面的所有子数据 + var idArr []int64 + for i := range req.Ids { + idList := RecursiveDeletion(ctx, req.Ids[i]) + if idList != nil { + idArr = append(idArr, idList...) + } + data, _ := dao.DocumentQualityMeeting.Ctx(ctx).Unscoped().Where("id", req.Ids[i]).Fields("filen_path").Value() + pathArr = append(pathArr, data.String()) + } + idArr = append(idArr, req.Ids...) + _, err = dao.DocumentQualityMeeting.Ctx(ctx).Unscoped().Delete(dao.DocumentQualityMeeting.Columns().Id+" in (?)", idArr) + // 如果删除成功,那么删除文件/文件夹 + for _, data := range pathArr { + os.RemoveAll(coryCommon.FileToFunc(data, 2)) + } + } + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +func (s *sDocumentQualityMeeting) RecycleBinListFunc(ctx context.Context, req *system.DocumentQualityRecycleBinListReq) (res *system.DocumentQualityRecycleBinListRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + res = new(system.DocumentQualityRecycleBinListRes) + var dataList []*model.DocumentQualityMeetingInfoRes + m := dao.DocumentQualityMeeting.Ctx(ctx) + if req.Type == "2" { + m = m.Unscoped().WhereNotNull("deleted_at") + } else if req.Type == "3" { + m = m.Unscoped() + } + err = m.Where(dao.DocumentQualityMeeting.Columns().ProjectId, req.ProjectId).Scan(&dataList) + res.List = dataList + liberr.ErrIsNil(ctx, err, "获取数据失败!") + }) + return +} + +func (s *sDocumentQualityMeeting) List(ctx context.Context, req *system.DocumentQualityMeetingSearchReq) (listRes *system.DocumentQualityMeetingSearchRes, err error) { + listRes = new(system.DocumentQualityMeetingSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.DocumentQualityMeeting.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.DocumentQualityMeeting.Columns().Id+" = ?", req.Id) + } + if req.IdStr != "" { + m = m.Where(dao.DocumentQualityMeeting.Columns().IdStr+" = ?", req.IdStr) + } + if req.Pid != "" { + m = m.Where(dao.DocumentQualityMeeting.Columns().Pid+" = ?", req.Pid) + } + if req.Name != "" { + m = m.Where(dao.DocumentQualityMeeting.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.FilenPath != "" { + m = m.Where(dao.DocumentQualityMeeting.Columns().FilenPath+" = ?", req.FilenPath) + } + if req.Type != "" { + m = m.Where(dao.DocumentQualityMeeting.Columns().Type+" = ?", req.Type) + } + if req.Suffix != "" { + m = m.Where(dao.DocumentQualityMeeting.Columns().Suffix+" = ?", req.Suffix) + } + if req.CreateBy != "" { + m = m.Where(dao.DocumentQualityMeeting.Columns().CreateBy+" = ?", req.CreateBy) + } + if req.UpdateBy != "" { + m = m.Where(dao.DocumentQualityMeeting.Columns().UpdateBy+" = ?", req.UpdateBy) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.DocumentQualityMeeting.Columns().CreatedAt+" >=? AND "+dao.DocumentQualityMeeting.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.ProjectId != "" { + m = m.Where(dao.DocumentQualityMeeting.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.DocumentQualityMeetingInfoRes + err = m.Fields(system.DocumentQualityMeetingSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.DocumentQualityMeetingListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.DocumentQualityMeetingListRes{ + Id: v.Id, + IdStr: v.IdStr, + Pid: v.Pid, + Name: v.Name, + FilenPath: v.FilenPath, + Type: v.Type, + Suffix: v.Suffix, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + ProjectId: v.ProjectId, + } + } + }) + return +} + +func (s *sDocumentQualityMeeting) GetById(ctx context.Context, id int64) (res []*model.SelectTabNameAndTabIdByDateRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、获取当前数据的pid + value, err := dao.DocumentQualityMeeting.Ctx(ctx).Where(dao.DocumentQualityMeeting.Columns().Id, id).Fields("pid").Value() + liberr.ErrIsNil(ctx, err) + var pid = value.String() + //2、组装数据 + req := model.SelectTabNameAndTabIdByDateReq{ + TableName: dao.DocumentQualityMeeting.Table(), + TableId: id, + } + if pid != "" { + //获取最终父节点id + byId, err := logic.SelectRecursionById(ctx, req.TableName, pid) + liberr.ErrIsNil(ctx, err) + req.FatherId = byId + } + //3、得到最终文件/文件夹的操作记录 + res, err = busDesignAuditLogic.SelectTabNameAndTabIdByDateFunc(ctx, &req) + for i := range res { + res[i].CreatedBy = coryCommon.SelectByString(ctx, coryCommon.IsNumeric(res[i].CreatedBy), res[i].CreatedBy) + } + liberr.ErrIsNil(ctx, err) + }) + return +} + +func (s *sDocumentQualityMeeting) Add(ctx context.Context, req *system.DocumentQualityMeetingAddReq) (err error) { + if req.FilePath == nil { + errors.New("未识别到文件上传!") + return + } + // 大文件上传 + req.FilePath.Url = strings.ReplaceAll(req.FilePath.Url, "/resource/public/", "/file/") + req.FilePath.Name = strings.Replace(req.FilePath.Name, " ", "", -1) + dataFolder, err := logic.AddFileOperation(ctx, coryCommon.QualityMeeting, req.ProjectId) + if err != nil { + return err + } + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + designEntity := &system.BusDesignAuditAddReq{ + ProjectId: req.ProjectId, + TableName: dao.DocumentQualityMeeting.Table(), + } + ct := ct.New().GetLoginUser(ctx).Id + formatInt := strconv.FormatInt(int64(ct), 10) + if req.FileType == "1" { // 1、压缩文件夹导入 + filenPath := "" + if req.Pid != "" { + value, _ := dao.DocumentQualityMeeting.Ctx(ctx).Where("id_str", req.Pid).Fields("filen_path").Value() + filenPath = value.String() + } + newPath := strings.ReplaceAll(req.FilePath.Url, "/file", coryCommon.GetCWD()+"/resource/public") + if filenPath == "" { + filenPath = coryCommon.ResourcePublicToFunc(dataFolder, 0) + } + path, err := coryCommon.FileZipFunc(newPath, filenPath, dataFolder) // 解压相对路径,并删除压缩文件,返回解压后的相对路径 + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + one, err := coryCommon.Traversal(ctx, path, req.Pid, dao.DocumentQualityMeeting.Table(), dataFolder, req.ProjectId, "2") // 遍历解压后的文件,插入数据 + // err = Traversal(ctx, "resource/public/masterMask/资料模板") + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + insertData, err := g.DB().Model(dao.DocumentQualityMeeting.Table()).Ctx(ctx).Insert(one) + id, err := insertData.LastInsertId() + liberr.ErrIsNil(ctx, err, "新增失败!") + designEntity.TableId = id + } else if req.FileType == "2" { // 2、文件导入 + wornPath := filepath.ToSlash(strings.ReplaceAll(req.FilePath.Url, "/file/", coryCommon.GetCWD()+"/resource/public/")) + ve := "" + // 不等于空,那么证明文件应该在根目录下面,否则是在某个文件夹下面 + if req.Pid != "" { + value, _ := dao.DocumentQualityMeeting.Ctx(ctx).Where("id_str", req.Pid).Fields("filen_path").Value() + ve = value.String() + } else { + ve = strings.Replace(dataFolder+"/", "/resource/public/", "/file/", 1) + } + newPath := strings.Replace(ve, "/file/", coryCommon.GetCWD()+"/resource/public/", 1) + // 2、文件存在就随机给一个文件名(当前文件名+随机文件名) + _, err = os.Stat(newPath + "/" + req.FilePath.Name) + if err == nil { + split := strings.Split(req.FilePath.Name, ".") + name := split[0] + "" + coryCommon.FileName("completion") + "." + strings.Split(req.FilePath.Name, ".")[1] + newPath = newPath + "/" + name + req.FilePath.Name = name + } else { + newPath = newPath + "/" + req.FilePath.Name + } + // 3、文件移动 + // newPath = filepath.ToSlash(newPath) + newPath = strings.ReplaceAll(filepath.ToSlash(newPath), "//", "/") + err = os.Rename(wornPath, newPath) + + // 4、数据库记录文件 + res := model.DocumentQualityMeetingListRes{ + Name: strings.Split(req.FilePath.Name, ".")[0], + Suffix: req.FilePath.FileType, + FilenPath: filepath.ToSlash(strings.Replace(newPath, coryCommon.GetCWD()+"/resource/public/", "/file/", 1)), + Type: "1", + ProjectId: req.ProjectId, + CreateBy: formatInt, + } + if req.Pid == "" { + res.Pid = "0" + } else { + res.Pid = req.Pid + } + insertData, err := dao.DocumentQualityMeeting.Ctx(ctx).Insert(res) + id, err := insertData.LastInsertId() + liberr.ErrIsNil(ctx, err, "新增失败!") + designEntity.TableId = id + } + //只要是新增的数据全都要进入到审核表中,提供给项目经理进行审核 + err = service.BusDesignAudit().Add(ctx, designEntity) + liberr.ErrIsNil(ctx, err, "新增失败!") + }) + return err + }) + return +} + +func (s *sDocumentQualityMeeting) Edit(ctx context.Context, req *system.DocumentQualityMeetingEditReq) (err error) { + if req.Type == "1" { + err = updateFile(ctx, req) + } else if req.Type == "2" { + err = updateFolder(ctx, req) + } + liberr.ErrIsNil(ctx, err) + return +} + +func (s *sDocumentQualityMeeting) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 1、先判断删除的是文件还是文件夹,然后进行修改需要删除的文件或文件夹名称 + var dataList []*model.DocumentQualityMeetingInfoRes + err = dao.DocumentQualityMeeting.Ctx(ctx).Where(dao.DocumentQualityMeeting.Columns().Id+" in (?)", ids).Scan(&dataList) + liberr.ErrIsNil(ctx, err, "删除失败") + if len(dataList) > 0 { + for i := range dataList { + t := dataList[i].Type + upEntity := system.DocumentQualityMeetingEditReq{ + Id: dataList[i].Id, + Name: dataList[i].Name + coryCommon.FileName("delete"), + Type: t, + } + if t == "1" { + err = updateFile(ctx, &upEntity) + } else { + err = updateFolder(ctx, &upEntity) + } + liberr.ErrIsNil(ctx, err, "删除失败") + //需要记录删除数据的信息 + err = busDesignAuditLogic.AddApprovedMemo(ctx, dataList[i].Id, dataList[i].ProjectId, dao.DocumentQualityMeeting.Table(), "3") //删除记录 + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + } + // 1、删除文件夹 + _, err = dao.DocumentQualityMeeting.Ctx(ctx).Delete(dao.DocumentQualityMeeting.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + } + }) + return +} + +type TreeStructureResTwo struct { + gmeta.Meta `orm:"table:document_quality_meeting"` + Id int64 `json:"id"` + IdStr string `json:"idStr"` + Pid string `json:"pid"` + Name string `json:"name"` + Type string `json:"type"` + FilenPath string `json:"filenPath"` + TreeStructureResTwo []*TreeStructureResTwo `json:"treeStructureResTwo" orm:"with:pid=id_str"` +} + +func RecursiveQueryEntityFunc(ctx context.Context, entity []*TreeStructureResTwo) (idStrs []int64) { + for i := range entity { + idStrs = append(idStrs, entity[i].Id) + if len(entity[i].TreeStructureResTwo) > 0 { + strs := RecursiveQueryEntityFunc(ctx, entity[i].TreeStructureResTwo) + idStrs = append(idStrs, strs...) + } + } + return +} + +// 修改文件夹 +func updateFolder(ctx context.Context, req *system.DocumentQualityMeetingEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 1、判断修改后的文件夹是否有重复,如果有就提示当前文件夹已存在! + var dif *model.DocumentQualityMeetingInfoRes + dao.DocumentQualityMeeting.Ctx(ctx).WherePri(req.Id).Scan(&dif) + replace := strings.Replace(dif.FilenPath, dif.Name, req.Name, 1) + s2 := coryCommon.FileToFunc(replace, 2) + if _, err = os.Stat(s2); err == nil { + err = errors.New("当前文件夹已存在!") + liberr.ErrIsNil(ctx, err) + return + } else { + count := strings.Count(dif.FilenPath, dif.Name) + hx := coryCommon.SHA256(strings.ReplaceAll(dif.FilenPath, dif.FilenPath, replace)) + // 2、如果不存在,那么就修改文件夹的同时,还得修改路径,以及及其子文件/文件夹下的所有路径 + var entity []*TreeStructureResTwo + err = dao.DocumentQualityMeeting.Ctx(ctx).Unscoped().Where("pid", dif.IdStr).WithAll().Scan(&entity) + strs := RecursiveQueryEntityFunc(ctx, entity) + _, err = dao.DocumentQualityMeeting.Ctx(ctx).Unscoped().Where("id in (?)", strs).Update( + g.Map{ + "filen_path": gdb.Raw("CONCAT(" + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', " + strconv.Itoa(count) + ")," + + "'" + req.Name + "'," + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', -1)" + + ")"), + "update_by": ct.New().GetLoginUser(ctx).Id}) + if err != nil { + err = errors.New("修改失败!") + liberr.ErrIsNil(ctx, err) + return + } + // 3、重新生成并修改文件夹的id_str等信息 + _, err = dao.DocumentQualityMeeting.Ctx(ctx).Where("id", dif.Id).Update(g.Map{ + "id_str": hx, + "name": req.Name, + "filen_path": gdb.Raw("CONCAT(" + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', " + strconv.Itoa(count) + ")," + + "'" + req.Name + "'," + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', -1)" + + ")"), + }) + _, err = dao.DocumentQualityMeeting.Ctx(ctx).Unscoped().Where("pid", dif.IdStr).Update(g.Map{"pid": hx}) + // 4、修改文件夹 + oldPath := filepath.Join(coryCommon.FileToFunc(dif.FilenPath, 2)) + newPath := filepath.Join(filepath.Dir(oldPath), req.Name) + err = os.Rename(oldPath, newPath) + } + liberr.ErrIsNil(ctx, err, "修改失败") + return + }) + return err + }) + return +} + +// 修改文件 +func updateFile(ctx context.Context, req *system.DocumentQualityMeetingEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + var dif *model.DocumentQualityMeetingInfoRes + err = dao.DocumentQualityMeeting.Ctx(ctx).WherePri(req.Id).Scan(&dif) + // 1、判断修改后的名字是否有重复,如果有就提示当前文件名已存在! + replace := strings.Replace(dif.FilenPath, dif.Name, req.Name, 1) + s2 := coryCommon.FileToFunc(replace, 2) + if _, err = os.Stat(s2); err == nil { + err = errors.New("当前文件名已存在!") + liberr.ErrIsNil(ctx, err) + return + } + // 2、如果不存在,那么就修改文件名的同时,还得修改路径 + _, err = dao.DocumentQualityMeeting.Ctx(ctx).WherePri(req.Id).Update(do.DocumentQualityMeeting{ + Name: req.Name, + FilenPath: replace, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + }) + // 3、修改具体文件的文件名 + if err == nil { + oldPath := coryCommon.FileToFunc(dif.FilenPath, 2) + newPath := filepath.Join(filepath.Dir(oldPath), req.Name+dif.Suffix) + err = os.Rename(oldPath, newPath) + if err != nil { + err = errors.New("修改失败") + liberr.ErrIsNil(ctx, err) + return + } + } + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return err + }) + return +} + +func RecursiveDeletion(ctx context.Context, id int64) (ids []int64) { + // 1、获取某个文件的字符串id_str + value, _ := dao.DocumentQualityMeeting.Ctx(ctx).Unscoped().Where("id", id).Fields("id_str").Value() + if value.String() == "" { + return nil + } + // 2、查看当前需要删除的数据下面是否有子数据 + var dlr []*model.DocumentQualityMeetingListRes + dao.DocumentQualityMeeting.Ctx(ctx).Unscoped().Where("pid", value.String()).Fields("id,id_str").Scan(&dlr) + for i := range dlr { + ids = append(ids, dlr[i].Id) + deletion := RecursiveDeletion(ctx, dlr[i].Id) + ids = append(ids, deletion...) + } + return ids +} diff --git a/internal/app/system/logic/documentReport/document_report.go b/internal/app/system/logic/documentReport/document_report.go new file mode 100644 index 0000000..11da049 --- /dev/null +++ b/internal/app/system/logic/documentReport/document_report.go @@ -0,0 +1,526 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-03-15 10:24:21 +// 生成路径: internal/app/system/logic/document_report.go +// 生成人:gfast +// desc:科研及专题报告 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "fmt" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/gogf/gf/v2/util/gmeta" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + logic "github.com/tiger1103/gfast/v3/internal/app/system/logic/documentCompletion" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "os" + "path/filepath" + "strconv" + "strings" +) + +func init() { + service.RegisterDocumentReport(New()) +} + +func New() *sDocumentReport { + return &sDocumentReport{} +} + +type sDocumentReport struct{} + +func (s *sDocumentReport) CompletionDataRecyclingStationFunc(ctx context.Context, req *system.ReportDataRecyclingStationReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + if req.Type == "1" { + _, err = dao.DocumentReport.Ctx(ctx).Unscoped().Where(dao.DocumentReport.Columns().Id+" in (?)", req.Ids).Update(g.Map{"deleted_at": nil}) + } else { + var pathArr []string + //删除还需要删除下面的所有子数据 + var idArr []int64 + for i := range req.Ids { + idList := RecursiveDeletion(ctx, req.Ids[i]) + if idList != nil { + idArr = append(idArr, idList...) + } + data, _ := dao.DocumentReport.Ctx(ctx).Unscoped().Where("id", req.Ids[i]).Fields("filen_path").Value() + pathArr = append(pathArr, data.String()) + } + idArr = append(idArr, req.Ids...) + _, err = dao.DocumentReport.Ctx(ctx).Unscoped().Delete(dao.DocumentReport.Columns().Id+" in (?)", idArr) + //如果删除成功,那么删除文件/文件夹 + for _, data := range pathArr { + os.RemoveAll(coryCommon.FileToFunc(data, 2)) + } + } + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +func (s *sDocumentReport) RecycleBinListFunc(ctx context.Context, req *system.ReportRecycleBinListReq) (res *system.ReportRecycleBinListRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + res = new(system.ReportRecycleBinListRes) + var dataList []*model.DocumentReportInfoRes + m := dao.DocumentReport.Ctx(ctx) + if req.Type == "2" { + m = m.Unscoped().WhereNotNull("deleted_at") + } else if req.Type == "3" { + m = m.Unscoped() + } + err = m.Where(dao.DocumentReport.Columns().ProjectId, req.ProjectId).Scan(&dataList) + res.List = dataList + liberr.ErrIsNil(ctx, err, "获取数据失败!") + }) + return +} + +func (s *sDocumentReport) SelectByPidFunc(ctx context.Context, req *system.ReportSelectByPidReq) (res *system.ReportSelectByPidRes, err error) { + res = new(system.ReportSelectByPidRes) + //1、组装路径 + dataFolder := ct.New().GetLoginUser(ctx).UserName + dataFolder = coryCommon.Completion + "/" + dataFolder + req.PathName + //2、获取pid + err = g.Try(ctx, func(ctx context.Context) { + value, err := dao.DocumentReport.Ctx(ctx). + Where("project_id", req.ProjectId). + Where("filen_path", req.PathName). + Fields("pid"). + Value() + liberr.ErrIsNil(ctx, err, "获取数据失败") + res.Pid = value.String() + }) + return +} + +func (s *sDocumentReport) TreeStructureFunc(ctx context.Context, req *system.ReportTreeStructureReq) (res *system.ReportTreeStructureRes, err error) { + res = new(system.ReportTreeStructureRes) + err = g.Try(ctx, func(ctx context.Context) { + var completion []*model.DocumentReportListRes + //1、获取到当前项目下的所有顶级文件及目录 + sql := dao.DocumentReport.Ctx(ctx). + Where("project_id", req.ProjectId).Where("state in ('3','4')") + if req.Pid != "" { + sql = sql.Where("pid", req.Pid) + } + sql = sql.WhereNull("deleted_at") + err := sql.Order("type desc").Scan(&completion) + for i := range completion { + completion[i].FilenPathCoding = coryCommon.URLCoding(completion[i].FilenPath) + } + res.List = completion + liberr.ErrIsNil(ctx, err, "获取数据失败") + }) + return +} + +func (s *sDocumentReport) CompletionNewFolderDataFunc(ctx context.Context, req *system.ReportNewFolderDataReq) (err error) { + dataFolder, err := logic.AddFileOperation(ctx, coryCommon.Completion, req.ProjectId) + err = g.Try(ctx, func(ctx context.Context) { + //1、组装数据 + resEntity := model.DocumentReportListRes{ + Name: req.FileName, + Suffix: "", + Type: "2", + } + path := "" + if req.Pid != "" { + value, _ := dao.DocumentReport.Ctx(ctx).Where("id_str", req.Pid).Fields("filen_path").Value() + path = value.String() + "/" + req.FileName + resEntity.Pid = req.Pid + } else { + template := strings.Replace(dataFolder, "/resource/public/", "/file/", 1) + path = template + "/" + req.FileName + resEntity.Pid = "0" + } + //2、判断是否重名,不重复就新增 + count, _ := dao.DocumentReport.Ctx(ctx).Unscoped().Where("filen_path", path).Count() + if count > 0 { + err = errors.New("文件夹已重复!") + liberr.ErrIsNil(ctx, err) + return + } else { + resEntity.IdStr = coryCommon.SHA256(path) + resEntity.FilenPath = path + resEntity.State = "4" + resEntity.ProjectId = req.ProjectId + _, insertDataErr := dao.DocumentReport.Ctx(ctx).Insert(resEntity) + if insertDataErr != nil { + err = errors.New("新增文件夹失败!") + liberr.ErrIsNil(ctx, err) + return + } + err = coryCommon.CreateDirectory(strings.Replace(path, "/file/", coryCommon.GetCWD()+"/resource/public/", 1)) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + } + liberr.ErrIsNil(ctx, err, "新增文件夹失败!") + }) + return +} + +func (s *sDocumentReport) List(ctx context.Context, req *system.DocumentReportSearchReq) (listRes *system.DocumentReportSearchRes, err error) { + listRes = new(system.DocumentReportSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.DocumentReport.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.DocumentReport.Columns().Id+" = ?", req.Id) + } + if req.IdStr != "" { + m = m.Where(dao.DocumentReport.Columns().IdStr+" = ?", req.IdStr) + } + if req.Pid != "" { + m = m.Where(dao.DocumentReport.Columns().Pid+" = ?", req.Pid) + } + if req.Name != "" { + m = m.Where(dao.DocumentReport.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.FilenPath != "" { + m = m.Where(dao.DocumentReport.Columns().FilenPath+" = ?", req.FilenPath) + } + if req.Type != "" { + m = m.Where(dao.DocumentReport.Columns().Type+" = ?", req.Type) + } + if req.Suffix != "" { + m = m.Where(dao.DocumentReport.Columns().Suffix+" = ?", req.Suffix) + } + if req.CreateBy != "" { + m = m.Where(dao.DocumentReport.Columns().CreateBy+" = ?", req.CreateBy) + } + if req.UpdateBy != "" { + m = m.Where(dao.DocumentReport.Columns().UpdateBy+" = ?", req.UpdateBy) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.DocumentReport.Columns().CreatedAt+" >=? AND "+dao.DocumentReport.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.ProjectId != "" { + m = m.Where(dao.DocumentReport.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.DocumentReportInfoRes + err = m.Fields(system.DocumentReportSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.DocumentReportListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.DocumentReportListRes{ + Id: v.Id, + IdStr: v.IdStr, + Pid: v.Pid, + Name: v.Name, + FilenPath: v.FilenPath, + Type: v.Type, + Suffix: v.Suffix, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + ProjectId: v.ProjectId, + } + } + }) + return +} + +func (s *sDocumentReport) GetById(ctx context.Context, id int64) (res *model.DocumentReportInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.DocumentReport.Ctx(ctx).WithAll().Where(dao.DocumentReport.Columns().Id, id).Scan(&res) + res.FilenPathCoding = coryCommon.URLCoding(res.FilenPath) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sDocumentReport) Add(ctx context.Context, req *system.DocumentReportAddReq) (err error) { + if req.FilePath == nil { + errors.New("未识别到文件上传!") + return + } + //大文件上传 + req.FilePath.Url = strings.ReplaceAll(req.FilePath.Url, "/resource/public/", "/file/") + req.FilePath.Name = strings.Replace(req.FilePath.Name, " ", "", -1) + dataFolder, err := logic.AddFileOperation(ctx, coryCommon.Report, req.ProjectId) + if err != nil { + return err + } + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + designEntity := &system.BusDesignAuditAddReq{ + ProjectId: req.ProjectId, + TableName: dao.DocumentReport.Table(), + } + ct := ct.New().GetLoginUser(ctx).Id + formatInt := strconv.FormatInt(int64(ct), 10) + if req.FileType == "1" { //1、压缩文件夹导入 + filenPath := "" + if req.Pid != "" { + value, _ := dao.DocumentReport.Ctx(ctx).Where("id_str", req.Pid).Fields("filen_path").Value() + filenPath = value.String() + } + newPath := strings.ReplaceAll(req.FilePath.Url, "/file", coryCommon.GetCWD()+"/resource/public") + if filenPath == "" { + filenPath = coryCommon.ResourcePublicToFunc(dataFolder, 0) + } + path, err := coryCommon.FileZipFunc(newPath, filenPath, dataFolder) //解压相对路径,并删除压缩文件,返回解压后的相对路径 + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + one, err := coryCommon.Traversal(ctx, path, req.Pid, dao.DocumentReport.Table(), dataFolder, req.ProjectId, "2") //遍历解压后的文件,插入数据 + liberr.ErrIsNil(ctx, err) + for i := range one { + one[i].CreateBy = formatInt + } + insertData, err := g.DB().Model(dao.DocumentReport.Table()).Ctx(ctx).Insert(one) + id, err := insertData.LastInsertId() + liberr.ErrIsNil(ctx, err, "新增失败!") + designEntity.TableId = id + } else if req.FileType == "2" { //2、文件导入 + wornPath := filepath.ToSlash(strings.ReplaceAll(req.FilePath.Url, "/file/", coryCommon.GetCWD()+"/resource/public/")) + ve := "" + //不等于空,那么证明文件应该在根目录下面,否则是在某个文件夹下面 + if req.Pid != "" { + value, _ := dao.DocumentReport.Ctx(ctx).Where("id_str", req.Pid).Fields("filen_path").Value() + ve = value.String() + } else { + ve = strings.Replace(dataFolder+"/", "/resource/public/", "/file/", 1) + } + newPath := strings.Replace(ve, "/file/", coryCommon.GetCWD()+"/resource/public/", 1) + //2、文件存在就随机给一个文件名(当前文件名+随机文件名) + fmt.Println("0000? ", newPath) + _, err = os.Stat(newPath + "/" + req.FilePath.Name) + if err == nil { + split := strings.Split(req.FilePath.Name, ".") + name := strings.Join(split[0:len(split)-1], ",") + "" + coryCommon.FileName("completion") + "." + strings.Split(req.FilePath.Name, ".")[1] + newPath = newPath + "/" + name + req.FilePath.Name = name + } else { + newPath = newPath + "/" + req.FilePath.Name + } + //3、文件移动 + //newPath = filepath.ToSlash(newPath) + newPath = strings.ReplaceAll(filepath.ToSlash(newPath), "//", "/") + err = os.Rename(wornPath, newPath) + + //4、数据库记录文件 + sp := strings.Split(req.FilePath.Name, ".") + res := model.DocumentReportListRes{ + Name: strings.Join(sp[0:len(sp)-1], ","), + Suffix: req.FilePath.FileType, + FilenPath: filepath.ToSlash(strings.Replace(newPath, coryCommon.GetCWD()+"/resource/public/", "/file/", 1)), + Type: "1", + ProjectId: req.ProjectId, + } + if req.Pid == "" { + res.Pid = "0" + } else { + res.Pid = req.Pid + } + insertData, err := dao.DocumentReport.Ctx(ctx).Insert(res) + id, err := insertData.LastInsertId() + liberr.ErrIsNil(ctx, err, "新增失败!") + designEntity.TableId = id + } + //只要是新增的数据全都要进入到审核表中,提供给项目经理进行审核 + err = service.BusDesignAudit().Add(ctx, designEntity) + liberr.ErrIsNil(ctx, err, "数据进入审核流程失败") + }) + return err + }) + return +} + +func (s *sDocumentReport) Edit(ctx context.Context, req *system.DocumentReportEditReq) (err error) { + if req.Type == "1" { + err = updateFile(ctx, req) + } else if req.Type == "2" { + err = updateFolder(ctx, req) + } + liberr.ErrIsNil(ctx, err) + return +} + +func (s *sDocumentReport) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、先判断删除的是文件还是文件夹,然后进行修改需要删除的文件或文件夹名称 + var dataList []*model.DocumentReportInfoRes + err = dao.DocumentReport.Ctx(ctx).Where(dao.DocumentReport.Columns().Id+" in (?)", ids).Scan(&dataList) + liberr.ErrIsNil(ctx, err, "删除失败") + if len(dataList) > 0 { + for i := range dataList { + t := dataList[i].Type + upEntity := system.DocumentReportEditReq{ + Id: dataList[i].Id, + Name: dataList[i].Name + coryCommon.FileName("delete"), + Type: t, + } + if t == "1" { + err = updateFile(ctx, &upEntity) + liberr.ErrIsNil(ctx, err, "删除失败") + } else { + err = updateFolder(ctx, &upEntity) + liberr.ErrIsNil(ctx, err, "删除失败") + } + } + //1、删除文件夹 + _, err = dao.DocumentReport.Ctx(ctx).Delete(dao.DocumentReport.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + } + }) + return +} + +type TreeStructureResTwo struct { + gmeta.Meta `orm:"table:document_report"` + Id int64 `json:"id"` + IdStr string `json:"idStr"` + Pid string `json:"pid"` + Name string `json:"name"` + Type string `json:"type"` + FilenPath string `json:"filenPath"` + TreeStructureResTwo []*TreeStructureResTwo `json:"treeStructureResTwo" orm:"with:pid=id_str"` +} + +func RecursiveQueryEntityFunc(ctx context.Context, entity []*TreeStructureResTwo) (idStrs []int64) { + for i := range entity { + idStrs = append(idStrs, entity[i].Id) + if len(entity[i].TreeStructureResTwo) > 0 { + strs := RecursiveQueryEntityFunc(ctx, entity[i].TreeStructureResTwo) + idStrs = append(idStrs, strs...) + } + } + return +} + +// 修改文件夹 +func updateFolder(ctx context.Context, req *system.DocumentReportEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //1、判断修改后的文件夹是否有重复,如果有就提示当前文件夹已存在! + var dif *model.DocumentReportInfoRes + dao.DocumentReport.Ctx(ctx).WherePri(req.Id).Scan(&dif) + replace := strings.Replace(dif.FilenPath, dif.Name, req.Name, 1) + s2 := coryCommon.FileToFunc(replace, 2) + if _, err = os.Stat(s2); err == nil { + err = errors.New("当前文件夹已存在!") + liberr.ErrIsNil(ctx, err) + return + } else { + count := strings.Count(dif.FilenPath, dif.Name) + hx := coryCommon.SHA256(strings.ReplaceAll(dif.FilenPath, dif.FilenPath, replace)) + //2、如果不存在,那么就修改文件夹的同时,还得修改路径,以及及其子文件/文件夹下的所有路径 + var entity []*TreeStructureResTwo + err = dao.DocumentReport.Ctx(ctx).Unscoped().Where("pid", dif.IdStr).WithAll().Scan(&entity) + strs := RecursiveQueryEntityFunc(ctx, entity) + _, err = dao.DocumentReport.Ctx(ctx).Unscoped().Where("id in (?)", strs).Update(g.Map{"filen_path": gdb.Raw("CONCAT(" + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', " + strconv.Itoa(count) + ")," + + "'" + req.Name + "'," + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', -1)" + + ")")}) + if err != nil { + err = errors.New("修改失败!") + liberr.ErrIsNil(ctx, err) + return + } + //3、重新生成并修改文件夹的id_str等信息 + _, err = dao.DocumentReport.Ctx(ctx).Where("id", dif.Id).Update(g.Map{ + "id_str": hx, + "name": req.Name, + "filen_path": gdb.Raw("CONCAT(" + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', " + strconv.Itoa(count) + ")," + + "'" + req.Name + "'," + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', -1)" + + ")"), + }) + _, err = dao.DocumentReport.Ctx(ctx).Unscoped().Where("pid", dif.IdStr).Update(g.Map{"pid": hx}) + //4、修改文件夹 + oldPath := filepath.Join(coryCommon.FileToFunc(dif.FilenPath, 2)) + newPath := filepath.Join(filepath.Dir(oldPath), req.Name) + err = os.Rename(oldPath, newPath) + } + liberr.ErrIsNil(ctx, err, "修改失败") + return + }) + return err + }) + return +} + +// 修改文件 +func updateFile(ctx context.Context, req *system.DocumentReportEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + var dif *model.DocumentReportInfoRes + err = dao.DocumentReport.Ctx(ctx).WherePri(req.Id).Scan(&dif) + //1、判断修改后的名字是否有重复,如果有就提示当前文件名已存在! + replace := strings.Replace(dif.FilenPath, dif.Name, req.Name, 1) + s2 := coryCommon.FileToFunc(replace, 2) + if _, err = os.Stat(s2); err == nil { + err = errors.New("当前文件名已存在!") + liberr.ErrIsNil(ctx, err) + return + } + //2、如果不存在,那么就修改文件名的同时,还得修改路径 + _, err = dao.DocumentReport.Ctx(ctx).WherePri(req.Id).Update(do.DocumentReport{ + Name: req.Name, + FilenPath: replace, + }) + //3、修改具体文件的文件名 + if err == nil { + oldPath := coryCommon.FileToFunc(dif.FilenPath, 2) + newPath := filepath.Join(filepath.Dir(oldPath), req.Name+dif.Suffix) + err = os.Rename(oldPath, newPath) + if err != nil { + err = errors.New("修改失败") + liberr.ErrIsNil(ctx, err) + return + } + } + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return err + }) + return +} + +func RecursiveDeletion(ctx context.Context, id int64) (ids []int64) { + //1、获取某个文件的字符串id_str + value, _ := dao.DocumentReport.Ctx(ctx).Unscoped().Where("id", id).Fields("id_str").Value() + if value.String() == "" { + return nil + } + //2、查看当前需要删除的数据下面是否有子数据 + var dlr []*model.DocumentReportListRes + dao.DocumentReport.Ctx(ctx).Unscoped().Where("pid", value.String()).Fields("id,id_str").Scan(&dlr) + for i := range dlr { + ids = append(ids, dlr[i].Id) + deletion := RecursiveDeletion(ctx, dlr[i].Id) + ids = append(ids, deletion...) + } + return ids +} diff --git a/internal/app/system/logic/documentSafetyMeeting/document_safety_meeting.go b/internal/app/system/logic/documentSafetyMeeting/document_safety_meeting.go new file mode 100644 index 0000000..1405c43 --- /dev/null +++ b/internal/app/system/logic/documentSafetyMeeting/document_safety_meeting.go @@ -0,0 +1,507 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-04-09 11:40:21 +// 生成路径: internal/app/system/logic/document_safety_meeting.go +// 生成人:gfast +// desc:安全会议 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "os" + "path/filepath" + "strconv" + "strings" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + logic "github.com/tiger1103/gfast/v3/internal/app/system/logic/documentCompletion" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterDocumentSafetyMeeting(New()) +} + +func New() *sDocumentSafetyMeeting { + return &sDocumentSafetyMeeting{} +} + +type sDocumentSafetyMeeting struct{} + +func (s *sDocumentSafetyMeeting) List(ctx context.Context, req *system.DocumentSafetyMeetingSearchReq) (listRes *system.DocumentSafetyMeetingSearchRes, err error) { + listRes = new(system.DocumentSafetyMeetingSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.DocumentSafetyMeeting.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.DocumentSafetyMeeting.Columns().Id+" = ?", req.Id) + } + if req.IdStr != "" { + m = m.Where(dao.DocumentSafetyMeeting.Columns().IdStr+" = ?", req.IdStr) + } + if req.Pid != "" { + m = m.Where(dao.DocumentSafetyMeeting.Columns().Pid+" = ?", req.Pid) + } + if req.Name != "" { + m = m.Where(dao.DocumentSafetyMeeting.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.FilenPath != "" { + m = m.Where(dao.DocumentSafetyMeeting.Columns().FilenPath+" = ?", req.FilenPath) + } + if req.Type != "" { + m = m.Where(dao.DocumentSafetyMeeting.Columns().Type+" = ?", req.Type) + } + if req.Suffix != "" { + m = m.Where(dao.DocumentSafetyMeeting.Columns().Suffix+" = ?", req.Suffix) + } + if req.CreateBy != "" { + m = m.Where(dao.DocumentSafetyMeeting.Columns().CreateBy+" = ?", req.CreateBy) + } + if req.UpdateBy != "" { + m = m.Where(dao.DocumentSafetyMeeting.Columns().UpdateBy+" = ?", req.UpdateBy) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.DocumentSafetyMeeting.Columns().CreatedAt+" >=? AND "+dao.DocumentSafetyMeeting.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.ProjectId != "" { + m = m.Where(dao.DocumentSafetyMeeting.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.DocumentSafetyMeetingInfoRes + err = m.Fields(system.DocumentSafetyMeetingSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.DocumentSafetyMeetingListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.DocumentSafetyMeetingListRes{ + Id: v.Id, + IdStr: v.IdStr, + Pid: v.Pid, + Name: v.Name, + FilenPath: v.FilenPath, + Type: v.Type, + Suffix: v.Suffix, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + ProjectId: v.ProjectId, + } + } + }) + return +} + +func (s *sDocumentSafetyMeeting) GetById(ctx context.Context, id int64) (res *model.DocumentSafetyMeetingInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.DocumentSafetyMeeting.Ctx(ctx).WithAll().Where(dao.DocumentSafetyMeeting.Columns().Id, id).Scan(&res) + res.FilenPathCoding = coryCommon.URLCoding(res.FilenPath) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sDocumentSafetyMeeting) Add(ctx context.Context, req *system.DocumentSafetyMeetingAddReq) (err error) { + if req.FilePath == nil { + errors.New("未识别到文件上传!") + return + } + // 大文件上传 + req.FilePath.Url = strings.ReplaceAll(req.FilePath.Url, "/resource/public/", "/file/") + req.FilePath.Name = strings.Replace(req.FilePath.Name, " ", "", -1) + dataFolder, err := logic.AddFileOperation(ctx, coryCommon.SafetyMeeting, req.ProjectId) + if err != nil { + return err + } + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + if req.FileType == "1" { // 1、压缩文件夹导入 + filenPath := "" + if req.Pid != "" { + value, _ := dao.DocumentSafetyMeeting.Ctx(ctx).Where("id_str", req.Pid).Fields("filen_path").Value() + filenPath = value.String() + } + newPath := strings.ReplaceAll(req.FilePath.Url, "/file", coryCommon.GetCWD()+"/resource/public") + if filenPath == "" { + filenPath = coryCommon.ResourcePublicToFunc(dataFolder, 0) + } + path, err := coryCommon.FileZipFunc(newPath, filenPath, dataFolder) // 解压相对路径,并删除压缩文件,返回解压后的相对路径 + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + one, err := coryCommon.Traversal(ctx, path, req.Pid, dao.DocumentSafetyMeeting.Table(), dataFolder, req.ProjectId, "2") // 遍历解压后的文件,插入数据 + // err = Traversal(ctx, "resource/public/masterMask/资料模板") + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + _, err = g.DB().Model(dao.DocumentSafetyMeeting.Table()).Ctx(ctx).Insert(one) + liberr.ErrIsNil(ctx, err, "新增失败!") + } else if req.FileType == "2" { // 2、文件导入 + wornPath := filepath.ToSlash(strings.ReplaceAll(req.FilePath.Url, "/file/", coryCommon.GetCWD()+"/resource/public/")) + ve := "" + // 不等于空,那么证明文件应该在根目录下面,否则是在某个文件夹下面 + if req.Pid != "" { + value, _ := dao.DocumentSafetyMeeting.Ctx(ctx).Where("id_str", req.Pid).Fields("filen_path").Value() + ve = value.String() + } else { + ve = strings.Replace(dataFolder+"/", "/resource/public/", "/file/", 1) + } + newPath := strings.Replace(ve, "/file/", coryCommon.GetCWD()+"/resource/public/", 1) + // 2、文件存在就随机给一个文件名(当前文件名+随机文件名) + _, err = os.Stat(newPath + "/" + req.FilePath.Name) + if err == nil { + split := strings.Split(req.FilePath.Name, ".") + name := split[0] + "" + coryCommon.FileName("completion") + "." + strings.Split(req.FilePath.Name, ".")[1] + newPath = newPath + "/" + name + req.FilePath.Name = name + } else { + newPath = newPath + "/" + req.FilePath.Name + } + // 3、文件移动 + // newPath = filepath.ToSlash(newPath) + newPath = strings.ReplaceAll(filepath.ToSlash(newPath), "//", "/") + err = os.Rename(wornPath, newPath) + + // 4、数据库记录文件 + res := model.DocumentSafetyMeetingInfoRes{ + Name: strings.Split(req.FilePath.Name, ".")[0], + Suffix: req.FilePath.FileType, + FilenPath: filepath.ToSlash(strings.Replace(newPath, coryCommon.GetCWD()+"/resource/public/", "/file/", 1)), + Type: "1", + ProjectId: req.ProjectId, + } + if req.Pid == "" { + res.Pid = "0" + } else { + res.Pid = req.Pid + } + _, err = dao.DocumentSafetyMeeting.Ctx(ctx).Insert(res) + } else { // 3、新建文件夹 + } + liberr.ErrIsNil(ctx, err, "新增失败!") + }) + return err + }) + return +} + +func (s *sDocumentSafetyMeeting) Edit(ctx context.Context, req *system.DocumentSafetyMeetingEditReq) (err error) { + if req.Type == "1" { + err = updateFile(ctx, req) + } else if req.Type == "2" { + err = updateFolder(ctx, req) + } + liberr.ErrIsNil(ctx, err) + return +} + +func (s *sDocumentSafetyMeeting) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 1、先判断删除的是文件还是文件夹,然后进行修改需要删除的文件或文件夹名称 + var dataList []*model.DocumentSafetyMeetingInfoRes + err = dao.DocumentSafetyMeeting.Ctx(ctx).Where(dao.DocumentSafetyMeeting.Columns().Id+" in (?)", ids).Scan(&dataList) + liberr.ErrIsNil(ctx, err, "删除失败") + + if len(dataList) == 0 { + err = errors.New("删除失败!") + return + } + + // 遍历每个文件 + for i := 0; i < len(dataList); i++ { + dataType := dataList[i].Type // 文件类型 + + upEntity := system.DocumentSafetyMeetingEditReq{ + Id: dataList[i].Id, + Name: dataList[i].Name + coryCommon.FileName("delete"), + Type: dataType, + } + + // 根据文件类型进行操作 + switch dataType { + case "1": + err = updateFile(ctx, &upEntity) // 修改文件 + default: + err = updateFolder(ctx, &upEntity) // 修改目录 + } + liberr.ErrIsNil(ctx, err, "删除失败") + + _, err = dao.DocumentSafetyMeeting.Ctx(ctx).Delete(dao.DocumentSafetyMeeting.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除 DocumentProductionDrawing 表中数据失败") + } + }) + return +} + +func (s *sDocumentSafetyMeeting) CompletionNewFolderDataFunc(ctx context.Context, req *system.DocumentSafetyNewFolderDataReq) error { + dataFolder, err := logic.AddFileOperation(ctx, coryCommon.QualityMeeting, req.ProjectId) + if err != nil { + return err + } + + err = g.Try(ctx, func(ctx context.Context) { + resEntity := model.DocumentSafetyMeetingInfoRes{ + Name: req.FileName, + Suffix: "", + Type: "2", + } + path := "" + if req.Pid != "" { + value, _ := dao.DocumentSafetyMeeting.Ctx(ctx).Where("id_str", req.Pid).Fields("filen_path").Value() + path = value.String() + "/" + req.FileName + resEntity.Pid = req.Pid + } else { + template := strings.Replace(dataFolder, "/resource/public/", "/file/", 1) + path = template + "/" + req.FileName + resEntity.Pid = "0" + } + // 2、判断是否重名,不重复就新增 + count, _ := dao.DocumentSafetyMeeting.Ctx(ctx).Unscoped().Where("filen_path", path).Count() + if count > 0 { + err = errors.New("文件夹已重复!") + liberr.ErrIsNil(ctx, err) + return + } else { + resEntity.IdStr = coryCommon.SHA256(path) + resEntity.FilenPath = path + resEntity.ProjectId = req.ProjectId + _, insertDataErr := dao.DocumentSafetyMeeting.Ctx(ctx).Insert(resEntity) + if insertDataErr != nil { + err = errors.New("新增文件夹失败!") + liberr.ErrIsNil(ctx, err) + return + } + err = coryCommon.CreateDirectory(strings.Replace(path, "/file/", coryCommon.GetCWD()+"/resource/public/", 1)) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + } + liberr.ErrIsNil(ctx, err, "新增文件夹失败!") + }) + + return err +} + +// TreeStructureFunc +func (s *sDocumentSafetyMeeting) TreeStructureFunc(ctx context.Context, req *system.DocumentSafetyTreeStructureReq) (res *system.DocumentQualityTreeStructureRes, err error) { + res = new(system.DocumentQualityTreeStructureRes) + err = g.Try(ctx, func(ctx context.Context) { + var completion []*model.DocumentQualityMeetingListRes + // 1、获取到当前项目下的所有顶级文件及目录 + sql := dao.DocumentSafetyMeeting.Ctx(ctx). + Where("project_id", req.ProjectId) + if req.Pid != "" { + sql = sql.Where("pid", req.Pid) + } + sql = sql.WhereNull("deleted_at") + err := sql.Order("type desc").Scan(&completion) + for i := range completion { + completion[i].FilenPathCoding = coryCommon.URLCoding(completion[i].FilenPath) + } + res.List = completion + liberr.ErrIsNil(ctx, err, "获取数据失败") + }) + return +} + +// SelectByPidFunc +func (s *sDocumentSafetyMeeting) SelectByPidFunc(ctx context.Context, req *system.DocumentSafetySelectByPidReq) (res *system.DocumentQualitySelectByPidRes, err error) { + res = new(system.DocumentQualitySelectByPidRes) + // 1、组装路径 + dataFolder := ct.New().GetLoginUser(ctx).UserName + dataFolder = coryCommon.QualityMeeting + "/" + dataFolder + req.PathName + // 2、获取pid + err = g.Try(ctx, func(ctx context.Context) { + value, err := dao.DocumentSafetyMeeting.Ctx(ctx). + Where("project_id", req.ProjectId). + Where("filen_path", req.PathName). + Fields("pid"). + Value() + liberr.ErrIsNil(ctx, err, "获取数据失败") + res.Pid = value.String() + }) + return +} + +// CompletionDataRecyclingStationFunc +func (s *sDocumentSafetyMeeting) CompletionDataRecyclingStationFunc(ctx context.Context, req *system.DocumentSafetyDataRecyclingStationReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + if req.Type == "1" { + _, err = dao.DocumentSafetyMeeting.Ctx(ctx).Unscoped().Where(dao.DocumentSafetyMeeting.Columns().Id+" in (?)", req.Ids).Update(g.Map{"deleted_at": nil}) + } else { + var pathArr []string + // 删除还需要删除下面的所有子数据 + var idArr []int64 + for i := range req.Ids { + idList := RecursiveDeletion(ctx, req.Ids[i]) + if idList != nil { + idArr = append(idArr, idList...) + } + data, _ := dao.DocumentSafetyMeeting.Ctx(ctx).Unscoped().Where("id", req.Ids[i]).Fields("filen_path").Value() + pathArr = append(pathArr, data.String()) + } + idArr = append(idArr, req.Ids...) + _, err = dao.DocumentSafetyMeeting.Ctx(ctx).Unscoped().Delete(dao.DocumentSafetyMeeting.Columns().Id+" in (?)", idArr) + // 如果删除成功,那么删除文件/文件夹 + for _, data := range pathArr { + os.RemoveAll(coryCommon.FileToFunc(data, 2)) + } + } + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +// RecycleBinListFunc +func (s *sDocumentSafetyMeeting) RecycleBinListFunc(ctx context.Context, req *system.DocumentSafetyRecycleBinListReq) (res *system.DocumentQualityRecycleBinListRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + res = new(system.DocumentQualityRecycleBinListRes) + var dataList []*model.DocumentQualityMeetingInfoRes + m := dao.DocumentSafetyMeeting.Ctx(ctx) + if req.Type == "2" { + m = m.Unscoped().WhereNotNull("deleted_at") + } else if req.Type == "3" { + m = m.Unscoped() + } + err = m.Where(dao.DocumentSafetyMeeting.Columns().ProjectId, req.ProjectId).Scan(&dataList) + res.List = dataList + liberr.ErrIsNil(ctx, err, "获取数据失败!") + }) + return +} + +func RecursiveDeletion(ctx context.Context, id int64) (ids []int64) { + // 1、获取某个文件的字符串id_str + value, _ := dao.DocumentSafetyMeeting.Ctx(ctx).Unscoped().Where("id", id).Fields("id_str").Value() + if value.String() == "" { + return nil + } + // 2、查看当前需要删除的数据下面是否有子数据 + var dlr []*model.DocumentQualityMeetingListRes + dao.DocumentSafetyMeeting.Ctx(ctx).Unscoped().Where("pid", value.String()).Fields("id,id_str").Scan(&dlr) + for i := range dlr { + ids = append(ids, dlr[i].Id) + deletion := RecursiveDeletion(ctx, dlr[i].Id) + ids = append(ids, deletion...) + } + return ids +} + +// 修改文件夹 +func updateFolder(ctx context.Context, req *system.DocumentSafetyMeetingEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 1、判断修改后的文件夹是否有重复,如果有就提示当前文件夹已存在! + var dif *model.DocumentSafetyMeetingInfoRes + dao.DocumentSafetyMeeting.Ctx(ctx).WherePri(req.Id).Scan(&dif) + replace := strings.Replace(dif.FilenPath, dif.Name, req.Name, 1) + s2 := coryCommon.FileToFunc(replace, 2) + if _, err = os.Stat(s2); err == nil { + err = errors.New("当前文件夹已存在!") + liberr.ErrIsNil(ctx, err) + return + } else { + count := strings.Count(dif.FilenPath, dif.Name) + hx := coryCommon.SHA256(strings.ReplaceAll(dif.FilenPath, dif.FilenPath, replace)) + // 2、如果不存在,那么就修改文件夹的同时,还得修改路径,以及及其子文件/文件夹下的所有路径 + var entity []*logic.TreeStructureResTwo + err = dao.DocumentSafetyMeeting.Ctx(ctx).Unscoped().Where("pid", dif.IdStr).WithAll().Scan(&entity) + strs := logic.RecursiveQueryEntityFunc(ctx, entity) + _, err = dao.DocumentSafetyMeeting.Ctx(ctx).Unscoped().Where("id in (?)", strs).Update(g.Map{"filen_path": gdb.Raw("CONCAT(" + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', " + strconv.Itoa(count) + ")," + + "'" + req.Name + "'," + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', -1)" + + ")")}) + if err != nil { + err = errors.New("修改失败!") + liberr.ErrIsNil(ctx, err) + return + } + // 3、重新生成并修改文件夹的id_str等信息 + _, err = dao.DocumentSafetyMeeting.Ctx(ctx).Where("id", dif.Id).Update(g.Map{ + "id_str": hx, + "name": req.Name, + "filen_path": gdb.Raw("CONCAT(" + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', " + strconv.Itoa(count) + ")," + + "'" + req.Name + "'," + + "SUBSTRING_INDEX(filen_path, '" + dif.Name + "', -1)" + + ")"), + }) + _, err = dao.DocumentSafetyMeeting.Ctx(ctx).Unscoped().Where("pid", dif.IdStr).Update(g.Map{"pid": hx}) + // 4、修改文件夹 + oldPath := filepath.Join(coryCommon.FileToFunc(dif.FilenPath, 2)) + newPath := filepath.Join(filepath.Dir(oldPath), req.Name) + err = os.Rename(oldPath, newPath) + } + liberr.ErrIsNil(ctx, err, "修改失败") + return + }) + return err + }) + return +} + +// 修改文件 +func updateFile(ctx context.Context, req *system.DocumentSafetyMeetingEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + var dif *model.DocumentSafetyMeetingInfoRes + err = dao.DocumentSafetyMeeting.Ctx(ctx).WherePri(req.Id).Scan(&dif) + // 1、判断修改后的名字是否有重复,如果有就提示当前文件名已存在! + replace := strings.Replace(dif.FilenPath, dif.Name, req.Name, 1) + s2 := coryCommon.FileToFunc(replace, 2) + if _, err = os.Stat(s2); err == nil { + err = errors.New("当前文件名已存在!") + liberr.ErrIsNil(ctx, err) + return + } + // 2、如果不存在,那么就修改文件名的同时,还得修改路径 + _, err = dao.DocumentSafetyMeeting.Ctx(ctx).WherePri(req.Id).Update(do.DocumentSafetyMeeting{ + Name: req.Name, + FilenPath: replace, + }) + // 3、修改具体文件的文件名 + if err == nil { + oldPath := coryCommon.FileToFunc(dif.FilenPath, 2) + newPath := filepath.Join(filepath.Dir(oldPath), req.Name+dif.Suffix) + err = os.Rename(oldPath, newPath) + if err != nil { + err = errors.New("修改失败") + liberr.ErrIsNil(ctx, err) + return + } + } + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return err + }) + return +} diff --git a/internal/app/system/logic/logic.go b/internal/app/system/logic/logic.go new file mode 100644 index 0000000..2a2ef98 --- /dev/null +++ b/internal/app/system/logic/logic.go @@ -0,0 +1,147 @@ +package logic + +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/appMenus" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/appRoleMenus" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/appRoles" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/appUserDisableMenus" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/appUserMenus" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/appUserRoles" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busAttendanceMachine" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busAttendanceMachineUser" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busCameraChannel" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busCameraChineseStandard" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busCategory" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busCompany" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busComplaintBox" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busConstructionBlacklist" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busConstructionLog" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busConstructionProject" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busConstructionUser" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busConstructionUserFile" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busConstructionUserPost" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busCorporateEvents" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busDesignAudit" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busDesignDocument" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busDesignPeriodRange" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busEngineeringQuality" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busEquipmentEquipmentUnpacking" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busEquipmentMaterials" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busEquipmentMaterialsExcel" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busEquipmentMaterialsInventory" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busEquipmentMaterialsWeight" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busEssentialInformation" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busFolder" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busFolderFile" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busHseManagement" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busHseSecurityLog" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busInspectionTicket" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busMachinery" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busMachineryDetail" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busPayrollList" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busProjectinProgress" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busQuality" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busQuestionBank" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busQuestionSave" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busQuestionsConfiguration" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busReissueACard" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busResearchDocument" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busSafety" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busSalaryDetails" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busScheduledPlanType" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busScheduledPlanTypeDetail" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busScheduledWeekly" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busScheduledWeeklyPhotovoltaic" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busStandingBook" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busTour" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busTypeOfWage" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busViolationLevel" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busViolationRecord" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/busWeeklySecurityReport" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/commentList" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/comments" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/constructionDetails" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/constructionProject" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/device" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/devicePreset" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/document" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/documentCompletion" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/documentData" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/documentProductionDrawing" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/documentProject" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/documentQualityMeeting" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/documentReport" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/documentSafetyMeeting" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/manageAirline" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/manageDevice" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/manageOperationLog" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/manageTask" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/manageTaskCron" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/manageTaskRecord" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/manageTaskRecordResource" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/manageTaskResult" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/manageWorkspace" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/masterSchedule" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/middleware" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/notificationRecipients" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/notifications" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/personal" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/planDaily" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/planWeek" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/planWeekReality" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/plant" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/projectFinance" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/projectSchedule" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/pvModule" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/qianqiBubantu" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/qianqiCamera" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/qianqiDixing" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/qianqiFangzhen" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/qianqiGuangfuban" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/qianqiGuangfubanIds" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/qianqiGuangfubanIdsLizhu" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/qianqiGuangfubanIdsZhijia" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/qianqiGuangfubanIdsZhuangdian" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/qianqiGuangfubanZuchuan" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/qianqiJidianxianlu" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/qianqiMoxing" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/qianqiNibianqi" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/qianqiPingchang" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/qianqiRedline" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/qianqiRedlineTudiliuzhuan" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/qianqiRoad" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/qianqiXiangbian" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/reminders" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/subProject" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/sysAuthRule" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/sysDept" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/sysFile" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/sysFileType" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/sysJob" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/sysJobLog" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/sysLoginLog" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/sysOperLog" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/sysPost" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/sysProject" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/sysProjectIntroduce" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/sysProjectValue" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/sysRole" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/sysUser" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/sysUserOnline" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/sysUserProject" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/sysWechatRole" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/templateData" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/templateDataJunior" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/templateDataSourceData" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/timeTask" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/todoTasks" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/token" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/toolsGenTable" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/toolsGenTableColumn" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/userRegistration" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/workSchedule" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/workStatus" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/xiangmuhuafenbiao" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/ys7Devices" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/ys7DevicesImg" +import _ "github.com/tiger1103/gfast/v3/internal/app/system/logic/zmkgGisModelLib" diff --git a/internal/app/system/logic/manageAirline/manage_airline.go b/internal/app/system/logic/manageAirline/manage_airline.go new file mode 100644 index 0000000..4cfe91d --- /dev/null +++ b/internal/app/system/logic/manageAirline/manage_airline.go @@ -0,0 +1,327 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-12-11 16:10:19 +// 生成路径: internal/app/system/logic/manage_airline.go +// 生成人:gfast +// desc:航线 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "crypto/md5" + "encoding/json" + "errors" + "fmt" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gctx" + "github.com/gogf/gf/v2/util/gconv" + uuid "github.com/satori/go.uuid" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "io" + "os" + "strconv" + "strings" +) + +func init() { + service.RegisterManageAirline(New()) +} + +func New() *sManageAirline { + return &sManageAirline{} +} + +type RouteDocumentEntity struct { + Success bool `json:"success"` + Code int `json:"code"` + Message string `json:"message"` + Data struct { + Flag bool `json:"flag"` + Signature string `json:"signature"` + } `json:"data"` +} + +type sManageAirline struct{} + +func (s *sManageAirline) RouteUploadFunc(ctx context.Context, req *system.RouteUploadReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、文件上传 + file := req.File + path, err := coryCommon.UploadFile(ctx, file, coryCommon.Helmet+"/") + liberr.ErrIsNil(ctx, err) + //2、计算得出文件MD5 + const old = "resource/public/" + filePath := strings.Replace(path, old, coryCommon.GetCWD()+"/"+old, 1) + fileContent, err := os.ReadFile(filePath) + liberr.ErrIsNil(ctx, err, "文件读取错误") + md5Hash := md5.New() + _, err = io.WriteString(md5Hash, string(fileContent)) + liberr.ErrIsNil(ctx, err, "计算MD5出错") + hashBytes := md5Hash.Sum(nil) + md5String := fmt.Sprintf("%x", hashBytes) + //3、新增航线数据 + _, err = dao.ManageAirline.Ctx(ctx).OmitEmpty().Insert(do.ManageAirline{ + ProjectId: req.ProjectId, + StrId: strings.ReplaceAll(uuid.NewV4().String(), "-", ""), + FilePath: strings.Replace(filePath, coryCommon.GetCWD(), "/"+old, 1), + Fingerprint: md5String, + Remark: req.Remark, + MqClientId: req.MqClientId, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + }) + return +} + +func (s *sManageAirline) List(ctx context.Context, req *system.ManageAirlineSearchReq) (listRes *system.ManageAirlineSearchRes, err error) { + listRes = new(system.ManageAirlineSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.ManageAirline.Ctx(ctx).WithAll() + if req.ProjectId != "" { + m = m.Where(dao.ManageAirline.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + if req.MqClientId != "" { + m = m.Where(dao.ManageAirline.Columns().MqClientId+" = ?", req.MqClientId) + } + if req.AirLine != "" { + m = m.Where(dao.ManageAirline.Columns().AirLine+" like ?", "%"+req.AirLine+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.ManageAirline.Columns().CreatedAt+" >=? AND "+dao.ManageAirline.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.ManageAirlineInfoRes + err = m.Fields(system.ManageAirlineSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.ManageAirlineListRes, len(res)) + for k, v := range res { + var pe []*model.PositionsEntity + err = json.Unmarshal([]byte(v.Positions), &pe) + listRes.List[k] = &model.ManageAirlineListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + AirLine: v.AirLine, + Positions: v.Positions, + PositionsEntity: pe, + StrId: v.StrId, + Speed: v.Speed, + Height: v.Height, + Gap: v.Gap, + FilePath: v.FilePath, + CreatedAt: v.CreatedAt, + Remark: v.Remark, + MqClientId: v.MqClientId, + } + } + }) + return +} + +func (s *sManageAirline) GetById(ctx context.Context, id int64) (res *model.ManageAirlineInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.ManageAirline.Ctx(ctx).WithAll().Where(dao.ManageAirline.Columns().Id, id).Scan(&res) + var pe []*model.PositionsEntity + err = json.Unmarshal([]byte(res.Positions), &pe) + res.PositionsEntity = pe + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func GeneratingCourse(ctx context.Context, air *model.AirlineEntity, height string) (allString string, err error) { + uri := g.Cfg().MustGet(gctx.New(), "uav.hostOne").String() + "router/waypoint" + for i := range air.LocationList { + float1, _ := strconv.ParseFloat(air.LocationList[i].Height, 64) + float2, _ := strconv.ParseFloat(height, 64) + f := float1 - float2 + air.LocationList[i].Height = strconv.FormatFloat(f, 'f', -1, 64) + } + airJson, err := json.Marshal(air) + fmt.Printf("传递的参数为-----:%v\n", string(airJson)) + response, err := g.Client().Post(ctx, uri, airJson) + allString = response.ReadAllString() + return +} + +func ExcelConvert(ctx context.Context, path, imageTargetPath string) (allString string, err error) { + uri := g.Cfg().MustGet(gctx.New(), "uav.hostOne").String() + "excel/convert?path=" + path + "&imageTargetPath=" + imageTargetPath + response, err := g.Client().Get(ctx, uri) + allString = response.ReadAllString() + return +} + +func (s *sManageAirline) Add(ctx context.Context, req *system.ManageAirlineAddReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //1、插入基础数据 + info, err := dao.ManageAirline.Ctx(ctx).OmitEmpty().Insert(do.ManageAirline{ + ProjectId: req.ProjectId, + AirLine: req.AirLine, + StrId: req.StrId, + Speed: req.Speed, + Height: req.Height, + Gap: req.Gap, + Remark: req.Remark, + MqClientId: req.MqClientId, + TakeOffPoint: req.Air.TakeOffRefPoint, + TakeOffSecurityHeight: req.TakeOffSecurityHeight, + GlobalTransitionalSpeed: req.GlobalTransitionalSpeed, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "基础数据添加失败") + id, err := info.LastInsertId() + liberr.ErrIsNil(ctx, err) + //2、生成新的航线文件 + path := coryCommon.Ynr(coryCommon.Helmet) + coryCommon.FileName("air_") + req.Air.AbsolutePath = coryCommon.GetCWD() + "/" + path + //req.Air.AbsolutePath = "/project/zmkg/resource/public/upload_file/2023-12-15/测试航线文件" + req.Air.TakeOffSecurityHeight = req.TakeOffSecurityHeight + req.Air.GlobalTransitionalSpeed = req.GlobalTransitionalSpeed + req.Air.WayLineId = int(id) + split := strings.Split(req.LngAndLatAndHeight, ",") + allString, err := GeneratingCourse(ctx, req.Air, split[len(split)-1]) + liberr.ErrIsNil(ctx, err, "生成航线文件失败") + var rde *RouteDocumentEntity + err = json.Unmarshal([]byte(allString), &rde) + if err != nil { + liberr.ErrIsNil(ctx, err, "解析数据失败") + return + } + if rde.Data.Flag == true { + path = coryCommon.ResourcePublicToFunc("/"+path, 0) + ".kmz" + //path := coryCommon.GetWd + "upload_file/2023-12-15/测试航线文件" + ".kmz" + marshal, _ := json.Marshal(req.Positions) + //3、将航线文件生成对应的数据存储到数据库 + _, err = dao.ManageAirline.Ctx(ctx).WherePri(id).Update( + g.Map{ + "positions": marshal, + "file_path": path, + "fingerprint": rde.Data.Signature}) + liberr.ErrIsNil(ctx, err, "航线数据修改失败") + } else { + err = errors.New("添加失败") + liberr.ErrIsNil(ctx, err) + return + } + }) + return err + }) + return +} + +func (s *sManageAirline) Edit(ctx context.Context, req *system.ManageAirlineEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + flag := false + delStr := "" + airlineUp := do.ManageAirline{ + AirLine: req.AirLine, + Height: req.Height, + Gap: req.Gap, + Speed: req.Speed, + Remark: req.Remark, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + } + //这三个值有一个改变(传递给我),那证明需要修改航线 + if req.Speed > 0 || req.Height > 0 || req.Gap > 0 { + airlineUp.TakeOffPoint = req.Air.TakeOffRefPoint + airlineUp.TakeOffSecurityHeight = req.TakeOffSecurityHeight + airlineUp.GlobalTransitionalSpeed = req.GlobalTransitionalSpeed + req.Air.TakeOffSecurityHeight = req.TakeOffSecurityHeight + req.Air.GlobalTransitionalSpeed = req.GlobalTransitionalSpeed + //1、获取原本的路径 + value, err := dao.ManageAirline.Ctx(ctx).WherePri(req.Id).Fields("file_path").Value() + delStr = value.String() + //2、生成新的航线文件 + split := strings.Split(req.LngAndLatAndHeight, ",") + path := coryCommon.Ynr(coryCommon.Helmet) + coryCommon.FileName("air_") + req.Air.AbsolutePath = coryCommon.GetCWD() + "/" + path + //req.Air.AbsolutePath = "/project/zmkg/resource/public/upload_file/2023-12-15/测试航线文件" + allString, err := GeneratingCourse(ctx, req.Air, split[len(split)-1]) + liberr.ErrIsNil(ctx, err, "生成航线文件失败") + var rde *RouteDocumentEntity + err = json.Unmarshal([]byte(allString), &rde) + if err != nil { + liberr.ErrIsNil(ctx, err, "添加失败") + return + } + airlineUp.FilePath = strings.Replace(path, "resource/public/", coryCommon.GetWd, 1) + ".kmz" + //airlineUp.FilePath = coryCommon.GetWd + "upload_file/2023-12-15/测试航线文件" + ".kmz" + airlineUp.Fingerprint = rde.Data.Signature + marshal, _ := json.Marshal(req.Positions) + airlineUp.Positions = marshal + flag = rde.Data.Flag + } else { + flag = true + } + if flag == true { + //3、将航线文件生成对应的数据存储到数据库 + _, err = dao.ManageAirline.Ctx(ctx).OmitEmpty().WherePri(req.Id).Update(airlineUp) + //删除原本的航线文件 + if err != nil { + coryCommon.BatchFile(strings.Split(delStr, ",")) //删除pdf + } + } else { + err = errors.New("修改失败") + liberr.ErrIsNil(ctx, err) + return + } + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return err + }) + return +} + +func (s *sManageAirline) Delete(ctx context.Context, ids []int64) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + for _, id := range ids { + //1、查询路径 + var airEntity *model.ManageAirlineInfoRes + if err = dao.ManageAirline.Ctx(ctx).Where(dao.ManageAirline.Columns().Id, id).Scan(&airEntity); err != nil { + liberr.ErrIsNil(ctx, err) + return + } + //2、删除路径 + if err == nil { + coryCommon.BatchFile(strings.Split(airEntity.FilePath, ",")) + } + //3、删除模板 + if _, err = dao.ManageTask.Ctx(ctx).Unscoped().Delete(dao.ManageTask.Columns().AirLine, id); err != nil { + liberr.ErrIsNil(ctx, err) + return + } + } + //4、删除航线数据 + _, err = dao.ManageAirline.Ctx(ctx).Unscoped().Delete(dao.ManageAirline.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return err + }) + return +} diff --git a/internal/app/system/logic/manageDevice/manage_device.go b/internal/app/system/logic/manageDevice/manage_device.go new file mode 100644 index 0000000..3abd640 --- /dev/null +++ b/internal/app/system/logic/manageDevice/manage_device.go @@ -0,0 +1,252 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-11-14 10:53:21 +// 生成路径: internal/app/system/logic/manage_device.go +// 生成人:gfast +// desc:设备信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gctx" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/tiger1103/gfast/v3/third/plane/dj" + "strconv" +) + +var key = "airportLocation" + +func init() { + service.RegisterManageDevice(New()) +} + +func New() *sManageDevice { + return &sManageDevice{} +} + +type sManageDevice struct{} + +func (s *sManageDevice) List(ctx context.Context, req *system.ManageDeviceSearchReq) (listRes *system.ManageDeviceSearchRes, err error) { + listRes = new(system.ManageDeviceSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.ManageDevice.Ctx(ctx).WithAll() + if req.ProjectId != "" { + m = m.Where(dao.ManageDevice.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.Domain != "" { + m = m.Where(dao.ManageDevice.Columns().Domain+" = ?", gconv.Int64(req.Domain)) + } + if req.DeviceSn != "" { + m = m.Where(dao.ManageDevice.Columns().DeviceSn+" like ?", "%"+req.DeviceSn+"%") + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.ManageDeviceInfoRes + err = m.Fields(system.ManageDeviceSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.ManageDeviceListRes, len(res)) + for k, v := range res { + get, _ := g.Redis().Get(ctx, key+"-"+v.MqClientId) + listRes.List[k] = &model.ManageDeviceListRes{ + Id: v.Id, + DeviceSn: v.DeviceSn, + DeviceName: v.DeviceName, + MqClientId: v.MqClientId, + UserId: v.UserId, + Nickname: v.Nickname, + WorkspaceId: v.WorkspaceId, + DeviceType: v.DeviceType, + SubType: v.SubType, + Domain: v.Domain, + FirmwareVersion: v.FirmwareVersion, + CompatibleStatus: v.CompatibleStatus, + Version: v.Version, + DeviceIndex: v.DeviceIndex, + //ChildSn: v.ChildSn, + CreatedAt: v.CreatedAt, + BoundTime: v.BoundTime, + BoundStatus: v.BoundStatus, + LoginTime: v.LoginTime, + DeviceDesc: v.DeviceDesc, + UrlNormal: v.UrlNormal, + UrlSelect: v.UrlSelect, + ProjectId: v.ProjectId, + LngAndLatAndHeight: get.String(), + ManageDeviceVideoEntity: v.ManageDeviceVideoEntity, + } + } + }) + return +} + +func (s *sManageDevice) NoPageList(ctx context.Context, req *system.NoPageListSearchReq) (listRes *system.NoPageListSearchRes, err error) { + listRes = new(system.NoPageListSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.ManageDevice.Ctx(ctx).WithAll() + if req.ProjectId != "" { + m = m.Where(dao.ManageDevice.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.Domain != "" { + m = m.Where(dao.ManageDevice.Columns().Domain+" = ?", gconv.Int64(req.Domain)) + } + if req.DeviceSn != "" { + m = m.Where(dao.ManageDevice.Columns().DeviceSn+" like ?", "%"+req.DeviceSn+"%") + } + order := "id desc" + var res []*model.ManageDeviceInfoRes + err = m.Fields(system.ManageDeviceSearchRes{}).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.ManageDeviceListRes, len(res)) + for k, v := range res { + get, _ := g.Redis().Get(ctx, key+"-"+v.MqClientId) + listRes.List[k] = &model.ManageDeviceListRes{ + Id: v.Id, + DeviceSn: v.DeviceSn, + DeviceName: v.DeviceName, + MqClientId: v.MqClientId, + UserId: v.UserId, + Nickname: v.Nickname, + WorkspaceId: v.WorkspaceId, + DeviceType: v.DeviceType, + SubType: v.SubType, + Domain: v.Domain, + FirmwareVersion: v.FirmwareVersion, + CompatibleStatus: v.CompatibleStatus, + Version: v.Version, + DeviceIndex: v.DeviceIndex, + //ChildSn: v.ChildSn, + CreatedAt: v.CreatedAt, + BoundTime: v.BoundTime, + BoundStatus: v.BoundStatus, + LoginTime: v.LoginTime, + DeviceDesc: v.DeviceDesc, + UrlNormal: v.UrlNormal, + UrlSelect: v.UrlSelect, + ProjectId: v.ProjectId, + LngAndLatAndHeight: get.String(), + ManageDeviceVideoEntity: v.ManageDeviceVideoEntity, + } + } + }) + return +} + +func (s *sManageDevice) GetById(ctx context.Context, id uint64) (res *model.ManageDeviceInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.ManageDevice.Ctx(ctx).WithAll().Where(dao.ManageDevice.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sManageDevice) Add(ctx context.Context, req *system.ManageDeviceAddReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + var mdi *model.ManageDeviceDictionaryInfo + err = g.DB().Model("manage_device_dictionary").Ctx(ctx).WherePri(req.DictionaryId).Scan(&mdi) + _, err = dao.ManageDevice.Ctx(ctx).OmitEmpty().Insert(do.ManageDevice{ + ProjectId: req.ProjectId, + DeviceSn: req.DeviceSn, + DictionaryId: req.DictionaryId, + MqClientId: req.MqClientId, + DeviceName: mdi.DeviceName, + DeviceType: mdi.DeviceType, + SubType: mdi.SubType, + Domain: mdi.Domain, + Nickname: req.Nickname, + WorkspaceId: req.WorkspaceId, + //FirmwareVersion: req.FirmwareVersion, + //CompatibleStatus: req.CompatibleStatus, + //ChildSn: req.ChildSn, + BoundStatus: 1, + BoundTime: gtime.Now(), + }) + liberr.ErrIsNil(ctx, err, "数据添加失败!") + //当前sn下面的调试模式状态全为关,如果查询到原本有就不用操作 + var m = g.DB().Model("manage_button_state").Safe() + count, err2 := m.Where("mq_client_id", req.MqClientId).Count() + liberr.ErrIsNil(ctx, err2, "初始化调试模式按钮失败!") + if count == 0 { + _, err2 := g.DB().Model("manage_button_state").Insert(g.Map{"mq_client_id": req.MqClientId}) + liberr.ErrIsNil(ctx, err2, "初始化调试模式按钮失败!") + return + } + }) + return err + }) + return +} + +func (s *sManageDevice) Edit(ctx context.Context, req *system.ManageDeviceEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + var mdi *model.ManageDeviceDictionaryInfo + err = g.DB().Model("manage_device_dictionary").Ctx(ctx).WherePri(req.DictionaryId).Scan(&mdi) + _, err = dao.ManageDevice.Ctx(ctx).OmitEmpty().WherePri(req.Id).Update(do.ManageDevice{ + DeviceSn: req.DeviceSn, + DictionaryId: req.DictionaryId, + DeviceName: mdi.DeviceName, + MqClientId: req.MqClientId, + DeviceType: mdi.DeviceType, + SubType: mdi.SubType, + Domain: mdi.Domain, + Nickname: req.Nickname, + WorkspaceId: req.WorkspaceId, + //FirmwareVersion: req.FirmwareVersion, + //CompatibleStatus: req.CompatibleStatus, + //ChildSn: req.ChildSn, + BoundStatus: 1, + BoundTime: gtime.Now(), + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sManageDevice) Delete(ctx context.Context, ids []uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ManageDevice.Ctx(ctx).Delete(dao.ManageDevice.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +// LongitudeAndLatitudeEdit 给指定机场添加经度纬度坐标 +func LongitudeAndLatitudeEdit(gatewaySn string, point dj.Point) (err error) { + ctx := gctx.New() + err = g.Try(ctx, func(ctx context.Context) { + lon := strconv.FormatFloat(point.Longitude, 'f', -1, 64) + lat := strconv.FormatFloat(point.Latitude, 'f', -1, 64) + height := strconv.FormatFloat(point.Height, 'f', -1, 64) + var pt = lon + "," + lat + "," + height + _, err2 := g.Redis().Set(ctx, key+"-"+gatewaySn, pt) + if err2 != nil { + return + } + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} diff --git a/internal/app/system/logic/manageOperationLog/manage_operation_log.go b/internal/app/system/logic/manageOperationLog/manage_operation_log.go new file mode 100644 index 0000000..b6b8b1a --- /dev/null +++ b/internal/app/system/logic/manageOperationLog/manage_operation_log.go @@ -0,0 +1,153 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-06-21 15:23:29 +// 生成路径: internal/app/system/logic/manage_operation_log.go +// 生成人:gfast +// desc:无人机指令日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterManageOperationLog(New()) +} + +func New() *sManageOperationLog { + return &sManageOperationLog{} +} + +type sManageOperationLog struct{} + +func (s *sManageOperationLog) List(ctx context.Context, req *system.ManageOperationLogSearchReq) (listRes *system.ManageOperationLogSearchRes, err error) { + listRes = new(system.ManageOperationLogSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.ManageOperationLog.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.ManageOperationLog.Columns().Id+" = ?", req.Id) + } + if req.Sn != "" { + m = m.Where(dao.ManageOperationLog.Columns().Sn+" = ?", req.Sn) + } + if req.Method != "" { + m = m.Where(dao.ManageOperationLog.Columns().Method+" = ?", req.Method) + } + if req.Direction != "" { + m = m.Where(dao.ManageOperationLog.Columns().Direction+" = ?", req.Direction) + } + if req.Code != "" { + m = m.Where(dao.ManageOperationLog.Columns().Code+" = ?", gconv.Int(req.Code)) + } + if req.Operator != "" { + m = m.Where(dao.ManageOperationLog.Columns().Operator+" = ?", gconv.Int64(req.Operator)) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.ManageOperationLogInfoRes + err = m.Fields(system.ManageOperationLogSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.ManageOperationLogListRes, len(res)) + for k, v := range res { + ren := "系统" + if v.Operator != 0 { + value, _ := dao.SysUser.Ctx(ctx).WherePri(v.Operator).Fields("user_nickname").Value() + ren = value.String() + } + listRes.List[k] = &model.ManageOperationLogListRes{ + Id: v.Id, + Sn: v.Sn, + Method: v.Method, + Direction: v.Direction, + Code: v.Code, + CreatedAt: v.CreatedAt, + Operator: v.Operator, + OperatorRen: ren, + } + } + }) + return +} + +func (s *sManageOperationLog) GetById(ctx context.Context, id int64) (res *model.ManageOperationLogInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.ManageOperationLog.Ctx(ctx).WithAll().Where(dao.ManageOperationLog.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sManageOperationLog) Add(ctx context.Context, req *system.ManageOperationLogAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ManageOperationLog.Ctx(ctx).Insert(do.ManageOperationLog{ + Sn: req.Sn, + Method: req.Method, + Direction: req.Direction, + Code: req.Code, + Operator: req.Operator, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sManageOperationLog) Edit(ctx context.Context, req *system.ManageOperationLogEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ManageOperationLog.Ctx(ctx).WherePri(req.Id).Update(do.ManageOperationLog{ + Sn: req.Sn, + Method: req.Method, + Direction: req.Direction, + Code: req.Code, + Operator: req.Operator, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sManageOperationLog) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ManageOperationLog.Ctx(ctx).Delete(dao.ManageOperationLog.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +func AddLog(ctx context.Context, sn, method, direction string, code int) error { + req := system.ManageOperationLogAddReq{ + Sn: sn, + Method: method, + Direction: direction, + Code: code, + } + user := ct.New().GetLoginUser(ctx) + if user != nil { + req.Operator = int64(user.Id) + } + err := service.ManageOperationLog().Add(ctx, &req) + return err +} diff --git a/internal/app/system/logic/manageTask/manage_task.go b/internal/app/system/logic/manageTask/manage_task.go new file mode 100644 index 0000000..a80fc6e --- /dev/null +++ b/internal/app/system/logic/manageTask/manage_task.go @@ -0,0 +1,171 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-12-12 15:21:22 +// 生成路径: internal/app/system/logic/manage_task.go +// 生成人:gfast +// desc:航线任务下发 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterManageTask(New()) +} + +func New() *sManageTask { + return &sManageTask{} +} + +type sManageTask struct{} + +func (s *sManageTask) List(ctx context.Context, req *system.ManageTaskSearchReq) (listRes *system.ManageTaskSearchRes, err error) { + listRes = new(system.ManageTaskSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.ManageTask.Ctx(ctx).WithAll().As("a") + if req.Id != "" { + m = m.Where("a."+dao.ManageTask.Columns().Id+" = ?", req.Id) + } + if req.TaskName != "" { + m = m.Where("a."+dao.ManageTask.Columns().TaskName+" like ?", "%"+req.TaskName+"%") + } + if req.MqClientId != "" { + m = m.Where(dao.ManageTask.Columns().MqClientId+" = ?", gconv.Int64(req.MqClientId)) + } + if req.AirLine != "" { + m = m.Where("a."+dao.ManageTask.Columns().AirLine+" = ?", gconv.Int64(req.AirLine)) + } + if req.ProjectId != "" { + m = m.Where("a."+dao.ManageTask.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.ManageTask.Columns().CreatedAt+" >=? AND "+"a."+dao.ManageTask.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + m = m.LeftJoin("manage_airline", "b", "a.air_line=b.id"). + LeftJoin("manage_device", "c", "a.mq_client_id=c.id"). + Fields("a.*,b.air_line as airLineName,c.device_name as deviceName") + array, err := m.Array() + listRes.Total = len(array) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.ManageTaskInfoRes + err = m.Page(req.PageNum, req.PageSize).Order("a." + order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.ManageTaskListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.ManageTaskListRes{ + Id: v.Id, + TaskName: v.TaskName, + FlightId: v.FlightId, + TaskType: v.TaskType, + ExecuteTime: v.ExecuteTime, + WaylineType: v.WaylineType, + AirLine: v.AirLine, + ProjectId: v.ProjectId, + RthAltitude: v.RthAltitude, + RthMode: v.RthMode, + OutOfControlAction: v.OutOfControlAction, + ExitWaylineWhenRcLost: v.ExitWaylineWhenRcLost, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + Remark: v.Remark, + AirLineName: v.AirLineName, + DeviceName: v.DeviceName, + MqClientId: v.MqClientId, + } + //判断当前数据是否有开启定时任务 + count, _ := dao.ManageTaskCron.Ctx(ctx).WithAll().Where(dao.ManageTaskCron.Columns().TaskId, v.Id).Count() + if count > 0 { + listRes.List[k].IsCron = 1 + } + } + }) + return +} + +func (s *sManageTask) GetById(ctx context.Context, id int64) (res *model.ManageTaskInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.ManageTask.Ctx(ctx).WithAll().Where(dao.ManageTask.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sManageTask) Add(ctx context.Context, req *system.ManageTaskAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ManageTask.Ctx(ctx).Insert(do.ManageTask{ + TaskName: req.TaskName, + //FlightId: strings.ReplaceAll(uuid.NewV4().String(), "-", ""), + //TaskType: req.TaskType, + //ExecuteTime: req.ExecuteTime, + WaylineType: req.WaylineType, + Airport: req.Airport, + AirLine: req.AirLine, + ProjectId: req.ProjectId, + RthAltitude: req.RthAltitude, + RthMode: req.RthMode, + OutOfControlAction: req.OutOfControlAction, + ExitWaylineWhenRcLost: req.ExitWaylineWhenRcLost, + CreateBy: ct.New().GetLoginUser(ctx).Id, + Remark: req.Remark, + MqClientId: req.MqClientId, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sManageTask) Edit(ctx context.Context, req *system.ManageTaskEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ManageTask.Ctx(ctx).WherePri(req.Id).Update(do.ManageTask{ + TaskName: req.TaskName, + //TaskType: req.TaskType, + //ExecuteTime: req.ExecuteTime, + WaylineType: req.WaylineType, + Airport: req.Airport, + AirLine: req.AirLine, + ProjectId: req.ProjectId, + RthAltitude: req.RthAltitude, + RthMode: req.RthMode, + OutOfControlAction: req.OutOfControlAction, + ExitWaylineWhenRcLost: req.ExitWaylineWhenRcLost, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + Remark: req.Remark, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sManageTask) Delete(ctx context.Context, ids int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ManageTask.Ctx(ctx).Unscoped().Delete(dao.ManageTask.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/manageTaskCron/manage_task_cron.go b/internal/app/system/logic/manageTaskCron/manage_task_cron.go new file mode 100644 index 0000000..440334c --- /dev/null +++ b/internal/app/system/logic/manageTaskCron/manage_task_cron.go @@ -0,0 +1,164 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-06-04 14:33:05 +// 生成路径: internal/app/system/logic/manage_task_cron.go +// 生成人:gfast +// desc:航线任务定时飞行 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/tiger1103/gfast/v3/task" +) + +func init() { + service.RegisterManageTaskCron(New()) +} + +func New() *sManageTaskCron { + return &sManageTaskCron{} +} + +type sManageTaskCron struct{} + +func (s *sManageTaskCron) List(ctx context.Context, req *system.ManageTaskCronSearchReq) (listRes *system.ManageTaskCronSearchRes, err error) { + listRes = new(system.ManageTaskCronSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.ManageTaskCron.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.ManageTaskCron.Columns().Id+" = ?", req.Id) + } + if req.MqClientId != "" { + m = m.Where(dao.ManageTaskCron.Columns().MqClientId+" = ?", req.MqClientId) + } + if req.TaskId != "" { + m = m.Where(dao.ManageTaskCron.Columns().TaskId+" = ?", gconv.Int64(req.TaskId)) + } + if req.Cron != "" { + m = m.Where(dao.ManageTaskCron.Columns().Cron+" = ?", req.Cron) + } + if req.CronId != "" { + m = m.Where(dao.ManageTaskCron.Columns().CronId+" = ?", gconv.Int(req.CronId)) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.ManageTaskCronInfoRes + err = m.Fields(system.ManageTaskCronSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.ManageTaskCronListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.ManageTaskCronListRes{ + Id: v.Id, + MqClientId: v.MqClientId, + TaskId: v.TaskId, + Cron: v.Cron, + CronId: v.CronId, + } + } + }) + return +} + +func (s *sManageTaskCron) GetById(ctx context.Context, sn string) (res *model.ManageTaskCronInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.ManageTaskCron.Ctx(ctx).WithAll().Where(dao.ManageTaskCron.Columns().MqClientId, sn).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sManageTaskCron) Add(ctx context.Context, req *system.ManageTaskCronAddReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + err = task.ValidateCronExprWithSeconds(req.Cron) + if err != nil { + liberr.ErrIsNil(ctx, err, "表达式出错!请联系管理员给您正确的表达式") + } + //1、停掉cron,并删除上一个sn数据 + var entity *model.ManageTaskCronInfoRes + err = dao.ManageTaskCron.Ctx(ctx).Where("mq_client_id", req.MqClientId).Scan(&entity) + liberr.ErrIsNil(ctx, err) + if entity != nil { + task.OffTimerFunc(entity.CronId) + } + _, err = dao.ManageTaskCron.Ctx(ctx).Where("mq_client_id", req.MqClientId).Delete() + liberr.ErrIsNil(ctx, err) + //2、然后新增一个,并重新调度 + _, err = dao.ManageTaskCron.Ctx(ctx).Insert(do.ManageTaskCron{ + MqClientId: req.MqClientId, + TaskId: req.TaskId, + Cron: req.Cron, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return err + }) + task.MidMissionFunc() + return +} + +func (s *sManageTaskCron) Edit(ctx context.Context, req *system.ManageTaskCronEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + err = task.ValidateCronExprWithSeconds(req.Cron) + if err != nil { + liberr.ErrIsNil(ctx, err, "表达式出错!请联系管理员给您正确的表达式") + } + //改变表达式 + _, err = dao.ManageTaskCron.Ctx(ctx).Where(dao.ManageTaskCron.Columns().MqClientId, req.MqClientId).Update(do.ManageTaskCron{ + Cron: req.Cron, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return err + }) + //重新调度cron + task.MidMissionFunc() + return +} + +func (s *sManageTaskCron) Delete(ctx context.Context, sns []string) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //关闭指定数据的cron + for i := range sns { + value, err := dao.ManageTaskCron.Ctx(ctx). + Where(dao.ManageTaskCron.Columns().MqClientId, sns[i]). + Fields(dao.ManageTaskCron.Columns().CronId).Value() + if err != nil { + liberr.ErrIsNil(ctx, err, "删除失败") + return + } else { + //删除定时任务 + task.OffTimerFunc(value.Int()) + } + } + //删除数据 + _, err = dao.ManageTaskCron.Ctx(ctx).Delete(dao.ManageTaskCron.Columns().MqClientId+" in (?)", sns) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/manageTaskRecord/manage_task_record.go b/internal/app/system/logic/manageTaskRecord/manage_task_record.go new file mode 100644 index 0000000..ae5b4e0 --- /dev/null +++ b/internal/app/system/logic/manageTaskRecord/manage_task_record.go @@ -0,0 +1,533 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-12-12 17:56:19 +// 生成路径: internal/app/system/logic/manage_task_record.go +// 生成人:gfast +// desc:航线任务下发-记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "encoding/json" + "errors" + "github.com/tiger1103/gfast/v3/api/webodm" + "github.com/tiger1103/gfast/v3/third/arithmetic/SpartaApi" + "os" + "path" + "path/filepath" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gctx" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/tiger1103/gfast/v3/third/plane/dj" + "github.com/tiger1103/gfast/v3/third/solaranalyzer" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterManageTaskRecord(New()) +} + +func New() *sManageTaskRecord { + return &sManageTaskRecord{} +} + +type sManageTaskRecord struct{} + +func (s *sManageTaskRecord) UpDataResource(ctx context.Context, req *system.UpDataResourceReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + rpath1 := coryCommon.ResourcePublicToFunc(req.WImg, 0) + rpath2 := coryCommon.ResourcePublicToFunc(req.WTif, 0) + liberr.ErrIsNil(ctx, err) + _, err = dao.ManageTaskRecord.Ctx(ctx).Where("id", req.Id).Update( + g.Map{ + "merge_project_id": req.MergeProjectId, + "merge_id": req.MergeId, + "w_img": rpath1, + "w_tif": rpath2, + }) + liberr.ErrIsNil(ctx, err, "资源上传失败") + + if req.Id == 753 { + // 将大图交给AI识别 + recognizeRequest := SpartaApi.RecognizeReq{ + CapUrl: coryCommon.GlobalPath + rpath1, + RecType: SpartaApi.UAV_MATRIX, + Async: "False", + CallBackUrl: "", + AreaHigh: "", + } + + recognizeResult, _, recognizeErr := SpartaApi.CommonAlgorithmTwoUav(ctx, &recognizeRequest) + + if recognizeErr != nil { + // 删除webdom资源 + webodm.DelUuidFunc(req.MergeProjectId, req.MergeId) + // 删除tif、大图合并 + img := coryCommon.GetCWD() + coryCommon.FileToFunc(req.WImg, 2) + os.Remove(img) + tif := coryCommon.GetCWD() + coryCommon.FileToFunc(req.WTif, 2) + os.Remove(tif) + // 获取飞机回传下载的资源的目录,进行数据删除(下载到本地的资源) + value, _ := dao.ManageTaskRecord.Ctx(ctx).Where("id", req.Id).Fields("flight_id").Value() + sql := `select + SUBSTRING_INDEX(object_key, '/', 3) as extracted_part + from + manage_task_record_resource + where + flight_id = ` + "'" + value.String() + "'" + ` + limit 1` + if value, err := g.DB().GetValue(ctx, sql); err != nil { + os.RemoveAll(coryCommon.Uav + value.String()) + } + // 清空数据 + _, err = dao.ManageTaskRecord.Ctx(ctx).Where("id", req.Id).Update( + g.Map{ + "is_resource_ready": 0, + "merge_project_id": nil, + "merge_id": nil, + "w_img": nil, + "w_tif": nil, + }) + if err != nil { + liberr.ErrIsNil(ctx, err, "ai算法") + return + } + } + liberr.ErrIsNil(ctx, recognizeErr) + + // 将结果转换为 JSON + recognizeResultJSON, jsonErr := json.Marshal(recognizeResult) + liberr.ErrIsNil(ctx, jsonErr) + + // TIF 文件路径 + tifFileName := filepath.Base(req.WTif) + tifFilePath := path.Join("resource/public/tif", tifFileName) + + solaranalyzer.ParseAIResul2(string(recognizeResultJSON)). + ToGeoPoints(tifFilePath).Run(req.ProjectId, int(req.Id)) + } + + }) + return +} + +func (s *sManageTaskRecord) GetAiResult(ctx context.Context, req *system.GetAiResultReq) (*system.GetAiResultRes, error) { + listres := new(system.GetAiResultRes) + + // SELECT pv.name, qf.name AS qf_name, sp.project_name AS sp_name + // FROM pv_module pv + // JOIN manage_task_result mtr ON pv.id = mtr.pv_id + // JOIN qianqi_fangzhen qf ON pv.fangzhen_id = qf.id + // JOIN sub_project sp ON pv.sub_projectid = sp.id + // WHERE mtr.task_id = 1 AND pv.type = 15 + // ORDER BY qf_name; + + // 1、根据任务ID获取AI识别结果 + m := dao.ManageTaskResult.Ctx(ctx).As("mtr"). + Fields("mtr.id, pv.name, qf.name AS qf_name, sp.project_name AS sp_name,pv.type"). + LeftJoin("pv_module pv", "pv.id = mtr.pv_id"). + LeftJoin("qianqi_fangzhen qf", "pv.fangzhen_id = qf.id"). + LeftJoin("sub_project sp", "pv.sub_projectid = sp.id"). + Where("mtr.task_id", req.Id). + Where("pv.type", req.Type). + Order("qf_name") + + arr, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取AI识别结果失败") + + listres.Total = len(arr) + if req.PageNum == 0 { + req.PageNum = 1 + } + listres.CurrentPage = req.PageNum + + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + + err = m.Page(req.PageNum, req.PageSize).Scan(&listres.List) + liberr.ErrIsNil(ctx, err, "获取AI识别结果失败") + + return listres, nil +} + +// ConfirmAiResult 提交 AI 识别结果 +func (s *sManageTaskRecord) ConfirmAiResult(ctx context.Context, req *system.ConfirmAiResultReq) error { + taskID := req.TaskId + return solaranalyzer.UpdateTableData(taskID) +} + +func getWorkStatusJSON(ctx context.Context, projectID string) (string, error) { + // 1、根据项目ID获取子项目 + subProject := g.Model("sub_project").Fields("id").Where("project_id", projectID) + + workStatusList := []entity.PvModule{} + if err := dao.PvModule.Ctx(ctx).WhereIn(dao.PvModule.Columns().SubProjectid, subProject). + WhereNot(dao.PvModule.Columns().Status, 2). + Where(dao.PvModule.Columns().Type, 15).Scan(&workStatusList); err != nil { + return "", err + } + + workStatusJSON, err := json.Marshal(workStatusList) + if err != nil { + return "", err + } + + return string(workStatusJSON), nil +} + +func (s *sManageTaskRecord) FlighttaskResourceGetFunc(ctx context.Context, req *system.ManageTaskRecordDeleteReq) (err error) { + //err = g.Try(ctx, func(ctx context.Context) { + // for _, id := range req.Ids { + // var mtr *model.ManageTaskRecordInfoRes + // dao.ManageTaskRecord.Ctx(ctx).WherePri(id).Scan(&mtr) + // err, reply := mqtt.Flighttask_undo(mtr.MqClientId, strings.Split(mtr.FlightId, ",")) + // liberr.ErrIsNil(ctx, err, "取消任务失败") + // if reply.Data.Result > 0 { + // err = mqtt.Geterror(reply.Data.Result) + // liberr.ErrIsNil(ctx, err) + // return + // } + // } + // _, err = dao.ManageTaskRecord.Ctx(ctx).Delete(dao.ManageTaskRecord.Columns().Id+" in (?)", req.Ids) + // liberr.ErrIsNil(ctx, err, "删除失败") + //}) + return +} + +func (s *sManageTaskRecord) List(ctx context.Context, req *system.ManageTaskRecordSearchReq) (listRes *system.ManageTaskRecordSearchRes, err error) { + listRes = new(system.ManageTaskRecordSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.ManageTaskRecord.Ctx(ctx).WithAll().As("a"). + LeftJoin("manage_task", "b", "a.task_id = b.id"). + Fields("a.*,b.air_line as airLine") + if req.ProjectId != "" { + m = m.Where("a."+dao.ManageTaskRecord.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.IsVoluntarily != "" { + m = m.Where("a."+dao.ManageTaskRecord.Columns().IsVoluntarily+" = ?", req.IsVoluntarily) + } + if req.MqClientId != "" { + m = m.Where("a."+dao.ManageTaskRecord.Columns().MqClientId+" = ?", req.MqClientId) + } + if req.TaskType != "" { + m = m.Where("a."+dao.ManageTaskRecord.Columns().TaskType, req.TaskType) + } + // 创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where("a."+dao.ManageTaskRecord.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.ManageTaskRecord.Columns().CreatedAt+" >=? AND "+"a."+dao.ManageTaskRecord.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + arr, err := m.Array() + listRes.Total = len(arr) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.ManageTaskRecordInfoRes + err = m.Page(req.PageNum, req.PageSize).Order("a." + order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.PcListOfRoutesRes, len(res)) + for k, v := range res { + // 实际回传数量 + count, countErr := dao.ManageTaskRecordResource.Ctx(ctx).Where("flight_id", v.FlightId).Count() + liberr.ErrIsNil(ctx, countErr) + + /** + 按钮显示与隐藏 + */ + var a []int + // 1、执行任务时间为null,那么只显示【执行任务1】【删除任务6】 + if v.ExecuteTheTask == 0 { + a = []int{1, 6} + } + // 2、执行任务时间不为null,那么显示【航线暂停2】【恢复航线3】【一键返航4】 + if v.ExecuteTheTask != 0 { + if v.RouteId != 65535 { + a = []int{4} + } + if v.IsSuspend == "0" || v.IsSuspend == "" { + a = append(a, 2) + } else if v.IsSuspend == "1" { + a = append(a, 3) + } + } + // 3、航线完成,那么显示【断点续飞5】【删除任务6】--------》如果断点没有中断原因就不显示断点续飞 + if v.Accomplish > 0 { + a = []int{6} + if v.InterruptCause != 0 { + a = append(a, 5) + } + } else if v.RouteId == 65535 { + a = []int{6} + } + + // 获取当前航线的航点,然后*当前飞机的 + listRes.List[k] = &model.PcListOfRoutesRes{ + Id: v.Id, + TaskId: v.TaskId, + FlightId: v.FlightId, + ExecuteTheTask: v.ExecuteTheTask, + Accomplish: v.Accomplish, + TaskName: v.TaskName, + AirLine: v.AirLine, + Remark: v.Remark, + IsResourceReady: v.IsResourceReady, + IsVoluntarily: v.IsVoluntarily, + EstimatedQuantity: v.Waypoint, + ActualReturn: count, + IsButton: a, + InterruptCause: v.InterruptCause, + + // InterruptCauseCode: handleErrorCode(v.InterruptCause), + MergeProjectId: v.MergeProjectId, + MergeId: v.MergeId, + WImg: coryCommon.ResourcePublicToFunc(v.WImg, 0), + WTif: coryCommon.ResourcePublicToFunc(v.WTif, 0), + } + } + }) + return +} + +func (s *sManageTaskRecord) GetById(ctx context.Context, id int64) (res *model.ManageTaskRecordInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.ManageTaskRecord.Ctx(ctx).WithAll().Where(dao.ManageTaskRecord.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +// GetManageAirlineFile 获取航线文件及md5加密 +func GetManageAirlineFile(flightId string) (res *dj.FileEntity, err error) { + dao.ManageTaskRecord.Ctx(gctx.New()).As("a"). + LeftJoin("manage_task", "b", "b.id = a.task_id"). + LeftJoin("manage_airline", "c", "c.id = b.air_line"). + Where("a.flight_id", flightId). + Fields(" c.file_path as url,c.fingerprint"). + Scan(&res) + res.Url = coryCommon.GlobalPath + res.Url + return +} + +// GetTheTaskDataBasedOnTheTaskId 根据任务id得到任务数据,然后根据任务数据得到航线信息和飞机摄像头信息 +func GetTheTaskDataBasedOnTheTaskId(ctx context.Context, task int64) (number int, err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 1、根据任务id得到任务数据 + var entity *model.ManageTaskRecordInfoRes + dao.ManageTask.Ctx(gctx.New()).Ctx(ctx).WherePri(task).Fields(dao.ManageTask.Columns().MqClientId + "," + dao.ManageTask.Columns().AirLine).Scan(&entity) + if entity == nil { + return + } + // 2、获取航线的航点个数 + var hd []model.PositionsEntity + value, err := dao.ManageAirline.Ctx(ctx).WherePri(entity.AirLine).Fields("positions").Value() + if err != nil { + err = errors.New("获取航点失败!") + liberr.ErrIsNil(ctx, err) + return + } + err = json.Unmarshal(value.Bytes(), &hd) + liberr.ErrIsNil(ctx, err) + // 3、获取到当前飞机的摄像头个数 + count, _ := g.DB().Model("manage_device_video").Ctx(ctx). + Where("gateway_sn", entity.MqClientId). + Where("type = 1").Count() + // 4、计算预估摄像头数量 + number = len(hd) * count + }) + return +} + +func handleErrorCode(code int) (str string) { + switch code { + case 0: + str = "无异常" + case 1: + str = "Mission ID 不存在,该航线任务未执行" + case 2: + str = "不常见错误,建议联系技术支持" + case 4: + str = "请求开始/恢复航线任务时,航线文件加载出错,请重新尝试上传文件开始或联系技术支持" + case 5: + str = "请求查询断点信息时,查询断点文件失败。请求恢复航线任务时,解析断点类型失败" + case 6: + str = "请求开始/结束航线任务时,cmd 参数有误,协议请求的指令有误。请求恢复航线任务时,解析断点类型失败" + case 7: + str = "请求开始/恢复航线任务时,解析 wpmz 文件超时,请重试" + case 257: + str = "航线已经开始,不能再次开始" + case 258: + str = "此状态下无法中断航线,只允许在航线执行状态时暂停航线" + case 259: + str = "航线未开始,不能结束航线" + case 261: + str = "飞行任务冲突,无法获取飞行器控制权,不允许在降落和返航中开始航线" + case 262: + str = "该状态下无法恢复航线,只允许在航线暂停状态时恢复航线" + case 513: + str = "飞行器超过限高高度" + case 514: + str = "飞行器超过限远距离" + case 516: + str = "飞行器触发限低" + case 517: + str = "飞行器触发避障" + case 518: + str = "RTK 信号差" + case 519: + str = "接近禁飞区边界" + case 521: + str = "超过机场限飞区限高" + case 522: + str = "航线请求起飞失败" + case 523: + str = "起飞任务执行失败" + case 524: + str = "请求航线任务失败" + case 526: + str = "请求航线 RTK 收敛任务失败" + case 527: + str = "航线 RTK 收敛任务运行失败" + case 528: + str = "接近用户自定义飞行区边界" + case 769: + str = "GPS 信号弱" + case 770: + str = "遥控器档位不在 N 档,无法开始任务" + case 771: + str = "返航点未刷新" + case 772: + str = "当前电量过低无法开始任务" + case 773: + str = "低电量返航导致航线中断" + case 775: + str = "遥控器与飞行器失联" + case 778: + str = "飞行器在地面起桨,不允许开始航线" + case 779: + str = "实时仿地过程中,视觉状态异常(如过亮,过暗,两侧亮度不一致)" + case 780: + str = "实时仿地用户设置的仿地高度不合法(大于 200 m 或者小于 30 m)" + case 781: + str = "实时仿地过程中全局地图计算出错" + case 784: + str = "大风返航导致航线中断" + case 1281: + str = "用户退出" + case 1282: + str = "用户中断" + case 1283: + str = "用户触发返航" + case 1539: + str = "开始信息(航点 index 或者 progress)错误" + case 1540: + str = "使用不支持的坐标系" + case 1541: + str = "使用不支持的高度模式" + case 1542: + str = "使用不支持的过渡航线模式" + case 1543: + str = "使用不支持的 yaw 模式" + case 1544: + str = "使用不支持的 yaw 方向调转模式" + case 1545: + str = "使用不支持的航点类型" + case 1546: + str = "首尾点不能使用协调转弯类型" + case 1547: + str = "航线全局速度超过合理范围" + case 1548: + str = "航点数量异常" + case 1549: + str = "经纬度数据异常" + case 1550: + str = "转弯截距异常" + case 1551: + str = "航段最大速度超过合理范围" + case 1552: + str = "航段目标速度超过合理范围" + case 1553: + str = "航点 yaw 角度超过合理范围" + case 1555: + str = "断点续飞的 mission_id 输入错误" + case 1556: + str = "断点续飞的 progress 信息输入错误" + case 1557: + str = "断点续飞的任务状态异常" + case 1558: + str = "断点续飞的航点 index 信息输入错误" + case 1559: + str = "断点续飞的经纬度信息输入错误" + case 1560: + str = "断点续飞的航点 yaw 输入错误" + case 1561: + str = "断点续飞的标志位设置错误" + case 1563: + str = "航线生成失败" + case 1564: + str = "航线运行失败" + case 1565: + str = "航线避障紧急刹停" + case 1588: + str = "无法识别的动作类型" + case 1595: + str = "同一动作组内动作 ID 不能重复" + case 1598: + str = "动作 ID 值不能为 65535" + case 1602: + str = "动作组数量超过合理范围" + case 1603: + str = "动作组生效范围错误" + case 1606: + str = "断点续飞中动作 index 超过合理范围" + case 1608: + str = "断点信息中触发器运行结果异常" + case 1609: + str = "断点续飞中动作组 ID 信息不能重复" + case 1610: + str = "断点续飞中动作组位置不能重复" + case 1611: + str = "断点续飞中动作组位置超过合理范围" + case 1612: + str = "续飞中动作 ID 不在断点信息中" + case 1613: + str = "续飞中不能修改动作状态为中断" + case 1614: + str = "断点信息错误导致续飞失败" + case 1634: + str = "无法识别的动作类型" + case 1649: + str = "无法识别的触发器类型" + case 65534: + str = "未知错误" + case 65535: + str = "未知错误" + default: + str = "未定义的错误码" + } + return +} diff --git a/internal/app/system/logic/manageTaskRecordResource/manage_task_record_resource.go b/internal/app/system/logic/manageTaskRecordResource/manage_task_record_resource.go new file mode 100644 index 0000000..8f41093 --- /dev/null +++ b/internal/app/system/logic/manageTaskRecordResource/manage_task_record_resource.go @@ -0,0 +1,327 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-05-30 17:07:01 +// 生成路径: internal/app/system/logic/manage_task_record_resource.go +// 生成人:gfast +// desc:下发记录回传的媒体文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + "github.com/minio/minio-go/v7" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/tiger1103/gfast/v3/third/plane/dj" + "strings" + "sync" + "time" +) + +func init() { + service.RegisterManageTaskRecordResource(New()) +} + +func New() *sManageTaskRecordResource { + return &sManageTaskRecordResource{} +} + +const UavRedisKey = "uav:flightId" + +type sManageTaskRecordResource struct{} + +func (s *sManageTaskRecordResource) List(ctx context.Context, req *system.ManageTaskRecordResourceSearchReq) (listRes *system.ManageTaskRecordResourceSearchRes, err error) { + listRes = new(system.ManageTaskRecordResourceSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.ManageTaskRecordResource.Ctx(ctx).WithAll() + if req.FlightId != "" { + m = m.Where(dao.ManageTaskRecordResource.Columns().FlightId+" = ?", req.FlightId) + } + //if req.FileName != "" { + // m = m.Where(dao.ManageTaskRecordResource.Columns().FileName+" like ?", "%"+req.FileName+"%") + //} + //if req.ObjectKey != "" { + // m = m.Where(dao.ManageTaskRecordResource.Columns().ObjectKey+" = ?", req.ObjectKey) + //} + //if req.Path != "" { + // m = m.Where(dao.ManageTaskRecordResource.Columns().Path+" = ?", req.Path) + //} + //if req.DroneModelKey != "" { + // m = m.Where(dao.ManageTaskRecordResource.Columns().DroneModelKey+" = ?", req.DroneModelKey) + //} + //if req.PayloadModelKey != "" { + // m = m.Where(dao.ManageTaskRecordResource.Columns().PayloadModelKey+" = ?", req.PayloadModelKey) + //} + //if req.CreateTime != "" { + // m = m.Where(dao.ManageTaskRecordResource.Columns().CreateTime+" = ?", gconv.Time(req.CreateTime)) + //} + //if req.ShootPosition != "" { + // m = m.Where(dao.ManageTaskRecordResource.Columns().ShootPosition+" = ?", req.ShootPosition) + //} + //if req.Lat != "" { + // m = m.Where(dao.ManageTaskRecordResource.Columns().Lat+" = ?", req.Lat) + //} + //if req.Lng != "" { + // m = m.Where(dao.ManageTaskRecordResource.Columns().Lng+" = ?", req.Lng) + //} + //if req.Img != "" { + // m = m.Where(dao.ManageTaskRecordResource.Columns().Img+" = ?", req.Img) + //} + //if req.ImgSize != "" { + // m = m.Where(dao.ManageTaskRecordResource.Columns().ImgSize+" = ?", req.ImgSize) + //} + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "flight_id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.ManageTaskRecordResourceInfoRes + err = m.Fields(system.ManageTaskRecordResourceSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.ManageTaskRecordResourceListRes, len(res)) + client, cerr := dj.PublicMinioClient() + liberr.ErrIsNil(ctx, cerr) + for k, v := range res { + listRes.List[k] = &model.ManageTaskRecordResourceListRes{ + FlightId: v.FlightId, + FileName: v.FileName, + ObjectKey: v.ObjectKey, + Path: v.Path, + DroneModelKey: v.DroneModelKey, + PayloadModelKey: v.PayloadModelKey, + AbsoluteAltitude: v.AbsoluteAltitude, + RelativeAltitude: v.RelativeAltitude, + CreateTime: v.CreateTime, + ShootPosition: v.ShootPosition, + Lat: v.Lat, + Lng: v.Lng, + Img: v.Img, + Online: dj.GenerateAnOnlineScopedUrlBasedOnTheObject(ctx, client, dj.BucketName, v.ObjectKey, 3*24*time.Hour), + } + } + }) + return +} + +func (s *sManageTaskRecordResource) ObtainResourcesAccordingToFlightId(ctx context.Context, flightId string) (listRes *system.ObtainResourcesAccordingToFlightIdRes, err error) { + listRes = new(system.ObtainResourcesAccordingToFlightIdRes) + var str []string + err = g.Try(ctx, func(ctx context.Context) { + //默认第二代机场 + m := dao.ManageTaskRecordResource.Ctx(ctx).WithAll() + if flightId != "" { + m = m.Where(dao.ManageTaskRecordResource.Columns().FlightId+" = ?", flightId) + } + order := "flight_id desc" + var res []*model.ManageTaskRecordResourceInfoRes + //默认第二代机场 + err = m.Where("file_name like ?", "%W.jpeg").Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + //三代机场的M4TD飞机 + if len(res) == 0 { + err = m.Where("file_name like ?", "%V.jpeg").Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + } + fmt.Println("1获取到的结果:", len(res)) + split := strings.Split(coryCommon.Uav, "/") + fmt.Println("2获取到的结果:", split) + for _, v := range res { + str = append(str, coryCommon.GlobalFile+"/"+split[len(split)-2]+"/"+v.ObjectKey) + fmt.Println("拼接后的字符串:", coryCommon.GlobalFile+"/"+split[len(split)-2]+"/"+v.ObjectKey) + } + listRes.List = str + }) + return +} + +func (s *sManageTaskRecordResource) GetByFlightId(ctx context.Context, flightId string) (res *model.ManageTaskRecordResourceInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.ManageTaskRecordResource.Ctx(ctx).WithAll().Where(dao.ManageTaskRecordResource.Columns().FlightId, flightId).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sManageTaskRecordResource) Add(ctx context.Context, req *system.ManageTaskRecordResourceAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ManageTaskRecordResource.Ctx(ctx).Insert(do.ManageTaskRecordResource{ + FlightId: req.FlightId, + FileName: req.FileName, + ObjectKey: req.ObjectKey, + Path: req.Path, + DroneModelKey: req.DroneModelKey, + PayloadModelKey: req.PayloadModelKey, + AbsoluteAltitude: req.AbsoluteAltitude, + RelativeAltitude: req.RelativeAltitude, + CreateTime: req.CreateTime, + ShootPosition: req.ShootPosition, + Lat: req.Lat, + Lng: req.Lng, + Img: req.Img, + ImgSize: req.ImgSize, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sManageTaskRecordResource) Edit(ctx context.Context, req *system.ManageTaskRecordResourceEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ManageTaskRecordResource.Ctx(ctx).WherePri(req.FlightId).Update(do.ManageTaskRecordResource{ + FileName: req.FileName, + ObjectKey: req.ObjectKey, + Path: req.Path, + DroneModelKey: req.DroneModelKey, + PayloadModelKey: req.PayloadModelKey, + AbsoluteAltitude: req.AbsoluteAltitude, + RelativeAltitude: req.RelativeAltitude, + CreateTime: req.CreateTime, + ShootPosition: req.ShootPosition, + Lat: req.Lat, + Lng: req.Lng, + Img: req.Img, + ImgSize: req.ImgSize, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sManageTaskRecordResource) Delete(ctx context.Context, flightIds []string) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ManageTaskRecordResource.Ctx(ctx).Delete(dao.ManageTaskRecordResource.Columns().FlightId+" in (?)", flightIds) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +func (s *sManageTaskRecordResource) DownloadAccordingToMysqlFunc(ctx context.Context, FlightId string) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //0、如果已经下载过就允许再次下载了 + count, _ := dao.ManageTaskRecord.Ctx(ctx).Where("flight_id", FlightId).Where("is_resource_ready", "1").Count() + if count > 0 { + liberr.ErrIsNil(ctx, errors.New("已下载,不可重复下载!")) + return + } + //1、获取可操作的minio的对象 + var listEntity []*model.ManageTaskRecordResourceListRes + err := dao.ManageTaskRecordResource.Ctx(ctx).Where("flight_id", FlightId).Where("file_name like ?", "%W.jpeg").Scan(&listEntity) + if len(listEntity) == 0 { //三代机场的M4TD飞机 + err = dao.ManageTaskRecordResource.Ctx(ctx).Where("flight_id", FlightId).Where("file_name like ?", "%V.jpeg").Scan(&listEntity) + } + liberr.ErrIsNil(ctx, err, "执行失败!") + sumNumber := len(listEntity) + if sumNumber == 0 { + err = errors.New("没有可操作的对象!") + liberr.ErrIsNil(ctx, err) + return + } + //2、下载数据到本地 + p := coryCommon.GetCWD() + coryCommon.Uav + minioClient, err := dj.PublicMinioClient() + if err != nil { + return + } + for i, data := range listEntity { + err = minioClient.FGetObject(ctx, dj.BucketName, data.ObjectKey, p+data.ObjectKey, minio.GetObjectOptions{}) + if err != nil { + err = errors.New("下载minio资源失败!" + err.Error()) + liberr.ErrIsNil(ctx, err) + return + } + //3、获取总数,计算百分比,存储到redis + percentage, err := coryCommon.PercentageFunc(100, float64(sumNumber), float64(i+1)) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + g.Redis().Set(ctx, UavRedisKey+data.FlightId, percentage) + } + }) + return +} + +var mu sync.Mutex + +// StoresBackMediaFilesToTheDatabaseFunc 存储回传媒体文件到数据库 +func StoresBackMediaFilesToTheDatabaseFunc(ctx context.Context, entity *dj.FileUploadCallbackEntity) { + if entity == nil { + return + } + mu.Lock() + defer mu.Unlock() + //1、组装数据 + extension := entity.Data.File.Extension + metadata := entity.Data.File.Metadata + dateTime, err := gtime.StrToTime(metadata.CreateTime) + if err != nil { + fmt.Println("转换错误:", err) + return + } + name := entity.Data.File.Name + suffix := strings.Split(name, ".")[1] + // 判断后缀是否是jpeg,不是就跳过 + if suffix == "jpeg" { + dataInsert := do.ManageTaskRecordResource{ + FlightId: extension.FlightID, + FileName: name, + ObjectKey: entity.Data.File.ObjectKey, + Path: entity.Data.File.Path, + DroneModelKey: extension.DroneModelKey, + PayloadModelKey: extension.PayloadModelKey, + AbsoluteAltitude: metadata.AbsoluteAltitude, + RelativeAltitude: metadata.RelativeAltitude, + CreateTime: dateTime, + ShootPosition: metadata.ShootPosition, + Lat: metadata.ShootPosition.Latitude, + Lng: metadata.ShootPosition.Longitude, + //Img: metadata.Img, + } + //防止有重复数据进入 + count, _ := dao.ManageTaskRecordResource.Ctx(ctx). + Where(dao.ManageTaskRecordResource.Columns().FlightId, extension.FlightID). + Where(dao.ManageTaskRecordResource.Columns().FileName, entity.Data.File.Name).Count() + if count > 0 { + return + } + //2、初始化客户端 + client, err := dj.PublicMinioClient() + if err != nil { + fmt.Println("获取元数据错误:", err) + return + } + //3、获取对象元数据 + info, err := dj.StatObjectFunc(ctx, client, dj.BucketName, entity.Data.File.ObjectKey) + if err != nil { + fmt.Println("获取元数据错误:", err) + return + } + //4、插入数据 + dataInsert.ImgSize = info.Size + _, err = dao.ManageTaskRecordResource.Ctx(ctx).Insert(dataInsert) + if err != nil { + fmt.Println("插入数据失败:", err) + return + } + } +} diff --git a/internal/app/system/logic/manageTaskResult/manage_task_result.go b/internal/app/system/logic/manageTaskResult/manage_task_result.go new file mode 100644 index 0000000..f5372d9 --- /dev/null +++ b/internal/app/system/logic/manageTaskResult/manage_task_result.go @@ -0,0 +1,125 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-10-21 11:29:13 +// 生成路径: internal/app/system/logic/manage_task_result.go +// 生成人:gfast +// desc:AI识别到的数据 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/samber/lo" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterManageTaskResult(New()) +} + +func New() *sManageTaskResult { + return &sManageTaskResult{} +} + +type sManageTaskResult struct{} + +func (s *sManageTaskResult) List(ctx context.Context, req *system.ManageTaskResultSearchReq) (listRes *system.ManageTaskResultSearchRes, err error) { + listRes = new(system.ManageTaskResultSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.ManageTaskResult.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.ManageTaskResult.Columns().Id+" = ?", req.Id) + } + if req.TaskId != "" { + m = m.Where(dao.ManageTaskResult.Columns().TaskId+" = ?", gconv.Int(req.TaskId)) + } + if req.PvId != "" { + m = m.Where(dao.ManageTaskResult.Columns().PvId+" = ?", gconv.Int(req.PvId)) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.ManageTaskResult.Columns().CreatedAt+" >=? AND "+dao.ManageTaskResult.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.ManageTaskResultInfoRes + err = m.Fields(system.ManageTaskResultSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.ManageTaskResultListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.ManageTaskResultListRes{ + Id: v.Id, + TaskId: v.TaskId, + PvId: v.PvId, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sManageTaskResult) GetById(ctx context.Context, id uint) (res *model.ManageTaskResultInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.ManageTaskResult.Ctx(ctx).WithAll().Where(dao.ManageTaskResult.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sManageTaskResult) Add(ctx context.Context, req *system.ManageTaskResultAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + data := lo.Map(req.PvId, func(item int, _ int) entity.ManageTaskResult { + return entity.ManageTaskResult{ + TaskId: req.TaskId, + PvId: item, + } + }) + + _, err = dao.ManageTaskResult.Ctx(ctx).Data(data).Insert() + }) + + liberr.ErrIsNil(ctx, err, "添加失败") + + return +} + +func (s *sManageTaskResult) Edit(ctx context.Context, req *system.ManageTaskResultEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ManageTaskResult.Ctx(ctx).WherePri(req.Id).Update(do.ManageTaskResult{ + TaskId: req.TaskId, + PvId: req.PvId, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sManageTaskResult) Delete(ctx context.Context, ids []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ManageTaskResult.Ctx(ctx).Delete(dao.ManageTaskResult.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/manageWorkspace/manage_workspace.go b/internal/app/system/logic/manageWorkspace/manage_workspace.go new file mode 100644 index 0000000..e370781 --- /dev/null +++ b/internal/app/system/logic/manageWorkspace/manage_workspace.go @@ -0,0 +1,156 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-11-14 10:53:20 +// 生成路径: internal/app/system/logic/manage_workspace.go +// 生成人:gfast +// desc:工作空间 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/frame/g" + "github.com/google/uuid" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "strconv" +) + +func init() { + service.RegisterManageWorkspace(New()) +} + +func New() *sManageWorkspace { + return &sManageWorkspace{} +} + +type sManageWorkspace struct{} + +func (s *sManageWorkspace) List(ctx context.Context, req *system.ManageWorkspaceSearchReq) (listRes *system.ManageWorkspaceSearchRes, err error) { + listRes = new(system.ManageWorkspaceSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.ManageWorkspace.Ctx(ctx).WithAll() + + if req.ProjectId != "" { + m = m.Where(dao.ManageWorkspace.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.BindCode != "" { + m = m.Where(dao.ManageWorkspace.Columns().BindCode+" = ?", req.BindCode) + } + if req.WorkspaceName != "" { + m = m.Where(dao.ManageWorkspace.Columns().WorkspaceName+" like ?", "%"+req.WorkspaceName+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.ManageWorkspace.Columns().CreatedAt+" >=? AND "+dao.ManageWorkspace.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.ManageWorkspaceInfoRes + err = m.Fields(system.ManageWorkspaceSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.ManageWorkspaceListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.ManageWorkspaceListRes{ + Id: v.Id, + WorkspaceId: v.WorkspaceId, + WorkspaceName: v.WorkspaceName, + WorkspaceDesc: v.WorkspaceDesc, + PlatformName: v.PlatformName, + CreatedAt: v.CreatedAt, + BindCode: v.BindCode, + ProjectId: v.ProjectId, + } + } + }) + return +} + +func (s *sManageWorkspace) GetById(ctx context.Context, id uint64) (res *model.ManageWorkspaceInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.ManageWorkspace.Ctx(ctx).WithAll().Where(dao.ManageWorkspace.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sManageWorkspace) Add(ctx context.Context, req *system.ManageWorkspaceAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 生成UUID + result, err := generateUUID(strconv.FormatInt(req.ProjectId, 10) + req.BindCode) + if err != nil { + liberr.ErrIsNil(ctx, err, "UUID生成失败!") + return + } + _, err = dao.ManageWorkspace.Ctx(ctx).Insert(do.ManageWorkspace{ + WorkspaceId: result, + WorkspaceName: req.WorkspaceName, + WorkspaceDesc: req.WorkspaceDesc, + PlatformName: req.PlatformName, + BindCode: req.BindCode, + ProjectId: req.ProjectId, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sManageWorkspace) Edit(ctx context.Context, req *system.ManageWorkspaceEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ManageWorkspace.Ctx(ctx).WherePri(req.Id).Update(do.ManageWorkspace{ + //WorkspaceId: req.WorkspaceId, + WorkspaceName: req.WorkspaceName, + WorkspaceDesc: req.WorkspaceDesc, + PlatformName: req.PlatformName, + //BindCode: req.BindCode, + //ProjectId: req.ProjectId, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sManageWorkspace) Delete(ctx context.Context, ids []uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //先查询工作区下是否有关联的设备,有不允许直接删除 + count, err := dao.ManageDevice.Ctx(ctx).Where("workspace_id in (?)", ids).Count() + if count > 0 { + err = errors.New("当前操作不允许删除,有其他数据正在使用!") + liberr.ErrIsNil(ctx, err) + return + } + _, err = dao.ManageWorkspace.Ctx(ctx).Delete(dao.ManageWorkspace.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +func generateUUID(data string) (string, error) { + // 将给定的信息作为命名空间(namespace)来创建UUID + ns, err := uuid.NewUUID() + if err != nil { + return "", err + } + // 使用命名空间和数据生成UUID + u := uuid.NewSHA1(ns, []byte(data)) + // 将UUID转换为字符串 + return u.String(), nil +} diff --git a/internal/app/system/logic/masterSchedule/master_schedule.go b/internal/app/system/logic/masterSchedule/master_schedule.go new file mode 100644 index 0000000..c1e0ce8 --- /dev/null +++ b/internal/app/system/logic/masterSchedule/master_schedule.go @@ -0,0 +1,159 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-10-08 09:38:35 +// 生成路径: internal/app/system/logic/master_schedule.go +// 生成人:gfast +// desc:总进度计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "strings" +) + +func init() { + service.RegisterMasterSchedule(New()) +} + +func New() *sMasterSchedule { + return &sMasterSchedule{} +} + +type sMasterSchedule struct{} + +func (s *sMasterSchedule) List(ctx context.Context, req *system.MasterScheduleSearchReq) (listRes *system.MasterScheduleSearchRes, err error) { + listRes = new(system.MasterScheduleSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.MasterSchedule.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.MasterSchedule.Columns().Id+" = ?", req.Id) + } + if req.ProjectId != "" { + m = m.Where(dao.MasterSchedule.Columns().ProjectId+" = ?", gconv.Int(req.ProjectId)) + } + if req.Name != "" { + m = m.Where(dao.MasterSchedule.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.Start != "" { + m = m.Where(dao.MasterSchedule.Columns().Start+" = ?", req.Start) + } + if req.End != "" { + m = m.Where(dao.MasterSchedule.Columns().End+" = ?", req.End) + } + if req.Content != "" { + m = m.Where(dao.MasterSchedule.Columns().Content+" = ?", req.Content) + } + if req.CreateBy != "" { + m = m.Where(dao.MasterSchedule.Columns().CreateBy+" = ?", req.CreateBy) + } + if req.UpdateBy != "" { + m = m.Where(dao.MasterSchedule.Columns().UpdateBy+" = ?", req.UpdateBy) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.MasterSchedule.Columns().CreatedAt+" >=? AND "+dao.MasterSchedule.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.Sequence != "" { + m = m.Where(dao.MasterSchedule.Columns().Sequence+" = ?", gconv.Int(req.Sequence)) + } + + var res []*model.MasterScheduleInfoRes + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + if strings.EqualFold(req.IsPaging, "YES") { + err = m.Order(order).Scan(&res) + } else { + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + err = m.Fields(system.MasterScheduleSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + } + + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.MasterScheduleListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.MasterScheduleListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + Name: v.Name, + Start: v.Start, + End: v.End, + Content: v.Content, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + Sequence: v.Sequence, + } + } + }) + return +} + +func (s *sMasterSchedule) GetById(ctx context.Context, id int) (res *model.MasterScheduleInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.MasterSchedule.Ctx(ctx).WithAll().Where(dao.MasterSchedule.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sMasterSchedule) Add(ctx context.Context, req *system.MasterScheduleAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.MasterSchedule.Ctx(ctx).Insert(do.MasterSchedule{ + ProjectId: req.ProjectId, + Name: req.Name, + Start: req.Start, + End: req.End, + Content: req.Content, + CreateBy: req.CreateBy, + UpdateBy: req.UpdateBy, + Sequence: req.Sequence, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sMasterSchedule) Edit(ctx context.Context, req *system.MasterScheduleEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.MasterSchedule.Ctx(ctx).WherePri(req.Id).Update(do.MasterSchedule{ + ProjectId: req.ProjectId, + Name: req.Name, + Start: req.Start, + End: req.End, + Content: req.Content, + CreateBy: req.CreateBy, + UpdateBy: req.UpdateBy, + Sequence: req.Sequence, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sMasterSchedule) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.MasterSchedule.Ctx(ctx).Delete(dao.MasterSchedule.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/middleware/middleware.go b/internal/app/system/logic/middleware/middleware.go new file mode 100644 index 0000000..695c0f0 --- /dev/null +++ b/internal/app/system/logic/middleware/middleware.go @@ -0,0 +1,270 @@ +/* +* @desc:中间件 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/9/23 15:05 + */ + +package middleware + +import ( + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/os/gctx" + "github.com/gogf/gf/v2/text/gstr" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast-token/gftoken" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + commonService "github.com/tiger1103/gfast/v3/internal/app/common/service" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/libResponse" + "strings" +) + +func init() { + service.RegisterMiddleware(New()) +} + +func New() *sMiddleware { + return &sMiddleware{} +} + +type sMiddleware struct{} + +// Ctx 自定义上下文对象 +func (s *sMiddleware) Ctx(r *ghttp.Request) { + ctx := r.GetCtx() + // 初始化登录用户信息 + data, err := service.GfToken().ParseToken(r) + if err != nil { + // 执行下一步请求逻辑 + r.Middleware.Next() + } + if data != nil { + context := new(model.Context) + err = gconv.Struct(data.Data, &context.User) + if err != nil { + g.Log().Error(ctx, err) + // 执行下一步请求逻辑 + r.Middleware.Next() + } + service.Context().Init(r, context) + } + // 执行下一步请求逻辑 + r.Middleware.Next() +} + +// Auth 权限判断处理中间件 +func (s *sMiddleware) Auth(r *ghttp.Request) { + ctx := r.GetCtx() + //获取登陆用户id + adminId := service.Context().GetUserId(ctx) + accessParams := r.Get("accessParams").Strings() + accessParamsStr := "" + if len(accessParams) > 0 && accessParams[0] != "undefined" { + accessParamsStr = "?" + gstr.Join(accessParams, "&") + } + url := gstr.TrimLeft(r.Request.URL.Path, "/") + accessParamsStr + /*if r.Method != "GET" && adminId != 1 && url!="api/v1/system/login" { + libResponse.FailJson(true, r, "对不起!演示系统,不能删改数据!") + }*/ + //获取无需验证权限的用户id + tagSuperAdmin := false + service.SysUser().NotCheckAuthAdminIds(ctx).Iterator(func(v interface{}) bool { + if gconv.Uint64(v) == adminId { + tagSuperAdmin = true + return false + } + return true + }) + if tagSuperAdmin { + r.Middleware.Next() + //不要再往后面执行 + return + } + //获取地址对应的菜单id + menuList, err := service.SysAuthRule().GetMenuList(ctx) + if err != nil { + g.Log().Error(ctx, err) + libResponse.FailJson(true, r, "请求数据失败") + } + var menu *model.SysAuthRuleInfoRes + for _, m := range menuList { + ms := gstr.SubStr(m.Name, 0, gstr.Pos(m.Name, "?")) + if m.Name == url || ms == url { + menu = m + break + } + } + //只验证存在数据库中的规则 + if menu != nil { + //若是不登录能访问的接口则不判断权限 + excludePaths := g.Cfg().MustGet(ctx, "gfToken.excludePaths").Strings() + for _, p := range excludePaths { + if gstr.Equal(menu.Name, gstr.TrimLeft(p, "/")) { + r.Middleware.Next() + return + } + } + //若存在不需要验证的条件则跳过 + if gstr.Equal(menu.Condition, "nocheck") { + r.Middleware.Next() + return + } + menuId := menu.Id + //菜单没存数据库不验证权限 + if menuId != 0 { + //判断权限操作 + enforcer, err := commonService.CasbinEnforcer(ctx) + if err != nil { + g.Log().Error(ctx, err) + libResponse.FailJson(true, r, "获取权限失败") + } + hasAccess := false + hasAccess, err = enforcer.Enforce(fmt.Sprintf("%s%d", service.SysUser().GetCasBinUserPrefix(), adminId), gconv.String(menuId), "All") + if err != nil { + g.Log().Error(ctx, err) + libResponse.FailJson(true, r, "判断权限失败") + } + if !hasAccess { + libResponse.FailJson(true, r, "没有访问权限") + } + } + } else if menu == nil && accessParamsStr != "" { + libResponse.FailJson(true, r, "没有访问权限") + } + r.Middleware.Next() +} + +// Blacklist 黑名单 阻挡小程序的黑名单用户登录 +func (s *sMiddleware) Blacklist(r *ghttp.Request) { + ctx := gctx.New() + //1、判断是否是小程序请求来的数据 + userAgent := strings.ToLower(r.Header.Get("User-Agent")) + if strings.Contains(userAgent, "micromessenger") { + //2、解析token 拿到openid + var user *wxApplet.BusConstructionUserAddReq + datatoken, err := service.GfToken().ParseToken(r) + if err != nil { + libResponse.FailJson(true, r, "解析token错误!") + } + if datatoken != nil { + err = gconv.Struct(datatoken.Data, &user) + if err != nil { + libResponse.FailJson(true, r, "获取用户信息错误!") + } + } + //3、查询数据库黑名单 + count, err := dao.BusConstructionBlacklist.Ctx(ctx).Where("openid", user.Openid).Count() + if err != nil { + libResponse.FailJson(true, r, "系统错误,请联系管理员!") + } + if count > 0 { + gfToken := gftoken.NewGfToken() + token := gfToken.GetRequestToken(r) + service.GfToken().RemoveToken(ctx, token) + libResponse.FailJson(true, r, "登录异常,请联系管理员!") + } else { + //4、匹配黑名单用户 随后放行 + r.Middleware.Next() + } + } else { + r.Middleware.Next() + } +} + +var engineeringData = "/zm/api/v1/system/documentData/newFolder," + //新建文件夹 + "/zm/api/v1/system/documentData/add," + //导入 + "/zm/api/v1/system/documentData/edit" + //重命名 + "/zm/api/v1/system/documentData/compressedDownload" + //下载 + "/zm/api/v1/system/documentData/get" + //查看 + "/zm/api/v1/system/documentData/complaintBoxAdd" + //保存 + "/zm/api/v1/system/documentData/delete" + //删除 + "/zm/api/v1/system/documentData/onlineImport" + //模板批量导入 + "/zm/api/v1/system/documentData/onlineMobile" + //资料在线移动 + "/zm/api/v1/system/documentData/dataFileQuery" + //所有资料查询 + "/zm/api/v1/system/document/templateRecycleBin" + //模板回收站 + "/zm/api/v1/system/documentData/dataRecyclingStation" + //资料回收站 + "/zm/api/v1/system/documentData/uniFileDownload" //下载 + +// EngineeringDataPermission 工程资料权限校验(资料-回收站) +func (s *sMiddleware) EngineeringDataPermission(r *ghttp.Request) { + ctx := r.GetCtx() + userId := service.Context().GetUserId(ctx) + //0、把admin用户给排除掉 + if userId == 1 { + r.Middleware.Next() + return + } + projectId := r.Get("projectId").String() + //1、看看有哪些API需要调用权限 + path := r.Request.URL.Path + authorityJudgment := strings.Split(engineeringData, ",") + for _, pathApi := range authorityJudgment { + //2、根据用户id去数据库查询工程资料的权限是否开启(1有权 2无权) + if pathApi == path { + if projectId == "" { + libResponse.FailJson(true, r, "当前操作暂无项目id!") + } + sql := g.DB().Model("document_power"). + Where("sys_user_id", userId). + Where("project_id", projectId) + if strings.Contains(path, "/zm/api/v1/system/document/allList") || strings.Contains(path, "/zm/api/v1/system/documentData/allList") { + sql = sql.Where("type = 3") + } else if strings.Contains(path, "/zm/api/v1/system/documentData/") { + sql = sql.Where("type = 2") + } else { + libResponse.FailJson(true, r, "系统错误,请联系管理员!") + } + //3、判断具体是什么权限 + fetch := fieldFetch(path, authorityJudgment) + count, err := sql.Where(fetch, "1").Count() + if err != nil { + libResponse.FailJson(true, r, "系统错误,请联系管理员!") + } + if count > 0 { + r.Middleware.Next() + } else { + libResponse.FailJson(true, r, "当前操作暂无权限!") + } + } + } + r.Middleware.Next() +} + +// fieldFetch 根据数据匹配 返回需要查询的字段 +func fieldFetch(path string, authorityJudgment []string) string { + switch path { + case authorityJudgment[0]: + return "v1" + case authorityJudgment[1]: + return "v2" + case authorityJudgment[2]: + return "v3" + case authorityJudgment[3]: + return "v4" + case authorityJudgment[4]: + return "v5" + case authorityJudgment[5]: + return "v6" + case authorityJudgment[6]: + return "v7" + case authorityJudgment[7]: + return "v8" + case authorityJudgment[8]: + return "v9" + case authorityJudgment[9]: + return "v10" + case authorityJudgment[10]: + return "v11" + case authorityJudgment[11]: + return "v12" + case authorityJudgment[12]: + return "v4" + default: + return "" + } +} diff --git a/internal/app/system/logic/notificationRecipients/notification_recipients.go b/internal/app/system/logic/notificationRecipients/notification_recipients.go new file mode 100644 index 0000000..631c64b --- /dev/null +++ b/internal/app/system/logic/notificationRecipients/notification_recipients.go @@ -0,0 +1,128 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-04-11 16:58:12 +// 生成路径: internal/app/system/logic/notification_recipients.go +// 生成人:gfast +// desc:通知接收 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterNotificationRecipients(New()) +} + +func New() *sNotificationRecipients { + return &sNotificationRecipients{} +} + +type sNotificationRecipients struct{} + +func (s *sNotificationRecipients) List(ctx context.Context, req *system.NotificationRecipientsSearchReq) (listRes *system.NotificationRecipientsSearchRes, err error) { + listRes = new(system.NotificationRecipientsSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.NotificationRecipients.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.NotificationRecipients.Columns().Id+" = ?", req.Id) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.NotificationRecipients.Columns().CreatedAt+" >=? AND "+dao.NotificationRecipients.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.NotificationId != "" { + m = m.Where(dao.NotificationRecipients.Columns().NotificationId+" = ?", gconv.Int(req.NotificationId)) + } + if req.RecipientId != "" { + m = m.Where(dao.NotificationRecipients.Columns().RecipientId+" = ?", gconv.Int(req.RecipientId)) + } + if req.RecipientRole != "" { + m = m.Where(dao.NotificationRecipients.Columns().RecipientRole+" = ?", req.RecipientRole) + } + if req.NotificationStatus != "" { + m = m.Where(dao.NotificationRecipients.Columns().NotificationStatus+" = ?", gconv.Int(req.NotificationStatus)) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.NotificationRecipientsInfoRes + err = m.Fields(system.NotificationRecipientsSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.NotificationRecipientsListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.NotificationRecipientsListRes{ + Id: v.Id, + CreatedAt: v.CreatedAt, + NotificationId: v.NotificationId, + RecipientId: v.RecipientId, + RecipientRole: v.RecipientRole, + NotificationStatus: v.NotificationStatus, + } + } + }) + return +} + +func (s *sNotificationRecipients) GetById(ctx context.Context, id uint) (res *model.NotificationRecipientsInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.NotificationRecipients.Ctx(ctx).WithAll().Where(dao.NotificationRecipients.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sNotificationRecipients) Add(ctx context.Context, req *system.NotificationRecipientsAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.NotificationRecipients.Ctx(ctx).Insert(do.NotificationRecipients{ + NotificationId: req.NotificationId, + RecipientId: req.RecipientId, + RecipientRole: req.RecipientRole, + NotificationStatus: req.NotificationStatus, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sNotificationRecipients) Edit(ctx context.Context, req *system.NotificationRecipientsEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.NotificationRecipients.Ctx(ctx).WherePri(req.Id).Update(do.NotificationRecipients{ + NotificationId: req.NotificationId, + RecipientId: req.RecipientId, + RecipientRole: req.RecipientRole, + NotificationStatus: req.NotificationStatus, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sNotificationRecipients) Delete(ctx context.Context, ids []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.NotificationRecipients.Ctx(ctx).Delete(dao.NotificationRecipients.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/notifications/notifications.go b/internal/app/system/logic/notifications/notifications.go new file mode 100644 index 0000000..89516f3 --- /dev/null +++ b/internal/app/system/logic/notifications/notifications.go @@ -0,0 +1,180 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-04-11 16:56:36 +// 生成路径: internal/app/system/logic/notifications.go +// 生成人:gfast +// desc:通知信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/jinzhu/copier" + "github.com/samber/lo" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterNotifications(New()) +} + +func New() *sNotifications { + return &sNotifications{} +} + +type sNotifications struct{} + +func (s *sNotifications) List(ctx context.Context, req *system.NotificationsSearchReq) (listRes *system.NotificationsSearchRes, err error) { + listRes = new(system.NotificationsSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.Notifications.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.Notifications.Columns().Id+" = ?", req.Id) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.Notifications.Columns().CreatedAt+" >=? AND "+dao.Notifications.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.NotificationText != "" { + m = m.Where(dao.Notifications.Columns().NotificationText+" = ?", req.NotificationText) + } + + if req.Title != "" { + m = m.Where(dao.Notifications.Columns().Title+" = ?", req.Title) + } + + if req.Route != "" { + m = m.Where(dao.Notifications.Columns().Route+" = ?", req.Route) + } + if req.NotificationTime != "" { + m = m.Where(dao.Notifications.Columns().NotificationTime+" = ?", req.NotificationTime) + } + if req.Initiator != "" { + m = m.Where(dao.Notifications.Columns().Initiator+" = ?", gconv.Int(req.Initiator)) + } + if req.ProjectId != "" { + m = m.Where(dao.Notifications.Columns().ProjectId+" = ?", gconv.Int(req.ProjectId)) + } + if req.Type != "" { + m = m.Where(dao.Notifications.Columns().IsApp, gconv.Int(req.Type)) + } + + m = m.LeftJoin("sys_user AS initiator_user", "notifications.initiator = initiator_user.id"). + LeftJoin("notification_recipients AS nr", "notifications.id = nr.notification_id"). + LeftJoin("sys_user AS recipient_user", "nr.recipient_id = recipient_user.id"). + Where(dao.Notifications.Columns().IsApp, req.IsApp) + + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + + var res []*model.NotificationsInfoRes + err = m.Fields(`notifications.id,notifications.created_at, + notification_text, + title, + route, + notification_time, + initiator, + project_id, + positions, + initiator_user.user_nickname AS initiator_nickname, + GROUP_CONCAT(recipient_user.user_nickname) AS recipients_nickname`).Page(req.PageNum, req.PageSize).Order(order).Group("notifications.id").Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + + listRes.Total, err = m.CountColumn("DISTINCT notifications.id") + liberr.ErrIsNil(ctx, err, "获取总行数失败") + + listRes.List = make([]*model.NotificationsListRes, len(res)) + copier.Copy(&listRes.List, &res) + }) + return +} + +func (s *sNotifications) GetById(ctx context.Context, id uint) (res *model.NotificationsInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.Notifications.Ctx(ctx).WithAll().Where(dao.Notifications.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sNotifications) Add(ctx context.Context, req *system.NotificationsAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.Notifications.Ctx(ctx).Insert(do.Notifications{ + NotificationText: req.NotificationText, + Route: req.Route, + NotificationTime: req.NotificationTime, + Initiator: req.Initiator, + ProjectId: req.ProjectId, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sNotifications) Edit(ctx context.Context, req *system.NotificationsEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.Notifications.Ctx(ctx).WherePri(req.Id).Update(do.Notifications{ + Title: req.Title, + NotificationText: req.NotificationText, + Route: req.Route, + NotificationTime: req.NotificationTime, + Initiator: req.Initiator, + ProjectId: req.ProjectId, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + + // 修改在 sys_project_introduce 表中的数据 + subQuery := g.Model("notifications").Fields("introduce_id").Where("id", req.Id) + _, err = dao.SysProjectIntroduce.Ctx(ctx).Data(do.SysProjectIntroduce{ + Headline: req.Title, + RichText: req.NotificationText, + }).Where("id = ?", subQuery).Update() + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sNotifications) Delete(ctx context.Context, ids []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 获取对应的 IntroduceId + introduces := []entity.SysProjectIntroduce{} + err = dao.Notifications.Ctx(ctx).Fields("introduce_id").WhereIn("id", ids).Scan(&introduces) + liberr.ErrIsNil(ctx, err, "获取 IntroduceId 失败") + + introduceIDS := lo.FilterMap(introduces, func(item entity.SysProjectIntroduce, _ int) (int, bool) { + return int(item.IntroduceID), true + }) + + _, err = dao.Notifications.Ctx(ctx).Delete(dao.Notifications.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + + // 删除在 Notification_Recipients 表中的数据 + _, err = dao.NotificationRecipients.Ctx(ctx).Delete(dao.NotificationRecipients.Columns().NotificationId+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "Recipients 删除失败") + + // 删除在 sys_project_introduce 表中的数据 + _, err = dao.SysProjectIntroduce.Ctx(ctx).Delete(dao.Notifications.Columns().Id+" in (?)", introduceIDS) + liberr.ErrIsNil(ctx, err, "Introduce 删除失败") + }) + return +} diff --git a/internal/app/system/logic/personal/personal.go b/internal/app/system/logic/personal/personal.go new file mode 100644 index 0000000..cdb1882 --- /dev/null +++ b/internal/app/system/logic/personal/personal.go @@ -0,0 +1,96 @@ +/* +* @desc:xxxx功能描述 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/11/3 9:55 + */ + +package personal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/grand" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + service "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/libUtils" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterPersonal(New()) +} + +type sPersonal struct { +} + +func New() *sPersonal { + return &sPersonal{} +} + +func (s *sPersonal) GetPersonalInfo(ctx context.Context, req *system.PersonalInfoReq) (res *system.PersonalInfoRes, err error) { + res = new(system.PersonalInfoRes) + userId := service.Context().GetUserId(ctx) + res.User, err = service.SysUser().GetUserInfoById(ctx, userId) + var dept *entity.SysDept + dept, err = service.SysDept().GetByDeptId(ctx, res.User.DeptId) + res.DeptName = dept.DeptName + allRoles, err := service.SysRole().GetRoleList(ctx) + roles, err := service.SysUser().GetAdminRole(ctx, userId, allRoles) + name := make([]string, len(roles)) + roleIds := make([]uint, len(roles)) + for k, v := range roles { + name[k] = v.Name + roleIds[k] = v.Id + } + res.Roles = name + if err != nil { + return + } + return +} + +func (s *sPersonal) EditPersonal(ctx context.Context, req *system.PersonalEditReq) (user *model.LoginUserRes, err error) { + userId := service.Context().GetUserId(ctx) + err = service.SysUser().UserNameOrMobileExists(ctx, "", req.Mobile, int64(userId)) + if err != nil { + return + } + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysUser.Ctx(ctx).TX(tx).WherePri(userId).Update(do.SysUser{ + Mobile: req.Mobile, + UserNickname: req.Nickname, + Remark: req.Remark, + Sex: req.Sex, + UserEmail: req.UserEmail, + Describe: req.Describe, + Avatar: req.Avatar, + }) + liberr.ErrIsNil(ctx, err, "修改用户信息失败") + user, err = service.SysUser().GetUserById(ctx, userId) + liberr.ErrIsNil(ctx, err) + }) + return err + }) + return +} + +func (s *sPersonal) ResetPwdPersonal(ctx context.Context, req *system.PersonalResetPwdReq) (res *system.PersonalResetPwdRes, err error) { + userId := service.Context().GetUserId(ctx) + salt := grand.S(10) + password := libUtils.EncryptPassword(req.Password, salt) + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysUser.Ctx(ctx).WherePri(userId).Update(g.Map{ + dao.SysUser.Columns().UserSalt: salt, + dao.SysUser.Columns().UserPassword: password, + }) + liberr.ErrIsNil(ctx, err, "重置用户密码失败") + }) + return +} diff --git a/internal/app/system/logic/planDaily/plan_daily.go b/internal/app/system/logic/planDaily/plan_daily.go new file mode 100644 index 0000000..3e16af7 --- /dev/null +++ b/internal/app/system/logic/planDaily/plan_daily.go @@ -0,0 +1,145 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-09-26 14:31:07 +// 生成路径: internal/app/system/logic/plan_daily.go +// 生成人:gfast +// desc:日报 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterPlanDaily(New()) +} + +func New() *sPlanDaily { + return &sPlanDaily{} +} + +type sPlanDaily struct{} + +func (s *sPlanDaily) List(ctx context.Context, req *system.PlanDailySearchReq) (listRes *system.PlanDailySearchRes, err error) { + listRes = new(system.PlanDailySearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.PlanDaily.Ctx(ctx).WithAll() + if req.ProjectId != "" { + m = m.Where(dao.PlanDaily.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.SourceId != "" { + m = m.Where(dao.PlanDaily.Columns().SourceId+" = ?", req.SourceId) + } + if req.Name != "" { + m = m.Where(dao.PlanDaily.Columns().Name+" like ?", "%"+req.Name+"%") + } + //创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.PlanDaily.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.PlanDaily.Columns().CreatedAt+" >=? AND "+dao.PlanDaily.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.PlanDailyInfoRes + err = m.Fields(system.PlanDailySearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.PlanDailyListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.PlanDailyListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + SourceId: v.SourceId, + Name: v.Name, + SourceType: v.SourceType, + Cnt: v.Cnt, + DataTime: v.DataTime, + Status: v.Status, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sPlanDaily) GetById(ctx context.Context, id int64) (res *model.PlanDailyInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.PlanDaily.Ctx(ctx).WithAll().Where(dao.PlanDaily.Columns().Id, id).Scan(&res) + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.PlanDailyInfoRes) + res = &infoRes + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sPlanDaily) Add(ctx context.Context, req *system.PlanDailyAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.PlanDaily.Ctx(ctx).Insert(do.PlanDaily{ + ProjectId: req.ProjectId, + SourceId: req.SourceId, + Name: req.Name, + SourceType: req.SourceType, + Cnt: req.Cnt, + DataTime: req.DataTime, + Status: req.Status, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sPlanDaily) Edit(ctx context.Context, req *system.PlanDailyEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.PlanDaily.Ctx(ctx).WherePri(req.Id).Update(do.PlanDaily{ + ProjectId: req.ProjectId, + SourceId: req.SourceId, + Name: req.Name, + SourceType: req.SourceType, + Cnt: req.Cnt, + DataTime: req.DataTime, + Status: req.Status, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sPlanDaily) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.PlanDaily.Ctx(ctx).Delete(dao.PlanDaily.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/planWeek/plan_week.go b/internal/app/system/logic/planWeek/plan_week.go new file mode 100644 index 0000000..aa05278 --- /dev/null +++ b/internal/app/system/logic/planWeek/plan_week.go @@ -0,0 +1,762 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-04 17:26:59 +// 生成路径: internal/app/system/logic/plan_week.go +// 生成人:gfast +// desc:周计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "github.com/gogf/gf/v2/crypto/gmd5" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + planWeekRealityLogic "github.com/tiger1103/gfast/v3/internal/app/system/logic/planWeekReality" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + wxDao "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" + "golang.org/x/exp/constraints" + "math/big" + "reflect" + "sort" + "strconv" + "strings" + "time" +) + +func init() { + service.RegisterPlanWeek(New()) +} + +func New() *sPlanWeek { + return &sPlanWeek{} +} + +type sPlanWeek struct{} + +func (s *sPlanWeek) WeeklyAndMonthlyReportDataGenerationFunc(ctx context.Context, req *system.WeeklyAndMonthlyReportDataGenerationReq) (res *system.WeeklyAndMonthlyReportDataGenerationRes, err error) { + res = new(system.WeeklyAndMonthlyReportDataGenerationRes) + err = g.Try(ctx, func(ctx context.Context) { + //1、工程进度查询限制 + arrCount := strings.Split(model.PlanWeekNameStr, ", ") + arrCountStr := "" + for i, item := range arrCount { + arrCountStr += `"` + item + `"` + if i < len(arrCount)-1 { + arrCountStr += ", " + } + } + + var powlr []*model.ProgressOfWorksListRes + if req.Type == "1" { //周报 + for _, data := range req.PlanId { + var pwir *model.PlanWeekInfoRes + err = dao.PlanWeek.Ctx(ctx).Fields("start,end,plan_name").Where("plan_id", data).Scan(&pwir) + rt := model.DataAssemblyRequest{ + ArrCount: arrCount, + ArrCountStr: arrCountStr, + PlanId: data, + ProjectId: req.ProjectId, + TypeStr: req.Type, + Start: pwir.Start, + End: pwir.End, + WeekName: pwir.PlanName, + } + pwlrTwo, err := DataAssemblyFunc(ctx, &rt) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + //这里很多周报,每循环一次存放一次周报 + powlr = append(powlr, pwlrTwo) + } + } else { //月报 + maxStart := "" + minEnd := "" + for _, data := range req.PlanId { + var pwir *model.PlanWeekInfoRes + err := dao.PlanWeek.Ctx(ctx).Fields("start, end, plan_name").Where("plan_id", data).Scan(&pwir) + if err != nil { + // 处理错误 + } + // 判断maxStart是否为空或者当前start是否比maxStart大 + if maxStart == "" || pwir.Start > maxStart { + maxStart = pwir.Start + } + // 判断minEnd是否为空或者当前end是否比minEnd小 + if minEnd == "" || pwir.End < minEnd { + minEnd = pwir.End + } + } + planids := "" + for i, item := range req.PlanId { + planids += `"` + item + `"` + if i < len(req.PlanId)-1 { + planids += ", " + } + } + rt := model.DataAssemblyRequest{ + ArrCount: arrCount, + ArrCountStr: arrCountStr, + ProjectId: req.ProjectId, + TypeStr: req.Type, + Start: maxStart, + End: minEnd, + PlanIds: planids, + } + pwlrTwo, err := DataAssemblyFunc(ctx, &rt) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + //这里很多周报,每循环一次存放一次周报 + powlr = append(powlr, pwlrTwo) + } + //把所有周报返回回去 + res.List = powlr + liberr.ErrIsNil(ctx, err, "获取数据失败") + }) + return +} + +// DataAssemblyFunc 【WeeklyAndMonthlyReportDataGenerationFunc】 数据组装 +func DataAssemblyFunc(ctx context.Context, rt *model.DataAssemblyRequest) (pwlrTwo *model.ProgressOfWorksListRes, err error) { + g.Try(ctx, func(ctx context.Context) { + pwlrTwo = new(model.ProgressOfWorksListRes) + pwlrTwo.WeekName = rt.WeekName + /** + 零、word开头数据组装 + */ + var projectEntity *model.SysProjectInfoRes + dao.SysProject.Ctx(ctx).Where("id", rt.ProjectId).Fields("project_name,design_total").Scan(&projectEntity) + if projectEntity != nil { + pwlrTwo.ProjectName = projectEntity.ProjectName + } else { + err = errors.New("项目不存在") + return + } + pwlrTwo.Logo = "/resource/font/zmlogo.jpg" + if rt.TypeStr == "1" { + pwlrTwo.WeekOrMonth = "EPC总承包项目" + "周报" + } else { + pwlrTwo.WeekOrMonth = "EPC总承包项目" + "月报" + } + pwlrTwo.WeekOrMonthTime = rt.Start + " ~ " + rt.End + pwlrTwo.TextOne = "中煤科工重庆设计研究院(集团)有限公司" + pwlrTwo.TextTwo = pwlrTwo.ProjectName + "EPC总承包项目部" + pwlrTwo.GeneratedTime = tool.New().GetFormattedDateTime(time.Now()) + if projectEntity.DesignTotal == 0 { + err = errors.New("请设置当前项目的设计总量") + liberr.ErrIsNil(ctx, err) + return + } + /** + 一、工程进度 + */ + rt.DesignTotal = projectEntity.DesignTotal + pwlrTwo.POWRList, err = progressOfWorks(ctx, rt) + /** + 二、人力情况 + */ + pwlrTwo.ManpowerText, err = manpowerSituation(ctx, rt.ProjectId, rt.Start, rt.End) + if err != nil { + err = errors.New("获取人力情况失败!") + liberr.ErrIsNil(ctx, err) + return + } + /** + 三、机械情况 + */ + pwlrTwo.MechanicalText, err = mechanicalEquipment(ctx, rt.ProjectId, rt.Start, rt.End) + if err != nil { + err = errors.New("获取机械设备失败!") + liberr.ErrIsNil(ctx, err) + return + } + /** + 四、材料使用情况 + */ + pwlrTwo.MIRList, err = MaterialCondition(ctx, rt.ProjectId, rt.Start, rt.End) + if err != nil { + err = errors.New("获取材料使用情况失败!") + liberr.ErrIsNil(ctx, err) + return + } + /** + 五、质量情况 + */ + pwlrTwo.Quality, err = QualitySituation(ctx, rt.ProjectId, rt.Start, rt.End) + if err != nil { + err = errors.New("获取质量情况失败!") + liberr.ErrIsNil(ctx, err) + return + } + /** + 六、现场巡检照片 + */ + pwlrTwo.Polling, err = FieldInspection(ctx, rt.ProjectId, rt.Start, rt.End) + if err != nil { + err = errors.New("获取现场巡检照片失败!") + liberr.ErrIsNil(ctx, err) + return + } + }) + return +} + +// progressOfWorks 【WeeklyAndMonthlyReportDataGenerationFunc】 一、工程进度 +func progressOfWorks(ctx context.Context, rt *model.DataAssemblyRequest) (pwr []*model.ProgressOfWorksRes, err error) { + //1、查询有哪些符合的数据,并且按照arrCount顺序排序 + sqlTwo := "" + if rt.TypeStr == "1" { + sqlTwo = fmt.Sprintf("SELECT source_type FROM plan_week WHERE plan_id = '%s' and source_type in (%s) GROUP BY source_type", rt.PlanId, rt.ArrCountStr) + } else { + sqlTwo = fmt.Sprintf("SELECT source_type FROM plan_week WHERE plan_id in (%s) and source_type in (%s) GROUP BY source_type", rt.PlanIds, rt.ArrCountStr) + } + str := "" + for i := range rt.ArrCount { + if i == 0 { + sqlTwo = sqlTwo + " ORDER BY CASE" + } + str = str + fmt.Sprintf(" WHEN source_type = '%s' THEN %d", rt.ArrCount[i], i+1) + if i == len(rt.ArrCount)-1 { + sqlTwo = sqlTwo + str + sqlTwo = sqlTwo + " END;" + } + } + queryTwo, err := g.DB().Query(ctx, sqlTwo) + if err != nil { + return nil, err + } + //2、根据array去查询数据 + for _, y := range queryTwo.Array() { + var pwrOne *model.ProgressOfWorksRes + sql := "" + if rt.TypeStr == "1" { + sql = fmt.Sprintf("SELECT (SELECT COUNT(1) FROM plan_week WHERE plan_id = '%s' and source_type = '%s' AND start >='%s' AND end <='%s') as planNum, (SELECT COUNT(1) FROM plan_week_reality WHERE plan_id = '%s' and source_type = '%s' AND start >='%s' AND end <='%s') as realityNum", + rt.PlanId, y, rt.Start, rt.End, + rt.PlanId, y, rt.Start, rt.End) + } else { + sql = fmt.Sprintf("SELECT (SELECT COUNT(1) FROM plan_week WHERE plan_id in (%s) and source_type = '%s' AND start >='%s' AND end <='%s') as planNum, (SELECT COUNT(1) FROM plan_week_reality WHERE plan_id in (%s) and source_type = '%s' AND start >='%s' AND end <='%s') as realityNum", + rt.PlanIds, y, rt.Start, rt.End, + rt.PlanIds, y, rt.Start, rt.End) + } + //本周计划+本周完成 + query, err := g.DB().Query(ctx, sql) + if err != nil { + return nil, err + } + err = query[0].Struct(&pwrOne) + if err != nil { + return nil, err + } + if pwrOne != nil { + //名称、单位 + pwrOne.Name, pwrOne.Unit = model.PlanWeekEnum(y.String()) + //设计总量 + pwrOne.DesignTotal = rt.DesignTotal + //累积完成 + count, err := dao.PlanWeekReality.Ctx(ctx).Where("plan_id", rt.PlanId).Where("source_type", y).Count("id") + if err != nil { + return nil, err + } + pwrOne.AddUp = count + //累积完成百分比 + if count == 0 { + pwrOne.Percentage = 0 + } else { + // 定义大浮点数 + numerator := big.NewFloat(100) + denominator := big.NewFloat(float64(pwrOne.DesignTotal)) + result := big.NewFloat(float64(pwrOne.AddUp)) + // 设置精度 + precision := 100 // 设置为你需要的精度 + numerator.SetPrec(uint(precision)) + denominator.SetPrec(uint(precision)) + result.SetPrec(uint(precision)) + // 计算结果 + result.Quo(result, denominator) + result.Mul(result, numerator) + // 截取到两位小数 + resultRounded, _ := result.Float64() + if err != nil { + err = errors.New("计算百分比失败!") + return nil, err + } else { + pwrOne.Percentage = float64(int(resultRounded*100)) / 100 // 保留两位小数 + } + } + } + pwr = append(pwr, pwrOne) + } + return +} + +// manpowerSituation 【WeeklyAndMonthlyReportDataGenerationFunc】 二、人力情况 +func manpowerSituation(ctx context.Context, projectId int64, start, end string) (str string, err error) { + var me []*model.ManpowerRes + err = wxDao.BusAttendance.Ctx(ctx).As("a").Fields("c.dict_label,COUNT(DISTINCT a.openid) as num"). + LeftJoin("bus_construction_user", "b", "a.openid = b.openid"). + LeftJoin("sys_dict_data", "c", "c.dict_type = 'type_of_work' and c.dict_value = b.type_of_work"). + Where("a.commuter", "1"). + Where("b.project_id", projectId). + WhereBetween("a.printing_date", start, end). + WhereNotNull("b.type_of_work"). + Group("c.dict_label"). + Scan(&me) + str = "1、本周投入人力:" + number := 0 + if len(me) == 0 { + str = "1、本周投入人力:0," + } + for _, data := range me { + str = str + data.DictLabel + " " + strconv.Itoa(data.Num) + " 人," + number = number + data.Num + } + str = str + "共计 " + strconv.Itoa(number) + " 人。" + return +} + +// mechanicalEquipment 【WeeklyAndMonthlyReportDataGenerationFunc】 三、机械设备 +func mechanicalEquipment(ctx context.Context, projectId int64, start, end string) (str string, err error) { + var mr []*model.MechanicalRes + err = dao.PlanWeekReality.Ctx(ctx). + Fields("name,sum(cnt) as num"). + Where("project_id", projectId). + Where("source_type", "machine"). + WhereGTE("start", start). + WhereLTE("end", end). + Group("name").Scan(&mr) + str = "1、本周投入机械:" + number := 0 + if len(mr) == 0 { + str = "1、本周投入机械:0," + } + for _, data := range mr { + str = str + data.Name + " " + strconv.Itoa(data.Num) + " 台," + number = number + data.Num + } + str = str + "共计 " + strconv.Itoa(number) + " 台。" + return +} + +// MaterialCondition 【WeeklyAndMonthlyReportDataGenerationFunc】 四、材料情况 +func MaterialCondition(ctx context.Context, projectId int64, start, end string) (mir []*model.MaterialInputRes, err error) { + err = dao.PlanWeekReality.Ctx(ctx).As("a").Fields("a.name,sum(b.number) as sumNum,sum(a.cnt) as useNum,c.weight_id as weight"). + LeftJoin("bus_equipment_materials_inventory", "b", "a.source_id = b.equipment_materials_id"). + LeftJoin("bus_equipment_materials", "c", "c.equipment_materials_id = a.source_id"). + Where("a.project_id", projectId). + Where("a.source_type", "material"). + Where("b.out_put", "2"). + WhereGTE("a.start", start). + WhereLTE("a.end", end). + Group("a.source_id,a.name").Scan(&mir) + return +} + +// QualitySituation 【WeeklyAndMonthlyReportDataGenerationFunc】 五、质量情况 +func QualitySituation(ctx context.Context, projectId int64, start, end string) (qsr *model.QualitySituationRes, err error) { + qsr = new(model.QualitySituationRes) + err = g.Try(ctx, func(ctx context.Context) { + var qstr []*model.QualitySituationTwoRes + //1、查询出所有的状态 + err = dao.BusQuality.Ctx(ctx). + Fields("created_at,quality_name,quality_explain,quality_document,quality_type"). + Where("project_id", projectId). + WhereGTE("DATE_FORMAT(created_at,'%Y-%m-%d')", start). + WhereLTE("DATE_FORMAT(created_at,'%Y-%m-%d')", end). + Scan(&qstr) + var qstrTwo []*model.QualitySituationTwoRes + //2、根据判断条件将数据进行分流 + for i := 0; i < len(qstr); { + resData := qstr[i] + typeStr := resData.QualitType + if typeStr == "1" { + //判断类型+是否合格 + str := "送检" + if resData.QualityDocument != "" { + qstr[i].IsQualified = str + "文件不合格" + } else { + qstr[i].IsQualified = str + "文件合格" + } + qstr[i].TextStr = resData.CreatedAt + "," + resData.QualityName + "," + resData.QualityExplain + "," + resData.IsQualified + "。" + qstrTwo = append(qstrTwo, qstr[i]) + qstr = append(qstr[:i], qstr[i+1:]...) + } else { + str := "" + if typeStr == "2" { + str = "质量" + } + if typeStr == "3" { + str = "整改" + } + if resData.QualityDocument != "" { + qstr[i].IsQualified = str + "文件不合格" + } else { + qstr[i].IsQualified = str + "文件合格" + } + qstr[i].TextStr = resData.CreatedAt + "," + resData.QualityName + "," + resData.QualityExplain + "," + resData.IsQualified + "。" + i++ + } + } + qsr.ExamineList = qstr + qsr.InspectList = qstrTwo + liberr.ErrIsNil(ctx, err, "获取数据失败") + }) + return +} + +// FieldInspection 【WeeklyAndMonthlyReportDataGenerationFunc】 六、现场巡检照片 +func FieldInspection(ctx context.Context, projectId int64, start, end string) (qsr *model.FieldInspectionRes, err error) { + qsr = new(model.FieldInspectionRes) + err = g.Try(ctx, func(ctx context.Context) { + //1、质量管理 + var firr []*model.FieldInspectionResTwoRes + var firrEntity []*model.FieldInspectionResTwoRes + err = dao.BusQuality.Ctx(ctx).Fields("quality_name as pollingName,quality_document as document,quality_type as qualityType"). + Where("project_id", projectId). + WhereGTE("DATE_FORMAT(created_at,'%Y-%m-%d')", start). + WhereLTE("DATE_FORMAT(created_at,'%Y-%m-%d')", end). + WhereNotNull("quality_document"). + Scan(&firr) + for i := range firr { + split := strings.Split(firr[i].Document, ";") + for _, data := range split { + var uf *comModel.UpFile + err := json.Unmarshal([]byte(data), &uf) + if err != nil { + uf = new(comModel.UpFile) + uf.Name = firr[i].PollingName + uf.Url = firr[i].Document + } + if coryCommon.FlagImg(uf.Url) { + str := "" + if firr[i].QualityType == "1" { + str = "送检" + } else if firr[i].QualityType == "2" { + str = "质量检查" + } else { + str = "检查整改" + } + firrEntity = append(firrEntity, &model.FieldInspectionResTwoRes{ + PollingName: str + "-" + firr[i].PollingName, + PollingImg: uf.Url, + }) + } + } + } + + //2、安全管理 + var firrTwo []*model.FieldInspectionResTwoRes + var firrEntityTwo []*model.FieldInspectionResTwoRes + err = dao.BusSafety.Ctx(ctx).Fields("safety_name as pollingName,safety_document as document,safety_type as safetyType"). + Where("project_id", projectId). + WhereGTE("DATE_FORMAT(created_at,'%Y-%m-%d')", start). + WhereLTE("DATE_FORMAT(created_at,'%Y-%m-%d')", end). + WhereNotNull("safety_document"). + Scan(&firrTwo) + for i := range firrTwo { + //var ufList []*comModel.UpFile + split := strings.Split(firrTwo[i].Document, ";") + for _, data := range split { + var uf *comModel.UpFile + err := json.Unmarshal([]byte(data), &uf) + if err != nil { + uf = new(comModel.UpFile) + uf.Name = firrTwo[i].PollingName + uf.Url = firrTwo[i].Document + } + if coryCommon.FlagImg(uf.Url) { + str := "" + if firrTwo[i].SafetyType == "1" { + str = "例会" + } else if firrTwo[i].QualityType == "2" { + str = "检查" + } else if firrTwo[i].QualityType == "3" { + str = "整改" + } else { + str = "站例会" + } + firrEntityTwo = append(firrEntityTwo, &model.FieldInspectionResTwoRes{ + PollingName: str + "-" + firrTwo[i].PollingName, + PollingImg: uf.Url, + }) + } + } + } + if len(firrEntity) > 0 { + qsr.QualityList = firrEntity + } + if len(firrEntityTwo) > 0 { + qsr.SafetyList = firrEntityTwo + } + }) + return +} + +func (s *sPlanWeek) WeekAndWeekRealityListFunc(ctx context.Context, req *system.WeekAndWeekRealityListReq) (res *system.WeekAndWeekRealityListRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + res = new(system.WeekAndWeekRealityListRes) + var pwsr *system.PlanWeekSearchReq + pwsr = new(system.PlanWeekSearchReq) + pwsr.ProjectId = req.ProjectId + + var pwrsr *system.PlanWeekRealitySearchReq + pwrsr = new(system.PlanWeekRealitySearchReq) + pwrsr.ProjectId = req.ProjectId + + if len(req.DateRange) != 0 { + pwsr.DateRange = req.DateRange + pwrsr.DateRange = req.DateRange + } + + listRes, err := s.List(ctx, pwsr) + if err == nil { + res.WeekList = listRes.List + } + list, err := planWeekRealityLogic.New().List(ctx, pwrsr) + if err == nil { + res.WeekRealityList = list.List + } + liberr.ErrIsNil(ctx, err, "获取数据失败") + }) + return +} + +func (s *sPlanWeek) PlanWeekGetInfoByPlanID(ctx context.Context, req *system.PlanWeekGetInfoByPlanIDReq) (res *system.PlanWeekGetInfoByPlanIDRes, err error) { + //TODO implement me + res = new(system.PlanWeekGetInfoByPlanIDRes) + res.List = []*model.Task{} + err = g.Try(ctx, func(ctx context.Context) { + if req.PlanWeekReality { + fmt.Println("需要获取真实的计划", req.SourceType) + //是否需要获取真实的 + m := dao.PlanWeekReality.Ctx(ctx).WithAll().Where(dao.PlanWeekReality.Columns().PlanId, req.PlanID) + if req.SourceType != "" { + m = m.Where(dao.PlanWeekReality.Columns().SourceType, req.SourceType) + } + err = m.Scan(&res.List) + + } + if len(res.List) == 0 { + fmt.Println("需要获取计划的计划", req.SourceType) + + m := dao.PlanWeek.Ctx(ctx).WithAll().Where(dao.PlanWeek.Columns().PlanId, req.PlanID) + if req.SourceType != "" { + m = m.Where(dao.PlanWeek.Columns().SourceType, req.SourceType) + } + err = m.Scan(&res.List) + } + + liberr.ErrIsNil(ctx, err, "获取数据失败") + }) + return +} + +func (s *sPlanWeek) List(ctx context.Context, req *system.PlanWeekSearchReq) (listRes *system.PlanWeekSearchRes, err error) { + listRes = new(system.PlanWeekSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.PlanWeek.Ctx(ctx).As("a").WithAll(). + LeftJoin("plan_week_reality", "b", "a.plan_id=b.plan_id and a.source_type = b.source_type and a.name=b.name"). + Fields("a.*,IF(b.status=2, b.status, a.status) as statusTwo") + if req.ProjectId != "" { + m = m.Where("a."+dao.PlanWeek.Columns().ProjectId+" = ?", req.ProjectId) + } + if len(req.DateRange) != 0 { + m = m.Where("date_format(a.start,'%Y-%m-%d') >= ? AND date_format(a.end,'%Y-%m-%d')<=?", req.DateRange[0], req.DateRange[1]) + } + var res []*model.PlanWeekInfoRes + err = m.Fields(system.PlanWeekSearchRes{}).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + + listRes.List = []*model.PlanWeekListRes{} + var plans_map = make(map[string]*model.PlanWeekListRes) + + for _, v := range res { + if v.StatusTwo == 2 { + v.Status = v.StatusTwo + } + //当前时间在周计划的开始时间~结束时间内,那么任务就是进行中 + flag := WhetherItsInRange(v.Start, v.End) + if flag { + if v.StatusTwo == 2 { + v.Status = v.StatusTwo + } else { + v.Status = 1 + } + } + pl := plans_map[v.PlanId] + if pl == nil { + pl = &model.PlanWeekListRes{} + pl.PlanID = v.PlanId + pl.PlanName = v.PlanName + pl.Start = v.Start + pl.Status = v.Status + pl.End = v.End + pl.ProjectId = v.ProjectId + pl.Tasks = []model.Task{} + plans_map[v.PlanId] = pl + } + tsk := model.Task{} + tsk.SourceId = v.SourceId + tsk.Name = v.Name + tsk.Table = v.Table + tsk.Status = v.Status + tsk.SourceType = v.SourceType + tsk.Cnt = v.Cnt + pl.Tasks = append(pl.Tasks, tsk) + /*listRes.List[k] = &model.PlanWeekListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + SourceId: v.SourceId, + Name: v.Name, + Start: v.Start, + End: v.End, + PlanName: v.PlanName, + PlanId: v.PlanId, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreateAt: v.CreateAt, + UpdateAt: v.UpdateAt, + Table: v.Table, + Status: v.Status, + }*/ + } + for _, plan := range plans_map { + listRes.List = append(listRes.List, plan) + } + sort.Slice(listRes.List, func(i, j int) bool { + return listRes.List[i].Start < listRes.List[j].Start + }) + }) + return +} + +func WhetherItsInRange(startDateString, endDateString string) (flag bool) { + flag = false + // 解析开始日期字符串 + startDate, err := time.Parse("2006-01-02", startDateString) + if err != nil { + fmt.Println("解析开始日期出错:", err) + return + } + // 手动设置开始日期的时分秒为 00:00:00 + startDateTime := time.Date(startDate.Year(), startDate.Month(), startDate.Day(), 0, 0, 0, 0, time.UTC) + // 解析结束日期字符串 + endDate, err := time.Parse("2006-01-02", endDateString) + if err != nil { + fmt.Println("解析结束日期出错:", err) + return + } + // 手动设置结束日期的时分秒为 23:59:59 + endDateTime := time.Date(endDate.Year(), endDate.Month(), endDate.Day(), 23, 59, 59, 999999999, time.UTC) + // 获取当前时间 + currentTime := time.Now() + // 检查当前时间是否在指定范围内 true在 false不在 + if currentTime.After(startDateTime) && currentTime.Before(endDateTime) { + return true + } else { + return false + } +} + +func sortSlice[T constraints.Ordered](s []T) { + sort.Slice(s, func(i, j int) bool { + val := reflect.ValueOf(s[i]) + fmt.Println(val) + //typ := reflect.TypeOf(data) + return s[i] < s[j] + }) +} +func (s *sPlanWeek) GetById(ctx context.Context, id int) (res *model.PlanWeekInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.PlanWeek.Ctx(ctx).WithAll().Where(dao.PlanWeek.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sPlanWeek) Add(ctx context.Context, req *system.PlanWeekAddReq) (err error) { + if len(req.Tasks) == 0 { + err = errors.New("工作记录为空") + return + } + err = g.Try(ctx, func(ctx context.Context) { + var tasks []do.PlanWeek + CreateBy := ct.New().GetLoginUser(ctx).Id + for _, task := range req.Tasks { + t := do.PlanWeek{} + t.ProjectId = req.ProjectId + t.PlanName = req.PlanName + t.PlanId = gmd5.MustEncryptString(gtime.Datetime()) + t.SourceId = task.SourceId + t.Name = task.Name + //t.Table = task.Table + t.CreateBy = CreateBy + t.UpdateBy = CreateBy + t.Start = req.Start + t.End = req.End + t.SourceType = task.SourceType + t.Cnt = task.Cnt + tasks = append(tasks, t) + } + _, err = dao.PlanWeek.Ctx(ctx).Insert(&tasks) + fmt.Println(err) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sPlanWeek) Edit(ctx context.Context, req *system.PlanWeekEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.PlanWeek.Ctx(ctx).Where(dao.PlanWeek.Columns().PlanId, req.PlanID).Unscoped().Delete() + var tasks []do.PlanWeek + CreateBy := ct.New().GetLoginUser(ctx).Id + for _, task := range req.Tasks { + t := do.PlanWeek{} + t.ProjectId = req.ProjectId + t.PlanName = req.PlanName + t.PlanId = req.PlanID + t.SourceId = task.SourceId + t.Name = task.Name + //t.Table = task.Table + t.CreateBy = CreateBy + t.UpdateBy = CreateBy + t.Start = req.Start + t.End = req.End + t.SourceType = task.SourceType + t.Cnt = task.Cnt + tasks = append(tasks, t) + } + _, err = dao.PlanWeek.Ctx(ctx).Insert(&tasks) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sPlanWeek) Delete(ctx context.Context, planID string) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.PlanWeek.Ctx(ctx).Unscoped().Delete(dao.PlanWeek.Columns().PlanId, planID) + _, err = dao.PlanWeekReality.Ctx(ctx).Unscoped().Delete(dao.PlanWeek.Columns().PlanId, planID) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return err + }) + return +} diff --git a/internal/app/system/logic/planWeekReality/plan_week_reality.go b/internal/app/system/logic/planWeekReality/plan_week_reality.go new file mode 100644 index 0000000..60e996a --- /dev/null +++ b/internal/app/system/logic/planWeekReality/plan_week_reality.go @@ -0,0 +1,290 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-17 17:23:07 +// 生成路径: internal/app/system/logic/plan_week_reality.go +// 生成人:xyb +// desc:实际完成的周计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "sort" +) + +func init() { + service.RegisterPlanWeekReality(New()) +} + +func New() *sPlanWeekReality { + return &sPlanWeekReality{} +} + +type sPlanWeekReality struct{} + +func (s *sPlanWeekReality) PlanWeekRealityCompare(ctx context.Context, req *system.PlanWeekRealityCompareReq) (res *system.PlanWeekRealityCompareRes, err error) { + + res = &system.PlanWeekRealityCompareRes{} + res.RealityList = []model.Task{} + res.PlanList = []model.Task{} + err = dao.PlanWeekReality.Ctx(ctx).WithAll().Where(dao.PlanWeekReality.Columns().PlanId, req.PlanID).Scan(&res.RealityList) + if err != nil { + return nil, err + } + err = dao.PlanWeek.Ctx(ctx).WithAll().Where(dao.PlanWeek.Columns().PlanId, req.PlanID).Scan(&res.PlanList) + if err != nil { + return nil, err + } + + return +} + +func (s *sPlanWeekReality) List(ctx context.Context, req *system.PlanWeekRealitySearchReq) (listRes *system.PlanWeekRealitySearchRes, err error) { + listRes = new(system.PlanWeekRealitySearchRes) + /* err = g.Try(ctx, func(ctx context.Context) { + m := dao.PlanWeekReality.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.PlanWeekReality.Columns().Id+" = ?", req.Id) + } + if req.ProjectId != "" { + m = m.Where(dao.PlanWeekReality.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.SourceId != "" { + m = m.Where(dao.PlanWeekReality.Columns().SourceId+" = ?", req.SourceId) + } + if req.Name != "" { + m = m.Where(dao.PlanWeekReality.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.Start != "" { + m = m.Where(dao.PlanWeekReality.Columns().Start+" = ?", req.Start) + } + if req.End != "" { + m = m.Where(dao.PlanWeekReality.Columns().End+" = ?", req.End) + } + if req.PlanName != "" { + m = m.Where(dao.PlanWeekReality.Columns().PlanName+" like ?", "%"+req.PlanName+"%") + } + if req.PlanId != "" { + m = m.Where(dao.PlanWeekReality.Columns().PlanId+" = ?", req.PlanId) + } + if req.CreateBy != "" { + m = m.Where(dao.PlanWeekReality.Columns().CreateBy+" = ?", req.CreateBy) + } + if req.UpdateBy != "" { + m = m.Where(dao.PlanWeekReality.Columns().UpdateBy+" = ?", req.UpdateBy) + } + if req.CreateAt != "" { + m = m.Where(dao.PlanWeekReality.Columns().CreateAt+" = ?", gconv.Time(req.CreateAt)) + } + if req.UpdateAt != "" { + m = m.Where(dao.PlanWeekReality.Columns().UpdateAt+" = ?", gconv.Time(req.UpdateAt)) + } + if req.Table != "" { + m = m.Where(dao.PlanWeekReality.Columns().Table+" = ?", req.Table) + } + if req.Status != "" { + m = m.Where(dao.PlanWeekReality.Columns().Status+" = ?", gconv.Int(req.Status)) + } + if req.SourceType != "" { + m = m.Where(dao.PlanWeekReality.Columns().SourceType+" = ?", req.SourceType) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.PlanWeekRealityInfoRes + err = m.Fields(system.PlanWeekRealitySearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.PlanWeekRealityListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.PlanWeekRealityListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + SourceId: v.SourceId, + Name: v.Name, + Start: v.Start, + End: v.End, + PlanName: v.PlanName, + PlanId: v.PlanId, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreateAt: v.CreateAt, + UpdateAt: v.UpdateAt, + Table: v.Table, + Status: v.Status, + SourceType: v.SourceType, + } + } + })*/ + err = g.Try(ctx, func(ctx context.Context) { + m := dao.PlanWeekReality.Ctx(ctx).WithAll() + if req.ProjectId != "" { + m = m.Where(dao.PlanWeekReality.Columns().ProjectId+" = ?", req.ProjectId) + } + if len(req.DateRange) != 0 { + m = m.Where("date_format(start,'%Y-%m-%d') >= ? AND date_format(end,'%Y-%m-%d')<=?", req.DateRange[0], req.DateRange[1]) + } + var res []*model.PlanWeekRealityInfoRes + err = m.Fields(system.PlanWeekRealitySearchRes{}).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + + listRes.List = []*model.PlanWeekRealityListRes{} + var plans_map = make(map[string]*model.PlanWeekRealityListRes) + for _, v := range res { + pl := plans_map[v.PlanId] + if pl == nil { + pl = &model.PlanWeekRealityListRes{} + pl.PlanID = v.PlanId + pl.PlanName = v.PlanName + pl.Start = v.Start + pl.End = v.End + pl.ProjectId = v.ProjectId + pl.Tasks = []model.Task{} + plans_map[v.PlanId] = pl + } + tsk := model.Task{} + tsk.SourceId = v.SourceId + tsk.Name = v.Name + tsk.Table = v.Table + tsk.Status = v.Status + tsk.SourceType = v.SourceType + tsk.Cnt = v.Cnt + pl.Tasks = append(pl.Tasks, tsk) + /*listRes.List[k] = &model.PlanWeekListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + SourceId: v.SourceId, + Name: v.Name, + Start: v.Start, + End: v.End, + PlanName: v.PlanName, + PlanId: v.PlanId, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreateAt: v.CreateAt, + UpdateAt: v.UpdateAt, + Table: v.Table, + Status: v.Status, + }*/ + } + for _, plan := range plans_map { + listRes.List = append(listRes.List, plan) + } + sort.Slice(listRes.List, func(i, j int) bool { + return listRes.List[i].Start < listRes.List[j].Start + }) + }) + return +} + +func (s *sPlanWeekReality) GetById(ctx context.Context, id int) (res *model.PlanWeekRealityInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.PlanWeekReality.Ctx(ctx).WithAll().Where(dao.PlanWeekReality.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sPlanWeekReality) Add(ctx context.Context, req *system.PlanWeekRealityAddReq) (err error) { + /* err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.PlanWeekReality.Ctx(ctx).Insert(do.PlanWeekReality{ + ProjectId: req.ProjectId, + SourceId: req.SourceId, + Name: req.Name, + Start: req.Start, + End: req.End, + PlanName: req.PlanName, + PlanId: req.PlanId, + CreateBy: req.CreateBy, + UpdateBy: req.UpdateBy, + CreateAt: req.CreateAt, + UpdateAt: req.UpdateAt, + Table: req.Table, + Status: req.Status, + SourceType: req.SourceType, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + })*/ + if len(req.Tasks) == 0 { + err = errors.New("工作记录为空") + return + } + err = g.Try(ctx, func(ctx context.Context) { + dao.PlanWeekReality.Ctx(ctx).Unscoped().Delete(dao.PlanWeekReality.Columns().PlanId, req.PlanID) + var tasks []do.PlanWeekReality + CreateBy := ct.New().GetLoginUser(ctx).Id + for _, task := range req.Tasks { + t := do.PlanWeekReality{} + t.ProjectId = req.ProjectId + t.PlanName = req.PlanName + t.PlanId = req.PlanID + t.SourceId = task.SourceId + t.Name = task.Name + //t.Table = task.Table + t.Status = 2 + t.CreateBy = CreateBy + t.UpdateBy = CreateBy + t.Start = req.Start + t.End = req.End + t.SourceType = task.SourceType + t.Cnt = task.Cnt + tasks = append(tasks, t) + } + _, err = dao.PlanWeekReality.Ctx(ctx).Insert(&tasks) + fmt.Println(err) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sPlanWeekReality) Edit(ctx context.Context, req *system.PlanWeekRealityEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.PlanWeekReality.Ctx(ctx).WherePri(req.Id).Update(do.PlanWeekReality{ + ProjectId: req.ProjectId, + SourceId: req.SourceId, + Name: req.Name, + Start: req.Start, + End: req.End, + PlanName: req.PlanName, + PlanId: req.PlanId, + CreateBy: req.CreateBy, + UpdateBy: req.UpdateBy, + CreateAt: req.CreateAt, + UpdateAt: req.UpdateAt, + Table: req.Table, + Status: req.Status, + SourceType: req.SourceType, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sPlanWeekReality) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.PlanWeekReality.Ctx(ctx).Delete(dao.PlanWeekReality.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/plant/plant.go b/internal/app/system/logic/plant/plant.go new file mode 100644 index 0000000..aa70f21 --- /dev/null +++ b/internal/app/system/logic/plant/plant.go @@ -0,0 +1,264 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-04-12 10:38:43 +// 生成路径: internal/app/system/logic/plant.go +// 生成人:gfast +// desc:电站信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterPlant(New()) +} + +func New() *sPlant { + return &sPlant{} +} + +type sPlant struct{} + +func (s *sPlant) List(ctx context.Context, req *system.PlantSearchReq) (listRes *system.PlantSearchRes, err error) { + listRes = new(system.PlantSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.Plant.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.Plant.Columns().Id+" = ?", req.Id) + } + if req.Name != "" { + m = m.Where(dao.Plant.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.Address != "" { + m = m.Where(dao.Plant.Columns().Address+" = ?", req.Address) + } + if req.City != "" { + m = m.Where(dao.Plant.Columns().City+" = ?", req.City) + } + if req.District != "" { + m = m.Where(dao.Plant.Columns().District+" = ?", req.District) + } + if req.Province != "" { + m = m.Where(dao.Plant.Columns().Province+" = ?", req.Province) + } + if req.NetworkTime != "" { + m = m.Where(dao.Plant.Columns().NetworkTime+" = ?", gconv.Time(req.NetworkTime)) + } + if req.UpdateTime != "" { + m = m.Where(dao.Plant.Columns().UpdateTime+" = ?", gconv.Time(req.UpdateTime)) + } + if req.CompanyId != "" { + m = m.Where(dao.Plant.Columns().CompanyId+" = ?", req.CompanyId) + } + if req.CompanyName != "" { + m = m.Where(dao.Plant.Columns().CompanyName+" = ?", req.CompanyName) + } + if req.OwnerId != "" { + m = m.Where(dao.Plant.Columns().OwnerId+" = ?", req.OwnerId) + } + if req.OwnerName != "" { + m = m.Where(dao.Plant.Columns().OwnerName+" = ?", req.OwnerName) + } + if req.ServiceProviderName != "" { + m = m.Where(dao.Plant.Columns().ServiceProviderName+" = ?", req.ServiceProviderName) + } + if req.ServiceProviderPhone != "" { + m = m.Where(dao.Plant.Columns().ServiceProviderPhone+" = ?", req.ServiceProviderPhone) + } + if req.NetworkType != "" { + m = m.Where(dao.Plant.Columns().NetworkType+" = ?", req.NetworkType) + } + if req.PowerPlantType != "" { + m = m.Where(dao.Plant.Columns().PowerPlantType+" = ?", req.PowerPlantType) + } + if req.Status != "" { + m = m.Where(dao.Plant.Columns().Status+" = ?", gconv.Int(req.Status)) + } + if req.PaymentType != "" { + m = m.Where(dao.Plant.Columns().PaymentType+" = ?", req.PaymentType) + } + if req.PlantContact != "" { + m = m.Where(dao.Plant.Columns().PlantContact+" = ?", req.PlantContact) + } + if req.PlantContactPhone != "" { + m = m.Where(dao.Plant.Columns().PlantContactPhone+" = ?", req.PlantContactPhone) + } + if req.PlantImg != "" { + m = m.Where(dao.Plant.Columns().PlantImg+" = ?", req.PlantImg) + } + if req.SubassemblyNumber != "" { + m = m.Where(dao.Plant.Columns().SubassemblyNumber+" = ?", gconv.Int(req.SubassemblyNumber)) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.Plant.Columns().CreatedAt+" >=? AND "+dao.Plant.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "name asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.PlantInfoRes + err = m.Fields(system.PlantSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.PlantListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.PlantListRes{ + Id: v.Id, + Name: v.Name, + Address: v.Address, + City: v.City, + District: v.District, + Province: v.Province, + Latitude: v.Latitude, + Longitude: v.Longitude, + Kwp: v.Kwp, + MonKwh: v.MonKwh, + NowKw: v.NowKw, + SumKwh: v.SumKwh, + TodayKwh: v.TodayKwh, + YearKwh: v.YearKwh, + NetworkTime: v.NetworkTime, + UpdateTime: v.UpdateTime, + CompanyId: v.CompanyId, + CompanyName: v.CompanyName, + OwnerId: v.OwnerId, + OwnerName: v.OwnerName, + ServiceProviderName: v.ServiceProviderName, + ServiceProviderPhone: v.ServiceProviderPhone, + NetworkType: v.NetworkType, + PowerPlantType: v.PowerPlantType, + Status: v.Status, + PaymentType: v.PaymentType, + PlantContact: v.PlantContact, + PlantContactPhone: v.PlantContactPhone, + PlantImg: v.PlantImg, + Remark: v.Remark, + DipAngle: v.DipAngle, + OrientationAngle: v.OrientationAngle, + SubassemblyNumber: v.SubassemblyNumber, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sPlant) GetById(ctx context.Context, id string) (res *model.PlantInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.Plant.Ctx(ctx).WithAll().Where(dao.Plant.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sPlant) Add(ctx context.Context, req *system.PlantAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.Plant.Ctx(ctx).Insert(do.Plant{ + Id: req.Id, + Name: req.Name, + Address: req.Address, + City: req.City, + District: req.District, + Province: req.Province, + Latitude: req.Latitude, + Longitude: req.Longitude, + Kwp: req.Kwp, + MonKwh: req.MonKwh, + NowKw: req.NowKw, + SumKwh: req.SumKwh, + TodayKwh: req.TodayKwh, + YearKwh: req.YearKwh, + NetworkTime: req.NetworkTime, + UpdateTime: req.UpdateTime, + CompanyId: req.CompanyId, + CompanyName: req.CompanyName, + OwnerId: req.OwnerId, + OwnerName: req.OwnerName, + ServiceProviderName: req.ServiceProviderName, + ServiceProviderPhone: req.ServiceProviderPhone, + NetworkType: req.NetworkType, + PowerPlantType: req.PowerPlantType, + Status: req.Status, + PaymentType: req.PaymentType, + PlantContact: req.PlantContact, + PlantContactPhone: req.PlantContactPhone, + PlantImg: req.PlantImg, + Remark: req.Remark, + DipAngle: req.DipAngle, + OrientationAngle: req.OrientationAngle, + SubassemblyNumber: req.SubassemblyNumber, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sPlant) Edit(ctx context.Context, req *system.PlantEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.Plant.Ctx(ctx).WherePri(req.Id).Update(do.Plant{ + Name: req.Name, + Address: req.Address, + City: req.City, + District: req.District, + Province: req.Province, + Latitude: req.Latitude, + Longitude: req.Longitude, + Kwp: req.Kwp, + MonKwh: req.MonKwh, + NowKw: req.NowKw, + SumKwh: req.SumKwh, + TodayKwh: req.TodayKwh, + YearKwh: req.YearKwh, + NetworkTime: req.NetworkTime, + UpdateTime: req.UpdateTime, + CompanyId: req.CompanyId, + CompanyName: req.CompanyName, + OwnerId: req.OwnerId, + OwnerName: req.OwnerName, + ServiceProviderName: req.ServiceProviderName, + ServiceProviderPhone: req.ServiceProviderPhone, + NetworkType: req.NetworkType, + PowerPlantType: req.PowerPlantType, + Status: req.Status, + PaymentType: req.PaymentType, + PlantContact: req.PlantContact, + PlantContactPhone: req.PlantContactPhone, + PlantImg: req.PlantImg, + Remark: req.Remark, + DipAngle: req.DipAngle, + OrientationAngle: req.OrientationAngle, + SubassemblyNumber: req.SubassemblyNumber, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sPlant) Delete(ctx context.Context, ids []string) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.Plant.Ctx(ctx).Delete(dao.Plant.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/projectFinance/project_finance.go b/internal/app/system/logic/projectFinance/project_finance.go new file mode 100644 index 0000000..8db5b3c --- /dev/null +++ b/internal/app/system/logic/projectFinance/project_finance.go @@ -0,0 +1,236 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-04-29 12:01:01 +// 生成路径: internal/app/system/logic/project_finance.go +// 生成人:gfast +// desc:项目财务 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + systemService "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/xuri/excelize/v2" +) + +func init() { + service.RegisterProjectFinance(New()) +} + +func New() *sProjectFinance { + return &sProjectFinance{} +} + +type sProjectFinance struct{} + +// Excel数据导入 +func (s *sProjectFinance) UploadExcel(ctx context.Context, id int64) (res *system.UploadExcelRes, err error) { + res = new(system.UploadExcelRes) + + // 从请求中获取上传的文件 + file := g.RequestFromCtx(ctx).GetUploadFile("file") + if file == nil { + return nil, gerror.New("请上传文件") + } + + // 从上传的文件中获取 io.Reader + fileContent, err := file.Open() + if err != nil { + return nil, gerror.New("无法打开上传的文件") + } + defer fileContent.Close() + + // 使用 io.Reader 直接打开 Excel 文件 + excelFile, err := excelize.OpenReader(fileContent) + if err != nil { + return nil, gerror.New("打开Excel文件失败") + } + + // 选择第一个工作表 + sheetName := excelFile.GetSheetName(0) + rows, err := excelFile.GetRows(sheetName) + if err != nil { + return nil, gerror.New("读取Excel数据失败") + } + + // 处理读取到的数据并插入到数据库 + if len(rows) < 2 { + return nil, gerror.New("不足两行数据,无法导入") + } + + // 从第二行开始迭代,跳过标题行 + for _, row := range rows[1:] { + // 确保数据行有足够的列 + if len(row) < 10 { + continue + } + + param := g.Map{ + "project_id": id, + "contract_amount": row[0], + "subcontract_amount": row[1], + "amount_received": row[2], + "amount_paid": row[3], + "expenses_reimbursed": row[4], + "estimated_gross_profit": row[5], + "current_profit": row[6], + "current_remaining_funds": row[7], + "projected_increase_in_remaining_funds": row[8], + "net_present_value_of_project_operation": row[9], + "created_by": systemService.Context().GetUserId(ctx), + } + _, err := g.Model("project_finance").Ctx(ctx).Insert(param) + if err != nil { + return nil, err + } + } + return +} + +func (s *sProjectFinance) GetByProjectId(ctx context.Context, id int) (res *model.ProjectFinanceInfoResVo, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.ProjectFinance.Ctx(ctx).Fields("project_finance.*, sys_project.project_name, sys_user.user_name AS createdByName"). + InnerJoin("sys_project on sys_project.id = project_finance.project_id"). + InnerJoin("sys_user on sys_user.id = project_finance.created_by"). + Where(dao.ProjectFinance.Columns().ProjectId, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sProjectFinance) List(ctx context.Context, req *system.ProjectFinanceSearchReq) (listRes *system.ProjectFinanceSearchRes, err error) { + listRes = new(system.ProjectFinanceSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.ProjectFinance.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.ProjectFinance.Columns().Id+" = ?", req.Id) + } + if req.ProjectId != "" { + m = m.Where(dao.ProjectFinance.Columns().ProjectId+" = ?", gconv.Int(req.ProjectId)) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.ProjectFinance.Columns().CreatedAt+" >=? AND "+dao.ProjectFinance.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.CreatedBy != "" { + m = m.Where(dao.ProjectFinance.Columns().CreatedBy+" = ?", gconv.Int(req.CreatedBy)) + } + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + if req.ProjectName != "" { + m = m.Where(dao.SysProject.Columns().ProjectName+" like ?", "%"+req.ProjectName+"%") + } + var res []*model.ProjectFinanceInfoResVo + err = m.Fields("project_finance.*, sys_project.project_name, sys_user.user_name AS createdByName"). + InnerJoin("sys_project on sys_project.id = project_finance.project_id"). + InnerJoin("sys_user on sys_user.id = project_finance.created_by"). + Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.ProjectFinanceListResVo, len(res)) + for k, v := range res { + listRes.List[k] = &model.ProjectFinanceListResVo{ + Id: v.Id, + ProjectId: v.ProjectId, + ProjectName: v.ProjectName, + ContractAmount: v.ContractAmount, + SubcontractAmount: v.SubcontractAmount, + AmountReceived: v.AmountReceived, + AmountPaid: v.AmountPaid, + ExpensesReimbursed: v.ExpensesReimbursed, + EstimatedGrossProfit: v.EstimatedGrossProfit, + CurrentProfit: v.CurrentProfit, + CurrentRemainingFunds: v.CurrentRemainingFunds, + ProjectedIncreaseInRemainingFunds: v.ProjectedIncreaseInRemainingFunds, + NetPresentValueOfProjectOperation: v.NetPresentValueOfProjectOperation, + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + CreatedBy: v.CreatedBy, + CreatedByName: v.CreatedByName, + } + } + + listRes.Total = len(listRes.List) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + }) + return +} + +func (s *sProjectFinance) GetById(ctx context.Context, id int) (res *model.ProjectFinanceInfoResVo, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.ProjectFinance.Ctx(ctx).Fields("project_finance.*, sys_project.project_name, sys_user.user_name AS createdByName"). + InnerJoin("sys_project on sys_project.id = project_finance.project_id"). + InnerJoin("sys_user on sys_user.id = project_finance.created_by"). + Where(dao.ProjectFinance.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sProjectFinance) Add(ctx context.Context, req *system.ProjectFinanceAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ProjectFinance.Ctx(ctx).Insert(do.ProjectFinance{ + ProjectId: req.ProjectId, + ContractAmount: req.ContractAmount, + SubcontractAmount: req.SubcontractAmount, + AmountReceived: req.AmountReceived, + AmountPaid: req.AmountPaid, + ExpensesReimbursed: req.ExpensesReimbursed, + EstimatedGrossProfit: req.EstimatedGrossProfit, + CurrentProfit: req.CurrentProfit, + CurrentRemainingFunds: req.CurrentRemainingFunds, + ProjectedIncreaseInRemainingFunds: req.ProjectedIncreaseInRemainingFunds, + NetPresentValueOfProjectOperation: req.NetPresentValueOfProjectOperation, + CreatedBy: systemService.Context().GetUserId(ctx), + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sProjectFinance) Edit(ctx context.Context, req *system.ProjectFinanceEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ProjectFinance.Ctx(ctx).WherePri(req.Id).Update(do.ProjectFinance{ + ProjectId: req.ProjectId, + ContractAmount: req.ContractAmount, + SubcontractAmount: req.SubcontractAmount, + AmountReceived: req.AmountReceived, + AmountPaid: req.AmountPaid, + ExpensesReimbursed: req.ExpensesReimbursed, + EstimatedGrossProfit: req.EstimatedGrossProfit, + CurrentProfit: req.CurrentProfit, + CurrentRemainingFunds: req.CurrentRemainingFunds, + ProjectedIncreaseInRemainingFunds: req.ProjectedIncreaseInRemainingFunds, + NetPresentValueOfProjectOperation: req.NetPresentValueOfProjectOperation, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sProjectFinance) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ProjectFinance.Ctx(ctx).Delete(dao.ProjectFinance.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/projectSchedule/project_schedule.go b/internal/app/system/logic/projectSchedule/project_schedule.go new file mode 100644 index 0000000..5be5c4d --- /dev/null +++ b/internal/app/system/logic/projectSchedule/project_schedule.go @@ -0,0 +1,135 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-03-13 18:17:32 +// 生成路径: internal/app/system/logic/project_schedule.go +// 生成人:gfast +// desc:项目排期 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterProjectSchedule(New()) +} + +func New() *sProjectSchedule { + return &sProjectSchedule{} +} + +type sProjectSchedule struct{} + +func (s *sProjectSchedule) List(ctx context.Context, req *system.ProjectScheduleSearchReq) (listRes *system.ProjectScheduleSearchRes, err error) { + listRes = new(system.ProjectScheduleSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.ProjectSchedule.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.ProjectSchedule.Columns().Id+" = ?", req.Id) + } + if req.ParentId != "" { + m = m.Where(dao.ProjectSchedule.Columns().ParentId+" = ?", gconv.Int(req.ParentId)) + } + if req.StartDate != "" { + m = m.Where(dao.ProjectSchedule.Columns().StartDate+" = ?", req.StartDate) + } + if req.EndDate != "" { + m = m.Where(dao.ProjectSchedule.Columns().EndDate+" = ?", req.EndDate) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.ProjectSchedule.Columns().CreatedAt+" >=? AND "+dao.ProjectSchedule.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.Name != "" { + m = m.Where(dao.ProjectSchedule.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.PlaneNum != "" { + m = m.Where(dao.ProjectSchedule.Columns().PlaneNum+" = ?", req.PlaneNum) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.ProjectScheduleInfoRes + err = m.Fields(system.ProjectScheduleSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.ProjectScheduleListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.ProjectScheduleListRes{ + Id: v.Id, + ParentId: v.ParentId, + StartDate: v.StartDate, + EndDate: v.EndDate, + CreatedAt: v.CreatedAt, + Name: v.Name, + PlaneNum: v.PlaneNum, + } + } + }) + return +} + +func (s *sProjectSchedule) GetById(ctx context.Context, id uint) (res *model.ProjectScheduleInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.ProjectSchedule.Ctx(ctx).WithAll().Where(dao.ProjectSchedule.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sProjectSchedule) Add(ctx context.Context, req *system.ProjectScheduleAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ProjectSchedule.Ctx(ctx).Insert(do.ProjectSchedule{ + ParentId: req.ParentId, + StartDate: req.StartDate, + EndDate: req.EndDate, + Name: req.Name, + PlaneNum: req.PlaneNum, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sProjectSchedule) Edit(ctx context.Context, req *system.ProjectScheduleEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ProjectSchedule.Ctx(ctx).WherePri(req.Id).Update(do.ProjectSchedule{ + ParentId: req.ParentId, + StartDate: req.StartDate, + EndDate: req.EndDate, + Name: req.Name, + PlaneNum: req.PlaneNum, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sProjectSchedule) Delete(ctx context.Context, ids []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ProjectSchedule.Ctx(ctx).Delete(dao.ProjectSchedule.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/pvModule/pv_module.go b/internal/app/system/logic/pvModule/pv_module.go new file mode 100644 index 0000000..d6abbcc --- /dev/null +++ b/internal/app/system/logic/pvModule/pv_module.go @@ -0,0 +1,1250 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-03-23 10:25:39 +// 生成路径: internal/app/system/logic/pv_ module.go +// 生成人:gfast +// desc:光伏组件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "encoding/json" + "fmt" + "strings" + "time" + "unsafe" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/util/gconv" + "github.com/samber/lo" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/common/shp" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/internal/consts" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterPvModule(New()) +} + +func New() *sPvModule { + return &sPvModule{} +} + +type sPvModule struct{} + +func (s *sPvModule) List(ctx context.Context, req *system.PvModuleSearchReq) (listRes *system.PvModuleSearchRes, err error) { + listRes = new(system.PvModuleSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.PvModule.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.PvModule.Columns().Id+" = ?", req.Id) + } + if req.FangzhenId != "" { + m = m.Where(dao.PvModule.Columns().FangzhenId+" = ?", req.FangzhenId) + } + if req.SubProjectid != "" { + m = m.Where(dao.PvModule.Columns().SubProjectid+" = ?", req.SubProjectid) + } + if req.WorkId != "" { + m = m.Where(dao.PvModule.Columns().WorkId+" = ?", req.WorkId) + } + if req.Name != "" { + m = m.Where(dao.PvModule.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.Status != "" { + m = m.Where(dao.PvModule.Columns().Status+" = ?", req.Status) + } + if req.DoneTime != "" { + m = m.Where(dao.PvModule.Columns().DoneTime+" = ?", gconv.Time(req.DoneTime)) + } + if req.Detail != "" { + m = m.Where(dao.PvModule.Columns().Detail+" = ?", req.Detail) + } + if req.Type != "" { + m = m.Where(dao.PvModule.Columns().Type+" = ?", req.Type) + } + + m = m.LeftJoin("equipment AS ep", "pv_module.device_id = ep.id") + + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = 20 + } + order := "name asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.PvModuleInfoRes + err = m.Fields(`pv_module.id, + pv_module.fangzhen_id, + pv_module.sub_projectid, + pv_module.work_id, + pv_module.name, + pv_module.status, + pv_module.done_time, + pv_module.detail, + pv_module.device_id, + ep.equipmentName`).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.PvModuleListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.PvModuleListRes{ + Id: v.Id, + FangzhenId: v.FangzhenId, + SubProjectid: v.SubProjectid, + WorkId: v.WorkId, + Name: v.Name, + Status: v.Status, + DoneTime: v.DoneTime, + Detail: v.Detail, + DeviceID: v.DeviceID, + DivertorName: v.DivertorName, + } + } + + // 排序 + //sort.Slice(listRes.List, func(i, j int) bool { + // return listRes.List[i].Name < listRes.List[j].Name + //}) + }) + return +} + +func (s *sPvModule) GetById(ctx context.Context, id uint) (res *model.PvModuleInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.PvModule.Ctx(ctx).WithAll().Where(dao.PvModule.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sPvModule) Add(ctx context.Context, req *system.PvModuleAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.PvModule.Ctx(ctx).Insert(do.PvModule{ + FangzhenId: req.FangzhenId, + SubProjectid: req.SubProjectid, + WorkId: req.WorkId, + Name: req.Name, + Status: req.Status, + DoneTime: req.DoneTime, + Detail: req.Detail, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sPvModule) Edit(ctx context.Context, req *system.PvModuleEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.PvModule.Ctx(ctx).WherePri(req.Id).Update(do.PvModule{ + FangzhenId: req.FangzhenId, + SubProjectid: req.SubProjectid, + WorkId: req.WorkId, + Name: req.Name, + Status: req.Status, + DoneTime: req.DoneTime, + Detail: req.Detail, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sPvModule) Delete(ctx context.Context, ids []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.PvModule.Ctx(ctx).Delete(dao.PvModule.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +type PvModule struct { + Name string + Detail string +} + +// 箱变上传 +func (s *sPvModule) Import(ctx context.Context, req *system.PvModuleImportReq) (err error) { + // 判断传入子项目ID和方阵ID是否存在 + exist, err := dao.QianqiFangzhen.Ctx(ctx).Where(dao.QianqiFangzhen.Columns().ProjectId, req.SubProjectID). + Where(dao.QianqiFangzhen.Columns().Id, req.FangZhenID).Count() + if err != nil { + return err + } + + if exist == 0 { + return fmt.Errorf("子项目ID或方阵ID不存在") + } + + // 读取shp文件 + shapes, err := ProcessFiles(ctx, req.Files) + if err != nil { + return err + } + + // 获取所有箱变名 + xbNames := map[string]PvModule{} + for i := 0; i < len(shapes.Polylines); i++ { + // 经纬度坐标 + detailJSON, _ := json.Marshal(shapes.Polylines[i]) + + xbNames[shapes.Polylines[i].Name] = PvModule{ + Name: shapes.Polylines[i].Name, + Detail: *(*string)(unsafe.Pointer(&detailJSON)), + } + } + + // 获取所有方阵 + fangzhens := []entity.QianqiFangzhen{} + if queryErr := dao.QianqiFangzhen.Ctx(ctx).Where(dao.QianqiFangzhen.Columns().ProjectId, req.SubProjectID). + Scan(&fangzhens); queryErr != nil { + return queryErr + } + + // 批量插入列表 + var modulesToInsert []do.PvModule + + // 遍历所有方阵 + for i := 0; i < len(fangzhens); i++ { + f := fangzhens[i] // 当前方阵 + + // 获取指定方阵在 work_status 表中Type 为 23-28 的数据 + workStatuses := []entity.WorkStatus{} + if err = dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, f.Id). + WhereBetween(dao.WorkStatus.Columns().Type, consts.HighVoltageBoxChangeFoundation, consts.HighVoltageCableDebuggingTest). + Scan(&workStatuses); err != nil { + return err + } + + // 遍历a,将所有箱变插入到数据库中 + for _, workStatus := range workStatuses { + if _, ok := xbNames[f.Name]; !ok { + continue + } + + module := xbNames[f.Name] + // 删除当前方阵下的所有箱变 + _, err := dao.PvModule.Ctx(ctx).Where(dao.PvModule.Columns().FangzhenId, f.Id). + Where(dao.PvModule.Columns().SubProjectid, f.ProjectId). + WhereBetween(dao.PvModule.Columns().Type, consts.HighVoltageBoxChangeFoundation, consts.HighVoltageCableDebuggingTest). + Delete() + if err != nil { + return err + } + + modulesToInsert = append(modulesToInsert, do.PvModule{ + FangzhenId: f.Id, + SubProjectid: f.ProjectId, + WorkId: workStatus.WorkId, + Name: module.Name, + Detail: module.Detail, + Type: workStatus.Type, + }) + + // 更新 work_status 表中的 Total 字段 + _, err = dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, f.Id). + WhereBetween(dao.WorkStatus.Columns().Type, consts.HighVoltageBoxChangeFoundation, consts.HighVoltageCableDebuggingTest). + Data( + g.Map{ + dao.WorkStatus.Columns().Total: 1, + }, + ).Update() + if err != nil { + return err + } + } + } + + if len(modulesToInsert) > 0 { + dao.PvModule.Ctx(ctx).Batch(500).Insert(&modulesToInsert) + } + + return nil +} +func (s *sPvModule) ImportCory(ctx context.Context, req *system.PvModuleImportCory) (err error) { + // 判断传入子项目ID和方阵ID是否存在 + exist, err := dao.QianqiFangzhen.Ctx(ctx).Where(dao.QianqiFangzhen.Columns().ProjectId, req.SubProjectID). + Where(dao.QianqiFangzhen.Columns().Id, req.FangZhenID).Count() + if err != nil { + return err + } + + if exist == 0 { + return fmt.Errorf("子项目ID或方阵ID不存在") + } + + shapes := req.Shapes + + // 获取所有箱变名 + xbNames := map[string]PvModule{} + for i := 0; i < len(shapes.Polylines); i++ { + // 经纬度坐标 + detailJSON, _ := json.Marshal(shapes.Polylines[i]) + xbNames[shapes.Polylines[i].Name] = PvModule{ + Name: shapes.Polylines[i].Name, + Detail: *(*string)(unsafe.Pointer(&detailJSON)), + } + } + + // 获取所有方阵 + fangzhens := []entity.QianqiFangzhen{} + if queryErr := dao.QianqiFangzhen.Ctx(ctx).Where(dao.QianqiFangzhen.Columns().ProjectId, req.SubProjectID). + Scan(&fangzhens); queryErr != nil { + return queryErr + } + + // 批量插入列表 + var modulesToInsert []do.PvModule + + // 遍历所有方阵 + for i := 0; i < len(fangzhens); i++ { + f := fangzhens[i] // 当前方阵 + + // 获取指定方阵在 work_status 表中Type 为 23-28 的数据 + workStatuses := []entity.WorkStatus{} + if err = dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, f.Id). + WhereBetween(dao.WorkStatus.Columns().Type, consts.HighVoltageBoxChangeFoundation, consts.HighVoltageCableDebuggingTest). + Scan(&workStatuses); err != nil { + return err + } + + // 遍历a,将所有箱变插入到数据库中 + for _, workStatus := range workStatuses { + if _, ok := xbNames[f.Name]; !ok { + continue + } + + module := xbNames[f.Name] + // 删除当前方阵下的所有箱变 + _, err := dao.PvModule.Ctx(ctx).Where(dao.PvModule.Columns().FangzhenId, f.Id). + Where(dao.PvModule.Columns().SubProjectid, f.ProjectId). + WhereBetween(dao.PvModule.Columns().Type, consts.HighVoltageBoxChangeFoundation, consts.HighVoltageCableDebuggingTest). + Delete() + if err != nil { + return err + } + + modulesToInsert = append(modulesToInsert, do.PvModule{ + FangzhenId: f.Id, + SubProjectid: f.ProjectId, + WorkId: workStatus.WorkId, + Name: module.Name, + Detail: module.Detail, + Type: workStatus.Type, + }) + + // 更新 work_status 表中的 Total 字段 + _, err = dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, f.Id). + WhereBetween(dao.WorkStatus.Columns().Type, consts.HighVoltageBoxChangeFoundation, consts.HighVoltageCableDebuggingTest). + Data( + g.Map{ + dao.WorkStatus.Columns().Total: 1, + }, + ).Update() + if err != nil { + return err + } + } + } + + if len(modulesToInsert) > 0 { + dao.PvModule.Ctx(ctx).Batch(500).Insert(&modulesToInsert) + } + + return nil +} + +// 导入逆变器 +func (s *sPvModule) ImportInverter(ctx context.Context, req *system.PvModuleImportInverterReq) error { + // 判断传入子项目ID和方阵ID是否存在 + exist, err := dao.QianqiFangzhen.Ctx(ctx).Where(dao.QianqiFangzhen.Columns().ProjectId, req.SubProjectID). + Where(dao.QianqiFangzhen.Columns().Id, req.FangZhenID).Count() + if err != nil { + return err + } + + if exist == 0 { + return fmt.Errorf("子项目ID或方阵ID不存在") + } + + // 读取shp文件 + shapes, err := ProcessFiles(ctx, req.Files) + if err != nil { + return err + } + + // 获取所有逆变器子阵名 + var pvNames []PvModule + for i := 0; i < len(shapes.Polylines); i++ { + // 经纬度坐标 + detailJSON, _ := json.Marshal(shapes.Polylines[i]) + + pvNames = append(pvNames, PvModule{ + Name: shapes.Polylines[i].Name, + Detail: *(*string)(unsafe.Pointer(&detailJSON)), + }) + } + + // 对 pvNames 进行处理,将其按照方阵名进行分组 + // 逆变器子阵 N01.01, N01.02, N02.01, N02.02 + // N01: [01, 02] + // N02: [01, 02] + pvNameToModules := map[string][]PvModule{} + if len(pvNames) > 0 { + for _, originalName := range pvNames { + modifiedName := strings.Replace(originalName.Name, "N", "T", 1) + nameParts := strings.Split(modifiedName, ".") + + // 对 G01.01 拆分 + moduleName := nameParts[0] // G01 + pvNameToModules[moduleName] = append(pvNameToModules[moduleName], originalName) + } + } + + // 获取所有方阵 + fangzhens := []entity.QianqiFangzhen{} + if queryErr := dao.QianqiFangzhen.Ctx(ctx).Where(dao.QianqiFangzhen.Columns().ProjectId, req.SubProjectID). + Scan(&fangzhens); queryErr != nil { + return queryErr + } + + // 批量插入列表 + var modulesToInsert []do.PvModule + + // 遍历所有方阵 + for i := 0; i < len(fangzhens); i++ { + // 获取当前方阵 + f := fangzhens[i] + + // 如果当前方阵名在 pvNameToModules 中 + // 那么更新 work_status 表中的 Total 字段 + if modules, ok := pvNameToModules[f.Name]; ok { + // 获取一遍当前方阵下的所有逆变器 + pvModules := []entity.PvModule{} + if queryErr := dao.PvModule.Ctx(ctx).Where(dao.PvModule.Columns().FangzhenId, f.Id). + Where(dao.PvModule.Columns().SubProjectid, f.ProjectId). + Fields(dao.PvModule.Columns().Name). + WhereBetween(dao.PvModule.Columns().Type, consts.LowVoltageInverterInstallation, consts.LowVoltageDebugging). + Scan(&pvModules); queryErr != nil { + return queryErr + } + + groundingModules := []entity.PvModule{} + if queryErr := dao.PvModule.Ctx(ctx).Where(dao.PvModule.Columns().FangzhenId, f.Id). + Where(dao.PvModule.Columns().SubProjectid, f.ProjectId). + Fields(dao.PvModule.Columns().Name). + WhereBetween(dao.PvModule.Columns().Type, consts.GroundingDitch, consts.GroundingTesting). + Scan(&groundingModules); queryErr != nil { + return queryErr + } + + pvModules = append(pvModules, groundingModules...) + + pvModuleMap := make(map[string]struct{}) + for _, pvModule := range pvModules { + pvModuleMap[pvModule.Name] = struct{}{} + } + + // TODO: 优化 + // 查询指定 方阵ID 下指定 type 为 18-21 的数据的 WorkID + // 创建列表 + var workStatuses []entity.WorkStatus + err := dao.WorkStatus.Ctx(ctx). + Where(dao.WorkStatus.Columns().FangzhenId, f.Id). + WhereBetween(dao.WorkStatus.Columns().Type, consts.LowVoltageInverterInstallation, consts.LowVoltageDebugging). + Fields(dao.WorkStatus.Columns().WorkId, dao.WorkStatus.Columns().Type). + Scan(&workStatuses) + if err != nil { + return err + } + + // 查询指定方阵下Type 为 2-4 的 WorkID + // 创建列表 + var workStatuses2 []entity.WorkStatus + err = dao.WorkStatus.Ctx(ctx). + Where(dao.WorkStatus.Columns().FangzhenId, f.Id). + WhereBetween(dao.WorkStatus.Columns().Type, consts.GroundingDitch, consts.GroundingTesting). + Fields(dao.WorkStatus.Columns().WorkId, dao.WorkStatus.Columns().Type). + Scan(&workStatuses2) + if err != nil { + return err + } + + workStatuses = lo.Uniq(append(workStatuses, workStatuses2...)) + + // 遍历当前方阵下的所有逆变器 + temp := []PvModule{} + for _, module := range modules { + // 如果当前逆变器名在 pvModuleMap 中,那么不再添加 + if _, ok := pvModuleMap[module.Name]; !ok { + temp = append(temp, module) + } + } + + if len(temp) > 0 { + // 更新 work_status 表中的 Total 字段 + _, err = dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, f.Id). + WhereBetween(dao.WorkStatus.Columns().Type, consts.LowVoltageInverterInstallation, consts.LowVoltageDebugging). + Data( + g.Map{ + dao.WorkStatus.Columns().Total: gdb.Raw(fmt.Sprintf("total+%d", len(temp))), + }, + ).Update() + if err != nil { + return err + } + + _, err = dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, f.Id). + WhereBetween(dao.WorkStatus.Columns().Type, consts.GroundingDitch, consts.GroundingTesting). + Data( + g.Map{ + dao.WorkStatus.Columns().Total: gdb.Raw(fmt.Sprintf("total+%d", len(temp))), + }, + ).Update() + if err != nil { + return err + } + + // 预分配切片的容量 + pvModules := make([]do.PvModule, 0, len(workStatuses)*len(temp)) + for idx := 0; idx < len(workStatuses); idx++ { + for j := 0; j < len(temp); j++ { + pvModules = append(pvModules, do.PvModule{ + FangzhenId: f.Id, + SubProjectid: f.ProjectId, + WorkId: workStatuses[idx].WorkId, + Name: temp[j].Name, + Detail: temp[j].Detail, + Type: workStatuses[idx].Type, + }) + } + } + + modulesToInsert = append(modulesToInsert, pvModules...) + } + } + } + + if len(modulesToInsert) > 0 { + dao.PvModule.Ctx(ctx).Batch(700).Insert(&modulesToInsert) + } + + return nil +} +func (s *sPvModule) ImportInverterCory(ctx context.Context, req *system.ImportInverterCory) error { + // 判断传入子项目ID和方阵ID是否存在 + exist, err := dao.QianqiFangzhen.Ctx(ctx).Where(dao.QianqiFangzhen.Columns().ProjectId, req.SubProjectID). + Where(dao.QianqiFangzhen.Columns().Id, req.FangZhenID).Count() + if err != nil { + return err + } + + if exist == 0 { + return fmt.Errorf("子项目ID或方阵ID不存在") + } + + shapes := req.Shapes + + // 获取所有逆变器子阵名 + var pvNames []PvModule + for i := 0; i < len(shapes.Polylines); i++ { + // 经纬度坐标 + detailJSON, _ := json.Marshal(shapes.Polylines[i]) + + pvNames = append(pvNames, PvModule{ + Name: shapes.Polylines[i].Name, + Detail: *(*string)(unsafe.Pointer(&detailJSON)), + }) + } + + // 对 pvNames 进行处理,将其按照方阵名进行分组 + // 逆变器子阵 N01.01, N01.02, N02.01, N02.02 + // N01: [01, 02] + // N02: [01, 02] + pvNameToModules := map[string][]PvModule{} + if len(pvNames) > 0 { + for _, originalName := range pvNames { + modifiedName := strings.Replace(originalName.Name, "N", "T", 1) + nameParts := strings.Split(modifiedName, ".") + + // 对 G01.01 拆分 + moduleName := nameParts[0] // G01 + pvNameToModules[moduleName] = append(pvNameToModules[moduleName], originalName) + } + } + + // 获取所有方阵 + fangzhens := []entity.QianqiFangzhen{} + if queryErr := dao.QianqiFangzhen.Ctx(ctx).Where(dao.QianqiFangzhen.Columns().ProjectId, req.SubProjectID). + Scan(&fangzhens); queryErr != nil { + return queryErr + } + + // 批量插入列表 + var modulesToInsert []do.PvModule + + // 遍历所有方阵 + for i := 0; i < len(fangzhens); i++ { + // 获取当前方阵 + f := fangzhens[i] + + // 如果当前方阵名在 pvNameToModules 中 + // 那么更新 work_status 表中的 Total 字段 + if modules, ok := pvNameToModules[f.Name]; ok { + // 获取一遍当前方阵下的所有逆变器 + pvModules := []entity.PvModule{} + if queryErr := dao.PvModule.Ctx(ctx).Where(dao.PvModule.Columns().FangzhenId, f.Id). + Where(dao.PvModule.Columns().SubProjectid, f.ProjectId). + Fields(dao.PvModule.Columns().Name). + WhereBetween(dao.PvModule.Columns().Type, consts.LowVoltageInverterInstallation, consts.LowVoltageDebugging). + Scan(&pvModules); queryErr != nil { + return queryErr + } + + groundingModules := []entity.PvModule{} + if queryErr := dao.PvModule.Ctx(ctx).Where(dao.PvModule.Columns().FangzhenId, f.Id). + Where(dao.PvModule.Columns().SubProjectid, f.ProjectId). + Fields(dao.PvModule.Columns().Name). + WhereBetween(dao.PvModule.Columns().Type, consts.GroundingDitch, consts.GroundingTesting). + Scan(&groundingModules); queryErr != nil { + return queryErr + } + + pvModules = append(pvModules, groundingModules...) + + pvModuleMap := make(map[string]struct{}) + for _, pvModule := range pvModules { + pvModuleMap[pvModule.Name] = struct{}{} + } + + // TODO: 优化 + // 查询指定 方阵ID 下指定 type 为 18-21 的数据的 WorkID + // 创建列表 + var workStatuses []entity.WorkStatus + err := dao.WorkStatus.Ctx(ctx). + Where(dao.WorkStatus.Columns().FangzhenId, f.Id). + WhereBetween(dao.WorkStatus.Columns().Type, consts.LowVoltageInverterInstallation, consts.LowVoltageDebugging). + Fields(dao.WorkStatus.Columns().WorkId, dao.WorkStatus.Columns().Type). + Scan(&workStatuses) + if err != nil { + return err + } + + // 查询指定方阵下Type 为 2-4 的 WorkID + // 创建列表 + var workStatuses2 []entity.WorkStatus + err = dao.WorkStatus.Ctx(ctx). + Where(dao.WorkStatus.Columns().FangzhenId, f.Id). + WhereBetween(dao.WorkStatus.Columns().Type, consts.GroundingDitch, consts.GroundingTesting). + Fields(dao.WorkStatus.Columns().WorkId, dao.WorkStatus.Columns().Type). + Scan(&workStatuses2) + if err != nil { + return err + } + + workStatuses = lo.Uniq(append(workStatuses, workStatuses2...)) + + // 遍历当前方阵下的所有逆变器 + temp := []PvModule{} + for _, module := range modules { + // 如果当前逆变器名在 pvModuleMap 中,那么不再添加 + if _, ok := pvModuleMap[module.Name]; !ok { + temp = append(temp, module) + } + } + + if len(temp) > 0 { + // 更新 work_status 表中的 Total 字段 + _, err = dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, f.Id). + WhereBetween(dao.WorkStatus.Columns().Type, consts.LowVoltageInverterInstallation, consts.LowVoltageDebugging). + Data( + g.Map{ + dao.WorkStatus.Columns().Total: gdb.Raw(fmt.Sprintf("total+%d", len(temp))), + }, + ).Update() + if err != nil { + return err + } + + _, err = dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, f.Id). + WhereBetween(dao.WorkStatus.Columns().Type, consts.GroundingDitch, consts.GroundingTesting). + Data( + g.Map{ + dao.WorkStatus.Columns().Total: gdb.Raw(fmt.Sprintf("total+%d", len(temp))), + }, + ).Update() + if err != nil { + return err + } + + // 预分配切片的容量 + pvModules := make([]do.PvModule, 0, len(workStatuses)*len(temp)) + for idx := 0; idx < len(workStatuses); idx++ { + for j := 0; j < len(temp); j++ { + pvModules = append(pvModules, do.PvModule{ + FangzhenId: f.Id, + SubProjectid: f.ProjectId, + WorkId: workStatuses[idx].WorkId, + Name: temp[j].Name, + Detail: temp[j].Detail, + Type: workStatuses[idx].Type, + }) + } + } + + modulesToInsert = append(modulesToInsert, pvModules...) + } + } + } + + if len(modulesToInsert) > 0 { + dao.PvModule.Ctx(ctx).Batch(700).Insert(&modulesToInsert) + } + + return nil +} + +// ImportPvBoard 导入光伏板 +func (s *sPvModule) ImportPvBoard(ctx context.Context, req *system.PvModuleImportPvBoardReq) error { + // 判断传入子项目ID和方阵ID是否存在 + exist, err := dao.QianqiFangzhen.Ctx(ctx).Where(dao.QianqiFangzhen.Columns().ProjectId, req.SubProjectID). + Where(dao.QianqiFangzhen.Columns().Id, req.FangZhenID).Count() + if err != nil { + return err + } + + if exist == 0 { + return fmt.Errorf("子项目ID或方阵ID不存在") + } + + // 读取shp文件 + shapes, err := ProcessFiles(ctx, req.Files) + if err != nil { + return err + } + + // 获取所有逆变器子阵名 + var pvNames []PvModule + for i := 0; i < len(shapes.Polylines); i++ { + // 经纬度坐标 + detailJSON, _ := json.Marshal(shapes.Polylines[i]) + + pvNames = append(pvNames, PvModule{ + Name: shapes.Polylines[i].Name, + Detail: *(*string)(unsafe.Pointer(&detailJSON)), + }) + } + + // 对 pvNames 进行处理,将其按照方阵名进行分组 + // 逆变器子阵 G01.01.01,G01.01.02,G01.01.03 + // G01: [G01.01.01,G01.01.02,G01.01.03] + pvNameToModules := map[string][]PvModule{} + if len(pvNames) > 0 { + for _, originalName := range pvNames { + modifiedName := strings.Replace(originalName.Name, "G", "T", 1) + nameParts := strings.Split(modifiedName, ".") + + // 对 G01.01.01 拆分 + moduleName := nameParts[0] // G01 + pvNameToModules[moduleName] = append(pvNameToModules[moduleName], originalName) + } + } + + // 根据项目ID获取所有方阵 + fangzhens := []entity.QianqiFangzhen{} + if queryErr := dao.QianqiFangzhen.Ctx(ctx). + Where(dao.QianqiFangzhen.Columns().ProjectId, req.SubProjectID). + Scan(&fangzhens); queryErr != nil { + return queryErr + } + + // 等待批量插入的数据 + var modulesToInsert []do.PvModule + + for i := 0; i < len(fangzhens); i++ { + f := fangzhens[i] // 当前方阵 + + // 如果当前方阵名在 pvNameToModules 中 + // 那么更新 work_status 表中的 Total 字段 + if modules, ok := pvNameToModules[f.Name]; ok { + // 获取一遍当前方阵下的所有逆变器 + allPvModules := []entity.PvModule{} + if queryErr := dao.PvModule.Ctx(ctx).Where(dao.PvModule.Columns().FangzhenId, f.Id). + Where(dao.PvModule.Columns().SubProjectid, f.ProjectId). + WhereBetween(dao.PvModule.Columns().Type, consts.LowVoltageDrilling, consts.LowVoltageGroundWire). + Fields(dao.PvModule.Columns().Name).Scan(&allPvModules); queryErr != nil { + return queryErr + } + + // 缓存数据库中已有数据到 map + // 用于判断后续新增的逆变器是否已经存在 + // 避免重复插入 + pvModuleKeySet := make(map[string]struct{}) + for _, pvModule := range allPvModules { + pvModuleKeySet[pvModule.Name] = struct{}{} + } + + // 遍历当前方阵下的所有逆变器 + uniqueModules := []PvModule{} + for _, module := range modules { + // 如果当前逆变器名在 pvModuleKeySet 中,那么不再添加 + if _, ok := pvModuleKeySet[module.Name]; !ok { + uniqueModules = append(uniqueModules, module) + } + } + + // 查询指定 方阵ID 下指定 type 为 12-17 的数据的 WorkID + var workStatuses []entity.WorkStatus + if err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, f.Id). + WhereBetween(dao.WorkStatus.Columns().Type, consts.LowVoltageDrilling, consts.LowVoltageGroundWire). + Scan(&workStatuses); err != nil { + return err + } + + // 开始插入数据 + if len(uniqueModules) > 0 { + // 更新 work_status 表中的 Total 字段 + _, err = dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, f.Id). + WhereBetween(dao.WorkStatus.Columns().Type, consts.LowVoltageDrilling, consts.LowVoltageGroundWire). + Data( + g.Map{ + dao.WorkStatus.Columns().Total: gdb.Raw(fmt.Sprintf("total+%d", len(uniqueModules))), + }, + ).Update() + if err != nil { + return err + } + + pvModules := make([]do.PvModule, 0, len(workStatuses)*len(uniqueModules)) + // 批量创建 + for idx := 0; idx < len(workStatuses); idx++ { + for j := 0; j < len(uniqueModules); j++ { + pvModules = append(pvModules, do.PvModule{ + FangzhenId: f.Id, + SubProjectid: f.ProjectId, + WorkId: workStatuses[idx].WorkId, + Name: uniqueModules[j].Name, + Detail: uniqueModules[j].Detail, + Type: workStatuses[idx].Type, + }) + } + } + modulesToInsert = append(modulesToInsert, pvModules...) + } + } + } + + if len(modulesToInsert) > 0 { + dao.PvModule.Ctx(ctx).Batch(500).Insert(&modulesToInsert) + } + + return nil +} +func (s *sPvModule) ImportPvBoardCory(ctx context.Context, req *system.ImportPvBoardCory) error { + // 判断传入子项目ID和方阵ID是否存在 + exist, err := dao.QianqiFangzhen.Ctx(ctx).Where(dao.QianqiFangzhen.Columns().ProjectId, req.SubProjectID). + Where(dao.QianqiFangzhen.Columns().Id, req.FangZhenID).Count() + if err != nil { + return err + } + + if exist == 0 { + return fmt.Errorf("子项目ID或方阵ID不存在") + } + + // 读取shp文件 + shapes := req.Shapes + + // 获取所有逆变器子阵名 + var pvNames []PvModule + for i := 0; i < len(shapes.Polylines); i++ { + // 经纬度坐标 + detailJSON, _ := json.Marshal(shapes.Polylines[i]) + + pvNames = append(pvNames, PvModule{ + Name: shapes.Polylines[i].Name, + Detail: *(*string)(unsafe.Pointer(&detailJSON)), + }) + } + + // 对 pvNames 进行处理,将其按照方阵名进行分组 + // 逆变器子阵 G01.01.01,G01.01.02,G01.01.03 + // G01: [G01.01.01,G01.01.02,G01.01.03] + pvNameToModules := map[string][]PvModule{} + if len(pvNames) > 0 { + for _, originalName := range pvNames { + modifiedName := strings.Replace(originalName.Name, "G", "T", 1) + nameParts := strings.Split(modifiedName, ".") + + // 对 G01.01.01 拆分 + moduleName := nameParts[0] // G01 + pvNameToModules[moduleName] = append(pvNameToModules[moduleName], originalName) + } + } + + // 根据项目ID获取所有方阵 + fangzhens := req.Fangzhens + + // 等待批量插入的数据 + var modulesToInsert []do.PvModule + + for i := 0; i < len(fangzhens); i++ { + f := fangzhens[i] // 当前方阵 + + // 如果当前方阵名在 pvNameToModules 中 + // 那么更新 work_status 表中的 Total 字段 + if modules, ok := pvNameToModules[f.Name]; ok { + // 获取一遍当前方阵下的所有逆变器 + allPvModules := []entity.PvModule{} + if queryErr := dao.PvModule.Ctx(ctx).Where(dao.PvModule.Columns().FangzhenId, f.Id). + Where(dao.PvModule.Columns().SubProjectid, f.ProjectId). + WhereBetween(dao.PvModule.Columns().Type, consts.LowVoltageDrilling, consts.LowVoltageGroundWire). + Fields(dao.PvModule.Columns().Name).Scan(&allPvModules); queryErr != nil { + return queryErr + } + + // 缓存数据库中已有数据到 map + // 用于判断后续新增的逆变器是否已经存在 + // 避免重复插入 + pvModuleKeySet := make(map[string]struct{}) + for _, pvModule := range allPvModules { + pvModuleKeySet[pvModule.Name] = struct{}{} + } + + // 遍历当前方阵下的所有逆变器 + uniqueModules := []PvModule{} + for _, module := range modules { + // 如果当前逆变器名在 pvModuleKeySet 中,那么不再添加 + if _, ok := pvModuleKeySet[module.Name]; !ok { + uniqueModules = append(uniqueModules, module) + } + } + + // 查询指定 方阵ID 下指定 type 为 12-17 的数据的 WorkID + var workStatuses []entity.WorkStatus + if err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, f.Id). + WhereBetween(dao.WorkStatus.Columns().Type, consts.LowVoltageDrilling, consts.LowVoltageGroundWire). + Scan(&workStatuses); err != nil { + return err + } + + fmt.Println("?????????????????", len(uniqueModules)) + fmt.Println("?????????????????", len(uniqueModules)) + fmt.Println("?????????????????", len(uniqueModules)) + fmt.Println("?????????????????", len(uniqueModules)) + fmt.Println("?????????????????", len(uniqueModules)) + // 开始插入数据 + if len(uniqueModules) > 0 { + // 更新 work_status 表中的 Total 字段 + _, err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, f.Id). + WhereBetween(dao.WorkStatus.Columns().Type, consts.LowVoltageDrilling, consts.LowVoltageGroundWire). + Data( + g.Map{ + dao.WorkStatus.Columns().Total: gdb.Raw(fmt.Sprintf("total+%d", len(uniqueModules))), + }, + ).Update() + if err != nil { + return err + } + + pvModules := make([]do.PvModule, 0, len(workStatuses)*len(uniqueModules)) + // 批量创建 + for idx := 0; idx < len(workStatuses); idx++ { + for j := 0; j < len(uniqueModules); j++ { + pvModules = append(pvModules, do.PvModule{ + FangzhenId: f.Id, + SubProjectid: f.ProjectId, + WorkId: workStatuses[idx].WorkId, + Name: uniqueModules[j].Name, + Detail: uniqueModules[j].Detail, + Type: workStatuses[idx].Type, + }) + } + } + modulesToInsert = append(modulesToInsert, pvModules...) + } + } + } + + if len(modulesToInsert) > 0 { + dao.PvModule.Ctx(ctx).Batch(500).Insert(&modulesToInsert) + } + + return nil +} + +func ProcessFiles(ctx context.Context, files []*ghttp.UploadFile) (*shp.ShpObj, error) { + var filePaths string + + // 遍历请求中的所有文件 + for _, file := range files { + // 保存文件后返回其路径 + uploadedFilePath, err := coryCommon.UploadFile(ctx, file, coryCommon.LargeFileShp) + if err != nil { + return nil, err + } + + // 将文件路径按"."分割成切片 + filePathParts := strings.Split(uploadedFilePath, ".") + // 如果切片长度大于1,将最后一个元素(文件扩展名)改为"shp" + if len(filePathParts) > 1 { + filePathParts[len(filePathParts)-1] = "shp" + } + // 将修改后的切片重新组合成文件路径,并将其添加到文件路径中 + updatedFilePath := strings.Join(filePathParts, ".") + filePaths = updatedFilePath + } + + err, shp := shp.ReadShp(filePaths) + if err != nil { + return nil, err + } + + return shp, nil +} + +// AddWorkSchedule 添加日报 +func (s *sPvModule) AddWorkSchedule(ctx context.Context, req *system.PvModuleAddDailyReq) error { + // 将其设备修改为绑定状态 + updatedRow, err := dao.PvModule.Ctx(ctx).WhereIn(dao.PvModule.Columns().Id, req.Ids). + Update(g.Map{ + dao.PvModule.Columns().Status: 2, + dao.PvModule.Columns().DoneTime: gconv.Time(req.DoneTime), + }) + if err != nil { + return err + } + + // 获取影响行数 + affectedRows, err := updatedRow.RowsAffected() + if err != nil { + return err + } + + affectedRowsInt := int(affectedRows) + if affectedRowsInt == 0 { // 如果影响行数为0,直接返回 + return nil + } + + // 获取指定 WorkID 的数据 + var workSchedule *entity.WorkSchedule + if err := dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().WorkId, req.WorkID).Where(dao.WorkSchedule.Columns().Id, req.PlanID).Scan(&workSchedule); err != nil { + return err + } + + var scheduleDetails []model.WorkScheduleDetail + if err := json.Unmarshal([]byte(workSchedule.Detail), &scheduleDetails); err != nil { + return err + } + + totalFinishedNum := 0 + // 遍历 scheduleDetails 匹配 req.submitDate 的时间 + for i, scheduleDetail := range scheduleDetails { + if scheduleDetail.Date == req.DoneTime.Format("Y-m-d") { + // 修改其 FinishedNum + scheduleDetails[i].FinishedNum += affectedRowsInt // TODO: 在PV_module 中影响多少行则修改多少行 + } + totalFinishedNum += scheduleDetails[i].FinishedNum + } + + // 判断计划是否已经完成 + planStatus := 1 + // 是否已经完成 + if totalFinishedNum >= workSchedule.PlanNum { + // 状态不能为延期和未开始 + if workSchedule.Status != 3 { + // 不能超时 + if time.Now().Format("2006-01-02") <= workSchedule.EndAt.Format("Y-m-d") { + planStatus = 2 + } else { + planStatus = 3 + } + } + } + + // 序列化 scheduleDetails + schedulesJSON, _ := json.Marshal(scheduleDetails) + schedulesJSONStr := *(*string)(unsafe.Pointer(&schedulesJSON)) + + err = g.Try(ctx, func(ctx context.Context) { + updateData := g.Map{ + dao.WorkSchedule.Columns().FinishedNum: totalFinishedNum, + dao.WorkSchedule.Columns().Detail: schedulesJSONStr, + dao.WorkSchedule.Columns().Status: planStatus, + } + // 更新计划表中的数据 + _, err := dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().WorkId, req.WorkID).Where(dao.WorkSchedule.Columns().Id, req.PlanID).Data(updateData).Update() + liberr.ErrIsNil(ctx, err, "更新计划表失败") + + // 重新统计 + // SUM(完成量) AND WHERE work_id = req.WorkID + finishedNum, err := dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().WorkId, req.WorkID).Sum(dao.WorkSchedule.Columns().FinishedNum) + liberr.ErrIsNil(ctx, err, "获取数据失败") + + // 更新子任务状态 + workData := g.Map{ + dao.WorkStatus.Columns().Finished: finishedNum, + dao.WorkStatus.Columns().Status: 1, + } + _, err = dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().WorkId, req.WorkID).Data(workData).Update() + liberr.ErrIsNil(ctx, err, "更新失败") + }) + return err +} + +// 获取日报详情 +func (s *sPvModule) GetDaily(ctx context.Context, req *system.PvModuleGetDailyReq) (*system.PvModuleGetDailyRes, error) { + res := new(system.PvModuleGetDailyRes) + if err := dao.PvModule.Ctx(ctx).Where(dao.PvModule.Columns().WorkId, req.WorkID). + // Where(dao.PvModule.Columns().Id, req.Id). + Where(dao.PvModule.Columns().DoneTime, req.DoneTime). + Where(dao.PvModule.Columns().Type, req.Type).Scan(&res.List); err != nil { + return nil, err + } + + return res, nil +} + +// 删除日报 +func (s *sPvModule) DeleteDaily(ctx context.Context, req *system.PvModuleDeleteDailyReq) error { + // 移除绑定状态 + updatedRow, err := dao.PvModule.Ctx(ctx).WhereIn(dao.PvModule.Columns().Id, req.PlanID). + Update(g.Map{ + dao.PvModule.Columns().Status: 0, // 将状态设置为未开始 + dao.PvModule.Columns().DoneTime: "", // 清空完成时间 + }) + if err != nil { + return err + } + + // 获取影响行数 + affectedRows, err := updatedRow.RowsAffected() + if err != nil { + return err + } + + affectedRowsInt := int(affectedRows) + if affectedRowsInt == 0 { // 如果影响行数为0,直接返回 + return nil + } + + // 获取 work_schedule 表中数据 + var workSchedule *entity.WorkSchedule + if err := dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().WorkId, req.WorkID).Where(dao.WorkSchedule.Columns().Id, req.Id).Scan(&workSchedule); err != nil { + return err + } + + var scheduleDetails []model.WorkScheduleDetail + if err := json.Unmarshal([]byte(workSchedule.Detail), &scheduleDetails); err != nil { + return err + } + + totalFinishedTasks := 0 + + matchedPlanCount := 0 + for i := 0; i < len(scheduleDetails); i++ { + if scheduleDetails[i].Date == req.Time { + matchedPlanCount += len(req.PlanID) + scheduleDetails[i].FinishedNum -= len(req.PlanID) // 更新完成的任务数量 + } + totalFinishedTasks += scheduleDetails[i].FinishedNum // 计算总的完成任务数量 + } + + planStatus := 1 + if totalFinishedTasks <= workSchedule.PlanNum { + planStatus = 1 // 如果完成的任务数量小于等于计划的任务数量,计划状态为1 + } + if totalFinishedTasks == workSchedule.PlanNum { + planStatus = 2 // 如果完成的任务数量等于计划的任务数量,计划状态为2 + } + + schedulesJSON, _ := json.Marshal(scheduleDetails) // 将工作计划详情序列化为JSON + schedulesJSONStr := *(*string)(unsafe.Pointer(&schedulesJSON)) // 将序列化后的JSON转换为字符串 + + err = g.Try(ctx, func(ctx context.Context) { + // 更新计划表 + updateWorkScheduleData := g.Map{ + dao.WorkSchedule.Columns().FinishedNum: totalFinishedTasks, // 更新完成的任务数量 + dao.WorkSchedule.Columns().Detail: schedulesJSONStr, // 更新工作计划详情 + dao.WorkSchedule.Columns().Status: planStatus, // 更新计划状态 + } + _, err = dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().WorkId, req.WorkID).Where(dao.WorkSchedule.Columns().Id, req.Id).Data(updateWorkScheduleData).Update() + liberr.ErrIsNil(ctx, err, "更新计划失败") + + // 重新统计 + finishedNum, err := dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().WorkId, req.WorkID).Sum(dao.WorkSchedule.Columns().FinishedNum) // 计算完成的任务总量 + liberr.ErrIsNil(ctx, err, "统计子任务总量失败") + + // 更新工作状态表 + updateWorkStatusData := g.Map{ + dao.WorkStatus.Columns().Finished: finishedNum, // 更新完成的任务总量 + } + _, err = dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().WorkId, req.WorkID).Data(updateWorkStatusData).Update() + liberr.ErrIsNil(ctx, err, "更新工作状态失败") + + err = isWorkFinished(ctx, req.WorkID) + liberr.ErrIsNil(ctx, err, "isWorkFinished 更新失败") + }) + + return err +} + +// 获取指定 Work_ID 的所有日报,并重新统计是否已经完成 +func isWorkFinished(ctx context.Context, workID string) error { + // 获取指定 WorkID 的数据 + workSchedule := []entity.WorkSchedule{} + err := dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().WorkId, workID). + Scan(&workSchedule) + if err != nil { + return err + } + + // 多个计划的实际完成量 + totalFinishedNum := 0 + + // 多个计划的总计划量 + totalPlanNum := 0 + + lo.ForEach(workSchedule, func(schdule entity.WorkSchedule, _ int) { + var scheduleDetails []model.WorkScheduleDetail + if err := json.Unmarshal([]byte(schdule.Detail), &scheduleDetails); err != nil { + return + } + + lo.ForEach(scheduleDetails, func(detail model.WorkScheduleDetail, _ int) { + totalFinishedNum += detail.FinishedNum + totalPlanNum += detail.PlanNum + }) + }) + + // 如果实际完成量为计划量 + if totalFinishedNum == totalPlanNum { + // 将 Work_status 修改为 is_delay == 0 + _, err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().WorkId, workID). + Data(g.Map{ + dao.WorkStatus.Columns().IsDelay: 0, + }).Update() + if err != nil { + return err + } + } + + return nil +} diff --git a/internal/app/system/logic/qianqiBubantu/qianqi_bubantu.go b/internal/app/system/logic/qianqiBubantu/qianqi_bubantu.go new file mode 100644 index 0000000..641bf1f --- /dev/null +++ b/internal/app/system/logic/qianqiBubantu/qianqi_bubantu.go @@ -0,0 +1,178 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-07-31 11:44:41 +// 生成路径: internal/app/system/logic/qianqi_bubantu.go +// 生成人:gfast +// desc:布板图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/crypto/gmd5" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" + "strings" +) + +func init() { + service.RegisterQianqiBubantu(New()) +} + +func New() *sQianqiBubantu { + return &sQianqiBubantu{} +} + +type sQianqiBubantu struct{} + +func (s *sQianqiBubantu) List(ctx context.Context, req *system.QianqiBubantuSearchReq) (listRes *system.QianqiBubantuSearchRes, err error) { + listRes = new(system.QianqiBubantuSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.QianqiBubantu.Ctx(ctx).WithAll() + if req.ProjectId != "" { + m = m.Where(dao.QianqiBubantu.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.Name != "" { + m = m.Where(dao.QianqiBubantu.Columns().Name+" like ?", "%"+req.Name+"%") + } + + //创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.QianqiBubantu.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.QianqiBubantu.Columns().CreatedAt+" >=? AND "+dao.QianqiBubantu.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "name asc,id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.QianqiBubantuInfoRes + + if !req.NotInPlan { + m = m.Fields(system.QianqiBubantuSearchRes{}).Page(req.PageNum, req.PageSize) + } else { + m = m.Fields(system.QianqiBubantuSearchRes{}).Where(dao.QianqiBubantu.Columns().SourceId+" not in(select source_id from "+dao.PlanWeek.Table()+" where project_id=?)", req.ProjectId) + } + err = m.Order(order).Scan(&res) + + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.QianqiBubantuListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.QianqiBubantuListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + Name: v.Name, + SourceId: v.SourceId, + SourcePath: v.SourcePath, + CreatedAt: v.CreatedAt, + SourceType: v.SourceType, + GuangfubanId: v.GuangfubanId, + } + } + }) + return +} + +func (s *sQianqiBubantu) GetById(ctx context.Context, id int) (res *model.QianqiBubantuInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.QianqiBubantu.Ctx(ctx).WithAll().Where(dao.QianqiBubantu.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.QianqiBubantuInfoRes) + res = &infoRes + }) + return +} + +func (s *sQianqiBubantu) Add(ctx context.Context, req *system.QianqiBubantuAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + var fileName = "" + var FilePath = "" + var sourceId = "" + res, e := service.SysProject().GetByProjectId(ctx, req.ProjectId) + if e != nil { + liberr.ErrIsNil(ctx, e) + return + } + if res == nil { + liberr.ErrIsNil(ctx, errors.New("项目不存在")) + return + } + file := req.File + for i := range file { + str, err := coryCommon.UploadFile(ctx, file[i], coryCommon.LargeFileShp) + if err != nil { + liberr.ErrIsNil(ctx, err, "上传失败!") + } + //fmt.Println(file[i].Filename) + fileName = file[i].Filename + arr := strings.Split(str, ".") + arr[len(arr)-1] = "shp" + FilePath = strings.Join(arr, ".") + //FilePath = strings.Join(split[:len(split)-1], "/") //strings.Replace(, "/resource/public", "/file", -1) + sourceId, _ = gmd5.EncryptString(FilePath) + } + count, _ := dao.QianqiBubantu.Ctx(ctx).Where(dao.QianqiBubantu.Columns().SourceId, sourceId).Count() + if count == 0 { + _, err = dao.QianqiBubantu.Ctx(ctx).Insert(&do.QianqiBubantu{ + ProjectId: req.ProjectId, + GuangfubanId: req.GuangfubanId, + Name: strings.Split(fileName, ".")[0], + SourceId: sourceId, + SourcePath: FilePath, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + } + }) + return +} + +func (s *sQianqiBubantu) Edit(ctx context.Context, req *system.QianqiBubantuEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + name := ct.New().GetLoginUser(ctx).Id + //name := "1" + _, err = dao.QianqiBubantu.Ctx(ctx).WherePri(req.Id).Update(do.QianqiBubantu{ + //ProjectId: req.ProjectId, + Name: req.Name, + //SourceId: req.SourceId, + //SourcePath: req.SourcePath, + UpdateBy: name, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sQianqiBubantu) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiBubantu.Ctx(ctx).Unscoped().Delete(dao.QianqiBubantu.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/qianqiCamera/qianqi_camera.go b/internal/app/system/logic/qianqiCamera/qianqi_camera.go new file mode 100644 index 0000000..8b6a732 --- /dev/null +++ b/internal/app/system/logic/qianqiCamera/qianqi_camera.go @@ -0,0 +1,350 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-09-30 22:37:34 +// 生成路径: internal/app/system/logic/qianqi_camera.go +// 生成人:gfast +// desc:摄像头 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "encoding/json" + "fmt" + "github.com/gogf/gf/v2/crypto/gmd5" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon/camera" + "github.com/tiger1103/gfast/v3/api/v1/common/shp" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "strconv" +) + +func init() { + service.RegisterQianqiCamera(New()) +} + +func New() *sQianqiCamera { + return &sQianqiCamera{} +} + +type sQianqiCamera struct{} + +func (s *sQianqiCamera) NotPageList(ctx context.Context, req *wxApplet.QianqiCameraSearchReq) (listRes *wxApplet.QianqiCameraSearchRes, err error) { + listRes = new(wxApplet.QianqiCameraSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.QianqiCamera.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.QianqiCamera.Columns().Id+" = ?", req.Id) + } + if req.CameraName != "" { + m = m.Where(dao.QianqiCamera.Columns().CameraName+" like ?", "%"+req.CameraName+"%") + } + if req.CameraCode != "" { + m = m.Where(dao.QianqiCamera.Columns().CameraCode+" = ?", req.CameraCode) + } + if req.Detail != "" { + m = m.Where(dao.QianqiCamera.Columns().Detail+" = ?", req.Detail) + } + if req.ProjectId != "" { + m = m.Where(dao.QianqiCamera.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.Status != "" { + m = m.Where(dao.QianqiCamera.Columns().Status+" = ?", gconv.Int(req.Status)) + } + if req.CreateddAt != "" { + m = m.Where(dao.QianqiCamera.Columns().CreateddAt+" = ?", gconv.Time(req.CreateddAt)) + } + if req.SourceType != "" { + m = m.Where(dao.QianqiCamera.Columns().SourceType+" = ?", req.SourceType) + } + if req.Serial != "" { + m = m.Where(dao.QianqiCamera.Columns().Serial+" = ?", req.Serial) + } + if req.Code != "" { + m = m.Where(dao.QianqiCamera.Columns().Code+" = ?", req.Code) + } + order := "id desc" + var res []*model.QianqiCameraInfoRes + err = m.Fields(system.QianqiCameraSearchRes{}).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.QianqiCameraListRes, len(res)) + for k, v := range res { + //坐标转换 + dt := shp.Detail{} + err = json.Unmarshal([]byte(v.Detail), &dt) + if err != nil { + liberr.ErrIsNil(ctx, err, "获取数据失败") + } + dt.Position.Lng, dt.Position.Lat = coryCommon.WGS84toGCJ02(dt.Position.Lng, dt.Position.Lat) + marshal, _ := json.Marshal(dt) + listRes.List[k] = &model.QianqiCameraListRes{ + Id: v.Id, + CameraName: v.CameraName, + CameraCode: v.CameraCode, + Detail: string(marshal), + ProjectId: v.ProjectId, + Status: v.Status, + Poster: v.Poster, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreateddAt: v.CreateddAt, + SourceType: v.SourceType, + Serial: v.Serial, + Code: v.Code, + Flv: v.Flv, + Hls: v.Hls, + Share: v.Share, + Rtc: v.Rtc, + Degree: v.Degree, + } + } + }) + return +} + +func (s *sQianqiCamera) EditCameraFunc(ctx context.Context, req *system.EditCameraReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + ip, _ := g.Cfg().Get(ctx, "LiveGBS.safety.ip") + _, err = dao.QianqiCamera.Ctx(ctx).WherePri(req.Id).Update(do.QianqiCamera{ + CameraName: req.CameraName, + Serial: req.Serial, + Code: req.Code, + Flv: "http://" + ip.String() + ":10000/sms/34020000002020000001/flv/hls/" + getkey(req.Serial, req.Code) + ".flv", + Hls: "http://" + ip.String() + ":10000/sms/34020000002020000001/hls/" + getkey(req.Serial, req.Code) + "/live.m3u8", + Share: "http://" + ip.String() + ":10000/play.html?serial=" + req.Serial + "&code=" + req.Code, + Rtc: "webrtc://" + ip.String() + ":10000/sms/34020000002020000001/rtc/" + getkey(req.Serial, req.Code), + UpdateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sQianqiCamera) EditNameAndDetail(ctx context.Context, req *system.QianqiCameraEditNameAndDetailReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + marshal, err := json.Marshal(req.Detail) + if err != nil { + return + } + _, err = dao.QianqiCamera.Ctx(ctx).Where(dao.QianqiCamera.Columns().CameraCode, req.CameraCode).Update( + g.Map{ + "camera_name": req.CameraName, + "detail": string(marshal), + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sQianqiCamera) WxEditNameAndDetail(ctx context.Context, req *system.QianqiCameraEditNameAndDetailReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + req.Detail.Position.Lng, req.Detail.Position.Lat = coryCommon.GCJ02toWGS84(req.Detail.Position.Lng, req.Detail.Position.Lat) + marshal, err := json.Marshal(req.Detail) + if err != nil { + return + } + _, err = dao.QianqiCamera.Ctx(ctx).Where(dao.QianqiCamera.Columns().CameraCode, req.CameraCode).Update( + g.Map{ + "camera_name": req.CameraName, + "detail": string(marshal), + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sQianqiCamera) List(ctx context.Context, req *system.QianqiCameraSearchReq) (listRes *system.QianqiCameraSearchRes, err error) { + listRes = new(system.QianqiCameraSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.QianqiCamera.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.QianqiCamera.Columns().Id+" = ?", req.Id) + } + if req.CameraName != "" { + m = m.Where(dao.QianqiCamera.Columns().CameraName+" like ?", "%"+req.CameraName+"%") + } + if req.CameraCode != "" { + m = m.Where(dao.QianqiCamera.Columns().CameraCode+" = ?", req.CameraCode) + } + if req.Detail != "" { + m = m.Where(dao.QianqiCamera.Columns().Detail+" = ?", req.Detail) + } + if req.ProjectId != "" { + m = m.Where(dao.QianqiCamera.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.Status != "" { + m = m.Where(dao.QianqiCamera.Columns().Status+" = ?", gconv.Int(req.Status)) + } + if req.Poster != "" { + m = m.Where(dao.QianqiCamera.Columns().Poster+" = ?", req.Poster) + } + if req.CreateBy != "" { + m = m.Where(dao.QianqiCamera.Columns().CreateBy+" = ?", req.CreateBy) + } + if req.UpdateBy != "" { + m = m.Where(dao.QianqiCamera.Columns().UpdateBy+" = ?", req.UpdateBy) + } + if req.CreateddAt != "" { + m = m.Where(dao.QianqiCamera.Columns().CreateddAt+" = ?", gconv.Time(req.CreateddAt)) + } + if req.SourceType != "" { + m = m.Where(dao.QianqiCamera.Columns().SourceType+" = ?", req.SourceType) + } + if req.Serial != "" { + m = m.Where(dao.QianqiCamera.Columns().Serial+" = ?", req.Serial) + } + if req.Code != "" { + m = m.Where(dao.QianqiCamera.Columns().Code+" = ?", req.Code) + } + if req.Flv != "" { + m = m.Where(dao.QianqiCamera.Columns().Flv+" = ?", req.Flv) + } + if req.Hls != "" { + m = m.Where(dao.QianqiCamera.Columns().Hls+" = ?", req.Hls) + } + if req.Share != "" { + m = m.Where(dao.QianqiCamera.Columns().Share+" = ?", req.Share) + } + if req.Rtc != "" { + m = m.Where(dao.QianqiCamera.Columns().Rtc+" = ?", req.Rtc) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.QianqiCameraInfoRes + err = m.Fields(system.QianqiCameraSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.QianqiCameraListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.QianqiCameraListRes{ + Id: v.Id, + CameraName: v.CameraName, + CameraCode: v.CameraCode, + Detail: v.Detail, + ProjectId: v.ProjectId, + Status: v.Status, + Poster: v.Poster, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreateddAt: v.CreateddAt, + SourceType: v.SourceType, + Serial: v.Serial, + Code: v.Code, + Flv: v.Flv, + Hls: v.Hls, + Share: v.Share, + Rtc: v.Rtc, + Degree: v.Degree, + } + } + }) + return +} + +func (s *sQianqiCamera) GetById(ctx context.Context, id int) (res *model.QianqiCameraInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.QianqiCamera.Ctx(ctx).WithAll().Where(dao.QianqiCamera.Columns().Id, id).Scan(&res) + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.QianqiCameraInfoRes) + res = &infoRes + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sQianqiCamera) Add(ctx context.Context, req *system.QianqiCameraAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + dt := shp.Detail{} + dt.Position.Lng = 106.54975946463013 + dt.Position.Lat = 23.467636909544247 + marshal, err := json.Marshal(dt) + if err != nil { + return + } + _, err = dao.QianqiCamera.Ctx(ctx).Insert(do.QianqiCamera{ + CameraName: req.CameraName, + CameraCode: gmd5.MustEncryptString(req.Serial + req.Code), + Detail: string(marshal), + ProjectId: req.ProjectId, + Serial: req.Serial, + Code: req.Code, + Flv: "http://119.45.210.154:10000/sms/34020000002020000001/flv/hls/" + getkey(req.Serial, req.Code) + ".flv", + Hls: "http://119.45.210.154:10000/sms/34020000002020000001/hls/" + getkey(req.Serial, req.Code) + "/live.m3u8", + Share: "http://119.45.210.154:10000/play.html?serial=" + req.Serial + "&code=" + req.Code, + Rtc: "webrtc://119.45.210.154:10000/sms/34020000002020000001/rtc/" + getkey(req.Serial, req.Code), + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func getkey(serial, code string) string { + return serial + "_" + code +} + +func (s *sQianqiCamera) Edit(ctx context.Context, req *system.QianqiCameraEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + marshal, err := json.Marshal(req.Degree) + if err != nil { + return + } + _, err = dao.QianqiCamera.Ctx(ctx).WherePri(req.Id).Update(do.QianqiCamera{ + Degree: string(marshal), + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sQianqiCamera) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiCamera.Ctx(ctx).Delete(dao.QianqiCamera.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +// PeriodicCameraSnapshotFunc 获取摄像的通道,然后进行快照(安全帽) +func (s *sQianqiCamera) PeriodicCameraSnapshotFunc(ctx context.Context) { + //1、获取所有摄像头的通道id + var entity []*model.QianqiCameraListRes + _ = dao.QianqiCamera.Ctx(ctx).WithAll().Where("status", "1").Scan(&entity) + if len(entity) > 0 { + fmt.Println("开始快照-安全帽") + for _, data := range entity { + int64Str, _ := strconv.ParseInt(data.ProjectId, 10, 64) + //获取预制点位 + //array, _ := dao.BusPresettingBit.Ctx(ctx).Where("camera_id", data.Id).Fields("preset").Array() + //var arr []int + //for _, ay := range array { + // arr = append(arr, ay.Int()) + //} + go camera.ChannelSnapFunc(ctx, data.Id, data.Serial, data.Code, int64Str) + } + } + return +} diff --git a/internal/app/system/logic/qianqiDixing/qianqi_dixing.go b/internal/app/system/logic/qianqiDixing/qianqi_dixing.go new file mode 100644 index 0000000..390ca94 --- /dev/null +++ b/internal/app/system/logic/qianqiDixing/qianqi_dixing.go @@ -0,0 +1,175 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-07-31 11:44:56 +// 生成路径: internal/app/system/logic/qianqi_dixing.go +// 生成人:gfast +// desc:地形 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "fmt" + "github.com/gogf/gf/v2/crypto/gmd5" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" + "strings" +) + +func init() { + service.RegisterQianqiDixing(New()) +} + +func New() *sQianqiDixing { + return &sQianqiDixing{} +} + +type sQianqiDixing struct{} + +func (s *sQianqiDixing) List(ctx context.Context, req *system.QianqiDixingSearchReq) (listRes *system.QianqiDixingSearchRes, err error) { + listRes = new(system.QianqiDixingSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.QianqiDixing.Ctx(ctx).WithAll() + if req.ProjectId != "" { + m = m.Where(dao.QianqiDixing.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.Name != "" { + m = m.Where(dao.QianqiDixing.Columns().Name+" like ?", "%"+req.Name+"%") + } + //创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.QianqiDixing.Columns().CreatedAt+" like ?", "%"+date+"%") + } + + if len(req.DateRange) != 0 { + m = m.Where(dao.QianqiDixing.Columns().CreatedAt+" >=? AND "+dao.QianqiDixing.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "name asc,id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.QianqiDixingInfoRes + + if !req.NotInPlan { + m = m.Fields(system.QianqiDixingSearchRes{}).Page(req.PageNum, req.PageSize) + } else { + m = m.Fields(system.QianqiDixingSearchRes{}).Where(dao.QianqiDixing.Columns().SourceId+" not in(select source_id from "+dao.PlanWeek.Table()+" where project_id=?)", req.ProjectId) + } + err = m.Order(order).Scan(&res) + + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.QianqiDixingListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.QianqiDixingListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + Name: v.Name, + SourceId: v.SourceId, + SourcePath: v.SourcePath, + CreatedAt: v.CreatedAt, + SourceType: v.SourceType, + } + } + }) + return +} + +func (s *sQianqiDixing) GetById(ctx context.Context, id int) (res *model.QianqiDixingInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.QianqiDixing.Ctx(ctx).WithAll().Where(dao.QianqiDixing.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.QianqiDixingInfoRes) + res = &infoRes + }) + return +} + +func (s *sQianqiDixing) Add(ctx context.Context, req *system.QianqiDixingAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + var fileName = "" + var FilePath = "" + var sourceId = "" + res, e := service.SysProject().GetByProjectId(ctx, req.ProjectId) + if e != nil { + liberr.ErrIsNil(ctx, e) + return + } + if res == nil { + liberr.ErrIsNil(ctx, errors.New("项目不存在")) + return + } + file := req.File + for i := range file { + str, err := coryCommon.UploadFile(ctx, file[i], coryCommon.LargeFileShp) + if err != nil { + liberr.ErrIsNil(ctx, err, "上传失败!") + } + fmt.Println(str) + //fmt.Println(file[i].Filename) + fileName = file[i].Filename + arr := strings.Split(str, ".") + arr[len(arr)-1] = "shp" + FilePath = strings.Join(arr, ".") + //FilePath = strings.Join(split[:len(split)-1], "/") //strings.Replace(, "/resource/public", "/file", -1) + sourceId, _ = gmd5.EncryptString(FilePath) + } + count, _ := dao.QianqiDixing.Ctx(ctx).Where(dao.QianqiDixing.Columns().SourceId, sourceId).Count() + if count == 0 { + _, err = dao.QianqiDixing.Ctx(ctx).Insert(&do.QianqiDixing{ + ProjectId: req.ProjectId, + Name: strings.Split(fileName, ".")[0], + SourceId: sourceId, + SourcePath: FilePath, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + } + }) + return +} + +func (s *sQianqiDixing) Edit(ctx context.Context, req *system.QianqiDixingEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //name := ct.New().GetLoginUser(ctx).Id + _, err = dao.QianqiDixing.Ctx(ctx).WherePri(req.Id).Update(do.QianqiDixing{ + //ProjectId: req.ProjectId, + Name: req.Name, + UpdateBy: "1", + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sQianqiDixing) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiDixing.Ctx(ctx).Unscoped().Delete(dao.QianqiDixing.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/qianqiFangzhen/qianqi_fangzhen.go b/internal/app/system/logic/qianqiFangzhen/qianqi_fangzhen.go new file mode 100644 index 0000000..5bcfa86 --- /dev/null +++ b/internal/app/system/logic/qianqiFangzhen/qianqi_fangzhen.go @@ -0,0 +1,252 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-07-31 11:20:55 +// 生成路径: internal/app/system/logic/qianqi_fangzhen.go +// 生成人:gfast +// desc:方阵 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "encoding/json" + "fmt" + "github.com/tiger1103/gfast/v3/api/v1/common/shp" + "strings" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + tool2 "github.com/tiger1103/gfast/v3/api/v1/common/tool" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + create "github.com/tiger1103/gfast/v3/third/create" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterQianqiFangzhen(New()) +} + +func New() *sQianqiFangzhen { + return &sQianqiFangzhen{} +} + +type sQianqiFangzhen struct{} + +func (s *sQianqiFangzhen) EditDetail(ctx context.Context, req *system.QianqiFangzhenEditDetailReq) (err error) { + g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + marshal, err := json.Marshal(req.Detail) + if err != nil { + fmt.Println("是否错误:", err) + return + } + _, err = dao.QianqiFangzhen.Ctx(ctx).Where("source_id", req.SourceId).Update(g.Map{"detail": string(marshal)}) + return + }) + return err + }) + return +} + +func (s *sQianqiFangzhen) List(ctx context.Context, req *system.QianqiFangzhenSearchReq) (listRes *system.QianqiFangzhenSearchRes, err error) { + listRes = new(system.QianqiFangzhenSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.QianqiFangzhen.Ctx(ctx).WithAll() + if req.ProjectId != "" { + m = m.Where(dao.QianqiFangzhen.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.Name != "" { + m = m.Where(dao.QianqiFangzhen.Columns().Name+" like ?", "%"+req.Name+"%") + } + // 创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.QianqiFangzhen.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.QianqiFangzhen.Columns().CreatedAt+" >=? AND "+dao.QianqiFangzhen.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "name asc,id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.QianqiFangzhenInfoRes + if !req.NotInPlan { + m = m.Fields(system.QianqiFangzhenSearchRes{}).Page(req.PageNum, req.PageSize) + } else { + m = m.Fields(system.QianqiFangzhenSearchRes{}).Where(dao.QianqiFangzhen.Columns().SourceId+" not in(select source_id from "+dao.PlanWeek.Table()+" where project_id=?)", req.ProjectId) + } + err = m.Fields(system.QianqiFangzhenSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.QianqiFangzhenListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.QianqiFangzhenListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + Name: v.Name, + SourceId: v.SourceId, + SourcePath: v.SourcePath, + XiangbianId: v.XiangbianId, + CreatedAt: v.CreatedAt, + Detail: v.Detail, + SourceType: v.SourceType, + } + } + }) + return +} + +func (s *sQianqiFangzhen) GetById(ctx context.Context, id int) (res *model.QianqiFangzhenInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.QianqiFangzhen.Ctx(ctx).WithAll().Where(dao.QianqiFangzhen.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + // 获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.QianqiFangzhenInfoRes) + res = &infoRes + }) + return +} + +func (s *sQianqiFangzhen) Add(ctx context.Context, req *system.QianqiFangzhenAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + FilePath := "" + file := req.File + for i := range file { + str, err := coryCommon.UploadFile(ctx, file[i], coryCommon.LargeFileShp) + if err != nil { + liberr.ErrIsNil(ctx, err, "上传失败!") + } + arr := strings.Split(str, ".") + arr[len(arr)-1] = "shp" + FilePath = strings.Join(arr, ".") + } + // 需要读取方阵里面的信息 + err1, s2 := shp.ReadShp(FilePath) + if err1 != nil { + liberr.ErrIsNil(ctx, err1) + } + + ////// 2024-12-18 原本代码为上面注释的代码 前端注释掉了文件上传,宝塔上面有shp文件 + ////FilePath := "/resource/public/shp/2024-12-18/cs方阵.shp" + ////s2 := sshp.Adasda(FilePath) + //FilePath := "" + //file := req.File + //fmt.Println("!!!!! ", len(req.File)) + //for i := range file { + // str, err := coryCommon.UploadFile(ctx, file[i], coryCommon.LargeFileShp) + // if err != nil { + // liberr.ErrIsNil(ctx, err, "上传失败!") + // } + // arr := strings.Split(str, ".") + // arr[len(arr)-1] = "shp" + // FilePath = strings.Join(arr, ".") + //} + //if len(req.File) == 0 { + // liberr.ErrIsNil(ctx, err, "没有获取相关文件!") + //} + //s2 := sshp.Adasda(FilePath) + + var templateDataList []do.WorkStatus + CreateBy := ct.New().GetLoginUser(ctx).Id + for _, p := range s2.Polylines { + // 将方阵的名称 作为方阵的id + sourceId := tool2.GetUuid() + // 判断是否已经存在了该方阵,存在了就不再添加 + count, _ := dao.QianqiFangzhen.Ctx(ctx).Where("source_id=? and project_id=?", sourceId, req.ProjectId).Count() + if count != 0 { + continue + } + marshal, err := json.Marshal(p) + if err != nil { + continue + } + nm := "" + if p.Name != "" { + nm = strings.Split(p.Name, " ")[0] + } else { + nm = p.Name + } + fangzhen, err := dao.QianqiFangzhen.Ctx(ctx).Insert(&do.QianqiFangzhen{ + ProjectId: req.ProjectId, + Name: nm, + SourceId: sourceId, + SourcePath: FilePath, + CreateBy: CreateBy, + Detail: string(marshal), + }) + templateID, err := fangzhen.LastInsertId() + if err != nil { + continue + } + templateData, err := create.FetchTemplateData(ctx, templateID) + if err != nil { + continue + } + templateDataList = append(templateDataList, templateData...) + } + _, err := dao.WorkStatus.Ctx(ctx).Data(templateDataList).Batch(50).Insert() + if err != nil { + return + } + }) + + return +} + +func changeFileExtensionToShp(filePath string) string { + fileParts := strings.Split(filePath, ".") + fileParts[len(fileParts)-1] = "shp" + return strings.Join(fileParts, ".") +} + +func (s *sQianqiFangzhen) Edit(ctx context.Context, req *system.QianqiFangzhenEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + name := ct.New().GetLoginUser(ctx).Id + _, err = dao.QianqiFangzhen.Ctx(ctx).Where(dao.QianqiFangzhen.Columns().SourceId, req.SourceId).Update(do.QianqiFangzhen{ + Name: req.Name, + Detail: req.Detail, + UpdateBy: name, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sQianqiFangzhen) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiFangzhen.Ctx(ctx).Unscoped().Delete(dao.QianqiFangzhen.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +func (s *sQianqiFangzhen) UpdateViewName(ctx context.Context, req *system.QianqiFangzhenUpdateViewNameReq) error { + err := g.Try(ctx, func(ctx context.Context) { + _, err := dao.QianqiFangzhen.Ctx(ctx).Where(dao.QianqiFangzhen.Columns().Id, req.Id). + Update(g.Map{dao.QianqiFangzhen.Columns().View: req.View}) + liberr.ErrIsNil(ctx, err, "更新失败") + }) + + return err +} diff --git a/internal/app/system/logic/qianqiGuangfuban/parse_ids.js b/internal/app/system/logic/qianqiGuangfuban/parse_ids.js new file mode 100644 index 0000000..9705587 --- /dev/null +++ b/internal/app/system/logic/qianqiGuangfuban/parse_ids.js @@ -0,0 +1,29 @@ +function start_parse(s) { + try { + let scenes = JSON.parse(s) || [] + let nodes = [] + scenes.scenes.forEach(scene => { + let arr = [] + getNode(scene, arr) + nodes.push(...arr) + }) + return JSON.stringify(nodes) + } catch (e) { + return e + } +} + +function getNode(node, arr = [], parent_name = "") { + if (node.hasOwnProperty("children")) {//存在子节点 + node.children.forEach(it => { + getNode(it, arr, node.name) + }) + } else { + if (node.type === "element") {//在地球上会渲染的 + let namearr = parent_name.split("_") + namearr.pop() + node.name = namearr.join(".") + arr.push(node) + } + } +} \ No newline at end of file diff --git a/internal/app/system/logic/qianqiGuangfuban/qianqi_guangfuban.go b/internal/app/system/logic/qianqiGuangfuban/qianqi_guangfuban.go new file mode 100644 index 0000000..ff964e0 --- /dev/null +++ b/internal/app/system/logic/qianqiGuangfuban/qianqi_guangfuban.go @@ -0,0 +1,421 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-07-31 11:31:49 +// 生成路径: internal/app/system/logic/qianqi_guangfuban.go +// 生成人:gfast +// desc:光伏板模型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + _ "embed" + "encoding/json" + "errors" + "fmt" + "github.com/dop251/goja" + "github.com/gogf/gf/v2/crypto/gmd5" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + shp2 "github.com/tiger1103/gfast/v3/api/v1/common/shp" + "github.com/tiger1103/gfast/v3/api/v1/common/source/clt" + tool2 "github.com/tiger1103/gfast/v3/api/v1/common/tool" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" + "github.com/tomchavakis/geojson/geometry" + "github.com/tomchavakis/turf-go" + "github.com/tomchavakis/turf-go/constants" + "github.com/tomchavakis/turf-go/measurement" + "strconv" + "strings" +) + +//go:embed parse_ids.js +var parse_ids string + +func init() { + service.RegisterQianqiGuangfuban(New()) +} + +func New() *sQianqiGuangfuban { + return &sQianqiGuangfuban{} +} + +type sQianqiGuangfuban struct{} + +func (s *sQianqiGuangfuban) CorrectQueryFunc(ctx context.Context, req *system.CorrectQueryFuncReq) (res *system.CorrectQueryFuncRes, err error) { + res = new(system.CorrectQueryFuncRes) + err = g.DB().Model("qianqi_guangfuban_data").Where("").Where("guangfuban_source_id", req.GuangfubanSourceId).Scan(&res) + if err != nil { + err = errors.New("查询失败!") + return + } else { + return + } +} + +func (s *sQianqiGuangfuban) CorrectFunc(ctx context.Context, req *system.CorrectFuncReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = g.DB().Model("qianqi_guangfuban_data").Ctx(ctx). + Where("guangfuban_source_id", req.GuangfubanSourceId). + Update(g.Map{"guangfuban_data": req.GuangfubanData}) + liberr.ErrIsNil(ctx, err, "原始坐标信息反序列化失败") + }) + return err +} + +func (s *sQianqiGuangfuban) CaculateZuchuan(ctx context.Context, req *system.QianqiGuangfubanCalZuchuanReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + var list []model.QianqiGuangfubanListRes + + err = dao.QianqiGuangfuban.Ctx(ctx).WithAll().Where(dao.QianqiGuangfuban.Columns().SourceId, req.SourceId).Fields(dao.QianqiGuangfuban.Columns()).Scan(&list) + + liberr.ErrIsNil(ctx, err, "获取数据失败") + + if len(list) == 0 { + liberr.ErrIsNil(ctx, err, "资源不存在") + } + if len(list[0].Detail) == 0 { + liberr.ErrIsNil(ctx, err, "请将模型平移到准确位置后再试") + } + + if len(list[0].Src_point) == 0 { + liberr.ErrIsNil(ctx, err, "请将模型无原始参考点坐标,请添加原始参考点后再试") + } + type Detail struct { + Position shp2.Point + } + //得到模型最新中心坐标 + dt := Detail{} + err = json.Unmarshal([]byte(list[0].Detail), &dt) + if err != nil { + liberr.ErrIsNil(ctx, err, "新坐标信息反序列化失败") + } + srcPoint := shp2.Point{} + err = json.Unmarshal([]byte(list[0].Src_point), &srcPoint) + if err != nil { + liberr.ErrIsNil(ctx, err, "原始坐标信息反序列化失败") + } + + //得到原始中心点和新中心点的距离 以米未单位 + distance, err := measurement.Distance(dt.Position.Lng, dt.Position.Lat, srcPoint.Lng, srcPoint.Lat, constants.UnitMeters) + if err != nil { + liberr.ErrIsNil(ctx, err, "参考点间距离计算失败") + } + //将科学计数法的转换成正常的数字 + normal := fmt.Sprintf("%f", distance) + //measurement.RhumbDestination() + //从shp读取到组串数据 + err, s2 := shp2.ReadShp(list[0].Zuchuan_path) + if err != nil { + liberr.ErrIsNil(ctx, err, "组串shp数据不存在") + } + for _, polyline := range s2.Polylines { + if polyline.Name == "G03.07.09" { + fmt.Println(polyline) + } + } + var gfbids []model.QianqiGuangfubanIdsListRes + + err = dao.QianqiGuangfubanIds.Ctx(ctx).WithAll().Where(dao.QianqiGuangfubanIds.Columns().DevId, req.SourceId). + Fields(dao.QianqiGuangfubanIds.Columns()).Scan(&gfbids) + if len(gfbids) == 0 { + liberr.ErrIsNil(ctx, err, "组串id不存在") + } + var start, end geometry.Point + start.Lng = srcPoint.Lng + start.Lat = srcPoint.Lat + + end.Lng = dt.Position.Lng + end.Lat = dt.Position.Lat + + bearing, err := measurement.RhumbBearing(start, end, false) + if err != nil { + return + } + fmt.Println(normal, *bearing) + normalbearing := fmt.Sprintf("%f", *bearing) + _, _ = strconv.ParseFloat(normalbearing, 64) + for _, gfbid := range gfbids { + var sphere []float64 + err = json.Unmarshal([]byte(gfbid.Sphere), &sphere) + if err != nil { + continue + } + //将xyz的坐标转换成wgs84 + lng, lat, _ := tool2.Xyz2Wgs84(sphere[0], sphere[1], sphere[2]) + var point geometry.Point + point.Lng = lng + point.Lat = lat + + destination, err := measurement.RhumbDestination(point, distance, *bearing, constants.UnitMeters, map[string]interface{}{}) + //destination, err := measurement.RhumbDestination(point, 2048200.953185, -153.13771370235122, constants.UnitMeters, map[string]interface{}{}) + if err != nil { + return + } + if arr, ok := destination.Geometry.Coordinates.([]float64); ok { + final_point := geometry.Point{Lng: arr[0], Lat: arr[1]} + fmt.Println("平移前", point) + //fmt.Println("平移参数", normal, normalNumber, gfbid) + fmt.Println("平移后", arr, gfbid.Name) + for _, polyline := range s2.Polylines { + var polygon geometry.Polygon + var line geometry.LineString + for _, p1 := range polyline.Positions { + gp := geometry.Point{Lng: p1.Lng, Lat: p1.Lat} + line.Coordinates = append(line.Coordinates, gp) + } + polygon.Coordinates = append(polygon.Coordinates, line) + pointInPolygon, err := turf.PointInPolygon(final_point, polygon) + if err != nil { + continue + } + if pointInPolygon { + fmt.Println("找到了", gfbid.SourceId, polyline.Name) + break + } + } + } + + //s2 := ref.Kind().String() + + } + + }) + return +} + +func (s *sQianqiGuangfuban) ImportZuchuan(ctx context.Context, req *system.QianqiGuangfubanImportZuchuanReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + file := req.File + str := "" + for i := range file { + str, err = coryCommon.UploadFile(ctx, file[i], coryCommon.LargeFileShp) + if err != nil { + liberr.ErrIsNil(ctx, err, "上传失败!") + } + } + arr := strings.Split(str, ".") + arr[len(arr)-1] = "shp" + pa := strings.Join(arr, ".") + _, err = dao.QianqiGuangfuban.Ctx(ctx).Where(dao.QianqiGuangfuban.Columns().SourceId, req.SourceId).Update(do.QianqiGuangfuban{ + Zuchuan_path: strings.Join(arr, "."), + UpdateBy: ct.New().GetLoginUser(ctx).Id, + }) + arr2 := strings.Split(str, "/") + //将组串 当作布板图 + _, err = dao.QianqiBubantu.Ctx(ctx).Insert(&do.QianqiBubantu{ + ProjectId: req.ProjectId, + Name: strings.Split(arr2[len(arr2)-1], ".")[0], + SourceId: gmd5.MustEncryptString(pa), + SourcePath: strings.Join(arr, "."), + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sQianqiGuangfuban) List(ctx context.Context, req *system.QianqiGuangfubanSearchReq) (listRes *system.QianqiGuangfubanSearchRes, err error) { + listRes = new(system.QianqiGuangfubanSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.QianqiGuangfuban.Ctx(ctx).WithAll() + if req.ProjectId != "" { + m = m.Where(dao.QianqiGuangfuban.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.Name != "" { + m = m.Where(dao.QianqiGuangfuban.Columns().Name+" like ?", "%"+req.Name+"%") + } + //创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.QianqiGuangfuban.Columns().CreatedAt+" like ?", "%"+date+"%") + } + + if len(req.DateRange) != 0 { + m = m.Where(dao.QianqiGuangfuban.Columns().CreatedAt+" >=? AND "+dao.QianqiGuangfuban.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "name asc,id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.QianqiGuangfubanInfoRes + + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.QianqiGuangfubanListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.QianqiGuangfubanListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + Name: v.Name, + SourcePath: v.SourcePath, + Detail: v.Detail, + SourceId: v.SourceId, + CreatedAt: v.CreatedAt, + SourceType: v.SourceType, + } + } + }) + return +} + +func (s *sQianqiGuangfuban) GetById(ctx context.Context, id int) (res *model.QianqiGuangfubanInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.QianqiGuangfuban.Ctx(ctx).WithAll().Where(dao.QianqiGuangfuban.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.QianqiGuangfubanInfoRes) + res = &infoRes + }) + return +} + +func (s *sQianqiGuangfuban) Add(ctx context.Context, req *system.QianqiGuangfubanAddReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + var fileName = "" + var FilePath = "" + var sourceId = "" + file := req.File + str, err := coryCommon.UploadFile(ctx, file, coryCommon.LargeFileClt) + if err != nil { + liberr.ErrIsNil(ctx, err, "上传失败!") + } + fileName = file.Filename + FilePath = str + encrypt, _ := gmd5.EncryptString(file.Filename) + sourceId = encrypt + + count, err := dao.QianqiGuangfuban.Ctx(ctx).Where(dao.QianqiGuangfuban.Columns().SourceId, sourceId).Count() + if err != nil { + return + } + if count > 0 { + liberr.ErrIsNil(ctx, errors.New("资源已存在")) + return + } else { + CreateBy := ct.New().GetLoginUser(ctx).Id + _, err = dao.QianqiGuangfuban.Ctx(ctx).Insert(do.QianqiGuangfuban{ + ProjectId: req.ProjectId, + Name: fileName, + SourcePath: FilePath, + Detail: req.Detail, + SourceId: sourceId, + CreateBy: CreateBy, + }) + //建立连接 + if err == nil { + clt.OpenClt(FilePath, sourceId) + //初始化光伏板纠正 + //id, _ := qg.LastInsertId() + _, err = g.DB().Model("qianqi_guangfuban_data").Ctx(ctx).Insert(g.Map{"guangfuban_source_id": sourceId, "guangfuban_data": ""}) + if err != nil { + liberr.ErrIsNil(ctx, errors.New("初始化数据失败!")) + return + } + } + tile := clt.GetTile(sourceId, "scenetree.json") + + vm := goja.New() + vm.RunString(parse_ids) + + var start_parse func(scenetree string) string + + vm.ExportTo(vm.Get("start_parse"), &start_parse) + + fmt.Println("开始转换", gtime.Datetime()) + + res := start_parse(string(tile)) + + var elements []model.Element + json.Unmarshal([]byte(res), &elements) + var eles []do.QianqiGuangfubanIds + for _, element := range elements { + if !strings.HasPrefix(element.Name, "G") { + continue + } + ele := do.QianqiGuangfubanIds{} + ele.DevId = sourceId + ele.Name = element.Name + ele.SourceId = element.Id + marshal, err := json.Marshal(element.Sphere) + if err != nil { + continue + } + ele.Sphere = string(marshal) + ele.CreateBy = CreateBy + ele.ProjectId = req.ProjectId + eles = append(eles, ele) + if len(eles) > 500 { + dao.QianqiGuangfubanIds.Ctx(ctx).Insert(eles) + eles = []do.QianqiGuangfubanIds{} + } + } + if len(eles) > 0 { + dao.QianqiGuangfubanIds.Ctx(ctx).Insert(eles) + } + fmt.Println("转换完成", gtime.Datetime()) + liberr.ErrIsNil(ctx, err, "添加失败") + } + //name := ct.New().GetLoginUser(ctx).Id + + }) + return err + }) + return +} + +func (s *sQianqiGuangfuban) Edit(ctx context.Context, req *system.QianqiGuangfubanEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //name := ct.New().GetLoginUser(ctx).Id + _, err = dao.QianqiGuangfuban.Ctx(ctx).WherePri(req.Id).Update(do.QianqiGuangfuban{ + Name: req.Name, + Detail: req.Detail, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sQianqiGuangfuban) Delete(ctx context.Context, ids []string) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiGuangfuban.Ctx(ctx).Unscoped().Delete(dao.QianqiGuangfuban.Columns().SourceId+" in (?)", ids) + _, err = dao.QianqiGuangfubanIds.Ctx(ctx).Unscoped().Delete(dao.QianqiGuangfubanIds.Columns().DevId+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +//func (c *sQianqiGuangfuban) gfbUpload(ctx context.Context, req *system.UploadFileBimReq) (res *system.UploadFileBimRes, err error) { +// // 初始化 res 变量 +// res = &system.UploadFileBimRes{} +// file := req.File +// str, err := coryCommon.UploadFile(ctx, file, coryCommon.LargeFileBim) +// res.FileName = file.Filename +// res.FilePath = str +// return +//} diff --git a/internal/app/system/logic/qianqiGuangfubanIds/qianqi_guangfuban_ids.go b/internal/app/system/logic/qianqiGuangfubanIds/qianqi_guangfuban_ids.go new file mode 100644 index 0000000..3bbdde3 --- /dev/null +++ b/internal/app/system/logic/qianqiGuangfubanIds/qianqi_guangfuban_ids.go @@ -0,0 +1,224 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-05 16:00:23 +// 生成路径: internal/app/system/logic/qianqi_guangfuban_ids.go +// 生成人:gfast +// desc:光伏板模型的id +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "sort" + "strings" +) + +func init() { + service.RegisterQianqiGuangfubanIds(New()) +} + +func New() *sQianqiGuangfubanIds { + return &sQianqiGuangfubanIds{} +} + +type sQianqiGuangfubanIds struct{} + +func (s *sQianqiGuangfubanIds) List(ctx context.Context, req *system.QianqiGuangfubanIdsSearchReq) (listRes *system.QianqiGuangfubanIdsSearchRes, err error) { + listRes = new(system.QianqiGuangfubanIdsSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.QianqiGuangfubanIds.Ctx(ctx).WithAll() + if req.Name != "" { + m = m.Where(dao.QianqiGuangfubanIds.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.ProjectId != "" { + m = m.Where(dao.QianqiGuangfubanIds.Columns().ProjectId+" = ?", req.ProjectId) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "name asc,id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.QianqiGuangfubanIdsInfoRes + m = m.Fields(system.QianqiGuangfubanIdsSearchRes{}).Page(req.PageNum, req.PageSize) + if req.NotInPlan { + m = m.Where(dao.QianqiGuangfubanIds.Columns().SourceId+" not in(select source_id from "+dao.PlanWeek.Table()+" where project_id=?)", req.ProjectId) + } + + err = m.Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = []*model.Nibianqi{} + + nibianqi_map := make(map[string]*model.Nibianqi) + for _, v := range res { + q := &model.QianqiGuangfubanIdsListRes{ + Id: v.Id, + Name: v.Name, + DevId: v.DevId, + DevType: v.DevType, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + SourceType: v.SourceType, + SourceId: v.SourceId, + ProjectId: v.ProjectId, + Range: v.Range, + Sphere: v.Sphere, + } + names := strings.Split(v.Name, ".") + nibianqiName := strings.Join(names[:2], ".") + + if v2, ok := nibianqi_map[nibianqiName]; ok { + v2.List = append(v2.List, q) + nibianqi_map[nibianqiName] = v2 + } else { + nibianqi := model.Nibianqi{} + nibianqi.NibianqiName = nibianqiName + nibianqi.List = append(nibianqi.List, q) + nibianqi_map[nibianqiName] = &nibianqi + } + /*listRes.List[k] = &model.QianqiGuangfubanIdsListRes{ + Id: v.Id, + Name: v.Name, + DevId: v.DevId, + DevType: v.DevType, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + SourceType: v.SourceType, + SourceId: v.SourceId, + ProjectId: v.ProjectId, + }*/ + } + for _, nibianqi := range nibianqi_map { + listRes.List = append(listRes.List, nibianqi) + } + listRes.Total = len(listRes.List) + + sort.Slice(listRes.List, func(i, j int) bool { + return listRes.List[i].NibianqiName < listRes.List[j].NibianqiName + }) + for n, _ := range listRes.List { + sort.Slice(listRes.List[n].List, func(i, j int) bool { + return listRes.List[n].List[i].Name < listRes.List[n].List[j].Name + }) + } + }) + return +} + +func (s *sQianqiGuangfubanIds) GetById(ctx context.Context, req *system.QianqiGuangfubanIdsGetReq) (listRes *system.QianqiGuangfubanIdsGetRes, err error) { + //err = g.Try(ctx, func(ctx context.Context) { + // err = dao.QianqiGuangfubanIds.Ctx(ctx).WithAll().Where(dao.QianqiGuangfubanIds.Columns().DevId, id).Scan(&res) + // liberr.ErrIsNil(ctx, err, "获取信息失败") + //}) + + listRes = new(system.QianqiGuangfubanIdsGetRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.QianqiGuangfubanIds.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.QianqiGuangfubanIds.Columns().DevId+" = ?", req.Id) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.QianqiGuangfubanIdsInfoRes + m = m.Fields(system.QianqiGuangfubanIdsSearchRes{}) + if !req.Total { + m = m.Page(req.PageNum, req.PageSize) + } + //if !req.NotInPlan { + + //} else { + // m = m.Fields(system.QianqiGuangfubanIdsSearchRes{}).Where(dao.QianqiGuangfubanIds.Columns().SourceId+" not in(select source_id from "+dao.PlanWeek.Table()+" where project_id=?)", req.ProjectId) + //} + err = m.Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.QianqiGuangfubanIdsInfoRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.QianqiGuangfubanIdsInfoRes{ + Id: v.Id, + Name: v.Name, + DevId: v.DevId, + DevType: v.DevType, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + SourceType: v.SourceType, + SourceId: v.SourceId, + ProjectId: v.ProjectId, + Range: v.Range, + Sphere: v.Sphere, + } + } + }) + return +} + +func (s *sQianqiGuangfubanIds) Add(ctx context.Context, req *system.QianqiGuangfubanIdsAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiGuangfubanIds.Ctx(ctx).Insert(do.QianqiGuangfubanIds{ + Name: req.Name, + DevId: req.DevId, + DevType: req.DevType, + CreateBy: req.CreateBy, + UpdateBy: req.UpdateBy, + SourceType: req.SourceType, + SourceId: req.SourceId, + ProjectId: req.ProjectId, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sQianqiGuangfubanIds) Edit(ctx context.Context, req *system.QianqiGuangfubanIdsEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiGuangfubanIds.Ctx(ctx).Where(dao.QianqiGuangfubanIds.Columns().SourceId, req.SourceId).Update(do.QianqiGuangfubanIds{ + //Name: req.Name, + //DevId: req.DevId, + //DevType: req.DevType, + //CreateBy: req.CreateBy, + //UpdateBy: req.UpdateBy, + //SourceType: req.SourceType, + Range: req.Range, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sQianqiGuangfubanIds) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiGuangfubanIds.Ctx(ctx).Unscoped().Delete(dao.QianqiGuangfubanIds.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/qianqiGuangfubanIdsLizhu/qianqi_guangfuban_ids_lizhu.go b/internal/app/system/logic/qianqiGuangfubanIdsLizhu/qianqi_guangfuban_ids_lizhu.go new file mode 100644 index 0000000..f331643 --- /dev/null +++ b/internal/app/system/logic/qianqiGuangfubanIdsLizhu/qianqi_guangfuban_ids_lizhu.go @@ -0,0 +1,261 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-09-05 12:10:40 +// 生成路径: internal/app/system/logic/qianqi_guangfuban_ids_lizhu.go +// 生成人:gfast +// desc:光伏板立柱 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "sort" + "strings" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/shp" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterQianqiGuangfubanIdsLizhu(New()) +} + +func New() *sQianqiGuangfubanIdsLizhu { + return &sQianqiGuangfubanIdsLizhu{} +} + +type sQianqiGuangfubanIdsLizhu struct{} + +func (s *sQianqiGuangfubanIdsLizhu) GisListFunc(ctx context.Context, req *system.GisListLizhuReq, num string) (listRes *system.GisListLizhuRes, err error) { + listRes = new(system.GisListLizhuRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.QianqiGuangfubanIdsLizhu.Ctx(ctx).WithAll() + if num == "1" { + m = m.Fields("id,name,source_type,source_id,project_id,detail") + } + if num == "2" { + m = m.Fields("id,name,source_type,source_id,project_id") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.QianqiGuangfubanIdsLizhu.Columns().CreatedAt+" >=? AND "+dao.QianqiGuangfubanIdsLizhu.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.ProjectId != "" { + m = m.Where(dao.QianqiGuangfubanIdsLizhu.Columns().ProjectId+" = ?", req.ProjectId) + } + + if req.FangZhenID != "" { + m = m.Where(dao.QianqiGuangfubanIdsZhuangdian.Columns().FangzhenId+" = ?", req.FangZhenID) + } + + order := "name asc,id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.QianqiGuangfubanIdsLizhuInfoRes + array, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + listRes.Total = len(array) + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + if req.PageNum == 0 { + req.PageNum = 1 + } + if num == "1" { + if strings.EqualFold(req.IsPaging, "YES") { + m = m.Fields(system.QianqiGuangfubanIdsLizhuSearchRes{}).Page(req.PageNum, req.PageSize) + } + } else { + if !req.NotInPlan { + m = m.Page(req.PageNum, req.PageSize) + } else { + m = m.Fields(system.QianqiGuangfubanIdsLizhuSearchRes{}). + Where(dao.QianqiGuangfubanIdsLizhu.Columns().SourceId+" not in(select source_id from "+dao.PlanWeek.Table()+" where project_id=? and source_type='lizhu')", req.ProjectId) + } + } + err = m.Order(order).Scan(&res) + + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.QianqiGuangfubanIdsLizhuListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.QianqiGuangfubanIdsLizhuListRes{ + Id: v.Id, + Name: v.Name, + SourceType: v.SourceType, + SourceId: v.SourceId, + ProjectId: v.ProjectId, + Detail: v.Detail, + } + } + sort.Slice(listRes.List, func(i, j int) bool { + return listRes.List[i].Name < listRes.List[j].Name + }) + }) + return +} + +type booleanvalueEntity struct { + Position *shp.Point `json:"position"` +} + +func (s *sQianqiGuangfubanIdsLizhu) BooleanValueFunc(ctx context.Context, req *system.BooleanValueEditReq) (err error) { + //err = g.Try(ctx, func(ctx context.Context) { + // var lz []*model.QianqiGuangfubanIdsLizhuInfoRes + // err = dao.QianqiGuangfubanIdsLizhu.Ctx(ctx).Where("project_id").Fields("id,detail").Scan(&lz) + // for _, data := range lz { + // var bl *booleanvalueEntity + // err = json.Unmarshal([]byte(data.Detail), &bl) + // if err != nil { + // liberr.ErrIsNil(ctx, err, "立柱预计值更新失败!") + // return + // } else { + // if (bl.Position.Height - bl.Position.Alt) > 0.7 { + // bl.Position.Flag = true + // } else { + // bl.Position.Flag = false + // } + // } + // } + // dao.qianqi + // liberr.ErrIsNil(ctx, err, "立柱预计值更新失败!") + //}) + return err +} + +func (s *sQianqiGuangfubanIdsLizhu) List(ctx context.Context, req *system.QianqiGuangfubanIdsLizhuSearchReq) (listRes *system.QianqiGuangfubanIdsLizhuSearchRes, err error) { + listRes = new(system.QianqiGuangfubanIdsLizhuSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.QianqiGuangfubanIdsLizhu.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.QianqiGuangfubanIdsLizhu.Columns().Id+" = ?", req.Id) + } + if req.Name != "" { + m = m.Where(dao.QianqiGuangfubanIdsLizhu.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.CreateBy != "" { + m = m.Where(dao.QianqiGuangfubanIdsLizhu.Columns().CreateBy+" = ?", req.CreateBy) + } + if req.UpdateBy != "" { + m = m.Where(dao.QianqiGuangfubanIdsLizhu.Columns().UpdateBy+" = ?", req.UpdateBy) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.QianqiGuangfubanIdsLizhu.Columns().CreatedAt+" >=? AND "+dao.QianqiGuangfubanIdsLizhu.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.SourceType != "" { + m = m.Where(dao.QianqiGuangfubanIdsLizhu.Columns().SourceType+" = ?", req.SourceType) + } + if req.SourceId != "" { + m = m.Where(dao.QianqiGuangfubanIdsLizhu.Columns().SourceId+" = ?", req.SourceId) + } + if req.ProjectId != "" { + m = m.Where(dao.QianqiGuangfubanIdsLizhu.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.Status != "" { + m = m.Where(dao.QianqiGuangfubanIdsLizhu.Columns().Status+" = ?", gconv.Int(req.Status)) + } + + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "name asc,id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.QianqiGuangfubanIdsLizhuInfoRes + + if !req.NotInPlan { + m = m.Fields(system.QianqiGuangfubanIdsLizhuSearchRes{}) + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + m = m.Page(req.PageNum, req.PageSize) + } else { + m = m.Fields(system.QianqiGuangfubanIdsLizhuSearchRes{}). + Where(dao.QianqiGuangfubanIdsLizhu.Columns().SourceId+" not in(select source_id from "+dao.PlanWeek.Table()+" where project_id=? and source_type='lizhu')", req.ProjectId) + } + err = m.Order(order).Scan(&res) + + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.QianqiGuangfubanIdsLizhuListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.QianqiGuangfubanIdsLizhuListRes{ + Id: v.Id, + Name: v.Name, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + SourceType: v.SourceType, + SourceId: v.SourceId, + ProjectId: v.ProjectId, + Status: v.Status, + Detail: v.Detail, + } + } + sort.Slice(listRes.List, func(i, j int) bool { + return listRes.List[i].Name < listRes.List[j].Name + }) + }) + return +} + +func (s *sQianqiGuangfubanIdsLizhu) GetById(ctx context.Context, id int) (res *model.QianqiGuangfubanIdsLizhuInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.QianqiGuangfubanIdsLizhu.Ctx(ctx).WithAll().Where(dao.QianqiGuangfubanIdsLizhu.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sQianqiGuangfubanIdsLizhu) Add(ctx context.Context, req *system.QianqiGuangfubanIdsLizhuAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiGuangfubanIdsLizhu.Ctx(ctx).Insert(do.QianqiGuangfubanIdsLizhu{ + Name: req.Name, + CreateBy: req.CreateBy, + UpdateBy: req.UpdateBy, + SourceType: req.SourceType, + SourceId: req.SourceId, + ProjectId: req.ProjectId, + Status: req.Status, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sQianqiGuangfubanIdsLizhu) Edit(ctx context.Context, req *system.QianqiGuangfubanIdsLizhuEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiGuangfubanIdsLizhu.Ctx(ctx).WherePri(req.Id).Update(do.QianqiGuangfubanIdsLizhu{ + Name: req.Name, + CreateBy: req.CreateBy, + UpdateBy: req.UpdateBy, + SourceType: req.SourceType, + SourceId: req.SourceId, + ProjectId: req.ProjectId, + Status: req.Status, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sQianqiGuangfubanIdsLizhu) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiGuangfubanIdsLizhu.Ctx(ctx).Delete(dao.QianqiGuangfubanIdsLizhu.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/qianqiGuangfubanIdsZhijia/qianqi_guangfuban_ids_zhijia.go b/internal/app/system/logic/qianqiGuangfubanIdsZhijia/qianqi_guangfuban_ids_zhijia.go new file mode 100644 index 0000000..bead6c8 --- /dev/null +++ b/internal/app/system/logic/qianqiGuangfubanIdsZhijia/qianqi_guangfuban_ids_zhijia.go @@ -0,0 +1,450 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-09-05 12:10:51 +// 生成路径: internal/app/system/logic/qianqi_guangfuban_ids_zhijia.go +// 生成人:gfast +// desc:光伏板支架 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "math/big" + "sort" + "strings" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterQianqiGuangfubanIdsZhijia(New()) +} + +func New() *sQianqiGuangfubanIdsZhijia { + return &sQianqiGuangfubanIdsZhijia{} +} + +type sQianqiGuangfubanIdsZhijia struct{} + +func (s *sQianqiGuangfubanIdsZhijia) GisListFunc(ctx context.Context, req *system.GisZhijiaReq, num string) (listRes *system.GisZhijiaRes, err error) { + listRes = new(system.GisZhijiaRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.QianqiGuangfubanIdsZhijia.Ctx(ctx).WithAll() + if num == "1" { + m = m.Fields("id,name,source_type,source_id,project_id,detail") + } + if num == "2" { + m = m.Fields("id,name,source_type,source_id,project_id") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.QianqiGuangfubanIdsZhijia.Columns().CreatedAt+" >=? AND "+dao.QianqiGuangfubanIdsZhijia.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.ProjectId != "" { + m = m.Where(dao.QianqiGuangfubanIdsZhijia.Columns().ProjectId+" = ?", req.ProjectId) + } + + if req.FangZhenID != "" { + m = m.Where(dao.QianqiGuangfubanIdsZhijia.Columns().FangzhenId+" = ?", req.FangZhenID) + } + + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.QianqiGuangfubanIdsZhijiaInfoRes + m = m.Fields(system.QianqiGuangfubanIdsZhijiaSearchRes{}) + array, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + listRes.Total = len(array) + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + if req.PageNum == 0 { + req.PageNum = 1 + } + if num == "1" { + if strings.EqualFold(req.IsPaging, "YES") { + m = m.Page(req.PageNum, req.PageSize) + } + } else { + if !req.NotInPlan { + m = m.Page(req.PageNum, req.PageSize) + } else { + m = m.Fields(system.QianqiGuangfubanIdsZhijiaSearchRes{}).Where(dao.QianqiGuangfubanIdsZhijia.Columns().SourceId+" not in(select source_id from "+dao.PlanWeek.Table()+" where project_id=? and source_type='lizhu')", req.ProjectId) + } + } + err = m.Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.QianqiGuangfubanIdsZhijiaListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.QianqiGuangfubanIdsZhijiaListRes{ + Id: v.Id, + Name: v.Name, + SourceType: v.SourceType, + SourceId: v.SourceId, + ProjectId: v.ProjectId, + Detail: v.Detail, + } + } + sort.Slice(listRes.List, func(i, j int) bool { + return listRes.List[i].Name < listRes.List[j].Name + }) + }) + return +} + +func (s *sQianqiGuangfubanIdsZhijia) QueryDetailsFunc(ctx context.Context, req *system.QueryDetailsReq) (res *system.QueryDetailsRes, err error) { + name := req.Name + req.Name = strings.ReplaceAll(req.Name, "G0", "NC.") + res = new(system.QueryDetailsRes) + array, err := g.DB().Model("qianqi_warning"). + Fields("detail"). + Where("project_id", req.ProjectId). + Where("name_one='" + name + "' or name_one='" + req.Name + "'").Array() + if err != nil { + liberr.ErrIsNil(ctx, err, "获取数据失败!") + } + var ptList []*system.Zhuangdian + for i := range array { + var pt *system.Zhuangdian + err := json.Unmarshal([]byte(array[i].String()), &pt) + if err != nil { + liberr.ErrIsNil(ctx, err, "解析数据失败!") + } else { + ptList = append(ptList, pt) + } + } + res.List = ptList + return +} + +func (s *sQianqiGuangfubanIdsZhijia) PrewarningValueFunc(ctx context.Context, req *system.PrewarningValueReq) (listRes *system.PrewarningValueRes, err error) { + //listRes = new(system.PrewarningValueRes) + //m := g.DB().Model("qianqi_warning") + //e := g.DB().Model("qianqi_warning").Fields("DISTINCT name_one as nameStr") + ////2、获取到下面的数据 + //if req.ProjectId != "" { + // m = m.Where("project_id", req.ProjectId) + // e = e.Where("project_id", req.ProjectId) + //} + //if req.SourceType != "" { + // m = m.Where("source_type", req.SourceType) + // e = e.Where("source_type", req.SourceType) + //} + ////1、获取到主目录 + //var resp []*system.PrewarningValueEntity + //err = e.WithAll().Scan(&resp) + ////2、获取到子目录 + //for i := range resp { + // var res []*system.WarningEntity + // err = m.Safe().Where("name_one like ?", resp[i].NameStr+"%").OrderDesc("created_at").Scan(&res) + // resp[i].WarningList = res + //} + //listRes.List = resp + //liberr.ErrIsNil(ctx, err, "获取数据失败!") + //return + + //listRes = new(system.PrewarningValueRes) + //m := g.DB().Model("qianqi_warning").As("a").Safe() + //e := m.Fields("DISTINCT name_two") + ////2、获取到下面的数据 + //if req.ProjectId != "" { + // m = m.Where("a.project_id", req.ProjectId) + // e = e.Where("a.project_id", req.ProjectId) + //} + //if req.SourceType != "" { + // m = m.Where("a.source_type", req.SourceType) + // e = e.Where("a.project_id", req.ProjectId) + //} + //var resp []*system.PrewarningValueEntity + //array, err := e.Limit(10).Array() + //for _, arr := range array { + // var respTwo *system.PrewarningValueEntity + // m.Fields("DISTINCT name_one AS nameStr").WithAll().Where("a.name_two", arr.String()).Scan(&respTwo) + // resp = append(resp, respTwo) + //} + //listRes.List = resp + //return + + listRes = new(system.PrewarningValueRes) + m := g.DB().Model("qianqi_warning").As("a") + // 2、获取到下面的数据 + if req.ProjectId != "" { + m = m.Where("a.project_id", req.ProjectId) + } + if req.SourceType != "" { + m = m.Where("a.source_type", req.SourceType) + } + var resp []*system.PrewarningValueEntity + err = m.Fields("DISTINCT name_one AS nameStr").WithAll().Scan(&resp) + listRes.List = resp + + return +} + +func (s *sQianqiGuangfubanIdsZhijia) EditDetail(ctx context.Context, req *system.QianqiGuangfubanIdsZhijiaDetailReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + // 1、存儲修改高程的数据 + for i := 0; i < 2; i++ { + var wh []string + str := "" + if i == 0 { + str = "update " + dao.QianqiGuangfubanIdsLizhu.Table() + " set detail= case " + } else { + str = "update " + dao.QianqiGuangfubanIdsZhijia.Table() + " set detail= case " + } + for _, detail := range req.List { + if i == 0 { // 避免运行两次 + result := new(big.Float).SetPrec(uint(13)).Sub(new(big.Float).SetFloat64(detail.Position.Height), new(big.Float).SetFloat64(detail.Position.Alt)) + if result.Cmp(new(big.Float).SetFloat64(0)) == -1 { + detail.Position.Difference = 0 + } else { + detail.Position.Difference, _ = result.Float64() + } + } + marshal, err := json.Marshal(detail) + if err != nil { + fmt.Println("是否错误:", err) + continue + } + st := "when source_id='" + detail.Position.SourceId + "' then '" + string(marshal) + "'" + wh = append(wh, st) + + if len(wh) == 1000 { + exec := str + strings.Join(wh, " ") + " ELSE detail end where project_id= " + req.ProjectId + ";" + _, err = g.DB().Exec(ctx, exec) + if err != nil { + err = errors.New("更新失败!") + return err + } + wh = []string{} + } + } + if len(wh) > 0 { + exec := str + strings.Join(wh, " ") + " ELSE detail end where project_id= " + req.ProjectId + ";" + _, err = g.DB().Exec(ctx, exec) + if err != nil { + err = errors.New("更新失败!") + return err + } + } + } + return err + }) + go calculate(ctx, req.ProjectId) + return +} + +func calculate(ctx context.Context, projectId string) { + g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err := g.Try(ctx, func(ctx context.Context) { + // 防止重复预警数据,先把对应项目的预警数据删除 + _, err := g.DB().Model("qianqi_warning").Where("project_id", projectId).Delete() + if err != nil { + err = errors.New("更新失败!") + // return err + } + values, err := dao.QianqiGuangfubanIdsLizhu.Ctx(ctx).Fields("detail").Where("project_id", projectId).Array() + // 2、获取所有当前项目的所有名字,计算祖串的差值 + array, _ := dao.QianqiGuangfubanIdsLizhu.Ctx(ctx).Fields("DISTINCT SUBSTR( NAME, 1, LENGTH( NAME )- 2 ) AS bname ").Where("project_id", projectId).Group("name").Array() + if len(array) > 0 { + for _, data := range array { + var yjArr []float64 + i := 0 + var entity []g.Map + for _, detail := range values { + var zd *system.Zhuangdian + _ = json.Unmarshal([]byte(detail.String()), &zd) + name := zd.Position.Name + name = name[:len(name)-2] + if data.String() == name && zd.Position.Height > 0 { + yjArr = append(yjArr, zd.Position.Difference) + entityTwo := g.Map{ + "name_one": data.String(), + "name_two": zd.Position.Name, + "source_type": "lizhu", + "source_id": zd.Position.SourceId, + "project_id": projectId, + "detail": detail, + } + entity = append(entity, entityTwo) + if i == 3 { // 组串4条数据,下标为3 + ax := maxFunc(yjArr) + in := minFunc(yjArr) + if (ax - in) > 0.7 { + _, err := g.DB().Model("qianqi_warning").Insert(entity) + if err != nil { + err = errors.New("预警值存储失败!") + return + } + } + } + i = i + 1 + } + } + } + } + }) + return err + }) +} + +func maxFunc(nums []float64) float64 { + max := nums[0] + for _, num := range nums { + if num > max { + max = num + } + } + return max +} + +func minFunc(nums []float64) float64 { + min := nums[0] + for _, num := range nums { + if num < min { + min = num + } + } + return min +} + +func (s *sQianqiGuangfubanIdsZhijia) List(ctx context.Context, req *system.QianqiGuangfubanIdsZhijiaSearchReq) (listRes *system.QianqiGuangfubanIdsZhijiaSearchRes, err error) { + listRes = new(system.QianqiGuangfubanIdsZhijiaSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.QianqiGuangfubanIdsZhijia.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.QianqiGuangfubanIdsZhijia.Columns().Id+" = ?", req.Id) + } + if req.Name != "" { + m = m.Where(dao.QianqiGuangfubanIdsZhijia.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.CreateBy != "" { + m = m.Where(dao.QianqiGuangfubanIdsZhijia.Columns().CreateBy+" = ?", req.CreateBy) + } + if req.UpdateBy != "" { + m = m.Where(dao.QianqiGuangfubanIdsZhijia.Columns().UpdateBy+" = ?", req.UpdateBy) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.QianqiGuangfubanIdsZhijia.Columns().CreatedAt+" >=? AND "+dao.QianqiGuangfubanIdsZhijia.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.SourceType != "" { + m = m.Where(dao.QianqiGuangfubanIdsZhijia.Columns().SourceType+" = ?", req.SourceType) + } + if req.SourceId != "" { + m = m.Where(dao.QianqiGuangfubanIdsZhijia.Columns().SourceId+" = ?", req.SourceId) + } + if req.ProjectId != "" { + m = m.Where(dao.QianqiGuangfubanIdsZhijia.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.Status != "" { + m = m.Where(dao.QianqiGuangfubanIdsZhijia.Columns().Status+" = ?", gconv.Int(req.Status)) + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "name asc,id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.QianqiGuangfubanIdsZhijiaInfoRes + + if !req.NotInPlan { + m = m.Fields(system.QianqiGuangfubanIdsZhijiaSearchRes{}) + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + m = m.Page(req.PageNum, req.PageSize) + } else { + m = m.Fields(system.QianqiGuangfubanIdsZhijiaSearchRes{}).Where(dao.QianqiGuangfubanIdsZhijia.Columns().SourceId+" not in(select source_id from "+dao.PlanWeek.Table()+" where project_id=? and source_type='lizhu')", req.ProjectId) + } + err = m.Order(order).Scan(&res) + + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.QianqiGuangfubanIdsZhijiaListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.QianqiGuangfubanIdsZhijiaListRes{ + Id: v.Id, + Name: v.Name, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + SourceType: v.SourceType, + SourceId: v.SourceId, + ProjectId: v.ProjectId, + Status: v.Status, + Detail: v.Detail, + } + } + sort.Slice(listRes.List, func(i, j int) bool { + return listRes.List[i].Name < listRes.List[j].Name + }) + }) + return +} + +func (s *sQianqiGuangfubanIdsZhijia) GetById(ctx context.Context, id int) (res *model.QianqiGuangfubanIdsZhijiaInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.QianqiGuangfubanIdsZhijia.Ctx(ctx).WithAll().Where(dao.QianqiGuangfubanIdsZhijia.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sQianqiGuangfubanIdsZhijia) Add(ctx context.Context, req *system.QianqiGuangfubanIdsZhijiaAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiGuangfubanIdsZhijia.Ctx(ctx).Insert(do.QianqiGuangfubanIdsZhijia{ + Name: req.Name, + CreateBy: req.CreateBy, + UpdateBy: req.UpdateBy, + SourceType: req.SourceType, + SourceId: req.SourceId, + ProjectId: req.ProjectId, + Status: req.Status, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sQianqiGuangfubanIdsZhijia) Edit(ctx context.Context, req *system.QianqiGuangfubanIdsZhijiaEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiGuangfubanIdsZhijia.Ctx(ctx).WherePri(req.Id).Update(do.QianqiGuangfubanIdsZhijia{ + Name: req.Name, + CreateBy: req.CreateBy, + UpdateBy: req.UpdateBy, + SourceType: req.SourceType, + SourceId: req.SourceId, + ProjectId: req.ProjectId, + Status: req.Status, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sQianqiGuangfubanIdsZhijia) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiGuangfubanIdsZhijia.Ctx(ctx).Delete(dao.QianqiGuangfubanIdsZhijia.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/qianqiGuangfubanIdsZhuangdian/qianqi_guangfuban_ids_zhuangdian.go b/internal/app/system/logic/qianqiGuangfubanIdsZhuangdian/qianqi_guangfuban_ids_zhuangdian.go new file mode 100644 index 0000000..a6f25d4 --- /dev/null +++ b/internal/app/system/logic/qianqiGuangfubanIdsZhuangdian/qianqi_guangfuban_ids_zhuangdian.go @@ -0,0 +1,438 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-09-05 12:07:41 +// 生成路径: internal/app/system/logic/qianqi_guangfuban_ids_zhuangdian.go +// 生成人:gfast +// desc:光伏板桩点 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "sort" + "strings" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/util/gconv" + "github.com/google/uuid" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/common/shp" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterQianqiGuangfubanIdsZhuangdian(New()) +} + +func New() *sQianqiGuangfubanIdsZhuangdian { + return &sQianqiGuangfubanIdsZhuangdian{} +} + +type sQianqiGuangfubanIdsZhuangdian struct{} + +func (s *sQianqiGuangfubanIdsZhuangdian) GisListFunc(ctx context.Context, req *system.GisListReq, num string) (listRes *system.GisListRes, err error) { + listRes = new(system.GisListRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.QianqiGuangfubanIdsZhuangdian.Ctx(ctx).WithAll() + if num == "1" { + m = m.Fields("id,name,source_type,source_id,project_id,detail") + } + if num == "2" { + m = m.Fields("id,name,source_type,source_id,project_id,detail") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.QianqiGuangfubanIdsZhuangdian.Columns().CreatedAt+" >=? AND "+dao.QianqiGuangfubanIdsZhuangdian.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.ProjectId != "" { + m = m.Where(dao.QianqiGuangfubanIdsZhuangdian.Columns().ProjectId+" = ?", req.ProjectId) + } + + if req.FangZhenID != "" { + m = m.Where(dao.QianqiGuangfubanIdsZhuangdian.Columns().FangzhenId+" = ?", req.FangZhenID) + } + + order := "name asc,id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + array, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + listRes.Total = len(array) + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + var res []*model.QianqiGuangfubanIdsZhuangdianInfoRes + if num == "1" { + if strings.EqualFold(req.IsPaging, "YES") { + m = m.Fields(system.QianqiGuangfubanIdsZhuangdianSearchRes{}).Page(req.PageNum, req.PageSize) + } + } else { + if !req.NotInPlan { + m = m.Fields(system.QianqiGuangfubanIdsZhuangdianSearchRes{}).Page(req.PageNum, req.PageSize) + } else { + m = m.Fields(system.QianqiGuangfubanIdsZhuangdianSearchRes{}).Where(dao.QianqiGuangfubanIdsZhuangdian.Columns().SourceId+" not in(select source_id from "+dao.PlanWeek.Table()+" where project_id=?)", req.ProjectId) + } + } + err = m.Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.QianqiGuangfubanIdsZhuangdianListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.QianqiGuangfubanIdsZhuangdianListRes{ + Id: v.Id, + Name: v.Name, + SourceType: v.SourceType, + SourceId: v.SourceId, + Detail: v.Detail, + } + } + sort.Slice(listRes.List, func(i, j int) bool { + return listRes.List[i].Name < listRes.List[j].Name + }) + }) + return +} + +func (s *sQianqiGuangfubanIdsZhuangdian) EditDetail(ctx context.Context, req *system.QianqiGuangfubanIdsZhuangdianEditDetailReq) (err error) { + g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 1、证明有数据,需sql语句 + if len(req.List) > 0 { + for i := 0; i < 3; i++ { + var wh []string + str := "" + if i == 0 { + str = "update " + dao.QianqiGuangfubanIdsZhuangdian.Table() + " set detail= case " + } + if i == 1 { + str = "update " + dao.QianqiGuangfubanIdsLizhu.Table() + " set detail= case " + } + + if i == 2 { + str = "update " + dao.QianqiGuangfubanIdsZhijia.Table() + " set detail= case " + } + + for _, detail := range req.List { + // if i < 10 { + marshal, err := json.Marshal(detail) + if err != nil { + fmt.Println("是否错误:", err) + continue + } + st := "when source_id='" + detail.Position.SourceId + "' then '" + string(marshal) + "'" + wh = append(wh, st) + if len(wh) == 1000 { + exec := str + strings.Join(wh, " ") + " ELSE detail end where project_id= " + req.ProjectId + ";" + _, err = g.DB().Exec(ctx, exec) + if err != nil { + err = errors.New("更新失败!") + return + } + wh = []string{} + } + //} + } + if len(wh) > 0 { + exec := str + strings.Join(wh, " ") + " ELSE detail end where project_id= " + req.ProjectId + ";" + _, err = g.DB().Exec(ctx, exec) + if err != nil { + err = errors.New("更新失败!") + return + } + } + } + } + }) + return err + }) + return +} + +func (s *sQianqiGuangfubanIdsZhuangdian) List(ctx context.Context, req *system.QianqiGuangfubanIdsZhuangdianSearchReq) (listRes *system.QianqiGuangfubanIdsZhuangdianSearchRes, err error) { + listRes = new(system.QianqiGuangfubanIdsZhuangdianSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.QianqiGuangfubanIdsZhuangdian.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.QianqiGuangfubanIdsZhuangdian.Columns().Id+" = ?", req.Id) + } + if req.Name != "" { + m = m.Where(dao.QianqiGuangfubanIdsZhuangdian.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.CreateBy != "" { + m = m.Where(dao.QianqiGuangfubanIdsZhuangdian.Columns().CreateBy+" = ?", req.CreateBy) + } + if req.UpdateBy != "" { + m = m.Where(dao.QianqiGuangfubanIdsZhuangdian.Columns().UpdateBy+" = ?", req.UpdateBy) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.QianqiGuangfubanIdsZhuangdian.Columns().CreatedAt+" >=? AND "+dao.QianqiGuangfubanIdsZhuangdian.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.SourceType != "" { + m = m.Where(dao.QianqiGuangfubanIdsZhuangdian.Columns().SourceType+" = ?", req.SourceType) + } + if req.SourceId != "" { + m = m.Where(dao.QianqiGuangfubanIdsZhuangdian.Columns().SourceId+" = ?", req.SourceId) + } + if req.ProjectId != "" { + m = m.Where(dao.QianqiGuangfubanIdsZhuangdian.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.Status != "" { + m = m.Where(dao.QianqiGuangfubanIdsZhuangdian.Columns().Status+" = ?", gconv.Int(req.Status)) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "name asc,id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.QianqiGuangfubanIdsZhuangdianInfoRes + + if !req.NotInPlan { + m = m.Fields(system.QianqiGuangfubanIdsZhuangdianSearchRes{}).Page(req.PageNum, req.PageSize) + } else { + m = m.Fields(system.QianqiGuangfubanIdsZhuangdianSearchRes{}).Where(dao.QianqiGuangfubanIdsZhuangdian.Columns().SourceId+" not in(select source_id from "+dao.PlanWeek.Table()+" where project_id=?)", req.ProjectId) + } + err = m.Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.QianqiGuangfubanIdsZhuangdianListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.QianqiGuangfubanIdsZhuangdianListRes{ + Id: v.Id, + Name: v.Name, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + SourceType: v.SourceType, + SourceId: v.SourceId, + ProjectId: v.ProjectId, + Status: v.Status, + Detail: v.Detail, + } + } + sort.Slice(listRes.List, func(i, j int) bool { + return listRes.List[i].Name < listRes.List[j].Name + }) + }) + return +} + +func (s *sQianqiGuangfubanIdsZhuangdian) GetById(ctx context.Context, id int) (res *model.QianqiGuangfubanIdsZhuangdianInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.QianqiGuangfubanIdsZhuangdian.Ctx(ctx).WithAll().Where(dao.QianqiGuangfubanIdsZhuangdian.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +type Zhuangdian struct { + Position shp.Point `json:"position"` +} + +func (s *sQianqiGuangfubanIdsZhuangdian) Add(ctx context.Context, req *system.QianqiGuangfubanIdsZhuangdianAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 读取shp文件 + shapes, err := ProcessFiles(ctx, req.File) + liberr.ErrIsNil(ctx, err, "读取shp文件失败") + + // 分组后的结构如下: + // [T01] |--> G01.01.01 --> [G01.01.01.1, G01.01.01.2] + // |--> G01.01.02 --> [G01.01.02.1, G01.01.02.2] + // + // [T02] |--> G02.01.01 --> [G02.01.01.1, G02.01.01.2] + // |--> G02.01.02 --> [G02.01.02.1, G02.01.02.2] + // + // 其中,[T01] 和 [T02] 是主键 | G01.01.01、G01.01.02 等是子键, + // [G01.01.01.1, G01.01.01.2] 等是子键下的元素数组。 + + group := make(map[string]map[string][]do.QianqiGuangfubanIdsZhuangdian) + + // 开始处理分组 + for i := 0; i < len(shapes.Points); i++ { + point := shapes.Points[i] // 当前点 + + originalName := strings.Split(point.Name, ".") // 拆分为数组 + + // 取出方阵名,并将 G 替换为 T + // 用于后续匹配更新对应方阵的数据 + fangZhenName := strings.ReplaceAll(originalName[0], "G", "T") // 方阵名 T01 + + // 根据方阵名取出对应的数据 + fangZhen, ok := group[fangZhenName] + if !ok { + // 如果不存在则创建 + fangZhen = make(map[string][]do.QianqiGuangfubanIdsZhuangdian) + group[fangZhenName] = fangZhen + } + + // 去除 # + // 替换 - 为 . + // 用于将其插入到二级分组中 + insertName := strings.ReplaceAll(strings.ReplaceAll(point.Name, "#", ""), "-", ".") // G01.01.01 + + // 获取当前已存在的元素数量 + existingCount := len(fangZhen[insertName]) + + // 每新增一个重复的元素,将其名称的数字自增加一 + // 例如: G01.01.01.1, G01.01.01.2 + newName := fmt.Sprintf("%s.%d", point.Name, existingCount+1) + + // 调用 buildDetailAndSourceID 生成 detail 和 SourceID + detail, sourceID := buildDetailAndSourceID(point, newName) + + newElement := do.QianqiGuangfubanIdsZhuangdian{ + Name: newName, // G01.01.01.1 + ProjectId: req.ProjectId, // 主项目ID + Detail: detail, + SourceId: sourceID, + } + + // 将新元素追加到到 fangZhen[insertName] 后的切片中 + fangZhen[insertName] = append(fangZhen[insertName], newElement) + } + + // 获取当前项目下的所有方阵 + fangzhenList := []entity.QianqiFangzhen{} + err = dao.QianqiFangzhen.Ctx(ctx).Where(dao.QianqiFangzhen.Columns().ProjectId, req.SubProjectid).Scan(&fangzhenList) + liberr.ErrIsNil(ctx, err, "获取当前项目下的方阵失败") + + // 批量插入列表 + insertList := []do.QianqiGuangfubanIdsZhuangdian{} + + // 遍历所有方阵 + for i := 0; i < len(fangzhenList); i++ { + f := fangzhenList[i] // 当前方阵 + // 根据方阵名取出对应的数据 + if v, ok := group[f.Name]; ok { + // 处理每个方阵应该被写入的数据 + extractedValues := extractValuesFromMap(f.Id, f.ProjectId, v) + insertList = append(insertList, extractedValues...) + } + } + + if len(insertList) > 0 { + batchNumber := 700 + _, err = dao.QianqiGuangfubanIdsZhuangdian.Ctx(ctx).Batch(batchNumber).Insert(&insertList) + liberr.ErrIsNil(ctx, err, "光伏板插入失败") + _, err = dao.QianqiGuangfubanIdsLizhu.Ctx(ctx).Batch(batchNumber).Insert(&insertList) + liberr.ErrIsNil(ctx, err, "立柱插入失败") + _, err = dao.QianqiGuangfubanIdsZhijia.Ctx(ctx).Batch(batchNumber).Insert(&insertList) + liberr.ErrIsNil(ctx, err, "支架失败") + } + }) + + return +} + +func ProcessFiles(ctx context.Context, files []*ghttp.UploadFile) (*shp.ShpObj, error) { + var filePaths string + + // 遍历请求中的所有文件 + for _, file := range files { + // 保存文件后返回其路径 + uploadedFilePath, err := coryCommon.UploadFile(ctx, file, coryCommon.LargeFileShp) + if err != nil { + return nil, err + } + + // 将文件路径按"."分割成切片 + filePathParts := strings.Split(uploadedFilePath, ".") + // 如果切片长度大于1,将最后一个元素(文件扩展名)改为"shp" + if len(filePathParts) > 1 { + filePathParts[len(filePathParts)-1] = "shp" + } + // 将修改后的切片重新组合成文件路径,并将其添加到文件路径中 + updatedFilePath := strings.Join(filePathParts, ".") + filePaths = updatedFilePath + } + + err, shp := shp.ReadShp(filePaths) + if err != nil { + return nil, err + } + + return shp, nil +} + +// extractValuesFromMap 传入一个数组,遍历后为其添加方阵ID和子项目ID +func extractValuesFromMap(fangzhenID int, subprojectid string, inputMap map[string][]do.QianqiGuangfubanIdsZhuangdian) []do.QianqiGuangfubanIdsZhuangdian { + var result []do.QianqiGuangfubanIdsZhuangdian + for _, value := range inputMap { + for _, v := range value { + result = append(result, do.QianqiGuangfubanIdsZhuangdian{ + Name: v.Name, + ProjectId: v.ProjectId, + SubProjectid: subprojectid, // 子项目ID + FangzhenId: fangzhenID, // 方阵ID + Detail: v.Detail, + SourceId: v.SourceId, + }) + } + } + return result +} + +// 传入 point 构建出 detail 和 SourceID +func buildDetailAndSourceID(point shp.Point, name string) (string, string) { + // 生成 SourceID + sourceID := fmt.Sprintf("%s.%s", point.Name, strings.ReplaceAll(uuid.New().String(), "-", "")) + + detail := Zhuangdian{ + Position: point, + } + detail.Position.SourceId = sourceID + + // 序列化后传回 + data, err := json.Marshal(detail) + if err != nil { + return "", "" + } + return string(data), sourceID +} + +func (s *sQianqiGuangfubanIdsZhuangdian) Edit(ctx context.Context, req *system.QianqiGuangfubanIdsZhuangdianEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiGuangfubanIdsZhuangdian.Ctx(ctx).WherePri(req.Id).Update(do.QianqiGuangfubanIdsZhuangdian{ + Name: req.Name, + CreateBy: req.CreateBy, + UpdateBy: req.UpdateBy, + SourceType: req.SourceType, + SourceId: req.SourceId, + ProjectId: req.ProjectId, + Status: req.Status, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sQianqiGuangfubanIdsZhuangdian) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiGuangfubanIdsZhuangdian.Ctx(ctx).Delete(dao.QianqiGuangfubanIdsZhuangdian.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/qianqiGuangfubanZuchuan/qianqi_guangfuban_zuchuan.go b/internal/app/system/logic/qianqiGuangfubanZuchuan/qianqi_guangfuban_zuchuan.go new file mode 100644 index 0000000..2a9dc95 --- /dev/null +++ b/internal/app/system/logic/qianqiGuangfubanZuchuan/qianqi_guangfuban_zuchuan.go @@ -0,0 +1,146 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-17 10:37:21 +// 生成路径: internal/app/system/logic/qianqi_guangfuban_zuchuan.go +// 生成人:xyb +// desc:组串 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterQianqiGuangfubanZuchuan(New()) +} + +func New() *sQianqiGuangfubanZuchuan { + return &sQianqiGuangfubanZuchuan{} +} + +type sQianqiGuangfubanZuchuan struct{} + +func (s *sQianqiGuangfubanZuchuan) List(ctx context.Context, req *system.QianqiGuangfubanZuchuanSearchReq) (listRes *system.QianqiGuangfubanZuchuanSearchRes, err error) { + listRes = new(system.QianqiGuangfubanZuchuanSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.QianqiGuangfubanZuchuan.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.QianqiGuangfubanZuchuan.Columns().Id+" = ?", req.Id) + } + if req.CreateBy != "" { + m = m.Where(dao.QianqiGuangfubanZuchuan.Columns().CreateBy+" = ?", req.CreateBy) + } + if req.UpdateBy != "" { + m = m.Where(dao.QianqiGuangfubanZuchuan.Columns().UpdateBy+" = ?", req.UpdateBy) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.QianqiGuangfubanZuchuan.Columns().CreatedAt+" >=? AND "+dao.QianqiGuangfubanZuchuan.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.SourceType != "" { + m = m.Where(dao.QianqiGuangfubanZuchuan.Columns().SourceType+" = ?", req.SourceType) + } + if req.SourceId != "" { + m = m.Where(dao.QianqiGuangfubanZuchuan.Columns().SourceId+" = ?", req.SourceId) + } + if req.ProjectId != "" { + m = m.Where(dao.QianqiGuangfubanZuchuan.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.ZuchuanId != "" { + m = m.Where(dao.QianqiGuangfubanZuchuan.Columns().ZuchuanId+" = ?", req.ZuchuanId) + } + if req.GuangfubanId != "" { + m = m.Where(dao.QianqiGuangfubanZuchuan.Columns().GuangfubanId+" = ?", req.GuangfubanId) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "name asc,id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.QianqiGuangfubanZuchuanInfoRes + err = m.Fields(system.QianqiGuangfubanZuchuanSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.QianqiGuangfubanZuchuanListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.QianqiGuangfubanZuchuanListRes{ + Id: v.Id, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + SourceType: v.SourceType, + SourceId: v.SourceId, + ProjectId: v.ProjectId, + ZuchuanId: v.ZuchuanId, + GuangfubanId: v.GuangfubanId, + LinkedGuangfubanId: v.LinkedGuangfubanId, + } + } + }) + return +} + +func (s *sQianqiGuangfubanZuchuan) GetById(ctx context.Context, id int) (res *model.QianqiGuangfubanZuchuanInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.QianqiGuangfubanZuchuan.Ctx(ctx).WithAll().Where(dao.QianqiGuangfubanZuchuan.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sQianqiGuangfubanZuchuan) Add(ctx context.Context, req *system.QianqiGuangfubanZuchuanAddReq) (err error) { + //err = g.Try(ctx, func(ctx context.Context) { + // _, err = dao.QianqiGuangfubanZuchuan.Ctx(ctx).Insert(do.QianqiGuangfubanZuchuan{ + // CreateBy: req.CreateBy, + // UpdateBy: req.UpdateBy, + // SourceType: req.SourceType, + // SourceId: req.SourceId, + // ProjectId: req.ProjectId, + // ZuchuanId: req.ZuchuanId, + // GuangfubanId: req.GuangfubanId, + // }) + // liberr.ErrIsNil(ctx, err, "添加失败") + //}) + return +} + +func (s *sQianqiGuangfubanZuchuan) Edit(ctx context.Context, req *system.QianqiGuangfubanZuchuanEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiGuangfubanZuchuan.Ctx(ctx).WherePri(req.Id).Update(do.QianqiGuangfubanZuchuan{ + CreateBy: req.CreateBy, + UpdateBy: req.UpdateBy, + SourceType: req.SourceType, + SourceId: req.SourceId, + ProjectId: req.ProjectId, + ZuchuanId: req.ZuchuanId, + GuangfubanId: req.GuangfubanId, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sQianqiGuangfubanZuchuan) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiGuangfubanZuchuan.Ctx(ctx).Delete(dao.QianqiGuangfubanZuchuan.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/qianqiJidianxianlu/qianqi_jidianxianlu.go b/internal/app/system/logic/qianqiJidianxianlu/qianqi_jidianxianlu.go new file mode 100644 index 0000000..718e987 --- /dev/null +++ b/internal/app/system/logic/qianqiJidianxianlu/qianqi_jidianxianlu.go @@ -0,0 +1,198 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-04 16:29:44 +// 生成路径: internal/app/system/logic/qianqi_jidianxianlu.go +// 生成人:gfast +// desc:集电线路 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/common/shp" + "github.com/tiger1103/gfast/v3/api/v1/common/tool" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "strconv" + "strings" + "time" +) + +func init() { + service.RegisterQianqiJidianxianlu(New()) +} + +func New() *sQianqiJidianxianlu { + return &sQianqiJidianxianlu{} +} + +type sQianqiJidianxianlu struct{} + +func (s *sQianqiJidianxianlu) List(ctx context.Context, req *system.QianqiJidianxianluSearchReq) (listRes *system.QianqiJidianxianluSearchRes, err error) { + listRes = new(system.QianqiJidianxianluSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.QianqiJidianxianlu.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.QianqiJidianxianlu.Columns().Id+" = ?", req.Id) + } + if req.ProjectId != "" { + m = m.Where(dao.QianqiJidianxianlu.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.Name != "" { + m = m.Where(dao.QianqiJidianxianlu.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.SourceId != "" { + m = m.Where(dao.QianqiJidianxianlu.Columns().SourceId+" = ?", req.SourceId) + } + if req.SourcePath != "" { + m = m.Where(dao.QianqiJidianxianlu.Columns().SourcePath+" = ?", req.SourcePath) + } + if req.CreateBy != "" { + m = m.Where(dao.QianqiJidianxianlu.Columns().CreateBy+" = ?", req.CreateBy) + } + if req.UpdateBy != "" { + m = m.Where(dao.QianqiJidianxianlu.Columns().UpdateBy+" = ?", req.UpdateBy) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.QianqiJidianxianlu.Columns().CreatedAt+" >=? AND "+dao.QianqiJidianxianlu.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.SourceType != "" { + m = m.Where(dao.QianqiJidianxianlu.Columns().SourceType+" = ?", req.SourceType) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "name asc,id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.QianqiJidianxianluInfoRes + + if !req.NotInPlan { + m = m.Fields(system.QianqiJidianxianluSearchRes{}).Page(req.PageNum, req.PageSize) + } else { + m = m.Fields(system.QianqiJidianxianluSearchRes{}).Where(dao.QianqiJidianxianlu.Columns().SourceId+" not in(select source_id from "+dao.PlanWeek.Table()+" where project_id=?)", req.ProjectId) + } + err = m.Order(order).Scan(&res) + + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.QianqiJidianxianluListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.QianqiJidianxianluListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + Name: v.Name, + SourceId: v.SourceId, + SourcePath: v.SourcePath, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + SourceType: v.SourceType, + Detail: v.Detail, + } + } + }) + return +} + +func (s *sQianqiJidianxianlu) GetById(ctx context.Context, id int) (res *model.QianqiJidianxianluInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.QianqiJidianxianlu.Ctx(ctx).WithAll().Where(dao.QianqiJidianxianlu.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sQianqiJidianxianlu) Add(ctx context.Context, req *system.QianqiJidianxianluAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + var FilePath = "" + res, e := service.SysProject().GetByProjectId(ctx, req.ProjectId) + if e != nil { + liberr.ErrIsNil(ctx, e) + return + } + if res == nil { + liberr.ErrIsNil(ctx, errors.New("项目不存在")) + return + } + file := req.File + for i := range file { + str, err := coryCommon.UploadFile(ctx, file[i], coryCommon.LargeFileShp) + if err != nil { + liberr.ErrIsNil(ctx, err, "上传失败!") + } + arr := strings.Split(str, ".") + arr[len(arr)-1] = "shp" + FilePath = strings.Join(arr, ".") + //FilePath = strings.Join(split[:len(split)-1], "/") //strings.Replace(, "/resource/public", "/file", -1) + //sourceId, _ = gmd5.EncryptString(FilePath) + } + //需要读取方阵里面的信息 + err1, s2 := shp.ReadShp(FilePath) + if err1 != nil { + liberr.ErrIsNil(ctx, err1) + } + fmt.Println(len(s2.Polylines)) + CreateBy := ct.New().GetLoginUser(ctx).Id + var arr []do.QianqiJidianxianlu + for i, p := range s2.Polylines { + road := do.QianqiJidianxianlu{} + road.ProjectId = req.ProjectId + road.SourceId = tool.GetUuid() + road.SourcePath = FilePath + road.CreateBy = CreateBy + marshal, err := json.Marshal(p) + if err != nil { + continue + } + road.Detail = string(marshal) + road.Name = "默认线路名称" + strconv.Itoa(i) + time.Sleep(time.Millisecond) + arr = append(arr, road) + + } + if len(arr) > 0 { + _, err = dao.QianqiJidianxianlu.Ctx(ctx).Insert(&arr) + liberr.ErrIsNil(ctx, err, "添加失败") + } + + }) + return +} + +func (s *sQianqiJidianxianlu) Edit(ctx context.Context, req *system.QianqiJidianxianluEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiJidianxianlu.Ctx(ctx).WherePri(req.Id).Update(do.QianqiJidianxianlu{ + Name: req.Name, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sQianqiJidianxianlu) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiJidianxianlu.Ctx(ctx).Unscoped().Delete(dao.QianqiJidianxianlu.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/qianqiMoxing/qianqi_moxing.go b/internal/app/system/logic/qianqiMoxing/qianqi_moxing.go new file mode 100644 index 0000000..1d75a7e --- /dev/null +++ b/internal/app/system/logic/qianqiMoxing/qianqi_moxing.go @@ -0,0 +1,188 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-07-31 11:09:26 +// 生成路径: internal/app/system/logic/qianqi_moxing.go +// 生成人:gfast +// desc:倾斜模型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/crypto/gmd5" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/common/globe" + "github.com/tiger1103/gfast/v3/api/v1/common/source/clt" + "github.com/tiger1103/gfast/v3/api/v1/common/source/mbt" + "github.com/tiger1103/gfast/v3/api/v1/common/source/pak" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" + "path" + "strings" +) + +func init() { + service.RegisterQianqiMoxing(New()) +} + +func New() *sQianqiMoxing { + return &sQianqiMoxing{} +} + +type sQianqiMoxing struct{} + +func (s *sQianqiMoxing) List(ctx context.Context, req *system.QianqiMoxingSearchReq) (listRes *system.QianqiMoxingSearchRes, err error) { + listRes = new(system.QianqiMoxingSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.QianqiMoxing.Ctx(ctx).WithAll() + if req.ProjectId != "" { //默认带上公共的全国地形 + m = m.Where(dao.QianqiMoxing.Columns().ProjectId+" = ?", req.ProjectId). + WhereOr(dao.QianqiMoxing.Columns().ProjectId+" = ?", 0) + } + if req.Name != "" { + m = m.Where(dao.QianqiMoxing.Columns().Name+" like ?", "%"+req.Name+"%") + } + //创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.QianqiMoxing.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.QianqiMoxing.Columns().CreatedAt+" >=? AND "+dao.QianqiMoxing.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "name asc,id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.QianqiMoxingInfoRes + err = m.Fields(system.QianqiMoxingSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.QianqiMoxingListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.QianqiMoxingListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + Name: v.Name, + SourcePath: v.SourcePath, + Detail: v.Detail, + SourceId: v.SourceId, + CreatedAt: v.CreatedAt, + SourceType: "tileset", + } + } + }) + return +} + +func (s *sQianqiMoxing) GetById(ctx context.Context, id int) (res *model.QianqiMoxingInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.QianqiMoxing.Ctx(ctx).WithAll().Where(dao.QianqiMoxing.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.QianqiMoxingInfoRes) + res = &infoRes + }) + return +} + +func (s *sQianqiMoxing) Add(ctx context.Context, req *system.QianqiMoxingAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + res, e := service.SysProject().GetByProjectId(ctx, req.ProjectId) + if e != nil { + liberr.ErrIsNil(ctx, e) + return + } + if res == nil { + liberr.ErrIsNil(ctx, errors.New("项目不存在")) + return + } + if strings.HasPrefix(req.SourcePath, "/") { + req.SourcePath = strings.Replace(req.SourcePath, "/", "", 1) + } + sourceId := gmd5.MustEncryptString(req.SourcePath) + count, _ := dao.QianqiMoxing.Ctx(ctx).Where(dao.QianqiMoxing.Columns().SourceId, sourceId).Count() + if count == 0 { + _, err = dao.QianqiMoxing.Ctx(ctx).Insert(&do.QianqiMoxing{ + ProjectId: req.ProjectId, + Name: req.Name, + SourceId: sourceId, + SourcePath: req.SourcePath, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + if err == nil { + suffix := path.Ext(req.SourcePath) + switch suffix { + case globe.CLT: + clt.OpenClt(req.SourcePath, sourceId) + break + case globe.MBTILES: + mbt.OpenMbt(req.SourcePath, sourceId) + break + case globe.PAK: + pak.OpenPak(req.SourcePath, sourceId) + } + } + liberr.ErrIsNil(ctx, err, "添加失败") + } + //name := ct.New().GetLoginUser(ctx).Id + //_, err = dao.QianqiMoxing.Ctx(ctx).Insert(do.QianqiMoxing{ + // ProjectId: req.ProjectId, + // Name: fileName, + // SourcePath: FilePath, + // SourceId: sourceId, + // CreateBy: ct.New().GetLoginUser(ctx).Id, + //}) + //建立连接 + //if err == nil { + // clt.OpenClt(FilePath, sourceId) + //} + //liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sQianqiMoxing) Edit(ctx context.Context, req *system.QianqiMoxingEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //name := ct.New().GetLoginUser(ctx).Id + _, err = dao.QianqiMoxing.Ctx(ctx).WherePri(req.Id).Update(do.QianqiMoxing{ + //ProjectId: req.ProjectId, + Name: req.Name, + //SourcePath: req.SourcePath, + Detail: req.Detail, + //SourceId: req.SourceId, + CreateBy: "1", + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sQianqiMoxing) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiMoxing.Ctx(ctx).Unscoped().Delete(dao.QianqiMoxing.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/qianqiNibianqi/qianqi_nibianqi.go b/internal/app/system/logic/qianqiNibianqi/qianqi_nibianqi.go new file mode 100644 index 0000000..436dd94 --- /dev/null +++ b/internal/app/system/logic/qianqiNibianqi/qianqi_nibianqi.go @@ -0,0 +1,239 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-07-31 09:40:17 +// 生成路径: internal/app/system/logic/qianqi_nibianqi.go +// 生成人:gfast +// desc:逆变器 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "encoding/json" + "errors" + "strings" + + "github.com/gogf/gf/v2/crypto/gmd5" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/common/shp" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterQianqiNibianqi(New()) +} + +func New() *sQianqiNibianqi { + return &sQianqiNibianqi{} +} + +type sQianqiNibianqi struct{} + +func (s *sQianqiNibianqi) EditDetail(ctx context.Context, req *system.QianqiNibianqiEditDetailReq) (err error) { + str := "update " + dao.QianqiNibianqi.Table() + " set detail= case " + if len(req.List) > 0 { + var wh []string + for _, detail := range req.List { + marshal, err := json.Marshal(detail.Detail) + if err != nil { + continue + } + st := "when name='" + detail.Name + "' then '" + string(marshal) + "' " + wh = append(wh, st) + } + str = str + strings.Join(wh, " ") + " end where project_id= " + req.ProjectId + // dao.QianqiXiangbian.Ctx(ctx).Raw(str) + _, err = g.DB().Exec(ctx, str) + + } + return +} + +func (s *sQianqiNibianqi) List(ctx context.Context, req *system.QianqiNibianqiSearchReq) (listRes *system.QianqiNibianqiSearchRes, err error) { + listRes = new(system.QianqiNibianqiSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.QianqiNibianqi.Ctx(ctx).WithAll() + if req.ProjectId != "" { + m = m.Where(dao.QianqiNibianqi.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.Name != "" { + m = m.Where(dao.QianqiNibianqi.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.SourceId != "" { + m = m.Where(dao.QianqiNibianqi.Columns().SourceId+" = ?", req.SourceId) + } + if req.ModelId != "" { + m = m.Where(dao.QianqiNibianqi.Columns().ModelId+" = ?", req.ModelId) + } + if req.Xiangbianid != "" { + m = m.Where(dao.QianqiNibianqi.Columns().Xiangbianid+" = ?", req.Xiangbianid) + } + // 创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.BusEquipmentEquipmentUnpacking.Columns().CreatedAt+" like ?", "%"+date+"%") + } + + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "name asc,id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.QianqiNibianqiInfoRes + // err = m.Fields(system.QianqiNibianqiSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + if !req.NotInPlan { + m = m.Fields(system.QianqiNibianqiSearchRes{}).Page(req.PageNum, req.PageSize) + } else { + m = m.Fields(system.QianqiNibianqiSearchRes{}).Where(dao.QianqiNibianqi.Columns().SourceId+" not in(select source_id from "+dao.PlanWeek.Table()+" where project_id=?)", req.ProjectId) + } + err = m.Order(order).Scan(&res) + var mo []struct { + Url string `json:"url"` + ModelId string `json:"model_id"` + } + dao.ZmkgGisModelLib.Ctx(ctx).Fields("url", "model_id").Scan(&mo) + mp := make(map[string]string) + for _, s2 := range mo { + mp[s2.ModelId] = coryCommon.GetWd + s2.Url + } + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.QianqiNibianqiListRes, len(res)) + for k, v := range res { + u := mp[v.ModelId] + + listRes.List[k] = &model.QianqiNibianqiListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + Name: v.Name, + SourceId: v.SourceId, + ModelId: v.ModelId, + Detail: v.Detail, + Xiangbianid: v.Xiangbianid, + CreateAt: v.CreateAt, + Url: u, + SourceType: v.SourceType, + } + } + }) + return +} + +func (s *sQianqiNibianqi) GetById(ctx context.Context, id int) (res *model.QianqiNibianqiInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.QianqiNibianqi.Ctx(ctx).WithAll().Where(dao.QianqiNibianqi.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + // 获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.QianqiNibianqiInfoRes) + res = &infoRes + }) + return +} + +func (s *sQianqiNibianqi) Add(ctx context.Context, req *system.QianqiNibianqiAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + FilePath := "" + res, e := service.SysProject().GetByProjectId(ctx, req.ProjectId) + if e != nil { + liberr.ErrIsNil(ctx, e) + return + } + if res == nil { + liberr.ErrIsNil(ctx, errors.New("项目不存在")) + return + } + file := req.File + for i := range file { + str, err := coryCommon.UploadFile(ctx, file[i], coryCommon.LargeFileShp) + if err != nil { + liberr.ErrIsNil(ctx, err, "上传失败!") + } + arr := strings.Split(str, ".") + arr[len(arr)-1] = "shp" + FilePath = strings.Join(arr, ".") + // FilePath = strings.Join(split[:len(split)-1], "/") //strings.Replace(, "/resource/public", "/file", -1) + // sourceId, _ = gmd5.EncryptString(FilePath) + } + // 需要读取方阵里面的信息 + err1, s2 := shp.ReadShp(FilePath) + if err1 != nil { + liberr.ErrIsNil(ctx, err1) + } + CreateBy := ct.New().GetLoginUser(ctx).Id + var arr []do.QianqiNibianqi + for _, p := range s2.Polylines { + // 将方阵的名称 作为方阵的id + // sourceId := gmd5.MustEncryptString(p.Name) + nibianqi := do.QianqiNibianqi{} + nibianqi.ProjectId = req.ProjectId + nibianqi.SourceId = gmd5.MustEncryptString(req.ProjectId + p.Name) + nibianqi.Name = p.Name + nibianqi.ModelId = "41b366a9bae250098716da675d3ae26d" + nibianqi.CreateBy = CreateBy + detail := shp.Detail{Position: p.Positions[0]} + marshal, err := json.Marshal(detail) + if err != nil { + continue + } + nibianqi.Detail = string(marshal) + + // time.Sleep(time.Millisecond) + + // 判断是否已经存在了该方阵,存在了就不再添加 + count, _ := dao.QianqiNibianqi.Ctx(ctx).Where(dao.QianqiNibianqi.Columns().SourceId, nibianqi.SourceId).Count() + if count == 0 { + arr = append(arr, nibianqi) + } + } + if len(arr) > 0 { + _, err = dao.QianqiNibianqi.Ctx(ctx).Insert(&arr) + liberr.ErrIsNil(ctx, err, "添加失败") + } + }) + return +} + +func (s *sQianqiNibianqi) Edit(ctx context.Context, req *system.QianqiNibianqiEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + // name := ct.New().GetLoginUser(ctx).Id + _, err = dao.QianqiNibianqi.Ctx(ctx).WherePri(req.Id).Update(do.QianqiNibianqi{ + // ProjectId: req.ProjectId, + Name: req.Name, + // SourceId: req.SourceId, + // ModelId: req.ModelId, + Detail: req.Detail, + // Xiangbianid: req.Xiangbianid, + UpdateBy: "1", + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sQianqiNibianqi) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiNibianqi.Ctx(ctx).Unscoped().Delete(dao.QianqiNibianqi.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/qianqiPingchang/qianqi_pingchang.go b/internal/app/system/logic/qianqiPingchang/qianqi_pingchang.go new file mode 100644 index 0000000..8715bfe --- /dev/null +++ b/internal/app/system/logic/qianqiPingchang/qianqi_pingchang.go @@ -0,0 +1,219 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-08 10:08:24 +// 生成路径: internal/app/system/logic/qianqi_pingchang.go +// 生成人:gfast +// desc:平场数据 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterQianqiPingchang(New()) +} + +func New() *sQianqiPingchang { + return &sQianqiPingchang{} +} + +type sQianqiPingchang struct{} + +//func (s *sQianqiPingchang) List(ctx context.Context, req *system.QianqiPingchangSearchReq) (listRes *system.QianqiPingchangSearchRes, err error) { +// listRes = new(system.QianqiPingchangSearchRes) +// err = g.Try(ctx, func(ctx context.Context) { +// m := dao.QianqiPingchang.Ctx(ctx).WithAll() +// if req.Id != "" { +// m = m.Where(dao.QianqiPingchang.Columns().Id+" = ?", req.Id) +// } +// if req.CreateAt != "" { +// m = m.Where(dao.QianqiPingchang.Columns().CreateAt+" = ?", gconv.Time(req.CreateAt)) +// } +// if req.UpdateAt != "" { +// m = m.Where(dao.QianqiPingchang.Columns().UpdateAt+" = ?", gconv.Time(req.UpdateAt)) +// } +// if req.DeleteAt != "" { +// m = m.Where(dao.QianqiPingchang.Columns().DeleteAt+" = ?", gconv.Time(req.DeleteAt)) +// } +// if req.ProjectId != "" { +// m = m.Where(dao.QianqiPingchang.Columns().ProjectId+" = ?", req.ProjectId) +// } +// if req.PcId != "" { +// m = m.Where(dao.QianqiPingchang.Columns().PcId+" = ?", req.PcId) +// } +// if req.PcName != "" { +// m = m.Where(dao.QianqiPingchang.Columns().PcName+" like ?", "%"+req.PcName+"%") +// } +// if req.Range != "" { +// m = m.Where(dao.QianqiPingchang.Columns().Range+" = ?", req.Range) +// } +// if req.Points != "" { +// m = m.Where(dao.QianqiPingchang.Columns().Points+" = ?", req.Points) +// } +// if req.SmoothPoints != "" { +// m = m.Where(dao.QianqiPingchang.Columns().SmoothPoints+" = ?", req.SmoothPoints) +// } +// if req.Shp != "" { +// m = m.Where(dao.QianqiPingchang.Columns().Shp+" = ?", req.Shp) +// } +// if req.Imported != "" { +// m = m.Where(dao.QianqiPingchang.Columns().Imported+" = ?", gconv.Int(req.Imported)) +// } +// listRes.Total, err = m.Count() +// liberr.ErrIsNil(ctx, err, "获取总行数失败") +// if req.PageNum == 0 { +// req.PageNum = 1 +// } +// listRes.CurrentPage = req.PageNum +// if req.PageSize == 0 { +// req.PageSize = consts.PageSize +// } +// order := "id desc" +// if req.OrderBy != "" { +// order = req.OrderBy +// } +// var res []*model.QianqiPingchangInfoRes +// err = m.Fields(system.QianqiPingchangSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) +// liberr.ErrIsNil(ctx, err, "获取数据失败") +// listRes.List = make([]*model.QianqiPingchangListRes, len(res)) +// for k, v := range res { +// listRes.List[k] = &model.QianqiPingchangListRes{ +// Id: v.Id, +// CreateAt: v.CreateAt, +// UpdateAt: v.UpdateAt, +// DeleteAt: v.DeleteAt, +// ProjectId: v.ProjectId, +// PcId: v.PcId, +// PcName: v.PcName, +// GridWidth: v.GridWidth, +// Progress: v.Progress, +// Range: v.Range, +// Points: v.Points, +// SmoothPoints: v.SmoothPoints, +// Shp: v.Shp, +// Area: v.Area, +// Cut: v.Cut, +// Fill: v.Fill, +// Total: v.Total, +// Imported: v.Imported, +// } +// } +// }) +// return +//} + +func (s *sQianqiPingchang) GetById(ctx context.Context, id uint64) (res *model.QianqiPingchangInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.QianqiPingchang.Ctx(ctx).WithAll().Where(dao.QianqiPingchang.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +//func (s *sQianqiPingchang) Add(ctx context.Context, req *system.QianqiPingchangAddReq) (err error) { +// /* err = g.Try(ctx, func(ctx context.Context) { +// var FilePath = "" +// res, e := service.SysProject().GetByProjectId(ctx, req.ProjectId) +// if e != nil { +// liberr.ErrIsNil(ctx, e) +// return +// } +// if res == nil { +// liberr.ErrIsNil(ctx, errors.New("项目不存在")) +// return +// } +// file := req.File +// for i := range file { +// str, err := coryCommon.UploadFile(ctx, file[i], coryCommon.LargeFileShp) +// if err != nil { +// liberr.ErrIsNil(ctx, err, "上传失败!") +// } +// arr := strings.Split(str, ".") +// arr[len(arr)-1] = "shp" +// FilePath = strings.Join(arr, ".") +// //FilePath = strings.Join(split[:len(split)-1], "/") //strings.Replace(, "/resource/public", "/file", -1) +// //sourceId, _ = gmd5.EncryptString(FilePath) +// } +// //需要读取方阵里面的信息 +// err1, s2 := shp.ReadShp(FilePath) +// if err1 != nil { +// liberr.ErrIsNil(ctx, err1) +// } +// CreateBy := ct.New().GetLoginUser(ctx).Id +// var arr []do.QianqiPingchang +// for _, p := range s2.Polylines { +// //将方阵的名称 作为方阵的id +// //sourceId := gmd5.MustEncryptString(p.Name) +// nibianqi := do.QianqiPingchang{} +// nibianqi.ProjectId = req.ProjectId +// nibianqi.SourceId = gmd5.MustEncryptString(req.ProjectId + p.Name) +// nibianqi.Name = p.Name +// nibianqi.ModelId = "41b366a9bae250098716da675d3ae26d" +// nibianqi.CreateBy = CreateBy +// detail := shp.Detail{Position: p.Positions[0]} +// marshal, err := json.Marshal(detail) +// if err != nil { +// continue +// } +// nibianqi.Detail = string(marshal) +// +// //time.Sleep(time.Millisecond) +// +// //判断是否已经存在了该方阵,存在了就不再添加 +// count, _ := dao.QianqiNibianqi.Ctx(ctx).Where(dao.QianqiNibianqi.Columns().SourceId, nibianqi.SourceId).Count() +// if count == 0 { +// arr = append(arr, nibianqi) +// +// } +// } +// if len(arr) > 0 { +// _, err = dao.QianqiNibianqi.Ctx(ctx).Insert(&arr) +// liberr.ErrIsNil(ctx, err, "添加失败") +// } +// +// }) */ +// return +//} +// +//func (s *sQianqiPingchang) Edit(ctx context.Context, req *system.QianqiPingchangEditReq) (err error) { +// err = g.Try(ctx, func(ctx context.Context) { +// _, err = dao.QianqiPingchang.Ctx(ctx).WherePri(req.Id).Update(do.QianqiPingchang{ +// CreateAt: req.CreateAt, +// UpdateAt: req.UpdateAt, +// DeleteAt: req.DeleteAt, +// ProjectId: req.ProjectId, +// PcId: req.PcId, +// PcName: req.PcName, +// GridWidth: req.GridWidth, +// Progress: req.Progress, +// Range: req.Range, +// Points: req.Points, +// SmoothPoints: req.SmoothPoints, +// Shp: req.Shp, +// Area: req.Area, +// Cut: req.Cut, +// Fill: req.Fill, +// Total: req.Total, +// Imported: req.Imported, +// }) +// liberr.ErrIsNil(ctx, err, "修改失败") +// }) +// return +//} + +func (s *sQianqiPingchang) Delete(ctx context.Context, ids []uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiPingchang.Ctx(ctx).Delete(dao.QianqiPingchang.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/qianqiRedline/qianqi_redline.go b/internal/app/system/logic/qianqiRedline/qianqi_redline.go new file mode 100644 index 0000000..76e84e0 --- /dev/null +++ b/internal/app/system/logic/qianqiRedline/qianqi_redline.go @@ -0,0 +1,176 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-07-31 11:45:12 +// 生成路径: internal/app/system/logic/qianqi_redline.go +// 生成人:gfast +// desc:红线 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "fmt" + "github.com/gogf/gf/v2/crypto/gmd5" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" + "strings" +) + +func init() { + service.RegisterQianqiRedline(New()) +} + +func New() *sQianqiRedline { + return &sQianqiRedline{} +} + +type sQianqiRedline struct{} + +func (s *sQianqiRedline) List(ctx context.Context, req *system.QianqiRedlineSearchReq) (listRes *system.QianqiRedlineSearchRes, err error) { + listRes = new(system.QianqiRedlineSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.QianqiRedline.Ctx(ctx).WithAll() + if req.ProjectId != "" { + m = m.Where(dao.QianqiRedline.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.Name != "" { + m = m.Where(dao.QianqiRedline.Columns().Name+" like ?", "%"+req.Name+"%") + } + //创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.QianqiRedline.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.QianqiRedline.Columns().CreatedAt+" >=? AND "+dao.QianqiRedline.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "name asc,id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.QianqiRedlineInfoRes + + if !req.NotInPlan { + m = m.Fields(system.QianqiRedlineSearchRes{}).Page(req.PageNum, req.PageSize) + } else { + m = m.Fields(system.QianqiRedlineSearchRes{}). + Where(dao.QianqiRedline.Columns().SourceId+" not in(select source_id from "+dao.PlanWeek.Table()+" where project_id=?)", req.ProjectId) + } + err = m.Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.QianqiRedlineListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.QianqiRedlineListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + Name: v.Name, + SourceId: v.SourceId, + SourcePath: v.SourcePath, + SourceType: v.SourceType, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sQianqiRedline) GetById(ctx context.Context, id int) (res *model.QianqiRedlineInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.QianqiRedline.Ctx(ctx).WithAll().Where(dao.QianqiRedline.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.QianqiRedlineInfoRes) + res = &infoRes + }) + return +} + +func (s *sQianqiRedline) Add(ctx context.Context, req *system.QianqiRedlineAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + var fileName = "" + var FilePath = "" + var sourceId = "" + res, e := service.SysProject().GetByProjectId(ctx, req.ProjectId) + if e != nil { + liberr.ErrIsNil(ctx, e) + return + } + if res == nil { + liberr.ErrIsNil(ctx, errors.New("项目不存在")) + return + } + file := req.File + for i := range file { + str, err := coryCommon.UploadFile(ctx, file[i], coryCommon.LargeFileShp) + if err != nil { + liberr.ErrIsNil(ctx, err, "上传失败!") + } + fmt.Println(str) + //fmt.Println(file[i].Filename) + fileName = file[i].Filename + arr := strings.Split(str, ".") + arr[len(arr)-1] = "shp" + FilePath = strings.Join(arr, ".") + //FilePath = strings.Join(split[:len(split)-1], "/") //strings.Replace(, "/resource/public", "/file", -1) + sourceId, _ = gmd5.EncryptString(FilePath) + } + count, _ := dao.QianqiRedline.Ctx(ctx).Where(dao.QianqiRedline.Columns().SourceId, sourceId).Count() + if count == 0 { + _, err = dao.QianqiRedline.Ctx(ctx).Insert(&do.QianqiRedline{ + ProjectId: req.ProjectId, + Name: strings.Split(fileName, ".")[0], + SourceId: sourceId, + SourcePath: FilePath, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + } + }) + return +} + +func (s *sQianqiRedline) Edit(ctx context.Context, req *system.QianqiRedlineEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + name := ct.New().GetLoginUser(ctx).Id + _, err = dao.QianqiRedline.Ctx(ctx).WherePri(req.Id).Update(do.QianqiRedline{ + //ProjectId: req.ProjectId, + Name: req.Name, + //SourceId: req.SourceId, + //SourcePath: req.SourcePath, + UpdateBy: name, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sQianqiRedline) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiRedline.Ctx(ctx).Unscoped().Delete(dao.QianqiRedline.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/qianqiRedlineTudiliuzhuan/qianqi_redline_tudiliuzhuan.go b/internal/app/system/logic/qianqiRedlineTudiliuzhuan/qianqi_redline_tudiliuzhuan.go new file mode 100644 index 0000000..2f83408 --- /dev/null +++ b/internal/app/system/logic/qianqiRedlineTudiliuzhuan/qianqi_redline_tudiliuzhuan.go @@ -0,0 +1,183 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-04 11:47:15 +// 生成路径: internal/app/system/logic/qianqi_redline_tudiliuzhuan.go +// 生成人:gfast +// desc:土地流转 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "fmt" + "github.com/gogf/gf/v2/crypto/gmd5" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "strings" +) + +func init() { + service.RegisterQianqiRedlineTudiliuzhuan(New()) +} + +func New() *sQianqiRedlineTudiliuzhuan { + return &sQianqiRedlineTudiliuzhuan{} +} + +type sQianqiRedlineTudiliuzhuan struct{} + +func (s *sQianqiRedlineTudiliuzhuan) List(ctx context.Context, req *system.QianqiRedlineTudiliuzhuanSearchReq) (listRes *system.QianqiRedlineTudiliuzhuanSearchRes, err error) { + listRes = new(system.QianqiRedlineTudiliuzhuanSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.QianqiRedlineTudiliuzhuan.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.QianqiRedlineTudiliuzhuan.Columns().Id+" = ?", req.Id) + } + if req.ProjectId != "" { + m = m.Where(dao.QianqiRedlineTudiliuzhuan.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.Name != "" { + m = m.Where(dao.QianqiRedlineTudiliuzhuan.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.SourceId != "" { + m = m.Where(dao.QianqiRedlineTudiliuzhuan.Columns().SourceId+" = ?", req.SourceId) + } + if req.SourcePath != "" { + m = m.Where(dao.QianqiRedlineTudiliuzhuan.Columns().SourcePath+" = ?", req.SourcePath) + } + if req.CreateBy != "" { + m = m.Where(dao.QianqiRedlineTudiliuzhuan.Columns().CreateBy+" = ?", req.CreateBy) + } + if req.UpdateBy != "" { + m = m.Where(dao.QianqiRedlineTudiliuzhuan.Columns().UpdateBy+" = ?", req.UpdateBy) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.QianqiRedlineTudiliuzhuan.Columns().CreatedAt+" >=? AND "+dao.QianqiRedlineTudiliuzhuan.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.SourceType != "" { + m = m.Where(dao.QianqiRedlineTudiliuzhuan.Columns().SourceType+" = ?", req.SourceType) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "name asc,id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.QianqiRedlineTudiliuzhuanInfoRes + if !req.NotInPlan { + m = m.Fields(system.QianqiRedlineTudiliuzhuanSearchRes{}).Page(req.PageNum, req.PageSize) + } else { + m = m.Fields(system.QianqiRedlineTudiliuzhuanSearchRes{}).Where(dao.QianqiRedlineTudiliuzhuan.Columns().SourceId+" not in(select source_id from "+dao.PlanWeek.Table()+" where project_id=?)", req.ProjectId) + } + err = m.Order(order).Scan(&res) + //err = m.Fields(system.QianqiRedlineTudiliuzhuanSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.QianqiRedlineTudiliuzhuanListRes, len(res)) + for k, v := range res { + //sourcePath := ([]*comModel.UpFile)(nil) + //err = gjson.DecodeTo(v.SourcePath, &sourcePath) + //liberr.ErrIsNil(ctx, err) + listRes.List[k] = &model.QianqiRedlineTudiliuzhuanListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + Name: v.Name, + SourceId: v.SourceId, + SourcePath: v.SourcePath, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + SourceType: v.SourceType, + //Detail: v.Detail, + } + } + }) + return +} + +func (s *sQianqiRedlineTudiliuzhuan) GetById(ctx context.Context, id int) (res *model.QianqiRedlineTudiliuzhuanInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.QianqiRedlineTudiliuzhuan.Ctx(ctx).WithAll().Where(dao.QianqiRedlineTudiliuzhuan.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sQianqiRedlineTudiliuzhuan) Add(ctx context.Context, req *system.QianqiRedlineTudiliuzhuanAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + var fileName = "" + var FilePath = "" + var sourceId = "" + res, e := service.SysProject().GetByProjectId(ctx, req.ProjectId) + if e != nil { + liberr.ErrIsNil(ctx, e) + return + } + if res == nil { + liberr.ErrIsNil(ctx, errors.New("项目不存在")) + return + } + file := req.File + for i := range file { + str, err := coryCommon.UploadFile(ctx, file[i], coryCommon.LargeFileShp) + if err != nil { + liberr.ErrIsNil(ctx, err, "上传失败!") + } + fmt.Println(str) + //fmt.Println(file[i].Filename) + fileName = file[i].Filename + arr := strings.Split(str, ".") + arr[len(arr)-1] = "shp" + FilePath = strings.Join(arr, ".") + //FilePath = strings.Join(split[:len(split)-1], "/") //strings.Replace(, "/resource/public", "/file", -1) + sourceId, _ = gmd5.EncryptString(FilePath) + } + count, _ := dao.QianqiRedlineTudiliuzhuan.Ctx(ctx).Where(dao.QianqiRedlineTudiliuzhuan.Columns().SourceId, sourceId).Count() + if count == 0 { + _, err = dao.QianqiRedlineTudiliuzhuan.Ctx(ctx).Insert(&do.QianqiRedlineTudiliuzhuan{ + ProjectId: req.ProjectId, + Name: strings.Split(fileName, ".")[0], + SourceId: sourceId, + SourcePath: FilePath, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + } + }) + return +} + +func (s *sQianqiRedlineTudiliuzhuan) Edit(ctx context.Context, req *system.QianqiRedlineTudiliuzhuanEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiRedlineTudiliuzhuan.Ctx(ctx).WherePri(req.Id).Update(do.QianqiRedlineTudiliuzhuan{ + Name: req.Name, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sQianqiRedlineTudiliuzhuan) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiRedlineTudiliuzhuan.Ctx(ctx).Unscoped().Delete(dao.QianqiRedlineTudiliuzhuan.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/qianqiRoad/qianqi_road.go b/internal/app/system/logic/qianqiRoad/qianqi_road.go new file mode 100644 index 0000000..4bca1fc --- /dev/null +++ b/internal/app/system/logic/qianqiRoad/qianqi_road.go @@ -0,0 +1,214 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-04 16:24:38 +// 生成路径: internal/app/system/logic/qianqi_road.go +// 生成人:gfast +// desc:道路 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/common/shp" + "github.com/tiger1103/gfast/v3/api/v1/common/tool" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "strconv" + "strings" + "time" +) + +func init() { + service.RegisterQianqiRoad(New()) +} + +func New() *sQianqiRoad { + return &sQianqiRoad{} +} + +type sQianqiRoad struct{} + +func (s *sQianqiRoad) List(ctx context.Context, req *system.QianqiRoadSearchReq) (listRes *system.QianqiRoadSearchRes, err error) { + listRes = new(system.QianqiRoadSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.QianqiRoad.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.QianqiRoad.Columns().Id+" = ?", req.Id) + } + if req.ProjectId != "" { + m = m.Where(dao.QianqiRoad.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.Name != "" { + m = m.Where(dao.QianqiRoad.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.SourceId != "" { + m = m.Where(dao.QianqiRoad.Columns().SourceId+" = ?", req.SourceId) + } + if req.SourcePath != "" { + m = m.Where(dao.QianqiRoad.Columns().SourcePath+" = ?", req.SourcePath) + } + if req.CreateBy != "" { + m = m.Where(dao.QianqiRoad.Columns().CreateBy+" = ?", req.CreateBy) + } + if req.UpdateBy != "" { + m = m.Where(dao.QianqiRoad.Columns().UpdateBy+" = ?", req.UpdateBy) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.QianqiRoad.Columns().CreatedAt+" >=? AND "+dao.QianqiRoad.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.SourceType != "" { + m = m.Where(dao.QianqiRoad.Columns().SourceType+" = ?", req.SourceType) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "name asc,id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.QianqiRoadInfoRes + //err = m.Fields(system.QianqiRoadSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + if !req.NotInPlan { + m = m.Fields(system.QianqiRoadSearchRes{}).Page(req.PageNum, req.PageSize) + } else { + m = m.Fields(system.QianqiRoadSearchRes{}).Where(dao.QianqiRoad.Columns().SourceId+" not in(select source_id from "+dao.PlanWeek.Table()+" where project_id=?)", req.ProjectId) + } + err = m.Order(order).Scan(&res) + + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.QianqiRoadListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.QianqiRoadListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + Name: v.Name, + SourceId: v.SourceId, + SourcePath: v.SourcePath, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + SourceType: v.SourceType, + Detail: v.Detail, + } + } + }) + return +} + +func (s *sQianqiRoad) GetById(ctx context.Context, id int) (res *model.QianqiRoadInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.QianqiRoad.Ctx(ctx).WithAll().Where(dao.QianqiRoad.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sQianqiRoad) Add(ctx context.Context, req *system.QianqiRoadAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + var FilePath = "" + res, e := service.SysProject().GetByProjectId(ctx, req.ProjectId) + if e != nil { + liberr.ErrIsNil(ctx, e) + return + } + if res == nil { + liberr.ErrIsNil(ctx, errors.New("项目不存在")) + return + } + file := req.File + for i := range file { + str, err := coryCommon.UploadFile(ctx, file[i], coryCommon.LargeFileShp) + if err != nil { + liberr.ErrIsNil(ctx, err, "上传失败!") + } + arr := strings.Split(str, ".") + arr[len(arr)-1] = "shp" + FilePath = strings.Join(arr, ".") + //FilePath = strings.Join(split[:len(split)-1], "/") //strings.Replace(, "/resource/public", "/file", -1) + //sourceId, _ = gmd5.EncryptString(FilePath) + } + //需要读取方阵里面的信息 + err1, s2 := shp.ReadShp(FilePath) + if err1 != nil { + liberr.ErrIsNil(ctx, err1) + } + fmt.Println(len(s2.Polylines)) + CreateBy := ct.New().GetLoginUser(ctx).Id + var arr []do.QianqiRoad + for i, p := range s2.Polylines { + //将方阵的名称 作为方阵的id + //sourceId := gmd5.MustEncryptString(p.Name) + road := do.QianqiRoad{} + road.ProjectId = req.ProjectId + road.SourceId = tool.GetUuid() + road.SourcePath = FilePath + road.CreateBy = CreateBy + marshal, err := json.Marshal(p) + if err != nil { + continue + } + road.Detail = string(marshal) + + road.Name = "默认道路名称" + strconv.Itoa(i) + time.Sleep(time.Millisecond) + arr = append(arr, road) + + //判断是否已经存在了该方阵,存在了就不再添加 + //count, _ := dao.QianqiFangzhen.Ctx(ctx).Where(dao.QianqiFangzhen.Columns().SourceId, sourceId).Count() + //if count == 0 { + // marshal, err := json.Marshal(p) + // if err != nil { + // continue + // } + // + //} + } + if len(arr) > 0 { + _, err = dao.QianqiRoad.Ctx(ctx).Insert(&arr) + liberr.ErrIsNil(ctx, err, "添加失败") + } + //_, err = dao.QianqiRoad.Ctx(ctx).Insert(do.QianqiRoad{ + // ProjectId: req.ProjectId, + //}) + //liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sQianqiRoad) Edit(ctx context.Context, req *system.QianqiRoadEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiRoad.Ctx(ctx).WherePri(req.Id).Update(do.QianqiRoad{ + Name: req.Name, + SourceType: req.SourceType, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sQianqiRoad) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiRoad.Ctx(ctx).Unscoped().Delete(dao.QianqiRoad.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/qianqiXiangbian/qianqi_xiangbian.go b/internal/app/system/logic/qianqiXiangbian/qianqi_xiangbian.go new file mode 100644 index 0000000..8283ac9 --- /dev/null +++ b/internal/app/system/logic/qianqiXiangbian/qianqi_xiangbian.go @@ -0,0 +1,232 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-07-31 09:52:13 +// 生成路径: internal/app/system/logic/qianqi_xiangbian.go +// 生成人:gfast +// desc:箱变 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "encoding/json" + "strings" + + "github.com/gogf/gf/v2/crypto/gmd5" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/common/shp" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterQianqiXiangbian(New()) +} + +func New() *sQianqiXiangbian { + return &sQianqiXiangbian{} +} + +type sQianqiXiangbian struct{} + +func (s *sQianqiXiangbian) EditDetail(ctx context.Context, req *system.QianqiXiangbianEditDetailReq) (err error) { + str := "update " + dao.QianqiXiangbian.Table() + " set detail= case " + if len(req.List) > 0 { + var wh []string + for _, detail := range req.List { + marshal, err := json.Marshal(detail.Detail) + if err != nil { + continue + } + st := "when name='" + detail.Name + "' then '" + string(marshal) + "' " + wh = append(wh, st) + } + str = str + strings.Join(wh, " ") + " end where project_id= " + req.ProjectId + // dao.QianqiXiangbian.Ctx(ctx).Raw(str) + _, err = g.DB().Exec(ctx, str) + + } + return +} + +func (s *sQianqiXiangbian) List(ctx context.Context, req *system.QianqiXiangbianSearchReq) (listRes *system.QianqiXiangbianSearchRes, err error) { + listRes = new(system.QianqiXiangbianSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.QianqiXiangbian.Ctx(ctx).WithAll() + if req.ProjectId != "" { + m = m.Where(dao.QianqiXiangbian.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.Name != "" { + m = m.Where(dao.QianqiXiangbian.Columns().Name+" like ?", "%"+req.Name+"%") + } + // 创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.QianqiXiangbian.Columns().CreatedAt+" like ?", "%"+date+"%") + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = 20 + } + order := "name asc,id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.QianqiXiangbianInfoRes + // err = m.Fields(system.QianqiXiangbianSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + + if !req.NotInPlan { + m = m.Fields(system.QianqiXiangbianSearchRes{}).Page(req.PageNum, req.PageSize) + } else { + m = m.Fields(system.QianqiXiangbianSearchRes{}). + Where(dao.QianqiXiangbian.Columns().SourceId+" not in(select source_id from "+dao.PlanWeek.Table()+" where project_id=?)", req.ProjectId) + } + + err = m.Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.QianqiXiangbianListRes, len(res)) + var mo []struct { + Url string `json:"url"` + ModelId string `json:"model_id"` + } + dao.ZmkgGisModelLib.Ctx(ctx).Fields("url", "model_id").Scan(&mo) + mp := make(map[string]string) + for _, s2 := range mo { + mp[s2.ModelId] = coryCommon.GetWd + s2.Url + } + + for k, v := range res { + u := mp[v.ModelId] + + listRes.List[k] = &model.QianqiXiangbianListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + Name: v.Name, + SourceId: v.SourceId, + ModelId: v.ModelId, + Url: u, + Detail: v.Detail, + CreateAt: v.CreateAt, + SourceType: v.SourceType, + } + } + }) + return +} + +func (s *sQianqiXiangbian) GetById(ctx context.Context, id int) (res *model.QianqiXiangbianInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.QianqiXiangbian.Ctx(ctx).WithAll().Where(dao.QianqiXiangbian.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + // 获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.QianqiXiangbianInfoRes) + res = &infoRes + }) + return +} + +func (s *sQianqiXiangbian) Add(ctx context.Context, req *system.QianqiXiangbianAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + FilePath := "" + // res, e := service.SysProject().GetByProjectId(ctx, req.ProjectId) + // if e != nil { + // liberr.ErrIsNil(ctx, e) + // return + // } + // if res == nil { + // liberr.ErrIsNil(ctx, errors.New("项目不存在")) + // return + // } + file := req.File + for i := range file { + str, err := coryCommon.UploadFile(ctx, file[i], coryCommon.LargeFileShp) + if err != nil { + liberr.ErrIsNil(ctx, err, "上传失败!") + } + arr := strings.Split(str, ".") + arr[len(arr)-1] = "shp" + FilePath = strings.Join(arr, ".") + // FilePath = strings.Join(split[:len(split)-1], "/") //strings.Replace(, "/resource/public", "/file", -1) + // sourceId, _ = gmd5.EncryptString(FilePath) + } + // 需要读取方阵里面的信息 + err1, s2 := shp.ReadShp(FilePath) + if err1 != nil { + liberr.ErrIsNil(ctx, err1) + } + CreateBy := ct.New().GetLoginUser(ctx).Id + var xiangbianArray []do.QianqiXiangbian + for _, p := range s2.Polylines { + // 将方阵的名称 作为方阵的id + // sourceId := gmd5.MustEncryptString(p.Name) + detail := shp.Detail{Position: p.Positions[0]} + marshal, err := json.Marshal(detail) + if err != nil { + continue + } + + xb := do.QianqiXiangbian{ + ProjectId: req.ProjectId, + SourceId: gmd5.MustEncryptString(req.ProjectId + p.Name), + Name: p.Name, + ModelId: "518bb3c165e22097ebbf2c2c42c8e308", + CreateBy: CreateBy, + Detail: string(marshal), + } + + // 判断是否已经存在了该方阵,存在了就不再添加 + count, _ := dao.QianqiXiangbian.Ctx(ctx).Where(dao.QianqiXiangbian.Columns().SourceId, xb.SourceId).Count() + if count == 0 { + xiangbianArray = append(xiangbianArray, xb) + } + } + if len(xiangbianArray) > 0 { + _, err = dao.QianqiXiangbian.Ctx(ctx).Insert(&xiangbianArray) + liberr.ErrIsNil(ctx, err, "添加失败") + } + }) + return +} + +func (s *sQianqiXiangbian) Edit(ctx context.Context, req *system.QianqiXiangbianEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + // name := ct.New().GetLoginUser(ctx).Id + xiangbian := do.QianqiXiangbian{ + Name: req.Name, + // SourceId: req.SourceId, + // ModelId: req.ModelId, + Detail: req.Detail, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + } + if req.ProjectId != "" { + xiangbian.ProjectId = req.ProjectId + } + _, err = dao.QianqiXiangbian.Ctx(ctx).WherePri(req.Id).Update(xiangbian) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sQianqiXiangbian) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.QianqiXiangbian.Ctx(ctx).Unscoped().Delete(dao.QianqiXiangbian.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/reminders/reminders.go b/internal/app/system/logic/reminders/reminders.go new file mode 100644 index 0000000..aca881f --- /dev/null +++ b/internal/app/system/logic/reminders/reminders.go @@ -0,0 +1,172 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-05-14 14:55:52 +// 生成路径: internal/app/system/logic/reminders.go +// 生成人:gfast +// desc:App-消息-提醒 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "strconv" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/jinzhu/copier" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" +) + +func init() { + service.RegisterReminders(New()) +} + +func New() *sReminders { + return &sReminders{} +} + +type sReminders struct{} + +func (s *sReminders) List(ctx context.Context, req *system.RemindersSearchReq) (listRes *system.RemindersSearchRes, err error) { + // 获取 user_id + userID := ct.New().GetUserId(ctx) + + listRes = new(system.RemindersSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.Reminders.Ctx(ctx).WithAll().As("rs") + + // if req.Id != "" { + // m = m.Where("rs."+dao.Reminders.Columns().Id+" = ?", req.Id) + // } + iid := "" + if req.OpenId != "" { + m = m.Where("rs."+dao.Reminders.Columns().UserId+" = ?", req.OpenId) + iid = req.OpenId + } else { + m = m.Where("rs."+dao.Reminders.Columns().UserId+" = ?", userID) + iid = strconv.FormatUint(userID, 10) + } + + //if req.UserId != "" { + // m = m.Where("rs."+dao.Reminders.Columns().UserId+" = ?", gconv.Int(req.UserId)) + //} + if req.ReminderType != "" { + m = m.Where("rs."+dao.Reminders.Columns().ReminderType+" = ?", gconv.Int(req.ReminderType)) + } + if req.Title != "" { + m = m.Where("rs."+dao.Reminders.Columns().Title+" = ?", req.Title) + } + if req.ViolationType != "" { + m = m.Where("rs."+dao.Reminders.Columns().ViolationType+" = ?", req.ViolationType) + } + if req.ProjectId != "" { + m = m.Where("rs."+dao.Reminders.Columns().ProjectId+" = ?", gconv.Int(req.ProjectId)). + LeftJoin("sys_project as sp", "rs.project_id = sp.id") + } + if len(req.DateRange) != 0 { + m = m.Where("rs."+dao.Reminders.Columns().CreatedAt+" >=? AND "+dao.Reminders.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id" + if req.OrderBy != "" { + order = req.OrderBy + } + + var res []*model.RemindersInfoRes + + m = m.LeftJoin("sys_user as su", "rs.user_id = su.id") + + fields := "rs.id,rs.user_id,rs.reminder_type,rs.title,rs.violation_type,rs.project_id,rs.created_at,sp.project_name,rs.status,rs.order_id,su.user_nickname" + + err = m.Fields(fields).Page(req.PageNum, req.PageSize).OrderDesc(order).Scan(&res) + + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.RemindersListRes, len(res)) + + _, err = dao.Reminders.Ctx(ctx). + Where(dao.Reminders.Columns().ProjectId, req.ProjectId). + Where("user_id = '" + req.UserId + "'"). + Data( + g.Map{ + dao.Reminders.Columns().IsRead: 1, + }, + ).Update() + liberr.ErrIsNil(ctx, err, "修改已读状态失败") + + // 根据 openID 已读状态 + _, err = dao.Reminders.Ctx(ctx). + Where(dao.Reminders.Columns().ProjectId, req.ProjectId). + Where("user_id = '" + iid + "'"). + Data( + g.Map{ + dao.Reminders.Columns().IsRead: 1, + }, + ).Update() + liberr.ErrIsNil(ctx, err, "修改已读状态失败") + + copier.Copy(&listRes.List, &res) + }) + return +} + +func (s *sReminders) GetById(ctx context.Context, id uint) (res *model.RemindersInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.Reminders.Ctx(ctx).WithAll().Where(dao.Reminders.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sReminders) Add(ctx context.Context, req *system.RemindersAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.Reminders.Ctx(ctx).Insert(do.Reminders{ + UserId: req.UserId, + ReminderType: req.ReminderType, + Title: req.Title, + ViolationType: req.ViolationType, + ProjectId: req.ProjectId, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sReminders) Edit(ctx context.Context, req *system.RemindersEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.Reminders.Ctx(ctx).WherePri(req.Id).Update(do.Reminders{ + UserId: req.UserId, + ReminderType: req.ReminderType, + Title: req.Title, + ViolationType: req.ViolationType, + ProjectId: req.ProjectId, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sReminders) Delete(ctx context.Context, ids []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.Reminders.Ctx(ctx).Delete(dao.Reminders.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/subProject/sub_project.go b/internal/app/system/logic/subProject/sub_project.go new file mode 100644 index 0000000..d571c8f --- /dev/null +++ b/internal/app/system/logic/subProject/sub_project.go @@ -0,0 +1,116 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-03-21 18:53:15 +// 生成路径: internal/app/system/logic/sub_project.go +// 生成人:gfast +// desc:子项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterSubProject(New()) +} + +func New() *sSubProject { + return &sSubProject{} +} + +type sSubProject struct{} + +func (s *sSubProject) List(ctx context.Context, req *system.SubProjectSearchReq) (listRes *system.SubProjectSearchRes, err error) { + listRes = new(system.SubProjectSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SubProject.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.SubProject.Columns().Id+" = ?", req.Id) + } + if req.ProjectId != "" { + m = m.Where(dao.SubProject.Columns().ProjectId+" = ?", gconv.Int(req.ProjectId)) + } + if req.ProjectName != "" { + m = m.Where(dao.SubProject.Columns().ProjectName+" like ?", "%"+req.ProjectName+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.SubProject.Columns().CreatedAt+" >=? AND "+dao.SubProject.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.SubProjectInfoRes + err = m.Fields(system.SubProjectSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.SubProjectListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.SubProjectListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + ProjectName: v.ProjectName, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sSubProject) GetById(ctx context.Context, id uint) (res *model.SubProjectInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.SubProject.Ctx(ctx).WithAll().Where(dao.SubProject.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sSubProject) Add(ctx context.Context, req *system.SubProjectAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SubProject.Ctx(ctx).Insert(do.SubProject{ + ProjectId: req.ProjectId, + ProjectName: req.ProjectName, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sSubProject) Edit(ctx context.Context, req *system.SubProjectEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SubProject.Ctx(ctx).WherePri(req.Id).Update(do.SubProject{ + ProjectId: req.ProjectId, + ProjectName: req.ProjectName, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sSubProject) Delete(ctx context.Context, ids []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SubProject.Ctx(ctx).Delete(dao.SubProject.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/sysAuthRule/sys_auth_rule.go b/internal/app/system/logic/sysAuthRule/sys_auth_rule.go new file mode 100644 index 0000000..89045ac --- /dev/null +++ b/internal/app/system/logic/sysAuthRule/sys_auth_rule.go @@ -0,0 +1,319 @@ +/* +* @desc:菜单处理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/9/23 16:14 + */ + +package sysAuthRule + +import ( + "context" + "fmt" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + commonService "github.com/tiger1103/gfast/v3/internal/app/common/service" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterSysAuthRule(New()) +} + +func New() *sSysAuthRule { + return &sSysAuthRule{} +} + +type sSysAuthRule struct { +} + +func (s *sSysAuthRule) GetMenuListSearch(ctx context.Context, req *system.RuleSearchReq) (res []*model.SysAuthRuleInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SysAuthRule.Ctx(ctx) + if req.Hide >= 0 && req.Hide < 2 { + m = m.Where("is_hide", req.Hide) + } + if req.Title != "" { + m = m.Where("title like ?", "%"+req.Title+"%") + } + if req.Component != "" { + m = m.Where("component like ?", "%"+req.Component+"%") + } + err = m.Fields(model.SysAuthRuleInfoRes{}).Order("weigh desc,id asc").Scan(&res) + liberr.ErrIsNil(ctx, err, "获取菜单失败") + }) + return +} + +// GetIsMenuList 获取isMenu=0|1 +func (s *sSysAuthRule) GetIsMenuList(ctx context.Context) ([]*model.SysAuthRuleInfoRes, error) { + list, err := s.GetMenuList(ctx) + if err != nil { + return nil, err + } + var gList = make([]*model.SysAuthRuleInfoRes, 0, len(list)) + for _, v := range list { + if v.MenuType == 0 || v.MenuType == 1 { + gList = append(gList, v) + } + } + return gList, nil +} + +// GetMenuList 获取所有菜单 +func (s *sSysAuthRule) GetMenuList(ctx context.Context) (list []*model.SysAuthRuleInfoRes, err error) { + cache := commonService.Cache() + //从缓存获取 + iList := cache.GetOrSetFuncLock(ctx, consts.CacheSysAuthMenu, s.getMenuListFromDb, 0, consts.CacheSysAuthTag) + if iList != nil { + err = gconv.Struct(iList, &list) + liberr.ErrIsNil(ctx, err) + } + return +} + +// 从数据库获取所有菜单 +func (s *sSysAuthRule) getMenuListFromDb(ctx context.Context) (value interface{}, err error) { + err = g.Try(ctx, func(ctx context.Context) { + var v []*model.SysAuthRuleInfoRes + //从数据库获取 + err = dao.SysAuthRule.Ctx(ctx).Where("is_hide", 0). + Fields(model.SysAuthRuleInfoRes{}).Order("weigh desc,id asc").Scan(&v) + liberr.ErrIsNil(ctx, err, "获取菜单数据失败") + value = v + }) + return +} + +// GetIsButtonList 获取所有按钮isMenu=2 菜单列表 +func (s *sSysAuthRule) GetIsButtonList(ctx context.Context) ([]*model.SysAuthRuleInfoRes, error) { + list, err := s.GetMenuList(ctx) + if err != nil { + return nil, err + } + var gList = make([]*model.SysAuthRuleInfoRes, 0, len(list)) + for _, v := range list { + if v.MenuType == 2 { + gList = append(gList, v) + } + } + return gList, nil +} + +// Add 添加菜单 +func (s *sSysAuthRule) Add(ctx context.Context, req *system.RuleAddReq) (err error) { + if s.menuNameExists(ctx, req.Name, 0) { + err = gerror.New("接口规则已经存在") + return + } + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //菜单数据 + data := do.SysAuthRule{ + Pid: req.Pid, + Name: req.Name, + Title: req.Title, + Icon: req.Icon, + Condition: req.Condition, + Remark: req.Remark, + MenuType: req.MenuType, + Weigh: req.Weigh, + IsHide: req.IsHide, + Path: req.Path, + Component: req.Component, + IsLink: req.IsLink, + IsIframe: req.IsIframe, + IsCached: req.IsCached, + Redirect: req.Redirect, + IsAffix: req.IsAffix, + LinkUrl: req.LinkUrl, + } + ruleId, e := dao.SysAuthRule.Ctx(ctx).TX(tx).InsertAndGetId(data) + liberr.ErrIsNil(ctx, e, "添加菜单失败") + e = s.BindRoleRule(ctx, ruleId, req.Roles) + liberr.ErrIsNil(ctx, e, "添加菜单失败") + }) + return err + }) + if err == nil { + // 删除相关缓存 + commonService.Cache().Remove(ctx, consts.CacheSysAuthMenu) + } + return +} + +// 检查菜单规则是否存在 +func (s *sSysAuthRule) menuNameExists(ctx context.Context, name string, id uint) bool { + m := dao.SysAuthRule.Ctx(ctx).Where("name=?", name) + if id != 0 { + m = m.Where("id!=?", id) + } + c, err := m.Fields(dao.SysAuthRule.Columns().Id).Limit(1).One() + if err != nil { + g.Log().Error(ctx, err) + return false + } + return !c.IsEmpty() +} + +// BindRoleRule 绑定角色权限 +func (s *sSysAuthRule) BindRoleRule(ctx context.Context, ruleId interface{}, roleIds []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + enforcer, e := commonService.CasbinEnforcer(ctx) + liberr.ErrIsNil(ctx, e) + for _, roleId := range roleIds { + _, err = enforcer.AddPolicy(fmt.Sprintf("%d", roleId), fmt.Sprintf("%d", ruleId), "All") + liberr.ErrIsNil(ctx, err) + } + }) + return +} + +func (s *sSysAuthRule) Get(ctx context.Context, id uint) (rule *entity.SysAuthRule, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.SysAuthRule.Ctx(ctx).WherePri(id).Scan(&rule) + liberr.ErrIsNil(ctx, err, "获取菜单失败") + }) + return +} + +func (s *sSysAuthRule) GetMenuRoles(ctx context.Context, id uint) (roleIds []uint, err error) { + err = g.Try(ctx, func(ctx context.Context) { + enforcer, e := commonService.CasbinEnforcer(ctx) + liberr.ErrIsNil(ctx, e) + policies := enforcer.GetFilteredNamedPolicy("p", 1, gconv.String(id)) + for _, policy := range policies { + roleIds = append(roleIds, gconv.Uint(policy[0])) + } + }) + return +} + +func (s *sSysAuthRule) Update(ctx context.Context, req *system.RuleUpdateReq) (err error) { + if s.menuNameExists(ctx, req.Name, req.Id) { + err = gerror.New("接口规则已经存在") + return + } + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //菜单数据 + data := do.SysAuthRule{ + Pid: req.Pid, + Name: req.Name, + Title: req.Title, + Icon: req.Icon, + Condition: req.Condition, + Remark: req.Remark, + MenuType: req.MenuType, + Weigh: req.Weigh, + IsHide: req.IsHide, + Path: req.Path, + Component: req.Component, + IsLink: req.IsLink, + IsIframe: req.IsIframe, + IsCached: req.IsCached, + Redirect: req.Redirect, + IsAffix: req.IsAffix, + LinkUrl: req.LinkUrl, + } + _, e := dao.SysAuthRule.Ctx(ctx).TX(tx).WherePri(req.Id).Update(data) + liberr.ErrIsNil(ctx, e, "添加菜单失败") + e = s.UpdateRoleRule(ctx, req.Id, req.Roles) + liberr.ErrIsNil(ctx, e, "添加菜单失败") + }) + return err + }) + if err == nil { + // 删除相关缓存 + commonService.Cache().Remove(ctx, consts.CacheSysAuthMenu) + } + return +} + +func (s *sSysAuthRule) UpdateRoleRule(ctx context.Context, ruleId uint, roleIds []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + enforcer, e := commonService.CasbinEnforcer(ctx) + liberr.ErrIsNil(ctx, e) + //删除旧权限 + _, e = enforcer.RemoveFilteredPolicy(1, gconv.String(ruleId)) + liberr.ErrIsNil(ctx, e) + // 添加新权限 + roleIdsStrArr := gconv.Strings(roleIds) + for _, v := range roleIdsStrArr { + _, e = enforcer.AddPolicy(v, gconv.String(ruleId), "All") + liberr.ErrIsNil(ctx, e) + } + }) + return +} + +func (s *sSysAuthRule) GetMenuListTree(pid uint, list []*model.SysAuthRuleInfoRes) []*model.SysAuthRuleTreeRes { + tree := make([]*model.SysAuthRuleTreeRes, 0, len(list)) + for _, menu := range list { + if menu.Pid == pid { + t := &model.SysAuthRuleTreeRes{ + SysAuthRuleInfoRes: menu, + } + child := s.GetMenuListTree(menu.Id, list) + if child != nil { + t.Children = child + } + tree = append(tree, t) + } + } + return tree +} + +// DeleteMenuByIds 删除菜单 +func (s *sSysAuthRule) DeleteMenuByIds(ctx context.Context, ids []int) (err error) { + var list []*model.SysAuthRuleInfoRes + list, err = s.GetMenuList(ctx) + if err != nil { + return + } + childrenIds := make([]int, 0, len(list)) + for _, id := range ids { + rules := s.FindSonByParentId(list, gconv.Uint(id)) + for _, child := range rules { + childrenIds = append(childrenIds, gconv.Int(child.Id)) + } + } + ids = append(ids, childrenIds...) + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + return g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysAuthRule.Ctx(ctx).Where("id in (?)", ids).Delete() + liberr.ErrIsNil(ctx, err, "删除失败") + //删除权限 + enforcer, err := commonService.CasbinEnforcer(ctx) + liberr.ErrIsNil(ctx, err) + for _, v := range ids { + _, err = enforcer.RemoveFilteredPolicy(1, gconv.String(v)) + liberr.ErrIsNil(ctx, err) + } + // 删除相关缓存 + commonService.Cache().Remove(ctx, consts.CacheSysAuthMenu) + }) + }) + return +} + +func (s *sSysAuthRule) FindSonByParentId(list []*model.SysAuthRuleInfoRes, pid uint) []*model.SysAuthRuleInfoRes { + children := make([]*model.SysAuthRuleInfoRes, 0, len(list)) + for _, v := range list { + if v.Pid == pid { + children = append(children, v) + fChildren := s.FindSonByParentId(list, v.Id) + children = append(children, fChildren...) + } + } + return children +} diff --git a/internal/app/system/logic/sysDept/sys_dept.go b/internal/app/system/logic/sysDept/sys_dept.go new file mode 100644 index 0000000..eef60ca --- /dev/null +++ b/internal/app/system/logic/sysDept/sys_dept.go @@ -0,0 +1,179 @@ +/* +* @desc:部门管理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/9/26 15:14 + */ + +package sysDept + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/text/gstr" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + commonService "github.com/tiger1103/gfast/v3/internal/app/common/service" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterSysDept(New()) +} + +func New() *sSysDept { + return &sSysDept{} +} + +type sSysDept struct { +} + +func (s *sSysDept) GetList(ctx context.Context, req *system.DeptSearchReq) (list []*entity.SysDept, err error) { + list, err = s.GetFromCache(ctx) + if err != nil { + return + } + rList := make([]*entity.SysDept, 0, len(list)) + if req.DeptName != "" || req.Status != "" { + for _, v := range list { + if req.DeptName != "" && !gstr.ContainsI(v.DeptName, req.DeptName) { + continue + } + if req.Status != "" && v.Status != gconv.Uint(req.Status) { + continue + } + rList = append(rList, v) + } + list = rList + } + return +} + +func (s *sSysDept) GetFromCache(ctx context.Context) (list []*entity.SysDept, err error) { + err = g.Try(ctx, func(ctx context.Context) { + cache := commonService.Cache() + //从缓存获取 + iList := cache.GetOrSetFuncLock(ctx, consts.CacheSysDept, func(ctx context.Context) (value interface{}, err error) { + err = dao.SysDept.Ctx(ctx).Scan(&list) + liberr.ErrIsNil(ctx, err, "获取部门列表失败") + value = list + return + }, 0, consts.CacheSysAuthTag) + if iList != nil { + err = gconv.Struct(iList, &list) + liberr.ErrIsNil(ctx, err) + } + }) + return +} + +// Add 添加部门 +func (s *sSysDept) Add(ctx context.Context, req *system.DeptAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysDept.Ctx(ctx).Insert(do.SysDept{ + ParentId: req.ParentID, + DeptName: req.DeptName, + OrderNum: req.OrderNum, + Leader: req.Leader, + Phone: req.Phone, + Email: req.Email, + Status: req.Status, + CreatedBy: service.Context().GetUserId(ctx), + }) + liberr.ErrIsNil(ctx, err, "添加部门失败") + // 删除缓存 + commonService.Cache().Remove(ctx, consts.CacheSysDept) + }) + return +} + +// Edit 部门修改 +func (s *sSysDept) Edit(ctx context.Context, req *system.DeptEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysDept.Ctx(ctx).WherePri(req.DeptId).Update(do.SysDept{ + ParentId: req.ParentID, + DeptName: req.DeptName, + OrderNum: req.OrderNum, + Leader: req.Leader, + Phone: req.Phone, + Email: req.Email, + Status: req.Status, + UpdatedBy: service.Context().GetUserId(ctx), + }) + liberr.ErrIsNil(ctx, err, "修改部门失败") + // 删除缓存 + commonService.Cache().Remove(ctx, consts.CacheSysDept) + }) + return +} + +func (s *sSysDept) Delete(ctx context.Context, id uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + var list []*entity.SysDept + err = dao.SysDept.Ctx(ctx).Scan(&list) + liberr.ErrIsNil(ctx, err, "不存在部门信息") + children := s.FindSonByParentId(list, id) + ids := make([]uint64, 0, len(list)) + for _, v := range children { + ids = append(ids, v.DeptId) + } + ids = append(ids, id) + _, err = dao.SysDept.Ctx(ctx).Where(dao.SysDept.Columns().DeptId+" in (?)", ids).Delete() + liberr.ErrIsNil(ctx, err, "删除部门失败") + // 删除缓存 + commonService.Cache().Remove(ctx, consts.CacheSysDept) + }) + return +} + +func (s *sSysDept) FindSonByParentId(deptList []*entity.SysDept, deptId uint64) []*entity.SysDept { + children := make([]*entity.SysDept, 0, len(deptList)) + for _, v := range deptList { + if v.ParentId == deptId { + children = append(children, v) + fChildren := s.FindSonByParentId(deptList, v.DeptId) + children = append(children, fChildren...) + } + } + return children +} + +// GetListTree 部门树形菜单 +func (s *sSysDept) GetListTree(pid uint64, list []*entity.SysDept) (deptTree []*model.SysDeptTreeRes) { + deptTree = make([]*model.SysDeptTreeRes, 0, len(list)) + for _, v := range list { + if v.ParentId == pid { + t := &model.SysDeptTreeRes{ + SysDept: v, + } + child := s.GetListTree(v.DeptId, list) + if len(child) > 0 { + t.Children = child + } + deptTree = append(deptTree, t) + } + } + return +} + +// GetByDeptId 通过部门id获取部门信息 +func (s *sSysDept) GetByDeptId(ctx context.Context, deptId uint64) (dept *entity.SysDept, err error) { + var depts []*entity.SysDept + depts, err = s.GetFromCache(ctx) + if err != nil { + return + } + for _, v := range depts { + if v.DeptId == deptId { + dept = v + break + } + } + return +} diff --git a/internal/app/system/logic/sysFile/sys_file.go b/internal/app/system/logic/sysFile/sys_file.go new file mode 100644 index 0000000..a7326b8 --- /dev/null +++ b/internal/app/system/logic/sysFile/sys_file.go @@ -0,0 +1,139 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-07-29 15:32:09 +// 生成路径: internal/app/system/logic/sys_file.go +// 生成人:gfast +// desc:文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterSysFile(New()) +} + +func New() *sSysFile { + return &sSysFile{} +} + +type sSysFile struct{} + +func (s *sSysFile) List(ctx context.Context, req *system.SysFileSearchReq) (listRes *system.SysFileSearchRes, err error) { + listRes = new(system.SysFileSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SysFile.Ctx(ctx).WithAll() + if req.FileName != "" { + m = m.Where(dao.SysFile.Columns().FileName+" like ?", "%"+req.FileName+"%") + } + if req.Status != "" { + m = m.Where(dao.SysFile.Columns().Status+" = ?", req.Status) + } + //创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.SysFile.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.SysFile.Columns().CreatedAt+" >=? AND "+dao.SysFile.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "file_id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.SysFileInfoRes + err = m.Fields(system.SysFileSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.SysFileListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.SysFileListRes{ + FileId: v.FileId, + ParentId: v.ParentId, + Ancestors: v.Ancestors, + FileName: v.FileName, + OrderNum: v.OrderNum, + ProjectId: v.ProjectId, + FileTypeId: v.FileTypeId, + Leader: v.Leader, + Status: v.Status, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sSysFile) GetByFileId(ctx context.Context, fileId int) (res *model.SysFileInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.SysFile.Ctx(ctx).WithAll().Where(dao.SysFile.Columns().FileId, fileId).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.SysFileInfoRes) + res = &infoRes + }) + return +} + +func (s *sSysFile) Add(ctx context.Context, req *system.SysFileAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + name := ct.New().GetLoginUser(ctx).Id + _, err = dao.SysFile.Ctx(ctx).Insert(do.SysFile{ + ParentId: req.ParentId, + FileName: req.FileName, + ProjectId: req.ProjectId, + FileTypeId: req.FileTypeId, + CreateBy: name, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sSysFile) Edit(ctx context.Context, req *system.SysFileEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + name := ct.New().GetLoginUser(ctx).Id + _, err = dao.SysFile.Ctx(ctx).WherePri(req.FileId).Update(do.SysFile{ + ParentId: req.ParentId, + FileName: req.FileName, + ProjectId: req.ProjectId, + FileTypeId: req.FileTypeId, + UpdateBy: name, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sSysFile) Delete(ctx context.Context, fileIds []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysFile.Ctx(ctx).Delete(dao.SysFile.Columns().FileId+" in (?)", fileIds) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/sysFileType/sys_file_type.go b/internal/app/system/logic/sysFileType/sys_file_type.go new file mode 100644 index 0000000..05168d3 --- /dev/null +++ b/internal/app/system/logic/sysFileType/sys_file_type.go @@ -0,0 +1,131 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-07-29 15:27:54 +// 生成路径: internal/app/system/logic/sys_file_type.go +// 生成人:gfast +// desc:文件类型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterSysFileType(New()) +} + +func New() *sSysFileType { + return &sSysFileType{} +} + +type sSysFileType struct{} + +func (s *sSysFileType) List(ctx context.Context, req *system.SysFileTypeSearchReq) (listRes *system.SysFileTypeSearchRes, err error) { + listRes = new(system.SysFileTypeSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SysFileType.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.SysFileType.Columns().Id+" = ?", req.Id) + } + if req.FileTypeName != "" { + m = m.Where(dao.SysFileType.Columns().FileTypeName+" like ?", "%"+req.FileTypeName+"%") + } + if req.Status != "" { + m = m.Where(dao.SysFileType.Columns().Status+" = ?", req.Status) + } + //创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.SysFileType.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.SysFileType.Columns().CreatedAt+" >=? AND "+dao.SysFileType.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.SysFileTypeInfoRes + err = m.Fields(system.SysFileTypeSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.SysFileTypeListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.SysFileTypeListRes{ + Id: v.Id, + FileTypeName: v.FileTypeName, + Status: v.Status, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sSysFileType) GetById(ctx context.Context, id int) (res *model.SysFileTypeInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.SysFileType.Ctx(ctx).WithAll().Where(dao.SysFileType.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.SysFileTypeInfoRes) + res = &infoRes + }) + return +} + +func (s *sSysFileType) Add(ctx context.Context, req *system.SysFileTypeAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + name := ct.New().GetLoginUser(ctx).Id + _, err = dao.SysFileType.Ctx(ctx).Insert(do.SysFileType{ + FileTypeName: req.FileTypeName, + CreateBy: name, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sSysFileType) Edit(ctx context.Context, req *system.SysFileTypeEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + name := ct.New().GetLoginUser(ctx).Id + _, err = dao.SysFileType.Ctx(ctx).WherePri(req.Id).Update(do.SysFileType{ + FileTypeName: req.FileTypeName, + Status: req.Status, + UpdateBy: name, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sSysFileType) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysFileType.Ctx(ctx).Delete(dao.SysFileType.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/sysJob/sys_job.go b/internal/app/system/logic/sysJob/sys_job.go new file mode 100644 index 0000000..a6e27c2 --- /dev/null +++ b/internal/app/system/logic/sysJob/sys_job.go @@ -0,0 +1,252 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-01-12 17:43:50 +// 生成路径: internal/app/system/logic/sys_job.go +// 生成人:gfast +// desc:定时任务 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gcron" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + systemService "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "strings" +) + +func init() { + service.RegisterSysJob(New()) +} + +func New() *sSysJob { + return &sSysJob{} +} + +type sSysJob struct{} + +func (s *sSysJob) List(ctx context.Context, req *system.SysJobSearchReq) (listRes *system.SysJobSearchRes, err error) { + listRes = new(system.SysJobSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SysJob.Ctx(ctx).WithAll() + if req.JobName != "" { + m = m.Where(dao.SysJob.Columns().JobName+" like ?", "%"+req.JobName+"%") + } + if req.JobGroup != "" { + m = m.Where(dao.SysJob.Columns().JobGroup+" = ?", req.JobGroup) + } + if req.Status != "" { + m = m.Where(dao.SysJob.Columns().Status+" = ?", gconv.Int(req.Status)) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "job_id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.SysJobInfoRes + err = m.Fields(system.SysJobSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.SysJobListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.SysJobListRes{ + JobId: v.JobId, + JobName: v.JobName, + JobGroup: v.JobGroup, + InvokeTarget: v.InvokeTarget, + CronExpression: v.CronExpression, + MisfirePolicy: v.MisfirePolicy, + Status: v.Status, + } + } + }) + return +} + +func (s *sSysJob) GetByJobId(ctx context.Context, jobId uint64) (res *model.SysJobInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.SysJob.Ctx(ctx).WithAll().Where(dao.SysJob.Columns().JobId, jobId).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sSysJob) Add(ctx context.Context, req *system.SysJobAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysJob.Ctx(ctx).Insert(do.SysJob{ + JobName: req.JobName, + JobParams: req.JobParams, + JobGroup: req.JobGroup, + InvokeTarget: req.InvokeTarget, + CronExpression: req.CronExpression, + MisfirePolicy: req.MisfirePolicy, + Status: req.Status, + Remark: req.Remark, + CreatedBy: systemService.Context().GetUserId(ctx), + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sSysJob) Edit(ctx context.Context, req *system.SysJobEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysJob.Ctx(ctx).WherePri(req.JobId).Update(do.SysJob{ + JobName: req.JobName, + JobParams: req.JobParams, + JobGroup: req.JobGroup, + InvokeTarget: req.InvokeTarget, + CronExpression: req.CronExpression, + MisfirePolicy: req.MisfirePolicy, + Status: req.Status, + Remark: req.Remark, + UpdatedBy: systemService.Context().GetUserId(ctx), + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sSysJob) Delete(ctx context.Context, jobIds []uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysJob.Ctx(ctx).Delete(dao.SysJob.Columns().JobId+" in (?)", jobIds) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +func (s *sSysJob) Start(ctx context.Context, jobId uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + var job *model.SysJobInfoRes + job, err = s.GetByJobId(ctx, jobId) + liberr.ErrIsNil(ctx, err) + if job != nil { + s.JobStart(ctx, job) + } + }) + return +} + +func (s *sSysJob) Stop(ctx context.Context, jobId uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + var job *model.SysJobInfoRes + job, err = s.GetByJobId(ctx, jobId) + liberr.ErrIsNil(ctx, err) + if job != nil { + s.jobStop(ctx, job) + } + }) + return +} + +func (s *sSysJob) Run(ctx context.Context, jobId uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + var job *model.SysJobInfoRes + job, err = s.GetByJobId(ctx, jobId) + liberr.ErrIsNil(ctx, err) + if job != nil { + s.jobRun(ctx, job) + } + }) + return +} + +// JobRun 执行任务 +func (s *sSysJob) jobRun(ctx context.Context, job *model.SysJobInfoRes) error { + //可以task目录下是否绑定对应的方法 + f := service.TaskList().GetByName(job.InvokeTarget) + if f == nil { + return gerror.New("当前task目录下没有绑定这个方法") + } + //传参 + paramArr := strings.Split(job.JobParams, "|") + service.TaskList().EditParams(f.FuncName, paramArr) + task, err := gcron.AddOnce(ctx, "@every 1s", f.Run) + if err != nil || task == nil { + return gerror.New("启动执行失败") + } + return nil +} + +// GetJobs 获取已开启执行的任务 +func (s *sSysJob) GetJobs(ctx context.Context) (jobs []*model.SysJobInfoRes, err error) { + err = dao.SysJob.Ctx(ctx).Where(dao.SysJob.Columns().Status, 0).Scan(&jobs) + return +} + +// JobStart 启动任务 +func (s *sSysJob) JobStart(ctx context.Context, job *model.SysJobInfoRes) error { + //获取task目录下是否绑定对应的方法 + f := service.TaskList().GetByName(job.InvokeTarget) + if f == nil { + return gerror.New("没有绑定对应的方法") + } + //传参 + paramArr := strings.Split(job.JobParams, "|") + service.TaskList().EditParams(f.FuncName, paramArr) + rs := gcron.Search(job.InvokeTarget) + if rs == nil { + if job.MisfirePolicy == 1 { + t, err := gcron.AddSingleton(ctx, job.CronExpression, f.Run, job.InvokeTarget) + if err != nil { + return err + } + if t == nil { + return gerror.New("启动任务失败") + } + } else { + t, err := gcron.AddOnce(ctx, job.CronExpression, f.Run, job.InvokeTarget) + if err != nil { + return err + } + if t == nil { + return gerror.New("启动任务失败") + } + } + } + gcron.Start(job.InvokeTarget) + if job.MisfirePolicy == 1 { + job.Status = 0 + _, err := dao.SysJob.Ctx(ctx).Where(dao.SysJob.Columns().JobId, job.JobId).Unscoped().Update(g.Map{ + dao.SysJob.Columns().Status: job.Status, + }) + return err + } + return nil +} + +// JobStop 停止任务 +func (s *sSysJob) jobStop(ctx context.Context, job *model.SysJobInfoRes) error { + //获取task目录下是否绑定对应的方法 + f := service.TaskList().GetByName(job.InvokeTarget) + if f == nil { + return gerror.New("没有绑定对应的方法") + } + rs := gcron.Search(job.InvokeTarget) + if rs != nil { + gcron.Remove(job.InvokeTarget) + } + job.Status = 1 + _, err := dao.SysJob.Ctx(ctx).Where(dao.SysJob.Columns().JobId, job.JobId).Unscoped().Update(g.Map{ + dao.SysJob.Columns().Status: job.Status, + }) + return err +} diff --git a/internal/app/system/logic/sysJobLog/sys_job_log.go b/internal/app/system/logic/sysJobLog/sys_job_log.go new file mode 100644 index 0000000..8b6faea --- /dev/null +++ b/internal/app/system/logic/sysJobLog/sys_job_log.go @@ -0,0 +1,62 @@ +/* +* @desc:任务日志 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2023/1/13 21:42 + */ + +package sysJobLog + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterSysJobLog(New()) +} + +func New() *sSysJobLog { + return new(sSysJobLog) +} + +type sSysJobLog struct { +} + +func (s *sSysJobLog) Add(ctx context.Context, data *do.SysJobLog) (err error) { + _, err = dao.SysJobLog.Ctx(ctx).Insert(data) + return +} + +func (s *sSysJobLog) List(ctx context.Context, req *system.SysJobLogListReq) (listRes *system.SysJobLogListRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + listRes = new(system.SysJobLogListRes) + m := dao.SysJobLog.Ctx(ctx).Where(dao.SysJobLog.Columns().TargetName, req.TargetName) + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + err = m.Fields(system.SysJobLogListRes{}).Page(req.PageNum, req.PageSize).Order("id desc").Scan(&listRes.List) + liberr.ErrIsNil(ctx, err, "获取数据失败") + }) + return +} + +func (s *sSysJobLog) Delete(ctx context.Context, logIds []uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysJobLog.Ctx(ctx).Delete(dao.SysJobLog.Columns().Id+" in (?)", logIds) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/sysLoginLog/sys_login_log.go b/internal/app/system/logic/sysLoginLog/sys_login_log.go new file mode 100644 index 0000000..620ad52 --- /dev/null +++ b/internal/app/system/logic/sysLoginLog/sys_login_log.go @@ -0,0 +1,103 @@ +/* +* @desc:登录日志 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/9/26 15:20 + */ + +package sysLoginLog + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/grpool" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterSysLoginLog(New()) +} + +func New() *sSysLoginLog { + return &sSysLoginLog{ + Pool: grpool.New(100), + } +} + +type sSysLoginLog struct { + Pool *grpool.Pool +} + +func (s *sSysLoginLog) Invoke(ctx context.Context, data *model.LoginLogParams) { + s.Pool.Add( + ctx, + func(ctx context.Context) { + //写入日志数据 + service.SysUser().LoginLog(ctx, data) + }, + ) +} + +func (s *sSysLoginLog) List(ctx context.Context, req *system.LoginLogSearchReq) (res *system.LoginLogSearchRes, err error) { + res = new(system.LoginLogSearchRes) + if req.PageNum == 0 { + req.PageNum = 1 + } + res.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + m := dao.SysLoginLog.Ctx(ctx) + order := "info_id DESC" + if req.LoginName != "" { + m = m.Where("login_name like ?", "%"+req.LoginName+"%") + } + if req.Status != "" { + m = m.Where("status", gconv.Int(req.Status)) + } + if req.Ipaddr != "" { + m = m.Where("ipaddr like ?", "%"+req.Ipaddr+"%") + } + if req.LoginLocation != "" { + m = m.Where("login_location like ?", "%"+req.LoginLocation+"%") + } + if len(req.DateRange) != 0 { + m = m.Where("login_time >=? AND login_time <=?", req.DateRange[0], req.DateRange[1]) + } + if req.SortName != "" { + if req.SortOrder != "" { + order = req.SortName + " " + req.SortOrder + } else { + order = req.SortName + " DESC" + } + } + err = g.Try(ctx, func(ctx context.Context) { + res.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取日志失败") + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res.List) + liberr.ErrIsNil(ctx, err, "获取日志数据失败") + }) + return +} + +func (s *sSysLoginLog) DeleteLoginLogByIds(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysLoginLog.Ctx(ctx).Delete("info_id in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +func (s *sSysLoginLog) ClearLoginLog(ctx context.Context) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = g.DB().Ctx(ctx).Exec(ctx, "truncate "+dao.SysLoginLog.Table()) + liberr.ErrIsNil(ctx, err, "清除失败") + }) + return +} diff --git a/internal/app/system/logic/sysOperLog/sys_oper_log.go b/internal/app/system/logic/sysOperLog/sys_oper_log.go new file mode 100644 index 0000000..d223e08 --- /dev/null +++ b/internal/app/system/logic/sysOperLog/sys_oper_log.go @@ -0,0 +1,195 @@ +/* +* @desc:后台操作日志业务处理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/9/21 16:14 + */ + +package sysOperLog + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/os/grpool" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/text/gstr" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/libUtils" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +type sOperateLog struct { + Pool *grpool.Pool +} + +func init() { + service.RegisterOperateLog(New()) +} + +func New() *sOperateLog { + return &sOperateLog{ + Pool: grpool.New(100), + } +} + +// OperationLog 操作日志写入 +func (s *sOperateLog) OperationLog(r *ghttp.Request) { + + userInfo := service.Context().GetLoginUser(r.GetCtx()) + if userInfo == nil { + return + } + url := r.Request.URL //请求地址 + //获取菜单 + //获取地址对应的菜单id + menuList, err := service.SysAuthRule().GetMenuList(r.GetCtx()) + if err != nil { + g.Log().Error(r.GetCtx(), err) + return + } + var menu *model.SysAuthRuleInfoRes + path := gstr.TrimLeft(url.Path, "/") + for _, m := range menuList { + if gstr.Equal(m.Name, path) || gstr.Equal("/zm/"+m.Name, path) || gstr.Equal("zm/"+m.Name, path) || gstr.Equal("/"+m.Name, path) { + menu = m + break + } + } + data := &model.SysOperLogAdd{ + User: userInfo, + Menu: menu, + Url: url, + Params: r.GetMap(), + Method: r.Method, + ClientIp: libUtils.GetClientIp(r.GetCtx()), + OperatorType: 1, + } + s.Invoke(r.GetCtx(), data) +} + +func (s *sOperateLog) Invoke(ctx context.Context, data *model.SysOperLogAdd) { + s.Pool.Add(ctx, func(ctx context.Context) { + //写入日志数据 + s.operationLogAdd(ctx, data) + }) +} + +// OperationLogAdd 添加操作日志 +func (s *sOperateLog) operationLogAdd(ctx context.Context, data *model.SysOperLogAdd) { + menuTitle := "" + if data.Menu != nil { + menuTitle = data.Menu.Title + } + dept, err := service.SysDept().GetByDeptId(ctx, data.User.DeptId) + if err != nil { + g.Log().Error(ctx, err) + return + } + if dept == nil { + dept = &entity.SysDept{} + } + insertData := &do.SysOperLog{ + Title: menuTitle, + Method: data.Url.Path, + RequestMethod: data.Method, + OperatorType: data.OperatorType, + OperName: data.User.UserName, + DeptName: dept.DeptName, + OperIp: data.ClientIp, + OperLocation: libUtils.GetCityByIp(data.ClientIp), + OperTime: gtime.Now(), + OperParam: data.Params, + } + rawQuery := data.Url.RawQuery + if rawQuery != "" { + rawQuery = "?" + rawQuery + } + insertData.OperUrl = data.Url.Path + rawQuery + _, err = dao.SysOperLog.Ctx(ctx).Insert(insertData) + if err != nil { + g.Log().Error(ctx, err) + } +} + +func (s *sOperateLog) List(ctx context.Context, req *system.SysOperLogSearchReq) (listRes *system.SysOperLogSearchRes, err error) { + listRes = new(system.SysOperLogSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SysOperLog.Ctx(ctx) + if req.Title != "" { + m = m.Where(dao.SysOperLog.Columns().Title+" = ?", req.Title) + } + if req.RequestMethod != "" { + m = m.Where(dao.SysOperLog.Columns().RequestMethod+" = ?", req.RequestMethod) + } + if req.OperName != "" { + m = m.Where(dao.SysOperLog.Columns().OperName+" like ?", "%"+req.OperName+"%") + } + if len(req.DateRange) != 0 { + m = m.Where("oper_time >=? AND oper_time <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "oper_id DESC" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.SysOperLogInfoRes + err = m.Fields(system.SysOperLogSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.SysOperLogListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.SysOperLogListRes{ + OperId: v.OperId, + Title: v.Title, + RequestMethod: v.RequestMethod, + OperName: v.OperName, + DeptName: v.DeptName, + LinkedDeptName: v.LinkedDeptName, + OperUrl: v.OperUrl, + OperIp: v.OperIp, + OperLocation: v.OperLocation, + OperParam: v.OperParam, + OperTime: v.OperTime, + } + } + }) + return +} + +func (s *sOperateLog) GetByOperId(ctx context.Context, operId uint64) (res *model.SysOperLogInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.SysOperLog.Ctx(ctx).WithAll().Where(dao.SysOperLog.Columns().OperId, operId).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sOperateLog) DeleteByIds(ctx context.Context, ids []uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysOperLog.Ctx(ctx).Delete("oper_id in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +func (s *sOperateLog) ClearLog(ctx context.Context) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = g.DB().Ctx(ctx).Exec(ctx, "truncate "+dao.SysOperLog.Table()) + liberr.ErrIsNil(ctx, err, "清除失败") + }) + return +} diff --git a/internal/app/system/logic/sysPost/sys_post.go b/internal/app/system/logic/sysPost/sys_post.go new file mode 100644 index 0000000..4dc9985 --- /dev/null +++ b/internal/app/system/logic/sysPost/sys_post.go @@ -0,0 +1,125 @@ +/* +* @desc:岗位管理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/9/26 15:28 + */ + +package sysPost + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterSysPost(New()) +} + +func New() *sSysPost { + return &sSysPost{} +} + +type sSysPost struct { +} + +// List 岗位列表 +func (s *sSysPost) List(ctx context.Context, req *system.PostSearchReq) (res *system.PostSearchRes, err error) { + res = new(system.PostSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SysPost.Ctx(ctx) + if req != nil { + if req.PostCode != "" { + m = m.Where("post_code like ?", "%"+req.PostCode+"%") + } + if req.PostName != "" { + m = m.Where("post_name like ?", "%"+req.PostName+"%") + } + if req.Status != "" { + m = m.Where("status", gconv.Uint(req.Status)) + } + } + res.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取岗位失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + res.CurrentPage = req.PageNum + err = m.Page(req.PageNum, req.PageSize).Order("post_sort asc,post_id asc").Scan(&res.PostList) + liberr.ErrIsNil(ctx, err, "获取岗位失败") + }) + return +} + +func (s *sSysPost) Add(ctx context.Context, req *system.PostAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysPost.Ctx(ctx).Insert(do.SysPost{ + PostCode: req.PostCode, + PostName: req.PostName, + PostSort: req.PostSort, + Status: req.Status, + Remark: req.Remark, + CreatedBy: service.Context().GetUserId(ctx), + }) + liberr.ErrIsNil(ctx, err, "添加岗位失败") + }) + return +} + +func (s *sSysPost) Edit(ctx context.Context, req *system.PostEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysPost.Ctx(ctx).WherePri(req.PostId).Update(do.SysPost{ + PostCode: req.PostCode, + PostName: req.PostName, + PostSort: req.PostSort, + Status: req.Status, + Remark: req.Remark, + UpdatedBy: service.Context().GetUserId(ctx), + }) + liberr.ErrIsNil(ctx, err, "修改岗位失败") + }) + return +} + +func (s *sSysPost) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //删除前,先查看当前岗位是否有sys_user_post、bus_violation_level_post使用 + count, err := dao.SysUserPost.Ctx(ctx).Where("post_id in (?)", ids).Count() + if count > 0 { + err = errors.New("系统用户正在使用该岗位") + liberr.ErrIsNil(ctx, err) + return + } + count, err = g.DB().Model("bus_violation_level_post").Ctx(ctx).Where("post in (?)", ids).Count() + if count > 0 { + err = errors.New("安全等级正在使用该岗位") + liberr.ErrIsNil(ctx, err) + return + } + _, err = dao.SysPost.Ctx(ctx).Where(dao.SysPost.Columns().PostId+" in(?)", ids).Delete() + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +// GetUsedPost 获取正常状态的岗位 +func (s *sSysPost) GetUsedPost(ctx context.Context) (list []*entity.SysPost, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.SysPost.Ctx(ctx).Where(dao.SysPost.Columns().Status, 1). + Order(dao.SysPost.Columns().PostSort + " ASC, " + dao.SysPost.Columns().PostId + " ASC ").Scan(&list) + liberr.ErrIsNil(ctx, err, "获取岗位数据失败") + }) + return +} diff --git a/internal/app/system/logic/sysProject/sys_project.go b/internal/app/system/logic/sysProject/sys_project.go new file mode 100644 index 0000000..95f64b1 --- /dev/null +++ b/internal/app/system/logic/sysProject/sys_project.go @@ -0,0 +1,621 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-07-27 15:20:49 +// 生成路径: internal/app/system/logic/sys_project.go +// 生成人:gfast +// desc:项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "fmt" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + sysUserLogic "github.com/tiger1103/gfast/v3/internal/app/system/logic/sysUser" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + wxDao "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" + "regexp" + "strconv" + "strings" +) + +func init() { + service.RegisterSysProject(New()) +} + +func New() *sSysProject { + return &sSysProject{} +} + +type sSysProject struct{} + +func (s *sSysProject) SecurityAgreementFunc(ctx context.Context, req *system.SecurityAgreementReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、先获取原本的安全协议书 + sql := dao.SysProject.Ctx(ctx).Safe() + value, err := sql.WherePri(req.Id).Fields("security_agreement").Value() + liberr.ErrIsNil(ctx, err, "上传失败") + //2、删除 + split := strings.Split(value.String(), ",") + coryCommon.BatchFile(split) + //3、新增安全协议书(又且之只能一个) + _, err = sql.WherePri(req.Id).Update(g.Map{"security_agreement": req.File}) + liberr.ErrIsNil(ctx, err, "上传失败") + }) + return +} + +func (s *sSysProject) AllList(ctx context.Context, req *system.SysProjectSearchAllReq) (listRes *system.SysProjectSearchAllRes, err error) { + listRes = new(system.SysProjectSearchAllRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SysProject.Ctx(ctx).WithAll() + if req.Project > 0 { + m = m.Where("id", req.Project) + } + if req.Name != "" { + m = m.Where("(project_name like ?", "%"+req.Name+"%").WhereOr("short_name like ?) ", "%"+req.Name+"%") + } + order := "sort asc,id desc" + var res []*model.SysProjectInfoRes + err = m.Fields("id,project_name,short_name,status").Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.SysProjectListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.SysProjectListRes{ + Id: v.Id, + ProjectName: v.ProjectName, + ShortName: v.ShortName, + Status: v.Status, + } + } + }) + return +} + +func (s *sSysProject) SafetyReqFunc(ctx context.Context, req *system.SafetyReq) (res *system.SafetyRes, err error) { + res = new(system.SafetyRes) + var spir model.SysProjectInfoRes + err = dao.SysProject.Ctx(ctx).Where("id", req.ProjectId).Scan(&spir) + time := spir.OnStreamTime + res.Day = tool.GetDaysDifference(time) + return +} + +func (s *sSysProject) OneProjectFunc(ctx context.Context, req *system.OneProjectReq) (res *system.OneProjectRes, err error) { + res = new(system.OneProjectRes) + var spir model.SysProjectInfoRes + err = dao.SysProject.Ctx(ctx).Where("id", req.ProjectId).Scan(&spir) + if err != nil { + return + } + pn, _ := strconv.ParseFloat(spir.Plan, 64) + al, _ := strconv.ParseFloat(spir.Actual, 64) + bai := 100.00 / pn * al + res.PlanPercentage = "100" + res.ActualPercentage = strconv.FormatFloat(bai, 'f', 2, 64) + return +} + +func (s *sSysProject) ProjectCapacityFunc(ctx context.Context, req *system.ProjectCapacityReq) (res *system.ProjectCapacityRes, err error) { + res = new(system.ProjectCapacityRes) + //1、获取当前用户的项目信息 + ids := sysUserLogic.ProjectAll(ctx) + type DateEntity struct { + Plan string `orm:"plan,primary" json:"plan"` + Actual string `orm:"actual,primary" json:"actual"` + } + var de *DateEntity + err = dao.SysProject.Ctx(ctx).Where("id in (" + ids + ")").Fields("FORMAT(sum(plan), 2) as plan,FORMAT(sum(actual), 2) as actual").Scan(&de) + if err != nil { + return + } + res.SumPlan = de.Plan + res.SumActual = de.Actual + return +} + +func (s *sSysProject) ProjectCapacityTwoFunc(ctx context.Context, req *system.ProjectCapacityTwoReq) (res *system.ProjectCapacityTwoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + res = new(system.ProjectCapacityTwoRes) + //1、获取当前用户的项目信息 + ids := sysUserLogic.ProjectAll(ctx) + type DateEntity struct { + Plan string `orm:"plan,primary" json:"plan"` + Actual string `orm:"actual,primary" json:"actual"` + } + var de *DateEntity + err = dao.SysProject.Ctx(ctx).Where("id in (" + ids + ")").Fields("FORMAT(sum(plan), 2) as plan,FORMAT(sum(actual), 2) as actual").Scan(&de) + liberr.ErrIsNil(ctx, err) + res.SumPlan = de.Plan + res.SumActual = de.Actual + //3、获取各个项目的实际和预计容量 + var entity []*system.ProjectCapacityTwoTwoRes + err = dao.SysProject.Ctx(ctx).Where("id in (" + ids + ")").Fields("plan,actual,project_name,short_name").Scan(&entity) + liberr.ErrIsNil(ctx, err, "获取数据失败") + res.List = entity + }) + return +} + +func (s *sSysProject) ProgressOfWorksFunc(ctx context.Context, req *system.ProgressOfWorksReq) (res *system.ProgressOfWorksRes, err error) { + res = new(system.ProgressOfWorksRes) + err = g.Try(ctx, func(ctx context.Context) { + var pneOne []*system.ProgressOfWorksNumberEntity + //1、获取当前用户的项目信息 (需要判断是否分页) + ids := sysUserLogic.ProjectAll(ctx) + var projectListEntity []*model.SysProjectListRes + sql := dao.SysProject.Ctx(ctx).Where("id in (" + ids + ")") + if req.IsPaging == "YES" || req.IsPaging == "yes" { + arr, err := sql.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + res.Total = len(arr) + if req.PageNum == 0 { + req.PageNum = 1 + } + res.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + sql = sql.Fields(system.SysProjectSearchRes{}).Page(req.PageNum, req.PageSize).Order(order) + } + err = sql.Scan(&projectListEntity) + + //2、获取当前项目下工程进度的数量的统计 + for _, dataTwo := range projectListEntity { + + var pneTwo = new(system.ProgressOfWorksNumberEntity) + pneTwo.ProjectId = dataTwo.Id + if dataTwo.ShortName != "" { + pneTwo.ProjectName = dataTwo.ShortName + } else { + pneTwo.ProjectName = dataTwo.ProjectName + } + pneTwo.Plan = dataTwo.Plan + pneTwo.Actual = dataTwo.Actual + pneOne = append(pneOne, pneTwo) + } + res.List = pneOne + liberr.ErrIsNil(ctx, err, "代码错误,请联系管理员!") + }) + return +} + +func (s *sSysProject) CountProjectFunc(ctx context.Context, req *system.ParticipantNumberReq) (res *system.ParticipantNumberRes, err error) { + res = new(system.ParticipantNumberRes) + err = g.Try(ctx, func(ctx context.Context) { + var twoEntity []*system.ParticipantNumberTwoEntity + //1、获取当前用户的项目信息 (需要判断是否分页) + ids := sysUserLogic.ProjectAll(ctx) + sql := dao.SysProject.Ctx(ctx).As("a"). + Fields(` + a.id as projectId, + a.project_name as projectName, + a.short_name as shortName, + c.dict_label as workName, + COUNT(b.type_of_work) as workNumber`). + LeftJoin("bus_construction_user", "b", "b.project_id = a.id and b.status = 0 and b.type_of_work is not null"). + LeftJoin("sys_dict_data", "c", "c.dict_type = 'type_of_work' and c.dict_value = b.type_of_work "). + Where("a.id in ("+ids+")").Where("a.show_hidden", "1"). + Group(` + a.id, + a.project_name, + a.short_name, + c.dict_label + `) + if req.IsPaging == "YES" || req.IsPaging == "yes" { + arr, err := sql.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + res.Total = len(arr) + if req.PageNum == 0 { + req.PageNum = 1 + } + res.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + + sql = sql.Order("a.sort asc,a.id desc").Page(req.PageNum, req.PageSize) + } + order := "a.sort asc,a.id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + err = sql.Order(order).Scan(&twoEntity) + + var pneOne []*system.ParticipantNumberEntity + if twoEntity != nil { + m := make(map[int64][]*system.ParticipantNumberTwoEntity) + for _, data := range twoEntity { + if _, ok := m[data.ProjectId]; ok { + m[data.ProjectId] = append(m[data.ProjectId], data) + } else { + var entities []*system.ParticipantNumberTwoEntity + entities = append(entities, data) + m[data.ProjectId] = entities + } + } + for _, v := range m { + one := new(system.ParticipantNumberEntity) + for i, data := range v { + if i == 0 { + one.ProjectId = data.ProjectId + one.ProjectName = data.ProjectName + one.ShortName = data.ShortName + } + work := system.TypeOfWork{ + WorkName: data.WorkName, + WorkNumber: data.WorkNumber, + } + one.WorkList = append(one.WorkList, &work) + one.Number = one.Number + data.WorkNumber + } + pneOne = append(pneOne, one) + } + } + res.List = pneOne + liberr.ErrIsNil(ctx, err, "代码错误,请联系管理员!") + }) + return +} + +func (s *sSysProject) GetByProjectId(ctx context.Context, project_id string) (res *model.SysProjectInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + atoi, _ := strconv.Atoi(project_id) + err = dao.SysProject.Ctx(ctx).WithAll().Where(dao.SysProject.Columns().Id, atoi).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + //获取创建人 更新人 + if res != nil { + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.SysProjectInfoRes) + res = &infoRes + } + }) + //err = g.Try(ctx, func(ctx context.Context) { + // err = dao.SysProject.Ctx(ctx).WithAll().Where(dao.SysProject.Columns().ProjectId, project_id).Scan(&res) + // liberr.ErrIsNil(ctx, err, "获取信息失败") + // //获取创建人 更新人 + // if res != nil { + // by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + // infoRes := by.(model.SysProjectInfoRes) + // res = &infoRes + // } + //}) + return +} + +func (s *sSysProject) List(ctx context.Context, req *system.SysProjectSearchReq) (listRes *system.SysProjectSearchRes, err error) { + listRes = new(system.SysProjectSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SysProject.Ctx(ctx).WithAll().As("a"). + LeftJoin("bus_construction_user as b on a.principal_xz = b.openid and b.deleted_at IS NULL"). + Fields("a.*,IFNULL(b.user_name,b.nick_name) as bzzName") + if req.PId != "" { + m = m.Where("a."+dao.SysProject.Columns().PId+" = ?", gconv.Int64(req.PId)) + } + if req.Status != "" { + m = m.Where("a."+dao.SysProject.Columns().Status+" = ?", req.Status) + } + if req.ProjectName != "" { + m = m.Where("a."+dao.SysProject.Columns().ProjectName+" like ?", "%"+req.ProjectName+"%") + } + if req.CreateTime != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreateTime)) + m = m.Where("a."+dao.SysProject.Columns().CreateTime+" like ?", "%"+date+"%") + } + if req.Type != "3" && req.Type != "" { + m = m.Where("a."+dao.SysProject.Columns().Type+" = ?", req.Type) + } + if req.IsType != "3" && req.IsType != "" { + m = m.Where("a."+dao.SysProject.Columns().IsType+" = ?", req.IsType) + } + if req.IsShow != 2 { + m = m.Where("a."+dao.SysProject.Columns().ShowHidden, req.IsShow+1) + } + + if req.PagingType == 0 { + arr, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + listRes.Total = len(arr) + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + m = m.Page(req.PageNum, req.PageSize) + } + order := "a.sort asc,a.id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.SysProjectInfoRes + err = m.Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.SysProjectListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.SysProjectListRes{ + Id: v.Id, + ProjectName: v.ProjectName, + ShortName: v.ShortName, + ProjectSite: v.ProjectSite, + PrincipalXz: v.PrincipalXz, + PrincipalXzName: v.BzzName, + Principal: v.Principal, + PrincipalPhone: v.PrincipalPhone, + PId: v.PId, + Status: v.Status, + PicUrl: v.PicUrl, + CreateBy: v.CreateBy, + CreateTime: v.CreateTime, + UpdateBy: v.UpdateBy, + UpdateTime: v.UpdateTime, + Lng: v.Lng, + Lat: v.Lat, + Remark: v.Remark, + Type: v.Type, + ColourRgb: v.ColourRgb, + DeletedAt: v.DeletedAt, + Plan: v.Plan, + Actual: v.Actual, + OnStreamTime: v.OnStreamTime, + PunchRange: v.PunchRange, + SecurityAgreement: v.SecurityAgreement, + IsType: v.IsType, + Sort: v.Sort, + ShowHidden: v.ShowHidden, + } + } + }) + return +} + +func (s *sSysProject) GetById(ctx context.Context, id int64) (res *model.SysProjectInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.SysProject.Ctx(ctx).WithAll().Where(dao.SysProject.Columns().Id, id).Scan(&res) + //获取富文本信息 + data, err := g.DB().Model("sys_project_introduce").Where("project_id", res.Id).Fields("rich_text").Value() + res.RichText = data.String() + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.SysProjectInfoRes) + res = &infoRes + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +// rangeFunc打卡范围 时间 +func rangeFunc(str string) (sjStr string, err error) { + pattern := `^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9],(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$` + regex := regexp.MustCompile(pattern) + if !regex.MatchString(str) { + err = errors.New("打卡范围格式不符合要求,格式:(09:00,18:00)") + return + } + times := strings.Split(str, ",") + // 解析时间并比较 + firstTime, _ := parseTime(times[0]) + secondTime, _ := parseTime(times[1]) + if firstTime > secondTime { + err = errors.New("打卡范围时间顺序不符合要求,格式:前小后大") + return + } + sjStr = str + return +} + +func parseTime(timeStr string) (int, error) { + parts := strings.Split(timeStr, ":") + if len(parts) != 2 { + return 0, fmt.Errorf("无效的时间格式") + } + hours, err := strconv.Atoi(parts[0]) + if err != nil { + return 0, err + } + minutes, err := strconv.Atoi(parts[1]) + if err != nil { + return 0, err + } + return hours*60 + minutes, nil +} + +func (s *sSysProject) Add(ctx context.Context, req *system.SysProjectAddReq) (err error) { + g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + ////1、新增项目 + //count, err := dao.SysProject.Ctx(ctx).Where("principal_xz", req.PrincipalXz).Count() + //if count > 0 { + // err = errors.New("当前人员已负责了一项项目!") + // liberr.ErrIsNil(ctx, err) + // return + //} + + count, err := dao.SysProject.Ctx(ctx). + Where(dao.SysProject.Columns().ProjectName, req.ProjectName). + WhereOr(dao.SysProject.Columns().ShortName, req.ShortName).Count() + if count > 0 { + liberr.ErrIsNil(ctx, errors.New("当前项目已存在!")) + return + } + // 校验打卡范围 + req.PunchRange, err = rangeFunc(req.PunchRange) + if err != nil { + return + } + datasj := do.SysProject{ + PunchRange: req.PunchRange, + ProjectName: req.ProjectName, + ProjectSite: req.ProjectSite, + Principal: req.Principal, + PrincipalPhone: req.PrincipalPhone, + PId: req.PId, + //Status: req.Status, + PicUrl: req.PicUrl, + CreateBy: ct.New().GetLoginUser(ctx).Id, + CreateTime: req.CreateTime, + //UpdateBy: req.UpdateBy, + UpdateTime: req.UpdateTime, + Lng: req.Lng, + Lat: req.Lat, + Remark: req.Remark, + Type: req.Type, + ColourRgb: req.ColourRgb, + Actual: req.Actual, + Plan: req.Plan, + OnStreamTime: req.OnStreamTime, + DesignTotal: req.DesignTotal, + IsType: req.IsType, + Sort: req.Sort, + } + if req.ShortName != "" { + datasj.ShortName = req.ShortName + } + if req.PrincipalXz != "" { + datasj.PrincipalXz = req.PrincipalXz + } + _, err = dao.SysProject.Ctx(ctx).Insert(datasj) + liberr.ErrIsNil(ctx, err, "添加失败") + ////2、初始化项目模板 + //id, err := datainfo.LastInsertId() + //var entityList []*model.DocumentListRes + //var projectList []*model.DocumentProjectListRes + //err = dao.Document.Ctx(ctx).WithAll().Scan(&entityList) + //if len(entityList) > 0 { + // for _, data := range entityList { + // var projectTwo = new(model.DocumentProjectListRes) + // projectTwo.IdStr = data.IdStr + // projectTwo.Pid = data.Pid + // projectTwo.Name = data.Name + // projectTwo.FilePath = data.FilenPath + // projectTwo.Type = data.Type + // projectTwo.ProjectId = id + // projectList = append(projectList, projectTwo) + // } + // _, err = dao.DocumentProject.Ctx(ctx).Insert(projectList) + //} + ////项目简介 + //id, _ := addResult.LastInsertId() + //_, err = g.DB().Model("sys_project_introduce").Ctx(ctx).Insert(g.Map{"project_id": id, "rich_text": req.RichText}) + //设置人工打卡范围 + if len(req.ProjectPunchRangeList) > 0 { + _, err = g.DB().Model("sys_project_punch_range").Ctx(ctx).OmitEmpty().Insert(req.ProjectPunchRangeList) + } + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return err + }) + return +} + +func (s *sSysProject) Edit(ctx context.Context, req *system.SysProjectEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 负责人是否重复 + count, err := dao.SysProject.Ctx(ctx).Where("principal_xz", req.PrincipalXz).Count() + if count > 1 { + err = errors.New("当前人员已负责了一项项目!") + liberr.ErrIsNil(ctx, err) + return + } + // 校验打卡范围 + req.PunchRange, err = rangeFunc(req.PunchRange) + if err != nil { + return + } + datasj := do.SysProject{ + PunchRange: req.PunchRange, + ProjectName: req.ProjectName, + ProjectSite: req.ProjectSite, + PrincipalXz: req.PrincipalXz, + Principal: req.Principal, + PrincipalPhone: req.PrincipalPhone, + PId: req.PId, + Status: req.Status, + PicUrl: req.PicUrl, + Lng: req.Lng, + Lat: req.Lat, + Remark: req.Remark, + Type: req.Type, + ColourRgb: req.ColourRgb, + Actual: req.Actual, + Plan: req.Plan, + OnStreamTime: req.OnStreamTime, + DesignTotal: req.DesignTotal, + IsType: req.IsType, + Sort: req.Sort, + UpdateBy: ct.New().GetLoginUser(ctx).UserName, + } + if req.ShowHidden != "" { + datasj.ShowHidden = req.ShowHidden + } + if req.ShortName != "" { + datasj.ShortName = req.ShortName + } + if req.PrincipalXz != "" { + datasj.PrincipalXz = req.PrincipalXz + } + _, err = dao.SysProject.Ctx(ctx).WherePri(req.Id).Update(datasj) + ////项目简介 + //_, err = g.DB().Model("sys_project_introduce").Ctx(ctx).Where("project_id", req.Id).Update(g.Map{"rich_text": req.RichText}) + //设置人工打卡范围 + _, err = g.DB().Model("sys_project_punch_range").Ctx(ctx).Where("project_id", req.Id).Delete() + if len(req.PunchRangeList) > 0 { + _, err = g.DB().Model("sys_project_punch_range").Ctx(ctx).OmitEmpty().Insert(req.PunchRangeList) + } + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return err + }) + return +} + +func (s *sSysProject) Delete(ctx context.Context, ids []int64) (err error) { + g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //0、删除组成员 + _, err = wxDao.SysProjectTeamMember.Ctx(ctx).Delete(wxDao.SysProjectTeam.Columns().ProjectId+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + //1、删除组 + _, err = wxDao.SysProjectTeam.Ctx(ctx).Delete(wxDao.SysProjectTeam.Columns().ProjectId+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + //2、查询项目、删除静态资源、删除项目 + array, err := dao.SysProject.Ctx(ctx).Fields("security_agreement").WhereIn("id", ids).Array() + liberr.ErrIsNil(ctx, err, "删除失败") + //3.查询项目产值下的产值记录 (物理删除) + _, err = dao.SysProjectValue.Ctx(ctx).Delete(dao.SysProjectValue.Columns().ProId+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + var arrs []string + for i := range array { + arrs = append(arrs, array[i].String()) + } + coryCommon.BatchFile(arrs) + _, err = dao.SysProject.Ctx(ctx).Delete(dao.SysProject.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + //3、删除用户与项目的关联 + wxDao.SysUserProjectRelevancy.Ctx(ctx).Unscoped().Delete(wxDao.SysUserProjectRelevancy.Columns().ProjectId+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return err + }) + return +} diff --git a/internal/app/system/logic/sysProjectIntroduce/sys_project_introduce.go b/internal/app/system/logic/sysProjectIntroduce/sys_project_introduce.go new file mode 100644 index 0000000..d7a07e9 --- /dev/null +++ b/internal/app/system/logic/sysProjectIntroduce/sys_project_introduce.go @@ -0,0 +1,175 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-03-29 10:05:03 +// 生成路径: internal/app/system/logic/sys_project_introduce.go +// 生成人:gfast +// desc:项目新闻 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "path" + + "github.com/gogf/gf/v2/frame/g" + "github.com/samber/lo" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + systemService "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + richtext "github.com/tiger1103/gfast/v3/third/richText" +) + +func init() { + service.RegisterSysProjectIntroduce(New()) +} + +func New() *sSysProjectIntroduce { + return &sSysProjectIntroduce{} +} + +type sSysProjectIntroduce struct{} + +func (s *sSysProjectIntroduce) List(ctx context.Context, req *system.SysProjectIntroduceSearchReq) (listRes *system.SysProjectIntroduceSearchRes, err error) { + listRes = new(system.SysProjectIntroduceSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SysProjectIntroduce.Ctx(ctx).WithAll() + if req.ProjectId != "" { + m = m.Where(dao.SysProjectIntroduce.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.Headline != "" { + m = m.Where(dao.SysProjectIntroduce.Columns().Headline+" like ?", "%"+req.Headline+"%") + } + if req.RichText != "" { + m = m.Where(dao.SysProjectIntroduce.Columns().RichText+" = ?", req.RichText) + } + if req.CreatedBy != "" { + m = m.Where(dao.SysProjectIntroduce.Columns().CreatedBy+" = ?", req.CreatedBy) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.SysProjectIntroduce.Columns().CreatedAt+" >=? AND "+dao.SysProjectIntroduce.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc,project_id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.SysProjectIntroduceInfoRes + err = m.Fields(system.SysProjectIntroduceSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.SysProjectIntroduceListRes, len(res)) + for k, v := range res { + ve := coryCommon.SelectByString(ctx, coryCommon.IsNumeric(v.CreatedBy), v.CreatedBy) + listRes.List[k] = &model.SysProjectIntroduceListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + Headline: v.Headline, + CreatedBy: ve, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sSysProjectIntroduce) GetByProjectId(ctx context.Context, id int64) (res *model.SysProjectIntroduceInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.SysProjectIntroduce.Ctx(ctx).WithAll().Where("id", id).Scan(&res) + // 获取创建人 更新人名称 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.SysProjectIntroduceInfoRes) + res = &infoRes + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sSysProjectIntroduce) Add(ctx context.Context, req *system.SysProjectIntroduceAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + var newsID int64 + + // newsID, err = dao.SysProjectIntroduce.Ctx(ctx).InsertAndGetId(do.SysProjectIntroduce{ + // ProjectId: req.ProjectId, + // Headline: req.Headline, + // RichText: req.RichText, + // CreatedBy: systemService.Context().GetUserId(ctx), + // }) + // liberr.ErrIsNil(ctx, err, "添加失败") + + // 附件 + files := lo.FlatMap(richtext.ExtractImageURLs(req.RichText), func(imageURL string, _ int) []*comModel.UpFile { + return []*comModel.UpFile{ + { + Name: path.Base(imageURL), + Url: imageURL, + FileType: "png", + }, + } + }) + + err = controller.PublicPublish(ctx, &system.NotificationsPublishReq{ + NotificationTitle: req.Headline, // 通知标题 + NotificationText: req.RichText, // 消息正文 + Files: files, // 附件 + ProjectId: int(req.ProjectId), // 项目ID + IsApp: 2, // 公告新闻 + ProjectNewsId: newsID, // 关联的 PC 端项目新闻ID + }, systemService.Context().GetUserId(ctx)) + liberr.ErrIsNil(ctx, err, "将项目新闻同步到App失败") + }) + return +} + +func (s *sSysProjectIntroduce) Edit(ctx context.Context, req *system.SysProjectIntroduceEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysProjectIntroduce.Ctx(ctx).WherePri(req.Id).Update(do.SysProjectIntroduce{ + Headline: req.Headline, + RichText: req.RichText, + UpdatedBy: systemService.Context().GetUserId(ctx), + }) + liberr.ErrIsNil(ctx, err, "修改失败") + + // 同步修改App端 + _, err := dao.Notifications.Ctx(ctx).Where(dao.Notifications.Columns().IntroduceId+" = ?", req.Id). + Data(do.Notifications{ + Title: req.Headline, + NotificationText: richtext.RemoveRichText(req.RichText), + }).Update() + liberr.ErrIsNil(ctx, err, "修改App端失败") + }) + return +} + +// Delete 物理删除 +func (s *sSysProjectIntroduce) Delete(ctx context.Context, id []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysProjectIntroduce.Ctx(ctx).Unscoped().Delete(dao.SysProjectIntroduce.Columns().Id+" in (?)", id) + liberr.ErrIsNil(ctx, err, "删除失败") + + // 同步删除App端 + _, err := dao.Notifications.Ctx(ctx).Where(dao.Notifications.Columns().IntroduceId+" in (?)", id).Delete() + liberr.ErrIsNil(ctx, err, "删除App端失败") + + // 删除对应的接收者 + _, err = dao.NotificationRecipients.Ctx(ctx).Where(dao.NotificationRecipients.Columns().NotificationId+" in (?)", id).Delete() + liberr.ErrIsNil(ctx, err, "删除App端失败") + }) + return +} diff --git a/internal/app/system/logic/sysProjectValue/sys_project_value.go b/internal/app/system/logic/sysProjectValue/sys_project_value.go new file mode 100644 index 0000000..582c8ca --- /dev/null +++ b/internal/app/system/logic/sysProjectValue/sys_project_value.go @@ -0,0 +1,186 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-03-27 12:55:26 +// 生成路径: internal/app/system/logic/sys_project_value.go +// 生成人:xiaoyang +// desc:projectValue +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "strconv" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterSysProjectValue(New()) +} + +func New() *sSysProjectValue { + return &sSysProjectValue{} +} + +type sSysProjectValue struct{} + +func (s *sSysProjectValue) EveryList(ctx context.Context, req *system.EveryProjectValueSearchReq) (listRes *system.EveryProjectValueSearchRes, err error) { + listRes = new(system.EveryProjectValueSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + var list []model.EveryProjectValue + // 查询每一个项目的所有年产值/月产值 + m := dao.SysProjectValue.Ctx(ctx).As("spv") + if req.ProId != "" { + m = m.Where("spv.pro_id", req.ProId) + } + if req.Year != "" { + m = m.Where("spv.year", req.Year).Fields("spv.year") + } + if req.Month != "" { + m = m.Where("spv.month", req.Month).Fields("spv.month") + } + // 项目简称 short_name + if err := m.Fields("sp.short_name As projectName,spv.id,spv.pro_id As proId,SUM(spv.pro_value) AS proValue"). + InnerJoin("sys_project sp ON sp.id = spv.pro_id").Where("sp.show_hidden !=", 2). + Group("spv.pro_id"). + Order("sp.short_name asc").Scan(&list); err != nil { + return + } + // 总数 + total := dao.SysProjectValue.Ctx(ctx).As("spv") + if req.Year != "" { + total = total.Where("spv.year", req.Year) + } + if req.Month != "" { + total = total.Where("spv.month", req.Month) + } + totalvalue, err := total.Fields("SUM(spv.pro_value) AS totalValue"). + InnerJoin("sys_project sp ON sp.id = spv.pro_id"). + Value() + if err != nil { + return + } + totalvaluef := strconv.FormatFloat(gconv.Float64(totalvalue), 'f', 2, 64) + + listRes.List = &model.TotalProjectValue{ + EveryProjectValue: list, + TotalValue: gconv.String(totalvaluef), + } + + return + }) + return +} + +func (s *sSysProjectValue) List(ctx context.Context, req *system.SysProjectValueSearchReq) (listRes *system.SysProjectValueSearchRes, err error) { + listRes = new(system.SysProjectValueSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SysProjectValue.Ctx(ctx).As("spv") + if req.ProId != "" { + m = m.Where("spv.pro_id = ?", gconv.Int64(req.ProId)) + } + if req.Year != "" { + m = m.Where(" spv.year= ?", req.Year) + } + if req.Month != "" { + m = m.Where("spv.month = ?", req.Month) + } + if req.ProValue != "" { + m = m.Where("spv.pro_Value = ?", req.ProValue) + } + if len(req.DateRange) != 0 { + m = m.Where("spv.createdAt >=? AND "+" spv.createdAt <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + if req.IsShow == "2" { + m = m.Where("sp.show_hidden !=", req.IsShow) + } + // 连表删除 + var res []*model.SysProjectValueListRes + err = m.Fields("sp.short_name AS shortName,spv.id,spv.pro_id As proId,spv.pro_value As proValue,spv.year,spv.month,spv.created_at AS createdAt"). + InnerJoin("sys_project sp ON sp.id = spv.pro_id"). + Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.SysProjectValueListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.SysProjectValueListRes{ + Id: v.Id, + ProId: v.ProId, + ShortName: v.ShortName, + Year: v.Year, + Month: v.Month, + ProValue: v.ProValue, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sSysProjectValue) GetById(ctx context.Context, id int64) (res *model.SysProjectValueListRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + // err = dao.SysProjectValue.Ctx(ctx).WithAll().Where(dao.SysProjectValue.Columns().Id, id).Scan(&res) + err = dao.SysProjectValue.Ctx(ctx).As("spv"). + Fields("sp.short_name AS shortName,spv.id,spv.pro_id As proId,spv.pro_value As proValue,spv.year,spv.month,spv.created_at AS createdAt"). + InnerJoin("sys_project sp ON sp.id = spv.pro_id"). + Where("sp.show_hidden !=", 2).Where("spv.id = ?", id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sSysProjectValue) Add(ctx context.Context, req *system.SysProjectValueAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysProjectValue.Ctx(ctx).Insert(do.SysProjectValue{ + ProId: req.ProId, + Year: req.Year, + Month: req.Month, + ProValue: req.ProValue, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sSysProjectValue) Edit(ctx context.Context, req *system.SysProjectValueEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysProjectValue.Ctx(ctx).WherePri(req.Id).Update(do.SysProjectValue{ + ProId: req.ProId, + Year: req.Year, + Month: req.Month, + ProValue: req.ProValue, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sSysProjectValue) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysProjectValue.Ctx(ctx).Delete(dao.SysProjectValue.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/sysRole/sys_role.go b/internal/app/system/logic/sysRole/sys_role.go new file mode 100644 index 0000000..09e2112 --- /dev/null +++ b/internal/app/system/logic/sysRole/sys_role.go @@ -0,0 +1,250 @@ +/* +* @desc:角色管理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/9/26 15:54 + */ + +package sysRole + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + commonService "github.com/tiger1103/gfast/v3/internal/app/common/service" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterSysRole(New()) +} + +func New() *sSysRole { + return &sSysRole{} +} + +type sSysRole struct{} + +func (s *sSysRole) GetRoleListSearch(ctx context.Context, req *system.RoleListReq) (res *system.RoleListRes, err error) { + res = new(system.RoleListRes) + err = g.Try(ctx, func(ctx context.Context) { + model := dao.SysRole.Ctx(ctx) + if req.RoleName != "" { + model = model.Where("a.name like ?", "%"+req.RoleName+"%") + } + if req.Status != "" { + model = model.Where("a.status", gconv.Int(req.Status)) + } + model = model.As("a") + res.Total, err = model.Count() + liberr.ErrIsNil(ctx, err, "获取角色数据失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + res.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + model = model.LeftJoin("casbin_rule", "b", "b.v1 = a.id AND SUBSTR( b.v0, 1, 2 ) = 'u_' ") + model = model.Group("a.id") + err = model.Page(res.CurrentPage, req.PageSize).Order("id asc").Fields("a.*, count(b.v0) user_cnt").Scan(&res.List) + liberr.ErrIsNil(ctx, err, "获取数据失败") + }) + return +} + +// GetRoleList 获取角色列表 +func (s *sSysRole) GetRoleList(ctx context.Context) (list []*entity.SysRole, err error) { + cache := commonService.Cache() + // 从缓存获取 + iList := cache.GetOrSetFuncLock(ctx, consts.CacheSysRole, s.getRoleListFromDb, 0, consts.CacheSysAuthTag) + if iList != nil { + err = gconv.Struct(iList, &list) + } + return +} + +// 从数据库获取所有角色 +func (s *sSysRole) getRoleListFromDb(ctx context.Context) (value interface{}, err error) { + err = g.Try(ctx, func(ctx context.Context) { + var v []*entity.SysRole + //从数据库获取 + err = dao.SysRole.Ctx(ctx). + Order(dao.SysRole.Columns().ListOrder + " asc," + dao.SysRole.Columns().Id + " asc"). + Scan(&v) + liberr.ErrIsNil(ctx, err, "获取角色数据失败") + value = v + }) + return +} + +// AddRoleRule 添加角色权限 +func (s *sSysRole) AddRoleRule(ctx context.Context, ruleIds []uint, roleId int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + enforcer, e := commonService.CasbinEnforcer(ctx) + liberr.ErrIsNil(ctx, e) + ruleIdsStr := gconv.Strings(ruleIds) + for _, v := range ruleIdsStr { + _, err = enforcer.AddPolicy(gconv.String(roleId), v, "All") + liberr.ErrIsNil(ctx, err) + } + }) + return +} + +// DelRoleRule 删除角色权限 +func (s *sSysRole) DelRoleRule(ctx context.Context, roleId int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + enforcer, e := commonService.CasbinEnforcer(ctx) + liberr.ErrIsNil(ctx, e) + _, err = enforcer.RemoveFilteredPolicy(0, gconv.String(roleId)) + liberr.ErrIsNil(ctx, err) + }) + return +} + +func (s *sSysRole) AddRole(ctx context.Context, req *system.RoleAddReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + roleId, e := dao.SysRole.Ctx(ctx).TX(tx).InsertAndGetId(req) + liberr.ErrIsNil(ctx, e, "添加角色失败") + // 添加角色权限 + e = s.AddRoleRule(ctx, req.MenuIds, roleId) + liberr.ErrIsNil(ctx, e) + // 清除缓存 + commonService.Cache().Remove(ctx, consts.CacheSysRole) + }) + return err + }) + return +} + +func (s *sSysRole) Get(ctx context.Context, id uint) (res *entity.SysRole, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.SysRole.Ctx(ctx).WherePri(id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取角色信息失败") + }) + return +} + +// GetFilteredNamedPolicy 获取角色关联的菜单规则 +func (s *sSysRole) GetFilteredNamedPolicy(ctx context.Context, id uint) (gpSlice []int, err error) { + err = g.Try(ctx, func(ctx context.Context) { + enforcer, e := commonService.CasbinEnforcer(ctx) + liberr.ErrIsNil(ctx, e) + gp := enforcer.GetFilteredNamedPolicy("p", 0, gconv.String(id)) + gpSlice = make([]int, len(gp)) + for k, v := range gp { + gpSlice[k] = gconv.Int(v[1]) + } + }) + return +} + +// EditRole 修改角色 +func (s *sSysRole) EditRole(ctx context.Context, req *system.RoleEditReq) (err error) { + defer func() { + // 添加角色权限 + err = s.AddRoleRule(ctx, req.MenuIds, req.Id) + liberr.ErrIsNil(ctx, err) + // 清除缓存 + commonService.Cache().Remove(ctx, consts.CacheSysRole) + }() + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + _, e := dao.SysRole.Ctx(ctx).TX(tx).WherePri(req.Id).Data(&do.SysRole{ + Status: req.Status, + ListOrder: req.ListOrder, + Name: req.Name, + Remark: req.Remark, + }).Update() + liberr.ErrIsNil(ctx, e, "修改角色失败") + // 删除角色权限 + e = s.DelRoleRule(ctx, req.Id) + liberr.ErrIsNil(ctx, e) + }) + return err + }) + return +} + +// DeleteByIds 删除角色 +func (s *sSysRole) DeleteByIds(ctx context.Context, ids []int64) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysRole.Ctx(ctx).TX(tx).Where(dao.SysRole.Columns().Id+" in(?)", ids).Delete() + liberr.ErrIsNil(ctx, err, "删除角色失败") + // 删除角色权限 + for _, v := range ids { + err = s.DelRoleRule(ctx, v) + liberr.ErrIsNil(ctx, err) + } + // 清除缓存 + commonService.Cache().Remove(ctx, consts.CacheSysRole) + }) + return err + }) + return +} + +func (s *sSysRole) RoleDeptTreeSelect(ctx context.Context, roleId int64) (res *system.RoleDeptTreeSelectRes, err error) { + res = new(system.RoleDeptTreeSelectRes) + err = g.Try(ctx, func(ctx context.Context) { + list, err := service.SysDept().GetList(ctx, &system.DeptSearchReq{ + Status: "1", + }) + liberr.ErrIsNil(ctx, err) + // 获取关联的角色数据权限 + checkedKeys, err := s.GetRoleDepts(ctx, roleId) + liberr.ErrIsNil(ctx, err) + + dList := service.SysDept().GetListTree(0, list) + res.Depts = dList + res.CheckedKeys = checkedKeys + }) + return +} + +func (s *sSysRole) GetRoleDepts(ctx context.Context, roleId int64) ([]int64, error) { + var entities []*entity.SysRoleDept + err := dao.SysRoleDept.Ctx(ctx).Where("role_id", roleId).Scan(&entities) + if err != nil { + return nil, err + } + result := make([]int64, 0) + for _, v := range entities { + result = append(result, v.DeptId) + } + return result, nil +} + +// RoleDataScope 设置角色数据权限 +func (s *sSysRole) RoleDataScope(ctx context.Context, req *system.DataScopeReq) error { + err := g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err := g.Try(ctx, func(ctx context.Context) { + _, err := tx.Model(dao.SysRole.Table()).Where("id", req.RoleId).Data(g.Map{"data_scope": req.DataScope}).Update() + liberr.ErrIsNil(ctx, err, "设置失败") + if req.DataScope == 2 { + _, err = tx.Model(dao.SysRoleDept.Table()).Where("role_id", req.RoleId).Delete() + liberr.ErrIsNil(ctx, err, "设置失败") + data := g.List{} + for _, deptId := range req.DeptIds { + data = append(data, g.Map{"role_id": req.RoleId, "dept_id": deptId}) + } + _, err = tx.Model(dao.SysRoleDept.Table()).Data(data).Insert() + liberr.ErrIsNil(ctx, err, "设置失败") + } + // 清除缓存 + commonService.Cache().Remove(ctx, consts.CacheSysRole) + }) + return err + }) + return err +} diff --git a/internal/app/system/logic/sysUser/sys_user.go b/internal/app/system/logic/sysUser/sys_user.go new file mode 100644 index 0000000..a361487 --- /dev/null +++ b/internal/app/system/logic/sysUser/sys_user.go @@ -0,0 +1,996 @@ +/* +* @desc:用户处理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/9/23 15:08 + */ + +package sysUser + +import ( + "context" + "fmt" + "reflect" + + "github.com/gogf/gf/v2/container/gset" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/text/gstr" + "github.com/gogf/gf/v2/util/gconv" + "github.com/gogf/gf/v2/util/grand" + "github.com/mssola/user_agent" + "github.com/samber/lo" + "github.com/tiger1103/gfast/v3/api/v1/system" + commonService "github.com/tiger1103/gfast/v3/internal/app/common/service" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + wxDao "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + logic "github.com/tiger1103/gfast/v3/internal/app/wxApplet/logic/busConstructionUser" + wxModel "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model/do" + "github.com/tiger1103/gfast/v3/library/libUtils" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterSysUser(New()) +} + +type sSysUser struct { + casBinUserPrefix string // CasBin 用户id前缀 +} + +func New() *sSysUser { + return &sSysUser{ + casBinUserPrefix: "u_", + } +} + +func (s *sSysUser) GetCasBinUserPrefix() string { + return s.casBinUserPrefix +} + +func (s *sSysUser) NotCheckAuthAdminIds(ctx context.Context) *gset.Set { + ids := g.Cfg().MustGet(ctx, "system.notCheckAuthAdminIds") + if !g.IsNil(ids) { + return gset.NewFrom(ids) + } + return gset.New() +} + +func (s *sSysUser) GetAdminUserByUsernamePassword(ctx context.Context, req *system.UserLoginReq) (user *model.LoginUserRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + user, err = s.GetUserByUsername(ctx, req.Username) + liberr.ErrIsNil(ctx, err) + liberr.ValueIsNil(user, "账号密码错误") + // 验证密码 + if libUtils.EncryptPassword(req.Password, user.UserSalt) != user.UserPassword { + liberr.ErrIsNil(ctx, gerror.New("账号密码错误")) + } + // 账号状态 + if user.UserStatus == 0 { + liberr.ErrIsNil(ctx, gerror.New("账号已被冻结")) + } + }) + return +} + +// GetUserByUsername 通过用户名获取用户信息 +func (s *sSysUser) GetUserByUsername(ctx context.Context, userName string) (user *model.LoginUserRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + user = &model.LoginUserRes{} + + query := g.Map{dao.SysUser.Columns().UserName: userName} + + mobile, ok := ctx.Value("mobile").(string) + if ok { + query = g.Map{dao.SysUser.Columns().Mobile: mobile} + } + + exist, err := dao.SysUser.Ctx(ctx).Where(query).Count() + liberr.ErrIsNil(ctx, err) + if exist == 0 { + liberr.ErrIsNil(ctx, gerror.New("账号或手机号不存在")) + } + + err = dao.SysUser.Ctx(ctx).Fields(user).Where(query).Scan(user) + liberr.ErrIsNil(ctx, err, "账号密码错误") + }) + return +} + +// GetUserById 通过用户名获取用户信息 +func (s *sSysUser) GetUserById(ctx context.Context, id uint64) (user *model.LoginUserRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + user = &model.LoginUserRes{} + err = dao.SysUser.Ctx(ctx).Fields(user).WherePri(id).Scan(user) + liberr.ErrIsNil(ctx, err, "获取用户信息失败") + }) + return +} + +// LoginLog 记录登录日志 +func (s *sSysUser) LoginLog(ctx context.Context, params *model.LoginLogParams) { + ua := user_agent.New(params.UserAgent) + browser, _ := ua.Browser() + loginData := &do.SysLoginLog{ + LoginName: params.Username, + Ipaddr: params.Ip, + LoginLocation: libUtils.GetCityByIp(params.Ip), + Browser: browser, + Os: ua.OS(), + Status: params.Status, + Msg: params.Msg, + LoginTime: gtime.Now(), + Module: params.Module, + } + _, err := dao.SysLoginLog.Ctx(ctx).Insert(loginData) + if err != nil { + g.Log().Error(ctx, err) + } +} + +func (s *sSysUser) UpdateLoginInfo(ctx context.Context, id uint64, ip string) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysUser.Ctx(ctx).WherePri(id).Unscoped().Update(g.Map{ + dao.SysUser.Columns().LastLoginIp: ip, + dao.SysUser.Columns().LastLoginTime: gtime.Now(), + }) + liberr.ErrIsNil(ctx, err, "更新用户登录信息失败") + }) + return +} + +// GetAdminRules 获取用户菜单数据 +func (s *sSysUser) GetAdminRules(ctx context.Context, userId uint64) (menuList []*model.UserMenus, permissions []string, err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 是否超管 + isSuperAdmin := false + // 获取无需验证权限的用户id + s.NotCheckAuthAdminIds(ctx).Iterator(func(v interface{}) bool { + if gconv.Uint64(v) == userId { + isSuperAdmin = true + return false + } + return true + }) + // 获取用户菜单数据 + allRoles, err := service.SysRole().GetRoleList(ctx) + liberr.ErrIsNil(ctx, err) + + // 如果是来自 App 的登录请求 + if isApp := ctx.Value("is_app"); isApp != nil { + // 将 allRoles 中 is_App 不等于 1 的数据过滤掉 + allRoles = lo.Filter(allRoles, func(role *entity.SysRole, _ int) bool { + return role.IsApp == 1 + }) + } + + roles, err := s.GetAdminRole(ctx, userId, allRoles) + liberr.ErrIsNil(ctx, err) + name := make([]string, len(roles)) + roleIds := make([]uint, len(roles)) + for k, v := range roles { + name[k] = v.Name + roleIds[k] = v.Id + } + // 获取菜单信息 + if isSuperAdmin { + // 超管获取所有菜单 + permissions = []string{"*/*/*"} + menuList, err = s.GetAllMenus(ctx) + liberr.ErrIsNil(ctx, err) + } else { + menuList, err = s.GetAdminMenusByRoleIds(ctx, roleIds) + liberr.ErrIsNil(ctx, err) + permissions, err = s.GetPermissions(ctx, roleIds) + liberr.ErrIsNil(ctx, err) + } + }) + return +} + +// GetAdminRole 获取用户角色 +func (s *sSysUser) GetAdminRole(ctx context.Context, userId uint64, allRoleList []*entity.SysRole) (roles []*entity.SysRole, err error) { + var roleIds []uint + roleIds, err = s.GetAdminRoleIds(ctx, userId) + if err != nil { + return + } + roles = make([]*entity.SysRole, 0, len(allRoleList)) + for _, v := range allRoleList { + for _, id := range roleIds { + if id == v.Id { + roles = append(roles, v) + } + } + if len(roles) == len(roleIds) { + break + } + } + return +} + +// GetAdminRoleIds 获取用户角色ids +func (s *sSysUser) GetAdminRoleIds(ctx context.Context, userId uint64) (roleIds []uint, err error) { + enforcer, e := commonService.CasbinEnforcer(ctx) + if e != nil { + err = e + return + } + // 查询关联角色规则 + groupPolicy := enforcer.GetFilteredGroupingPolicy(0, fmt.Sprintf("%s%d", s.casBinUserPrefix, userId)) + if len(groupPolicy) > 0 { + roleIds = make([]uint, len(groupPolicy)) + // 得到角色id的切片 + for k, v := range groupPolicy { + roleIds[k] = gconv.Uint(v[1]) + } + } + return +} + +func (s *sSysUser) GetAllMenus(ctx context.Context) (menus []*model.UserMenus, err error) { + // 获取所有开启的菜单 + var allMenus []*model.SysAuthRuleInfoRes + allMenus, err = service.SysAuthRule().GetIsMenuList(ctx) + if err != nil { + return + } + menus = make([]*model.UserMenus, len(allMenus)) + for k, v := range allMenus { + var menu *model.UserMenu + menu = s.setMenuData(menu, v) + menus[k] = &model.UserMenus{UserMenu: menu} + } + menus = s.GetMenusTree(menus, 0) + return +} + +func (s *sSysUser) GetAdminMenusByRoleIds(ctx context.Context, roleIds []uint) (menus []*model.UserMenus, err error) { + // 获取角色对应的菜单id + err = g.Try(ctx, func(ctx context.Context) { + enforcer, e := commonService.CasbinEnforcer(ctx) + liberr.ErrIsNil(ctx, e) + menuIds := map[int64]int64{} + for _, roleId := range roleIds { + // 查询当前权限 + gp := enforcer.GetFilteredPolicy(0, gconv.String(roleId)) + for _, p := range gp { + mid := gconv.Int64(p[1]) + menuIds[mid] = mid + } + } + // 获取所有开启的菜单 + allMenus, err := service.SysAuthRule().GetIsMenuList(ctx) + liberr.ErrIsNil(ctx, err) + menus = make([]*model.UserMenus, 0, len(allMenus)) + for _, v := range allMenus { + if _, ok := menuIds[gconv.Int64(v.Id)]; gstr.Equal(v.Condition, "nocheck") || ok { + var roleMenu *model.UserMenu + roleMenu = s.setMenuData(roleMenu, v) + menus = append(menus, &model.UserMenus{UserMenu: roleMenu}) + } + } + menus = s.GetMenusTree(menus, 0) + }) + return +} + +func (s *sSysUser) GetMenusTree(menus []*model.UserMenus, pid uint) []*model.UserMenus { + returnList := make([]*model.UserMenus, 0, len(menus)) + for _, menu := range menus { + if menu.Pid == pid { + menu.Children = s.GetMenusTree(menus, menu.Id) + returnList = append(returnList, menu) + } + } + return returnList +} + +func (s *sSysUser) setMenuData(menu *model.UserMenu, entity *model.SysAuthRuleInfoRes) *model.UserMenu { + menu = &model.UserMenu{ + Id: entity.Id, + Pid: entity.Pid, + Name: gstr.CaseCamelLower(gstr.Replace(entity.Name, "/", "_")), + Component: entity.Component, + Path: entity.Path, + MenuMeta: &model.MenuMeta{ + Icon: entity.Icon, + Title: entity.Title, + IsLink: "", + IsHide: entity.IsHide == 1, + IsKeepAlive: entity.IsCached == 1, + IsAffix: entity.IsAffix == 1, + IsIframe: entity.IsIframe == 1, + }, + } + if menu.MenuMeta.IsIframe || entity.IsLink == 1 { + menu.MenuMeta.IsLink = entity.LinkUrl + } + return menu +} + +func (s *sSysUser) GetPermissions(ctx context.Context, roleIds []uint) (userButtons []string, err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 获取角色对应的菜单id + enforcer, err := commonService.CasbinEnforcer(ctx) + liberr.ErrIsNil(ctx, err) + menuIds := map[int64]int64{} + for _, roleId := range roleIds { + // 查询当前权限 + gp := enforcer.GetFilteredPolicy(0, gconv.String(roleId)) + for _, p := range gp { + mid := gconv.Int64(p[1]) + menuIds[mid] = mid + } + } + // 获取所有开启的按钮 + allButtons, err := service.SysAuthRule().GetIsButtonList(ctx) + liberr.ErrIsNil(ctx, err) + userButtons = make([]string, 0, len(allButtons)) + for _, button := range allButtons { + if _, ok := menuIds[gconv.Int64(button.Id)]; gstr.Equal(button.Condition, "nocheck") || ok { + userButtons = append(userButtons, button.Name) + } + } + }) + return +} + +func fieldsEx() []string { + s := dao.SysUser.Columns() + return []string{ + s.Id, + s.UserName, + s.Mobile, + s.UserNickname, + s.Birthday, + s.UserStatus, + s.UserEmail, + s.Sex, + s.Avatar, + s.DeptId, + s.Remark, + s.IsAdmin, + s.Address, + s.Describe, + s.LastLoginIp, + s.LastLoginTime, + s.CreatedAt, + s.UpdatedAt, + s.DeletedAt, + } +} + +func inSlice(field string, excludes []string) bool { + for _, exclude := range excludes { + if exclude == field { + return true + } + } + return false +} + +// List 用户列表 +func (s *sSysUser) List(ctx context.Context, req *system.UserSearchReq) (total interface{}, userList []*entity.SysUser, err error) { + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SysUser.Ctx(ctx) + if req.KeyWords != "" { + keyWords := "%" + req.KeyWords + "%" + m = m.Where("user_name like ? or user_nickname like ?", keyWords, keyWords) + } + if req.DeptId != "" { + deptIds, e := s.getSearchDeptIds(ctx, gconv.Uint64(req.DeptId)) + liberr.ErrIsNil(ctx, e) + m = m.Where("dept_id in (?)", deptIds) + } + if req.Status != "" { + m = m.Where("user_status", gconv.Int(req.Status)) + } + if req.Mobile != "" { + m = m.Where("mobile like ?", "%"+req.Mobile+"%") + } + if len(req.DateRange) > 0 { + m = m.Where("created_at >=? AND created_at <=?", req.DateRange[0], req.DateRange[1]) + } + + if req.RoleId > 0 { + m = m.As("a").LeftJoin("casbin_rule", "b", "b.v0 = CONCAT('u_',a.id )") + m = m.Where("v1 = ? and SUBSTR(v0,1,2) = 'u_'", req.RoleId) + } + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + if req.PageNum == 0 { + req.PageNum = 1 + } + total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取用户数据失败") + + // 排除password字段 + if req.RoleId > 0 { + m = m.Fields(fieldsEx()) + } else { + m = m.FieldsEx(dao.SysUser.Columns().UserPassword, dao.SysUser.Columns().UserSalt) + } + + err = m.Page(req.PageNum, req.PageSize).Order("id asc").Scan(&userList) + liberr.ErrIsNil(ctx, err, "获取用户列表失败") + }) + return +} + +// GetUsersRoleDept 获取多个用户角色 部门信息 +func (s *sSysUser) GetUsersRoleDept(ctx context.Context, userList []*entity.SysUser) (users []*model.SysUserRoleDeptRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + allRoles, e := service.SysRole().GetRoleList(ctx) + liberr.ErrIsNil(ctx, e) + depts, e := service.SysDept().GetFromCache(ctx) + liberr.ErrIsNil(ctx, e) + users = make([]*model.SysUserRoleDeptRes, len(userList)) + for k, u := range userList { + var dept *entity.SysDept + users[k] = &model.SysUserRoleDeptRes{ + SysUser: u, + } + for _, d := range depts { + if u.DeptId == uint64(d.DeptId) { + dept = d + } + } + users[k].Dept = dept + roles, e := s.GetAdminRole(ctx, u.Id, allRoles) + liberr.ErrIsNil(ctx, e) + for _, r := range roles { + users[k].RoleInfo = append(users[k].RoleInfo, &model.SysUserRoleInfoRes{RoleId: r.Id, Name: r.Name}) + } + } + }) + return +} + +func (s *sSysUser) getSearchDeptIds(ctx context.Context, deptId uint64) (deptIds []uint64, err error) { + err = g.Try(ctx, func(ctx context.Context) { + deptAll, e := service.SysDept().GetFromCache(ctx) + liberr.ErrIsNil(ctx, e) + deptWithChildren := service.SysDept().FindSonByParentId(deptAll, deptId) + deptIds = make([]uint64, len(deptWithChildren)) + for k, v := range deptWithChildren { + deptIds[k] = v.DeptId + } + deptIds = append(deptIds, deptId) + }) + return +} + +func (s *sSysUser) Add(ctx context.Context, req *system.UserAddReq) (err error) { + err = s.UserNameOrMobileExists(ctx, req.UserName, req.Mobile) + if err != nil { + return + } + req.UserSalt = grand.S(10) + req.Password = libUtils.EncryptPassword(req.Password, req.UserSalt) + + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 1、新增用户信息 + userId, e := dao.SysUser.Ctx(ctx).TX(tx).InsertAndGetId(do.SysUser{ + UserName: req.UserName, + Mobile: req.Mobile, + UserNickname: req.NickName, + UserPassword: req.Password, + UserSalt: req.UserSalt, + UserStatus: req.Status, + UserEmail: req.Email, + Sex: req.Sex, + DeptId: req.DeptId, + Remark: req.Remark, + IsAdmin: req.IsAdmin, + IsData: req.IsData, + }) + liberr.ErrIsNil(ctx, e, "添加用户失败") + e = s.addUserRole(ctx, req.RoleIds, userId) + liberr.ErrIsNil(ctx, e, "设置用户权限失败") + e = s.AddUserPost(ctx, tx, req.PostIds, userId) + liberr.ErrIsNil(ctx, e) + // 2、项目和用户进行关联 + projectList := req.Project + name := ct.New().GetLoginUser(ctx).Id + for _, data := range projectList { + relevancy := wxModel.SysUserProjectRelevancy{ + UserId: userId, + ProjectId: data, + CreateBy: name, + } + _, e = wxDao.SysUserProjectRelevancy.Ctx(ctx).Insert(relevancy) + liberr.ErrIsNil(ctx, e, "添加用户失败") + } + // 3、当前用户+项目id 得到对应权限进行保存 + if len(req.Project) > 0 { + power := req.Power + for i := range power { + power[i].SysUserId = userId + } + _, err = g.DB().Model("document_power").Ctx(ctx).Insert(power) + if err != nil { + liberr.ErrIsNil(ctx, err, "添加用户失败") + } + } + liberr.ErrIsNil(ctx, err, "添加用户失败") + + // 为该用户添加公司管理员的菜单角色 + _, err = dao.AppUserRoles.Ctx(ctx).Insert(do.AppUserRoles{ + UserId: userId, + RoleId: 8, // 公司管理员 + MajorRole: 0, // 后台管理人员 + }) + liberr.ErrIsNil(ctx, err, "为用户添加公司管理员角色失败") + + // 在微信小程序中添加用户 + phone := req.Mobile + + // 如果该用户已在小程序中存在,则不再添加 + userExist, err := dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().Phone, phone).Count() + liberr.ErrIsNil(ctx, err, "查询用户信息失败") + if userExist != 0 { + return + } + + openID, err := libUtils.GetFakeOpenID() + liberr.ErrIsNil(ctx, err, "生成 OpenID 失败") + + // 将用户信息插入到小程序的表中 + busUserId, err := dao.BusConstructionUser.Ctx(ctx).TX(tx).Where(dao.BusConstructionUser.Columns().Phone, phone). + Data(do.BusConstructionUser{ + Openid: openID, // OpenID + Phone: phone, // 手机号 + ProjectRecord: 2, + WxOrPc: 3, + Subscription: 2, + }).InsertAndGetId() + liberr.ErrIsNil(ctx, err, "新增小程序用户失败") + + err = logic.InitializationDataFunc(ctx, busUserId) // 为用户初始化实名数据 + liberr.ErrIsNil(ctx, err, "为用户初始化身份证数据失败") + }) + return err + }) + return +} + +func (s *sSysUser) Edit(ctx context.Context, req *system.UserEditReq) (err error) { + // err = s.UserNameOrMobileExists(ctx, "", req.Mobile, req.UserId) + // if err != nil { + // return + // } + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + _, err := dao.SysUser.Ctx(ctx).TX(tx).WherePri(req.UserId).Update(do.SysUser{ + Mobile: req.Mobile, + UserNickname: req.NickName, + UserStatus: req.Status, + UserEmail: req.Email, + Sex: req.Sex, + DeptId: req.DeptId, + Remark: req.Remark, + IsAdmin: req.IsAdmin, + IsData: req.IsData, + }) + liberr.ErrIsNil(ctx, err, "修改用户信息失败") + // 设置用户所属角色信息 + err = s.EditUserRole(ctx, req.RoleIds, req.UserId) + liberr.ErrIsNil(ctx, err, "设置用户权限失败") + err = s.AddUserPost(ctx, tx, req.PostIds, req.UserId) + liberr.ErrIsNil(ctx, err) + // 2、项目和用户进行关联 + // 删除数据 + // if len(req.Project) > 0 { + _, err = wxDao.SysUserProjectRelevancy.Ctx(ctx).Where("user_id", req.UserId).Unscoped().Delete() + projectList := req.Project + name := ct.New().GetLoginUser(ctx).Id + for _, data := range projectList { + relevancy := wxModel.SysUserProjectRelevancy{ + UserId: req.UserId, + ProjectId: data, + CreateBy: name, + } + _, err = wxDao.SysUserProjectRelevancy.Ctx(ctx).Insert(relevancy) + liberr.ErrIsNil(ctx, err, "修改用户信息失败") + } + //} + //3、当前用户+项目id 得到对应权限进行保存(修改的话,先删除再插入) + if len(req.Project) > 0 && len(req.Power) > 0 { + power := req.Power + // userId, _ := userEntity.LastInsertId() + _, err = g.DB().Model("document_power").Unscoped().Where("sys_user_id", power[0].SysUserId).Delete() + if err != nil { + liberr.ErrIsNil(ctx, err, "修改用户信息失败") + return + } + //for i := range power { + // power[i].SysUserId = userId + //} + _, err = g.DB().Model("document_power").Ctx(ctx).Insert(power) + if err != nil { + liberr.ErrIsNil(ctx, err, "修改用户信息失败") + } + } + }) + return err + }) + return +} + +// AddUserPost 添加用户岗位信息 +func (s *sSysUser) AddUserPost(ctx context.Context, tx gdb.TX, postIds []int64, userId int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 删除旧岗位信息 + _, err = dao.SysUserPost.Ctx(ctx).TX(tx).Where(dao.SysUserPost.Columns().UserId, userId).Delete() + liberr.ErrIsNil(ctx, err, "设置用户岗位失败") + if len(postIds) == 0 { + return + } + // 添加用户岗位信息 + data := g.List{} + for _, v := range postIds { + data = append(data, g.Map{ + dao.SysUserPost.Columns().UserId: userId, + dao.SysUserPost.Columns().PostId: v, + }) + } + _, err = dao.SysUserPost.Ctx(ctx).TX(tx).Data(data).Insert() + liberr.ErrIsNil(ctx, err, "设置用户岗位失败") + }) + return +} + +// AddUserRole 添加用户角色信息 +func (s *sSysUser) addUserRole(ctx context.Context, roleIds []int64, userId int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + enforcer, e := commonService.CasbinEnforcer(ctx) + liberr.ErrIsNil(ctx, e) + for _, v := range roleIds { + _, e = enforcer.AddGroupingPolicy(fmt.Sprintf("%s%d", s.casBinUserPrefix, userId), gconv.String(v)) + liberr.ErrIsNil(ctx, e) + } + }) + return +} + +// AddUserRole 添加用户角色信息 +func (s *sSysUser) AddUserRole(ctx context.Context, roleIds []int64, userId int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + enforcer, e := commonService.CasbinEnforcer(ctx) + liberr.ErrIsNil(ctx, e) + for _, v := range roleIds { + _, e = enforcer.AddGroupingPolicy(fmt.Sprintf("%s%d", s.casBinUserPrefix, userId), gconv.String(v)) + liberr.ErrIsNil(ctx, e) + } + }) + return +} + +// EditUserRole 修改用户角色信息 +func (s *sSysUser) EditUserRole(ctx context.Context, roleIds []int64, userId int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + enforcer, e := commonService.CasbinEnforcer(ctx) + liberr.ErrIsNil(ctx, e) + + // 删除用户旧角色信息 + enforcer.RemoveFilteredGroupingPolicy(0, fmt.Sprintf("%s%d", s.casBinUserPrefix, userId)) + for _, v := range roleIds { + _, err = enforcer.AddGroupingPolicy(fmt.Sprintf("%s%d", s.casBinUserPrefix, userId), gconv.String(v)) + liberr.ErrIsNil(ctx, err) + } + }) + return +} + +func (s *sSysUser) UserNameOrMobileExists(ctx context.Context, userName, mobile string, id ...int64) error { + user := (*entity.SysUser)(nil) + err := g.Try(ctx, func(ctx context.Context) { + m := dao.SysUser.Ctx(ctx) + if len(id) > 0 { + m = m.Where(dao.SysUser.Columns().Id+" != ", id) + } + m = m.Where(fmt.Sprintf("%s='%s' OR %s='%s'", + dao.SysUser.Columns().UserName, + userName, + dao.SysUser.Columns().Mobile, + mobile)) + err := m.Limit(1).Scan(&user) + liberr.ErrIsNil(ctx, err, "获取用户信息失败") + if user == nil { + return + } + if user.UserName == userName { + liberr.ErrIsNil(ctx, gerror.New("用户名已存在")) + } + if user.Mobile == mobile { + liberr.ErrIsNil(ctx, gerror.New("手机号已存在")) + } + }) + return err +} + +func (s *sSysUser) UserNameOrMobileData(ctx context.Context, userName, mobile string) (user *entity.SysUser, err error) { + user = new(entity.SysUser) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SysUser.Ctx(ctx) + m = m.Where(fmt.Sprintf("%s='%s' OR %s='%s'", + dao.SysUser.Columns().UserName, + userName, + dao.SysUser.Columns().Mobile, + mobile)) + err := m.Limit(1).Scan(&user) + liberr.ErrIsNil(ctx, err, "获取用户信息失败") + }) + return +} + +// GetEditUser 获取编辑用户信息 +func (s *sSysUser) GetEditUser(ctx context.Context, id uint64) (res *system.UserGetEditRes, err error) { + res = new(system.UserGetEditRes) + err = g.Try(ctx, func(ctx context.Context) { + // 获取用户信息 + res.User, err = s.GetUserInfoById(ctx, id) + liberr.ErrIsNil(ctx, err) + // 获取已选择的角色信息 + res.CheckedRoleIds, err = s.GetAdminRoleIds(ctx, id) + liberr.ErrIsNil(ctx, err) + res.CheckedPosts, err = s.GetUserPostIds(ctx, id) + liberr.ErrIsNil(ctx, err) + // 获取用户关联到的项目 + var wxDataInfo []wxModel.SysUserProjectRelevancy + err := wxDao.SysUserProjectRelevancy.Ctx(ctx).As("a"). + LeftJoin("sys_project as b on a.project_id = b.id"). + Fields("a.*,b.project_name"). + Where("a."+wxDao.SysUserProjectRelevancy.Columns().UserId, id). + WhereNull("a.source"). + Scan(&wxDataInfo) + liberr.ErrIsNil(ctx, err) + res.WxList = wxDataInfo + // 获取到工程资料的权限 + var pe []system.PowerEntity + err = g.DB().Model("document_power").Ctx(ctx).Where("sys_user_id", res.User.Id).Scan(&pe) + liberr.ErrIsNil(ctx, err) + res.PowerList = pe + }) + return +} + +// GetUserInfoById 通过Id获取用户信息 +func (s *sSysUser) GetUserInfoById(ctx context.Context, id uint64, withPwd ...bool) (user *entity.SysUser, err error) { + err = g.Try(ctx, func(ctx context.Context) { + if len(withPwd) > 0 && withPwd[0] { + // 用户用户信息 + err = dao.SysUser.Ctx(ctx).Where(dao.SysUser.Columns().Id, id).Scan(&user) + } else { + // 用户用户信息 + err = dao.SysUser.Ctx(ctx).Where(dao.SysUser.Columns().Id, id). + FieldsEx(dao.SysUser.Columns().UserPassword, dao.SysUser.Columns().UserSalt).Scan(&user) + } + liberr.ErrIsNil(ctx, err, "获取用户数据失败") + }) + return +} + +// GetUserPostIds 获取用户岗位 +func (s *sSysUser) GetUserPostIds(ctx context.Context, userId uint64) (postIds []int64, err error) { + err = g.Try(ctx, func(ctx context.Context) { + var list []*entity.SysUserPost + err = dao.SysUserPost.Ctx(ctx).Where(dao.SysUserPost.Columns().UserId, userId).Scan(&list) + liberr.ErrIsNil(ctx, err, "获取用户岗位信息失败") + postIds = make([]int64, 0) + for _, entity := range list { + postIds = append(postIds, entity.PostId) + } + }) + return +} + +// ResetUserPwd 重置用户密码 +func (s *sSysUser) ResetUserPwd(ctx context.Context, req *system.UserResetPwdReq) (err error) { + salt := grand.S(10) + password := libUtils.EncryptPassword(req.Password, salt) + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysUser.Ctx(ctx).WherePri(req.Id).Update(g.Map{ + dao.SysUser.Columns().UserSalt: salt, + dao.SysUser.Columns().UserPassword: password, + }) + liberr.ErrIsNil(ctx, err, "重置用户密码失败") + }) + return +} + +func (s *sSysUser) ChangeUserStatus(ctx context.Context, req *system.UserStatusReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysUser.Ctx(ctx).WherePri(req.Id).Update(do.SysUser{UserStatus: req.UserStatus}) + liberr.ErrIsNil(ctx, err, "设置用户状态失败") + }) + return +} + +// Delete 删除用户 +func (s *sSysUser) Delete(ctx context.Context, ids []int) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysUser.Ctx(ctx).TX(tx).Where(dao.SysUser.Columns().Id+" in(?)", ids).Delete() + liberr.ErrIsNil(ctx, err, "删除用户失败") + // 删除对应权限 + enforcer, e := commonService.CasbinEnforcer(ctx) + liberr.ErrIsNil(ctx, e) + for _, v := range ids { + enforcer.RemoveFilteredGroupingPolicy(0, fmt.Sprintf("%s%d", s.casBinUserPrefix, v)) + } + // 删除用户对应的岗位 + _, err = dao.SysUserPost.Ctx(ctx).TX(tx).Delete(dao.SysUserPost.Columns().UserId+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除用户的岗位失败") + // 删除用户工程资料权限 + _, err = g.DB().Model("document_power").Ctx(ctx).TX(tx).Where("sys_user_id in(?)", ids).Delete() + liberr.ErrIsNil(ctx, err, "用户工程资料权限失败") + }) + return err + }) + return +} + +// GetUsers 通过用户ids查询多个用户信息 +func (s *sSysUser) GetUsers(ctx context.Context, ids []int) (users []*model.SysUserSimpleRes, err error) { + if len(ids) == 0 { + return + } + idsSet := gset.NewIntSetFrom(ids).Slice() + err = g.Try(ctx, func(ctx context.Context) { + err = dao.SysUser.Ctx(ctx).Where(dao.SysUser.Columns().Id+" in(?)", idsSet). + Order(dao.SysUser.Columns().Id + " ASC").Scan(&users) + }) + return +} + +// GetDataWhere 获取数据权限判断条件 +func (s *sSysUser) GetDataWhere(ctx context.Context, userInfo *model.ContextUser, entityData interface{}) (where g.Map, err error) { + whereJustMe := g.Map{} // 本人数据权限 + t := reflect.TypeOf(entityData) + for i := 0; i < t.Elem().NumField(); i++ { + if t.Elem().Field(i).Name == "CreatedBy" { + // 若存在用户id的字段,则生成判断数据权限的条件 + // 1、获取当前用户所属角色 + allRoles := ([]*entity.SysRole)(nil) + allRoles, err = service.SysRole().GetRoleList(ctx) + if err != nil { + return nil, err + } + roles := ([]*entity.SysRole)(nil) + roles, err = s.GetAdminRole(ctx, userInfo.Id, allRoles) + if err != nil { + return nil, err + } + // 2获取角色对应数据权限 + deptIdArr := gset.New() + for _, role := range roles { + switch role.DataScope { + case 1: // 全部数据权限 + return + case 2: // 自定数据权限 + var deptIds []int64 + deptIds, err = service.SysRole().GetRoleDepts(ctx, gconv.Int64(role.Id)) + if err != nil { + return + } + deptIdArr.Add(gconv.Interfaces(deptIds)...) + case 3: // 本部门数据权限 + deptIdArr.Add(gconv.Int64(userInfo.DeptId)) + case 4: // 本部门及以下数据权限 + deptIdArr.Add(gconv.Int64(userInfo.DeptId)) + // 获取正常状态部门数据 + depts := ([]*entity.SysDept)(nil) + depts, err = service.SysDept().GetList(ctx, &system.DeptSearchReq{Status: "1"}) + if err != nil { + return + } + var dList g.List + for _, d := range depts { + m := g.Map{ + "id": d.DeptId, + "pid": d.ParentId, + "label": d.DeptName, + } + dList = append(dList, m) + } + l := libUtils.FindSonByParentId(dList, userInfo.DeptId, "pid", "id") + for _, li := range l { + deptIdArr.Add(gconv.Int64(li["id"])) + } + case 5: // 仅本人数据权限 + whereJustMe = g.Map{"user.id": userInfo.Id} + } + } + if deptIdArr.Size() > 0 { + where = g.Map{"user.dept_id": deptIdArr.Slice()} + } else if len(whereJustMe) > 0 { + where = whereJustMe + } + } + } + return +} + +// HasAccessByDataWhere 判断用户是否有数据权限 +func (s *sSysUser) HasAccessByDataWhere(ctx context.Context, where g.Map, uid interface{}) bool { + err := g.Try(ctx, func(ctx context.Context) { + rec, err := dao.SysUser.Ctx(ctx).As("user"). + Fields("user.id"). + Where("user.id", uid).Where(where).One() + liberr.ErrIsNil(ctx, err) + if rec.IsEmpty() { + liberr.ErrIsNil(ctx, gerror.New("没有数据")) + } + }) + return err == nil +} + +// AccessRule 判断用户是否有某一菜单规则权限 +func (s *sSysUser) AccessRule(ctx context.Context, userId uint64, rule string) bool { + // 获取无需验证权限的用户id + tagSuperAdmin := false + s.NotCheckAuthAdminIds(ctx).Iterator(func(v interface{}) bool { + if gconv.Uint64(v) == userId { + tagSuperAdmin = true + return false + } + return true + }) + if tagSuperAdmin { + return true + } + menuList, err := service.SysAuthRule().GetMenuList(ctx) + if err != nil { + g.Log().Error(ctx, err) + return false + } + var menu *model.SysAuthRuleInfoRes + for _, m := range menuList { + ms := gstr.SubStr(m.Name, 0, gstr.Pos(m.Name, "?")) + if m.Name == rule || ms == rule { + menu = m + break + } + } + // 不存在的规则直接false + if menu == nil { + return false + } + enforcer, err := commonService.CasbinEnforcer(ctx) + if err != nil { + g.Log().Error(ctx, err) + return false + } + hasAccess, err := enforcer.Enforce(fmt.Sprintf("%s%d", service.SysUser().GetCasBinUserPrefix(), userId), gconv.String(menu.Id), "All") + if err != nil { + g.Log().Error(ctx, err) + return false + } + return hasAccess +} + +// ProjectAll 获取当前用户下的所有项目 +func ProjectAll(ctx context.Context) (ids string) { + // 1、获取当前登录用户 + id := ct.New().GetLoginUser(ctx).Id + // 2、获取到当前项目下的所有详情 + value, err := wxDao.SysUserProjectRelevancy.Ctx(ctx). + Where("user_id", id). + Fields("GROUP_CONCAT( `project_id` SEPARATOR ',' )").Value() + if err != nil { + return + } + return value.String() +} diff --git a/internal/app/system/logic/sysUserOnline/sys_user_online.go b/internal/app/system/logic/sysUserOnline/sys_user_online.go new file mode 100644 index 0000000..0da7cad --- /dev/null +++ b/internal/app/system/logic/sysUserOnline/sys_user_online.go @@ -0,0 +1,187 @@ +/* +* @desc:用户在线状态处理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2023/1/10 14:50 + */ + +package sysUserOnline + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/grpool" + "github.com/gogf/gf/v2/os/gtime" + "github.com/mssola/user_agent" + "github.com/tiger1103/gfast/v3/api/v1/common" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterSysUserOnline(New()) +} + +func New() *sSysUserOnline { + return &sSysUserOnline{ + Pool: grpool.New(100), + } +} + +type sSysUserOnline struct { + Pool *grpool.Pool +} + +func (s *sSysUserOnline) Invoke(ctx context.Context, params *model.SysUserOnlineParams) { + s.Pool.Add(ctx, func(ctx context.Context) { + //写入数据 + s.SaveOnline(ctx, params) + }) +} + +// SaveOnline 保存用户在线状态 +func (s *sSysUserOnline) SaveOnline(ctx context.Context, params *model.SysUserOnlineParams) { + err := g.Try(ctx, func(ctx context.Context) { + ua := user_agent.New(params.UserAgent) + browser, _ := ua.Browser() + os := ua.OS() + var ( + info *entity.SysUserOnline + data = &do.SysUserOnline{ + Uuid: params.Uuid, + Token: params.Token, + CreateTime: gtime.Now(), + UserName: params.Username, + Ip: params.Ip, + Explorer: browser, + Os: os, + } + ) + + //查询是否已存在当前用户 + err := dao.SysUserOnline.Ctx(ctx).Fields(dao.SysUserOnline.Columns().Id). + Where(dao.SysUserOnline.Columns().Token, data.Token). + Scan(&info) + liberr.ErrIsNil(ctx, err) + //若已存在则更新 + if info != nil { + _, err = dao.SysUserOnline.Ctx(ctx). + Where(dao.SysUserOnline.Columns().Id, info.Id). + FieldsEx(dao.SysUserOnline.Columns().Id).Update(data) + liberr.ErrIsNil(ctx, err) + } else { //否则新增 + _, err = dao.SysUserOnline.Ctx(ctx). + FieldsEx(dao.SysUserOnline.Columns().Id).Insert(data) + liberr.ErrIsNil(ctx, err) + } + }) + if err != nil { + g.Log().Error(ctx, err) + } +} + +// CheckUserOnline 检查在线用户 +func (s *sSysUserOnline) CheckUserOnline(ctx context.Context) { + param := &system.SysUserOnlineSearchReq{ + PageReq: common.PageReq{ + PageNum: 1, + PageSize: 50, + }, + } + var total int + for { + var ( + res *system.SysUserOnlineSearchRes + err error + ) + res, err = s.GetOnlineListPage(ctx, param, true) + if err != nil { + g.Log().Error(ctx, err) + break + } + if res.List == nil { + break + } + for _, v := range res.List { + if b := s.UserIsOnline(ctx, v.Token); !b { + s.DeleteOnlineByToken(ctx, v.Token) + } + } + if param.PageNum*param.PageSize >= total { + break + } + param.PageNum++ + } + service.SysJobLog().Add(ctx, &do.SysJobLog{ + TargetName: "checkUserOnline", + CreatedAt: gtime.Now(), + Result: "在线用户定时更新,执行成功", + }) +} + +// GetOnlineListPage 搜素在线用户列表 +func (s *sSysUserOnline) GetOnlineListPage(ctx context.Context, req *system.SysUserOnlineSearchReq, hasToken ...bool) (res *system.SysUserOnlineSearchRes, err error) { + if req.PageNum == 0 { + req.PageNum = 1 + } + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + model := dao.SysUserOnline.Ctx(ctx) + if req.Ip != "" { + model = model.Where("ip like ?", "%"+req.Ip+"%") + } + if req.Username != "" { + model = model.Where("user_name like ?", "%"+req.Username+"%") + } + res = new(system.SysUserOnlineSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + res.Total, err = model.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if len(hasToken) == 0 || !hasToken[0] { + model = model.FieldsEx("token") + } + err = model.Page(req.PageNum, req.PageSize).Order("create_time DESC").Scan(&res.List) + liberr.ErrIsNil(ctx, err, "获取数据失败") + }) + return +} + +func (s *sSysUserOnline) UserIsOnline(ctx context.Context, token string) bool { + err := g.Try(ctx, func(ctx context.Context) { + _, _, err := service.GfToken().GetTokenData(ctx, token) + liberr.ErrIsNil(ctx, err) + }) + return err == nil +} + +func (s *sSysUserOnline) DeleteOnlineByToken(ctx context.Context, token string) (err error) { + _, err = dao.SysUserOnline.Ctx(ctx).Delete(dao.SysUserOnline.Columns().Token, token) + return +} + +func (s *sSysUserOnline) ForceLogout(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + var onlineList []*entity.SysUserOnline + onlineList, err = s.GetInfosByIds(ctx, ids) + liberr.ErrIsNil(ctx, err) + _, err = dao.SysUserOnline.Ctx(ctx).Where(dao.SysUserOnline.Columns().Id+" in(?)", ids).Delete() + liberr.ErrIsNil(ctx, err) + for _, v := range onlineList { + err = service.GfToken().RemoveToken(ctx, v.Token) + liberr.ErrIsNil(ctx, err) + } + }) + return +} + +func (s *sSysUserOnline) GetInfosByIds(ctx context.Context, ids []int) (onlineList []*entity.SysUserOnline, err error) { + err = dao.SysUserOnline.Ctx(ctx).Where(dao.SysUserOnline.Columns().Id+" in(?)", ids).Scan(&onlineList) + return +} diff --git a/internal/app/system/logic/sysUserProject/sys_user_project.go b/internal/app/system/logic/sysUserProject/sys_user_project.go new file mode 100644 index 0000000..7caffb4 --- /dev/null +++ b/internal/app/system/logic/sysUserProject/sys_user_project.go @@ -0,0 +1,112 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-07-27 15:20:52 +// 生成路径: internal/app/system/logic/sys_user_project.go +// 生成人:gfast +// desc:用户和项目关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterSysUserProject(New()) +} + +func New() *sSysUserProject { + return &sSysUserProject{} +} + +type sSysUserProject struct{} + +func (s *sSysUserProject) List(ctx context.Context, req *system.SysUserProjectSearchReq) (listRes *system.SysUserProjectSearchRes, err error) { + listRes = new(system.SysUserProjectSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SysUserProject.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.SysUserProject.Columns().Id+" = ?", req.Id) + } + if req.UserId != "" { + m = m.Where(dao.SysUserProject.Columns().UserId+" = ?", gconv.Int64(req.UserId)) + } + if req.ProjectId != "" { + m = m.Where(dao.SysUserProject.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.SysUserProjectInfoRes + err = m.Fields(system.SysUserProjectSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.SysUserProjectListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.SysUserProjectListRes{ + Id: v.Id, + UserId: v.UserId, + ProjectId: v.ProjectId, + } + } + }) + return +} + +func (s *sSysUserProject) GetById(ctx context.Context, id int64) (res *model.SysUserProjectInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.SysUserProject.Ctx(ctx).WithAll().Where(dao.SysUserProject.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sSysUserProject) Add(ctx context.Context, req *system.SysUserProjectAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysUserProject.Ctx(ctx).Insert(do.SysUserProject{ + UserId: req.UserId, + ProjectId: req.ProjectId, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sSysUserProject) Edit(ctx context.Context, req *system.SysUserProjectEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysUserProject.Ctx(ctx).WherePri(req.Id).Update(do.SysUserProject{ + UserId: req.UserId, + ProjectId: req.ProjectId, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sSysUserProject) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysUserProject.Ctx(ctx).Delete(dao.SysUserProject.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/sysWechatRole/sys_wechat_role.go b/internal/app/system/logic/sysWechatRole/sys_wechat_role.go new file mode 100644 index 0000000..abe043e --- /dev/null +++ b/internal/app/system/logic/sysWechatRole/sys_wechat_role.go @@ -0,0 +1,202 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-01-22 15:05:43 +// 生成路径: internal/app/system/logic/sys_wechat_role.go +// 生成人:gfast +// desc:微信角色 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterSysWechatRole(New()) +} + +func New() *sSysWechatRole { + return &sSysWechatRole{} +} + +type sSysWechatRole struct{} + +func (s *sSysWechatRole) RoleList(ctx context.Context, req *system.SysWechatRoleSearchNoPageReq) (listRes *system.SysWechatRoleSearchNoPageRes, err error) { + listRes = new(system.SysWechatRoleSearchNoPageRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SysWechatRole.Ctx(ctx).WithAll() + if req.Name != "" { + m = m.Where(dao.SysWechatRole.Columns().Name+" like ?", "%"+req.Name+"%") + } + order := "list_order asc,id asc" + var res []*model.SysWechatRoleInfoRes + err = m.Fields("").Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.SysWechatRoleListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.SysWechatRoleListRes{ + Id: v.Id, + Name: v.Name, + } + } + }) + return +} + +func (s *sSysWechatRole) ModuleList(ctx context.Context, req *system.SysWechatModuleSearchReq) (res *system.SysWechatModuleSearchRes, err error) { + res = new(system.SysWechatModuleSearchRes) + var smi []*model.SysWechatModuleInfoRes + err = g.DB().Model("sys_wechat_module").OrderAsc("list_order").Scan(&smi) + if err == nil { + res.List = smi + } + return +} + +func (s *sSysWechatRole) List(ctx context.Context, req *system.SysWechatRoleSearchReq) (listRes *system.SysWechatRoleSearchRes, err error) { + listRes = new(system.SysWechatRoleSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SysWechatRole.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.SysWechatRole.Columns().Id+" = ?", req.Id) + } + if req.Name != "" { + m = m.Where(dao.SysWechatRole.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.ListOrder != "" { + m = m.Where(dao.SysWechatRole.Columns().ListOrder+" = ?", gconv.Int(req.ListOrder)) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.SysWechatRole.Columns().CreatedAt+" >=? AND "+dao.SysWechatRole.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "list_order asc,id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.SysWechatRoleInfoRes + err = m.Fields(system.SysWechatRoleSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.SysWechatRoleListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.SysWechatRoleListRes{ + Id: v.Id, + Name: v.Name, + ListOrder: v.ListOrder, + Remark: v.Remark, + CreatedAt: v.CreatedAt, + Status: v.Status, + } + } + }) + return +} + +func (s *sSysWechatRole) GetById(ctx context.Context, id int64) (res *model.SysWechatRoleListTwoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、获取角色 + err = dao.SysWechatRole.Ctx(ctx).WithAll().Where(dao.SysWechatRole.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + //2、获取角色用有的模块 + var swrmi []*model.SysWechatRoleModuleInfoRes + err = g.DB().Model("sys_wxchat_role_module").Where("role_id", res.Id).Scan(&swrmi) + liberr.ErrIsNil(ctx, err, "获取角色模块失败") + for i := range swrmi { + res.ModuleIds = append(res.ModuleIds, swrmi[i].ModuleId) + } + }) + return +} + +func (s *sSysWechatRole) Add(ctx context.Context, req *system.SysWechatRoleAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //0、判断当前角色是否存在 + count, err := dao.SysWechatRole.Ctx(ctx).Where(dao.SysWechatRole.Columns().Name, req.Name).Count() + liberr.ErrIsNil(ctx, err, "获取角色失败") + if count > 0 { + err = errors.New("角色已存在") + liberr.ErrIsNil(ctx, err) + } + //1、新增角色 + insertId, err := dao.SysWechatRole.Ctx(ctx).InsertAndGetId(do.SysWechatRole{ + Name: req.Name, + ListOrder: req.ListOrder, + Remark: req.Remark, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + //2、根据选择的模块去新增数据(将模块与角色进行绑定) + if len(req.ModuleIds) > 0 { + err = InsertRoleModuleFunc(ctx, req.ModuleIds, insertId) + liberr.ErrIsNil(ctx, err, "添加角色模块失败") + } + }) + return +} + +func (s *sSysWechatRole) Edit(ctx context.Context, req *system.SysWechatRoleEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysWechatRole.Ctx(ctx).WherePri(req.Id).Update(do.SysWechatRole{ + Name: req.Name, + ListOrder: req.ListOrder, + Status: req.Status, + Remark: req.Remark, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + if len(req.ModuleIds) > 0 { + //先删除再去新增数据 + _, err = g.DB().Model("sys_wxchat_role_module").Ctx(ctx).Delete("role_id", req.Id) + liberr.ErrIsNil(ctx, err, "修改角色模块失败") + err = InsertRoleModuleFunc(ctx, req.ModuleIds, req.Id) + liberr.ErrIsNil(ctx, err, "修改角色模块失败") + } + }) + return +} + +func (s *sSysWechatRole) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + for _, id := range ids { + if id == 1 || id == 4 { + err = errors.New("当前角色不可删除") + liberr.ErrIsNil(ctx, err) + return + } + } + _, err = dao.SysWechatRole.Ctx(ctx).Delete(dao.SysWechatRole.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +func InsertRoleModuleFunc(ctx context.Context, moduleIds []int64, insertId int64) (err error) { + var swrmi []model.SysWechatRoleModuleInfoRes + for _, id := range moduleIds { + res := model.SysWechatRoleModuleInfoRes{ + RoleId: insertId, + ModuleId: id, + } + swrmi = append(swrmi, res) + } + _, err = g.DB().Model("sys_wxchat_role_module").Ctx(ctx).Insert(swrmi) + return err +} diff --git a/internal/app/system/logic/templateData/template_data.go b/internal/app/system/logic/templateData/template_data.go new file mode 100644 index 0000000..b109f98 --- /dev/null +++ b/internal/app/system/logic/templateData/template_data.go @@ -0,0 +1,137 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-12-08 14:21:01 +// 生成路径: internal/app/system/logic/template_data.go +// 生成人:gfast +// desc:工程资料>资料 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterTemplateData(New()) +} + +func New() *sTemplateData { + return &sTemplateData{} +} + +type sTemplateData struct{} + +func (s *sTemplateData) List(ctx context.Context, req *system.TemplateDataSearchReq) (listRes *system.TemplateDataSearchRes, err error) { + listRes = new(system.TemplateDataSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.TemplateData.Ctx(ctx).WithAll() + if req.DataType != "" { + m = m.Where(dao.TemplateData.Columns().DataType+" = ?", req.DataType) + } + if req.DataName != "" { + m = m.Where(dao.TemplateData.Columns().DataName+" like ?", "%"+req.DataName+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.TemplateData.Columns().CreatedAt+" >=? AND "+dao.TemplateData.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.TemplateDataInfoRes + err = m.Fields(system.TemplateDataSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.TemplateDataListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.TemplateDataListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + DataName: v.DataName, + DataType: v.DataType, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sTemplateData) GetById(ctx context.Context, id int64) (res *model.TemplateDataInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.TemplateData.Ctx(ctx).WithAll().Where(dao.TemplateData.Columns().Id, id).Scan(&res) + //获取创建人 更新人名称 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.TemplateDataInfoRes) + res = &infoRes + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sTemplateData) Add(ctx context.Context, req *system.TemplateDataAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.TemplateData.Ctx(ctx).Insert(do.TemplateData{ + ProjectId: req.DataName, + DataName: req.DataName, + DataType: req.DataType, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sTemplateData) Edit(ctx context.Context, req *system.TemplateDataEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.TemplateData.Ctx(ctx).WherePri(req.Id).Update(do.TemplateData{ + DataName: req.DataName, + DataType: req.DataType, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sTemplateData) Delete(ctx context.Context, ids []int64) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //1、先查询这个标签下的所有数据的主键id + array, err := dao.TemplateDataJunior.Ctx(ctx).Unscoped().Where("data_id in (?)", ids).Fields("DISTINCT id").Array() + var juniorStr []string + for i := range array { + juniorStr = append(juniorStr, array[i].String()) + } + //2、删除数据 + _, err = dao.TemplateDataSourceData.Ctx(ctx).Where(dao.Document.Columns().Type, 2).Where("type_id in (?)", juniorStr).Unscoped().Delete() + _, err = dao.TemplateDataJunior.Ctx(ctx).Unscoped().Where("data_id in (?)", ids).Delete() + _, err = dao.TemplateData.Ctx(ctx).Unscoped().Delete(dao.TemplateData.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return err + }) + return +} diff --git a/internal/app/system/logic/templateDataJunior/template_data_junior.go b/internal/app/system/logic/templateDataJunior/template_data_junior.go new file mode 100644 index 0000000..d78b3b5 --- /dev/null +++ b/internal/app/system/logic/templateDataJunior/template_data_junior.go @@ -0,0 +1,130 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-12-08 14:21:01 +// 生成路径: internal/app/system/logic/template_data_junior.go +// 生成人:gfast +// desc:工程资料>资料>下级模板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "strings" +) + +func init() { + service.RegisterTemplateDataJunior(New()) +} + +func New() *sTemplateDataJunior { + return &sTemplateDataJunior{} +} + +type sTemplateDataJunior struct{} + +func (s *sTemplateDataJunior) List(ctx context.Context, req *system.TemplateDataJuniorSearchReq) (listRes *system.TemplateDataJuniorSearchRes, err error) { + listRes = new(system.TemplateDataJuniorSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.TemplateDataJunior.Ctx(ctx).WithAll() + if req.Suffix != "" { + m = m.Where(dao.TemplateDataJunior.Columns().Suffix+" = ?", req.Suffix) + } + if req.Name != "" { + m = m.Where(dao.TemplateDataJunior.Columns().Name+" like ?", "%"+req.Name+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.TemplateDataJunior.Columns().CreatedAt+" >=? AND "+dao.TemplateDataJunior.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.TemplateDataJuniorInfoRes + err = m.Fields(system.TemplateDataJuniorSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.TemplateDataJuniorListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.TemplateDataJuniorListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + Name: v.Name, + FilenPath: v.FilenPath, + Suffix: v.Suffix, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sTemplateDataJunior) GetById(ctx context.Context, id int64) (res *model.TemplateDataJuniorInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.TemplateDataJunior.Ctx(ctx).WithAll().Where(dao.TemplateDataJunior.Columns().Id, id).Scan(&res) + //获取创建人 更新人名称 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.TemplateDataJuniorInfoRes) + res = &infoRes + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sTemplateDataJunior) Add(ctx context.Context, req *system.TemplateDataJuniorAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + str, err := coryCommon.UploadFile(ctx, req.File, coryCommon.Helmet) + filePath := strings.Replace(str, "resource/public", "/file", 1) + _, ext, _ := coryCommon.FileInfo(filePath) + _, err = dao.TemplateDataJunior.Ctx(ctx).Insert(do.TemplateDataJunior{ + ProjectId: req.ProjectId, + Name: req.Name, + FilenPath: filePath, + Suffix: ext, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sTemplateDataJunior) Edit(ctx context.Context, req *system.TemplateDataJuniorEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.TemplateDataJunior.Ctx(ctx).WherePri(req.Id).Update(do.TemplateDataJunior{ + Name: req.Name, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sTemplateDataJunior) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.TemplateDataSourceData.Ctx(ctx).Where(dao.Document.Columns().Type, 2).Where("type_id in (?)", ids).Unscoped().Delete() + _, err = dao.TemplateDataJunior.Ctx(ctx).Delete(dao.TemplateDataJunior.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/templateDataSourceData/template_data_source_data.go b/internal/app/system/logic/templateDataSourceData/template_data_source_data.go new file mode 100644 index 0000000..06561a7 --- /dev/null +++ b/internal/app/system/logic/templateDataSourceData/template_data_source_data.go @@ -0,0 +1,148 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-12-08 10:06:54 +// 生成路径: internal/app/system/logic/template_data_source_data.go +// 生成人:gfast +// desc:模板资料源数据 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterTemplateDataSourceData(New()) +} + +func New() *sTemplateDataSourceData { + return &sTemplateDataSourceData{} +} + +type sTemplateDataSourceData struct{} + +func (s *sTemplateDataSourceData) List(ctx context.Context, req *system.TemplateDataSourceDataSearchReq) (listRes *system.TemplateDataSourceDataSearchRes, err error) { + listRes = new(system.TemplateDataSourceDataSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.TemplateDataSourceData.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.TemplateDataSourceData.Columns().Id+" = ?", req.Id) + } + if req.Type != "" { + m = m.Where(dao.TemplateDataSourceData.Columns().Type+" = ?", req.Type) + } + if req.ProjectId != "" { + m = m.Where(dao.TemplateDataSourceData.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + if req.SourceName != "" { + m = m.Where(dao.TemplateDataSourceData.Columns().SourceName+" like ?", "%"+req.SourceName+"%") + } + if req.SourceId != "" { + m = m.Where(dao.TemplateDataSourceData.Columns().SourceId+" like ?", "%"+req.SourceId+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.TemplateDataSourceData.Columns().CreatedAt+" >=? AND "+dao.TemplateDataSourceData.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.TemplateDataSourceDataInfoRes + err = m.Fields(system.TemplateDataSourceDataSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.TemplateDataSourceDataListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.TemplateDataSourceDataListRes{ + Id: v.Id, + Type: v.Type, + TypeId: v.TypeId, + ProjectId: v.ProjectId, + SourceName: v.SourceName, + SourceId: v.SourceId, + SourcePath: v.SourcePath, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sTemplateDataSourceData) GetById(ctx context.Context, id int64) (res *model.TemplateDataSourceDataInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.TemplateDataSourceData.Ctx(ctx).WithAll().Where(dao.TemplateDataSourceData.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sTemplateDataSourceData) Add(ctx context.Context, req *system.TemplateDataSourceDataAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.TemplateDataSourceData.Ctx(ctx).Insert(do.TemplateDataSourceData{ + Type: req.Type, + TypeId: req.TypeId, + ProjectId: req.ProjectId, + SourceName: req.SourceName, + SourceId: req.SourceId, + SourcePath: req.SourcePath, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sTemplateDataSourceData) Edit(ctx context.Context, req *system.TemplateDataSourceDataEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.TemplateDataSourceData.Ctx(ctx).WherePri(req.Id).Update(do.TemplateDataSourceData{ + Type: req.Type, + TypeId: req.TypeId, + ProjectId: req.ProjectId, + SourceName: req.SourceName, + SourceId: req.SourceId, + SourcePath: req.SourcePath, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sTemplateDataSourceData) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.TemplateDataSourceData.Ctx(ctx).Delete(dao.TemplateDataSourceData.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +func ExposeAdd(ctx context.Context, req *model.TemplateDataSourceDataInfoRes) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.TemplateDataSourceData.Ctx(ctx).Insert(do.TemplateDataSourceData{ + Type: req.Type, + TypeId: req.TypeId, + ProjectId: req.ProjectId, + SourceName: req.SourceName, + SourcePath: req.SourcePath, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} diff --git a/internal/app/system/logic/timeTask/time_task.go b/internal/app/system/logic/timeTask/time_task.go new file mode 100644 index 0000000..cbc1ca4 --- /dev/null +++ b/internal/app/system/logic/timeTask/time_task.go @@ -0,0 +1,61 @@ +/* +* @desc:定时任务栈 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2023/1/13 17:41 + */ + +package timeTask + +import ( + "github.com/gogf/gf/v2/os/gmutex" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/service" +) + +func init() { + service.RegisterTaskList(New()) +} + +func New() *sTaskList { + return &sTaskList{ + mu: gmutex.New(), + } +} + +type sTaskList struct { + taskList []*model.TimeTask + mu *gmutex.Mutex +} + +// AddTask 添加任务 +func (s *sTaskList) AddTask(task *model.TimeTask) { + if task.FuncName == "" || task.Run == nil { + return + } + s.taskList = append(s.taskList, task) +} + +// GetByName 通过方法名获取对应task信息 +func (s *sTaskList) GetByName(funcName string) *model.TimeTask { + var result *model.TimeTask + for _, item := range s.taskList { + if item.FuncName == funcName { + result = item + break + } + } + return result +} + +// EditParams 修改参数 +func (s *sTaskList) EditParams(funcName string, params []string) { + s.mu.Lock() + defer s.mu.Unlock() + for _, item := range s.taskList { + if item.FuncName == funcName { + item.Param = params + break + } + } +} diff --git a/internal/app/system/logic/todoTasks/todo_tasks.go b/internal/app/system/logic/todoTasks/todo_tasks.go new file mode 100644 index 0000000..9f19a96 --- /dev/null +++ b/internal/app/system/logic/todoTasks/todo_tasks.go @@ -0,0 +1,210 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-05-15 17:30:14 +// 生成路径: internal/app/system/logic/todo_tasks.go +// 生成人:gfast +// desc:App-待办 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/jinzhu/copier" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterTodoTasks(New()) +} + +func New() *sTodoTasks { + return &sTodoTasks{} +} + +type sTodoTasks struct{} + +func (s *sTodoTasks) List(ctx context.Context, req *system.TodoTasksSearchReq) (listRes *system.TodoTasksSearchRes, err error) { + listRes = new(system.TodoTasksSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.TodoTasks.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.TodoTasks.Columns().Id+" = ?", req.Id) + } + if req.MissingCardTime != "" { + m = m.Where(dao.TodoTasks.Columns().MissingCardTime+" = ?", req.MissingCardTime) + } + if req.Applicant != "" { + m = m.Where(dao.TodoTasks.Columns().Applicant+" = ?", gconv.Int(req.Applicant)) + } + if req.ProjectId != "" { + m = m.Where(dao.TodoTasks.Columns().ProjectId+" = ?", gconv.Int(req.ProjectId)) + } + if req.TaskType != "" { + m = m.Where(dao.TodoTasks.Columns().TaskType+" = ?", gconv.Int(req.TaskType)) + } + if req.OrderId != "" { + m = m.Where(dao.TodoTasks.Columns().OrderId+" = ?", gconv.Int(req.OrderId)) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.TodoTasks.Columns().CreatedAt+" >=? AND "+dao.TodoTasks.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.UserId != "" { + m = m.Where(dao.TodoTasks.Columns().UserId+" = ?", gconv.Int(req.UserId)) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.TodoTasksInfoRes + err = m.Fields(system.TodoTasksSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.TodoTasksListRes, len(res)) + + copier.Copy(&listRes.List, &res) + }) + return +} + +func (s *sTodoTasks) MyList(ctx context.Context, req *system.TodoTasksMyListReq) (res *system.TodoTasksMyListRes, err error) { + res = new(system.TodoTasksMyListRes) + + // 获取自己的用户信息 + userInfo := ct.New().GetLoginUser(ctx) + + // 用户ID + userID := userInfo.Id + + err = g.Try(ctx, func(ctx context.Context) { + m := dao.TodoTasks.Ctx(ctx).WithAll() + + // 项目ID + if req.ProjectId != 0 { + m = m.Where("todo_tasks."+dao.TodoTasks.Columns().ProjectId+" = ?", req.ProjectId) + } + + // 状态 + if req.Status != 2 { + m = m.Where("todo_tasks."+dao.TodoTasks.Columns().Status+" = ?", req.Status) + } + + // 角色 + if req.Role != "" { + m = m.Where("todo_tasks."+dao.TodoTasks.Columns().Role+" = ?", req.Role) + } + + // 用户ID + m = m.Where("todo_tasks."+dao.TodoTasks.Columns().UserId+" = ?", userID) + + if req.PageNum == 0 { + req.PageNum = 1 + } + + // 当前页 + res.ListRes.CurrentPage = req.PageNum + if req.PageNum == 0 { + req.PageNum = 1 + } + + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + + var list []*model.TodoTasksInfoRes + + m = m.LeftJoin("sys_project as sp on todo_tasks.project_id = sp.id"). + LeftJoin("sys_user as su on su.id = todo_tasks.applicant"). + LeftJoin("bus_reissue_a_card as brc on todo_tasks.order_id = brc.id"). + LeftJoin("bus_construction_user as bcu on bcu.phone = su.mobile"). + WhereNull("bcu.deleted_at") + + fields := "DISTINCT todo_tasks.`updated_at`,todo_tasks.`status`,todo_tasks.`role`,todo_tasks.`id`,todo_tasks.`missing_card_time`,todo_tasks.`applicant`,todo_tasks.`project_id`,todo_tasks.`task_type`,todo_tasks.`order_id`,todo_tasks.`created_at`,todo_tasks.`user_id`,sp.project_name,su.user_nickname,brc.ganger_time,bcu.user_name as busName" + //fields := "todo_tasks.`status`,todo_tasks.`role`,todo_tasks.`id`,todo_tasks.`missing_card_time`,todo_tasks.`applicant`,todo_tasks.`project_id`,todo_tasks.`task_type`,todo_tasks.`order_id`,todo_tasks.`created_at`,todo_tasks.`created_at`,todo_tasks.`user_id`,sp.project_name,su.user_nickname,brc.ganger_time,bcu.user_name as busName" + + // 获取总行数 + ar, err := m.Fields(fields).Array() + res.ListRes.Total = len(ar) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + + switch req.Role { + case "0": + fields += ",brc.manager_opinion as opinion" // 管理员意见 + case "1": + fields += ",brc.ganger_opinion as opinion" // 班组长意见 + } + + // 分页查询 + err = m.Fields(fields).Page(req.PageNum, req.PageSize).Order("todo_tasks.id desc").Scan(&list) + + res.List = make([]*model.TodoTasksListRes, len(list)) + copier.Copy(&res.List, &list) + }) + + return +} + +func (s *sTodoTasks) GetById(ctx context.Context, id uint) (res *model.TodoTasksInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.TodoTasks.Ctx(ctx).WithAll().Where(dao.TodoTasks.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sTodoTasks) Add(ctx context.Context, req *system.TodoTasksAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.TodoTasks.Ctx(ctx).Insert(do.TodoTasks{ + MissingCardTime: req.MissingCardTime, + Applicant: req.Applicant, + ProjectId: req.ProjectId, + TaskType: req.TaskType, + OrderId: req.OrderId, + UserId: req.UserId, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sTodoTasks) Edit(ctx context.Context, req *system.TodoTasksEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.TodoTasks.Ctx(ctx).WherePri(req.Id).Update(do.TodoTasks{ + MissingCardTime: req.MissingCardTime, + Applicant: req.Applicant, + ProjectId: req.ProjectId, + TaskType: req.TaskType, + OrderId: req.OrderId, + UserId: req.UserId, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sTodoTasks) Delete(ctx context.Context, ids []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.TodoTasks.Ctx(ctx).Delete(dao.TodoTasks.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/token/token.go b/internal/app/system/logic/token/token.go new file mode 100644 index 0000000..9f65d33 --- /dev/null +++ b/internal/app/system/logic/token/token.go @@ -0,0 +1,51 @@ +/* +* @desc:token功能 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/9/27 17:01 + */ + +package token + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gctx" + "github.com/tiger1103/gfast-token/gftoken" + "github.com/tiger1103/gfast/v3/internal/app/common/consts" + commonModel "github.com/tiger1103/gfast/v3/internal/app/common/model" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +type sToken struct { + *gftoken.GfToken +} + +func New() *sToken { + var ( + ctx = gctx.New() + opt *commonModel.TokenOptions + err = g.Cfg().MustGet(ctx, "gfToken").Struct(&opt) + fun gftoken.OptionFunc + ) + liberr.ErrIsNil(ctx, err) + if opt.CacheModel == consts.CacheModelRedis { + fun = gftoken.WithGRedis() + } else { + fun = gftoken.WithGCache() + } + return &sToken{ + GfToken: gftoken.NewGfToken( + gftoken.WithCacheKey(opt.CacheKey), + gftoken.WithTimeout(opt.Timeout), + gftoken.WithMaxRefresh(opt.MaxRefresh), + gftoken.WithMultiLogin(opt.MultiLogin), + gftoken.WithExcludePaths(opt.ExcludePaths), + fun, + ), + } +} + +func init() { + service.RegisterGToken(New()) +} diff --git a/internal/app/system/logic/toolsGenTable/tools_gen_table.go b/internal/app/system/logic/toolsGenTable/tools_gen_table.go new file mode 100644 index 0000000..60569ce --- /dev/null +++ b/internal/app/system/logic/toolsGenTable/tools_gen_table.go @@ -0,0 +1,1264 @@ +/* +* @desc:代码生成表数据处理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/10/26 17:00 + */ + +package toolsGenTable + +import ( + "bufio" + "context" + "database/sql" + "fmt" + "github.com/gogf/gf/v2/container/gmap" + "github.com/gogf/gf/v2/container/gset" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/encoding/gjson" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gfile" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/os/gview" + "github.com/gogf/gf/v2/text/gregex" + "github.com/gogf/gf/v2/text/gstr" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + commonService "github.com/tiger1103/gfast/v3/internal/app/common/service" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "io" + "os" + "reflect" + "sort" + "strings" +) + +func init() { + service.RegisterToolsGenTable(New()) +} + +func New() *sToolsGenTable { + return new(sToolsGenTable) +} + +type sToolsGenTable struct{} + +// List 代码生成页面数据列表 +func (s *sToolsGenTable) List(ctx context.Context, req *system.ToolsGenTableSearchReq) (res *system.ToolsGenTableSearchRes, err error) { + res = new(system.ToolsGenTableSearchRes) + m := dao.ToolsGenTable.Ctx(ctx) + if req != nil { + if req.TableName != "" { + m = m.Where(dao.ToolsGenTable.Columns().TableName+" like ?", "%"+req.TableName+"%") + } + if req.TableComment != "" { + m = m.Where(dao.ToolsGenTable.Columns().TableComment+"like ?", "%"+req.TableComment+"%") + } + if len(req.DateRange) > 0 { + m = m.Where(dao.ToolsGenTable.Columns().CreateTime+" >=? AND "+dao.ToolsGenTable.Columns().CreateTime+" <=?", req.DateRange[0], req.DateRange[1]) + } + err = g.Try(ctx, func(ctx context.Context) { + res.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + err = m.Page(req.PageNum, req.PageSize).Order(dao.ToolsGenTable.Columns().TableId + " asc").Scan(&res.List) + liberr.ErrIsNil(ctx, err, "获取数据失败") + }) + } + return +} + +// SelectDbTableList 查询据库表 +func (s *sToolsGenTable) SelectDbTableList(ctx context.Context, req *system.ToolsGenTableImportSearchReq) (res *system.ToolsGenTableSearchRes, err error) { + res = new(system.ToolsGenTableSearchRes) + db := g.DB() + err = g.Try(ctx, func(ctx context.Context) { + if s.getDbDriver() != "mysql" { + liberr.ErrIsNil(ctx, gerror.New("代码生成暂时只支持mysql数据库")) + } + sql := " from information_schema.tables where table_schema = (select database())" + + " and table_name NOT LIKE 'qrtz_%' AND table_name NOT LIKE 'gen_%' and table_name NOT IN (select table_name from " + dao.ToolsGenTable.Table() + ") " + if req != nil { + if req.TableName != "" { + sql += gdb.FormatSqlWithArgs(" and lower(table_name) like lower(?)", []interface{}{"%" + req.TableName + "%"}) + } + + if req.TableComment != "" { + sql += gdb.FormatSqlWithArgs(" and lower(table_comment) like lower(?)", []interface{}{"%" + req.TableComment + "%"}) + } + if len(req.DateRange) > 0 { + sql += gdb.FormatSqlWithArgs(" and date_format(create_time,'%y%m%d') >= date_format(?,'%y%m%d') ", []interface{}{req.DateRange[0]}) + sql += gdb.FormatSqlWithArgs(" and date_format(create_time,'%y%m%d') <= date_format(?,'%y%m%d') ", []interface{}{req.DateRange[1]}) + } + } + countSql := "select count(1) " + sql + res.Total, err = db.GetCount(ctx, countSql) + liberr.ErrIsNil(ctx, err, "读取总表数失败") + sql = "table_name, table_comment, create_time, update_time " + sql + if req.PageNum == 0 { + req.PageNum = 1 + } + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + page := (req.PageNum - 1) * req.PageSize + sql += " order by create_time desc,table_name asc limit " + gconv.String(page) + "," + gconv.String(req.PageSize) + err = db.GetScan(ctx, &res.List, "select "+sql) + liberr.ErrIsNil(ctx, err, "读取数据失败") + }) + return +} + +// SelectDbTableListByNames 查询数据库中对应的表数据 +func (s *sToolsGenTable) SelectDbTableListByNames(ctx context.Context, tableNames []string) ([]*entity.ToolsGenTable, error) { + err := g.Try(ctx, func(ctx context.Context) { + if s.getDbDriver() != "mysql" { + liberr.ErrIsNil(ctx, gerror.New("代码生成只支持mysql数据库")) + } + }) + db := g.DB() + sql := "select * from information_schema.tables where table_name NOT LIKE 'qrtz_%' and table_name NOT LIKE 'gen_%' " + + " and table_schema = (select database()) " + if len(tableNames) > 0 { + in := gstr.TrimRight(gstr.Repeat("?,", len(tableNames)), ",") + sql += " and " + gdb.FormatSqlWithArgs("table_name in ("+in+")", gconv.SliceAny(tableNames)) + } + var result []*entity.ToolsGenTable + err = db.GetScan(ctx, &result, sql) + liberr.ErrIsNil(ctx, err, "获取表格信息失败") + return result, err +} + +// ImportGenTable 导入表结构 +func (s *sToolsGenTable) ImportGenTable(ctx context.Context, tableList []*entity.ToolsGenTable) error { + if tableList != nil { + err := g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err := g.Try(ctx, func(ctx context.Context) { + for _, table := range tableList { + tableName := table.TableName + // 保存列信息 + genTableColumns, err := service.ToolsGenTableColumn().SelectDbTableColumnsByName(ctx, tableName) + liberr.ErrIsNil(ctx, err, "获取列数据失败") + if len(genTableColumns) <= 0 { + liberr.ErrIsNil(ctx, gerror.New("获取列数据失败")) + } + err = s.InitTable(ctx, table, genTableColumns) + liberr.ErrIsNil(ctx, err) + result, err1 := tx.Model(dao.ToolsGenTable.Table()).Insert(table) + liberr.ErrIsNil(ctx, err1) + tmpId, err2 := result.LastInsertId() + liberr.ErrIsNil(ctx, err2, "保存数据失败") + if tmpId <= 0 { + liberr.ErrIsNil(ctx, gerror.New("保存数据失败")) + } + table.TableId = tmpId + for _, column := range genTableColumns { + service.ToolsGenTableColumn().InitColumnField(column, table) + _, err3 := tx.Model(dao.ToolsGenTableColumn.Table()).Insert(column) + liberr.ErrIsNil(ctx, err3, "保存列数据失败") + } + } + }) + return err + }) + return err + } else { + return gerror.New("参数错误") + } +} + +// InitTable 初始化表信息 +func (s *sToolsGenTable) InitTable(ctx context.Context, table *entity.ToolsGenTable, columns []*entity.ToolsGenTableColumn) error { + table.ClassName = s.ConvertClassName(ctx, table.TableName) + table.PackageName = g.Cfg().MustGet(ctx, "gen.packageName").String() + table.ModuleName = g.Cfg().MustGet(ctx, "gen.moduleName").String() + table.BusinessName = s.GetBusinessName(ctx, table.TableName) + table.FunctionName = strings.ReplaceAll(table.TableComment, "表", "") + table.FunctionAuthor = g.Cfg().MustGet(ctx, "gen.author").String() + table.TplCategory = "crud" + pkColumn, err := s.getPkColumn(columns) + if err != nil { + return err + } + table.Overwrite = false + table.SortColumn = pkColumn.ColumnName + table.SortType = "asc" + table.ShowDetail = false + table.CreateTime = gtime.Now() + table.UpdateTime = table.CreateTime + return nil +} + +// ConvertClassName 表名转换成类名 +func (s *sToolsGenTable) ConvertClassName(ctx context.Context, tableName string) string { + return gstr.CaseCamel(s.removeTablePrefix(ctx, tableName)) +} + +// GetBusinessName 获取业务名 +func (s *sToolsGenTable) GetBusinessName(ctx context.Context, tableName string) string { + return s.removeTablePrefix(ctx, tableName) +} + +// 找到主键 column +func (s *sToolsGenTable) getPkColumn(columns []*entity.ToolsGenTableColumn) (*entity.ToolsGenTableColumn, error) { + for _, column := range columns { + if column.IsPk { + return column, nil + } + } + return nil, gerror.New("无法找到主键") +} + +// 删除表前缀 +func (s *sToolsGenTable) removeTablePrefix(ctx context.Context, tableName string) string { + autoRemovePre := g.Cfg().MustGet(ctx, "gen.autoRemovePre").Bool() + tablePrefix := g.Cfg().MustGet(ctx, "gen.tablePrefix").String() + if autoRemovePre && tablePrefix != "" { + searchList := strings.Split(tablePrefix, ",") + for _, str := range searchList { + if strings.HasPrefix(tableName, str) { + tableName = strings.Replace(tableName, str, "", 1) //注意,只替换一次 + } + } + } + return tableName +} + +// 获取数据库驱动类型 +func (s *sToolsGenTable) getDbDriver() string { + config := g.DB().GetConfig() + return gstr.ToLower(config.Type) +} + +// DeleteTable 删除表信息 +func (s *sToolsGenTable) DeleteTable(ctx context.Context, req *system.ToolsGenTableDeleteReq) error { + err := g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err := g.Try(ctx, func(ctx context.Context) { + _, err := tx.Model(dao.ToolsGenTable.Table()).Where(dao.ToolsGenTable.Columns().TableId+" in(?)", req.Ids).Delete() + liberr.ErrIsNil(ctx, err, "删除表格数据失败") + _, err = tx.Model(dao.ToolsGenTableColumn.Table()).Where(dao.ToolsGenTableColumn.Columns().TableId+" in(?)", req.Ids).Delete() + liberr.ErrIsNil(ctx, err, "删除表格字段数据失败") + }) + return err + }) + return err +} + +// ColumnList 表格字段列表数据 +func (s *sToolsGenTable) ColumnList(ctx context.Context, req *system.ToolsGenTableEditReq) (res *system.ToolsGenTableEditRes, err error) { + res = new(system.ToolsGenTableEditRes) + err = g.Try(ctx, func(ctx context.Context) { + var ( + tableInfo *entity.ToolsGenTable + ) + res.List, err = service.ToolsGenTableColumn().SelectGenTableColumnListByTableId(ctx, req.TableId) + liberr.ErrIsNil(ctx, err) + tableInfo, err = s.GetTableInfoByTableId(ctx, req.TableId) + liberr.ErrIsNil(ctx, err) + if tableInfo == nil { + liberr.ErrIsNil(ctx, gerror.New("表数据不存在")) + } + res.Info = &model.ToolsGenTableEditData{ + ToolsGenTable: tableInfo, + } + //如果是树表则设置树表配置 + if tableInfo != nil && tableInfo.TplCategory == "tree" { + options := gjson.New(tableInfo.Options) + res.Info.TreeCode = options.Get("treeCode") + res.Info.TreeParentCode = options.Get("treeParentCode") + res.Info.TreeName = options.Get("treeName") + } + }) + return +} + +// GetTableInfoByTableId 获取表格数据 +func (s *sToolsGenTable) GetTableInfoByTableId(ctx context.Context, tableId int64) (data *entity.ToolsGenTable, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.ToolsGenTable.Ctx(ctx).WherePri(tableId).Scan(&data) + liberr.ErrIsNil(ctx, err, "获取表格信息出错") + }) + return +} + +// GetRelationTable 获取关联表数据 +func (s *sToolsGenTable) GetRelationTable(ctx context.Context) (res []*model.ToolsGenTableColumnsData, err error) { + var tableColumnsAll []*entity.ToolsGenTableColumn + err = g.Try(ctx, func(ctx context.Context) { + //获取表数据 + err = dao.ToolsGenTable.Ctx(ctx).Order(dao.ToolsGenTable.Columns().TableId + " ASC ").Scan(&res) + liberr.ErrIsNil(ctx, err, "获取表数据失败") + //获取表字段数据 + tableColumnsAll, err = service.ToolsGenTableColumn().GetAllTableColumns(ctx) + liberr.ErrIsNil(ctx, err) + for k, v := range res { + for _, cv := range tableColumnsAll { + if cv.TableId == v.TableId { + res[k].Columns = append(res[k].Columns, cv) + } + } + } + }) + return +} + +// SaveEdit 更新表及字段生成信息 +func (s *sToolsGenTable) SaveEdit(ctx context.Context, req *system.ToolsGenTableColumnsEditReq) (err error) { + if req == nil { + err = gerror.New("参数错误") + return + } + var table *entity.ToolsGenTable + err = dao.ToolsGenTable.Ctx(ctx).Where("table_id=?", req.TableId).Scan(&table) + if err != nil || table == nil { + err = gerror.New("数据不存在") + return + } + if req.TableName != "" { + table.TableName = req.TableName + } + if req.TableComment != "" { + table.TableComment = req.TableComment + } + if req.BusinessName != "" { + table.BusinessName = req.BusinessName + } + if req.ClassName != "" { + table.ClassName = req.ClassName + } + if req.FunctionAuthor != "" { + table.FunctionAuthor = req.FunctionAuthor + } + if req.FunctionName != "" { + table.FunctionName = req.FunctionName + } + if req.ModuleName != "" { + table.ModuleName = req.ModuleName + } + if req.PackageName != "" { + table.PackageName = req.PackageName + } + if req.Remark != "" { + table.Remark = req.Remark + } + if req.Overwrite != "" { + table.Overwrite = gconv.Bool(req.Overwrite) + } + if req.SortColumn != "" { + table.SortColumn = req.SortColumn + } + if req.SortType != "" { + table.SortType = req.SortType + } + if req.ShowDetail != "" { + table.ShowDetail = gconv.Bool(req.ShowDetail) + } + if req.TplCategory != "" { + table.TplCategory = req.TplCategory + } + if req.Params != "" { + table.Options = req.Params + } + table.UpdateTime = gtime.Now() + var options g.Map + if req.TplCategory == "tree" { + //树表设置options + options = g.Map{ + "treeCode": req.TreeCode, + "treeParentCode": req.TreeParentCode, + "treeName": req.TreeName, + } + table.Options = gconv.String(options) + } else { + table.Options = "" + } + + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = tx.Model(dao.ToolsGenTable.Table()).Save(table) + liberr.ErrIsNil(ctx, err, "保存表数据失败") + //保存列数据 + if req.Columns != nil { + for _, column := range req.Columns { + if column.ColumnId > 0 { + var dbColumn *entity.ToolsGenTableColumn + err = dao.ToolsGenTableColumn.Ctx(ctx).Where("column_id=?", column.ColumnId).Scan(&dbColumn) + liberr.ErrIsNil(ctx, err, "列数据信息不存在") + if dbColumn != nil { + dbColumn.ColumnComment = column.ColumnComment + dbColumn.GoType = column.GoType + dbColumn.HtmlType = column.HtmlType + dbColumn.HtmlField = column.HtmlField + dbColumn.QueryType = column.QueryType + dbColumn.GoField = column.GoField + dbColumn.DictType = column.DictType + dbColumn.IsInsert = column.IsInsert + dbColumn.IsEdit = column.IsEdit + dbColumn.IsList = column.IsList + dbColumn.IsDetail = column.IsDetail + dbColumn.IsQuery = column.IsQuery + dbColumn.SortOrderEdit = column.SortOrderEdit + dbColumn.SortOrderList = column.SortOrderList + dbColumn.SortOrderDetail = column.SortOrderDetail + dbColumn.SortOrderQuery = column.SortOrderQuery + dbColumn.IsRequired = column.IsRequired + dbColumn.ColSpan = column.ColSpan + dbColumn.RowSpan = column.RowSpan + dbColumn.IsRowStart = column.IsRowStart + dbColumn.MinWidth = column.MinWidth + dbColumn.IsFixed = column.IsFixed + dbColumn.IsOverflowTooltip = column.IsOverflowTooltip + dbColumn.IsCascade = column.IsCascade + dbColumn.ParentColumnName = column.ParentColumnName + dbColumn.CascadeColumnName = column.CascadeColumnName + dbColumn.TsType = column.TsType + if tc, e := options["treeParentCode"]; options != nil && e && tc != "" && tc == dbColumn.HtmlField { + dbColumn.IsQuery = false + dbColumn.IsList = false + dbColumn.HtmlType = "select" + } + //获取字段关联表信息 + if column.LinkLabelName != "" { + dbColumn.LinkTableName = column.LinkTableName + dbColumn.LinkLabelId = column.LinkLabelId + dbColumn.LinkLabelName = column.LinkLabelName + var linkTable *entity.ToolsGenTable + err = dao.ToolsGenTable.Ctx(ctx).Where("table_name =?", column.LinkTableName).Scan(&linkTable) + liberr.ErrIsNil(ctx, err, "获取关联表数据失败") + dbColumn.LinkTableClass = linkTable.ClassName + dbColumn.LinkTableModuleName = linkTable.ModuleName + dbColumn.LinkTableBusinessName = linkTable.BusinessName + dbColumn.LinkTablePackage = linkTable.PackageName + } else { + dbColumn.LinkTableName = "" + dbColumn.LinkTableClass = "" + dbColumn.LinkTableModuleName = "" + dbColumn.LinkTableBusinessName = "" + dbColumn.LinkTablePackage = "" + dbColumn.LinkLabelId = "" + dbColumn.LinkLabelName = "" + } + _, err = tx.Model(dao.ToolsGenTableColumn.Table()).Save(dbColumn) + liberr.ErrIsNil(ctx, err, "保存列:"+dbColumn.ColumnName+",数据失败") + } + } + } + } + }) + return + }) + return +} + +// GenData 获取生成数据 +func (s *sToolsGenTable) GenData(ctx context.Context, tableId int64) (data g.MapStrStr, extendData *model.ToolsGenTableEx, err error) { + extendData, err = s.SelectRecordById(ctx, tableId) + if err != nil { + return + } + if extendData == nil { + err = gerror.New("表格数据不存在") + return + } + service.ToolsGenTableColumn().SetPkColumn(extendData, extendData.Columns) + view := gview.New() + view.SetConfigWithMap(g.Map{ + "Paths": g.Cfg().MustGet(ctx, "gen.templatePath").String(), + "Delimiters": []string{"{{", "}}"}, + }) + view.BindFuncMap(g.Map{ + "UcFirst": func(str string) string { + return gstr.UcFirst(str) + }, + "Sum": func(a, b int) int { + return a + b + }, + "CaseCamelLower": gstr.CaseCamelLower, //首字母小写驼峰 + "CaseCamel": gstr.CaseCamel, //首字母大写驼峰 + "HasSuffix": gstr.HasSuffix, //是否存在后缀 + "ContainsI": gstr.ContainsI, //是否包含子字符串 + "VueTag": func(t string) string { + return t + }, + "inArray": func(arr []interface{}, val interface{}) bool { + for _, v := range arr { + if reflect.DeepEqual(v, val) { + return true + } + } + return false + }, + "append": func(arr []interface{}, val ...interface{}) []interface{} { + arr = append(arr, val...) + return arr + }, + "newArray": func() []interface{} { + return []interface{}{} + }, + }) + + //树形菜单选项 + tplData := g.Map{ + "table": extendData, + "goModName": g.Cfg().MustGet(ctx, "gen.goModName").String(), + "apiVersion": g.Cfg().MustGet(ctx, "gen.apiName").String(), + } + apiKey := "api" + apiValue := "" + var tmpApi string + if tmpApi, err = view.Parse(ctx, "go/api.template", tplData); err == nil { + apiValue = tmpApi + apiValue, err = s.trimBreak(apiValue) + } else { + return + } + daoKey := "dao" + daoValue := "" + var tmpDao string + if tmpDao, err = view.Parse(ctx, "go/dao.template", tplData); err == nil { + daoValue = tmpDao + daoValue, err = s.trimBreak(daoValue) + } else { + return + } + daoInternalKey := "dao_internal" + daoInternalValue := "" + var tmpInternalDao string + if tmpInternalDao, err = view.Parse(ctx, "go/dao_internal.template", tplData); err == nil { + daoInternalValue = tmpInternalDao + daoInternalValue, err = s.trimBreak(daoInternalValue) + } else { + return + } + modelKey := "model" + modelValue := "" + var tmpModel string + if tmpModel, err = view.Parse(ctx, "go/model.template", tplData); err == nil { + modelValue = tmpModel + modelValue, err = s.trimBreak(modelValue) + } else { + return + } + modelEntityKey := "model_entity" + modelEntityValue := "" + var tmpModelEntity string + if tmpModelEntity, err = view.Parse(ctx, "go/model_entity.template", tplData); err == nil { + modelEntityValue = tmpModelEntity + modelEntityValue, err = s.trimBreak(modelEntityValue) + } else { + return + } + modelDoKey := "model_do" + modelDoValue := "" + var tmpModelDo string + if tmpModelDo, err = view.Parse(ctx, "go/model_do.template", tplData); err == nil { + modelDoValue = tmpModelDo + modelDoValue, err = s.trimBreak(modelDoValue) + } else { + return + } + controllerKey := "controller" + controllerValue := "" + var tmpController string + if tmpController, err = view.Parse(ctx, "go/controller.template", tplData); err == nil { + controllerValue = tmpController + controllerValue, err = s.trimBreak(controllerValue) + } else { + return + } + + serviceKey := "service" + serviceValue := "" + var tmpService string + if tmpService, err = view.Parse(ctx, "go/service.template", tplData); err == nil { + serviceValue = tmpService + serviceValue, err = s.trimBreak(serviceValue) + } else { + return + } + + logicKey := "logic" + logicValue := "" + var tmpLogic string + if tmpLogic, err = view.Parse(ctx, "go/logic.template", tplData); err == nil { + logicValue = tmpLogic + logicValue, err = s.trimBreak(logicValue) + } else { + return + } + + routerKey := "router" + routerValue := "" + var tmpRouter string + if tmpRouter, err = view.Parse(ctx, "go/router.template", tplData); err == nil { + routerValue = tmpRouter + routerValue, err = s.trimBreak(routerValue) + } else { + return + } + + routerFuncKey := "router_func" + routerFuncValue := "" + var tmpRouterFunc string + if tmpRouterFunc, err = view.Parse(ctx, "go/router_func.template", tplData); err == nil { + routerFuncValue = tmpRouterFunc + routerFuncValue, err = s.trimBreak(routerFuncValue) + } else { + return + } + + sqlKey := "sql" + sqlValue := "" + var tmpSql string + if tmpSql, err = view.Parse(ctx, "sql/sql.template", tplData); err == nil { + sqlValue = tmpSql + sqlValue, err = s.trimBreak(sqlValue) + } else { + return + } + + tsApiKey := "tsApi" + tsApiValue := "" + var tmpTsApi string + if tmpTsApi, err = view.Parse(ctx, "ts/api.template", tplData); err == nil { + tsApiValue = tmpTsApi + tsApiValue, err = s.trimBreak(tsApiValue) + } else { + return + } + + tsModelKey := "tsModel" + tsModelValue := "" + var tmpTsModel string + if tmpTsModel, err = view.Parse(ctx, "ts/model.template", tplData); err == nil { + tsModelValue = tmpTsModel + tsModelValue, err = s.trimBreak(tsModelValue) + } else { + return + } + + vueKey := "vue" + vueValue := "" + var tmpVue string + tmpFile := "vue/list-vue.template" + if extendData.TplCategory == "tree" { + //树表 + tmpFile = "vue/tree-vue.template" + } + if tmpVue, err = view.Parse(ctx, tmpFile, tplData); err == nil { + vueValue = tmpVue + vueValue, err = s.trimBreak(vueValue) + } else { + return + } + + vueAddKey := "vueAdd" + vueAddValue := "" + var tmpVueAddModel string + if tmpVueAddModel, err = view.Parse(ctx, "vue/add-vue.template", tplData); err == nil { + vueAddValue = tmpVueAddModel + vueAddValue, err = s.trimBreak(vueAddValue) + } else { + return + } + + vueEditKey := "vueEdit" + vueEditValue := "" + var tmpVueEditModel string + if tmpVueEditModel, err = view.Parse(ctx, "vue/edit-vue.template", tplData); err == nil { + vueEditValue = tmpVueEditModel + vueEditValue, err = s.trimBreak(vueEditValue) + } else { + return + } + + vueDetailKey := "vueDetail" + vueDetailValue := "" + var tmpVueDetailModel string + if tmpVueDetailModel, err = view.Parse(ctx, "vue/detail-vue.template", tplData); err == nil { + vueDetailValue = tmpVueDetailModel + vueDetailValue, err = s.trimBreak(vueDetailValue) + } else { + return + } + + data = g.MapStrStr{ + apiKey: apiValue, + daoKey: daoValue, + daoInternalKey: daoInternalValue, + modelKey: modelValue, + modelEntityKey: modelEntityValue, + modelDoKey: modelDoValue, + controllerKey: controllerValue, + serviceKey: serviceValue, + logicKey: logicValue, + routerKey: routerValue, + routerFuncKey: routerFuncValue, + sqlKey: sqlValue, + tsApiKey: tsApiValue, + tsModelKey: tsModelValue, + vueKey: vueValue, + vueAddKey: vueAddValue, + vueEditKey: vueEditValue, + vueDetailKey: vueDetailValue, + } + return +} + +func (s *sToolsGenTable) SelectRecordById(ctx context.Context, tableId int64) (tableEx *model.ToolsGenTableEx, err error) { + var table *entity.ToolsGenTable + table, err = s.GetTableInfoByTableId(ctx, tableId) + if err != nil { + return + } + m := gconv.Map(table) + gconv.Struct(m, &tableEx) + if tableEx.TplCategory == "tree" { + opt := gjson.New(tableEx.Options) + tableEx.TreeParentCode = opt.Get("treeParentCode").String() + tableEx.TreeCode = opt.Get("treeCode").String() + tableEx.TreeName = opt.Get("treeName").String() + } + //表字段数据 + var columns []*entity.ToolsGenTableColumn + columns, err = service.ToolsGenTableColumn().SelectGenTableColumnListByTableId(ctx, tableId) + if err != nil { + return + } + for _, column := range columns { + if column.GoType == "Time" { + tableEx.HasTimeColumn = true + continue + } + } + + allColumnExs := make([]*model.ToolsGenTableColumnEx, len(columns)) + + var ( + insertColumns []*model.ToolsGenTableColumnEx + editColumns []*model.ToolsGenTableColumnEx + listColumns []*model.ToolsGenTableColumnEx + detailColumns []*model.ToolsGenTableColumnEx + queryColumns []*model.ToolsGenTableColumnEx + ) + + columnMap := make(map[string]*model.ToolsGenTableColumnEx, len(columns)) + for i, column := range columns { + columnName := column.ColumnName + columnEx := &model.ToolsGenTableColumnEx{} + m1 := gconv.Map(column) + err = gconv.Struct(m1, columnEx) + columnMap[columnName] = columnEx + allColumnExs[i] = columnEx + tableEx.IsPkInsertable = tableEx.IsPkInsertable || column.IsPk && !column.IsIncrement + tableEx.IsPkListable = tableEx.IsPkListable || column.IsPk && column.IsList + if column.IsInsert && !service.ToolsGenTableColumn().IsNotEdit(columnName) && !column.IsPk { + insertColumns = append(insertColumns, columnEx) + columnEx.IsInsert = true + } else { + columnEx.IsInsert = false + } + if column.IsEdit && !service.ToolsGenTableColumn().IsNotEdit(columnName) && !column.IsPk { + editColumns = append(editColumns, columnEx) + columnEx.IsEdit = true + } else { + columnEx.IsEdit = false + } + if column.IsList && !service.ToolsGenTableColumn().IsNotList(columnName) { + listColumns = append(listColumns, columnEx) + columnEx.IsList = true + } else { + columnEx.IsList = false + } + if column.IsDetail && !service.ToolsGenTableColumn().IsNotDetail(columnName) { + detailColumns = append(detailColumns, columnEx) + columnEx.IsDetail = true + } else { + columnEx.IsDetail = false + } + if column.IsQuery && !service.ToolsGenTableColumn().IsNotQuery(columnName) { + queryColumns = append(queryColumns, columnEx) + columnEx.IsQuery = true + } else { + columnEx.IsQuery = false + } + // validation 规则 和 conversion 方法 + integerValidationRule := "integer" + floatValidationRule := "float" + dateValidationRule := "date" + datetimeValidationRule := "datetime" + if column.QueryType == "BETWEEN" { + integerValidationRule += "-array" + floatValidationRule += "-array" + dateValidationRule += "-array" + datetimeValidationRule += "-array" + } + if column.IsPk { + //主键不处理 + continue + } + switch column.GoType { + case "byte": + columnEx.FieldValidation = gstr.CaseCamelLower(columnName) + "@" + integerValidationRule + "|max-length:1#" + column.ColumnComment + "需为整数" + columnEx.FieldConversion = "gconv.Uint64" + tableEx.HasConversion = true + break + case "int": + columnEx.FieldValidation = gstr.CaseCamelLower(columnName) + "@" + integerValidationRule + "#" + column.ColumnComment + "需为整数" + columnEx.FieldConversion = "gconv.Int" + tableEx.HasConversion = true + break + case "int64": + columnEx.FieldValidation = gstr.CaseCamelLower(columnName) + "@" + integerValidationRule + "#" + column.ColumnComment + "需为整数" + columnEx.FieldConversion = "gconv.Int64" + tableEx.HasConversion = true + break + case "uint": + columnEx.FieldValidation = gstr.CaseCamelLower(columnName) + "@" + integerValidationRule + "#" + column.ColumnComment + "需为整数" + columnEx.FieldConversion = "gconv.Uint" + tableEx.HasConversion = true + break + case "uint64": + columnEx.FieldValidation = gstr.CaseCamelLower(columnName) + "@" + integerValidationRule + "#" + column.ColumnComment + "需为整数" + columnEx.FieldConversion = "gconv.Uint64" + tableEx.HasConversion = true + break + case "float": + columnEx.FieldValidation = gstr.CaseCamelLower(columnName) + "@" + floatValidationRule + "#" + column.ColumnComment + "需为浮点数" + columnEx.FieldConversion = "gconv.Float" + tableEx.HasConversion = true + break + case "float64": + columnEx.FieldValidation = gstr.CaseCamelLower(columnName) + "@" + floatValidationRule + "#" + column.ColumnComment + "需为浮点数" + columnEx.FieldConversion = "gconv.Float64" + tableEx.HasConversion = true + break + case "bool": + columnEx.FieldValidation = gstr.CaseCamelLower(columnName) + "@boolean#" + column.ColumnComment + "需为true/false" + columnEx.FieldConversion = "gconv.Bool" + tableEx.HasConversion = true + break + case "date": + columnEx.FieldValidation = gstr.CaseCamelLower(columnName) + "@" + dateValidationRule + "#" + column.ColumnComment + "需为YYYY-MM-DD格式" + columnEx.FieldConversion = "gconv.Time" + tableEx.HasConversion = true + break + case "Time": + columnEx.FieldValidation = gstr.CaseCamelLower(columnName) + "@" + datetimeValidationRule + "#" + column.ColumnComment + "需为YYYY-MM-DD hh:mm:ss格式" + columnEx.FieldConversion = "gconv.Time" + tableEx.HasConversion = true + break + } + } + sort.Slice(insertColumns, func(i, j int) bool { + return insertColumns[i].SortOrderEdit < insertColumns[j].SortOrderEdit + }) + sort.Slice(editColumns, func(i, j int) bool { + return editColumns[i].SortOrderEdit < editColumns[j].SortOrderEdit + }) + sort.Slice(listColumns, func(i, j int) bool { + return listColumns[i].SortOrderList < listColumns[j].SortOrderList + }) + sort.Slice(detailColumns, func(i, j int) bool { + return detailColumns[i].SortOrderDetail < detailColumns[j].SortOrderDetail + }) + sort.Slice(queryColumns, func(i, j int) bool { + return queryColumns[i].SortOrderQuery < queryColumns[j].SortOrderQuery + }) + + tableEx.Columns = allColumnExs + tableEx.InsertColumns = insertColumns + tableEx.EditColumns = editColumns + tableEx.DetailColumns = detailColumns + tableEx.ListColumns = listColumns + tableEx.QueryColumns = queryColumns + + _, hasCreatedBy := columnMap["created_by"] + tableEx.HasCreatedBy = hasCreatedBy + _, hasUpdateBy := columnMap["updated_by"] + tableEx.HasUpdatedBy = hasUpdateBy + + for _, column := range allColumnExs { + if column.IsCascade { + parentColumnName := column.ParentColumnName + if g.IsEmpty(parentColumnName) { + err = gerror.New("级联查询字段\"" + column.ColumnName + "\"并未设置parentColumnName") + return nil, err + } + parent := columnMap[parentColumnName] + if g.IsEmpty(parent) { + err = gerror.New("级联查询字段\"" + column.ColumnName + "\"的parentColumnName\"" + parentColumnName + "\"不存在于表中") + return nil, err + } + column.ParentColumnName = parentColumnName + column.CascadeParent = parent + parent.IsCascadeParent = true + parent.CascadeChildrenColumns = gset.NewStrSet() + } + } + for _, column := range allColumnExs { + if column.IsCascade { + child := column + for { + parentColumnName := child.ParentColumnName + if g.IsEmpty(parentColumnName) { + break + } + parent := columnMap[parentColumnName] + parent.CascadeChildrenColumns.Add(column.ColumnName) + child = parent + } + } + } + + // 提取关联表信息 + var linkedTableMap = gmap.New() + for _, column := range allColumnExs { + if len(column.LinkTableName) == 0 { + continue + } + linkedTableName := column.LinkTableName + // 关联表信息 + linkedTableInfo, err1 := s.getLinkedTableInfo(ctx, linkedTableName) + if err1 != nil { + err = err1 + return + } + linkedTable := linkedTableMap.GetOrSet(linkedTableName, interface{}(linkedTableInfo)).(*model.ToolsGenTableLinked) + + allColumnMap, err2 := service.ToolsGenTableColumn().SelectDbTableColumnMapByName(ctx, linkedTableName) + if err2 != nil { + err = err2 + return + } + // 关联字段 + linkedTableIdColumn, foundId := allColumnMap[column.LinkLabelId] + if !foundId { + err = gerror.New("无法找到关联表的列" + column.LinkLabelId) + return + } + linkedTableValueColumn, foundValue := allColumnMap[column.LinkLabelName] + if !foundValue { + err = gerror.New("无法找到关联表的列" + column.LinkLabelId) + return + } + service.ToolsGenTableColumn().InitColumnField(linkedTableIdColumn, table) + service.ToolsGenTableColumn().InitColumnField(linkedTableValueColumn, table) + if linkedTableIdColumn.GoType == "Time" || linkedTableValueColumn.GoType == "Time" { + tableEx.HasTimeColumn = true + } + linkedTable.RefColumns.GetOrSet(linkedTableIdColumn.ColumnName, linkedTableIdColumn) + linkedTable.RefColumns.GetOrSet(linkedTableValueColumn.ColumnName, &linkedTableValueColumn) + } + + tableEx.LinkedTables = make([]*model.ToolsGenTableLinked, linkedTableMap.Size()) + for i, v := range linkedTableMap.Values() { + tableEx.LinkedTables[i] = v.(*model.ToolsGenTableLinked) + } + return +} + +// GenCode 代码生成操作 +func (s *sToolsGenTable) GenCode(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //获取当前运行时目录 + curDir, err := os.Getwd() + liberr.ErrIsNil(ctx, err, "获取本地路径失败") + frontDir := g.Cfg().MustGet(ctx, "gen.frontDir").String() + if !gfile.IsDir(frontDir) { + panic("项目前端路径不存在,请检查是否已在配置文件中配置!") + } + apiName := g.Cfg().MustGet(ctx, "gen.apiName").String() + goModName := g.Cfg().MustGet(ctx, "gen.goModName").String() + for _, id := range ids { + var genData g.MapStrStr + var extendData *model.ToolsGenTableEx + genData, extendData, err = s.GenData(ctx, gconv.Int64(id)) + liberr.ErrIsNil(ctx, err) + packageName := extendData.PackageName + pluginName := "" + if gstr.ContainsI(extendData.PackageName, "plugins") { + pluginName = "plugins/" + } + businessName := gstr.CaseCamelLower(extendData.BusinessName) + for key, code := range genData { + switch key { + case "api": + path := strings.Join([]string{curDir, "/", apiName, "/", pluginName, extendData.ModuleName, "/", extendData.TableName, ".go"}, "") + err = s.createFile(path, code, extendData.Overwrite) + liberr.ErrIsNil(ctx, err) + case "controller": + path := strings.Join([]string{curDir, "/", packageName, "/controller/", extendData.TableName, ".go"}, "") + err = s.createFile(path, code, extendData.Overwrite) + liberr.ErrIsNil(ctx, err) + case "dao": + path := strings.Join([]string{curDir, "/", packageName, "/dao/", extendData.TableName, ".go"}, "") + err = s.createFile(path, code, extendData.Overwrite) + liberr.ErrIsNil(ctx, err) + case "dao_internal": + path := strings.Join([]string{curDir, "/", packageName, "/dao/internal/", extendData.TableName, ".go"}, "") + err = s.createFile(path, code, extendData.Overwrite) + liberr.ErrIsNil(ctx, err) + case "logic": + path := strings.Join([]string{curDir, "/", packageName, "/logic/", businessName, "/", extendData.TableName, ".go"}, "") + err = s.createFile(path, code, extendData.Overwrite) + liberr.ErrIsNil(ctx, err) + case "model": + path := strings.Join([]string{curDir, "/", packageName, "/model/", extendData.TableName, ".go"}, "") + err = s.createFile(path, code, extendData.Overwrite) + liberr.ErrIsNil(ctx, err) + case "model_do": + path := strings.Join([]string{curDir, "/", packageName, "/model/do/", extendData.TableName, ".go"}, "") + err = s.createFile(path, code, extendData.Overwrite) + liberr.ErrIsNil(ctx, err) + case "model_entity": + path := strings.Join([]string{curDir, "/", packageName, "/model/entity/", extendData.TableName, ".go"}, "") + err = s.createFile(path, code, extendData.Overwrite) + liberr.ErrIsNil(ctx, err) + case "router": + if !gstr.ContainsI(packageName, "system") { // system 模块不生成router文件 + path := strings.Join([]string{curDir, "/", packageName, "/router/router", ".go"}, "") + err = s.createFile(path, code, extendData.Overwrite) + liberr.ErrIsNil(ctx, err) + } + case "router_func": + path := strings.Join([]string{curDir, "/", packageName, "/router/", extendData.TableName, ".go"}, "") + err = s.createFile(path, code, extendData.Overwrite) + liberr.ErrIsNil(ctx, err) + case "service": + path := strings.Join([]string{curDir, "/", packageName, "/service/", extendData.TableName, ".go"}, "") + err = s.createFile(path, code, extendData.Overwrite) + liberr.ErrIsNil(ctx, err) + case "sql": + path := strings.Join([]string{curDir, "/resource/data/gen_sql/", extendData.ModuleName, "/", extendData.TableName, ".sql"}, "") + hasSql := gfile.Exists(path) + err = s.createFile(path, code, extendData.Overwrite) + liberr.ErrIsNil(ctx, err) + if !hasSql || extendData.Overwrite { + //第一次生成则向数据库写入菜单数据 + err = s.writeDb(ctx, path) + liberr.ErrIsNil(ctx, err) + //清除菜单缓存 + commonService.Cache().Remove(ctx, consts.CacheSysAuthMenu) + } + case "tsApi": + path := strings.Join([]string{frontDir, "/src/api/" + pluginName, extendData.ModuleName, "/", businessName, ".ts"}, "") + err = s.createFile(path, code, extendData.Overwrite) + liberr.ErrIsNil(ctx, err) + case "tsModel": + path := strings.Join([]string{frontDir, "/src/views/" + pluginName, extendData.ModuleName, "/", businessName + "/list/component/model", ".ts"}, "") + err = s.createFile(path, code, extendData.Overwrite) + liberr.ErrIsNil(ctx, err) + case "vue": + path := strings.Join([]string{frontDir, "/src/views/" + pluginName, extendData.ModuleName, "/", businessName, "/list/index.vue"}, "") + err = s.createFile(path, code, extendData.Overwrite) + liberr.ErrIsNil(ctx, err) + case "vueDetail": + path := strings.Join([]string{frontDir, "/src/views/" + pluginName, extendData.ModuleName, "/", businessName + "/list/component/detail", ".vue"}, "") + err = s.createFile(path, code, extendData.Overwrite) + liberr.ErrIsNil(ctx, err) + case "vueAdd": + path := strings.Join([]string{frontDir, "/src/views/" + pluginName, extendData.ModuleName, "/", businessName + "/list/component/add", ".vue"}, "") + err = s.createFile(path, code, extendData.Overwrite) + liberr.ErrIsNil(ctx, err) + case "vueEdit": + path := strings.Join([]string{frontDir, "/src/views/" + pluginName, extendData.ModuleName, "/", businessName + "/list/component/edit", ".vue"}, "") + err = s.createFile(path, code, extendData.Overwrite) + liberr.ErrIsNil(ctx, err) + } + } + //生成模块路由 + err = s.genModuleRouter(curDir, goModName, extendData.ModuleName) + liberr.ErrIsNil(ctx, err) + //生成模块boot logic + err = s.genModuleBootLogic(curDir, extendData.ModuleName) + liberr.ErrIsNil(ctx, err) + //生成对应模块的业务logic + err = s.genModuleLogic(curDir, goModName, extendData.PackageName) + liberr.ErrIsNil(ctx, err) + } + }) + return +} + +// 写入菜单数据 +func (s *sToolsGenTable) writeDb(ctx context.Context, path string) (err error) { + isAnnotation := false + var fi *os.File + fi, err = os.Open(path) + if err != nil { + return + } + defer fi.Close() + br := bufio.NewReader(fi) + var sqlStr []string + now := gtime.Now() + var res sql.Result + var id int64 + var tx gdb.TX + tx, err = g.DB().Ctx(ctx).Begin(ctx) + if err != nil { + return + } + for { + bytes, e := br.ReadBytes('\n') + if e == io.EOF { + break + } + str := gstr.Trim(string(bytes)) + + if str == "" { + continue + } + + if strings.Contains(str, "/*") { + isAnnotation = true + } + + if isAnnotation { + if strings.Contains(str, "*/") { + isAnnotation = false + } + continue + } + + if str == "" || strings.HasPrefix(str, "--") || strings.HasPrefix(str, "#") { + continue + } + if strings.HasSuffix(str, ";") { + if gstr.ContainsI(str, "select") { + if gstr.ContainsI(str, "@now") { + continue + } + if gstr.ContainsI(str, "@parentId") { + id, err = res.LastInsertId() + } + } + sqlStr = append(sqlStr, str) + sql := strings.Join(sqlStr, "") + gstr.ReplaceByArray(sql, []string{"@parentId", gconv.String(id), "@now", now.Format("Y-m-d H:i:s")}) + //插入业务 + res, err = tx.Exec(sql) + if err != nil { + tx.Rollback() + return + } + sqlStr = nil + } else { + sqlStr = []string{str} + } + } + tx.Commit() + return +} + +// createFile 创建文件 +func (s *sToolsGenTable) createFile(fileName, data string, cover bool) (err error) { + if !gfile.Exists(fileName) || cover { + var f *os.File + f, err = gfile.Create(fileName) + if err == nil { + f.WriteString(data) + } + f.Close() + } + return +} + +func (s *sToolsGenTable) getLinkedTableInfo(ctx context.Context, tableName string) (linkedTable *model.ToolsGenTableLinked, err error) { + var table *entity.ToolsGenTable + err = g.Try(ctx, func(ctx context.Context) { + err = dao.ToolsGenTable.Ctx(ctx).Where(dao.ToolsGenTable.Columns().TableName, tableName).Scan(&table) + liberr.ErrIsNil(ctx, err, "获取关联表格"+tableName+"信息出错") + m := gconv.Map(table) + err = gconv.Struct(m, &linkedTable) + liberr.ErrIsNil(ctx, err) + linkedTable.RefColumns = gmap.NewListMap() + }) + return +} + +// 剔除多余的换行 +func (s *sToolsGenTable) trimBreak(str string) (rStr string, err error) { + var b []byte + if b, err = gregex.Replace("(([\\s\t]*)\r?\n){2,}", []byte("$2\n"), []byte(str)); err != nil { + return + } + if b, err = gregex.Replace("(([\\s\t]*)/{4}\r?\n)", []byte("$2\n\n"), b); err == nil { + rStr = gconv.String(b) + } + return +} + +// GenModuleRouter 生成模块logic +func (s *sToolsGenTable) genModuleLogic(curDir, goModName, packageName string) (err error) { + var ( + packages []string + code string + ) + //logic路径 + path := strings.Join([]string{curDir, "/", packageName, "/logic"}, "") + //获取该路径下所有需要加载的包 + packages, err = gfile.ScanDirFunc(path, "*", false, func(p string) string { + if gfile.IsDir(p) { + return p + } + return "" + }) + if err != nil { + return + } + for _, v := range packages { + v = gstr.Replace(v, "\\", "/") + v = gstr.SubStr(v, gstr.PosR(v, "/")) + code += strings.Join([]string{"import _ ", `"`, goModName, "/", packageName, "/logic", v, `"`, "\n"}, "") + } + code = fmt.Sprintf(`package logic%s%s`, "\n\n", code) + err = s.createFile(path+"/logic.go", code, true) + return +} + +func (s *sToolsGenTable) genModuleRouter(curDir, goModName, moduleName string) (err error) { + path := strings.Join([]string{curDir, "/internal/router/" + moduleName + ".go"}, "") + if gfile.IsFile(path) || moduleName == "system" { + return + } + moduleNameUpper := gstr.CaseCamel(moduleName) + code := fmt.Sprintf(`package router +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + %sRouter "%s/internal/app/%s/router" +) + +func (router *Router) Bind%sModuleController(ctx context.Context, group *ghttp.RouterGroup) { + %sRouter.R.BindController(ctx, group) +}`, moduleName, goModName, moduleName, moduleNameUpper, moduleName) + err = s.createFile(path, code, true) + return +} + +func (s *sToolsGenTable) genModuleBootLogic(curDir, moduleName string) (err error) { + path := strings.Join([]string{curDir, "/internal/app/boot/" + moduleName + ".go"}, "") + if gfile.IsFile(path) || moduleName == "system" { + return + } + code := fmt.Sprintf(`package boot +import ( + _ "github.com/tiger1103/gfast/v3/internal/app/%s/logic" +) +`, moduleName) + err = s.createFile(path, code, true) + return +} diff --git a/internal/app/system/logic/toolsGenTableColumn/tools_gen_table_column.go b/internal/app/system/logic/toolsGenTableColumn/tools_gen_table_column.go new file mode 100644 index 0000000..037988a --- /dev/null +++ b/internal/app/system/logic/toolsGenTableColumn/tools_gen_table_column.go @@ -0,0 +1,369 @@ +/* +* @desc:代码生成字段处理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/10/28 10:10 + */ + +package toolsGenTableColumn + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/text/gregex" + "github.com/gogf/gf/v2/text/gstr" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "strings" +) + +func init() { + service.RegisterToolsGenTableColumn(New()) +} + +func New() *sToolsGenTableColumn { + return &sToolsGenTableColumn{ + ColumnTypeStr: []string{"char", "varchar", "narchar", "varchar2", "tinytext", "text", "mediumtext", "longtext"}, + ColumnTypeTime: []string{"datetime", "time", "date", "timestamp"}, + ColumnTypeNumber: []string{"tinyint", "smallint", "mediumint", "int", "number", "integer", "bigint", "float", "float", "double", "decimal"}, + ColumnNameNotEdit: []string{"created_by", "created_at", "updated_by", "updated_at", "deleted_at"}, + ColumnNameNotList: []string{"updated_by", "updated_at", "deleted_at"}, + ColumnNameNotDetail: []string{"updated_at", "deleted_at"}, + ColumnNameNotQuery: []string{"updated_by", "updated_at", "deleted_at", "remark"}, + } +} + +type sToolsGenTableColumn struct { + ColumnTypeStr []string //数据库字符串类型 + ColumnTypeTime []string //数据库时间类型 + ColumnTypeNumber []string //数据库数字类型 + ColumnNameNotEdit []string //页面不需要编辑字段 + ColumnNameNotList []string //页面不需要显示的列表字段 + ColumnNameNotDetail []string //页面不需要显示的详情字段 + ColumnNameNotQuery []string //页面不需要查询字段 +} + +// SelectDbTableColumnsByName 根据表名称查询列信息 +func (s *sToolsGenTableColumn) SelectDbTableColumnsByName(ctx context.Context, tableName string) ([]*entity.ToolsGenTableColumn, error) { + var res []*entity.ToolsGenTableColumn + err := g.Try(ctx, func(ctx context.Context) { + db := g.DB() + sql := " select column_name, (case when (is_nullable = 'YES' || is_nullable = 'NO' && column_default is not null) then '0' else '1' end) as is_required, " + + "(case when column_key = 'PRI' then '1' else '0' end) as is_pk, ordinal_position as sort_order_edit, column_comment," + + " (case when extra = 'auto_increment' then '1' else '0' end) as is_increment, column_type from information_schema.columns" + + " where table_schema = (select database()) " + sql += " and " + gdb.FormatSqlWithArgs(" table_name=? ", []interface{}{tableName}) + " order by ordinal_position ASC " + err := db.GetScan(ctx, &res, sql) + liberr.ErrIsNil(ctx, err, "查询列信息失败") + }) + return res, err +} + +// InitColumnField 初始化列属性字段 +func (s *sToolsGenTableColumn) InitColumnField(column *entity.ToolsGenTableColumn, table *entity.ToolsGenTable) { + dataType := s.GetDbType(column.ColumnType) + columnName := column.ColumnName + column.TableId = table.TableId + //设置字段名 + column.GoField = gstr.CaseCamel(columnName) + column.HtmlField = gstr.CaseCamelLower(columnName) + + if s.IsStringObject(dataType) { + //字段为字符串类型 + column.GoType = "string" + column.TsType = "string" + columnLength := s.GetColumnLength(column.ColumnType) + if columnLength >= 500 { + column.HtmlType = "textarea" + } else { + column.HtmlType = "input" + } + } else if s.IsTimeObject(dataType) { + //字段为时间类型 + column.GoType = "Time" + column.TsType = "string" + column.HtmlType = "datetime" + } else if s.IsNumberObject(dataType) { + //字段为数字类型 + column.HtmlType = "input" + t, _ := gregex.ReplaceString(`\(.+\)`, "", column.ColumnType) + t = gstr.Split(gstr.Trim(t), " ")[0] + t = gstr.ToLower(t) + // 如果是浮点型 + switch t { + case "float", "double", "decimal": + column.GoType = "float64" + case "bit", "int", "tinyint", "small_int", "smallint", "medium_int", "mediumint": + if gstr.ContainsI(column.ColumnType, "unsigned") { + column.GoType = "uint" + } else { + column.GoType = "int" + } + case "big_int", "bigint": + if gstr.ContainsI(column.ColumnType, "unsigned") { + column.GoType = "uint64" + } else { + column.GoType = "int64" + } + } + column.TsType = "number" + } else if dataType == "bit" { + column.GoType = "bool" + column.TsType = "boolean" + } + + //新增字段 + if s.IsNotEdit(columnName) { + column.IsInsert = false + } else if column.IsIncrement { + column.IsInsert = false + } else { + column.IsInsert = true + } + + // 编辑字段 + if s.IsNotEdit(columnName) { + column.IsEdit = false + } else if column.IsPk { + column.IsEdit = false + } else { + column.IsEdit = true + } + // 列表字段 + if s.IsNotList(columnName) { + column.IsList = false + } else { + column.IsList = true + } + // 详情字段 + if s.IsNotDetail(columnName) { + column.IsDetail = false + } else { + column.IsDetail = true + } // 查询字段 + if s.IsNotQuery(columnName) { + column.IsQuery = false + } else { + column.IsQuery = true + } + + // 查询字段类型 + if s.CheckNameColumn(columnName) { + column.QueryType = "LIKE" + } else { + column.QueryType = "EQ" + } + + // todo 最好不要用字段名来推断是否必填 + if strings.Index(columnName, "name") >= 0 || strings.Index(columnName, "status") >= 0 { + column.IsRequired = true + } + + // 状态字段设置单选框 + if s.CheckStatusColumn(columnName) { + column.HtmlType = "radio" + //column.IsStatus = true + } else if s.CheckTypeColumn(columnName) || s.CheckSexColumn(columnName) { + // 类型&性别字段设置下拉框 + column.HtmlType = "select" + } + + column.SortOrderList = column.SortOrderEdit + column.SortOrderDetail = column.SortOrderEdit + column.SortOrderQuery = column.SortOrderEdit + column.ColSpan = 12 + column.RowSpan = 1 + column.IsRowStart = false + column.MinWidth = 100 + column.IsFixed = false + column.IsOverflowTooltip = false + column.IsCascade = false + column.ParentColumnName = "" + column.CascadeColumnName = "" +} + +// GetDbType 获取数据库类型字段 +func (s *sToolsGenTableColumn) GetDbType(columnType string) string { + if strings.Index(columnType, "(") > 0 { + return columnType[0:strings.Index(columnType, "(")] + } else if strings.Index(columnType, " ") > 0 { // 类似 int unsigned, 即 int 类型后面并没有标注长度 + return columnType[0:strings.Index(columnType, " ")] + } else { + return columnType + } +} + +// IsExistInArray 判断 value 是否存在在切片array中 +func (s *sToolsGenTableColumn) IsExistInArray(value string, array []string) bool { + for _, v := range array { + if v == value { + return true + } + } + return false +} + +// IsStringObject 判断是否是数据库字符串类型 +func (s *sToolsGenTableColumn) IsStringObject(dataType string) bool { + return s.IsExistInArray(dataType, s.ColumnTypeStr) +} + +// IsTimeObject 判断是否是数据库时间类型 +func (s *sToolsGenTableColumn) IsTimeObject(dataType string) bool { + return s.IsExistInArray(dataType, s.ColumnTypeTime) +} + +// IsNumberObject 是否数字类型 +func (s *sToolsGenTableColumn) IsNumberObject(dataType string) bool { + return s.IsExistInArray(dataType, s.ColumnTypeNumber) +} + +// IsNotEdit 是否不可编辑 +func (s *sToolsGenTableColumn) IsNotEdit(name string) bool { + return s.IsExistInArray(name, s.ColumnNameNotEdit) +} + +// IsNotList 不在列表显示 +func (s *sToolsGenTableColumn) IsNotList(name string) bool { + return s.IsExistInArray(name, s.ColumnNameNotList) +} + +// IsNotDetail 不在详情显示 +func (s *sToolsGenTableColumn) IsNotDetail(name string) bool { + return s.IsExistInArray(name, s.ColumnNameNotDetail) +} + +// IsNotQuery 不可用于查询 +func (s *sToolsGenTableColumn) IsNotQuery(name string) bool { + return s.IsExistInArray(name, s.ColumnNameNotQuery) +} + +// CheckNameColumn 检查字段名后4位是否是name +func (s *sToolsGenTableColumn) CheckNameColumn(columnName string) bool { + if len(columnName) >= 4 { + end := len(columnName) + start := end - 4 + if start <= 0 { + start = 0 + } + tmp := columnName[start:end] + if tmp == "name" { + return true + } + } + return false +} + +// CheckStatusColumn 检查字段名后6位是否是status +func (s *sToolsGenTableColumn) CheckStatusColumn(columnName string) bool { + if len(columnName) >= 6 { + end := len(columnName) + start := end - 6 + + if start <= 0 { + start = 0 + } + tmp := columnName[start:end] + + if tmp == "status" { + return true + } + } + + return false +} + +// CheckTypeColumn 检查字段名后4位是否是type +func (s *sToolsGenTableColumn) CheckTypeColumn(columnName string) bool { + if len(columnName) >= 4 { + end := len(columnName) + start := end - 4 + + if start <= 0 { + start = 0 + } + + if columnName[start:end] == "type" { + return true + } + } + return false +} + +// CheckSexColumn 检查字段名后3位是否是sex +func (s *sToolsGenTableColumn) CheckSexColumn(columnName string) bool { + if len(columnName) >= 3 { + end := len(columnName) + start := end - 3 + if start <= 0 { + start = 0 + } + if columnName[start:end] == "sex" { + return true + } + } + return false +} + +// SelectGenTableColumnListByTableId 查询业务字段列表 +func (s *sToolsGenTableColumn) SelectGenTableColumnListByTableId(ctx context.Context, tableId int64) (list []*entity.ToolsGenTableColumn, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.ToolsGenTableColumn.Ctx(ctx). + Where(dao.ToolsGenTableColumn.Columns().TableId, tableId). + Order(dao.ToolsGenTableColumn.Columns().SortOrderEdit + " asc, " + + dao.ToolsGenTableColumn.Columns().ColumnId + " asc").Scan(&list) + liberr.ErrIsNil(ctx, err, "获取字段信息出错") + }) + return list, nil +} + +// GetAllTableColumns 获取所有字段信息 +func (s *sToolsGenTableColumn) GetAllTableColumns(ctx context.Context) (list []*entity.ToolsGenTableColumn, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.ToolsGenTableColumn.Ctx(ctx). + Order(dao.ToolsGenTableColumn.Columns().SortOrderEdit + " asc, " + + dao.ToolsGenTableColumn.Columns().ColumnId + " asc").Scan(&list) + liberr.ErrIsNil(ctx, err, "获取字段信息出错") + }) + return +} + +func (s *sToolsGenTableColumn) SetPkColumn(table *model.ToolsGenTableEx, columns []*model.ToolsGenTableColumnEx) { + for _, column := range columns { + if column.IsPk { + table.PkColumn = column + break + } + } + if table.PkColumn == nil { + table.PkColumn = columns[0] + } +} + +// GetColumnLength 获取字段长度 +func (s *sToolsGenTableColumn) GetColumnLength(columnType string) int { + start := strings.Index(columnType, "(") + end := strings.Index(columnType, ")") + result := "" + if start >= 0 && end >= 0 { + result = columnType[start+1 : end-1] + } + return gconv.Int(result) +} + +func (s *sToolsGenTableColumn) SelectDbTableColumnMapByName(ctx context.Context, tableName string) (res map[string]*entity.ToolsGenTableColumn, err error) { + err = g.Try(ctx, func(ctx context.Context) { + list, err := s.SelectDbTableColumnsByName(ctx, tableName) + liberr.ErrIsNil(ctx, err) + res = make(map[string]*entity.ToolsGenTableColumn, len(list)) + for _, item := range list { + res[item.ColumnName] = item + } + }) + return res, nil +} diff --git a/internal/app/system/logic/userRegistration/user_registration.go b/internal/app/system/logic/userRegistration/user_registration.go new file mode 100644 index 0000000..e24e497 --- /dev/null +++ b/internal/app/system/logic/userRegistration/user_registration.go @@ -0,0 +1,129 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-07-26 15:32:12 +// 生成路径: internal/app/system/logic/user_registration.go +// 生成人:gfast +// desc:极光推送 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterUserRegistration(New()) +} + +func New() *sUserRegistration { + return &sUserRegistration{} +} + +type sUserRegistration struct{} + +func (s *sUserRegistration) List(ctx context.Context, req *system.UserRegistrationSearchReq) (listRes *system.UserRegistrationSearchRes, err error) { + listRes = new(system.UserRegistrationSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.UserRegistration.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.UserRegistration.Columns().Id+" = ?", req.Id) + } + if req.UserId != "" { + m = m.Where(dao.UserRegistration.Columns().UserId+" = ?", gconv.Int(req.UserId)) + } + if req.OpenId != "" { + m = m.Where(dao.UserRegistration.Columns().OpenId+" = ?", req.OpenId) + } + if req.RegistrationId != "" { + m = m.Where(dao.UserRegistration.Columns().RegistrationId+" = ?", req.RegistrationId) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.UserRegistration.Columns().CreatedAt+" >=? AND "+dao.UserRegistration.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.UserRegistrationInfoRes + err = m.Fields(system.UserRegistrationSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.UserRegistrationListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.UserRegistrationListRes{ + Id: v.Id, + UserId: v.UserId, + OpenId: v.OpenId, + RegistrationId: v.RegistrationId, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sUserRegistration) GetById(ctx context.Context, id uint) (res *model.UserRegistrationInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.UserRegistration.Ctx(ctx).WithAll().Where(dao.UserRegistration.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sUserRegistration) Add(ctx context.Context, req *system.UserRegistrationAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.UserRegistration.Ctx(ctx).Insert(do.UserRegistration{ + UserId: req.UserId, + OpenId: req.OpenId, + RegistrationId: req.RegistrationId, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sUserRegistration) Edit(ctx context.Context, req *system.UserRegistrationEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.UserRegistration.Ctx(ctx).WherePri(req.Id).Update(do.UserRegistration{ + UserId: req.UserId, + OpenId: req.OpenId, + RegistrationId: req.RegistrationId, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sUserRegistration) Delete(ctx context.Context, ids []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.UserRegistration.Ctx(ctx).Delete(dao.UserRegistration.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +// IsBind 判断用户是否绑定过 +func (s *sUserRegistration) IsBind(ctx context.Context, userID int) bool { + count, _ := dao.UserRegistration.Ctx(ctx).Where(dao.UserRegistration.Columns().UserId, userID).Count() + return count > 0 +} diff --git a/internal/app/system/logic/workSchedule/work_schedule.go b/internal/app/system/logic/workSchedule/work_schedule.go new file mode 100644 index 0000000..ff72432 --- /dev/null +++ b/internal/app/system/logic/workSchedule/work_schedule.go @@ -0,0 +1,234 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-03-20 10:02:26 +// 生成路径: internal/app/system/logic/work_schedule.go +// 生成人:gfast +// desc:工作计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "encoding/json" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterWorkSchedule(New()) +} + +func New() *sWorkSchedule { + return &sWorkSchedule{} +} + +type sWorkSchedule struct{} + +func (s *sWorkSchedule) List(ctx context.Context, req *system.WorkScheduleSearchReq) (listRes *system.WorkScheduleSearchRes, err error) { + listRes = new(system.WorkScheduleSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.WorkSchedule.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.WorkSchedule.Columns().Id+" = ?", req.Id) + } + if req.WorkId != "" { + m = m.Where(dao.WorkSchedule.Columns().WorkId+" = ?", req.WorkId) + } + if req.StartAt != "" { + m = m.Where(dao.WorkSchedule.Columns().StartAt+" = ?", gconv.Time(req.StartAt)) + } + if req.Detail != "" { + m = m.Where(dao.WorkSchedule.Columns().Detail+" = ?", req.Detail) + } + if req.Status != "" { + m = m.Where(dao.WorkSchedule.Columns().Status+" = ?", gconv.Int(req.Status)) + } + if req.PlanNum != "" { + m = m.Where(dao.WorkSchedule.Columns().PlanNum+" = ?", gconv.Int(req.PlanNum)) + } + if req.FinishedNum != "" { + m = m.Where(dao.WorkSchedule.Columns().FinishedNum+" = ?", gconv.Int(req.FinishedNum)) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.WorkScheduleInfoRes + err = m.Fields(system.WorkScheduleSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.WorkScheduleInfo2Res, len(res)) + + for k, v := range res { + listRes.List[k] = &model.WorkScheduleInfo2Res{ + Id: v.Id, + WorkId: v.WorkId, + StartAt: v.StartAt, + EndAt: v.EndAt, + Status: v.Status, + PlanNum: v.PlanNum, + FinishedNum: v.FinishedNum, + } + + // detail 反序列化 + var scheduleDetails []model.WorkScheduleDetail + if err := json.Unmarshal([]byte(v.Detail), &scheduleDetails); err != nil { + continue + } + + listRes.List[k].Detail = scheduleDetails + } + }) + return +} + +func (s *sWorkSchedule) GetById(ctx context.Context, id uint) (res *model.WorkScheduleInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.WorkSchedule.Ctx(ctx).WithAll().Where(dao.WorkSchedule.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sWorkSchedule) Add(ctx context.Context, req *system.WorkScheduleAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.WorkSchedule.Ctx(ctx).Insert(do.WorkSchedule{ + WorkId: req.WorkId, + StartAt: req.StartAt, + Detail: req.Detail, + Status: req.Status, + PlanNum: req.PlanNum, + FinishedNum: req.FinishedNum, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sWorkSchedule) Edit(ctx context.Context, req *system.WorkScheduleEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.WorkSchedule.Ctx(ctx).WherePri(req.Id).Update(do.WorkSchedule{ + WorkId: req.WorkId, + StartAt: req.StartAt, + Detail: req.Detail, + Status: req.Status, + PlanNum: req.PlanNum, + FinishedNum: req.FinishedNum, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sWorkSchedule) Delete(ctx context.Context, req *system.WorkScheduleDeleteReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 获取该计划的详细信息 + var workSchedules entity.WorkSchedule + err := dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().Id, req.Ids).Scan(&workSchedules) + liberr.ErrIsNil(ctx, err, "获取该计划失败") + + _, err = dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().Id, req.Ids).Delete() + liberr.ErrIsNil(ctx, err, "删除计划失败") + + // 反序列化 workSchedules.Detail + var scheduleDetails []model.WorkScheduleDetail + if err := json.Unmarshal([]byte(workSchedules.Detail), &scheduleDetails); err != nil { + return + } + + // 遍历 scheduleDetails,将 pv_module 表中的状态修改为 0 + for _, scheduleDetail := range scheduleDetails { + _, err = dao.PvModule.Ctx(ctx).Where(dao.PvModule.Columns().WorkId, workSchedules.WorkId). + Where(dao.PvModule.Columns().DoneTime, scheduleDetail.Date). + Data(g.Map{ + dao.PvModule.Columns().Status: 0, + dao.PvModule.Columns().DoneTime: "", + }).Update() + liberr.ErrIsNil(ctx, err, "修改状态失败") + } + + // 重新统计在 work_schedule 表中的完成数量 + finishedNum, err := dao.WorkSchedule.Ctx(ctx). + Where(dao.WorkSchedule.Columns().WorkId, workSchedules.WorkId). + Sum(dao.WorkSchedule.Columns().FinishedNum) + liberr.ErrIsNil(ctx, err, "重新获取完成数量失败") + + isExist, err := dao.WorkSchedule.Ctx(ctx). + Where(dao.WorkSchedule.Columns().WorkId, workSchedules.WorkId).Count() + liberr.ErrIsNil(ctx, err, "获取计划数量失败") + + // 如果不存在任何计划则将状态修改为 `未开始` 并将 `完成数量` 修改为 0 + if isExist == 0 { + _, err = dao.WorkStatus.Ctx(ctx). + Where(dao.WorkStatus.Columns().WorkId, workSchedules.WorkId). + Data(g.Map{ + dao.WorkStatus.Columns().Finished: 0, + dao.WorkStatus.Columns().Status: 0, + }).Update() + liberr.ErrIsNil(ctx, err, "更新计划完成数量失败") + return + } + + _, err = dao.WorkStatus.Ctx(ctx). + Where(dao.WorkStatus.Columns().WorkId, workSchedules.WorkId). + Data(g.Map{ + dao.WorkStatus.Columns().Finished: finishedNum, + dao.WorkStatus.Columns().Status: 1, + }).Update() + liberr.ErrIsNil(ctx, err, "更新计划完成数量失败") + }) + return +} + +// 判断在指定的时间周期内方阵或子项目是否有计划 +func (s *sWorkSchedule) IsExistWorkSchedule(ctx context.Context, subProjectID, fangzhenID string, startAt, endAt string) bool { + var ( + id string // 子项目ID 或者 方阵ID + column string + ) + + // 获取子项目ID 或者 方阵ID + if subProjectID != "" { + id = subProjectID + column = dao.WorkSchedule.Columns().SubProjectid + } else if fangzhenID != "" { + id = fangzhenID + column = dao.WorkSchedule.Columns().FangzhenId + } else { + return false + } + + // 获取下的所有工作计划 + workSchedule := []entity.WorkSchedule{} + if err := dao.WorkSchedule.Ctx(ctx).Where(column, id).Scan(&workSchedule); err != nil { + return false + } + + // 遍历计划,判断是否在指定时间周期内有计划 + for _, v := range workSchedule { + if v.StartAt.Format("Y-m-d") <= endAt { + return true + } + } + + return false +} diff --git a/internal/app/system/logic/workStatus/work_status.go b/internal/app/system/logic/workStatus/work_status.go new file mode 100644 index 0000000..ce8e9c9 --- /dev/null +++ b/internal/app/system/logic/workStatus/work_status.go @@ -0,0 +1,323 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-03-19 11:45:09 +// 生成路径: internal/app/system/logic/work_status.go +// 生成人:gfast +// desc:工作状态 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "fmt" + "time" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/tiger1103/gfast/v3/third/progress" + "github.com/tiger1103/gfast/v3/third/schduler" +) + +func init() { + service.RegisterWorkStatus(New()) +} + +func New() *sWorkStatus { + return &sWorkStatus{} +} + +type sWorkStatus struct{} + +func (s *sWorkStatus) List(ctx context.Context, req *system.WorkStatusSearchReq) (listRes *system.WorkStatusSearchRes, err error) { + listRes = new(system.WorkStatusSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.WorkStatus.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.WorkStatus.Columns().Id+" = ?", req.Id) + } + if req.FangzhenId != "" { + m = m.Where(dao.WorkStatus.Columns().FangzhenId+" = ?", req.FangzhenId) + } + if req.Parent != "" { + m = m.Where(dao.WorkStatus.Columns().Parent+" = ?", gconv.Int(req.Parent)) + } + if req.WorkId != "" { + m = m.Where(dao.WorkStatus.Columns().WorkId+" = ?", req.WorkId) + } + if req.WorkName != "" { + m = m.Where(dao.WorkStatus.Columns().WorkName+" like ?", "%"+req.WorkName+"%") + } + if req.Total != "" { + m = m.Where(dao.WorkStatus.Columns().Total+" = ?", gconv.Int(req.Total)) + } + if req.Finished != "" { + m = m.Where(dao.WorkStatus.Columns().Finished+" = ?", gconv.Int(req.Finished)) + } + if req.StartAt != "" { + m = m.Where(dao.WorkStatus.Columns().StartAt+" = ?", gconv.Time(req.StartAt)) + } + if req.EndAt != "" { + m = m.Where(dao.WorkStatus.Columns().EndAt+" = ?", gconv.Time(req.EndAt)) + } + if req.Status != "" { + m = m.Where(dao.WorkStatus.Columns().Status+" = ?", gconv.Int(req.Status)) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.WorkStatus.Columns().CreatedAt+" >=? AND "+dao.WorkStatus.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.WorkStatusInfoRes + err = m.Fields(system.WorkStatusSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.WorkStatusListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.WorkStatusListRes{ + Id: v.Id, + FangzhenId: v.FangzhenId, + Parent: v.Parent, + WorkId: v.WorkId, + WorkName: v.WorkName, + Total: v.Total, + Finished: v.Finished, + StartAt: v.StartAt, + EndAt: v.EndAt, + Status: v.Status, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sWorkStatus) GetById(ctx context.Context, id uint) (res *model.WorkStatusInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.WorkStatus.Ctx(ctx).WithAll().Where(dao.WorkStatus.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sWorkStatus) Add(ctx context.Context, req *system.WorkStatusAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.WorkStatus.Ctx(ctx).Insert(do.WorkStatus{ + FangzhenId: req.FangzhenId, + Parent: req.Parent, + WorkId: req.WorkId, + WorkName: req.WorkName, + Total: req.Total, + Finished: req.Finished, + StartAt: req.StartAt, + EndAt: req.EndAt, + Status: req.Status, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sWorkStatus) Edit(ctx context.Context, req *system.WorkStatusEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.WorkStatus.Ctx(ctx).WherePri(req.Id).Update(do.WorkStatus{ + FangzhenId: req.FangzhenId, + Parent: req.Parent, + WorkId: req.WorkId, + WorkName: req.WorkName, + Total: req.Total, + Finished: req.Finished, + StartAt: req.StartAt, + EndAt: req.EndAt, + Status: req.Status, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sWorkStatus) Delete(ctx context.Context, ids []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.WorkStatus.Ctx(ctx).Delete(dao.WorkStatus.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +func (s *sWorkStatus) Progress(ctx context.Context, fangzhenID string) ([]*model.WorkStatusProgressRes, error) { + // 获取指定方阵ID的所有计划 + ScheduleData := []entity.WorkSchedule{} + if err := dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().FangzhenId, fangzhenID). + Scan(&ScheduleData); err != nil { + return nil, err + } + + // 遍历所有计划,将计划按照 WorkID 分组 + scheduleMap, err := schduler.New(ScheduleData) + if err != nil { + return nil, fmt.Errorf("初始化计划失败: %w", err) + } + + // 获取指定方阵ID的所有项目 + workStatusList := []entity.WorkStatus{} + if err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, fangzhenID).Scan(&workStatusList); err != nil { + return nil, err + } + + // 父列表 + parentList := []entity.WorkStatus{} + // 子列表,使用 map 存储,键为父元素的 ID + childrenMap := make(map[int][]entity.WorkStatus) + + // 遍历所有数据,将父级和子集分开 + for i := 0; i < len(workStatusList); i++ { + task := workStatusList[i] + if task.Parent == 0 { + parentList = append(parentList, task) + } else { + childrenMap[task.Parent] = append(childrenMap[task.Parent], task) + } + } + + index := 1 + + // 待修改状态的子集 + var statuFinished []string + + projectList := make([]*model.WorkStatusProgressRes, 0, len(parentList)) + // 遍历父级,将子集添加到父级的字段中 + for _, parent := range parentList { + projectItem := model.WorkStatusProgressRes{ + ID: index, + WorkID: parent.WorkId, + Startat: parent.StartAt.String(), + Endat: parent.EndAt.String(), + Name: parent.WorkName, + Total: parent.Total, + Finished: parent.Finished, + Status: parent.Status, + WorkType: parent.Type, + Children: make([]model.WorkStatusProgressRes, 0, len(workStatusList)), + } + index++ + + // 遍历子集 + for _, child := range childrenMap[int(parent.Id)] { + + // 根据 WorkID 获取计划总量和实际进度 + finishedPtr, total := scheduleMap.Get(child.WorkId) + + // 如果总量和实际完成量相等 + if child.Finished >= child.Finished && child.Status != 3 { + if child.Total != 0 && child.Finished != 0 { // 防止两者都为初始化值 + child.Status = 2 // 修改状态为已完成 + statuFinished = append(statuFinished, child.WorkId) + } + } + + // 如果计划总量大于实际进度,则取实际总量 + if total > child.Total { + total = child.Total + } + + // 判断是否延期 + isDelay := scheduleMap.GetStatus(child.WorkId, child.Total) + + projectItem.Children = append(projectItem.Children, model.WorkStatusProgressRes{ + ID: index, + WorkID: child.WorkId, + Startat: child.StartAt.String(), + Endat: child.EndAt.String(), + Name: child.WorkName, + Total: child.Total, + Finished: child.Finished, + IsPercent: child.IsPercent, + Status: child.Status, + IsDelay: &isDelay, + WorkType: child.Type, + PlanProgress: &model.PlanProgress{ + Finished: &finishedPtr, + Total: &total, + }, + }) + index++ + } + projectList = append(projectList, &projectItem) + } + + go func() { + // 修改状态为已完成 + if len(statuFinished) > 0 { + _, _ = dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().WorkId+" in (?)", statuFinished).Data(g.Map{ + dao.WorkStatus.Columns().Status: 2, + }).Update() + } + }() + + return projectList, nil +} + +// 获取所有父项的总进度和当前进度 +func (s *sWorkStatus) GetParentProgress(ctx context.Context, req *system.WorkStatusGetParentProgressReq) (*system.WorkStatusGetProgressRes, error) { + var ( + workStatusProgressList []*model.WorkStatusProgressRes + err error + ) + + switch { + // 通过方阵ID获取进度 + case req.FangzhenId != "": + workStatusProgressList, err = progress.WorkStatusGetProgress(req.FangzhenId) + + // 通过子项目获取进度 + case req.SubProjectID != "": + workStatusProgressList, err = progress.GetProgressBySubID(req.SubProjectID) + + // 通过大项目获取进度 + case req.ProjectID != "": + workStatusProgressList, err = progress.GetProgressByProjectID(req.ProjectID) + default: + return nil, nil + } + + if err != nil { + return nil, err + } + + return &system.WorkStatusGetProgressRes{Progress: workStatusProgressList}, nil +} + +// isDelay 如果实际完成数量小于计划数量,且当前时间大于结束时间,则判断为延期 +// endAt 结束时间 +// planNum 计划数量 +// finishedNum 实际数量 +func isDelay(endAt string, planNum, finishedNum int) int { + // 当天时间 + nowTime := time.Now().Format("2006-01-02") + + // 如果实际完成数量小于计划数量,且当前时间大于结束时间,则判断为延期 + if finishedNum < planNum && nowTime > endAt { + return 1 + } + + return 0 +} diff --git a/internal/app/system/logic/xiangmuhuafenbiao/xiangmuhuafenbiao.go b/internal/app/system/logic/xiangmuhuafenbiao/xiangmuhuafenbiao.go new file mode 100644 index 0000000..311f4dc --- /dev/null +++ b/internal/app/system/logic/xiangmuhuafenbiao/xiangmuhuafenbiao.go @@ -0,0 +1,306 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-10-07 16:08:10 +// 生成路径: internal/app/system/logic/xiangmuhuafenbiao.go +// 生成人:gfast +// desc:项目划分 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/common/globe" + "github.com/tiger1103/gfast/v3/api/v1/common/tool/excel" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "os" + "path/filepath" + "strconv" + "strings" + "time" +) + +func init() { + service.RegisterXiangmuhuafenbiao(New()) +} + +func New() *sXiangmuhuafenbiao { + return &sXiangmuhuafenbiao{} +} + +type sXiangmuhuafenbiao struct{} + +func (s *sXiangmuhuafenbiao) EditExcelFunc(ctx context.Context, req *system.EditExcelFuncReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、获取到document表对应的文件,然后返回这一行的数据 + var dt *model.DocumentInfoRes + dao.Document.Ctx(ctx).Where("name", req.FileName).Limit(1).Scan(&dt) + //2、根据 + var ey *model.XiangmuhuafenbiaoInfoRes + dao.Xiangmuhuafenbiao.Ctx(ctx).WherePri(req.Id).Scan(&ey) + var pathName = "" + if ey != nil { + dir := filepath.Dir(dt.FilenPath) + dir = strings.ReplaceAll(dir, "/file", coryCommon.GetCWD()+"/resource/public") + timestamp := time.Now().UnixNano() / int64(time.Millisecond) + sjc := strconv.FormatInt(timestamp, 10) + pathName = dir + "/" + strconv.FormatInt(ey.ProjectId, 10) + strconv.FormatInt(ey.Id, 10) + sjc + ".txt" + flag, err := coryCommon.OutJson([]byte(req.Json), pathName) + if err != nil || flag == false { + err = errors.New("修改失败") + return + } + _, err = dao.Xiangmuhuafenbiao.Ctx(ctx).WherePri(req.Id).Update(do.DocumentProject{ + Json: strings.ReplaceAll(pathName, "\\", "/"), + }) + //把原本的json删除 + if err == nil && ey.Json != "" { + dirTwo := strings.ReplaceAll(ey.Json, "/file", coryCommon.GetCWD()+"/resource/public") + os.Remove(dirTwo) + } + liberr.ErrIsNil(ctx, err, "修改失败") + } + }) + return +} + +func (s *sXiangmuhuafenbiao) List(ctx context.Context, req *system.XiangmuhuafenbiaoSearchReq) (listRes *system.XiangmuhuafenbiaoSearchRes, err error) { + listRes = new(system.XiangmuhuafenbiaoSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.Xiangmuhuafenbiao.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.Xiangmuhuafenbiao.Columns().Id+" = ?", req.Id) + } + if req.Danweigongcheng != "" { + //m = m.Where(dao.Xiangmuhuafenbiao.Columns().Danweigongcheng+" = ?", req.Danweigongcheng) + m = m.Where(dao.Xiangmuhuafenbiao.Columns().Danweigongcheng+" like ?", "%"+req.Danweigongcheng+"%") + + } + if req.Zidanweigongcheng != "" { + //m = m.Where(dao.Xiangmuhuafenbiao.Columns().Zidanweigongcheng+" = ?", req.Zidanweigongcheng) + m = m.Where(dao.Xiangmuhuafenbiao.Columns().Zidanweigongcheng+" like ?", "%"+req.Zidanweigongcheng+"%") + + } + if req.Fenbugongcheng != "" { + //m = m.Where(dao.Xiangmuhuafenbiao.Columns().Fenbugongcheng+" = ?", req.Fenbugongcheng) + m = m.Where(dao.Xiangmuhuafenbiao.Columns().Fenbugongcheng+" like ?", "%"+req.Fenbugongcheng+"%") + + } + if req.Zifenbugongcheng != "" { + //m = m.Where(dao.Xiangmuhuafenbiao.Columns().Zifenbugongcheng+" = ?", req.Zifenbugongcheng) + m = m.Where(dao.Xiangmuhuafenbiao.Columns().Zifenbugongcheng+" like ?", "%"+req.Zifenbugongcheng+"%") + + } + if req.Fenxianggongcheng != "" { + //m = m.Where(dao.Xiangmuhuafenbiao.Columns().Fenxianggongcheng+" = ?", req.Fenxianggongcheng) + m = m.Where(dao.Xiangmuhuafenbiao.Columns().Fenxianggongcheng+" like ?", "%"+req.Fenxianggongcheng+"%") + + } + if req.Jianyanpi != "" { + //m = m.Where(dao.Xiangmuhuafenbiao.Columns().Jianyanpi+" = ?", req.Jianyanpi) + m = m.Where(dao.Xiangmuhuafenbiao.Columns().Jianyanpi+" like ?", "%"+req.Jianyanpi+"%") + + } + if req.Name != "" { + m = m.Where(dao.Xiangmuhuafenbiao.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.Zhixingbiaohao != "" { + m = m.Where(dao.Xiangmuhuafenbiao.Columns().Zhixingbiaohao+" like ?", "%"+req.Zhixingbiaohao+"%") + + //m = m.Where(dao.Xiangmuhuafenbiao.Columns().Zhixingbiaohao+" = ?", req.Zhixingbiaohao) + } + //if req.Json != "" { + // m = m.Where(dao.Xiangmuhuafenbiao.Columns().Json+" = ?", req.Json) + //} + if req.PrintStatus != "" { + m = m.Where(dao.Xiangmuhuafenbiao.Columns().PrintStatus+" = ?", gconv.Int(req.PrintStatus)) + } + if req.ProjectId != "" { + m = m.Where(dao.Xiangmuhuafenbiao.Columns().ProjectId+" = ?", gconv.Int(req.ProjectId)) + } + //if req.CreateBy != "" { + // m = m.Where(dao.Xiangmuhuafenbiao.Columns().CreateBy+" = ?", req.CreateBy) + //} + //if req.UpdateBy != "" { + // m = m.Where(dao.Xiangmuhuafenbiao.Columns().UpdateBy+" = ?", req.UpdateBy) + //} + //if req.CreateddAt != "" { + // m = m.Where(dao.Xiangmuhuafenbiao.Columns().CreateddAt+" = ?", gconv.Time(req.CreateddAt)) + //} + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.XiangmuhuafenbiaoInfoRes + err = m.Fields(system.XiangmuhuafenbiaoSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.XiangmuhuafenbiaoListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.XiangmuhuafenbiaoListRes{ + Id: v.Id, + Danweigongcheng: v.Danweigongcheng, + Zidanweigongcheng: v.Zidanweigongcheng, + Fenbugongcheng: v.Fenbugongcheng, + Zifenbugongcheng: v.Zifenbugongcheng, + Fenxianggongcheng: v.Fenxianggongcheng, + Jianyanpi: v.Jianyanpi, + Name: v.Name, + Zhixingbiaohao: v.Zhixingbiaohao, + Json: v.Json, + PrintStatus: v.PrintStatus, + ProjectId: v.ProjectId, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreateddAt: v.CreateddAt, + } + } + }) + return +} + +func (s *sXiangmuhuafenbiao) GetById(ctx context.Context, id int) (res *model.XiangmuhuafenbiaoInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.Xiangmuhuafenbiao.Ctx(ctx).WithAll().Where(dao.Xiangmuhuafenbiao.Columns().Id, id).Scan(&res) + json := res.Json + if json != "" { + data, err2 := coryCommon.PutJson(json) + if err2 != nil { + err = err2 + } + res.Json = data + } + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sXiangmuhuafenbiao) Add(ctx context.Context, req *system.XiangmuhuafenbiaoAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + + res, e := service.SysProject().GetByProjectId(ctx, req.ProjectId) + if e != nil { + liberr.ErrIsNil(ctx, e) + return + } + if res == nil { + liberr.ErrIsNil(ctx, errors.New("项目不存在")) + return + } + str, err1 := coryCommon.UploadFile(ctx, req.File, coryCommon.ProjectSplitTable) + if err1 != nil { + liberr.ErrIsNil(ctx, err1, "上传失败!") + } + if !strings.HasSuffix(str, ".xls") { + liberr.ErrIsNil(ctx, err, "仅支持xls格式数据") + } + err2, sheets := excel.ReadXlsx(str) + if err2 != nil { + liberr.ErrIsNil(ctx, err2, "表格读取失败") + } + + dao.Xiangmuhuafenbiao.Ctx(ctx).Where(dao.Xiangmuhuafenbiao.Columns().ProjectId, req.ProjectId).Delete() + var rows []do.Xiangmuhuafenbiao + for _, sheet := range sheets { + for _, row := range sheet.Rows { + r := do.Xiangmuhuafenbiao{ + ProjectId: req.ProjectId, + PrintStatus: globe.DISABLE, + } + l := len(row) + if l > 0 { + r.Danweigongcheng = row[0] + } + if l > 1 { + r.Zidanweigongcheng = row[1] + } + if l > 2 { + r.Fenbugongcheng = row[2] + } + if l > 3 { + r.Zifenbugongcheng = row[3] + } + if l > 4 { + r.Fenxianggongcheng = row[4] + } + if l > 5 { + r.Jianyanpi = row[5] + } + if l > 6 { + r.Name = row[6] + } + if l > 7 { + r.Zhixingbiaohao = row[7] + } + rows = append(rows, r) + if len(rows) == 1000 { + dao.Xiangmuhuafenbiao.Ctx(ctx).Insert(&rows) + rows = []do.Xiangmuhuafenbiao{} + } + } + } + if len(rows) > 0 { + dao.Xiangmuhuafenbiao.Ctx(ctx).Insert(&rows) + } + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sXiangmuhuafenbiao) Edit(ctx context.Context, req *system.XiangmuhuafenbiaoEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + xiangmuhuafenbiao := do.Xiangmuhuafenbiao{ + Danweigongcheng: req.Danweigongcheng, + Zidanweigongcheng: req.Zidanweigongcheng, + Fenbugongcheng: req.Fenbugongcheng, + Zifenbugongcheng: req.Zifenbugongcheng, + Fenxianggongcheng: req.Fenxianggongcheng, + Jianyanpi: req.Jianyanpi, + Name: req.Name, + Zhixingbiaohao: req.Zhixingbiaohao, + PrintStatus: req.PrintStatus, + //ProjectId: req.ProjectId, + //CreateBy: req.CreateBy, + //UpdateBy: req.UpdateBy, + //CreateddAt: req.CreateddAt, + } + //json不为空表示更改了文件,把原本的文件删除了 + if req.Json != "" { + value, _ := dao.Xiangmuhuafenbiao.Ctx(ctx).WherePri(req.Id).Fields("json").Value() + dir, _ := os.Getwd() + newPath := strings.ReplaceAll(value.String(), "/file", dir+"/resource/public") + os.Remove(newPath) + } + _, err = dao.Xiangmuhuafenbiao.Ctx(ctx).OmitEmpty().WherePri(req.Id).Update(xiangmuhuafenbiao) + _, err = dao.Xiangmuhuafenbiao.Ctx(ctx).WherePri(req.Id).Update(g.Map{"json": nil}) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sXiangmuhuafenbiao) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.Xiangmuhuafenbiao.Ctx(ctx).Delete(dao.Xiangmuhuafenbiao.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/ys7Devices/ys7devices.go b/internal/app/system/logic/ys7Devices/ys7devices.go new file mode 100644 index 0000000..8250ea5 --- /dev/null +++ b/internal/app/system/logic/ys7Devices/ys7devices.go @@ -0,0 +1,225 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-03-01 12:49:32 +// 生成路径: internal/app/system/logic/ys7devices.go +// 生成人:gfast +// desc:荧石摄像头 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "fmt" + "strings" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/tiger1103/gfast/v3/third/ys7" +) + +func init() { + service.RegisterYs7Devices(New()) +} + +func New() *sYs7Devices { + return &sYs7Devices{} +} + +type sYs7Devices struct{} + +func (s *sYs7Devices) List(ctx context.Context, req *system.Ys7DevicesSearchReq) (listRes *system.Ys7DevicesSearchRes, err error) { + listRes = new(system.Ys7DevicesSearchRes) + + user := ct.New().Get(ctx) + if user == nil { + return nil, fmt.Errorf("用户未登录") + } + + // 是否添加了 Where 条件 + isWhereAdded := false + + err = g.Try(ctx, func(ctx context.Context) { + m := dao.Ys7Devices.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.Ys7Devices.Columns().Id+" = ?", req.Id) + isWhereAdded = true + } + if len(req.DateRange) != 0 { + m = m.Where(dao.Ys7Devices.Columns().CreatedAt+" >=? AND "+dao.Ys7Devices.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + isWhereAdded = true + } + if req.DeviceSerial != "" { + m = m.Where(dao.Ys7Devices.Columns().DeviceSerial+" = ?", req.DeviceSerial) + isWhereAdded = true + } + if req.DeviceName != "" { + m = m.Where(dao.Ys7Devices.Columns().DeviceName+" like ?", "%"+req.DeviceName+"%") + isWhereAdded = true + } + if req.DeviceType != "" { + m = m.Where(dao.Ys7Devices.Columns().DeviceType+" = ?", req.DeviceType) + isWhereAdded = true + } + if req.Status != "" { + m = m.Where(dao.Ys7Devices.Columns().Status+" = ?", gconv.Int(req.Status)) + isWhereAdded = true + } + if req.Defence != "" { + m = m.Where(dao.Ys7Devices.Columns().Defence+" = ?", gconv.Int64(req.Defence)) + isWhereAdded = true + } + if req.DeviceVersion != "" { + m = m.Where(dao.Ys7Devices.Columns().DeviceVersion+" = ?", req.DeviceVersion) + isWhereAdded = true + } + + // 如果是前端页面请求,只能看见传入的项目ID 下的摄像头 + if req.IsFront { + m = m.Where(dao.Ys7Devices.Columns().ProjectId, req.ProjectId) + } else { + // 非管理员只能看见自己的摄像头和未被绑定的摄像头 + if user.User.IsAdmin != 1 { + m = m.Where(dao.Ys7Devices.Columns().ProjectId, req.ProjectId). // 查询指定项目下的摄像头 + WhereOrNull(dao.Ys7Devices.Columns().ProjectId) // 查询未被绑定的摄像头 + } + + // 当前用户是管理员 + if user.User.IsAdmin == 1 { + //// 如果加了其他 Where 筛选条件,或者 ProJectID 不为空的的情况下,则查询指定项目下的摄像头 + //// 用于查询指定项目下的摄像头 + //if isWhereAdded || req.ProjectId != "" { + // m = m.Where(dao.Ys7Devices.Columns().ProjectId, req.ProjectId) + //} + + if req.ProjectId != "" { + m = m.Where(dao.Ys7Devices.Columns().ProjectId, req.ProjectId) + } + } + } + + // 如果没有 Where 筛选,且不是前端页面请求, 则查询未被绑定的摄像头 + if !isWhereAdded && !req.IsFront { + m = m.WhereOrNull(dao.Ys7Devices.Columns().ProjectId) + } + + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "sort desc,id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.Ys7DevicesInfoRes + err = m.Fields(system.Ys7DevicesSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + + listRes.List = make([]*model.Ys7DevicesListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.Ys7DevicesListRes{ + Id: v.Id, + CreatedAt: v.CreatedAt, + DeviceSerial: v.DeviceSerial, + DeviceName: v.DeviceName, + DeviceType: v.DeviceType, + Status: v.Status, + Defence: v.Defence, + DeviceVersion: v.DeviceVersion, + ProjectId: v.ProjectId, + Detail: v.Detail, + ReMark: v.ReMark, + VideoEncrypted: v.VideoEncrypted, + Sort: v.Sort, + } + + // 如果是小程序则经纬度转换 + if req.IsWechat { + a := strings.Split(v.Position, ",") + lng, lat := coryCommon.WGS84toGCJ02(gconv.Float64(a[0]), gconv.Float64(a[1])) + listRes.List[k].Lag = lng + listRes.List[k].Lat = lat + } else { + a := strings.Split(v.Position, ",") + listRes.List[k].Lag = gconv.Float64(a[0]) + listRes.List[k].Lat = gconv.Float64(a[1]) + } + } + + for _, v := range listRes.List { + v.SourceType = "camera" + v.SourceId = v.DeviceSerial + v.Token = ys7.Ys72Instance.GetAccessToken() + } + }) + return +} + +func (s *sYs7Devices) GetById(ctx context.Context, id uint) (res *model.Ys7DevicesInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.Ys7Devices.Ctx(ctx).WithAll().Where(dao.Ys7Devices.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sYs7Devices) Add(ctx context.Context, req *system.Ys7DevicesAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.Ys7Devices.Ctx(ctx).Insert(do.Ys7Devices{ + DeviceSerial: req.DeviceSerial, + DeviceName: req.DeviceName, + DeviceType: req.DeviceType, + Status: req.Status, + Defence: req.Defence, + DeviceVersion: req.DeviceVersion, + ProjectId: req.ProjectId, + ReMark: req.Remark, + Sort: req.Sort, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sYs7Devices) Edit(ctx context.Context, req *system.Ys7DevicesEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.Ys7Devices.Ctx(ctx).WherePri(req.Id).Update(do.Ys7Devices{ + DeviceSerial: req.DeviceSerial, + DeviceName: req.DeviceName, + DeviceType: req.DeviceType, + Status: req.Status, + Defence: req.Defence, + DeviceVersion: req.DeviceVersion, + ProjectId: req.ProjectId, + Detail: req.Detail, + Position: req.Position, + ReMark: req.ReMark, + Sort: req.Sort, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sYs7Devices) Delete(ctx context.Context, ids []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.Ys7Devices.Ctx(ctx).Delete(dao.Ys7Devices.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/ys7DevicesImg/ys7devices_img.go b/internal/app/system/logic/ys7DevicesImg/ys7devices_img.go new file mode 100644 index 0000000..af25baa --- /dev/null +++ b/internal/app/system/logic/ys7DevicesImg/ys7devices_img.go @@ -0,0 +1,115 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2024-08-19 11:51:53 +// 生成路径: internal/app/system/logic/ys7devices_img.go +// 生成人:gfast +// desc:摄像头所拍摄到的所有图片(每月会定时清除) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterYs7DevicesImg(New()) +} + +func New() *sYs7DevicesImg { + return &sYs7DevicesImg{} +} + +type sYs7DevicesImg struct{} + +func (s *sYs7DevicesImg) List(ctx context.Context, req *system.Ys7DevicesImgSearchReq) (listRes *system.Ys7DevicesImgSearchRes, err error) { + listRes = new(system.Ys7DevicesImgSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.Ys7DevicesImg.Ctx(ctx).WithAll() + if req.Name != "" { + m = m.Where(dao.Ys7DevicesImg.Columns().Name+" like ?", "%"+req.Name+"%") + } + if req.CreatedAt != "" { + m = m.Where(dao.BusEquipmentEquipmentUnpacking.Columns().CreatedAt+" like ?", req.CreatedAt+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.Ys7DevicesImg.Columns().CreatedAt+" >=? AND "+dao.Ys7DevicesImg.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.Ys7DevicesImgInfoRes + err = m.Fields(system.Ys7DevicesImgSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.Ys7DevicesImgListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.Ys7DevicesImgListRes{ + Id: v.Id, + FatherId: v.FatherId, + Name: v.Name, + Path: v.Path, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sYs7DevicesImg) GetById(ctx context.Context, id uint64) (res *model.Ys7DevicesImgInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.Ys7DevicesImg.Ctx(ctx).WithAll().Where(dao.Ys7DevicesImg.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sYs7DevicesImg) Add(ctx context.Context, req *system.Ys7DevicesImgAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.Ys7DevicesImg.Ctx(ctx).Insert(do.Ys7DevicesImg{ + FatherId: req.FatherId, + Name: req.Name, + Path: req.Path, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sYs7DevicesImg) Edit(ctx context.Context, req *system.Ys7DevicesImgEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.Ys7DevicesImg.Ctx(ctx).WherePri(req.Id).Update(do.Ys7DevicesImg{ + FatherId: req.FatherId, + Name: req.Name, + Path: req.Path, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sYs7DevicesImg) Delete(ctx context.Context, ids []uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.Ys7DevicesImg.Ctx(ctx).Delete(dao.Ys7DevicesImg.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/logic/zmkgGisModelLib/zmkg_gis_model_lib.go b/internal/app/system/logic/zmkgGisModelLib/zmkg_gis_model_lib.go new file mode 100644 index 0000000..dd0ac6a --- /dev/null +++ b/internal/app/system/logic/zmkgGisModelLib/zmkg_gis_model_lib.go @@ -0,0 +1,133 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-07-31 10:18:14 +// 生成路径: internal/app/system/logic/zmkg_gis_model_lib.go +// 生成人:gfast +// desc:模型库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/google/uuid" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" + "strings" +) + +func init() { + service.RegisterZmkgGisModelLib(New()) +} + +func New() *sZmkgGisModelLib { + return &sZmkgGisModelLib{} +} + +type sZmkgGisModelLib struct{} + +func (s *sZmkgGisModelLib) List(ctx context.Context, req *system.ZmkgGisModelLibSearchReq) (listRes *system.ZmkgGisModelLibSearchRes, err error) { + listRes = new(system.ZmkgGisModelLibSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.ZmkgGisModelLib.Ctx(ctx).WithAll() + if req.ModelId != "" { + m = m.Where(dao.ZmkgGisModelLib.Columns().ModelId+" like ?", "%"+req.ModelId+"%") + } + if req.ModelName != "" { + m = m.Where(dao.ZmkgGisModelLib.Columns().ModelName+" like ?", "%"+req.ModelName+"%") + } + if req.CreateAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreateAt)) + m = m.Where(dao.ZmkgGisModelLib.Columns().CreateAt+" like ?", "%"+date+"%") + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.ZmkgGisModelLibInfoRes + err = m.Fields(system.ZmkgGisModelLibSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.ZmkgGisModelLibListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.ZmkgGisModelLibListRes{ + Id: v.Id, + ModelId: v.ModelId, + ModelName: v.ModelName, + Url: v.Url, + CreateAt: v.CreateAt, + } + } + }) + return +} + +func (s *sZmkgGisModelLib) GetById(ctx context.Context, id int) (res *model.ZmkgGisModelLibInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.ZmkgGisModelLib.Ctx(ctx).WithAll().Where(dao.ZmkgGisModelLib.Columns().Id, id).Scan(&res) + //获取创建人 更新人名称 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.ZmkgGisModelLibInfoRes) + res = &infoRes + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sZmkgGisModelLib) Add(ctx context.Context, req *system.ZmkgGisModelLibAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + str, err := coryCommon.UploadFile(ctx, req.File, coryCommon.GisModelLib) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + _, err = dao.ZmkgGisModelLib.Ctx(ctx).Insert(do.ZmkgGisModelLib{ + ModelId: strings.ReplaceAll(uuid.New().String(), "-", ""), + ModelName: req.ModelName, + Url: strings.ReplaceAll(str, "resource/public/", ""), + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sZmkgGisModelLib) Edit(ctx context.Context, req *system.ZmkgGisModelLibEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + str, err := coryCommon.UploadFile(ctx, req.File, coryCommon.GisModelLib) + _, err = dao.ZmkgGisModelLib.Ctx(ctx).WherePri(req.Id).Update(do.ZmkgGisModelLib{ + ModelName: req.ModelName, + Url: strings.ReplaceAll(str, "resource/public/", ""), + UpdateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sZmkgGisModelLib) Delete(ctx context.Context, ids []int) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.ZmkgGisModelLib.Ctx(ctx).Delete(dao.ZmkgGisModelLib.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/model/.gitkeep b/internal/app/system/model/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/internal/app/system/model/app_menus.go b/internal/app/system/model/app_menus.go new file mode 100644 index 0000000..81cc5fd --- /dev/null +++ b/internal/app/system/model/app_menus.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-05-28 15:09:13 +// 生成路径: internal/app/system/model/app_menus.go +// 生成人:gfast +// desc:app菜单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// AppMenusInfoRes is the golang structure for table app_menus. +type AppMenusInfoRes struct { + gmeta.Meta `orm:"table:app_menus"` + MenuId uint `orm:"menu_id,primary" json:"menuId"` // + MenuName string `orm:"menu_name" json:"menuName"` // 菜单名 + CreatedAt *gtime.Time `orm:"created_at" json:"-"` // +} + +type AppMenusListRes struct { + MenuId uint `json:"menuId"` + MenuName string `json:"menuName"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/app_role_menus.go b/internal/app/system/model/app_role_menus.go new file mode 100644 index 0000000..c173c90 --- /dev/null +++ b/internal/app/system/model/app_role_menus.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-05-28 15:11:14 +// 生成路径: internal/app/system/model/app_role_menus.go +// 生成人:gfast +// desc:app角色绑定菜单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// AppRoleMenusInfoRes is the golang structure for table app_role_menus. +type AppRoleMenusInfoRes struct { + gmeta.Meta `orm:"table:app_role_menus"` + Id uint `orm:"id,primary" json:"id"` // + RoleId int `orm:"role_id" json:"roleId"` // 角色ID + MenuId int `orm:"menu_id" json:"menuId"` // 菜单ID + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // +} + +type AppRoleMenusListRes struct { + Id uint `json:"id"` + RoleId int `json:"roleId"` + MenuId int `json:"menuId"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/app_roles.go b/internal/app/system/model/app_roles.go new file mode 100644 index 0000000..91d4124 --- /dev/null +++ b/internal/app/system/model/app_roles.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-05-28 15:11:36 +// 生成路径: internal/app/system/model/app_roles.go +// 生成人:gfast +// desc:app角色 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// AppRolesInfoRes is the golang structure for table app_roles. +type AppRolesInfoRes struct { + gmeta.Meta `orm:"table:app_roles"` + RoleId uint `orm:"role_id,primary" json:"roleId"` // + RoleName string `orm:"role_name" json:"roleName"` // 角色名 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // +} + +type AppRoleDetails struct { + gmeta.Meta `orm:"table:app_roles"` + RoleId uint `orm:"role_id,primary" json:"roleId"` // + RoleName string `orm:"role_name" json:"roleName"` // 角色名 + Menus []AppMenusInfoRes `json:"menus"` // 拥有的菜单 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // +} + +type AppRolesListRes struct { + RoleId uint `json:"roleId"` + RoleName string `json:"roleName"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/app_user_disable_menus.go b/internal/app/system/model/app_user_disable_menus.go new file mode 100644 index 0000000..364459c --- /dev/null +++ b/internal/app/system/model/app_user_disable_menus.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-05-28 15:11:37 +// 生成路径: internal/app/system/model/app_user_disable_menus.go +// 生成人:gfast +// desc:app用户禁用菜单关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// AppUserDisableMenusInfoRes is the golang structure for table app_user_disable_menus. +type AppUserDisableMenusInfoRes struct { + gmeta.Meta `orm:"table:app_user_disable_menus"` + UserDisabledMenuId uint `orm:"user_disabled_menu_id,primary" json:"userDisabledMenuId"` // + UserId int `orm:"user_id" json:"userId"` // 用户ID + MenuId int `orm:"menu_id" json:"menuId"` // 菜单ID + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // +} + +type AppUserDisableMenusListRes struct { + UserDisabledMenuId uint `json:"userDisabledMenuId"` + UserId int `json:"userId"` + MenuId int `json:"menuId"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/app_user_menus.go b/internal/app/system/model/app_user_menus.go new file mode 100644 index 0000000..1cc3165 --- /dev/null +++ b/internal/app/system/model/app_user_menus.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-05-28 15:11:37 +// 生成路径: internal/app/system/model/app_user_menus.go +// 生成人:gfast +// desc:app用户菜单关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// AppUserMenusInfoRes is the golang structure for table app_user_menus. +type AppUserMenusInfoRes struct { + gmeta.Meta `orm:"table:app_user_menus"` + UserMenuId uint `orm:"user_menu_id,primary" json:"userMenuId"` // + UserId int `orm:"user_id" json:"userId"` // 用户ID + MenuId int `orm:"menu_id" json:"menuId"` // 菜单ID + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // +} + +type AppUserMenusListRes struct { + UserMenuId uint `json:"userMenuId"` + UserId int `json:"userId"` + MenuId int `json:"menuId"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/app_user_roles.go b/internal/app/system/model/app_user_roles.go new file mode 100644 index 0000000..e1f6249 --- /dev/null +++ b/internal/app/system/model/app_user_roles.go @@ -0,0 +1,49 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-05-28 15:11:37 +// 生成路径: internal/app/system/model/app_user_roles.go +// 生成人:gfast +// desc:app用户角色关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// AppUserRolesInfoRes is the golang structure for table app_user_roles. +type AppUserRolesInfoRes struct { + gmeta.Meta `orm:"table:app_user_roles"` + Id uint `orm:"id,primary" json:"id"` // + UserId int `orm:"user_id" json:"userId"` // 用户ID + RoleId int `orm:"role_id" json:"roleId"` // 关联的角色ID + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // +} + +type AppUserRoleDetails struct { + gmeta.Meta `orm:"table:app_user_roles"` + Rules []Ruler `json:"rules"` +} + +type Ruler struct { + UserId int `orm:"user_id" json:"-"` // 用户ID + RoleId int `orm:"role_id" json:"roleId" dc:"角色ID" ` // 关联的角色ID + MajorRole int `orm:"major_role" json:"-"` + RoleName string `orm:"role_name" json:"roleName" dc:"角色名称"` +} + +type AppRoles struct { + RoleId int `orm:"role_id" json:"roleId" dc:"角色ID" ` // 关联的角色ID + RoleName string `orm:"role_name" json:"roleName" dc:"角色名称"` + Tag int `orm:"tag" json:"-" dc:"标签"` +} + +type AppUserRolesListRes struct { + Id uint `json:"id"` + UserId int `json:"userId"` + RoleId int `json:"roleId"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/bus_attendance_machine.go b/internal/app/system/model/bus_attendance_machine.go new file mode 100644 index 0000000..a96173f --- /dev/null +++ b/internal/app/system/model/bus_attendance_machine.go @@ -0,0 +1,49 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2025-03-03 10:32:47 +// 生成路径: internal/app/system/model/bus_attendance_machine.go +// 生成人:gfast +// desc:考勤机 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusAttendanceMachineInfoRes is the golang structure for table bus_attendance_machine. +type BusAttendanceMachineInfoRes struct { + gmeta.Meta `orm:"table:bus_attendance_machine"` + Id uint64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId uint64 `orm:"project_id" json:"projectId"` // 项目ID + Sn string `orm:"sn" json:"sn"` // 设备sn + Status string `orm:"status" json:"status" ` //是否在线(0不在线 1在线) + Teams string `orm:"teams" json:"teams"` // 班组id,多个逗号分隔 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + Remark string `orm:"remark" json:"remark"` // 备注 +} + +type BusAttendanceMachineListRes struct { + Id uint64 `json:"id"` + ProjectId uint64 `json:"projectId" dc:"项目ID"` + Sn string `json:"sn" dc:"考勤机标识"` + Status string `json:"status" dc:"是否在线(0不在线 1在线)"` + Teams string `json:"teams" dc:"班组ID(多个逗号分割)"` + CreatedAt *gtime.Time `json:"createdAt" dc:"da"` + Remark string `json:"remark"` +} + +type BusAttendanceMachineExtendRes struct { + Id uint64 `json:"id"` + ProjectId uint64 `json:"projectId" dc:"项目ID"` + ProjectName string `json:"projectName" dc:"项目名称"` + Sn string `json:"sn" dc:"考勤机标识"` + Status string `json:"status" dc:"是否在线(0不在线 1在线)"` + Teams string `json:"teams" dc:"班组ID(多个逗号分割)"` + TeamsName string `json:"teamsName" dc:"班组名称(多个逗号分割)"` + Remark string `json:"remark" dc:"备注"` +} diff --git a/internal/app/system/model/bus_attendance_machine_user.go b/internal/app/system/model/bus_attendance_machine_user.go new file mode 100644 index 0000000..811e263 --- /dev/null +++ b/internal/app/system/model/bus_attendance_machine_user.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2025-03-03 10:33:17 +// 生成路径: internal/app/system/model/bus_attendance_machine_user.go +// 生成人:gfast +// desc:考勤机用户列 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusAttendanceMachineUserInfoRes is the golang structure for table bus_attendance_machine_user. +type BusAttendanceMachineUserInfoRes struct { + gmeta.Meta `orm:"table:bus_attendance_machine_user"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + MachineId int64 `orm:"machine_id" json:"machineId"` // 考勤机主键ID + TeamId int64 `orm:"team_id" json:"teamId"` // 班组ID + UserId int64 `orm:"user_id" json:"userId"` // 用户ID + Identifying int `orm:"identifying" json:"identifying"` // 标识(是否下发) +} + +type BusAttendanceMachineUserListRes struct { + Id int64 `json:"id"` + MachineId int64 `json:"machineId"` + TeamId int64 `json:"teamId"` + UserId int64 `json:"userId"` + Identifying int `json:"identifying"` +} diff --git a/internal/app/system/model/bus_camera_channel.go b/internal/app/system/model/bus_camera_channel.go new file mode 100644 index 0000000..0d4fde3 --- /dev/null +++ b/internal/app/system/model/bus_camera_channel.go @@ -0,0 +1,61 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-09-20 14:55:42 +// 生成路径: internal/app/system/model/bus_camera_channel.go +// 生成人:gfast +// desc:摄像头(国标通道) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusCameraChannelInfoRes is the golang structure for table bus_camera_channel. +type BusCameraChannelInfoRes struct { + gmeta.Meta `orm:"table:bus_camera_channel"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + CountryId int64 `orm:"country_id" json:"countryId"` // 摄像头ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 摄像头ID + ChannelNumber string `orm:"channel_number" json:"channelNumber"` // 国标通道号 + ChannelName string `orm:"channel_name" json:"channelName"` // 通道名称 + ChannelPath string `orm:"channel_path" json:"channelPath"` // 视频路径 flv + ChannelPathWs string `orm:"channel_path_ws" json:"channelPathWs"` // 视频路径 ws + ChannelPathRtc string `orm:"channel_path_rtc" json:"channelPathRtc"` // 视频路径 rtc + ChannelPathHls string `orm:"channel_path_hls" json:"channelPathHls"` // 视频路径 hls + ChannelFormat string `orm:"channel_format" json:"channelFormat"` // 视频格式(字典) + ChannelState string `orm:"channel_state" json:"channelState"` // 在线状态(字典) + SourceType string `orm:"source_type" json:"sourceType"` // 在线状态(字典) + Remark string `orm:"remark" json:"remark"` // 备注 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + Detail string `orm:"detail" json:"detail"` // 更新者 + Imei string `orm:"imei,primary" json:"imei"` // 更新者 + Iccid string `orm:"iccid,primary" json:"iccid"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type BusCameraChannelListRes struct { + Id int64 `json:"id"` + CountryId int64 `json:"countryId"` + ProjectId *gtime.Time `json:"projectId"` + ChannelNumber string `json:"channelNumber"` + ChannelName string `json:"channelName"` + ChannelPath string `json:"channelPath"` + ChannelPathWs string `json:"channelPathWs"` + ChannelPathRtc string `json:"channelPathRtc"` + ChannelPathHls string `json:"channelPathHls"` + ChannelFormat string `json:"channelFormat"` + ChannelState string `json:"channelState"` + Remark string `json:"remark"` + Detail string `json:"detail"` + Imei string `json:"imei"` + Iccid string `json:"iccid"` + SourceType string `json:"source_type"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/bus_camera_chinese_standard.go b/internal/app/system/model/bus_camera_chinese_standard.go new file mode 100644 index 0000000..6dae015 --- /dev/null +++ b/internal/app/system/model/bus_camera_chinese_standard.go @@ -0,0 +1,40 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-09-20 14:55:24 +// 生成路径: internal/app/system/model/bus_camera_chinese_standard.go +// 生成人:gfast +// desc:摄像头(国标) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusCameraChineseStandardInfoRes is the golang structure for table bus_camera_chinese_standard. +type BusCameraChineseStandardInfoRes struct { + gmeta.Meta `orm:"table:bus_camera_chinese_standard"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + CountryNumber string `orm:"country_number" json:"countryNumber"` // 国标号 + ProjectId int64 `orm:"project_id" json:"projectId"` // 国标号 + CountryName string `orm:"country_name" json:"countryName"` // 摄像头名称 + CountryState string `orm:"country_state" json:"countryState"` // 在线状态(字典) + Remark string `orm:"remark" json:"remark"` // 备注 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type BusCameraChineseStandardListRes struct { + Id int64 `json:"id"` + CountryNumber string `json:"countryNumber"` + CountryName string `json:"countryName"` + CountryState string `json:"countryState"` + ProjectId int64 `json:"projectId"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/bus_category.go b/internal/app/system/model/bus_category.go new file mode 100644 index 0000000..020809c --- /dev/null +++ b/internal/app/system/model/bus_category.go @@ -0,0 +1,26 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-10-07 15:52:19 +// 生成路径: internal/app/system/model/bus_category.go +// 生成人:gfast +// desc:题库_题库类别 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusCategoryInfoRes is the golang structure for table bus_category. +type BusCategoryInfoRes struct { + gmeta.Meta `orm:"table:bus_category"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + CategoryName string `orm:"category_name" json:"categoryName"` // 题库类别 +} + +type BusCategoryListRes struct { + Id int64 `json:"id"` + CategoryName string `json:"categoryName"` +} diff --git a/internal/app/system/model/bus_company.go b/internal/app/system/model/bus_company.go new file mode 100644 index 0000000..8b2cdfa --- /dev/null +++ b/internal/app/system/model/bus_company.go @@ -0,0 +1,43 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-28 14:08:14 +// 生成路径: internal/app/system/model/bus_company.go +// 生成人:gfast +// desc:公司 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusCompanyInfoRes is the golang structure for table bus_company. +type BusCompanyInfoRes struct { + gmeta.Meta `orm:"table:bus_company"` + CompanyId int64 `orm:"company_id,primary" json:"companyId"` // 序号 + CompanyName string `orm:"company_name" json:"companyName"` // 公司名称 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Status string `orm:"status" json:"status"` // 帐号状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type BusCompanyListRes struct { + CompanyId int64 `json:"companyId"` + CompanyName string `json:"companyName"` + Status string `json:"status"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` +} + +type BusCompanyAppListRes struct { + CompanyId int64 `json:"companyId"` + CompanyName string `json:"companyName"` +} diff --git a/internal/app/system/model/bus_complaint_box.go b/internal/app/system/model/bus_complaint_box.go new file mode 100644 index 0000000..3967780 --- /dev/null +++ b/internal/app/system/model/bus_complaint_box.go @@ -0,0 +1,55 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-12-04 18:09:50 +// 生成路径: internal/app/system/model/bus_complaint_box.go +// 生成人:gfast +// desc:意见箱 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusComplaintBoxInfoRes is the golang structure for table bus_complaint_box. +type BusComplaintBoxInfoRes struct { + gmeta.Meta `orm:"table:bus_complaint_box"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Openid string `orm:"openid" json:"openid"` // openid + Opinion string `orm:"opinion" json:"opinion"` // 意见 + Status string `orm:"status" json:"status"` // 状态(0未读,1已读) + Dispose *gtime.Time `orm:"dispose" json:"dispose"` // 处理时间 + Remark string `orm:"remark" json:"remark"` // 备注 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + ProjectName string `orm:"project_name" json:"projectName"` // 项目名称 + ShortName string `orm:"short_name" json:"shortName"` // 项目简称 + Phone string `orm:"phone" json:"phone"` // 项目简称 + FileEntityList []*FileEntityRes `orm:"fileEntityList" json:"fileEntityList"` +} + +type BusComplaintBoxListRes struct { + Id int64 `json:"id"` + ProjectId int64 `json:"projectId"` + Openid string `json:"openid"` + Opinion string `json:"opinion"` + Status string `json:"status"` + Dispose *gtime.Time `json:"dispose"` + Remark string `json:"remark"` + CreatedAt *gtime.Time `json:"createdAt"` + ProjectName string `json:"projectName"` + ShortName string `json:"shortName"` + Phone string `json:"phone"` +} + +type FileEntityRes struct { + Id int64 `p:"id" dc:"主键ID"` + TicketId int64 `p:"ticket_id" dc:"父主键ID"` + Name string `p:"name" dc:"文件名称"` + Path string `p:"path" dc:"文件路径"` + FileType string `p:"file_type" dc:"文件类型(后缀)"` +} diff --git a/internal/app/system/model/bus_construction_blacklist.go b/internal/app/system/model/bus_construction_blacklist.go new file mode 100644 index 0000000..615cc2c --- /dev/null +++ b/internal/app/system/model/bus_construction_blacklist.go @@ -0,0 +1,35 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-11-10 14:08:39 +// 生成路径: internal/app/system/model/bus_construction_blacklist.go +// 生成人:gfast +// desc:黑名单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionBlacklistInfoRes is the golang structure for table bus_construction_blacklist. +type BusConstructionBlacklistInfoRes struct { + gmeta.Meta `orm:"table:bus_construction_blacklist"` + Openid string `orm:"openid,primary" json:"openid"` // openid + Name string `orm:"name" json:"name"` // 名字 + SfzNumber string `orm:"sfz_number" json:"sfzNumber"` // 身份证号码 + Remark string `orm:"remark" json:"remark"` // 备注 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + CreateBy string `orm:"create_by" json:"createBy"` // 操作人/创建人 +} + +type BusConstructionBlacklistListRes struct { + Openid string `json:"openid"` + Name string `json:"name"` + SfzNumber string `json:"sfzNumber"` + Remark string `json:"remark"` + CreatedAt *gtime.Time `json:"createdAt"` + CreateBy string `json:"createBy"` +} diff --git a/internal/app/system/model/bus_construction_log.go b/internal/app/system/model/bus_construction_log.go new file mode 100644 index 0000000..71e0d02 --- /dev/null +++ b/internal/app/system/model/bus_construction_log.go @@ -0,0 +1,62 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-03-22 16:27:43 +// 生成路径: internal/app/system/model/bus_construction_log.go +// 生成人:gfast +// desc:施工日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionLogInfoRes is the golang structure for table bus_construction_log. +type BusConstructionLogInfoRes struct { + gmeta.Meta `orm:"table:bus_construction_log"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目ID + DateOfOccurrence string `orm:"date_of_occurrence" json:"dateOfOccurrence"` // 发生日期 + Condition string `orm:"condition" json:"condition"` // 生产情况 + TechnologyQuality string `orm:"technology_quality" json:"technologyQuality"` // 技术质量安全工作 + Remark string `orm:"remark" json:"remark"` // 备注 + Path string `orm:"path" json:"path"` // 附件(多个逗号分割) + CreatedBy string `orm:"created_by" json:"createdBy"` // 创建人 + UpdatedBy string `orm:"updated_by" json:"updatedBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type BusConstructionLogListRes struct { + Id int64 `json:"id"` + ProjectId int64 `json:"projectId"` + DateOfOccurrence string `json:"dateOfOccurrence"` + Condition string `json:"condition"` + TechnologyQuality string `json:"technologyQuality"` + Remark string `json:"remark"` + CreatedBy string `json:"createdBy"` +} + +type AppletDetails struct { + BusConstructionLogInfoRes + ProjectName string `orm:"project_name" json:"projectName"` +} + +type AppletList struct { + Id int64 `json:"id" dc:"主键"` + ProjectName string `json:"projectName" p:"test" dc:"项目名称"` + CreatedBy string `json:"created_by" dc:"录入人"` + CreatedAt *gtime.Time `json:"created_at" dc:"录入时间"` + DateOfOccurrence string `json:"date_of_occurrence" dc:"发生日期"` +} + +type AppletListaaaaaRes struct { + Id int64 `json:"id" dc:"主键"` + ProjectName string `json:"projectName" p:"test" dc:"项目名称"` + CreatedBy string `json:"created_by" dc:"录入人"` + CreatedAt *gtime.Time `json:"created_at" dc:"录入时间"` +} diff --git a/internal/app/system/model/bus_construction_project.go b/internal/app/system/model/bus_construction_project.go new file mode 100644 index 0000000..549c3d2 --- /dev/null +++ b/internal/app/system/model/bus_construction_project.go @@ -0,0 +1,28 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-07 10:17:50 +// 生成路径: internal/app/system/model/bus_construction_project.go +// 生成人:gfast +// desc:施工人员对应项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionProjectInfoRes is the golang structure for table bus_construction_project. +type BusConstructionProjectInfoRes struct { + gmeta.Meta `orm:"table:bus_construction_project"` + Id uint64 `orm:"id,primary" json:"id"` // 序号 + ConstructionUserId int64 `orm:"construction_user_id" json:"constructionUserId"` // 微信用户id + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id +} + +type BusConstructionProjectListRes struct { + Id uint64 `json:"id"` + ConstructionUserId int64 `json:"constructionUserId"` + ProjectId int64 `json:"projectId"` +} diff --git a/internal/app/system/model/bus_construction_user.go b/internal/app/system/model/bus_construction_user.go new file mode 100644 index 0000000..a010488 --- /dev/null +++ b/internal/app/system/model/bus_construction_user.go @@ -0,0 +1,159 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-07 10:31:18 +// 生成路径: internal/app/system/model/bus_construction_user.go +// 生成人:gfast +// desc:施工人员 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionUserInfoRes is the golang structure for table bus_construction_user. +type BusConstructionUserInfoRes struct { + gmeta.Meta `orm:"table:bus_construction_user"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + Openid string `orm:"openid" json:"openid"` // 微信id + NickName string `orm:"nick_name" json:"nickName"` // 微信名称 + TeamId int64 `orm:"team_id" json:"teamId"` // 班组id + LabourserviceId int64 `orm:"labourservice_id" json:"labourserviceId"` // 劳务ID + HeadIcon string `orm:"head_icon" json:"headIcon"` // 登陆照片 + PacePhoto string `orm:"pace_photo" json:"pacePhoto"` // 人脸照 + UserName string `orm:"user_name" json:"userName"` // 人员姓名 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Status string `orm:"status" json:"status"` // 状态 + IsPinch string `orm:"is_pinch" json:"isPinch"` // 是否代打 + IfManagement string `orm:"if_management" json:"ifManagement"` // 是否班组管理 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Phone string `orm:"phone" json:"phone"` // 电话 + Sex string `orm:"sex" json:"sex"` // 性别 + SfzNation string `orm:"sfz_nation" json:"sfzNation"` // 身份证民族 + SfzNumber string `orm:"sfz_number" json:"sfzNumber"` // 身份证号码 + SfzStart string `orm:"sfz_start" json:"sfzStart"` // 身份证有效开始期 + SfzEnd string `orm:"sfz_end" json:"sfzEnd"` // 身份证有效结束期 + SfzSite string `orm:"sfz_site" json:"sfzSite"` // 身份证地址 + NativePlace string `orm:"native_place" json:"nativePlace"` // 籍贯 + YhkNumber string `orm:"yhk_number" json:"yhkNumber"` // 银行卡号 + YhkOpeningBank string `orm:"yhk_opening_bank" json:"yhkOpeningBank"` // 开户行 + YhkCardholder string `orm:"yhk_cardholder" json:"yhkCardholder"` // 持卡人 + ProjectRecord string `orm:"project_record" json:"projectRecord"` // 持卡人 + EntryDate *gtime.Time `orm:"entry_date" json:"entryDate"` // 入场时间 + LeaveDate *gtime.Time `orm:"leave_date,omitempty" json:"leaveDate"` // 离场时间 +} + +type BusConstructionUserListRes struct { + Id int64 `json:"id"` + Openid string `json:"openid"` + NickName string `json:"nickName"` + TeamId int64 `json:"teamId"` + HeadIcon string `json:"headIcon"` + PacePhoto string `json:"pacePhoto"` + UserName string `json:"userName"` + ProjectId int64 `json:"projectId"` + Status string `json:"status"` + IsPinch string `json:"isPinch"` + IfManagement string `json:"ifManagement"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` + Phone string `json:"phone"` + Sex string `json:"sex"` + SfzNation string `json:"sfzNation"` + SfzNumber string `json:"sfzNumber"` + SfzStart string `json:"sfzStart"` + SfzEnd string `json:"sfzEnd"` + SfzSite string `json:"sfzSite"` + NativePlace string `json:"nativePlace"` + YhkNumber string `json:"yhkNumber"` + YhkOpeningBank string `json:"yhkOpeningBank"` + YhkCardholder string `json:"yhkCardholder"` + ProjectRecord string `json:"projectRecord"` + EntryDate *gtime.Time `json:"entryDate"` + LeaveDate *gtime.Time `json:"leaveDate"` +} + +type ModBlackListRes struct { + Id int64 `json:"id"` + Openid string `json:"openid"` + UserName string `json:"userName"` + SfzNumber string `json:"sfzNumber"` +} + +// ExcelEntity 结构 +type ExcelEntity struct { + Row int64 `json:"row"` + Col int64 `json:"col"` + Data string `json:"data"` + DataType string `json:"dataType"` + ID string `json:"id"` +} + +// AttendanceAllEntity 考勤信息导出实体类(所有班组) +type AttendanceAllEntity struct { + ProjectName string `json:"projectName" dc:"项目名称"` + TeamName string `json:"teamName" dc:"班组名称"` + Team []AttendanceEntity `json:"team" dc:"班组"` +} + +// AttendanceEntity 考勤信息导出实体类(班组成员) +type AttendanceEntity struct { + Name string `json:"row" dc:"姓名"` + IdentityCard string `json:"identity_card" dc:"身份证号码"` + Type bool `json:"type" dc:"是否退场(true已退场 fales未退场)"` + Attendance map[string]float32 `json:"attendance" dc:"实际出勤天数"` +} + +// BusConstructionUserDepartureInfoRes 施工人员入场退场记录信息 +type BusConstructionUserDepartureInfoRes struct { + gmeta.Meta `orm:"table:bus_construction_user_departure"` + Id int64 `orm:"id,primary" json:"id" dc:"主键ID"` + SfzNumber string `orm:"sfz_number" json:"sfzNumber" dc:"身份证号码"` + ProjectId int64 `orm:"project_id" json:"projectId" dc:"项目ID"` + TeamId int64 `orm:"team_id" json:"teamId" dc:"班组ID"` + EntryDate *gtime.Time `orm:"entry_date" json:"entryDate" dc:"入场"` + LeaveDate *gtime.Time `orm:"leave_date" json:"leaveDate" dc:"离场"` + Path string `orm:"path" json:"path" dc:"路径"` + Remark string `orm:"remark" json:"remark" dc:"备注"` +} + +type DiSanFang struct { + Id int64 `json:"id"` + Openid string `json:"openid"` + NickName string `json:"nickName"` + TeamId int64 `json:"teamId"` + HeadIcon string `json:"headIcon"` + PacePhoto string `json:"pacePhoto"` + UserName string `json:"userName"` + ProjectId int64 `json:"projectId"` + Status string `json:"status"` + IsPinch string `json:"isPinch"` + IfManagement string `json:"ifManagement"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` + Phone string `json:"phone"` + Sex string `json:"sex"` + SfzNation string `json:"sfzNation"` + SfzNumber string `json:"sfzNumber"` + SfzStart string `json:"sfzStart"` + SfzBirth string `json:"sfzBirth"` + SfzEnd string `json:"sfzEnd"` + SfzSite string `json:"sfzSite"` + NativePlace string `json:"nativePlace"` + YhkNumber string `json:"yhkNumber"` + YhkOpeningBank string `json:"yhkOpeningBank"` + YhkCardholder string `json:"yhkCardholder"` + ProjectRecord string `json:"projectRecord"` + EntryDate *gtime.Time `json:"entryDate"` + LeaveDate *gtime.Time `json:"leaveDate"` + PostId string `json:"postId"` +} diff --git a/internal/app/system/model/bus_construction_user_file.go b/internal/app/system/model/bus_construction_user_file.go new file mode 100644 index 0000000..dc3a733 --- /dev/null +++ b/internal/app/system/model/bus_construction_user_file.go @@ -0,0 +1,54 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-07 10:17:41 +// 生成路径: internal/app/system/model/bus_construction_user_file.go +// 生成人:gfast +// desc:微信用户的文件存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionUserFileInfoRes is the golang structure for table bus_construction_user_file. +type BusConstructionUserFileInfoRes struct { + gmeta.Meta `orm:"table:bus_construction_user_file"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + UserId int64 `orm:"user_id" json:"userId"` // 用户id + UserImgType string `orm:"user_img_type" json:"userImgType"` // 图片类型 + Path string `orm:"path" json:"path"` // 图片路径 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Remark string `orm:"remark" json:"remark"` // 备注 +} + +type BusConstructionUserFileListRes struct { + Id int64 `json:"id"` + UserId int64 `json:"userId"` + UserImgType string `json:"userImgType" dc:"图片类型(字典)"` + Path string `json:"path"` + CreatedAt *gtime.Time `json:"createdAt"` +} +type DataRes struct { + BusConstructionUserFileListRes + IdentityCard string `json:"identityCard"` +} + +// 施工人员表 bus_construction_user openid 和名字 +type BusConstructionUserSafetyFileReq struct { + Openid string `json:"openid"` + UserName string `json:"userName"` +} + +// 安全考试的pdf ModelWeChatPdfWoRes 结构体 +type BusWechatFileRes struct { + Path string `json:"path" dc:"pdf试卷"` + Type string `json:"type" dc:"1pdf 2图片"` +} diff --git a/internal/app/system/model/bus_construction_user_post.go b/internal/app/system/model/bus_construction_user_post.go new file mode 100644 index 0000000..f9cba8e --- /dev/null +++ b/internal/app/system/model/bus_construction_user_post.go @@ -0,0 +1,28 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-07 10:06:34 +// 生成路径: internal/app/system/model/bus_construction_user_post.go +// 生成人:gfast +// desc:施工人员岗位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionUserPostInfoRes is the golang structure for table bus_construction_user_post. +type BusConstructionUserPostInfoRes struct { + gmeta.Meta `orm:"table:bus_construction_user_post"` + Id uint64 `orm:"id,primary" json:"id"` // + ConstructionUserId int64 `orm:"construction_user_id" json:"constructionUserId"` // 施工人员id + PostId int64 `orm:"post_id" json:"postId"` // 岗位id +} + +type BusConstructionUserPostListRes struct { + Id uint64 `json:"id"` + ConstructionUserId int64 `json:"constructionUserId"` + PostId int64 `json:"postId"` +} diff --git a/internal/app/system/model/bus_corporate_events.go b/internal/app/system/model/bus_corporate_events.go new file mode 100644 index 0000000..7e5b286 --- /dev/null +++ b/internal/app/system/model/bus_corporate_events.go @@ -0,0 +1,36 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-03-20 16:49:36 +// 生成路径: internal/app/system/model/bus_corporate_events.go +// 生成人:gfast +// desc:企业大事记 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusCorporateEventsInfoRes is the golang structure for table bus_corporate_events. +type BusCorporateEventsInfoRes struct { + gmeta.Meta `orm:"table:bus_corporate_events"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + Headline string `orm:"headline" json:"headline"` // 标题 + Content string `orm:"content" json:"content"` // 内容 + CreatedBy string `orm:"created_by" json:"createdBy"` // 创建人 + UpdatedBy string `orm:"updated_by" json:"updatedBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type BusCorporateEventsListRes struct { + Id int64 `json:"id"` + Headline string `json:"headline"` + Content string `json:"content"` + CreatedBy string `json:"createdBy"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/bus_design_audit.go b/internal/app/system/model/bus_design_audit.go new file mode 100644 index 0000000..7aedf09 --- /dev/null +++ b/internal/app/system/model/bus_design_audit.go @@ -0,0 +1,76 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-04-09 15:40:16 +// 生成路径: internal/app/system/model/bus_design_audit.go +// 生成人:gfast +// desc:设计审核(竣工、施工、可研) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusDesignAuditInfoRes is the golang structure for table bus_design_audit. +type BusDesignAuditInfoRes struct { + gmeta.Meta `orm:"table:bus_design_audit"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目ID + TableName string `orm:"table_name" json:"tableName"` // 表名 + TableId int64 `orm:"table_id" json:"tableId"` // 表ID + Status string `orm:"status" json:"status"` // 审核状态(1未读 2拒绝 3通过) + Cause string `orm:"cause" json:"cause"` // 拒绝原因 + Auditor int64 `orm:"auditor" json:"auditor"` // 审核人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type BusDesignAuditListRes struct { + Id int64 `json:"id"` + ProjectId int64 `json:"projectId"` + TableName string `json:"tableName"` + TableId int64 `json:"tableId"` + Status string `json:"status"` + Cause string `json:"cause"` + Auditor int64 `json:"auditor"` + CreatedAt *gtime.Time `json:"createdAt"` +} + +// CoryAuditListRes 审核列表(PC) +type CoryAuditListRes struct { + Id int64 `json:"id"` + FileType int `json:"fileType" dc:"文件状态(1正常 2回收站 3彻底删除)"` + Type string `json:"type" dc:"文件类型(1文件 2文件夹)"` + FileName string `json:"fileName" dc:"文件名称"` + FilePath string `json:"filePath" dc:"文件路径"` + TableName string `json:"tableName"` + TableId int64 `json:"tableId"` + Status string `json:"status" dc:"审核状态(1未读 2拒绝 3通过)"` + Cause string `json:"cause" dc:"拒绝原因"` + Auditor int64 `json:"auditor" dc:"审核人"` + AuditorName string `json:"auditorName" dc:"审核人名称"` + CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"` +} + +// ========================================= 设计文档操作记录 + +type SelectTabNameAndTabIdByDateReq struct { + TableName string `json:"tableName" dc:"表名"` + TableId int64 `json:"tableId" dc:"表ID"` + FatherId int64 `json:"fatherId" dc:"父ID"` //这个只用来取父ID的新增信息(有且只会有一条) + ProjectId int64 `json:"projectId" dc:"项目ID"` +} +type SelectTabNameAndTabIdByDateRes struct { + gmeta.Meta `orm:"table:bus_design_document_record"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目ID + TableName string `orm:"table_name" json:"tableName"` // 表名 + TableId int64 `orm:"table_id" json:"tableId"` // 表ID + DesignOperateType int64 `orm:"design_operate_type" json:"designOperateType"` // 操作类型(字典) + CreatedBy string `orm:"created_by" json:"createdBy"` // 创建人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 +} diff --git a/internal/app/system/model/bus_design_document.go b/internal/app/system/model/bus_design_document.go new file mode 100644 index 0000000..8172b3f --- /dev/null +++ b/internal/app/system/model/bus_design_document.go @@ -0,0 +1,39 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-29 16:31:29 +// 生成路径: internal/app/system/model/bus_design_document.go +// 生成人:gfast +// desc:设计管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusDesignDocumentInfoRes is the golang structure for table bus_design_document. +type BusDesignDocumentInfoRes struct { + gmeta.Meta `orm:"table:bus_design_document"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + DocumenName string `orm:"documen_name" json:"documenName"` // 文档名称 + Remark string `orm:"remark" json:"remark"` // 备注 + DocumentUrl string `orm:"document_url" json:"documentUrl"` // 文件路径 + FileId int64 `orm:"file_id" json:"fileId"` // 文件夹id + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Status string `orm:"status" json:"status"` // 状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 上传时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type BusDesignDocumentListRes struct { + Id int64 `json:"id"` + DocumenName string `json:"documenName"` + Remark string `json:"remark"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/bus_design_period_range.go b/internal/app/system/model/bus_design_period_range.go new file mode 100644 index 0000000..2a8f071 --- /dev/null +++ b/internal/app/system/model/bus_design_period_range.go @@ -0,0 +1,47 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-04-11 17:28:54 +// 生成路径: internal/app/system/model/bus_design_period_range.go +// 生成人:gfast +// desc:设计-周期范围 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusDesignPeriodRangeInfoRes is the golang structure for table bus_design_period_range. +type BusDesignPeriodRangeInfoRes struct { + gmeta.Meta `orm:"table:bus_design_period_range"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + TableType string `orm:"table_type" json:"tableType"` // 记录类型(1竣工 2施工 3可研) + FileName string `orm:"file_name" json:"fileName"` // 文件名称 + FilePath string `orm:"file_path" json:"filePath"` // 文件路径 + IsEntering string `orm:"is_entering" json:"isEntering"` // 路径内容是否存在(1否 2是) + StartTime string `orm:"start_time" json:"startTime"` // 起始时间 + EndTime string `orm:"end_time" json:"endTime"` // 结束时间 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 录入者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type BusDesignPeriodRangeListRes struct { + Id int64 `json:"id"` + ProjectId int64 `json:"projectId"` + TableType string `json:"tableType"` + FileName string `json:"fileName"` + FilePath string `json:"filePath"` + IsEntering string `json:"isEntering"` + StartTime string `json:"startTime"` + EndTime string `json:"endTime"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/bus_engineering_quality.go b/internal/app/system/model/bus_engineering_quality.go new file mode 100644 index 0000000..0a7482b --- /dev/null +++ b/internal/app/system/model/bus_engineering_quality.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-29 09:31:22 +// 生成路径: internal/app/system/model/bus_engineering_quality.go +// 生成人:gfast +// desc:工程质量列 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" +) + +// BusEngineeringQualityInfoRes is the golang structure for table bus_engineering_quality. +type BusEngineeringQualityInfoRes struct { + gmeta.Meta `orm:"table:bus_engineering_quality"` + Id uint64 `orm:"id,primary" json:"id"` // 序号 + UnitName1 string `orm:"unit_name1" json:"unitName1"` // 单位工程 + UnitName2 string `orm:"unit_name2" json:"unitName2"` // 子单位工程 + UnitName3 string `orm:"unit_name3" json:"unitName3"` // 分部工程 + UnitName4 string `orm:"unit_name4" json:"unitName4"` // 子分部工程 + UnitName5 string `orm:"unit_name5" json:"unitName5"` // 分项工程 + UnitName6 string `orm:"unit_name6" json:"unitName6"` // 检验批 + QualityName string `orm:"quality_name" json:"qualityName"` // 工程项目名称 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Status string `orm:"status" json:"status"` // 施工类型状态 + FileUrl string `orm:"file_url" json:"fileUrl"` // 文件地址 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreateTime *gtime.Time `orm:"create_time" json:"createTime"` // 创建时间 + UpdateTime *gtime.Time `orm:"update_time" json:"updateTime"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type BusEngineeringQualityListRes struct { + Id uint64 `json:"id"` + UnitName1 string `json:"unitName1"` + UnitName2 string `json:"unitName2"` + UnitName3 string `json:"unitName3"` + UnitName4 string `json:"unitName4"` + UnitName5 string `json:"unitName5"` + UnitName6 string `json:"unitName6"` + QualityName string `json:"qualityName"` + Status string `json:"status"` + FileUrl []*comModel.UpFile `json:"fileUrl"` + CreateBy string `json:"createBy"` + CreateTime *gtime.Time `json:"createTime"` + UpdateTime *gtime.Time `json:"updateTime"` +} diff --git a/internal/app/system/model/bus_equipment_equipment_unpacking.go b/internal/app/system/model/bus_equipment_equipment_unpacking.go new file mode 100644 index 0000000..44eecd2 --- /dev/null +++ b/internal/app/system/model/bus_equipment_equipment_unpacking.go @@ -0,0 +1,41 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-29 11:14:45 +// 生成路径: internal/app/system/model/bus_equipment_equipment_unpacking.go +// 生成人:gfast +// desc:开箱记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusEquipmentEquipmentUnpackingInfoRes is the golang structure for table bus_equipment_equipment_unpacking. +type BusEquipmentEquipmentUnpackingInfoRes struct { + gmeta.Meta `orm:"table:bus_equipment_equipment_unpacking"` + UnpackingId int64 `orm:"unpacking_id,primary" json:"unpackingId"` // 序号 + EquipmentMaterialsId int64 `orm:"equipment_materials_id" json:"equipmentMaterialsId"` // 设备id + UnpackingName string `orm:"unpacking_name" json:"unpackingName"` // 开箱名称 + UnpackingUrl string `orm:"unpacking_url" json:"unpackingUrl"` // 开箱上传文件 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Status string `orm:"status" json:"status"` // 状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type BusEquipmentEquipmentUnpackingListRes struct { + UnpackingId int64 `json:"unpackingId"` + EquipmentMaterialsId int64 `json:"equipmentMaterialsId"` + UnpackingName string `json:"unpackingName"` + UnpackingUrl string `json:"unpackingUrl"` + ProjectId int64 `json:"projectId"` + Status string `json:"status"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/bus_equipment_materials.go b/internal/app/system/model/bus_equipment_materials.go new file mode 100644 index 0000000..00ea0ae --- /dev/null +++ b/internal/app/system/model/bus_equipment_materials.go @@ -0,0 +1,163 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-29 11:14:16 +// 生成路径: internal/app/system/model/bus_equipment_materials.go +// 生成人:gfast +// desc:材料/设备名称 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusEquipmentMaterialsInfoRes is the golang structure for table bus_equipment_materials. +type BusEquipmentMaterialsInfoRes struct { + gmeta.Meta `orm:"table:bus_equipment_materials"` + EquipmentMaterialsId int64 `orm:"equipment_materials_id,primary" json:"equipmentMaterialsId"` // 序号 + EquipmentMaterialsName string `orm:"equipment_materials_name" json:"equipmentMaterialsName"` // 材料/设备 + CompanyId int64 `orm:"company_id" json:"companyId"` // 公司 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目 + TypeSpecificationName string `orm:"type_specification_name" json:"typeSpecificationName"` // 规格型号 + TypeSpecificationUrl string `orm:"type_specification_url" json:"typeSpecificationUrl"` // 规格型号文件 + CertificateConformityName string `orm:"certificate_conformity_name" json:"certificateConformityName"` // 合格证编号 + CertificateConformityUrl string `orm:"certificate_conformity_url" json:"certificateConformityUrl"` // 合格证编号文件 + QualityName string `orm:"quality_name" json:"qualityName"` // 质量说明书编号 + QualityUrl string `orm:"quality_url" json:"qualityUrl"` // 质量说明书文件 + InspectionReportName string `orm:"inspection_report_name" json:"inspectionReportName"` // 检验报告编号 + InspectionReportUrl string `orm:"inspection_report_url" json:"inspectionReportUrl"` // 检验报告文件 + ReexamineReportName string `orm:"reexamine_report_name" json:"reexamineReportName"` // 复试报告编号 + ReexamineReportUrl string `orm:"reexamine_report_url" json:"reexamineReportUrl"` // 复试报告文件 + UsePart string `orm:"use_part" json:"usePart"` // 使用部位 + WeightId string `orm:"weight_id" json:"weightId"` // 计量单位 + Remark string `orm:"remark" json:"remark"` // 备注 + QuantityCount string `orm:"quantity_count" json:"quantityCount"` // 材料数量 + Status string `orm:"status" json:"status"` // 状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除视角 + Nr int `orm:"nr" json:"nr"` // 出库数量统计 + Rk int `orm:"rk" json:"rk"` // 入库数量统计 + TimeOfEntryAndExit *gtime.Time `orm:"timeOfEntryAndExit" json:"timeOfEntryAndExit"` // 出入库最新操作时间 + + TotalNumber int `orm:"total_number" json:"totalNumber"` +} + +type BusEquipmentMaterialsListRes struct { + EquipmentMaterialsId int64 `json:"equipmentMaterialsId"` + EquipmentMaterialsName string `json:"equipmentMaterialsName"` + CompanyId int64 `json:"companyId"` + ProjectId int64 `json:"projectId"` + TypeSpecificationName string `json:"typeSpecificationName"` + TypeSpecificationUrl string `json:"typeSpecificationUrl"` + CertificateConformityName string `json:"certificateConformityName"` + CertificateConformityUrl string `json:"certificateConformityUrl"` + QualityName string `json:"qualityName"` + QualityUrl string `json:"qualityUrl"` + InspectionReportName string `json:"inspectionReportName"` + InspectionReportUrl string `json:"inspectionReportUrl"` + ReexamineReportName string `json:"reexamineReportName"` + ReexamineReportUrl string `json:"reexamineReportUrl"` + UsePart string `json:"usePart"` + WeightId string `json:"weightId"` + Remark string `json:"remark"` + QuantityCount string `json:"quantityCount"` + Status string `json:"status"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` + Nr int `json:"nr"` // 出库数量统计 + Rk int `json:"rk"` // 入库数量统计 + TimeOfEntryAndExit *gtime.Time `json:"timeOfEntryAndExit"` // 最新的出入库时间 +} + +//app + +type BusEquipmentMaterialsAppNameRes struct { + EquipmentMaterialsId int64 `orm:"equipment_materials_id,primary" json:"equipmentMaterialsId" dc:"序号"` + EquipmentMaterialsName string `orm:"equipment_materials_name" json:"equipmentMaterialsName" dc:"材料名称"` + CompanyId int64 `orm:"company_id" json:"companyId" dc:"公司"` + ProjectId int64 `orm:"project_id" json:"projectId" dc:"项目"` + WeightId string `orm:"weight_id" json:"weightId" dc:"计量单位"` + TypeSpecificationName string `orm:"type_specification_name" json:"typeSpecificationName" dc:"规格型号"` + QuantityCount string `json:"quantityCount" dc:"设计量"` +} +type BusEquipmentMaterialsAppListRes struct { + EquipmentMaterialsId int64 `orm:"equipment_materials_id,primary" json:"equipmentMaterialsId" dc:"序号"` + EquipmentMaterialsName string `orm:"equipment_materials_name" json:"equipmentMaterialsName" dc:"材料名称"` + CompanyId int64 `orm:"company_id" json:"companyId" dc:"公司"` + ProjectId int64 `orm:"project_id" json:"projectId" dc:"项目"` + WeightId string `orm:"weight_id" json:"weightId" dc:"计量单位"` + TypeSpecificationName string `orm:"type_specification_name" json:"typeSpecificationName" dc:"规格型号"` + QuantityCount string `json:"quantityCount" dc:"设计量"` + AllInventoryNumber int `json:"allInventoryNumber" dc:"总的入库库存数量"` + AllOutboundNumber int `json:"allOutboundNumber" dc:"总的出库数量"` +} + +//appgetid + +// BusEquipmentMaterialsAppInfoRes is the golang structure for table bus_equipment_materials. +type BusEquipmentMaterialsAppInfoRes struct { + gmeta.Meta `orm:"table:bus_equipment_materials"` + EquipmentMaterialsId int64 `orm:"equipment_materials_id,primary" json:"equipmentMaterialsId"` // 序号 + EquipmentMaterialsName string `orm:"equipment_materials_name" json:"equipmentMaterialsName"` // 材料/设备 + CompanyId int64 `orm:"company_id" json:"companyId"` // 公司 + CompanyName string `orm:"company_name"json:"companyName" dc:"公司名字"` + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目 + TypeSpecificationName string `orm:"type_specification_name" json:"typeSpecificationName" dc:"规格型号"` // 规格型号 + TypeSpecificationUrl string `orm:"type_specification_url" json:"typeSpecificationUrl"` // 规格型号文件 + CertificateConformityName string `orm:"certificate_conformity_name" json:"certificateConformityName" dc:"合格证编号"` // 合格证编号 + CertificateConformityUrl string `orm:"certificate_conformity_url" json:"certificateConformityUrl"` // 合格证编号文件 + QualityName string `orm:"quality_name" json:"qualityName" dc:"质量说明书编号"` // 质量说明书编号 + QualityUrl string `orm:"quality_url" json:"qualityUrl"` // 质量说明书文件 + InspectionReportName string `orm:"inspection_report_name" json:"inspectionReportName" dc:"检验报告编号"` // 检验报告编号 + InspectionReportUrl string `orm:"inspection_report_url" json:"inspectionReportUrl"` // 检验报告文件 + ReexamineReportName string `orm:"reexamine_report_name" json:"reexamineReportName" dc:"复试报告编号"` // 复试报告编号 + ReexamineReportUrl string `orm:"reexamine_report_url" json:"reexamineReportUrl"` // 复试报告文件 + UsePart string `orm:"use_part" json:"usePart" dc:"使用部位"` // 使用部位 + WeightId string `orm:"weight_id" json:"weightId" dc:"计量单位"` // 计量单位 + Remark string `orm:"remark" json:"remark" dc:"备注"` // 备注 + QuantityCount string `orm:"quantity_count" json:"quantityCount" dc:"预计使用量"` // 材料数量 + Status string `orm:"status" json:"status" dc:"状态"` // 状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 +} + +type FourFile struct { + Name string `json:"name" dc:"文件名字"` + Path string `json:"url" dc:"文件路径"` + Size int64 `json:"size" dc:"文件大小"` + Suffix string `json:"fileType" dc:"文件后缀"` +} + +// BusEquipmentMaterialsAppInfoRes is the golang structure for table bus_equipment_materials. +type BusEquipmentMaterialsAppFileInfoRes struct { + gmeta.Meta `orm:"table:bus_equipment_materials"` + EquipmentMaterialsId int64 `orm:"equipment_materials_id,primary" json:"equipmentMaterialsId"` // 序号 + EquipmentMaterialsName string `orm:"equipment_materials_name" json:"equipmentMaterialsName"` // 材料/设备 + CompanyId int64 `orm:"company_id" json:"companyId"` // 公司 + CompanyName string `orm:"company_name"json:"companyName" dc:"公司名字"` + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目 + TypeSpecificationName string `orm:"type_specification_name" json:"typeSpecificationName" dc:"规格型号"` // 规格型号 + TypeSpecificationUrl string `orm:"type_specification_url" json:"typeSpecificationUrl"` // 规格型号文件 + CertificateConformityFile []FourFile `json:"certificateConformityFile" dc:"合格证编号"` // 合格证编号 + QualityFile []FourFile `json:"qualityFile" dc:"质量说明书编号"` // 质量说明书编号 + InspectionReportFile []FourFile `json:"inspectionReportFile" dc:"检验报告编号"` // 检验报告编号 + ReexamineReportFile []FourFile `json:"reexamineReportFile" dc:"复试报告编号"` // 复试报告编号 + UsePart string `orm:"use_part" json:"usePart" dc:"使用部位"` // 使用部位 + WeightId string `orm:"weight_id" json:"weightId" dc:"计量单位"` // 计量单位 + Remark string `orm:"remark" json:"remark" dc:"备注"` // 备注 + QuantityCount string `orm:"quantity_count" json:"quantityCount" dc:"预计使用量"` // 材料数量 + Status string `orm:"status" json:"status" dc:"状态"` // 状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 +} diff --git a/internal/app/system/model/bus_equipment_materials_excel.go b/internal/app/system/model/bus_equipment_materials_excel.go new file mode 100644 index 0000000..ec20379 --- /dev/null +++ b/internal/app/system/model/bus_equipment_materials_excel.go @@ -0,0 +1,63 @@ +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +type BusEquipmentMaterialsExcelListRes struct { + SerialNumber int `json:"serialNumber" dc:"序号"` + Id int `json:"id" dc:"入库设备主键id"` + EquipmentMaterialsName string `json:"equipmentMaterialsName" dc:"设备/材料名称"` + TypeSpecificationName string `json:"typeSpecificationName" dc:"材料型号"` + WeightId string `json:"weightId" dc:"单位"` + QuantityCount string `json:"quantityCount"dc:"设计量"` // 材料数量 + Inventory *Inventory `json:"inventory" dc:"入库登记"` + Outbound *Outbound `json:"outbound"dc:"出库登记"` + Residue string `json:"residue" dc:"剩余量"` + Disposition string `json:"disposition"dc:"处理方式"` +} + +// 入库登录 +type Inventory struct { + Number int `json:"number" dc:"数量"` + Operator string `json:"operator" dc:"签收人"` + OutPutTime *gtime.Time `json:"outPutTime" dc:"入库日期"` +} + +// 出库登记 +type Outbound struct { + Recipient string `json:"recipient" dc:"交接单位(班组)"` + Number int `json:"number" dc:"数量"` + Shipper string `json:"shipper" dc:"领用人"` + Operator string `json:"operator" dc:"出库人"` + OutPutTime *gtime.Time `json:"outPutTime" dc:"出库日期"` +} + +// list结果 +type BusEquimentRes struct { + SerialNumber int `json:"SerialNumber" dc:"序号"` + Id int `json:"Id" dc:"bmi.id"` + EquipmentMaterialsId int64 `json:"EquipmentMaterialsId" dc:"材料id"` + EquipmentMaterialsName string `json:"EquipmentMaterialsName" dc:"设备/材料名称"` + TypeSpecificationName string `json:"typeSpecificationName" dc:"材料型号"` + WeightId string `json:"WeightId" dc:"单位"` + QuantityCount string `json:"QuantityCount"dc:"设计量"` // 材料数量 + Output string `json:"OutPut" dc:"出入库状态-字典 入库2 出库1"` + Number int `json:"Number" dc:"数量(出/入库的数量)"` + Operator string `json:"Operator" dc:"操作人(入库人、领料人)"` + OutputTime *gtime.Time `json:"OutPutTime" dc:"出入库操作时间"` + UpdateAt *gtime.Time `json:"UpdateAt" dc:"更新时间"` + Residue string `json:"Residue" dc:"剩余量"` + Disposition string `json:"Disposition"dc:"处理方式"` + Recipient string `json:"Recipient"dc:"交接单位(班组)"` + Shipper string `json:"Shipper"dc:"领用人"` +} + +// 首页返回表 +type BusEquimentIndexRes struct { + EquipmentMaterialsName string `json:"equipmentMaterialsName" dc:"设备/材料名称"` + WeightId string `json:"weightId" dc:"单位"` + QuantityCount int `json:"quantityCount"dc:"设计量"` // 材料数量 + InventoryNumber int `json:"inventoryNumber" dc:"入库库存数量"` + OutboundNumber int `json:"outboundNumber" dc:"出库数量"` +} diff --git a/internal/app/system/model/bus_equipment_materials_inventory.go b/internal/app/system/model/bus_equipment_materials_inventory.go new file mode 100644 index 0000000..a7d1af0 --- /dev/null +++ b/internal/app/system/model/bus_equipment_materials_inventory.go @@ -0,0 +1,105 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-09-13 14:21:30 +// 生成路径: internal/app/system/model/bus_equipment_materials_inventory.go +// 生成人:gfast +// desc:设备材料入库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusEquipmentMaterialsInventoryInfoRes is the golang structure for table bus_equipment_materials_inventory. +type BusEquipmentMaterialsInventoryInfoRes struct { + gmeta.Meta `orm:"table:bus_equipment_materials_inventory"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + EquipmentMaterialsId int64 `orm:"equipment_materials_id" json:"equipmentMaterialsId"` // 材料ID + OutPut string `orm:"out_put" json:"outPut"` // 出入库 + Number int `orm:"number" json:"number"` // 数量 + Residue int `orm:"residue" json:"residue"` // 剩余库存数量 + Operator string `orm:"operator" json:"operator"` // 出入库负责人 + Remark string `orm:"remark" json:"remark"` // 备注 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除视角 + OutPutTime *gtime.Time `orm:"out_put_time" json:"outPutTime"` // 删除视角 + Path string `orm:"path" json:"path"` // 删除视角 + Disposition string `orm:"disposition" json:"disposition" dc:"处理方式"` //处理方式 + Recipient string `orm:"recipient" json:"recipient" dc:"交接单位"` + Shipper string `orm:"shipper" json:"shipper" dc:"领用人"` +} + +type BusEquipmentMaterialsInventoryListRes struct { + Id int64 `json:"id"` + OutPut string `json:"outPut"` + Number int `json:"number"` + Residue int `json:"residue"` + Operator string `json:"operator"` + Remark string `json:"remark"` + Recipient string `json:"recipient" dc:"交接单位"` + Shipper string `json:"shipper" dc:"领用人""` + CreatedAt *gtime.Time `json:"createdAt"` + OutPutTime *gtime.Time `json:"outPutTime"` + Path string `json:"path"` +} + +// 入库总量 和设计量 +type BemiInputLinkBemQCRes struct { + QuantityCount string `json:"quantityCount" dc:"设计量 预计使用量"` + InputNumber int `json:"inputNumber" dc:"入库总量"` +} + +// app +// app 新增文件 + +type MaterialsInventoryFileAddApp struct { + Name string `orm:"name" json:"name" dc:"文件名字"` + Path string `orm:"path" json:"url" dc:"文件路径"` + Size int64 `orm:"size" json:"size" dc:"文件大小"` + Suffix string `orm:"suffix" json:"fileType" dc:"文件后缀"` +} + +type MaterialsInventoryFileEditApp struct { + Id int64 `json:"id"` + MaterialsInventoryId int64 `json:"materials_inventory_id" dc:"设备材料Id"` + Name string `orm:"name" json:"name" dc:"文件名字"` + Path string `orm:"path" json:"url" dc:"文件路径"` + Size int64 `orm:"size" json:"size" dc:"文件大小"` + Suffix string `orm:"suffix" json:"fileType" dc:"文件后缀"` +} + +// applist +type BusEquipmentMaterialsInventoryAppListRes struct { + Id int64 `json:"id" dc:"主键id"` + OutPut string `json:"outPut" dc:"出入库"` + Number int `json:"number" dc:"数量"` + Residue int `json:"residue" dc:"剩余库存量"` + Recipient string `json:"recipient" dc:"交接单位"` + Shipper string `json:"shipper" dc:"领用人""` + OutPutTime *gtime.Time `json:"outPutTime" dc:"进出时间"` +} + +// appGet +type BusEquipmentMaterialsInventoryAppInfoRes struct { + Id int64 `json:"id" dc:"主键id"` + EquipmentMaterialsId int64 `orm:"equipment_materials_id" json:"equipmentMaterialsId"` // 材料ID + EquipmentMaterialsName string `orm:"equipment_materials_name" json:"equipmentMaterialsName"` // 材料/设备 + OutPut string `json:"outPut" dc:"出入库"` + Number int `json:"number" dc:"数量"` + Residue int `json:"residue" dc:"剩余库存量"` + Operator string `json:"operator" dc:"出入库负责人"` + Remark string `json:"remark" dc:"备注"` + Recipient string `json:"recipient" dc:"交接单位"` + Shipper string `json:"shipper" dc:"领用人"` + OutPutTime *gtime.Time `json:"outPutTime" dc:"进出时间"` + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + File []MaterialsInventoryFileEditApp `json:"file" dc:"文件列表"` +} diff --git a/internal/app/system/model/bus_equipment_materials_weight.go b/internal/app/system/model/bus_equipment_materials_weight.go new file mode 100644 index 0000000..8302231 --- /dev/null +++ b/internal/app/system/model/bus_equipment_materials_weight.go @@ -0,0 +1,34 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-28 15:27:53 +// 生成路径: internal/app/system/model/bus_equipment_materials_weight.go +// 生成人:gfast +// desc:计量单位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusEquipmentMaterialsWeightInfoRes is the golang structure for table bus_equipment_materials_weight. +type BusEquipmentMaterialsWeightInfoRes struct { + gmeta.Meta `orm:"table:bus_equipment_materials_weight"` + WeightId int64 `orm:"weight_id,primary" json:"weightId"` // 序号 + Weight string `orm:"weight" json:"weight"` // 计量单位名称 + Status string `orm:"status" json:"status"` // 状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type BusEquipmentMaterialsWeightListRes struct { + WeightId int64 `json:"weightId"` + Weight string `json:"weight"` + Status string `json:"status"` +} diff --git a/internal/app/system/model/bus_essential_information.go b/internal/app/system/model/bus_essential_information.go new file mode 100644 index 0000000..754701a --- /dev/null +++ b/internal/app/system/model/bus_essential_information.go @@ -0,0 +1,34 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-03-20 19:38:54 +// 生成路径: internal/app/system/model/bus_essential_information.go +// 生成人:gfast +// desc:项目基本信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusEssentialInformationInfoRes is the golang structure for table bus_essential_information. +type BusEssentialInformationInfoRes struct { + gmeta.Meta `orm:"table:bus_essential_information"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + One string `orm:"one" json:"one"` // 发电量 + Two string `orm:"two" json:"two"` // 年发电量 + Three string `orm:"three" json:"three"` // 当前发电量 + Four string `orm:"four" json:"four"` // 减排量 + Five string `orm:"five" json:"five"` // 预估发电量 +} + +type BusEssentialInformationListRes struct { + Id int64 `json:"id"` + One string `json:"one"` + Two string `json:"two"` + Three string `json:"three"` + Four string `json:"four"` + Five string `json:"five"` +} diff --git a/internal/app/system/model/bus_folder.go b/internal/app/system/model/bus_folder.go new file mode 100644 index 0000000..b69a855 --- /dev/null +++ b/internal/app/system/model/bus_folder.go @@ -0,0 +1,41 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-09-15 17:15:59 +// 生成路径: internal/app/system/model/bus_folder.go +// 生成人:gfast +// desc:文件夹 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusFolderInfoRes is the golang structure for table bus_folder. +type BusFolderInfoRes struct { + gmeta.Meta `orm:"table:bus_folder"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + Father int64 `orm:"father" json:"father"` // 大于0表示当前文件夹有父级 + FolderType string `orm:"folder_type" json:"folderType"` // 文件夹类型 + Icon string `orm:"icon" json:"icon"` // 文件夹图标 + Name string `orm:"name" json:"name"` // 文件夹名称 + Remark string `orm:"remark" json:"remark"` // 备注 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type BusFolderListRes struct { + Id int64 `json:"id"` + FolderType string `json:"folderType"` + Icon string `json:"icon"` + Name string `json:"name"` + Remark string `json:"remark"` + CreatedAt *gtime.Time `json:"createdAt"` + QiePian []string `json:"qiePian"` +} diff --git a/internal/app/system/model/bus_folder_file.go b/internal/app/system/model/bus_folder_file.go new file mode 100644 index 0000000..a6286c8 --- /dev/null +++ b/internal/app/system/model/bus_folder_file.go @@ -0,0 +1,62 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-09-15 17:16:00 +// 生成路径: internal/app/system/model/bus_folder_file.go +// 生成人:gfast +// desc:文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusFolderFileInfoRes is the golang structure for table bus_folder_file. +type BusFolderFileInfoRes struct { + gmeta.Meta `orm:"table:bus_folder_file"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + ProjectId int64 `orm:"project_id" json:"projectId"` // 項目id + FolderId int64 `orm:"folder_id" json:"folderId"` // 所属文件夹 + LinkedFolderId *LinkedBusFolderFileBusFolder `orm:"with:id=folder_id" json:"linkedFolderId"` + FileType string `orm:"file_type" json:"fileType"` // 文件类型 + Name string `orm:"name" json:"name"` // 文件名称 + Size string `orm:"size" json:"size"` // 文件大小 + Suffix string `orm:"suffix" json:"suffix"` // 文件后缀 + Path string `orm:"path" json:"path"` // 文件路径 + Remark string `orm:"remark" json:"remark"` // 备注 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + TableName string `orm:"table_name" json:"tableName"` // 表名 + TableId int64 `orm:"table_id" json:"tableId"` // id + UserType string `orm:"user_type" json:"userType"` // 用户类型 (1后台 2小程序) +} + +type LinkedBusFolderFileBusFolder struct { + gmeta.Meta `orm:"table:bus_folder"` + Id int64 `orm:"id" json:"id"` // 主键ID + Name string `orm:"name" json:"name"` // 文件夹名称 +} + +type BusFolderFileListRes struct { + Id int64 `json:"id"` + FolderId int64 `json:"folderId"` + ProjectId int64 `json:"projectId"` + LinkedFolderId *LinkedBusFolderFileBusFolder `orm:"with:id=folder_id" json:"linkedFolderId"` + FileType string `json:"fileType"` + Name string `json:"name"` + Size string `json:"size"` + Suffix string `json:"suffix"` + Remark string `json:"remark"` + Path string `json:"path"` + CreatedAt *gtime.Time `json:"createdAt"` + TableName string `json:"tableName"` + TableId int64 `json:"tableId"` + UserType string `json:"userType"` + CreateBy string `json:"createBy"` // 创建者 +} diff --git a/internal/app/system/model/bus_hse_management.go b/internal/app/system/model/bus_hse_management.go new file mode 100644 index 0000000..b70f56e --- /dev/null +++ b/internal/app/system/model/bus_hse_management.go @@ -0,0 +1,143 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-03-28 14:53:05 +// 生成路径: internal/app/system/model/bus_hse_management.go +// 生成人:gfast +// desc:HSE-巡检工单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusHseManagementInfoRes is the golang structure for table bus_hse_management. +type BusHseManagementInfoRes struct { + gmeta.Meta `orm:"table:bus_hse_management"` + Pid int64 `orm:"pid" json:"pid"` // 父级主键ID + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目ID + StudyType string `orm:"study_type" json:"studyType"` // 检查类型 + TourType string `orm:"tour_type" json:"tourType"` // 违章类型字典 + InspectionResult string `orm:"inspection_result" json:"inspectionResult"` // 巡检结果 + TeamName string `orm:"team_name" json:"teamName"` // 名称(班组/部门) + Corrector string `orm:"corrector" json:"corrector"` // 整改人(班组长) + IsReply string `orm:"is_reply" json:"isReply"` // 是否回复(1回复 2不回复) + ReplyDate string `orm:"reply_date" json:"replyDate"` // 回复日期 + Status string `orm:"status" json:"status"` // 工单状态(1通知 2整改 3复查) + HiddenDanger string `orm:"hidden_danger" json:"hiddenDanger"` // 问题隐患 + Measure string `orm:"measure" json:"measure"` // 整改措施 + Review string `orm:"review" json:"review"` // 复查情况 + ReviewType string `orm:"review_type" json:"reviewType"` // 复查状态 + CreatedBy string `orm:"created_by" json:"createdBy"` // 创建人 + UpdatedBy string `orm:"updated_by" json:"updatedBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + CheckTime *gtime.Time `orm:"check_time" json:"checkTime"` // 检查时间 + RectificationTime *gtime.Time `orm:"rectification_time" json:"rectificationTime"` // 整改时间 + ReviewTime *gtime.Time `orm:"review_time" json:"reviewTime"` // 复查时间 +} + +type BusHseManagementListRes struct { + Id int64 `json:"id"` + ProjectId int64 `json:"projectId"` + StudyType string `json:"studyType"` + TourType string `json:"tourType"` + InspectionResult string `json:"inspectionResult"` + TeamName string `json:"teamName"` + Corrector string `json:"corrector"` + IsReply string `json:"isReply"` + ReplyDate string `json:"replyDate"` + Status string `json:"status"` + HiddenDanger string `json:"hiddenDanger"` + Measure string `json:"measure"` + Review string `json:"review"` + ReviewType string `json:"reviewType"` + CreatedBy string `json:"createdBy"` + CreatedAt *gtime.Time `json:"createdAt"` + CheckTime *gtime.Time `json:"checkTime"` + RectificationTime *gtime.Time `json:"rectificationTime"` + ReviewTime *gtime.Time `json:"reviewTime"` +} +type BusHseManagementInfoTwoRes struct { + BusHseManagementInfoRes + ProjectName string `json:"projectName"` + Abarbeitung string `json:"abarbeitung" dc:"整改人"` + Fill string `json:"fill" dc:"创建人(检查、复查)"` + Inspectionccessories []*BusHseManagementPath `json:"inspectionccessories" dc:"巡检附件"` + RefuseList interface{} `json:"refuseList" dc:"拒绝数组结构体"` +} + +// HseManagementAppletListRes 小程序检查工单列表 +type HseManagementAppletListRes struct { + Id int64 `json:"id" dc:"主键ID"` + ProjectName string `json:"projectName" dc:"项目名称"` + StudyTypeName string `json:"studyTypeName" dc:"检查类型"` + TourTypeName string `json:"tourTypeName" dc:"违章类型"` + UserName string `json:"userName" dc:"整改人"` + Status string `json:"status" dc:"工单状态(1通知 2整改 3验证)"` + ReviewType string `json:"reviewType" dc:"验证状态(1通过 2未通过)"` + CreatedBy string `json:"createdBy" dc:"填报人"` + CreatedAt string `json:"createdAt" dc:"填报时间"` + IsReply string `json:"isReply" dc:"是否回复(1回复 2不回复)"` + RefuseList interface{} `json:"refuseList" dc:"拒绝数组结构体"` +} + +// BusHseManagementPath 检查工单附件表 +type BusHseManagementPath struct { + gmeta.Meta `orm:"table:bus_hse_management_path"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + TicketId int64 `orm:"ticket_id" json:"ticketId"` // 质量工单主键ID(级联删除) + Type string `orm:"type" json:"type"` // 类型(1巡检 2整改) + Name string `orm:"name" json:"name"` // 文件名称 + Path string `orm:"path" json:"path"` // 文件路径 + FileType string `orm:"file_type" json:"fileType"` // 文件类型(后缀) +} + +// BusHseManagementDetailsRes 小程序检查工单详情 +type BusHseManagementDetailsRes struct { + Id int64 `json:"id"` + ProjectName string `json:"projectName" dc:"项目名称"` + StudyTypeName string `json:"studyTypeName" dc:"检查类型"` + TourTypeName string `json:"tourTypeName" dc:"违章类型"` + InspectionResult string `json:"inspectionResult" dc:"巡检结果"` + CheckTime *gtime.Time `json:"checkTime" dc:"检查时间"` + ReplyDate string `json:"replyDate" dc:"要求整改期限"` + TeamName string `json:"teamName" dc:"班组"` + Abarbeitung string `json:"abarbeitung" dc:"整改人"` + RectificationTime *gtime.Time `json:"rectificationTime" dc:"整改时间"` + CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"` + Hidden_danger string `json:"hiddenDanger" dc:"问题隐患"` + Measure string `json:"measure" dc:"整改措施"` + ReviewTime string `json:"reviewTime" dc:"复查时间"` + Review string `json:"review" dc:"复查情况"` + Status string `json:"status" dc:"工单状态(1通知 2整改 3复查)"` + ReviewType string `json:"reviewType" dc:"复查状态(1通过 2未通过)"` + Fill string `json:"fill" dc:"创建人(检查、复查)"` + IsReply string `json:"isReply" dc:"是否回复"` + CheckAttachment []*BusHseManagementPath `json:"checkAttachment" dc:"检查附件"` + AbarbeitungAttachment []*BusHseManagementPath `json:"abarbeitungAttachment" dc:"整改附件"` +} + +// InsertRejectionRes 安全拒绝重新插入 +type InsertRejectionRes struct { + gmeta.Meta `orm:"table:bus_hse_management"` + Pid int64 `orm:"pid" json:"pid"` // 上级id + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目ID + StudyType string `orm:"study_type" json:"studyType"` // 检查类型 + TourType string `orm:"tour_type" json:"tourType"` // 违章类型字典 + InspectionResult string `orm:"inspection_result" json:"inspectionResult"` // 巡检结果 + TeamName string `orm:"team_name" json:"teamName"` // 名称(班组/部门) + Corrector string `orm:"corrector" json:"corrector"` // 整改人(班组长) + IsReply string `orm:"is_reply" json:"isReply"` // 是否回复(1回复 2不回复) + ReplyDate string `orm:"reply_date" json:"replyDate"` // 回复日期 + Status string `orm:"status" json:"status"` // 工单状态(1通知 2整改 3复查) + HiddenDanger string `orm:"hidden_danger" json:"hiddenDanger"` // 问题隐患 + CreatedBy string `orm:"created_by" json:"createdBy"` // 创建人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + CheckTime *gtime.Time `orm:"check_time" json:"checkTime"` // 检查时间 +} diff --git a/internal/app/system/model/bus_hse_security_log.go b/internal/app/system/model/bus_hse_security_log.go new file mode 100644 index 0000000..8f72c6b --- /dev/null +++ b/internal/app/system/model/bus_hse_security_log.go @@ -0,0 +1,80 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-04-07 17:00:45 +// 生成路径: internal/app/system/model/bus_hse_security_log.go +// 生成人:gfast +// desc:HSE安全日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusHseSecurityLogInfoRes is the golang structure for table bus_hse_security_log. +type BusHseSecurityLogInfoRes struct { + gmeta.Meta `orm:"table:bus_hse_security_log"` + Id int64 `dc:"主键ID" orm:"id,primary" json:"id"` + ProjectId int64 `dc:"项目ID" orm:"project_id" json:"projectId"` + DateOfOccurrence string `dc:"发生日期" orm:"date_of_occurrence" json:"dateOfOccurrence"` + AirTemperatureMax float64 `dc:"最高气温" orm:"air_temperature_max" json:"airTemperatureMax"` + AirTemperatureMin float64 `dc:"最低气温" orm:"air_temperature_min" json:"airTemperatureMin"` + Climate string `dc:"气候(字典)" orm:"climate" json:"climate"` + Progress string `dc:"进展情况" orm:"progress" json:"progress"` + JobContent string `dc:"作业内容" orm:"job_content" json:"jobContent"` + DiscloseTheFacts string `dc:"交底情况" orm:"disclose_the_facts" json:"discloseTheFacts"` + ProgressOfActivity string `dc:"活动情况" orm:"progress_of_activity" json:"progressOfActivity"` + Examine string `dc:"检查情况" orm:"examine" json:"examine"` + Implementation string `dc:"实施情况" orm:"implementation" json:"implementation"` + SafetyInspectionSituation string `dc:"安全检查情况" orm:"safety_inspection_situation" json:"safetyInspectionSituation"` + StoppageOrOvertime string `dc:"停工或加班情况" orm:"stoppage_or_overtime" json:"stoppageOrOvertime"` + OtherRecords string `dc:"其他情况" orm:"other_records" json:"otherRecords"` + Remark string `dc:"备注" orm:"remark" json:"remark"` + CreatedBy string `dc:"创建人" orm:"created_by" json:"createdBy"` + UpdatedBy string `dc:"更新人" orm:"updated_by" json:"updatedBy"` + CreatedAt *gtime.Time `dc:"创建时间" orm:"created_at" json:"createdAt"` + UpdatedAt *gtime.Time `dc:"更新时间" orm:"updated_at" json:"updatedAt"` + DeletedAt *gtime.Time `dc:"删除时间" orm:"deleted_at" json:"deletedAt"` +} + +type BusHseSecurityLogListRes struct { + Id int64 `dc:"主键ID" json:"id"` + ProjectId int64 `dc:"项目ID" json:"projectId"` + DateOfOccurrence string `dc:"发生日期" json:"dateOfOccurrence"` + AirTemperatureMax float64 `dc:"最高气温" json:"airTemperatureMax"` + AirTemperatureMin float64 `dc:"最低气温" json:"airTemperatureMin"` + Climate string `dc:"气候(字典)" json:"climate"` + Progress string `dc:"进展情况" json:"progress"` + JobContent string `dc:"作业内容" json:"jobContent"` + DiscloseTheFacts string `dc:"交底情况" json:"discloseTheFacts"` + ProgressOfActivity string `dc:"活动情况" json:"progressOfActivity"` + Examine string `dc:"检查情况" json:"examine"` + Implementation string `dc:"实施情况" json:"implementation"` + SafetyInspectionSituation string `dc:"安全检查情况" json:"safetyInspectionSituation"` + StoppageOrOvertime string `dc:"停工或加班情况" json:"stoppageOrOvertime"` + OtherRecords string `dc:"其他情况" json:"otherRecords"` + Remark string `dc:"备注" json:"remark"` + CreatedBy string `dc:"创建人" json:"createdBy"` + CreatedAt *gtime.Time `dc:"更新人" json:"createdAt"` +} + +type BusHseSecurityLogInfoTwoRes struct { + BusHseSecurityLogInfoRes + ClimateName string `dc:"字典名称" orm:"climateName" json:"climateName"` + ProjectName string `dc:"项目名称" orm:"projectName" json:"projectName"` + Fill string `dc:"创建人名称" orm:"fill" json:"fill"` + FileList []*HseSecurityLogPath `json:"fileList" dc:"附件列表"` +} + +type HseSecurityLogPath struct { + gmeta.Meta `orm:"table:bus_hse_security_log_path"` + Id int64 `dc:"主键ID" orm:"id,primary" json:"id"` + TicketId int64 `dc:"父主键ID" orm:"ticket_id" json:"ticketId"` + Type string `dc:"类型(1文件 2图片)" orm:"type" json:"type"` + Name string `dc:"文件名称" orm:"name" json:"name"` + Path string `dc:"文件路径" orm:"path" json:"path"` + FileType string `dc:"文件类型(后缀)" orm:"file_type" json:"fileType"` +} diff --git a/internal/app/system/model/bus_inspection_ticket.go b/internal/app/system/model/bus_inspection_ticket.go new file mode 100644 index 0000000..a521e96 --- /dev/null +++ b/internal/app/system/model/bus_inspection_ticket.go @@ -0,0 +1,159 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-03-21 15:23:59 +// 生成路径: internal/app/system/model/bus_inspection_ticket.go +// 生成人:gfast +// desc:质量工单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusInspectionTicketInfoRes is the golang structure for table bus_inspection_ticket. +type BusInspectionTicketInfoRes struct { + gmeta.Meta `orm:"table:bus_inspection_ticket"` + Pid int64 `orm:"pid" json:"pid"` // 父级主键ID + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目ID + InspectionType string `orm:"inspection_type" json:"inspectionType"` // 巡检类型(关联字典) + InspectionHeadline string `orm:"inspection_headline" json:"inspectionHeadline"` // 巡检主题 + InspectionResult string `orm:"inspection_result" json:"inspectionResult"` // 巡检结果 + Corrector string `orm:"corrector" json:"corrector"` // 整改人(班组长) + IsReply string `orm:"is_reply" json:"isReply"` // 是否回复(1回复 2不回复) + ReplyDate string `orm:"reply_date" json:"replyDate"` // 回复日期 + Status string `orm:"status" json:"status"` // 工单状态(1通知 2整改 3验证) + Feedback string `orm:"feedback" json:"feedback"` // 整改反馈 + VerificationResult string `orm:"verification_result" json:"verificationResult"` // 验证结果 + VerificationType string `orm:"verification_type" json:"verificationType"` // 验证结果 + CreatedBy string `orm:"created_by" json:"createdBy"` // 创建人 + UpdatedBy string `orm:"updated_by" json:"updatedBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + RectificationTime *gtime.Time `orm:"rectification_time" json:"rectificationTime"` // 整改时间 +} + +type BusInspectionTicketListRes struct { + Id int64 `json:"id"` + ProjectId int64 `json:"projectId"` + InspectionType string `json:"inspectionType"` + InspectionHeadline string `json:"inspectionHeadline"` + InspectionResult string `json:"inspectionResult"` + Corrector string `json:"corrector"` + IsReply string `json:"isReply"` + ReplyDate string `json:"replyDate"` + Status string `json:"status"` + Feedback string `json:"feedback"` + VerificationResult string `json:"verificationResult"` + CreatedBy string `json:"createdBy"` + CreatedAt *gtime.Time `json:"createdAt"` + RectificationTime *gtime.Time `json:"rectificationTime"` +} + +type PcListRes struct { + BusInspectionTicketInfoRes + ProjectName string `orm:"project_name" json:"projectName" dc:"项目名称"` + One string `orm:"one" json:"one" dc:"填报人"` + Two string `orm:"two" json:"two" dc:"整改人"` + RefuseList interface{} `json:"refuseList" dc:"拒绝数组结构体"` +} + +// AppletListRes 小程序检查工单列表 +type AppletListRes struct { + Id int64 `json:"id" dc:"主键ID"` + ProjectName string `json:"projectName" dc:"项目名称"` + DictLabel string `json:"dictLabel" dc:"巡检类型"` + UserName string `json:"userName" dc:"整改人"` + InspectionHeadline string `json:"inspectionHeadline" dc:"巡检主题"` + InspectionResult string `json:"inspectionResult" dc:"巡检结果"` + IsReply string `json:"isReply" dc:"是否回复(1回复 2不回复)"` + Status string `json:"status" dc:"工单状态(1通知 2整改 3验证)"` + VerificationType string `json:"verificationType" dc:"验证状态(1通过 2未通过)"` + CreatedBy string `json:"createdBy" dc:"填报人"` + CreatedAt string `json:"createdAt" dc:"填报时间"` + CreatedById string `json:"createdById" dc:"填报人Id"` + RefuseList interface{} `json:"refuseList" dc:"拒绝数组结构体"` +} + +// AcquisitionOfCorrectivePersonnelEntityRes 获取整改人(整改人为当前项目的所有班组长) +type AcquisitionOfCorrectivePersonnelEntityRes struct { + OpenId string `json:"openid" dc:"openid"` + UserName string `json:"userName" dc:"整改人名称"` +} + +// AppletDetailsRes 小程序检查工单详情 +type AppletDetailsRes struct { + Id int64 `json:"id"` + ProjectName string `json:"projectName" dc:"项目名称"` + DictLabel string `json:"dictLabel" dc:"巡检类型"` + InspectionHeadline string `json:"inspectionHeadline" dc:"巡检主题"` + InspectionResult string `json:"inspectionResult" dc:"巡检结果"` + Abarbeitung string `json:"abarbeitung" dc:"整改人"` + IsReply string `json:"isReply" dc:"是否回复(1回复 2不回复)"` + ReplyDate string `json:"replyDate" dc:"回复时间"` + Fill string `json:"fill" dc:"填报人"` + CreatedAt string `json:"createdAt" dc:"填报时间"` + Feedback string `json:"feedback" dc:"整改反馈"` + VerificationResult string `json:"verificationResult" dc:"验证结果"` + Status string `json:"status" dc:"工单状态(1通知 2整改 3验证)"` + VerificationType string `json:"verificationType" dc:"验证状态(1通过 2未通过)"` + UpdatedAt *gtime.Time `json:"updatedAt" dc:"更新时间"` + RectificationTime *gtime.Time `json:"rectificationTime" dc:"整改时间"` + Inspectionccessories []*BusInspectionTicketPath `json:"inspectionccessories" dc:"巡检附件"` + CorrectiveAttachment []*BusInspectionTicketPath `json:"correctiveAttachment" dc:"整改附件"` +} + +// BusInspectionTicketPath 检查工单附件表 +type BusInspectionTicketPath struct { + gmeta.Meta `orm:"table:bus_inspection_ticket_path"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + TicketId int64 `orm:"ticket_id" json:"ticketId"` // 质量工单主键ID(级联删除) + Type string `orm:"type" json:"type"` // 类型(1巡检 2整改) + Name string `orm:"name" json:"name"` // 文件名称 + Path string `orm:"path" json:"path"` // 文件路径 + FileType string `orm:"file_type" json:"fileType"` // 文件类型(后缀) +} + +// LargeScreenDetailsRes 大屏工单详情 +type LargeScreenDetailsEntityRes struct { + Id int64 `json:"id"` + ProjectName string `json:"projectName" dc:"项目名称"` + Fill string `json:"fill" dc:"检查人"` + CheckTime *gtime.Time `json:"checkTime" dc:"检查时间"` + RectificationTime *gtime.Time `json:"rectificationTime" dc:"整改时间"` + Feedback string `json:"feedback" dc:"整改反馈"` + ReviewTime *gtime.Time `json:"reviewTime" dc:"验证时间"` + Abarbeitung string `json:"abarbeitung" dc:"整改人"` + IsReply string `json:"isReply" dc:"是否回复(1回复 2不回复)"` + ReplyDate string `json:"replyDate" dc:"回复时间"` + InspectionHeadline string `json:"inspectionHeadline" dc:"巡检主题"` + InspectionResult string `json:"inspectionResult" dc:"巡检结果"` + InspectionType string `json:"inspectionType" dc:"巡检类型"` + CreatedAt *gtime.Time `json:"createdAt" dc:"巡检记录时间"` + Status string `json:"status" dc:"工单状态(1通知 2整改 3验证)"` + VerificationType string `json:"verificationType" dc:"验证状态(1通过 2未通过)"` + Inspectionccessories []*BusInspectionTicketPath `json:"inspectionccessories" dc:"巡检附件"` + CorrectiveAttachment []*BusInspectionTicketPath `json:"correctiveAttachment" dc:"整改附件"` +} + +// ReviewRejectionRes ,需要重新录入数据到整改人 +type ReviewRejectionRes struct { + gmeta.Meta `orm:"table:bus_inspection_ticket"` + Pid int64 `orm:"pid" json:"pid"` // 父级主键ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目ID + InspectionType string `orm:"inspection_type" json:"inspectionType"` // 巡检类型(关联字典) + InspectionHeadline string `orm:"inspection_headline" json:"inspectionHeadline"` // 巡检主题 + InspectionResult string `orm:"inspection_result" json:"inspectionResult"` // 巡检结果 + Corrector string `orm:"corrector" json:"corrector"` // 整改人(班组长) + IsReply string `orm:"is_reply" json:"isReply"` // 是否回复(1回复 2不回复) + ReplyDate string `orm:"reply_date" json:"replyDate"` // 回复日期 + Status string `orm:"status" json:"status"` // 工单状态(1通知 2整改 3验证) + CreatedBy string `orm:"created_by" json:"createdBy"` // 创建人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + CheckTime *gtime.Time `orm:"check_time" json:"checkTime"` // 检查时间 +} diff --git a/internal/app/system/model/bus_machinery.go b/internal/app/system/model/bus_machinery.go new file mode 100644 index 0000000..1a2a74a --- /dev/null +++ b/internal/app/system/model/bus_machinery.go @@ -0,0 +1,70 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-29 14:02:01 +// 生成路径: internal/app/system/model/bus_machinery.go +// 生成人:gfast +// desc:机械 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusMachineryInfoRes is the golang structure for table bus_machinery. +type BusMachineryInfoRes struct { + gmeta.Meta `orm:"table:bus_machinery"` + Id uint64 `orm:"id,primary" json:"id" dc:"序号"` // 序号 + MachineryName string `orm:"machinery_name" json:"machineryName"dc:"机械名称"` // 机械名称 + MachineryNumber string `orm:"machinery_number" json:"machineryNumber" dc:"编号"` // 编号 + ProjectId int64 `orm:"project_id" json:"projectId" dc:"项目id"` // 项目id + CheckoutNumber string `orm:"checkout_number" json:"checkoutNumber" dc:"检验证编号"` // 检验证编号 + CheckoutUnit string `orm:"checkout_unit" json:"checkoutUnit" dc:"检验单位"` // 检验单位 + CheckoutDate string `orm:"checkout_date" json:"checkoutDate" dc:"检定日期/有效期"` // 检定日期/有效期 + Status string `orm:"status" json:"status" dc:"施工类型状态"` // 施工类型状态 + CreateBy string `orm:"create_by" json:"createBy" dc:"创建者"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy" dc:"更新者"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt" dc:"创建时间"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt" dc:"更新时间"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt" dc:"删除时间"` // 删除时间 + Number int `orm:"number" json:"number" dc:" 数量(废弃)"` // 数量(废弃) + EntryTime *gtime.Time `orm:"entry_time" json:"entryTime" dc:"进场时间"` // 进场时间 + //Principal string `orm:"principal" json:"principal" dc:"负责人"` // 负责人 + Remark string `orm:"remark" json:"remark" dc:"备注"` // 备注 + Ct int `orm:"ct" json:"ct" dc:"数量(出入入场)"` // 数量(出入入场) +} + +type BusMachineryListRes struct { + Id uint64 `json:"id"` + MachineryName string `json:"machineryName"` + MachineryNumber string `json:"machineryNumber"` + CheckoutNumber string `json:"checkoutNumber"` + CheckoutUnit string `json:"checkoutUnit"` + CheckoutDate string `json:"checkoutDate"` + Status string `json:"status"` + CreatedAt *gtime.Time `json:"createdAt"` + Number int `json:"number"` + EntryTime *gtime.Time `json:"entryTime"` + //Principal string `json:"principal"` + Remark string `json:"remark"` + CreateBy string `json:"createBy"` // 创建者 + MachineryId string `json:"machineryId"` + Ct int `json:"ct"` // 更新者 +} + +// app列表 +type BusMachineryAppListRes struct { + Id uint64 `json:"id"dc:"序号"` + MachineryName string `json:"machineryName" dc:"机械名称"` + MachineryNumber string `json:"machineryNumber"dc:"编号"` + CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"` + Number int `json:"number"dc:"数量"` + EntryTime *gtime.Time `json:"entryTime"dc:"进场时间"` + //Principal string `json:"principal"dc:"负责人"` + Remark string `json:"remark"dc:"备注"` + CreateBy string `json:"createBy"dc:"创建者"` + Ct int `json:"ct" dc:"数量(出入入场)"` // 更新者 +} diff --git a/internal/app/system/model/bus_machinery_detail.go b/internal/app/system/model/bus_machinery_detail.go new file mode 100644 index 0000000..db761fb --- /dev/null +++ b/internal/app/system/model/bus_machinery_detail.go @@ -0,0 +1,148 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-10-12 11:41:31 +// 生成路径: internal/app/system/model/bus_machinery_detail.go +// 生成人:gfast +// desc:机械详情 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusMachineryDetailInfoRes is the golang structure for table bus_machinery_detail. +type BusMachineryDetailInfoRes struct { + gmeta.Meta `orm:"table:bus_machinery_detail"` + Id int64 `orm:"id,primary" json:"id" dc:"序号"` // 序号 + CheckoutNumber string `orm:"checkout_number" json:"checkoutNumber" dc:"检验证编号"` // 检验证编号 + CheckoutUnit string `orm:"checkout_unit" json:"checkoutUnit"dc:"检验单位"` // 检验单位 + CheckoutDate string `orm:"checkout_date" json:"checkoutDate" dc:"检定日期/有效期"` // 检定日期/有效期 + Status string `orm:"status" json:"status" dc:"施工类型状态 0正常 1停用"` // 施工类型状态 0正常 1停用 + EntryTime *gtime.Time `orm:"entry_time" json:"entryTime" dc:"入场时间"` // 入场时间 + CreateBy string `orm:"create_by" json:"createBy" dc:"创建者"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy" dc:"更新者"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt" dc:"创建时间"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt" dc:"更新时间"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt" dc:"删除时间"` // 删除时间 + Remark string `orm:"remark" json:"remark" dc:"备注"` // 备注 + Picture string `orm:"picture" json:"picture" dc:"4张图片,逗号分隔"` // 4张图片,逗号分隔 + MachineryId int64 `orm:"machinery_id" json:"machineryId" dc:"机械主键ID"` // 机械主键ID + Type string `orm:"type" json:"type" dc:"1出场 2入场"` // 1出场 2入场 + Principal string `orm:"principal" json:"principal" dc:"负责人"` // 负责人 +} + +type BusMachineryDetailListRes struct { + Id int64 `json:"id"` + CheckoutNumber string `json:"checkoutNumber"` + CheckoutUnit string `json:"checkoutUnit"` + CheckoutDate string `json:"checkoutDate"` + Status string `json:"status"` + EntryTime *gtime.Time `json:"entryTime"` + CreatedAt *gtime.Time `json:"createdAt"` + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt" dc:"更新时间"` // 更新时间 + Remark string `json:"remark"` + Picture string `json:"picture"` + MachineryId int64 `json:"machineryId"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + Type string `json:"type"` // 1出场 2入场 + Principal string `json:"principal"` +} + +// applist +type BusMachineryDetailAppListRes struct { + Id int64 `json:"id"dc:"序号"` + CheckoutNumber string `json:"checkoutNumber"dc:"检验证编号"` + CheckoutUnit string `json:"checkoutUnit"dc:"检验单位"` + CheckoutDate string `json:"checkoutDate"dc:"检定日期/有效期"` + Status string `json:"status" dc:"(0正常 1停用)"` + EntryTime *gtime.Time `json:"entryTime"dc:"入场时间"` + CreatedAt *gtime.Time `json:"createdAt"dc:"创建时间"` + Remark string `json:"remark"dc:"备注"` + Picture string `json:"picture"dc:"4张图片,逗号分隔"` + MachineryId int64 `json:"machineryId"dc:"机械主键ID"` + CreateBy string `json:"createBy"dc:"创建人"` + UpdateBy string `json:"updateBy"dc:"更新人"` + UpdatedAt *gtime.Time `json:"updatedAt" dc:"更新时间"` // 更新时间 + Type string `json:"type" dc:"1出场 2入场"` // 1出场 2入场 + Principal string `json:"principal" dc:"负责人"` +} + +// getid状态记录详情 +type BusMachineryDetailGetIdInfoRes struct { + gmeta.Meta `orm:"table:bus_machinery_detail"` + Id int64 `orm:"id,primary" json:"id" dc:"序号"` // 序号 + CheckoutNumber string `orm:"checkout_number" json:"checkoutNumber" dc:"检验证编号"` // 检验证编号 + CheckoutUnit string `orm:"checkout_unit" json:"checkoutUnit"dc:"检验单位"` // 检验单位 + CheckoutDate string `orm:"checkout_date" json:"checkoutDate" dc:"检定日期/有效期"` // 检定日期/有效期 + Status string `orm:"status" json:"status" dc:"施工类型状态 0正常 1停用"` // 施工类型状态 0正常 1停用 + EntryTime *gtime.Time `orm:"entry_time" json:"entryTime" dc:"入场时间"` // 入场时间 + CreateBy string `orm:"create_by" json:"createBy" dc:"创建者"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy" dc:"更新者"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt" dc:"创建时间"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt" dc:"更新时间"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt" dc:"删除时间"` // 删除时间 + Remark string `orm:"remark" json:"remark" dc:"备注"` // 备注 + Picture string `orm:"picture" json:"picture" dc:"4张图片,逗号分隔"` // 4张图片,逗号分隔 + MachineryId int64 `orm:"machinery_id" json:"machineryId" dc:"机械主键ID"` // 机械主键ID + Type string `orm:"type" json:"type" dc:"1出场 2入场"` // 1出场 2入场 + Principal string `orm:"principal" json:"principal" dc:"负责人" ` + RecordList []*BusMachineryRecordList `json:"recordList" dc:"状态记录详情"` +} + +// 新增|修改记录详情 +type BusMachineryRecordList struct { + Id string `json:"id" dc:"id"` + MachineryDetailId string `json:"machineryDetailId" dc:"机械详情id"` + Status string `json:"status"dc:"施工类型状态(0正常 1停用)"` + Type string `json:"type"dc:"1出场 2入场"` + RecordTime string `json:"recordTime"dc:"记录状态时间"` + CreateBy string `json:"createBy"dc:"创建人"` + CreatedAt string `json:"createdAt"dc:"创建时间"` + Principal string `json:"principal" dc:"负责人"` +} + +// app 修改文件 +type BusMachineryDetailFile struct { + Id int64 `json:"id" dc:"主键"` + Name string `json:"name" dc:"文件名字"` + Url string `json:"url" dc:"文件路径"` + Size int64 `json:"size" dc:"文件大小"` + FileType string `json:"fileType" orm:"type"dc:"文件类型"` +} + +// app 新增文件 +type BusMachineryDetailAddFile struct { + Name string `json:"name" dc:"文件名字"` + Url string `json:"url" dc:"文件路径"` + Size int64 `json:"size" dc:"文件大小"` + FileType string `json:"fileType" orm:"type"dc:"文件类型"` +} + +// appgetid +type BusMachineryDetailAppGetIdInfoRes struct { + gmeta.Meta `orm:"table:bus_machinery_detail"` + Id int64 `orm:"id,primary" json:"id" dc:"序号"` // 序号 + CheckoutNumber string `orm:"checkout_number" json:"checkoutNumber" dc:"检验证编号"` // 检验证编号 + CheckoutUnit string `orm:"checkout_unit" json:"checkoutUnit"dc:"检验单位"` // 检验单位 + CheckoutDate string `orm:"checkout_date" json:"checkoutDate" dc:"检定日期/有效期"` // 检定日期/有效期 + Status string `orm:"status" json:"status" dc:"施工类型状态 0正常 1停用"` // 施工类型状态 0正常 1停用 + EntryTime *gtime.Time `orm:"entry_time" json:"entryTime" dc:"入场时间"` // 入场时间 + CreateBy string `orm:"create_by" json:"createBy" dc:"创建者"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy" dc:"更新者"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt" dc:"创建时间"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt" dc:"更新时间"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt" dc:"删除时间"` // 删除时间 + Remark string `orm:"remark" json:"remark" dc:"备注"` // 备注 + Picture string `orm:"picture" json:"picture" dc:"4张图片,逗号分隔"` // 4张图片,逗号分隔 + MachineryId int64 `orm:"machinery_id" json:"machineryId" dc:"机械主键ID"` // 机械主键ID + Type string `orm:"type" json:"type" dc:"1出场 2入场"` // 1出场 2入场 + Principal string ` json:"principal" dc:"负责人"` // 负责人 + MachineryName string ` json:"machineryName"dc:"机械名称"` // 机械名称 + InspectionFile []BusMachineryDetailFile `json:"inspectionFile" dc:"上传设备合格校验单"` + LeaseFile []BusMachineryDetailFile `json:"leaseFile"dc:"上传设备租赁合同"` +} diff --git a/internal/app/system/model/bus_payroll_list.go b/internal/app/system/model/bus_payroll_list.go new file mode 100644 index 0000000..523a2f1 --- /dev/null +++ b/internal/app/system/model/bus_payroll_list.go @@ -0,0 +1,108 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-11-20 13:51:38 +// 生成路径: internal/app/system/model/bus_payroll_list.go +// 生成人:gfast +// desc:工资(excel导入形成的) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusPayrollListInfoRes is the golang structure for table bus_payroll_list. +type BusPayrollListInfoRes struct { + gmeta.Meta `orm:"table:bus_payroll_list"` + Id int64 `orm:"id,primary" json:"id"` // + Pid int64 `dc:"父ID"orm:"pid" json:"pid" ` // 父ID + XNumber string `dc:"编号" orm:"x_number" json:"xNumber" ` // 编号 + Name string `dc:"姓名" orm:"name" json:"name"` // + IdentityCard string `dc:"身份证号码" orm:"identity_card" json:"identityCard"` // + ContactWay string `dc:"联系方式" orm:"contact_way" json:"contactWay"` // + TeamOrGroup string `dc:"班组" orm:"team_or_group" json:"teamOrGroup"` // + TypeOfWork string `dc:"工种" orm:"type_of_work" json:"typeOfWork"` // + AttendanceTime string `dc:"当月考勤工作时间" orm:"attendance_time" json:"attendanceTime"` // + ActualWorkload string `dc:"当月产生实际工作量" orm:"actual_workload" json:"actualWorkload"` // + Quantity string `dc:"元量" orm:"quantity" json:"quantity"` // + XDay string `dc:"元天" orm:"x_day" json:"xDay"` // + XMonth string `dc:"元月" orm:"x_month" json:"xMonth"` // + OvertimeWage string `dc:"加班工资" orm:"overtime_wage" json:"overtimeWage"` // + Salary string `dc:"应发" orm:"salary" json:"salary"` // + AmountWithheld string `dc:"代扣金额" orm:"amount_withheld" json:"amountWithheld"` // + AmountPaid string `dc:"代缴金额" orm:"amount_paid" json:"amountPaid"` // + DeductOther string `dc:"扣除其他项目金额(如:预支)" orm:"deduct_other" json:"deductOther"` // + AmountPaidOut string `dc:"实发金额" orm:"amount_paid_out" json:"amountPaidOut"` // + ReleaseMode string `dc:"发放方式" orm:"release_mode" json:"releaseMode"` // + CreditCardNumbers string `dc:"银行卡号" orm:"credit_card_numbers" json:"creditCardNumbers"` // + OpeningBank string `dc:"开户行(具体到分行)" orm:"opening_bank" json:"openingBank"` // + CreateBy string `dc:"创建者" orm:"create_by" json:"createBy"` // + UpdateBy string `dc:"更新者" orm:"update_by" json:"updateBy"` // + CreatedAt *gtime.Time `dc:"创建时间" orm:"created_at" json:"createdAt"` // + UpdatedAt *gtime.Time `dc:"更新时间" orm:"updated_at" json:"updatedAt"` // + DeletedAt *gtime.Time `dc:"删除时间" orm:"deleted_at" json:"deletedAt"` // +} + +type BusPayrollListListRes struct { + Id int64 `json:"id"` + Name string `dc:"姓名 "json:"name"` + IdentityCard string `dc:"身份证号码 "json:"identityCard"` + ContactWay string `dc:"联系方式 "json:"contactWay"` + TeamOrGroup string `dc:"班组 "json:"teamOrGroup"` + TypeOfWork string `dc:"工种 "json:"typeOfWork"` + AttendanceTime string `dc:"当月考勤工作时间 "json:"attendanceTime"` + ActualWorkload string `dc:"当月产生实际工作量 "json:"actualWorkload"` + Quantity string `dc:"元量 "json:"quantity"` + XDay string `dc:"元天 "json:"xDay"` + XMonth string `dc:"元月 "json:"xMonth"` + OvertimeWage string `dc:"加班工资 "json:"overtimeWage"` + Salary string `dc:"应发 "json:"salary"` + AmountWithheld string `dc:"代扣金额 "json:"amountWithheld"` + AmountPaid string `dc:"代缴金额 "json:"amountPaid"` + DeductOther string `dc:"扣除其他项目金额(如:预支) "json:"deductOther"` + AmountPaidOut string `dc:"实发金额 "json:"amountPaidOut"` + ReleaseMode string `dc:"发放方式 "json:"releaseMode"` + CreditCardNumbers string `dc:"银行卡号 "json:"creditCardNumbers"` + OpeningBank string `dc:"开户行(具体到分行) "json:"openingBank"` + CreateBy string `dc:"创建者 "json:"createBy"` + UpdateBy string `dc:"更新者 "json:"updateBy"` + CreatedAt *gtime.Time `dc:"创建时间 "json:"createdAt"` +} + +type JieGouTi struct { + XNumber string `orm:"x_number" json:"xNumber"` // 编号 + Name string `orm:"name" json:"name"` // 姓名 + IdentityCard string `orm:"identity_card" json:"identityCard"` // 身份证号码 + ContactWay string `orm:"contact_way" json:"contactWay"` // 联系方式 + TeamOrGroup string `orm:"team_or_group" json:"teamOrGroup"` // 班组 + TypeOfWork string `orm:"type_of_work" json:"typeOfWork"` // 工种 + AttendanceTime string `orm:"attendance_time" json:"attendanceTime"` // 当月考勤工作时间 + ActualWorkload string `orm:"actual_workload" json:"actualWorkload"` // 当月产生实际工作量 + Quantity string `orm:"quantity" json:"quantity"` // 元量 + XDay string `orm:"x_day" json:"xDay"` // 元天 + XMonth string `orm:"x_month" json:"xMonth"` // 元月 + OvertimeWage string `orm:"overtime_wage" json:"overtimeWage"` // 加班工资 + Salary string `orm:"salary" json:"salary"` // 应发 + AmountWithheld string `orm:"amount_withheld" json:"amountWithheld"` // 代扣金额 + AmountPaid string `orm:"amount_paid" json:"amountPaid"` // 代缴金额 + DeductOther string `orm:"deduct_other" json:"deductOther"` // 扣除其他项目金额(如:预支) + AmountPaidOut string `orm:"amount_paid_out" json:"amountPaidOut"` // 实发金额 + ReleaseMode string `orm:"release_mode" json:"releaseMode"` // 发放方式 + CreditCardNumbers string `orm:"credit_card_numbers" json:"creditCardNumbers"` // 银行卡号 + OpeningBank string `orm:"opening_bank" json:"openingBank"` // 开户行(具体到分行) +} + +type QieJieGouTi struct { + Qie []*JieGouTi `json:"qie"` +} + +type BusPayrollRes struct { + Id int64 `json:"id" dc:"Id"` + Title string `json:"title" dc:"标题"` + Money string `json:"money" dc:"金额"` + CreateBy string `json:"createBy" dc:"创建人"` + CreatedAt string `json:"createdAt" dc:"创建试时间"` +} diff --git a/internal/app/system/model/bus_presetting_bit.go b/internal/app/system/model/bus_presetting_bit.go new file mode 100644 index 0000000..c411243 --- /dev/null +++ b/internal/app/system/model/bus_presetting_bit.go @@ -0,0 +1,43 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-10-19 15:17:27 +// 生成路径: internal/app/system/model/bus_presetting_bit.go +// 生成人:gfast +// desc:摄像头预置位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusPresettingBitInfoRes is the golang structure for table bus_presetting_bit. +type BusPresettingBitInfoRes struct { + gmeta.Meta `orm:"table:bus_presetting_bit"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + CameraId int64 `orm:"camera_id" json:"cameraId"` // 摄像头ID + Serial string `orm:"serial" json:"serial"` // 国标号 + Code string `orm:"code" json:"code"` // 通道号 + Command string `orm:"command" json:"command"` // 指令 + Preset int `orm:"preset" json:"preset"` // 预置位编号 + Name string `orm:"name" json:"name"` // 预置位名称 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type BusPresettingBitListRes struct { + Id int64 `json:"id"` + CameraId int64 `json:"cameraId"` + Serial string `json:"serial"` + Code string `json:"code"` + Command string `json:"command"` + Preset int `json:"preset"` + Name string `json:"name"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/bus_projectin_progress.go b/internal/app/system/model/bus_projectin_progress.go new file mode 100644 index 0000000..a8ea62b --- /dev/null +++ b/internal/app/system/model/bus_projectin_progress.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-03-20 19:45:19 +// 生成路径: internal/app/system/model/bus_projectin_progress.go +// 生成人:gfast +// desc:在建项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusProjectinProgressInfoRes is the golang structure for table bus_projectin_progress. +type BusProjectinProgressInfoRes struct { + gmeta.Meta `orm:"table:bus_projectin_progress"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目ID + ParallelIn float64 `orm:"parallel_in" json:"parallelIn"` // 并网容量 + CreatedBy *gtime.Time `orm:"created_by" json:"createdBy"` // 创建时间 +} + +type BusProjectinProgressListRes struct { + Id int64 `json:"id"` + ProjectId int64 `json:"projectId"` + ParallelIn float64 `json:"parallelIn"` + CreatedBy *gtime.Time `json:"createdBy"` +} diff --git a/internal/app/system/model/bus_quality.go b/internal/app/system/model/bus_quality.go new file mode 100644 index 0000000..60da4aa --- /dev/null +++ b/internal/app/system/model/bus_quality.go @@ -0,0 +1,46 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-02 17:11:39 +// 生成路径: internal/app/system/model/bus_quality.go +// 生成人:gfast +// desc:质量文档管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" +) + +// BusQualityInfoRes is the golang structure for table bus_quality. +type BusQualityInfoRes struct { + gmeta.Meta `orm:"table:bus_quality"` + Id uint64 `orm:"id,primary" json:"id"` // 序号 + QualityName string `orm:"quality_name" json:"qualityName"` // 质量检查名称 + QualityExplain string `orm:"quality_explain" json:"qualityExplain"` // 质量说明 + QualityDocument string `orm:"quality_document" json:"qualityDocument"` // 质量检查文件 + QualityDocumentObj []*comModel.UpFile `orm:"quality_document_obj" json:"qualityDocumentObj"` // 质量检查文件 cory增加 + QualityType string `orm:"quality_type" json:"qualityType"` // 质量类型 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Status string `orm:"status" json:"status"` // 帐号状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type BusQualityListRes struct { + Id uint64 `json:"id"` + QualityName string `json:"qualityName"` + QualityExplain string `json:"qualityExplain"` + QualityDocument string `json:"qualityDocument"` + QualityDocumentObj []*comModel.UpFile `json:"qualityDocumentObj"` + QualityType string `json:"qualityType"` + ProjectId int64 `json:"projectId"` + Status string `json:"status"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/bus_question_bank.go b/internal/app/system/model/bus_question_bank.go new file mode 100644 index 0000000..707b5a6 --- /dev/null +++ b/internal/app/system/model/bus_question_bank.go @@ -0,0 +1,52 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-10-07 15:52:18 +// 生成路径: internal/app/system/model/bus_question_bank.go +// 生成人:gfast +// desc:题库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusQuestionBankInfoRes is the golang structure for table bus_question_bank. +type BusQuestionBankInfoRes struct { + gmeta.Meta `orm:"table:bus_question_bank"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + CategoryId int64 `orm:"category_id" json:"categoryId"` // 题目类别 + LinkedCategoryId *LinkedBusQuestionBankBusCategory `orm:"with:id=category_id" json:"linkedCategoryId"` + QuestionType string `orm:"question_type" json:"questionType"` // 题目类型(1单选、2多选、3判断、4填空、5问答) + QuestionText string `orm:"question_text" json:"questionText"` // 题目内容 + Options string `orm:"options" json:"options"` // 选项(对单选、多选、判断这种固定答案有效,以JSON数组形式存储) + CorrectAnswer string `orm:"correct_answer" json:"correctAnswer"` // 正确答案 + Score float64 `orm:"score" json:"score"` // 得分 + WxOrPc string `orm:"wx_or_pc" json:"wxOrPc"` // 创建人类型(1pc、2小程序) + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type LinkedBusQuestionBankBusCategory struct { + gmeta.Meta `orm:"table:bus_category"` + Id int64 `orm:"id" json:"id"` // 主键ID + CategoryName string `orm:"category_name" json:"categoryName"` // 题库类别 +} + +type BusQuestionBankListRes struct { + Id int64 `json:"id"` + CategoryId int64 `json:"categoryId"` + LinkedCategoryId *LinkedBusQuestionBankBusCategory `orm:"with:id=category_id" json:"linkedCategoryId"` + QuestionType string `json:"questionType"` + QuestionText string `json:"questionText"` + Options string `json:"options"` + CorrectAnswer string `json:"correctAnswer"` + Score float64 `json:"score"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/bus_question_save.go b/internal/app/system/model/bus_question_save.go new file mode 100644 index 0000000..b4f6482 --- /dev/null +++ b/internal/app/system/model/bus_question_save.go @@ -0,0 +1,118 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-11-01 17:33:04 +// 生成路径: internal/app/system/model/bus_question_save.go +// 生成人:gfast +// desc:用户试卷存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusQuestionSaveInfoRes is the golang structure for table bus_question_save. +type BusQuestionSaveInfoRes struct { + gmeta.Meta `orm:"table:bus_question_save"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + Openid string `orm:"openid" json:"openid"` // openid + BankId int64 `orm:"bank_id" json:"bankId"` // 题库ID + Answer string `orm:"answer" json:"answer"` // 答案 + Correct string `orm:"correct" json:"correct"` // 答题是否正确(1正确 2错误) + Score float64 `orm:"score" json:"score"` // 得分(当前题) + Sign string `orm:"sign" json:"sign"` // 签名路径 + TakeTime int64 `orm:"take_time" json:"takeTime"` // 用时时间(时间戳/秒) + TimeOut int `orm:"time_out" json:"timeOut"` // 最大超时时间(单位/分钟) + Pass string `orm:"pass" json:"pass"` // 及格线/总分(格式:60,100) + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type BusQuestionSaveListRes struct { + Id int64 `json:"id"` + Openid string `json:"openid"` + BankId int64 `json:"bankId"` + Answer string `json:"answer"` + Correct string `json:"correct"` + Score float64 `json:"score"` + Sign string `json:"sign"` + TakeTime int64 `json:"takeTime"` + TimeOut int `json:"timeOut"` + Pass string `json:"pass"` + CreatedAt *gtime.Time `json:"createdAt"` +} + +// ModelWeChatPdfWoRes 安全考试 返回列表 +type ModelWeChatPdfWoRes struct { + Openid string `orm:"openid" json:"openid" dc:"openid"` + UserName string `orm:"userName" json:"userName" dc:"用户姓名"` + Pass string `orm:"pass" json:"pass" dc:"及格分/满分"` + SumScore string `orm:"sumScore" json:"sumScore" dc:"得分"` + Path string `orm:"path" json:"path" dc:"pdf试卷"` + TakeTime int64 `orm:"takeTime" json:"takeTime" dc:"已用考试时间(单位/秒)"` + TakeTimeStr string `orm:"takeTimeStr" json:"takeTimeStr" dc:"已用考试时间(秒转字符串)"` + TimeOut int64 `orm:"timeOut" json:"timeOut" dc:"考试时间(单位/分)"` + TimeOutStr string `orm:"timeOutStr" json:"timeOutStr" dc:"考试时间(分转字符串)"` + CreatedAt *gtime.Time `orm:"createdAt" json:"createdAt" dc:"创建"` + Type string `orm:"type" json:"type" dc:"1pdf 2图片"` + OTO string `orm:"oto" json:"oto" dc:"线上1 线下2"` +} + +// ExaminationPaperRes 生成试卷返回结果 +type ExaminationPaperRes struct { + UserName string `orm:"user_name" json:"userName"` // 用户姓名 + Pass string `orm:"pass" json:"pass"` // 及格线/总分(格式:60,100) + SumScore string `orm:"sumScore" json:"sumScore"` // 总得分 + Single *ExaminationPaperOne `json:"singleList" dc:"单选题"` + Multiple *ExaminationPaperOne `json:"multipleList" dc:"多选题"` + Estimate *ExaminationPaperOne `json:"estimateList" dc:"判断题"` + Sign string `orm:"sign" json:"sign"` // 签名路径 + Openid string `orm:"openid" json:"openid"` // openid +} + +type ExaminationPaperOne struct { + Topic string `p:"categoryId" dc:"题目+分数"` + List []*ExaminationPaperTwo `json:"list"` +} + +type ExaminationPaperTwo struct { + QuestionText string `orm:"question_text" json:"questionText"` // 内容 + Options string `orm:"options" json:"options"` // 选择 + Answer string `orm:"answer" json:"answer"` // 用户填写答案 + CorrectAnswer string `orm:"correct_answer" json:"correctAnswer"` // 正确答案答案 + Correct string `orm:"correct" json:"correct"` // 答题是否正确(1正确 2错误) + Score float64 `orm:"score" json:"score"` // 得分(当前题) +} + +// WoEntity 转pdf试卷需要 +type WoEntity struct { + QuestionType string `orm:"question_type" json:"questionType"` // 类型 + QuestionText string `orm:"question_text" json:"questionText"` // 内容 + Options string `orm:"options" json:"options"` // 选择 + Answer string `orm:"answer" json:"answer"` // 用户填写答案 + CorrectAnswer string `orm:"correct_answer" json:"correctAnswer"` // 正确答案答案 + Correct string `orm:"correct" json:"correct"` // 答题是否正确(1正确 2错误) + Score float64 `orm:"score" json:"score"` // 得分(当前题) + UserName string `orm:"user_name" json:"userName"` // 用户姓名 + Pass string `orm:"pass" json:"pass"` // 及格线/总分(格式:60,100) + SumScore float64 `orm:"sumScore" json:"sumScore"` // 总得分 + Sign string `orm:"sign" json:"sign"` // 签名路径 +} + +// BusQuestionOfflineRes 线下安全考试信息 +type BusQuestionOfflineRes struct { + gmeta.Meta `orm:"table:bus_question_offline"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + FullMark float64 `orm:"full_mark" json:"fullMark"` // 满分 + Score float64 `orm:"score" json:"score"` // 得分 + Pass float64 `orm:"pass" json:"pass"` // 及格分 + Img string `orm:"img" json:"img"` // 试卷图片,多个逗号分隔 + Openid string `orm:"openid" json:"openid"` // openid + IdentityCard string `orm:"identityCard" json:"identityCard"` // 身份证 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目ID + //CreatedAt *gtime.Time `orm:"createdAt" json:"createdAt"` +} diff --git a/internal/app/system/model/bus_questions_configuration.go b/internal/app/system/model/bus_questions_configuration.go new file mode 100644 index 0000000..ef1856f --- /dev/null +++ b/internal/app/system/model/bus_questions_configuration.go @@ -0,0 +1,42 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-10-07 17:11:20 +// 生成路径: internal/app/system/model/bus_questions_configuration.go +// 生成人:gfast +// desc:题库配置 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusQuestionsConfigurationInfoRes is the golang structure for table bus_questions_configuration. +type BusQuestionsConfigurationInfoRes struct { + gmeta.Meta `orm:"table:bus_questions_configuration"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + SingleChoice int `orm:"single_choice" json:"singleChoice"` // 单选题(单位/道) + SingleScore float64 `orm:"single_score" json:"singleScore"` // 单选分数 + MultipleChoice int `orm:"multiple_choice" json:"multipleChoice"` // 多选题(单位/道) + MultipleScore float64 `orm:"multiple_score" json:"multipleScore"` // 多选分数 + Estimate int `orm:"estimate" json:"estimate"` // 判断题(单位/道) + EstimateScore float64 `orm:"estimate_score" json:"estimateScore"` // 判断分数 + FullMark float64 `orm:"full_mark" json:"fullMark"` // 满分 + PassingScore float64 `orm:"passing_score" json:"passingScore"` // 及格线 + AnswerTime int `orm:"answer_time" json:"answerTime"` // 最大答题时间(单位/分) +} + +type BusQuestionsConfigurationListRes struct { + Id int64 `json:"id"` + SingleChoice int `json:"singleChoice"` + SingleScore float64 `json:"singleScore"` + MultipleChoice int `json:"multipleChoice"` + MultipleScore float64 `json:"multipleScore"` + Estimate int `json:"estimate"` + EstimateScore float64 `json:"estimateScore"` + FullMark float64 `json:"fullMark"` + PassingScore float64 `json:"passingScore"` + AnswerTime int `json:"answerTime"` +} diff --git a/internal/app/system/model/bus_reissue_a_card.go b/internal/app/system/model/bus_reissue_a_card.go new file mode 100644 index 0000000..c245422 --- /dev/null +++ b/internal/app/system/model/bus_reissue_a_card.go @@ -0,0 +1,136 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-02-02 15:18:48 +// 生成路径: internal/app/system/model/bus_reissue_a_card.go +// 生成人:gfast +// desc:施工人员补卡申请 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" + commonApi "github.com/tiger1103/gfast/v3/api/v1/common" +) + +// BusReissueACardInfoRes is the golang structure for table bus_reissue_a_card. +type BusReissueACardInfoRes struct { + gmeta.Meta `orm:"table:bus_reissue_a_card"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + Openid string `orm:"openid" json:"openid"` // 申请人 + Scope string `orm:"scope" json:"scope"` // 申请补卡范围 + Explain string `orm:"explain" json:"explain"` // 申请补卡说明 + Ganger string `orm:"ganger" json:"ganger"` // 班组长 + GangerOpinion string `orm:"ganger_opinion" json:"gangerOpinion"` // 班组长意见(1未读 2同意 3拒绝) + GangerExplain string `orm:"ganger_explain" json:"gangerExplain"` // 班组长说明 + GangerTime *gtime.Time `orm:"ganger_time" json:"gangerTime"` // 班组长操作时间 + ManagerOpinion string `orm:"manager_opinion" json:"managerOpinion"` // 管理员意见(1未读 2同意 3拒绝) + ManagerExplain string `orm:"manager_explain" json:"managerExplain"` // 管理员说明 + UpdateBy string `orm:"update_by" json:"updateBy"` // 后台操作人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目ID + TeamId int64 `orm:"team_id" json:"teamId"` // 班组ID + Type string `orm:"type" json:"type"` // type + + ProjectName string `orm:"project_name" json:"projectName"` + TeamName string `orm:"team_name" json:"teamName"` + UserName string `orm:"user_name" json:"userName" dc:"真实姓名"` +} + +type BusReissueACardListRes struct { + Id int64 `json:"id"` + Openid string `json:"openid"` + Scope string `json:"scope"` + Explain string `json:"explain"` + Ganger string `json:"ganger"` + GangerOpinion string `json:"gangerOpinion"` + GangerExplain string `json:"gangerExplain"` + GangerTime *gtime.Time `json:"gangerTime"` + ManagerOpinion string `json:"managerOpinion"` + ManagerExplain string `json:"managerExplain"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` + UpdatedAt *gtime.Time `json:"updatedAt"` + ProjectId int64 `json:"projectId"` + TeamId int64 `json:"teamId"` + ProjectName string `json:"projectName"` + TeamName string `json:"teamName"` + Type string `json:"type"` + CardMode string `json:"cardMode" dc:"卡片状态(文字)"` + CardNumber string `json:"cardNumber" dc:"卡片状态(数字:1待审核 2审核中 3已拒绝 4已同意)"` + + UserName string `json:"userName" dc:"真实姓名"` +} + +type WxBusReissueACardListRes struct { + Id int64 `json:"id"` + NickName string `json:"nickName" dc:"头像"` + UserName string `json:"userName" dc:"真实姓名"` + CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"` + UpdatedAt *gtime.Time `json:"updatedAt" dc:"管理员操作时间"` + Openid string `json:"openid"` + Scope string `json:"scope" dc:"补卡范围"` + Explain string `json:"explain" dc:"补卡说明"` + Ganger string `json:"ganger" dc:"班组长"` + GangerName string `json:"gangerName" dc:"班组长姓名"` + GangerOpinion string `json:"gangerOpinion" dc:"班组长意见(1未读 2同意 3拒绝)"` + GangerExplain string `json:"gangerExplain" dc:"班组长说明"` + GangerTime *gtime.Time `json:"gangerTime" dc:"班组长操作时间"` + ManagerOpinion string `json:"managerOpinion" dc:"管理员意见(1未读 2同意 3拒绝)"` + ManagerExplain string `json:"managerExplain" dc:"管理员说明"` + CardMode string `json:"cardMode" dc:"卡片状态(文字)"` + CardNumber string `json:"cardNumber" dc:"卡片状态(数字:1待审核 2审核中 3已拒绝 4已同意)"` + ProjectWhereYouWork string `json:"projectWhereYouWork" dc:"所在项目"` + ProjectId int64 `json:"projectId"` + TeamId int64 `json:"teamId"` + //UpdateBy string `json:"updateBy dc:"管理员"` +} + +type AppTheTeamLeaderSupplementCardApprovalList struct { + Id int64 `json:"id"` + HeadIcon string `json:"headIcon" dc:"头像"` + UserName string `json:"userName" dc:"真实姓名"` + Scope string `json:"scope" dc:"补卡范围"` + Explain string `json:"explain" dc:"补卡说明"` + ManagerOpinion string `json:"managerOpinion" dc:"管理员意见(1未读 2同意 3拒绝)"` + GangerOpinion string `json:"gangerOpinion" dc:"班组长意见(1未读 2同意 3拒绝)"` + CardMode string `json:"cardMode" dc:"卡片状态"` + CardNumber string `json:"cardNumber" dc:"卡片状态(数字:1待审核 2审核中 3已拒绝 4已同意)"` + CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"` + GangerTime *gtime.Time `json:"gangerTime" dc:"班组长审批时间"` +} + +type AppTheTeamLeaderSupplementCardApprovalRes struct { + commonApi.PageReq + Openid string `json:"openid" dc:"openid" ` + Type string `json:"type" dc:"1审批列表 2审批列表记录"` + YearAndMonth string `p:"yearAndMonth" dc:"日期(格式:2024-04-01)" v:"date-format:Y-m-d#时间格式为2024-04-01"` +} + +type AppApprovalRecordDetailsRes struct { + Id int64 `json:"id"` + UserName string `json:"userName" dc:"真实姓名"` + Openid string `json:"openid"` + Scope string `json:"scope" dc:"补卡范围"` + Explain string `json:"explain" dc:"补卡说明"` + CardMode string `json:"cardMode" dc:"卡片状态"` + CardNumber string `json:"cardNumber" dc:"卡片状态(数字:1待审核 2审核中 3已拒绝 4已同意)"` + ProjectWhereYouWork string `json:"projectWhereYouWork" dc:"所在项目"` + ProjectId int64 `json:"projectId"` + TeamId int64 `json:"teamId"` + + GangerHead string `json:"gangerHead" dc:"班组长头像"` + GangerName string `json:"gangerName" dc:"班组长姓名"` + Ganger string `json:"ganger" dc:"班组长"` + GangerOpinion string `json:"gangerOpinion" dc:"班组长意见(1未读 2同意 3拒绝)"` + GangerExplain string `json:"gangerExplain" dc:"班组长说明"` + + ManagerHead string `json:"managerHead" dc:"管理员头像"` + ManagerName string `json:"managerName" dc:"管理员姓名"` + UpdateBy string `json:"updateBy" dc:"管理员"` + ManagerOpinion string `json:"managerOpinion" dc:"管理员意见(1未读 2同意 3拒绝)"` + ManagerExplain string `json:"managerExplain" dc:"管理员说明"` +} diff --git a/internal/app/system/model/bus_research_document.go b/internal/app/system/model/bus_research_document.go new file mode 100644 index 0000000..a40bc7b --- /dev/null +++ b/internal/app/system/model/bus_research_document.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-29 16:04:06 +// 生成路径: internal/app/system/model/bus_research_document.go +// 生成人:gfast +// desc:科研文档 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusResearchDocumentInfoRes is the golang structure for table bus_research_document. +type BusResearchDocumentInfoRes struct { + gmeta.Meta `orm:"table:bus_research_document"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + DocumenName string `orm:"documen_name" json:"documenName"` // 文档名称 + Remark string `orm:"remark" json:"remark"` // 备注 + DocumentUrl string `orm:"document_url" json:"documentUrl"` // 文件路径 + FileId int64 `orm:"file_id" json:"fileId"` // 文件夹id + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Status string `orm:"status" json:"status"` // 状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 上传时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type BusResearchDocumentListRes struct { + Id int64 `json:"id"` + DocumenName string `json:"documenName"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/bus_safety.go b/internal/app/system/model/bus_safety.go new file mode 100644 index 0000000..f79410b --- /dev/null +++ b/internal/app/system/model/bus_safety.go @@ -0,0 +1,51 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-02 15:40:48 +// 生成路径: internal/app/system/model/bus_safety.go +// 生成人:gfast +// desc:安全例会管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" + comModel "github.com/tiger1103/gfast/v3/internal/app/common/model" +) + +// BusSafetyInfoRes is the golang structure for table bus_safety. +type BusSafetyInfoRes struct { + gmeta.Meta `orm:"table:bus_safety"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + SafetyName string `orm:"safety_name" json:"safetyName"` // 安全检查名称 + SafetyExplain string `orm:"safety_explain" json:"safetyExplain"` // 安全说明 + SafetyDocument string `orm:"safety_document" json:"safetyDocument"` // 安全检查文件 + SafetyDocumentObj []*comModel.UpFile `orm:"safety_document_obj" json:"safetyDocumentObj"` // 安全检查文件对象 cory增加 + SafetyType string `orm:"safety_type" json:"safetyType"` // 安全类型 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Status string `orm:"status" json:"status"` // 帐号状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + StartDate *gtime.Time `orm:"start_date" json:"startDate"` //实际创建时间 + SafetyGrade string `orm:"safety_grade" json:"safetyGrade"` //等级 + UserType string `orm:"user_type" json:"userType"` //用户类型 +} + +type BusSafetyListRes struct { + Id int64 `json:"id"` + SafetyName string `json:"safetyName"` + SafetyExplain string `json:"safetyExplain"` + SafetyDocument string `json:"safetyDocument"` + SafetyType string `json:"safetyType"` + ProjectId int64 `json:"projectId"` + Status string `json:"status"` + StartDate *gtime.Time `json:"startDate"` + SafetyGrade string `json:"safetyGrade"` + UserType string `json:"userType"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/bus_salary_details.go b/internal/app/system/model/bus_salary_details.go new file mode 100644 index 0000000..e9dad32 --- /dev/null +++ b/internal/app/system/model/bus_salary_details.go @@ -0,0 +1,90 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-02-01 16:39:01 +// 生成路径: internal/app/system/model/bus_salary_details.go +// 生成人:gfast +// desc:员工工资考核记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusSalaryDetailsInfoRes is the golang structure for table bus_salary_details. +type BusSalaryDetailsInfoRes struct { + gmeta.Meta `orm:"table:bus_salary_details"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + SfzNumber string `orm:"sfz_number" json:"sfzNumber"` // 身份证 + Name string `orm:"name" json:"name"` // 户名 + Account string `orm:"account" json:"account"` // 账户 + BankingHouse string `orm:"banking_house" json:"bankingHouse"` // 银行 + SumDuration float64 `orm:"sum_duration" json:"sumDuration"` // 当月总时长 + Salary float64 `orm:"salary" json:"salary"` // 薪水(天) + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + TeamId int64 `orm:"team_id" json:"teamId"` // 班组id + ProjectName string `orm:"project_name" json:"projectName"` // 项目名称 + TeamName string `orm:"team_name" json:"teamName"` // 班组名称 + DateOfIssue string `orm:"date_of_issue" json:"dateOfIssue"` // 发放年月 + Lister string `orm:"lister" json:"lister"` // 制表人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type BusSalaryDetailsListRes struct { + Id int64 `json:"id"` + SfzNumber string `json:"sfzNumber"` + Name string `json:"name"` + Account string `json:"account"` + SumDuration float64 `json:"sumDuration"` + Salary float64 `json:"salary"` + DateOfIssue string `json:"dateOfIssue"` + Lister string `json:"lister"` + CreatedAt *gtime.Time `json:"createdAt"` +} + +// AttendanceImportRes 新增考勤记录实体类 +type AttendanceImportRes struct { + Name string `json:"name" dc:"用户名"` + SfzNumber string `json:"sfzNumber" dc:"身份证"` + Dates []DateRes `json:"dates" dc:"考勤详情"` + Lister string `json:"lister" dc:"制表人"` + SumDuration float64 `json:"sumDuration" dc:"工作总时长"` + DateOfIssue string `json:"dateOfIssue" dc:"发放年月"` +} +type AttendanceImportTwoRes struct { + AttendanceImportRes + Id int64 `json:"id" dc:"主键ID"` + UserName string `json:"userName" dc:"户名"` + YhkNumber string `json:"yhkNumber" dc:"银行卡"` + YhkOpeningBank string `json:"yhkOpeningBank" dc:"开户行"` + ProjectId int64 `json:"projectId" dc:"项目id"` + TeamId int64 `json:"teamId" dc:"班组id"` + FinalSalary float64 `json:"finalSalary" dc:"薪水"` +} + +// DateRes 新增考勤记录实体类 +type DateRes struct { + WorkingDate string `json:"working_date" dc:"工作日期"` + Duration string `json:"duration" dc:"工作时长"` +} +type DateTwoRes struct { + WorkingDate string `json:"working_date" dc:"工作日期"` + Duration string `json:"duration" dc:"工作时长"` + SfzNumber string `json:"sfzNumber" dc:"身份证"` + DateOfIssue string `json:"dateOfIssue" dc:"发放年月"` +} + +// SalarySheetRes 导出为excel工资条的数据 +type SalarySheetRes struct { + YhkNumber string `json:"yhkNumber" dc:"账号"` + UserName string `json:"userName" dc:"户名"` + Money string `json:"money" dc:"金额"` + BankingHouse string `json:"bankingHouse" dc:"行名(开户行)"` + ProjectName string `json:"projectName" dc:"项目名称"` + TeamName string `json:"teamName" dc:"班组名称"` +} diff --git a/internal/app/system/model/bus_scheduled_plan_type.go b/internal/app/system/model/bus_scheduled_plan_type.go new file mode 100644 index 0000000..4724f77 --- /dev/null +++ b/internal/app/system/model/bus_scheduled_plan_type.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-29 17:39:12 +// 生成路径: internal/app/system/model/bus_scheduled_plan_type.go +// 生成人:gfast +// desc:施工进度分类 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusScheduledPlanTypeInfoRes is the golang structure for table bus_scheduled_plan_type. +type BusScheduledPlanTypeInfoRes struct { + gmeta.Meta `orm:"table:bus_scheduled_plan_type"` + PlanTypeId int `orm:"plan_type_id,primary" json:"planTypeId"` // 施工类型id + ParentId int `orm:"parent_id" json:"parentId"` // 父文件id + Ancestors string `orm:"ancestors" json:"ancestors"` // 祖级列表 + PlanTypeName string `orm:"plan_type_name" json:"planTypeName"` // 施工类型名称 + PlannedTime int64 `orm:"planned_time" json:"plannedTime"` // 计划施工持续时间 + PlanStartTime string `orm:"plan_start_time" json:"planStartTime"` // 计划工期开始时间 + PlanEndTime string `orm:"plan_end_time" json:"planEndTime"` // 计划工期结束时间 + OrderNum int `orm:"order_num" json:"orderNum"` // 显示顺序 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Leader string `orm:"leader" json:"leader"` // 负责人 + Status string `orm:"status" json:"status"` // 施工类型状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type BusScheduledPlanTypeListRes struct { + PlanTypeId int `json:"planTypeId"` + ParentId int `json:"parentId"` + Ancestors string `json:"ancestors"` + PlanTypeName string `json:"planTypeName"` + PlannedTime int64 `json:"plannedTime"` + PlanStartTime string `json:"planStartTime"` + PlanEndTime string `json:"planEndTime"` + OrderNum int `json:"orderNum"` + ProjectId int64 `json:"projectId"` + Leader string `json:"leader"` + Status string `json:"status"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/bus_scheduled_plan_type_detail.go b/internal/app/system/model/bus_scheduled_plan_type_detail.go new file mode 100644 index 0000000..f1eeca3 --- /dev/null +++ b/internal/app/system/model/bus_scheduled_plan_type_detail.go @@ -0,0 +1,55 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-29 17:15:27 +// 生成路径: internal/app/system/model/bus_scheduled_plan_type_detail.go +// 生成人:gfast +// desc:施工进度月报,年报分类 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusScheduledPlanTypeDetailInfoRes is the golang structure for table bus_scheduled_plan_type_detail. +type BusScheduledPlanTypeDetailInfoRes struct { + gmeta.Meta `orm:"table:bus_scheduled_plan_type_detail"` + PlanTypeDetailId int `orm:"plan_type_detail_id,primary" json:"planTypeDetailId"` // 施工类型id + ParentId int `orm:"parent_id" json:"parentId"` // 父文件id + Ancestors string `orm:"ancestors" json:"ancestors"` // 祖级列表 + PlanTypeName string `orm:"plan_type_name" json:"planTypeName"` // 施工类型名称 + PlannedTime int64 `orm:"planned_time" json:"plannedTime"` // 计划施工持续时间 + PlanStartTime string `orm:"plan_start_time" json:"planStartTime"` // 计划工期开始时间 + PlanEndTime string `orm:"plan_end_time" json:"planEndTime"` // 计划工期结束时间 + OrderNum int `orm:"order_num" json:"orderNum"` // 显示顺序 + DateValue string `orm:"date_value" json:"dateValue"` // 时间 + DateType string `orm:"date_type" json:"dateType"` // 日期类型状态 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Leader string `orm:"leader" json:"leader"` // 负责人 + Status string `orm:"status" json:"status"` // 施工类型状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type BusScheduledPlanTypeDetailListRes struct { + PlanTypeDetailId int `json:"planTypeDetailId"` + ParentId int `json:"parentId"` + Ancestors string `json:"ancestors"` + PlanTypeName string `json:"planTypeName"` + PlannedTime int64 `json:"plannedTime"` + PlanStartTime string `json:"planStartTime"` + PlanEndTime string `json:"planEndTime"` + OrderNum int `json:"orderNum"` + DateValue string `json:"dateValue"` + DateType string `json:"dateType"` + ProjectId int64 `json:"projectId"` + Leader string `json:"leader"` + Status string `json:"status"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/bus_scheduled_weekly.go b/internal/app/system/model/bus_scheduled_weekly.go new file mode 100644 index 0000000..cd6bf01 --- /dev/null +++ b/internal/app/system/model/bus_scheduled_weekly.go @@ -0,0 +1,55 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-02 15:28:49 +// 生成路径: internal/app/system/model/bus_scheduled_weekly.go +// 生成人:gfast +// desc:周报 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusScheduledWeeklyInfoRes is the golang structure for table bus_scheduled_weekly. +type BusScheduledWeeklyInfoRes struct { + gmeta.Meta `orm:"table:bus_scheduled_weekly"` + PlanWeeklyId int64 `orm:"plan_weekly_id,primary" json:"planWeeklyId"` // 施工周报id + PlanPeriodId int64 `orm:"plan_period_id" json:"planPeriodId"` // 施工分类id + WeeklyPlanName string `orm:"weekly_plan_name" json:"weeklyPlanName"` // 施工分类下第几周 + WeeklyStartTime string `orm:"weekly_start_time" json:"weeklyStartTime"` // 周开始时间 + WeeklyEndTime string `orm:"weekly_end_time" json:"weeklyEndTime"` // 周完成时间 + WeeklyPlanFinish string `orm:"weekly_plan_finish" json:"weeklyPlanFinish"` // 周计划完成量 + WeeklyRealityFinish string `orm:"weekly_reality_finish" json:"weeklyRealityFinish"` // 周实际完成量 + WeekyAccumulativeFinish string `orm:"weeky_accumulative_finish" json:"weekyAccumulativeFinish"` // 累计完成量 + WeekyAccumulativeTotal string `orm:"weeky_accumulative_total" json:"weekyAccumulativeTotal"` // 总量 + CompletionRate string `orm:"completion_rate" json:"completionRate"` // 累计完成比例 + Leader string `orm:"leader" json:"leader"` // 负责人 + Status string `orm:"status" json:"status"` // 施工类型状态 + WeeklyDocumentUrl string `orm:"weekly_document_url" json:"weeklyDocumentUrl"` // 施工周报文档地址 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type BusScheduledWeeklyListRes struct { + PlanWeeklyId int64 `json:"planWeeklyId"` + PlanPeriodId int64 `json:"planPeriodId"` + WeeklyPlanName string `json:"weeklyPlanName"` + WeeklyStartTime string `json:"weeklyStartTime"` + WeeklyEndTime string `json:"weeklyEndTime"` + WeeklyPlanFinish string `json:"weeklyPlanFinish"` + WeeklyRealityFinish string `json:"weeklyRealityFinish"` + WeekyAccumulativeFinish string `json:"weekyAccumulativeFinish"` + WeekyAccumulativeTotal string `json:"weekyAccumulativeTotal"` + CompletionRate string `json:"completionRate"` + Leader string `json:"leader"` + Status string `json:"status"` + WeeklyDocumentUrl string `json:"weeklyDocumentUrl"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/bus_scheduled_weekly_photovoltaic.go b/internal/app/system/model/bus_scheduled_weekly_photovoltaic.go new file mode 100644 index 0000000..708fc75 --- /dev/null +++ b/internal/app/system/model/bus_scheduled_weekly_photovoltaic.go @@ -0,0 +1,45 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-02 15:21:55 +// 生成路径: internal/app/system/model/bus_scheduled_weekly_photovoltaic.go +// 生成人:gfast +// desc:周报-光伏板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusScheduledWeeklyPhotovoltaicInfoRes is the golang structure for table bus_scheduled_weekly_photovoltaic. +type BusScheduledWeeklyPhotovoltaicInfoRes struct { + gmeta.Meta `orm:"table:bus_scheduled_weekly_photovoltaic"` + PhotovoltaicId int64 `orm:"photovoltaic_id,primary" json:"photovoltaicId"` // 序号 + PlanWeeklyId int64 `orm:"plan_weekly_id" json:"planWeeklyId"` // 周报id + PhotovoltaicNumber string `orm:"photovoltaic_number" json:"photovoltaicNumber"` // 光伏板编号 + PhotovoltaicNumberGis string `orm:"photovoltaic_number_gis" json:"photovoltaicNumberGis"` // gis地图中使用的真实的光伏板id + InstallNot string `orm:"install_not" json:"installNot"` // 是否安装 + InstallCreateTime string `orm:"install_createTime" json:"installCreateTime"` // 安装时间 + Status string `orm:"status" json:"status"` // 光伏板状态 + ProjectId string `orm:"project_id" json:"projectId"` // '项目id' + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type BusScheduledWeeklyPhotovoltaicListRes struct { + PhotovoltaicId int64 `json:"photovoltaicId"` + PlanWeeklyId int64 `json:"planWeeklyId"` + PhotovoltaicNumber string `json:"photovoltaicNumber"` + PhotovoltaicNumberGis string `json:"photovoltaicNumberGis"` + InstallNot string `json:"installNot"` + InstallCreateTime string `json:"installCreateTime"` + Status string `json:"status"` + ProjectId string `json:"projectId"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/bus_standing_book.go b/internal/app/system/model/bus_standing_book.go new file mode 100644 index 0000000..4ac9612 --- /dev/null +++ b/internal/app/system/model/bus_standing_book.go @@ -0,0 +1,50 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-29 11:36:04 +// 生成路径: internal/app/system/model/bus_standing_book.go +// 生成人:gfast +// desc:台账 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusStandingBookInfoRes is the golang structure for table bus_standing_book. +type BusStandingBookInfoRes struct { + gmeta.Meta `orm:"table:bus_standing_book"` + StandingBookId int64 `orm:"standing_book_id,primary" json:"standingBookId"` // 序号 + EquipmentMaterialsId int64 `orm:"equipment_materials_id" json:"equipmentMaterialsId"` // 材料/设备 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + StandingBookType string `orm:"standing_book_type" json:"standingBookType"` // 台账类型 + ApproachTime string `orm:"approach_time" json:"approachTime"` // 进场时间 + ClaimingDate string `orm:"claiming_date" json:"claimingDate"` // 领用时间 + Quantity string `orm:"quantity" json:"quantity"` // 数量 + Gross string `orm:"gross" json:"gross"` // 总量 + Status string `orm:"status" json:"status"` // 状态 + SignerRecipient string `orm:"signer_recipient" json:"signerRecipient"` // 签收领用人 + RecipientUnit string `orm:"recipient_unit" json:"recipientUnit"` // 使用单位 + StoreIssue string `orm:"store_issue" json:"storeIssue"` // 发料人 + ProcessMode string `orm:"process_mode" json:"processMode"` // 处理方式 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type BusStandingBookListRes struct { + StandingBookId int64 `json:"standingBookId"` + EquipmentMaterialsId int64 `json:"equipmentMaterialsId"` + StandingBookType string `json:"standingBookType"` + ApproachTime string `json:"approachTime"` + Quantity string `json:"quantity"` + Gross string `json:"gross"` + Status string `json:"status"` + SignerRecipient string `json:"signerRecipient"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/bus_tour.go b/internal/app/system/model/bus_tour.go new file mode 100644 index 0000000..1bd6225 --- /dev/null +++ b/internal/app/system/model/bus_tour.go @@ -0,0 +1,47 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-10-10 12:11:05 +// 生成路径: internal/app/system/model/bus_tour.go +// 生成人:gfast +// desc:煤科巡视-故障记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusTourInfoRes is the golang structure for table bus_tour. +type BusTourInfoRes struct { + gmeta.Meta `orm:"table:bus_tour"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + ProjectId int64 `orm:"project_id,primary" json:"projectId"` // 项目id + TourCategory string `orm:"tour_category" json:"tourCategory"` // 类别字典 + TourType string `orm:"tour_type" json:"tourType"` // 类型字典 + Picture string `orm:"picture" json:"picture"` // 图片路径 + Num string `orm:"num" json:"num"` // 违规数量 + Describe string `orm:"describe" json:"describe"` // 故障描述 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + TableName string `orm:"table_name" json:"tableName"` // 表名 + TableId int64 `orm:"table_id" json:"tableId"` // 表id + Nickname string `orm:"nickname" json:"nickname"` //根据表名+id得到的昵称 + SxtName string `orm:"sxt_name" json:"sxtName"` //根据表名+id得到的昵称 +} + +type BusTourListRes struct { + Id int64 `json:"id" dc:"主键ID"` + ProjectId int64 `json:"projectId" dc:"项目id"` + TourCategory string `json:"tourCategory" dc:"类别字典(如:无人机识别、监控拍摄)"` + TourType string `json:"tourType" dc:"类型字典(如:安全帽、安全带)"` + Picture string `json:"picture" dc:"图片路径"` + Describe string `json:"describe" dc:"故障描述"` + CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"` + Num string `orm:"num" json:"num" dc:"违规人数"` + Nickname string `json:"nickname" dc:"昵称"` + SxtName string `json:"sxtName" dc:"摄像头名称"` +} diff --git a/internal/app/system/model/bus_type_of_wage.go b/internal/app/system/model/bus_type_of_wage.go new file mode 100644 index 0000000..03d0e1b --- /dev/null +++ b/internal/app/system/model/bus_type_of_wage.go @@ -0,0 +1,35 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-09-05 10:07:11 +// 生成路径: internal/app/system/model/bus_type_of_wage.go +// 生成人:gfast +// desc:工种薪水 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusTypeOfWageInfoRes is the golang structure for table bus_type_of_wage. +type BusTypeOfWageInfoRes struct { + gmeta.Meta `orm:"table:bus_type_of_wage"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + TypeOfWork string `orm:"type_of_work" json:"typeOfWork"` // 工种字典 + Standard float64 `orm:"standard" json:"standard"` // 工资标准 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type BusTypeOfWageListRes struct { + Id int64 `json:"id"` + TypeOfWork string `json:"typeOfWork"` + Standard float64 `json:"standard"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/bus_violation_level.go b/internal/app/system/model/bus_violation_level.go new file mode 100644 index 0000000..82e534d --- /dev/null +++ b/internal/app/system/model/bus_violation_level.go @@ -0,0 +1,62 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-11-20 11:18:36 +// 生成路径: internal/app/system/model/bus_violation_level.go +// 生成人:gfast +// desc:违章等级 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +// BusViolationLevelInfoRes is the golang structure for table bus_violation_level. +type BusViolationLevelInfoRes struct { + gmeta.Meta `orm:"table:bus_violation_level"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + Grade string `orm:"grade" json:"grade"` // 违章等级 + Color string `orm:"color" json:"color"` // 颜色 + TourType string `orm:"tour_type" json:"tourType"` // 违章类型 + Risx string `orm:"risx" json:"risx"` // 违章类型 + WxOrPc string `orm:"wx_or_pc" json:"wxOrPc"` // 来源:1pc 2小程序 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + + DictLabel string `orm:"dict_label" json:"dictLabel"` + + PostEntity []*entity.SysPost `orm:"postEntity" json:"postEntity"` // 岗位信息 +} + +type BusViolationLevelListRes struct { + Id int64 `json:"id"` + Grade string `json:"grade"` + Color string `json:"color"` + TourType string `json:"tourType"` + Risx string `json:"risx"` + CreatedAt *gtime.Time `json:"createdAt"` +} + +type ViolationLevelPost struct { + gmeta.Meta `orm:"table:bus_violation_level_post"` + Id int64 `json:"id" dc:"主键ID"` + Level int64 `json:"level" dc:"等级主键ID"` + Post int64 `json:"post" dc:"岗位主键ID"` +} + +type ViolationRecordCorrelation struct { + gmeta.Meta `orm:"table:bus_violation_record_correlation"` + Id int64 `json:"id" dc:"主键ID"` + RecordId int64 `json:"record_id" dc:"等级主键ID"` + UserId int64 `json:"user_id" dc:"岗位主键ID"` + PostId int64 `json:"post_id" dc:"岗位主键ID"` + userName string `json:"user_name" dc:"用户名称"` + PostName string `json:"post_name" dc:"岗位名称"` +} diff --git a/internal/app/system/model/bus_violation_record.go b/internal/app/system/model/bus_violation_record.go new file mode 100644 index 0000000..3b51bb1 --- /dev/null +++ b/internal/app/system/model/bus_violation_record.go @@ -0,0 +1,160 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-11-20 11:18:37 +// 生成路径: internal/app/system/model/bus_violation_record.go +// 生成人:gfast +// desc:违章记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusViolationRecordInfoRes is the golang structure for table bus_violation_record. +type BusViolationRecordInfoRes struct { + gmeta.Meta `orm:"table:bus_violation_record"` + Pid int64 `orm:"pid" json:"pid"` // 父级主键ID + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + LevelId int64 `orm:"level_id" json:"levelId"` // 违章等级主键ID + Level string `orm:"level" json:"level"` // 违章等级 + TourType string `orm:"tour_type" json:"tourType"` // 违章类型 + TourId int64 `orm:"tour_id" json:"tourId"` // 违章详情(关联bus_tour)Level string `orm:"level" json:"level"` // 违章等级 + DataSource string `orm:"data_source" json:"dataSource"` // 数据来源 + SelectPeople int64 `orm:"select_people" json:"selectPeople"` // 选择人(后台用户ID) + Openid string `orm:"openid" json:"openid"` // 处理人 + Status string `orm:"status" json:"status" dc:"工单状态(1通知 2整改 3复查)"` + ProcessingPeriod string `orm:"processing_period" json:"processingPeriod"` // 处理期限(要求) + ProcessingPeriodPractical string `orm:"processing_period_practical" json:"processingPeriodPractical"` // 处理期限(实际) + Measure string `orm:"measure" json:"measure"` // 整改措施 + Review string `orm:"review" json:"review"` // 复查情况 + ReviewType string `orm:"review_type" json:"reviewType"` // 复查状态(1通过 2未通过) + RectificationTime *gtime.Time `orm:"rectification_time" json:"rectificationTime"` // 整改时间 + ReviewTime *gtime.Time `orm:"review_time" json:"reviewTime"` // 复查时间 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Remark string `orm:"remark" json:"remark"` // 备注 + SxtName string `orm:"sxt_name" json:"sxtName"` + + //IsDispose string `orm:"is_dispose" json:"isDispose"` // 是否处理(1待处理 2已处理) + //Picture string `orm:"picture" json:"picture"` // 图片 + //LaborDate string `orm:"labor_date" json:"laborDate"` // 人工日期 + //ProcessingTime string `orm:"processing_time" json:"processingTime"` // 处理日期 + //WxOrPc string `orm:"wx_or_pc" json:"wxOrPc"` // 来源:1pc 2小程序 + + NickName string `orm:"nickName" json:"nickName" dc:"微信用户昵称"` + UserName string `orm:"userName" json:"userName" dc:"微信用户姓名"` + PictureTwo string `orm:"pictureTwo" json:"pictureTwo" dc:"违章的图片"` + ViolationRecordCorrelationList []*ViolationRecordCorrelation `orm:"violationRecordCorrelationList" json:"violationRecordCorrelationList"` + IsReview bool `orm:"isReview" json:"isReview" dc:"是否可以复查"` + + RefuseList interface{} `json:"refuseList" dc:"拒绝数组结构体"` +} + +type BusViolationRecordListRes struct { + Id int64 `dc:"主键ID" json:"id"` + ProjectId int64 `dc:"项目id" json:"projectId"` + LevelId int64 `dc:"违章等级主键ID" json:"levelId"` + Level string `dc:"违章等级" json:"level"` + TourType string `dc:"违章类型" json:"tourType"` + TourId int64 `dc:"违章详情(关联bus_tour)" json:"tourId"` + DataSource string `dc:"数据来源" json:"dataSource"` + SelectPeople string `dc:"选择人(后台用户ID)" json:"selectPeople"` + Openid string `dc:"处理人" json:"openid"` + Status string `dc:"工单状态(1通知 2整改 3复查)" json:"status"` + ProcessingPeriod string `dc:"处理期限(要求)" json:"processingPeriod"` + ProcessingPeriodPractical string `dc:"处理期限(实际)" json:"processingPeriodPractical"` + Measure string `dc:"整改措施" json:"measure"` + Review string `dc:"复查情况" json:"review"` + ReviewType string `dc:"复查状态(1通过 2未通过)" json:"reviewType"` + RectificationTime *gtime.Time `dc:"整改时间" json:"rectificationTime"` + ReviewTime *gtime.Time `dc:"复查时间" json:"reviewTime"` + CreateBy string `dc:"创建者" json:"createBy"` + UpdateBy string `dc:"更新者" json:"updateBy"` + CreatedAt *gtime.Time `dc:"创建时间" json:"createdAt"` + UpdatedAt *gtime.Time `dc:"更新时间" json:"updatedAt"` + DeletedAt *gtime.Time `dc:"删除时间" json:"deletedAt"` + Remark string `dc:"备注" json:"remark"` + ReviewName string `dc:"复查人" json:"reviewName"` + SxtName string `dc:"摄像头名称" json:"sxtName"` + + NickName string `json:"nickName" dc:"用户真实姓名"` + UserName string `json:"userName" dc:"微信用户姓名"` + PictureTwo string `json:"pictureTwo" dc:"违章的图片"` + RefuseList interface{} `json:"refuseList" dc:"拒绝数组结构体"` +} + +type AppWorkOrderPcListLogicRes struct { + ProjectId string `json:"projectId" dc:"项目ID" ` + ProjectName string `json:"projectName" dc:"项目名称" ` + Id int64 `json:"id" dc:"主键ID"` + Tt string `json:"tt" dc:"违章类型"` + Level string `json:"level" dc:"违章等级"` + Ds string `json:"ds" dc:"数据来源"` + Status string `json:"status" dc:"工单状态(1通知 2整改 3复查)"` + ReviewType string `json:"reviewType" dc:"复查状态(1通过 2未通过)"` + CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"` + Openid string `json:"openid" dc:"处理人"` + OpenidName string `json:"openidName" dc:"处理人名字"` + //UpdateBy string `json:"updateBy" dc:"复查人" ` + SelectPeople int64 `json:"selectPeople" dc:"复查人" ` + ReviewName string `json:"reviewName" dc:"复查人名称"` + SuperintendName []string `json:"superintendName" dc:"督察人名称(多个)"` + IsReview bool `json:"isReview" dc:"是否可以复查"` + CheckAttachment []*BusViolationRecordPathLogicRes `json:"checkAttachment" dc:"检查附件"` + RefuseList interface{} `json:"refuseList" dc:"拒绝数组结构体"` +} + +type AppWorkOrderParticularsLogicRes struct { + AppWorkOrderPcListLogicRes + SelectPeople string `json:"selectPeople" dc:"选择人(选择谁处理)(后台用户ID)" ` + SelectPeopleName string `json:"selectPeopleName" dc:"选择人名称" ` + ProcessingPeriod string `json:"processingPeriod" dc:"处理期限(要求)" ` + ProcessingPeriodPractical string `json:"processingPeriodPractical" dc:"处理期限(实际)" ` + Measure string `json:"measure" dc:"整改措施" ` + Review string `json:"review" dc:"复查情况" ` + RectificationTime *gtime.Time `json:"rectificationTime" dc:"整改时间" ` + ReviewTime *gtime.Time `json:"reviewTime" dc:"复查时间" ` + Remark string `json:"remark" dc:"备注" ` + CheckAttachment []*BusViolationRecordPathLogicRes `json:"checkAttachment" dc:"检查附件"` + AbarbeitungAttachment []*BusViolationRecordPathLogicRes `json:"abarbeitungAttachment" dc:"整改附件"` +} + +// BusViolationRecordPathLogicRes 工单附件表 +type BusViolationRecordPathLogicRes struct { + gmeta.Meta `orm:"table:bus_violation_record_path"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + TicketId int64 `orm:"ticket_id" json:"ticketId"` // 质量工单主键ID(级联删除) + Type string `orm:"type" json:"type"` // 类型(1通知 2整改) + Name string `orm:"name" json:"name"` // 文件名称 + Path string `orm:"path" json:"path"` // 文件路径 + FileType string `orm:"file_type" json:"fileType"` // 文件类型(后缀) +} + +// RefuseToAddRes 拒绝状态新增数据 +type RefuseToAddRes struct { + gmeta.Meta `orm:"table:bus_violation_record"` + Pid int64 `orm:"pid" json:"pid"` // 上级id + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + LevelId int64 `orm:"level_id" json:"levelId"` // 违章等级主键ID + Level string `orm:"level" json:"level"` // 违章等级 + TourType string `orm:"tour_type" json:"tourType"` // 违章类型 + TourId int64 `orm:"tour_id" json:"tourId"` // 违章详情(关联bus_tour)Level string `orm:"level" json:"level"` // 违章等级 + DataSource string `orm:"data_source" json:"dataSource"` // 数据来源 + SelectPeople int64 `orm:"select_people" json:"selectPeople"` // 选择人(后台用户ID) + Openid string `orm:"openid" json:"openid"` // 处理人 + Status string `orm:"status" json:"status" dc:"工单状态(1通知 2整改 3复查)"` + ProcessingPeriod string `orm:"processing_period" json:"processingPeriod"` // 处理期限(要求) + ProcessingPeriodPractical string `orm:"processing_period_practical" json:"processingPeriodPractical"` // 处理期限(实际) + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + Remark string `orm:"remark" json:"remark"` // 备注 + SxtName string `orm:"sxt_name" json:"sxtName"` // 备注 +} diff --git a/internal/app/system/model/bus_weekly_security_report.go b/internal/app/system/model/bus_weekly_security_report.go new file mode 100644 index 0000000..cf8eac3 --- /dev/null +++ b/internal/app/system/model/bus_weekly_security_report.go @@ -0,0 +1,45 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-04-02 18:03:23 +// 生成路径: internal/app/system/model/bus_weekly_security_report.go +// 生成人:gfast +// desc:安全周期 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusWeeklySecurityReportInfoRes is the golang structure for table bus_weekly_security_report. +type BusWeeklySecurityReportInfoRes struct { + gmeta.Meta `orm:"table:bus_weekly_security_report"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目ID + ProjectName string `orm:"project_name" json:"projectName"` // 项目名称 + Week string `orm:"week" json:"week"` // 周期 + Scope string `orm:"scope" json:"scope"` // 周期范围 + ScopeEnd string `orm:"scope_end" json:"scopeEnd"` // 周期范围结束 + Path string `orm:"path" json:"path"` // 文件位置 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type BusWeeklySecurityReportListRes struct { + Id int64 `json:"id"` + ProjectId int64 `json:"projectId"` + ProjectName string `json:"projectName"` + Week string `json:"week"` + Scope string `json:"scope"` + ScopeEnd string `json:"scopeEnd"` + Path string `json:"path"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/comment_list.go b/internal/app/system/model/comment_list.go new file mode 100644 index 0000000..35f6bbb --- /dev/null +++ b/internal/app/system/model/comment_list.go @@ -0,0 +1,52 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-05-14 10:21:06 +// 生成路径: internal/app/system/model/comment_list.go +// 生成人:gfast +// desc:App消息-评论 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// CommentListInfoRes is the golang structure for table comment_list. +type CommentListInfoRes struct { + gmeta.Meta `orm:"table:comment_list"` + Id uint `orm:"id,primary" json:"id"` // + ProjectId int `orm:"project_id" json:"projectId"` // 项目ID + Receiver int `orm:"receiver" json:"receiver"` // 消息接收者 + Content string `orm:"content" json:"content"` // 评论内容 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + Sender int `orm:"sender" json:"sender"` // 消息的发起人 +} + +type CommentListListRes struct { + Id uint `json:"id"` + ProjectId int `json:"projectId"` + Receiver int `json:"receiver"` + Content string `json:"content"` + CreatedAt *gtime.Time `json:"createdAt"` + Sender int `json:"sender"` +} + +type CommentInfo struct { + // 自增ID + Id int `orm:"id"` + // 用户名 + UserNickName string `orm:"user_nickname"` + // 项目名 + ProjectName string `orm:"project_name"` + // 评论内容 + Content string `orm:"content"` + // 评论时间 + CreatedAt string `orm:"created_at"` +} + +func (m *CommentInfo) Title() string { + return m.UserNickName + "评论了你上传的形象进度" +} diff --git a/internal/app/system/model/comments.go b/internal/app/system/model/comments.go new file mode 100644 index 0000000..24f0d74 --- /dev/null +++ b/internal/app/system/model/comments.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-04-23 14:47:24 +// 生成路径: internal/app/system/model/comments.go +// 生成人:gfast +// desc:App通知公告评论 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// CommentsInfoRes is the golang structure for table comments. +type CommentsInfoRes struct { + gmeta.Meta `orm:"table:comments"` + Id uint `orm:"id,primary" json:"id"` // 主键 + NotificationId int `orm:"notification_id" json:"notificationId"` // 关联的通知ID + CommentText string `orm:"comment_text" json:"commentText"` // 评论内容 + CommentId string `orm:"comment_id" json:"commentId"` // 用户ID + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // +} + +type CommentsListRes struct { + Id uint `json:"id"` + CommentId string `json:"comment_id" dc:"用户的ID"` + Name string `json:"name" orm:"user_nickname" dc:"用户名"` + CommentText string `json:"comment_text" dc:"评论内容"` + CreatedAt *gtime.Time `json:"createdAt" dc:"评论时间"` +} diff --git a/internal/app/system/model/construction_details.go b/internal/app/system/model/construction_details.go new file mode 100644 index 0000000..8956d38 --- /dev/null +++ b/internal/app/system/model/construction_details.go @@ -0,0 +1,54 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-03-13 18:10:56 +// 生成路径: internal/app/system/model/construction_details.go +// 生成人:gfast +// desc:施工类别详情 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ConstructionDetailsInfoRes is the golang structure for table construction_details. +type ConstructionDetailsInfoRes struct { + gmeta.Meta `orm:"table:construction_details"` + Id uint64 `orm:"id,primary" json:"id"` // + CreatedBy uint64 `orm:"created_by" json:"createdBy"` // + UpdatedBy uint64 `orm:"updated_by" json:"updatedBy"` // + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // + Name string `orm:"name" json:"name"` // 施工名称 + Types string `orm:"types" json:"types"` // 施工类别 + Total int `orm:"total" json:"total"` // 总量 + ConstructionId int `orm:"construction_id" json:"constructionId"` // 施工id(父级id) + Remark string `orm:"remark" json:"remark"` // 备注 + IsPercentage int `orm:"isPercentage" json:"isPercentage"` // 数据类型是否为百分比 + StartTime *gtime.Time `orm:"start_time" json:"startTime"` // 开始时间 + EndTime *gtime.Time `orm:"end_time" json:"endTime"` // 结束时间 + Completed int `orm:"completed" json:"completed"` // 完成量 + Selectable int `orm:"selectable" json:"selectable"` // 可选择余量 + Overall int `orm:"overall" json:"overall"` // 总余量 +} + +type ConstructionDetailsListRes struct { + Id uint64 `json:"id"` + CreatedBy uint64 `json:"createdBy"` + CreatedAt *gtime.Time `json:"createdAt"` + Name string `json:"name"` + Types string `json:"types"` + Total int `json:"total"` + ConstructionId int `json:"constructionId"` + Remark string `json:"remark"` + IsPercentage int `json:"isPercentage"` + StartTime *gtime.Time `json:"startTime"` + EndTime *gtime.Time `json:"endTime"` + Completed int `json:"completed"` + Selectable int `json:"selectable"` + Overall int `json:"overall"` +} diff --git a/internal/app/system/model/construction_project.go b/internal/app/system/model/construction_project.go new file mode 100644 index 0000000..3cd6081 --- /dev/null +++ b/internal/app/system/model/construction_project.go @@ -0,0 +1,46 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-03-13 17:36:45 +// 生成路径: internal/app/system/model/construction_project.go +// 生成人:gfast +// desc:施工项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ConstructionProjectInfoRes is the golang structure for table construction_project. +type ConstructionProjectInfoRes struct { + gmeta.Meta `orm:"table:construction_project"` + ConstructionId uint64 `orm:"construction_id,primary" json:"constructionId"` // 主键id + CreatedBy uint64 `orm:"created_by" json:"createdBy"` // + UpdatedBy uint64 `orm:"updated_by" json:"updatedBy"` // + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // + FangzhenId int `orm:"fangzhen_id" json:"fangzhenId"` // 方阵id + ConstructionName string `orm:"construction_name" json:"constructionName"` // 施工名称 + Total int `orm:"total" json:"total"` // 总量 + Remark string `orm:"remark" json:"remark"` // 备注 + IsPercentage int `orm:"isPercentage" json:"isPercentage"` // 数据类型是否为百分比 + EndTime *gtime.Time `orm:"end_time" json:"endTime"` // 结束时间 + StartTime *gtime.Time `orm:"start_time" json:"startTime"` // 开始时间 +} + +type ConstructionProjectListRes struct { + ConstructionId uint64 `json:"constructionId"` + CreatedBy uint64 `json:"createdBy"` + CreatedAt *gtime.Time `json:"createdAt"` + FangzhenId int `json:"fangzhenId"` + ConstructionName string `json:"constructionName"` + Total int `json:"total"` + Remark string `json:"remark"` + IsPercentage int `json:"isPercentage"` + EndTime *gtime.Time `json:"endTime"` + StartTime *gtime.Time `json:"startTime"` +} diff --git a/internal/app/system/model/context.go b/internal/app/system/model/context.go new file mode 100644 index 0000000..6007206 --- /dev/null +++ b/internal/app/system/model/context.go @@ -0,0 +1,16 @@ +/* +* @desc:context-model +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/16 14:45 + */ + +package model + +type Context struct { + User *ContextUser // User in context. +} + +type ContextUser struct { + *LoginUserRes +} diff --git a/internal/app/system/model/device.go b/internal/app/system/model/device.go new file mode 100644 index 0000000..66d86f1 --- /dev/null +++ b/internal/app/system/model/device.go @@ -0,0 +1,75 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-11-24 09:57:07 +// 生成路径: internal/app/system/model/device.go +// 生成人:gfast +// desc:安全帽设备(java) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// DeviceInfoRes is the golang structure for table device. +type DeviceInfoRes struct { + gmeta.Meta `orm:"table:device"` + DevNum string `orm:"devNum,primary" json:"devNum"` // 设备编号 + DevName string `orm:"devName" json:"devName"` // 设备名称 + Status int `orm:"status" json:"status" dc:"状态(0下线 1上线)` // 状态 + CreateTime *gtime.Time `orm:"createTime" json:"createTime"` // 添加时间 + UpdateTime *gtime.Time `orm:"updateTime" json:"updateTime"` // 修改时间 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目ID + BatteryLevel float64 `orm:"battery_level" json:"batteryLevel"` // 项目ID + IsLowBattery int `orm:"is_low_battery" json:"isLowBattery" ` //dc:"是否处于低电量,1代表低电量,0则不是低电量" + BatteryOn string `orm:"battery_on" json:"batteryOn" ` //开机时间 + BatteryOff string `orm:"battery_off" json:"batteryOff" ` //关机时间 + HeadIcon string `orm:"head_icon" json:"headIcon" dc:"头像"` + NickName string `orm:"nick_name" json:"nickName" dc:"昵称"` + UserName string `orm:"user_name" json:"userName" dc:"真实姓名"` + Phone string `orm:"phone" json:"phone" dc:"联系电话"` + Openid string `orm:"openid" json:"openid" dc:"openid"` + ProjectName string `orm:"project_name" json:"projectName" dc:"项目名称"` +} + +type DeviceListRes struct { + DevNum string `json:"devNum"` + DevName string `json:"devName"` + Status int `json:"status" dc:"状态(0下线 1上线)""` + CreateTime *gtime.Time `json:"createTime"` + UpdateTime *gtime.Time `json:"updateTime"` + ProjectId int64 `json:"projectId"` + HeadIcon string `json:"headIcon" dc:"头像"` + NickName string `json:"nickName" dc:"昵称"` + UserName string `json:"userName" dc:"真实姓名"` + Phone string `json:"phone" dc:"联系电话"` + Openid string `json:"openid" dc:"openid"` + ProjectName string `json:"projectName" dc:"项目名称"` + BatteryLevel float64 `json:"batteryLevel" dc:"电量"` + IsLowBattery int `json:"isLowBattery" dc:"是否处于低电量,1代表低电量,0则不是低电量"` + BatteryOn string `json:"batteryOn" dc:"电池开关时间"` + BatteryOff string `json:"batteryOff" dc:"电池关机时间"` +} + +//type DeviceDataRes struct { +// gmeta.Meta `orm:"table:device"` +// DevNum string `json:"devNum" dc:"设备标识"` +// DevName string `json:"devName" dc:"设备名称"` +// Status int `json:"status" dc:"状态(0下线 1上线)"` +// CreateTime *gtime.Time `json:"createTime" dc:"创建时间"` +// UpdateTime *gtime.Time `json:"updateTime" dc:"更新时间"` +// UserDetail *UserDetail `orm:"with:devNum=dev_num" dc:"用户信息"` +//} +// +//// UserDetail 用户信息 +//type UserDetail struct { +// gmeta.Meta `orm:"table:bus_construction_user"` +// HeadIcon int `json:"headIcon" dc:"头像"` +// NickName int `json:"nickName" dc:"昵称"` +// UserName int `json:"userName" dc:"真实姓名"` +// Phone string `json:"phone" dc:"联系电话"` +// DevNum string `json:"devNum" dc:"设备标识"` +//} diff --git a/internal/app/system/model/device_preset.go b/internal/app/system/model/device_preset.go new file mode 100644 index 0000000..5d90691 --- /dev/null +++ b/internal/app/system/model/device_preset.go @@ -0,0 +1,35 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-03-01 12:50:08 +// 生成路径: internal/app/system/model/device_preset.go +// 生成人:gfast +// desc:预置位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// DevicePresetInfoRes is the golang structure for table device_preset. +type DevicePresetInfoRes struct { + gmeta.Meta `orm:"table:device_preset"` + Id uint `orm:"id,primary" json:"id"` // 主键ID + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + DeviceSerial string `orm:"deviceSerial" json:"deviceSerial"` // 设备序列号 + ChannelNo string `orm:"channelNo" json:"channelNo"` // 通道号 + Index int `orm:"index" json:"index"` // 预置点序号 + Name string `orm:"name" json:"name"` // 预置点名称 +} + +type DevicePresetListRes struct { + Id uint `json:"id"` + CreatedAt *gtime.Time `json:"createdAt"` + DeviceSerial string `json:"deviceSerial"` + ChannelNo string `json:"channelNo"` + Index int `json:"index"` + Name string `json:"name"` +} diff --git a/internal/app/system/model/do/app_menus.go b/internal/app/system/model/do/app_menus.go new file mode 100644 index 0000000..ad8c9cf --- /dev/null +++ b/internal/app/system/model/do/app_menus.go @@ -0,0 +1,18 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// AppMenus is the golang structure of table app_menus for DAO operations like Where/Data. +type AppMenus struct { + g.Meta `orm:"table:app_menus, do:true"` + MenuId interface{} // + MenuName interface{} // 菜单名 + CreatedAt *gtime.Time // +} diff --git a/internal/app/system/model/do/app_role_menus.go b/internal/app/system/model/do/app_role_menus.go new file mode 100644 index 0000000..e88d726 --- /dev/null +++ b/internal/app/system/model/do/app_role_menus.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-05-28 15:11:15 +// 生成路径: internal/app/system/model/entity/app_role_menus.go +// 生成人:gfast +// desc:app角色绑定菜单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// AppRoleMenus is the golang structure for table app_role_menus. +type AppRoleMenus struct { + gmeta.Meta `orm:"table:app_role_menus, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // + RoleId interface{} `orm:"role_id" json:"roleId"` // 角色ID + MenuId interface{} `orm:"menu_id" json:"menuId"` // 菜单ID + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // +} diff --git a/internal/app/system/model/do/app_roles.go b/internal/app/system/model/do/app_roles.go new file mode 100644 index 0000000..08271ec --- /dev/null +++ b/internal/app/system/model/do/app_roles.go @@ -0,0 +1,19 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// AppRoles is the golang structure of table app_roles for DAO operations like Where/Data. +type AppRoles struct { + g.Meta `orm:"table:app_roles, do:true"` + RoleId interface{} // + RoleName interface{} // 角色名 + CreatedAt *gtime.Time // + Tag interface{} // 0 管理员 | 1 施工人员 +} diff --git a/internal/app/system/model/do/app_user_disable_menus.go b/internal/app/system/model/do/app_user_disable_menus.go new file mode 100644 index 0000000..07afadc --- /dev/null +++ b/internal/app/system/model/do/app_user_disable_menus.go @@ -0,0 +1,19 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// AppUserDisableMenus is the golang structure of table app_user_disable_menus for DAO operations like Where/Data. +type AppUserDisableMenus struct { + g.Meta `orm:"table:app_user_disable_menus, do:true"` + UserDisabledMenuId interface{} // + UserId interface{} // 用户ID + MenuId interface{} // 菜单ID + CreatedAt *gtime.Time // +} diff --git a/internal/app/system/model/do/app_user_menus.go b/internal/app/system/model/do/app_user_menus.go new file mode 100644 index 0000000..0b246d3 --- /dev/null +++ b/internal/app/system/model/do/app_user_menus.go @@ -0,0 +1,19 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// AppUserMenus is the golang structure of table app_user_menus for DAO operations like Where/Data. +type AppUserMenus struct { + g.Meta `orm:"table:app_user_menus, do:true"` + UserMenuId interface{} // + UserId interface{} // 用户ID + MenuId interface{} // 菜单ID + CreatedAt *gtime.Time // +} diff --git a/internal/app/system/model/do/app_user_roles.go b/internal/app/system/model/do/app_user_roles.go new file mode 100644 index 0000000..f9db7fa --- /dev/null +++ b/internal/app/system/model/do/app_user_roles.go @@ -0,0 +1,20 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// AppUserRoles is the golang structure of table app_user_roles for DAO operations like Where/Data. +type AppUserRoles struct { + g.Meta `orm:"table:app_user_roles, do:true"` + Id interface{} // + UserId interface{} // 用户ID + RoleId interface{} // 关联的角色ID + CreatedAt *gtime.Time // + MajorRole interface{} // 0 后台管理人员 | 1 施工人员 +} diff --git a/internal/app/system/model/do/app_versions.go b/internal/app/system/model/do/app_versions.go new file mode 100644 index 0000000..5aebced --- /dev/null +++ b/internal/app/system/model/do/app_versions.go @@ -0,0 +1,20 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// AppVersions is the golang structure of table app_versions for DAO operations like Where/Data. +type AppVersions struct { + g.Meta `orm:"table:app_versions, do:true"` + Id interface{} // + Version interface{} // 版本号 + FilePath interface{} // 版本文件的路径 + CreatedAt *gtime.Time // + Platform interface{} // 0 安卓 | 1 IOS +} diff --git a/internal/app/system/model/do/big_file.go b/internal/app/system/model/do/big_file.go new file mode 100644 index 0000000..04a85d4 --- /dev/null +++ b/internal/app/system/model/do/big_file.go @@ -0,0 +1,29 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// BigFile is the golang structure of table big_file for DAO operations like Where/Data. +type BigFile struct { + g.Meta `orm:"table:big_file, do:true"` + Id interface{} // + Name interface{} // 文件名称 + Size interface{} // 文件大小 + Path interface{} // 文件相对路径 + FullPath interface{} // 文件绝对路径 + MimeType interface{} // 文件类型 + Source interface{} // 文件来源 0 - 本地,1 - 腾讯云 2 - 七牛云 + Describe interface{} // 描述 + Md5 interface{} // md5 + CreatedBy interface{} // + UpdatedBy interface{} // + CreatedAt *gtime.Time // + UpdatedAt *gtime.Time // + DeletedAt *gtime.Time // +} diff --git a/internal/app/system/model/do/bus_attendance_machine.go b/internal/app/system/model/do/bus_attendance_machine.go new file mode 100644 index 0000000..8553c4a --- /dev/null +++ b/internal/app/system/model/do/bus_attendance_machine.go @@ -0,0 +1,28 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2025-03-03 10:32:47 +// 生成路径: internal/app/system/model/entity/bus_attendance_machine.go +// 生成人:gfast +// desc:考勤机 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusAttendanceMachine is the golang structure for table bus_attendance_machine. +type BusAttendanceMachine struct { + gmeta.Meta `orm:"table:bus_attendance_machine, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目ID + Sn interface{} `orm:"sn" json:"sn"` // 设备sn + Status interface{} `orm:"status" json:"status"` // 设备sn + Teams interface{} `orm:"teams" json:"teams"` // 班组id,多个逗号分隔 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + Remark interface{} `orm:"remark" json:"remark"` // 备注 +} diff --git a/internal/app/system/model/do/bus_attendance_machine_user.go b/internal/app/system/model/do/bus_attendance_machine_user.go new file mode 100644 index 0000000..a6b709c --- /dev/null +++ b/internal/app/system/model/do/bus_attendance_machine_user.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2025-03-03 10:33:17 +// 生成路径: internal/app/system/model/entity/bus_attendance_machine_user.go +// 生成人:gfast +// desc:考勤机用户列 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusAttendanceMachineUser is the golang structure for table bus_attendance_machine_user. +type BusAttendanceMachineUser struct { + gmeta.Meta `orm:"table:bus_attendance_machine_user, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + MachineId interface{} `orm:"machine_id" json:"machineId"` // 考勤机主键ID + TeamId interface{} `orm:"team_id" json:"teamId"` // 班组ID + UserId interface{} `orm:"user_id" json:"userId"` // 用户ID + Identifying interface{} `orm:"identifying" json:"identifying"` // 标识(是否下发) +} diff --git a/internal/app/system/model/do/bus_camera_channel.go b/internal/app/system/model/do/bus_camera_channel.go new file mode 100644 index 0000000..1ee563f --- /dev/null +++ b/internal/app/system/model/do/bus_camera_channel.go @@ -0,0 +1,41 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-20 14:55:42 +// 生成路径: internal/app/system/model/entity/bus_camera_channel.go +// 生成人:gfast +// desc:摄像头(国标通道) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusCameraChannel is the golang structure for table bus_camera_channel. +type BusCameraChannel struct { + gmeta.Meta `orm:"table:bus_camera_channel, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + CountryId interface{} `orm:"country_id" json:"countryId"` // 摄像头ID + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目ID + ChannelNumber interface{} `orm:"channel_number" json:"channelNumber"` // 国标通道号 + ChannelName interface{} `orm:"channel_name" json:"channelName"` // 通道名称 + ChannelPath interface{} `orm:"channel_path" json:"channelPath"` // 视频路径 flv + ChannelPathWs interface{} `orm:"channel_path_ws" json:"channelPathWs"` // 视频路径 ws + ChannelPathRtc interface{} `orm:"channel_path_rtc" json:"channelPathRtc"` // 视频路径 rtc + ChannelPathHls interface{} `orm:"channel_path_hls" json:"channelPathHls"` // 视频路径 hls + ChannelFormat interface{} `orm:"channel_format" json:"channelFormat"` // 视频格式(字典) + ChannelState interface{} `orm:"channel_state" json:"channelState"` // 在线状态(字典) + Remark interface{} `orm:"remark" json:"remark"` // 备注 + Detail interface{} `orm:"detail" json:"detail"` // 坐标 + Imei interface{} `orm:"imei,primary" json:"imei"` // 识别码 + Iccid interface{} `orm:"iccid,primary" json:"iccid"` // 序列号 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + SourceType interface{} `orm:"source_type" json:"sourceType"` // 资源类型 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_camera_chinese_standard.go b/internal/app/system/model/do/bus_camera_chinese_standard.go new file mode 100644 index 0000000..177a60e --- /dev/null +++ b/internal/app/system/model/do/bus_camera_chinese_standard.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-20 14:55:24 +// 生成路径: internal/app/system/model/entity/bus_camera_chinese_standard.go +// 生成人:gfast +// desc:摄像头(国标) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusCameraChineseStandard is the golang structure for table bus_camera_chinese_standard. +type BusCameraChineseStandard struct { + gmeta.Meta `orm:"table:bus_camera_chinese_standard, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目ID + CountryNumber interface{} `orm:"country_number" json:"countryNumber"` // 国标号 + CountryName interface{} `orm:"country_name" json:"countryName"` // 摄像头名称 + CountryState interface{} `orm:"country_state" json:"countryState"` // 在线状态(字典) + Remark interface{} `orm:"remark" json:"remark"` // 备注 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_category.go b/internal/app/system/model/do/bus_category.go new file mode 100644 index 0000000..1159bd1 --- /dev/null +++ b/internal/app/system/model/do/bus_category.go @@ -0,0 +1,21 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-10-07 15:52:19 +// 生成路径: internal/app/system/model/entity/bus_category.go +// 生成人:gfast +// desc:题库_题库类别 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusCategory is the golang structure for table bus_category. +type BusCategory struct { + gmeta.Meta `orm:"table:bus_category, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + CategoryName interface{} `orm:"category_name" json:"categoryName"` // 题库类别 +} diff --git a/internal/app/system/model/do/bus_company.go b/internal/app/system/model/do/bus_company.go new file mode 100644 index 0000000..070fe5d --- /dev/null +++ b/internal/app/system/model/do/bus_company.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-28 14:08:14 +// 生成路径: internal/app/system/model/entity/bus_company.go +// 生成人:gfast +// desc:公司 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusCompany is the golang structure for table bus_company. +type BusCompany struct { + gmeta.Meta `orm:"table:bus_company, do:true"` + CompanyId interface{} `orm:"company_id,primary" json:"companyId"` // 序号 + CompanyName interface{} `orm:"company_name" json:"companyName"` // 公司名称 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + Status interface{} `orm:"status" json:"status"` // 帐号状态 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_complaint_box.go b/internal/app/system/model/do/bus_complaint_box.go new file mode 100644 index 0000000..ef2961e --- /dev/null +++ b/internal/app/system/model/do/bus_complaint_box.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-12-04 18:09:50 +// 生成路径: internal/app/system/model/entity/bus_complaint_box.go +// 生成人:gfast +// desc:意见箱 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusComplaintBox is the golang structure for table bus_complaint_box. +type BusComplaintBox struct { + gmeta.Meta `orm:"table:bus_complaint_box, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + Openid interface{} `orm:"openid" json:"openid"` // openid + Opinion interface{} `orm:"opinion" json:"opinion"` // 意见 + Status interface{} `orm:"status" json:"status"` // 状态(0未读,1已读) + Dispose *gtime.Time `orm:"dispose" json:"dispose"` // 处理时间 + Remark interface{} `orm:"remark" json:"remark"` // 备注 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 +} diff --git a/internal/app/system/model/do/bus_construction_blacklist.go b/internal/app/system/model/do/bus_construction_blacklist.go new file mode 100644 index 0000000..33726ca --- /dev/null +++ b/internal/app/system/model/do/bus_construction_blacklist.go @@ -0,0 +1,26 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-11-10 14:08:39 +// 生成路径: internal/app/system/model/entity/bus_construction_blacklist.go +// 生成人:gfast +// desc:黑名单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionBlacklist is the golang structure for table bus_construction_blacklist. +type BusConstructionBlacklist struct { + gmeta.Meta `orm:"table:bus_construction_blacklist, do:true"` + Openid interface{} `orm:"openid,primary" json:"openid"` // openid + Name interface{} `orm:"name" json:"name"` // 名字 + SfzNumber interface{} `orm:"sfz_number" json:"sfzNumber"` // 身份证号码 + Remark interface{} `orm:"remark" json:"remark"` // 备注 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 +} diff --git a/internal/app/system/model/do/bus_construction_log.go b/internal/app/system/model/do/bus_construction_log.go new file mode 100644 index 0000000..826691e --- /dev/null +++ b/internal/app/system/model/do/bus_construction_log.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-22 16:27:43 +// 生成路径: internal/app/system/model/entity/bus_construction_log.go +// 生成人:gfast +// desc:施工日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionLog is the golang structure for table bus_construction_log. +type BusConstructionLog struct { + gmeta.Meta `orm:"table:bus_construction_log, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目ID + DateOfOccurrence interface{} `orm:"date_of_occurrence" json:"dateOfOccurrence"` // 发生日期 + Condition interface{} `orm:"condition" json:"condition"` // 生产情况 + TechnologyQuality interface{} `orm:"technology_quality" json:"technologyQuality"` // 技术质量安全工作 + Remark interface{} `orm:"remark" json:"remark"` // 备注 + Path interface{} `orm:"path" json:"path"` // 附件(多个逗号分割) + CreatedBy interface{} `orm:"created_by" json:"createdBy"` // 创建人 + UpdatedBy interface{} `orm:"updated_by" json:"updatedBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_construction_project.go b/internal/app/system/model/do/bus_construction_project.go new file mode 100644 index 0000000..1e3908b --- /dev/null +++ b/internal/app/system/model/do/bus_construction_project.go @@ -0,0 +1,22 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-07 10:17:50 +// 生成路径: internal/app/system/model/entity/bus_construction_project.go +// 生成人:gfast +// desc:施工人员对应项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionProject is the golang structure for table bus_construction_project. +type BusConstructionProject struct { + gmeta.Meta `orm:"table:bus_construction_project, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + ConstructionUserId interface{} `orm:"construction_user_id" json:"constructionUserId"` // 微信用户id + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id +} diff --git a/internal/app/system/model/do/bus_construction_user.go b/internal/app/system/model/do/bus_construction_user.go new file mode 100644 index 0000000..086ee51 --- /dev/null +++ b/internal/app/system/model/do/bus_construction_user.go @@ -0,0 +1,53 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// BusConstructionUser is the golang structure of table bus_construction_user for DAO operations like Where/Data. +type BusConstructionUser struct { + g.Meta `orm:"table:bus_construction_user, do:true"` + Id interface{} // + Openid interface{} // 微信id + NickName interface{} // 微信名称 + TeamId interface{} // 班组id + HeadIcon interface{} // 登陆照片 + PacePhoto interface{} // 人脸照 + UserName interface{} // 人员姓名 + ProjectId interface{} // 项目id + Status interface{} // 状态(0在职 1离职)-字典position_status + IsPinch interface{} // 是否代打 + IfManagement interface{} // 是否班组管理 + CreateBy interface{} // 创建者 + UpdateBy interface{} // 更新者 + CreatedAt *gtime.Time // 创建时间 + UpdatedAt *gtime.Time // 更新时间 + DeletedAt *gtime.Time // 删除时间 + Phone interface{} // 电话 + Sex interface{} // 1:男,2女,3保密 + SfzNation interface{} // 身份证民族 + SfzNumber interface{} // 身份证号码 + SfzStart interface{} // 身份证有效开始期 + SfzEnd interface{} // 身份证有效结束期 + SfzSite interface{} // 身份证地址 + SfzBirth interface{} // 身份证出生日期 + NativePlace interface{} // 籍贯 + YhkNumber interface{} // 银行卡号 + YhkOpeningBank interface{} // 开户行 + YhkCardholder interface{} // 持卡人 + TypeOfWork interface{} // 工种(字典) + Clock interface{} // 打卡(1启用打卡 2禁止打卡) + LabourserviceId interface{} // 劳务公司id + EntryDate interface{} // 入场时间 + LeaveDate interface{} // 离场时间 + Salary interface{} // 薪水(此字段为0表示此字段无效) + ProjectRecord interface{} // 是否开启项目备案(小程序)1开启 2不开启 + WxOrPc interface{} // 哪添加的(1表示pc 2表示小程序) + Subscription interface{} // 消息订阅状态(1订阅 2无订阅) + DevNum interface{} // 安全帽设备标识 +} diff --git a/internal/app/system/model/do/bus_construction_user_file.go b/internal/app/system/model/do/bus_construction_user_file.go new file mode 100644 index 0000000..5499296 --- /dev/null +++ b/internal/app/system/model/do/bus_construction_user_file.go @@ -0,0 +1,30 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-07 10:17:41 +// 生成路径: internal/app/system/model/entity/bus_construction_user_file.go +// 生成人:gfast +// desc:微信用户的文件存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionUserFile is the golang structure for table bus_construction_user_file. +type BusConstructionUserFile struct { + gmeta.Meta `orm:"table:bus_construction_user_file, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + UserId interface{} `orm:"user_id" json:"userId"` // 用户id + UserImgType interface{} `orm:"user_img_type" json:"userImgType"` // 图片类型 + Path interface{} `orm:"path" json:"path"` // 图片路径 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Remark interface{} `orm:"remark" json:"remark"` // 备注 +} diff --git a/internal/app/system/model/do/bus_construction_user_post.go b/internal/app/system/model/do/bus_construction_user_post.go new file mode 100644 index 0000000..5a6edf5 --- /dev/null +++ b/internal/app/system/model/do/bus_construction_user_post.go @@ -0,0 +1,22 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-07 10:06:34 +// 生成路径: internal/app/system/model/entity/bus_construction_user_post.go +// 生成人:gfast +// desc:施工人员岗位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionUserPost is the golang structure for table bus_construction_user_post. +type BusConstructionUserPost struct { + gmeta.Meta `orm:"table:bus_construction_user_post, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // + ConstructionUserId interface{} `orm:"construction_user_id" json:"constructionUserId"` // 施工人员id + PostId interface{} `orm:"post_id" json:"postId"` // 岗位id +} diff --git a/internal/app/system/model/do/bus_corporate_events.go b/internal/app/system/model/do/bus_corporate_events.go new file mode 100644 index 0000000..dc4d0c8 --- /dev/null +++ b/internal/app/system/model/do/bus_corporate_events.go @@ -0,0 +1,28 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-20 16:49:36 +// 生成路径: internal/app/system/model/entity/bus_corporate_events.go +// 生成人:gfast +// desc:企业大事记 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusCorporateEvents is the golang structure for table bus_corporate_events. +type BusCorporateEvents struct { + gmeta.Meta `orm:"table:bus_corporate_events, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + Headline interface{} `orm:"headline" json:"headline"` // 标题 + Content interface{} `orm:"content" json:"content"` // 内容 + CreatedBy interface{} `orm:"created_by" json:"createdBy"` // 创建人 + UpdatedBy interface{} `orm:"updated_by" json:"updatedBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_design_audit.go b/internal/app/system/model/do/bus_design_audit.go new file mode 100644 index 0000000..1847a5f --- /dev/null +++ b/internal/app/system/model/do/bus_design_audit.go @@ -0,0 +1,30 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-04-09 15:40:16 +// 生成路径: internal/app/system/model/entity/bus_design_audit.go +// 生成人:gfast +// desc:设计审核(竣工、施工、可研) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusDesignAudit is the golang structure for table bus_design_audit. +type BusDesignAudit struct { + gmeta.Meta `orm:"table:bus_design_audit, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目ID + TableName interface{} `orm:"table_name" json:"tableName"` // 表名 + TableId interface{} `orm:"table_id" json:"tableId"` // 表ID + Status interface{} `orm:"status" json:"status"` // 审核状态(1未读 2拒绝 3通过) + Cause interface{} `orm:"cause" json:"cause"` // 拒绝原因 + Auditor interface{} `orm:"auditor" json:"auditor"` // 审核人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_design_document.go b/internal/app/system/model/do/bus_design_document.go new file mode 100644 index 0000000..a5990f5 --- /dev/null +++ b/internal/app/system/model/do/bus_design_document.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-29 16:31:29 +// 生成路径: internal/app/system/model/entity/bus_design_document.go +// 生成人:gfast +// desc:设计管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusDesignDocument is the golang structure for table bus_design_document. +type BusDesignDocument struct { + gmeta.Meta `orm:"table:bus_design_document, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + DocumenName interface{} `orm:"documen_name" json:"documenName"` // 文档名称 + Remark interface{} `orm:"remark" json:"remark"` // 备注 + DocumentUrl interface{} `orm:"document_url" json:"documentUrl"` // 文件路径 + FileId interface{} `orm:"file_id" json:"fileId"` // 文件夹id + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + Status interface{} `orm:"status" json:"status"` // 状态 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 上传时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_design_period_range.go b/internal/app/system/model/do/bus_design_period_range.go new file mode 100644 index 0000000..5d6ab2b --- /dev/null +++ b/internal/app/system/model/do/bus_design_period_range.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-04-11 17:28:54 +// 生成路径: internal/app/system/model/entity/bus_design_period_range.go +// 生成人:gfast +// desc:设计-周期范围 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusDesignPeriodRange is the golang structure for table bus_design_period_range. +type BusDesignPeriodRange struct { + gmeta.Meta `orm:"table:bus_design_period_range, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + TableType interface{} `orm:"table_type" json:"tableType"` // 记录类型(1竣工 2施工 3可研) + FileName interface{} `orm:"file_name" json:"fileName"` // 文件名称 + FilePath interface{} `orm:"file_path" json:"filePath"` // 文件路径 + IsEntering interface{} `orm:"is_entering" json:"isEntering"` // 路径内容是否存在(1否 2是) + StartTime interface{} `orm:"start_time" json:"startTime"` // 起始时间 + EndTime interface{} `orm:"end_time" json:"endTime"` // 结束时间 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 录入者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_engineering_quality.go b/internal/app/system/model/do/bus_engineering_quality.go new file mode 100644 index 0000000..0c2de45 --- /dev/null +++ b/internal/app/system/model/do/bus_engineering_quality.go @@ -0,0 +1,36 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-29 09:31:22 +// 生成路径: internal/app/system/model/entity/bus_engineering_quality.go +// 生成人:gfast +// desc:工程质量列 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusEngineeringQuality is the golang structure for table bus_engineering_quality. +type BusEngineeringQuality struct { + gmeta.Meta `orm:"table:bus_engineering_quality, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + UnitName1 interface{} `orm:"unit_name1" json:"unitName1"` // 单位工程 + UnitName2 interface{} `orm:"unit_name2" json:"unitName2"` // 子单位工程 + UnitName3 interface{} `orm:"unit_name3" json:"unitName3"` // 分部工程 + UnitName4 interface{} `orm:"unit_name4" json:"unitName4"` // 子分部工程 + UnitName5 interface{} `orm:"unit_name5" json:"unitName5"` // 分项工程 + UnitName6 interface{} `orm:"unit_name6" json:"unitName6"` // 检验批 + QualityName interface{} `orm:"quality_name" json:"qualityName"` // 工程项目名称 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + Status interface{} `orm:"status" json:"status"` // 施工类型状态 + FileUrl interface{} `orm:"file_url" json:"fileUrl"` // 文件地址 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreateTime *gtime.Time `orm:"create_time" json:"createTime"` // 创建时间 + UpdateTime *gtime.Time `orm:"update_time" json:"updateTime"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_equipment_equipment_unpacking.go b/internal/app/system/model/do/bus_equipment_equipment_unpacking.go new file mode 100644 index 0000000..ad2da84 --- /dev/null +++ b/internal/app/system/model/do/bus_equipment_equipment_unpacking.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-29 11:14:45 +// 生成路径: internal/app/system/model/entity/bus_equipment_equipment_unpacking.go +// 生成人:gfast +// desc:开箱记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusEquipmentEquipmentUnpacking is the golang structure for table bus_equipment_equipment_unpacking. +type BusEquipmentEquipmentUnpacking struct { + gmeta.Meta `orm:"table:bus_equipment_equipment_unpacking, do:true"` + UnpackingId interface{} `orm:"unpacking_id,primary" json:"unpackingId"` // 序号 + EquipmentMaterialsId interface{} `orm:"equipment_materials_id" json:"equipmentMaterialsId"` // 设备id + UnpackingName interface{} `orm:"unpacking_name" json:"unpackingName"` // 开箱名称 + UnpackingUrl interface{} `orm:"unpacking_url" json:"unpackingUrl"` // 开箱上传文件 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + Status interface{} `orm:"status" json:"status"` // 状态 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_equipment_materials.go b/internal/app/system/model/do/bus_equipment_materials.go new file mode 100644 index 0000000..c12729c --- /dev/null +++ b/internal/app/system/model/do/bus_equipment_materials.go @@ -0,0 +1,44 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-29 11:14:16 +// 生成路径: internal/app/system/model/entity/bus_equipment_materials.go +// 生成人:gfast +// desc:材料/设备名称 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusEquipmentMaterials is the golang structure for table bus_equipment_materials. +type BusEquipmentMaterials struct { + gmeta.Meta `orm:"table:bus_equipment_materials, do:true"` + EquipmentMaterialsId interface{} `orm:"equipment_materials_id,primary" json:"equipmentMaterialsId"` // 序号 + EquipmentMaterialsName interface{} `orm:"equipment_materials_name" json:"equipmentMaterialsName"` // 材料/设备 + CompanyId interface{} `orm:"company_id" json:"companyId"` // 公司 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目 + TypeSpecificationName interface{} `orm:"type_specification_name" json:"typeSpecificationName"` // 规格型号 + TypeSpecificationUrl interface{} `orm:"type_specification_url" json:"typeSpecificationUrl"` // 规格型号文件 + CertificateConformityName interface{} `orm:"certificate_conformity_name" json:"certificateConformityName"` // 合格证编号 + CertificateConformityUrl interface{} `orm:"certificate_conformity_url" json:"certificateConformityUrl"` // 合格证编号文件 + QualityName interface{} `orm:"quality_name" json:"qualityName"` // 质量说明书编号 + QualityUrl interface{} `orm:"quality_url" json:"qualityUrl"` // 质量说明书文件 + InspectionReportName interface{} `orm:"inspection_report_name" json:"inspectionReportName"` // 检验报告编号 + InspectionReportUrl interface{} `orm:"inspection_report_url" json:"inspectionReportUrl"` // 检验报告文件 + ReexamineReportName interface{} `orm:"reexamine_report_name" json:"reexamineReportName"` // 复试报告编号 + ReexamineReportUrl interface{} `orm:"reexamine_report_url" json:"reexamineReportUrl"` // 复试报告文件 + UsePart interface{} `orm:"use_part" json:"usePart"` // 使用部位 + WeightId interface{} `orm:"weight_id" json:"weightId"` // 计量单位 + Remark interface{} `orm:"remark" json:"remark"` // 备注 + QuantityCount interface{} `orm:"quantity_count" json:"quantityCount"` // 材料数量 + Status interface{} `orm:"status" json:"status"` // 状态 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除视角 +} diff --git a/internal/app/system/model/do/bus_equipment_materials_inventory.go b/internal/app/system/model/do/bus_equipment_materials_inventory.go new file mode 100644 index 0000000..ce49699 --- /dev/null +++ b/internal/app/system/model/do/bus_equipment_materials_inventory.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-13 14:21:30 +// 生成路径: internal/app/system/model/entity/bus_equipment_materials_inventory.go +// 生成人:gfast +// desc:设备材料入库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusEquipmentMaterialsInventory is the golang structure for table bus_equipment_materials_inventory. +type BusEquipmentMaterialsInventory struct { + gmeta.Meta `orm:"table:bus_equipment_materials_inventory, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + EquipmentMaterialsId interface{} `orm:"equipment_materials_id" json:"equipmentMaterialsId"` // 材料ID + OutPut interface{} `orm:"out_put" json:"outPut"` // 出入库 + Number interface{} `orm:"number" json:"number"` // 数量 + OutPutTime *gtime.Time `orm:"out_put_time" json:"outPutTime"` // 出入库时间 + Residue interface{} `orm:"residue" json:"residue"` // 剩余库存数量 + Operator interface{} `orm:"operator" json:"operator"` // 出入库负责人 + Recipient interface{} `orm:"recipient" json:"recipient" dc:"交接单位"` //交接单位 + Shipper interface{} `orm:"shipper" json:"shipper" dc:"领用人"` //领用人 + Disposition interface{} `orm:"disposition"json:"disposition"dc:"处理方式"` //处理方式 + Remark interface{} `orm:"remark" json:"remark"` // 备注 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除视角 + Path interface{} `orm:"path" json:"path"` // 资源路径 +} diff --git a/internal/app/system/model/do/bus_equipment_materials_inventory_file.go b/internal/app/system/model/do/bus_equipment_materials_inventory_file.go new file mode 100644 index 0000000..a889d33 --- /dev/null +++ b/internal/app/system/model/do/bus_equipment_materials_inventory_file.go @@ -0,0 +1,22 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// BusEquipmentMaterialsInventoryFile is the golang structure of table bus_equipment_materials_inventory_file for DAO operations like Where/Data. +type BusEquipmentMaterialsInventoryFile struct { + g.Meta `orm:"table:bus_equipment_materials_inventory_file, do:true"` + Id interface{} // 主键 + MaterialsInventoryId interface{} // 设备材料Id + Name interface{} // 文件名字 + Path interface{} // 文件路径 + Suffix interface{} // 文件后缀 + Size interface{} // 文件大小 + CreatedAt *gtime.Time // 创建时间 +} diff --git a/internal/app/system/model/do/bus_equipment_materials_weight.go b/internal/app/system/model/do/bus_equipment_materials_weight.go new file mode 100644 index 0000000..eb22a70 --- /dev/null +++ b/internal/app/system/model/do/bus_equipment_materials_weight.go @@ -0,0 +1,28 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-28 15:27:53 +// 生成路径: internal/app/system/model/entity/bus_equipment_materials_weight.go +// 生成人:gfast +// desc:计量单位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusEquipmentMaterialsWeight is the golang structure for table bus_equipment_materials_weight. +type BusEquipmentMaterialsWeight struct { + gmeta.Meta `orm:"table:bus_equipment_materials_weight, do:true"` + WeightId interface{} `orm:"weight_id,primary" json:"weightId"` // 序号 + Weight interface{} `orm:"weight" json:"weight"` // 计量单位名称 + Status interface{} `orm:"status" json:"status"` // 状态 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_essential_information.go b/internal/app/system/model/do/bus_essential_information.go new file mode 100644 index 0000000..5d92ebc --- /dev/null +++ b/internal/app/system/model/do/bus_essential_information.go @@ -0,0 +1,25 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-20 19:38:54 +// 生成路径: internal/app/system/model/entity/bus_essential_information.go +// 生成人:gfast +// desc:项目基本信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusEssentialInformation is the golang structure for table bus_essential_information. +type BusEssentialInformation struct { + gmeta.Meta `orm:"table:bus_essential_information, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + One interface{} `orm:"one" json:"one"` // 发电量 + Two interface{} `orm:"two" json:"two"` // 年发电量 + Three interface{} `orm:"three" json:"three"` // 当前发电量 + Four interface{} `orm:"four" json:"four"` // 减排量 + Five interface{} `orm:"five" json:"five"` // 预估发电量 +} diff --git a/internal/app/system/model/do/bus_folder.go b/internal/app/system/model/do/bus_folder.go new file mode 100644 index 0000000..19e3a2a --- /dev/null +++ b/internal/app/system/model/do/bus_folder.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-15 17:15:59 +// 生成路径: internal/app/system/model/entity/bus_folder.go +// 生成人:gfast +// desc:文件夹 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusFolder is the golang structure for table bus_folder. +type BusFolder struct { + gmeta.Meta `orm:"table:bus_folder, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + Father interface{} `orm:"father" json:"father"` // 大于0表示当前文件夹有父级 + FolderType interface{} `orm:"folder_type" json:"folderType"` // 文件夹类型 + Icon interface{} `orm:"icon" json:"icon"` // 文件夹图标 + Name interface{} `orm:"name" json:"name"` // 文件夹名称 + Remark interface{} `orm:"remark" json:"remark"` // 备注 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_folder_file.go b/internal/app/system/model/do/bus_folder_file.go new file mode 100644 index 0000000..0f7062d --- /dev/null +++ b/internal/app/system/model/do/bus_folder_file.go @@ -0,0 +1,35 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-15 17:16:00 +// 生成路径: internal/app/system/model/entity/bus_folder_file.go +// 生成人:gfast +// desc:文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusFolderFile is the golang structure for table bus_folder_file. +type BusFolderFile struct { + gmeta.Meta `orm:"table:bus_folder_file, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 項目id + FolderId interface{} `orm:"folder_id" json:"folderId"` // 所属文件夹 + FileType interface{} `orm:"file_type" json:"fileType"` // 文件类型 + Name interface{} `orm:"name" json:"name"` // 文件名称 + Size interface{} `orm:"size" json:"size"` // 文件大小 + Suffix interface{} `orm:"suffix" json:"suffix"` // 文件后缀 + Path interface{} `orm:"path" json:"path"` // 文件路径 + Remark interface{} `orm:"remark" json:"remark"` // 备注 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + UserType interface{} `orm:"user_type" json:"userType"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_hse_management.go b/internal/app/system/model/do/bus_hse_management.go new file mode 100644 index 0000000..07c00a4 --- /dev/null +++ b/internal/app/system/model/do/bus_hse_management.go @@ -0,0 +1,42 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-28 14:53:05 +// 生成路径: internal/app/system/model/entity/bus_hse_management.go +// 生成人:gfast +// desc:HSE-巡检工单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusHseManagement is the golang structure for table bus_hse_management. +type BusHseManagement struct { + gmeta.Meta `orm:"table:bus_hse_management, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 你 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目ID + StudyType interface{} `orm:"study_type" json:"studyType"` // 检查类型 + TourType interface{} `orm:"tour_type" json:"tourType"` // 违章类型字典 + InspectionResult interface{} `orm:"inspection_result" json:"inspectionResult"` // 巡检结果 + TeamName interface{} `orm:"team_name" json:"teamName"` // 名称(班组/部门) + Corrector interface{} `orm:"corrector" json:"corrector"` // 整改人(班组长) + IsReply interface{} `orm:"is_reply" json:"isReply"` // 是否回复(1回复 2不回复) + ReplyDate interface{} `orm:"reply_date" json:"replyDate"` // 回复日期 + Status interface{} `orm:"status" json:"status"` // 工单状态(1通知 2整改 3复查) + HiddenDanger interface{} `orm:"hidden_danger" json:"hiddenDanger"` // 问题隐患 + Measure interface{} `orm:"measure" json:"measure"` // 整改措施 + Review interface{} `orm:"review" json:"review"` // 复查情况 + ReviewType interface{} `orm:"review_type" json:"reviewType"` // 复查状态 + CreatedBy interface{} `orm:"created_by" json:"createdBy"` // 创建人 + UpdatedBy interface{} `orm:"updated_by" json:"updatedBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + CheckTime *gtime.Time `orm:"check_time" json:"checkTime"` // 检查时间 + RectificationTime *gtime.Time `orm:"rectification_time" json:"rectificationTime"` // 整改时间 + ReviewTime *gtime.Time `orm:"review_time" json:"reviewTime"` // 复查时间 +} diff --git a/internal/app/system/model/do/bus_hse_security_log.go b/internal/app/system/model/do/bus_hse_security_log.go new file mode 100644 index 0000000..81713dc --- /dev/null +++ b/internal/app/system/model/do/bus_hse_security_log.go @@ -0,0 +1,41 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-04-07 17:00:45 +// 生成路径: internal/app/system/model/entity/bus_hse_security_log.go +// 生成人:gfast +// desc:HSE安全日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusHseSecurityLog is the golang structure for table bus_hse_security_log. +type BusHseSecurityLog struct { + gmeta.Meta `orm:"table:bus_hse_security_log, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目ID + DateOfOccurrence interface{} `orm:"date_of_occurrence" json:"dateOfOccurrence"` // 发生日期 + AirTemperatureMax interface{} `orm:"air_temperature_max" json:"airTemperatureMax"` // 最高气温 + AirTemperatureMin interface{} `orm:"air_temperature_min" json:"airTemperatureMin"` // 最低气温 + Climate interface{} `orm:"climate" json:"climate"` // 气候(字典) + Progress interface{} `orm:"progress" json:"progress"` // 进展情况 + JobContent interface{} `orm:"job_content" json:"jobContent"` // 作业内容 + DiscloseTheFacts interface{} `orm:"disclose_the_facts" json:"discloseTheFacts"` // 交底情况 + ProgressOfActivity interface{} `orm:"progress_of_activity" json:"progressOfActivity"` // 活动情况 + Examine interface{} `orm:"examine" json:"examine"` // 检查情况 + Implementation interface{} `orm:"implementation" json:"implementation"` // 实施情况 + SafetyInspectionSituation interface{} `orm:"safety_inspection_situation" json:"safetyInspectionSituation"` // 安全检查情况 + StoppageOrOvertime interface{} `orm:"stoppage_or_overtime" json:"stoppageOrOvertime"` // 停工或加班情况 + OtherRecords interface{} `orm:"other_records" json:"otherRecords"` // 其他情况 + Remark interface{} `orm:"remark" json:"remark"` // 备注 + CreatedBy interface{} `orm:"created_by" json:"createdBy"` // 创建人 + UpdatedBy interface{} `orm:"updated_by" json:"updatedBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_inspection_ticket.go b/internal/app/system/model/do/bus_inspection_ticket.go new file mode 100644 index 0000000..9c30fd9 --- /dev/null +++ b/internal/app/system/model/do/bus_inspection_ticket.go @@ -0,0 +1,40 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-21 15:23:59 +// 生成路径: internal/app/system/model/entity/bus_inspection_ticket.go +// 生成人:gfast +// desc:质量工单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusInspectionTicket is the golang structure for table bus_inspection_ticket. +type BusInspectionTicket struct { + gmeta.Meta `orm:"table:bus_inspection_ticket, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目ID + InspectionType interface{} `orm:"inspection_type" json:"inspectionType"` // 巡检类型(关联字典) + InspectionHeadline interface{} `orm:"inspection_headline" json:"inspectionHeadline"` // 巡检主题 + InspectionResult interface{} `orm:"inspection_result" json:"inspectionResult"` // 巡检结果 + Corrector interface{} `orm:"corrector" json:"corrector"` // 整改人(班组长) + IsReply interface{} `orm:"is_reply" json:"isReply"` // 是否回复(1回复 2不回复) + ReplyDate interface{} `orm:"reply_date" json:"replyDate"` // 回复日期 + Status interface{} `orm:"status" json:"status"` // 工单状态(1通知 2整改 3验证) + Feedback interface{} `orm:"feedback" json:"feedback"` // 整改反馈 + VerificationResult interface{} `orm:"verification_result" json:"verificationResult"` // 验证结果 + VerificationType interface{} `orm:"verification_type" json:"verificationType"` // 验证状态(1通过 2未通过) + CreatedBy interface{} `orm:"created_by" json:"createdBy"` // 创建人 + UpdatedBy interface{} `orm:"updated_by" json:"updatedBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + CheckTime *gtime.Time `orm:"check_time" json:"checkTime"` // 通知时间 + RectificationTime *gtime.Time `orm:"rectification_time" json:"rectificationTime"` // 整改时间 + ReviewTime *gtime.Time `orm:"review_time" json:"reviewTime"` // 验证时间 +} diff --git a/internal/app/system/model/do/bus_machinery.go b/internal/app/system/model/do/bus_machinery.go new file mode 100644 index 0000000..0d934a3 --- /dev/null +++ b/internal/app/system/model/do/bus_machinery.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-29 14:02:01 +// 生成路径: internal/app/system/model/entity/bus_machinery.go +// 生成人:gfast +// desc:机械 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusMachinery is the golang structure for table bus_machinery. +type BusMachinery struct { + gmeta.Meta `orm:"table:bus_machinery, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + MachineryName interface{} `orm:"machinery_name" json:"machineryName"` // 机械名称 + MachineryNumber interface{} `orm:"machinery_number" json:"machineryNumber"` // 编号 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + CheckoutNumber interface{} `orm:"checkout_number" json:"checkoutNumber"` // 检验证编号 + CheckoutUnit interface{} `orm:"checkout_unit" json:"checkoutUnit"` // 检验单位 + CheckoutDate interface{} `orm:"checkout_date" json:"checkoutDate"` // 检定日期/有效期 + Status interface{} `orm:"status" json:"status"` // 施工类型状态 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Number interface{} `orm:"number" json:"number"` // 数量 + EntryTime *gtime.Time `orm:"entry_time" json:"entryTime"` // 数量 + Principal interface{} `orm:"principal" json:"principal"` // 数量 + Remark interface{} `orm:"remark" json:"remark"` // 数量 +} diff --git a/internal/app/system/model/do/bus_machinery_detail.go b/internal/app/system/model/do/bus_machinery_detail.go new file mode 100644 index 0000000..f61ee0a --- /dev/null +++ b/internal/app/system/model/do/bus_machinery_detail.go @@ -0,0 +1,36 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-10-12 11:41:31 +// 生成路径: internal/app/system/model/entity/bus_machinery_detail.go +// 生成人:gfast +// desc:机械详情 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusMachineryDetail is the golang structure for table bus_machinery_detail. +type BusMachineryDetail struct { + gmeta.Meta `orm:"table:bus_machinery_detail, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + CheckoutNumber interface{} `orm:"checkout_number" json:"checkoutNumber"` // 检验证编号 + CheckoutUnit interface{} `orm:"checkout_unit" json:"checkoutUnit"` // 检验单位 + CheckoutDate interface{} `orm:"checkout_date" json:"checkoutDate"` // 检定日期/有效期 + Status interface{} `orm:"status" json:"status"` // 施工类型状态 + Type interface{} `orm:"type" json:"type"` // 1出场 2入场 + EntryTime *gtime.Time `orm:"entry_time" json:"entryTime"` // 入场时间 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Remark interface{} `orm:"remark" json:"remark"` // 备注 + Picture interface{} `orm:"picture" json:"picture"` // 4张图片,逗号分隔 + MachineryId interface{} `orm:"machinery_id" json:"machineryId"` // 机械主键ID + Principal interface{} `orm:"principal" json:"principal"` // 负责人 +} diff --git a/internal/app/system/model/do/bus_machinery_detail_file.go b/internal/app/system/model/do/bus_machinery_detail_file.go new file mode 100644 index 0000000..f2dc933 --- /dev/null +++ b/internal/app/system/model/do/bus_machinery_detail_file.go @@ -0,0 +1,21 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" +) + +// BusMachineryDetailFile is the golang structure of table bus_machinery_detail_file for DAO operations like Where/Data. +type BusMachineryDetailFile struct { + g.Meta `orm:"table:bus_machinery_detail_file, do:true"` + Id interface{} // 主键 + MachineryDetailId interface{} // 机械设备详情id + Name interface{} // 文件名字 + Path interface{} // 文件路径 + Type interface{} // 文件类型 + Size interface{} // 文件大小 + SourceType interface{} // 文件来源类型(1合格校验单 2租赁校验单) +} diff --git a/internal/app/system/model/do/bus_machinery_record.go b/internal/app/system/model/do/bus_machinery_record.go new file mode 100644 index 0000000..0810433 --- /dev/null +++ b/internal/app/system/model/do/bus_machinery_record.go @@ -0,0 +1,22 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// BusMachineryRecord is the golang structure of table bus_machinery_record for DAO operations like Where/Data. +type BusMachineryRecord struct { + g.Meta `orm:"table:bus_machinery_record, do:true"` + Id interface{} // id + MachineryDetailId interface{} // 机械详情id + Status interface{} // 施工类型状态(0正常 1停用) + Type interface{} // 1出场 2入场 + RecordTime *gtime.Time // 记录出入场时间 + CreateBy interface{} // 创建人 + CreatedAt *gtime.Time // 创建时间 +} diff --git a/internal/app/system/model/do/bus_payroll_list.go b/internal/app/system/model/do/bus_payroll_list.go new file mode 100644 index 0000000..d9ee9aa --- /dev/null +++ b/internal/app/system/model/do/bus_payroll_list.go @@ -0,0 +1,46 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-11-20 13:51:38 +// 生成路径: internal/app/system/model/entity/bus_payroll_list.go +// 生成人:gfast +// desc:工资(excel导入形成的) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusPayrollList is the golang structure for table bus_payroll_list. +type BusPayrollList struct { + gmeta.Meta `orm:"table:bus_payroll_list, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // + XNumber interface{} `orm:"x_number" json:"xNumber"` // 编号 + Name interface{} `orm:"name" json:"name"` // 姓名 + IdentityCard interface{} `orm:"identity_card" json:"identityCard"` // 身份证号码 + ContactWay interface{} `orm:"contact_way" json:"contactWay"` // 联系方式 + TeamOrGroup interface{} `orm:"team_or_group" json:"teamOrGroup"` // 班组 + TypeOfWork interface{} `orm:"type_of_work" json:"typeOfWork"` // 工种 + AttendanceTime interface{} `orm:"attendance_time" json:"attendanceTime"` // 当月考勤工作时间 + ActualWorkload interface{} `orm:"actual_workload" json:"actualWorkload"` // 当月产生实际工作量 + Quantity interface{} `orm:"quantity" json:"quantity"` // 元量 + XDay interface{} `orm:"x_day" json:"xDay"` // 元天 + XMonth interface{} `orm:"x_month" json:"xMonth"` // 元月 + OvertimeWage interface{} `orm:"overtime_wage" json:"overtimeWage"` // 加班工资 + Salary interface{} `orm:"salary" json:"salary"` // 应发 + AmountWithheld interface{} `orm:"amount_withheld" json:"amountWithheld"` // 代扣金额 + AmountPaid interface{} `orm:"amount_paid" json:"amountPaid"` // 代缴金额 + DeductOther interface{} `orm:"deduct_other" json:"deductOther"` // 扣除其他项目金额(如:预支) + AmountPaidOut interface{} `orm:"amount_paid_out" json:"amountPaidOut"` // 实发金额 + ReleaseMode interface{} `orm:"release_mode" json:"releaseMode"` // 发放方式 + CreditCardNumbers interface{} `orm:"credit_card_numbers" json:"creditCardNumbers"` // 银行卡号 + OpeningBank interface{} `orm:"opening_bank" json:"openingBank"` // 开户行(具体到分行) + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_presetting_bit.go b/internal/app/system/model/do/bus_presetting_bit.go new file mode 100644 index 0000000..e1749cb --- /dev/null +++ b/internal/app/system/model/do/bus_presetting_bit.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-10-19 15:17:27 +// 生成路径: internal/app/system/model/entity/bus_presetting_bit.go +// 生成人:gfast +// desc:摄像头预置位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusPresettingBit is the golang structure for table bus_presetting_bit. +type BusPresettingBit struct { + gmeta.Meta `orm:"table:bus_presetting_bit, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + CameraId interface{} `orm:"camera_id" json:"cameraId"` // 摄像头ID + Serial interface{} `orm:"serial" json:"serial"` // 国标号 + Code interface{} `orm:"code" json:"code"` // 通道号 + Command interface{} `orm:"command" json:"command"` // 指令 + Preset interface{} `orm:"preset" json:"preset"` // 预置位编号 + Name interface{} `orm:"name" json:"name"` // 预置位名称 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_projectin_progress.go b/internal/app/system/model/do/bus_projectin_progress.go new file mode 100644 index 0000000..4dbf78f --- /dev/null +++ b/internal/app/system/model/do/bus_projectin_progress.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-20 19:45:19 +// 生成路径: internal/app/system/model/entity/bus_projectin_progress.go +// 生成人:gfast +// desc:在建项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusProjectinProgress is the golang structure for table bus_projectin_progress. +type BusProjectinProgress struct { + gmeta.Meta `orm:"table:bus_projectin_progress, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目ID + ParallelIn interface{} `orm:"parallel_in" json:"parallelIn"` // 并网容量 + CreatedBy *gtime.Time `orm:"created_by" json:"createdBy"` // 创建时间 +} diff --git a/internal/app/system/model/do/bus_quality.go b/internal/app/system/model/do/bus_quality.go new file mode 100644 index 0000000..eb2eeea --- /dev/null +++ b/internal/app/system/model/do/bus_quality.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-02 17:11:39 +// 生成路径: internal/app/system/model/entity/bus_quality.go +// 生成人:gfast +// desc:质量文档管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusQuality is the golang structure for table bus_quality. +type BusQuality struct { + gmeta.Meta `orm:"table:bus_quality, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + QualityName interface{} `orm:"quality_name" json:"qualityName"` // 质量检查名称 + QualityExplain interface{} `orm:"quality_explain" json:"qualityExplain"` // 质量说明 + QualityDocument interface{} `orm:"quality_document" json:"qualityDocument"` // 质量检查文件 + QualityType interface{} `orm:"quality_type" json:"qualityType"` // 质量类型 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + UserType interface{} `orm:"user_type" json:"userType"` // 项目id + Status interface{} `orm:"status" json:"status"` // 帐号状态 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_question_bank.go b/internal/app/system/model/do/bus_question_bank.go new file mode 100644 index 0000000..609532e --- /dev/null +++ b/internal/app/system/model/do/bus_question_bank.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-10-07 15:52:18 +// 生成路径: internal/app/system/model/entity/bus_question_bank.go +// 生成人:gfast +// desc:题库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusQuestionBank is the golang structure for table bus_question_bank. +type BusQuestionBank struct { + gmeta.Meta `orm:"table:bus_question_bank, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + CategoryId interface{} `orm:"category_id" json:"categoryId"` // 题目类别 + QuestionType interface{} `orm:"question_type" json:"questionType"` // 题目类型(1单选、2多选、3判断、4填空、5问答) + QuestionText interface{} `orm:"question_text" json:"questionText"` // 题目内容 + Options interface{} `orm:"options" json:"options"` // 选项(对单选、多选、判断这种固定答案有效,以JSON数组形式存储) + CorrectAnswer interface{} `orm:"correct_answer" json:"correctAnswer"` // 正确答案 + Score interface{} `orm:"score" json:"score"` // 得分 + WxOrPc interface{} `orm:"wx_or_pc" json:"wxOrPc"` // 创建人类型(1pc、2小程序) + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_question_save.go b/internal/app/system/model/do/bus_question_save.go new file mode 100644 index 0000000..551cb3d --- /dev/null +++ b/internal/app/system/model/do/bus_question_save.go @@ -0,0 +1,34 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-11-01 17:33:04 +// 生成路径: internal/app/system/model/entity/bus_question_save.go +// 生成人:gfast +// desc:用户试卷存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusQuestionSave is the golang structure for table bus_question_save. +type BusQuestionSave struct { + gmeta.Meta `orm:"table:bus_question_save, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + Openid interface{} `orm:"openid" json:"openid"` // openid + BankId interface{} `orm:"bank_id" json:"bankId"` // 题库ID + Answer interface{} `orm:"answer" json:"answer"` // 答案 + Correct interface{} `orm:"correct" json:"correct"` // 答题是否正确(1正确 2错误) + Score interface{} `orm:"score" json:"score"` // 得分(当前题) + Sign interface{} `orm:"sign" json:"sign"` // 签名路径 + TakeTime interface{} `orm:"take_time" json:"takeTime"` // 用时时间(时间戳/秒) + TimeOut interface{} `orm:"time_out" json:"timeOut"` // 最大超时时间(单位/分钟) + Pass interface{} `orm:"pass" json:"pass"` // 及格线/总分(格式:60,100) + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目ID + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_questions_configuration.go b/internal/app/system/model/do/bus_questions_configuration.go new file mode 100644 index 0000000..46901f0 --- /dev/null +++ b/internal/app/system/model/do/bus_questions_configuration.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-10-07 17:11:20 +// 生成路径: internal/app/system/model/entity/bus_questions_configuration.go +// 生成人:gfast +// desc:题库配置 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusQuestionsConfiguration is the golang structure for table bus_questions_configuration. +type BusQuestionsConfiguration struct { + gmeta.Meta `orm:"table:bus_questions_configuration, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + SingleChoice interface{} `orm:"single_choice" json:"singleChoice"` // 单选题(单位/道) + SingleScore interface{} `orm:"single_score" json:"singleScore"` // 单选分数 + MultipleChoice interface{} `orm:"multiple_choice" json:"multipleChoice"` // 多选题(单位/道) + MultipleScore interface{} `orm:"multiple_score" json:"multipleScore"` // 多选分数 + Estimate interface{} `orm:"estimate" json:"estimate"` // 判断题(单位/道) + EstimateScore interface{} `orm:"estimate_score" json:"estimateScore"` // 判断分数 + FullMark interface{} `orm:"full_mark" json:"fullMark"` // 满分 + PassingScore interface{} `orm:"passing_score" json:"passingScore"` // 及格线 + AnswerTime interface{} `orm:"answer_time" json:"answerTime"` // 最大答题时间(单位/分) +} diff --git a/internal/app/system/model/do/bus_reissue_a_card.go b/internal/app/system/model/do/bus_reissue_a_card.go new file mode 100644 index 0000000..effc5e1 --- /dev/null +++ b/internal/app/system/model/do/bus_reissue_a_card.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-02-02 15:18:48 +// 生成路径: internal/app/system/model/entity/bus_reissue_a_card.go +// 生成人:gfast +// desc:施工人员补卡申请 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusReissueACard is the golang structure for table bus_reissue_a_card. +type BusReissueACard struct { + gmeta.Meta `orm:"table:bus_reissue_a_card, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + Openid interface{} `orm:"openid" json:"openid"` // 申请人 + Scope interface{} `orm:"scope" json:"scope"` // 申请补卡范围 + Explain interface{} `orm:"explain" json:"explain"` // 申请补卡说明 + Ganger interface{} `orm:"ganger" json:"ganger"` // 班组长 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目ID + TeamId interface{} `orm:"team_id" json:"teamId"` // 班组ID + GangerOpinion interface{} `orm:"ganger_opinion" json:"gangerOpinion"` // 班组长意见(1未读 2同意 3拒绝) + GangerExplain interface{} `orm:"ganger_explain" json:"gangerExplain"` // 班组长说明 + GangerTime *gtime.Time `orm:"ganger_time" json:"gangerTime"` // 班组长操作时间 + ManagerOpinion interface{} `orm:"manager_opinion" json:"managerOpinion"` // 管理员意见(1未读 2同意 3拒绝) + ManagerExplain interface{} `orm:"manager_explain" json:"managerExplain"` // 管理员说明 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 后台操作人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + Type interface{} `orm:"type" json:"type"` // 补卡范围(1全体 2上班 3下班) + AttendanceId interface{} `orm:"attendance_id" json:"attendanceId"` // 补卡范围(1全体 2上班 3下班) +} diff --git a/internal/app/system/model/do/bus_research_document.go b/internal/app/system/model/do/bus_research_document.go new file mode 100644 index 0000000..1b96931 --- /dev/null +++ b/internal/app/system/model/do/bus_research_document.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-29 16:04:06 +// 生成路径: internal/app/system/model/entity/bus_research_document.go +// 生成人:gfast +// desc:科研文档 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusResearchDocument is the golang structure for table bus_research_document. +type BusResearchDocument struct { + gmeta.Meta `orm:"table:bus_research_document, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + DocumenName interface{} `orm:"documen_name" json:"documenName"` // 文档名称 + Remark interface{} `orm:"remark" json:"remark"` // 备注 + DocumentUrl interface{} `orm:"document_url" json:"documentUrl"` // 文件路径 + FileId interface{} `orm:"file_id" json:"fileId"` // 文件夹id + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + Status interface{} `orm:"status" json:"status"` // 状态 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 上传时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_safety.go b/internal/app/system/model/do/bus_safety.go new file mode 100644 index 0000000..8f5c80e --- /dev/null +++ b/internal/app/system/model/do/bus_safety.go @@ -0,0 +1,35 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-02 15:40:48 +// 生成路径: internal/app/system/model/entity/bus_safety.go +// 生成人:gfast +// desc:安全例会管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusSafety is the golang structure for table bus_safety. +type BusSafety struct { + gmeta.Meta `orm:"table:bus_safety, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + SafetyName interface{} `orm:"safety_name" json:"safetyName"` // 安全检查名称 + SafetyExplain interface{} `orm:"safety_explain" json:"safetyExplain"` // 安全说明 + SafetyDocument interface{} `orm:"safety_document" json:"safetyDocument"` // 安全检查文件 + SafetyType interface{} `orm:"safety_type" json:"safetyType"` // 安全类型 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + UserType interface{} `orm:"user_type" json:"userType"` // 用户类型 + StartDate *gtime.Time `orm:"start_date" json:"startDate"` // 实际创建时间 + SafetyGrade interface{} `orm:"safety_grade" json:"safetyGrade"` // 等级 + Status interface{} `orm:"status" json:"status"` // 帐号状态 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_salary_details.go b/internal/app/system/model/do/bus_salary_details.go new file mode 100644 index 0000000..c734535 --- /dev/null +++ b/internal/app/system/model/do/bus_salary_details.go @@ -0,0 +1,36 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-02-01 16:39:01 +// 生成路径: internal/app/system/model/entity/bus_salary_details.go +// 生成人:gfast +// desc:员工工资考核记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusSalaryDetails is the golang structure for table bus_salary_details. +type BusSalaryDetails struct { + gmeta.Meta `orm:"table:bus_salary_details, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + SfzNumber interface{} `orm:"sfz_number" json:"sfzNumber"` // 身份证 + Name interface{} `orm:"name" json:"name"` // 户名 + Account interface{} `orm:"account" json:"account"` // 账户 + BankingHouse interface{} `orm:"banking_house" json:"bankingHouse"` // 银行 + SumDuration interface{} `orm:"sum_duration" json:"sumDuration"` // 当月总时长 + Salary interface{} `orm:"salary" json:"salary"` // 薪水(天) + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + TeamId interface{} `orm:"team_id" json:"teamId"` // 班组id + ProjectName interface{} `orm:"project_name" json:"projectName"` // 项目名称 + TeamName interface{} `orm:"team_name" json:"teamName"` // 班组名称 + DateOfIssue interface{} `orm:"date_of_issue" json:"dateOfIssue"` // 发放年月 + Lister interface{} `orm:"lister" json:"lister"` // 制表人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_scheduled_plan_type.go b/internal/app/system/model/do/bus_scheduled_plan_type.go new file mode 100644 index 0000000..9db30b2 --- /dev/null +++ b/internal/app/system/model/do/bus_scheduled_plan_type.go @@ -0,0 +1,36 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-29 17:39:12 +// 生成路径: internal/app/system/model/entity/bus_scheduled_plan_type.go +// 生成人:gfast +// desc:施工进度分类 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusScheduledPlanType is the golang structure for table bus_scheduled_plan_type. +type BusScheduledPlanType struct { + gmeta.Meta `orm:"table:bus_scheduled_plan_type, do:true"` + PlanTypeId interface{} `orm:"plan_type_id,primary" json:"planTypeId"` // 施工类型id + ParentId interface{} `orm:"parent_id" json:"parentId"` // 父文件id + Ancestors interface{} `orm:"ancestors" json:"ancestors"` // 祖级列表 + PlanTypeName interface{} `orm:"plan_type_name" json:"planTypeName"` // 施工类型名称 + PlannedTime interface{} `orm:"planned_time" json:"plannedTime"` // 计划施工持续时间 + PlanStartTime interface{} `orm:"plan_start_time" json:"planStartTime"` // 计划工期开始时间 + PlanEndTime interface{} `orm:"plan_end_time" json:"planEndTime"` // 计划工期结束时间 + OrderNum interface{} `orm:"order_num" json:"orderNum"` // 显示顺序 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + Leader interface{} `orm:"leader" json:"leader"` // 负责人 + Status interface{} `orm:"status" json:"status"` // 施工类型状态 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_scheduled_plan_type_detail.go b/internal/app/system/model/do/bus_scheduled_plan_type_detail.go new file mode 100644 index 0000000..d3ab51f --- /dev/null +++ b/internal/app/system/model/do/bus_scheduled_plan_type_detail.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-29 17:15:27 +// 生成路径: internal/app/system/model/entity/bus_scheduled_plan_type_detail.go +// 生成人:gfast +// desc:施工进度月报,年报分类 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusScheduledPlanTypeDetail is the golang structure for table bus_scheduled_plan_type_detail. +type BusScheduledPlanTypeDetail struct { + gmeta.Meta `orm:"table:bus_scheduled_plan_type_detail, do:true"` + PlanTypeDetailId interface{} `orm:"plan_type_detail_id,primary" json:"planTypeDetailId"` // 施工类型id + ParentId interface{} `orm:"parent_id" json:"parentId"` // 父文件id + Ancestors interface{} `orm:"ancestors" json:"ancestors"` // 祖级列表 + PlanTypeName interface{} `orm:"plan_type_name" json:"planTypeName"` // 施工类型名称 + PlannedTime interface{} `orm:"planned_time" json:"plannedTime"` // 计划施工持续时间 + PlanStartTime interface{} `orm:"plan_start_time" json:"planStartTime"` // 计划工期开始时间 + PlanEndTime interface{} `orm:"plan_end_time" json:"planEndTime"` // 计划工期结束时间 + OrderNum interface{} `orm:"order_num" json:"orderNum"` // 显示顺序 + DateValue interface{} `orm:"date_value" json:"dateValue"` // 时间 + DateType interface{} `orm:"date_type" json:"dateType"` // 日期类型状态 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + Leader interface{} `orm:"leader" json:"leader"` // 负责人 + Status interface{} `orm:"status" json:"status"` // 施工类型状态 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_scheduled_weekly.go b/internal/app/system/model/do/bus_scheduled_weekly.go new file mode 100644 index 0000000..5c417b7 --- /dev/null +++ b/internal/app/system/model/do/bus_scheduled_weekly.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-02 15:28:49 +// 生成路径: internal/app/system/model/entity/bus_scheduled_weekly.go +// 生成人:gfast +// desc:周报 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusScheduledWeekly is the golang structure for table bus_scheduled_weekly. +type BusScheduledWeekly struct { + gmeta.Meta `orm:"table:bus_scheduled_weekly, do:true"` + PlanWeeklyId interface{} `orm:"plan_weekly_id,primary" json:"planWeeklyId"` // 施工周报id + PlanPeriodId interface{} `orm:"plan_period_id" json:"planPeriodId"` // 施工分类id + WeeklyPlanName interface{} `orm:"weekly_plan_name" json:"weeklyPlanName"` // 施工分类下第几周 + WeeklyStartTime interface{} `orm:"weekly_start_time" json:"weeklyStartTime"` // 周开始时间 + WeeklyEndTime interface{} `orm:"weekly_end_time" json:"weeklyEndTime"` // 周完成时间 + WeeklyPlanFinish interface{} `orm:"weekly_plan_finish" json:"weeklyPlanFinish"` // 周计划完成量 + WeeklyRealityFinish interface{} `orm:"weekly_reality_finish" json:"weeklyRealityFinish"` // 周实际完成量 + WeekyAccumulativeFinish interface{} `orm:"weeky_accumulative_finish" json:"weekyAccumulativeFinish"` // 累计完成量 + WeekyAccumulativeTotal interface{} `orm:"weeky_accumulative_total" json:"weekyAccumulativeTotal"` // 总量 + CompletionRate interface{} `orm:"completion_rate" json:"completionRate"` // 累计完成比例 + Leader interface{} `orm:"leader" json:"leader"` // 负责人 + Status interface{} `orm:"status" json:"status"` // 施工类型状态 + WeeklyDocumentUrl interface{} `orm:"weekly_document_url" json:"weeklyDocumentUrl"` // 施工周报文档地址 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_scheduled_weekly_photovoltaic.go b/internal/app/system/model/do/bus_scheduled_weekly_photovoltaic.go new file mode 100644 index 0000000..1188124 --- /dev/null +++ b/internal/app/system/model/do/bus_scheduled_weekly_photovoltaic.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-02 15:21:55 +// 生成路径: internal/app/system/model/entity/bus_scheduled_weekly_photovoltaic.go +// 生成人:gfast +// desc:周报-光伏板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusScheduledWeeklyPhotovoltaic is the golang structure for table bus_scheduled_weekly_photovoltaic. +type BusScheduledWeeklyPhotovoltaic struct { + gmeta.Meta `orm:"table:bus_scheduled_weekly_photovoltaic, do:true"` + PhotovoltaicId interface{} `orm:"photovoltaic_id,primary" json:"photovoltaicId"` // 序号 + PlanWeeklyId interface{} `orm:"plan_weekly_id" json:"planWeeklyId"` // 周报id + PhotovoltaicNumber interface{} `orm:"photovoltaic_number" json:"photovoltaicNumber"` // 光伏板编号 + PhotovoltaicNumberGis interface{} `orm:"photovoltaic_number_gis" json:"photovoltaicNumberGis"` // gis地图中使用的真实的光伏板id + InstallNot interface{} `orm:"install_not" json:"installNot"` // 是否安装 + InstallCreateTime interface{} `orm:"install_createTime" json:"installCreateTime"` // 安装时间 + Status interface{} `orm:"status" json:"status"` // 光伏板状态 + ProjectId interface{} `orm:"project_id" json:"projectId"` // '项目id' + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_standing_book.go b/internal/app/system/model/do/bus_standing_book.go new file mode 100644 index 0000000..f29493a --- /dev/null +++ b/internal/app/system/model/do/bus_standing_book.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-29 11:36:04 +// 生成路径: internal/app/system/model/entity/bus_standing_book.go +// 生成人:gfast +// desc:台账 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusStandingBook is the golang structure for table bus_standing_book. +type BusStandingBook struct { + gmeta.Meta `orm:"table:bus_standing_book, do:true"` + StandingBookId interface{} `orm:"standing_book_id,primary" json:"standingBookId"` // 序号 + EquipmentMaterialsId interface{} `orm:"equipment_materials_id" json:"equipmentMaterialsId"` // 材料/设备 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + StandingBookType interface{} `orm:"standing_book_type" json:"standingBookType"` // 台账类型 + ApproachTime interface{} `orm:"approach_time" json:"approachTime"` // 进场时间 + ClaimingDate interface{} `orm:"claiming_date" json:"claimingDate"` // 领用时间 + Quantity interface{} `orm:"quantity" json:"quantity"` // 数量 + Gross interface{} `orm:"gross" json:"gross"` // 总量 + Status interface{} `orm:"status" json:"status"` // 状态 + SignerRecipient interface{} `orm:"signer_recipient" json:"signerRecipient"` // 签收领用人 + RecipientUnit interface{} `orm:"recipient_unit" json:"recipientUnit"` // 使用单位 + StoreIssue interface{} `orm:"store_issue" json:"storeIssue"` // 发料人 + ProcessMode interface{} `orm:"process_mode" json:"processMode"` // 处理方式 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_tour.go b/internal/app/system/model/do/bus_tour.go new file mode 100644 index 0000000..cb0e9e9 --- /dev/null +++ b/internal/app/system/model/do/bus_tour.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-10-10 12:11:05 +// 生成路径: internal/app/system/model/entity/bus_tour.go +// 生成人:gfast +// desc:煤科巡视-故障记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusTour is the golang structure for table bus_tour. +type BusTour struct { + gmeta.Meta `orm:"table:bus_tour, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + ProjectId interface{} `orm:"project_id,primary" json:"projectId"` // 项目iD + TourCategory interface{} `orm:"tour_category" json:"tourCategory"` // 类别字典 + TourType interface{} `orm:"tour_type" json:"tourType"` // 类型字典 + Picture interface{} `orm:"picture" json:"picture"` // 图片路径 + Num interface{} `orm:"num" json:"num"` // 违规数量 + Describe interface{} `orm:"describe" json:"describe"` // 故障描述 + TableName interface{} `orm:"table_name" json:"tableName"` // 表名 + TableId interface{} `orm:"table_id" json:"tableId"` // 表id + SxtName interface{} `orm:"sxt_name" json:"sxtName"` // 表id + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_type_of_wage.go b/internal/app/system/model/do/bus_type_of_wage.go new file mode 100644 index 0000000..1038b3c --- /dev/null +++ b/internal/app/system/model/do/bus_type_of_wage.go @@ -0,0 +1,28 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-05 10:07:11 +// 生成路径: internal/app/system/model/entity/bus_type_of_wage.go +// 生成人:gfast +// desc:工种薪水 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusTypeOfWage is the golang structure for table bus_type_of_wage. +type BusTypeOfWage struct { + gmeta.Meta `orm:"table:bus_type_of_wage, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + TypeOfWork interface{} `orm:"type_of_work" json:"typeOfWork"` // 工种字典 + Standard interface{} `orm:"standard" json:"standard"` // 工资标准 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_violation_level.go b/internal/app/system/model/do/bus_violation_level.go new file mode 100644 index 0000000..f63c9de --- /dev/null +++ b/internal/app/system/model/do/bus_violation_level.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-11-20 11:18:36 +// 生成路径: internal/app/system/model/entity/bus_violation_level.go +// 生成人:gfast +// desc:违章等级 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusViolationLevel is the golang structure for table bus_violation_level. +type BusViolationLevel struct { + gmeta.Meta `orm:"table:bus_violation_level, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + Grade interface{} `orm:"grade" json:"grade"` // 违章等级 + Color interface{} `orm:"color" json:"color"` // 颜色 + TourType interface{} `orm:"tour_type" json:"tourType"` // 违章类型 + Risx interface{} `orm:"risx" json:"risx"` // 风险类型 + WxOrPc interface{} `orm:"wx_or_pc" json:"wxOrPc"` // 来源:1pc 2小程序 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/bus_violation_record.go b/internal/app/system/model/do/bus_violation_record.go new file mode 100644 index 0000000..5e0e40c --- /dev/null +++ b/internal/app/system/model/do/bus_violation_record.go @@ -0,0 +1,48 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-11-20 11:18:37 +// 生成路径: internal/app/system/model/entity/bus_violation_record.go +// 生成人:gfast +// desc:违章记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusViolationRecord is the golang structure for table bus_violation_record. +type BusViolationRecord struct { + gmeta.Meta `orm:"table:bus_violation_record, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目ID + LevelId interface{} `orm:"level_id" json:"levelId"` // 违章等级主键ID + TourType interface{} `orm:"tour_type" json:"tourType"` // 违章类型 + TourId interface{} `orm:"tour_id" json:"tourId"` // 违章详情(关联bus_tour) + Level interface{} `orm:"level" json:"level"` // 违章等级 + DataSource interface{} `orm:"data_source" json:"dataSource"` // 数据来源 + Status interface{} `orm:"status" json:"status"` // 工单状态(1通知 2整改 3复查) + ProcessingPeriod interface{} `orm:"processing_period" json:"processingPeriod"` // 处理期限(要求) + ProcessingPeriodPractical interface{} `orm:"processing_period_practical" json:"processingPeriodPractical"` // 处理期限(实际) + SelectPeople interface{} `orm:"select_people" json:"selectPeople"` // 选择人(后台用户ID) + Openid interface{} `orm:"openid" json:"openid"` // 处理人 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Remark interface{} `orm:"remark" json:"remark"` + Review interface{} `orm:"review" json:"review"` + ReviewType interface{} `orm:"review_type" json:"reviewType"` + SxtName interface{} `orm:"sxt_name" json:"sxtName"` + //Picture interface{} `orm:"picture" json:"picture"` // 单图 + //WxOrPc interface{} `orm:"wx_or_pc" json:"wxOrPc"` // 来源:1pc 2小程序 + //IsDispose interface{} `orm:"is_dispose" json:"isDispose"` // 是否处理(1待处理 2已处理) + //LaborDate string `orm:"labor_date" json:"laborDate"` // 人工日期 + RectificationTime *gtime.Time `orm:"rectification_time" json:"rectificationTime"` // 整改时间 + ReviewTime *gtime.Time `orm:"review_time" json:"reviewTime"` // 复查时间 + +} diff --git a/internal/app/system/model/do/bus_weekly_security_report.go b/internal/app/system/model/do/bus_weekly_security_report.go new file mode 100644 index 0000000..4717bbb --- /dev/null +++ b/internal/app/system/model/do/bus_weekly_security_report.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-04-02 18:03:23 +// 生成路径: internal/app/system/model/entity/bus_weekly_security_report.go +// 生成人:gfast +// desc:安全周期 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusWeeklySecurityReport is the golang structure for table bus_weekly_security_report. +type BusWeeklySecurityReport struct { + gmeta.Meta `orm:"table:bus_weekly_security_report, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目ID + ProjectName interface{} `orm:"project_name" json:"projectName"` // 项目名称 + Week interface{} `orm:"week" json:"week"` // 周期 + Scope interface{} `orm:"scope" json:"scope"` // 周期范围 + ScopeEnd interface{} `orm:"scope_end" json:"scopeEnd"` // 周期范围结束 + Path interface{} `orm:"path" json:"path"` // 文件位置 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/comment_list.go b/internal/app/system/model/do/comment_list.go new file mode 100644 index 0000000..a908f81 --- /dev/null +++ b/internal/app/system/model/do/comment_list.go @@ -0,0 +1,22 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// CommentList is the golang structure of table comment_list for DAO operations like Where/Data. +type CommentList struct { + g.Meta `orm:"table:comment_list, do:true"` + Id interface{} // + ProjectId interface{} // 项目ID + Receiver interface{} // 消息接收者 + Content interface{} // 评论内容 + CreatedAt *gtime.Time // + Sender interface{} // 消息的发起人 + IsRead interface{} // 0 未读 | 1 已读 +} diff --git a/internal/app/system/model/do/comments.go b/internal/app/system/model/do/comments.go new file mode 100644 index 0000000..963f8bf --- /dev/null +++ b/internal/app/system/model/do/comments.go @@ -0,0 +1,20 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// Comments is the golang structure of table comments for DAO operations like Where/Data. +type Comments struct { + g.Meta `orm:"table:comments, do:true"` + Id interface{} // 评论的主键 + NotificationId interface{} // 关联的通知ID + CommentText interface{} // 评论内容 + CommentId interface{} // 用户ID + CreatedAt *gtime.Time // +} diff --git a/internal/app/system/model/do/construction_details.go b/internal/app/system/model/do/construction_details.go new file mode 100644 index 0000000..ec01a4e --- /dev/null +++ b/internal/app/system/model/do/construction_details.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-13 18:10:56 +// 生成路径: internal/app/system/model/entity/construction_details.go +// 生成人:gfast +// desc:施工类别详情 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ConstructionDetails is the golang structure for table construction_details. +type ConstructionDetails struct { + gmeta.Meta `orm:"table:construction_details, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // + CreatedBy interface{} `orm:"created_by" json:"createdBy"` // + UpdatedBy interface{} `orm:"updated_by" json:"updatedBy"` // + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // + Name interface{} `orm:"name" json:"name"` // 施工名称 + Types interface{} `orm:"types" json:"types"` // 施工类别 + Total interface{} `orm:"total" json:"total"` // 总量 + ConstructionId interface{} `orm:"construction_id" json:"constructionId"` // 施工id(父级id) + Remark interface{} `orm:"remark" json:"remark"` // 备注 + IsPercentage interface{} `orm:"isPercentage" json:"isPercentage"` // 数据类型是否为百分比 + StartTime *gtime.Time `orm:"start_time" json:"startTime"` // 开始时间 + EndTime *gtime.Time `orm:"end_time" json:"endTime"` // 结束时间 + Completed interface{} `orm:"completed" json:"completed"` // 完成量 + Selectable interface{} `orm:"selectable" json:"selectable"` // 可选择余量 + Overall interface{} `orm:"overall" json:"overall"` // 总余量 +} diff --git a/internal/app/system/model/do/construction_project.go b/internal/app/system/model/do/construction_project.go new file mode 100644 index 0000000..f60b26b --- /dev/null +++ b/internal/app/system/model/do/construction_project.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-13 17:36:45 +// 生成路径: internal/app/system/model/entity/construction_project.go +// 生成人:gfast +// desc:施工项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ConstructionProject is the golang structure for table construction_project. +type ConstructionProject struct { + gmeta.Meta `orm:"table:construction_project, do:true"` + ConstructionId interface{} `orm:"construction_id,primary" json:"constructionId"` // 主键id + CreatedBy interface{} `orm:"created_by" json:"createdBy"` // + UpdatedBy interface{} `orm:"updated_by" json:"updatedBy"` // + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // + FangzhenId interface{} `orm:"fangzhen_id" json:"fangzhenId"` // 方阵id + ConstructionName interface{} `orm:"construction_name" json:"constructionName"` // 施工名称 + Total interface{} `orm:"total" json:"total"` // 总量 + Remark interface{} `orm:"remark" json:"remark"` // 备注 + IsPercentage interface{} `orm:"isPercentage" json:"isPercentage"` // 数据类型是否为百分比 + EndTime *gtime.Time `orm:"end_time" json:"endTime"` // 结束时间 + StartTime *gtime.Time `orm:"start_time" json:"startTime"` // 开始时间 +} diff --git a/internal/app/system/model/do/device.go b/internal/app/system/model/do/device.go new file mode 100644 index 0000000..691b537 --- /dev/null +++ b/internal/app/system/model/do/device.go @@ -0,0 +1,26 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-11-24 09:57:07 +// 生成路径: internal/app/system/model/entity/device.go +// 生成人:gfast +// desc:安全帽设备(java) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// Device is the golang structure for table device. +type Device struct { + gmeta.Meta `orm:"table:device, do:true"` + DevNum interface{} `orm:"devNum,primary" json:"devNum"` // 设备编号 + DevName interface{} `orm:"devName" json:"devName"` // 设备名称 + Status interface{} `orm:"status" json:"status"` // 状态 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + CreateTime *gtime.Time `orm:"createTime" json:"createTime"` // 添加时间 + UpdateTime *gtime.Time `orm:"updateTime" json:"updateTime"` // 修改时间 +} diff --git a/internal/app/system/model/do/device_preset.go b/internal/app/system/model/do/device_preset.go new file mode 100644 index 0000000..387953d --- /dev/null +++ b/internal/app/system/model/do/device_preset.go @@ -0,0 +1,21 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// DevicePreset is the golang structure of table device_preset for DAO operations like Where/Data. +type DevicePreset struct { + g.Meta `orm:"table:device_preset, do:true"` + Id interface{} // 主键ID + CreatedAt *gtime.Time // 创建时间 + DeviceSerial interface{} // 设备序列号 + ChannelNo interface{} // 通道号 + Index interface{} // 预置点序号 + Name interface{} // 预置点 +} diff --git a/internal/app/system/model/do/document.go b/internal/app/system/model/do/document.go new file mode 100644 index 0000000..c758b18 --- /dev/null +++ b/internal/app/system/model/do/document.go @@ -0,0 +1,30 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-16 10:32:04 +// 生成路径: internal/app/system/model/entity/document.go +// 生成人:gfast +// desc:母板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// Document is the golang structure for table document. +type Document struct { + gmeta.Meta `orm:"table:document, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + Pid interface{} `orm:"pid" json:"pid"` // 父级(0代表顶级) + Name interface{} `orm:"name" json:"name"` // 模板名称 + FilenPath interface{} `orm:"filen_path" json:"filenPath"` // 模板路径 + Type interface{} `orm:"type" json:"type"` // 类型(1文件-2文件夹) + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/document_completion.go b/internal/app/system/model/do/document_completion.go new file mode 100644 index 0000000..3bf5eb2 --- /dev/null +++ b/internal/app/system/model/do/document_completion.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-15 10:25:00 +// 生成路径: internal/app/system/model/entity/document_completion.go +// 生成人:gfast +// desc:竣工图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// DocumentCompletion is the golang structure for table document_completion. +type DocumentCompletion struct { + gmeta.Meta `orm:"table:document_completion, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // + IdStr interface{} `orm:"id_str" json:"idStr"` // 模板id + Pid interface{} `orm:"pid" json:"pid"` // 父级(0代表顶级) + Name interface{} `orm:"name" json:"name"` // 模板名称 + FilenPath interface{} `orm:"filen_path" json:"filenPath"` // 模板文件名 + Type interface{} `orm:"type" json:"type"` // 类型(1文件-2文件夹) + Suffix interface{} `orm:"suffix" json:"suffix"` // 后缀 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id +} diff --git a/internal/app/system/model/do/document_data.go b/internal/app/system/model/do/document_data.go new file mode 100644 index 0000000..3bb03b0 --- /dev/null +++ b/internal/app/system/model/do/document_data.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-12-27 09:30:04 +// 生成路径: internal/app/system/model/entity/document_data.go +// 生成人:gfast +// desc:工程资料>资料 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// DocumentData is the golang structure for table document_data. +type DocumentData struct { + gmeta.Meta `orm:"table:document_data, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // + IdStr interface{} `orm:"id_str" json:"idStr"` // 模板id + Pid interface{} `orm:"pid" json:"pid"` // 父级(0代表顶级) + Name interface{} `orm:"name" json:"name"` // 模板名称 + FilenPath interface{} `orm:"filen_path" json:"filenPath"` // 模板文件名 + Type interface{} `orm:"type" json:"type"` // 类型(1文件-2文件夹) + Suffix interface{} `orm:"suffix" json:"suffix"` // 后缀 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/document_production_drawing.go b/internal/app/system/model/do/document_production_drawing.go new file mode 100644 index 0000000..751aa6d --- /dev/null +++ b/internal/app/system/model/do/document_production_drawing.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-15 10:24:54 +// 生成路径: internal/app/system/model/entity/document_production_drawing.go +// 生成人:gfast +// desc:施工图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// DocumentProductionDrawing is the golang structure for table document_production_drawing. +type DocumentProductionDrawing struct { + gmeta.Meta `orm:"table:document_production_drawing, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // + IdStr interface{} `orm:"id_str" json:"idStr"` // 模板id + Pid interface{} `orm:"pid" json:"pid"` // 父级(0代表顶级) + Name interface{} `orm:"name" json:"name"` // 模板名称 + FilenPath interface{} `orm:"filen_path" json:"filenPath"` // 模板文件名 + Type interface{} `orm:"type" json:"type"` // 类型(1文件-2文件夹) + Suffix interface{} `orm:"suffix" json:"suffix"` // 后缀 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id +} diff --git a/internal/app/system/model/do/document_project.go b/internal/app/system/model/do/document_project.go new file mode 100644 index 0000000..74450b3 --- /dev/null +++ b/internal/app/system/model/do/document_project.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-16 10:32:03 +// 生成路径: internal/app/system/model/entity/document_project.go +// 生成人:gfast +// desc:项目模板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// DocumentProject is the golang structure for table document_project. +type DocumentProject struct { + gmeta.Meta `orm:"table:document_project, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + IdStr interface{} `orm:"id_str,primary" json:"idStr"` // 父级(0代表顶级) + Pid interface{} `orm:"pid,primary" json:"pid"` // 父级(0代表顶级) + Name interface{} `orm:"name,primary" json:"name"` // 模板名称 + FilePath interface{} `orm:"file_path,primary" json:"filePath"` // 模板路径 + Type interface{} `orm:"type,primary" json:"type"` // 类型(1文件-2文件夹) + Json interface{} `orm:"json,primary" json:"json"` // 保存后的json文件名 + ProjectId interface{} `orm:"project_id,primary" json:"projectId"` // 项目id + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/document_quality_meeting.go b/internal/app/system/model/do/document_quality_meeting.go new file mode 100644 index 0000000..0c5216f --- /dev/null +++ b/internal/app/system/model/do/document_quality_meeting.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-25 16:43:56 +// 生成路径: internal/app/system/model/entity/document_quality_meeting.go +// 生成人:gfast +// desc:质量会议 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// DocumentQualityMeeting is the golang structure for table document_quality_meeting. +type DocumentQualityMeeting struct { + gmeta.Meta `orm:"table:document_quality_meeting, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // + IdStr interface{} `orm:"id_str" json:"idStr"` // 模板id + Pid interface{} `orm:"pid" json:"pid"` // 父级(0代表顶级) + Name interface{} `orm:"name" json:"name"` // 模板名称 + FilenPath interface{} `orm:"filen_path" json:"filenPath"` // 模板文件名 + Type interface{} `orm:"type" json:"type"` // 类型(1文件-2文件夹) + Suffix interface{} `orm:"suffix" json:"suffix"` // 后缀 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id +} diff --git a/internal/app/system/model/do/document_report.go b/internal/app/system/model/do/document_report.go new file mode 100644 index 0000000..5818e8a --- /dev/null +++ b/internal/app/system/model/do/document_report.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-15 10:24:21 +// 生成路径: internal/app/system/model/entity/document_report.go +// 生成人:gfast +// desc:科研及专题报告 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// DocumentReport is the golang structure for table document_report. +type DocumentReport struct { + gmeta.Meta `orm:"table:document_report, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // + IdStr interface{} `orm:"id_str" json:"idStr"` // 模板id + Pid interface{} `orm:"pid" json:"pid"` // 父级(0代表顶级) + Name interface{} `orm:"name" json:"name"` // 模板名称 + FilenPath interface{} `orm:"filen_path" json:"filenPath"` // 模板文件名 + Type interface{} `orm:"type" json:"type"` // 类型(1文件-2文件夹) + Suffix interface{} `orm:"suffix" json:"suffix"` // 后缀 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id +} diff --git a/internal/app/system/model/do/document_safety_meeting.go b/internal/app/system/model/do/document_safety_meeting.go new file mode 100644 index 0000000..bc2e8b5 --- /dev/null +++ b/internal/app/system/model/do/document_safety_meeting.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-04-09 11:40:21 +// 生成路径: internal/app/system/model/entity/document_safety_meeting.go +// 生成人:gfast +// desc:安全会议 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// DocumentSafetyMeeting is the golang structure for table document_safety_meeting. +type DocumentSafetyMeeting struct { + gmeta.Meta `orm:"table:document_safety_meeting, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // + IdStr interface{} `orm:"id_str" json:"idStr"` // 模板id + Pid interface{} `orm:"pid" json:"pid"` // 父级(0代表顶级) + Name interface{} `orm:"name" json:"name"` // 模板名称 + FilenPath interface{} `orm:"filen_path" json:"filenPath"` // 模板文件名 + Type interface{} `orm:"type" json:"type"` // 类型(1文件-2文件夹) + Suffix interface{} `orm:"suffix" json:"suffix"` // 后缀 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id +} diff --git a/internal/app/system/model/do/equipment.go b/internal/app/system/model/do/equipment.go new file mode 100644 index 0000000..3346e04 --- /dev/null +++ b/internal/app/system/model/do/equipment.go @@ -0,0 +1,39 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// Equipment is the golang structure of table equipment for DAO operations like Where/Data. +type Equipment struct { + g.Meta `orm:"table:equipment, do:true"` + PlantId interface{} // 所属电站ID + DivertorId interface{} // 分流器ID + DivertorName interface{} // 分流器名称 + EquipmentName interface{} // 设备名称 + EquipmentPn interface{} // 设备型号 + EquipmentSn interface{} // 设备序列号 + Id interface{} // 设备ID + Kwp interface{} // 总容量kwp + MonKwh interface{} // 当月发电量 + NowKw interface{} // 实时功率 + ParamDcacCode interface{} // DC/AC参数代码 + ParamDcdcCode interface{} // DC/DC参数代码 + PowerPlantId interface{} // 电站ID + PowerPlantName interface{} // 电站名称 + RatedPower interface{} // 额定功率 + SoftDcacCode interface{} // 软件DC/AC代码 + SoftDcdcCode interface{} // 软件DC/DC代码 + Status interface{} // 状态 + SumKwh interface{} // 总发电量 + TodayKwh interface{} // 当日发电量 + UpdateTime *gtime.Time // 更新时间 + UserId interface{} // 用户ID + UserName interface{} // 用户名 + YearKwh interface{} // 年发电量 +} diff --git a/internal/app/system/model/do/manage_airline.go b/internal/app/system/model/do/manage_airline.go new file mode 100644 index 0000000..6b05151 --- /dev/null +++ b/internal/app/system/model/do/manage_airline.go @@ -0,0 +1,40 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-12-11 16:10:19 +// 生成路径: internal/app/system/model/entity/manage_airline.go +// 生成人:gfast +// desc:航线 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageAirline is the golang structure for table manage_airline. +type ManageAirline struct { + gmeta.Meta `orm:"table:manage_airline, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + StrId interface{} `orm:"str_id" json:"strId"` // 航线ID + Speed interface{} `orm:"speed" json:"speed"` // 航线速度 + Height interface{} `orm:"height" json:"height"` // 航线高度 + Gap interface{} `orm:"gap" json:"gap"` // 航线间距 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + AirLine interface{} `orm:"air_line" json:"airLine"` // 航线名称 + Positions interface{} `orm:"positions" json:"positions"` // 航线坐标 + FilePath interface{} `orm:"file_path" json:"filePath"` // 航线文件 + Fingerprint interface{} `orm:"fingerprint" json:"fingerprint"` // md5签名 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Remark interface{} `orm:"remark" json:"remark"` // 备注 + TakeOffPoint interface{} `orm:"take_off_point" json:"takeOffPoint"` // 起飞点 + TakeOffSecurityHeight interface{} `orm:"take_off_security_height" json:"takeOffSecurityHeight"` // 安全起飞高度 + GlobalTransitionalSpeed interface{} `orm:"global_transitional_speed" json:"globalTransitionalSpeed"` // 飞向首航点速度 + MqClientId interface{} `orm:"mqClientId" json:"mq_client_id"` // 关联机场 +} diff --git a/internal/app/system/model/do/manage_device.go b/internal/app/system/model/do/manage_device.go new file mode 100644 index 0000000..24992cb --- /dev/null +++ b/internal/app/system/model/do/manage_device.go @@ -0,0 +1,45 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-11-14 10:53:21 +// 生成路径: internal/app/system/model/entity/manage_device.go +// 生成人:gfast +// desc:设备信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageDevice is the golang structure for table manage_device. +type ManageDevice struct { + gmeta.Meta `orm:"table:manage_device, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 自增ID + DeviceSn interface{} `orm:"device_sn" json:"deviceSn"` // 对接站点、无人机或遥控器的序列号 + DeviceName interface{} `orm:"device_name" json:"deviceName"` // 设备的型号。该参数对应设备字典表中的设备名称 + MqClientId interface{} `orm:"mq_client_id" json:"mqClientId"` // 客户端id + UserId interface{} `orm:"user_id" json:"userId"` // 设备绑定时使用的账号 + Nickname interface{} `orm:"nickname" json:"nickname"` // 设备的自定义名称 + WorkspaceId interface{} `orm:"workspace_id" json:"workspaceId"` // 当前设备所属的工作区 + DeviceType interface{} `orm:"device_type" json:"deviceType"` // 该参数对应设备字典表中的设备类型 + DictionaryId interface{} `orm:"dictionary_id" json:"dictionaryId"` // 该参数对应设备字典表中的设备类型 + SubType interface{} `orm:"sub_type" json:"subType"` // 该参数对应设备字典表中的子类型 + Domain interface{} `orm:"domain" json:"domain"` // 该参数对应设备字典表中的域 + FirmwareVersion interface{} `orm:"firmware_version" json:"firmwareVersion"` // 设备的固件版本 + CompatibleStatus interface{} `orm:"compatible_status" json:"compatibleStatus"` // 1: 一致;0: 不一致;固件版本是否一致 + Version interface{} `orm:"version" json:"version"` // 协议版本。该字段目前没有用处。 + DeviceIndex interface{} `orm:"device_index" json:"deviceIndex"` // 无人机的控制,A控制或B控制 + ChildSn interface{} `orm:"child_sn" json:"childSn"` // 由网关控制的设备 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + BoundTime *gtime.Time `orm:"bound_time" json:"boundTime"` // 设备绑定工作区的时间 + BoundStatus interface{} `orm:"bound_status" json:"boundStatus"` // 设备绑定工作区的状态。1: 已绑定;0: 未绑定 + LoginTime *gtime.Time `orm:"login_time" json:"loginTime"` // 设备的上次登录时间 + DeviceDesc interface{} `orm:"device_desc" json:"deviceDesc"` // 设备描述 + UrlNormal interface{} `orm:"url_normal" json:"urlNormal"` // 遥控器上显示的图标 + UrlSelect interface{} `orm:"url_select" json:"urlSelect"` // 选中遥控器时显示的图标 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id +} diff --git a/internal/app/system/model/do/manage_operation_log.go b/internal/app/system/model/do/manage_operation_log.go new file mode 100644 index 0000000..67031bf --- /dev/null +++ b/internal/app/system/model/do/manage_operation_log.go @@ -0,0 +1,25 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-06-21 15:23:29 +// 生成路径: internal/app/system/model/entity/manage_operation_log.go +// 生成人:gfast +// desc:无人机指令日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageOperationLog is the golang structure for table manage_operation_log. +type ManageOperationLog struct { + gmeta.Meta `orm:"table:manage_operation_log, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + Sn interface{} `orm:"sn" json:"sn"` // sn + Method interface{} `orm:"method" json:"method"` // 方法名 + Direction interface{} `orm:"direction" json:"direction"` // 上发/下发命令 + Code interface{} `orm:"code" json:"code"` // 状态码 + Operator interface{} `orm:"operator" json:"operator"` // 操作人ID(默认为0表示系统操作) +} diff --git a/internal/app/system/model/do/manage_task.go b/internal/app/system/model/do/manage_task.go new file mode 100644 index 0000000..1002261 --- /dev/null +++ b/internal/app/system/model/do/manage_task.go @@ -0,0 +1,40 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-12-12 15:21:22 +// 生成路径: internal/app/system/model/entity/manage_task.go +// 生成人:gfast +// desc:航线任务下发 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageTask is the golang structure for table manage_task. +type ManageTask struct { + gmeta.Meta `orm:"table:manage_task, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + TaskName interface{} `orm:"task_name" json:"taskName"` // 任务名称 + FlightId interface{} `orm:"flight_id" json:"flightId"` // 计划ID(uuid) + TaskType interface{} `orm:"task_type" json:"taskType"` // 任务类型("0":"立即任务","1":"定时任务","2":"条件任务") + ExecuteTime interface{} `orm:"execute_time" json:"executeTime"` // 任务开始执行时间毫秒时间戳 + WaylineType interface{} `orm:"wayline_type" json:"waylineType"` // 0普通航线 + Airport interface{} `orm:"airport" json:"airport"` // 关联机场 + AirLine interface{} `orm:"air_line" json:"airLine"` // 关联航线 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 关联项目 + RthAltitude interface{} `orm:"rth_altitude" json:"rthAltitude"` // 返航高度 + RthMode interface{} `orm:"rth_mode" json:"rthMode"` // (默认为0)"0":"智能高度","1":"设定高度" + OutOfControlAction interface{} `orm:"out_of_control_action" json:"outOfControlAction"` // (默认为0)"0":"返航","1":"悬停","2":"降落" + ExitWaylineWhenRcLost interface{} `orm:"exit_wayline_when_rc_lost" json:"exitWaylineWhenRcLost"` // (默认为0)"0":"继续执行航线任务","1":"退出航线任务,执行遥控器失控动作" + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Remark interface{} `orm:"remark" json:"remark"` // 备注 + MqClientId interface{} `orm:"mqClientId" json:"mq_client_id"` // 关联机场 +} diff --git a/internal/app/system/model/do/manage_task_cron.go b/internal/app/system/model/do/manage_task_cron.go new file mode 100644 index 0000000..c6a0b0d --- /dev/null +++ b/internal/app/system/model/do/manage_task_cron.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-06-04 14:33:05 +// 生成路径: internal/app/system/model/entity/manage_task_cron.go +// 生成人:gfast +// desc:航线任务定时飞行 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageTaskCron is the golang structure for table manage_task_cron. +type ManageTaskCron struct { + gmeta.Meta `orm:"table:manage_task_cron, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + MqClientId interface{} `orm:"mq_client_id" json:"mqClientId"` // sn + TaskId interface{} `orm:"task_id" json:"taskId"` // 任务模板ID + Cron interface{} `orm:"cron" json:"cron"` // 表达式 + CronId interface{} `orm:"cron_id" json:"cronId"` // cronID +} diff --git a/internal/app/system/model/do/manage_task_record.go b/internal/app/system/model/do/manage_task_record.go new file mode 100644 index 0000000..9fce853 --- /dev/null +++ b/internal/app/system/model/do/manage_task_record.go @@ -0,0 +1,35 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-12-12 17:56:19 +// 生成路径: internal/app/system/model/entity/manage_task_record.go +// 生成人:gfast +// desc:航线任务下发-记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageTaskRecord is the golang structure for table manage_task_record. +type ManageTaskRecord struct { + gmeta.Meta `orm:"table:manage_task_record, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + TaskId interface{} `orm:"task_id" json:"taskId"` // 任务主键ID + TaskType interface{} `orm:"task_type" json:"taskType"` // 任务类型("0":"立即任务","1":"定时任务","2":"条件任务") + ExecuteTime interface{} `orm:"execute_time" json:"executeTime"` // 任务开始执行时间(毫秒) + CancelTime interface{} `orm:"cancel_time" json:"cancelTime"` // 任务取消时间戳 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Remark interface{} `orm:"remark" json:"remark"` // 备注 + Suspend interface{} `orm:"suspend" json:"suspend"` // 航线暂停时间戳 + Recover interface{} `orm:"recover" json:"recover"` // 航线恢复时间戳 + CourseReversal interface{} `orm:"course_reversal" json:"courseReversal"` // 返航时间戳 + CancelHoming interface{} `orm:"cancel_homing" json:"cancelHoming"` // 取消返航时间戳 +} diff --git a/internal/app/system/model/do/manage_task_record_resource.go b/internal/app/system/model/do/manage_task_record_resource.go new file mode 100644 index 0000000..2c8b2a1 --- /dev/null +++ b/internal/app/system/model/do/manage_task_record_resource.go @@ -0,0 +1,34 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-05-30 17:07:01 +// 生成路径: internal/app/system/model/entity/manage_task_record_resource.go +// 生成人:gfast +// desc:下发记录回传的媒体文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageTaskRecordResource is the golang structure for table manage_task_record_resource. +type ManageTaskRecordResource struct { + gmeta.Meta `orm:"table:manage_task_record_resource, do:true"` + FlightId interface{} `orm:"flight_id,primary" json:"flightId"` // 计划ID + FileName interface{} `orm:"file_name" json:"fileName"` // 文件名称 + ObjectKey interface{} `orm:"object_key" json:"objectKey"` // 文件在对象存储桶的 Key + Path interface{} `orm:"path" json:"path"` // 文件的业务路径 + DroneModelKey interface{} `orm:"drone_model_key" json:"droneModelKey"` // 飞行器产品枚举值 + PayloadModelKey interface{} `orm:"payload_model_key" json:"payloadModelKey"` // 负载产品枚举值 + AbsoluteAltitude interface{} `orm:"absolute_altitude" json:"absoluteAltitude"` // 拍摄绝对高度 + RelativeAltitude interface{} `orm:"relative_altitude" json:"relativeAltitude"` // 拍摄相对高度 + CreateTime *gtime.Time `orm:"create_time" json:"createTime"` // 媒体拍摄时间 + ShootPosition interface{} `orm:"shoot_position" json:"shootPosition"` // 拍摄位置 + Lat interface{} `orm:"lat" json:"lat"` // 拍摄位置纬度 + Lng interface{} `orm:"lng" json:"lng"` // 拍摄位置经度 + Img interface{} `orm:"img" json:"img"` // 图片位置 + ImgSize interface{} `orm:"img_size" json:"imgSize"` // 图片大小 +} diff --git a/internal/app/system/model/do/manage_task_result.go b/internal/app/system/model/do/manage_task_result.go new file mode 100644 index 0000000..50a7da8 --- /dev/null +++ b/internal/app/system/model/do/manage_task_result.go @@ -0,0 +1,20 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// ManageTaskResult is the golang structure of table manage_task_result for DAO operations like Where/Data. +type ManageTaskResult struct { + g.Meta `orm:"table:manage_task_result, do:true"` + Id interface{} // + TaskId interface{} // 航线任务ID + PvId interface{} // pv_module 的主键 + CreatedAt *gtime.Time // + DeletedAt *gtime.Time // +} diff --git a/internal/app/system/model/do/manage_workspace.go b/internal/app/system/model/do/manage_workspace.go new file mode 100644 index 0000000..f55c695 --- /dev/null +++ b/internal/app/system/model/do/manage_workspace.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-11-14 10:53:20 +// 生成路径: internal/app/system/model/entity/manage_workspace.go +// 生成人:gfast +// desc:工作空间 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageWorkspace is the golang structure for table manage_workspace. +type ManageWorkspace struct { + gmeta.Meta `orm:"table:manage_workspace, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 自增ID + WorkspaceId interface{} `orm:"workspace_id" json:"workspaceId"` // 工作区的UUID + WorkspaceName interface{} `orm:"workspace_name" json:"workspaceName"` // 工作区的名称 + WorkspaceDesc interface{} `orm:"workspace_desc" json:"workspaceDesc"` // 工作区的描述 + PlatformName interface{} `orm:"platform_name" json:"platformName"` // 工作区的平台名称 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + BindCode interface{} `orm:"bind_code" json:"bindCode"` // 当停机坪连接到第三方云时,需要提供该工作区的绑定码 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id +} diff --git a/internal/app/system/model/do/master_schedule.go b/internal/app/system/model/do/master_schedule.go new file mode 100644 index 0000000..afdb20b --- /dev/null +++ b/internal/app/system/model/do/master_schedule.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-10-08 09:38:35 +// 生成路径: internal/app/system/model/entity/master_schedule.go +// 生成人:gfast +// desc:总进度计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// MasterSchedule is the golang structure for table master_schedule. +type MasterSchedule struct { + gmeta.Meta `orm:"table:master_schedule, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + Name interface{} `orm:"name" json:"name"` // 工作名称 + Start interface{} `orm:"start" json:"start"` // 开始时间 + End interface{} `orm:"end" json:"end"` // 结束时间 + Content interface{} `orm:"content" json:"content"` // 备注 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Sequence interface{} `orm:"sequence" json:"sequence"` // 顺序编号 +} diff --git a/internal/app/system/model/do/notification_files.go b/internal/app/system/model/do/notification_files.go new file mode 100644 index 0000000..2966e04 --- /dev/null +++ b/internal/app/system/model/do/notification_files.go @@ -0,0 +1,22 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// NotificationFiles is the golang structure of table notification_files for DAO operations like Where/Data. +type NotificationFiles struct { + g.Meta `orm:"table:notification_files, do:true"` + Id interface{} // 主键ID + CreatedAt *gtime.Time // + NotificationId interface{} // 关联的通知或新闻ID + FileName interface{} // 文件名 + FilePath interface{} // 保存路径 + FileType interface{} // 文件类型 + FileSize interface{} // 文件大小 +} diff --git a/internal/app/system/model/do/notification_recipients.go b/internal/app/system/model/do/notification_recipients.go new file mode 100644 index 0000000..5861de1 --- /dev/null +++ b/internal/app/system/model/do/notification_recipients.go @@ -0,0 +1,23 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// NotificationRecipients is the golang structure of table notification_recipients for DAO operations like Where/Data. +type NotificationRecipients struct { + g.Meta `orm:"table:notification_recipients, do:true"` + Id interface{} // + CreatedAt *gtime.Time // + NotificationId interface{} // 关联的通知ID + RecipientId interface{} // 接收者ID + RecipientRole interface{} // 接收者权限 + NotificationStatus interface{} // 0 未读 | 1 已读 + ReadTime interface{} // 消息已读时间 + IntroduceId interface{} // 关联的项目新闻ID +} diff --git a/internal/app/system/model/do/notifications.go b/internal/app/system/model/do/notifications.go new file mode 100644 index 0000000..5a1555e --- /dev/null +++ b/internal/app/system/model/do/notifications.go @@ -0,0 +1,27 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// Notifications is the golang structure of table notifications for DAO operations like Where/Data. +type Notifications struct { + g.Meta `orm:"table:notifications, do:true"` + Id interface{} // + CreatedAt *gtime.Time // + NotificationText interface{} // 通知正文 + Route interface{} // 跳转的路由 + NotificationTime interface{} // 通知时间 + Initiator interface{} // 发起人 + ProjectId interface{} // 项目ID + Positions interface{} // 通知岗位列表 + Title interface{} // 通知标题 + IsApp interface{} // 0 PC | 1 App | 2 新闻 + Files interface{} // 附件 + IntroduceId interface{} // 项目新闻的ID +} diff --git a/internal/app/system/model/do/plan_daily.go b/internal/app/system/model/do/plan_daily.go new file mode 100644 index 0000000..bae75cc --- /dev/null +++ b/internal/app/system/model/do/plan_daily.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-26 14:31:07 +// 生成路径: internal/app/system/model/entity/plan_daily.go +// 生成人:gfast +// desc:日报 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// PlanDaily is the golang structure for table plan_daily. +type PlanDaily struct { + gmeta.Meta `orm:"table:plan_daily, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + SourceId interface{} `orm:"source_id" json:"sourceId"` // 资源id + Name interface{} `orm:"name" json:"name"` // 资源名称 + Table interface{} `orm:"table" json:"table"` // source_id的数据对应的数据表 + PlanName interface{} `orm:"plan_name" json:"planName"` // 计划名称 + PlanId interface{} `orm:"plan_id" json:"planId"` // 周id + WeekRealityId interface{} `orm:"week_reality_id" json:"weekRealityId"` // 周主键ID + SourceType interface{} `orm:"source_type" json:"sourceType"` // 资源类型 + Cnt interface{} `orm:"cnt" json:"cnt"` // 资源数量 + DataTime interface{} `orm:"data_time" json:"dataTime"` // 日计划时间 + Status interface{} `orm:"status" json:"status"` // 工作状态 + CreateBy interface{} `orm:"create_by" json:"createBy"` // + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // +} diff --git a/internal/app/system/model/do/plan_week.go b/internal/app/system/model/do/plan_week.go new file mode 100644 index 0000000..d598f7d --- /dev/null +++ b/internal/app/system/model/do/plan_week.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-04 17:26:59 +// 生成路径: internal/app/system/model/entity/plan_week.go +// 生成人:gfast +// desc:周计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// PlanWeek is the golang structure for table plan_week. +type PlanWeek struct { + gmeta.Meta `orm:"table:plan_week, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + SourceId interface{} `orm:"source_id" json:"sourceId"` // 资源id + Name interface{} `orm:"name" json:"name"` // 资源名称 + Start interface{} `orm:"start" json:"start"` // 开始时间 + End interface{} `orm:"end" json:"end"` // 结束时间 + PlanName interface{} `orm:"plan_name" json:"planName"` // 计划名称 + PlanId interface{} `orm:"plan_id" json:"planId"` // 周id + CreateBy interface{} `orm:"create_by" json:"createBy"` // + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // + CreateAt *gtime.Time `orm:"create_at" json:"createAt"` // + UpdateAt *gtime.Time `orm:"update_at" json:"updateAt"` // + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // + Table interface{} `orm:"table" json:"table"` // source_id的数据对应的数据表 + Status interface{} `orm:"status" json:"status"` // 工作状态,0:未开始,1:进行中,2:已完成 + SourceType interface{} `orm:"source_type" json:"source_type"` // 资源类型 + Cnt interface{} `orm:"cnt" json:"cnt"` // 资源类型 +} diff --git a/internal/app/system/model/do/plan_week_reality.go b/internal/app/system/model/do/plan_week_reality.go new file mode 100644 index 0000000..d845853 --- /dev/null +++ b/internal/app/system/model/do/plan_week_reality.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-17 17:23:07 +// 生成路径: internal/app/system/model/entity/plan_week_reality.go +// 生成人:xyb +// desc:实际完成的周计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// PlanWeekReality is the golang structure for table plan_week_reality. +type PlanWeekReality struct { + gmeta.Meta `orm:"table:plan_week_reality, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + SourceId interface{} `orm:"source_id" json:"sourceId"` // 资源id + Name interface{} `orm:"name" json:"name"` // 资源名称 + Start interface{} `orm:"start" json:"start"` // 开始时间 + End interface{} `orm:"end" json:"end"` // 结束时间 + PlanName interface{} `orm:"plan_name" json:"planName"` // 计划名称 + PlanId interface{} `orm:"plan_id" json:"planId"` // 周id + CreateBy interface{} `orm:"create_by" json:"createBy"` // + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // + CreateAt *gtime.Time `orm:"create_at" json:"createAt"` // + UpdateAt *gtime.Time `orm:"update_at" json:"updateAt"` // + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // + Table interface{} `orm:"table" json:"table"` // source_id的数据对应的数据表 + Status interface{} `orm:"status" json:"status"` // 工作状态,0:未开始,1:进行中,2:已完成 + SourceType interface{} `orm:"source_type" json:"sourceType"` // 资源类型 + Cnt interface{} `orm:"cnt" json:"cnt"` // 资源类型 +} diff --git a/internal/app/system/model/do/plant.go b/internal/app/system/model/do/plant.go new file mode 100644 index 0000000..03ae233 --- /dev/null +++ b/internal/app/system/model/do/plant.go @@ -0,0 +1,55 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-04-12 10:38:43 +// 生成路径: internal/app/system/model/entity/plant.go +// 生成人:gfast +// desc:电站信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// Plant is the golang structure for table plant. +type Plant struct { + gmeta.Meta `orm:"table:plant, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 电站Id + Name interface{} `orm:"name" json:"name"` // 电站名称 + Address interface{} `orm:"address" json:"address"` // 详细地址 + City interface{} `orm:"city" json:"city"` // 市 + District interface{} `orm:"district" json:"district"` // 区 + Province interface{} `orm:"province" json:"province"` // 省 + Latitude interface{} `orm:"latitude" json:"latitude"` // 纬度 + Longitude interface{} `orm:"longitude" json:"longitude"` // 经度 + Kwp interface{} `orm:"kwp" json:"kwp"` // 总容量kwp + MonKwh interface{} `orm:"monKwh" json:"monKwh"` // 当月发电量 + NowKw interface{} `orm:"nowKw" json:"nowKw"` // 实时功率 + SumKwh interface{} `orm:"sumKwh" json:"sumKwh"` // 总发电量 + TodayKwh interface{} `orm:"todayKwh" json:"todayKwh"` // 当日发电量 + YearKwh interface{} `orm:"yearKwh" json:"yearKwh"` // 当年发电量 + NetworkTime *gtime.Time `orm:"networkTime" json:"networkTime"` // 并网日期 + UpdateTime *gtime.Time `orm:"updateTime" json:"updateTime"` // 修改时间 + CompanyId interface{} `orm:"companyId" json:"companyId"` // 渠道商Id + CompanyName interface{} `orm:"companyName" json:"companyName"` // 渠道商名称 + OwnerId interface{} `orm:"ownerId" json:"ownerId"` // 业主Id + OwnerName interface{} `orm:"ownerName" json:"ownerName"` // 业主姓名 + ServiceProviderName interface{} `orm:"serviceProviderName" json:"serviceProviderName"` // 安装商名称 + ServiceProviderPhone interface{} `orm:"serviceProviderPhone" json:"serviceProviderPhone"` // 安装服务商电话 + NetworkType interface{} `orm:"networkType" json:"networkType"` // 并网类型 1:全额上网 2:自发自用余电上网 3:自发自用无馈网 4:离网 + PowerPlantType interface{} `orm:"powerPlantType" json:"powerPlantType"` // 电站类型 1:家庭户用 2:工商业屋顶 3:地面电站 4:扶贫电站 5:储能电站 + Status interface{} `orm:"status" json:"status"` // 电站状态 0:未绑定 1:在线 2:停机 3:停机告警 4:运行告警 5:故障 6:离线 + PaymentType interface{} `orm:"paymentType" json:"paymentType"` // 出资方式 + PlantContact interface{} `orm:"plantContact" json:"plantContact"` // 电站联系人 + PlantContactPhone interface{} `orm:"plantContactPhone" json:"plantContactPhone"` // 电站联系人电话 + PlantImg interface{} `orm:"plantImg" json:"plantImg"` // 电站图片 + Remark interface{} `orm:"remark" json:"remark"` // 备注 + DipAngle interface{} `orm:"dipAngle" json:"dipAngle"` // 倾角度数 + OrientationAngle interface{} `orm:"orientationAngle" json:"orientationAngle"` // 方位角度数 + SubassemblyNumber interface{} `orm:"subassemblyNumber" json:"subassemblyNumber"` // 组件数量 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 +} diff --git a/internal/app/system/model/do/project_finance.go b/internal/app/system/model/do/project_finance.go new file mode 100644 index 0000000..5997f34 --- /dev/null +++ b/internal/app/system/model/do/project_finance.go @@ -0,0 +1,35 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-04-29 12:01:01 +// 生成路径: internal/app/system/model/entity/project_finance.go +// 生成人:gfast +// desc:项目财务 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ProjectFinance is the golang structure for table project_finance. +type ProjectFinance struct { + gmeta.Meta `orm:"table:project_finance, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目ID + ContractAmount interface{} `orm:"contract_amount" json:"contractAmount"` // 承包合同金额 + SubcontractAmount interface{} `orm:"subcontract_amount" json:"subcontractAmount"` // 分包合同金额 + AmountReceived interface{} `orm:"amount_received" json:"amountReceived"` // 已收款 + AmountPaid interface{} `orm:"amount_paid" json:"amountPaid"` // 已付款 + ExpensesReimbursed interface{} `orm:"expenses_reimbursed" json:"expensesReimbursed"` // 已费用报销 + EstimatedGrossProfit interface{} `orm:"estimated_gross_profit" json:"estimatedGrossProfit"` // 预计毛利润 + CurrentProfit interface{} `orm:"current_profit" json:"currentProfit"` // 目前利润 + CurrentRemainingFunds interface{} `orm:"current_remaining_funds" json:"currentRemainingFunds"` // 目前结余资金 + ProjectedIncreaseInRemainingFunds interface{} `orm:"projected_increase_in_remaining_funds" json:"projectedIncreaseInRemainingFunds"` // 至项目完成应增加的结余资金 + NetPresentValueOfProjectOperation interface{} `orm:"net_present_value_of_project_operation" json:"netPresentValueOfProjectOperation"` // 项目经营净现值 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 填报时间 + CreatedBy interface{} `orm:"created_by" json:"createdBy"` // 填报人 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 +} diff --git a/internal/app/system/model/do/project_schedule.go b/internal/app/system/model/do/project_schedule.go new file mode 100644 index 0000000..1d75960 --- /dev/null +++ b/internal/app/system/model/do/project_schedule.go @@ -0,0 +1,23 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// ProjectSchedule is the golang structure of table project_schedule for DAO operations like Where/Data. +type ProjectSchedule struct { + g.Meta `orm:"table:project_schedule, do:true"` + Id interface{} // + ParentId interface{} // 设施ID + StartDate interface{} // 开始时间 + EndDate interface{} // 结束时间 + CreatedAt *gtime.Time // + Name interface{} // 项目名 + PlaneNum interface{} // 计划持有量 + Types interface{} // 计划类型 +} diff --git a/internal/app/system/model/do/pv_module.go b/internal/app/system/model/do/pv_module.go new file mode 100644 index 0000000..6834e57 --- /dev/null +++ b/internal/app/system/model/do/pv_module.go @@ -0,0 +1,26 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" +) + +// PvModule is the golang structure of table pv_module for DAO operations like Where/Data. +type PvModule struct { + g.Meta `orm:"table:pv_module, do:true"` + Id interface{} // + FangzhenId interface{} // 方阵ID + SubProjectid interface{} // 子项目ID + WorkId interface{} // 工作ID + Name interface{} // 名字 + Status interface{} // 状态 0未开始 1 进行中 2 已完成 + DoneTime interface{} // 完成时间 + Detail interface{} // 坐标详细信息 + Type interface{} // 类型 + Tilt interface{} // 标称倾角 + Azimuth interface{} // 标称方位角 + DeviceId interface{} // 设备编号 +} diff --git a/internal/app/system/model/do/qianqi_bubantu.go b/internal/app/system/model/do/qianqi_bubantu.go new file mode 100644 index 0000000..5245380 --- /dev/null +++ b/internal/app/system/model/do/qianqi_bubantu.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-31 11:44:41 +// 生成路径: internal/app/system/model/entity/qianqi_bubantu.go +// 生成人:gfast +// desc:布板图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiBubantu is the golang structure for table qianqi_bubantu. +type QianqiBubantu struct { + gmeta.Meta `orm:"table:qianqi_bubantu, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + GuangfubanId interface{} `orm:"guangfuban_id" json:"guangfubanId"` // 光伏板id + Name interface{} `orm:"name" json:"name"` // 名称 + SourceId interface{} `orm:"source_id" json:"sourceId"` // 资源ID + SourcePath interface{} `orm:"source_path" json:"sourcePath"` // 资源路径 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/qianqi_camera.go b/internal/app/system/model/do/qianqi_camera.go new file mode 100644 index 0000000..684c0f8 --- /dev/null +++ b/internal/app/system/model/do/qianqi_camera.go @@ -0,0 +1,40 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-30 22:37:34 +// 生成路径: internal/app/system/model/entity/qianqi_camera.go +// 生成人:gfast +// desc:摄像头 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiCamera is the golang structure for table qianqi_camera. +type QianqiCamera struct { + gmeta.Meta `orm:"table:qianqi_camera, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // + CameraName interface{} `orm:"camera_name" json:"cameraName"` // 摄像头名称 + CameraCode interface{} `orm:"camera_code" json:"cameraCode"` // 摄像头编码 + Detail interface{} `orm:"detail" json:"detail"` // 摄像头坐标信息 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + Status interface{} `orm:"status" json:"status"` // 在线情况(1、在线,0、离线),字典on_line_status + Poster interface{} `orm:"poster" json:"poster"` // 封面图 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreateddAt *gtime.Time `orm:"createdd_at" json:"createddAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + SourceType interface{} `orm:"source_type" json:"sourceType"` // + Serial interface{} `orm:"serial" json:"serial"` // 国标id + Code interface{} `orm:"code" json:"code"` // 通道号 + Degree interface{} `orm:"degree" json:"degree"` // 旋转值 + Flv interface{} `orm:"flv" json:"flv"` // flv地址 + Hls interface{} `orm:"hls" json:"hls"` // hls地址 + Share interface{} `orm:"share" json:"share"` // 分享地址 + Rtc interface{} `orm:"rtc" json:"rtc"` // webrtc地址 +} diff --git a/internal/app/system/model/do/qianqi_cameras.go b/internal/app/system/model/do/qianqi_cameras.go new file mode 100644 index 0000000..80d7b7c --- /dev/null +++ b/internal/app/system/model/do/qianqi_cameras.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-31 09:48:11 +// 生成路径: internal/app/system/model/entity/qianqi_cameras.go +// 生成人:gfast +// desc:所有摄像头列 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiCameras is the golang structure for table qianqi_cameras. +type QianqiCameras struct { + gmeta.Meta `orm:"table:qianqi_cameras, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + CameraName interface{} `orm:"camera_name" json:"cameraName"` // 摄像头名称 + CameraCode interface{} `orm:"camera_code" json:"cameraCode"` // 摄像头编码 + Detail interface{} `orm:"detail" json:"detail"` // 摄像头坐标信息 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + Status interface{} `orm:"status" json:"status"` // 在线情况 + Poster interface{} `orm:"poster" json:"poster"` // 封面图 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreateAt *gtime.Time `orm:"create_at" json:"createAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/qianqi_dixing.go b/internal/app/system/model/do/qianqi_dixing.go new file mode 100644 index 0000000..8db97ab --- /dev/null +++ b/internal/app/system/model/do/qianqi_dixing.go @@ -0,0 +1,30 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-31 11:44:56 +// 生成路径: internal/app/system/model/entity/qianqi_dixing.go +// 生成人:gfast +// desc:地形 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiDixing is the golang structure for table qianqi_dixing. +type QianqiDixing struct { + gmeta.Meta `orm:"table:qianqi_dixing, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + Name interface{} `orm:"name" json:"name"` // 名称 + SourceId interface{} `orm:"source_id" json:"sourceId"` // 资源ID + SourcePath interface{} `orm:"source_path" json:"sourcePath"` // 资源路径 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/qianqi_fangzhen.go b/internal/app/system/model/do/qianqi_fangzhen.go new file mode 100644 index 0000000..8d97cb7 --- /dev/null +++ b/internal/app/system/model/do/qianqi_fangzhen.go @@ -0,0 +1,29 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// QianqiFangzhen is the golang structure of table qianqi_fangzhen for DAO operations like Where/Data. +type QianqiFangzhen struct { + g.Meta `orm:"table:qianqi_fangzhen, do:true"` + Id interface{} // + ProjectId interface{} // 项目id + Name interface{} // + SourceId interface{} // + SourcePath interface{} // + XiangbianId interface{} // 箱变id + CreateBy interface{} // 创建人 + UpdateBy interface{} // 更新人 + CreatedAt *gtime.Time // 创建时间 + UpdatedAt *gtime.Time // 更新时间 + DeletedAt *gtime.Time // 删除时间 + Detail interface{} // 坐标信息 + SourceType interface{} // + View interface{} // 每个方阵的视角 +} diff --git a/internal/app/system/model/do/qianqi_guangfuban.go b/internal/app/system/model/do/qianqi_guangfuban.go new file mode 100644 index 0000000..7931cb7 --- /dev/null +++ b/internal/app/system/model/do/qianqi_guangfuban.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-31 11:31:49 +// 生成路径: internal/app/system/model/entity/qianqi_guangfuban.go +// 生成人:gfast +// desc:光伏板模型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiGuangfuban is the golang structure for table qianqi_guangfuban. +type QianqiGuangfuban struct { + gmeta.Meta `orm:"table:qianqi_guangfuban, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + Name interface{} `orm:"name" json:"name"` // 倾斜模型 + SourcePath interface{} `orm:"source_path" json:"sourcePath"` // 资源路径 + Detail interface{} `orm:"detail" json:"detail"` // 坐标信息等 + SourceId interface{} `orm:"source_id" json:"sourceId"` // 资源id + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + Zuchuan_path interface{} `orm:"zuchuan_path" json:"zuchuan_path"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/qianqi_guangfuban_ids.go b/internal/app/system/model/do/qianqi_guangfuban_ids.go new file mode 100644 index 0000000..4146fbd --- /dev/null +++ b/internal/app/system/model/do/qianqi_guangfuban_ids.go @@ -0,0 +1,34 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-05 16:00:23 +// 生成路径: internal/app/system/model/entity/qianqi_guangfuban_ids.go +// 生成人:gfast +// desc:光伏板模型的id +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiGuangfubanIds is the golang structure for table qianqi_guangfuban_ids. +type QianqiGuangfubanIds struct { + gmeta.Meta `orm:"table:qianqi_guangfuban_ids, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // + Name interface{} `orm:"name" json:"name"` // 名称 + DevId interface{} `orm:"dev_id" json:"devId"` // 光伏板模型的id + DevType interface{} `orm:"dev_type" json:"devType"` // 光伏板、支架类型 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + SourceType interface{} `orm:"source_type" json:"sourceType"` // + SourceId interface{} `orm:"source_id" json:"sourceId"` // 资源id + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + Sphere interface{} `orm:"sphere" json:"sphere"` // 构建坐标信息 + Range interface{} `orm:"range" json:"range"` // 构建坐标信息 +} diff --git a/internal/app/system/model/do/qianqi_guangfuban_ids_lizhu.go b/internal/app/system/model/do/qianqi_guangfuban_ids_lizhu.go new file mode 100644 index 0000000..f51c5d0 --- /dev/null +++ b/internal/app/system/model/do/qianqi_guangfuban_ids_lizhu.go @@ -0,0 +1,29 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// QianqiGuangfubanIdsLizhu is the golang structure of table qianqi_guangfuban_ids_lizhu for DAO operations like Where/Data. +type QianqiGuangfubanIdsLizhu struct { + g.Meta `orm:"table:qianqi_guangfuban_ids_lizhu, do:true"` + Id interface{} // + Name interface{} // 名称 + CreateBy interface{} // 创建人 + UpdateBy interface{} // 更新人 + CreatedAt *gtime.Time // 创建时间 + UpdatedAt *gtime.Time // 更新时间 + DeletedAt *gtime.Time // 删除时间 + SourceType interface{} // + SourceId interface{} // 资源id + ProjectId interface{} // 项目id + Status interface{} // 状态:0:未完成;1:计划中;2:已完成 + Detail interface{} // 坐标信息 + SubProjectid interface{} // 子项目ID + FangzhenId interface{} // 方阵ID +} diff --git a/internal/app/system/model/do/qianqi_guangfuban_ids_zhijia.go b/internal/app/system/model/do/qianqi_guangfuban_ids_zhijia.go new file mode 100644 index 0000000..a17b5c2 --- /dev/null +++ b/internal/app/system/model/do/qianqi_guangfuban_ids_zhijia.go @@ -0,0 +1,29 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// QianqiGuangfubanIdsZhijia is the golang structure of table qianqi_guangfuban_ids_zhijia for DAO operations like Where/Data. +type QianqiGuangfubanIdsZhijia struct { + g.Meta `orm:"table:qianqi_guangfuban_ids_zhijia, do:true"` + Id interface{} // + Name interface{} // 名称 + CreateBy interface{} // 创建人 + UpdateBy interface{} // 更新人 + CreatedAt *gtime.Time // 创建时间 + UpdatedAt *gtime.Time // 更新时间 + DeletedAt *gtime.Time // 删除时间 + SourceType interface{} // + SourceId interface{} // 资源id + ProjectId interface{} // 项目id + Status interface{} // 状态:0:未完成;1:计划中;2:已完成 + Detail interface{} // 坐标信息 + SubProjectid interface{} // 子项目ID + FangzhenId interface{} // 方阵ID +} diff --git a/internal/app/system/model/do/qianqi_guangfuban_ids_zhuangdian.go b/internal/app/system/model/do/qianqi_guangfuban_ids_zhuangdian.go new file mode 100644 index 0000000..f95778a --- /dev/null +++ b/internal/app/system/model/do/qianqi_guangfuban_ids_zhuangdian.go @@ -0,0 +1,29 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// QianqiGuangfubanIdsZhuangdian is the golang structure of table qianqi_guangfuban_ids_zhuangdian for DAO operations like Where/Data. +type QianqiGuangfubanIdsZhuangdian struct { + g.Meta `orm:"table:qianqi_guangfuban_ids_zhuangdian, do:true"` + Id interface{} // + Name interface{} // 名称 + CreateBy interface{} // 创建人 + UpdateBy interface{} // 更新人 + CreatedAt *gtime.Time // 创建时间 + UpdatedAt *gtime.Time // 更新时间 + DeletedAt *gtime.Time // 删除时间 + SourceType interface{} // + SourceId interface{} // 资源id + ProjectId interface{} // 项目id + Status interface{} // 状态:0:未完成;1:计划中;2:已完成 + Detail interface{} // 坐标信息 + SubProjectid interface{} // 子项目ID + FangzhenId interface{} // 方阵ID +} diff --git a/internal/app/system/model/do/qianqi_guangfuban_zuchuan.go b/internal/app/system/model/do/qianqi_guangfuban_zuchuan.go new file mode 100644 index 0000000..aeb1b1c --- /dev/null +++ b/internal/app/system/model/do/qianqi_guangfuban_zuchuan.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-17 10:37:21 +// 生成路径: internal/app/system/model/entity/qianqi_guangfuban_zuchuan.go +// 生成人:xyb +// desc:组串 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiGuangfubanZuchuan is the golang structure for table qianqi_guangfuban_zuchuan. +type QianqiGuangfubanZuchuan struct { + gmeta.Meta `orm:"table:qianqi_guangfuban_zuchuan, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + SourceType interface{} `orm:"source_type" json:"sourceType"` // + SourceId interface{} `orm:"source_id" json:"sourceId"` // 资源id,为project_id拼接上组串编号 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + ZuchuanId interface{} `orm:"zuchuan_id" json:"zuchuanId"` // 组串编号 + GuangfubanId interface{} `orm:"guangfuban_id" json:"guangfubanId"` // 光伏板模型的id +} diff --git a/internal/app/system/model/do/qianqi_jidianxianlu.go b/internal/app/system/model/do/qianqi_jidianxianlu.go new file mode 100644 index 0000000..e57a9f4 --- /dev/null +++ b/internal/app/system/model/do/qianqi_jidianxianlu.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-04 16:29:44 +// 生成路径: internal/app/system/model/entity/qianqi_jidianxianlu.go +// 生成人:gfast +// desc:集电线路 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiJidianxianlu is the golang structure for table qianqi_jidianxianlu. +type QianqiJidianxianlu struct { + gmeta.Meta `orm:"table:qianqi_jidianxianlu, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + Name interface{} `orm:"name" json:"name"` // 线路名称 + SourceId interface{} `orm:"source_id" json:"sourceId"` // 资源id + SourcePath interface{} `orm:"source_path" json:"sourcePath"` // 资源路径 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + SourceType interface{} `orm:"source_type" json:"sourceType"` // 资源类型 + Detail interface{} `orm:"detail" json:"detail"` // 坐标信息 + +} diff --git a/internal/app/system/model/do/qianqi_moxing.go b/internal/app/system/model/do/qianqi_moxing.go new file mode 100644 index 0000000..8204d88 --- /dev/null +++ b/internal/app/system/model/do/qianqi_moxing.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-31 11:09:26 +// 生成路径: internal/app/system/model/entity/qianqi_moxing.go +// 生成人:gfast +// desc:倾斜模型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiMoxing is the golang structure for table qianqi_moxing. +type QianqiMoxing struct { + gmeta.Meta `orm:"table:qianqi_moxing, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + Name interface{} `orm:"name" json:"name"` // 倾斜模型 + SourcePath interface{} `orm:"source_path" json:"sourcePath"` // 资源路径 + Detail interface{} `orm:"detail" json:"detail"` // 坐标信息等 + SourceId interface{} `orm:"source_id" json:"sourceId"` // 资源id + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/qianqi_nibianqi.go b/internal/app/system/model/do/qianqi_nibianqi.go new file mode 100644 index 0000000..8a34787 --- /dev/null +++ b/internal/app/system/model/do/qianqi_nibianqi.go @@ -0,0 +1,34 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-31 09:40:17 +// 生成路径: internal/app/system/model/entity/qianqi_nibianqi.go +// 生成人:gfast +// desc:逆变器 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiNibianqi is the golang structure for table qianqi_nibianqi. +type QianqiNibianqi struct { + gmeta.Meta `orm:"table:qianqi_nibianqi, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + Name interface{} `orm:"name" json:"name"` // 名称 + SourceId interface{} `orm:"source_id" json:"sourceId"` // 资源id + ModelId interface{} `orm:"model_id" json:"modelId"` // 模型id + Detail interface{} `orm:"detail" json:"detail"` // 地图上的参数信息 + Xiangbianid interface{} `orm:"xiangbianid" json:"xiangbianid"` // 箱变id + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + ShapeLeng string `orm:"shape_leng" json:"shapeLeng"` // 长 + ShapeArea string `orm:"shape_area" json:"shapeArea"` // 面 +} diff --git a/internal/app/system/model/do/qianqi_pingchang.go b/internal/app/system/model/do/qianqi_pingchang.go new file mode 100644 index 0000000..970f582 --- /dev/null +++ b/internal/app/system/model/do/qianqi_pingchang.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-08 10:08:24 +// 生成路径: internal/app/system/model/entity/qianqi_pingchang.go +// 生成人:gfast +// desc:平场数据 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiPingchang is the golang structure for table qianqi_pingchang. +type QianqiPingchang struct { + gmeta.Meta `orm:"table:qianqi_pingchang, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // + CreateAt *gtime.Time `orm:"create_at" json:"createAt"` // + UpdateAt *gtime.Time `orm:"update_at" json:"updateAt"` // + DeleteAt *gtime.Time `orm:"delete_at" json:"deleteAt"` // + ProjectId interface{} `orm:"project_id" json:"projectId"` // '项目id' + PcId interface{} `orm:"pc_id" json:"pcId"` // '平场id' + PcName interface{} `orm:"pc_name" json:"pcName"` // '平场范围名称' + GridWidth interface{} `orm:"grid_width" json:"gridWidth"` // '采点精度' + Progress interface{} `orm:"progress" json:"progress"` // '计算进度' + Range interface{} `orm:"range" json:"range"` // '平场范围' + Points interface{} `orm:"points" json:"points"` // '平滑处理前的高程点' + SmoothPoints interface{} `orm:"smooth_points" json:"smoothPoints"` // '平滑处理后的高程点' + Shp interface{} `orm:"shp" json:"shp"` // '经过计算生成的shp文件' + Area interface{} `orm:"area" json:"area"` // '面积' + Cut interface{} `orm:"cut" json:"cut"` // '挖方' + Fill interface{} `orm:"fill" json:"fill"` // '填方' + Total interface{} `orm:"total" json:"total"` // '挖填平衡值' + Imported interface{} `orm:"imported" json:"imported"` // '是否为导入的值' +} diff --git a/internal/app/system/model/do/qianqi_redline.go b/internal/app/system/model/do/qianqi_redline.go new file mode 100644 index 0000000..50a2021 --- /dev/null +++ b/internal/app/system/model/do/qianqi_redline.go @@ -0,0 +1,30 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-31 11:45:12 +// 生成路径: internal/app/system/model/entity/qianqi_redline.go +// 生成人:gfast +// desc:红线 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiRedline is the golang structure for table qianqi_redline. +type QianqiRedline struct { + gmeta.Meta `orm:"table:qianqi_redline, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + Name interface{} `orm:"name" json:"name"` // 名称 + SourceId interface{} `orm:"source_id" json:"sourceId"` // 资源ID + SourcePath interface{} `orm:"source_path" json:"sourcePath"` // 资源路径 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/qianqi_redline_tudiliuzhuan.go b/internal/app/system/model/do/qianqi_redline_tudiliuzhuan.go new file mode 100644 index 0000000..0168e41 --- /dev/null +++ b/internal/app/system/model/do/qianqi_redline_tudiliuzhuan.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-04 11:47:15 +// 生成路径: internal/app/system/model/entity/qianqi_redline_tudiliuzhuan.go +// 生成人:gfast +// desc:土地流转 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiRedlineTudiliuzhuan is the golang structure for table qianqi_redline_tudiliuzhuan. +type QianqiRedlineTudiliuzhuan struct { + gmeta.Meta `orm:"table:qianqi_redline_tudiliuzhuan, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + Name interface{} `orm:"name" json:"name"` // 红线名称 + SourceId interface{} `orm:"source_id" json:"sourceId"` // 资源id + SourcePath interface{} `orm:"source_path" json:"sourcePath"` // 资源路径 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + SourceType interface{} `orm:"source_type" json:"sourceType"` // +} diff --git a/internal/app/system/model/do/qianqi_road.go b/internal/app/system/model/do/qianqi_road.go new file mode 100644 index 0000000..ab20e8f --- /dev/null +++ b/internal/app/system/model/do/qianqi_road.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-04 16:24:38 +// 生成路径: internal/app/system/model/entity/qianqi_road.go +// 生成人:gfast +// desc:道路 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiRoad is the golang structure for table qianqi_road. +type QianqiRoad struct { + gmeta.Meta `orm:"table:qianqi_road, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + Name interface{} `orm:"name" json:"name"` // 名称 + SourceId interface{} `orm:"source_id" json:"sourceId"` // 资源id + SourcePath interface{} `orm:"source_path" json:"sourcePath"` // 资源路径 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + SourceType interface{} `orm:"source_type" json:"sourceType"` // 资源类型 + Detail interface{} `orm:"detail" json:"detail"` // 坐标信息 + +} diff --git a/internal/app/system/model/do/qianqi_xiangbian.go b/internal/app/system/model/do/qianqi_xiangbian.go new file mode 100644 index 0000000..dd77509 --- /dev/null +++ b/internal/app/system/model/do/qianqi_xiangbian.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-31 09:52:13 +// 生成路径: internal/app/system/model/entity/qianqi_xiangbian.go +// 生成人:gfast +// desc:箱变 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiXiangbian is the golang structure for table qianqi_xiangbian. +type QianqiXiangbian struct { + gmeta.Meta `orm:"table:qianqi_xiangbian, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + ProjectId interface{} `orm:"project_id,primary" json:"projectId"` // 项目id + Name interface{} `orm:"name" json:"name"` // 名称 + SourceId interface{} `orm:"source_id" json:"sourceId"` // 资源ID + ModelId interface{} `orm:"model_id" json:"modelId"` // 模型ID + Detail interface{} `orm:"detail" json:"detail"` // 详情 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/reminders.go b/internal/app/system/model/do/reminders.go new file mode 100644 index 0000000..3b8460c --- /dev/null +++ b/internal/app/system/model/do/reminders.go @@ -0,0 +1,25 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// Reminders is the golang structure of table reminders for DAO operations like Where/Data. +type Reminders struct { + g.Meta `orm:"table:reminders, do:true"` + Id interface{} // + UserId interface{} // 消息接收者ID + ReminderType interface{} // 提醒类型 0 安全整改 | 1 质量整改 | 2 AI | 3 钉钉上班 | 4 钉钉下班 + Title interface{} // 标题 + ViolationType interface{} // 违章类型 + ProjectId interface{} // 项目ID + CreatedAt *gtime.Time // + IsRead interface{} // 0 未读 | 1 已读 + Status interface{} // 0 提醒 | 1 整改 | 2 复检 + OrderId interface{} // 对应跳转的主键ID +} diff --git a/internal/app/system/model/do/sub_project.go b/internal/app/system/model/do/sub_project.go new file mode 100644 index 0000000..1c4f5c1 --- /dev/null +++ b/internal/app/system/model/do/sub_project.go @@ -0,0 +1,20 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// SubProject is the golang structure of table sub_project for DAO operations like Where/Data. +type SubProject struct { + g.Meta `orm:"table:sub_project, do:true"` + Id interface{} // 主键ID + ProjectId interface{} // 项目ID + ProjectName interface{} // 子项目名 + CreatedAt *gtime.Time // + DoneTime interface{} // 结束日期 +} diff --git a/internal/app/system/model/do/sys_auth_rule.go b/internal/app/system/model/do/sys_auth_rule.go new file mode 100644 index 0000000..3efd7af --- /dev/null +++ b/internal/app/system/model/do/sys_auth_rule.go @@ -0,0 +1,37 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// SysAuthRule is the golang structure of table sys_auth_rule for DAO operations like Where/Data. +type SysAuthRule struct { + g.Meta `orm:"table:sys_auth_rule, do:true"` + Id interface{} // + Pid interface{} // 父ID + Name interface{} // 规则名称 + Title interface{} // 规则名称 + Icon interface{} // 图标 + Condition interface{} // 条件 + Remark interface{} // 备注 + MenuType interface{} // 类型 0目录 1菜单 2按钮 + Weigh interface{} // 权重 + IsHide interface{} // 显示状态 + Path interface{} // 路由地址 + Component interface{} // 组件路径 + IsLink interface{} // 是否外链 1是 0否 + ModuleType interface{} // 所属模块 + ModelId interface{} // 模型ID + IsIframe interface{} // 是否内嵌iframe + IsCached interface{} // 是否缓存 + Redirect interface{} // 路由重定向地址 + IsAffix interface{} // 是否固定 + LinkUrl interface{} // 链接地址 + CreatedAt *gtime.Time // 创建日期 + UpdatedAt *gtime.Time // 修改日期 +} diff --git a/internal/app/system/model/do/sys_dept.go b/internal/app/system/model/do/sys_dept.go new file mode 100644 index 0000000..6139fbc --- /dev/null +++ b/internal/app/system/model/do/sys_dept.go @@ -0,0 +1,29 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// SysDept is the golang structure of table sys_dept for DAO operations like Where/Data. +type SysDept struct { + g.Meta `orm:"table:sys_dept, do:true"` + DeptId interface{} // 部门id + ParentId interface{} // 父部门id + Ancestors interface{} // 祖级列表 + DeptName interface{} // 部门名称 + OrderNum interface{} // 显示顺序 + Leader interface{} // 负责人 + Phone interface{} // 联系电话 + Email interface{} // 邮箱 + Status interface{} // 部门状态(0正常 1停用) + CreatedBy interface{} // 创建人 + UpdatedBy interface{} // 修改人 + CreatedAt *gtime.Time // 创建时间 + UpdatedAt *gtime.Time // 修改时间 + DeletedAt *gtime.Time // 删除时间 +} diff --git a/internal/app/system/model/do/sys_file.go b/internal/app/system/model/do/sys_file.go new file mode 100644 index 0000000..82e8916 --- /dev/null +++ b/internal/app/system/model/do/sys_file.go @@ -0,0 +1,34 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-29 15:32:09 +// 生成路径: internal/app/system/model/entity/sys_file.go +// 生成人:gfast +// desc:文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysFile is the golang structure for table sys_file. +type SysFile struct { + gmeta.Meta `orm:"table:sys_file, do:true"` + FileId interface{} `orm:"file_id,primary" json:"fileId"` // 文件id + ParentId interface{} `orm:"parent_id" json:"parentId"` // 父文件id + Ancestors interface{} `orm:"ancestors" json:"ancestors"` // 祖级列表 + FileName interface{} `orm:"file_name" json:"fileName"` // 文件名称 + OrderNum interface{} `orm:"order_num" json:"orderNum"` // 显示顺序 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + FileTypeId interface{} `orm:"file_type_id" json:"fileTypeId"` // 文件夹类型id + Leader interface{} `orm:"leader" json:"leader"` // 负责人 + Status interface{} `orm:"status" json:"status"` // 文件状态 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/sys_file_type.go b/internal/app/system/model/do/sys_file_type.go new file mode 100644 index 0000000..55bc9e9 --- /dev/null +++ b/internal/app/system/model/do/sys_file_type.go @@ -0,0 +1,28 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-29 15:27:54 +// 生成路径: internal/app/system/model/entity/sys_file_type.go +// 生成人:gfast +// desc:文件类型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysFileType is the golang structure for table sys_file_type. +type SysFileType struct { + gmeta.Meta `orm:"table:sys_file_type, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + FileTypeName interface{} `orm:"file_type_name" json:"fileTypeName"` // 文件类型 + Status interface{} `orm:"status" json:"status"` // 文件状态 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/sys_job.go b/internal/app/system/model/do/sys_job.go new file mode 100644 index 0000000..f690859 --- /dev/null +++ b/internal/app/system/model/do/sys_job.go @@ -0,0 +1,34 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-01-12 17:43:50 +// 生成路径: internal/app/system/model/entity/sys_job.go +// 生成人:gfast +// desc:定时任务 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysJob is the golang structure for table sys_job. +type SysJob struct { + gmeta.Meta `orm:"table:sys_job, do:true"` + JobId interface{} `orm:"job_id,primary" json:"jobId"` // 任务ID + JobName interface{} `orm:"job_name" json:"jobName"` // 任务名称 + JobParams interface{} `orm:"job_params" json:"jobParams"` // 参数 + JobGroup interface{} `orm:"job_group" json:"jobGroup"` // 任务组名 + InvokeTarget interface{} `orm:"invoke_target" json:"invokeTarget"` // 任务方法 + CronExpression interface{} `orm:"cron_expression" json:"cronExpression"` // cron执行表达式 + MisfirePolicy interface{} `orm:"misfire_policy" json:"misfirePolicy"` // 计划执行策略 + Concurrent interface{} `orm:"concurrent" json:"concurrent"` // 是否并发执行 + Status interface{} `orm:"status" json:"status"` // 状态 + CreatedBy interface{} `orm:"created_by" json:"createdBy"` // 创建者 + UpdatedBy interface{} `orm:"updated_by" json:"updatedBy"` // 更新者 + Remark interface{} `orm:"remark" json:"remark"` // 备注信息 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 +} diff --git a/internal/app/system/model/do/sys_job_log.go b/internal/app/system/model/do/sys_job_log.go new file mode 100644 index 0000000..424e3fc --- /dev/null +++ b/internal/app/system/model/do/sys_job_log.go @@ -0,0 +1,19 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// SysJobLog is the golang structure of table sys_job_log for DAO operations like Where/Data. +type SysJobLog struct { + g.Meta `orm:"table:sys_job_log, do:true"` + Id interface{} // 主键 + TargetName interface{} // 方法名 + CreatedAt *gtime.Time // 执行日期 + Result interface{} // 执行结果 +} diff --git a/internal/app/system/model/do/sys_login_log.go b/internal/app/system/model/do/sys_login_log.go new file mode 100644 index 0000000..d68762e --- /dev/null +++ b/internal/app/system/model/do/sys_login_log.go @@ -0,0 +1,25 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. Created at 2022-03-08 11:31:48 +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// SysLoginLog is the golang structure of table sys_login_log for DAO operations like Where/Data. +type SysLoginLog struct { + g.Meta `orm:"table:sys_login_log, do:true"` + InfoId interface{} // 访问ID + LoginName interface{} // 登录账号 + Ipaddr interface{} // 登录IP地址 + LoginLocation interface{} // 登录地点 + Browser interface{} // 浏览器类型 + Os interface{} // 操作系统 + Status interface{} // 登录状态(0成功 1失败) + Msg interface{} // 提示消息 + LoginTime *gtime.Time // 登录时间 + Module interface{} // 登录模块 +} diff --git a/internal/app/system/model/do/sys_oper_log.go b/internal/app/system/model/do/sys_oper_log.go new file mode 100644 index 0000000..0e3f32b --- /dev/null +++ b/internal/app/system/model/do/sys_oper_log.go @@ -0,0 +1,29 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// SysOperLog is the golang structure of table sys_oper_log for DAO operations like Where/Data. +type SysOperLog struct { + g.Meta `orm:"table:sys_oper_log, do:true"` + OperId interface{} // 日志主键 + Title interface{} // 模块标题 + BusinessType interface{} // 业务类型(0其它 1新增 2修改 3删除) + Method interface{} // 方法名称 + RequestMethod interface{} // 请求方式 + OperatorType interface{} // 操作类别(0其它 1后台用户 2手机端用户) + OperName interface{} // 操作人员 + DeptName interface{} // 部门名称 + OperUrl interface{} // 请求URL + OperIp interface{} // 主机地址 + OperLocation interface{} // 操作地点 + OperParam interface{} // 请求参数 + ErrorMsg interface{} // 错误消息 + OperTime *gtime.Time // 操作时间 +} diff --git a/internal/app/system/model/do/sys_post.go b/internal/app/system/model/do/sys_post.go new file mode 100644 index 0000000..c6e7189 --- /dev/null +++ b/internal/app/system/model/do/sys_post.go @@ -0,0 +1,26 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. Created at 2022-04-07 23:26:21 +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// SysPost is the golang structure of table sys_post for DAO operations like Where/Data. +type SysPost struct { + g.Meta `orm:"table:sys_post, do:true"` + PostId interface{} // 岗位ID + PostCode interface{} // 岗位编码 + PostName interface{} // 岗位名称 + PostSort interface{} // 显示顺序 + Status interface{} // 状态(0正常 1停用) + Remark interface{} // 备注 + CreatedBy interface{} // 创建人 + UpdatedBy interface{} // 修改人 + CreatedAt *gtime.Time // 创建时间 + UpdatedAt *gtime.Time // 修改时间 + DeletedAt *gtime.Time // 删除时间 +} diff --git a/internal/app/system/model/do/sys_project.go b/internal/app/system/model/do/sys_project.go new file mode 100644 index 0000000..a4f2dc8 --- /dev/null +++ b/internal/app/system/model/do/sys_project.go @@ -0,0 +1,49 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-27 15:20:49 +// 生成路径: internal/app/system/model/entity/sys_project.go +// 生成人:gfast +// desc:项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysProject is the golang structure for table sys_project. +type SysProject struct { + gmeta.Meta `orm:"table:sys_project, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + ProjectName interface{} `orm:"project_name,omitempty" json:"projectName"` // 项目名称 + ShortName interface{} `orm:"short_name,omitempty" json:"shortName"` // 项目简称 + PId interface{} `orm:"p_id,omitempty" json:"pId"` // 父id + Status interface{} `orm:"status,omitempty" json:"status"` // 状态(0正常 1停用) + PicUrl interface{} `orm:"pic_url,omitempty" json:"picUrl"` // 项目图片 + CreateBy interface{} `orm:"create_by,omitempty" json:"createBy"` // 创建者 + CreateTime *gtime.Time `orm:"create_time" json:"createTime"` // 创建时间 + UpdateBy interface{} `orm:"update_by,omitempty" json:"updateBy"` // 更新者 + UpdateTime *gtime.Time `orm:"update_time" json:"updateTime"` // 更新时间 + Lng interface{} `orm:"lng,omitempty" json:"lng"` // 经度 + Lat interface{} `orm:"lat,omitempty" json:"lat"` // 纬度 + Remark interface{} `orm:"remark,omitempty" json:"remark"` // 备注 + Type interface{} `orm:"type,omitempty" json:"type"` // 项目类型 + ColourRgb interface{} `orm:"colour_rgb,omitempty" json:"colourRgb"` // 展示颜色 + DeletedAt interface{} `orm:"deleted_at" json:"deletedAt"` // 删除时间 + IsType interface{} `orm:"is_type" json:"isType"` // 项目类型(1光伏 2风电) + Sort interface{} `orm:"sort" json:"sort"` // 排序字段 + ShowHidden interface{} `orm:"show_hidden" json:"showHidden"` // 显示隐藏(1显示 2隐藏) + + ProjectSite interface{} `orm:"project_site,omitempty" json:"projectSite"` // 项目地址 + PrincipalXz interface{} `orm:"principal_xz,omitempty" json:"principalXz"` // 小程序薪资负责人 + Principal interface{} `orm:"principal,omitempty" json:"principal"` // 负责人 + PrincipalPhone interface{} `orm:"principal_phone,omitempty" json:"principalPhone"` // 负责人电话 + Actual interface{} `orm:"actual,omitempty" json:"actual"` // 实际容量 + Plan interface{} `orm:"plan,omitempty" json:"plan"` // 计划容量 + OnStreamTime interface{} `orm:"on_stream_time,omitempty" json:"onStreamTime"` // 开工时间 + PunchRange interface{} `orm:"punch_range,omitempty" json:"punchRange"` // 打卡范围 + DesignTotal interface{} `orm:"design_total,omitempty" json:"designTotal"` // 设计总量 +} diff --git a/internal/app/system/model/do/sys_project_introduce.go b/internal/app/system/model/do/sys_project_introduce.go new file mode 100644 index 0000000..5bec637 --- /dev/null +++ b/internal/app/system/model/do/sys_project_introduce.go @@ -0,0 +1,28 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-29 10:05:03 +// 生成路径: internal/app/system/model/entity/sys_project_introduce.go +// 生成人:gfast +// desc:项目新闻 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysProjectIntroduce is the golang structure for table sys_project_introduce. +type SysProjectIntroduce struct { + gmeta.Meta `orm:"table:sys_project_introduce, do:true"` + ProjectId interface{} `orm:"project_id,primary" json:"projectId"` // 项目id + Headline interface{} `orm:"headline" json:"headline"` // 标题 + RichText interface{} `orm:"rich_text" json:"richText"` // 富文本 + CreatedBy interface{} `orm:"created_by" json:"createdBy"` // 创建人 + UpdatedBy interface{} `orm:"updated_by" json:"updatedBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/sys_project_value.go b/internal/app/system/model/do/sys_project_value.go new file mode 100644 index 0000000..e1af3e4 --- /dev/null +++ b/internal/app/system/model/do/sys_project_value.go @@ -0,0 +1,26 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-27 12:55:26 +// 生成路径: internal/app/system/model/entity/sys_project_value.go +// 生成人:xiaoyang +// desc:projectValue +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysProjectValue is the golang structure for table sys_project_value. +type SysProjectValue struct { + gmeta.Meta `orm:"table:sys_project_value, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键id + ProId interface{} `orm:"pro_id" json:"proId"` // 项目id + Year interface{} `orm:"year" json:"year"` // 年 + Month interface{} `orm:"month" json:"month"` // 月 + ProValue interface{} `orm:"pro_value" json:"proValue"` // 项目产值 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 +} diff --git a/internal/app/system/model/do/sys_role.go b/internal/app/system/model/do/sys_role.go new file mode 100644 index 0000000..47e9599 --- /dev/null +++ b/internal/app/system/model/do/sys_role.go @@ -0,0 +1,23 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// SysRole is the golang structure of table sys_role for DAO operations like Where/Data. +type SysRole struct { + g.Meta `orm:"table:sys_role, do:true"` + Id interface{} // + Status interface{} // 状态;0:禁用;1:正常 + ListOrder interface{} // 排序 + Name interface{} // 角色名称 + Remark interface{} // 备注 + DataScope interface{} // 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) + CreatedAt *gtime.Time // 创建时间 + UpdatedAt *gtime.Time // 更新时间 +} diff --git a/internal/app/system/model/do/sys_role_dept.go b/internal/app/system/model/do/sys_role_dept.go new file mode 100644 index 0000000..df1a1ad --- /dev/null +++ b/internal/app/system/model/do/sys_role_dept.go @@ -0,0 +1,16 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" +) + +// SysRoleDept is the golang structure of table sys_role_dept for DAO operations like Where/Data. +type SysRoleDept struct { + g.Meta `orm:"table:sys_role_dept, do:true"` + RoleId interface{} // 角色ID + DeptId interface{} // 部门ID +} diff --git a/internal/app/system/model/do/sys_user.go b/internal/app/system/model/do/sys_user.go new file mode 100644 index 0000000..eb6586b --- /dev/null +++ b/internal/app/system/model/do/sys_user.go @@ -0,0 +1,37 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. Created at 2022-03-02 16:48:23 +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// SysUser is the golang structure of table sys_user for DAO operations like Where/Data. +type SysUser struct { + g.Meta `orm:"table:sys_user, do:true"` + Id interface{} // + UserName interface{} // 用户名 + Mobile interface{} // 中国手机不带国家代码,国际手机号格式为:国家代码-手机号 + UserNickname interface{} // 用户昵称 + Birthday interface{} // 生日 + UserPassword interface{} // 登录密码;cmf_password加密 + UserSalt interface{} // 加密盐 + UserStatus interface{} // 用户状态;0:禁用,1:正常,2:未验证 + UserEmail interface{} // 用户登录邮箱 + Sex interface{} // 性别;0:保密,1:男,2:女 + Avatar interface{} // 用户头像 + DeptId interface{} // 部门id + Remark interface{} // 备注 + IsAdmin interface{} // 是否后台管理员 1 是 0 否 + IsData interface{} // 项目备案 1查看所有数据 2仅自己 + Address interface{} // 联系地址 + Describe interface{} // 描述信息 + LastLoginIp interface{} // 最后登录ip + LastLoginTime *gtime.Time // 最后登录时间 + CreatedAt *gtime.Time // 创建时间 + UpdatedAt *gtime.Time // 更新时间 + DeletedAt *gtime.Time // 删除时间 +} diff --git a/internal/app/system/model/do/sys_user_online.go b/internal/app/system/model/do/sys_user_online.go new file mode 100644 index 0000000..f47ec4b --- /dev/null +++ b/internal/app/system/model/do/sys_user_online.go @@ -0,0 +1,23 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// SysUserOnline is the golang structure of table sys_user_online for DAO operations like Where/Data. +type SysUserOnline struct { + g.Meta `orm:"table:sys_user_online, do:true"` + Id interface{} // + Uuid interface{} // 用户标识 + Token interface{} // 用户token + CreateTime *gtime.Time // 登录时间 + UserName interface{} // 用户名 + Ip interface{} // 登录ip + Explorer interface{} // 浏览器 + Os interface{} // 操作系统 +} diff --git a/internal/app/system/model/do/sys_user_post.go b/internal/app/system/model/do/sys_user_post.go new file mode 100644 index 0000000..a06c02d --- /dev/null +++ b/internal/app/system/model/do/sys_user_post.go @@ -0,0 +1,16 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" +) + +// SysUserPost is the golang structure of table sys_user_post for DAO operations like Where/Data. +type SysUserPost struct { + g.Meta `orm:"table:sys_user_post, do:true"` + UserId interface{} // 用户ID + PostId interface{} // 岗位ID +} diff --git a/internal/app/system/model/do/sys_user_project.go b/internal/app/system/model/do/sys_user_project.go new file mode 100644 index 0000000..474f429 --- /dev/null +++ b/internal/app/system/model/do/sys_user_project.go @@ -0,0 +1,22 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-27 15:20:52 +// 生成路径: internal/app/system/model/entity/sys_user_project.go +// 生成人:gfast +// desc:用户和项目关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysUserProject is the golang structure for table sys_user_project. +type SysUserProject struct { + gmeta.Meta `orm:"table:sys_user_project, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + UserId interface{} `orm:"user_id" json:"userId"` // 用户 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目 +} diff --git a/internal/app/system/model/do/sys_wechat_role.go b/internal/app/system/model/do/sys_wechat_role.go new file mode 100644 index 0000000..0968858 --- /dev/null +++ b/internal/app/system/model/do/sys_wechat_role.go @@ -0,0 +1,27 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-01-22 15:05:43 +// 生成路径: internal/app/system/model/entity/sys_wechat_role.go +// 生成人:gfast +// desc:微信角色 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysWechatRole is the golang structure for table sys_wechat_role. +type SysWechatRole struct { + gmeta.Meta `orm:"table:sys_wechat_role, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + Name interface{} `orm:"name" json:"name"` // 角色名称 + ListOrder interface{} `orm:"list_order" json:"listOrder"` // 排序 + Remark interface{} `orm:"remark" json:"remark"` // 备注 + Status interface{} `orm:"status" json:"status"` // 状态 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 修改时间 +} diff --git a/internal/app/system/model/do/template_data.go b/internal/app/system/model/do/template_data.go new file mode 100644 index 0000000..520678d --- /dev/null +++ b/internal/app/system/model/do/template_data.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-12-08 14:21:01 +// 生成路径: internal/app/system/model/entity/template_data.go +// 生成人:gfast +// desc:工程资料>资料 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// TemplateData is the golang structure for table template_data. +type TemplateData struct { + gmeta.Meta `orm:"table:template_data, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键id + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + DataName interface{} `orm:"data_name" json:"dataName"` // 名称 + DataType interface{} `orm:"data_type" json:"dataType"` // 1编写 2存储 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/template_data_junior.go b/internal/app/system/model/do/template_data_junior.go new file mode 100644 index 0000000..00d53e9 --- /dev/null +++ b/internal/app/system/model/do/template_data_junior.go @@ -0,0 +1,30 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-12-08 14:21:01 +// 生成路径: internal/app/system/model/entity/template_data_junior.go +// 生成人:gfast +// desc:工程资料>资料>下级模板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// TemplateDataJunior is the golang structure for table template_data_junior. +type TemplateDataJunior struct { + gmeta.Meta `orm:"table:template_data_junior, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + Name interface{} `orm:"name" json:"name"` // 模板名称 + FilenPath interface{} `orm:"filen_path" json:"filenPath"` // 模板文件名 + Suffix interface{} `orm:"suffix" json:"suffix"` // 后缀 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/template_data_source_data.go b/internal/app/system/model/do/template_data_source_data.go new file mode 100644 index 0000000..ffdf18a --- /dev/null +++ b/internal/app/system/model/do/template_data_source_data.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-12-08 10:06:54 +// 生成路径: internal/app/system/model/entity/template_data_source_data.go +// 生成人:gfast +// desc:模板资料源数据 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// TemplateDataSourceData is the golang structure for table template_data_source_data. +type TemplateDataSourceData struct { + gmeta.Meta `orm:"table:template_data_source_data, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + Type interface{} `orm:"type" json:"type"` // 1模板 2资料 + TypeId interface{} `orm:"type_id" json:"typeId"` // 对应数据id + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + SourceName interface{} `orm:"source_name" json:"sourceName"` // 资源名称 + SourceId interface{} `orm:"source_id" json:"sourceId"` // 资源ID + SourcePath interface{} `orm:"source_path" json:"sourcePath"` // 资源路径 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/todo_tasks.go b/internal/app/system/model/do/todo_tasks.go new file mode 100644 index 0000000..10cbb1d --- /dev/null +++ b/internal/app/system/model/do/todo_tasks.go @@ -0,0 +1,27 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// TodoTasks is the golang structure of table todo_tasks for DAO operations like Where/Data. +type TodoTasks struct { + g.Meta `orm:"table:todo_tasks, do:true"` + Id interface{} // + MissingCardTime interface{} // 缺卡时间 + Applicant interface{} // 申请人 + ProjectId interface{} // 项目ID + TaskType interface{} // 0 补卡提醒 | 1 考勤审批 + OrderId interface{} // 对应跳转的主键ID + CreatedAt *gtime.Time // + UserId interface{} // 用户ID + Status interface{} // 0 未处理 | 1 已处理 + Role interface{} // 0 管理员 1 施工人员 + Uuid interface{} // 一组具有相同UUID的消息 + UpdatedAt *gtime.Time // 更新时间 +} diff --git a/internal/app/system/model/do/tools_gen_table.go b/internal/app/system/model/do/tools_gen_table.go new file mode 100644 index 0000000..53dd06c --- /dev/null +++ b/internal/app/system/model/do/tools_gen_table.go @@ -0,0 +1,33 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// ToolsGenTable is the golang structure of table tools_gen_table for DAO operations like Where/Data. +type ToolsGenTable struct { + g.Meta `orm:"table:tools_gen_table, do:true"` + TableId interface{} // 编号 + TableName interface{} // 表名称 + TableComment interface{} // 表描述 + ClassName interface{} // 实体类名称 + TplCategory interface{} // 使用的模板(crud单表操作 tree树表操作) + PackageName interface{} // 生成包路径 + ModuleName interface{} // 生成模块名 + BusinessName interface{} // 生成业务名 + FunctionName interface{} // 生成功能名 + FunctionAuthor interface{} // 生成功能作者 + Options interface{} // 其它生成选项 + CreateTime *gtime.Time // 创建时间 + UpdateTime *gtime.Time // 更新时间 + Remark interface{} // 备注 + Overwrite interface{} // 是否覆盖原有文件 + SortColumn interface{} // 排序字段名 + SortType interface{} // 排序方式 (asc顺序 desc倒序) + ShowDetail interface{} // 是否有查看详情功能 +} diff --git a/internal/app/system/model/do/tools_gen_table_column.go b/internal/app/system/model/do/tools_gen_table_column.go new file mode 100644 index 0000000..c4a58db --- /dev/null +++ b/internal/app/system/model/do/tools_gen_table_column.go @@ -0,0 +1,54 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" +) + +// ToolsGenTableColumn is the golang structure of table tools_gen_table_column for DAO operations like Where/Data. +type ToolsGenTableColumn struct { + g.Meta `orm:"table:tools_gen_table_column, do:true"` + ColumnId interface{} // 编号 + TableId interface{} // 归属表编号 + ColumnName interface{} // 列名称 + ColumnComment interface{} // 列描述 + ColumnType interface{} // 列类型 + GoType interface{} // Go类型 + TsType interface{} // TS类型 + GoField interface{} // Go字段名 + HtmlField interface{} // html字段名 + IsPk interface{} // 是否主键(1是) + IsIncrement interface{} // 是否自增(1是) + IsRequired interface{} // 是否必填(1是) + IsInsert interface{} // 是否为插入字段(1是) + IsEdit interface{} // 是否编辑字段(1是) + IsList interface{} // 是否列表字段(1是) + IsDetail interface{} // 是否详情字段 + IsQuery interface{} // 是否查询字段(1是) + SortOrderEdit interface{} // 插入编辑显示顺序 + SortOrderList interface{} // 列表显示顺序 + SortOrderDetail interface{} // 详情显示顺序 + SortOrderQuery interface{} // 查询显示顺序 + QueryType interface{} // 查询方式(等于、不等于、大于、小于、范围) + HtmlType interface{} // 显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件) + DictType interface{} // 字典类型 + LinkTableName interface{} // 关联表名 + LinkTableClass interface{} // 关联表类名 + LinkTableModuleName interface{} // 关联表模块名 + LinkTableBusinessName interface{} // 关联表业务名 + LinkTablePackage interface{} // 关联表包名 + LinkLabelId interface{} // 关联表键名 + LinkLabelName interface{} // 关联表字段值 + ColSpan interface{} // 详情页占列数 + RowSpan interface{} // 详情页占行数 + IsRowStart interface{} // 详情页为行首 + MinWidth interface{} // 表格最小宽度 + IsFixed interface{} // 是否表格列左固定 + IsOverflowTooltip interface{} // 是否过长自动隐藏 + IsCascade interface{} // 是否级联查询 + ParentColumnName interface{} // 上级字段名 + CascadeColumnName interface{} // 级联查询字段 +} diff --git a/internal/app/system/model/do/user_activity.go b/internal/app/system/model/do/user_activity.go new file mode 100644 index 0000000..5052656 --- /dev/null +++ b/internal/app/system/model/do/user_activity.go @@ -0,0 +1,18 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// UserActivity is the golang structure of table user_activity for DAO operations like Where/Data. +type UserActivity struct { + g.Meta `orm:"table:user_activity, do:true"` + Id interface{} // + UserId interface{} // 用户ID + CreatedAt *gtime.Time // +} diff --git a/internal/app/system/model/do/user_registration.go b/internal/app/system/model/do/user_registration.go new file mode 100644 index 0000000..7a12047 --- /dev/null +++ b/internal/app/system/model/do/user_registration.go @@ -0,0 +1,25 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-07-26 15:32:12 +// 生成路径: internal/app/system/model/entity/user_registration.go +// 生成人:gfast +// desc:极光推送 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// UserRegistration is the golang structure for table user_registration. +type UserRegistration struct { + gmeta.Meta `orm:"table:user_registration, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // + UserId interface{} `orm:"user_id" json:"userId"` // 用户ID + OpenId interface{} `orm:"open_id" json:"openId"` // 微信 open_id + RegistrationId interface{} `orm:"registration_id" json:"registrationId"` // 极光推送 设备唯一标识 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // +} diff --git a/internal/app/system/model/do/work_schedule.go b/internal/app/system/model/do/work_schedule.go new file mode 100644 index 0000000..551cc7a --- /dev/null +++ b/internal/app/system/model/do/work_schedule.go @@ -0,0 +1,26 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// WorkSchedule is the golang structure of table work_schedule for DAO operations like Where/Data. +type WorkSchedule struct { + g.Meta `orm:"table:work_schedule, do:true"` + Id interface{} // + WorkId interface{} // 关联的工作ID + StartAt *gtime.Time // 开始时间 + Detail interface{} // 每天详细数据 + Status interface{} // 状态 + PlanNum interface{} // 计划数量 + FinishedNum interface{} // 完成量 + EndAt *gtime.Time // 结束时间 + ProjectId interface{} // 主项目ID + SubProjectid interface{} // 子项目ID + FangzhenId interface{} // 方阵ID +} diff --git a/internal/app/system/model/do/work_status.go b/internal/app/system/model/do/work_status.go new file mode 100644 index 0000000..c8a1d5c --- /dev/null +++ b/internal/app/system/model/do/work_status.go @@ -0,0 +1,31 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// WorkStatus is the golang structure of table work_status for DAO operations like Where/Data. +type WorkStatus struct { + g.Meta `orm:"table:work_status, do:true"` + Id interface{} // + FangzhenId interface{} // 方阵ID + Parent interface{} // 父节点 + WorkId interface{} // 工作id + WorkName interface{} // 工作名称 + Total interface{} // 总量 + Finished interface{} // 完成量 + StartAt *gtime.Time // 开始时间 + EndAt *gtime.Time // 工作结束时间 + Status interface{} // 状态 0未开始 1 进行中 2 已完成 3 已延期 + CreatedAt *gtime.Time // + Type interface{} // 类型 + IsPercent interface{} // 是否为百分比 + ProjectId interface{} // 项目ID + SubProjectid interface{} // 子项目ID + IsDelay interface{} // 0 未延期 | 1 延期 +} diff --git a/internal/app/system/model/do/xiangmuhuafenbiao.go b/internal/app/system/model/do/xiangmuhuafenbiao.go new file mode 100644 index 0000000..2e44500 --- /dev/null +++ b/internal/app/system/model/do/xiangmuhuafenbiao.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-10-07 16:08:10 +// 生成路径: internal/app/system/model/entity/xiangmuhuafenbiao.go +// 生成人:gfast +// desc:项目划分 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// Xiangmuhuafenbiao is the golang structure for table xiangmuhuafenbiao. +type Xiangmuhuafenbiao struct { + gmeta.Meta `orm:"table:xiangmuhuafenbiao, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // + Danweigongcheng interface{} `orm:"danweigongcheng,primary" json:"danweigongcheng"` // 单位 工程 + Zidanweigongcheng interface{} `orm:"zidanweigongcheng,primary" json:"zidanweigongcheng"` // 子单位工程 + Fenbugongcheng interface{} `orm:"fenbugongcheng,primary" json:"fenbugongcheng"` // 分部 工程 + Zifenbugongcheng interface{} `orm:"zifenbugongcheng,primary" json:"zifenbugongcheng"` // 子分部工程 + Fenxianggongcheng interface{} `orm:"fenxianggongcheng,primary" json:"fenxianggongcheng"` // 分项 工程 + Jianyanpi interface{} `orm:"jianyanpi,primary" json:"jianyanpi"` // 检验批 + Name interface{} `orm:"name,primary" json:"name"` // 工 程 项 目 名 称 + Zhixingbiaohao interface{} `orm:"zhixingbiaohao,primary" json:"zhixingbiaohao"` // 执行表号 + Json interface{} `orm:"json" json:"json"` // json数据文件路径 + PrintStatus interface{} `orm:"print_status,primary" json:"printStatus"` // 打印状态 + ProjectId interface{} `orm:"project_id,primary" json:"projectId"` // 项目id + CreateBy interface{} `orm:"create_by,primary" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by,primary" json:"updateBy"` // 更新人 + CreateddAt *gtime.Time `orm:"createdd_at" json:"createddAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/do/ys7devices.go b/internal/app/system/model/do/ys7devices.go new file mode 100644 index 0000000..15320d5 --- /dev/null +++ b/internal/app/system/model/do/ys7devices.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-01 12:49:32 +// 生成路径: internal/app/system/model/entity/ys7devices.go +// 生成人:gfast +// desc:荧石摄像头 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// Ys7Devices is the golang structure for table ys7devices. +type Ys7Devices struct { + gmeta.Meta `orm:"table:ys7devices, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // id + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // + DeviceSerial interface{} `orm:"DeviceSerial" json:"deviceSerial"` // 设备串号 + DeviceName interface{} `orm:"DeviceName" json:"deviceName"` // 设备名称 + DeviceType interface{} `orm:"DeviceType" json:"deviceType"` // 设备类型 + Status interface{} `orm:"Status" json:"status"` // 状态 + Defence interface{} `orm:"Defence" json:"defence"` // + DeviceVersion interface{} `orm:"DeviceVersion" json:"deviceVersion"` // 设备版本 + ProjectId interface{} `orm:"ProjectId" json:"projectId"` // 项目ID + Detail interface{} `orm:"Detail" json:"detail"` // 详情 + Position interface{} `orm:"Position" json:"position"` // 位置 + ReMark interface{} `orm:"Remark" json:"remark"` // 备注 + Sort interface{} `orm:"Sort" json:"sort"` // 备注 +} diff --git a/internal/app/system/model/do/ys7devices_img.go b/internal/app/system/model/do/ys7devices_img.go new file mode 100644 index 0000000..4bc2c10 --- /dev/null +++ b/internal/app/system/model/do/ys7devices_img.go @@ -0,0 +1,25 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-08-19 11:51:53 +// 生成路径: internal/app/system/model/entity/ys7devices_img.go +// 生成人:gfast +// desc:摄像头所拍摄到的所有图片(每月会定时清除) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// Ys7DevicesImg is the golang structure for table ys7devices_img. +type Ys7DevicesImg struct { + gmeta.Meta `orm:"table:ys7devices_img, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + FatherId interface{} `orm:"father_id" json:"fatherId"` // 父id + Name interface{} `orm:"name" json:"name"` // 摄像头名称 + Path interface{} `orm:"path" json:"path"` // 图片路径 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 拍摄时间 +} diff --git a/internal/app/system/model/do/zmkg_gis_model_lib.go b/internal/app/system/model/do/zmkg_gis_model_lib.go new file mode 100644 index 0000000..0bb6896 --- /dev/null +++ b/internal/app/system/model/do/zmkg_gis_model_lib.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-31 10:18:14 +// 生成路径: internal/app/system/model/entity/zmkg_gis_model_lib.go +// 生成人:gfast +// desc:模型库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ZmkgGisModelLib is the golang structure for table zmkg_gis_model_lib. +type ZmkgGisModelLib struct { + gmeta.Meta `orm:"table:zmkg_gis_model_lib, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + ModelId interface{} `orm:"model_id" json:"modelId"` // 模型id + ModelName interface{} `orm:"model_name" json:"modelName"` // 模型名称 + Url interface{} `orm:"url" json:"url"` // 模型地址 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreateAt *gtime.Time `orm:"create_at" json:"createAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/document.go b/internal/app/system/model/document.go new file mode 100644 index 0000000..3d30e5a --- /dev/null +++ b/internal/app/system/model/document.go @@ -0,0 +1,82 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-09-16 10:32:04 +// 生成路径: internal/app/system/model/document.go +// 生成人:gfast +// desc:母板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// DocumentInfoRes is the golang structure for table document. +type DocumentInfoRes struct { + gmeta.Meta `orm:"table:document"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + IdStr string `orm:"id_str" json:"idStr"` // 父级(0代表顶级) + Pid string `orm:"pid" json:"pid"` // 父级(0代表顶级) + Name string `orm:"name" json:"name" dc:"模板名称"` // 模板名称 + FilenPath string `orm:"filen_path" json:"filenPath" dc:"模板路径"` // 模板路径 + Suffix string `orm:"suffix" json:"suffix" dc:"文件后缀"` // 后缀 + Type string `orm:"type" json:"type" dc:"文件类型"` // 类型(1文件-2文件夹) + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + //Json string `orm:"json" json:"json"` // 删除时间 +} + +type DocumentListRes struct { + Id int64 `json:"id"` + IdStr string `json:"idStr"` + Pid string `json:"pid"` + Name string `json:"name"` + FilenPath string `json:"filenPath"` + FilenPathCoding string `json:"filenPathCoding"` + Suffix string `json:"suffix"` + Type string `json:"type"` + CreatedAt *gtime.Time `json:"createdAt"` + IsDuplicate bool `json:"isDuplicate"` + List *DocumentProjectListRes `json:"list"` +} + +type DocumentProjectListRes struct { + Id int64 `json:"id"` + IdStr string `json:"idStr"` + Pid string `json:"pid"` + Name string `json:"name"` + FilePath string `json:"filePath"` + Type string `json:"type"` + Json string `json:"json"` + ProjectId int64 `json:"projectId"` + CreatedAt *gtime.Time `json:"createdAt"` +} + +type TreeStructureRes struct { + gmeta.Meta `orm:"table:document"` + Id int64 `json:"id"` + IdStr string `json:"idStr"` + Pid string `json:"pid"` + Name string `json:"name"` + Type string `json:"type"` + FilenPath string `json:"filenPath"` + TreeStructureRes []*TreeStructureRes `json:"treeStructureRes" orm:"with:pid=id_str, where:type=2 and id_str!=''" ` +} + +// TreeStructureResTwo 不管是文件还是文件夹都可以 +type TreeStructureResTwo struct { + gmeta.Meta `orm:"table:document"` + Id int64 `json:"id"` + IdStr string `json:"idStr"` + Pid string `json:"pid"` + Name string `json:"name"` + Type string `json:"type"` + FilenPath string `json:"filenPath"` + TreeStructureResTwo []*TreeStructureResTwo `json:"treeStructureResTwo" orm:"with:pid=id_str"` +} diff --git a/internal/app/system/model/document_completion.go b/internal/app/system/model/document_completion.go new file mode 100644 index 0000000..b4d001e --- /dev/null +++ b/internal/app/system/model/document_completion.go @@ -0,0 +1,55 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-03-15 10:25:00 +// 生成路径: internal/app/system/model/document_completion.go +// 生成人:gfast +// desc:竣工图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// DocumentCompletionInfoRes is the golang structure for table document_completion. +type DocumentCompletionInfoRes struct { + gmeta.Meta `orm:"table:document_completion"` + Id int64 `orm:"id,primary" json:"id"` // + IdStr string `orm:"id_str" json:"idStr"` // 模板id + Pid string `orm:"pid" json:"pid"` // 父级(0代表顶级) + Name string `orm:"name" json:"name"` // 模板名称 + FilenPath string `orm:"filen_path" json:"filenPath"` // 模板文件名 + Type string `orm:"type" json:"type"` // 类型(1文件-2文件夹) + Suffix string `orm:"suffix" json:"suffix"` // 后缀 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + + State string `orm:"state" json:"state" dc:"状态(1未读、2拒绝、3通过、4无需审核)"` + Remark string `orm:"remark" json:"remark" dc:"拒绝原因"` + FilenPathCoding string `orm:"filenPathCoding" json:"filenPathCoding"` +} + +type DocumentCompletionListRes struct { + Id int64 `json:"id"` + IdStr string `json:"idStr"` + Pid string `json:"pid"` + Name string `json:"name"` + FilenPath string `json:"filenPath"` + Type string `json:"type"` + Suffix string `json:"suffix"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` + ProjectId int64 `json:"projectId"` + + State string `json:"state" dc:"状态(1未读、2拒绝、3通过、4无需审核)"` + Remark string `json:"remark" dc:"拒绝原因"` + FilenPathCoding string `json:"filenPathCoding"` +} diff --git a/internal/app/system/model/document_data.go b/internal/app/system/model/document_data.go new file mode 100644 index 0000000..e9b716d --- /dev/null +++ b/internal/app/system/model/document_data.go @@ -0,0 +1,66 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-12-27 09:30:04 +// 生成路径: internal/app/system/model/document_data.go +// 生成人:gfast +// desc:工程资料>资料 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// DocumentDataInfoRes is the golang structure for table document_data. +type DocumentDataInfoRes struct { + gmeta.Meta `orm:"table:document_data"` + Id int64 `orm:"id,primary" json:"id"` // + ProjectId int64 `orm:"project_id" json:"projectId"` // + IdStr string `orm:"id_str" json:"idStr"` // 模板id + Pid string `orm:"pid" json:"pid"` // 父级(0代表顶级) + Name string `orm:"name" json:"name"` // 模板名称 + FilenPath string `orm:"filen_path" json:"filenPath"` // 模板文件名 + Type string `orm:"type" json:"type"` // 类型(1文件-2文件夹) + Suffix string `orm:"suffix" json:"suffix"` // 后缀 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + FilenPathCoding string `orm:"filenPathCoding" json:"filenPathCoding"` +} + +type DocumentDataListRes struct { + Id int64 `json:"id"` + ProjectId int64 `json:"projectId"` + IdStr string `json:"idStr"` + Pid string `json:"pid"` + Name string `json:"name"` + FilenPath string `json:"filenPath"` + FilenPathCoding string `json:"filenPathCoding"` + Type string `json:"type"` + Suffix string `json:"suffix"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` +} + +type DocumentDataListTwoRes struct { + DocumentDataListRes + ProjectName string `json:"projectName"` + ShortName string `json:"shortName"` +} + +type TreeStructureDataRes struct { + gmeta.Meta `orm:"table:document_data"` + Id int64 `json:"id"` + IdStr string `json:"idStr"` + Pid string `json:"pid"` + Name string `json:"name"` + Type string `json:"type"` + FilenPath string `json:"filenPath"` + TreeStructureDataRes []*TreeStructureDataRes `json:"treeStructureDataRes" orm:"with:pid=id_str, where:type=2 and id_str!=''" ` +} diff --git a/internal/app/system/model/document_production_drawing.go b/internal/app/system/model/document_production_drawing.go new file mode 100644 index 0000000..a73ec81 --- /dev/null +++ b/internal/app/system/model/document_production_drawing.go @@ -0,0 +1,52 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-03-15 10:24:54 +// 生成路径: internal/app/system/model/document_production_drawing.go +// 生成人:gfast +// desc:施工图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// DocumentProductionDrawingInfoRes is the golang structure for table document_production_drawing. +type DocumentProductionDrawingInfoRes struct { + gmeta.Meta `orm:"table:document_production_drawing"` + Id int64 `orm:"id,primary" json:"id"` // + IdStr string `orm:"id_str" json:"idStr"` // 模板id + Pid string `orm:"pid" json:"pid"` // 父级(0代表顶级) + Name string `orm:"name" json:"name"` // 模板名称 + FilenPath string `orm:"filen_path" json:"filenPath"` // 模板文件名 + Type string `orm:"type" json:"type"` // 类型(1文件-2文件夹) + Suffix string `orm:"suffix" json:"suffix"` // 后缀 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + FilenPathCoding string `orm:"filenPathCoding" json:"filenPathCoding"` +} + +type DocumentProductionDrawingListRes struct { + Id int64 `json:"id"` + IdStr string `json:"idStr"` + Pid string `json:"pid"` + Name string `json:"name"` + FilenPath string `json:"filenPath"` + Type string `json:"type"` + Suffix string `json:"suffix"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` + ProjectId int64 `json:"projectId"` + + State string `json:"state" dc:"状态(1未读、2拒绝、3通过、4无需审核)"` + Remark string `json:"remark" dc:"拒绝原因"` + FilenPathCoding string `json:"filenPathCoding"` +} diff --git a/internal/app/system/model/document_project.go b/internal/app/system/model/document_project.go new file mode 100644 index 0000000..03261cb --- /dev/null +++ b/internal/app/system/model/document_project.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-09-16 10:32:03 +// 生成路径: internal/app/system/model/document_project.go +// 生成人:gfast +// desc:项目模板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// DocumentProjectInfoRes is the golang structure for table document_project. +type DocumentProjectInfoRes struct { + gmeta.Meta `orm:"table:document_project"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + IdStr string `orm:"id_str" json:"idStr"` // 父级(0代表顶级) + Pid string `orm:"pid" json:"pid"` // 父级(0代表顶级) + Name string `orm:"name" json:"name"` // 模板名称 + FilePath string `orm:"file_path" json:"filePath"` // 模板路径 + Type string `orm:"type" json:"type"` // 类型(1文件-2文件夹) + Json string `orm:"json" json:"json"` // 保存后的json文件名 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/document_quality_meeting.go b/internal/app/system/model/document_quality_meeting.go new file mode 100644 index 0000000..10fc2a6 --- /dev/null +++ b/internal/app/system/model/document_quality_meeting.go @@ -0,0 +1,51 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-03-25 16:43:56 +// 生成路径: internal/app/system/model/document_quality_meeting.go +// 生成人:gfast +// desc:质量会议 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// DocumentQualityMeetingInfoRes is the golang structure for table document_quality_meeting. +type DocumentQualityMeetingInfoRes struct { + gmeta.Meta `orm:"table:document_quality_meeting"` + Id int64 `orm:"id,primary" json:"id"` // + IdStr string `orm:"id_str" json:"idStr"` // 模板id + Pid string `orm:"pid" json:"pid"` // 父级(0代表顶级) + Name string `orm:"name" json:"name"` // 模板名称 + FilenPath string `orm:"filen_path" json:"filenPath"` // 模板文件名 + Type string `orm:"type" json:"type"` // 类型(1文件-2文件夹) + Suffix string `orm:"suffix" json:"suffix"` // 后缀 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + + FilenPathCoding string `orm:"filenPathCoding" json:"filenPathCoding"` +} + +type DocumentQualityMeetingListRes struct { + Id int64 `json:"id"` + IdStr string `json:"idStr"` + Pid string `json:"pid"` + Name string `json:"name"` + FilenPath string `json:"filenPath"` + Type string `json:"type"` + Suffix string `json:"suffix"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` + ProjectId int64 `json:"projectId"` + + FilenPathCoding string `json:"filenPathCoding"` +} diff --git a/internal/app/system/model/document_report.go b/internal/app/system/model/document_report.go new file mode 100644 index 0000000..2bd0645 --- /dev/null +++ b/internal/app/system/model/document_report.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-03-15 10:24:21 +// 生成路径: internal/app/system/model/document_report.go +// 生成人:gfast +// desc:科研及专题报告 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// DocumentReportInfoRes is the golang structure for table document_report. +type DocumentReportInfoRes struct { + gmeta.Meta `orm:"table:document_report"` + Id int64 `orm:"id,primary" json:"id"` // + IdStr string `orm:"id_str" json:"idStr"` // 模板id + Pid string `orm:"pid" json:"pid"` // 父级(0代表顶级) + Name string `orm:"name" json:"name"` // 模板名称 + FilenPath string `orm:"filen_path" json:"filenPath"` // 模板文件名 + Type string `orm:"type" json:"type"` // 类型(1文件-2文件夹) + Suffix string `orm:"suffix" json:"suffix"` // 后缀 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + + FilenPathCoding string `orm:"filenPathCoding" json:"filenPathCoding"` +} + +type DocumentReportListRes struct { + Id int64 `json:"id"` + IdStr string `json:"idStr"` + Pid string `json:"pid"` + Name string `json:"name"` + FilenPath string `json:"filenPath"` + Type string `json:"type"` + Suffix string `json:"suffix"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` + ProjectId int64 `json:"projectId"` + + State string `json:"state" dc:"状态(1未读、2拒绝、3通过、4无需审核)"` + Remark string `json:"remark" dc:"拒绝原因"` + FilenPathCoding string `json:"filenPathCoding"` +} diff --git a/internal/app/system/model/document_safety_meeting.go b/internal/app/system/model/document_safety_meeting.go new file mode 100644 index 0000000..d7560ac --- /dev/null +++ b/internal/app/system/model/document_safety_meeting.go @@ -0,0 +1,49 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-04-09 11:40:21 +// 生成路径: internal/app/system/model/document_safety_meeting.go +// 生成人:gfast +// desc:安全会议 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// DocumentSafetyMeetingInfoRes is the golang structure for table document_safety_meeting. +type DocumentSafetyMeetingInfoRes struct { + gmeta.Meta `orm:"table:document_safety_meeting"` + Id int64 `orm:"id,primary" json:"id"` // + IdStr string `orm:"id_str" json:"idStr"` // 模板id + Pid string `orm:"pid" json:"pid"` // 父级(0代表顶级) + Name string `orm:"name" json:"name"` // 模板名称 + FilenPath string `orm:"filen_path" json:"filenPath"` // 模板文件名 + Type string `orm:"type" json:"type"` // 类型(1文件-2文件夹) + Suffix string `orm:"suffix" json:"suffix"` // 后缀 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + + FilenPathCoding string `orm:"filenPathCoding" json:"filenPathCoding"` +} + +type DocumentSafetyMeetingListRes struct { + Id int64 `json:"id"` + IdStr string `json:"idStr"` + Pid string `json:"pid"` + Name string `json:"name"` + FilenPath string `json:"filenPath"` + Type string `json:"type"` + Suffix string `json:"suffix"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` + ProjectId int64 `json:"projectId"` +} diff --git a/internal/app/system/model/entity/.gitkeep b/internal/app/system/model/entity/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/internal/app/system/model/entity/app_menus.go b/internal/app/system/model/entity/app_menus.go new file mode 100644 index 0000000..75b9c4e --- /dev/null +++ b/internal/app/system/model/entity/app_menus.go @@ -0,0 +1,16 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// AppMenus is the golang structure for table app_menus. +type AppMenus struct { + MenuId uint `json:"menu_id" description:""` + MenuName string `json:"menu_name" description:"菜单名"` + CreatedAt *gtime.Time `json:"created_at" description:""` +} diff --git a/internal/app/system/model/entity/app_role_menus.go b/internal/app/system/model/entity/app_role_menus.go new file mode 100644 index 0000000..263da85 --- /dev/null +++ b/internal/app/system/model/entity/app_role_menus.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-05-28 15:11:15 +// 生成路径: internal/app/system/model/entity/app_role_menus.go +// 生成人:gfast +// desc:app角色绑定菜单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// AppRoleMenus is the golang structure for table app_role_menus. +type AppRoleMenus struct { + gmeta.Meta `orm:"table:app_role_menus"` + Id uint `orm:"id,primary" json:"id"` // + RoleId int `orm:"role_id" json:"roleId"` // 角色ID + MenuId int `orm:"menu_id" json:"menuId"` // 菜单ID + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // +} diff --git a/internal/app/system/model/entity/app_roles.go b/internal/app/system/model/entity/app_roles.go new file mode 100644 index 0000000..1a950aa --- /dev/null +++ b/internal/app/system/model/entity/app_roles.go @@ -0,0 +1,17 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// AppRoles is the golang structure for table app_roles. +type AppRoles struct { + RoleId uint `json:"role_id" orm:"role_id" description:""` + RoleName string `json:"role_name" orm:"role_name" description:"角色名"` + CreatedAt *gtime.Time `json:"created_at" orm:"created_at" description:""` + Tag int `json:"tag" orm:"tag" description:"0 管理员 | 1 施工人员"` +} diff --git a/internal/app/system/model/entity/app_user_disable_menus.go b/internal/app/system/model/entity/app_user_disable_menus.go new file mode 100644 index 0000000..284c8a4 --- /dev/null +++ b/internal/app/system/model/entity/app_user_disable_menus.go @@ -0,0 +1,17 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// AppUserDisableMenus is the golang structure for table app_user_disable_menus. +type AppUserDisableMenus struct { + UserDisabledMenuId uint `json:"user_disabled_menu_id" description:""` + UserId int `json:"user_id" description:"用户ID"` + MenuId int `json:"menu_id" description:"菜单ID"` + CreatedAt *gtime.Time `json:"created_at" description:""` +} diff --git a/internal/app/system/model/entity/app_user_menus.go b/internal/app/system/model/entity/app_user_menus.go new file mode 100644 index 0000000..520ecdb --- /dev/null +++ b/internal/app/system/model/entity/app_user_menus.go @@ -0,0 +1,17 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// AppUserMenus is the golang structure for table app_user_menus. +type AppUserMenus struct { + UserMenuId uint `json:"user_menu_id" description:""` + UserId int `json:"user_id" description:"用户ID"` + MenuId int `json:"menu_id" description:"菜单ID"` + CreatedAt *gtime.Time `json:"created_at" description:""` +} diff --git a/internal/app/system/model/entity/app_user_roles.go b/internal/app/system/model/entity/app_user_roles.go new file mode 100644 index 0000000..e782e4b --- /dev/null +++ b/internal/app/system/model/entity/app_user_roles.go @@ -0,0 +1,18 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// AppUserRoles is the golang structure for table app_user_roles. +type AppUserRoles struct { + Id uint `json:"id" orm:"id" description:""` + UserId int `json:"user_id" orm:"user_id" description:"用户ID"` + RoleId int `json:"role_id" orm:"role_id" description:"关联的角色ID"` + CreatedAt *gtime.Time `json:"created_at" orm:"created_at" description:""` + MajorRole int `json:"major_role" orm:"major_role" description:"0 后台管理人员 | 1 施工人员"` +} diff --git a/internal/app/system/model/entity/app_versions.go b/internal/app/system/model/entity/app_versions.go new file mode 100644 index 0000000..182edeb --- /dev/null +++ b/internal/app/system/model/entity/app_versions.go @@ -0,0 +1,18 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// AppVersions is the golang structure for table app_versions. +type AppVersions struct { + Id uint `json:"id" description:""` + Version string `json:"version" description:"版本号"` + FilePath string `json:"file_path" description:"版本文件的路径"` + CreatedAt *gtime.Time `json:"created_at" description:""` + Platform int `json:"platform" description:"0 安卓 | 1 IOS"` +} diff --git a/internal/app/system/model/entity/big_file.go b/internal/app/system/model/entity/big_file.go new file mode 100644 index 0000000..4542e82 --- /dev/null +++ b/internal/app/system/model/entity/big_file.go @@ -0,0 +1,27 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// BigFile is the golang structure for table big_file. +type BigFile struct { + Id uint64 `json:"id" description:""` + Name string `json:"name" description:"文件名称"` + Size int `json:"size" description:"文件大小"` + Path string `json:"path" description:"文件相对路径"` + FullPath string `json:"fullPath" description:"文件绝对路径"` + MimeType string `json:"mimeType" description:"文件类型"` + Source int `json:"source" description:"文件来源 0 - 本地,1 - 腾讯云 2 - 七牛云"` + Describe string `json:"describe" description:"描述"` + Md5 string `json:"md5" description:"md5"` + CreatedBy uint64 `json:"createdBy" description:""` + UpdatedBy uint64 `json:"updatedBy" description:""` + CreatedAt *gtime.Time `json:"createdAt" description:""` + UpdatedAt *gtime.Time `json:"updatedAt" description:""` + DeletedAt *gtime.Time `json:"deletedAt" description:""` +} diff --git a/internal/app/system/model/entity/bus_attendance_machine.go b/internal/app/system/model/entity/bus_attendance_machine.go new file mode 100644 index 0000000..e340465 --- /dev/null +++ b/internal/app/system/model/entity/bus_attendance_machine.go @@ -0,0 +1,27 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2025-03-03 10:32:47 +// 生成路径: internal/app/system/model/entity/bus_attendance_machine.go +// 生成人:gfast +// desc:考勤机 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusAttendanceMachine is the golang structure for table bus_attendance_machine. +type BusAttendanceMachine struct { + gmeta.Meta `orm:"table:bus_attendance_machine"` + Id uint64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId uint64 `orm:"project_id" json:"projectId"` // 项目ID + Sn string `orm:"sn" json:"sn"` // 设备sn + Teams string `orm:"teams" json:"teams"` // 班组id,多个逗号分隔 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + Remark string `orm:"remark" json:"remark"` // 备注 +} diff --git a/internal/app/system/model/entity/bus_attendance_machine_user.go b/internal/app/system/model/entity/bus_attendance_machine_user.go new file mode 100644 index 0000000..e4c505c --- /dev/null +++ b/internal/app/system/model/entity/bus_attendance_machine_user.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2025-03-03 10:33:17 +// 生成路径: internal/app/system/model/entity/bus_attendance_machine_user.go +// 生成人:gfast +// desc:考勤机用户列 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusAttendanceMachineUser is the golang structure for table bus_attendance_machine_user. +type BusAttendanceMachineUser struct { + gmeta.Meta `orm:"table:bus_attendance_machine_user"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + MachineId int64 `orm:"machine_id" json:"machineId"` // 考勤机主键ID + TeamId int64 `orm:"team_id" json:"teamId"` // 班组ID + UserId int64 `orm:"user_id" json:"userId"` // 用户ID + Identifying int `orm:"identifying" json:"identifying"` // 标识(是否下发) +} diff --git a/internal/app/system/model/entity/bus_camera_channel.go b/internal/app/system/model/entity/bus_camera_channel.go new file mode 100644 index 0000000..6d26bac --- /dev/null +++ b/internal/app/system/model/entity/bus_camera_channel.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-20 14:55:42 +// 生成路径: internal/app/system/model/entity/bus_camera_channel.go +// 生成人:gfast +// desc:摄像头(国标通道) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusCameraChannel is the golang structure for table bus_camera_channel. +type BusCameraChannel struct { + gmeta.Meta `orm:"table:bus_camera_channel"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + CountryId int64 `orm:"country_id" json:"countryId"` // 摄像头ID + ChannelNumber string `orm:"channel_number" json:"channelNumber"` // 国标通道号 + ChannelName string `orm:"channel_name" json:"channelName"` // 通道名称 + ChannelPath string `orm:"channel_path" json:"channelPath"` // 视频路径 + ChannelFormat string `orm:"channel_format" json:"channelFormat"` // 视频格式(字典) + ChannelState string `orm:"channel_state" json:"channelState"` // 在线状态(字典) + Remark string `orm:"remark" json:"remark"` // 备注 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_camera_chinese_standard.go b/internal/app/system/model/entity/bus_camera_chinese_standard.go new file mode 100644 index 0000000..7b682c0 --- /dev/null +++ b/internal/app/system/model/entity/bus_camera_chinese_standard.go @@ -0,0 +1,30 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-20 14:55:24 +// 生成路径: internal/app/system/model/entity/bus_camera_chinese_standard.go +// 生成人:gfast +// desc:摄像头(国标) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusCameraChineseStandard is the golang structure for table bus_camera_chinese_standard. +type BusCameraChineseStandard struct { + gmeta.Meta `orm:"table:bus_camera_chinese_standard"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + CountryNumber string `orm:"country_number" json:"countryNumber"` // 国标号 + CountryName string `orm:"country_name" json:"countryName"` // 摄像头名称 + CountryState string `orm:"country_state" json:"countryState"` // 在线状态(字典) + Remark string `orm:"remark" json:"remark"` // 备注 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_category.go b/internal/app/system/model/entity/bus_category.go new file mode 100644 index 0000000..3ce4628 --- /dev/null +++ b/internal/app/system/model/entity/bus_category.go @@ -0,0 +1,21 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-10-07 15:52:19 +// 生成路径: internal/app/system/model/entity/bus_category.go +// 生成人:gfast +// desc:题库_题库类别 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusCategory is the golang structure for table bus_category. +type BusCategory struct { + gmeta.Meta `orm:"table:bus_category"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + CategoryName string `orm:"category_name" json:"categoryName"` // 题库类别 +} diff --git a/internal/app/system/model/entity/bus_company.go b/internal/app/system/model/entity/bus_company.go new file mode 100644 index 0000000..33fd8ba --- /dev/null +++ b/internal/app/system/model/entity/bus_company.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-28 14:08:14 +// 生成路径: internal/app/system/model/entity/bus_company.go +// 生成人:gfast +// desc:公司 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusCompany is the golang structure for table bus_company. +type BusCompany struct { + gmeta.Meta `orm:"table:bus_company"` + CompanyId int64 `orm:"company_id,primary" json:"companyId"` // 序号 + CompanyName string `orm:"company_name" json:"companyName"` // 公司名称 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Status string `orm:"status" json:"status"` // 帐号状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_complaint_box.go b/internal/app/system/model/entity/bus_complaint_box.go new file mode 100644 index 0000000..9fbb6aa --- /dev/null +++ b/internal/app/system/model/entity/bus_complaint_box.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-12-04 18:09:50 +// 生成路径: internal/app/system/model/entity/bus_complaint_box.go +// 生成人:gfast +// desc:意见箱 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusComplaintBox is the golang structure for table bus_complaint_box. +type BusComplaintBox struct { + gmeta.Meta `orm:"table:bus_complaint_box"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Openid string `orm:"openid" json:"openid"` // openid + Opinion string `orm:"opinion" json:"opinion"` // 意见 + Status string `orm:"status" json:"status"` // 状态(0未读,1已读) + Dispose *gtime.Time `orm:"dispose" json:"dispose"` // 处理时间 + Remark string `orm:"remark" json:"remark"` // 备注 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 +} diff --git a/internal/app/system/model/entity/bus_construction_blacklist.go b/internal/app/system/model/entity/bus_construction_blacklist.go new file mode 100644 index 0000000..c2ba59b --- /dev/null +++ b/internal/app/system/model/entity/bus_construction_blacklist.go @@ -0,0 +1,25 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-11-10 14:08:39 +// 生成路径: internal/app/system/model/entity/bus_construction_blacklist.go +// 生成人:gfast +// desc:黑名单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionBlacklist is the golang structure for table bus_construction_blacklist. +type BusConstructionBlacklist struct { + gmeta.Meta `orm:"table:bus_construction_blacklist"` + Openid string `orm:"openid,primary" json:"openid"` // openid + Name string `orm:"name" json:"name"` // 名字 + SfzNumber string `orm:"sfz_number" json:"sfzNumber"` // 身份证号码 + Remark string `orm:"remark" json:"remark"` // 备注 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 +} diff --git a/internal/app/system/model/entity/bus_construction_log.go b/internal/app/system/model/entity/bus_construction_log.go new file mode 100644 index 0000000..cc119e7 --- /dev/null +++ b/internal/app/system/model/entity/bus_construction_log.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-22 16:27:43 +// 生成路径: internal/app/system/model/entity/bus_construction_log.go +// 生成人:gfast +// desc:施工日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionLog is the golang structure for table bus_construction_log. +type BusConstructionLog struct { + gmeta.Meta `orm:"table:bus_construction_log"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目ID + DateOfOccurrence string `orm:"date_of_occurrence" json:"dateOfOccurrence"` // 发生日期 + Condition string `orm:"condition" json:"condition"` // 生产情况 + TechnologyQuality string `orm:"technology_quality" json:"technologyQuality"` // 技术质量安全工作 + Remark string `orm:"remark" json:"remark"` // 备注 + Path string `orm:"path" json:"path"` // 附件(多个逗号分割) + CreatedBy string `orm:"created_by" json:"createdBy"` // 创建人 + UpdatedBy string `orm:"updated_by" json:"updatedBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_construction_project.go b/internal/app/system/model/entity/bus_construction_project.go new file mode 100644 index 0000000..7dca9be --- /dev/null +++ b/internal/app/system/model/entity/bus_construction_project.go @@ -0,0 +1,22 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-07 10:17:50 +// 生成路径: internal/app/system/model/entity/bus_construction_project.go +// 生成人:gfast +// desc:施工人员对应项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionProject is the golang structure for table bus_construction_project. +type BusConstructionProject struct { + gmeta.Meta `orm:"table:bus_construction_project"` + Id uint64 `orm:"id,primary" json:"id"` // 序号 + ConstructionUserId int64 `orm:"construction_user_id" json:"constructionUserId"` // 微信用户id + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id +} diff --git a/internal/app/system/model/entity/bus_construction_user.go b/internal/app/system/model/entity/bus_construction_user.go new file mode 100644 index 0000000..1f19119 --- /dev/null +++ b/internal/app/system/model/entity/bus_construction_user.go @@ -0,0 +1,51 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// BusConstructionUser is the golang structure for table bus_construction_user. +type BusConstructionUser struct { + Id int64 `json:"id" description:""` + Openid string `json:"openid" description:"微信id"` + NickName string `json:"nick_name" description:"微信名称"` + TeamId int64 `json:"team_id" description:"班组id"` + HeadIcon string `json:"head_icon" description:"登陆照片"` + PacePhoto string `json:"pace_photo" description:"人脸照"` + UserName string `json:"user_name" description:"人员姓名"` + ProjectId int64 `json:"project_id" description:"项目id"` + Status string `json:"status" description:"状态(0在职 1离职)-字典position_status"` + IsPinch string `json:"is_pinch" description:"是否代打"` + IfManagement string `json:"if_management" description:"是否班组管理"` + CreateBy string `json:"create_by" description:"创建者"` + UpdateBy string `json:"update_by" description:"更新者"` + CreatedAt *gtime.Time `json:"created_at" description:"创建时间"` + UpdatedAt *gtime.Time `json:"updated_at" description:"更新时间"` + DeletedAt *gtime.Time `json:"deleted_at" description:"删除时间"` + Phone string `json:"phone" description:"电话"` + Sex string `json:"sex" description:"1:男,2女,3保密"` + SfzNation string `json:"sfz_nation" description:"身份证民族"` + SfzNumber string `json:"sfz_number" description:"身份证号码"` + SfzStart string `json:"sfz_start" description:"身份证有效开始期"` + SfzEnd string `json:"sfz_end" description:"身份证有效结束期"` + SfzSite string `json:"sfz_site" description:"身份证地址"` + SfzBirth string `json:"sfz_birth" description:"身份证出生日期"` + NativePlace string `json:"native_place" description:"籍贯"` + YhkNumber string `json:"yhk_number" description:"银行卡号"` + YhkOpeningBank string `json:"yhk_opening_bank" description:"开户行"` + YhkCardholder string `json:"yhk_cardholder" description:"持卡人"` + TypeOfWork string `json:"type_of_work" description:"工种(字典)"` + Clock string `json:"clock" description:"打卡(1启用打卡 2禁止打卡)"` + LabourserviceId int64 `json:"labourservice_id" description:"劳务公司id"` + EntryDate string `json:"entry_date" description:"入场时间"` + LeaveDate string `json:"leave_date" description:"离场时间"` + Salary float64 `json:"salary" description:"薪水(此字段为0表示此字段无效)"` + ProjectRecord string `json:"project_record" description:"是否开启项目备案(小程序)1开启 2不开启"` + WxOrPc string `json:"wx_or_pc" description:"哪添加的(1表示pc 2表示小程序)"` + Subscription string `json:"subscription" description:"消息订阅状态(1订阅 2无订阅)"` + DevNum string `json:"dev_num" description:"安全帽设备标识"` +} diff --git a/internal/app/system/model/entity/bus_construction_user_file.go b/internal/app/system/model/entity/bus_construction_user_file.go new file mode 100644 index 0000000..fc39154 --- /dev/null +++ b/internal/app/system/model/entity/bus_construction_user_file.go @@ -0,0 +1,30 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-07 10:17:41 +// 生成路径: internal/app/system/model/entity/bus_construction_user_file.go +// 生成人:gfast +// desc:微信用户的文件存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionUserFile is the golang structure for table bus_construction_user_file. +type BusConstructionUserFile struct { + gmeta.Meta `orm:"table:bus_construction_user_file"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + UserId int64 `orm:"user_id" json:"userId"` // 用户id + UserImgType string `orm:"user_img_type" json:"userImgType"` // 图片类型 + Path string `orm:"path" json:"path"` // 图片路径 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Remark string `orm:"remark" json:"remark"` // 备注 +} diff --git a/internal/app/system/model/entity/bus_construction_user_post.go b/internal/app/system/model/entity/bus_construction_user_post.go new file mode 100644 index 0000000..7abdf9a --- /dev/null +++ b/internal/app/system/model/entity/bus_construction_user_post.go @@ -0,0 +1,22 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-07 10:06:34 +// 生成路径: internal/app/system/model/entity/bus_construction_user_post.go +// 生成人:gfast +// desc:施工人员岗位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionUserPost is the golang structure for table bus_construction_user_post. +type BusConstructionUserPost struct { + gmeta.Meta `orm:"table:bus_construction_user_post"` + Id uint64 `orm:"id,primary" json:"id"` // + ConstructionUserId int64 `orm:"construction_user_id" json:"constructionUserId"` // 施工人员id + PostId int64 `orm:"post_id" json:"postId"` // 岗位id +} diff --git a/internal/app/system/model/entity/bus_corporate_events.go b/internal/app/system/model/entity/bus_corporate_events.go new file mode 100644 index 0000000..0f666ef --- /dev/null +++ b/internal/app/system/model/entity/bus_corporate_events.go @@ -0,0 +1,28 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-20 16:49:36 +// 生成路径: internal/app/system/model/entity/bus_corporate_events.go +// 生成人:gfast +// desc:企业大事记 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusCorporateEvents is the golang structure for table bus_corporate_events. +type BusCorporateEvents struct { + gmeta.Meta `orm:"table:bus_corporate_events"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + Headline string `orm:"headline" json:"headline"` // 标题 + Content string `orm:"content" json:"content"` // 内容 + CreatedBy uint64 `orm:"created_by" json:"createdBy"` // 创建人 + UpdatedBy uint64 `orm:"updated_by" json:"updatedBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_design_audit.go b/internal/app/system/model/entity/bus_design_audit.go new file mode 100644 index 0000000..92480d4 --- /dev/null +++ b/internal/app/system/model/entity/bus_design_audit.go @@ -0,0 +1,30 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-04-09 15:40:16 +// 生成路径: internal/app/system/model/entity/bus_design_audit.go +// 生成人:gfast +// desc:设计审核(竣工、施工、可研) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusDesignAudit is the golang structure for table bus_design_audit. +type BusDesignAudit struct { + gmeta.Meta `orm:"table:bus_design_audit"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目ID + TableName string `orm:"table_name" json:"tableName"` // 表名 + TableId int64 `orm:"table_id" json:"tableId"` // 表ID + Status string `orm:"status" json:"status"` // 审核状态(1未读 2拒绝 3通过) + Cause string `orm:"cause" json:"cause"` // 拒绝原因 + Auditor int64 `orm:"auditor" json:"auditor"` // 审核人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_design_document.go b/internal/app/system/model/entity/bus_design_document.go new file mode 100644 index 0000000..ace023b --- /dev/null +++ b/internal/app/system/model/entity/bus_design_document.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-29 16:31:29 +// 生成路径: internal/app/system/model/entity/bus_design_document.go +// 生成人:gfast +// desc:设计管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusDesignDocument is the golang structure for table bus_design_document. +type BusDesignDocument struct { + gmeta.Meta `orm:"table:bus_design_document"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + DocumenName string `orm:"documen_name" json:"documenName"` // 文档名称 + Remark string `orm:"remark" json:"remark"` // 备注 + DocumentUrl string `orm:"document_url" json:"documentUrl"` // 文件路径 + FileId int64 `orm:"file_id" json:"fileId"` // 文件夹id + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Status string `orm:"status" json:"status"` // 状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 上传时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_design_period_range.go b/internal/app/system/model/entity/bus_design_period_range.go new file mode 100644 index 0000000..8a51f2e --- /dev/null +++ b/internal/app/system/model/entity/bus_design_period_range.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-04-11 17:28:54 +// 生成路径: internal/app/system/model/entity/bus_design_period_range.go +// 生成人:gfast +// desc:设计-周期范围 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusDesignPeriodRange is the golang structure for table bus_design_period_range. +type BusDesignPeriodRange struct { + gmeta.Meta `orm:"table:bus_design_period_range"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + TableType string `orm:"table_type" json:"tableType"` // 记录类型(1竣工 2施工 3可研) + FileName string `orm:"file_name" json:"fileName"` // 文件名称 + FilePath string `orm:"file_path" json:"filePath"` // 文件路径 + IsEntering string `orm:"is_entering" json:"isEntering"` // 路径内容是否存在(1否 2是) + StartTime string `orm:"start_time" json:"startTime"` // 起始时间 + EndTime string `orm:"end_time" json:"endTime"` // 结束时间 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 录入者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_engineering_quality.go b/internal/app/system/model/entity/bus_engineering_quality.go new file mode 100644 index 0000000..e34394f --- /dev/null +++ b/internal/app/system/model/entity/bus_engineering_quality.go @@ -0,0 +1,36 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-29 09:31:22 +// 生成路径: internal/app/system/model/entity/bus_engineering_quality.go +// 生成人:gfast +// desc:工程质量列 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusEngineeringQuality is the golang structure for table bus_engineering_quality. +type BusEngineeringQuality struct { + gmeta.Meta `orm:"table:bus_engineering_quality"` + Id uint64 `orm:"id,primary" json:"id"` // 序号 + UnitName1 string `orm:"unit_name1" json:"unitName1"` // 单位工程 + UnitName2 string `orm:"unit_name2" json:"unitName2"` // 子单位工程 + UnitName3 string `orm:"unit_name3" json:"unitName3"` // 分部工程 + UnitName4 string `orm:"unit_name4" json:"unitName4"` // 子分部工程 + UnitName5 string `orm:"unit_name5" json:"unitName5"` // 分项工程 + UnitName6 string `orm:"unit_name6" json:"unitName6"` // 检验批 + QualityName string `orm:"quality_name" json:"qualityName"` // 工程项目名称 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Status string `orm:"status" json:"status"` // 施工类型状态 + FileUrl string `orm:"file_url" json:"fileUrl"` // 文件地址 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreateTime *gtime.Time `orm:"create_time" json:"createTime"` // 创建时间 + UpdateTime *gtime.Time `orm:"update_time" json:"updateTime"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_equipment_equipment_unpacking.go b/internal/app/system/model/entity/bus_equipment_equipment_unpacking.go new file mode 100644 index 0000000..d5d139f --- /dev/null +++ b/internal/app/system/model/entity/bus_equipment_equipment_unpacking.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-29 11:14:45 +// 生成路径: internal/app/system/model/entity/bus_equipment_equipment_unpacking.go +// 生成人:gfast +// desc:开箱记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusEquipmentEquipmentUnpacking is the golang structure for table bus_equipment_equipment_unpacking. +type BusEquipmentEquipmentUnpacking struct { + gmeta.Meta `orm:"table:bus_equipment_equipment_unpacking"` + UnpackingId int64 `orm:"unpacking_id,primary" json:"unpackingId"` // 序号 + EquipmentMaterialsId int64 `orm:"equipment_materials_id" json:"equipmentMaterialsId"` // 设备id + UnpackingName string `orm:"unpacking_name" json:"unpackingName"` // 开箱名称 + UnpackingUrl string `orm:"unpacking_url" json:"unpackingUrl"` // 开箱上传文件 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Status string `orm:"status" json:"status"` // 状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_equipment_materials.go b/internal/app/system/model/entity/bus_equipment_materials.go new file mode 100644 index 0000000..89b0af5 --- /dev/null +++ b/internal/app/system/model/entity/bus_equipment_materials.go @@ -0,0 +1,44 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-29 11:14:16 +// 生成路径: internal/app/system/model/entity/bus_equipment_materials.go +// 生成人:gfast +// desc:材料/设备名称 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusEquipmentMaterials is the golang structure for table bus_equipment_materials. +type BusEquipmentMaterials struct { + gmeta.Meta `orm:"table:bus_equipment_materials"` + EquipmentMaterialsId int64 `orm:"equipment_materials_id,primary" json:"equipmentMaterialsId"` // 序号 + EquipmentMaterialsName string `orm:"equipment_materials_name" json:"equipmentMaterialsName"` // 材料/设备 + CompanyId int64 `orm:"company_id" json:"companyId"` // 公司 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目 + TypeSpecificationName string `orm:"type_specification_name" json:"typeSpecificationName"` // 规格型号 + TypeSpecificationUrl string `orm:"type_specification_url" json:"typeSpecificationUrl"` // 规格型号文件 + CertificateConformityName string `orm:"certificate_conformity_name" json:"certificateConformityName"` // 合格证编号 + CertificateConformityUrl string `orm:"certificate_conformity_url" json:"certificateConformityUrl"` // 合格证编号文件 + QualityName string `orm:"quality_name" json:"qualityName"` // 质量说明书编号 + QualityUrl string `orm:"quality_url" json:"qualityUrl"` // 质量说明书文件 + InspectionReportName string `orm:"inspection_report_name" json:"inspectionReportName"` // 检验报告编号 + InspectionReportUrl string `orm:"inspection_report_url" json:"inspectionReportUrl"` // 检验报告文件 + ReexamineReportName string `orm:"reexamine_report_name" json:"reexamineReportName"` // 复试报告编号 + ReexamineReportUrl string `orm:"reexamine_report_url" json:"reexamineReportUrl"` // 复试报告文件 + UsePart string `orm:"use_part" json:"usePart"` // 使用部位 + WeightId int64 `orm:"weight_id" json:"weightId"` // 计量单位 + Remark string `orm:"remark" json:"remark"` // 备注 + QuantityCount string `orm:"quantity_count" json:"quantityCount"` // 材料数量 + Status string `orm:"status" json:"status"` // 状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除视角 +} diff --git a/internal/app/system/model/entity/bus_equipment_materials_inventory.go b/internal/app/system/model/entity/bus_equipment_materials_inventory.go new file mode 100644 index 0000000..4b8e876 --- /dev/null +++ b/internal/app/system/model/entity/bus_equipment_materials_inventory.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-13 14:21:30 +// 生成路径: internal/app/system/model/entity/bus_equipment_materials_inventory.go +// 生成人:gfast +// desc:设备材料入库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusEquipmentMaterialsInventory is the golang structure for table bus_equipment_materials_inventory. +type BusEquipmentMaterialsInventory struct { + gmeta.Meta `orm:"table:bus_equipment_materials_inventory"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + EquipmentMaterialsId int64 `orm:"equipment_materials_id" json:"equipmentMaterialsId"` // 材料ID + OutPut string `orm:"out_put" json:"outPut"` // 出入库 + Number int `orm:"number" json:"number"` // 数量 + Residue int `orm:"residue" json:"residue"` // 剩余库存数量 + Operator string `orm:"operator" json:"operator"` // 出入库负责人 + Remark string `orm:"remark" json:"remark"` // 备注 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除视角 +} diff --git a/internal/app/system/model/entity/bus_equipment_materials_inventory_file.go b/internal/app/system/model/entity/bus_equipment_materials_inventory_file.go new file mode 100644 index 0000000..1d4d1c8 --- /dev/null +++ b/internal/app/system/model/entity/bus_equipment_materials_inventory_file.go @@ -0,0 +1,20 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// BusEquipmentMaterialsInventoryFile is the golang structure for table bus_equipment_materials_inventory_file. +type BusEquipmentMaterialsInventoryFile struct { + Id int64 `json:"id" description:"主键"` + MaterialsInventoryId int64 `json:"materials_inventory_id" description:"设备材料Id"` + Name string `json:"name" description:"文件名字"` + Path string `json:"path" description:"文件路径"` + Suffix string `json:"suffix" description:"文件后缀"` + Size string `json:"size" description:"文件大小"` + CreatedAt *gtime.Time `json:"created_at" description:"创建时间"` +} diff --git a/internal/app/system/model/entity/bus_equipment_materials_weight.go b/internal/app/system/model/entity/bus_equipment_materials_weight.go new file mode 100644 index 0000000..5f28d99 --- /dev/null +++ b/internal/app/system/model/entity/bus_equipment_materials_weight.go @@ -0,0 +1,28 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-28 15:27:53 +// 生成路径: internal/app/system/model/entity/bus_equipment_materials_weight.go +// 生成人:gfast +// desc:计量单位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusEquipmentMaterialsWeight is the golang structure for table bus_equipment_materials_weight. +type BusEquipmentMaterialsWeight struct { + gmeta.Meta `orm:"table:bus_equipment_materials_weight"` + WeightId int64 `orm:"weight_id,primary" json:"weightId"` // 序号 + Weight string `orm:"weight" json:"weight"` // 计量单位名称 + Status string `orm:"status" json:"status"` // 状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_essential_information.go b/internal/app/system/model/entity/bus_essential_information.go new file mode 100644 index 0000000..5cdf426 --- /dev/null +++ b/internal/app/system/model/entity/bus_essential_information.go @@ -0,0 +1,25 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-20 19:38:54 +// 生成路径: internal/app/system/model/entity/bus_essential_information.go +// 生成人:gfast +// desc:项目基本信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusEssentialInformation is the golang structure for table bus_essential_information. +type BusEssentialInformation struct { + gmeta.Meta `orm:"table:bus_essential_information"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + One string `orm:"one" json:"one"` // 发电量 + Two string `orm:"two" json:"two"` // 年发电量 + Three string `orm:"three" json:"three"` // 当前发电量 + Four string `orm:"four" json:"four"` // 减排量 + Five string `orm:"five" json:"five"` // 预估发电量 +} diff --git a/internal/app/system/model/entity/bus_folder.go b/internal/app/system/model/entity/bus_folder.go new file mode 100644 index 0000000..50fefaa --- /dev/null +++ b/internal/app/system/model/entity/bus_folder.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-15 17:15:59 +// 生成路径: internal/app/system/model/entity/bus_folder.go +// 生成人:gfast +// desc:文件夹 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusFolder is the golang structure for table bus_folder. +type BusFolder struct { + gmeta.Meta `orm:"table:bus_folder"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + Father int64 `orm:"father" json:"father"` // 大于0表示当前文件夹有父级 + FolderType string `orm:"folder_type" json:"folderType"` // 文件夹类型 + Icon string `orm:"icon" json:"icon"` // 文件夹图标 + Name string `orm:"name" json:"name"` // 文件夹名称 + Remark string `orm:"remark" json:"remark"` // 备注 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_folder_file.go b/internal/app/system/model/entity/bus_folder_file.go new file mode 100644 index 0000000..a1f4b98 --- /dev/null +++ b/internal/app/system/model/entity/bus_folder_file.go @@ -0,0 +1,40 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-15 17:16:00 +// 生成路径: internal/app/system/model/entity/bus_folder_file.go +// 生成人:gfast +// desc:文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusFolderFile is the golang structure for table bus_folder_file. +type BusFolderFile struct { + gmeta.Meta `orm:"table:bus_folder_file"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + FolderId int64 `orm:"folder_id" json:"folderId"` // 所属文件夹 + LinkedFolderId *LinkedBusFolderFileBusFolder `orm:"with:id=folder_id" json:"linkedFolderId"` + FileType string `orm:"file_type" json:"fileType"` // 文件类型 + Name string `orm:"name" json:"name"` // 文件名称 + Size string `orm:"size" json:"size"` // 文件大小 + Suffix string `orm:"suffix" json:"suffix"` // 文件后缀 + Path string `orm:"path" json:"path"` // 文件路径 + Remark string `orm:"remark" json:"remark"` // 备注 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type LinkedBusFolderFileBusFolder struct { + gmeta.Meta `orm:"table:bus_folder"` + Id int64 `orm:"id" json:"id"` // 主键ID + Name string `orm:"name" json:"name"` // 文件夹名称 +} diff --git a/internal/app/system/model/entity/bus_hse_management.go b/internal/app/system/model/entity/bus_hse_management.go new file mode 100644 index 0000000..35ef448 --- /dev/null +++ b/internal/app/system/model/entity/bus_hse_management.go @@ -0,0 +1,42 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-28 14:53:05 +// 生成路径: internal/app/system/model/entity/bus_hse_management.go +// 生成人:gfast +// desc:HSE-巡检工单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusHseManagement is the golang structure for table bus_hse_management. +type BusHseManagement struct { + gmeta.Meta `orm:"table:bus_hse_management"` + Id int64 `orm:"id,primary" json:"id"` // 你 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目ID + StudyType string `orm:"study_type" json:"studyType"` // 检查类型 + TourType string `orm:"tour_type" json:"tourType"` // 违章类型字典 + InspectionResult string `orm:"inspection_result" json:"inspectionResult"` // 巡检结果 + TeamName string `orm:"team_name" json:"teamName"` // 名称(班组/部门) + Corrector string `orm:"corrector" json:"corrector"` // 整改人(班组长) + IsReply string `orm:"is_reply" json:"isReply"` // 是否回复(1回复 2不回复) + ReplyDate string `orm:"reply_date" json:"replyDate"` // 回复日期 + Status string `orm:"status" json:"status"` // 工单状态(1通知 2整改 3复查) + HiddenDanger string `orm:"hidden_danger" json:"hiddenDanger"` // 问题隐患 + Measure string `orm:"measure" json:"measure"` // 整改措施 + Review string `orm:"review" json:"review"` // 复查情况 + ReviewType string `orm:"review_type" json:"reviewType"` // 复查状态 + CreatedBy string `orm:"created_by" json:"createdBy"` // 创建人 + UpdatedBy string `orm:"updated_by" json:"updatedBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + CheckTime *gtime.Time `orm:"check_time" json:"checkTime"` // 检查时间 + RectificationTime *gtime.Time `orm:"rectification_time" json:"rectificationTime"` // 整改时间 + ReviewTime *gtime.Time `orm:"review_time" json:"reviewTime"` // 复查时间 +} diff --git a/internal/app/system/model/entity/bus_hse_security_log.go b/internal/app/system/model/entity/bus_hse_security_log.go new file mode 100644 index 0000000..736e42a --- /dev/null +++ b/internal/app/system/model/entity/bus_hse_security_log.go @@ -0,0 +1,41 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-04-07 17:00:45 +// 生成路径: internal/app/system/model/entity/bus_hse_security_log.go +// 生成人:gfast +// desc:HSE安全日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusHseSecurityLog is the golang structure for table bus_hse_security_log. +type BusHseSecurityLog struct { + gmeta.Meta `orm:"table:bus_hse_security_log"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目ID + DateOfOccurrence string `orm:"date_of_occurrence" json:"dateOfOccurrence"` // 发生日期 + AirTemperatureMax float64 `orm:"air_temperature_max" json:"airTemperatureMax"` // 最高气温 + AirTemperatureMin float64 `orm:"air_temperature_min" json:"airTemperatureMin"` // 最低气温 + Climate string `orm:"climate" json:"climate"` // 气候(字典) + Progress string `orm:"progress" json:"progress"` // 进展情况 + JobContent string `orm:"job_content" json:"jobContent"` // 作业内容 + DiscloseTheFacts string `orm:"disclose_the_facts" json:"discloseTheFacts"` // 交底情况 + ProgressOfActivity string `orm:"progress_of_activity" json:"progressOfActivity"` // 活动情况 + Examine string `orm:"examine" json:"examine"` // 检查情况 + Implementation string `orm:"implementation" json:"implementation"` // 实施情况 + SafetyInspectionSituation string `orm:"safety_inspection_situation" json:"safetyInspectionSituation"` // 安全检查情况 + StoppageOrOvertime string `orm:"stoppage_or_overtime" json:"stoppageOrOvertime"` // 停工或加班情况 + OtherRecords string `orm:"other_records" json:"otherRecords"` // 其他情况 + Remark string `orm:"remark" json:"remark"` // 备注 + CreatedBy string `orm:"created_by" json:"createdBy"` // 创建人 + UpdatedBy string `orm:"updated_by" json:"updatedBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_inspection_ticket.go b/internal/app/system/model/entity/bus_inspection_ticket.go new file mode 100644 index 0000000..276442a --- /dev/null +++ b/internal/app/system/model/entity/bus_inspection_ticket.go @@ -0,0 +1,35 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-21 15:23:59 +// 生成路径: internal/app/system/model/entity/bus_inspection_ticket.go +// 生成人:gfast +// desc:质量工单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusInspectionTicket is the golang structure for table bus_inspection_ticket. +type BusInspectionTicket struct { + gmeta.Meta `orm:"table:bus_inspection_ticket"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目ID + InspectionType string `orm:"Inspection_type" json:"inspectionType"` // 巡检类型(关联字典) + InspectionResult string `orm:"Inspection_result" json:"inspectionResult"` // 巡检结果 + Corrector string `orm:"corrector" json:"corrector"` // 整改人(班组长) + IsReply string `orm:"is_reply" json:"isReply"` // 是否回复(1回复 2不回复) + ReplyDate string `orm:"reply_date" json:"replyDate"` // 回复日期 + Status string `orm:"status" json:"status"` // 工单状态(1通知 2整改 3验证) + Feedback string `orm:"feedback" json:"feedback"` // 整改反馈 + VerificationResult string `orm:"verification_result" json:"verificationResult"` // 验证结果 + CreatedBy string `orm:"created_by" json:"createdBy"` // 创建人 + UpdatedBy string `orm:"updated_by" json:"updatedBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_machinery.go b/internal/app/system/model/entity/bus_machinery.go new file mode 100644 index 0000000..98e0ff5 --- /dev/null +++ b/internal/app/system/model/entity/bus_machinery.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-29 14:02:01 +// 生成路径: internal/app/system/model/entity/bus_machinery.go +// 生成人:gfast +// desc:机械 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusMachinery is the golang structure for table bus_machinery. +type BusMachinery struct { + gmeta.Meta `orm:"table:bus_machinery"` + Id uint64 `orm:"id,primary" json:"id"` // 序号 + MachineryName string `orm:"machinery_name" json:"machineryName"` // 机械名称 + MachineryNumber string `orm:"machinery_number" json:"machineryNumber"` // 编号 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + CheckoutNumber string `orm:"checkout_number" json:"checkoutNumber"` // 检验证编号 + CheckoutUnit string `orm:"checkout_unit" json:"checkoutUnit"` // 检验单位 + CheckoutDate string `orm:"checkout_date" json:"checkoutDate"` // 检定日期/有效期 + Status string `orm:"status" json:"status"` // 施工类型状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_machinery_detail.go b/internal/app/system/model/entity/bus_machinery_detail.go new file mode 100644 index 0000000..f24971c --- /dev/null +++ b/internal/app/system/model/entity/bus_machinery_detail.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-10-12 11:41:31 +// 生成路径: internal/app/system/model/entity/bus_machinery_detail.go +// 生成人:gfast +// desc:机械详情 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusMachineryDetail is the golang structure for table bus_machinery_detail. +type BusMachineryDetail struct { + gmeta.Meta `orm:"table:bus_machinery_detail"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + CheckoutNumber string `orm:"checkout_number" json:"checkoutNumber"` // 检验证编号 + CheckoutUnit string `orm:"checkout_unit" json:"checkoutUnit"` // 检验单位 + CheckoutDate string `orm:"checkout_date" json:"checkoutDate"` // 检定日期/有效期 + Status string `orm:"status" json:"status"` // 施工类型状态 + EntryTime *gtime.Time `orm:"entry_time" json:"entryTime"` // 入场时间 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Remark string `orm:"remark" json:"remark"` // 备注 + Picture string `orm:"picture" json:"picture"` // 4张图片,逗号分隔 +} diff --git a/internal/app/system/model/entity/bus_machinery_detail_file.go b/internal/app/system/model/entity/bus_machinery_detail_file.go new file mode 100644 index 0000000..2a50bd8 --- /dev/null +++ b/internal/app/system/model/entity/bus_machinery_detail_file.go @@ -0,0 +1,16 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +// BusMachineryDetailFile is the golang structure for table bus_machinery_detail_file. +type BusMachineryDetailFile struct { + Id int64 `json:"id" description:"主键"` + MachineryDetailId int64 `json:"machinery_detail_id" description:"机械设备详情id"` + Name string `json:"name" description:"文件名字"` + Path string `json:"path" description:"文件路径"` + Type string `json:"type" description:"文件类型"` + Size string `json:"size" description:"文件大小"` + SourceType string `json:"source_type" description:"文件来源类型(1合格校验单 2租赁校验单)"` +} diff --git a/internal/app/system/model/entity/bus_machinery_record.go b/internal/app/system/model/entity/bus_machinery_record.go new file mode 100644 index 0000000..23ecdef --- /dev/null +++ b/internal/app/system/model/entity/bus_machinery_record.go @@ -0,0 +1,20 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// BusMachineryRecord is the golang structure for table bus_machinery_record. +type BusMachineryRecord struct { + Id int64 `json:"id" description:"id"` + MachineryDetailId int64 `json:"machinery_detail_id" description:"机械详情id"` + Status string `json:"status" description:"施工类型状态(0正常 1停用)"` + Type string `json:"type" description:"1出场 2入场"` + RecordTime *gtime.Time `json:"record_time" description:"记录出入场时间"` + CreateBy string `json:"create_by" description:"创建人"` + CreatedAt *gtime.Time `json:"created_at" description:"创建时间"` +} diff --git a/internal/app/system/model/entity/bus_payroll_list.go b/internal/app/system/model/entity/bus_payroll_list.go new file mode 100644 index 0000000..f580530 --- /dev/null +++ b/internal/app/system/model/entity/bus_payroll_list.go @@ -0,0 +1,46 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-11-20 13:51:38 +// 生成路径: internal/app/system/model/entity/bus_payroll_list.go +// 生成人:gfast +// desc:工资(excel导入形成的) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusPayrollList is the golang structure for table bus_payroll_list. +type BusPayrollList struct { + gmeta.Meta `orm:"table:bus_payroll_list"` + Id int64 `orm:"id,primary" json:"id"` // + XNumber string `orm:"x_number" json:"xNumber"` // 编号 + Name string `orm:"name" json:"name"` // 姓名 + IdentityCard string `orm:"identity_card" json:"identityCard"` // 身份证号码 + ContactWay string `orm:"contact_way" json:"contactWay"` // 联系方式 + TeamOrGroup string `orm:"team_or_group" json:"teamOrGroup"` // 班组 + TypeOfWork string `orm:"type_of_work" json:"typeOfWork"` // 工种 + AttendanceTime string `orm:"attendance_time" json:"attendanceTime"` // 当月考勤工作时间 + ActualWorkload string `orm:"actual_workload" json:"actualWorkload"` // 当月产生实际工作量 + Quantity string `orm:"quantity" json:"quantity"` // 元量 + XDay string `orm:"x_day" json:"xDay"` // 元天 + XMonth string `orm:"x_month" json:"xMonth"` // 元月 + OvertimeWage string `orm:"overtime_wage" json:"overtimeWage"` // 加班工资 + Salary string `orm:"salary" json:"salary"` // 应发 + AmountWithheld string `orm:"amount_withheld" json:"amountWithheld"` // 代扣金额 + AmountPaid string `orm:"amount_paid" json:"amountPaid"` // 代缴金额 + DeductOther string `orm:"deduct_other" json:"deductOther"` // 扣除其他项目金额(如:预支) + AmountPaidOut string `orm:"amount_paid_out" json:"amountPaidOut"` // 实发金额 + ReleaseMode string `orm:"release_mode" json:"releaseMode"` // 发放方式 + CreditCardNumbers string `orm:"credit_card_numbers" json:"creditCardNumbers"` // 银行卡号 + OpeningBank string `orm:"opening_bank" json:"openingBank"` // 开户行(具体到分行) + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_presetting_bit.go b/internal/app/system/model/entity/bus_presetting_bit.go new file mode 100644 index 0000000..1a90bc8 --- /dev/null +++ b/internal/app/system/model/entity/bus_presetting_bit.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-10-19 15:17:27 +// 生成路径: internal/app/system/model/entity/bus_presetting_bit.go +// 生成人:gfast +// desc:摄像头预置位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusPresettingBit is the golang structure for table bus_presetting_bit. +type BusPresettingBit struct { + gmeta.Meta `orm:"table:bus_presetting_bit"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + CameraId int64 `orm:"camera_id" json:"cameraId"` // 摄像头ID + Serial string `orm:"serial" json:"serial"` // 国标号 + Code string `orm:"code" json:"code"` // 通道号 + Command string `orm:"command" json:"command"` // 指令 + Preset int `orm:"preset" json:"preset"` // 预置位编号 + Name string `orm:"name" json:"name"` // 预置位名称 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_projectin_progress.go b/internal/app/system/model/entity/bus_projectin_progress.go new file mode 100644 index 0000000..50fbf45 --- /dev/null +++ b/internal/app/system/model/entity/bus_projectin_progress.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-20 19:45:19 +// 生成路径: internal/app/system/model/entity/bus_projectin_progress.go +// 生成人:gfast +// desc:在建项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusProjectinProgress is the golang structure for table bus_projectin_progress. +type BusProjectinProgress struct { + gmeta.Meta `orm:"table:bus_projectin_progress"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目ID + ParallelIn int `orm:"parallel_in" json:"parallelIn"` // 并网容量 + CreatedBy *gtime.Time `orm:"created_by" json:"createdBy"` // 创建时间 +} diff --git a/internal/app/system/model/entity/bus_quality.go b/internal/app/system/model/entity/bus_quality.go new file mode 100644 index 0000000..8046753 --- /dev/null +++ b/internal/app/system/model/entity/bus_quality.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-02 17:11:39 +// 生成路径: internal/app/system/model/entity/bus_quality.go +// 生成人:gfast +// desc:质量文档管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusQuality is the golang structure for table bus_quality. +type BusQuality struct { + gmeta.Meta `orm:"table:bus_quality"` + Id uint64 `orm:"id,primary" json:"id"` // 序号 + QualityName string `orm:"quality_name" json:"qualityName"` // 质量检查名称 + QualityExplain string `orm:"quality_explain" json:"qualityExplain"` // 质量说明 + QualityDocument string `orm:"quality_document" json:"qualityDocument"` // 质量检查文件 + QualityType string `orm:"quality_type" json:"qualityType"` // 质量类型 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Status string `orm:"status" json:"status"` // 帐号状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_question_bank.go b/internal/app/system/model/entity/bus_question_bank.go new file mode 100644 index 0000000..bdd265e --- /dev/null +++ b/internal/app/system/model/entity/bus_question_bank.go @@ -0,0 +1,40 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-10-07 15:52:18 +// 生成路径: internal/app/system/model/entity/bus_question_bank.go +// 生成人:gfast +// desc:题库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusQuestionBank is the golang structure for table bus_question_bank. +type BusQuestionBank struct { + gmeta.Meta `orm:"table:bus_question_bank"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + CategoryId int64 `orm:"category_id" json:"categoryId"` // 题目类别 + LinkedCategoryId *LinkedBusQuestionBankBusCategory `orm:"with:id=category_id" json:"linkedCategoryId"` + QuestionType string `orm:"question_type" json:"questionType"` // 题目类型(1单选、2多选、3判断、4填空、5问答) + QuestionText string `orm:"question_text" json:"questionText"` // 题目内容 + Options string `orm:"options" json:"options"` // 选项(对单选、多选、判断这种固定答案有效,以JSON数组形式存储) + CorrectAnswer string `orm:"correct_answer" json:"correctAnswer"` // 正确答案 + Score float64 `orm:"score" json:"score"` // 得分 + WxOrPc string `orm:"wx_or_pc" json:"wxOrPc"` // 创建人类型(1pc、2小程序) + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type LinkedBusQuestionBankBusCategory struct { + gmeta.Meta `orm:"table:bus_category"` + Id int64 `orm:"id" json:"id"` // 主键ID + CategoryName string `orm:"category_name" json:"categoryName"` // 题库类别 +} diff --git a/internal/app/system/model/entity/bus_question_save.go b/internal/app/system/model/entity/bus_question_save.go new file mode 100644 index 0000000..47a232c --- /dev/null +++ b/internal/app/system/model/entity/bus_question_save.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-11-01 17:33:04 +// 生成路径: internal/app/system/model/entity/bus_question_save.go +// 生成人:gfast +// desc:用户试卷存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusQuestionSave is the golang structure for table bus_question_save. +type BusQuestionSave struct { + gmeta.Meta `orm:"table:bus_question_save"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + Openid string `orm:"openid" json:"openid"` // openid + BankId int64 `orm:"bank_id" json:"bankId"` // 题库ID + Answer string `orm:"answer" json:"answer"` // 答案 + Correct string `orm:"correct" json:"correct"` // 答题是否正确(1正确 2错误) + Score float64 `orm:"score" json:"score"` // 得分(当前题) + Sign string `orm:"sign" json:"sign"` // 签名路径 + TakeTime int64 `orm:"take_time" json:"takeTime"` // 用时时间(时间戳/秒) + TimeOut int `orm:"time_out" json:"timeOut"` // 最大超时时间(单位/分钟) + Pass string `orm:"pass" json:"pass"` // 及格线/总分(格式:60,100) + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_questions_configuration.go b/internal/app/system/model/entity/bus_questions_configuration.go new file mode 100644 index 0000000..0cf0e3b --- /dev/null +++ b/internal/app/system/model/entity/bus_questions_configuration.go @@ -0,0 +1,28 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-10-07 17:11:20 +// 生成路径: internal/app/system/model/entity/bus_questions_configuration.go +// 生成人:gfast +// desc:题库配置 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusQuestionsConfiguration is the golang structure for table bus_questions_configuration. +type BusQuestionsConfiguration struct { + gmeta.Meta `orm:"table:bus_questions_configuration"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + SingleChoice int `orm:"single_choice" json:"singleChoice"` // 单选题(单位/道) + SingleScore float64 `orm:"single_score" json:"singleScore"` // 单选分数 + MultipleChoice int `orm:"multiple_choice" json:"multipleChoice"` // 多选题(单位/道) + MultipleScore float64 `orm:"multiple_score" json:"multipleScore"` // 多选分数 + Estimate int `orm:"estimate" json:"estimate"` // 判断题(单位/道) + EstimateScore float64 `orm:"estimate_score" json:"estimateScore"` // 判断分数 + FullMark float64 `orm:"full_mark" json:"fullMark"` // 满分 + PassingScore float64 `orm:"passing_score" json:"passingScore"` // 及格线 +} diff --git a/internal/app/system/model/entity/bus_reissue_a_card.go b/internal/app/system/model/entity/bus_reissue_a_card.go new file mode 100644 index 0000000..98cd651 --- /dev/null +++ b/internal/app/system/model/entity/bus_reissue_a_card.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-02-02 15:18:48 +// 生成路径: internal/app/system/model/entity/bus_reissue_a_card.go +// 生成人:gfast +// desc:施工人员补卡申请 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusReissueACard is the golang structure for table bus_reissue_a_card. +type BusReissueACard struct { + gmeta.Meta `orm:"table:bus_reissue_a_card"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + Openid string `orm:"openid" json:"openid"` // 申请人 + Scope string `orm:"scope" json:"scope"` // 申请补卡范围 + Explain string `orm:"explain" json:"explain"` // 申请补卡说明 + Ganger string `orm:"ganger" json:"ganger"` // 班组长 + GangerOpinion string `orm:"ganger_opinion" json:"gangerOpinion"` // 班组长意见(1未读 2同意 3拒绝) + GangerExplain string `orm:"ganger_explain" json:"gangerExplain"` // 班组长说明 + GangerTime *gtime.Time `orm:"ganger_time" json:"gangerTime"` // 班组长操作时间 + ManagerOpinion string `orm:"manager_opinion" json:"managerOpinion"` // 管理员意见(1未读 2同意 3拒绝) + ManagerExplain string `orm:"manager_explain" json:"managerExplain"` // 管理员说明 + UpdateBy string `orm:"update_by" json:"updateBy"` // 后台操作人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 +} diff --git a/internal/app/system/model/entity/bus_research_document.go b/internal/app/system/model/entity/bus_research_document.go new file mode 100644 index 0000000..1216a85 --- /dev/null +++ b/internal/app/system/model/entity/bus_research_document.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-29 16:04:06 +// 生成路径: internal/app/system/model/entity/bus_research_document.go +// 生成人:gfast +// desc:科研文档 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusResearchDocument is the golang structure for table bus_research_document. +type BusResearchDocument struct { + gmeta.Meta `orm:"table:bus_research_document"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + DocumenName string `orm:"documen_name" json:"documenName"` // 文档名称 + Remark string `orm:"remark" json:"remark"` // 备注 + DocumentUrl string `orm:"document_url" json:"documentUrl"` // 文件路径 + FileId int64 `orm:"file_id" json:"fileId"` // 文件夹id + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Status string `orm:"status" json:"status"` // 状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 上传时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_safety.go b/internal/app/system/model/entity/bus_safety.go new file mode 100644 index 0000000..36c78b7 --- /dev/null +++ b/internal/app/system/model/entity/bus_safety.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-02 15:40:48 +// 生成路径: internal/app/system/model/entity/bus_safety.go +// 生成人:gfast +// desc:安全例会管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusSafety is the golang structure for table bus_safety. +type BusSafety struct { + gmeta.Meta `orm:"table:bus_safety"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + SafetyName string `orm:"safety_name" json:"safetyName"` // 安全检查名称 + SafetyExplain string `orm:"safety_explain" json:"safetyExplain"` // 安全说明 + SafetyDocument string `orm:"safety_document" json:"safetyDocument"` // 安全检查文件 + SafetyType string `orm:"safety_type" json:"safetyType"` // 安全类型 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Status string `orm:"status" json:"status"` // 帐号状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateAt string `orm:"update_at" json:"updateAt"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_salary_details.go b/internal/app/system/model/entity/bus_salary_details.go new file mode 100644 index 0000000..81c7b66 --- /dev/null +++ b/internal/app/system/model/entity/bus_salary_details.go @@ -0,0 +1,35 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-02-01 16:39:01 +// 生成路径: internal/app/system/model/entity/bus_salary_details.go +// 生成人:gfast +// desc:员工工资考核记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusSalaryDetails is the golang structure for table bus_salary_details. +type BusSalaryDetails struct { + gmeta.Meta `orm:"table:bus_salary_details"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + SfzNumber string `orm:"sfz_number" json:"sfzNumber"` // 身份证 + Name string `orm:"name" json:"name"` // 户名 + Account string `orm:"account" json:"account"` // 账户 + SumDuration float64 `orm:"sum_duration" json:"sumDuration"` // 当月总时长 + Salary float64 `orm:"salary" json:"salary"` // 薪水(天) + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + TeamId int64 `orm:"team_id" json:"teamId"` // 班组id + ProjectName string `orm:"project_name" json:"projectName"` // 项目名称 + TeamName string `orm:"team_name" json:"teamName"` // 班组名称 + DateOfIssue string `orm:"date_of_issue" json:"dateOfIssue"` // 发放年月 + Lister string `orm:"lister" json:"lister"` // 制表人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_scheduled_plan_type.go b/internal/app/system/model/entity/bus_scheduled_plan_type.go new file mode 100644 index 0000000..ff8a916 --- /dev/null +++ b/internal/app/system/model/entity/bus_scheduled_plan_type.go @@ -0,0 +1,36 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-29 17:39:12 +// 生成路径: internal/app/system/model/entity/bus_scheduled_plan_type.go +// 生成人:gfast +// desc:施工进度分类 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusScheduledPlanType is the golang structure for table bus_scheduled_plan_type. +type BusScheduledPlanType struct { + gmeta.Meta `orm:"table:bus_scheduled_plan_type"` + PlanTypeId int `orm:"plan_type_id,primary" json:"planTypeId"` // 施工类型id + ParentId int `orm:"parent_id" json:"parentId"` // 父文件id + Ancestors string `orm:"ancestors" json:"ancestors"` // 祖级列表 + PlanTypeName string `orm:"plan_type_name" json:"planTypeName"` // 施工类型名称 + PlannedTime int64 `orm:"planned_time" json:"plannedTime"` // 计划施工持续时间 + PlanStartTime string `orm:"plan_start_time" json:"planStartTime"` // 计划工期开始时间 + PlanEndTime string `orm:"plan_end_time" json:"planEndTime"` // 计划工期结束时间 + OrderNum int `orm:"order_num" json:"orderNum"` // 显示顺序 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Leader string `orm:"leader" json:"leader"` // 负责人 + Status string `orm:"status" json:"status"` // 施工类型状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_scheduled_plan_type_detail.go b/internal/app/system/model/entity/bus_scheduled_plan_type_detail.go new file mode 100644 index 0000000..ceab04a --- /dev/null +++ b/internal/app/system/model/entity/bus_scheduled_plan_type_detail.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-29 17:15:27 +// 生成路径: internal/app/system/model/entity/bus_scheduled_plan_type_detail.go +// 生成人:gfast +// desc:施工进度月报,年报分类 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusScheduledPlanTypeDetail is the golang structure for table bus_scheduled_plan_type_detail. +type BusScheduledPlanTypeDetail struct { + gmeta.Meta `orm:"table:bus_scheduled_plan_type_detail"` + PlanTypeDetailId int `orm:"plan_type_detail_id,primary" json:"planTypeDetailId"` // 施工类型id + ParentId int `orm:"parent_id" json:"parentId"` // 父文件id + Ancestors string `orm:"ancestors" json:"ancestors"` // 祖级列表 + PlanTypeName string `orm:"plan_type_name" json:"planTypeName"` // 施工类型名称 + PlannedTime int64 `orm:"planned_time" json:"plannedTime"` // 计划施工持续时间 + PlanStartTime string `orm:"plan_start_time" json:"planStartTime"` // 计划工期开始时间 + PlanEndTime string `orm:"plan_end_time" json:"planEndTime"` // 计划工期结束时间 + OrderNum int `orm:"order_num" json:"orderNum"` // 显示顺序 + DateValue string `orm:"date_value" json:"dateValue"` // 时间 + DateType string `orm:"date_type" json:"dateType"` // 日期类型状态 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Leader string `orm:"leader" json:"leader"` // 负责人 + Status string `orm:"status" json:"status"` // 施工类型状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_scheduled_weekly.go b/internal/app/system/model/entity/bus_scheduled_weekly.go new file mode 100644 index 0000000..50300c9 --- /dev/null +++ b/internal/app/system/model/entity/bus_scheduled_weekly.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-02 15:28:49 +// 生成路径: internal/app/system/model/entity/bus_scheduled_weekly.go +// 生成人:gfast +// desc:周报 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusScheduledWeekly is the golang structure for table bus_scheduled_weekly. +type BusScheduledWeekly struct { + gmeta.Meta `orm:"table:bus_scheduled_weekly"` + PlanWeeklyId int64 `orm:"plan_weekly_id,primary" json:"planWeeklyId"` // 施工周报id + PlanPeriodId int64 `orm:"plan_period_id" json:"planPeriodId"` // 施工分类id + WeeklyPlanName string `orm:"weekly_plan_name" json:"weeklyPlanName"` // 施工分类下第几周 + WeeklyStartTime string `orm:"weekly_start_time" json:"weeklyStartTime"` // 周开始时间 + WeeklyEndTime string `orm:"weekly_end_time" json:"weeklyEndTime"` // 周完成时间 + WeeklyPlanFinish string `orm:"weekly_plan_finish" json:"weeklyPlanFinish"` // 周计划完成量 + WeeklyRealityFinish string `orm:"weekly_reality_finish" json:"weeklyRealityFinish"` // 周实际完成量 + WeekyAccumulativeFinish string `orm:"weeky_accumulative_finish" json:"weekyAccumulativeFinish"` // 累计完成量 + WeekyAccumulativeTotal string `orm:"weeky_accumulative_total" json:"weekyAccumulativeTotal"` // 总量 + CompletionRate string `orm:"completion_rate" json:"completionRate"` // 累计完成比例 + Leader string `orm:"leader" json:"leader"` // 负责人 + Status string `orm:"status" json:"status"` // 施工类型状态 + WeeklyDocumentUrl string `orm:"weekly_document_url" json:"weeklyDocumentUrl"` // 施工周报文档地址 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_scheduled_weekly_photovoltaic.go b/internal/app/system/model/entity/bus_scheduled_weekly_photovoltaic.go new file mode 100644 index 0000000..179116d --- /dev/null +++ b/internal/app/system/model/entity/bus_scheduled_weekly_photovoltaic.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-02 15:21:55 +// 生成路径: internal/app/system/model/entity/bus_scheduled_weekly_photovoltaic.go +// 生成人:gfast +// desc:周报-光伏板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusScheduledWeeklyPhotovoltaic is the golang structure for table bus_scheduled_weekly_photovoltaic. +type BusScheduledWeeklyPhotovoltaic struct { + gmeta.Meta `orm:"table:bus_scheduled_weekly_photovoltaic"` + PhotovoltaicId int64 `orm:"photovoltaic_id,primary" json:"photovoltaicId"` // 序号 + PlanWeeklyId int64 `orm:"plan_weekly_id" json:"planWeeklyId"` // 周报id + PhotovoltaicNumber string `orm:"photovoltaic_number" json:"photovoltaicNumber"` // 光伏板编号 + PhotovoltaicNumberGis string `orm:"photovoltaic_number_gis" json:"photovoltaicNumberGis"` // gis地图中使用的真实的光伏板id + InstallNot string `orm:"install_not" json:"installNot"` // 是否安装 + InstallCreateTime string `orm:"install_createTime" json:"installCreateTime"` // 安装时间 + Status string `orm:"status" json:"status"` // 光伏板状态 + ProjectId string `orm:"project_id" json:"projectId"` // '项目id' + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_standing_book.go b/internal/app/system/model/entity/bus_standing_book.go new file mode 100644 index 0000000..de08df5 --- /dev/null +++ b/internal/app/system/model/entity/bus_standing_book.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-29 11:36:04 +// 生成路径: internal/app/system/model/entity/bus_standing_book.go +// 生成人:gfast +// desc:台账 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusStandingBook is the golang structure for table bus_standing_book. +type BusStandingBook struct { + gmeta.Meta `orm:"table:bus_standing_book"` + StandingBookId int64 `orm:"standing_book_id,primary" json:"standingBookId"` // 序号 + EquipmentMaterialsId int64 `orm:"equipment_materials_id" json:"equipmentMaterialsId"` // 材料/设备 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + StandingBookType string `orm:"standing_book_type" json:"standingBookType"` // 台账类型 + ApproachTime string `orm:"approach_time" json:"approachTime"` // 进场时间 + ClaimingDate string `orm:"claiming_date" json:"claimingDate"` // 领用时间 + Quantity string `orm:"quantity" json:"quantity"` // 数量 + Gross string `orm:"gross" json:"gross"` // 总量 + Status string `orm:"status" json:"status"` // 状态 + SignerRecipient string `orm:"signer_recipient" json:"signerRecipient"` // 签收领用人 + RecipientUnit string `orm:"recipient_unit" json:"recipientUnit"` // 使用单位 + StoreIssue string `orm:"store_issue" json:"storeIssue"` // 发料人 + ProcessMode string `orm:"process_mode" json:"processMode"` // 处理方式 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_tour.go b/internal/app/system/model/entity/bus_tour.go new file mode 100644 index 0000000..c690414 --- /dev/null +++ b/internal/app/system/model/entity/bus_tour.go @@ -0,0 +1,28 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-10-10 12:11:05 +// 生成路径: internal/app/system/model/entity/bus_tour.go +// 生成人:gfast +// desc:煤科巡视-故障记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusTour is the golang structure for table bus_tour. +type BusTour struct { + gmeta.Meta `orm:"table:bus_tour"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + TourCategory string `orm:"tour_category" json:"tourCategory"` // 类别字典 + TourType string `orm:"tour_type" json:"tourType"` // 类型字典 + Picture string `orm:"picture" json:"picture"` // 图片路径 + Describe string `orm:"describe" json:"describe"` // 故障描述 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_type_of_wage.go b/internal/app/system/model/entity/bus_type_of_wage.go new file mode 100644 index 0000000..9dbb764 --- /dev/null +++ b/internal/app/system/model/entity/bus_type_of_wage.go @@ -0,0 +1,28 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-05 10:07:11 +// 生成路径: internal/app/system/model/entity/bus_type_of_wage.go +// 生成人:gfast +// desc:工种薪水 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusTypeOfWage is the golang structure for table bus_type_of_wage. +type BusTypeOfWage struct { + gmeta.Meta `orm:"table:bus_type_of_wage"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + TypeOfWork string `orm:"type_of_work" json:"typeOfWork"` // 工种字典 + Standard float64 `orm:"standard" json:"standard"` // 工资标准 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_violation_level.go b/internal/app/system/model/entity/bus_violation_level.go new file mode 100644 index 0000000..8ffb088 --- /dev/null +++ b/internal/app/system/model/entity/bus_violation_level.go @@ -0,0 +1,30 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-11-20 11:18:36 +// 生成路径: internal/app/system/model/entity/bus_violation_level.go +// 生成人:gfast +// desc:违章等级 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusViolationLevel is the golang structure for table bus_violation_level. +type BusViolationLevel struct { + gmeta.Meta `orm:"table:bus_violation_level"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + Grade string `orm:"grade" json:"grade"` // 违章等级 + Color string `orm:"color" json:"color"` // 颜色 + TourType string `orm:"tour_type" json:"tourType"` // 违章类型 + WxOrPc string `orm:"wx_or_pc" json:"wxOrPc"` // 来源:1pc 2小程序 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_violation_record.go b/internal/app/system/model/entity/bus_violation_record.go new file mode 100644 index 0000000..324116a --- /dev/null +++ b/internal/app/system/model/entity/bus_violation_record.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-11-20 11:18:37 +// 生成路径: internal/app/system/model/entity/bus_violation_record.go +// 生成人:gfast +// desc:违章记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusViolationRecord is the golang structure for table bus_violation_record. +type BusViolationRecord struct { + gmeta.Meta `orm:"table:bus_violation_record"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + Openid string `orm:"openid" json:"openid"` // 处理人 + LevelId int64 `orm:"level_id" json:"levelId"` // 违章等级主键ID + TourType string `orm:"tour_type" json:"tourType"` // 违章类型 + IsDispose string `orm:"is_dispose" json:"isDispose"` // 是否处理(1待处理 2已处理) + TourId int64 `orm:"tour_id" json:"tourId"` // 违章详情(关联bus_tour) + WxOrPc string `orm:"wx_or_pc" json:"wxOrPc"` // 来源:1pc 2小程序 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/bus_weekly_security_report.go b/internal/app/system/model/entity/bus_weekly_security_report.go new file mode 100644 index 0000000..d73424b --- /dev/null +++ b/internal/app/system/model/entity/bus_weekly_security_report.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-04-02 18:03:23 +// 生成路径: internal/app/system/model/entity/bus_weekly_security_report.go +// 生成人:gfast +// desc:安全周期 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusWeeklySecurityReport is the golang structure for table bus_weekly_security_report. +type BusWeeklySecurityReport struct { + gmeta.Meta `orm:"table:bus_weekly_security_report"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目ID + ProjectName string `orm:"project_name" json:"projectName"` // 项目名称 + Scope string `orm:"scope" json:"scope"` // 周期范围 + ScopeEnd string `orm:"scope_end" json:"scopeEnd"` // 周期范围结束 + Path string `orm:"path" json:"path"` // 文件位置 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/comment_list.go b/internal/app/system/model/entity/comment_list.go new file mode 100644 index 0000000..c4236c3 --- /dev/null +++ b/internal/app/system/model/entity/comment_list.go @@ -0,0 +1,20 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// CommentList is the golang structure for table comment_list. +type CommentList struct { + Id uint `json:"id" description:""` + ProjectId int `json:"project_id" description:"项目ID"` + Receiver int `json:"receiver" description:"消息接收者"` + Content string `json:"content" description:"评论内容"` + CreatedAt *gtime.Time `json:"created_at" description:""` + Sender int `json:"sender" description:"消息的发起人"` + IsRead int `json:"is_read" description:"0 未读 | 1 已读"` +} diff --git a/internal/app/system/model/entity/comments.go b/internal/app/system/model/entity/comments.go new file mode 100644 index 0000000..5a090c1 --- /dev/null +++ b/internal/app/system/model/entity/comments.go @@ -0,0 +1,18 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// Comments is the golang structure for table comments. +type Comments struct { + Id uint `json:"id" description:"评论的主键"` + NotificationId int `json:"notification_id" description:"关联的通知ID"` + CommentText string `json:"comment_text" description:"评论内容"` + CommentId string `json:"comment_id" description:"用户ID"` + CreatedAt *gtime.Time `json:"created_at" description:""` +} diff --git a/internal/app/system/model/entity/construction_details.go b/internal/app/system/model/entity/construction_details.go new file mode 100644 index 0000000..a46e406 --- /dev/null +++ b/internal/app/system/model/entity/construction_details.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-13 18:10:56 +// 生成路径: internal/app/system/model/entity/construction_details.go +// 生成人:gfast +// desc:施工类别详情 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ConstructionDetails is the golang structure for table construction_details. +type ConstructionDetails struct { + gmeta.Meta `orm:"table:construction_details"` + Id uint64 `orm:"id,primary" json:"id"` // + CreatedBy uint64 `orm:"created_by" json:"createdBy"` // + UpdatedBy uint64 `orm:"updated_by" json:"updatedBy"` // + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // + Name string `orm:"name" json:"name"` // 施工名称 + Types string `orm:"types" json:"types"` // 施工类别 + Total int `orm:"total" json:"total"` // 总量 + ConstructionId int `orm:"construction_id" json:"constructionId"` // 施工id(父级id) + Remark string `orm:"remark" json:"remark"` // 备注 + IsPercentage int `orm:"isPercentage" json:"isPercentage"` // 数据类型是否为百分比 + StartTime *gtime.Time `orm:"start_time" json:"startTime"` // 开始时间 + EndTime *gtime.Time `orm:"end_time" json:"endTime"` // 结束时间 + Completed int `orm:"completed" json:"completed"` // 完成量 + Selectable int `orm:"selectable" json:"selectable"` // 可选择余量 + Overall int `orm:"overall" json:"overall"` // 总余量 +} diff --git a/internal/app/system/model/entity/construction_project.go b/internal/app/system/model/entity/construction_project.go new file mode 100644 index 0000000..5b009a8 --- /dev/null +++ b/internal/app/system/model/entity/construction_project.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-13 17:36:45 +// 生成路径: internal/app/system/model/entity/construction_project.go +// 生成人:gfast +// desc:施工项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ConstructionProject is the golang structure for table construction_project. +type ConstructionProject struct { + gmeta.Meta `orm:"table:construction_project"` + ConstructionId uint64 `orm:"construction_id,primary" json:"constructionId"` // 主键id + CreatedBy uint64 `orm:"created_by" json:"createdBy"` // + UpdatedBy uint64 `orm:"updated_by" json:"updatedBy"` // + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // + FangzhenId int `orm:"fangzhen_id" json:"fangzhenId"` // 方阵id + ConstructionName string `orm:"construction_name" json:"constructionName"` // 施工名称 + Total int `orm:"total" json:"total"` // 总量 + Remark string `orm:"remark" json:"remark"` // 备注 + IsPercentage int `orm:"isPercentage" json:"isPercentage"` // 数据类型是否为百分比 + EndTime *gtime.Time `orm:"end_time" json:"endTime"` // 结束时间 + StartTime *gtime.Time `orm:"start_time" json:"startTime"` // 开始时间 +} diff --git a/internal/app/system/model/entity/device.go b/internal/app/system/model/entity/device.go new file mode 100644 index 0000000..225694a --- /dev/null +++ b/internal/app/system/model/entity/device.go @@ -0,0 +1,25 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-11-24 09:57:07 +// 生成路径: internal/app/system/model/entity/device.go +// 生成人:gfast +// desc:安全帽设备(java) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// Device is the golang structure for table device. +type Device struct { + gmeta.Meta `orm:"table:device"` + DevNum string `orm:"devNum,primary" json:"devNum"` // 设备编号 + DevName string `orm:"devName" json:"devName"` // 设备名称 + Status int `orm:"status" json:"status"` // 状态 + CreateTime *gtime.Time `orm:"createTime" json:"createTime"` // 添加时间 + UpdateTime *gtime.Time `orm:"updateTime" json:"updateTime"` // 修改时间 +} diff --git a/internal/app/system/model/entity/device_preset.go b/internal/app/system/model/entity/device_preset.go new file mode 100644 index 0000000..ad6ed87 --- /dev/null +++ b/internal/app/system/model/entity/device_preset.go @@ -0,0 +1,19 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// DevicePreset is the golang structure for table device_preset. +type DevicePreset struct { + Id uint `json:"id" description:"主键ID"` + CreatedAt *gtime.Time `json:"createdAt" description:"创建时间"` + DeviceSerial string `json:"deviceSerial" description:"设备序列号"` + ChannelNo string `json:"channelNo" description:"通道号"` + Index int `json:"index" description:"预置点序号"` + Name string `json:"name" description:"预置点"` +} diff --git a/internal/app/system/model/entity/document.go b/internal/app/system/model/entity/document.go new file mode 100644 index 0000000..a77e597 --- /dev/null +++ b/internal/app/system/model/entity/document.go @@ -0,0 +1,30 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-16 10:32:04 +// 生成路径: internal/app/system/model/entity/document.go +// 生成人:gfast +// desc:母板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// Document is the golang structure for table document. +type Document struct { + gmeta.Meta `orm:"table:document"` + Id int `orm:"id,primary" json:"id"` // 序号 + Pid int64 `orm:"pid" json:"pid"` // 父级(0代表顶级) + Name string `orm:"name" json:"name"` // 模板名称 + FilenPath string `orm:"filen_path" json:"filenPath"` // 模板路径 + Type string `orm:"type" json:"type"` // 类型(1文件-2文件夹) + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/document_completion.go b/internal/app/system/model/entity/document_completion.go new file mode 100644 index 0000000..9fe23a4 --- /dev/null +++ b/internal/app/system/model/entity/document_completion.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-15 10:25:00 +// 生成路径: internal/app/system/model/entity/document_completion.go +// 生成人:gfast +// desc:竣工图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// DocumentCompletion is the golang structure for table document_completion. +type DocumentCompletion struct { + gmeta.Meta `orm:"table:document_completion"` + Id int64 `orm:"id,primary" json:"id"` // + IdStr string `orm:"id_str" json:"idStr"` // 模板id + Pid string `orm:"pid" json:"pid"` // 父级(0代表顶级) + Name string `orm:"name" json:"name"` // 模板名称 + FilenPath string `orm:"filen_path" json:"filenPath"` // 模板文件名 + Type string `orm:"type" json:"type"` // 类型(1文件-2文件夹) + Suffix string `orm:"suffix" json:"suffix"` // 后缀 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id +} diff --git a/internal/app/system/model/entity/document_data.go b/internal/app/system/model/entity/document_data.go new file mode 100644 index 0000000..1ac4045 --- /dev/null +++ b/internal/app/system/model/entity/document_data.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-12-27 09:30:04 +// 生成路径: internal/app/system/model/entity/document_data.go +// 生成人:gfast +// desc:工程资料>资料 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// DocumentData is the golang structure for table document_data. +type DocumentData struct { + gmeta.Meta `orm:"table:document_data"` + Id int64 `orm:"id,primary" json:"id"` // + IdStr string `orm:"id_str" json:"idStr"` // 模板id + Pid string `orm:"pid" json:"pid"` // 父级(0代表顶级) + Name string `orm:"name" json:"name"` // 模板名称 + FilenPath string `orm:"filen_path" json:"filenPath"` // 模板文件名 + Type string `orm:"type" json:"type"` // 类型(1文件-2文件夹) + Suffix string `orm:"suffix" json:"suffix"` // 后缀 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/document_production_drawing.go b/internal/app/system/model/entity/document_production_drawing.go new file mode 100644 index 0000000..5a2a794 --- /dev/null +++ b/internal/app/system/model/entity/document_production_drawing.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-15 10:24:54 +// 生成路径: internal/app/system/model/entity/document_production_drawing.go +// 生成人:gfast +// desc:施工图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// DocumentProductionDrawing is the golang structure for table document_production_drawing. +type DocumentProductionDrawing struct { + gmeta.Meta `orm:"table:document_production_drawing"` + Id int64 `orm:"id,primary" json:"id"` // + IdStr string `orm:"id_str" json:"idStr"` // 模板id + Pid string `orm:"pid" json:"pid"` // 父级(0代表顶级) + Name string `orm:"name" json:"name"` // 模板名称 + FilenPath string `orm:"filen_path" json:"filenPath"` // 模板文件名 + Type string `orm:"type" json:"type"` // 类型(1文件-2文件夹) + Suffix string `orm:"suffix" json:"suffix"` // 后缀 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id +} diff --git a/internal/app/system/model/entity/document_project.go b/internal/app/system/model/entity/document_project.go new file mode 100644 index 0000000..31024d9 --- /dev/null +++ b/internal/app/system/model/entity/document_project.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-16 10:32:03 +// 生成路径: internal/app/system/model/entity/document_project.go +// 生成人:gfast +// desc:项目模板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// DocumentProject is the golang structure for table document_project. +type DocumentProject struct { + gmeta.Meta `orm:"table:document_project"` + Id int `orm:"id,primary" json:"id"` // 序号 + Pid int `orm:"pid" json:"pid"` // 父级(0代表顶级) + Name string `orm:"name" json:"name"` // 模板名称 + FilePath string `orm:"file_path" json:"filePath"` // 模板路径 + Type string `orm:"type" json:"type"` // 类型(1文件-2文件夹) + Json string `orm:"json" json:"json"` // 保存后的json文件名 + ProjectId int `orm:"project_id" json:"projectId"` // 项目id + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/document_quality_meeting.go b/internal/app/system/model/entity/document_quality_meeting.go new file mode 100644 index 0000000..f3aa20a --- /dev/null +++ b/internal/app/system/model/entity/document_quality_meeting.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-25 16:43:56 +// 生成路径: internal/app/system/model/entity/document_quality_meeting.go +// 生成人:gfast +// desc:质量会议 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// DocumentQualityMeeting is the golang structure for table document_quality_meeting. +type DocumentQualityMeeting struct { + gmeta.Meta `orm:"table:document_quality_meeting"` + Id int64 `orm:"id,primary" json:"id"` // + IdStr string `orm:"id_str" json:"idStr"` // 模板id + Pid string `orm:"pid" json:"pid"` // 父级(0代表顶级) + Name string `orm:"name" json:"name"` // 模板名称 + FilenPath string `orm:"filen_path" json:"filenPath"` // 模板文件名 + Type string `orm:"type" json:"type"` // 类型(1文件-2文件夹) + Suffix string `orm:"suffix" json:"suffix"` // 后缀 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id +} diff --git a/internal/app/system/model/entity/document_report.go b/internal/app/system/model/entity/document_report.go new file mode 100644 index 0000000..89b56f7 --- /dev/null +++ b/internal/app/system/model/entity/document_report.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-15 10:24:21 +// 生成路径: internal/app/system/model/entity/document_report.go +// 生成人:gfast +// desc:科研及专题报告 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// DocumentReport is the golang structure for table document_report. +type DocumentReport struct { + gmeta.Meta `orm:"table:document_report"` + Id int64 `orm:"id,primary" json:"id"` // + IdStr string `orm:"id_str" json:"idStr"` // 模板id + Pid string `orm:"pid" json:"pid"` // 父级(0代表顶级) + Name string `orm:"name" json:"name"` // 模板名称 + FilenPath string `orm:"filen_path" json:"filenPath"` // 模板文件名 + Type string `orm:"type" json:"type"` // 类型(1文件-2文件夹) + Suffix string `orm:"suffix" json:"suffix"` // 后缀 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id +} diff --git a/internal/app/system/model/entity/document_safety_meeting.go b/internal/app/system/model/entity/document_safety_meeting.go new file mode 100644 index 0000000..e800827 --- /dev/null +++ b/internal/app/system/model/entity/document_safety_meeting.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-04-09 11:40:21 +// 生成路径: internal/app/system/model/entity/document_safety_meeting.go +// 生成人:gfast +// desc:安全会议 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// DocumentSafetyMeeting is the golang structure for table document_safety_meeting. +type DocumentSafetyMeeting struct { + gmeta.Meta `orm:"table:document_safety_meeting"` + Id int64 `orm:"id,primary" json:"id"` // + IdStr string `orm:"id_str" json:"idStr"` // 模板id + Pid string `orm:"pid" json:"pid"` // 父级(0代表顶级) + Name string `orm:"name" json:"name"` // 模板名称 + FilenPath string `orm:"filen_path" json:"filenPath"` // 模板文件名 + Type string `orm:"type" json:"type"` // 类型(1文件-2文件夹) + Suffix string `orm:"suffix" json:"suffix"` // 后缀 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id +} diff --git a/internal/app/system/model/entity/equipment.go b/internal/app/system/model/entity/equipment.go new file mode 100644 index 0000000..51ed687 --- /dev/null +++ b/internal/app/system/model/entity/equipment.go @@ -0,0 +1,37 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// Equipment is the golang structure for table equipment. +type Equipment struct { + PlantId string `json:"plant_id" description:"所属电站ID"` + DivertorId string `json:"divertor_id" description:"分流器ID"` + DivertorName string `json:"divertor_name" description:"分流器名称"` + EquipmentName string `json:"equipment_name" description:"设备名称"` + EquipmentPn string `json:"equipment_pn" description:"设备型号"` + EquipmentSn string `json:"equipment_sn" description:"设备序列号"` + Id string `json:"id" description:"设备ID"` + Kwp int `json:"kwp" description:"总容量kwp"` + MonKwh int `json:"mon_kwh" description:"当月发电量"` + NowKw int `json:"now_kw" description:"实时功率"` + ParamDcacCode string `json:"param_dcac_code" description:"DC/AC参数代码"` + ParamDcdcCode string `json:"param_dcdc_code" description:"DC/DC参数代码"` + PowerPlantId string `json:"power_plant_id" description:"电站ID"` + PowerPlantName string `json:"power_plant_name" description:"电站名称"` + RatedPower int `json:"rated_power" description:"额定功率"` + SoftDcacCode string `json:"soft_dcac_code" description:"软件DC/AC代码"` + SoftDcdcCode string `json:"soft_dcdc_code" description:"软件DC/DC代码"` + Status int `json:"status" description:"状态"` + SumKwh int `json:"sum_kwh" description:"总发电量"` + TodayKwh int `json:"today_kwh" description:"当日发电量"` + UpdateTime *gtime.Time `json:"update_time" description:"更新时间"` + UserId string `json:"user_id" description:"用户ID"` + UserName string `json:"user_name" description:"用户名"` + YearKwh int `json:"year_kwh" description:"年发电量"` +} diff --git a/internal/app/system/model/entity/manage_airline.go b/internal/app/system/model/entity/manage_airline.go new file mode 100644 index 0000000..ea28e08 --- /dev/null +++ b/internal/app/system/model/entity/manage_airline.go @@ -0,0 +1,30 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-12-11 16:10:19 +// 生成路径: internal/app/system/model/entity/manage_airline.go +// 生成人:gfast +// desc:航线 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageAirline is the golang structure for table manage_airline. +type ManageAirline struct { + gmeta.Meta `orm:"table:manage_airline"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + AirLine string `orm:"air_line" json:"airLine"` // 航线名称 + FilePath string `orm:"file_path" json:"filePath"` // 航线文件 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Remark string `orm:"remark" json:"remark"` // 备注 +} diff --git a/internal/app/system/model/entity/manage_device.go b/internal/app/system/model/entity/manage_device.go new file mode 100644 index 0000000..f94938e --- /dev/null +++ b/internal/app/system/model/entity/manage_device.go @@ -0,0 +1,43 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-11-14 10:53:21 +// 生成路径: internal/app/system/model/entity/manage_device.go +// 生成人:gfast +// desc:设备信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageDevice is the golang structure for table manage_device. +type ManageDevice struct { + gmeta.Meta `orm:"table:manage_device"` + Id uint64 `orm:"id,primary" json:"id"` // 自增ID + DeviceSn string `orm:"device_sn" json:"deviceSn"` // 对接站点、无人机或遥控器的序列号 + DeviceName string `orm:"device_name" json:"deviceName"` // 设备的型号。该参数对应设备字典表中的设备名称 + UserId string `orm:"user_id" json:"userId"` // 设备绑定时使用的账号 + Nickname string `orm:"nickname" json:"nickname"` // 设备的自定义名称 + WorkspaceId string `orm:"workspace_id" json:"workspaceId"` // 当前设备所属的工作区 + DeviceType int64 `orm:"device_type" json:"deviceType"` // 该参数对应设备字典表中的设备类型 + SubType int64 `orm:"sub_type" json:"subType"` // 该参数对应设备字典表中的子类型 + Domain int64 `orm:"domain" json:"domain"` // 该参数对应设备字典表中的域 + FirmwareVersion string `orm:"firmware_version" json:"firmwareVersion"` // 设备的固件版本 + CompatibleStatus int `orm:"compatible_status" json:"compatibleStatus"` // 1: 一致;0: 不一致;固件版本是否一致 + Version string `orm:"version" json:"version"` // 协议版本。该字段目前没有用处。 + DeviceIndex string `orm:"device_index" json:"deviceIndex"` // 无人机的控制,A控制或B控制 + ChildSn string `orm:"child_sn" json:"childSn"` // 由网关控制的设备 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + BoundTime *gtime.Time `orm:"bound_time" json:"boundTime"` // 设备绑定工作区的时间 + BoundStatus int `orm:"bound_status" json:"boundStatus"` // 设备绑定工作区的状态。1: 已绑定;0: 未绑定 + LoginTime *gtime.Time `orm:"login_time" json:"loginTime"` // 设备的上次登录时间 + DeviceDesc string `orm:"device_desc" json:"deviceDesc"` // 设备描述 + UrlNormal string `orm:"url_normal" json:"urlNormal"` // 遥控器上显示的图标 + UrlSelect string `orm:"url_select" json:"urlSelect"` // 选中遥控器时显示的图标 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id +} diff --git a/internal/app/system/model/entity/manage_operation_log.go b/internal/app/system/model/entity/manage_operation_log.go new file mode 100644 index 0000000..715eb56 --- /dev/null +++ b/internal/app/system/model/entity/manage_operation_log.go @@ -0,0 +1,25 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-06-21 15:23:29 +// 生成路径: internal/app/system/model/entity/manage_operation_log.go +// 生成人:gfast +// desc:无人机指令日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageOperationLog is the golang structure for table manage_operation_log. +type ManageOperationLog struct { + gmeta.Meta `orm:"table:manage_operation_log"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + Sn string `orm:"sn" json:"sn"` // sn + Method string `orm:"method" json:"method"` // 方法名 + Direction string `orm:"direction" json:"direction"` // 上发/下发命令 + Code int `orm:"code" json:"code"` // 状态码 + Operator int64 `orm:"operator" json:"operator"` // 操作人ID(默认为0表示系统操作) +} diff --git a/internal/app/system/model/entity/manage_task.go b/internal/app/system/model/entity/manage_task.go new file mode 100644 index 0000000..fe31e11 --- /dev/null +++ b/internal/app/system/model/entity/manage_task.go @@ -0,0 +1,39 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-12-12 15:21:22 +// 生成路径: internal/app/system/model/entity/manage_task.go +// 生成人:gfast +// desc:航线任务下发 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageTask is the golang structure for table manage_task. +type ManageTask struct { + gmeta.Meta `orm:"table:manage_task"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + TaskName string `orm:"task_name" json:"taskName"` // 任务名称 + FlightId string `orm:"flight_id" json:"flightId"` // 计划ID(uuid) + TaskType string `orm:"task_type" json:"taskType"` // 任务类型("0":"立即任务","1":"定时任务","2":"条件任务") + ExecuteTime int64 `orm:"execute_time" json:"executeTime"` // 任务开始执行时间毫秒时间戳 + WaylineType int `orm:"wayline_type" json:"waylineType"` // 0普通航线 + Airport int64 `orm:"airport" json:"airport"` // 关联机场 + AirLine int64 `orm:"air_line" json:"airLine"` // 关联航线 + ProjectId int64 `orm:"project_id" json:"projectId"` // 关联项目 + RthAltitude string `orm:"rth_altitude" json:"rthAltitude"` // 返航高度 + RthMode int `orm:"rth_mode" json:"rthMode"` // (默认为0)"0":"智能高度","1":"设定高度" + OutOfControlAction int `orm:"out_of_control_action" json:"outOfControlAction"` // (默认为0)"0":"返航","1":"悬停","2":"降落" + ExitWaylineWhenRcLost int `orm:"exit_wayline_when_rc_lost" json:"exitWaylineWhenRcLost"` // (默认为0)"0":"继续执行航线任务","1":"退出航线任务,执行遥控器失控动作" + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Remark string `orm:"remark" json:"remark"` // 备注 +} diff --git a/internal/app/system/model/entity/manage_task_cron.go b/internal/app/system/model/entity/manage_task_cron.go new file mode 100644 index 0000000..0fd92b0 --- /dev/null +++ b/internal/app/system/model/entity/manage_task_cron.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-06-04 14:33:05 +// 生成路径: internal/app/system/model/entity/manage_task_cron.go +// 生成人:gfast +// desc:航线任务定时飞行 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageTaskCron is the golang structure for table manage_task_cron. +type ManageTaskCron struct { + gmeta.Meta `orm:"table:manage_task_cron"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + MqClientId string `orm:"mq_client_id" json:"mqClientId"` // sn + TaskId int64 `orm:"task_id" json:"taskId"` // 任务模板ID + Cron string `orm:"cron" json:"cron"` // 表达式 + CronId int `orm:"cron_id" json:"cronId"` // cronID +} diff --git a/internal/app/system/model/entity/manage_task_record.go b/internal/app/system/model/entity/manage_task_record.go new file mode 100644 index 0000000..11b6eec --- /dev/null +++ b/internal/app/system/model/entity/manage_task_record.go @@ -0,0 +1,35 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-12-12 17:56:19 +// 生成路径: internal/app/system/model/entity/manage_task_record.go +// 生成人:gfast +// desc:航线任务下发-记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageTaskRecord is the golang structure for table manage_task_record. +type ManageTaskRecord struct { + gmeta.Meta `orm:"table:manage_task_record"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + TaskId int64 `orm:"task_id" json:"taskId"` // 任务主键ID + TaskType string `orm:"task_type" json:"taskType"` // 任务类型("0":"立即任务","1":"定时任务","2":"条件任务") + ExecuteTime int64 `orm:"execute_time" json:"executeTime"` // 任务开始执行时间(毫秒) + CancelTime int64 `orm:"cancel_time" json:"cancelTime"` // 任务取消时间戳 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Remark string `orm:"remark" json:"remark"` // 备注 + Suspend int64 `orm:"suspend" json:"suspend"` // 航线暂停时间戳 + Recover int64 `orm:"recover" json:"recover"` // 航线恢复时间戳 + CourseReversal int64 `orm:"course_reversal" json:"courseReversal"` // 返航时间戳 + CancelHoming int64 `orm:"cancel_homing" json:"cancelHoming"` // 取消返航时间戳 +} diff --git a/internal/app/system/model/entity/manage_task_record_resource.go b/internal/app/system/model/entity/manage_task_record_resource.go new file mode 100644 index 0000000..28e12d9 --- /dev/null +++ b/internal/app/system/model/entity/manage_task_record_resource.go @@ -0,0 +1,34 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-05-30 17:07:01 +// 生成路径: internal/app/system/model/entity/manage_task_record_resource.go +// 生成人:gfast +// desc:下发记录回传的媒体文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageTaskRecordResource is the golang structure for table manage_task_record_resource. +type ManageTaskRecordResource struct { + gmeta.Meta `orm:"table:manage_task_record_resource"` + FlightId string `orm:"flight_id,primary" json:"flightId"` // 计划ID + FileName string `orm:"file_name" json:"fileName"` // 文件名称 + ObjectKey string `orm:"object_key" json:"objectKey"` // 文件在对象存储桶的 Key + Path string `orm:"path" json:"path"` // 文件的业务路径 + DroneModelKey string `orm:"drone_model_key" json:"droneModelKey"` // 飞行器产品枚举值 + PayloadModelKey string `orm:"payload_model_key" json:"payloadModelKey"` // 负载产品枚举值 + AbsoluteAltitude float64 `orm:"absolute_altitude" json:"absoluteAltitude"` // 拍摄绝对高度 + RelativeAltitude float64 `orm:"relative_altitude" json:"relativeAltitude"` // 拍摄相对高度 + CreateTime *gtime.Time `orm:"create_time" json:"createTime"` // 媒体拍摄时间 + ShootPosition string `orm:"shoot_position" json:"shootPosition"` // 拍摄位置 + Lat string `orm:"lat" json:"lat"` // 拍摄位置纬度 + Lng string `orm:"lng" json:"lng"` // 拍摄位置经度 + Img string `orm:"img" json:"img"` // 图片位置 + ImgSize string `orm:"img_size" json:"imgSize"` // 图片大小 +} diff --git a/internal/app/system/model/entity/manage_task_result.go b/internal/app/system/model/entity/manage_task_result.go new file mode 100644 index 0000000..3f20ca8 --- /dev/null +++ b/internal/app/system/model/entity/manage_task_result.go @@ -0,0 +1,18 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// ManageTaskResult is the golang structure for table manage_task_result. +type ManageTaskResult struct { + Id uint `json:"id" orm:"id" description:""` + TaskId int `json:"task_id" orm:"task_id" description:"航线任务ID"` + PvId int `json:"pv_id" orm:"pv_id" description:"pv_module 的主键"` + CreatedAt *gtime.Time `json:"created_at" orm:"created_at" description:""` + DeletedAt *gtime.Time `json:"deleted_at" orm:"deleted_at" description:""` +} diff --git a/internal/app/system/model/entity/manage_workspace.go b/internal/app/system/model/entity/manage_workspace.go new file mode 100644 index 0000000..b0c5ead --- /dev/null +++ b/internal/app/system/model/entity/manage_workspace.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-11-14 10:53:20 +// 生成路径: internal/app/system/model/entity/manage_workspace.go +// 生成人:gfast +// desc:工作空间 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageWorkspace is the golang structure for table manage_workspace. +type ManageWorkspace struct { + gmeta.Meta `orm:"table:manage_workspace"` + Id uint64 `orm:"id,primary" json:"id"` // 自增ID + WorkspaceId string `orm:"workspace_id" json:"workspaceId"` // 工作区的UUID + WorkspaceName string `orm:"workspace_name" json:"workspaceName"` // 工作区的名称 + WorkspaceDesc string `orm:"workspace_desc" json:"workspaceDesc"` // 工作区的描述 + PlatformName string `orm:"platform_name" json:"platformName"` // 工作区的平台名称 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + BindCode string `orm:"bind_code" json:"bindCode"` // 当停机坪连接到第三方云时,需要提供该工作区的绑定码 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id +} diff --git a/internal/app/system/model/entity/master_schedule.go b/internal/app/system/model/entity/master_schedule.go new file mode 100644 index 0000000..b8cf29f --- /dev/null +++ b/internal/app/system/model/entity/master_schedule.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-10-08 09:38:35 +// 生成路径: internal/app/system/model/entity/master_schedule.go +// 生成人:gfast +// desc:总进度计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// MasterSchedule is the golang structure for table master_schedule. +type MasterSchedule struct { + gmeta.Meta `orm:"table:master_schedule"` + Id int `orm:"id,primary" json:"id"` // + ProjectId int `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 工作名称 + Start string `orm:"start" json:"start"` // 开始时间 + End string `orm:"end" json:"end"` // 结束时间 + Content string `orm:"content" json:"content"` // 备注 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Sequence int `orm:"sequence" json:"sequence"` // 顺序编号 +} diff --git a/internal/app/system/model/entity/notification_files.go b/internal/app/system/model/entity/notification_files.go new file mode 100644 index 0000000..afa802f --- /dev/null +++ b/internal/app/system/model/entity/notification_files.go @@ -0,0 +1,20 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// NotificationFiles is the golang structure for table notification_files. +type NotificationFiles struct { + Id uint `json:"id" description:"主键ID"` + CreatedAt *gtime.Time `json:"created_at" description:""` + NotificationId int `json:"notification_id" description:"关联的通知或新闻ID"` + FileName string `json:"file_name" description:"文件名"` + FilePath string `json:"file_path" description:"保存路径"` + FileType string `json:"file_type" description:"文件类型"` + FileSize int `json:"file_size" description:"文件大小"` +} diff --git a/internal/app/system/model/entity/notification_recipients.go b/internal/app/system/model/entity/notification_recipients.go new file mode 100644 index 0000000..9f0dba3 --- /dev/null +++ b/internal/app/system/model/entity/notification_recipients.go @@ -0,0 +1,21 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// NotificationRecipients is the golang structure for table notification_recipients. +type NotificationRecipients struct { + Id uint `json:"id" description:""` + CreatedAt *gtime.Time `json:"created_at" description:""` + NotificationId int `json:"notification_id" description:"关联的通知ID"` + RecipientId int `json:"recipient_id" description:"接收者ID"` + RecipientRole string `json:"recipient_role" description:"接收者权限"` + NotificationStatus int `json:"notification_status" description:"0 未读 | 1 已读"` + ReadTime string `json:"read_time" description:"消息已读时间"` + IntroduceId string `json:"introduce_id" description:"关联的项目新闻ID"` +} diff --git a/internal/app/system/model/entity/notifications.go b/internal/app/system/model/entity/notifications.go new file mode 100644 index 0000000..1a31131 --- /dev/null +++ b/internal/app/system/model/entity/notifications.go @@ -0,0 +1,25 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// Notifications is the golang structure for table notifications. +type Notifications struct { + Id uint `json:"id" description:""` + CreatedAt *gtime.Time `json:"created_at" description:""` + NotificationText string `json:"notification_text" description:"通知正文"` + Route string `json:"route" description:"跳转的路由"` + NotificationTime string `json:"notification_time" description:"通知时间"` + Initiator int `json:"initiator" description:"发起人"` + ProjectId int `json:"project_id" description:"项目ID"` + Positions string `json:"positions" description:"通知岗位列表"` + Title string `json:"title" description:"通知标题"` + IsApp int `json:"is_app" description:"0 PC | 1 App | 2 新闻"` + Files string `json:"files" description:"附件"` + IntroduceId int `json:"introduce_id" description:"项目新闻的ID"` +} diff --git a/internal/app/system/model/entity/plan_daily.go b/internal/app/system/model/entity/plan_daily.go new file mode 100644 index 0000000..a7ac178 --- /dev/null +++ b/internal/app/system/model/entity/plan_daily.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-26 14:31:07 +// 生成路径: internal/app/system/model/entity/plan_daily.go +// 生成人:gfast +// desc:日报 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// PlanDaily is the golang structure for table plan_daily. +type PlanDaily struct { + gmeta.Meta `orm:"table:plan_daily"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + Name string `orm:"name" json:"name"` // 资源名称 + Table string `orm:"table" json:"table"` // source_id的数据对应的数据表 + PlanName string `orm:"plan_name" json:"planName"` // 计划名称 + PlanId string `orm:"plan_id" json:"planId"` // 周id + WeekRealityId int `orm:"week_reality_id" json:"weekRealityId"` // 周主键ID + SourceType string `orm:"source_type" json:"sourceType"` // 资源类型 + Cnt int `orm:"cnt" json:"cnt"` // 资源数量 + DataTime string `orm:"data_time" json:"dataTime"` // 日计划时间 + Status int `orm:"status" json:"status"` // 工作状态 + CreateBy string `orm:"create_by" json:"createBy"` // + UpdateBy string `orm:"update_by" json:"updateBy"` // + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // +} diff --git a/internal/app/system/model/entity/plan_week.go b/internal/app/system/model/entity/plan_week.go new file mode 100644 index 0000000..bdd9d28 --- /dev/null +++ b/internal/app/system/model/entity/plan_week.go @@ -0,0 +1,35 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-04 17:26:59 +// 生成路径: internal/app/system/model/entity/plan_week.go +// 生成人:gfast +// desc:周计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// PlanWeek is the golang structure for table plan_week. +type PlanWeek struct { + gmeta.Meta `orm:"table:plan_week"` + Id int `orm:"id,primary" json:"id"` // + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + Name string `orm:"name" json:"name"` // 资源名称 + Start string `orm:"start" json:"start"` // 开始时间 + End string `orm:"end" json:"end"` // 结束时间 + PlanName string `orm:"plan_name" json:"planName"` // 计划名称 + PlanId string `orm:"plan_id" json:"planId"` // 周id + CreateBy string `orm:"create_by" json:"createBy"` // + UpdateBy string `orm:"update_by" json:"updateBy"` // + CreateAt *gtime.Time `orm:"create_at" json:"createAt"` // + UpdateAt *gtime.Time `orm:"update_at" json:"updateAt"` // + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // + Table string `orm:"table" json:"table"` // source_id的数据对应的数据表 + Status int `orm:"status" json:"status"` // 工作状态,0:未开始,1:进行中,2:已完成 +} diff --git a/internal/app/system/model/entity/plan_week_reality.go b/internal/app/system/model/entity/plan_week_reality.go new file mode 100644 index 0000000..158ffdb --- /dev/null +++ b/internal/app/system/model/entity/plan_week_reality.go @@ -0,0 +1,36 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-17 17:23:07 +// 生成路径: internal/app/system/model/entity/plan_week_reality.go +// 生成人:xyb +// desc:实际完成的周计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// PlanWeekReality is the golang structure for table plan_week_reality. +type PlanWeekReality struct { + gmeta.Meta `orm:"table:plan_week_reality"` + Id int `orm:"id,primary" json:"id"` // + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + Name string `orm:"name" json:"name"` // 资源名称 + Start string `orm:"start" json:"start"` // 开始时间 + End string `orm:"end" json:"end"` // 结束时间 + PlanName string `orm:"plan_name" json:"planName"` // 计划名称 + PlanId string `orm:"plan_id" json:"planId"` // 周id + CreateBy string `orm:"create_by" json:"createBy"` // + UpdateBy string `orm:"update_by" json:"updateBy"` // + CreateAt *gtime.Time `orm:"create_at" json:"createAt"` // + UpdateAt *gtime.Time `orm:"update_at" json:"updateAt"` // + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // + Table string `orm:"table" json:"table"` // source_id的数据对应的数据表 + Status int `orm:"status" json:"status"` // 工作状态,0:未开始,1:进行中,2:已完成 + SourceType string `orm:"source_type" json:"sourceType"` // 资源类型 +} diff --git a/internal/app/system/model/entity/plant.go b/internal/app/system/model/entity/plant.go new file mode 100644 index 0000000..2c128d7 --- /dev/null +++ b/internal/app/system/model/entity/plant.go @@ -0,0 +1,55 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-04-12 10:38:43 +// 生成路径: internal/app/system/model/entity/plant.go +// 生成人:gfast +// desc:电站信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// Plant is the golang structure for table plant. +type Plant struct { + gmeta.Meta `orm:"table:plant"` + Id string `orm:"id,primary" json:"id"` // 电站Id + Name string `orm:"name" json:"name"` // 电站名称 + Address string `orm:"address" json:"address"` // 详细地址 + City string `orm:"city" json:"city"` // 市 + District string `orm:"district" json:"district"` // 区 + Province string `orm:"province" json:"province"` // 省 + Latitude float64 `orm:"latitude" json:"latitude"` // 纬度 + Longitude float64 `orm:"longitude" json:"longitude"` // 经度 + Kwp float64 `orm:"kwp" json:"kwp"` // 总容量kwp + MonKwh float64 `orm:"monKwh" json:"monKwh"` // 当月发电量 + NowKw float64 `orm:"nowKw" json:"nowKw"` // 实时功率 + SumKwh float64 `orm:"sumKwh" json:"sumKwh"` // 总发电量 + TodayKwh float64 `orm:"todayKwh" json:"todayKwh"` // 当日发电量 + YearKwh float64 `orm:"yearKwh" json:"yearKwh"` // 当年发电量 + NetworkTime *gtime.Time `orm:"networkTime" json:"networkTime"` // 并网日期 + UpdateTime *gtime.Time `orm:"updateTime" json:"updateTime"` // 修改时间 + CompanyId string `orm:"companyId" json:"companyId"` // 渠道商Id + CompanyName string `orm:"companyName" json:"companyName"` // 渠道商名称 + OwnerId string `orm:"ownerId" json:"ownerId"` // 业主Id + OwnerName string `orm:"ownerName" json:"ownerName"` // 业主姓名 + ServiceProviderName string `orm:"serviceProviderName" json:"serviceProviderName"` // 安装商名称 + ServiceProviderPhone string `orm:"serviceProviderPhone" json:"serviceProviderPhone"` // 安装服务商电话 + NetworkType string `orm:"networkType" json:"networkType"` // 并网类型 1:全额上网 2:自发自用余电上网 3:自发自用无馈网 4:离网 + PowerPlantType string `orm:"powerPlantType" json:"powerPlantType"` // 电站类型 1:家庭户用 2:工商业屋顶 3:地面电站 4:扶贫电站 5:储能电站 + Status int `orm:"status" json:"status"` // 电站状态 0:未绑定 1:在线 2:停机 3:停机告警 4:运行告警 5:故障 6:离线 + PaymentType string `orm:"paymentType" json:"paymentType"` // 出资方式 + PlantContact string `orm:"plantContact" json:"plantContact"` // 电站联系人 + PlantContactPhone string `orm:"plantContactPhone" json:"plantContactPhone"` // 电站联系人电话 + PlantImg string `orm:"plantImg" json:"plantImg"` // 电站图片 + Remark string `orm:"remark" json:"remark"` // 备注 + DipAngle float64 `orm:"dipAngle" json:"dipAngle"` // 倾角度数 + OrientationAngle float64 `orm:"orientationAngle" json:"orientationAngle"` // 方位角度数 + SubassemblyNumber int `orm:"subassemblyNumber" json:"subassemblyNumber"` // 组件数量 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 +} diff --git a/internal/app/system/model/entity/project_finance.go b/internal/app/system/model/entity/project_finance.go new file mode 100644 index 0000000..2232477 --- /dev/null +++ b/internal/app/system/model/entity/project_finance.go @@ -0,0 +1,35 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-04-29 12:01:01 +// 生成路径: internal/app/system/model/entity/project_finance.go +// 生成人:gfast +// desc:项目财务 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ProjectFinance is the golang structure for table project_finance. +type ProjectFinance struct { + gmeta.Meta `orm:"table:project_finance"` + Id int `orm:"id,primary" json:"id"` // 主键 + ProjectId int `orm:"project_id" json:"projectId"` // 项目ID + ContractAmount float64 `orm:"contract_amount" json:"contractAmount"` // 承包合同金额 + SubcontractAmount float64 `orm:"subcontract_amount" json:"subcontractAmount"` // 分包合同金额 + AmountReceived float64 `orm:"amount_received" json:"amountReceived"` // 已收款 + AmountPaid float64 `orm:"amount_paid" json:"amountPaid"` // 已付款 + ExpensesReimbursed float64 `orm:"expenses_reimbursed" json:"expensesReimbursed"` // 已费用报销 + EstimatedGrossProfit float64 `orm:"estimated_gross_profit" json:"estimatedGrossProfit"` // 预计毛利润 + CurrentProfit float64 `orm:"current_profit" json:"currentProfit"` // 目前利润 + CurrentRemainingFunds float64 `orm:"current_remaining_funds" json:"currentRemainingFunds"` // 目前结余资金 + ProjectedIncreaseInRemainingFunds float64 `orm:"projected_increase_in_remaining_funds" json:"projectedIncreaseInRemainingFunds"` // 至项目完成应增加的结余资金 + NetPresentValueOfProjectOperation float64 `orm:"net_present_value_of_project_operation" json:"netPresentValueOfProjectOperation"` // 项目经营净现值 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 填报时间 + CreatedBy int `orm:"created_by" json:"createdBy"` // 填报人 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 +} diff --git a/internal/app/system/model/entity/project_schedule.go b/internal/app/system/model/entity/project_schedule.go new file mode 100644 index 0000000..47851ff --- /dev/null +++ b/internal/app/system/model/entity/project_schedule.go @@ -0,0 +1,21 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// ProjectSchedule is the golang structure for table project_schedule. +type ProjectSchedule struct { + Id uint `json:"id" description:""` + ParentId int `json:"parent_id" description:"设施ID"` + StartDate string `json:"start_date" description:"开始时间"` + EndDate string `json:"end_date" description:"结束时间"` + CreatedAt *gtime.Time `json:"created_at" description:""` + Name string `json:"name" description:"项目名"` + PlaneNum string `json:"plane_num" description:"计划持有量"` + Types int `json:"types" description:"计划类型"` +} diff --git a/internal/app/system/model/entity/pv_module.go b/internal/app/system/model/entity/pv_module.go new file mode 100644 index 0000000..8246c55 --- /dev/null +++ b/internal/app/system/model/entity/pv_module.go @@ -0,0 +1,21 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +// PvModule is the golang structure for table pv_module. +type PvModule struct { + Id uint `json:"id" description:""` + FangzhenId string `json:"fangzhen_id" description:"方阵ID"` + SubProjectid string `json:"sub_projectid" description:"子项目ID"` + WorkId string `json:"work_id" description:"工作ID"` + Name string `json:"name" description:"名字"` + Status string `json:"status" description:"状态 0未开始 1 进行中 2 已完成"` + DoneTime string `json:"done_time" description:"完成时间"` + Detail string `json:"detail" description:"坐标详细信息"` + Type int `json:"type" description:"类型"` + Tilt float64 `json:"tilt" description:"标称倾角"` + Azimuth float64 `json:"azimuth" description:"标称方位角"` + DeviceId string `json:"device_id" description:"设备编号"` +} diff --git a/internal/app/system/model/entity/qianqi_bubantu.go b/internal/app/system/model/entity/qianqi_bubantu.go new file mode 100644 index 0000000..1f18817 --- /dev/null +++ b/internal/app/system/model/entity/qianqi_bubantu.go @@ -0,0 +1,30 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-31 11:44:41 +// 生成路径: internal/app/system/model/entity/qianqi_bubantu.go +// 生成人:gfast +// desc:布板图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiBubantu is the golang structure for table qianqi_bubantu. +type QianqiBubantu struct { + gmeta.Meta `orm:"table:qianqi_bubantu"` + Id int `orm:"id,primary" json:"id"` // 序号 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 名称 + SourceId string `orm:"source_id" json:"sourceId"` // 资源ID + SourcePath string `orm:"source_path" json:"sourcePath"` // 资源路径 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/qianqi_camera.go b/internal/app/system/model/entity/qianqi_camera.go new file mode 100644 index 0000000..aed4d6b --- /dev/null +++ b/internal/app/system/model/entity/qianqi_camera.go @@ -0,0 +1,39 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-30 22:37:34 +// 生成路径: internal/app/system/model/entity/qianqi_camera.go +// 生成人:gfast +// desc:摄像头 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiCamera is the golang structure for table qianqi_camera. +type QianqiCamera struct { + gmeta.Meta `orm:"table:qianqi_camera"` + Id int `orm:"id,primary" json:"id"` // + CameraName string `orm:"camera_name" json:"cameraName"` // 摄像头名称 + CameraCode string `orm:"camera_code" json:"cameraCode"` // 摄像头编码 + Detail string `orm:"detail" json:"detail"` // 摄像头坐标信息 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Status int `orm:"status" json:"status"` // 在线情况(1、在线,0、离线),字典on_line_status + Poster string `orm:"poster" json:"poster"` // 封面图 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreateddAt *gtime.Time `orm:"createdd_at" json:"createddAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + SourceType string `orm:"source_type" json:"sourceType"` // + Serial string `orm:"serial" json:"serial"` // 国标id + Code string `orm:"code" json:"code"` // 通道号 + Flv string `orm:"flv" json:"flv"` // flv地址 + Hls string `orm:"hls" json:"hls"` // hls地址 + Share string `orm:"share" json:"share"` // 分享地址 + Rtc string `orm:"rtc" json:"rtc"` // webrtc地址 +} diff --git a/internal/app/system/model/entity/qianqi_cameras.go b/internal/app/system/model/entity/qianqi_cameras.go new file mode 100644 index 0000000..89da937 --- /dev/null +++ b/internal/app/system/model/entity/qianqi_cameras.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-31 09:48:11 +// 生成路径: internal/app/system/model/entity/qianqi_cameras.go +// 生成人:gfast +// desc:所有摄像头列 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiCameras is the golang structure for table qianqi_cameras. +type QianqiCameras struct { + gmeta.Meta `orm:"table:qianqi_cameras"` + Id int `orm:"id,primary" json:"id"` // 序号 + CameraName string `orm:"camera_name" json:"cameraName"` // 摄像头名称 + CameraCode string `orm:"camera_code" json:"cameraCode"` // 摄像头编码 + Detail string `orm:"detail" json:"detail"` // 摄像头坐标信息 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Status int `orm:"status" json:"status"` // 在线情况 + Poster string `orm:"poster" json:"poster"` // 封面图 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreateAt *gtime.Time `orm:"create_at" json:"createAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/qianqi_dixing.go b/internal/app/system/model/entity/qianqi_dixing.go new file mode 100644 index 0000000..3d3e971 --- /dev/null +++ b/internal/app/system/model/entity/qianqi_dixing.go @@ -0,0 +1,30 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-31 11:44:56 +// 生成路径: internal/app/system/model/entity/qianqi_dixing.go +// 生成人:gfast +// desc:地形 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiDixing is the golang structure for table qianqi_dixing. +type QianqiDixing struct { + gmeta.Meta `orm:"table:qianqi_dixing"` + Id int `orm:"id,primary" json:"id"` // 序号 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 名称 + SourceId string `orm:"source_id" json:"sourceId"` // 资源ID + SourcePath string `orm:"source_path" json:"sourcePath"` // 资源路径 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/qianqi_fangzhen.go b/internal/app/system/model/entity/qianqi_fangzhen.go new file mode 100644 index 0000000..5b6e9ce --- /dev/null +++ b/internal/app/system/model/entity/qianqi_fangzhen.go @@ -0,0 +1,27 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// QianqiFangzhen is the golang structure for table qianqi_fangzhen. +type QianqiFangzhen struct { + Id int `json:"id" description:""` + ProjectId string `json:"project_id" description:"项目id"` + Name string `json:"name" description:""` + SourceId string `json:"source_id" description:""` + SourcePath string `json:"source_path" description:""` + XiangbianId string `json:"xiangbian_id" description:"箱变id"` + CreateBy string `json:"create_by" description:"创建人"` + UpdateBy string `json:"update_by" description:"更新人"` + CreatedAt *gtime.Time `json:"created_at" description:"创建时间"` + UpdatedAt *gtime.Time `json:"updated_at" description:"更新时间"` + DeletedAt *gtime.Time `json:"deleted_at" description:"删除时间"` + Detail string `json:"detail" description:"坐标信息"` + SourceType string `json:"source_type" description:""` + View string `json:"view" description:"每个方阵的视角"` +} diff --git a/internal/app/system/model/entity/qianqi_guangfuban.go b/internal/app/system/model/entity/qianqi_guangfuban.go new file mode 100644 index 0000000..f99da2f --- /dev/null +++ b/internal/app/system/model/entity/qianqi_guangfuban.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-31 11:31:49 +// 生成路径: internal/app/system/model/entity/qianqi_guangfuban.go +// 生成人:gfast +// desc:光伏板模型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiGuangfuban is the golang structure for table qianqi_guangfuban. +type QianqiGuangfuban struct { + gmeta.Meta `orm:"table:qianqi_guangfuban"` + Id int `orm:"id,primary" json:"id"` // 序号 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 倾斜模型 + SourcePath string `orm:"source_path" json:"sourcePath"` // 资源路径 + Detail string `orm:"detail" json:"detail"` // 坐标信息等 + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/qianqi_guangfuban_ids.go b/internal/app/system/model/entity/qianqi_guangfuban_ids.go new file mode 100644 index 0000000..423f83d --- /dev/null +++ b/internal/app/system/model/entity/qianqi_guangfuban_ids.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-05 16:00:23 +// 生成路径: internal/app/system/model/entity/qianqi_guangfuban_ids.go +// 生成人:gfast +// desc:光伏板模型的id +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiGuangfubanIds is the golang structure for table qianqi_guangfuban_ids. +type QianqiGuangfubanIds struct { + gmeta.Meta `orm:"table:qianqi_guangfuban_ids"` + Id int `orm:"id,primary" json:"id"` // + Name string `orm:"name" json:"name"` // 名称 + DevId string `orm:"dev_id" json:"devId"` // 光伏板模型的id + DevType int `orm:"dev_type" json:"devType"` // 光伏板、支架类型 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + SourceType string `orm:"source_type" json:"sourceType"` // + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + ProjectId string `orm:"project_id" json:"projectId"` // 项目id +} diff --git a/internal/app/system/model/entity/qianqi_guangfuban_ids_lizhu.go b/internal/app/system/model/entity/qianqi_guangfuban_ids_lizhu.go new file mode 100644 index 0000000..47a2374 --- /dev/null +++ b/internal/app/system/model/entity/qianqi_guangfuban_ids_lizhu.go @@ -0,0 +1,27 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// QianqiGuangfubanIdsLizhu is the golang structure for table qianqi_guangfuban_ids_lizhu. +type QianqiGuangfubanIdsLizhu struct { + Id int `json:"id" description:""` + Name string `json:"name" description:"名称"` + CreateBy string `json:"create_by" description:"创建人"` + UpdateBy string `json:"update_by" description:"更新人"` + CreatedAt *gtime.Time `json:"created_at" description:"创建时间"` + UpdatedAt *gtime.Time `json:"updated_at" description:"更新时间"` + DeletedAt *gtime.Time `json:"deleted_at" description:"删除时间"` + SourceType string `json:"source_type" description:""` + SourceId string `json:"source_id" description:"资源id"` + ProjectId int64 `json:"project_id" description:"项目id"` + Status int `json:"status" description:"状态:0:未完成;1:计划中;2:已完成"` + Detail string `json:"detail" description:"坐标信息"` + SubProjectid int `json:"sub_projectid" description:"子项目ID"` + FangzhenId int `json:"fangzhen_id" description:"方阵ID"` +} diff --git a/internal/app/system/model/entity/qianqi_guangfuban_ids_zhijia.go b/internal/app/system/model/entity/qianqi_guangfuban_ids_zhijia.go new file mode 100644 index 0000000..30a0b89 --- /dev/null +++ b/internal/app/system/model/entity/qianqi_guangfuban_ids_zhijia.go @@ -0,0 +1,27 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// QianqiGuangfubanIdsZhijia is the golang structure for table qianqi_guangfuban_ids_zhijia. +type QianqiGuangfubanIdsZhijia struct { + Id int `json:"id" description:""` + Name string `json:"name" description:"名称"` + CreateBy string `json:"create_by" description:"创建人"` + UpdateBy string `json:"update_by" description:"更新人"` + CreatedAt *gtime.Time `json:"created_at" description:"创建时间"` + UpdatedAt *gtime.Time `json:"updated_at" description:"更新时间"` + DeletedAt *gtime.Time `json:"deleted_at" description:"删除时间"` + SourceType string `json:"source_type" description:""` + SourceId string `json:"source_id" description:"资源id"` + ProjectId string `json:"project_id" description:"项目id"` + Status int `json:"status" description:"状态:0:未完成;1:计划中;2:已完成"` + Detail string `json:"detail" description:"坐标信息"` + SubProjectid int `json:"sub_projectid" description:"子项目ID"` + FangzhenId string `json:"fangzhen_id" description:"方阵ID"` +} diff --git a/internal/app/system/model/entity/qianqi_guangfuban_ids_zhuangdian.go b/internal/app/system/model/entity/qianqi_guangfuban_ids_zhuangdian.go new file mode 100644 index 0000000..0a0ff9c --- /dev/null +++ b/internal/app/system/model/entity/qianqi_guangfuban_ids_zhuangdian.go @@ -0,0 +1,27 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// QianqiGuangfubanIdsZhuangdian is the golang structure for table qianqi_guangfuban_ids_zhuangdian. +type QianqiGuangfubanIdsZhuangdian struct { + Id int `json:"id" description:""` + Name string `json:"name" description:"名称"` + CreateBy string `json:"create_by" description:"创建人"` + UpdateBy string `json:"update_by" description:"更新人"` + CreatedAt *gtime.Time `json:"created_at" description:"创建时间"` + UpdatedAt *gtime.Time `json:"updated_at" description:"更新时间"` + DeletedAt *gtime.Time `json:"deleted_at" description:"删除时间"` + SourceType string `json:"source_type" description:""` + SourceId string `json:"source_id" description:"资源id"` + ProjectId int64 `json:"project_id" description:"项目id"` + Status int `json:"status" description:"状态:0:未完成;1:计划中;2:已完成"` + Detail string `json:"detail" description:"坐标信息"` + SubProjectid int `json:"sub_projectid" description:"子项目ID"` + FangzhenId string `json:"fangzhen_id" description:"方阵ID"` +} diff --git a/internal/app/system/model/entity/qianqi_guangfuban_zuchuan.go b/internal/app/system/model/entity/qianqi_guangfuban_zuchuan.go new file mode 100644 index 0000000..bef5e6a --- /dev/null +++ b/internal/app/system/model/entity/qianqi_guangfuban_zuchuan.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-17 10:37:21 +// 生成路径: internal/app/system/model/entity/qianqi_guangfuban_zuchuan.go +// 生成人:xyb +// desc:组串 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiGuangfubanZuchuan is the golang structure for table qianqi_guangfuban_zuchuan. +type QianqiGuangfubanZuchuan struct { + gmeta.Meta `orm:"table:qianqi_guangfuban_zuchuan"` + Id int `orm:"id,primary" json:"id"` // + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + SourceType string `orm:"source_type" json:"sourceType"` // + SourceId string `orm:"source_id" json:"sourceId"` // 资源id,为project_id拼接上组串编号 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + ZuchuanId string `orm:"zuchuan_id" json:"zuchuanId"` // 组串编号 + GuangfubanId string `orm:"guangfuban_id" json:"guangfubanId"` // 光伏板模型的id + LinkedGuangfubanId *LinkedQianqiGuangfubanZuchuanQianqiGuangfuban `orm:"with:source_id=guangfuban_id" json:"linkedGuangfubanId"` +} + +type LinkedQianqiGuangfubanZuchuanQianqiGuangfuban struct { + gmeta.Meta `orm:"table:qianqi_guangfuban"` + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + Name string `orm:"name" json:"name"` // 倾斜模型 +} diff --git a/internal/app/system/model/entity/qianqi_jidianxianlu.go b/internal/app/system/model/entity/qianqi_jidianxianlu.go new file mode 100644 index 0000000..beb55eb --- /dev/null +++ b/internal/app/system/model/entity/qianqi_jidianxianlu.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-04 16:29:44 +// 生成路径: internal/app/system/model/entity/qianqi_jidianxianlu.go +// 生成人:gfast +// desc:集电线路 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiJidianxianlu is the golang structure for table qianqi_jidianxianlu. +type QianqiJidianxianlu struct { + gmeta.Meta `orm:"table:qianqi_jidianxianlu"` + Id int `orm:"id,primary" json:"id"` // 序号 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 线路名称 + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + SourcePath string `orm:"source_path" json:"sourcePath"` // 资源路径 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + SourceType string `orm:"source_type" json:"sourceType"` // 资源类型 +} diff --git a/internal/app/system/model/entity/qianqi_moxing.go b/internal/app/system/model/entity/qianqi_moxing.go new file mode 100644 index 0000000..ecf2e60 --- /dev/null +++ b/internal/app/system/model/entity/qianqi_moxing.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-31 11:09:26 +// 生成路径: internal/app/system/model/entity/qianqi_moxing.go +// 生成人:gfast +// desc:倾斜模型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiMoxing is the golang structure for table qianqi_moxing. +type QianqiMoxing struct { + gmeta.Meta `orm:"table:qianqi_moxing"` + Id int `orm:"id,primary" json:"id"` // 序号 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 倾斜模型 + SourcePath string `orm:"source_path" json:"sourcePath"` // 资源路径 + Detail string `orm:"detail" json:"detail"` // 坐标信息等 + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/qianqi_nibianqi.go b/internal/app/system/model/entity/qianqi_nibianqi.go new file mode 100644 index 0000000..3caff91 --- /dev/null +++ b/internal/app/system/model/entity/qianqi_nibianqi.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-31 09:40:17 +// 生成路径: internal/app/system/model/entity/qianqi_nibianqi.go +// 生成人:gfast +// desc:逆变器 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiNibianqi is the golang structure for table qianqi_nibianqi. +type QianqiNibianqi struct { + gmeta.Meta `orm:"table:qianqi_nibianqi"` + Id int `orm:"id,primary" json:"id"` // 序号 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 名称 + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + ModelId string `orm:"model_id" json:"modelId"` // 模型id + Detail string `orm:"detail" json:"detail"` // 地图上的参数信息 + Xiangbianid string `orm:"xiangbianid" json:"xiangbianid"` // 箱变id + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreateAt *gtime.Time `orm:"create_at" json:"createAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/qianqi_pingchang.go b/internal/app/system/model/entity/qianqi_pingchang.go new file mode 100644 index 0000000..546ca75 --- /dev/null +++ b/internal/app/system/model/entity/qianqi_pingchang.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-08 10:08:24 +// 生成路径: internal/app/system/model/entity/qianqi_pingchang.go +// 生成人:gfast +// desc:平场数据 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiPingchang is the golang structure for table qianqi_pingchang. +type QianqiPingchang struct { + gmeta.Meta `orm:"table:qianqi_pingchang"` + Id uint64 `orm:"id,primary" json:"id"` // + CreateAt *gtime.Time `orm:"create_at" json:"createAt"` // + UpdateAt *gtime.Time `orm:"update_at" json:"updateAt"` // + DeleteAt *gtime.Time `orm:"delete_at" json:"deleteAt"` // + ProjectId string `orm:"project_id" json:"projectId"` // '项目id' + PcId string `orm:"pc_id" json:"pcId"` // '平场id' + PcName string `orm:"pc_name" json:"pcName"` // '平场范围名称' + GridWidth float64 `orm:"grid_width" json:"gridWidth"` // '采点精度' + Progress float64 `orm:"progress" json:"progress"` // '计算进度' + Range string `orm:"range" json:"range"` // '平场范围' + Points string `orm:"points" json:"points"` // '平滑处理前的高程点' + SmoothPoints string `orm:"smooth_points" json:"smoothPoints"` // '平滑处理后的高程点' + Shp string `orm:"shp" json:"shp"` // '经过计算生成的shp文件' + Area float64 `orm:"area" json:"area"` // '面积' + Cut float64 `orm:"cut" json:"cut"` // '挖方' + Fill float64 `orm:"fill" json:"fill"` // '填方' + Total float64 `orm:"total" json:"total"` // '挖填平衡值' + Imported int `orm:"imported" json:"imported"` // '是否为导入的值' +} diff --git a/internal/app/system/model/entity/qianqi_redline.go b/internal/app/system/model/entity/qianqi_redline.go new file mode 100644 index 0000000..1f8608e --- /dev/null +++ b/internal/app/system/model/entity/qianqi_redline.go @@ -0,0 +1,30 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-31 11:45:12 +// 生成路径: internal/app/system/model/entity/qianqi_redline.go +// 生成人:gfast +// desc:红线 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiRedline is the golang structure for table qianqi_redline. +type QianqiRedline struct { + gmeta.Meta `orm:"table:qianqi_redline"` + Id int `orm:"id,primary" json:"id"` // 序号 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 名称 + SourceId string `orm:"source_id" json:"sourceId"` // 资源ID + SourcePath string `orm:"source_path" json:"sourcePath"` // 资源路径 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/qianqi_redline_tudiliuzhuan.go b/internal/app/system/model/entity/qianqi_redline_tudiliuzhuan.go new file mode 100644 index 0000000..7ddc9f0 --- /dev/null +++ b/internal/app/system/model/entity/qianqi_redline_tudiliuzhuan.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-04 11:47:15 +// 生成路径: internal/app/system/model/entity/qianqi_redline_tudiliuzhuan.go +// 生成人:gfast +// desc:土地流转 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiRedlineTudiliuzhuan is the golang structure for table qianqi_redline_tudiliuzhuan. +type QianqiRedlineTudiliuzhuan struct { + gmeta.Meta `orm:"table:qianqi_redline_tudiliuzhuan"` + Id int `orm:"id,primary" json:"id"` // 序号 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 红线名称 + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + SourcePath string `orm:"source_path" json:"sourcePath"` // 资源路径 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + SourceType string `orm:"source_type" json:"sourceType"` // +} diff --git a/internal/app/system/model/entity/qianqi_road.go b/internal/app/system/model/entity/qianqi_road.go new file mode 100644 index 0000000..e6a1e5a --- /dev/null +++ b/internal/app/system/model/entity/qianqi_road.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-04 16:24:38 +// 生成路径: internal/app/system/model/entity/qianqi_road.go +// 生成人:gfast +// desc:道路 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiRoad is the golang structure for table qianqi_road. +type QianqiRoad struct { + gmeta.Meta `orm:"table:qianqi_road"` + Id int `orm:"id,primary" json:"id"` // 序号 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 名称 + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + SourcePath string `orm:"source_path" json:"sourcePath"` // 资源路径 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + SourceType string `orm:"source_type" json:"sourceType"` // 资源类型 +} diff --git a/internal/app/system/model/entity/qianqi_xiangbian.go b/internal/app/system/model/entity/qianqi_xiangbian.go new file mode 100644 index 0000000..3fa627c --- /dev/null +++ b/internal/app/system/model/entity/qianqi_xiangbian.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-31 09:52:13 +// 生成路径: internal/app/system/model/entity/qianqi_xiangbian.go +// 生成人:gfast +// desc:箱变 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiXiangbian is the golang structure for table qianqi_xiangbian. +type QianqiXiangbian struct { + gmeta.Meta `orm:"table:qianqi_xiangbian"` + Id int `orm:"id,primary" json:"id"` // 序号 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 名称 + SourceId string `orm:"source_id" json:"sourceId"` // 资源ID + ModelId string `orm:"model_id" json:"modelId"` // 模型ID + Detail string `orm:"detail" json:"detail"` // 详情 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreateAt *gtime.Time `orm:"create_at" json:"createAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/reminders.go b/internal/app/system/model/entity/reminders.go new file mode 100644 index 0000000..b65a2c8 --- /dev/null +++ b/internal/app/system/model/entity/reminders.go @@ -0,0 +1,23 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// Reminders is the golang structure for table reminders. +type Reminders struct { + Id uint `json:"id" description:""` + UserId int `json:"user_id" description:"消息接收者ID"` + ReminderType int `json:"reminder_type" description:"提醒类型 0 安全整改 | 1 质量整改 | 2 AI | 3 钉钉上班 | 4 钉钉下班"` + Title string `json:"title" description:"标题"` + ViolationType string `json:"violation_type" description:"违章类型"` + ProjectId int `json:"project_id" description:"项目ID"` + CreatedAt *gtime.Time `json:"created_at" description:""` + IsRead int `json:"is_read" description:"0 未读 | 1 已读"` + Status int `json:"status" description:"0 提醒 | 1 整改 | 2 复检"` + OrderId int `json:"order_id" description:"对应跳转的主键ID"` +} diff --git a/internal/app/system/model/entity/sub_project.go b/internal/app/system/model/entity/sub_project.go new file mode 100644 index 0000000..5b555c5 --- /dev/null +++ b/internal/app/system/model/entity/sub_project.go @@ -0,0 +1,18 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// SubProject is the golang structure for table sub_project. +type SubProject struct { + Id uint `json:"id" description:"主键ID"` + ProjectId int `json:"project_id" description:"项目ID"` + ProjectName string `json:"project_name" description:"子项目名"` + CreatedAt *gtime.Time `json:"created_at" description:""` + DoneTime string `json:"done_time" description:"结束日期"` +} diff --git a/internal/app/system/model/entity/sys_auth_rule.go b/internal/app/system/model/entity/sys_auth_rule.go new file mode 100644 index 0000000..b4d8197 --- /dev/null +++ b/internal/app/system/model/entity/sys_auth_rule.go @@ -0,0 +1,35 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// SysAuthRule is the golang structure for table sys_auth_rule. +type SysAuthRule struct { + Id uint `json:"id" description:""` + Pid uint `json:"pid" description:"父ID"` + Name string `json:"name" description:"规则名称"` + Title string `json:"title" description:"规则名称"` + Icon string `json:"icon" description:"图标"` + Condition string `json:"condition" description:"条件"` + Remark string `json:"remark" description:"备注"` + MenuType uint `json:"menuType" description:"类型 0目录 1菜单 2按钮"` + Weigh int `json:"weigh" description:"权重"` + IsHide uint `json:"isHide" description:"显示状态"` + Path string `json:"path" description:"路由地址"` + Component string `json:"component" description:"组件路径"` + IsLink uint `json:"isLink" description:"是否外链 1是 0否"` + ModuleType string `json:"moduleType" description:"所属模块"` + ModelId uint `json:"modelId" description:"模型ID"` + IsIframe uint `json:"isIframe" description:"是否内嵌iframe"` + IsCached uint `json:"isCached" description:"是否缓存"` + Redirect string `json:"redirect" description:"路由重定向地址"` + IsAffix uint `json:"isAffix" description:"是否固定"` + LinkUrl string `json:"linkUrl" description:"链接地址"` + CreatedAt *gtime.Time `json:"createdAt" description:"创建日期"` + UpdatedAt *gtime.Time `json:"updatedAt" description:"修改日期"` +} diff --git a/internal/app/system/model/entity/sys_dept.go b/internal/app/system/model/entity/sys_dept.go new file mode 100644 index 0000000..568589f --- /dev/null +++ b/internal/app/system/model/entity/sys_dept.go @@ -0,0 +1,27 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// SysDept is the golang structure for table sys_dept. +type SysDept struct { + DeptId uint64 `json:"deptId" description:"部门id"` + ParentId uint64 `json:"parentId" description:"父部门id"` + Ancestors string `json:"ancestors" description:"祖级列表"` + DeptName string `json:"deptName" description:"部门名称"` + OrderNum int `json:"orderNum" description:"显示顺序"` + Leader string `json:"leader" description:"负责人"` + Phone string `json:"phone" description:"联系电话"` + Email string `json:"email" description:"邮箱"` + Status uint `json:"status" description:"部门状态(0正常 1停用)"` + CreatedBy uint64 `json:"createdBy" description:"创建人"` + UpdatedBy int64 `json:"updatedBy" description:"修改人"` + CreatedAt *gtime.Time `json:"createdAt" description:"创建时间"` + UpdatedAt *gtime.Time `json:"updatedAt" description:"修改时间"` + DeletedAt *gtime.Time `json:"deletedAt" description:"删除时间"` +} diff --git a/internal/app/system/model/entity/sys_file.go b/internal/app/system/model/entity/sys_file.go new file mode 100644 index 0000000..fce472d --- /dev/null +++ b/internal/app/system/model/entity/sys_file.go @@ -0,0 +1,34 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-29 15:32:09 +// 生成路径: internal/app/system/model/entity/sys_file.go +// 生成人:gfast +// desc:文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysFile is the golang structure for table sys_file. +type SysFile struct { + gmeta.Meta `orm:"table:sys_file"` + FileId int `orm:"file_id,primary" json:"fileId"` // 文件id + ParentId int `orm:"parent_id" json:"parentId"` // 父文件id + Ancestors string `orm:"ancestors" json:"ancestors"` // 祖级列表 + FileName string `orm:"file_name" json:"fileName"` // 文件名称 + OrderNum int `orm:"order_num" json:"orderNum"` // 显示顺序 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + FileTypeId int `orm:"file_type_id" json:"fileTypeId"` // 文件夹类型id + Leader string `orm:"leader" json:"leader"` // 负责人 + Status string `orm:"status" json:"status"` // 文件状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/sys_file_type.go b/internal/app/system/model/entity/sys_file_type.go new file mode 100644 index 0000000..cf1a70d --- /dev/null +++ b/internal/app/system/model/entity/sys_file_type.go @@ -0,0 +1,28 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-29 15:27:54 +// 生成路径: internal/app/system/model/entity/sys_file_type.go +// 生成人:gfast +// desc:文件类型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysFileType is the golang structure for table sys_file_type. +type SysFileType struct { + gmeta.Meta `orm:"table:sys_file_type"` + Id int `orm:"id,primary" json:"id"` // 序号 + FileTypeName string `orm:"file_type_name" json:"fileTypeName"` // 文件类型 + Status string `orm:"status" json:"status"` // 文件状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/sys_job.go b/internal/app/system/model/entity/sys_job.go new file mode 100644 index 0000000..1166c90 --- /dev/null +++ b/internal/app/system/model/entity/sys_job.go @@ -0,0 +1,34 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-01-12 17:43:50 +// 生成路径: internal/app/system/model/entity/sys_job.go +// 生成人:gfast +// desc:定时任务 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysJob is the golang structure for table sys_job. +type SysJob struct { + gmeta.Meta `orm:"table:sys_job"` + JobId uint64 `orm:"job_id,primary" json:"jobId"` // 任务ID + JobName string `orm:"job_name" json:"jobName"` // 任务名称 + JobParams string `orm:"job_params" json:"jobParams"` // 参数 + JobGroup string `orm:"job_group" json:"jobGroup"` // 任务组名 + InvokeTarget string `orm:"invoke_target" json:"invokeTarget"` // 任务方法 + CronExpression string `orm:"cron_expression" json:"cronExpression"` // cron执行表达式 + MisfirePolicy int `orm:"misfire_policy" json:"misfirePolicy"` // 计划执行策略 + Concurrent int `orm:"concurrent" json:"concurrent"` // 是否并发执行 + Status int `orm:"status" json:"status"` // 状态 + CreatedBy uint64 `orm:"created_by" json:"createdBy"` // 创建者 + UpdatedBy uint64 `orm:"updated_by" json:"updatedBy"` // 更新者 + Remark string `orm:"remark" json:"remark"` // 备注信息 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 +} diff --git a/internal/app/system/model/entity/sys_job_log.go b/internal/app/system/model/entity/sys_job_log.go new file mode 100644 index 0000000..dba5832 --- /dev/null +++ b/internal/app/system/model/entity/sys_job_log.go @@ -0,0 +1,17 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// SysJobLog is the golang structure for table sys_job_log. +type SysJobLog struct { + Id uint64 `json:"id" description:"主键"` + TargetName string `json:"targetName" description:"方法名"` + CreatedAt *gtime.Time `json:"createdAt" description:"执行日期"` + Result string `json:"result" description:"执行结果"` +} diff --git a/internal/app/system/model/entity/sys_login_log.go b/internal/app/system/model/entity/sys_login_log.go new file mode 100644 index 0000000..9bac7b9 --- /dev/null +++ b/internal/app/system/model/entity/sys_login_log.go @@ -0,0 +1,23 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. Created at 2022-03-08 11:31:48 +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// SysLoginLog is the golang structure for table sys_login_log. +type SysLoginLog struct { + InfoId int64 `json:"infoId" description:"访问ID"` + LoginName string `json:"loginName" description:"登录账号"` + Ipaddr string `json:"ipaddr" description:"登录IP地址"` + LoginLocation string `json:"loginLocation" description:"登录地点"` + Browser string `json:"browser" description:"浏览器类型"` + Os string `json:"os" description:"操作系统"` + Status int `json:"status" description:"登录状态(0成功 1失败)"` + Msg string `json:"msg" description:"提示消息"` + LoginTime *gtime.Time `json:"loginTime" description:"登录时间"` + Module string `json:"module" description:"登录模块"` +} diff --git a/internal/app/system/model/entity/sys_oper_log.go b/internal/app/system/model/entity/sys_oper_log.go new file mode 100644 index 0000000..cf52ac9 --- /dev/null +++ b/internal/app/system/model/entity/sys_oper_log.go @@ -0,0 +1,27 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// SysOperLog is the golang structure for table sys_oper_log. +type SysOperLog struct { + OperId uint64 `json:"operId" description:"日志主键"` + Title string `json:"title" description:"模块标题"` + BusinessType int `json:"businessType" description:"业务类型(0其它 1新增 2修改 3删除)"` + Method string `json:"method" description:"方法名称"` + RequestMethod string `json:"requestMethod" description:"请求方式"` + OperatorType int `json:"operatorType" description:"操作类别(0其它 1后台用户 2手机端用户)"` + OperName string `json:"operName" description:"操作人员"` + DeptName string `json:"deptName" description:"部门名称"` + OperUrl string `json:"operUrl" description:"请求URL"` + OperIp string `json:"operIp" description:"主机地址"` + OperLocation string `json:"operLocation" description:"操作地点"` + OperParam string `json:"operParam" description:"请求参数"` + ErrorMsg string `json:"errorMsg" description:"错误消息"` + OperTime *gtime.Time `json:"operTime" description:"操作时间"` +} diff --git a/internal/app/system/model/entity/sys_post.go b/internal/app/system/model/entity/sys_post.go new file mode 100644 index 0000000..6ca4fe5 --- /dev/null +++ b/internal/app/system/model/entity/sys_post.go @@ -0,0 +1,24 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. Created at 2022-04-07 23:26:21 +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// SysPost is the golang structure for table sys_post. +type SysPost struct { + PostId uint64 `json:"postId" description:"岗位ID"` + PostCode string `json:"postCode" description:"岗位编码"` + PostName string `json:"postName" description:"岗位名称"` + PostSort int `json:"postSort" description:"显示顺序"` + Status uint `json:"status" description:"状态(0正常 1停用)"` + Remark string `json:"remark" description:"备注"` + CreatedBy uint64 `json:"createdBy" description:"创建人"` + UpdatedBy uint64 `json:"updatedBy" description:"修改人"` + CreatedAt *gtime.Time `json:"createdAt" description:"创建时间"` + UpdatedAt *gtime.Time `json:"updatedAt" description:"修改时间"` + DeletedAt *gtime.Time `json:"deletedAt" description:"删除时间"` +} diff --git a/internal/app/system/model/entity/sys_project.go b/internal/app/system/model/entity/sys_project.go new file mode 100644 index 0000000..c44d491 --- /dev/null +++ b/internal/app/system/model/entity/sys_project.go @@ -0,0 +1,36 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-27 15:20:49 +// 生成路径: internal/app/system/model/entity/sys_project.go +// 生成人:gfast +// desc:项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysProject is the golang structure for table sys_project. +type SysProject struct { + gmeta.Meta `orm:"table:sys_project"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + ProjectName string `orm:"project_name" json:"projectName"` // 项目名称 + PId int64 `orm:"p_id" json:"pId"` // 父id + Status string `orm:"status" json:"status"` // 状态(0正常 1停用) + PicUrl string `orm:"pic_url" json:"picUrl"` // 项目图片 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + CreateTime *gtime.Time `orm:"create_time" json:"createTime"` // 创建时间 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + UpdateTime *gtime.Time `orm:"update_time" json:"updateTime"` // 更新时间 + Lng string `orm:"lng" json:"lng"` // 经度 + Lat string `orm:"lat" json:"lat"` // 纬度 + Remark string `orm:"remark" json:"remark"` // 备注 + Type string `orm:"type" json:"type"` // 项目类型 + ColourRgb string `orm:"colour_rgb" json:"colourRgb"` // 展示颜色 + DeletedAt string `orm:"deleted_at" json:"DeletedAt"` // 删除时间 + OnStreamTime *gtime.Time `orm:"on_stream_time" json:"onStreamTime"` // 开工日期 +} diff --git a/internal/app/system/model/entity/sys_project_introduce.go b/internal/app/system/model/entity/sys_project_introduce.go new file mode 100644 index 0000000..2a4a911 --- /dev/null +++ b/internal/app/system/model/entity/sys_project_introduce.go @@ -0,0 +1,30 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-29 10:05:02 +// 生成路径: internal/app/system/model/entity/sys_project_introduce.go +// 生成人:gfast +// desc:项目新闻 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysProjectIntroduce is the golang structure for table sys_project_introduce. +type SysProjectIntroduce struct { + gmeta.Meta `orm:"table:sys_project_introduce"` + ID int64 `orm:"id,primary" json:"id"` // 主键 + ProjectId int64 `orm:"project_id,primary" json:"projectId"` // 项目id + Headline string `orm:"headline" json:"headline"` // 标题 + RichText string `orm:"rich_text" json:"richText"` // 富文本 + CreatedBy string `orm:"created_by" json:"createdBy"` // 创建人 + UpdatedBy string `orm:"updated_by" json:"updatedBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + IntroduceID int64 `orm:"introduce_id" json:"introduceId"` // 介绍id +} diff --git a/internal/app/system/model/entity/sys_project_value.go b/internal/app/system/model/entity/sys_project_value.go new file mode 100644 index 0000000..8ec96e3 --- /dev/null +++ b/internal/app/system/model/entity/sys_project_value.go @@ -0,0 +1,26 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-27 12:55:26 +// 生成路径: internal/app/system/model/entity/sys_project_value.go +// 生成人:xiaoyang +// desc:projectValue +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysProjectValue is the golang structure for table sys_project_value. +type SysProjectValue struct { + gmeta.Meta `orm:"table:sys_project_value"` + Id int64 `orm:"id,primary" json:"id"` // 主键id + ProId int64 `orm:"pro_id" json:"proId"` // 项目id + Year string `orm:"year" json:"year"` // 年 + Month string `orm:"month" json:"month"` // 月 + ProValue string `orm:"pro_value" json:"proValue"` // 项目产值 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 +} diff --git a/internal/app/system/model/entity/sys_role.go b/internal/app/system/model/entity/sys_role.go new file mode 100644 index 0000000..7172c2f --- /dev/null +++ b/internal/app/system/model/entity/sys_role.go @@ -0,0 +1,23 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// SysRole is the golang structure for table sys_role. +type SysRole struct { + Id uint `json:"id" description:""` + Status uint `json:"status" description:"状态;0:禁用;1:正常"` + ListOrder uint `json:"listOrder" description:"排序"` + Name string `json:"name" description:"角色名称"` + Remark string `json:"remark" description:"备注"` + DataScope uint `json:"dataScope" description:"数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)"` + CreatedAt *gtime.Time `json:"createdAt" description:"创建时间"` + UpdatedAt *gtime.Time `json:"updatedAt" description:"更新时间"` + UserCnt uint `json:"userCnt" description:"用户数量"` + IsApp int `json:"isApp" orm:"is_app" description:"是否应用角色"` +} diff --git a/internal/app/system/model/entity/sys_role_dept.go b/internal/app/system/model/entity/sys_role_dept.go new file mode 100644 index 0000000..c795ca0 --- /dev/null +++ b/internal/app/system/model/entity/sys_role_dept.go @@ -0,0 +1,11 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +// SysRoleDept is the golang structure for table sys_role_dept. +type SysRoleDept struct { + RoleId int64 `json:"roleId" description:"角色ID"` + DeptId int64 `json:"deptId" description:"部门ID"` +} diff --git a/internal/app/system/model/entity/sys_user.go b/internal/app/system/model/entity/sys_user.go new file mode 100644 index 0000000..090bd6d --- /dev/null +++ b/internal/app/system/model/entity/sys_user.go @@ -0,0 +1,35 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. Created at 2022-03-02 16:48:23 +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// SysUser is the golang structure for table sys_user. +type SysUser struct { + Id uint64 `json:"id" description:""` + UserName string `json:"userName" description:"用户名"` + Mobile string `json:"mobile" description:"中国手机不带国家代码,国际手机号格式为:国家代码-手机号"` + UserNickname string `json:"userNickname" description:"用户昵称"` + Birthday int `json:"birthday" description:"生日"` + UserPassword string `json:"userPassword" description:"登录密码;cmf_password加密"` + UserSalt string `json:"userSalt" description:"加密盐"` + UserStatus uint `json:"userStatus" description:"用户状态;0:禁用,1:正常,2:未验证"` + UserEmail string `json:"userEmail" description:"用户登录邮箱"` + Sex int `json:"sex" description:"性别;0:保密,1:男,2:女"` + Avatar string `json:"avatar" description:"用户头像"` + DeptId uint64 `json:"deptId" description:"部门id"` + Remark string `json:"remark" description:"备注"` + IsAdmin int `json:"isAdmin" description:"是否后台管理员 1 是 0 否"` + IsData int `json:"isData" description:"项目备案 1查看所有数据 2仅自己"` + Address string `json:"address" description:"联系地址"` + Describe string `json:"describe" description:"描述信息"` + LastLoginIp string `json:"lastLoginIp" description:"最后登录ip"` + LastLoginTime *gtime.Time `json:"lastLoginTime" description:"最后登录时间"` + CreatedAt *gtime.Time `json:"createdAt" description:"创建时间"` + UpdatedAt *gtime.Time `json:"updatedAt" description:"更新时间"` + DeletedAt *gtime.Time `json:"deletedAt" description:"删除时间"` +} diff --git a/internal/app/system/model/entity/sys_user_online.go b/internal/app/system/model/entity/sys_user_online.go new file mode 100644 index 0000000..a286995 --- /dev/null +++ b/internal/app/system/model/entity/sys_user_online.go @@ -0,0 +1,21 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// SysUserOnline is the golang structure for table sys_user_online. +type SysUserOnline struct { + Id uint64 `json:"id" description:""` + Uuid string `json:"uuid" description:"用户标识"` + Token string `json:"token" description:"用户token"` + CreateTime *gtime.Time `json:"createTime" description:"登录时间"` + UserName string `json:"userName" description:"用户名"` + Ip string `json:"ip" description:"登录ip"` + Explorer string `json:"explorer" description:"浏览器"` + Os string `json:"os" description:"操作系统"` +} diff --git a/internal/app/system/model/entity/sys_user_post.go b/internal/app/system/model/entity/sys_user_post.go new file mode 100644 index 0000000..8de724c --- /dev/null +++ b/internal/app/system/model/entity/sys_user_post.go @@ -0,0 +1,11 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +// SysUserPost is the golang structure for table sys_user_post. +type SysUserPost struct { + UserId int64 `json:"userId" description:"用户ID"` + PostId int64 `json:"postId" description:"岗位ID"` +} diff --git a/internal/app/system/model/entity/sys_user_project.go b/internal/app/system/model/entity/sys_user_project.go new file mode 100644 index 0000000..2c2181e --- /dev/null +++ b/internal/app/system/model/entity/sys_user_project.go @@ -0,0 +1,22 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-27 15:20:52 +// 生成路径: internal/app/system/model/entity/sys_user_project.go +// 生成人:gfast +// desc:用户和项目关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysUserProject is the golang structure for table sys_user_project. +type SysUserProject struct { + gmeta.Meta `orm:"table:sys_user_project"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + UserId int64 `orm:"user_id" json:"userId"` // 用户 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目 +} diff --git a/internal/app/system/model/entity/sys_wechat_role.go b/internal/app/system/model/entity/sys_wechat_role.go new file mode 100644 index 0000000..b39272d --- /dev/null +++ b/internal/app/system/model/entity/sys_wechat_role.go @@ -0,0 +1,26 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-01-22 15:05:43 +// 生成路径: internal/app/system/model/entity/sys_wechat_role.go +// 生成人:gfast +// desc:微信角色 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysWechatRole is the golang structure for table sys_wechat_role. +type SysWechatRole struct { + gmeta.Meta `orm:"table:sys_wechat_role"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + Name string `orm:"name" json:"name"` // 角色名称 + ListOrder int `orm:"list_order" json:"listOrder"` // 排序 + Remark string `orm:"remark" json:"remark"` // 备注 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 修改时间 +} diff --git a/internal/app/system/model/entity/template_data.go b/internal/app/system/model/entity/template_data.go new file mode 100644 index 0000000..559e5e9 --- /dev/null +++ b/internal/app/system/model/entity/template_data.go @@ -0,0 +1,28 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-12-08 14:21:01 +// 生成路径: internal/app/system/model/entity/template_data.go +// 生成人:gfast +// desc:工程资料>资料 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// TemplateData is the golang structure for table template_data. +type TemplateData struct { + gmeta.Meta `orm:"table:template_data"` + Id int64 `orm:"id,primary" json:"id"` // 主键id + DataName string `orm:"data_name" json:"dataName"` // 名称 + DataType string `orm:"data_type" json:"dataType"` // 1编写 2存储 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/template_data_junior.go b/internal/app/system/model/entity/template_data_junior.go new file mode 100644 index 0000000..597a0aa --- /dev/null +++ b/internal/app/system/model/entity/template_data_junior.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-12-08 14:21:01 +// 生成路径: internal/app/system/model/entity/template_data_junior.go +// 生成人:gfast +// desc:工程资料>资料>下级模板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// TemplateDataJunior is the golang structure for table template_data_junior. +type TemplateDataJunior struct { + gmeta.Meta `orm:"table:template_data_junior"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + Name string `orm:"name" json:"name"` // 模板名称 + FilenPath string `orm:"filen_path" json:"filenPath"` // 模板文件名 + Suffix string `orm:"suffix" json:"suffix"` // 后缀 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/template_data_source_data.go b/internal/app/system/model/entity/template_data_source_data.go new file mode 100644 index 0000000..cac5da1 --- /dev/null +++ b/internal/app/system/model/entity/template_data_source_data.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-12-08 10:06:54 +// 生成路径: internal/app/system/model/entity/template_data_source_data.go +// 生成人:gfast +// desc:模板资料源数据 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// TemplateDataSourceData is the golang structure for table template_data_source_data. +type TemplateDataSourceData struct { + gmeta.Meta `orm:"table:template_data_source_data"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + Type string `orm:"type" json:"type"` // 1模板 2资料 + TypeId int64 `orm:"type_id" json:"typeId"` // 对应数据id + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + SourceName string `orm:"source_name" json:"sourceName"` // 资源名称 + SourceId string `orm:"source_id" json:"sourceId"` // 资源ID + SourcePath string `orm:"source_path" json:"sourcePath"` // 资源路径 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/todo_tasks.go b/internal/app/system/model/entity/todo_tasks.go new file mode 100644 index 0000000..7cbd0d8 --- /dev/null +++ b/internal/app/system/model/entity/todo_tasks.go @@ -0,0 +1,25 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// TodoTasks is the golang structure for table todo_tasks. +type TodoTasks struct { + Id uint `json:"id" orm:"id" description:""` + MissingCardTime string `json:"missing_card_time" orm:"missing_card_time" description:"缺卡时间"` + Applicant int `json:"applicant" orm:"applicant" description:"申请人"` + ProjectId int `json:"project_id" orm:"project_id" description:"项目ID"` + TaskType int `json:"task_type" orm:"task_type" description:"0 补卡提醒 | 1 考勤审批"` + OrderId int `json:"order_id" orm:"order_id" description:"对应跳转的主键ID"` + CreatedAt *gtime.Time `json:"created_at" orm:"created_at" description:""` + UserId int `json:"user_id" orm:"user_id" description:"用户ID"` + Status int `json:"status" orm:"status" description:"0 未处理 | 1 已处理"` + Role int `json:"role" orm:"role" description:"0 管理员 1 施工人员"` + Uuid string `json:"uuid" orm:"uuid" description:"一组具有相同UUID的消息"` + UpdatedAt *gtime.Time `json:"updated_at" orm:"updated_at" description:"更新时间"` +} diff --git a/internal/app/system/model/entity/tools_gen_table.go b/internal/app/system/model/entity/tools_gen_table.go new file mode 100644 index 0000000..e8c4434 --- /dev/null +++ b/internal/app/system/model/entity/tools_gen_table.go @@ -0,0 +1,31 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// ToolsGenTable is the golang structure for table tools_gen_table. +type ToolsGenTable struct { + TableId int64 `json:"tableId" description:"编号"` + TableName string `json:"tableName" description:"表名称"` + TableComment string `json:"tableComment" description:"表描述"` + ClassName string `json:"className" description:"实体类名称"` + TplCategory string `json:"tplCategory" description:"使用的模板(crud单表操作 tree树表操作)"` + PackageName string `json:"packageName" description:"生成包路径"` + ModuleName string `json:"moduleName" description:"生成模块名"` + BusinessName string `json:"businessName" description:"生成业务名"` + FunctionName string `json:"functionName" description:"生成功能名"` + FunctionAuthor string `json:"functionAuthor" description:"生成功能作者"` + Options string `json:"options" description:"其它生成选项"` + CreateTime *gtime.Time `json:"createTime" description:"创建时间"` + UpdateTime *gtime.Time `json:"updateTime" description:"更新时间"` + Remark string `json:"remark" description:"备注"` + Overwrite bool `json:"overwrite" description:"是否覆盖原有文件"` + SortColumn string `json:"sortColumn" description:"排序字段名"` + SortType string `json:"sortType" description:"排序方式 (asc顺序 desc倒序)"` + ShowDetail bool `json:"showDetail" description:"是否有查看详情功能"` +} diff --git a/internal/app/system/model/entity/tools_gen_table_column.go b/internal/app/system/model/entity/tools_gen_table_column.go new file mode 100644 index 0000000..c2f6810 --- /dev/null +++ b/internal/app/system/model/entity/tools_gen_table_column.go @@ -0,0 +1,49 @@ +// ================================================================================= +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +// ToolsGenTableColumn is the golang structure for table tools_gen_table_column. +type ToolsGenTableColumn struct { + ColumnId int64 `json:"columnId" description:"编号"` + TableId int64 `json:"tableId" description:"归属表编号"` + ColumnName string `json:"columnName" description:"列名称"` + ColumnComment string `json:"columnComment" description:"列描述"` + ColumnType string `json:"columnType" description:"列类型"` + GoType string `json:"goType" description:"Go类型"` + TsType string `json:"tsType" description:"TS类型"` + GoField string `json:"goField" description:"Go字段名"` + HtmlField string `json:"htmlField" description:"html字段名"` + IsPk bool `json:"isPk" description:"是否主键(1是)"` + IsIncrement bool `json:"isIncrement" description:"是否自增(1是)"` + IsRequired bool `json:"isRequired" description:"是否必填(1是)"` + IsInsert bool `json:"isInsert" description:"是否为插入字段(1是)"` + IsEdit bool `json:"isEdit" description:"是否编辑字段(1是)"` + IsList bool `json:"isList" description:"是否列表字段(1是)"` + IsDetail bool `json:"isDetail" description:"是否详情字段"` + IsQuery bool `json:"isQuery" description:"是否查询字段(1是)"` + SortOrderEdit int `json:"sortOrderEdit" description:"插入编辑显示顺序"` + SortOrderList int `json:"sortOrderList" description:"列表显示顺序"` + SortOrderDetail int `json:"sortOrderDetail" description:"详情显示顺序"` + SortOrderQuery int `json:"sortOrderQuery" description:"查询显示顺序"` + QueryType string `json:"queryType" description:"查询方式(等于、不等于、大于、小于、范围)"` + HtmlType string `json:"htmlType" description:"显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)"` + DictType string `json:"dictType" description:"字典类型"` + LinkTableName string `json:"linkTableName" description:"关联表名"` + LinkTableClass string `json:"linkTableClass" description:"关联表类名"` + LinkTableModuleName string `json:"linkTableModuleName" description:"关联表模块名"` + LinkTableBusinessName string `json:"linkTableBusinessName" description:"关联表业务名"` + LinkTablePackage string `json:"linkTablePackage" description:"关联表包名"` + LinkLabelId string `json:"linkLabelId" description:"关联表键名"` + LinkLabelName string `json:"linkLabelName" description:"关联表字段值"` + ColSpan int `json:"colSpan" description:"详情页占列数"` + RowSpan int `json:"rowSpan" description:"详情页占行数"` + IsRowStart bool `json:"isRowStart" description:"详情页为行首"` + MinWidth int `json:"minWidth" description:"表格最小宽度"` + IsFixed bool `json:"isFixed" description:"是否表格列左固定"` + IsOverflowTooltip bool `json:"isOverflowTooltip" description:"是否过长自动隐藏"` + IsCascade bool `json:"isCascade" description:"是否级联查询"` + ParentColumnName string `json:"parentColumnName" description:"上级字段名"` + CascadeColumnName string `json:"cascadeColumnName" description:"级联查询字段"` +} diff --git a/internal/app/system/model/entity/user_activity.go b/internal/app/system/model/entity/user_activity.go new file mode 100644 index 0000000..d0f186f --- /dev/null +++ b/internal/app/system/model/entity/user_activity.go @@ -0,0 +1,16 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// UserActivity is the golang structure for table user_activity. +type UserActivity struct { + Id uint `json:"id" description:""` + UserId int `json:"user_id" description:"用户ID"` + CreatedAt *gtime.Time `json:"created_at" description:""` +} diff --git a/internal/app/system/model/entity/user_registration.go b/internal/app/system/model/entity/user_registration.go new file mode 100644 index 0000000..9525810 --- /dev/null +++ b/internal/app/system/model/entity/user_registration.go @@ -0,0 +1,25 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-07-26 15:32:12 +// 生成路径: internal/app/system/model/entity/user_registration.go +// 生成人:gfast +// desc:极光推送 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// UserRegistration is the golang structure for table user_registration. +type UserRegistration struct { + gmeta.Meta `orm:"table:user_registration"` + Id uint `orm:"id,primary" json:"id"` // + UserId int `orm:"user_id" json:"userId"` // 用户ID + OpenId string `orm:"open_id" json:"openId"` // 微信 open_id + RegistrationId string `orm:"registration_id" json:"registrationId"` // 极光推送 设备唯一标识 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // +} diff --git a/internal/app/system/model/entity/work_schedule.go b/internal/app/system/model/entity/work_schedule.go new file mode 100644 index 0000000..73d52b1 --- /dev/null +++ b/internal/app/system/model/entity/work_schedule.go @@ -0,0 +1,24 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// WorkSchedule is the golang structure for table work_schedule. +type WorkSchedule struct { + Id int `json:"id" description:""` + WorkId string `json:"work_id" description:"关联的工作ID"` + StartAt *gtime.Time `json:"start_at" description:"开始时间"` + Detail string `json:"detail" description:"每天详细数据"` + Status int `json:"status" description:"状态"` + PlanNum int `json:"plan_num" description:"计划数量"` + FinishedNum int `json:"finished_num" description:"完成量"` + EndAt *gtime.Time `json:"end_at" description:"结束时间"` + ProjectId int `json:"project_id" description:"主项目ID"` + SubProjectid int `json:"sub_projectid" description:"子项目ID"` + FangzhenId int `json:"fangzhen_id" description:"方阵ID"` +} diff --git a/internal/app/system/model/entity/work_status.go b/internal/app/system/model/entity/work_status.go new file mode 100644 index 0000000..ff27436 --- /dev/null +++ b/internal/app/system/model/entity/work_status.go @@ -0,0 +1,29 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" +) + +// WorkStatus is the golang structure for table work_status. +type WorkStatus struct { + Id uint `json:"id" description:""` + FangzhenId string `json:"fangzhen_id" description:"方阵ID"` + Parent int `json:"parent" description:"父节点"` + WorkId string `json:"work_id" description:"工作id"` + WorkName string `json:"work_name" description:"工作名称"` + Total int `json:"total" description:"总量"` + Finished int `json:"finished" description:"完成量"` + StartAt *gtime.Time `json:"start_at" description:"开始时间"` + EndAt *gtime.Time `json:"end_at" description:"工作结束时间"` + Status int `json:"status" description:"状态 0未开始 1 进行中 2 已完成 3 已延期"` + CreatedAt *gtime.Time `json:"created_at" description:""` + Type int `json:"type" description:"类型"` + IsPercent int `json:"is_percent" description:"是否为百分比"` + ProjectId int `json:"project_id" description:"项目ID"` + SubProjectid int `json:"sub_projectid" description:"子项目ID"` + IsDelay int `json:"is_delay" description:"0 未延期 | 1 延期"` +} diff --git a/internal/app/system/model/entity/xiangmuhuafenbiao.go b/internal/app/system/model/entity/xiangmuhuafenbiao.go new file mode 100644 index 0000000..abb0016 --- /dev/null +++ b/internal/app/system/model/entity/xiangmuhuafenbiao.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-10-07 16:08:10 +// 生成路径: internal/app/system/model/entity/xiangmuhuafenbiao.go +// 生成人:gfast +// desc:项目划分 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// Xiangmuhuafenbiao is the golang structure for table xiangmuhuafenbiao. +type Xiangmuhuafenbiao struct { + gmeta.Meta `orm:"table:xiangmuhuafenbiao"` + Id int `orm:"id,primary" json:"id"` // + Danweigongcheng string `orm:"danweigongcheng" json:"danweigongcheng"` // 单位 工程 + Zidanweigongcheng string `orm:"zidanweigongcheng" json:"zidanweigongcheng"` // 子单位工程 + Fenbugongcheng string `orm:"fenbugongcheng" json:"fenbugongcheng"` // 分部 工程 + Zifenbugongcheng string `orm:"zifenbugongcheng" json:"zifenbugongcheng"` // 子分部工程 + Fenxianggongcheng string `orm:"fenxianggongcheng" json:"fenxianggongcheng"` // 分项 工程 + Jianyanpi string `orm:"jianyanpi" json:"jianyanpi"` // 检验批 + Name string `orm:"name" json:"name"` // 工 程 项 目 名 称 + Zhixingbiaohao string `orm:"zhixingbiaohao" json:"zhixingbiaohao"` // 执行表号 + Json string `orm:"json" json:"json"` // json数据文件路径 + PrintStatus int `orm:"print_status" json:"printStatus"` // 打印状态 + ProjectId int `orm:"project_id" json:"projectId"` // 项目id + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreateddAt *gtime.Time `orm:"createdd_at" json:"createddAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/entity/ys7devices.go b/internal/app/system/model/entity/ys7devices.go new file mode 100644 index 0000000..8c9ae4b --- /dev/null +++ b/internal/app/system/model/entity/ys7devices.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-03-01 12:49:32 +// 生成路径: internal/app/system/model/entity/ys7devices.go +// 生成人:gfast +// desc:荧石摄像头 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// Ys7Devices is the golang structure for table ys7devices. +type Ys7Devices struct { + gmeta.Meta `orm:"table:ys7devices"` + Id uint `orm:"id,primary" json:"id"` // id + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // + DeviceSerial string `orm:"DeviceSerial" json:"deviceSerial"` // 设备串号 + DeviceName string `orm:"DeviceName" json:"deviceName"` // 设备名称 + DeviceType string `orm:"DeviceType" json:"deviceType"` // 设备类型 + Status int `orm:"Status" json:"status"` // 状态 + Defence int64 `orm:"Defence" json:"defence"` // + DeviceVersion string `orm:"DeviceVersion" json:"deviceVersion"` // 设备版本 + ProjectId string `orm:"ProjectId" json:"projectId"` // 项目ID +} diff --git a/internal/app/system/model/entity/ys7devices_img.go b/internal/app/system/model/entity/ys7devices_img.go new file mode 100644 index 0000000..6be5bd1 --- /dev/null +++ b/internal/app/system/model/entity/ys7devices_img.go @@ -0,0 +1,25 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2024-08-19 11:51:53 +// 生成路径: internal/app/system/model/entity/ys7devices_img.go +// 生成人:gfast +// desc:摄像头所拍摄到的所有图片(每月会定时清除) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// Ys7DevicesImg is the golang structure for table ys7devices_img. +type Ys7DevicesImg struct { + gmeta.Meta `orm:"table:ys7devices_img"` + Id uint64 `orm:"id,primary" json:"id"` // 主键ID + FatherId uint64 `orm:"father_id" json:"fatherId"` // 父id + Name string `orm:"name" json:"name"` // 摄像头名称 + Path string `orm:"path" json:"path"` // 图片路径 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 拍摄时间 +} diff --git a/internal/app/system/model/entity/zmkg_gis_model_lib.go b/internal/app/system/model/entity/zmkg_gis_model_lib.go new file mode 100644 index 0000000..71394de --- /dev/null +++ b/internal/app/system/model/entity/zmkg_gis_model_lib.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-07-31 10:18:14 +// 生成路径: internal/app/system/model/entity/zmkg_gis_model_lib.go +// 生成人:gfast +// desc:模型库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ZmkgGisModelLib is the golang structure for table zmkg_gis_model_lib. +type ZmkgGisModelLib struct { + gmeta.Meta `orm:"table:zmkg_gis_model_lib"` + Id int `orm:"id,primary" json:"id"` // 序号 + ModelId string `orm:"model_id" json:"modelId"` // 模型id + ModelName string `orm:"model_name" json:"modelName"` // 模型名称 + Url string `orm:"url" json:"url"` // 模型地址 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreateAt *gtime.Time `orm:"create_at" json:"createAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/system/model/manage_airline.go b/internal/app/system/model/manage_airline.go new file mode 100644 index 0000000..ac56d4a --- /dev/null +++ b/internal/app/system/model/manage_airline.go @@ -0,0 +1,98 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-12-11 16:10:19 +// 生成路径: internal/app/system/model/manage_airline.go +// 生成人:gfast +// desc:航线 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageAirlineInfoRes is the golang structure for table manage_airline. +type ManageAirlineInfoRes struct { + gmeta.Meta `orm:"table:manage_airline"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + StrId string `orm:"str_id" json:"strId"` // 航线ID + Speed int `orm:"speed" json:"speed"` // 航线速度 + Height int `orm:"height" json:"height"` //航线高度 + Gap int `orm:"gap" json:"gap"` //航线高度 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + AirLine string `orm:"air_line" json:"airLine"` // 航线名称 + Positions string `orm:"positions" json:"positions"` // 航线笛卡尔 + PositionsEntity []*PositionsEntity `orm:"positionsEntity" json:"positionsEntity"` // 航线笛卡尔 + FilePath string `orm:"file_path" json:"filePath"` // 航线文件 + Fingerprint string `orm:"fingerprint" json:"fingerprint"` // 航线内容md5加密 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Remark string `orm:"remark" json:"remark"` // 备注 + TakeOffPoint string `orm:"take_off_point" json:"takeOffPoint"` // 起飞点 + TakeOffSecurityHeight string `orm:"take_off_security_height" json:"takeOffSecurityHeight"` // 安全起飞高度 + GlobalTransitionalSpeed string `orm:"global_transitional_speed" json:"globalTransitionalSpeed"` // 飞向首航点速度 + MqClientId string `orm:"mq_client_id" json:"mqClientId"` //关联飞机 +} + +type ManageAirlineListRes struct { + Id int64 `json:"id"` + StrId string `json:"strId"` + Speed int `json:"speed"` + Height int `json:"height"` + Gap int `json:"gap"` + ProjectId int64 `json:"projectId"` + AirLine string `json:"airLine"` + Positions string `json:"positions"` + PositionsEntity []*PositionsEntity `json:"positionsEntity"` + FilePath string `json:"filePath"` + Fingerprint string `json:"fingerprint"` + CreatedAt *gtime.Time `json:"createdAt"` + Remark string `json:"remark"` + MqClientId string `json:"mqClientId"` + TakeOffPoint string `json:"takeOffPoint"` + TakeOffSecurityHeight string `json:"takeOffSecurityHeight"` // 安全起飞高度 + GlobalTransitionalSpeed string `json:"globalTransitionalSpeed"` // 飞向首航点速度 +} + +type PositionsEntity struct { + X float64 `json:"x"` + Y float64 `json:"y"` + Z float64 `json:"z"` +} + +type AirlineEntity struct { + AbsolutePath string `json:"absolutePath" dc:"生成的航线执行 kmz 文件在服务器的存放路径"` + TakeOffRefPoint string `json:"takeOffRefPoint" dc:"参考起飞点,维度,精度.高度"` + GlobalHeight int `json:"globalHeight" dc:"全局航线高度"` + //GlobalSpeed int `json:"globalSpeed" dc:"全局航线速度"` + WayLineId int `json:"waylineId" dc:"航线ID"` + AutoFlightSpeed int `json:"autoFlightSpeed" dc:"全局航线速度"` + TakeOffSecurityHeight float64 `json:"takeOffSecurityHeight" dc:"安全起飞高度" ` + GlobalTransitionalSpeed float64 `json:"globalTransitionalSpeed" dc:"飞向首航点速度"` + DroneInfo struct { + DroneEnumValue string `json:"droneEnumValue"` + DroneSubEnumValue string `json:"droneSubEnumValue"` + } `json:"droneInfo" dc:"无人机的型号及其子类型"` + PayloadInfo struct { + PayloadEnumValue string `json:"payloadEnumValue"` + PayloadSubEnumValue string `json:"payloadSubEnumValue"` + PayloadPositionIndex string `json:"payloadPositionIndex"` + } `json:"payloadInfo" dc:"无人机携带的负载以及负载在无人机上的位置"` + LocationList []struct { + Longitude string `json:"longitude"` + Latitude string `json:"latitude"` + Height string `json:"height"` + } `json:"locationList" dc:"一系列经纬度和高低"` +} + +type CoordinateEntity struct { + Longitude string `json:"longitude"` + Latitude string `json:"latitude"` + Height string `json:"height"` +} diff --git a/internal/app/system/model/manage_device.go b/internal/app/system/model/manage_device.go new file mode 100644 index 0000000..da5d879 --- /dev/null +++ b/internal/app/system/model/manage_device.go @@ -0,0 +1,107 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-11-14 10:53:21 +// 生成路径: internal/app/system/model/manage_device.go +// 生成人:gfast +// desc:设备信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageDeviceInfoRes is the golang structure for table manage_device. +type ManageDeviceInfoRes struct { + gmeta.Meta `orm:"table:manage_device"` + Id uint64 `orm:"id,primary" json:"id"` // 自增ID + DeviceSn string `orm:"device_sn" json:"deviceSn"` // 对接站点、无人机或遥控器的序列号 + DeviceName string `orm:"device_name" json:"deviceName"` // 设备的型号。该参数对应设备字典表中的设备名称 + MqClientId string `orm:"mq_client_id" json:"mqClientId"` // 客户端id + UserId string `orm:"user_id" json:"userId"` // 设备绑定时使用的账号 + Nickname string `orm:"nickname" json:"nickname"` // 设备的自定义名称 + WorkspaceId string `orm:"workspace_id" json:"workspaceId"` // 当前设备所属的工作区 + DeviceType int64 `orm:"device_type" json:"deviceType"` // 该参数对应设备字典表中的设备类型 + SubType int64 `orm:"sub_type" json:"subType"` // 该参数对应设备字典表中的子类型 + Domain int64 `orm:"domain" json:"domain"` // 该参数对应设备字典表中的域 + FirmwareVersion string `orm:"firmware_version" json:"firmwareVersion"` // 设备的固件版本 + CompatibleStatus int `orm:"compatible_status" json:"compatibleStatus"` // 1: 一致;0: 不一致;固件版本是否一致 + Version string `orm:"version" json:"version"` // 协议版本。该字段目前没有用处。 + DeviceIndex string `orm:"device_index" json:"deviceIndex"` // 无人机的控制,A控制或B控制 + ChildSn string `orm:"child_sn" json:"childSn"` // 由网关控制的设备 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + BoundTime *gtime.Time `orm:"bound_time" json:"boundTime"` // 设备绑定工作区的时间 + BoundStatus int `orm:"bound_status" json:"boundStatus"` // 设备绑定工作区的状态。1: 已绑定;0: 未绑定 + LoginTime *gtime.Time `orm:"login_time" json:"loginTime"` // 设备的上次登录时间 + DeviceDesc string `orm:"device_desc" json:"deviceDesc"` // 设备描述 + UrlNormal string `orm:"url_normal" json:"urlNormal"` // 遥控器上显示的图标 + UrlSelect string `orm:"url_select" json:"urlSelect"` // 选中遥控器时显示的图标 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + DictionaryId int64 `orm:"dictionary_id" json:"dictionaryId"` // 该参数对应设备字典表中的设备类型 + LngAndLatAndHeight string `orm:"lngAndLatAndHeight" json:"lngAndLatAndHeight"` + ManageDeviceVideoEntity []*ManageDeviceVideoEntity `json:"manageDeviceVideoEntity" orm:"with:gateway_sn=mq_client_id"` +} + +type ManageDeviceListRes struct { + Id uint64 `json:"id"` + DeviceSn string `json:"deviceSn"` + DeviceName string `json:"deviceName"` + MqClientId string `json:"mqClientId"` + UserId string `json:"userId"` + Nickname string `json:"nickname"` + WorkspaceId string `json:"workspaceId"` + DeviceType int64 `json:"deviceType"` + SubType int64 `json:"subType"` + Domain int64 `json:"domain"` + FirmwareVersion string `json:"firmwareVersion"` + CompatibleStatus int `json:"compatibleStatus"` + Version string `json:"version"` + DeviceIndex string `json:"deviceIndex"` + ChildSn string `json:"childSn"` + CreatedAt *gtime.Time `json:"createdAt"` + BoundTime *gtime.Time `json:"boundTime"` + BoundStatus int `json:"boundStatus"` + LoginTime *gtime.Time `json:"loginTime"` + DeviceDesc string `json:"deviceDesc"` + UrlNormal string `json:"urlNormal"` + UrlSelect string `json:"urlSelect"` + ProjectId int64 `json:"projectId"` + DictionaryId int64 `json:"dictionaryId"` + LngAndLatAndHeight string `json:"lngAndLatAndHeight"` + ManageDeviceVideoEntity []*ManageDeviceVideoEntity `json:"manageDeviceVideoEntity"` +} + +type ManageDeviceVideoEntity struct { + gmeta.Meta `orm:"table:manage_device_video"` + Id string `json:"id" dc:"主键ID"` + Type string `json:"type" dc:"0机场 1飞机"` + GatewaySn string `json:"gatewaySn"` + DeviceSn string `json:"deviceSn"` + SonSn string `json:"sonSn"` +} + +// ManageDeviceDictionaryInfo 产品枚举 +type ManageDeviceDictionaryInfo struct { + gmeta.Meta `orm:"table:manage_device_dictionary"` + Id uint64 `orm:"id,primary" json:"id"` + Domain string `orm:"domain" json:"domain" dc:"该参数对应文档中的产品类型中的域。0: 无人机; 1: 载荷; 2: 遥控器; 3: 停机坪"` + DeviceType string `orm:"device_type" json:"device_type" dc:"该参数对应文档中的产品类型中的类型"` + SubType string `orm:"sub_type" json:"sub_type" dc:"该参数对应文档中的产品类型中的子类型"` + DeviceName string `orm:"device_name" json:"device_name" dc:"该参数对应文档中的产品类型中的名称"` + DeviceDesc string `orm:"device_desc" json:"device_desc" dc:"备注"` +} + +// ButtonEntity 飞机调试模式下的一些按钮状态 +type ButtonEntity struct { + gmeta.Meta `orm:"table:manage_button_state"` + MqClientId string `orm:"mq_client_id" json:"mqClientId" dc:"关联飞机"` + Debug int16 `orm:"debug" json:"debug" dc:"调试模式(1开 2关)"` + HatchCover int16 `orm:"hatch_cover" json:"hatchCover" dc:"舱盖"` + Power int16 `orm:"power" json:"power" dc:"飞行器电源 "` + PushRod int16 `orm:"push_rod" json:"pushRod" dc:"推杆"` + Recharge int16 `orm:"recharge" json:"recharge" dc:"飞行器充电"` +} diff --git a/internal/app/system/model/manage_operation_log.go b/internal/app/system/model/manage_operation_log.go new file mode 100644 index 0000000..9778bc9 --- /dev/null +++ b/internal/app/system/model/manage_operation_log.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-06-21 15:23:29 +// 生成路径: internal/app/system/model/manage_operation_log.go +// 生成人:gfast +// desc:无人机指令日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageOperationLogInfoRes is the golang structure for table manage_operation_log. +type ManageOperationLogInfoRes struct { + gmeta.Meta `orm:"table:manage_operation_log"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + Sn string `orm:"sn" json:"sn"` // sn + Method string `orm:"method" json:"method"` // 方法名 + Direction string `orm:"direction" json:"direction"` // 上发/下发命令 + Code int `orm:"code" json:"code"` // 状态码 + Operator int64 `orm:"operator" json:"operator"` // 操作人ID(默认为0表示系统操作) + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 操作人ID(默认为0表示系统操作) +} + +type ManageOperationLogListRes struct { + Id int64 `json:"id"` + Sn string `json:"sn"` + Method string `json:"method"` + Direction string `json:"direction"` + Code int `json:"code"` + Operator int64 `json:"operator"` + OperatorRen string `json:"operatorRen"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/manage_task.go b/internal/app/system/model/manage_task.go new file mode 100644 index 0000000..6c71bc1 --- /dev/null +++ b/internal/app/system/model/manage_task.go @@ -0,0 +1,74 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-12-12 15:21:22 +// 生成路径: internal/app/system/model/manage_task.go +// 生成人:gfast +// desc:航线任务下发 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageTaskInfoRes is the golang structure for table manage_task. +type ManageTaskInfoRes struct { + gmeta.Meta `orm:"table:manage_task"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + TaskName string `orm:"task_name" json:"taskName"` // 任务名称 + FlightId string `orm:"flight_id" json:"flightId"` // 计划ID(uuid) + TaskType string `orm:"task_type" json:"taskType"` // 任务类型("0":"立即任务","1":"定时任务","2":"条件任务") + ExecuteTime int64 `orm:"execute_time" json:"executeTime"` // 任务开始执行时间毫秒时间戳 + WaylineType int `orm:"wayline_type" json:"waylineType"` // 0普通航线 + AirLine int64 `orm:"air_line" json:"airLine"` // 关联航线 + ProjectId int64 `orm:"project_id" json:"projectId"` // 关联项目 + RthAltitude int `orm:"rth_altitude" json:"rthAltitude"` // 返航高度 + RthMode int `orm:"rth_mode" json:"rthMode"` // (默认为0)"0":"智能高度","1":"设定高度" + OutOfControlAction int `orm:"out_of_control_action" json:"outOfControlAction"` // (默认为0)"0":"返航","1":"悬停","2":"降落" + ExitWaylineWhenRcLost int `orm:"exit_wayline_when_rc_lost" json:"exitWaylineWhenRcLost"` // (默认为0)"0":"继续执行航线任务","1":"退出航线任务,执行遥控器失控动作" + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Remark string `orm:"remark" json:"remark"` // 备注 + AirLineName string `orm:"airLineName" json:"airLineName"` // 航线名称 + DeviceName string `orm:"deviceName" json:"deviceName"` // 设备名称 + MqClientId string `orm:"mq_client_id" json:"mqClientId"` //关联飞机 +} + +type ManageTaskListRes struct { + Id int64 `json:"id"` + TaskName string `json:"taskName"` + FlightId string `json:"flightId"` + TaskType string `json:"taskType"` + ExecuteTime int64 `json:"executeTime"` + WaylineType int `json:"waylineType"` + AirLine int64 `json:"airLine"` + ProjectId int64 `json:"projectId"` + RthAltitude int `json:"rthAltitude"` + RthMode int `json:"rthMode"` + OutOfControlAction int `json:"outOfControlAction"` + ExitWaylineWhenRcLost int `json:"exitWaylineWhenRcLost"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` + Remark string `json:"remark"` + AirLineName string `json:"airLineName"` + DeviceName string `json:"deviceName"` + MqClientId string `json:"mqClientId"` + IsCron int `json:"isCron" dc:"是否开启定时任务 0未开启 1开启"` +} + +// AirLinePublicRes 航线公共字段 +type AirLinePublicRes struct { + Tid string `json:"tid" dc:"事务uuid"` + Bid string `json:"bid" dc:"业务uuid"` + Timestamp int64 `json:"flightId" dc:"毫秒时间戳:消息的发送时间"` + Method string `json:"method" dc:"方法名"` + Gateway string `json:"gateway" dc:"网关设备的序列号:发送该消息的网关设备的序列号"` + Data interface{} `json:"data" dc:"消息内容"` +} diff --git a/internal/app/system/model/manage_task_cron.go b/internal/app/system/model/manage_task_cron.go new file mode 100644 index 0000000..7f19805 --- /dev/null +++ b/internal/app/system/model/manage_task_cron.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-06-04 14:33:05 +// 生成路径: internal/app/system/model/manage_task_cron.go +// 生成人:gfast +// desc:航线任务定时飞行 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageTaskCronInfoRes is the golang structure for table manage_task_cron. +type ManageTaskCronInfoRes struct { + gmeta.Meta `orm:"table:manage_task_cron"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + MqClientId string `orm:"mq_client_id" json:"mqClientId"` // sn + TaskId int64 `orm:"task_id" json:"taskId"` // 任务模板ID + Cron string `orm:"cron" json:"cron"` // 表达式 + CronId int `orm:"cron_id" json:"cronId"` // cronID +} + +type ManageTaskCronListRes struct { + Id int64 `json:"id"` + MqClientId string `json:"mqClientId"` + TaskId int64 `json:"taskId"` + Cron string `json:"cron"` + CronId int `json:"cronId"` +} diff --git a/internal/app/system/model/manage_task_record.go b/internal/app/system/model/manage_task_record.go new file mode 100644 index 0000000..7dd05a2 --- /dev/null +++ b/internal/app/system/model/manage_task_record.go @@ -0,0 +1,122 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-12-12 17:56:19 +// 生成路径: internal/app/system/model/manage_task_record.go +// 生成人:gfast +// desc:航线任务下发-记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageTaskRecordInfoRes is the golang structure for table manage_task_record. +type ManageTaskRecordInfoRes struct { + gmeta.Meta `orm:"table:manage_task_record"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + TaskId int64 `orm:"task_id" json:"taskId"` // 任务主键ID + FlightId string `orm:"flight_id" json:"flightId"` // 任务ID + TaskType string `orm:"task_type" json:"taskType"` // 任务类型("0":"立即任务","1":"定时任务","2":"条件任务") + ExecuteTime int64 `orm:"execute_time" json:"executeTime"` // 任务开始执行时间(毫秒) + ExecuteTheTask int64 `orm:"execute_the_task" json:"executeTheTask"` // 任务执行时间戳 + Suspend int64 `orm:"suspend" json:"suspend"` // 航线暂停时间戳 + Recover int64 `orm:"recover" json:"recover"` // 航线恢复时间戳 + CourseReversal int64 `orm:"course_reversal" json:"courseReversal"` // 返航时间戳 + CancelHoming int64 `orm:"cancel_homing" json:"cancelHoming"` // 取消返航时间戳 + Accomplish int64 `orm:"accomplish" json:"accomplish"` // 返航完成时间戳 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + Remark string `orm:"remark" json:"remark"` // 备注 + IsResourceReady string `orm:"is_resource_ready" json:"isResourceReady"` // 资源是否准备完成(0未完成 1完成) + MergeProjectId string `orm:"merge_project_id" json:"mergeProjectId" ` // 合并项目ID + MergeId string `orm:"merge_id" json:"mergeId" ` // 大图合并的任务id + WImg string `orm:"w_img" json:"wImg" ` // 大图合并的资源路径 + WTif string `orm:"w_tif" json:"wTif" ` // 大图合并的资源路径 + IsVoluntarily string `orm:"is_voluntarily" json:"isVoluntarily" ` // 0自动飞行 1手动飞行 + RouteId int `orm:"route_id" json:"routeId" ` // 断点-航线ID + InterruptCause int `orm:"interrupt_cause" json:"interruptCause" ` // 断点-航线中断原因(数字) + DdIndex int `orm:"dd_index" json:"ddIndex" ` // 断点-序号 + DdState int `orm:"dd_state" json:"ddState" ` // 断点-状态(0在航段上 1在航点上) + DdProgress float32 `orm:"dd_progress" json:"ddProgress" ` // 断点-航断进度(0~1) + IsSuspend string `orm:"is_suspend" json:"isSuspend" ` // 当前执行的航线恢复0还是暂停1? + TaskName string `orm:"task_name" json:"taskName"` // 任务名称 + Waypoint int `orm:"waypoint" json:"waypoint"` // 航点数 + + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + + MqClientId string `orm:"mqClientId" json:"mq_client_id"` // 关联机场 + ProjectId int64 `orm:"projectId" json:"project_id"` // 项目id + AirLine string `orm:"airLine" json:"airLine"` // 航线 +} + +type ManageTaskRecordListRes struct { + Id int64 `json:"id"` + TaskId int64 `json:"taskId"` + FlightId string `json:"flightId"` + TaskType string `json:"taskType" dc:"0立即任务 1定时任务 3条件任务"` + ExecuteTime int64 `json:"executeTime" dc:"任务开始执行时间(毫秒)"` + ExecuteTheTask int64 `json:"executeTheTask" dc:"执行任务时间戳(毫秒)"` + Suspend int64 `json:"suspend" dc:"航线暂停时间戳(毫秒)"` + Recover int64 `json:"recover" dc:"航线恢复时间戳(毫秒)"` + CourseReversal int64 `json:"courseReversal" dc:"返航时间戳(毫秒)"` + CancelHoming int64 `json:"cancelHoming" dc:"取消返航时间戳(毫秒)"` + Accomplish int64 `json:"accomplish" dc:"返航完成时间戳" ` + CreateBy string `json:"createBy" "` + UpdateBy string `json:"updateBy" "` + CreatedAt *gtime.Time `json:"createdAt" ` + Remark string `json:"remark"` + Airport string `json:"airport"` + TaskName string `json:"taskName" dc:"任务名称"` + MqClientId string `json:"mqClientId"` + ProjectId int64 `json:"projectId"` + AirLine string `json:"airLine"` + IsResourceReady string `json:"isResourceReady" dc:"资源是否准备完成(0未完成 1完成)"` + IsVoluntarily string `json:"isVoluntarily" dc:"0自动飞行 1手动飞行"` + EstimatedQuantity int `json:"estimatedQuantity" dc:"预估回传数量"` + ActualReturn int `json:"actualReturn" dc:"实际回传数量"` + IsSuspend string `json:"isSuspend" dc:"当前执行的航线恢复0还是暂停1?"` + IsButton []int `json:"isButton" dc:"【执行任务1】【航线暂停2】【恢复航线3】【一键返航4】【断点续飞5】【删除任务6】"` + InterruptCause int `json:"interruptCause" dc:"航线中断原因"` // +} + +type PcListOfRoutesRes struct { + Id int64 `json:"id" dc:"主键ID"` + FlightId string `json:"flightId" dc:"计划ID"` + TaskId int64 `json:"taskId" dc:"任务模板ID"` + ExecuteTheTask int64 `json:"executeTheTask" dc:"执行任务时间戳(毫秒)"` + Accomplish int64 `json:"accomplish" dc:"返航完成时间戳(毫秒)" ` + TaskName string `json:"taskName" dc:"任务名称"` + AirLine string `json:"airLine" dc:"航线ID"` + Remark string `json:"remark" dc:"备注"` + IsVoluntarily string `json:"isVoluntarily" dc:"0自动飞行 1手动飞行"` + IsResourceReady string `json:"isResourceReady" dc:"资源是否准备完成(0未完成 1完成)"` + EstimatedQuantity int `json:"estimatedQuantity" dc:"预估回传数量"` + ActualReturn int `json:"actualReturn" dc:"实际回传数量"` + IsButton []int `json:"isButton" dc:"【执行任务1】【航线暂停2】【恢复航线3】【一键返航4】【断点续飞5】【删除任务6】"` + InterruptCause int `json:"interruptCause" dc:"航线中断原因(状态码)"` + InterruptCauseCode string `json:"interruptCauseCode" dc:"航线中断原因(状态码翻译)"` + MergeProjectId string `json:"mergeProjectId" dc:"合并项目ID"` + MergeId string `json:"mergeId" dc:"大图合并的任务id"` + WImg string `json:"wImg" dc:"大图合并的资源路径-大图"` + WTif string `json:"wTif" dc:"大图合并的资源路径-tif"` +} + +// 首页AI识别结果 +type AiResultRes struct { + // 主键ID + Id int64 `json:"id" orm:"id" dc:"主键ID"` + // 编号名 + NumberName string `json:"numberName" orm:"name" dc:"编号名"` + // 方阵名 + FangzhenName string `json:"fangzhenName" orm:"qf.name" dc:"方阵名"` + // 方阵ID + FangzhenId string `json:"fangzhenId" orm:"sp.name" dc:"方阵ID"` + // 类型 + Type string `json:"type" orm:"type" dc:"类型 15 光伏板 14支架 13桩基"` +} diff --git a/internal/app/system/model/manage_task_record_resource.go b/internal/app/system/model/manage_task_record_resource.go new file mode 100644 index 0000000..7539207 --- /dev/null +++ b/internal/app/system/model/manage_task_record_resource.go @@ -0,0 +1,52 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-05-30 17:07:01 +// 生成路径: internal/app/system/model/manage_task_record_resource.go +// 生成人:gfast +// desc:下发记录回传的媒体文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageTaskRecordResourceInfoRes is the golang structure for table manage_task_record_resource. +type ManageTaskRecordResourceInfoRes struct { + gmeta.Meta `orm:"table:manage_task_record_resource"` + FlightId string `orm:"flight_id,primary" json:"flightId"` // 计划ID + FileName string `orm:"file_name" json:"fileName"` // 文件名称 + ObjectKey string `orm:"object_key" json:"objectKey"` // 文件在对象存储桶的 Key + Path string `orm:"path" json:"path"` // 文件的业务路径 + DroneModelKey string `orm:"drone_model_key" json:"droneModelKey"` // 飞行器产品枚举值 + PayloadModelKey string `orm:"payload_model_key" json:"payloadModelKey"` // 负载产品枚举值 + AbsoluteAltitude float64 `orm:"absolute_altitude" json:"absoluteAltitude"` // 拍摄绝对高度 + RelativeAltitude float64 `orm:"relative_altitude" json:"relativeAltitude"` // 拍摄相对高度 + CreateTime *gtime.Time `orm:"create_time" json:"createTime"` // 媒体拍摄时间 + ShootPosition string `orm:"shoot_position" json:"shootPosition"` // 拍摄位置 + Lat string `orm:"lat" json:"lat"` // 拍摄位置纬度 + Lng string `orm:"lng" json:"lng"` // 拍摄位置经度 + Img string `orm:"img" json:"img"` // 图片位置 + ImgSize string `orm:"img_size" json:"imgSize"` // 图片大小 +} + +type ManageTaskRecordResourceListRes struct { + FlightId string `json:"flightId"` + FileName string `json:"fileName"` + ObjectKey string `json:"objectKey"` + Path string `json:"path"` + DroneModelKey string `json:"droneModelKey"` + PayloadModelKey string `json:"payloadModelKey"` + AbsoluteAltitude float64 `json:"absoluteAltitude"` + RelativeAltitude float64 `json:"relativeAltitude"` + CreateTime *gtime.Time `json:"createTime"` + ShootPosition string `json:"shootPosition"` + Lat string `json:"lat"` + Lng string `json:"lng"` + Img string `json:"img"` + ImgSize string `json:"imgSize"` + Online string `json:"online" dc:"在线url 3天有效时长"` +} diff --git a/internal/app/system/model/manage_task_result.go b/internal/app/system/model/manage_task_result.go new file mode 100644 index 0000000..b967b80 --- /dev/null +++ b/internal/app/system/model/manage_task_result.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-10-21 11:29:13 +// 生成路径: internal/app/system/model/manage_task_result.go +// 生成人:gfast +// desc:AI识别到的数据 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageTaskResultInfoRes is the golang structure for table manage_task_result. +type ManageTaskResultInfoRes struct { + gmeta.Meta `orm:"table:manage_task_result"` + Id uint `orm:"id,primary" json:"id"` // + TaskId int `orm:"task_id" json:"taskId"` // 航线任务ID + PvId int `orm:"pv_id" json:"pvId"` // pv_module 的主键 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // +} + +type ManageTaskResultListRes struct { + Id uint `json:"id"` + TaskId int `json:"taskId"` + PvId int `json:"pvId"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/manage_workspace.go b/internal/app/system/model/manage_workspace.go new file mode 100644 index 0000000..a952a92 --- /dev/null +++ b/internal/app/system/model/manage_workspace.go @@ -0,0 +1,40 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-11-14 10:53:20 +// 生成路径: internal/app/system/model/manage_workspace.go +// 生成人:gfast +// desc:工作空间 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ManageWorkspaceInfoRes is the golang structure for table manage_workspace. +type ManageWorkspaceInfoRes struct { + gmeta.Meta `orm:"table:manage_workspace"` + Id uint64 `orm:"id,primary" json:"id"` // 自增ID + WorkspaceId string `orm:"workspace_id" json:"workspaceId"` // 工作区的UUID + WorkspaceName string `orm:"workspace_name" json:"workspaceName"` // 工作区的名称 + WorkspaceDesc string `orm:"workspace_desc" json:"workspaceDesc"` // 工作区的描述 + PlatformName string `orm:"platform_name" json:"platformName"` // 工作区的平台名称 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + BindCode string `orm:"bind_code" json:"bindCode"` // 当停机坪连接到第三方云时,需要提供该工作区的绑定码 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id +} + +type ManageWorkspaceListRes struct { + Id uint64 `json:"id"` + WorkspaceId string `json:"workspaceId"` + WorkspaceName string `json:"workspaceName"` + WorkspaceDesc string `json:"workspaceDesc"` + PlatformName string `json:"platformName"` + CreatedAt *gtime.Time `json:"createdAt"` + BindCode string `json:"bindCode"` + ProjectId int64 `json:"projectId"` +} diff --git a/internal/app/system/model/master_schedule.go b/internal/app/system/model/master_schedule.go new file mode 100644 index 0000000..9ad9b78 --- /dev/null +++ b/internal/app/system/model/master_schedule.go @@ -0,0 +1,45 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-10-08 09:38:35 +// 生成路径: internal/app/system/model/master_schedule.go +// 生成人:gfast +// desc:总进度计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// MasterScheduleInfoRes is the golang structure for table master_schedule. +type MasterScheduleInfoRes struct { + gmeta.Meta `orm:"table:master_schedule"` + Id int `orm:"id,primary" json:"id"` // + ProjectId int `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 工作名称 + Start string `orm:"start" json:"start"` // 开始时间 + End string `orm:"end" json:"end"` // 结束时间 + Content string `orm:"content" json:"content"` // 备注 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Sequence int `orm:"sequence" json:"sequence"` // 顺序编号 +} + +type MasterScheduleListRes struct { + Id int `json:"id"` + ProjectId int `json:"projectId"` + Name string `json:"name"` + Start string `json:"start"` + End string `json:"end"` + Content string `json:"content"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` + Sequence int `json:"sequence"` +} diff --git a/internal/app/system/model/notification_recipients.go b/internal/app/system/model/notification_recipients.go new file mode 100644 index 0000000..dd967e0 --- /dev/null +++ b/internal/app/system/model/notification_recipients.go @@ -0,0 +1,35 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-04-11 16:58:12 +// 生成路径: internal/app/system/model/notification_recipients.go +// 生成人:gfast +// desc:通知接收 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// NotificationRecipientsInfoRes is the golang structure for table notification_recipients. +type NotificationRecipientsInfoRes struct { + gmeta.Meta `orm:"table:notification_recipients"` + Id uint `orm:"id,primary" json:"id"` // + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // + NotificationId int `orm:"notification_id" json:"notificationId"` // 关联的通知ID + RecipientId int `orm:"recipient_id" json:"recipientId"` // 接收者ID + RecipientRole string `orm:"recipient_role" json:"recipientRole"` // 接收者权限 + NotificationStatus int `orm:"notification_status" json:"notificationStatus"` // 0 未读 | 1 已读 +} + +type NotificationRecipientsListRes struct { + Id uint `json:"id"` + CreatedAt *gtime.Time `json:"createdAt"` + NotificationId int `json:"notificationId"` + RecipientId int `json:"recipientId"` + RecipientRole string `json:"recipientRole"` + NotificationStatus int `json:"notificationStatus"` +} diff --git a/internal/app/system/model/notifications.go b/internal/app/system/model/notifications.go new file mode 100644 index 0000000..6bdb8b8 --- /dev/null +++ b/internal/app/system/model/notifications.go @@ -0,0 +1,99 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-04-11 16:56:36 +// 生成路径: internal/app/system/model/notifications.go +// 生成人:gfast +// desc:通知信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "strings" + + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" + "github.com/samber/lo" +) + +// NotificationsInfoRes is the golang structure for table notifications. +type NotificationsInfoRes struct { + gmeta.Meta `orm:"table:notifications"` + Id uint `orm:"id,primary" json:"id"` // + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // + NotificationText string `orm:"notification_text" json:"notificationText"` // 通知正文 + Route string `orm:"route" json:"route"` // 跳转的路由 + NotificationTime string `orm:"notification_time" json:"notificationTime"` // 通知时间 + Initiator int `orm:"initiator" json:"initiator"` // 发起人 + ProjectId int `orm:"project_id" json:"projectId"` // 项目ID + Title string `orm:"title" json:"title"` // 标题 + // 消息发起者名 + InitiatorName string `json:"initiatorName" orm:"initiator_nickname"` + // recipients_nickname 收件人昵称 + RecipientsNam string `json:"recipientsName" orm:"recipients_nickname"` + // positions + Position string `json:"positions" orm:"positions"` +} + +func (m *NotificationsInfoRes) Positions() []string { + return lo.Compact(strings.Split(m.Position, ",")) +} + +func (m *NotificationsInfoRes) RecipientsName() []string { + return lo.Compact(strings.Split(m.RecipientsNam, ",")) +} + +type NotificationsListRes struct { + Id uint `json:"id"` + CreatedAt *gtime.Time `json:"createdAt"` + NotificationText string `json:"notificationText"` + Route string `json:"route"` + NotificationTime string `json:"notificationTime"` + Initiator int `json:"initiator"` + ProjectId int `json:"projectId"` + Title string `json:"title"` + // 消息发起者名 + InitiatorName string `json:"initiatorName" orm:"initiator_nickname"` + RecipientsName []string `json:"recipientsName" orm:"recipients_nickname"` + Positions []string `json:"positions" orm:"positions"` +} + +// 用户详情 +type NotificationsGetRes struct { + Id uint `json:"id" orm:"recipient_id" dc:"用户ID"` // 用户ID + Avatar string `json:"avatar" orm:"avatar" dc:"头像"` // 头像 + Username string `json:"username" orm:"user_nickname" dc:"用户名"` // 用户名 + OrmMobile string `orm:"mobile"` + FacePhoto string `json:"facePhoto" orm:"pace_photo" dc:"实名人脸照"` + ReadTime string `json:"readTime" orm:"read_time" dc:"已读时间"` // 已读时间 + NotificationStatus int `json:"notificationStatus" orm:"notification_status" dc:"0 未读 | 1 已读"` // 0 未读 | 1 已读 +} + +func (n *NotificationsGetRes) Avatars() string { + // if n.FacePhoto != "" { + // return n.FacePhoto + // } + // return n.Avatar + return n.FacePhoto +} + +// model 通知信息 +type Notifications struct { + Id string `p:"id" orm:"id"` // 消息ID + Route string `p:"route" orm:"route"` // 跳转的路由 + NotificationTitle string `p:"title" orm:"title"` // 标题 + NotificationText string `p:"notificationText" orm:"notification_text"` // 通知正文 + NotificationTime string `p:"notificationTime" orm:"notification_time"` // 通知时间 + NotificationStatus string `p:"notification_status" orm:"notification_status"` // 通知状态 + Initiator string `p:"initiator" orm:"user_nickname" dc:"发起人"` // 发起人 + Files []FileInfo `p:"files" orm:"files"` // 附件 + Users []NotificationsGetRes `p:"users" orm:"users"` // 通知人员 +} + +type FileInfo struct { + Name string `orm:"file_name" json:"name" dc:"文件名"` + Url string `orm:"file_path" json:"url" dc:"文件路径"` + FileType string `orm:"file_type" json:"fileType" dc:"文件类型"` + Size uint64 `orm:"file_size" json:"size" dc:"文件大小"` +} diff --git a/internal/app/system/model/notifications_func.go b/internal/app/system/model/notifications_func.go new file mode 100644 index 0000000..a690582 --- /dev/null +++ b/internal/app/system/model/notifications_func.go @@ -0,0 +1,57 @@ +package model + +import ( + "context" + + "github.com/gogf/gf/v2/frame/g" + "github.com/samber/lo" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" +) + +func (n *Notifications) ReadNum() int { + // 从 redis 中获取已读人数 + count, err := g.Redis().Get(context.Background(), "notification:"+n.Id) + if err != nil { + return 0 + } + return count.Int() +} + +// 已读人数 +func (n *Notifications) ReadPeople() int { + // 如果 n.users 为空则从数据库中查询 + if len(n.Users) == 0 { + list := []NotificationsGetRes{} + if err := dao.NotificationRecipients.Ctx(context.Background()).As("nr"). + LeftJoin("sys_user as su", "nr.recipient_id = su.id"). + Fields("nr.*,su.user_nickname"). + Where("nr.notification_id", n.Id).Scan(&list); err != nil { + return 0 + } + + n.Users = list + } + + return lo.CountBy(n.Users, func(item NotificationsGetRes) bool { + return item.NotificationStatus == 1 + }) +} + +// 未读人数 +func (n *Notifications) UnreadPeople() int { + // 如果 n.users 为空则从数据库中查询 + if len(n.Users) == 0 { + list := []NotificationsGetRes{} + if err := dao.NotificationRecipients.Ctx(context.Background()).As("nr"). + LeftJoin("sys_user as su", "nr.recipient_id = su.id"). + Fields("nr.*,su.user_nickname"). + Where("nr.notification_id", n.Id).Scan(&list); err != nil { + return 0 + } + + n.Users = list + } + return lo.CountBy(n.Users, func(item NotificationsGetRes) bool { + return item.NotificationStatus == 0 + }) +} diff --git a/internal/app/system/model/plan_daily.go b/internal/app/system/model/plan_daily.go new file mode 100644 index 0000000..3d83f2b --- /dev/null +++ b/internal/app/system/model/plan_daily.go @@ -0,0 +1,49 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-09-26 14:31:07 +// 生成路径: internal/app/system/model/plan_daily.go +// 生成人:gfast +// desc:日报 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// PlanDailyInfoRes is the golang structure for table plan_daily. +type PlanDailyInfoRes struct { + gmeta.Meta `orm:"table:plan_daily"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + Name string `orm:"name" json:"name"` // 资源名称 + Table string `orm:"table" json:"table"` // source_id的数据对应的数据表 + PlanName string `orm:"plan_name" json:"planName"` // 计划名称 + PlanId string `orm:"plan_id" json:"planId"` // 周id + WeekRealityId int `orm:"week_reality_id" json:"weekRealityId"` // 周主键ID + SourceType string `orm:"source_type" json:"sourceType"` // 资源类型 + Cnt int `orm:"cnt" json:"cnt"` // 资源数量 + DataTime string `orm:"data_time" json:"dataTime"` // 日计划时间 + Status int `orm:"status" json:"status"` // 工作状态 + CreateBy string `orm:"create_by" json:"createBy"` // + UpdateBy string `orm:"update_by" json:"updateBy"` // + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // +} + +type PlanDailyListRes struct { + Id int64 `json:"id"` + ProjectId string `json:"projectId"` + SourceId string `json:"sourceId"` + Name string `json:"name"` + SourceType string `json:"sourceType"` + Cnt int `json:"cnt"` + DataTime string `json:"dataTime"` + Status int `json:"status"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/plan_week.go b/internal/app/system/model/plan_week.go new file mode 100644 index 0000000..00604e7 --- /dev/null +++ b/internal/app/system/model/plan_week.go @@ -0,0 +1,227 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-04 17:26:59 +// 生成路径: internal/app/system/model/plan_week.go +// 生成人:gfast +// desc:周计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" + "strings" +) + +// PlanWeekNameStr word的工程进度需要展示的数据 +const PlanWeekNameStr = "zhuangdian, lizhu, zhijia, guangfuban, nibianqi, xiangbian, jidianxianlu" + +// 声明一个 progressOfWorksNum 类型 +type progressOfWorksNum int + +// 枚举 +const ( + zhuangdian = iota + lizhu + zhijia + guangfuban + nibianqi + xiangbian + jidianxianlu +) + +// NameFunc 实现 progressOfWorksNum 类型的 ---->名称 +func (p progressOfWorksNum) NameFunc() string { + return [...]string{"桩点浇筑", "立柱安装", "支架安装", "组件安装", "逆变器安装", "箱变安装", "集电线路"}[p] +} + +// UnitFunc 实现 progressOfWorksNum 类型的 ---->单位 +func (p progressOfWorksNum) UnitFunc() string { + return [...]string{"个", "根", "组", "组", "个", "个", "迷"}[p] +} + +func PlanWeekEnum(str string) (name string, unit string) { + arrCount := strings.Split(PlanWeekNameStr, ", ") + var num int + switch str { + case arrCount[0]: + num = zhuangdian + case arrCount[1]: + num = lizhu + case arrCount[2]: + num = zhijia + case arrCount[3]: + num = guangfuban + case arrCount[4]: + num = nibianqi + case arrCount[5]: + num = xiangbian + case arrCount[6]: + num = jidianxianlu + } + var pown = progressOfWorksNum(num) + name = pown.NameFunc() + unit = pown.UnitFunc() + return +} + +// PlanWeekInfoRes is the golang structure for table plan_week. +type PlanWeekInfoRes struct { + gmeta.Meta `orm:"table:plan_week"` + Id int `orm:"id,primary" json:"id"` // + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + Name string `orm:"name" json:"name"` // 资源名称 + Start string `orm:"start" json:"start"` // 开始时间 + End string `orm:"end" json:"end"` // 结束时间 + PlanName string `orm:"plan_name" json:"planName"` // 计划名称 + PlanId string `orm:"plan_id" json:"planId"` // 周id + CreateBy string `orm:"create_by" json:"createBy"` // + UpdateBy string `orm:"update_by" json:"updateBy"` // + CreateAt *gtime.Time `orm:"create_at" json:"createAt"` // + UpdateAt *gtime.Time `orm:"update_at" json:"updateAt"` // + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // + Table string `orm:"table" json:"table"` // source_id的数据对应的数据表 + Status int `orm:"status" json:"status"` // 工作状态,0:未开始,1:进行中,2:已完成 + SourceType string `orm:"source_type" json:"source_type"` + Cnt int `orm:"cnt" json:"cnt" v:"资源数量"` + StatusTwo int `orm:"statusTwo" json:"statusTwo" v:"工作状态,0:未开始,1:进行中,2:已完成"` +} + +/* + type PlanWeekListRes struct{ + Id int `json:"id"` + ProjectId string `json:"projectId"` + SourceId string `json:"sourceId"` + Name string `json:"name"` + Start string `json:"start"` + End string `json:"end"` + PlanName string `json:"planName"` + PlanId string `json:"planId"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreateAt *gtime.Time `json:"createAt"` + UpdateAt *gtime.Time `json:"updateAt"` + Table string `json:"table"` + Status int `json:"status"` + } +*/ +type PlanWeekListRes struct { + Week_plan +} +type Task struct { + SourceId string `json:"sourceId" v:"required#资源id不能为空"` + Name string `json:"name" v:"required#资源名称不能为空"` + Table string `json:"table" v:"source_id的数据对应的数据表不能为空"` + Status int `json:"status" v:"工作状态,0:未开始,1:进行中,2:已完成不能为空"` + SourceType string `json:"source_type" v:"资源类型"` + Cnt int `json:"cnt" v:"资源数量"` +} +type Week_plan struct { + ProjectId string `json:"projectId" v:"#项目id不能为空"` + Start string `json:"start" v:"#开始时间不能为空"` + End string `json:"end" v:"#结束时间不能为空"` + PlanName string `json:"planName" v:"#计划名称不能为空"` + PlanID string `json:"planId" ` + Status int `json:"status" v:"工作状态,0:未开始,1:进行中,2:已完成不能为空"` + Tasks []Task `json:"tasks" ` +} + +// ProgressOfWorksListRes 工程进度统计(代表一个周计划) +type ProgressOfWorksListRes struct { + WeekName string `json:"weekName" dc:"周计划名字"` + ProjectName string `json:"projectName" dc:"主题:项目名称"` + Logo string `json:"logo" dc:"logo"` + WeekOrMonth string `json:"weekOrMonth" dc:"副标题:周报/月报" ` + WeekOrMonthTime string `json:"weekOrMonthTime" dc:"日期(周报开始结束日期/月报最小最大日期)"` + TextOne string `json:"textOne" dc:"固定文字《中煤科工重庆设计研究院(集团)有限公司》"` + TextTwo string `json:"textTwo" dc:"固定文字《******项目EPC总承包项目部》"` + GeneratedTime string `json:"generatedTime" dc:"生成日期"` + POWRList []*ProgressOfWorksRes `json:"powrList" dc:"一、工程进度列表"` + ManpowerText string `json:"manpowerText" dc:"二、人力资源"` + MechanicalText string `json:"mechanicalText" dc:"三、机械情况"` + MIRList []*MaterialInputRes `json:"miRList" dc:"四、材料投入情况"` + Quality *QualitySituationRes `json:"quality" dc:"五、质量情况"` + Polling *FieldInspectionRes `json:"polling" dc:"六、现场巡检照片"` +} + +// ProgressOfWorksRes 工程进度统计(一个周计划有很多工程进度) +type ProgressOfWorksRes struct { + Name string `json:"name" dc:"名称"` + Unit string `json:"unit" dc:"单位"` + DesignTotal int64 `json:"design_total" dc:"设计总量"` + PlanNum int `json:"planNum" dc:"本周计划统计"` + RealityNum int `json:"realityNum" dc:"本周实际统计"` + AddUp int `json:"addUp" dc:"累积完成"` + Percentage float64 `json:"percentage" dc:"累计完成百分比"` +} + +// ManpowerRes 人力资源 +type ManpowerRes struct { + DictLabel string `json:"dictLabel"` + Num int `json:"num"` +} + +// MechanicalRes 机械情况 +type MechanicalRes struct { + Name string `json:"num"` + Num int `json:"num"` +} + +// MaterialInputRes 材料投入 +type MaterialInputRes struct { + Name string `json:"name" dc:"材料名称"` + SumNum int `json:"sumNum" dc:"总数量(材料入库的总数)"` + UseNum int `json:"useNum" dc:"当前时间段使用的数量"` + Weight int `json:"weight" dc:"单位"` +} + +// QualitySituationRes 质量情况One +type QualitySituationRes struct { + ExamineList []*QualitySituationTwoRes `json:"examineList" dc:"质量检查、检查整改"` + InspectList []*QualitySituationTwoRes `json:"inspectList" dc:"送检"` +} + +// QualitySituationTwoRes 质量情况Two +type QualitySituationTwoRes struct { + CreatedAt string `json:"createdAt" dc:"创建时间"` + QualityName string `json:"qualityName" dc:"质量检查名称"` + QualityExplain string `json:"qualityExplain" dc:"质量说明"` + QualityDocument string `json:"QualityDocument" dc:"质量检查文件"` + QualitType string `json:"qualityType" dc:"质量类型(1,送检,2质量检查,3检查整改)"` + IsQualified string `json:"isQualified" dc:"是否合格(文字描述,条件文件不为空)"` + TextStr string `json:"TextStr" dc:"纯文本(将以上字段数据组装)"` +} + +// FieldInspectionRes 现场巡检照片 +type FieldInspectionRes struct { + QualityList []*FieldInspectionResTwoRes `json:"qualityList" dc:"质量管理"` + SafetyList []*FieldInspectionResTwoRes `json:"safetyList" dc:"安全管理"` +} + +// FieldInspectionResTwoRes 现场巡检照片Two +type FieldInspectionResTwoRes struct { + PollingName string `json:"pollingName" dc:"名称"` + QualityType string `json:"qualityType" dc:"质量类型 1,送检,2质量检查,3检查整改"` + SafetyType string `json:"safetyType" dc:"安全类型 1,例会,2检查,3整改,4站例会"` + Document string `json:"document" dc:"文件内容(json格式,前端用不上)"` + //PollingImg []*comModel.UpFile `json:"pollingImg" dc:"图片"` + PollingImg string `json:"pollingImg" dc:"图片"` +} + +// DataAssemblyRequest 数据组装请求结构体 +type DataAssemblyRequest struct { + ArrCount []string `json:"arrCount" dc:"限制-字符串数组"` + ArrCountStr string `json:"arrCountStr" dc:"限制-字符串"` + PlanId string `json:"planId" dc:"周计划ID"` + ProjectId int64 `json:"projectId" dc:"项目ID"` + TypeStr string `json:"typeStr" dc:"导出类型"` + Start string `json:"start" dc:"开始时间"` + End string `json:"end" dc:"结束时间"` + WeekName string `json:"weekName" dc:"项目名称"` + PlanIds string `json:"planIds" dc:"多个项目id"` + + DesignTotal int64 `json:"designTotal" dc:"多个项目id"` +} diff --git a/internal/app/system/model/plan_week_reality.go b/internal/app/system/model/plan_week_reality.go new file mode 100644 index 0000000..26719d1 --- /dev/null +++ b/internal/app/system/model/plan_week_reality.go @@ -0,0 +1,61 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-17 17:23:07 +// 生成路径: internal/app/system/model/plan_week_reality.go +// 生成人:xyb +// desc:实际完成的周计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// PlanWeekRealityInfoRes is the golang structure for table plan_week_reality. +type PlanWeekRealityInfoRes struct { + gmeta.Meta `orm:"table:plan_week_reality"` + Id int `orm:"id,primary" json:"id"` // + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + Name string `orm:"name" json:"name"` // 资源名称 + Start string `orm:"start" json:"start"` // 开始时间 + End string `orm:"end" json:"end"` // 结束时间 + PlanName string `orm:"plan_name" json:"planName"` // 计划名称 + PlanId string `orm:"plan_id" json:"planId"` // 周id + CreateBy string `orm:"create_by" json:"createBy"` // + UpdateBy string `orm:"update_by" json:"updateBy"` // + CreateAt *gtime.Time `orm:"create_at" json:"createAt"` // + UpdateAt *gtime.Time `orm:"update_at" json:"updateAt"` // + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // + Table string `orm:"table" json:"table"` // source_id的数据对应的数据表 + Status int `orm:"status" json:"status"` // 工作状态,0:未开始,1:进行中,2:已完成 + SourceType string `orm:"source_type" json:"sourceType"` // 资源类型 + Cnt int `orm:"cnt" json:"cnt"` // 资源类型 + +} + +/* + type PlanWeekRealityListRes struct{ + Id int `json:"id"` + ProjectId string `json:"projectId"` + SourceId string `json:"sourceId"` + Name string `json:"name"` + Start string `json:"start"` + End string `json:"end"` + PlanName string `json:"planName"` + PlanId string `json:"planId"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreateAt *gtime.Time `json:"createAt"` + UpdateAt *gtime.Time `json:"updateAt"` + Table string `json:"table"` + Status int `json:"status"` + SourceType string `json:"sourceType"` + } +*/ +type PlanWeekRealityListRes struct { + Week_plan +} diff --git a/internal/app/system/model/plant.go b/internal/app/system/model/plant.go new file mode 100644 index 0000000..c4c092d --- /dev/null +++ b/internal/app/system/model/plant.go @@ -0,0 +1,92 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-04-12 10:38:43 +// 生成路径: internal/app/system/model/plant.go +// 生成人:gfast +// desc:电站信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// PlantInfoRes is the golang structure for table plant. +type PlantInfoRes struct { + gmeta.Meta `orm:"table:plant"` + Id string `orm:"id,primary" json:"id"` // 电站Id + Name string `orm:"name" json:"name"` // 电站名称 + Address string `orm:"address" json:"address"` // 详细地址 + City string `orm:"city" json:"city"` // 市 + District string `orm:"district" json:"district"` // 区 + Province string `orm:"province" json:"province"` // 省 + Latitude float64 `orm:"latitude" json:"latitude"` // 纬度 + Longitude float64 `orm:"longitude" json:"longitude"` // 经度 + Kwp float64 `orm:"kwp" json:"kwp"` // 总容量kwp + MonKwh float64 `orm:"monKwh" json:"monKwh"` // 当月发电量 + NowKw float64 `orm:"nowKw" json:"nowKw"` // 实时功率 + SumKwh float64 `orm:"sumKwh" json:"sumKwh"` // 总发电量 + TodayKwh float64 `orm:"todayKwh" json:"todayKwh"` // 当日发电量 + YearKwh float64 `orm:"yearKwh" json:"yearKwh"` // 当年发电量 + NetworkTime *gtime.Time `orm:"networkTime" json:"networkTime"` // 并网日期 + UpdateTime *gtime.Time `orm:"updateTime" json:"updateTime"` // 修改时间 + CompanyId string `orm:"companyId" json:"companyId"` // 渠道商Id + CompanyName string `orm:"companyName" json:"companyName"` // 渠道商名称 + OwnerId string `orm:"ownerId" json:"ownerId"` // 业主Id + OwnerName string `orm:"ownerName" json:"ownerName"` // 业主姓名 + ServiceProviderName string `orm:"serviceProviderName" json:"serviceProviderName"` // 安装商名称 + ServiceProviderPhone string `orm:"serviceProviderPhone" json:"serviceProviderPhone"` // 安装服务商电话 + NetworkType string `orm:"networkType" json:"networkType"` // 并网类型 1:全额上网 2:自发自用余电上网 3:自发自用无馈网 4:离网 + PowerPlantType string `orm:"powerPlantType" json:"powerPlantType"` // 电站类型 1:家庭户用 2:工商业屋顶 3:地面电站 4:扶贫电站 5:储能电站 + Status int `orm:"status" json:"status"` // 电站状态 0:未绑定 1:在线 2:停机 3:停机告警 4:运行告警 5:故障 6:离线 + PaymentType string `orm:"paymentType" json:"paymentType"` // 出资方式 + PlantContact string `orm:"plantContact" json:"plantContact"` // 电站联系人 + PlantContactPhone string `orm:"plantContactPhone" json:"plantContactPhone"` // 电站联系人电话 + PlantImg string `orm:"plantImg" json:"plantImg"` // 电站图片 + Remark string `orm:"remark" json:"remark"` // 备注 + DipAngle float64 `orm:"dipAngle" json:"dipAngle"` // 倾角度数 + OrientationAngle float64 `orm:"orientationAngle" json:"orientationAngle"` // 方位角度数 + SubassemblyNumber int `orm:"subassemblyNumber" json:"subassemblyNumber"` // 组件数量 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 +} + +type PlantListRes struct { + Id string `json:"id"` + Name string `json:"name"` + Address string `json:"address"` + City string `json:"city"` + District string `json:"district"` + Province string `json:"province"` + Latitude float64 `json:"latitude"` + Longitude float64 `json:"longitude"` + Kwp float64 `json:"kwp"` + MonKwh float64 `json:"monKwh"` + NowKw float64 `json:"nowKw"` + SumKwh float64 `json:"sumKwh"` + TodayKwh float64 `json:"todayKwh"` + YearKwh float64 `json:"yearKwh"` + NetworkTime *gtime.Time `json:"networkTime"` + UpdateTime *gtime.Time `json:"updateTime"` + CompanyId string `json:"companyId"` + CompanyName string `json:"companyName"` + OwnerId string `json:"ownerId"` + OwnerName string `json:"ownerName"` + ServiceProviderName string `json:"serviceProviderName"` + ServiceProviderPhone string `json:"serviceProviderPhone"` + NetworkType string `json:"networkType"` + PowerPlantType string `json:"powerPlantType"` + Status int `json:"status"` + PaymentType string `json:"paymentType"` + PlantContact string `json:"plantContact"` + PlantContactPhone string `json:"plantContactPhone"` + PlantImg string `json:"plantImg"` + Remark string `json:"remark"` + DipAngle float64 `json:"dipAngle"` + OrientationAngle float64 `json:"orientationAngle"` + SubassemblyNumber int `json:"subassemblyNumber"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/project_finance.go b/internal/app/system/model/project_finance.go new file mode 100644 index 0000000..19352c7 --- /dev/null +++ b/internal/app/system/model/project_finance.go @@ -0,0 +1,93 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-04-29 12:01:01 +// 生成路径: internal/app/system/model/project_finance.go +// 生成人:gfast +// desc:项目财务 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ProjectFinanceInfoRes is the golang structure for table project_finance. +type ProjectFinanceInfoRes struct { + gmeta.Meta `orm:"table:project_finance"` + Id int `orm:"id,primary" json:"id"` // 主键 + ProjectId int `orm:"project_id" json:"projectId"` // 项目ID + ContractAmount float64 `orm:"contract_amount" json:"contractAmount"` // 承包合同金额 + SubcontractAmount float64 `orm:"subcontract_amount" json:"subcontractAmount"` // 分包合同金额 + AmountReceived float64 `orm:"amount_received" json:"amountReceived"` // 已收款 + AmountPaid float64 `orm:"amount_paid" json:"amountPaid"` // 已付款 + ExpensesReimbursed float64 `orm:"expenses_reimbursed" json:"expensesReimbursed"` // 已费用报销 + EstimatedGrossProfit float64 `orm:"estimated_gross_profit" json:"estimatedGrossProfit"` // 预计毛利润 + CurrentProfit float64 `orm:"current_profit" json:"currentProfit"` // 目前利润 + CurrentRemainingFunds float64 `orm:"current_remaining_funds" json:"currentRemainingFunds"` // 目前结余资金 + ProjectedIncreaseInRemainingFunds float64 `orm:"projected_increase_in_remaining_funds" json:"projectedIncreaseInRemainingFunds"` // 至项目完成应增加的结余资金 + NetPresentValueOfProjectOperation float64 `orm:"net_present_value_of_project_operation" json:"netPresentValueOfProjectOperation"` // 项目经营净现值 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 填报时间 + CreatedBy int `orm:"created_by" json:"createdBy"` // 填报人 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 +} + +type ProjectFinanceInfoResVo struct { + gmeta.Meta `orm:"table:project_finance"` + Id int `orm:"id,primary" json:"id"` // 主键 + ProjectId int `orm:"project_id" json:"projectId"` // 项目ID + ProjectName string `json:"projectName"` // 项目名称 + ContractAmount float64 `orm:"contract_amount" json:"contractAmount"` // 承包合同金额 + SubcontractAmount float64 `orm:"subcontract_amount" json:"subcontractAmount"` // 分包合同金额 + AmountReceived float64 `orm:"amount_received" json:"amountReceived"` // 已收款 + AmountPaid float64 `orm:"amount_paid" json:"amountPaid"` // 已付款 + ExpensesReimbursed float64 `orm:"expenses_reimbursed" json:"expensesReimbursed"` // 已费用报销 + EstimatedGrossProfit float64 `orm:"estimated_gross_profit" json:"estimatedGrossProfit"` // 预计毛利润 + CurrentProfit float64 `orm:"current_profit" json:"currentProfit"` // 目前利润 + CurrentRemainingFunds float64 `orm:"current_remaining_funds" json:"currentRemainingFunds"` // 目前结余资金 + ProjectedIncreaseInRemainingFunds float64 `orm:"projected_increase_in_remaining_funds" json:"projectedIncreaseInRemainingFunds"` // 至项目完成应增加的结余资金 + NetPresentValueOfProjectOperation float64 `orm:"net_present_value_of_project_operation" json:"netPresentValueOfProjectOperation"` // 项目经营净现值 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 填报时间 + CreatedBy int `orm:"created_by" json:"createdBy"` // 填报人 + CreatedByName string `json:"createdByName"` // 填报人姓名 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 +} + +type ProjectFinanceListRes struct { + Id int `json:"id"` + ProjectId int `json:"projectId"` + ContractAmount float64 `json:"contractAmount"` + SubcontractAmount float64 `json:"subcontractAmount"` + AmountReceived float64 `json:"amountReceived"` + AmountPaid float64 `json:"amountPaid"` + ExpensesReimbursed float64 `json:"expensesReimbursed"` + EstimatedGrossProfit float64 `json:"estimatedGrossProfit"` + CurrentProfit float64 `json:"currentProfit"` + CurrentRemainingFunds float64 `json:"currentRemainingFunds"` + ProjectedIncreaseInRemainingFunds float64 `json:"projectedIncreaseInRemainingFunds"` + NetPresentValueOfProjectOperation float64 `json:"netPresentValueOfProjectOperation"` + CreatedAt *gtime.Time `json:"createdAt"` + CreatedBy int `json:"createdBy"` +} + +type ProjectFinanceListResVo struct { + Id int `json:"id" dc:"主键"` + ProjectId int `json:"projectId" dc:"项目ID"` + ProjectName string `json:"projectName"` + ContractAmount float64 `json:"contractAmount" dc:"承包合同金额"` + SubcontractAmount float64 `json:"subcontractAmount" dc:"分包合同金额"` + AmountReceived float64 `json:"amountReceived" dc:"已收款"` + AmountPaid float64 `json:"amountPaid" dc:"已付款"` + ExpensesReimbursed float64 `json:"expensesReimbursed" dc:"已费用报销"` + EstimatedGrossProfit float64 `json:"estimatedGrossProfit" dc:"预计毛利润"` + CurrentProfit float64 `json:"currentProfit" dc:"目前利润"` + CurrentRemainingFunds float64 `json:"currentRemainingFunds" dc:"目前结余资金"` + ProjectedIncreaseInRemainingFunds float64 `json:"projectedIncreaseInRemainingFunds" dc:"至项目完成应增加的结余资金"` + NetPresentValueOfProjectOperation float64 `json:"netPresentValueOfProjectOperation" dc:"项目经营净现值"` + CreatedAt *gtime.Time `json:"createdAt" dc:"填报时间"` + UpdatedAt *gtime.Time `json:"updatedAt" dc:"更新时间"` + CreatedBy int `json:"createdBy" dc:"填报人"` + CreatedByName string `json:"createdByName" dc:"填报人名称"` +} diff --git a/internal/app/system/model/project_schedule.go b/internal/app/system/model/project_schedule.go new file mode 100644 index 0000000..00f1801 --- /dev/null +++ b/internal/app/system/model/project_schedule.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-03-13 18:17:32 +// 生成路径: internal/app/system/model/project_schedule.go +// 生成人:gfast +// desc:项目排期 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ProjectScheduleInfoRes is the golang structure for table project_schedule. +type ProjectScheduleInfoRes struct { + gmeta.Meta `orm:"table:project_schedule"` + Id uint `orm:"id,primary" json:"id"` // + ParentId int `orm:"parent_id" json:"parentId"` // 设施ID + StartDate string `orm:"start_date" json:"startDate"` // 开始时间 + EndDate string `orm:"end_date" json:"endDate"` // 结束时间 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // + Name string `orm:"name" json:"name"` // 项目名 + PlaneNum string `orm:"plane_num" json:"planeNum"` // 计划持有量 +} + +type ProjectScheduleListRes struct { + Id uint `json:"id"` + ParentId int `json:"parentId"` + StartDate string `json:"startDate"` + EndDate string `json:"endDate"` + CreatedAt *gtime.Time `json:"createdAt"` + Name string `json:"name"` + PlaneNum string `json:"planeNum"` +} diff --git a/internal/app/system/model/pv_ module.go b/internal/app/system/model/pv_ module.go new file mode 100644 index 0000000..3c29085 --- /dev/null +++ b/internal/app/system/model/pv_ module.go @@ -0,0 +1,44 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-03-23 10:25:39 +// 生成路径: internal/app/system/model/pv_ module.go +// 生成人:gfast +// desc:光伏组件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// PvModuleInfoRes is the golang structure for table pv_ module. +type PvModuleInfoRes struct { + gmeta.Meta `orm:"table:pv_module"` + Id uint `orm:"id,primary" json:"id"` // + FangzhenId string `orm:"fangzhen_id" json:"fangzhenId"` // 方阵ID + SubProjectid string `orm:"sub_projectid" json:"subProjectid"` // 子项目ID + WorkId string `orm:"work_id" json:"workId"` // 工作ID + Name string `orm:"name" json:"name"` // 名字 + Status string `orm:"status" json:"status"` // 状态 0未开始 1 进行中 2 已完成 + DoneTime *gtime.Time `orm:"done_time" json:"doneTime"` // 完成时间 + Detail string `orm:"detail" json:"detail"` // 坐标详细信息 + DeviceID string `orm:"device_id" json:"deviceID"` // 设备ID + DivertorName string `json:"divertorName" orm:"equipmentName"` +} + +type PvModuleListRes struct { + gmeta.Meta `orm:"table:pv_module"` + Id uint `json:"id"` + FangzhenId string `json:"fangzhenId"` + SubProjectid string `json:"subProjectid"` + WorkId string `json:"workId"` + Name string `json:"name"` + Status string `json:"status"` + DoneTime *gtime.Time `json:"doneTime"` + Detail string `json:"detail"` + DeviceID string `json:"deviceID" orm:"device_id"` + DivertorName string `json:"divertorName" orm:"equipmentName"` +} diff --git a/internal/app/system/model/qianqi_bubantu.go b/internal/app/system/model/qianqi_bubantu.go new file mode 100644 index 0000000..1be7ba9 --- /dev/null +++ b/internal/app/system/model/qianqi_bubantu.go @@ -0,0 +1,43 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-31 11:44:41 +// 生成路径: internal/app/system/model/qianqi_bubantu.go +// 生成人:gfast +// desc:布板图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiBubantuInfoRes is the golang structure for table qianqi_bubantu. +type QianqiBubantuInfoRes struct { + gmeta.Meta `orm:"table:qianqi_bubantu"` + Id int `orm:"id,primary" json:"id"` // 序号 + GuangfubanId int `orm:"guangfuban_id" json:"guangfubanId"` // 光伏板id + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 名称 + SourceId string `orm:"source_id" json:"sourceId"` // 资源ID + SourcePath string `orm:"source_path" json:"sourcePath"` // 资源路径 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + SourceType string `orm:"source_type" json:"source_type"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type QianqiBubantuListRes struct { + Id int `json:"id"` + ProjectId string `json:"projectId"` + Name string `json:"name"` + SourceId string `json:"sourceId"` + SourcePath string `json:"sourcePath"` + CreatedAt *gtime.Time `json:"createdAt"` + SourceType string `json:"source_type"` + GuangfubanId int `json:"guangfubanId"` +} diff --git a/internal/app/system/model/qianqi_camera.go b/internal/app/system/model/qianqi_camera.go new file mode 100644 index 0000000..bd389cd --- /dev/null +++ b/internal/app/system/model/qianqi_camera.go @@ -0,0 +1,61 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-09-30 22:37:34 +// 生成路径: internal/app/system/model/qianqi_camera.go +// 生成人:gfast +// desc:摄像头 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiCameraInfoRes is the golang structure for table qianqi_camera. +type QianqiCameraInfoRes struct { + gmeta.Meta `orm:"table:qianqi_camera"` + Id int64 `orm:"id,primary" json:"id"` // + CameraName string `orm:"camera_name" json:"cameraName"` // 摄像头名称 + CameraCode string `orm:"camera_code" json:"cameraCode"` // 摄像头编码 + Detail string `orm:"detail" json:"detail"` // 摄像头坐标信息 + Degree string `orm:"degree" json:"degree"` // 视频融合 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Status int64 `orm:"status" json:"status"` // 在线情况(1、在线,0、离线),字典on_line_status + Poster string `orm:"poster" json:"poster"` // 封面图 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreateddAt *gtime.Time `orm:"createdd_at" json:"createddAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + SourceType string `orm:"source_type" json:"sourceType"` // + Serial string `orm:"serial" json:"serial"` // 国标id + Code string `orm:"code" json:"code"` // 通道号 + Flv string `orm:"flv" json:"flv"` // flv地址 + Hls string `orm:"hls" json:"hls"` // hls地址 + Share string `orm:"share" json:"share"` // 分享地址 + Rtc string `orm:"rtc" json:"rtc"` // webrtc地址 +} + +type QianqiCameraListRes struct { + Id int64 `json:"id"` + CameraName string `json:"cameraName"` + CameraCode string `json:"cameraCode"` + Detail string `json:"detail"` + Degree string `json:"degree"` + ProjectId string `json:"projectId"` + Status int64 `json:"status"` + Poster string `json:"poster"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreateddAt *gtime.Time `json:"createddAt"` + SourceType string `json:"source_type"` + Serial string `json:"serial"` + Code string `json:"code"` + Flv string `json:"flv"` + Hls string `json:"hls"` + Share string `json:"share"` + Rtc string `json:"rtc"` +} diff --git a/internal/app/system/model/qianqi_cameras.go b/internal/app/system/model/qianqi_cameras.go new file mode 100644 index 0000000..19bab9e --- /dev/null +++ b/internal/app/system/model/qianqi_cameras.go @@ -0,0 +1,46 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-31 09:48:11 +// 生成路径: internal/app/system/model/qianqi_cameras.go +// 生成人:gfast +// desc:所有摄像头列 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiCamerasInfoRes is the golang structure for table qianqi_cameras. +type QianqiCamerasInfoRes struct { + gmeta.Meta `orm:"table:qianqi_cameras"` + Id int `orm:"id,primary" json:"id"` // 序号 + CameraName string `orm:"camera_name" json:"cameraName"` // 摄像头名称 + CameraCode string `orm:"camera_code" json:"cameraCode"` // 摄像头编码 + Detail string `orm:"detail" json:"detail"` // 摄像头坐标信息 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Status int `orm:"status" json:"status"` // 在线情况 + Poster string `orm:"poster" json:"poster"` // 封面图 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type QianqiCamerasListRes struct { + Id int `json:"id"` + CameraName string `json:"cameraName"` + CameraCode string `json:"cameraCode"` + Detail string `json:"detail"` + ProjectId string `json:"projectId"` + Status int `json:"status"` + Poster string `json:"poster"` + CreatedAt *gtime.Time `json:"createdAt"` + Name string `json:"name"` //CameraName + Code string `json:"code"` //CameraCode + SourceType string `json:"source_type"` +} diff --git a/internal/app/system/model/qianqi_dixing.go b/internal/app/system/model/qianqi_dixing.go new file mode 100644 index 0000000..9692f7e --- /dev/null +++ b/internal/app/system/model/qianqi_dixing.go @@ -0,0 +1,41 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-31 11:44:56 +// 生成路径: internal/app/system/model/qianqi_dixing.go +// 生成人:gfast +// desc:地形 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiDixingInfoRes is the golang structure for table qianqi_dixing. +type QianqiDixingInfoRes struct { + gmeta.Meta `orm:"table:qianqi_dixing"` + Id int `orm:"id,primary" json:"id"` // 序号 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 名称 + SourceId string `orm:"source_id" json:"sourceId"` // 资源ID + SourcePath string `orm:"source_path" json:"sourcePath"` // 资源路径 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + SourceType string `orm:"source_type" json:"source_type"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type QianqiDixingListRes struct { + Id int `json:"id"` + ProjectId string `json:"projectId"` + Name string `json:"name"` + SourceId string `json:"sourceId"` + SourcePath string `json:"sourcePath"` + CreatedAt *gtime.Time `json:"createdAt"` + SourceType string `json:"source_type"` +} diff --git a/internal/app/system/model/qianqi_fangzhen.go b/internal/app/system/model/qianqi_fangzhen.go new file mode 100644 index 0000000..12b2a58 --- /dev/null +++ b/internal/app/system/model/qianqi_fangzhen.go @@ -0,0 +1,45 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-31 11:20:54 +// 生成路径: internal/app/system/model/qianqi_fangzhen.go +// 生成人:gfast +// desc:方阵 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiFangzhenInfoRes is the golang structure for table qianqi_fangzhen. +type QianqiFangzhenInfoRes struct { + gmeta.Meta `orm:"table:qianqi_fangzhen"` + Id int `orm:"id,primary" json:"id"` // 序号 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 名称 + SourceId string `orm:"source_id" json:"sourceId"` // 资源 + SourcePath string `orm:"source_path" json:"sourcePath"` // 资源路径 + XiangbianId string `orm:"xiangbian_id" json:"xiangbianId"` // 箱变id + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + Detail string `orm:"detail" json:"detail"` // 坐标信息 + SourceType string `orm:"source_type" json:"sourceType"` // 坐标信息 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type QianqiFangzhenListRes struct { + Id int `json:"id"` + ProjectId string `json:"projectId"` + Name string `json:"name"` + SourceId string `json:"sourceId"` + SourcePath string `json:"sourcePath"` + XiangbianId string `json:"xiangbianId"` + CreatedAt *gtime.Time `json:"createdAt"` + SourceType string `json:"source_type"` + Detail string `json:"detail"` +} diff --git a/internal/app/system/model/qianqi_guangfuban.go b/internal/app/system/model/qianqi_guangfuban.go new file mode 100644 index 0000000..597b9c8 --- /dev/null +++ b/internal/app/system/model/qianqi_guangfuban.go @@ -0,0 +1,46 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-31 11:31:49 +// 生成路径: internal/app/system/model/qianqi_guangfuban.go +// 生成人:gfast +// desc:光伏板模型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiGuangfubanInfoRes is the golang structure for table qianqi_guangfuban. +type QianqiGuangfubanInfoRes struct { + gmeta.Meta `orm:"table:qianqi_guangfuban"` + Id int `orm:"id,primary" json:"id"` // 序号 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 倾斜模型 + SourcePath string `orm:"source_path" json:"sourcePath"` // 资源路径 + Detail string `orm:"detail" json:"detail"` // 坐标信息等 + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + SourceType string `orm:"source_type" json:"source_type"` // 更新人 + Zuchuan_path string `orm:"zuchuan_path" json:"zuchuan_path"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type QianqiGuangfubanListRes struct { + Id int `json:"id"` + ProjectId string `json:"projectId"` + Name string `json:"name"` + SourcePath string `json:"sourcePath"` + Detail string `json:"detail"` + SourceId string `json:"sourceId"` + CreatedAt *gtime.Time `json:"createdAt"` + SourceType string `json:"source_type"` + Zuchuan_path string `json:"zuchuan_path"` + Src_point string `json:"src_point"` +} diff --git a/internal/app/system/model/qianqi_guangfuban_ids.go b/internal/app/system/model/qianqi_guangfuban_ids.go new file mode 100644 index 0000000..23d0f56 --- /dev/null +++ b/internal/app/system/model/qianqi_guangfuban_ids.go @@ -0,0 +1,60 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-05 16:00:23 +// 生成路径: internal/app/system/model/qianqi_guangfuban_ids.go +// 生成人:gfast +// desc:光伏板模型的id +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiGuangfubanIdsInfoRes is the golang structure for table qianqi_guangfuban_ids. +type QianqiGuangfubanIdsInfoRes struct { + gmeta.Meta `orm:"table:qianqi_guangfuban_ids"` + Id int `orm:"id,primary" json:"id"` // + Name string `orm:"name" json:"name"` // 名称 + DevId string `orm:"dev_id" json:"devId"` // 光伏板模型的id + DevType int `orm:"dev_type" json:"devType"` // 光伏板、支架类型 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + SourceType string `orm:"source_type" json:"source_type"` // + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Sphere string `orm:"sphere" json:"sphere"` // 项目id + Range string `orm:"range" json:"range"` + FzId int `orm:"fzId" json:"fzId"` +} + +type QianqiGuangfubanIdsListRes struct { + Id int `json:"id"` + Name string `json:"name"` + DevId string `json:"devId"` + DevType int `json:"devType"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` + SourceType string `json:"source_type"` + SourceId string `json:"sourceId"` + ProjectId string `json:"projectId"` + Sphere string `json:"sphere"` + Range string `json:"range"` +} +type Nibianqi struct { + NibianqiName string `json:"name"` + List []*QianqiGuangfubanIdsListRes `json:"list"` +} +type Element struct { + Id string `json:"id"` + Name string `json:"name"` + Sphere []float64 `json:"sphere"` + Type string `json:"type"` +} diff --git a/internal/app/system/model/qianqi_guangfuban_ids_lizhu.go b/internal/app/system/model/qianqi_guangfuban_ids_lizhu.go new file mode 100644 index 0000000..d2640d7 --- /dev/null +++ b/internal/app/system/model/qianqi_guangfuban_ids_lizhu.go @@ -0,0 +1,45 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-09-05 12:10:40 +// 生成路径: internal/app/system/model/qianqi_guangfuban_ids_lizhu.go +// 生成人:gfast +// desc:光伏板立柱 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiGuangfubanIdsLizhuInfoRes is the golang structure for table qianqi_guangfuban_ids_lizhu. +type QianqiGuangfubanIdsLizhuInfoRes struct { + gmeta.Meta `orm:"table:qianqi_guangfuban_ids_lizhu"` + Id int `orm:"id,primary" json:"id"` // + Name string `orm:"name" json:"name"` // 名称 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + SourceType string `orm:"source_type" json:"sourceType"` // + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Status int `orm:"status" json:"status"` // 状态:0:未完成;1:计划中;2:已完成 + Detail string `orm:"detail" json:"detail"` // +} + +type QianqiGuangfubanIdsLizhuListRes struct { + Id int `json:"id"` + Name string `json:"name"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` + SourceType string `json:"source_type"` + SourceId string `json:"sourceId"` + ProjectId string `json:"projectId"` + Status int `json:"status"` + Detail string `json:"detail"` +} diff --git a/internal/app/system/model/qianqi_guangfuban_ids_zhijia.go b/internal/app/system/model/qianqi_guangfuban_ids_zhijia.go new file mode 100644 index 0000000..35a33c9 --- /dev/null +++ b/internal/app/system/model/qianqi_guangfuban_ids_zhijia.go @@ -0,0 +1,45 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-09-05 12:10:51 +// 生成路径: internal/app/system/model/qianqi_guangfuban_ids_zhijia.go +// 生成人:gfast +// desc:光伏板支架 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiGuangfubanIdsZhijiaInfoRes is the golang structure for table qianqi_guangfuban_ids_zhijia. +type QianqiGuangfubanIdsZhijiaInfoRes struct { + gmeta.Meta `orm:"table:qianqi_guangfuban_ids_zhijia"` + Id int `orm:"id,primary" json:"id"` // + Name string `orm:"name" json:"name"` // 名称 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + SourceType string `orm:"source_type" json:"sourceType"` // + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Status int `orm:"status" json:"status"` // 状态:0:未完成;1:计划中;2:已完成 + Detail string `orm:"detail" json:"detail"` // +} + +type QianqiGuangfubanIdsZhijiaListRes struct { + Id int `json:"id"` + Name string `json:"name"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` + SourceType string `json:"source_type"` + SourceId string `json:"sourceId"` + ProjectId string `json:"projectId"` + Status int `json:"status"` + Detail string `orm:"detail" json:"detail"` +} diff --git a/internal/app/system/model/qianqi_guangfuban_ids_zhuangdian.go b/internal/app/system/model/qianqi_guangfuban_ids_zhuangdian.go new file mode 100644 index 0000000..77d4537 --- /dev/null +++ b/internal/app/system/model/qianqi_guangfuban_ids_zhuangdian.go @@ -0,0 +1,45 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-09-05 12:07:41 +// 生成路径: internal/app/system/model/qianqi_guangfuban_ids_zhuangdian.go +// 生成人:gfast +// desc:光伏板桩点 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiGuangfubanIdsZhuangdianInfoRes is the golang structure for table qianqi_guangfuban_ids_zhuangdian. +type QianqiGuangfubanIdsZhuangdianInfoRes struct { + gmeta.Meta `orm:"table:qianqi_guangfuban_ids_zhuangdian"` + Id int `orm:"id,primary" json:"id"` // + Name string `orm:"name" json:"name"` // 名称 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + SourceType string `orm:"source_type" json:"sourceType"` // + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Status int `orm:"status" json:"status"` // 状态:0:未完成;1:计划中;2:已完成 + Detail string `orm:"detail" json:"detail"` +} + +type QianqiGuangfubanIdsZhuangdianListRes struct { + Id int `json:"id"` + Name string `json:"name"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` + SourceType string `json:"source_type"` + SourceId string `json:"sourceId"` + ProjectId int64 `json:"projectId"` + Status int `json:"status"` + Detail string `json:"detail"` +} diff --git a/internal/app/system/model/qianqi_guangfuban_zuchuan.go b/internal/app/system/model/qianqi_guangfuban_zuchuan.go new file mode 100644 index 0000000..0040971 --- /dev/null +++ b/internal/app/system/model/qianqi_guangfuban_zuchuan.go @@ -0,0 +1,51 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-17 10:37:21 +// 生成路径: internal/app/system/model/qianqi_guangfuban_zuchuan.go +// 生成人:xyb +// desc:组串 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiGuangfubanZuchuanInfoRes is the golang structure for table qianqi_guangfuban_zuchuan. +type QianqiGuangfubanZuchuanInfoRes struct { + gmeta.Meta `orm:"table:qianqi_guangfuban_zuchuan"` + Id int `orm:"id,primary" json:"id"` // + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + SourceType string `orm:"source_type" json:"sourceType"` // + SourceId string `orm:"source_id" json:"sourceId"` // 资源id,为project_id拼接上组串编号 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + ZuchuanId string `orm:"zuchuan_id" json:"zuchuanId"` // 组串编号 + GuangfubanId string `orm:"guangfuban_id" json:"guangfubanId"` // 光伏板模型的id + LinkedGuangfubanId *LinkedQianqiGuangfubanZuchuanQianqiGuangfuban `orm:"with:source_id=guangfuban_id" json:"linkedGuangfubanId"` +} + +type LinkedQianqiGuangfubanZuchuanQianqiGuangfuban struct { + gmeta.Meta `orm:"table:qianqi_guangfuban"` + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + Name string `orm:"name" json:"name"` // 倾斜模型 +} + +type QianqiGuangfubanZuchuanListRes struct { + Id int `json:"id"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` + SourceType string `json:"sourceType"` + SourceId string `json:"sourceId"` + ProjectId string `json:"projectId"` + ZuchuanId string `json:"zuchuanId"` + GuangfubanId string `json:"guangfubanId"` + LinkedGuangfubanId *LinkedQianqiGuangfubanZuchuanQianqiGuangfuban `orm:"with:source_id=guangfuban_id" json:"linkedGuangfubanId"` +} diff --git a/internal/app/system/model/qianqi_jidianxianlu.go b/internal/app/system/model/qianqi_jidianxianlu.go new file mode 100644 index 0000000..da5a9d1 --- /dev/null +++ b/internal/app/system/model/qianqi_jidianxianlu.go @@ -0,0 +1,45 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-04 16:29:44 +// 生成路径: internal/app/system/model/qianqi_jidianxianlu.go +// 生成人:gfast +// desc:集电线路 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiJidianxianluInfoRes is the golang structure for table qianqi_jidianxianlu. +type QianqiJidianxianluInfoRes struct { + gmeta.Meta `orm:"table:qianqi_jidianxianlu"` + Id int `orm:"id,primary" json:"id"` // 序号 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 线路名称 + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + SourcePath string `orm:"source_path" json:"sourcePath"` // 资源路径 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + SourceType string `orm:"source_type" json:"sourceType"` // 资源类型 + Detail string `orm:"detail" json:"detail"` // 资源类型 +} + +type QianqiJidianxianluListRes struct { + Id int `json:"id"` + ProjectId string `json:"projectId"` + Name string `json:"name"` + SourceId string `json:"sourceId"` + SourcePath string `json:"sourcePath"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` + SourceType string `json:"source_type"` + Detail string `json:"detail"` +} diff --git a/internal/app/system/model/qianqi_moxing.go b/internal/app/system/model/qianqi_moxing.go new file mode 100644 index 0000000..452c7a9 --- /dev/null +++ b/internal/app/system/model/qianqi_moxing.go @@ -0,0 +1,42 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-31 11:09:26 +// 生成路径: internal/app/system/model/qianqi_moxing.go +// 生成人:gfast +// desc:倾斜模型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiMoxingInfoRes is the golang structure for table qianqi_moxing. +type QianqiMoxingInfoRes struct { + gmeta.Meta `orm:"table:qianqi_moxing"` + Id int `orm:"id,primary" json:"id"` // 序号 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 倾斜模型 + SourcePath string `orm:"source_path" json:"sourcePath"` // 资源路径 + Detail string `orm:"detail" json:"detail"` // 坐标信息等 + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type QianqiMoxingListRes struct { + Id int `json:"id"` + ProjectId string `json:"projectId"` + Name string `json:"name"` + SourcePath string `json:"sourcePath"` + Detail string `json:"detail"` + SourceId string `json:"sourceId"` + CreatedAt *gtime.Time `json:"createdAt"` + SourceType string `json:"source_type"` +} diff --git a/internal/app/system/model/qianqi_nibianqi.go b/internal/app/system/model/qianqi_nibianqi.go new file mode 100644 index 0000000..6086baf --- /dev/null +++ b/internal/app/system/model/qianqi_nibianqi.go @@ -0,0 +1,46 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-31 09:40:17 +// 生成路径: internal/app/system/model/qianqi_nibianqi.go +// 生成人:gfast +// desc:逆变器 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiNibianqiInfoRes is the golang structure for table qianqi_nibianqi. +type QianqiNibianqiInfoRes struct { + gmeta.Meta `orm:"table:qianqi_nibianqi"` + Id int `orm:"id,primary" json:"id"` // 序号 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 名称 + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + ModelId string `orm:"model_id" json:"modelId"` // 模型id + Detail string `orm:"detail" json:"detail"` // 地图上的参数信息 + Xiangbianid string `orm:"xiangbianid" json:"xiangbianid"` // 箱变id + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + SourceType string `orm:"source_type" json:"source_type"` + CreateAt *gtime.Time `orm:"create_at" json:"createAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type QianqiNibianqiListRes struct { + Id int `json:"id"` + ProjectId string `json:"projectId"` + Name string `json:"name"` + SourceId string `json:"sourceId"` + ModelId string `json:"modelId"` + Detail string `json:"detail"` + Xiangbianid string `json:"xiangbianid"` + CreateAt *gtime.Time `json:"createAt"` + SourceType string `json:"source_type"` + Url string `json:"url"` +} diff --git a/internal/app/system/model/qianqi_pingchang.go b/internal/app/system/model/qianqi_pingchang.go new file mode 100644 index 0000000..16de3ad --- /dev/null +++ b/internal/app/system/model/qianqi_pingchang.go @@ -0,0 +1,59 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-08 10:08:24 +// 生成路径: internal/app/system/model/qianqi_pingchang.go +// 生成人:gfast +// desc:平场数据 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiPingchangInfoRes is the golang structure for table qianqi_pingchang. +type QianqiPingchangInfoRes struct { + gmeta.Meta `orm:"table:qianqi_pingchang"` + Id uint64 `orm:"id,primary" json:"id"` // + CreateAt *gtime.Time `orm:"create_at" json:"createAt"` // + UpdateAt *gtime.Time `orm:"update_at" json:"updateAt"` // + DeleteAt *gtime.Time `orm:"delete_at" json:"deleteAt"` // + ProjectId string `orm:"project_id" json:"projectId"` // '项目id' + PcId string `orm:"pc_id" json:"pcId"` // '平场id' + PcName string `orm:"pc_name" json:"pcName"` // '平场范围名称' + GridWidth float64 `orm:"grid_width" json:"gridWidth"` // '采点精度' + Progress float64 `orm:"progress" json:"progress"` // '计算进度' + Range string `orm:"range" json:"range"` // '平场范围' + Points string `orm:"points" json:"points"` // '平滑处理前的高程点' + SmoothPoints string `orm:"smooth_points" json:"smoothPoints"` // '平滑处理后的高程点' + Shp string `orm:"shp" json:"shp"` // '经过计算生成的shp文件' + Area float64 `orm:"area" json:"area"` // '面积' + Cut float64 `orm:"cut" json:"cut"` // '挖方' + Fill float64 `orm:"fill" json:"fill"` // '填方' + Total float64 `orm:"total" json:"total"` // '挖填平衡值' + Imported int `orm:"imported" json:"imported"` // '是否为导入的值' +} + +type QianqiPingchangListRes struct { + Id uint64 `json:"id"` + CreateAt *gtime.Time `json:"createAt"` + UpdateAt *gtime.Time `json:"updateAt"` + DeleteAt *gtime.Time `json:"deleteAt"` + ProjectId string `json:"projectId"` + PcId string `json:"pcId"` + PcName string `json:"pcName"` + GridWidth float64 `json:"gridWidth"` + Progress float64 `json:"progress"` + Range string `json:"range"` + Points string `json:"points"` + SmoothPoints string `json:"smoothPoints"` + Shp string `json:"shp"` + Area float64 `json:"area"` + Cut float64 `json:"cut"` + Fill float64 `json:"fill"` + Total float64 `json:"total"` + Imported int `json:"imported"` +} diff --git a/internal/app/system/model/qianqi_redline.go b/internal/app/system/model/qianqi_redline.go new file mode 100644 index 0000000..c619672 --- /dev/null +++ b/internal/app/system/model/qianqi_redline.go @@ -0,0 +1,41 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-31 11:45:12 +// 生成路径: internal/app/system/model/qianqi_redline.go +// 生成人:gfast +// desc:红线 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiRedlineInfoRes is the golang structure for table qianqi_redline. +type QianqiRedlineInfoRes struct { + gmeta.Meta `orm:"table:qianqi_redline"` + Id int `orm:"id,primary" json:"id"` // 序号 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 名称 + SourceId string `orm:"source_id" json:"sourceId"` // 资源ID + SourcePath string `orm:"source_path" json:"sourcePath"` // 资源路径 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + SourceType string `orm:"source_type" json:"source_type"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type QianqiRedlineListRes struct { + Id int `json:"id"` + ProjectId string `json:"projectId"` + Name string `json:"name"` + SourceId string `json:"sourceId"` + SourcePath string `json:"sourcePath"` + CreatedAt *gtime.Time `json:"createdAt"` + SourceType string `json:"source_type"` +} diff --git a/internal/app/system/model/qianqi_redline_tudiliuzhuan.go b/internal/app/system/model/qianqi_redline_tudiliuzhuan.go new file mode 100644 index 0000000..d4c4d28 --- /dev/null +++ b/internal/app/system/model/qianqi_redline_tudiliuzhuan.go @@ -0,0 +1,45 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-04 11:47:15 +// 生成路径: internal/app/system/model/qianqi_redline_tudiliuzhuan.go +// 生成人:gfast +// desc:土地流转 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiRedlineTudiliuzhuanInfoRes is the golang structure for table qianqi_redline_tudiliuzhuan. +type QianqiRedlineTudiliuzhuanInfoRes struct { + gmeta.Meta `orm:"table:qianqi_redline_tudiliuzhuan"` + Id int `orm:"id,primary" json:"id"` // 序号 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 红线名称 + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + SourcePath string `orm:"source_path" json:"sourcePath"` // 资源路径 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + SourceType string `orm:"source_type" json:"source_type"` // + //Detail string `orm:"detail" json:"detail"` // +} + +type QianqiRedlineTudiliuzhuanListRes struct { + Id int `json:"id"` + ProjectId string `json:"projectId"` + Name string `json:"name"` + SourceId string `json:"sourceId"` + SourcePath string `json:"sourcePath"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` + SourceType string `json:"source_type"` + //Detail string `json:"detail"` +} diff --git a/internal/app/system/model/qianqi_road.go b/internal/app/system/model/qianqi_road.go new file mode 100644 index 0000000..39d4db8 --- /dev/null +++ b/internal/app/system/model/qianqi_road.go @@ -0,0 +1,45 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-04 16:24:38 +// 生成路径: internal/app/system/model/qianqi_road.go +// 生成人:gfast +// desc:道路 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiRoadInfoRes is the golang structure for table qianqi_road. +type QianqiRoadInfoRes struct { + gmeta.Meta `orm:"table:qianqi_road"` + Id int `orm:"id,primary" json:"id"` // 序号 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 名称 + SourceId string `orm:"source_id" json:"sourceId"` // 资源id + SourcePath string `orm:"source_path" json:"sourcePath"` // 资源路径 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + SourceType string `orm:"source_type" json:"sourceType"` // 资源类型 + Detail string `orm:"detail" json:"detail"` // 资源类型 +} + +type QianqiRoadListRes struct { + Id int `json:"id"` + ProjectId string `json:"projectId"` + Name string `json:"name"` + SourceId string `json:"sourceId"` + SourcePath string `json:"sourcePath"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` + SourceType string `json:"source_type"` + Detail string `json:"detail"` +} diff --git a/internal/app/system/model/qianqi_xiangbian.go b/internal/app/system/model/qianqi_xiangbian.go new file mode 100644 index 0000000..35599df --- /dev/null +++ b/internal/app/system/model/qianqi_xiangbian.go @@ -0,0 +1,45 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-31 09:52:13 +// 生成路径: internal/app/system/model/qianqi_xiangbian.go +// 生成人:gfast +// desc:箱变 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// QianqiXiangbianInfoRes is the golang structure for table qianqi_xiangbian. +type QianqiXiangbianInfoRes struct { + gmeta.Meta `orm:"table:qianqi_xiangbian"` + Id int `orm:"id,primary" json:"id"` // 序号 + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 名称 + SourceId string `orm:"source_id" json:"sourceId"` // 资源ID + ModelId string `orm:"model_id" json:"modelId"` // 模型ID + Detail string `orm:"detail" json:"detail"` // 详情 + SourceType string `orm:"source_type" json:"source_type"` + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + Url string `orm:"url" json:"url"` // 更新人 + CreateAt *gtime.Time `orm:"create_at" json:"createAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type QianqiXiangbianListRes struct { + Id int `json:"id"` + ProjectId string `json:"projectId"` + Name string `json:"name"` + SourceId string `json:"sourceId"` + ModelId string `json:"modelId"` + Detail string `json:"detail"` + CreateAt *gtime.Time `json:"createAt"` + Url string `json:"url"` + SourceType string `json:"source_type"` +} diff --git a/internal/app/system/model/reminders.go b/internal/app/system/model/reminders.go new file mode 100644 index 0000000..89a95af --- /dev/null +++ b/internal/app/system/model/reminders.go @@ -0,0 +1,45 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-05-14 14:55:52 +// 生成路径: internal/app/system/model/reminders.go +// 生成人:gfast +// desc:App-消息-提醒 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// RemindersInfoRes is the golang structure for table reminders. +type RemindersInfoRes struct { + gmeta.Meta `orm:"table:reminders"` + Id uint `orm:"id,primary" json:"id"` // + UserId int `orm:"user_id" json:"userId"` // 消息接收者ID + ReminderType int `orm:"reminder_type" json:"reminderType"` // 提醒类型 0 安全整改 | 1 质量整改 | 2 AI | 3 打卡 + Title string `orm:"title" json:"title"` // 标题 + ViolationType string `orm:"violation_type" json:"violationType"` // 违章类型 + ProjectId int `orm:"project_id" json:"projectId"` // 项目ID + ProjectName string `orm:"project_name"` + Status int `orm:"status" json:"status" dc:"0 提醒 | 1 整改 | 2 复检"` // 状态 0 未读 | 1 已读 + OrderId int `orm:"order_id" json:"orderId" dc:"需要跳转的具体工单ID"` // 对应管理的OrderID + UserName string `json:"userName" orm:"user_nickname" dc:"创建人的名称"` // 创建人的名称 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // +} + +type RemindersListRes struct { + Id uint `json:"id"` + UserId int `json:"userId"` + ReminderType int `json:"reminderType"` + Title string `json:"title"` + ViolationType string `json:"violationType"` + ProjectId int `json:"projectId"` + ProjectName string `orm:"project_name"` + Status int `orm:"status" json:"status" dc:"0 提醒 | 1 整改 | 2 复检"` // 状态 0 未读 | 1 已读 + OrderId int `orm:"order_id" json:"orderId" dc:"需要跳转的具体工单ID"` // 对应管理的OrderID + UserName string `json:"userName" orm:"user_nickname" dc:"创建人的名称"` // 创建人的名称 + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/sub_project.go b/internal/app/system/model/sub_project.go new file mode 100644 index 0000000..d1d507f --- /dev/null +++ b/internal/app/system/model/sub_project.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-03-21 18:53:15 +// 生成路径: internal/app/system/model/sub_project.go +// 生成人:gfast +// desc:子项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SubProjectInfoRes is the golang structure for table sub_project. +type SubProjectInfoRes struct { + gmeta.Meta `orm:"table:sub_project"` + Id uint `orm:"id,primary" json:"id"` // 主键ID + ProjectId int `orm:"project_id" json:"projectId"` // 项目ID + ProjectName string `orm:"project_name" json:"projectName"` // 子项目名 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // +} + +type SubProjectListRes struct { + Id uint `json:"id"` + ProjectId int `json:"projectId"` + ProjectName string `json:"projectName"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/sys_auth_rule.go b/internal/app/system/model/sys_auth_rule.go new file mode 100644 index 0000000..8ff60de --- /dev/null +++ b/internal/app/system/model/sys_auth_rule.go @@ -0,0 +1,59 @@ +/* +* @desc:菜单model +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/11 14:53 + */ + +package model + +type SysAuthRuleInfoRes struct { + Id uint `orm:"id,primary" json:"id"` // + Pid uint `orm:"pid" json:"pid"` // 父ID + Name string `orm:"name,unique" json:"name"` // 规则名称 + Title string `orm:"title" json:"title"` // 规则名称 + Icon string `orm:"icon" json:"icon"` // 图标 + Condition string `orm:"condition" json:"condition"` // 条件 + Remark string `orm:"remark" json:"remark"` // 备注 + MenuType uint `orm:"menu_type" json:"menuType"` // 类型 0目录 1菜单 2按钮 + Weigh int `orm:"weigh" json:"weigh"` // 权重 + IsHide uint `orm:"is_hide" json:"isHide"` // 显示状态 + IsCached uint `orm:"is_cached" json:"isCached"` // 是否缓存 + IsAffix uint `orm:"is_affix" json:"isAffix"` //是否固定 + Path string `orm:"path" json:"path"` // 路由地址 + Redirect string `orm:"redirect" json:"redirect"` // 跳转路由 + Component string `orm:"component" json:"component"` // 组件路径 + IsIframe uint `orm:"is_iframe" json:"isIframe"` // 是否iframe + IsLink uint `orm:"is_link" json:"isLink"` // 是否外链 1是 0否 + LinkUrl string `orm:"link_url" json:"linkUrl"` //链接地址 +} + +// SysAuthRuleTreeRes 菜单树形结构 +type SysAuthRuleTreeRes struct { + *SysAuthRuleInfoRes + Children []*SysAuthRuleTreeRes `json:"children"` +} + +type UserMenu struct { + Id uint `json:"id"` + Pid uint `json:"pid"` + Name string `json:"name"` + Component string `json:"component"` + Path string `json:"path"` + *MenuMeta `json:"meta"` +} + +type UserMenus struct { + *UserMenu `json:""` + Children []*UserMenus `json:"children"` +} + +type MenuMeta struct { + Icon string `json:"icon"` + Title string `json:"title"` + IsLink string `json:"isLink"` + IsHide bool `json:"isHide"` + IsKeepAlive bool `json:"isKeepAlive"` + IsAffix bool `json:"isAffix"` + IsIframe bool `json:"isIframe"` +} diff --git a/internal/app/system/model/sys_dept.go b/internal/app/system/model/sys_dept.go new file mode 100644 index 0000000..d7f5226 --- /dev/null +++ b/internal/app/system/model/sys_dept.go @@ -0,0 +1,15 @@ +/* +* @desc:部门model +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/4/11 9:07 + */ + +package model + +import "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + +type SysDeptTreeRes struct { + *entity.SysDept + Children []*SysDeptTreeRes `json:"children"` +} diff --git a/internal/app/system/model/sys_file.go b/internal/app/system/model/sys_file.go new file mode 100644 index 0000000..420ae30 --- /dev/null +++ b/internal/app/system/model/sys_file.go @@ -0,0 +1,47 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-29 15:32:09 +// 生成路径: internal/app/system/model/sys_file.go +// 生成人:gfast +// desc:文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysFileInfoRes is the golang structure for table sys_file. +type SysFileInfoRes struct { + gmeta.Meta `orm:"table:sys_file"` + FileId int `orm:"file_id,primary" json:"fileId"` // 文件id + ParentId int `orm:"parent_id" json:"parentId"` // 父文件id + Ancestors string `orm:"ancestors" json:"ancestors"` // 祖级列表 + FileName string `orm:"file_name" json:"fileName"` // 文件名称 + OrderNum int `orm:"order_num" json:"orderNum"` // 显示顺序 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + FileTypeId int `orm:"file_type_id" json:"fileTypeId"` // 文件夹类型id + Leader string `orm:"leader" json:"leader"` // 负责人 + Status string `orm:"status" json:"status"` // 文件状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type SysFileListRes struct { + FileId int `json:"fileId"` + ParentId int `json:"parentId"` + Ancestors string `json:"ancestors"` + FileName string `json:"fileName"` + OrderNum int `json:"orderNum"` + ProjectId int64 `json:"projectId"` + FileTypeId int `json:"fileTypeId"` + Leader string `json:"leader"` + Status string `json:"status"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/sys_file_type.go b/internal/app/system/model/sys_file_type.go new file mode 100644 index 0000000..44a72f8 --- /dev/null +++ b/internal/app/system/model/sys_file_type.go @@ -0,0 +1,35 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-29 15:27:54 +// 生成路径: internal/app/system/model/sys_file_type.go +// 生成人:gfast +// desc:文件类型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysFileTypeInfoRes is the golang structure for table sys_file_type. +type SysFileTypeInfoRes struct { + gmeta.Meta `orm:"table:sys_file_type"` + Id int `orm:"id,primary" json:"id"` // 序号 + FileTypeName string `orm:"file_type_name" json:"fileTypeName"` // 文件类型 + Status string `orm:"status" json:"status"` // 文件状态 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type SysFileTypeListRes struct { + Id int `json:"id"` + FileTypeName string `json:"fileTypeName"` + Status string `json:"status"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/sys_init.go b/internal/app/system/model/sys_init.go new file mode 100644 index 0000000..91cb6ff --- /dev/null +++ b/internal/app/system/model/sys_init.go @@ -0,0 +1,39 @@ +package model + +// 程序初始化yaml配置文件 +type DbInitConfig struct { + Database Database `json:"database" yaml:"database"` + Redis Redis `json:"redis" yaml:"redis"` +} + +type Database struct { + Default DbDefault `json:"default" yaml:"default"` +} + +type DbDefault struct { + Host string `json:"host" yaml:"host"` + Port int `json:"port" yaml:"port"` + User string `json:"user" yaml:"user"` + Pass string `json:"pass" yaml:"pass"` + Name string `json:"name" yaml:"name"` + Type string `json:"type" yaml:"type"` + Role string `json:"role" yaml:"role"` + Debug bool `json:"debug" yaml:"debug"` + Charset string `json:"charset" yaml:"charset"` + DryRun bool `json:"dryRun" yaml:"dryRun"` + MaxIdle int `json:"maxIdle" yaml:"maxIdle"` + MaxOpen int `json:"maxOpen" yaml:"maxOpen"` + MaxLifetime int `json:"maxLifetime" yaml:"maxLifetime"` +} + +type Redis struct { + Default RedisDefault `json:"default" yaml:"default"` +} + +type RedisDefault struct { + Address string `json:"address" yaml:"address"` + Db int `json:"db" yaml:"db"` + Pass string `json:"pass" yaml:"pass"` + IdleTimeout int `json:"idleTimeout" yaml:"idleTimeout"` + MaxActive int `json:"maxActive" yaml:"maxActive"` +} diff --git a/internal/app/system/model/sys_job.go b/internal/app/system/model/sys_job.go new file mode 100644 index 0000000..2a6cdb7 --- /dev/null +++ b/internal/app/system/model/sys_job.go @@ -0,0 +1,44 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-01-12 17:43:50 +// 生成路径: internal/app/system/model/sys_job.go +// 生成人:gfast +// desc:定时任务 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysJobInfoRes is the golang structure for table sys_job. +type SysJobInfoRes struct { + gmeta.Meta `orm:"table:sys_job"` + JobId uint64 `orm:"job_id,primary" json:"jobId"` // 任务ID + JobName string `orm:"job_name" json:"jobName"` // 任务名称 + JobParams string `orm:"job_params" json:"jobParams"` // 参数 + JobGroup string `orm:"job_group" json:"jobGroup"` // 任务组名 + InvokeTarget string `orm:"invoke_target" json:"invokeTarget"` // 任务方法 + CronExpression string `orm:"cron_expression" json:"cronExpression"` // cron执行表达式 + MisfirePolicy int `orm:"misfire_policy" json:"misfirePolicy"` // 计划执行策略 + Concurrent int `orm:"concurrent" json:"concurrent"` // 是否并发执行 + Status int `orm:"status" json:"status"` // 状态 + CreatedBy uint64 `orm:"created_by" json:"createdBy"` // 创建者 + UpdatedBy uint64 `orm:"updated_by" json:"updatedBy"` // 更新者 + Remark string `orm:"remark" json:"remark"` // 备注信息 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 +} + +type SysJobListRes struct { + JobId uint64 `json:"jobId"` + JobName string `json:"jobName"` + JobGroup string `json:"jobGroup"` + InvokeTarget string `json:"invokeTarget"` + CronExpression string `json:"cronExpression"` + MisfirePolicy int `json:"misfirePolicy"` + Status int `json:"status"` +} diff --git a/internal/app/system/model/sys_oper_log.go b/internal/app/system/model/sys_oper_log.go new file mode 100644 index 0000000..46eb187 --- /dev/null +++ b/internal/app/system/model/sys_oper_log.go @@ -0,0 +1,66 @@ +/* +* @desc:操作日志模型对象 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/9/21 16:34 + */ + +package model + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" + "net/url" +) + +// SysOperLogAdd 添加操作日志参数 +type SysOperLogAdd struct { + User *ContextUser + Menu *SysAuthRuleInfoRes + Url *url.URL + Params g.Map + Method string + ClientIp string + OperatorType int +} + +// SysOperLogInfoRes is the golang structure for table sys_oper_log. +type SysOperLogInfoRes struct { + gmeta.Meta `orm:"table:sys_oper_log"` + OperId uint64 `orm:"oper_id,primary" json:"operId"` // 日志编号 + Title string `orm:"title" json:"title"` // 系统模块 + BusinessType int `orm:"business_type" json:"businessType"` // 操作类型 + Method string `orm:"method" json:"method"` // 操作方法 + RequestMethod string `orm:"request_method" json:"requestMethod"` // 请求方式 + OperatorType int `orm:"operator_type" json:"operatorType"` // 操作类别 + OperName string `orm:"oper_name" json:"operName"` // 操作人员 + DeptName string `orm:"dept_name" json:"deptName"` // 部门名称 + LinkedDeptName *LinkedSysOperLogSysDept `orm:"with:dept_id=dept_name" json:"linkedDeptName"` + OperUrl string `orm:"oper_url" json:"operUrl"` // 请求URL + OperIp string `orm:"oper_ip" json:"operIp"` // 主机地址 + OperLocation string `orm:"oper_location" json:"operLocation"` // 操作地点 + OperParam string `orm:"oper_param" json:"operParam"` // 请求参数 + ErrorMsg string `orm:"error_msg" json:"errorMsg"` // 错误消息 + OperTime *gtime.Time `orm:"oper_time" json:"operTime"` // 操作时间 +} + +type LinkedSysOperLogSysDept struct { + gmeta.Meta `orm:"table:sys_dept"` + DeptId int64 `orm:"dept_id" json:"deptId"` // 部门id + DeptName string `orm:"dept_name" json:"deptName"` // 部门名称 +} + +type SysOperLogListRes struct { + OperId uint64 `json:"operId"` + Title string `json:"title"` + RequestMethod string `json:"requestMethod"` + OperName string `json:"operName"` + DeptName string `json:"deptName"` + LinkedDeptName *LinkedSysOperLogSysDept `orm:"with:dept_id=dept_name" json:"linkedDeptName"` + OperUrl string `json:"operUrl"` + OperIp string `json:"operIp"` + OperLocation string `json:"operLocation"` + OperParam string `json:"operParam"` + OperTime *gtime.Time `json:"operTime"` +} diff --git a/internal/app/system/model/sys_project.go b/internal/app/system/model/sys_project.go new file mode 100644 index 0000000..e7debe2 --- /dev/null +++ b/internal/app/system/model/sys_project.go @@ -0,0 +1,90 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-27 15:20:49 +// 生成路径: internal/app/system/model/sys_project.go +// 生成人:gfast +// desc:项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysProjectInfoRes is the golang structure for table sys_project. +type SysProjectInfoRes struct { + gmeta.Meta `orm:"table:sys_project"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + ProjectName string `orm:"project_name" json:"projectName"` // 项目名称 + ShortName string `orm:"short_name" json:"shortName"` //项目简称 + //ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + PId int64 `orm:"p_id" json:"pId"` // 父id + Status string `orm:"status" json:"status"` // 状态(0正常 1停用) + PicUrl string `orm:"pic_url" json:"picUrl"` // 项目图片 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + CreateTime *gtime.Time `orm:"create_time" json:"createTime"` // 创建时间 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + UpdateTime *gtime.Time `orm:"update_time" json:"updateTime"` // 更新时间 + Lng string `orm:"lng" json:"lng"` // 经度 + Lat string `orm:"lat" json:"lat"` // 纬度 + Remark string `orm:"remark" json:"remark"` // 备注 + Type string `orm:"type" json:"type"` // 项目类型 + ColourRgb string `orm:"colour_rgb" json:"colourRgb"` // 展示颜色 + DeletedAt string `orm:"deleted_at" json:"deletedAt"` // 删除时间 + ProjectSite string `orm:"project_site" json:"projectSite"` // 项目地址 + PrincipalXz string `orm:"principal_xz" json:"principalXz"` // 小程序薪资负责人 + Principal string `orm:"principal" json:"principal"` // 项目负责人 + PrincipalPhone string `orm:"principal_phone" json:"principalPhone"` // 负责人电话 + BzzName string `orm:"bzzName" json:"bzzName"` // 小程序薪资负责人 + PunchRange string `orm:"punch_range" json:"punchRange"` // 打卡范围 + SecurityAgreement string `orm:"security_agreement" json:"securityAgreement"` //安全协议书 + IsType string `orm:"is_type" json:"isType"` //项目类型(1光伏 2风电) + Sort int64 `orm:"sort" json:"sort"` //排序字段 + ShowHidden string `orm:"show_hidden" json:"showHidden"` //排序字段 + //Phone string `orm:"phone" json:"phone"` // 负责人电话 电话 + //SfzSite string `orm:"sfz_site" json:"sfzSite"` // 负责人电话 身份证地址 + + Actual string `orm:"actual" json:"actual"` + Plan string `orm:"plan" json:"plan"` + OnStreamTime string `orm:"on_stream_time" json:"onStreamTime"` + RichText string `orm:"rich_text" json:"richText"` + DesignTotal int64 `orm:"design_total" json:"designTotal"` //设计总量 +} + +type SysProjectListRes struct { + Id int64 `json:"id"` + ProjectName string `json:"projectName"` + ShortName string `json:"shortName"` + ProjectId int64 `json:"projectId"` + PId int64 `json:"pId"` + Status string `json:"status"` + PicUrl string `json:"picUrl"` + CreateBy string `json:"createBy"` + CreateTime *gtime.Time `json:"createTime"` + UpdateBy string `json:"updateBy"` + UpdateTime *gtime.Time `json:"updateTime"` + Lng string `json:"lng"` + Lat string `json:"lat"` + Remark string `json:"remark"` + Type string `json:"type"` + ColourRgb string `json:"colourRgb"` + DeletedAt string `json:"deletedAt"` + ProjectSite string `json:"projectSite"` // 项目地址 + PrincipalXz string `json:"principalXz"` // 小程序薪资负责人OPENID + Principal string `json:"principal"` // 项目负责人 + PrincipalPhone string `json:"principalPhone"` // 负责人电话 + PrincipalXzName string `json:"principalXzName"` // 小程序薪资负责人名称 + Actual string `json:"actual"` + Plan string `json:"plan"` + OnStreamTime string `json:"onStreamTime"` + PunchRange string `json:"punchRange"` + RichText string `json:"richText"` + DesignTotal int64 `json:"designTotal"` + SecurityAgreement string `json:"securityAgreement"` + IsType string `json:"isType"` + Sort int64 `json:"sort"` + ShowHidden string `json:"showHidden"` +} diff --git a/internal/app/system/model/sys_project_introduce.go b/internal/app/system/model/sys_project_introduce.go new file mode 100644 index 0000000..70b4f7b --- /dev/null +++ b/internal/app/system/model/sys_project_introduce.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-03-29 10:05:02 +// 生成路径: internal/app/system/model/sys_project_introduce.go +// 生成人:gfast +// desc:项目新闻 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysProjectIntroduceInfoRes is the golang structure for table sys_project_introduce. +type SysProjectIntroduceInfoRes struct { + gmeta.Meta `orm:"table:sys_project_introduce"` + Id int64 `orm:"id,primary" json:"id"` // 项目id + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Headline string `orm:"headline" json:"headline"` // 标题 + RichText string `orm:"rich_text" json:"richText"` // 富文本 + CreatedBy string `orm:"created_by" json:"createdBy"` // 创建人 + UpdatedBy string `orm:"updated_by" json:"updatedBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type SysProjectIntroduceListRes struct { + Id int64 `json:"id"` + ProjectId int64 `json:"projectId"` + Headline string `json:"headline"` + CreatedBy string `json:"createdBy"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/sys_project_value.go b/internal/app/system/model/sys_project_value.go new file mode 100644 index 0000000..3e1e3ee --- /dev/null +++ b/internal/app/system/model/sys_project_value.go @@ -0,0 +1,50 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-03-27 12:55:26 +// 生成路径: internal/app/system/model/sys_project_value.go +// 生成人:xiaoyang +// desc:projectValue +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysProjectValueInfoRes is the golang structure for table sys_project_value. +type SysProjectValueInfoRes struct { + gmeta.Meta `orm:"table:sys_project_value"` + Id int64 `orm:"id,primary" json:"id"` // 主键id + ProId int64 `orm:"pro_id" json:"proId"` // 项目id + Year string `orm:"year" json:"year"` // 年 + Month string `orm:"month" json:"month"` // 月 + ProValue string `orm:"pro_value" json:"proValue"` // 项目产值 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + +} + +type SysProjectValueListRes struct { + Id int64 `json:"id"` + ProId int64 `json:"proId"` + ShortName string `json:"shortName" dc:"项目简称"` + Year string `json:"year"` + Month string `json:"month"` + ProValue string `json:"proValue"` + CreatedAt *gtime.Time `json:"createdAt"` +} + +type EveryProjectValue struct { + Id int64 `json:"id" dc:"主键id"` + ProId int64 `json:"proId" dc:"项目id"` + ProjectName string `json:"projectName" dc:"项目名字"` + Year string `json:"year" dc:"产值年"` + Month string `json:"month" dc:"产值月"` + ProValue string `json:"proValue" dc:"项目产值"` +} +type TotalProjectValue struct { + EveryProjectValue []EveryProjectValue `json:"everyProjectValue"` + TotalValue string `json:"totalValue" dc:"年/月总产值 默认小数点两位"` +} diff --git a/internal/app/system/model/sys_role.go b/internal/app/system/model/sys_role.go new file mode 100644 index 0000000..cb4b8b4 --- /dev/null +++ b/internal/app/system/model/sys_role.go @@ -0,0 +1,8 @@ +/* +* @desc:角色 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/30 9:11 + */ + +package model diff --git a/internal/app/system/model/sys_user.go b/internal/app/system/model/sys_user.go new file mode 100644 index 0000000..f85003d --- /dev/null +++ b/internal/app/system/model/sys_user.go @@ -0,0 +1,79 @@ +/* +* @desc:用户模型对象 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/7 11:47 + */ + +package model + +import ( + "github.com/gogf/gf/v2/util/gmeta" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +// LoginUserRes 登录返回 +type LoginUserRes struct { + Id uint64 `orm:"id,primary" json:"id"` // + UserName string `orm:"user_name,unique" json:"userName"` // 用户名 + UserNickname string `orm:"user_nickname" json:"userNickname"` // 用户昵称 + UserPassword string `orm:"user_password" json:"userPassword"` // 登录密码;cmf_password加密 + UserSalt string `orm:"user_salt" json:"userSalt"` // 加密盐 + UserStatus uint `orm:"user_status" json:"userStatus"` // 用户状态;0:禁用,1:正常,2:未验证 + IsAdmin int `orm:"is_admin" json:"isAdmin"` // 是否后台管理员 1 是 0 否 + IsData string `orm:"is_data" json:"isData" dc:"项目备案 1查看所有数据 2仅自己"` // + Mobile string `orm:"mobile" json:"mobile"` // + Avatar string `orm:"avatar" json:"avatar"` // 头像 + DeptId uint64 `orm:"dept_id" json:"deptId"` // 部门id + OpenId string `json:"openId"` // 微信openid +} + +// SysUserRoleDeptRes 带有部门、角色、岗位信息的用户数据 +type SysUserRoleDeptRes struct { + *entity.SysUser + Dept *entity.SysDept `json:"dept"` + RoleInfo []*SysUserRoleInfoRes `json:"roleInfo"` + Post []*SysUserPostInfoRes `json:"post"` +} + +type SysUserRoleInfoRes struct { + RoleId uint `json:"roleId"` + Name string `json:"name"` +} + +type SysUserPostInfoRes struct { + PostId int64 `json:"postId"` + PostName string `json:"postName"` +} + +type SysUserSimpleRes struct { + gmeta.Meta `orm:"table:sys_user"` + Id uint64 `orm:"id" json:"id"` // + Avatar string `orm:"avatar" json:"avatar"` // 头像 + Sex int `orm:"sex" json:"sex"` // 性别 + UserName string `orm:"user_name" json:"userName"` // 用户名 + UserNickname string `orm:"user_nickname" json:"userNickname"` // 用户昵称 +} + +// App 用户信息 +type AppUserInfo struct { + Avatar string `orm:"head_icon"` // 头像 + Name string `orm:"nick_name"` // 昵称 + RealName string `orm:"user_name"` // 真实姓名 + IsNewUser int `orm:"is_new_user" dc:"是否是新用户 0 否 1 是"` + IdCard string `orm:"sfz_number"` // 身份号 + Mobile string `orm:"phone"` // 手机号 + Ginder string `orm:"sex"` // 性别 + Project string `orm:"project_name"` // 项目 + ProjectId string `orm:"id"` // 项目ID + Lng string `orm:"lng" dc:"经度"` // 经度 + Lat string `orm:"lat" dc:"维度"` // 纬度 + ConstructionUnitName string `orm:"constructionUnitName"` // 施工单位 + WorkType string `orm:"dict_label"` // 工种 + Team string `orm:"team"` // 班组 + UserStatus string `orm:"status"` // 状态 + EntryTime string `orm:"entry_date"` // 入场时间 + LeaveTime string `orm:"leave_date"` // 离场时间 + TeamID string `orm:"team_id"` // 班组ID + PostId int `orm:"post_id"` // 岗位ID +} diff --git a/internal/app/system/model/sys_user_func.go b/internal/app/system/model/sys_user_func.go new file mode 100644 index 0000000..406c864 --- /dev/null +++ b/internal/app/system/model/sys_user_func.go @@ -0,0 +1,44 @@ +package model + +// AppGetUserInfoRes IsRealName 是否实名 +func (u *AppUserInfo) IsRealName() int { + if u.IdCard != "" { + return 1 + } + return 0 +} + +// AppGetUserInfoRes Sex 性别 +func (u *AppUserInfo) Sex() string { + switch u.Ginder { + case "1": + return "男" + case "2": + return "女" + default: + return "保密" + } +} + +// AppGetUserInfoRes Status 状态 +func (u *AppUserInfo) Status() string { + switch u.UserStatus { + case "0": + return "在职" + case "1": + return "离职" + default: + return "" + } +} + +// AppGetUserInfoRes IsLeader 是否是组长 +func (u *AppUserInfo) IsLeader() int { + if u.TeamID != "" { + if u.PostId == 10 { + return 1 + } + } + + return 0 +} diff --git a/internal/app/system/model/sys_user_login.go b/internal/app/system/model/sys_user_login.go new file mode 100644 index 0000000..50ffdba --- /dev/null +++ b/internal/app/system/model/sys_user_login.go @@ -0,0 +1,18 @@ +/* +* @desc:登录日志 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/8 11:43 + */ + +package model + +// LoginLogParams 登录日志写入参数 +type LoginLogParams struct { + Status int + Username string + Ip string + UserAgent string + Msg string + Module string +} diff --git a/internal/app/system/model/sys_user_online.go b/internal/app/system/model/sys_user_online.go new file mode 100644 index 0000000..567ff4f --- /dev/null +++ b/internal/app/system/model/sys_user_online.go @@ -0,0 +1,17 @@ +/* +* @desc:用户在线状态 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2023/1/10 15:08 + */ + +package model + +// SysUserOnlineParams 用户在线状态写入参数 +type SysUserOnlineParams struct { + UserAgent string + Uuid string + Token string + Username string + Ip string +} diff --git a/internal/app/system/model/sys_user_project.go b/internal/app/system/model/sys_user_project.go new file mode 100644 index 0000000..49cfaa9 --- /dev/null +++ b/internal/app/system/model/sys_user_project.go @@ -0,0 +1,28 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-27 15:20:52 +// 生成路径: internal/app/system/model/sys_user_project.go +// 生成人:gfast +// desc:用户和项目关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysUserProjectInfoRes is the golang structure for table sys_user_project. +type SysUserProjectInfoRes struct { + gmeta.Meta `orm:"table:sys_user_project"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + UserId int64 `orm:"user_id" json:"userId"` // 用户 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目 +} + +type SysUserProjectListRes struct { + Id int64 `json:"id"` + UserId int64 `json:"userId"` + ProjectId int64 `json:"projectId"` +} diff --git a/internal/app/system/model/sys_wechat_role.go b/internal/app/system/model/sys_wechat_role.go new file mode 100644 index 0000000..51004ec --- /dev/null +++ b/internal/app/system/model/sys_wechat_role.go @@ -0,0 +1,62 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-01-22 15:05:43 +// 生成路径: internal/app/system/model/sys_wechat_role.go +// 生成人:gfast +// desc:微信角色 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysWechatRoleInfoRes is the golang structure for table sys_wechat_role. +type SysWechatRoleInfoRes struct { + gmeta.Meta `orm:"table:sys_wechat_role"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + Name string `orm:"name" json:"name"` // 角色名称 + ListOrder int `orm:"list_order" json:"listOrder"` // 排序 + Remark string `orm:"remark" json:"remark"` // 备注 + Status string `orm:"status" json:"status"` // 状态;0:禁用;1:正常 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 修改时间 +} +type SysWechatRoleListRes struct { + Id int64 `json:"id"` + Name string `json:"name"` + ListOrder int `json:"listOrder"` + Remark string `json:"remark"` + Status string `json:"status"` + CreatedAt *gtime.Time `json:"createdAt"` +} + +type SysWechatRoleListTwoRes struct { + SysWechatRoleInfoRes + ModuleIds []int64 `json:"moduleIds" dc:"角色拥有哪些模块?"` +} + +// SysWechatModuleInfoRes 模块表 +type SysWechatModuleInfoRes struct { + gmeta.Meta `orm:"table:sys_wechat_module"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + Name string `orm:"name" json:"name"` // 角色名称 + ListOrder int `orm:"list_order" json:"listOrder"` // 排序 +} + +// SysWechatRoleModuleInfoRes 微信角色与模块关联表 +type SysWechatRoleModuleInfoRes struct { + gmeta.Meta `orm:"table:sys_wxchat_role_module"` + RoleId int64 `orm:"role_id" json:"roleId"` // 角色 + ModuleId int64 `orm:"module_id" json:"moduleId"` // 模块 +} + +// SysWechatUserRoleInfoRes 微信用户与角色关联 +type SysWechatUserRoleInfoRes struct { + gmeta.Meta `orm:"table:sys_wechat_user_role"` + UserId int64 `orm:"user_id" json:"userId"` // 角色 + RoleId int64 `orm:"role_id" json:"roleId"` // 模块 +} diff --git a/internal/app/system/model/task.go b/internal/app/system/model/task.go new file mode 100644 index 0000000..aac187d --- /dev/null +++ b/internal/app/system/model/task.go @@ -0,0 +1,16 @@ +/* +* @desc:定时任务 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2023/1/13 17:47 + */ + +package model + +import "github.com/gogf/gf/v2/os/gctx" + +type TimeTask struct { + FuncName string + Param []string + Run func(ctx gctx.Ctx) +} diff --git a/internal/app/system/model/template_data.go b/internal/app/system/model/template_data.go new file mode 100644 index 0000000..b508e55 --- /dev/null +++ b/internal/app/system/model/template_data.go @@ -0,0 +1,39 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-12-08 14:21:01 +// 生成路径: internal/app/system/model/template_data.go +// 生成人:gfast +// desc:工程资料>资料 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// TemplateDataInfoRes is the golang structure for table template_data. +type TemplateDataInfoRes struct { + gmeta.Meta `orm:"table:template_data"` + Id int64 `orm:"id,primary" json:"id"` // 主键id + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目ID + DataName string `orm:"data_name" json:"dataName"` // 名称 + DataType string `orm:"data_type" json:"dataType"` // 1编写 2存储 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type TemplateDataListRes struct { + Id int64 `json:"id"` + ProjectId int64 `json:"projectId"` + DataName string `json:"dataName"` + DataType string `json:"dataType"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/template_data_junior.go b/internal/app/system/model/template_data_junior.go new file mode 100644 index 0000000..a0ab1e4 --- /dev/null +++ b/internal/app/system/model/template_data_junior.go @@ -0,0 +1,41 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-12-08 14:21:01 +// 生成路径: internal/app/system/model/template_data_junior.go +// 生成人:gfast +// desc:工程资料>资料>下级模板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// TemplateDataJuniorInfoRes is the golang structure for table template_data_junior. +type TemplateDataJuniorInfoRes struct { + gmeta.Meta `orm:"table:template_data_junior"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 模板名称 + FilenPath string `orm:"filen_path" json:"filenPath"` // 模板文件名 + Suffix string `orm:"suffix" json:"suffix"` // 后缀 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type TemplateDataJuniorListRes struct { + Id int64 `json:"id"` + ProjectId int64 `json:"projectId"` + Name string `json:"name"` + FilenPath string `json:"filenPath"` + Suffix string `json:"suffix"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/template_data_source_data.go b/internal/app/system/model/template_data_source_data.go new file mode 100644 index 0000000..76db18c --- /dev/null +++ b/internal/app/system/model/template_data_source_data.go @@ -0,0 +1,43 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-12-08 10:06:54 +// 生成路径: internal/app/system/model/template_data_source_data.go +// 生成人:gfast +// desc:模板资料源数据 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// TemplateDataSourceDataInfoRes is the golang structure for table template_data_source_data. +type TemplateDataSourceDataInfoRes struct { + gmeta.Meta `orm:"table:template_data_source_data"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + Type string `orm:"type" json:"type"` // 1模板 2资料 + TypeId int64 `orm:"type_id" json:"typeId"` // 对应数据id + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + SourceName string `orm:"source_name" json:"sourceName"` // 资源名称 + SourceId string `orm:"source_id" json:"sourceId"` // 资源ID + SourcePath string `orm:"source_path" json:"sourcePath"` // 资源路径 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type TemplateDataSourceDataListRes struct { + Id int64 `json:"id"` + Type string `json:"type"` + TypeId int64 `json:"typeId"` + ProjectId int64 `json:"projectId"` + SourceName string `json:"sourceName"` + SourceId string `json:"sourceId"` + SourcePath string `json:"sourcePath"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/todo_tasks.go b/internal/app/system/model/todo_tasks.go new file mode 100644 index 0000000..a648af3 --- /dev/null +++ b/internal/app/system/model/todo_tasks.go @@ -0,0 +1,54 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-05-15 17:30:14 +// 生成路径: internal/app/system/model/todo_tasks.go +// 生成人:gfast +// desc:App-待办 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// TodoTasksInfoRes is the golang structure for table todo_tasks. +type TodoTasksInfoRes struct { + gmeta.Meta `orm:"table:todo_tasks"` + Id uint `orm:"id,primary" json:"id"` // + Role int `json:"role"` + MissingCardTime string `orm:"missing_card_time" json:"missingCardTime"` // 缺卡时间 + Applicant int `orm:"applicant" json:"applicant"` // 申请人 + ProjectId int `orm:"project_id" json:"projectId"` // 项目ID + TaskType int `orm:"task_type" json:"taskType"` // 0 补卡提醒 | 1 考勤审批 + OrderId int `orm:"order_id" json:"orderId"` // 对应跳转的主键ID + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` + UserId int `orm:"user_id" json:"userId"` // 用户ID + UserNameORM string `json:"userName" orm:"user_nickname" dc:"创建人的名称"` // 创建人的名称 + BusName string `json:"busName" orm:"busName" dc:"微信实名"` + ProjectName string `json:"projectName" dc:"项目名称"` // 项目名称 + Status int `json:"status"` + GangerTime string `json:"gangerTime" orm:"ganger_time" dc:"班组长处理时间"` + Opinion string `json:"opinion" dc:"处理意见 1未读 2同意 3拒绝"` +} + +type TodoTasksListRes struct { + Id uint `json:"id"` + MissingCardTime string `json:"missingCardTime,omitempty"` + Applicant int `json:"applicant,omitempty"` + ProjectId int `json:"projectId"` + TaskType int `json:"taskType"` + OrderId int `json:"orderId"` + CreatedAt *gtime.Time `json:"createdAt"` + UpdatedAt *gtime.Time `json:"updatedAt" dc:"更新时间"` + UserId int `json:"userId"` + Role int `json:"role"` + UserName string `json:"userName" dc:"创建人的名称"` // 创建人的名称 + ProjectName string `json:"projectName" dc:"项目名称"` // 项目名称 + Status int `json:"status"` + GangerTime string `json:"gangerTime" orm:"ganger_time" dc:"班组长处理时间"` + Opinion string `json:"opinion" dc:"处理意见 1未读 2同意 3拒绝"` +} diff --git a/internal/app/system/model/todo_tasks_func.go b/internal/app/system/model/todo_tasks_func.go new file mode 100644 index 0000000..632a75d --- /dev/null +++ b/internal/app/system/model/todo_tasks_func.go @@ -0,0 +1,13 @@ +package model + +func (m *TodoTasksInfoRes) UserName() string { + if m.Applicant == 0 { + return "系统提醒" + } + + if m.UserNameORM == "" { + return m.BusName + } + + return m.UserNameORM +} diff --git a/internal/app/system/model/tools_gen_table.go b/internal/app/system/model/tools_gen_table.go new file mode 100644 index 0000000..bac9cb1 --- /dev/null +++ b/internal/app/system/model/tools_gen_table.go @@ -0,0 +1,81 @@ +/* +* @desc:代码生成表数据模型 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/10/28 11:43 + */ + +package model + +import ( + "github.com/gogf/gf/v2/container/gmap" + "github.com/gogf/gf/v2/os/gtime" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +// ToolsGenTableEx 实体扩展 +type ToolsGenTableEx struct { + TableId int64 // 编号 + TableName string // 表名称 + TableComment string // 表描述 + ClassName string // 实体类名称 + TplCategory string // 使用的模板(crud单表操作 tree树表操作) + PackageName string // 生成包路径 + ModuleName string // 生成模块名 + BusinessName string // 生成业务名 + FunctionName string // 生成功能名 + FunctionAuthor string // 生成功能作者 + Options string // 其它生成选项 + CreateBy string // 创建者 + CreateTime *gtime.Time // 创建时间 + UpdateBy string // 更新者 + UpdateTime *gtime.Time // 更新时间 + Remark string // 备注 + Overwrite bool // 是否覆盖原有文件 + SortColumn string // 缺省排序字段 + SortType string // 缺省排序方式 (asc顺序 desc倒序) + ShowDetail bool // 是否有查看详情功能 + TreeCode string // 树编码字段 + TreeParentCode string // 树父编码字段 + TreeName string // 树名称字段 + IsPkInsertable bool // 主键是否应该在新增时填写 + IsPkListable bool // 主键是否出现在列表中 + HasTimeColumn bool // 是否有时间类型 + HasCreatedBy bool // 是否有created_by字段 + HasUpdatedBy bool // 是否有updated_by字段 + HasConversion bool // service中是否有转换函数 + Columns []*ToolsGenTableColumnEx // 表列信息 + InsertColumns []*ToolsGenTableColumnEx // 新增界面列信息,主键单独判断不在此列 + EditColumns []*ToolsGenTableColumnEx // 编辑界面列信息,主键单独判断不在此列 + ListColumns []*ToolsGenTableColumnEx // 列表界面列信息 + DetailColumns []*ToolsGenTableColumnEx // 详情界面列信息 + QueryColumns []*ToolsGenTableColumnEx // 查询表单列信息 + PkColumn *ToolsGenTableColumnEx // 主键列信息 + LinkedTables []*ToolsGenTableLinked // 关联表信息 +} + +// ToolsGenTableLinked 关联表 +type ToolsGenTableLinked struct { + TableName string // 表名称 + TableComment string // 表描述 + ClassName string // 实体类名称 + PackageName string // 生成包路径 + ModuleName string // 生成模块名 + BusinessName string // 生成业务名 + RefColumns *gmap.ListMap // 要被查询的所有数据列信息 + LinkedTables []*ToolsGenTableLinked // 嵌套关联表信息 +} + +// ToolsGenTableEditData 编辑页面表数据详情 +type ToolsGenTableEditData struct { + *entity.ToolsGenTable + TreeCode interface{} `json:"treeCode"` + TreeParentCode interface{} `json:"treeParentCode"` + TreeName interface{} `json:"treeName"` +} + +// ToolsGenTableColumnsData 表与字段组合数据 +type ToolsGenTableColumnsData struct { + *entity.ToolsGenTable + Columns []*entity.ToolsGenTableColumn `json:"columns"` +} diff --git a/internal/app/system/model/tools_gen_table_column.go b/internal/app/system/model/tools_gen_table_column.go new file mode 100644 index 0000000..d4c833b --- /dev/null +++ b/internal/app/system/model/tools_gen_table_column.go @@ -0,0 +1,60 @@ +/* +* @desc:代码生成表字段数据模型 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/10/28 11:41 + */ + +package model + +import "github.com/gogf/gf/v2/container/gset" + +// ToolsGenTableColumnEx 扩展 +type ToolsGenTableColumnEx struct { + ColumnId int64 // 编号 + TableId int64 // 归属表编号 + ColumnName string // 列名称 + ColumnComment string // 列描述 + ColumnType string // 列类型 + GoType string // Go类型 + TsType string // Ts类型 + GoField string // Go字段名 + HtmlField string // html字段名 + IsPk bool // 是否主键 + IsIncrement bool // 是否自增 + IsRequired bool // 是否必填 + IsInsert bool // 是否为插入字段 + IsEdit bool // 是否编辑字段 + IsList bool // 是否列表字段 + IsDetail bool // 是否详情字段 + IsQuery bool // 是否查询字段 + IsStatus bool // 是否状态字段 + SortOrderEdit int // 插入编辑显示顺序 + SortOrderList int // 列表显示顺序 + SortOrderDetail int // 详情显示顺序 + SortOrderQuery int // 查询显示顺序 + QueryType string // 查询方式(等于、不等于、大于、小于、范围) + HtmlType string // 显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件) + DictType string // 字典类型 + LinkTableName string // 关联表名 + LinkTableClass string // 关联表类名 + LinkTableModuleName string // 关联表业务名 + LinkTableBusinessName string // 关联表业务名 + LinkTablePackage string // 关联表包名 + LinkLabelId string // 关联表键名 + LinkLabelName string // 关联表字段值 + ColSpan int // 占多少列 + RowSpan int // 占多少行 + IsRowStart bool // 是否另起一行 + MinWidth int // 表格最小宽度 + IsFixed bool // 是否表格列左固定 + IsOverflowTooltip bool // 是否过长自动隐藏 + FieldConversion string // 字段转换方法 + FieldValidation string // 字段校验规则 + IsCascade bool // 是否级联查询 + ParentColumnName string // 上级字段名 + CascadeColumnName string // 级联查询字段 + IsCascadeParent bool // 是否为级联父字段 + CascadeParent *ToolsGenTableColumnEx // 级联父字段指针 + CascadeChildrenColumns *gset.StrSet // 所有级联子字段名(按级联顺序) +} diff --git a/internal/app/system/model/user_registration.go b/internal/app/system/model/user_registration.go new file mode 100644 index 0000000..754c7a1 --- /dev/null +++ b/internal/app/system/model/user_registration.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-07-26 15:32:12 +// 生成路径: internal/app/system/model/user_registration.go +// 生成人:gfast +// desc:极光推送 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// UserRegistrationInfoRes is the golang structure for table user_registration. +type UserRegistrationInfoRes struct { + gmeta.Meta `orm:"table:user_registration"` + Id uint `orm:"id,primary" json:"id"` // + UserId int `orm:"user_id" json:"userId"` // 用户ID + OpenId string `orm:"open_id" json:"openId"` // 微信 open_id + RegistrationId string `orm:"registration_id" json:"registrationId"` // 极光推送 设备唯一标识 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // +} + +type UserRegistrationListRes struct { + Id uint `json:"id"` + UserId int `json:"userId"` + OpenId string `json:"openId"` + RegistrationId string `json:"registrationId"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/work_schdule_detail.go b/internal/app/system/model/work_schdule_detail.go new file mode 100644 index 0000000..48fc92a --- /dev/null +++ b/internal/app/system/model/work_schdule_detail.go @@ -0,0 +1,37 @@ +package model + +import "time" + +type SchduleDetail struct { + WorkName string `orm:"work_name"` // 工作名称 + // 计划数量 + PlanNum int `orm:"plan_num"` + // 实际完成数量 + FinishedNum int `orm:"finished_num"` + // 开始时间 + StartTime string `orm:"start_at"` + // 结束时间 + EndTime string `orm:"end_at"` + // 负责人 + Leader string `orm:"principal"` +} + +// WorkDay 计算工作日 +func (m *SchduleDetail) WorkDay() int { + formatTime := "2006-01-02 15:04:05" + + // 计算 m.StartTime 和 m.EndTime 之间的工作日 + startTime, _ := time.Parse(formatTime, m.StartTime) + endTime, _ := time.Parse(formatTime, m.EndTime) + + // 计算工作日 + return int(endTime.Sub(startTime).Hours() / 24) +} + +// WorkPercent 计算工作量百分比 +func (m *SchduleDetail) WorkPercent() int { + if m.PlanNum == 0 { + return 0 + } + return m.FinishedNum * 100 / m.PlanNum +} diff --git a/internal/app/system/model/work_schedule.go b/internal/app/system/model/work_schedule.go new file mode 100644 index 0000000..dd64a28 --- /dev/null +++ b/internal/app/system/model/work_schedule.go @@ -0,0 +1,95 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-03-20 10:02:26 +// 生成路径: internal/app/system/model/work_schedule.go +// 生成人:gfast +// desc:工作计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// WorkScheduleInfoRes is the golang structure for table work_schedule. +type WorkScheduleInfoRes struct { + gmeta.Meta `orm:"table:work_schedule"` + Id uint `orm:"id,primary" json:"id"` // + WorkId string `orm:"work_id" json:"workId"` // 关联的工作ID + StartAt *gtime.Time `orm:"start_at" json:"startAt"` // 开始时间 + EndAt *gtime.Time `orm:"end_at" json:"endAt"` // 结束时间 + Detail string `orm:"detail" json:"detail"` // 每天详细数据 + Status int `orm:"status" json:"status"` // 状态 + PlanNum int `orm:"plan_num" json:"planNum"` // 计划 + FinishedNum int `orm:"finished_num" json:"finishedNum"` // 完成量 +} + +type WorkScheduleInfo2Res struct { + gmeta.Meta `orm:"table:work_schedule"` + Id uint `orm:"id,primary" json:"id"` // + WorkId string `orm:"work_id" json:"workId"` // 关联的工作ID + StartAt *gtime.Time `orm:"start_at" json:"startAt"` // 开始时间 + EndAt *gtime.Time `orm:"end_at" json:"endAt"` // 结束时间 + Detail []WorkScheduleDetail `orm:"detail" json:"detail"` // 每天详细数据 + Status int `orm:"status" json:"status"` // 状态 + PlanNum int `orm:"plan_num" json:"planNum"` // 计划 + FinishedNum int `orm:"finished_num" json:"finishedNum"` // 完成量 +} + +type WorkScheduleListRes struct { + Id uint `json:"id"` + WorkId string `json:"workId"` + StartAt *gtime.Time `json:"startAt"` + Detail string `json:"detail"` + Status int `json:"status"` + PlanNum int `json:"planNum"` + FinishedNum int `json:"finishedNum"` +} + +// 每日工作详情 +type WorkScheduleDetail struct { + Date string `json:"date" dc:"日期"` + // 计划数量 + PlanNum int `json:"planNum" dc:"单日计划数量"` + // 是否手动填充 + AutoFill int `json:"autoFill"` + // 完成数量 + FinishedNum int `json:"finishedNum" dc:"实际完成数量"` + // 手动填充数量 + 识别数量 + Total int `json:"total" dc:"手动填报 + AI填报"` +} + +// 排期时间 +type WorkScheduleTime struct { + // 开始时间 + StartAt *gtime.Time `json:"startAt" dc:"开始时间"` + // 结束时间 + EndAt *gtime.Time `json:"endAt" dc:"结束时间"` +} + +type DetailedWorkSchedule struct { + StartAt string `json:"startAt"` + EndAt string `json:"endAt"` + Detail string `json:"detail"` + Status int `json:"status"` + PlanNum int `json:"planNum"` + FinishedNum int `json:"finishedNum"` +} + +type WorkSchedule struct { + Id int `orm:"work_schedule.id" description:""` + WorkId string `orm:"work_schedule.work_id" description:"关联的工作ID"` + StartAt *gtime.Time `orm:"work_schedule.start_at" description:"开始时间"` + Detail string `orm:"work_schedule.detail" description:"每天详细数据"` + Status int `orm:"work_schedule.status" description:"状态"` + PlanNum int `orm:"work_schedule.plan_num" description:"计划数量"` + FinishedNum int `orm:"work_schedule.finished_num" description:"完成量"` + EndAt *gtime.Time `orm:"work_schedule.end_at" description:"结束时间"` + ProjectId int `orm:"work_schedule.project_id" description:"主项目ID"` + SubProjectid int `orm:"work_schedule.sub_projectid" description:"子项目ID"` + FangzhenId int `orm:"work_schedule.fangzhen_id" description:"方阵ID"` + Total int `orm:"work_status.total" description:"总量"` +} diff --git a/internal/app/system/model/work_status.go b/internal/app/system/model/work_status.go new file mode 100644 index 0000000..37d20a5 --- /dev/null +++ b/internal/app/system/model/work_status.go @@ -0,0 +1,121 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-03-19 11:45:09 +// 生成路径: internal/app/system/model/work_status.go +// 生成人:gfast +// desc:工作状态 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// WorkStatusInfoRes is the golang structure for table work_status. +type WorkStatusInfoRes struct { + gmeta.Meta `orm:"table:work_status"` + Id uint `orm:"id,primary" json:"id"` // + FangzhenId string `orm:"fangzhen_id" json:"fangzhenId"` // 方阵ID + Parent int `orm:"parent" json:"parent"` // 父节点 + WorkId string `orm:"work_id" json:"workId"` // 工作id + WorkName string `orm:"work_name" json:"workName"` // 工作名称 + Total int `orm:"total" json:"total"` // 总量 + Finished int `orm:"finished" json:"finished"` // 完成量 + StartAt *gtime.Time `orm:"start_at" json:"startAt"` // 开始时间 + EndAt *gtime.Time `orm:"end_at" json:"endAt"` // 工作结束时间 + Status int `orm:"status" json:"status"` // 状态 0未开始 1 进行中 2 已完成 3 已延期 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // +} + +type WorkStatusListRes struct { + Id uint `json:"id"` + FangzhenId string `json:"fangzhenId"` + Parent int `json:"parent"` + WorkId string `json:"workId"` + WorkName string `json:"workName"` + Total int `json:"total"` + Finished int `json:"finished"` + StartAt *gtime.Time `json:"startAt"` + EndAt *gtime.Time `json:"endAt"` + Status int `json:"status"` + CreatedAt *gtime.Time `json:"createdAt"` +} + +type WorkStatusProgressRes struct { + ID int `json:"id"` + WorkID string `json:"work_id"` + Name string `json:"name"` + Total int `json:"total" dc:"项目进度"` + Finished int `json:"finished" dc:"项目当前进度"` + // 是否为百分比 + IsPercent int `json:"is_percent"` + Startat string `json:"start_at"` + Endat string `json:"end_at"` + Status int `json:"status"` + WorkType int `json:"work_type"` + // 是否延期 + IsDelay *int `json:"is_delay,omitempty" dc:"是否延期"` + // 计划进度 + PlanProgress *PlanProgress `json:"plan_progress,omitempty"` + Children []WorkStatusProgressRes `json:"children,omitempty"` +} + +// 计划进度 +type PlanProgress struct { + // 当前进度 + Finished *int `json:"finished,omitempty"` + // 总量 + Total *int `json:"total,omitempty"` +} + +// 父子项目列表 +type WorkStatusTreeRes struct { + Name string `json:"name"` + ProjectID int `json:"projectId"` + Children []WorkStatusChild `json:"children"` +} + +// 所有子项目及其拥有的方阵列表 +// 树形结构 +type WorkStatusChild struct { + SubProjectID int `json:"sub_projectId" dc:"子项目ID"` + Name string `json:"name"` +} + +// 任务状态 +type WorkStatus struct { + // 主键ID + ID int `json:"id"` + Name string `json:"name"` + Status int `json:"status"` +} + +type SubProject struct { + // 子项目名 + Name string `json:"name"` + // 方阵列表 + MatrixList []Matrix `json:"list,omitempty"` +} + +// 方阵列表 +type Matrix struct { + // 方阵ID + MatrixID int `json:"id"` + // 方阵名 + MatrixName string `json:"name"` +} + +// 父项子项及其方阵列表 +type ProjectHierarchy struct { + // 父项名称 + Name string `json:"name"` + // 总进度 + TotalProgress int `json:"totalProgress"` + // 计划进度 + PlanProgress int `json:"planProgress"` + // 子项列表 + SubProjects []SubProject `json:"subProjects"` +} diff --git a/internal/app/system/model/xiangmuhuafenbiao.go b/internal/app/system/model/xiangmuhuafenbiao.go new file mode 100644 index 0000000..87d48db --- /dev/null +++ b/internal/app/system/model/xiangmuhuafenbiao.go @@ -0,0 +1,55 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-10-07 16:08:10 +// 生成路径: internal/app/system/model/xiangmuhuafenbiao.go +// 生成人:gfast +// desc:项目划分 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// XiangmuhuafenbiaoInfoRes is the golang structure for table xiangmuhuafenbiao. +type XiangmuhuafenbiaoInfoRes struct { + gmeta.Meta `orm:"table:xiangmuhuafenbiao"` + Id int64 `orm:"id,primary" json:"id"` // + Danweigongcheng string `orm:"danweigongcheng" json:"danweigongcheng"` // 单位 工程 + Zidanweigongcheng string `orm:"zidanweigongcheng" json:"zidanweigongcheng"` // 子单位工程 + Fenbugongcheng string `orm:"fenbugongcheng" json:"fenbugongcheng"` // 分部 工程 + Zifenbugongcheng string `orm:"zifenbugongcheng" json:"zifenbugongcheng"` // 子分部工程 + Fenxianggongcheng string `orm:"fenxianggongcheng" json:"fenxianggongcheng"` // 分项 工程 + Jianyanpi string `orm:"jianyanpi" json:"jianyanpi"` // 检验批 + Name string `orm:"name" json:"name"` // 工 程 项 目 名 称 + Zhixingbiaohao string `orm:"zhixingbiaohao" json:"zhixingbiaohao"` // 执行表号 + Json string `orm:"json" json:"json"` // json数据文件路径 + PrintStatus int64 `orm:"print_status" json:"printStatus"` // 打印状态 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreateddAt *gtime.Time `orm:"createdd_at" json:"createddAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type XiangmuhuafenbiaoListRes struct { + Id int64 `json:"id"` + Danweigongcheng string `json:"danweigongcheng"` + Zidanweigongcheng string `json:"zidanweigongcheng"` + Fenbugongcheng string `json:"fenbugongcheng"` + Zifenbugongcheng string `json:"zifenbugongcheng"` + Fenxianggongcheng string `json:"fenxianggongcheng"` + Jianyanpi string `json:"jianyanpi"` + Name string `json:"name"` + Zhixingbiaohao string `json:"zhixingbiaohao"` + Json string `json:"json"` + PrintStatus int64 `json:"printStatus"` + ProjectId int64 `json:"projectId"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreateddAt *gtime.Time `json:"createddAt"` +} diff --git a/internal/app/system/model/ys7devices.go b/internal/app/system/model/ys7devices.go new file mode 100644 index 0000000..fde856d --- /dev/null +++ b/internal/app/system/model/ys7devices.go @@ -0,0 +1,90 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-03-01 12:49:32 +// 生成路径: internal/app/system/model/ys7devices.go +// 生成人:gfast +// desc:荧石摄像头 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// Ys7DevicesInfoRes is the golang structure for table ys7devices. +type Ys7DevicesInfoRes struct { + gmeta.Meta `orm:"table:ys7devices"` + Id uint `orm:"id,primary" json:"id"` // id + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // + DeviceSerial string `orm:"DeviceSerial" json:"deviceSerial"` // 设备串号 + DeviceName string `orm:"DeviceName" json:"deviceName"` // 设备名称 + DeviceType string `orm:"DeviceType" json:"deviceType"` // 设备类型 + Status int `orm:"Status" json:"status"` // 状态 + Defence int64 `orm:"Defence" json:"defence"` // + DeviceVersion string `orm:"DeviceVersion" json:"deviceVersion"` // 设备版本 + ProjectId string `orm:"ProjectId" json:"projectId"` // 项目ID + Position string `orm:"Position" json:"position"` // 摄像头位置 + Detail string `orm:"Detail" json:"detail"` // 摄像头位置信息 + ReMark string `orm:"Remark" json:"remark"` // 备注 + VideoEncrypted int `orm:"VideoEncrypted" json:"videoEncrypted"` // 0:未加密 1:加密 + Sort int `orm:"Sort" json:"sort" ` //排序字段 +} + +type Ys7DevicesListRes struct { + Id uint `json:"id"` + CreatedAt *gtime.Time `json:"createdAt"` + DeviceSerial string `json:"deviceSerial"` + DeviceName string `json:"deviceName"` + DeviceType string `json:"deviceType"` + Status int `json:"status"` + Defence int64 `json:"defence"` + DeviceVersion string `json:"deviceVersion"` + ProjectId string `json:"projectId"` + Detail string `json:"detail" dc:"摄像头位置信息"` + SourceType string `json:"source_type" dc:"来源类型"` + SourceId string `json:"sourceId" dc:"deviceSerial"` + Token string `json:"token" dc:"token"` + Lag float64 `json:"lag" dc:"经度"` + Lat float64 `json:"lat" dc:"纬度"` + ReMark string `json:"remark" dc:"备注"` + VideoEncrypted int `json:"videoEncrypted" dc:"0:未加密 1:加密"` + Sort int `json:"sort" dc:"排序字段"` +} + +type Ys7DevicesList3Res struct { + Id uint `json:"id"` + CreatedAt *gtime.Time `json:"createdAt"` + DeviceSerial string `json:"deviceSerial"` + DeviceName string `json:"deviceName"` + DeviceType string `json:"deviceType"` + Status int `json:"status"` + Defence int64 `json:"defence"` + DeviceVersion string `json:"deviceVersion"` + ProjectId string `json:"projectId"` + Detail string `json:"detail" dc:"摄像头位置信息"` + SourceType string `json:"source_type" dc:"来源类型"` + SourceId string `json:"sourceId" dc:"deviceSerial"` + Token string `json:"token" dc:"token"` + Lag float64 `json:"lag" dc:"经度"` + Lat float64 `json:"lat" dc:"纬度"` + ReMark string `json:"remark" dc:"备注"` + VideoEncrypted int `json:"videoEncrypted" dc:"0:未加密 1:加密"` + Cover string `json:"cover" dc:"封面图"` +} + +type Ys7DevicesList2Res struct { + Id uint `json:"id"` + DeviceSerial string `json:"deviceSerial"` + DeviceName string `json:"deviceName"` + ProjectId string `json:"projectId"` + Token string `json:"token" dc:"token"` +} + +// 摄像头绑定项目 +type Ys7DevicesProject struct { + ProjectId string `json:"projectId" dc:"项目ID"` + DeviceSerial []string `json:"deviceSerial" dc:"设备串号 示例:["203490843","C25464274"]"` +} diff --git a/internal/app/system/model/ys7devices_img.go b/internal/app/system/model/ys7devices_img.go new file mode 100644 index 0000000..fd021f0 --- /dev/null +++ b/internal/app/system/model/ys7devices_img.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2024-08-19 11:51:53 +// 生成路径: internal/app/system/model/ys7devices_img.go +// 生成人:gfast +// desc:摄像头所拍摄到的所有图片(每月会定时清除) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// Ys7DevicesImgInfoRes is the golang structure for table ys7devices_img. +type Ys7DevicesImgInfoRes struct { + gmeta.Meta `orm:"table:ys7devices_img"` + Id uint64 `orm:"id,primary" json:"id"` // 主键ID + FatherId uint64 `orm:"father_id" json:"fatherId"` // 父id + Name string `orm:"name" json:"name"` // 摄像头名称 + Path string `orm:"path" json:"path"` // 图片路径 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 拍摄时间 +} + +type Ys7DevicesImgListRes struct { + Id uint64 `json:"id"` + FatherId uint64 `json:"fatherId"` + Name string `json:"name"` + Path string `json:"path"` + CreatedAt *gtime.Time `json:"createdAt"` +} diff --git a/internal/app/system/model/zmkg_gis_model_lib.go b/internal/app/system/model/zmkg_gis_model_lib.go new file mode 100644 index 0000000..fd149ea --- /dev/null +++ b/internal/app/system/model/zmkg_gis_model_lib.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-07-31 10:18:14 +// 生成路径: internal/app/system/model/zmkg_gis_model_lib.go +// 生成人:gfast +// desc:模型库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// ZmkgGisModelLibInfoRes is the golang structure for table zmkg_gis_model_lib. +type ZmkgGisModelLibInfoRes struct { + gmeta.Meta `orm:"table:zmkg_gis_model_lib"` + Id int `orm:"id,primary" json:"id"` // 序号 + ModelId string `orm:"model_id" json:"modelId"` // 模型id + ModelName string `orm:"model_name" json:"modelName"` // 模型名称 + Url string `orm:"url" json:"url"` // 模型地址 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreateAt *gtime.Time `orm:"create_at" json:"createAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type ZmkgGisModelLibListRes struct { + Id int `json:"id"` + ModelId string `json:"modelId"` + ModelName string `json:"modelName"` + Url string `json:"url"` + CreateAt *gtime.Time `json:"createAt"` +} diff --git a/internal/app/system/packed/packed.go b/internal/app/system/packed/packed.go new file mode 100644 index 0000000..e20ab1e --- /dev/null +++ b/internal/app/system/packed/packed.go @@ -0,0 +1 @@ +package packed diff --git a/internal/app/system/router/app_menus.go b/internal/app/system/router/app_menus.go new file mode 100644 index 0000000..ee2c69d --- /dev/null +++ b/internal/app/system/router/app_menus.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-05-28 15:09:13 +// 生成路径: internal/app/system/router/app_menus.go +// 生成人:gfast +// desc:app菜单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindAppMenusController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/appMenus", func(group *ghttp.RouterGroup) { + group.Bind( + controller.AppMenus, + ) + }) +} diff --git a/internal/app/system/router/app_role_menus.go b/internal/app/system/router/app_role_menus.go new file mode 100644 index 0000000..9a561bd --- /dev/null +++ b/internal/app/system/router/app_role_menus.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-05-28 15:11:15 +// 生成路径: internal/app/system/router/app_role_menus.go +// 生成人:gfast +// desc:app角色绑定菜单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindAppRoleMenusController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/appRoleMenus", func(group *ghttp.RouterGroup) { + group.Bind( + controller.AppRoleMenus, + ) + }) +} diff --git a/internal/app/system/router/app_roles.go b/internal/app/system/router/app_roles.go new file mode 100644 index 0000000..0d3c150 --- /dev/null +++ b/internal/app/system/router/app_roles.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-05-28 15:11:36 +// 生成路径: internal/app/system/router/app_roles.go +// 生成人:gfast +// desc:app角色 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindAppRolesController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/appRoles", func(group *ghttp.RouterGroup) { + group.Bind( + controller.AppRoles, + ) + }) +} diff --git a/internal/app/system/router/app_user_disable_menus.go b/internal/app/system/router/app_user_disable_menus.go new file mode 100644 index 0000000..e36adb5 --- /dev/null +++ b/internal/app/system/router/app_user_disable_menus.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-05-28 15:11:37 +// 生成路径: internal/app/system/router/app_user_disable_menus.go +// 生成人:gfast +// desc:app用户禁用菜单关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindAppUserDisableMenusController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/appUserDisableMenus", func(group *ghttp.RouterGroup) { + group.Bind( + controller.AppUserDisableMenus, + ) + }) +} diff --git a/internal/app/system/router/app_user_menus.go b/internal/app/system/router/app_user_menus.go new file mode 100644 index 0000000..e43563a --- /dev/null +++ b/internal/app/system/router/app_user_menus.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-05-28 15:11:37 +// 生成路径: internal/app/system/router/app_user_menus.go +// 生成人:gfast +// desc:app用户菜单关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindAppUserMenusController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/appUserMenus", func(group *ghttp.RouterGroup) { + group.Bind( + controller.AppUserMenus, + ) + }) +} diff --git a/internal/app/system/router/app_user_roles.go b/internal/app/system/router/app_user_roles.go new file mode 100644 index 0000000..6c507f5 --- /dev/null +++ b/internal/app/system/router/app_user_roles.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-05-28 15:11:37 +// 生成路径: internal/app/system/router/app_user_roles.go +// 生成人:gfast +// desc:app用户角色关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindAppUserRolesController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/appUserRoles", func(group *ghttp.RouterGroup) { + group.Bind( + controller.AppUserRoles, + ) + }) +} diff --git a/internal/app/system/router/bus_askforleave.go b/internal/app/system/router/bus_askforleave.go new file mode 100644 index 0000000..1a3881f --- /dev/null +++ b/internal/app/system/router/bus_askforleave.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2025-03-27 14:14:25 +// 生成路径: internal/app/wxApplet/router/bus_askforleave.go +// 生成人:gfast +// desc:请假 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusAskforleaveController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busAskforleave", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusAskforleave, + ) + }) +} diff --git a/internal/app/system/router/bus_attendance_machine.go b/internal/app/system/router/bus_attendance_machine.go new file mode 100644 index 0000000..49fa806 --- /dev/null +++ b/internal/app/system/router/bus_attendance_machine.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2025-03-03 10:32:47 +// 生成路径: internal/app/system/router/bus_attendance_machine.go +// 生成人:gfast +// desc:考勤机 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusAttendanceMachineController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busAttendanceMachine", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusAttendanceMachine, + ) + }) +} diff --git a/internal/app/system/router/bus_attendance_machine_user.go b/internal/app/system/router/bus_attendance_machine_user.go new file mode 100644 index 0000000..d41b461 --- /dev/null +++ b/internal/app/system/router/bus_attendance_machine_user.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2025-03-03 10:33:17 +// 生成路径: internal/app/system/router/bus_attendance_machine_user.go +// 生成人:gfast +// desc:考勤机用户列 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusAttendanceMachineUserController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busAttendanceMachineUser", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusAttendanceMachineUser, + ) + }) +} diff --git a/internal/app/system/router/bus_category.go b/internal/app/system/router/bus_category.go new file mode 100644 index 0000000..4befed0 --- /dev/null +++ b/internal/app/system/router/bus_category.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-10-07 15:52:19 +// 生成路径: internal/app/system/router/bus_category.go +// 生成人:gfast +// desc:题库_题库类别 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusCategoryController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busCategory", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusCategory, + ) + }) +} diff --git a/internal/app/system/router/bus_company.go b/internal/app/system/router/bus_company.go new file mode 100644 index 0000000..08c54b0 --- /dev/null +++ b/internal/app/system/router/bus_company.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-28 14:08:14 +// 生成路径: internal/app/system/router/bus_company.go +// 生成人:gfast +// desc:公司 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusCompanyController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busCompany", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusCompany, + ) + }) +} diff --git a/internal/app/system/router/bus_complaint_box.go b/internal/app/system/router/bus_complaint_box.go new file mode 100644 index 0000000..ed025df --- /dev/null +++ b/internal/app/system/router/bus_complaint_box.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-12-04 18:09:50 +// 生成路径: internal/app/system/router/bus_complaint_box.go +// 生成人:gfast +// desc:意见箱 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusComplaintBoxController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busComplaintBox", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusComplaintBox, + ) + }) +} diff --git a/internal/app/system/router/bus_construction_blacklist.go b/internal/app/system/router/bus_construction_blacklist.go new file mode 100644 index 0000000..9db86f2 --- /dev/null +++ b/internal/app/system/router/bus_construction_blacklist.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-11-10 14:08:39 +// 生成路径: internal/app/system/router/bus_construction_blacklist.go +// 生成人:gfast +// desc:黑名单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusConstructionBlacklistController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busConstructionBlacklist", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusConstructionBlacklist, + ) + }) +} diff --git a/internal/app/system/router/bus_construction_log.go b/internal/app/system/router/bus_construction_log.go new file mode 100644 index 0000000..f442f02 --- /dev/null +++ b/internal/app/system/router/bus_construction_log.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-03-22 16:27:43 +// 生成路径: internal/app/system/router/bus_construction_log.go +// 生成人:gfast +// desc:施工日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusConstructionLogController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busConstructionLog", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusConstructionLog, + ) + }) +} diff --git a/internal/app/system/router/bus_construction_project.go b/internal/app/system/router/bus_construction_project.go new file mode 100644 index 0000000..cf44927 --- /dev/null +++ b/internal/app/system/router/bus_construction_project.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-07 10:17:50 +// 生成路径: internal/app/system/router/bus_construction_project.go +// 生成人:gfast +// desc:施工人员对应项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusConstructionProjectController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busConstructionProject", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusConstructionProject, + ) + }) +} diff --git a/internal/app/system/router/bus_construction_user.go b/internal/app/system/router/bus_construction_user.go new file mode 100644 index 0000000..f15230e --- /dev/null +++ b/internal/app/system/router/bus_construction_user.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-07 10:31:18 +// 生成路径: internal/app/system/router/bus_construction_user.go +// 生成人:gfast +// desc:施工人员 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusConstructionUserController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busConstructionUser", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusConstructionUser, + ) + }) +} diff --git a/internal/app/system/router/bus_construction_user_file.go b/internal/app/system/router/bus_construction_user_file.go new file mode 100644 index 0000000..b435c97 --- /dev/null +++ b/internal/app/system/router/bus_construction_user_file.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-07 10:17:41 +// 生成路径: internal/app/system/router/bus_construction_user_file.go +// 生成人:gfast +// desc:微信用户的文件存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusConstructionUserFileController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busConstructionUserFile", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusConstructionUserFile, + ) + }) +} diff --git a/internal/app/system/router/bus_construction_user_post.go b/internal/app/system/router/bus_construction_user_post.go new file mode 100644 index 0000000..4b17176 --- /dev/null +++ b/internal/app/system/router/bus_construction_user_post.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-07 10:06:34 +// 生成路径: internal/app/system/router/bus_construction_user_post.go +// 生成人:gfast +// desc:施工人员岗位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusConstructionUserPostController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busConstructionUserPost", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusConstructionUserPost, + ) + }) +} diff --git a/internal/app/system/router/bus_corporate_events.go b/internal/app/system/router/bus_corporate_events.go new file mode 100644 index 0000000..5049fce --- /dev/null +++ b/internal/app/system/router/bus_corporate_events.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-03-20 16:49:36 +// 生成路径: internal/app/system/router/bus_corporate_events.go +// 生成人:gfast +// desc:企业大事记 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusCorporateEventsController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busCorporateEvents", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusCorporateEvents, + ) + }) +} diff --git a/internal/app/system/router/bus_design_audit.go b/internal/app/system/router/bus_design_audit.go new file mode 100644 index 0000000..f431829 --- /dev/null +++ b/internal/app/system/router/bus_design_audit.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-04-09 15:40:16 +// 生成路径: internal/app/system/router/bus_design_audit.go +// 生成人:gfast +// desc:设计审核(竣工、施工、可研) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusDesignAuditController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busDesignAudit", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusDesignAudit, + ) + }) +} diff --git a/internal/app/system/router/bus_design_document.go b/internal/app/system/router/bus_design_document.go new file mode 100644 index 0000000..8c19b6f --- /dev/null +++ b/internal/app/system/router/bus_design_document.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-29 16:31:29 +// 生成路径: internal/app/system/router/bus_design_document.go +// 生成人:gfast +// desc:设计管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusDesignDocumentController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busDesignDocument", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusDesignDocument, + ) + }) +} diff --git a/internal/app/system/router/bus_design_period_range.go b/internal/app/system/router/bus_design_period_range.go new file mode 100644 index 0000000..b3fdb62 --- /dev/null +++ b/internal/app/system/router/bus_design_period_range.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-04-11 17:28:54 +// 生成路径: internal/app/system/router/bus_design_period_range.go +// 生成人:gfast +// desc:设计-周期范围 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusDesignPeriodRangeController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busDesignPeriodRange", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusDesignPeriodRange, + ) + }) +} diff --git a/internal/app/system/router/bus_engineering_quality.go b/internal/app/system/router/bus_engineering_quality.go new file mode 100644 index 0000000..9825fd9 --- /dev/null +++ b/internal/app/system/router/bus_engineering_quality.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-29 09:31:22 +// 生成路径: internal/app/system/router/bus_engineering_quality.go +// 生成人:gfast +// desc:工程质量列 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusEngineeringQualityController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busEngineeringQuality", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusEngineeringQuality, + ) + }) +} diff --git a/internal/app/system/router/bus_equipment_equipment_unpacking.go b/internal/app/system/router/bus_equipment_equipment_unpacking.go new file mode 100644 index 0000000..a38c0f6 --- /dev/null +++ b/internal/app/system/router/bus_equipment_equipment_unpacking.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-29 11:14:45 +// 生成路径: internal/app/system/router/bus_equipment_equipment_unpacking.go +// 生成人:gfast +// desc:开箱记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusEquipmentEquipmentUnpackingController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busEquipmentEquipmentUnpacking", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusEquipmentEquipmentUnpacking, + ) + }) +} diff --git a/internal/app/system/router/bus_equipment_materials.go b/internal/app/system/router/bus_equipment_materials.go new file mode 100644 index 0000000..039a763 --- /dev/null +++ b/internal/app/system/router/bus_equipment_materials.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-29 11:14:16 +// 生成路径: internal/app/system/router/bus_equipment_materials.go +// 生成人:gfast +// desc:材料/设备名称 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusEquipmentMaterialsController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busEquipmentMaterials", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusEquipmentMaterials, + ) + }) +} diff --git a/internal/app/system/router/bus_equipment_materials_inventory.go b/internal/app/system/router/bus_equipment_materials_inventory.go new file mode 100644 index 0000000..8a4e40e --- /dev/null +++ b/internal/app/system/router/bus_equipment_materials_inventory.go @@ -0,0 +1,25 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-09-13 14:21:30 +// 生成路径: internal/app/system/router/bus_equipment_materials_inventory.go +// 生成人:gfast +// desc:设备材料入库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusEquipmentMaterialsInventoryController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busEquipmentMaterialsInventory", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusEquipmentMaterialsInventory, + controller.BusEquipmentMaterialsExcel, + ) + }) +} diff --git a/internal/app/system/router/bus_essential_information.go b/internal/app/system/router/bus_essential_information.go new file mode 100644 index 0000000..ca3c211 --- /dev/null +++ b/internal/app/system/router/bus_essential_information.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-03-20 19:38:54 +// 生成路径: internal/app/system/router/bus_essential_information.go +// 生成人:gfast +// desc:项目基本信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusEssentialInformationController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busEssentialInformation", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusEssentialInformation, + ) + }) +} diff --git a/internal/app/system/router/bus_folder.go b/internal/app/system/router/bus_folder.go new file mode 100644 index 0000000..46880f1 --- /dev/null +++ b/internal/app/system/router/bus_folder.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-09-15 17:15:59 +// 生成路径: internal/app/system/router/bus_folder.go +// 生成人:gfast +// desc:文件夹 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusFolderController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busFolder", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusFolder, + ) + }) +} diff --git a/internal/app/system/router/bus_folder_file.go b/internal/app/system/router/bus_folder_file.go new file mode 100644 index 0000000..1683aee --- /dev/null +++ b/internal/app/system/router/bus_folder_file.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-09-15 17:16:00 +// 生成路径: internal/app/system/router/bus_folder_file.go +// 生成人:gfast +// desc:文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusFolderFileController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busFolderFile", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusFolderFile, + ) + }) +} diff --git a/internal/app/system/router/bus_hse_management.go b/internal/app/system/router/bus_hse_management.go new file mode 100644 index 0000000..f915dcb --- /dev/null +++ b/internal/app/system/router/bus_hse_management.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-03-28 14:53:05 +// 生成路径: internal/app/system/router/bus_hse_management.go +// 生成人:gfast +// desc:HSE-巡检工单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusHseManagementController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busHseManagement", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusHseManagement, + ) + }) +} diff --git a/internal/app/system/router/bus_hse_security_log.go b/internal/app/system/router/bus_hse_security_log.go new file mode 100644 index 0000000..9175425 --- /dev/null +++ b/internal/app/system/router/bus_hse_security_log.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-04-07 17:00:45 +// 生成路径: internal/app/system/router/bus_hse_security_log.go +// 生成人:gfast +// desc:HSE安全日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusHseSecurityLogController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busHseSecurityLog", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusHseSecurityLog, + ) + }) +} diff --git a/internal/app/system/router/bus_inspection_ticket.go b/internal/app/system/router/bus_inspection_ticket.go new file mode 100644 index 0000000..07c57bd --- /dev/null +++ b/internal/app/system/router/bus_inspection_ticket.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-03-21 15:23:59 +// 生成路径: internal/app/system/router/bus_inspection_ticket.go +// 生成人:gfast +// desc:质量工单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusInspectionTicketController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busInspectionTicket", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusInspectionTicket, + ) + }) +} diff --git a/internal/app/system/router/bus_machinery.go b/internal/app/system/router/bus_machinery.go new file mode 100644 index 0000000..45eb44a --- /dev/null +++ b/internal/app/system/router/bus_machinery.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-29 14:02:01 +// 生成路径: internal/app/system/router/bus_machinery.go +// 生成人:gfast +// desc:机械 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusMachineryController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busMachinery", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusMachinery, + ) + }) +} diff --git a/internal/app/system/router/bus_machinery_detail.go b/internal/app/system/router/bus_machinery_detail.go new file mode 100644 index 0000000..9e24ab4 --- /dev/null +++ b/internal/app/system/router/bus_machinery_detail.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-10-12 11:41:32 +// 生成路径: internal/app/system/router/bus_machinery_detail.go +// 生成人:gfast +// desc:机械详情 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusMachineryDetailController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busMachineryDetail", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusMachineryDetail, + ) + }) +} diff --git a/internal/app/system/router/bus_payroll_list.go b/internal/app/system/router/bus_payroll_list.go new file mode 100644 index 0000000..f1c6ae3 --- /dev/null +++ b/internal/app/system/router/bus_payroll_list.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-11-20 13:51:38 +// 生成路径: internal/app/system/router/bus_payroll_list.go +// 生成人:gfast +// desc:工资(excel导入形成的) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusPayrollListController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busPayrollList", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusPayrollList, + ) + }) +} diff --git a/internal/app/system/router/bus_projectin_progress.go b/internal/app/system/router/bus_projectin_progress.go new file mode 100644 index 0000000..01606a2 --- /dev/null +++ b/internal/app/system/router/bus_projectin_progress.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-03-20 19:45:19 +// 生成路径: internal/app/system/router/bus_projectin_progress.go +// 生成人:gfast +// desc:在建项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusProjectinProgressController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busProjectinProgress", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusProjectinProgress, + ) + }) +} diff --git a/internal/app/system/router/bus_quality.go b/internal/app/system/router/bus_quality.go new file mode 100644 index 0000000..8bafc2d --- /dev/null +++ b/internal/app/system/router/bus_quality.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-02 17:11:39 +// 生成路径: internal/app/system/router/bus_quality.go +// 生成人:gfast +// desc:质量文档管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusQualityController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busQuality", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusQuality, + ) + }) +} diff --git a/internal/app/system/router/bus_question_bank.go b/internal/app/system/router/bus_question_bank.go new file mode 100644 index 0000000..8c5c584 --- /dev/null +++ b/internal/app/system/router/bus_question_bank.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-10-07 15:52:18 +// 生成路径: internal/app/system/router/bus_question_bank.go +// 生成人:gfast +// desc:题库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusQuestionBankController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busQuestionBank", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusQuestionBank, + ) + }) +} diff --git a/internal/app/system/router/bus_question_save.go b/internal/app/system/router/bus_question_save.go new file mode 100644 index 0000000..3c1ec00 --- /dev/null +++ b/internal/app/system/router/bus_question_save.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-11-01 17:33:04 +// 生成路径: internal/app/system/router/bus_question_save.go +// 生成人:gfast +// desc:用户试卷存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusQuestionSaveController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busQuestionSave", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusQuestionSave, + ) + }) +} diff --git a/internal/app/system/router/bus_questions_configuration.go b/internal/app/system/router/bus_questions_configuration.go new file mode 100644 index 0000000..a7f7ca5 --- /dev/null +++ b/internal/app/system/router/bus_questions_configuration.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-10-07 17:11:20 +// 生成路径: internal/app/system/router/bus_questions_configuration.go +// 生成人:gfast +// desc:题库配置 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusQuestionsConfigurationController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busQuestionsConfiguration", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusQuestionsConfiguration, + ) + }) +} diff --git a/internal/app/system/router/bus_reissue_a_card.go b/internal/app/system/router/bus_reissue_a_card.go new file mode 100644 index 0000000..93adc74 --- /dev/null +++ b/internal/app/system/router/bus_reissue_a_card.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-02-02 15:18:48 +// 生成路径: internal/app/system/router/bus_reissue_a_card.go +// 生成人:gfast +// desc:施工人员补卡申请 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusReissueACardController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busReissueACard", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusReissueACard, + ) + }) +} diff --git a/internal/app/system/router/bus_research_document.go b/internal/app/system/router/bus_research_document.go new file mode 100644 index 0000000..f008f24 --- /dev/null +++ b/internal/app/system/router/bus_research_document.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-29 16:04:06 +// 生成路径: internal/app/system/router/bus_research_document.go +// 生成人:gfast +// desc:科研文档 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusResearchDocumentController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busResearchDocument", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusResearchDocument, + ) + }) +} diff --git a/internal/app/system/router/bus_safety.go b/internal/app/system/router/bus_safety.go new file mode 100644 index 0000000..4753a87 --- /dev/null +++ b/internal/app/system/router/bus_safety.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-02 15:40:48 +// 生成路径: internal/app/system/router/bus_safety.go +// 生成人:gfast +// desc:安全例会管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusSafetyController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busSafety", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusSafety, + ) + }) +} diff --git a/internal/app/system/router/bus_salary_details.go b/internal/app/system/router/bus_salary_details.go new file mode 100644 index 0000000..d11f7a0 --- /dev/null +++ b/internal/app/system/router/bus_salary_details.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-02-01 16:39:01 +// 生成路径: internal/app/system/router/bus_salary_details.go +// 生成人:gfast +// desc:员工工资考核记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusSalaryDetailsController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busSalaryDetails", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusSalaryDetails, + ) + }) +} diff --git a/internal/app/system/router/bus_scheduled_plan_type.go b/internal/app/system/router/bus_scheduled_plan_type.go new file mode 100644 index 0000000..26e13da --- /dev/null +++ b/internal/app/system/router/bus_scheduled_plan_type.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-29 17:39:12 +// 生成路径: internal/app/system/router/bus_scheduled_plan_type.go +// 生成人:gfast +// desc:施工进度分类 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusScheduledPlanTypeController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busScheduledPlanType", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusScheduledPlanType, + ) + }) +} diff --git a/internal/app/system/router/bus_scheduled_plan_type_detail.go b/internal/app/system/router/bus_scheduled_plan_type_detail.go new file mode 100644 index 0000000..43e4ca7 --- /dev/null +++ b/internal/app/system/router/bus_scheduled_plan_type_detail.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-29 17:15:28 +// 生成路径: internal/app/system/router/bus_scheduled_plan_type_detail.go +// 生成人:gfast +// desc:施工进度月报,年报分类 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusScheduledPlanTypeDetailController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busScheduledPlanTypeDetail", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusScheduledPlanTypeDetail, + ) + }) +} diff --git a/internal/app/system/router/bus_scheduled_weekly.go b/internal/app/system/router/bus_scheduled_weekly.go new file mode 100644 index 0000000..a0366a7 --- /dev/null +++ b/internal/app/system/router/bus_scheduled_weekly.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-02 15:28:49 +// 生成路径: internal/app/system/router/bus_scheduled_weekly.go +// 生成人:gfast +// desc:周报 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusScheduledWeeklyController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busScheduledWeekly", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusScheduledWeekly, + ) + }) +} diff --git a/internal/app/system/router/bus_scheduled_weekly_photovoltaic.go b/internal/app/system/router/bus_scheduled_weekly_photovoltaic.go new file mode 100644 index 0000000..05531e8 --- /dev/null +++ b/internal/app/system/router/bus_scheduled_weekly_photovoltaic.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-02 15:21:55 +// 生成路径: internal/app/system/router/bus_scheduled_weekly_photovoltaic.go +// 生成人:gfast +// desc:周报-光伏板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusScheduledWeeklyPhotovoltaicController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busScheduledWeeklyPhotovoltaic", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusScheduledWeeklyPhotovoltaic, + ) + }) +} diff --git a/internal/app/system/router/bus_standing_book.go b/internal/app/system/router/bus_standing_book.go new file mode 100644 index 0000000..9c1ca25 --- /dev/null +++ b/internal/app/system/router/bus_standing_book.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-29 11:36:04 +// 生成路径: internal/app/system/router/bus_standing_book.go +// 生成人:gfast +// desc:台账 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusStandingBookController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busStandingBook", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusStandingBook, + ) + }) +} diff --git a/internal/app/system/router/bus_tour.go b/internal/app/system/router/bus_tour.go new file mode 100644 index 0000000..df26af7 --- /dev/null +++ b/internal/app/system/router/bus_tour.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-10-10 12:11:05 +// 生成路径: internal/app/system/router/bus_tour.go +// 生成人:gfast +// desc:煤科巡视-故障记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusTourController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busTour", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusTour, + ) + }) +} diff --git a/internal/app/system/router/bus_type_of_wage.go b/internal/app/system/router/bus_type_of_wage.go new file mode 100644 index 0000000..bcf8db6 --- /dev/null +++ b/internal/app/system/router/bus_type_of_wage.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-09-05 10:07:11 +// 生成路径: internal/app/system/router/bus_type_of_wage.go +// 生成人:gfast +// desc:工种薪水 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusTypeOfWageController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busTypeOfWage", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusTypeOfWage, + ) + }) +} diff --git a/internal/app/system/router/bus_violation_level.go b/internal/app/system/router/bus_violation_level.go new file mode 100644 index 0000000..977659a --- /dev/null +++ b/internal/app/system/router/bus_violation_level.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-11-20 11:18:36 +// 生成路径: internal/app/system/router/bus_violation_level.go +// 生成人:gfast +// desc:违章等级 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusViolationLevelController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busViolationLevel", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusViolationLevel, + ) + }) +} diff --git a/internal/app/system/router/bus_violation_record.go b/internal/app/system/router/bus_violation_record.go new file mode 100644 index 0000000..63fdca1 --- /dev/null +++ b/internal/app/system/router/bus_violation_record.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-11-20 11:18:37 +// 生成路径: internal/app/system/router/bus_violation_record.go +// 生成人:gfast +// desc:违章记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusViolationRecordController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busViolationRecord", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusViolationRecord, + ) + }) +} diff --git a/internal/app/system/router/bus_weekly_security_report.go b/internal/app/system/router/bus_weekly_security_report.go new file mode 100644 index 0000000..acfd83a --- /dev/null +++ b/internal/app/system/router/bus_weekly_security_report.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-04-02 18:03:23 +// 生成路径: internal/app/system/router/bus_weekly_security_report.go +// 生成人:gfast +// desc:安全周期 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindBusWeeklySecurityReportController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busWeeklySecurityReport", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusWeeklySecurityReport, + ) + }) +} diff --git a/internal/app/system/router/comment_list.go b/internal/app/system/router/comment_list.go new file mode 100644 index 0000000..b74679a --- /dev/null +++ b/internal/app/system/router/comment_list.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-05-14 10:21:06 +// 生成路径: internal/app/system/router/comment_list.go +// 生成人:gfast +// desc:App消息-评论 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindCommentListController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/commentList", func(group *ghttp.RouterGroup) { + group.Bind( + controller.CommentList, + ) + }) +} diff --git a/internal/app/system/router/comments.go b/internal/app/system/router/comments.go new file mode 100644 index 0000000..d051c92 --- /dev/null +++ b/internal/app/system/router/comments.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-04-23 14:47:24 +// 生成路径: internal/app/system/router/comments.go +// 生成人:gfast +// desc:App通知公告评论 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindCommentsController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/comments", func(group *ghttp.RouterGroup) { + group.Bind( + controller.Comments, + ) + }) +} diff --git a/internal/app/system/router/construction_details.go b/internal/app/system/router/construction_details.go new file mode 100644 index 0000000..13cf860 --- /dev/null +++ b/internal/app/system/router/construction_details.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-03-13 18:10:56 +// 生成路径: internal/app/system/router/construction_details.go +// 生成人:gfast +// desc:施工类别详情 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindConstructionDetailsController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/constructionDetails", func(group *ghttp.RouterGroup) { + group.Bind( + controller.ConstructionDetails, + ) + }) +} diff --git a/internal/app/system/router/construction_project.go b/internal/app/system/router/construction_project.go new file mode 100644 index 0000000..36c9eca --- /dev/null +++ b/internal/app/system/router/construction_project.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-03-13 17:36:45 +// 生成路径: internal/app/system/router/construction_project.go +// 生成人:gfast +// desc:施工项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindConstructionProjectController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/constructionProject", func(group *ghttp.RouterGroup) { + group.Bind( + controller.ConstructionProject, + ) + }) +} diff --git a/internal/app/system/router/device.go b/internal/app/system/router/device.go new file mode 100644 index 0000000..7a2978a --- /dev/null +++ b/internal/app/system/router/device.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-11-24 09:57:07 +// 生成路径: internal/app/system/router/device.go +// 生成人:gfast +// desc:安全帽设备(java) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindDeviceController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/device", func(group *ghttp.RouterGroup) { + group.Bind( + controller.Device, + ) + }) +} diff --git a/internal/app/system/router/device_preset.go b/internal/app/system/router/device_preset.go new file mode 100644 index 0000000..b0199bf --- /dev/null +++ b/internal/app/system/router/device_preset.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-03-01 12:50:08 +// 生成路径: internal/app/system/router/device_preset.go +// 生成人:gfast +// desc:预置位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindDevicePresetController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/devicePreset", func(group *ghttp.RouterGroup) { + group.Bind( + controller.DevicePreset, + ) + }) +} diff --git a/internal/app/system/router/document.go b/internal/app/system/router/document.go new file mode 100644 index 0000000..d031908 --- /dev/null +++ b/internal/app/system/router/document.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-09-16 10:32:04 +// 生成路径: internal/app/system/router/document.go +// 生成人:gfast +// desc:母板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindDocumentController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/document", func(group *ghttp.RouterGroup) { + group.Bind( + controller.Document, + ) + }) +} diff --git a/internal/app/system/router/document_completion.go b/internal/app/system/router/document_completion.go new file mode 100644 index 0000000..76e314c --- /dev/null +++ b/internal/app/system/router/document_completion.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-03-15 10:25:00 +// 生成路径: internal/app/system/router/document_completion.go +// 生成人:gfast +// desc:竣工图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindDocumentCompletionController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/documentCompletion", func(group *ghttp.RouterGroup) { + group.Bind( + controller.DocumentCompletion, + ) + }) +} diff --git a/internal/app/system/router/document_data.go b/internal/app/system/router/document_data.go new file mode 100644 index 0000000..21f35f5 --- /dev/null +++ b/internal/app/system/router/document_data.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-12-27 09:30:04 +// 生成路径: internal/app/system/router/document_data.go +// 生成人:gfast +// desc:工程资料>资料 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindDocumentDataController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/documentData", func(group *ghttp.RouterGroup) { + group.Bind( + controller.DocumentData, + ) + }) +} diff --git a/internal/app/system/router/document_production_drawing.go b/internal/app/system/router/document_production_drawing.go new file mode 100644 index 0000000..e486bd6 --- /dev/null +++ b/internal/app/system/router/document_production_drawing.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-03-15 10:24:54 +// 生成路径: internal/app/system/router/document_production_drawing.go +// 生成人:gfast +// desc:施工图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindDocumentProductionDrawingController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/documentProductionDrawing", func(group *ghttp.RouterGroup) { + group.Bind( + controller.DocumentProductionDrawing, + ) + }) +} diff --git a/internal/app/system/router/document_quality_meeting.go b/internal/app/system/router/document_quality_meeting.go new file mode 100644 index 0000000..98afb39 --- /dev/null +++ b/internal/app/system/router/document_quality_meeting.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-03-25 16:43:56 +// 生成路径: internal/app/system/router/document_quality_meeting.go +// 生成人:gfast +// desc:质量会议 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindDocumentQualityMeetingController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/documentQualityMeeting", func(group *ghttp.RouterGroup) { + group.Bind( + controller.DocumentQualityMeeting, + ) + }) +} diff --git a/internal/app/system/router/document_report.go b/internal/app/system/router/document_report.go new file mode 100644 index 0000000..ce0e368 --- /dev/null +++ b/internal/app/system/router/document_report.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-03-15 10:24:21 +// 生成路径: internal/app/system/router/document_report.go +// 生成人:gfast +// desc:科研及专题报告 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindDocumentReportController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/documentReport", func(group *ghttp.RouterGroup) { + group.Bind( + controller.DocumentReport, + ) + }) +} diff --git a/internal/app/system/router/document_safety_meeting.go b/internal/app/system/router/document_safety_meeting.go new file mode 100644 index 0000000..7991289 --- /dev/null +++ b/internal/app/system/router/document_safety_meeting.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-04-09 11:40:21 +// 生成路径: internal/app/system/router/document_safety_meeting.go +// 生成人:gfast +// desc:安全会议 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindDocumentSafetyMeetingController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/documentSafetyMeeting", func(group *ghttp.RouterGroup) { + group.Bind( + controller.DocumentSafetyMeeting, + ) + }) +} diff --git a/internal/app/system/router/manage_airline.go b/internal/app/system/router/manage_airline.go new file mode 100644 index 0000000..7c2f1de --- /dev/null +++ b/internal/app/system/router/manage_airline.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-12-11 16:10:19 +// 生成路径: internal/app/system/router/manage_airline.go +// 生成人:gfast +// desc:航线 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindManageAirlineController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/manageAirline", func(group *ghttp.RouterGroup) { + group.Bind( + controller.ManageAirline, + ) + }) +} diff --git a/internal/app/system/router/manage_device.go b/internal/app/system/router/manage_device.go new file mode 100644 index 0000000..c2823dc --- /dev/null +++ b/internal/app/system/router/manage_device.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-11-14 10:53:21 +// 生成路径: internal/app/system/router/manage_device.go +// 生成人:gfast +// desc:设备信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindManageDeviceController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/manageDevice", func(group *ghttp.RouterGroup) { + group.Bind( + controller.ManageDevice, + ) + }) +} diff --git a/internal/app/system/router/manage_operation_log.go b/internal/app/system/router/manage_operation_log.go new file mode 100644 index 0000000..1f1045f --- /dev/null +++ b/internal/app/system/router/manage_operation_log.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-06-21 15:23:29 +// 生成路径: internal/app/system/router/manage_operation_log.go +// 生成人:gfast +// desc:无人机指令日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindManageOperationLogController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/manageOperationLog", func(group *ghttp.RouterGroup) { + group.Bind( + controller.ManageOperationLog, + ) + }) +} diff --git a/internal/app/system/router/manage_task.go b/internal/app/system/router/manage_task.go new file mode 100644 index 0000000..d51daed --- /dev/null +++ b/internal/app/system/router/manage_task.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-12-12 15:21:22 +// 生成路径: internal/app/system/router/manage_task.go +// 生成人:gfast +// desc:航线任务下发 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindManageTaskController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/manageTask", func(group *ghttp.RouterGroup) { + group.Bind( + controller.ManageTask, + ) + }) +} diff --git a/internal/app/system/router/manage_task_cron.go b/internal/app/system/router/manage_task_cron.go new file mode 100644 index 0000000..af12126 --- /dev/null +++ b/internal/app/system/router/manage_task_cron.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-06-04 14:33:05 +// 生成路径: internal/app/system/router/manage_task_cron.go +// 生成人:gfast +// desc:航线任务定时飞行 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindManageTaskCronController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/manageTaskCron", func(group *ghttp.RouterGroup) { + group.Bind( + controller.ManageTaskCron, + ) + }) +} diff --git a/internal/app/system/router/manage_task_record.go b/internal/app/system/router/manage_task_record.go new file mode 100644 index 0000000..9e3d809 --- /dev/null +++ b/internal/app/system/router/manage_task_record.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-12-12 17:56:19 +// 生成路径: internal/app/system/router/manage_task_record.go +// 生成人:gfast +// desc:航线任务下发-记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindManageTaskRecordController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/manageTaskRecord", func(group *ghttp.RouterGroup) { + group.Bind( + controller.ManageTaskRecord, + ) + }) +} diff --git a/internal/app/system/router/manage_task_record_resource.go b/internal/app/system/router/manage_task_record_resource.go new file mode 100644 index 0000000..3a1367c --- /dev/null +++ b/internal/app/system/router/manage_task_record_resource.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-05-30 17:07:01 +// 生成路径: internal/app/system/router/manage_task_record_resource.go +// 生成人:gfast +// desc:下发记录回传的媒体文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindManageTaskRecordResourceController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/manageTaskRecordResource", func(group *ghttp.RouterGroup) { + group.Bind( + controller.ManageTaskRecordResource, + ) + }) +} diff --git a/internal/app/system/router/manage_task_result.go b/internal/app/system/router/manage_task_result.go new file mode 100644 index 0000000..d0743c9 --- /dev/null +++ b/internal/app/system/router/manage_task_result.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-10-21 11:29:13 +// 生成路径: internal/app/system/router/manage_task_result.go +// 生成人:gfast +// desc:AI识别到的数据 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindManageTaskResultController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/manageTaskResult", func(group *ghttp.RouterGroup) { + group.Bind( + controller.ManageTaskResult, + ) + }) +} diff --git a/internal/app/system/router/manage_workspace.go b/internal/app/system/router/manage_workspace.go new file mode 100644 index 0000000..e6e5741 --- /dev/null +++ b/internal/app/system/router/manage_workspace.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-11-14 10:53:20 +// 生成路径: internal/app/system/router/manage_workspace.go +// 生成人:gfast +// desc:工作空间 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindManageWorkspaceController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/manageWorkspace", func(group *ghttp.RouterGroup) { + group.Bind( + controller.ManageWorkspace, + ) + }) +} diff --git a/internal/app/system/router/master_schedule.go b/internal/app/system/router/master_schedule.go new file mode 100644 index 0000000..8f39759 --- /dev/null +++ b/internal/app/system/router/master_schedule.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-10-08 09:38:35 +// 生成路径: internal/app/system/router/master_schedule.go +// 生成人:gfast +// desc:总进度计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindMasterScheduleController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/masterSchedule", func(group *ghttp.RouterGroup) { + group.Bind( + controller.MasterSchedule, + ) + }) +} diff --git a/internal/app/system/router/notification_recipients.go b/internal/app/system/router/notification_recipients.go new file mode 100644 index 0000000..984db09 --- /dev/null +++ b/internal/app/system/router/notification_recipients.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-04-11 16:58:12 +// 生成路径: internal/app/system/router/notification_recipients.go +// 生成人:gfast +// desc:通知接收 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindNotificationRecipientsController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/notificationRecipients", func(group *ghttp.RouterGroup) { + group.Bind( + controller.NotificationRecipients, + ) + }) +} diff --git a/internal/app/system/router/notifications.go b/internal/app/system/router/notifications.go new file mode 100644 index 0000000..c590e59 --- /dev/null +++ b/internal/app/system/router/notifications.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-04-11 16:56:36 +// 生成路径: internal/app/system/router/notifications.go +// 生成人:gfast +// desc:通知信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindNotificationsController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/notifications", func(group *ghttp.RouterGroup) { + group.Bind( + controller.Notifications, + ) + }) +} diff --git a/internal/app/system/router/plan_daily.go b/internal/app/system/router/plan_daily.go new file mode 100644 index 0000000..0b203fd --- /dev/null +++ b/internal/app/system/router/plan_daily.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-09-26 14:31:07 +// 生成路径: internal/app/system/router/plan_daily.go +// 生成人:gfast +// desc:日报 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindPlanDailyController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/planDaily", func(group *ghttp.RouterGroup) { + group.Bind( + controller.PlanDaily, + ) + }) +} diff --git a/internal/app/system/router/plan_week.go b/internal/app/system/router/plan_week.go new file mode 100644 index 0000000..2b8969b --- /dev/null +++ b/internal/app/system/router/plan_week.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-04 17:26:59 +// 生成路径: internal/app/system/router/plan_week.go +// 生成人:gfast +// desc:周计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindPlanWeekController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/planWeek", func(group *ghttp.RouterGroup) { + group.Bind( + controller.PlanWeek, + ) + }) +} diff --git a/internal/app/system/router/plan_week_reality.go b/internal/app/system/router/plan_week_reality.go new file mode 100644 index 0000000..eabcd02 --- /dev/null +++ b/internal/app/system/router/plan_week_reality.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-17 17:23:07 +// 生成路径: internal/app/system/router/plan_week_reality.go +// 生成人:xyb +// desc:实际完成的周计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindPlanWeekRealityController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/planWeekReality", func(group *ghttp.RouterGroup) { + group.Bind( + controller.PlanWeekReality, + ) + }) +} diff --git a/internal/app/system/router/plant.go b/internal/app/system/router/plant.go new file mode 100644 index 0000000..288c993 --- /dev/null +++ b/internal/app/system/router/plant.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-04-12 10:38:43 +// 生成路径: internal/app/system/router/plant.go +// 生成人:gfast +// desc:电站信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindPlantController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/plant", func(group *ghttp.RouterGroup) { + group.Bind( + controller.Plant, + ) + }) +} diff --git a/internal/app/system/router/project_finance.go b/internal/app/system/router/project_finance.go new file mode 100644 index 0000000..5a1362b --- /dev/null +++ b/internal/app/system/router/project_finance.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-04-29 12:01:01 +// 生成路径: internal/app/system/router/project_finance.go +// 生成人:gfast +// desc:项目财务 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindProjectFinanceController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/projectFinance", func(group *ghttp.RouterGroup) { + group.Bind( + controller.ProjectFinance, + ) + }) +} diff --git a/internal/app/system/router/project_schedule.go b/internal/app/system/router/project_schedule.go new file mode 100644 index 0000000..0d70b1d --- /dev/null +++ b/internal/app/system/router/project_schedule.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-03-13 18:17:32 +// 生成路径: internal/app/system/router/project_schedule.go +// 生成人:gfast +// desc:项目排期 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindProjectScheduleController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/projectSchedule", func(group *ghttp.RouterGroup) { + group.Bind( + controller.ProjectSchedule, + ) + }) +} diff --git a/internal/app/system/router/pv_ module.go b/internal/app/system/router/pv_ module.go new file mode 100644 index 0000000..7c04fdb --- /dev/null +++ b/internal/app/system/router/pv_ module.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-03-23 10:25:39 +// 生成路径: internal/app/system/router/pv_ module.go +// 生成人:gfast +// desc:光伏组件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindPvModuleController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/pvModule", func(group *ghttp.RouterGroup) { + group.Bind( + controller.PvModule, + ) + }) +} diff --git a/internal/app/system/router/qianqi_bubantu.go b/internal/app/system/router/qianqi_bubantu.go new file mode 100644 index 0000000..1f408d3 --- /dev/null +++ b/internal/app/system/router/qianqi_bubantu.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-31 11:44:41 +// 生成路径: internal/app/system/router/qianqi_bubantu.go +// 生成人:gfast +// desc:布板图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindQianqiBubantuController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/qianqiBubantu", func(group *ghttp.RouterGroup) { + group.Bind( + controller.QianqiBubantu, + ) + }) +} diff --git a/internal/app/system/router/qianqi_camera.go b/internal/app/system/router/qianqi_camera.go new file mode 100644 index 0000000..43dd033 --- /dev/null +++ b/internal/app/system/router/qianqi_camera.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-09-30 22:37:34 +// 生成路径: internal/app/system/router/qianqi_camera.go +// 生成人:gfast +// desc:摄像头 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindQianqiCameraController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/qianqiCamera", func(group *ghttp.RouterGroup) { + group.Bind( + controller.QianqiCamera, + ) + }) +} diff --git a/internal/app/system/router/qianqi_cameras.go b/internal/app/system/router/qianqi_cameras.go new file mode 100644 index 0000000..48a841f --- /dev/null +++ b/internal/app/system/router/qianqi_cameras.go @@ -0,0 +1,23 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-31 09:48:11 +// 生成路径: internal/app/system/router/qianqi_cameras.go +// 生成人:gfast +// desc:所有摄像头列 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" +) + +func (router *Router) BindQianqiCamerasController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/qianqiCameras", func(group *ghttp.RouterGroup) { + group.Bind( + //controller.QianqiCameras, + ) + }) +} diff --git a/internal/app/system/router/qianqi_dixing.go b/internal/app/system/router/qianqi_dixing.go new file mode 100644 index 0000000..a1eed7e --- /dev/null +++ b/internal/app/system/router/qianqi_dixing.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-31 11:44:56 +// 生成路径: internal/app/system/router/qianqi_dixing.go +// 生成人:gfast +// desc:地形 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindQianqiDixingController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/qianqiDixing", func(group *ghttp.RouterGroup) { + group.Bind( + controller.QianqiDixing, + ) + }) +} diff --git a/internal/app/system/router/qianqi_dxf.go b/internal/app/system/router/qianqi_dxf.go new file mode 100644 index 0000000..4e07813 --- /dev/null +++ b/internal/app/system/router/qianqi_dxf.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-31 11:20:55 +// 生成路径: internal/app/system/router/qianqi_fangzhen.go +// 生成人:gfast +// desc:方阵 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindQianqiDxfController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/qianqiDxf", func(group *ghttp.RouterGroup) { + group.Bind( + controller.QianqiDxf, + ) + }) +} diff --git a/internal/app/system/router/qianqi_fangzhen.go b/internal/app/system/router/qianqi_fangzhen.go new file mode 100644 index 0000000..ad81560 --- /dev/null +++ b/internal/app/system/router/qianqi_fangzhen.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-31 11:20:55 +// 生成路径: internal/app/system/router/qianqi_fangzhen.go +// 生成人:gfast +// desc:方阵 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindQianqiFangzhenController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/qianqiFangzhen", func(group *ghttp.RouterGroup) { + group.Bind( + controller.QianqiFangzhen, + ) + }) +} diff --git a/internal/app/system/router/qianqi_guangfuban.go b/internal/app/system/router/qianqi_guangfuban.go new file mode 100644 index 0000000..8ef2c75 --- /dev/null +++ b/internal/app/system/router/qianqi_guangfuban.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-31 11:31:49 +// 生成路径: internal/app/system/router/qianqi_guangfuban.go +// 生成人:gfast +// desc:光伏板模型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindQianqiGuangfubanController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/qianqiGuangfuban", func(group *ghttp.RouterGroup) { + group.Bind( + controller.QianqiGuangfuban, + ) + }) +} diff --git a/internal/app/system/router/qianqi_guangfuban_ids.go b/internal/app/system/router/qianqi_guangfuban_ids.go new file mode 100644 index 0000000..887e91f --- /dev/null +++ b/internal/app/system/router/qianqi_guangfuban_ids.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-05 16:00:23 +// 生成路径: internal/app/system/router/qianqi_guangfuban_ids.go +// 生成人:gfast +// desc:光伏板模型的id +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindQianqiGuangfubanIdsController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/qianqiGuangfubanIds", func(group *ghttp.RouterGroup) { + group.Bind( + controller.QianqiGuangfubanIds, + ) + }) +} diff --git a/internal/app/system/router/qianqi_guangfuban_ids_lizhu.go b/internal/app/system/router/qianqi_guangfuban_ids_lizhu.go new file mode 100644 index 0000000..0e14002 --- /dev/null +++ b/internal/app/system/router/qianqi_guangfuban_ids_lizhu.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-09-05 12:10:40 +// 生成路径: internal/app/system/router/qianqi_guangfuban_ids_lizhu.go +// 生成人:gfast +// desc:光伏板立柱 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindQianqiGuangfubanIdsLizhuController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/qianqiGuangfubanIdsLizhu", func(group *ghttp.RouterGroup) { + group.Bind( + controller.QianqiGuangfubanIdsLizhu, + ) + }) +} diff --git a/internal/app/system/router/qianqi_guangfuban_ids_zhijia.go b/internal/app/system/router/qianqi_guangfuban_ids_zhijia.go new file mode 100644 index 0000000..1ae08de --- /dev/null +++ b/internal/app/system/router/qianqi_guangfuban_ids_zhijia.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-09-05 12:10:51 +// 生成路径: internal/app/system/router/qianqi_guangfuban_ids_zhijia.go +// 生成人:gfast +// desc:光伏板支架 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindQianqiGuangfubanIdsZhijiaController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/qianqiGuangfubanIdsZhijia", func(group *ghttp.RouterGroup) { + group.Bind( + controller.QianqiGuangfubanIdsZhijia, + ) + }) +} diff --git a/internal/app/system/router/qianqi_guangfuban_ids_zhuangdian.go b/internal/app/system/router/qianqi_guangfuban_ids_zhuangdian.go new file mode 100644 index 0000000..2104776 --- /dev/null +++ b/internal/app/system/router/qianqi_guangfuban_ids_zhuangdian.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-09-05 12:07:41 +// 生成路径: internal/app/system/router/qianqi_guangfuban_ids_zhuangdian.go +// 生成人:gfast +// desc:光伏板桩点 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindQianqiGuangfubanIdsZhuangdianController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/qianqiGuangfubanIdsZhuangdian", func(group *ghttp.RouterGroup) { + group.Bind( + controller.QianqiGuangfubanIdsZhuangdian, + ) + }) +} diff --git a/internal/app/system/router/qianqi_guangfuban_zuchuan.go b/internal/app/system/router/qianqi_guangfuban_zuchuan.go new file mode 100644 index 0000000..b30070c --- /dev/null +++ b/internal/app/system/router/qianqi_guangfuban_zuchuan.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-17 10:37:21 +// 生成路径: internal/app/system/router/qianqi_guangfuban_zuchuan.go +// 生成人:xyb +// desc:组串 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindQianqiGuangfubanZuchuanController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/qianqiGuangfubanZuchuan", func(group *ghttp.RouterGroup) { + group.Bind( + controller.QianqiGuangfubanZuchuan, + ) + }) +} diff --git a/internal/app/system/router/qianqi_jidianxianlu.go b/internal/app/system/router/qianqi_jidianxianlu.go new file mode 100644 index 0000000..2427a7f --- /dev/null +++ b/internal/app/system/router/qianqi_jidianxianlu.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-04 16:29:44 +// 生成路径: internal/app/system/router/qianqi_jidianxianlu.go +// 生成人:gfast +// desc:集电线路 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindQianqiJidianxianluController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/qianqiJidianxianlu", func(group *ghttp.RouterGroup) { + group.Bind( + controller.QianqiJidianxianlu, + ) + }) +} diff --git a/internal/app/system/router/qianqi_moxing.go b/internal/app/system/router/qianqi_moxing.go new file mode 100644 index 0000000..b34bfa8 --- /dev/null +++ b/internal/app/system/router/qianqi_moxing.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-31 11:09:26 +// 生成路径: internal/app/system/router/qianqi_moxing.go +// 生成人:gfast +// desc:倾斜模型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindQianqiMoxingController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/qianqiMoxing", func(group *ghttp.RouterGroup) { + group.Bind( + controller.QianqiMoxing, + ) + }) +} diff --git a/internal/app/system/router/qianqi_nibianqi.go b/internal/app/system/router/qianqi_nibianqi.go new file mode 100644 index 0000000..3ad3887 --- /dev/null +++ b/internal/app/system/router/qianqi_nibianqi.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-31 09:40:17 +// 生成路径: internal/app/system/router/qianqi_nibianqi.go +// 生成人:gfast +// desc:逆变器 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindQianqiNibianqiController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/qianqiNibianqi", func(group *ghttp.RouterGroup) { + group.Bind( + controller.QianqiNibianqi, + ) + }) +} diff --git a/internal/app/system/router/qianqi_pingchang.go b/internal/app/system/router/qianqi_pingchang.go new file mode 100644 index 0000000..10add80 --- /dev/null +++ b/internal/app/system/router/qianqi_pingchang.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-08 10:08:25 +// 生成路径: internal/app/system/router/qianqi_pingchang.go +// 生成人:gfast +// desc:平场数据 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindQianqiPingchangController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/qianqiPingchang", func(group *ghttp.RouterGroup) { + group.Bind( + controller.QianqiPingchang, + ) + }) +} diff --git a/internal/app/system/router/qianqi_redline.go b/internal/app/system/router/qianqi_redline.go new file mode 100644 index 0000000..d720896 --- /dev/null +++ b/internal/app/system/router/qianqi_redline.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-31 11:45:12 +// 生成路径: internal/app/system/router/qianqi_redline.go +// 生成人:gfast +// desc:红线 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindQianqiRedlineController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/qianqiRedline", func(group *ghttp.RouterGroup) { + group.Bind( + controller.QianqiRedline, + ) + }) +} diff --git a/internal/app/system/router/qianqi_redline_tudiliuzhuan.go b/internal/app/system/router/qianqi_redline_tudiliuzhuan.go new file mode 100644 index 0000000..9d4aaee --- /dev/null +++ b/internal/app/system/router/qianqi_redline_tudiliuzhuan.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-04 11:47:15 +// 生成路径: internal/app/system/router/qianqi_redline_tudiliuzhuan.go +// 生成人:gfast +// desc:土地流转 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindQianqiRedlineTudiliuzhuanController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/qianqiRedlineTudiliuzhuan", func(group *ghttp.RouterGroup) { + group.Bind( + controller.QianqiRedlineTudiliuzhuan, + ) + }) +} diff --git a/internal/app/system/router/qianqi_road.go b/internal/app/system/router/qianqi_road.go new file mode 100644 index 0000000..656cc75 --- /dev/null +++ b/internal/app/system/router/qianqi_road.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-04 16:24:38 +// 生成路径: internal/app/system/router/qianqi_road.go +// 生成人:gfast +// desc:道路 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindQianqiRoadController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/qianqiRoad", func(group *ghttp.RouterGroup) { + group.Bind( + controller.QianqiRoad, + ) + }) +} diff --git a/internal/app/system/router/qianqi_xiangbian.go b/internal/app/system/router/qianqi_xiangbian.go new file mode 100644 index 0000000..4aa57b3 --- /dev/null +++ b/internal/app/system/router/qianqi_xiangbian.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-31 09:52:13 +// 生成路径: internal/app/system/router/qianqi_xiangbian.go +// 生成人:gfast +// desc:箱变 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindQianqiXiangbianController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/qianqiXiangbian", func(group *ghttp.RouterGroup) { + group.Bind( + controller.QianqiXiangbian, + ) + }) +} diff --git a/internal/app/system/router/reminders.go b/internal/app/system/router/reminders.go new file mode 100644 index 0000000..2579e6f --- /dev/null +++ b/internal/app/system/router/reminders.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-05-14 14:55:52 +// 生成路径: internal/app/system/router/reminders.go +// 生成人:gfast +// desc:App-消息-提醒 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindRemindersController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/reminders", func(group *ghttp.RouterGroup) { + group.Bind( + controller.Reminders, + ) + }) +} diff --git a/internal/app/system/router/router.go b/internal/app/system/router/router.go new file mode 100644 index 0000000..4beb888 --- /dev/null +++ b/internal/app/system/router/router.go @@ -0,0 +1,67 @@ +/* +* @desc:后台路由 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/2/18 17:34 + */ + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/api/v1/common/fileUpload" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/libRouter" +) + +var R = new(Router) + +type Router struct{} + +func (router *Router) BindController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/system", func(group *ghttp.RouterGroup) { + group.Bind( + //登录 + controller.Login, + ) + fileUpload.InitUploadApi(group) + + //登录验证拦截 + service.GfToken().Middleware(group) + + //context拦截器 + group.Middleware(service.Middleware().Ctx, service.Middleware().Auth) + //group.Middleware(service.Middleware().Ctx, service.Middleware().Blacklist) + + //后台操作日志记录 + group.Hook("/*", ghttp.HookAfterOutput, service.OperateLog().OperationLog) + group.Bind( + controller.User, + controller.Menu, + controller.Role, + controller.Dept, + controller.Post, + controller.DictType, + controller.DictData, + controller.Config, + controller.Monitor, + controller.LoginLog, + controller.OperLog, + controller.BigFile, + controller.ToolsGenTable, + controller.Personal, + controller.UserOnline, + controller.Cache, // 缓存处理 + controller.Upload, // 普通文件上传 + controller.BigUpload, // 大文件上传 + controller.UEditor, //编辑器 + ) + + //自动绑定定义的控制器 + if err := libRouter.RouterAutoBind(ctx, router, group); err != nil { + panic(err) + } + }) +} diff --git a/internal/app/system/router/sub_project.go b/internal/app/system/router/sub_project.go new file mode 100644 index 0000000..a042337 --- /dev/null +++ b/internal/app/system/router/sub_project.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-03-21 18:53:15 +// 生成路径: internal/app/system/router/sub_project.go +// 生成人:gfast +// desc:子项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindSubProjectController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/subProject", func(group *ghttp.RouterGroup) { + group.Bind( + controller.SubProject, + ) + }) +} diff --git a/internal/app/system/router/sys_file.go b/internal/app/system/router/sys_file.go new file mode 100644 index 0000000..a24871f --- /dev/null +++ b/internal/app/system/router/sys_file.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-29 15:32:09 +// 生成路径: internal/app/system/router/sys_file.go +// 生成人:gfast +// desc:文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindSysFileController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/sysFile", func(group *ghttp.RouterGroup) { + group.Bind( + controller.SysFile, + ) + }) +} diff --git a/internal/app/system/router/sys_file_type.go b/internal/app/system/router/sys_file_type.go new file mode 100644 index 0000000..ea92cb8 --- /dev/null +++ b/internal/app/system/router/sys_file_type.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-29 15:27:54 +// 生成路径: internal/app/system/router/sys_file_type.go +// 生成人:gfast +// desc:文件类型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindSysFileTypeController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/sysFileType", func(group *ghttp.RouterGroup) { + group.Bind( + controller.SysFileType, + ) + }) +} diff --git a/internal/app/system/router/sys_job.go b/internal/app/system/router/sys_job.go new file mode 100644 index 0000000..9548844 --- /dev/null +++ b/internal/app/system/router/sys_job.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-01-12 17:43:50 +// 生成路径: internal/app/system/router/sys_job.go +// 生成人:gfast +// desc:定时任务 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindSysJobController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/sysJob", func(group *ghttp.RouterGroup) { + group.Bind( + controller.SysJob, + ) + }) +} diff --git a/internal/app/system/router/sys_project.go b/internal/app/system/router/sys_project.go new file mode 100644 index 0000000..98f27bc --- /dev/null +++ b/internal/app/system/router/sys_project.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-27 15:20:49 +// 生成路径: internal/app/system/router/sys_project.go +// 生成人:gfast +// desc:项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindSysProjectController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/sysProject", func(group *ghttp.RouterGroup) { + group.Bind( + controller.SysProject, + ) + }) +} diff --git a/internal/app/system/router/sys_project_introduce.go b/internal/app/system/router/sys_project_introduce.go new file mode 100644 index 0000000..4f99e0c --- /dev/null +++ b/internal/app/system/router/sys_project_introduce.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-03-29 10:05:03 +// 生成路径: internal/app/system/router/sys_project_introduce.go +// 生成人:gfast +// desc:项目新闻 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindSysProjectIntroduceController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/sysProjectIntroduce", func(group *ghttp.RouterGroup) { + group.Bind( + controller.SysProjectIntroduce, + ) + }) +} diff --git a/internal/app/system/router/sys_project_value.go b/internal/app/system/router/sys_project_value.go new file mode 100644 index 0000000..b3abecb --- /dev/null +++ b/internal/app/system/router/sys_project_value.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-03-27 12:55:26 +// 生成路径: internal/app/system/router/sys_project_value.go +// 生成人:xiaoyang +// desc:projectValue +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindSysProjectValueController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/sysProjectValue", func(group *ghttp.RouterGroup) { + group.Bind( + controller.SysProjectValue, + ) + }) +} diff --git a/internal/app/system/router/sys_user_project.go b/internal/app/system/router/sys_user_project.go new file mode 100644 index 0000000..5ccf305 --- /dev/null +++ b/internal/app/system/router/sys_user_project.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-27 15:20:52 +// 生成路径: internal/app/system/router/sys_user_project.go +// 生成人:gfast +// desc:用户和项目关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindSysUserProjectController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/sysUserProject", func(group *ghttp.RouterGroup) { + group.Bind( + controller.SysUserProject, + ) + }) +} diff --git a/internal/app/system/router/sys_wechat_role.go b/internal/app/system/router/sys_wechat_role.go new file mode 100644 index 0000000..b715faf --- /dev/null +++ b/internal/app/system/router/sys_wechat_role.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-01-22 15:05:43 +// 生成路径: internal/app/system/router/sys_wechat_role.go +// 生成人:gfast +// desc:微信角色 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindSysWechatRoleController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/sysWechatRole", func(group *ghttp.RouterGroup) { + group.Bind( + controller.SysWechatRole, + ) + }) +} diff --git a/internal/app/system/router/todo_tasks.go b/internal/app/system/router/todo_tasks.go new file mode 100644 index 0000000..7c747b2 --- /dev/null +++ b/internal/app/system/router/todo_tasks.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-05-15 17:30:14 +// 生成路径: internal/app/system/router/todo_tasks.go +// 生成人:gfast +// desc:App-待办 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindTodoTasksController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/todoTasks", func(group *ghttp.RouterGroup) { + group.Bind( + controller.TodoTasks, + ) + }) +} diff --git a/internal/app/system/router/user_registration.go b/internal/app/system/router/user_registration.go new file mode 100644 index 0000000..8d6eb1d --- /dev/null +++ b/internal/app/system/router/user_registration.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-07-26 15:32:12 +// 生成路径: internal/app/system/router/user_registration.go +// 生成人:gfast +// desc:极光推送 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindUserRegistrationController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/userRegistration", func(group *ghttp.RouterGroup) { + group.Bind( + controller.UserRegistration, + ) + }) +} diff --git a/internal/app/system/router/work_schedule.go b/internal/app/system/router/work_schedule.go new file mode 100644 index 0000000..676b27e --- /dev/null +++ b/internal/app/system/router/work_schedule.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-03-20 10:02:26 +// 生成路径: internal/app/system/router/work_schedule.go +// 生成人:gfast +// desc:工作计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindWorkScheduleController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/workSchedule", func(group *ghttp.RouterGroup) { + group.Bind( + controller.WorkSchedule, + ) + }) +} diff --git a/internal/app/system/router/work_status.go b/internal/app/system/router/work_status.go new file mode 100644 index 0000000..b70144e --- /dev/null +++ b/internal/app/system/router/work_status.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-03-19 11:45:09 +// 生成路径: internal/app/system/router/work_status.go +// 生成人:gfast +// desc:工作状态 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindWorkStatusController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/workStatus", func(group *ghttp.RouterGroup) { + group.Bind( + controller.WorkStatus, + ) + }) +} diff --git a/internal/app/system/router/xiangmuhuafenbiao.go b/internal/app/system/router/xiangmuhuafenbiao.go new file mode 100644 index 0000000..3241287 --- /dev/null +++ b/internal/app/system/router/xiangmuhuafenbiao.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-10-07 16:08:10 +// 生成路径: internal/app/system/router/xiangmuhuafenbiao.go +// 生成人:gfast +// desc:项目划分 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindXiangmuhuafenbiaoController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/xiangmuhuafenbiao", func(group *ghttp.RouterGroup) { + group.Bind( + controller.Xiangmuhuafenbiao, + ) + }) +} diff --git a/internal/app/system/router/ys7devices.go b/internal/app/system/router/ys7devices.go new file mode 100644 index 0000000..262ae5c --- /dev/null +++ b/internal/app/system/router/ys7devices.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-03-01 12:49:32 +// 生成路径: internal/app/system/router/ys7devices.go +// 生成人:gfast +// desc:荧石摄像头 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindYs7DevicesController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/ys7Devices", func(group *ghttp.RouterGroup) { + group.Bind( + controller.Ys7Devices, + ) + }) +} diff --git a/internal/app/system/router/ys7devices_img.go b/internal/app/system/router/ys7devices_img.go new file mode 100644 index 0000000..904106c --- /dev/null +++ b/internal/app/system/router/ys7devices_img.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2024-08-19 11:51:53 +// 生成路径: internal/app/system/router/ys7devices_img.go +// 生成人:gfast +// desc:摄像头所拍摄到的所有图片(每月会定时清除) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindYs7DevicesImgController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/ys7DevicesImg", func(group *ghttp.RouterGroup) { + group.Bind( + controller.Ys7DevicesImg, + ) + }) +} diff --git a/internal/app/system/router/zmkg_gis_model_lib.go b/internal/app/system/router/zmkg_gis_model_lib.go new file mode 100644 index 0000000..3ad5a6f --- /dev/null +++ b/internal/app/system/router/zmkg_gis_model_lib.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-07-31 10:18:14 +// 生成路径: internal/app/system/router/zmkg_gis_model_lib.go +// 生成人:gfast +// desc:模型库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" +) + +func (router *Router) BindZmkgGisModelLibController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/zmkgGisModelLib", func(group *ghttp.RouterGroup) { + group.Bind( + controller.ZmkgGisModelLib, + ) + }) +} diff --git a/internal/app/system/service/.gitkeep b/internal/app/system/service/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/internal/app/system/service/app_menus.go b/internal/app/system/service/app_menus.go new file mode 100644 index 0000000..22c018e --- /dev/null +++ b/internal/app/system/service/app_menus.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-05-28 15:09:13 +// 生成路径: internal/app/system/service/app_menus.go +// 生成人:gfast +// desc:app菜单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IAppMenus interface { + List(ctx context.Context, req *system.AppMenusSearchReq) (res *system.AppMenusSearchRes, err error) + GetByMenuId(ctx context.Context, MenuId uint) (res *model.AppMenusInfoRes, err error) + Add(ctx context.Context, req *system.AppMenusAddReq) (err error) + Edit(ctx context.Context, req *system.AppMenusEditReq) (err error) + Delete(ctx context.Context, MenuId []uint) (err error) +} + +var localAppMenus IAppMenus + +func AppMenus() IAppMenus { + if localAppMenus == nil { + panic("implement not found for interface IAppMenus, forgot register?") + } + return localAppMenus +} + +func RegisterAppMenus(i IAppMenus) { + localAppMenus = i +} diff --git a/internal/app/system/service/app_role_menus.go b/internal/app/system/service/app_role_menus.go new file mode 100644 index 0000000..b0c2a69 --- /dev/null +++ b/internal/app/system/service/app_role_menus.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-05-28 15:11:15 +// 生成路径: internal/app/system/service/app_role_menus.go +// 生成人:gfast +// desc:app角色绑定菜单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IAppRoleMenus interface { + List(ctx context.Context, req *system.AppRoleMenusSearchReq) (res *system.AppRoleMenusSearchRes, err error) + GetById(ctx context.Context, Id uint) (res *model.AppRoleMenusInfoRes, err error) + Add(ctx context.Context, req *system.AppRoleMenusAddReq) (err error) + Edit(ctx context.Context, req *system.AppRoleMenusEditReq) (err error) + Delete(ctx context.Context, Id []uint) (err error) +} + +var localAppRoleMenus IAppRoleMenus + +func AppRoleMenus() IAppRoleMenus { + if localAppRoleMenus == nil { + panic("implement not found for interface IAppRoleMenus, forgot register?") + } + return localAppRoleMenus +} + +func RegisterAppRoleMenus(i IAppRoleMenus) { + localAppRoleMenus = i +} diff --git a/internal/app/system/service/app_roles.go b/internal/app/system/service/app_roles.go new file mode 100644 index 0000000..690aba7 --- /dev/null +++ b/internal/app/system/service/app_roles.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-05-28 15:11:36 +// 生成路径: internal/app/system/service/app_roles.go +// 生成人:gfast +// desc:app角色 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IAppRoles interface { + List(ctx context.Context, req *system.AppRolesSearchReq) (res *system.AppRolesSearchRes, err error) + GetByRoleId(ctx context.Context, RoleId uint) (res *model.AppRolesInfoRes, err error) + Add(ctx context.Context, req *system.AppRolesAddReq) (err error) + Edit(ctx context.Context, req *system.AppRolesEditReq) (err error) + Delete(ctx context.Context, RoleId []uint) (err error) +} + +var localAppRoles IAppRoles + +func AppRoles() IAppRoles { + if localAppRoles == nil { + panic("implement not found for interface IAppRoles, forgot register?") + } + return localAppRoles +} + +func RegisterAppRoles(i IAppRoles) { + localAppRoles = i +} diff --git a/internal/app/system/service/app_user_disable_menus.go b/internal/app/system/service/app_user_disable_menus.go new file mode 100644 index 0000000..557c693 --- /dev/null +++ b/internal/app/system/service/app_user_disable_menus.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-05-28 15:11:37 +// 生成路径: internal/app/system/service/app_user_disable_menus.go +// 生成人:gfast +// desc:app用户禁用菜单关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IAppUserDisableMenus interface { + List(ctx context.Context, req *system.AppUserDisableMenusSearchReq) (res *system.AppUserDisableMenusSearchRes, err error) + GetByUserDisabledMenuId(ctx context.Context, UserDisabledMenuId uint) (res *model.AppUserDisableMenusInfoRes, err error) + Add(ctx context.Context, req *system.AppUserDisableMenusAddReq) (err error) + Edit(ctx context.Context, req *system.AppUserDisableMenusEditReq) (err error) + Delete(ctx context.Context, UserDisabledMenuId []uint) (err error) +} + +var localAppUserDisableMenus IAppUserDisableMenus + +func AppUserDisableMenus() IAppUserDisableMenus { + if localAppUserDisableMenus == nil { + panic("implement not found for interface IAppUserDisableMenus, forgot register?") + } + return localAppUserDisableMenus +} + +func RegisterAppUserDisableMenus(i IAppUserDisableMenus) { + localAppUserDisableMenus = i +} diff --git a/internal/app/system/service/app_user_menus.go b/internal/app/system/service/app_user_menus.go new file mode 100644 index 0000000..c2c8404 --- /dev/null +++ b/internal/app/system/service/app_user_menus.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-05-28 15:11:37 +// 生成路径: internal/app/system/service/app_user_menus.go +// 生成人:gfast +// desc:app用户菜单关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IAppUserMenus interface { + List(ctx context.Context, req *system.AppUserMenusSearchReq) (res *system.AppUserMenusSearchRes, err error) + GetByUserMenuId(ctx context.Context, UserMenuId uint) (res *model.AppUserMenusInfoRes, err error) + Add(ctx context.Context, req *system.AppUserMenusAddReq) (err error) + Edit(ctx context.Context, req *system.AppUserMenusEditReq) (err error) + Delete(ctx context.Context, UserMenuId []uint) (err error) +} + +var localAppUserMenus IAppUserMenus + +func AppUserMenus() IAppUserMenus { + if localAppUserMenus == nil { + panic("implement not found for interface IAppUserMenus, forgot register?") + } + return localAppUserMenus +} + +func RegisterAppUserMenus(i IAppUserMenus) { + localAppUserMenus = i +} diff --git a/internal/app/system/service/app_user_roles.go b/internal/app/system/service/app_user_roles.go new file mode 100644 index 0000000..d9848b0 --- /dev/null +++ b/internal/app/system/service/app_user_roles.go @@ -0,0 +1,42 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-05-28 15:11:37 +// 生成路径: internal/app/system/service/app_user_roles.go +// 生成人:gfast +// desc:app用户角色关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IAppUserRoles interface { + List(ctx context.Context, req *system.AppUserRolesSearchReq) (res *system.AppUserRolesSearchRes, err error) + GetById(ctx context.Context, Id uint) (res *model.AppUserRolesInfoRes, err error) + Add(ctx context.Context, req *system.AppUserRolesAddReq) (err error) + Edit(ctx context.Context, req *system.AppUserRolesEditReq) (err error) + Delete(ctx context.Context, Id []uint) (err error) + // 给用户绑定角色 + BindRole(ctx context.Context, req *system.AppUserRolesBindReq) (err error) + // 获取用户的角色 + GetUserRoles(ctx context.Context, userId int) (roles model.AppUserRoleDetails, err error) +} + +var localAppUserRoles IAppUserRoles + +func AppUserRoles() IAppUserRoles { + if localAppUserRoles == nil { + panic("implement not found for interface IAppUserRoles, forgot register?") + } + return localAppUserRoles +} + +func RegisterAppUserRoles(i IAppUserRoles) { + localAppUserRoles = i +} diff --git a/internal/app/system/service/big_file.go b/internal/app/system/service/big_file.go new file mode 100644 index 0000000..2c68dff --- /dev/null +++ b/internal/app/system/service/big_file.go @@ -0,0 +1,101 @@ +package service + +import ( + "context" + + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + + systemConsts "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +type IBigFile interface { + List(ctx context.Context, req *system.BigFileSearchReq) (res *system.BigFileSearchRes, err error) + Add(ctx context.Context, req *system.BigFileAddReq, userId uint64) (err error) + Get(ctx context.Context, id uint64) (res *system.BigFileGetRes, err error) + Edit(ctx context.Context, req *system.BigFileEditReq, userId uint64) (err error) + Delete(ctx context.Context, ids []uint64) (err error) +} + +func BigFile() IBigFile { + return new(bigFileTmpl) +} + +type bigFileTmpl struct{} + +func (s *bigFileTmpl) List(ctx context.Context, req *system.BigFileSearchReq) (res *system.BigFileSearchRes, err error) { + res = new(system.BigFileSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BigFile.Ctx(ctx) + if req != nil { + if req.Name != "" { + m = m.Where("name like ?", "%"+req.Name+"%") + } + } + res.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取数据失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + res.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = systemConsts.PageSize + } + + var orderBy string = "id asc" + if req.OrderBy != "" { + orderBy = req.OrderBy + } + err = m.Page(req.PageNum, req.PageSize).Order(orderBy).Scan(&res.List) + liberr.ErrIsNil(ctx, err, "获取数据失败") + }) + return +} + +func (s *bigFileTmpl) Add(ctx context.Context, req *system.BigFileAddReq, userId uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BigFile.Ctx(ctx).Insert(do.BigFile{ + Name: req.Name, + Size: req.Size, + Path: req.Path, + FullPath: req.FullPath, + MimeType: req.MimeType, + Source: req.Source, + Describe: req.Describe, + Md5: req.Md5, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *bigFileTmpl) Get(ctx context.Context, id uint64) (res *system.BigFileGetRes, err error) { + res = new(system.BigFileGetRes) + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BigFile.Ctx(ctx).WherePri(id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + }) + return +} + +func (s *bigFileTmpl) Edit(ctx context.Context, req *system.BigFileEditReq, userId uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BigFile.Ctx(ctx).WherePri(req.Id).Update(do.BigFile{ + Name: req.Name, + Describe: req.Describe, + }) + liberr.ErrIsNil(ctx, err, "修改错误") + }) + return +} + +func (s *bigFileTmpl) Delete(ctx context.Context, ids []uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BigFile.Ctx(ctx).WherePri(ids).Delete() + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/system/service/bus_attendance_machine.go b/internal/app/system/service/bus_attendance_machine.go new file mode 100644 index 0000000..6ce2c00 --- /dev/null +++ b/internal/app/system/service/bus_attendance_machine.go @@ -0,0 +1,50 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2025-03-03 10:32:47 +// 生成路径: internal/app/system/service/bus_attendance_machine.go +// 生成人:gfast +// desc:考勤机 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusAttendanceMachine interface { + List(ctx context.Context, req *system.BusAttendanceMachineSearchReq) (res *system.BusAttendanceMachineSearchRes, err error) + GetById(ctx context.Context, Id uint64) (res *model.BusAttendanceMachineExtendRes, err error) + Add(ctx context.Context, req *system.BusAttendanceMachineAddReq) (err error) + Edit(ctx context.Context, req *system.BusAttendanceMachineEditReq) (err error) + Delete(ctx context.Context, Id []uint64) (err error) + + // Register 考勤设备注册 + Register(ctx context.Context, req *system.BusAttendanceMachineRegisterReq) (err error) + // Change 变更考勤机状态 + Change(ctx context.Context, req *system.BusAttendanceMachineChangeReq) (err error) + // BindUserInformationToDevicesInBatches 批量将用户信息绑定到设备上 + BindUserInformationToDevicesInBatches(ctx context.Context, req *system.BindUserInformationToDevicesInBatchesReq) (err error) + // SendTheUserInformationToTheAttendanceMachine 将用户信息下发到考勤机上 + SendTheUserInformationToTheAttendanceMachine(ctx context.Context, req *system.SendTheUserInformationToTheAttendanceMachineReq) (err error) + // DeleteTheUserBoundToTheAttendanceMachineAndDevice 将考勤机和设备绑定的用户删除掉 + DeleteTheUserBoundToTheAttendanceMachineAndDevice(ctx context.Context, req *system.DeleteTheUserBoundToTheAttendanceMachineAndDeviceReq) (err error) + // ObtainInformationAboutPersonnelAssociatedWithTheAttendanceDevice 获取考勤设备关联的人员信息 + ObtainInformationAboutPersonnelAssociatedWithTheAttendanceDevice(ctx context.Context, req *system.ObtainInformationAboutPersonnelAssociatedWithTheAttendanceDeviceReq) (listRes *system.ObtainInformationAboutPersonnelAssociatedWithTheAttendanceDeviceRes, err error) +} + +var localBusAttendanceMachine IBusAttendanceMachine + +func BusAttendanceMachine() IBusAttendanceMachine { + if localBusAttendanceMachine == nil { + panic("implement not found for interface IBusAttendanceMachine, forgot register?") + } + return localBusAttendanceMachine +} + +func RegisterBusAttendanceMachine(i IBusAttendanceMachine) { + localBusAttendanceMachine = i +} diff --git a/internal/app/system/service/bus_attendance_machine_user.go b/internal/app/system/service/bus_attendance_machine_user.go new file mode 100644 index 0000000..616566f --- /dev/null +++ b/internal/app/system/service/bus_attendance_machine_user.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2025-03-03 10:33:17 +// 生成路径: internal/app/system/service/bus_attendance_machine_user.go +// 生成人:gfast +// desc:考勤机用户列 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusAttendanceMachineUser interface { + List(ctx context.Context, req *system.BusAttendanceMachineUserSearchReq) (res *system.BusAttendanceMachineUserSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusAttendanceMachineUserInfoRes, err error) + Add(ctx context.Context, req *system.BusAttendanceMachineUserAddReq) (err error) + Edit(ctx context.Context, req *system.BusAttendanceMachineUserEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localBusAttendanceMachineUser IBusAttendanceMachineUser + +func BusAttendanceMachineUser() IBusAttendanceMachineUser { + if localBusAttendanceMachineUser == nil { + panic("implement not found for interface IBusAttendanceMachineUser, forgot register?") + } + return localBusAttendanceMachineUser +} + +func RegisterBusAttendanceMachineUser(i IBusAttendanceMachineUser) { + localBusAttendanceMachineUser = i +} diff --git a/internal/app/system/service/bus_camera_channel.go b/internal/app/system/service/bus_camera_channel.go new file mode 100644 index 0000000..36760c3 --- /dev/null +++ b/internal/app/system/service/bus_camera_channel.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-09-20 14:55:42 +// 生成路径: internal/app/system/service/bus_camera_channel.go +// 生成人:gfast +// desc:摄像头(国标通道) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusCameraChannel interface { + List(ctx context.Context, req *system.BusCameraChannelSearchReq) (res *system.BusCameraChannelSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusCameraChannelInfoRes, err error) + Add(ctx context.Context, req *system.BusCameraChannelAddReq) (err error) + Edit(ctx context.Context, req *system.BusCameraChannelEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localBusCameraChannel IBusCameraChannel + +func BusCameraChannel() IBusCameraChannel { + if localBusCameraChannel == nil { + panic("implement not found for interface IBusCameraChannel, forgot register?") + } + return localBusCameraChannel +} + +func RegisterBusCameraChannel(i IBusCameraChannel) { + localBusCameraChannel = i +} diff --git a/internal/app/system/service/bus_camera_chinese_standard.go b/internal/app/system/service/bus_camera_chinese_standard.go new file mode 100644 index 0000000..168ba94 --- /dev/null +++ b/internal/app/system/service/bus_camera_chinese_standard.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-09-20 14:55:24 +// 生成路径: internal/app/system/service/bus_camera_chinese_standard.go +// 生成人:gfast +// desc:摄像头(国标) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusCameraChineseStandard interface { + List(ctx context.Context, req *system.BusCameraChineseStandardSearchReq) (res *system.BusCameraChineseStandardSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusCameraChineseStandardInfoRes, err error) + Add(ctx context.Context, req *system.BusCameraChineseStandardAddReq) (err error) + Edit(ctx context.Context, req *system.BusCameraChineseStandardEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localBusCameraChineseStandard IBusCameraChineseStandard + +func BusCameraChineseStandard() IBusCameraChineseStandard { + if localBusCameraChineseStandard == nil { + panic("implement not found for interface IBusCameraChineseStandard, forgot register?") + } + return localBusCameraChineseStandard +} + +func RegisterBusCameraChineseStandard(i IBusCameraChineseStandard) { + localBusCameraChineseStandard = i +} diff --git a/internal/app/system/service/bus_category.go b/internal/app/system/service/bus_category.go new file mode 100644 index 0000000..c1a6400 --- /dev/null +++ b/internal/app/system/service/bus_category.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-10-07 15:52:19 +// 生成路径: internal/app/system/service/bus_category.go +// 生成人:gfast +// desc:题库_题库类别 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusCategory interface { + List(ctx context.Context, req *system.BusCategorySearchReq) (res *system.BusCategorySearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusCategoryInfoRes, err error) + Add(ctx context.Context, req *system.BusCategoryAddReq) (err error) + Edit(ctx context.Context, req *system.BusCategoryEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localBusCategory IBusCategory + +func BusCategory() IBusCategory { + if localBusCategory == nil { + panic("implement not found for interface IBusCategory, forgot register?") + } + return localBusCategory +} + +func RegisterBusCategory(i IBusCategory) { + localBusCategory = i +} diff --git a/internal/app/system/service/bus_company.go b/internal/app/system/service/bus_company.go new file mode 100644 index 0000000..48be6ed --- /dev/null +++ b/internal/app/system/service/bus_company.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-07-28 14:08:14 +// 生成路径: internal/app/system/service/bus_company.go +// 生成人:gfast +// desc:公司 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusCompany interface { + List(ctx context.Context, req *system.BusCompanySearchReq) (res *system.BusCompanySearchRes, err error) + GetByCompanyId(ctx context.Context, CompanyId int64) (res *model.BusCompanyInfoRes, err error) + Add(ctx context.Context, req *system.BusCompanyAddReq) (err error) + Edit(ctx context.Context, req *system.BusCompanyEditReq) (err error) + Delete(ctx context.Context, CompanyId []int64) (err error) + AppList(ctx context.Context, req *system.BusCompanyAppSearchReq) (res *system.BusCompanyAppSearchRes, err error) +} + +var localBusCompany IBusCompany + +func BusCompany() IBusCompany { + if localBusCompany == nil { + panic("implement not found for interface IBusCompany, forgot register?") + } + return localBusCompany +} + +func RegisterBusCompany(i IBusCompany) { + localBusCompany = i +} diff --git a/internal/app/system/service/bus_complaint_box.go b/internal/app/system/service/bus_complaint_box.go new file mode 100644 index 0000000..1f94d8b --- /dev/null +++ b/internal/app/system/service/bus_complaint_box.go @@ -0,0 +1,40 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-12-04 18:09:50 +// 生成路径: internal/app/system/service/bus_complaint_box.go +// 生成人:gfast +// desc:意见箱 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + wxSystem "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusComplaintBox interface { + List(ctx context.Context, req *system.BusComplaintBoxSearchReq) (res *system.BusComplaintBoxSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusComplaintBoxInfoRes, err error) + //Add(ctx context.Context, req *system.BusComplaintBoxAddReq) (err error) + Edit(ctx context.Context, req *system.BusComplaintBoxEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + AppletList(ctx context.Context, req *wxSystem.AppletComplaintBoxSearchReq) (res *wxSystem.AppletComplaintBoxSearchRes, err error) + AppletAdd(ctx context.Context, req *wxSystem.AppletComplaintBoxAddReq) (err error) +} + +var localBusComplaintBox IBusComplaintBox + +func BusComplaintBox() IBusComplaintBox { + if localBusComplaintBox == nil { + panic("implement not found for interface IBusComplaintBox, forgot register?") + } + return localBusComplaintBox +} + +func RegisterBusComplaintBox(i IBusComplaintBox) { + localBusComplaintBox = i +} diff --git a/internal/app/system/service/bus_construction_blacklist.go b/internal/app/system/service/bus_construction_blacklist.go new file mode 100644 index 0000000..e0b27a3 --- /dev/null +++ b/internal/app/system/service/bus_construction_blacklist.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-11-10 14:08:39 +// 生成路径: internal/app/system/service/bus_construction_blacklist.go +// 生成人:gfast +// desc:黑名单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusConstructionBlacklist interface { + List(ctx context.Context, req *system.BusConstructionBlacklistSearchReq) (res *system.BusConstructionBlacklistSearchRes, err error) + GetByOpenid(ctx context.Context, Openid string) (res *model.BusConstructionBlacklistInfoRes, err error) + Add(ctx context.Context, req *system.BusConstructionBlacklistAddReq) (err error) + Delete(ctx context.Context, Openid []string) (err error) + BlackListFunc(ctx context.Context, req *system.BlackListReq) (res *system.BlackListRes, err error) +} + +var localBusConstructionBlacklist IBusConstructionBlacklist + +func BusConstructionBlacklist() IBusConstructionBlacklist { + if localBusConstructionBlacklist == nil { + panic("implement not found for interface IBusConstructionBlacklist, forgot register?") + } + return localBusConstructionBlacklist +} + +func RegisterBusConstructionBlacklist(i IBusConstructionBlacklist) { + localBusConstructionBlacklist = i +} diff --git a/internal/app/system/service/bus_construction_log.go b/internal/app/system/service/bus_construction_log.go new file mode 100644 index 0000000..477082c --- /dev/null +++ b/internal/app/system/service/bus_construction_log.go @@ -0,0 +1,41 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-03-22 16:27:43 +// 生成路径: internal/app/system/service/bus_construction_log.go +// 生成人:gfast +// desc:施工日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusConstructionLog interface { + List(ctx context.Context, req *system.BusConstructionLogSearchReq) (res *system.BusConstructionLogSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.AppletDetails, err error) + Add(ctx context.Context, req *system.BusConstructionLogAddReq) (err error) + Edit(ctx context.Context, req *system.BusConstructionLogEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + ConstructionLogAdd(ctx context.Context, req *wxApplet.ConstructionLogAddReq) (err error) + ConstructionLogDetails(ctx context.Context, req *wxApplet.ConstructionLogDetailsReq) (res *wxApplet.ConstructionLogDetailsRes, err error) + ConstructionLogList(ctx context.Context, req *wxApplet.ConstructionLogListReq) (res *wxApplet.ConstructionLogListRes, err error) +} + +var localBusConstructionLog IBusConstructionLog + +func BusConstructionLog() IBusConstructionLog { + if localBusConstructionLog == nil { + panic("implement not found for interface IBusConstructionLog, forgot register?") + } + return localBusConstructionLog +} + +func RegisterBusConstructionLog(i IBusConstructionLog) { + localBusConstructionLog = i +} diff --git a/internal/app/system/service/bus_construction_project.go b/internal/app/system/service/bus_construction_project.go new file mode 100644 index 0000000..5af155e --- /dev/null +++ b/internal/app/system/service/bus_construction_project.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-07 10:17:50 +// 生成路径: internal/app/system/service/bus_construction_project.go +// 生成人:gfast +// desc:施工人员对应项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusConstructionProject interface { + List(ctx context.Context, req *system.BusConstructionProjectSearchReq) (res *system.BusConstructionProjectSearchRes, err error) + GetById(ctx context.Context, Id uint64) (res *model.BusConstructionProjectInfoRes, err error) + Add(ctx context.Context, req *system.BusConstructionProjectAddReq) (err error) + Edit(ctx context.Context, req *system.BusConstructionProjectEditReq) (err error) + Delete(ctx context.Context, Id []uint64) (err error) +} + +var localBusConstructionProject IBusConstructionProject + +func BusConstructionProject() IBusConstructionProject { + if localBusConstructionProject == nil { + panic("implement not found for interface IBusConstructionProject, forgot register?") + } + return localBusConstructionProject +} + +func RegisterBusConstructionProject(i IBusConstructionProject) { + localBusConstructionProject = i +} diff --git a/internal/app/system/service/bus_construction_user.go b/internal/app/system/service/bus_construction_user.go new file mode 100644 index 0000000..a03efbf --- /dev/null +++ b/internal/app/system/service/bus_construction_user.go @@ -0,0 +1,51 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-07 10:31:18 +// 生成路径: internal/app/system/service/bus_construction_user.go +// 生成人:gfast +// desc:施工人员 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusConstructionUser interface { + DepartureRecordFunc(ctx context.Context, req *system.DepartureRecordReq) (res *system.DepartureRecordRes, err error) + DepartureFunc(ctx context.Context, req *system.DepartureReq) (err error) + List(ctx context.Context, req *system.BusConstructionUserSearchReq) (res *system.BusConstructionUserSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusConstructionUserInfoRes, err error) + //Add(ctx context.Context, req *system.BusConstructionUserAddReq) (err error) + Edit(ctx context.Context, req *system.BusConstructionUserEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + ExportSalaryFunc(ctx context.Context, req *system.ExportSalaryReq) (res *system.ExportSalaryRes, err error) + OneClickOpenFunc(ctx context.Context, req *system.OneClickOpenReq) (err error) + ClockingConditionFunc(ctx context.Context, req *system.ClockingConditionReq) (err error) + TemplateExportFunc(ctx context.Context, req *system.TemplateExportReq) (path string, err error) + ZipFolderuploadFunc(ctx context.Context, req *system.ZipFolderuploadReq) (err error) + AppExitFunc(ctx context.Context, req *wxApplet.AppExitReq) (err error) + AppResubmitTheExitAttachmentFunc(ctx context.Context, req *wxApplet.AppResubmitTheExitAttachmentReq) (err error) + PcCollectDataForTwoWeeksFunc(ctx context.Context, req *system.PcCollectDataForTwoWeeksReq) (res *system.PcCollectDataForTwoWeeksRes, err error) + PcSelectBelowProjectOfPersonnelFunc(ctx context.Context, req *system.PcSelectBelowProjectOfPersonnelReq) (res *system.PcSelectBelowProjectOfPersonnelRes, err error) + PcQueryBasedOnOpenidFunc(ctx context.Context, req *system.PcQueryBasedOnOpenidReq) (res *system.PcQueryBasedOnOpenidRes, err error) + AppRegisteredButNotVerifiedWithRealNameFunc(ctx context.Context, req *wxApplet.AppRegisteredButNotVerifiedWithRealNameReq) (res *wxApplet.AppRegisteredButNotVerifiedWithRealNameRes, err error) +} + +var localBusConstructionUser IBusConstructionUser + +func BusConstructionUser() IBusConstructionUser { + if localBusConstructionUser == nil { + panic("implement not found for interface IBusConstructionUser, forgot register?") + } + return localBusConstructionUser +} + +func RegisterBusConstructionUser(i IBusConstructionUser) { + localBusConstructionUser = i +} diff --git a/internal/app/system/service/bus_construction_user_file.go b/internal/app/system/service/bus_construction_user_file.go new file mode 100644 index 0000000..1925c99 --- /dev/null +++ b/internal/app/system/service/bus_construction_user_file.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-07 10:17:41 +// 生成路径: internal/app/system/service/bus_construction_user_file.go +// 生成人:gfast +// desc:微信用户的文件存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusConstructionUserFile interface { + List(ctx context.Context, req *system.BusConstructionUserFileSearchReq) (res *system.BusConstructionUserFileSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusConstructionUserFileInfoRes, err error) + GetBySafetyId(ctx context.Context, req *system.BusConstructionUserFileGetSafetyFileReq) (res *system.BusConstructionUserFileGetSafetyFileRes, err error) + Add(ctx context.Context, req *system.BusConstructionUserFileAddReq) (err error) + Edit(ctx context.Context, req *system.BusConstructionUserFileEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localBusConstructionUserFile IBusConstructionUserFile + +func BusConstructionUserFile() IBusConstructionUserFile { + if localBusConstructionUserFile == nil { + panic("implement not found for interface IBusConstructionUserFile, forgot register?") + } + return localBusConstructionUserFile +} + +func RegisterBusConstructionUserFile(i IBusConstructionUserFile) { + localBusConstructionUserFile = i +} diff --git a/internal/app/system/service/bus_construction_user_post.go b/internal/app/system/service/bus_construction_user_post.go new file mode 100644 index 0000000..67b9d5b --- /dev/null +++ b/internal/app/system/service/bus_construction_user_post.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-07 10:06:34 +// 生成路径: internal/app/system/service/bus_construction_user_post.go +// 生成人:gfast +// desc:施工人员岗位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusConstructionUserPost interface { + List(ctx context.Context, req *system.BusConstructionUserPostSearchReq) (res *system.BusConstructionUserPostSearchRes, err error) + GetById(ctx context.Context, Id uint64) (res *model.BusConstructionUserPostInfoRes, err error) + Add(ctx context.Context, req *system.BusConstructionUserPostAddReq) (err error) + Edit(ctx context.Context, req *system.BusConstructionUserPostEditReq) (err error) + Delete(ctx context.Context, Id []uint64) (err error) +} + +var localBusConstructionUserPost IBusConstructionUserPost + +func BusConstructionUserPost() IBusConstructionUserPost { + if localBusConstructionUserPost == nil { + panic("implement not found for interface IBusConstructionUserPost, forgot register?") + } + return localBusConstructionUserPost +} + +func RegisterBusConstructionUserPost(i IBusConstructionUserPost) { + localBusConstructionUserPost = i +} diff --git a/internal/app/system/service/bus_corporate_events.go b/internal/app/system/service/bus_corporate_events.go new file mode 100644 index 0000000..fe941f1 --- /dev/null +++ b/internal/app/system/service/bus_corporate_events.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-03-20 16:49:36 +// 生成路径: internal/app/system/service/bus_corporate_events.go +// 生成人:gfast +// desc:企业大事记 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusCorporateEvents interface { + List(ctx context.Context, req *system.BusCorporateEventsSearchReq) (res *system.BusCorporateEventsSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusCorporateEventsInfoRes, err error) + Add(ctx context.Context, req *system.BusCorporateEventsAddReq) (err error) + Edit(ctx context.Context, req *system.BusCorporateEventsEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localBusCorporateEvents IBusCorporateEvents + +func BusCorporateEvents() IBusCorporateEvents { + if localBusCorporateEvents == nil { + panic("implement not found for interface IBusCorporateEvents, forgot register?") + } + return localBusCorporateEvents +} + +func RegisterBusCorporateEvents(i IBusCorporateEvents) { + localBusCorporateEvents = i +} diff --git a/internal/app/system/service/bus_design_audit.go b/internal/app/system/service/bus_design_audit.go new file mode 100644 index 0000000..3e91fd1 --- /dev/null +++ b/internal/app/system/service/bus_design_audit.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-04-09 15:40:16 +// 生成路径: internal/app/system/service/bus_design_audit.go +// 生成人:gfast +// desc:设计审核(竣工、施工、可研) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusDesignAudit interface { + List(ctx context.Context, req *system.BusDesignAuditSearchReq) (res *system.BusDesignAuditSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusDesignAuditInfoRes, err error) + Add(ctx context.Context, req *system.BusDesignAuditAddReq) (err error) + Edit(ctx context.Context, req *system.BusDesignAuditEditReq) (err error) + Delete(ctx context.Context, Id int64) (err error) +} + +var localBusDesignAudit IBusDesignAudit + +func BusDesignAudit() IBusDesignAudit { + if localBusDesignAudit == nil { + panic("implement not found for interface IBusDesignAudit, forgot register?") + } + return localBusDesignAudit +} + +func RegisterBusDesignAudit(i IBusDesignAudit) { + localBusDesignAudit = i +} diff --git a/internal/app/system/service/bus_design_document.go b/internal/app/system/service/bus_design_document.go new file mode 100644 index 0000000..f71e4c7 --- /dev/null +++ b/internal/app/system/service/bus_design_document.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-07-29 16:31:29 +// 生成路径: internal/app/system/service/bus_design_document.go +// 生成人:gfast +// desc:设计管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusDesignDocument interface { + List(ctx context.Context, req *system.BusDesignDocumentSearchReq) (res *system.BusDesignDocumentSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusDesignDocumentInfoRes, err error) + Add(ctx context.Context, req *system.BusDesignDocumentAddReq) (err error) + Edit(ctx context.Context, req *system.BusDesignDocumentEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localBusDesignDocument IBusDesignDocument + +func BusDesignDocument() IBusDesignDocument { + if localBusDesignDocument == nil { + panic("implement not found for interface IBusDesignDocument, forgot register?") + } + return localBusDesignDocument +} + +func RegisterBusDesignDocument(i IBusDesignDocument) { + localBusDesignDocument = i +} diff --git a/internal/app/system/service/bus_design_period_range.go b/internal/app/system/service/bus_design_period_range.go new file mode 100644 index 0000000..4c56cad --- /dev/null +++ b/internal/app/system/service/bus_design_period_range.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-04-11 17:28:54 +// 生成路径: internal/app/system/service/bus_design_period_range.go +// 生成人:gfast +// desc:设计-周期范围 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusDesignPeriodRange interface { + List(ctx context.Context, req *system.BusDesignPeriodRangeSearchReq) (res *system.BusDesignPeriodRangeSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusDesignPeriodRangeInfoRes, err error) + Add(ctx context.Context, req *system.BusDesignPeriodRangeAddReq) (err error) + Edit(ctx context.Context, req *system.BusDesignPeriodRangeEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localBusDesignPeriodRange IBusDesignPeriodRange + +func BusDesignPeriodRange() IBusDesignPeriodRange { + if localBusDesignPeriodRange == nil { + panic("implement not found for interface IBusDesignPeriodRange, forgot register?") + } + return localBusDesignPeriodRange +} + +func RegisterBusDesignPeriodRange(i IBusDesignPeriodRange) { + localBusDesignPeriodRange = i +} diff --git a/internal/app/system/service/bus_engineering_quality.go b/internal/app/system/service/bus_engineering_quality.go new file mode 100644 index 0000000..edd7c5d --- /dev/null +++ b/internal/app/system/service/bus_engineering_quality.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-07-29 09:31:22 +// 生成路径: internal/app/system/service/bus_engineering_quality.go +// 生成人:gfast +// desc:工程质量列 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusEngineeringQuality interface { + List(ctx context.Context, req *system.BusEngineeringQualitySearchReq) (res *system.BusEngineeringQualitySearchRes, err error) + GetById(ctx context.Context, Id uint64) (res *model.BusEngineeringQualityInfoRes, err error) + Add(ctx context.Context, req *system.BusEngineeringQualityAddReq) (err error) + Edit(ctx context.Context, req *system.BusEngineeringQualityEditReq) (err error) + Delete(ctx context.Context, Id []uint64) (err error) + BusEngineeringQualityUploading(ctx context.Context, req *system.BusEngineeringQualityUploadingReq) (err error) +} + +var localBusEngineeringQuality IBusEngineeringQuality + +func BusEngineeringQuality() IBusEngineeringQuality { + if localBusEngineeringQuality == nil { + panic("implement not found for interface IBusEngineeringQuality, forgot register?") + } + return localBusEngineeringQuality +} + +func RegisterBusEngineeringQuality(i IBusEngineeringQuality) { + localBusEngineeringQuality = i +} diff --git a/internal/app/system/service/bus_equipment_equipment_unpacking.go b/internal/app/system/service/bus_equipment_equipment_unpacking.go new file mode 100644 index 0000000..3c62a51 --- /dev/null +++ b/internal/app/system/service/bus_equipment_equipment_unpacking.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-07-29 11:14:45 +// 生成路径: internal/app/system/service/bus_equipment_equipment_unpacking.go +// 生成人:gfast +// desc:开箱记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusEquipmentEquipmentUnpacking interface { + List(ctx context.Context, req *system.BusEquipmentEquipmentUnpackingSearchReq) (res *system.BusEquipmentEquipmentUnpackingSearchRes, err error) + GetByUnpackingId(ctx context.Context, UnpackingId int64) (res *model.BusEquipmentEquipmentUnpackingInfoRes, err error) + Add(ctx context.Context, req *system.BusEquipmentEquipmentUnpackingAddReq) (err error) + Edit(ctx context.Context, req *system.BusEquipmentEquipmentUnpackingEditReq) (err error) + Delete(ctx context.Context, UnpackingId []int64) (err error) +} + +var localBusEquipmentEquipmentUnpacking IBusEquipmentEquipmentUnpacking + +func BusEquipmentEquipmentUnpacking() IBusEquipmentEquipmentUnpacking { + if localBusEquipmentEquipmentUnpacking == nil { + panic("implement not found for interface IBusEquipmentEquipmentUnpacking, forgot register?") + } + return localBusEquipmentEquipmentUnpacking +} + +func RegisterBusEquipmentEquipmentUnpacking(i IBusEquipmentEquipmentUnpacking) { + localBusEquipmentEquipmentUnpacking = i +} diff --git a/internal/app/system/service/bus_equipment_materials.go b/internal/app/system/service/bus_equipment_materials.go new file mode 100644 index 0000000..3838449 --- /dev/null +++ b/internal/app/system/service/bus_equipment_materials.go @@ -0,0 +1,43 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-07-29 11:14:16 +// 生成路径: internal/app/system/service/bus_equipment_materials.go +// 生成人:gfast +// desc:材料/设备名称 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusEquipmentMaterials interface { + List(ctx context.Context, req *system.BusEquipmentMaterialsSearchReq) (res *system.BusEquipmentMaterialsSearchRes, err error) + GetByEquipmentMaterialsId(ctx context.Context, EquipmentMaterialsId int64) (res *model.BusEquipmentMaterialsInfoRes, err error) + Add(ctx context.Context, req *system.BusEquipmentMaterialsAddReq) (err error) + Edit(ctx context.Context, req *system.BusEquipmentMaterialsEditReq) (err error) + Delete(ctx context.Context, EquipmentMaterialsId []int64) (err error) + MaterialsFunc(ctx context.Context, req *system.MaterialsReq) (res *system.MaterialsRes, err error) + ConditionFunc(ctx context.Context, req *system.ConditionReq) (res *system.ConditionRes, err error) + AppAdd(ctx context.Context, req *system.BusEquipmentMaterialsAppAddReq) (err error) + AppEdit(ctx context.Context, req *system.BusEquipmentMaterialsAppEditReq) (err error) + AppList(ctx context.Context, req *system.BusEquipmentMaterialsAppSearchReq) (listRes *system.BusEquipmentMaterialsAppSearchRes, err error) + AppGetById(ctx context.Context, equipmentMaterialsId int64) (res *model.BusEquipmentMaterialsAppFileInfoRes, err error) +} + +var localBusEquipmentMaterials IBusEquipmentMaterials + +func BusEquipmentMaterials() IBusEquipmentMaterials { + if localBusEquipmentMaterials == nil { + panic("implement not found for interface IBusEquipmentMaterials, forgot register?") + } + return localBusEquipmentMaterials +} + +func RegisterBusEquipmentMaterials(i IBusEquipmentMaterials) { + localBusEquipmentMaterials = i +} diff --git a/internal/app/system/service/bus_equipment_materials_excle.go b/internal/app/system/service/bus_equipment_materials_excle.go new file mode 100644 index 0000000..8cf81d3 --- /dev/null +++ b/internal/app/system/service/bus_equipment_materials_excle.go @@ -0,0 +1,34 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-09-13 14:21:30 +// 生成路径: internal/app/system/service/bus_equipment_materials_inventory.go +// 生成人:gfast +// desc:设备材料入库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" +) + +type IBusEquipmentMaterialsExcel interface { + List(ctx context.Context, req *system.BusEquipmentMaterialsExcelSearchReq) (listRes *system.BusEquipmentMaterialsExcelSearchRes, err error) + Edit(ctx context.Context, req *system.BusEquipmentMaterialsExcelEditReq) (err error) + Index(ctx context.Context, req *system.BusEquipmentMaterialsExcelIndexReq) (listRes *system.BusEquipmentMaterialsExcelIndexRes, err error) +} + +var localBusEquipmentMaterialsExcel IBusEquipmentMaterialsExcel + +func BusEquipmentMaterialsExcel() IBusEquipmentMaterialsExcel { + if localBusEquipmentMaterialsExcel == nil { + panic("implement not found for interface IBusEquipmentMaterialsExcel, forgot register?") + } + return localBusEquipmentMaterialsExcel +} + +func RegisterBusEquipmentMaterialsExcel(i IBusEquipmentMaterialsExcel) { + localBusEquipmentMaterialsExcel = i +} diff --git a/internal/app/system/service/bus_equipment_materials_inventory.go b/internal/app/system/service/bus_equipment_materials_inventory.go new file mode 100644 index 0000000..af320c2 --- /dev/null +++ b/internal/app/system/service/bus_equipment_materials_inventory.go @@ -0,0 +1,42 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-09-13 14:21:30 +// 生成路径: internal/app/system/service/bus_equipment_materials_inventory.go +// 生成人:gfast +// desc:设备材料入库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusEquipmentMaterialsInventory interface { + List(ctx context.Context, req *system.BusEquipmentMaterialsInventorySearchReq) (res *system.BusEquipmentMaterialsInventorySearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusEquipmentMaterialsInventoryInfoRes, err error) + Add(ctx context.Context, req *system.BusEquipmentMaterialsInventoryAddReq) (err error) + Edit(ctx context.Context, req *system.BusEquipmentMaterialsInventoryEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + AppAdd(ctx context.Context, req *system.BusEquipmentMaterialsInventoryAppAddReq) (err error) + AppEdit(ctx context.Context, req *system.BusEquipmentMaterialsInventoryAppEditReq) (err error) + AppList(ctx context.Context, req *system.BusEquipmentMaterialsInventoryAppSearchReq) (res *system.BusEquipmentMaterialsInventoryAppSearchRes, err error) + AppGetById(ctx context.Context, id int64) (res *model.BusEquipmentMaterialsInventoryAppInfoRes, err error) + AppDelete(ctx context.Context, ids []int64) (err error) +} + +var localBusEquipmentMaterialsInventory IBusEquipmentMaterialsInventory + +func BusEquipmentMaterialsInventory() IBusEquipmentMaterialsInventory { + if localBusEquipmentMaterialsInventory == nil { + panic("implement not found for interface IBusEquipmentMaterialsInventory, forgot register?") + } + return localBusEquipmentMaterialsInventory +} + +func RegisterBusEquipmentMaterialsInventory(i IBusEquipmentMaterialsInventory) { + localBusEquipmentMaterialsInventory = i +} diff --git a/internal/app/system/service/bus_equipment_materials_weight.go b/internal/app/system/service/bus_equipment_materials_weight.go new file mode 100644 index 0000000..2acc1f5 --- /dev/null +++ b/internal/app/system/service/bus_equipment_materials_weight.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-07-28 15:27:53 +// 生成路径: internal/app/system/service/bus_equipment_materials_weight.go +// 生成人:gfast +// desc:计量单位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusEquipmentMaterialsWeight interface { + List(ctx context.Context, req *system.BusEquipmentMaterialsWeightSearchReq) (res *system.BusEquipmentMaterialsWeightSearchRes, err error) + GetByWeightId(ctx context.Context, WeightId int64) (res *model.BusEquipmentMaterialsWeightInfoRes, err error) + Add(ctx context.Context, req *system.BusEquipmentMaterialsWeightAddReq) (err error) + Edit(ctx context.Context, req *system.BusEquipmentMaterialsWeightEditReq) (err error) + Delete(ctx context.Context, WeightId []int64) (err error) +} + +var localBusEquipmentMaterialsWeight IBusEquipmentMaterialsWeight + +func BusEquipmentMaterialsWeight() IBusEquipmentMaterialsWeight { + if localBusEquipmentMaterialsWeight == nil { + panic("implement not found for interface IBusEquipmentMaterialsWeight, forgot register?") + } + return localBusEquipmentMaterialsWeight +} + +func RegisterBusEquipmentMaterialsWeight(i IBusEquipmentMaterialsWeight) { + localBusEquipmentMaterialsWeight = i +} diff --git a/internal/app/system/service/bus_essential_information.go b/internal/app/system/service/bus_essential_information.go new file mode 100644 index 0000000..3f3d1f7 --- /dev/null +++ b/internal/app/system/service/bus_essential_information.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-03-20 19:38:54 +// 生成路径: internal/app/system/service/bus_essential_information.go +// 生成人:gfast +// desc:项目基本信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusEssentialInformation interface { + List(ctx context.Context, req *system.BusEssentialInformationSearchReq) (res *system.BusEssentialInformationSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusEssentialInformationInfoRes, err error) + Add(ctx context.Context, req *system.BusEssentialInformationAddReq) (err error) + Edit(ctx context.Context, req *system.BusEssentialInformationEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localBusEssentialInformation IBusEssentialInformation + +func BusEssentialInformation() IBusEssentialInformation { + if localBusEssentialInformation == nil { + panic("implement not found for interface IBusEssentialInformation, forgot register?") + } + return localBusEssentialInformation +} + +func RegisterBusEssentialInformation(i IBusEssentialInformation) { + localBusEssentialInformation = i +} diff --git a/internal/app/system/service/bus_folder.go b/internal/app/system/service/bus_folder.go new file mode 100644 index 0000000..8431bb0 --- /dev/null +++ b/internal/app/system/service/bus_folder.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-09-15 17:15:59 +// 生成路径: internal/app/system/service/bus_folder.go +// 生成人:gfast +// desc:文件夹 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusFolder interface { + List(ctx context.Context, req *system.BusFolderSearchReq) (res *system.BusFolderSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusFolderInfoRes, err error) + Add(ctx context.Context, req *system.BusFolderAddReq) (err error) + Edit(ctx context.Context, req *system.BusFolderEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + TreeFormListFunc(ctx context.Context, req *system.TreeFormListFuncReq) (res *system.TreeFormListFuncRes, err error) +} + +var localBusFolder IBusFolder + +func BusFolder() IBusFolder { + if localBusFolder == nil { + panic("implement not found for interface IBusFolder, forgot register?") + } + return localBusFolder +} + +func RegisterBusFolder(i IBusFolder) { + localBusFolder = i +} diff --git a/internal/app/system/service/bus_folder_file.go b/internal/app/system/service/bus_folder_file.go new file mode 100644 index 0000000..8b606bb --- /dev/null +++ b/internal/app/system/service/bus_folder_file.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-09-15 17:16:00 +// 生成路径: internal/app/system/service/bus_folder_file.go +// 生成人:gfast +// desc:文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusFolderFile interface { + List(ctx context.Context, req *system.BusFolderFileSearchReq) (res *system.BusFolderFileSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusFolderFileInfoRes, err error) + Add(ctx context.Context, req *system.BusFolderFileAddReq) (err error) + Edit(ctx context.Context, req *system.BusFolderFileEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localBusFolderFile IBusFolderFile + +func BusFolderFile() IBusFolderFile { + if localBusFolderFile == nil { + panic("implement not found for interface IBusFolderFile, forgot register?") + } + return localBusFolderFile +} + +func RegisterBusFolderFile(i IBusFolderFile) { + localBusFolderFile = i +} diff --git a/internal/app/system/service/bus_hse_management.go b/internal/app/system/service/bus_hse_management.go new file mode 100644 index 0000000..f8cb806 --- /dev/null +++ b/internal/app/system/service/bus_hse_management.go @@ -0,0 +1,47 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-03-28 14:53:05 +// 生成路径: internal/app/system/service/bus_hse_management.go +// 生成人:gfast +// desc:HSE-巡检工单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + wxSystem "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusHseManagement interface { + List(ctx context.Context, req *system.BusHseManagementSearchReq) (res *system.BusHseManagementSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusHseManagementDetailsRes, err error) + Add(ctx context.Context, req *system.BusHseManagementAddReq) (err error) + Edit(ctx context.Context, req *system.BusHseManagementEditReq) (err error) + EditReview(ctx context.Context, req *system.EditReviewReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + HseManagementAppletAddFunc(ctx context.Context, req *wxSystem.HseManagementAppletAddReq) (err error) + HseManagementAppletAbarbeitungFunc(ctx context.Context, req *wxSystem.HseManagementAppletAbarbeitungReq) (err error) + HseManagementAppletVerifyFunc(ctx context.Context, req *wxSystem.HseManagementAppletVerifyReq) (err error) + HseManagementAppletListFunc(ctx context.Context, req *wxSystem.HseManagementAppletListReq) (res *wxSystem.HseManagementAppletListRes, err error) + HseManagementAppletDetailsFunc(ctx context.Context, req *wxSystem.HseManagementAppletDetailsReq) (res *wxSystem.HseManagementAppletDetailsRes, err error) + GisSafetyManagementFunc(ctx context.Context, req *system.GisSafetyManagementReq) (res *system.GisSafetyManagementRes, err error) + GisSafetyManagementListFunc(ctx context.Context, req *system.GisSafetyManagementListReq) (res *system.GisSafetyManagementListRes, err error) + SafetyLargeScreenDetails(ctx context.Context, req *system.SafetyLargeScreenDetailsReq) (res *system.SafetyLargeScreenDetailsRes, err error) +} + +var localBusHseManagement IBusHseManagement + +func BusHseManagement() IBusHseManagement { + if localBusHseManagement == nil { + panic("implement not found for interface IBusHseManagement, forgot register?") + } + return localBusHseManagement +} + +func RegisterBusHseManagement(i IBusHseManagement) { + localBusHseManagement = i +} diff --git a/internal/app/system/service/bus_hse_security_log.go b/internal/app/system/service/bus_hse_security_log.go new file mode 100644 index 0000000..01968d5 --- /dev/null +++ b/internal/app/system/service/bus_hse_security_log.go @@ -0,0 +1,42 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-04-07 17:00:45 +// 生成路径: internal/app/system/service/bus_hse_security_log.go +// 生成人:gfast +// desc:HSE安全日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + wxSystem "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusHseSecurityLog interface { + List(ctx context.Context, req *system.BusHseSecurityLogSearchReq) (res *system.BusHseSecurityLogSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusHseSecurityLogInfoTwoRes, err error) + AddText(ctx context.Context, req *system.BusHseSecurityLogAddTxetReq) (err error) + AddFile(ctx context.Context, req *system.BusHseSecurityLogAddFileReq) (err error) + Edit(ctx context.Context, req *system.BusHseSecurityLogEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + HseSecurityLogAppletAdd(ctx context.Context, req *wxSystem.HseSecurityLogAppletAddReq) (err error) + HseSecurityLogAppletList(ctx context.Context, req *wxSystem.HseSecurityLogAppletListReq) (res *wxSystem.HseSecurityLogAppletListRes, err error) + HseSecurityLogAppletDetails(ctx context.Context, req *wxSystem.HseSecurityLogAppletDetailsReq) (res *wxSystem.HseSecurityLogAppletDetailsRes, err error) +} + +var localBusHseSecurityLog IBusHseSecurityLog + +func BusHseSecurityLog() IBusHseSecurityLog { + if localBusHseSecurityLog == nil { + panic("implement not found for interface IBusHseSecurityLog, forgot register?") + } + return localBusHseSecurityLog +} + +func RegisterBusHseSecurityLog(i IBusHseSecurityLog) { + localBusHseSecurityLog = i +} diff --git a/internal/app/system/service/bus_inspection_ticket.go b/internal/app/system/service/bus_inspection_ticket.go new file mode 100644 index 0000000..bdfe5a0 --- /dev/null +++ b/internal/app/system/service/bus_inspection_ticket.go @@ -0,0 +1,49 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-03-21 15:23:59 +// 生成路径: internal/app/system/service/bus_inspection_ticket.go +// 生成人:gfast +// desc:质量工单 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + wxSystem "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusInspectionTicket interface { + UpdataCorrector(ctx context.Context, req *system.UpdataCorrectorReq) (err error) + List(ctx context.Context, req *system.BusInspectionTicketSearchReq) (res *system.BusInspectionTicketSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.AppletDetailsRes, err error) + Add(ctx context.Context, req *system.BusInspectionTicketAddReq) (err error) + Edit(ctx context.Context, req *system.BusInspectionTicketAbarbeitungReq) (err error) + LargeScreenDetails(ctx context.Context, req *system.LargeScreenDetailsReq) (res *system.LargeScreenDetailsRes, err error) + EditVerification(ctx context.Context, req *system.BusInspectionTicketVerificationReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + InspectionTicketAppletAddFunc(ctx context.Context, req *wxSystem.InspectionTicketAppletAddReq) (err error) + InspectionTicketAppletAbarbeitungFunc(ctx context.Context, req *wxSystem.InspectionTicketAppletAbarbeitungReq) (err error) + InspectionTicketAppletVerifyFunc(ctx context.Context, req *wxSystem.InspectionTicketAppletVerifyReq) (err error) + InspectionTicketAppletListFunc(ctx context.Context, req *wxSystem.InspectionTicketAppletListReq) (res *wxSystem.InspectionTicketAppletListRes, err error) + AcquisitionOfCorrectivePersonnelFunc(ctx context.Context, req *wxSystem.AcquisitionOfCorrectivePersonnelReq) (res *wxSystem.AcquisitionOfCorrectivePersonnelRes, err error) + InspectionTicketAppletDetailsFunc(ctx context.Context, req *wxSystem.InspectionTicketAppletDetailsReq) (res *wxSystem.InspectionTicketAppletDetailsRes, err error) + GisQualityManagementResFunc(ctx context.Context, req *system.GisQualityManagementReq) (res *system.GisQualityManagementRes, err error) + GisQualityManagementListFunc(ctx context.Context, req *system.GisQualityManagementListReq) (res *system.GisQualityManagementListRes, err error) +} + +var localBusInspectionTicket IBusInspectionTicket + +func BusInspectionTicket() IBusInspectionTicket { + if localBusInspectionTicket == nil { + panic("implement not found for interface IBusInspectionTicket, forgot register?") + } + return localBusInspectionTicket +} + +func RegisterBusInspectionTicket(i IBusInspectionTicket) { + localBusInspectionTicket = i +} diff --git a/internal/app/system/service/bus_machinery.go b/internal/app/system/service/bus_machinery.go new file mode 100644 index 0000000..2fdb5ed --- /dev/null +++ b/internal/app/system/service/bus_machinery.go @@ -0,0 +1,40 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-07-29 14:02:01 +// 生成路径: internal/app/system/service/bus_machinery.go +// 生成人:gfast +// desc:机械 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusMachinery interface { + List(ctx context.Context, req *system.BusMachinerySearchReq) (res *system.BusMachinerySearchRes, err error) + GetById(ctx context.Context, Id uint64) (res *model.BusMachineryInfoRes, err error) + Add(ctx context.Context, req *system.BusMachineryAddReq) (err error) + Edit(ctx context.Context, req *system.BusMachineryEditReq) (err error) + Delete(ctx context.Context, Id []uint64) (err error) + MachineNumberFunc(ctx context.Context, req *system.MachineNumberReq) (res *system.MachineNumberRes, err error) + MechanicalConditionFunc(ctx context.Context, req *system.MechanicalConditionReq) (res *system.MechanicalConditionRes, err error) + AppList(ctx context.Context, req *system.BusMachineryAppSearchReq) (listRes *system.BusMachineryAppSearchRes, err error) +} + +var localBusMachinery IBusMachinery + +func BusMachinery() IBusMachinery { + if localBusMachinery == nil { + panic("implement not found for interface IBusMachinery, forgot register?") + } + return localBusMachinery +} + +func RegisterBusMachinery(i IBusMachinery) { + localBusMachinery = i +} diff --git a/internal/app/system/service/bus_machinery_detail.go b/internal/app/system/service/bus_machinery_detail.go new file mode 100644 index 0000000..5060b92 --- /dev/null +++ b/internal/app/system/service/bus_machinery_detail.go @@ -0,0 +1,41 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-10-12 11:41:32 +// 生成路径: internal/app/system/service/bus_machinery_detail.go +// 生成人:gfast +// desc:机械详情 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusMachineryDetail interface { + List(ctx context.Context, req *system.BusMachineryDetailSearchReq) (res *system.BusMachineryDetailSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusMachineryDetailGetIdInfoRes, err error) + Add(ctx context.Context, req *system.BusMachineryDetailAddReq) (err error) + Edit(ctx context.Context, req *system.BusMachineryDetailEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + AppList(ctx context.Context, req *system.BusMachineryDetailAppSearchReq) (listRes *system.BusMachineryDetailAppSearchRes, err error) + AppAdd(ctx context.Context, req *system.BusMachineryDetailAppAddReq) (err error) + AppEdit(ctx context.Context, req *system.BusMachineryDetailAppEditReq) (err error) + AppGetById(ctx context.Context, id int64) (res *model.BusMachineryDetailAppGetIdInfoRes, err error) +} + +var localBusMachineryDetail IBusMachineryDetail + +func BusMachineryDetail() IBusMachineryDetail { + if localBusMachineryDetail == nil { + panic("implement not found for interface IBusMachineryDetail, forgot register?") + } + return localBusMachineryDetail +} + +func RegisterBusMachineryDetail(i IBusMachineryDetail) { + localBusMachineryDetail = i +} diff --git a/internal/app/system/service/bus_payroll_list.go b/internal/app/system/service/bus_payroll_list.go new file mode 100644 index 0000000..e9f9411 --- /dev/null +++ b/internal/app/system/service/bus_payroll_list.go @@ -0,0 +1,42 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-11-20 13:51:38 +// 生成路径: internal/app/system/service/bus_payroll_list.go +// 生成人:gfast +// desc:工资(excel导入形成的) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusPayrollList interface { + ImportExcelPaySheet(ctx context.Context, req *system.ImportExcelPaySheetReq) (err error) + ReadAllImportedListData(ctx context.Context, req *system.ReadAllImportedListDataReq) (res *system.ReadAllImportedListDataRes, err error) + GetTheSourceExcelAccordingToTheIdOfThePayroll(ctx context.Context, req *system.GetTheSourceExcelAccordingToTheIdOfThePayrollReq) (res *system.GetTheSourceExcelAccordingToTheIdOfThePayrollRes, err error) + DeletePayroll(ctx context.Context, req *system.BusDeletePayrollReq) (err error) + + List(ctx context.Context, req *system.BusPayrollListSearchReq) (res *system.BusPayrollListSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusPayrollListInfoRes, err error) + Add(ctx context.Context, req *system.BusPayrollListAddReq) (err error) + Edit(ctx context.Context, req *system.BusPayrollListEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localBusPayrollList IBusPayrollList + +func BusPayrollList() IBusPayrollList { + if localBusPayrollList == nil { + panic("implement not found for interface IBusPayrollList, forgot register?") + } + return localBusPayrollList +} + +func RegisterBusPayrollList(i IBusPayrollList) { + localBusPayrollList = i +} diff --git a/internal/app/system/service/bus_projectin_progress.go b/internal/app/system/service/bus_projectin_progress.go new file mode 100644 index 0000000..843a1f3 --- /dev/null +++ b/internal/app/system/service/bus_projectin_progress.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-03-20 19:45:19 +// 生成路径: internal/app/system/service/bus_projectin_progress.go +// 生成人:gfast +// desc:在建项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusProjectinProgress interface { + List(ctx context.Context, req *system.BusProjectinProgressSearchReq) (res *system.BusProjectinProgressSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusProjectinProgressInfoRes, err error) + Add(ctx context.Context, req *system.BusProjectinProgressAddReq) (err error) + Edit(ctx context.Context, req *system.BusProjectinProgressEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localBusProjectinProgress IBusProjectinProgress + +func BusProjectinProgress() IBusProjectinProgress { + if localBusProjectinProgress == nil { + panic("implement not found for interface IBusProjectinProgress, forgot register?") + } + return localBusProjectinProgress +} + +func RegisterBusProjectinProgress(i IBusProjectinProgress) { + localBusProjectinProgress = i +} diff --git a/internal/app/system/service/bus_quality.go b/internal/app/system/service/bus_quality.go new file mode 100644 index 0000000..476d735 --- /dev/null +++ b/internal/app/system/service/bus_quality.go @@ -0,0 +1,42 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-02 17:11:39 +// 生成路径: internal/app/system/service/bus_quality.go +// 生成人:gfast +// desc:质量文档管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusQuality interface { + List(ctx context.Context, req *system.BusQualitySearchReq) (res *system.BusQualitySearchRes, err error) + GetById(ctx context.Context, Id uint64) (res *model.BusQualityInfoRes, err error) + Add(ctx context.Context, req *system.BusQualityAddReq) (err error) + Edit(ctx context.Context, req *system.BusQualityEditReq) (err error) + Delete(ctx context.Context, Id []uint64) (err error) + GraphFunc(ctx context.Context, req *system.GraphReq) (res *system.GraphRes, err error) + GraphDataListFunc(ctx context.Context, req *system.GraphDataListReq) (res *system.GraphDataListRes, err error) + QualityFunc(ctx context.Context, req *system.QualityReq) (res *system.QualityRes, err error) + QualityDataListFunc(ctx context.Context, req *system.QualityDataListReq) (res *system.QualityDataListRes, err error) + WxAddFunc(ctx context.Context, req *system.WxBusQualityAddReq) (err error) +} + +var localBusQuality IBusQuality + +func BusQuality() IBusQuality { + if localBusQuality == nil { + panic("implement not found for interface IBusQuality, forgot register?") + } + return localBusQuality +} + +func RegisterBusQuality(i IBusQuality) { + localBusQuality = i +} diff --git a/internal/app/system/service/bus_question_bank.go b/internal/app/system/service/bus_question_bank.go new file mode 100644 index 0000000..340b8be --- /dev/null +++ b/internal/app/system/service/bus_question_bank.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-10-07 15:52:18 +// 生成路径: internal/app/system/service/bus_question_bank.go +// 生成人:gfast +// desc:题库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusQuestionBank interface { + List(ctx context.Context, req *system.BusQuestionBankSearchReq) (res *system.BusQuestionBankSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusQuestionBankInfoRes, err error) + Add(ctx context.Context, req *system.BusQuestionBankAddReq) (err error) + Edit(ctx context.Context, req *system.BusQuestionBankEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localBusQuestionBank IBusQuestionBank + +func BusQuestionBank() IBusQuestionBank { + if localBusQuestionBank == nil { + panic("implement not found for interface IBusQuestionBank, forgot register?") + } + return localBusQuestionBank +} + +func RegisterBusQuestionBank(i IBusQuestionBank) { + localBusQuestionBank = i +} diff --git a/internal/app/system/service/bus_question_save.go b/internal/app/system/service/bus_question_save.go new file mode 100644 index 0000000..5d70b39 --- /dev/null +++ b/internal/app/system/service/bus_question_save.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-11-01 17:33:04 +// 生成路径: internal/app/system/service/bus_question_save.go +// 生成人:gfast +// desc:用户试卷存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusQuestionSave interface { + List(ctx context.Context, req *system.BusQuestionSaveSearchReq) (res *system.BusQuestionSaveSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusQuestionSaveInfoRes, err error) + Add(ctx context.Context, req *system.BusQuestionSaveAddReq) (res *system.BusQuestionSaveAddRes, err error) + Delete(ctx context.Context, Id []int64) (err error) + PassOrNotFunc(ctx context.Context, openid string) (res *system.PassOrNotRes, err error) + WeChatPdfWoFunc(ctx context.Context, req *system.WeChatPdfWoReq) (res *system.WeChatPdfWoRes, err error) +} + +var localBusQuestionSave IBusQuestionSave + +func BusQuestionSave() IBusQuestionSave { + if localBusQuestionSave == nil { + panic("implement not found for interface IBusQuestionSave, forgot register?") + } + return localBusQuestionSave +} + +func RegisterBusQuestionSave(i IBusQuestionSave) { + localBusQuestionSave = i +} diff --git a/internal/app/system/service/bus_questions_configuration.go b/internal/app/system/service/bus_questions_configuration.go new file mode 100644 index 0000000..5e4a77a --- /dev/null +++ b/internal/app/system/service/bus_questions_configuration.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-10-07 17:11:20 +// 生成路径: internal/app/system/service/bus_questions_configuration.go +// 生成人:gfast +// desc:题库配置 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusQuestionsConfiguration interface { + List(ctx context.Context, req *system.BusQuestionsConfigurationSearchReq) (res *system.BusQuestionsConfigurationSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusQuestionsConfigurationInfoRes, err error) + Add(ctx context.Context, req *system.BusQuestionsConfigurationAddReq) (err error) + Edit(ctx context.Context, req *system.BusQuestionsConfigurationEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localBusQuestionsConfiguration IBusQuestionsConfiguration + +func BusQuestionsConfiguration() IBusQuestionsConfiguration { + if localBusQuestionsConfiguration == nil { + panic("implement not found for interface IBusQuestionsConfiguration, forgot register?") + } + return localBusQuestionsConfiguration +} + +func RegisterBusQuestionsConfiguration(i IBusQuestionsConfiguration) { + localBusQuestionsConfiguration = i +} diff --git a/internal/app/system/service/bus_reissue_a_card.go b/internal/app/system/service/bus_reissue_a_card.go new file mode 100644 index 0000000..51e9e67 --- /dev/null +++ b/internal/app/system/service/bus_reissue_a_card.go @@ -0,0 +1,46 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-02-02 15:18:48 +// 生成路径: internal/app/system/service/bus_reissue_a_card.go +// 生成人:gfast +// desc:施工人员补卡申请 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusReissueACard interface { + List(ctx context.Context, req *system.BusReissueACardSearchReq) (res *system.BusReissueACardSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusReissueACardInfoRes, err error) + Add(ctx context.Context, req *system.BusReissueACardAddReq) (err error) + Edit(ctx context.Context, req *system.BusReissueACardEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + ReissueACardWxAdd(ctx context.Context, req *wxApplet.ReissueACardWxAddReq) (err error) + ReissueACardWxGetByIdFunc(ctx context.Context, req *wxApplet.ReissueACardWxGetByIdReq) (res *wxApplet.ReissueACardWxGetByIdRes, err error) + ReissueACardWxGetByIdTeam(ctx context.Context, req *wxApplet.ReissueACardWxGetByIdTeamReq) (res *wxApplet.ReissueACardWxGetByIdTeamRes, err error) + ReissueACardWxEditTeam(ctx context.Context, req *wxApplet.ReissueACardWxEditTeamReq) (err error) + JobForemanSumnumberFunc(ctx context.Context, req *wxApplet.JobForemanSumnumberReq) (number int, err error) + AppTheTeamLeaderSupplementCardApprovalListFun(ctx context.Context, req *model.AppTheTeamLeaderSupplementCardApprovalRes) (res *wxApplet.AppTheTeamLeaderSupplementCardApprovalListRes, err error) + AppApprovalRecordDetailsFunc(ctx context.Context, req *wxApplet.AppApprovalRecordDetailsReq) (res *wxApplet.AppApprovalRecordDetailsRes, err error) + //AdministratorApprovalFunc(ctx context.Context, req *wxApplet.AdministratorApprovalReq) (res *wxApplet.AdministratorApprovalRes, err error) +} + +var localBusReissueACard IBusReissueACard + +func BusReissueACard() IBusReissueACard { + if localBusReissueACard == nil { + panic("implement not found for interface IBusReissueACard, forgot register?") + } + return localBusReissueACard +} + +func RegisterBusReissueACard(i IBusReissueACard) { + localBusReissueACard = i +} diff --git a/internal/app/system/service/bus_research_document.go b/internal/app/system/service/bus_research_document.go new file mode 100644 index 0000000..969f0e6 --- /dev/null +++ b/internal/app/system/service/bus_research_document.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-07-29 16:04:06 +// 生成路径: internal/app/system/service/bus_research_document.go +// 生成人:gfast +// desc:科研文档 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusResearchDocument interface { + List(ctx context.Context, req *system.BusResearchDocumentSearchReq) (res *system.BusResearchDocumentSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusResearchDocumentInfoRes, err error) + Add(ctx context.Context, req *system.BusResearchDocumentAddReq) (err error) + Edit(ctx context.Context, req *system.BusResearchDocumentEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localBusResearchDocument IBusResearchDocument + +func BusResearchDocument() IBusResearchDocument { + if localBusResearchDocument == nil { + panic("implement not found for interface IBusResearchDocument, forgot register?") + } + return localBusResearchDocument +} + +func RegisterBusResearchDocument(i IBusResearchDocument) { + localBusResearchDocument = i +} diff --git a/internal/app/system/service/bus_safety.go b/internal/app/system/service/bus_safety.go new file mode 100644 index 0000000..742938d --- /dev/null +++ b/internal/app/system/service/bus_safety.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-02 15:40:48 +// 生成路径: internal/app/system/service/bus_safety.go +// 生成人:gfast +// desc:安全例会管理 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusSafety interface { + List(ctx context.Context, req *system.BusSafetySearchReq) (res *system.BusSafetySearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusSafetyInfoRes, err error) + Add(ctx context.Context, req *system.BusSafetyAddReq) (err error) + Edit(ctx context.Context, req *system.BusSafetyEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + WxAddFunc(ctx context.Context, req *system.WxBusSafetyAddReq) (err error) +} + +var localBusSafety IBusSafety + +func BusSafety() IBusSafety { + if localBusSafety == nil { + panic("implement not found for interface IBusSafety, forgot register?") + } + return localBusSafety +} + +func RegisterBusSafety(i IBusSafety) { + localBusSafety = i +} diff --git a/internal/app/system/service/bus_salary_details.go b/internal/app/system/service/bus_salary_details.go new file mode 100644 index 0000000..cbc787c --- /dev/null +++ b/internal/app/system/service/bus_salary_details.go @@ -0,0 +1,39 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-02-01 16:39:01 +// 生成路径: internal/app/system/service/bus_salary_details.go +// 生成人:gfast +// desc:员工工资考核记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusSalaryDetails interface { + List(ctx context.Context, req *system.BusSalaryDetailsSearchReq) (res *system.BusSalaryDetailsSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusSalaryDetailsInfoRes, err error) + Add(ctx context.Context, req *system.BusSalaryDetailsAddReq) (err error) + Edit(ctx context.Context, req *system.BusSalaryDetailsEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + GetByIdDetailFunc(ctx context.Context, req *system.GetByIdDetailFuncReq) (res *system.GetByIdDetailFuncRes, err error) + SalarySheetFunc(ctx context.Context, req *system.SalarySheetFuncReq) (res *system.SalarySheetFuncRes, err error) +} + +var localBusSalaryDetails IBusSalaryDetails + +func BusSalaryDetails() IBusSalaryDetails { + if localBusSalaryDetails == nil { + panic("implement not found for interface IBusSalaryDetails, forgot register?") + } + return localBusSalaryDetails +} + +func RegisterBusSalaryDetails(i IBusSalaryDetails) { + localBusSalaryDetails = i +} diff --git a/internal/app/system/service/bus_scheduled_plan_type.go b/internal/app/system/service/bus_scheduled_plan_type.go new file mode 100644 index 0000000..50d3227 --- /dev/null +++ b/internal/app/system/service/bus_scheduled_plan_type.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-07-29 17:39:12 +// 生成路径: internal/app/system/service/bus_scheduled_plan_type.go +// 生成人:gfast +// desc:施工进度分类 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusScheduledPlanType interface { + List(ctx context.Context, req *system.BusScheduledPlanTypeSearchReq) (res *system.BusScheduledPlanTypeSearchRes, err error) + GetByPlanTypeId(ctx context.Context, PlanTypeId int) (res *model.BusScheduledPlanTypeInfoRes, err error) + Add(ctx context.Context, req *system.BusScheduledPlanTypeAddReq) (err error) + Edit(ctx context.Context, req *system.BusScheduledPlanTypeEditReq) (err error) + Delete(ctx context.Context, PlanTypeId []int) (err error) +} + +var localBusScheduledPlanType IBusScheduledPlanType + +func BusScheduledPlanType() IBusScheduledPlanType { + if localBusScheduledPlanType == nil { + panic("implement not found for interface IBusScheduledPlanType, forgot register?") + } + return localBusScheduledPlanType +} + +func RegisterBusScheduledPlanType(i IBusScheduledPlanType) { + localBusScheduledPlanType = i +} diff --git a/internal/app/system/service/bus_scheduled_plan_type_detail.go b/internal/app/system/service/bus_scheduled_plan_type_detail.go new file mode 100644 index 0000000..5d3329a --- /dev/null +++ b/internal/app/system/service/bus_scheduled_plan_type_detail.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-07-29 17:15:27 +// 生成路径: internal/app/system/service/bus_scheduled_plan_type_detail.go +// 生成人:gfast +// desc:施工进度月报,年报分类 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusScheduledPlanTypeDetail interface { + List(ctx context.Context, req *system.BusScheduledPlanTypeDetailSearchReq) (res *system.BusScheduledPlanTypeDetailSearchRes, err error) + GetByPlanTypeDetailId(ctx context.Context, PlanTypeDetailId int) (res *model.BusScheduledPlanTypeDetailInfoRes, err error) + Add(ctx context.Context, req *system.BusScheduledPlanTypeDetailAddReq) (err error) + Edit(ctx context.Context, req *system.BusScheduledPlanTypeDetailEditReq) (err error) + Delete(ctx context.Context, PlanTypeDetailId []int) (err error) +} + +var localBusScheduledPlanTypeDetail IBusScheduledPlanTypeDetail + +func BusScheduledPlanTypeDetail() IBusScheduledPlanTypeDetail { + if localBusScheduledPlanTypeDetail == nil { + panic("implement not found for interface IBusScheduledPlanTypeDetail, forgot register?") + } + return localBusScheduledPlanTypeDetail +} + +func RegisterBusScheduledPlanTypeDetail(i IBusScheduledPlanTypeDetail) { + localBusScheduledPlanTypeDetail = i +} diff --git a/internal/app/system/service/bus_scheduled_weekly.go b/internal/app/system/service/bus_scheduled_weekly.go new file mode 100644 index 0000000..4d69f2e --- /dev/null +++ b/internal/app/system/service/bus_scheduled_weekly.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-02 15:28:49 +// 生成路径: internal/app/system/service/bus_scheduled_weekly.go +// 生成人:gfast +// desc:周报 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusScheduledWeekly interface { + List(ctx context.Context, req *system.BusScheduledWeeklySearchReq) (res *system.BusScheduledWeeklySearchRes, err error) + GetByPlanWeeklyId(ctx context.Context, PlanWeeklyId int64) (res *model.BusScheduledWeeklyInfoRes, err error) + Add(ctx context.Context, req *system.BusScheduledWeeklyAddReq) (err error) + Edit(ctx context.Context, req *system.BusScheduledWeeklyEditReq) (err error) + Delete(ctx context.Context, PlanWeeklyId []int64) (err error) +} + +var localBusScheduledWeekly IBusScheduledWeekly + +func BusScheduledWeekly() IBusScheduledWeekly { + if localBusScheduledWeekly == nil { + panic("implement not found for interface IBusScheduledWeekly, forgot register?") + } + return localBusScheduledWeekly +} + +func RegisterBusScheduledWeekly(i IBusScheduledWeekly) { + localBusScheduledWeekly = i +} diff --git a/internal/app/system/service/bus_scheduled_weekly_photovoltaic.go b/internal/app/system/service/bus_scheduled_weekly_photovoltaic.go new file mode 100644 index 0000000..5c0add7 --- /dev/null +++ b/internal/app/system/service/bus_scheduled_weekly_photovoltaic.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-02 15:21:55 +// 生成路径: internal/app/system/service/bus_scheduled_weekly_photovoltaic.go +// 生成人:gfast +// desc:周报-光伏板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusScheduledWeeklyPhotovoltaic interface { + List(ctx context.Context, req *system.BusScheduledWeeklyPhotovoltaicSearchReq) (res *system.BusScheduledWeeklyPhotovoltaicSearchRes, err error) + GetByPhotovoltaicId(ctx context.Context, PhotovoltaicId int64) (res *model.BusScheduledWeeklyPhotovoltaicInfoRes, err error) + Add(ctx context.Context, req *system.BusScheduledWeeklyPhotovoltaicAddReq) (err error) + Edit(ctx context.Context, req *system.BusScheduledWeeklyPhotovoltaicEditReq) (err error) + Delete(ctx context.Context, PhotovoltaicId []int64) (err error) +} + +var localBusScheduledWeeklyPhotovoltaic IBusScheduledWeeklyPhotovoltaic + +func BusScheduledWeeklyPhotovoltaic() IBusScheduledWeeklyPhotovoltaic { + if localBusScheduledWeeklyPhotovoltaic == nil { + panic("implement not found for interface IBusScheduledWeeklyPhotovoltaic, forgot register?") + } + return localBusScheduledWeeklyPhotovoltaic +} + +func RegisterBusScheduledWeeklyPhotovoltaic(i IBusScheduledWeeklyPhotovoltaic) { + localBusScheduledWeeklyPhotovoltaic = i +} diff --git a/internal/app/system/service/bus_standing_book.go b/internal/app/system/service/bus_standing_book.go new file mode 100644 index 0000000..68bf08d --- /dev/null +++ b/internal/app/system/service/bus_standing_book.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-07-29 11:36:04 +// 生成路径: internal/app/system/service/bus_standing_book.go +// 生成人:gfast +// desc:台账 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusStandingBook interface { + List(ctx context.Context, req *system.BusStandingBookSearchReq) (res *system.BusStandingBookSearchRes, err error) + GetByStandingBookId(ctx context.Context, StandingBookId int64) (res *model.BusStandingBookInfoRes, err error) + Add(ctx context.Context, req *system.BusStandingBookAddReq) (err error) + Edit(ctx context.Context, req *system.BusStandingBookEditReq) (err error) + Delete(ctx context.Context, StandingBookId []int64) (err error) +} + +var localBusStandingBook IBusStandingBook + +func BusStandingBook() IBusStandingBook { + if localBusStandingBook == nil { + panic("implement not found for interface IBusStandingBook, forgot register?") + } + return localBusStandingBook +} + +func RegisterBusStandingBook(i IBusStandingBook) { + localBusStandingBook = i +} diff --git a/internal/app/system/service/bus_tour.go b/internal/app/system/service/bus_tour.go new file mode 100644 index 0000000..dd06223 --- /dev/null +++ b/internal/app/system/service/bus_tour.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-10-10 12:11:05 +// 生成路径: internal/app/system/service/bus_tour.go +// 生成人:gfast +// desc:煤科巡视-故障记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusTour interface { + List(ctx context.Context, req *system.BusTourSearchReq) (res *system.BusTourSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusTourInfoRes, err error) + Add(ctx context.Context, req *system.BusTourAddReq) (err error) + Edit(ctx context.Context, req *system.BusTourEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + ListAll(ctx context.Context, req *system.BusTourSearchAllReq) (res *system.BusTourSearchAllRes, err error) +} + +var localBusTour IBusTour + +func BusTour() IBusTour { + if localBusTour == nil { + panic("implement not found for interface IBusTour, forgot register?") + } + return localBusTour +} + +func RegisterBusTour(i IBusTour) { + localBusTour = i +} diff --git a/internal/app/system/service/bus_type_of_wage.go b/internal/app/system/service/bus_type_of_wage.go new file mode 100644 index 0000000..7c701a3 --- /dev/null +++ b/internal/app/system/service/bus_type_of_wage.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-09-05 10:07:11 +// 生成路径: internal/app/system/service/bus_type_of_wage.go +// 生成人:gfast +// desc:工种薪水 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusTypeOfWage interface { + List(ctx context.Context, req *system.BusTypeOfWageSearchReq) (res *system.BusTypeOfWageSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusTypeOfWageInfoRes, err error) + Add(ctx context.Context, req *system.BusTypeOfWageAddReq) (err error) + Edit(ctx context.Context, req *system.BusTypeOfWageEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localBusTypeOfWage IBusTypeOfWage + +func BusTypeOfWage() IBusTypeOfWage { + if localBusTypeOfWage == nil { + panic("implement not found for interface IBusTypeOfWage, forgot register?") + } + return localBusTypeOfWage +} + +func RegisterBusTypeOfWage(i IBusTypeOfWage) { + localBusTypeOfWage = i +} diff --git a/internal/app/system/service/bus_violation_level.go b/internal/app/system/service/bus_violation_level.go new file mode 100644 index 0000000..3799ce6 --- /dev/null +++ b/internal/app/system/service/bus_violation_level.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-11-20 11:18:36 +// 生成路径: internal/app/system/service/bus_violation_level.go +// 生成人:gfast +// desc:违章等级 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusViolationLevel interface { + List(ctx context.Context, req *system.BusViolationLevelSearchReq) (res *system.BusViolationLevelSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusViolationLevelInfoRes, err error) + Add(ctx context.Context, req *system.BusViolationLevelAddReq) (err error) + Edit(ctx context.Context, req *system.BusViolationLevelEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localBusViolationLevel IBusViolationLevel + +func BusViolationLevel() IBusViolationLevel { + if localBusViolationLevel == nil { + panic("implement not found for interface IBusViolationLevel, forgot register?") + } + return localBusViolationLevel +} + +func RegisterBusViolationLevel(i IBusViolationLevel) { + localBusViolationLevel = i +} diff --git a/internal/app/system/service/bus_violation_record.go b/internal/app/system/service/bus_violation_record.go new file mode 100644 index 0000000..66587d6 --- /dev/null +++ b/internal/app/system/service/bus_violation_record.go @@ -0,0 +1,51 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-11-20 11:18:37 +// 生成路径: internal/app/system/service/bus_violation_record.go +// 生成人:gfast +// desc:违章记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + wxSystem "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusViolationRecord interface { + List(ctx context.Context, req *system.BusViolationRecordSearchReq) (res *system.BusViolationRecordSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusViolationRecordInfoRes, err error) + Add(ctx context.Context, req *system.BusViolationRecordAddReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + WxList(ctx context.Context, req *wxSystem.BusViolationRecordSearchReq) (res *wxSystem.BusViolationRecordSearchRes, err error) + WxEdit(ctx context.Context, req *wxSystem.BusViolationRecordEditReq) (err error) + WxAdd(ctx context.Context, req *wxSystem.WxBusViolationRecordAddReq) (err error) + SelectTheViolatorFunc(ctx context.Context, req *system.BSelectTheViolatorReq) (err error) + WxListTwo(ctx context.Context, req *wxSystem.BusViolationRecordSearchTwoReq) (res *wxSystem.BusViolationRecordSearchTwoRes, err error) + WxDetails(ctx context.Context, req *wxSystem.WxBusViolationRecordDetailsReq) (res *wxSystem.WxBusViolationRecordDetailsRes, err error) + AppAiInformFunc(ctx context.Context, req *wxSystem.AppAiInformReq) (err error) + AppGetsAllThePeopleUnderTheCurrentPersonsProjectFunc(ctx context.Context, req *wxSystem.AppGetsAllThePeopleUnderTheCurrentPersonsProjectReq) (res *wxSystem.AppGetsAllThePeopleUnderTheCurrentPersonsProjectRes, err error) + AppWorkOrderPcListFunc(ctx context.Context, req *wxSystem.AppWorkOrderPcListReq) (res *wxSystem.AppWorkOrderPcListRes, err error) + AppWorkOrderParticularsFunc(ctx context.Context, req *wxSystem.AppWorkOrderParticularsReq) (res *wxSystem.AppWorkOrderParticularsRes, err error) + AppRectificationReplyFunc(ctx context.Context, req *wxSystem.AppRectificationReplyReq) (err error) + AppReviewFuncFunc(ctx context.Context, req *wxSystem.AppReviewReq) (err error) + AppWorkOrderAppListFunc(ctx context.Context, req *wxSystem.AppWorkOrderAppListReq) (res *wxSystem.AppWorkOrderPcListRes, err error) + AppSafetyHazardTodayFunc(ctx context.Context, req *wxSystem.AppSafetyHazardTodayReq) (res *wxSystem.AppSafetyHazardTodayRes, err error) +} + +var localBusViolationRecord IBusViolationRecord + +func BusViolationRecord() IBusViolationRecord { + if localBusViolationRecord == nil { + panic("implement not found for interface IBusViolationRecord, forgot register?") + } + return localBusViolationRecord +} + +func RegisterBusViolationRecord(i IBusViolationRecord) { + localBusViolationRecord = i +} diff --git a/internal/app/system/service/bus_weekly_security_report.go b/internal/app/system/service/bus_weekly_security_report.go new file mode 100644 index 0000000..1608764 --- /dev/null +++ b/internal/app/system/service/bus_weekly_security_report.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-04-02 18:03:23 +// 生成路径: internal/app/system/service/bus_weekly_security_report.go +// 生成人:gfast +// desc:安全周期 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IBusWeeklySecurityReport interface { + List(ctx context.Context, req *system.BusWeeklySecurityReportSearchReq) (res *system.BusWeeklySecurityReportSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusWeeklySecurityReportInfoRes, err error) + Add(ctx context.Context, req *system.BusWeeklySecurityReportAddReq) (err error) + Edit(ctx context.Context, req *system.BusWeeklySecurityReportEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localBusWeeklySecurityReport IBusWeeklySecurityReport + +func BusWeeklySecurityReport() IBusWeeklySecurityReport { + if localBusWeeklySecurityReport == nil { + panic("implement not found for interface IBusWeeklySecurityReport, forgot register?") + } + return localBusWeeklySecurityReport +} + +func RegisterBusWeeklySecurityReport(i IBusWeeklySecurityReport) { + localBusWeeklySecurityReport = i +} diff --git a/internal/app/system/service/comment_list.go b/internal/app/system/service/comment_list.go new file mode 100644 index 0000000..c07b523 --- /dev/null +++ b/internal/app/system/service/comment_list.go @@ -0,0 +1,40 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-05-14 10:21:06 +// 生成路径: internal/app/system/service/comment_list.go +// 生成人:gfast +// desc:App消息-评论 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type ICommentList interface { + List(ctx context.Context, req *system.CommentListSearchReq) (res *system.CommentListSearchRes, err error) + GetById(ctx context.Context, Id uint) (res *model.CommentListInfoRes, err error) + Add(ctx context.Context, req *system.CommentListAddReq) (err error) + Edit(ctx context.Context, req *system.CommentListEditReq) (err error) + Delete(ctx context.Context, Id []uint) (err error) + // GetSelfList 获取自己的评论列表 + GetSelfList(ctx context.Context, req *system.CommentListSelfReq) (*system.CommentListSelfRes, error) +} + +var localCommentList ICommentList + +func CommentList() ICommentList { + if localCommentList == nil { + panic("implement not found for interface ICommentList, forgot register?") + } + return localCommentList +} + +func RegisterCommentList(i ICommentList) { + localCommentList = i +} diff --git a/internal/app/system/service/comments.go b/internal/app/system/service/comments.go new file mode 100644 index 0000000..9b68e57 --- /dev/null +++ b/internal/app/system/service/comments.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-04-23 14:47:24 +// 生成路径: internal/app/system/service/comments.go +// 生成人:gfast +// desc:App通知公告评论 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IComments interface { + List(ctx context.Context, req *system.CommentsSearchReq) (res *system.CommentsSearchRes, err error) + GetById(ctx context.Context, Id uint) (res *model.CommentsInfoRes, err error) + Add(ctx context.Context, req *system.CommentsAddReq) (err error) + Edit(ctx context.Context, req *system.CommentsEditReq) (err error) + Delete(ctx context.Context, Id []uint) (err error) +} + +var localComments IComments + +func Comments() IComments { + if localComments == nil { + panic("implement not found for interface IComments, forgot register?") + } + return localComments +} + +func RegisterComments(i IComments) { + localComments = i +} diff --git a/internal/app/system/service/construction_details.go b/internal/app/system/service/construction_details.go new file mode 100644 index 0000000..2ebcf2a --- /dev/null +++ b/internal/app/system/service/construction_details.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-03-13 18:10:56 +// 生成路径: internal/app/system/service/construction_details.go +// 生成人:gfast +// desc:施工类别详情 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IConstructionDetails interface { + List(ctx context.Context, req *system.ConstructionDetailsSearchReq) (res *system.ConstructionDetailsSearchRes, err error) + GetById(ctx context.Context, Id uint64) (res *model.ConstructionDetailsInfoRes, err error) + Add(ctx context.Context, req *system.ConstructionDetailsAddReq) (err error) + Edit(ctx context.Context, req *system.ConstructionDetailsEditReq) (err error) + Delete(ctx context.Context, Id []uint64) (err error) +} + +var localConstructionDetails IConstructionDetails + +func ConstructionDetails() IConstructionDetails { + if localConstructionDetails == nil { + panic("implement not found for interface IConstructionDetails, forgot register?") + } + return localConstructionDetails +} + +func RegisterConstructionDetails(i IConstructionDetails) { + localConstructionDetails = i +} diff --git a/internal/app/system/service/construction_project.go b/internal/app/system/service/construction_project.go new file mode 100644 index 0000000..d93ffba --- /dev/null +++ b/internal/app/system/service/construction_project.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-03-13 17:36:45 +// 生成路径: internal/app/system/service/construction_project.go +// 生成人:gfast +// desc:施工项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IConstructionProject interface { + List(ctx context.Context, req *system.ConstructionProjectSearchReq) (res *system.ConstructionProjectSearchRes, err error) + GetByConstructionId(ctx context.Context, ConstructionId uint64) (res *model.ConstructionProjectInfoRes, err error) + Add(ctx context.Context, req *system.ConstructionProjectAddReq) (err error) + Edit(ctx context.Context, req *system.ConstructionProjectEditReq) (err error) + Delete(ctx context.Context, ConstructionId []uint64) (err error) +} + +var localConstructionProject IConstructionProject + +func ConstructionProject() IConstructionProject { + if localConstructionProject == nil { + panic("implement not found for interface IConstructionProject, forgot register?") + } + return localConstructionProject +} + +func RegisterConstructionProject(i IConstructionProject) { + localConstructionProject = i +} diff --git a/internal/app/system/service/context.go b/internal/app/system/service/context.go new file mode 100644 index 0000000..7476bb9 --- /dev/null +++ b/internal/app/system/service/context.go @@ -0,0 +1,34 @@ +// ================================================================================ +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" + + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IContext interface { + Init(r *ghttp.Request, customCtx *model.Context) + Get(ctx context.Context) *model.Context + SetUser(ctx context.Context, ctxUser *model.ContextUser) + GetLoginUser(ctx context.Context) *model.ContextUser + GetUserId(ctx context.Context) uint64 +} + +var localContext IContext + +func Context() IContext { + if localContext == nil { + panic("implement not found for interface IContext, forgot register?") + } + return localContext +} + +func RegisterContext(i IContext) { + localContext = i +} diff --git a/internal/app/system/service/device.go b/internal/app/system/service/device.go new file mode 100644 index 0000000..5fd6ea7 --- /dev/null +++ b/internal/app/system/service/device.go @@ -0,0 +1,39 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-11-24 09:57:07 +// 生成路径: internal/app/system/service/device.go +// 生成人:gfast +// desc:安全帽设备(java) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" +) + +type IDevice interface { + List(ctx context.Context, req *system.DeviceSearchReq) (res *system.DeviceSearchRes, err error) + AllList(ctx context.Context, req *system.DeviceSearchAllReq) (res *system.DeviceSearchAllRes, err error) + HelmetListFunc(ctx context.Context, req *system.HelmetListReq) (res *system.HelmetListRes, err error) + GetByDevNum(ctx context.Context, req *system.DeviceGetReq) (res *system.DeviceGetRes, err error) + Add(ctx context.Context, req *system.DeviceAddReq) (err error) + RemoveRelationFunc(ctx context.Context, req *system.RemoveRelationReq) (err error) + Delete(ctx context.Context, DevNum []string) (err error) + ScheduleTimeFunc(ctx context.Context, req *system.ScheduleTimeReq) (res *system.ScheduleTimeRes, err error) +} + +var localDevice IDevice + +func Device() IDevice { + if localDevice == nil { + panic("implement not found for interface IDevice, forgot register?") + } + return localDevice +} + +func RegisterDevice(i IDevice) { + localDevice = i +} diff --git a/internal/app/system/service/device_preset.go b/internal/app/system/service/device_preset.go new file mode 100644 index 0000000..bb955ed --- /dev/null +++ b/internal/app/system/service/device_preset.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-03-01 12:50:08 +// 生成路径: internal/app/system/service/device_preset.go +// 生成人:gfast +// desc:预置位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IDevicePreset interface { + List(ctx context.Context, req *system.DevicePresetSearchReq) (res *system.DevicePresetSearchRes, err error) + GetById(ctx context.Context, Id uint) (res *model.DevicePresetInfoRes, err error) + Add(ctx context.Context, req *system.DevicePresetAddReq) (err error) + Edit(ctx context.Context, req *system.DevicePresetEditReq) (err error) + Delete(ctx context.Context, DeviceSerial string, Indexs []int) (err error) +} + +var localDevicePreset IDevicePreset + +func DevicePreset() IDevicePreset { + if localDevicePreset == nil { + panic("implement not found for interface IDevicePreset, forgot register?") + } + return localDevicePreset +} + +func RegisterDevicePreset(i IDevicePreset) { + localDevicePreset = i +} diff --git a/internal/app/system/service/document.go b/internal/app/system/service/document.go new file mode 100644 index 0000000..b4fb01c --- /dev/null +++ b/internal/app/system/service/document.go @@ -0,0 +1,41 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-09-16 10:32:04 +// 生成路径: internal/app/system/service/document.go +// 生成人:gfast +// desc:母板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IDocument interface { + List(ctx context.Context, req *system.DocumentSearchReq) (res *system.DocumentSearchRes, err error) + GetById(ctx context.Context, Id int) (res *model.DocumentInfoRes, err error) + Add(ctx context.Context, req *system.DocumentAddReq) (err error) + Edit(ctx context.Context, req *system.DocumentEditReq) (err error) + Delete(ctx context.Context, Id []int) (err error) + TreeStructureFunc(ctx context.Context, req *system.TreeStructureReq) (res *system.TreeStructureRes, err error) + AllList(ctx context.Context, req *system.AllDocumentSearchReq) (res *system.AllDocumentSearchRes, err error) + TemplateRecycleBinFunc(ctx context.Context, req *system.TemplateRecycleBinReq) (err error) + NewFolderFunc(ctx context.Context, req *system.NewFolderReq) (err error) +} + +var localDocument IDocument + +func Document() IDocument { + if localDocument == nil { + panic("implement not found for interface IDocument, forgot register?") + } + return localDocument +} + +func RegisterDocument(i IDocument) { + localDocument = i +} diff --git a/internal/app/system/service/document_completion.go b/internal/app/system/service/document_completion.go new file mode 100644 index 0000000..0893477 --- /dev/null +++ b/internal/app/system/service/document_completion.go @@ -0,0 +1,43 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-03-15 10:25:00 +// 生成路径: internal/app/system/service/document_completion.go +// 生成人:gfast +// desc:竣工图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IDocumentCompletion interface { + List(ctx context.Context, req *system.DocumentCompletionSearchReq) (res *system.DocumentCompletionSearchRes, err error) + GetById(ctx context.Context, Id int64) (res []*model.SelectTabNameAndTabIdByDateRes, err error) + Add(ctx context.Context, req *system.DocumentCompletionAddReq) (err error) + Edit(ctx context.Context, req *system.DocumentCompletionEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + CompletionNewFolderDataFunc(ctx context.Context, req *system.CompletionNewFolderDataReq) (err error) + TreeStructureFunc(ctx context.Context, req *system.DocumentTreeStructureReq) (res *system.DocumentTreeStructureRes, err error) + SelectByPidFunc(ctx context.Context, req *system.SelectByPidReq) (res *system.SelectByPidRes, err error) + CompletionDataRecyclingStationFunc(ctx context.Context, req *system.CompletionDataRecyclingStationReq) (err error) + RecycleBinListFunc(ctx context.Context, req *system.RecycleBinListReq) (res *system.RecycleBinListRes, err error) + AuditDataListFunc(ctx context.Context, req *system.AuditDataListReq) (res *system.AuditDataListRes, err error) +} + +var localDocumentCompletion IDocumentCompletion + +func DocumentCompletion() IDocumentCompletion { + if localDocumentCompletion == nil { + panic("implement not found for interface IDocumentCompletion, forgot register?") + } + return localDocumentCompletion +} + +func RegisterDocumentCompletion(i IDocumentCompletion) { + localDocumentCompletion = i +} diff --git a/internal/app/system/service/document_data.go b/internal/app/system/service/document_data.go new file mode 100644 index 0000000..917427b --- /dev/null +++ b/internal/app/system/service/document_data.go @@ -0,0 +1,45 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-12-27 09:30:04 +// 生成路径: internal/app/system/service/document_data.go +// 生成人:gfast +// desc:工程资料>资料 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IDocumentData interface { + List(ctx context.Context, req *system.DocumentDataSearchReq) (res *system.DocumentDataSearchRes, err error) + AllList(ctx context.Context, req *system.AllDocumentDataSearchReq) (res *system.AllDocumentDataSearchRes, err error) + SonFileList(ctx context.Context, req *system.SonFileReq) (res *system.SonFileRes, err error) + GetById(ctx context.Context, Id int64) (res *model.DocumentDataInfoRes, err error) + Add(ctx context.Context, req *system.DocumentDataAddReq) (err error) + Edit(ctx context.Context, req *system.DocumentDataEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + TreeStructureDataFunc(ctx context.Context, req *system.TreeStructureDataReq) (res *system.TreeStructureDataRes, err error) + OnlineImportFunc(ctx context.Context, req *system.OnlineImportReq) (err error) + OnlineMobileFunc(ctx context.Context, req *system.OnlineMobileReq) (err error) + DataRecyclingStationFunc(ctx context.Context, req *system.DataRecyclingStationReq) (err error) + NewFolderDataFunc(ctx context.Context, req *system.NewFolderDataReq) (err error) + DataFileQueryFunc(ctx context.Context, req *system.DataFileQueryReq) (res *system.DataFileQueryRes, err error) +} + +var localDocumentData IDocumentData + +func DocumentData() IDocumentData { + if localDocumentData == nil { + panic("implement not found for interface IDocumentData, forgot register?") + } + return localDocumentData +} + +func RegisterDocumentData(i IDocumentData) { + localDocumentData = i +} diff --git a/internal/app/system/service/document_production_drawing.go b/internal/app/system/service/document_production_drawing.go new file mode 100644 index 0000000..f4be632 --- /dev/null +++ b/internal/app/system/service/document_production_drawing.go @@ -0,0 +1,42 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-03-15 10:24:54 +// 生成路径: internal/app/system/service/document_production_drawing.go +// 生成人:gfast +// desc:施工图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IDocumentProductionDrawing interface { + List(ctx context.Context, req *system.DocumentProductionDrawingSearchReq) (res *system.DocumentProductionDrawingSearchRes, err error) + GetById(ctx context.Context, Id int64) (res []*model.SelectTabNameAndTabIdByDateRes, err error) + Add(ctx context.Context, req *system.DocumentProductionDrawingAddReq) (err error) + Edit(ctx context.Context, req *system.DocumentProductionDrawingEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + NewFolderDataFunc(ctx context.Context, req *system.ProductionDrawingNewFolderDataReq) (err error) + TreeStructureFunc(ctx context.Context, req *system.ProductionDrawingTreeStructureReq) (res *system.ProductionDrawingTreeStructureRes, err error) + SelectByPidFunc(ctx context.Context, req *system.ProductionDrawingSelectByPidReq) (res *system.ProductionDrawingSelectByPidRes, err error) + RecyclingStationFunc(ctx context.Context, req *system.ProductionDrawingDataRecyclingStationReq) (err error) + RecycleBinListFunc(ctx context.Context, req *system.ProductionDrawingRecycleBinListReq) (res *system.ProductionDrawingRecycleBinListRes, err error) +} + +var localDocumentProductionDrawing IDocumentProductionDrawing + +func DocumentProductionDrawing() IDocumentProductionDrawing { + if localDocumentProductionDrawing == nil { + panic("implement not found for interface IDocumentProductionDrawing, forgot register?") + } + return localDocumentProductionDrawing +} + +func RegisterDocumentProductionDrawing(i IDocumentProductionDrawing) { + localDocumentProductionDrawing = i +} diff --git a/internal/app/system/service/document_project.go b/internal/app/system/service/document_project.go new file mode 100644 index 0000000..0f8a177 --- /dev/null +++ b/internal/app/system/service/document_project.go @@ -0,0 +1,36 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-09-16 10:32:03 +// 生成路径: internal/app/system/service/document_project.go +// 生成人:gfast +// desc:项目模板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" +) + +type IDocumentProject interface { + //List(ctx context.Context, req *system.DocumentProjectSearchReq) (res *system.DocumentProjectSearchRes, err error) + //GetById(ctx context.Context, Id int) (res *model.DocumentProjectInfoRes, err error) + //Add(ctx context.Context, req *system.DocumentProjectAddReq) (err error) + //Edit(ctx context.Context, req *system.DocumentProjectEditReq) (err error) + Delete(ctx context.Context, Id []int) (err error) + //TreeStructureFunc(ctx context.Context, req *system.TreeStructureReq) (res *system.TreeStructureRes, err error) +} + +var localDocumentProject IDocumentProject + +func DocumentProject() IDocumentProject { + if localDocumentProject == nil { + panic("implement not found for interface IDocumentProject, forgot register?") + } + return localDocumentProject +} + +func RegisterDocumentProject(i IDocumentProject) { + localDocumentProject = i +} diff --git a/internal/app/system/service/document_quality_meeting.go b/internal/app/system/service/document_quality_meeting.go new file mode 100644 index 0000000..d806f5e --- /dev/null +++ b/internal/app/system/service/document_quality_meeting.go @@ -0,0 +1,44 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-03-25 16:43:56 +// 生成路径: internal/app/system/service/document_quality_meeting.go +// 生成人:gfast +// desc:质量会议 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IDocumentQualityMeeting interface { + List(ctx context.Context, req *system.DocumentQualityMeetingSearchReq) (res *system.DocumentQualityMeetingSearchRes, err error) + GetById(ctx context.Context, Id int64) (res []*model.SelectTabNameAndTabIdByDateRes, err error) + Add(ctx context.Context, req *system.DocumentQualityMeetingAddReq) (err error) + Edit(ctx context.Context, req *system.DocumentQualityMeetingEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + + CompletionNewFolderDataFunc(ctx context.Context, req *system.DocumentQualityNewFolderDataReq) (err error) + TreeStructureFunc(ctx context.Context, req *system.DocumentQualityTreeStructureReq) (res *system.DocumentQualityTreeStructureRes, err error) + SelectByPidFunc(ctx context.Context, req *system.DocumentQualitySelectByPidReq) (res *system.DocumentQualitySelectByPidRes, err error) + CompletionDataRecyclingStationFunc(ctx context.Context, req *system.DocumentQualityDataRecyclingStationReq) (err error) + RecycleBinListFunc(ctx context.Context, req *system.DocumentQualityRecycleBinListReq) (res *system.DocumentQualityRecycleBinListRes, err error) +} + +var localDocumentQualityMeeting IDocumentQualityMeeting + +func DocumentQualityMeeting() IDocumentQualityMeeting { + if localDocumentQualityMeeting == nil { + panic("implement not found for interface IDocumentQualityMeeting, forgot register?") + } + return localDocumentQualityMeeting +} + +func RegisterDocumentQualityMeeting(i IDocumentQualityMeeting) { + localDocumentQualityMeeting = i +} diff --git a/internal/app/system/service/document_report.go b/internal/app/system/service/document_report.go new file mode 100644 index 0000000..2036a77 --- /dev/null +++ b/internal/app/system/service/document_report.go @@ -0,0 +1,42 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-03-15 10:24:21 +// 生成路径: internal/app/system/service/document_report.go +// 生成人:gfast +// desc:科研及专题报告 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IDocumentReport interface { + List(ctx context.Context, req *system.DocumentReportSearchReq) (res *system.DocumentReportSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.DocumentReportInfoRes, err error) + Add(ctx context.Context, req *system.DocumentReportAddReq) (err error) + Edit(ctx context.Context, req *system.DocumentReportEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + CompletionNewFolderDataFunc(ctx context.Context, req *system.ReportNewFolderDataReq) (err error) + TreeStructureFunc(ctx context.Context, req *system.ReportTreeStructureReq) (res *system.ReportTreeStructureRes, err error) + SelectByPidFunc(ctx context.Context, req *system.ReportSelectByPidReq) (res *system.ReportSelectByPidRes, err error) + CompletionDataRecyclingStationFunc(ctx context.Context, req *system.ReportDataRecyclingStationReq) (err error) + RecycleBinListFunc(ctx context.Context, req *system.ReportRecycleBinListReq) (res *system.ReportRecycleBinListRes, err error) +} + +var localDocumentReport IDocumentReport + +func DocumentReport() IDocumentReport { + if localDocumentReport == nil { + panic("implement not found for interface IDocumentReport, forgot register?") + } + return localDocumentReport +} + +func RegisterDocumentReport(i IDocumentReport) { + localDocumentReport = i +} diff --git a/internal/app/system/service/document_safety_meeting.go b/internal/app/system/service/document_safety_meeting.go new file mode 100644 index 0000000..9a57d09 --- /dev/null +++ b/internal/app/system/service/document_safety_meeting.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-04-09 11:40:21 +// 生成路径: internal/app/system/service/document_safety_meeting.go +// 生成人:gfast +// desc:安全会议 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IDocumentSafetyMeeting interface { + List(ctx context.Context, req *system.DocumentSafetyMeetingSearchReq) (res *system.DocumentSafetyMeetingSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.DocumentSafetyMeetingInfoRes, err error) + Add(ctx context.Context, req *system.DocumentSafetyMeetingAddReq) (err error) + Edit(ctx context.Context, req *system.DocumentSafetyMeetingEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + + // 新建文件夹 + CompletionNewFolderDataFunc(ctx context.Context, req *system.DocumentSafetyNewFolderDataReq) (err error) + + // 树形结构 + TreeStructureFunc(ctx context.Context, req *system.DocumentSafetyTreeStructureReq) (res *system.DocumentQualityTreeStructureRes, err error) + + // 根据父级ID查询 + SelectByPidFunc(ctx context.Context, req *system.DocumentSafetySelectByPidReq) (res *system.DocumentQualitySelectByPidRes, err error) + + // 数据回收站 + CompletionDataRecyclingStationFunc(ctx context.Context, req *system.DocumentSafetyDataRecyclingStationReq) (err error) + + // 回收站列表 + RecycleBinListFunc(ctx context.Context, req *system.DocumentSafetyRecycleBinListReq) (res *system.DocumentQualityRecycleBinListRes, err error) +} + +var localDocumentSafetyMeeting IDocumentSafetyMeeting + +func DocumentSafetyMeeting() IDocumentSafetyMeeting { + if localDocumentSafetyMeeting == nil { + panic("implement not found for interface IDocumentSafetyMeeting, forgot register?") + } + return localDocumentSafetyMeeting +} + +func RegisterDocumentSafetyMeeting(i IDocumentSafetyMeeting) { + localDocumentSafetyMeeting = i +} diff --git a/internal/app/system/service/manage_airline.go b/internal/app/system/service/manage_airline.go new file mode 100644 index 0000000..94e3bd0 --- /dev/null +++ b/internal/app/system/service/manage_airline.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-12-11 16:10:19 +// 生成路径: internal/app/system/service/manage_airline.go +// 生成人:gfast +// desc:航线 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IManageAirline interface { + List(ctx context.Context, req *system.ManageAirlineSearchReq) (res *system.ManageAirlineSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.ManageAirlineInfoRes, err error) + Add(ctx context.Context, req *system.ManageAirlineAddReq) (err error) + Edit(ctx context.Context, req *system.ManageAirlineEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + RouteUploadFunc(ctx context.Context, req *system.RouteUploadReq) (err error) +} + +var localManageAirline IManageAirline + +func ManageAirline() IManageAirline { + if localManageAirline == nil { + panic("implement not found for interface IManageAirline, forgot register?") + } + return localManageAirline +} + +func RegisterManageAirline(i IManageAirline) { + localManageAirline = i +} diff --git a/internal/app/system/service/manage_device.go b/internal/app/system/service/manage_device.go new file mode 100644 index 0000000..c52b824 --- /dev/null +++ b/internal/app/system/service/manage_device.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-11-14 10:53:21 +// 生成路径: internal/app/system/service/manage_device.go +// 生成人:gfast +// desc:设备信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IManageDevice interface { + List(ctx context.Context, req *system.ManageDeviceSearchReq) (res *system.ManageDeviceSearchRes, err error) + GetById(ctx context.Context, Id uint64) (res *model.ManageDeviceInfoRes, err error) + Add(ctx context.Context, req *system.ManageDeviceAddReq) (err error) + Edit(ctx context.Context, req *system.ManageDeviceEditReq) (err error) + Delete(ctx context.Context, Id []uint64) (err error) + NoPageList(ctx context.Context, req *system.NoPageListSearchReq) (res *system.NoPageListSearchRes, err error) +} + +var localManageDevice IManageDevice + +func ManageDevice() IManageDevice { + if localManageDevice == nil { + panic("implement not found for interface IManageDevice, forgot register?") + } + return localManageDevice +} + +func RegisterManageDevice(i IManageDevice) { + localManageDevice = i +} diff --git a/internal/app/system/service/manage_operation_log.go b/internal/app/system/service/manage_operation_log.go new file mode 100644 index 0000000..ef1674f --- /dev/null +++ b/internal/app/system/service/manage_operation_log.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-06-21 15:23:29 +// 生成路径: internal/app/system/service/manage_operation_log.go +// 生成人:gfast +// desc:无人机指令日志 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IManageOperationLog interface { + List(ctx context.Context, req *system.ManageOperationLogSearchReq) (res *system.ManageOperationLogSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.ManageOperationLogInfoRes, err error) + Add(ctx context.Context, req *system.ManageOperationLogAddReq) (err error) + Edit(ctx context.Context, req *system.ManageOperationLogEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localManageOperationLog IManageOperationLog + +func ManageOperationLog() IManageOperationLog { + if localManageOperationLog == nil { + panic("implement not found for interface IManageOperationLog, forgot register?") + } + return localManageOperationLog +} + +func RegisterManageOperationLog(i IManageOperationLog) { + localManageOperationLog = i +} diff --git a/internal/app/system/service/manage_task.go b/internal/app/system/service/manage_task.go new file mode 100644 index 0000000..60a07f6 --- /dev/null +++ b/internal/app/system/service/manage_task.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-12-12 15:21:22 +// 生成路径: internal/app/system/service/manage_task.go +// 生成人:gfast +// desc:航线任务下发 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IManageTask interface { + List(ctx context.Context, req *system.ManageTaskSearchReq) (res *system.ManageTaskSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.ManageTaskInfoRes, err error) + Add(ctx context.Context, req *system.ManageTaskAddReq) (err error) + Edit(ctx context.Context, req *system.ManageTaskEditReq) (err error) + Delete(ctx context.Context, Id int64) (err error) +} + +var localManageTask IManageTask + +func ManageTask() IManageTask { + if localManageTask == nil { + panic("implement not found for interface IManageTask, forgot register?") + } + return localManageTask +} + +func RegisterManageTask(i IManageTask) { + localManageTask = i +} diff --git a/internal/app/system/service/manage_task_cron.go b/internal/app/system/service/manage_task_cron.go new file mode 100644 index 0000000..e0bbb0d --- /dev/null +++ b/internal/app/system/service/manage_task_cron.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-06-04 14:33:05 +// 生成路径: internal/app/system/service/manage_task_cron.go +// 生成人:gfast +// desc:航线任务定时飞行 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IManageTaskCron interface { + List(ctx context.Context, req *system.ManageTaskCronSearchReq) (res *system.ManageTaskCronSearchRes, err error) + GetById(ctx context.Context, sn string) (res *model.ManageTaskCronInfoRes, err error) + Add(ctx context.Context, req *system.ManageTaskCronAddReq) (err error) + Edit(ctx context.Context, req *system.ManageTaskCronEditReq) (err error) + Delete(ctx context.Context, sn []string) (err error) +} + +var localManageTaskCron IManageTaskCron + +func ManageTaskCron() IManageTaskCron { + if localManageTaskCron == nil { + panic("implement not found for interface IManageTaskCron, forgot register?") + } + return localManageTaskCron +} + +func RegisterManageTaskCron(i IManageTaskCron) { + localManageTaskCron = i +} diff --git a/internal/app/system/service/manage_task_record.go b/internal/app/system/service/manage_task_record.go new file mode 100644 index 0000000..c153931 --- /dev/null +++ b/internal/app/system/service/manage_task_record.go @@ -0,0 +1,41 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-12-12 17:56:19 +// 生成路径: internal/app/system/service/manage_task_record.go +// 生成人:gfast +// desc:航线任务下发-记录 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IManageTaskRecord interface { + UpDataResource(ctx context.Context, req *system.UpDataResourceReq) (err error) + GetAiResult(ctx context.Context, req *system.GetAiResultReq) (res *system.GetAiResultRes, err error) + List(ctx context.Context, req *system.ManageTaskRecordSearchReq) (res *system.ManageTaskRecordSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.ManageTaskRecordInfoRes, err error) + FlighttaskResourceGetFunc(ctx context.Context, req *system.ManageTaskRecordDeleteReq) (err error) + + // 提交AI识别结果 + ConfirmAiResult(ctx context.Context, req *system.ConfirmAiResultReq) (err error) +} + +var localManageTaskRecord IManageTaskRecord + +func ManageTaskRecord() IManageTaskRecord { + if localManageTaskRecord == nil { + panic("implement not found for interface IManageTaskRecord, forgot register?") + } + return localManageTaskRecord +} + +func RegisterManageTaskRecord(i IManageTaskRecord) { + localManageTaskRecord = i +} diff --git a/internal/app/system/service/manage_task_record_resource.go b/internal/app/system/service/manage_task_record_resource.go new file mode 100644 index 0000000..f8d0cdc --- /dev/null +++ b/internal/app/system/service/manage_task_record_resource.go @@ -0,0 +1,39 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-05-30 17:07:01 +// 生成路径: internal/app/system/service/manage_task_record_resource.go +// 生成人:gfast +// desc:下发记录回传的媒体文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IManageTaskRecordResource interface { + List(ctx context.Context, req *system.ManageTaskRecordResourceSearchReq) (res *system.ManageTaskRecordResourceSearchRes, err error) + ObtainResourcesAccordingToFlightId(ctx context.Context, flightId string) (res *system.ObtainResourcesAccordingToFlightIdRes, err error) + GetByFlightId(ctx context.Context, FlightId string) (res *model.ManageTaskRecordResourceInfoRes, err error) + Add(ctx context.Context, req *system.ManageTaskRecordResourceAddReq) (err error) + Edit(ctx context.Context, req *system.ManageTaskRecordResourceEditReq) (err error) + Delete(ctx context.Context, FlightId []string) (err error) + DownloadAccordingToMysqlFunc(ctx context.Context, FlightId string) (err error) +} + +var localManageTaskRecordResource IManageTaskRecordResource + +func ManageTaskRecordResource() IManageTaskRecordResource { + if localManageTaskRecordResource == nil { + panic("implement not found for interface IManageTaskRecordResource, forgot register?") + } + return localManageTaskRecordResource +} + +func RegisterManageTaskRecordResource(i IManageTaskRecordResource) { + localManageTaskRecordResource = i +} diff --git a/internal/app/system/service/manage_task_result.go b/internal/app/system/service/manage_task_result.go new file mode 100644 index 0000000..722d4b9 --- /dev/null +++ b/internal/app/system/service/manage_task_result.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-10-21 11:29:13 +// 生成路径: internal/app/system/service/manage_task_result.go +// 生成人:gfast +// desc:AI识别到的数据 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IManageTaskResult interface { + List(ctx context.Context, req *system.ManageTaskResultSearchReq) (res *system.ManageTaskResultSearchRes, err error) + GetById(ctx context.Context, Id uint) (res *model.ManageTaskResultInfoRes, err error) + Add(ctx context.Context, req *system.ManageTaskResultAddReq) (err error) + Edit(ctx context.Context, req *system.ManageTaskResultEditReq) (err error) + Delete(ctx context.Context, Id []uint) (err error) +} + +var localManageTaskResult IManageTaskResult + +func ManageTaskResult() IManageTaskResult { + if localManageTaskResult == nil { + panic("implement not found for interface IManageTaskResult, forgot register?") + } + return localManageTaskResult +} + +func RegisterManageTaskResult(i IManageTaskResult) { + localManageTaskResult = i +} diff --git a/internal/app/system/service/manage_workspace.go b/internal/app/system/service/manage_workspace.go new file mode 100644 index 0000000..35e1bcf --- /dev/null +++ b/internal/app/system/service/manage_workspace.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-11-14 10:53:20 +// 生成路径: internal/app/system/service/manage_workspace.go +// 生成人:gfast +// desc:工作空间 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IManageWorkspace interface { + List(ctx context.Context, req *system.ManageWorkspaceSearchReq) (res *system.ManageWorkspaceSearchRes, err error) + GetById(ctx context.Context, Id uint64) (res *model.ManageWorkspaceInfoRes, err error) + Add(ctx context.Context, req *system.ManageWorkspaceAddReq) (err error) + Edit(ctx context.Context, req *system.ManageWorkspaceEditReq) (err error) + Delete(ctx context.Context, Id []uint64) (err error) +} + +var localManageWorkspace IManageWorkspace + +func ManageWorkspace() IManageWorkspace { + if localManageWorkspace == nil { + panic("implement not found for interface IManageWorkspace, forgot register?") + } + return localManageWorkspace +} + +func RegisterManageWorkspace(i IManageWorkspace) { + localManageWorkspace = i +} diff --git a/internal/app/system/service/master_schedule.go b/internal/app/system/service/master_schedule.go new file mode 100644 index 0000000..7962ffd --- /dev/null +++ b/internal/app/system/service/master_schedule.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-10-08 09:38:35 +// 生成路径: internal/app/system/service/master_schedule.go +// 生成人:gfast +// desc:总进度计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IMasterSchedule interface { + List(ctx context.Context, req *system.MasterScheduleSearchReq) (res *system.MasterScheduleSearchRes, err error) + GetById(ctx context.Context, Id int) (res *model.MasterScheduleInfoRes, err error) + Add(ctx context.Context, req *system.MasterScheduleAddReq) (err error) + Edit(ctx context.Context, req *system.MasterScheduleEditReq) (err error) + Delete(ctx context.Context, Id []int) (err error) +} + +var localMasterSchedule IMasterSchedule + +func MasterSchedule() IMasterSchedule { + if localMasterSchedule == nil { + panic("implement not found for interface IMasterSchedule, forgot register?") + } + return localMasterSchedule +} + +func RegisterMasterSchedule(i IMasterSchedule) { + localMasterSchedule = i +} diff --git a/internal/app/system/service/middleware.go b/internal/app/system/service/middleware.go new file mode 100644 index 0000000..d02a919 --- /dev/null +++ b/internal/app/system/service/middleware.go @@ -0,0 +1,30 @@ +// ================================================================================ +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "github.com/gogf/gf/v2/net/ghttp" +) + +type IMiddleware interface { + Ctx(r *ghttp.Request) + Auth(r *ghttp.Request) + Blacklist(r *ghttp.Request) + EngineeringDataPermission(r *ghttp.Request) +} + +var localMiddleware IMiddleware + +func Middleware() IMiddleware { + if localMiddleware == nil { + panic("implement not found for interface IMiddleware, forgot register?") + } + return localMiddleware +} + +func RegisterMiddleware(i IMiddleware) { + localMiddleware = i +} diff --git a/internal/app/system/service/notification_recipients.go b/internal/app/system/service/notification_recipients.go new file mode 100644 index 0000000..3b26e05 --- /dev/null +++ b/internal/app/system/service/notification_recipients.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-04-11 16:58:12 +// 生成路径: internal/app/system/service/notification_recipients.go +// 生成人:gfast +// desc:通知接收 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type INotificationRecipients interface { + List(ctx context.Context, req *system.NotificationRecipientsSearchReq) (res *system.NotificationRecipientsSearchRes, err error) + GetById(ctx context.Context, Id uint) (res *model.NotificationRecipientsInfoRes, err error) + Add(ctx context.Context, req *system.NotificationRecipientsAddReq) (err error) + Edit(ctx context.Context, req *system.NotificationRecipientsEditReq) (err error) + Delete(ctx context.Context, Id []uint) (err error) +} + +var localNotificationRecipients INotificationRecipients + +func NotificationRecipients() INotificationRecipients { + if localNotificationRecipients == nil { + panic("implement not found for interface INotificationRecipients, forgot register?") + } + return localNotificationRecipients +} + +func RegisterNotificationRecipients(i INotificationRecipients) { + localNotificationRecipients = i +} diff --git a/internal/app/system/service/notifications.go b/internal/app/system/service/notifications.go new file mode 100644 index 0000000..4877149 --- /dev/null +++ b/internal/app/system/service/notifications.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-04-11 16:56:36 +// 生成路径: internal/app/system/service/notifications.go +// 生成人:gfast +// desc:通知信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type INotifications interface { + List(ctx context.Context, req *system.NotificationsSearchReq) (res *system.NotificationsSearchRes, err error) + GetById(ctx context.Context, Id uint) (res *model.NotificationsInfoRes, err error) + Add(ctx context.Context, req *system.NotificationsAddReq) (err error) + Edit(ctx context.Context, req *system.NotificationsEditReq) (err error) + Delete(ctx context.Context, Id []uint) (err error) +} + +var localNotifications INotifications + +func Notifications() INotifications { + if localNotifications == nil { + panic("implement not found for interface INotifications, forgot register?") + } + return localNotifications +} + +func RegisterNotifications(i INotifications) { + localNotifications = i +} diff --git a/internal/app/system/service/personal.go b/internal/app/system/service/personal.go new file mode 100644 index 0000000..69ab5d5 --- /dev/null +++ b/internal/app/system/service/personal.go @@ -0,0 +1,36 @@ +// ================================================================================ +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + + "github.com/tiger1103/gfast/v3/api/v1/system" +) + +type ( + IPersonal interface { + GetPersonalInfo(ctx context.Context, req *system.PersonalInfoReq) (res *system.PersonalInfoRes, err error) + EditPersonal(ctx context.Context, req *system.PersonalEditReq) (user *model.LoginUserRes, err error) + ResetPwdPersonal(ctx context.Context, req *system.PersonalResetPwdReq) (res *system.PersonalResetPwdRes, err error) + } +) + +var ( + localPersonal IPersonal +) + +func Personal() IPersonal { + if localPersonal == nil { + panic("implement not found for interface IPersonal, forgot register?") + } + return localPersonal +} + +func RegisterPersonal(i IPersonal) { + localPersonal = i +} diff --git a/internal/app/system/service/plan_daily.go b/internal/app/system/service/plan_daily.go new file mode 100644 index 0000000..78e32e9 --- /dev/null +++ b/internal/app/system/service/plan_daily.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-09-26 14:31:07 +// 生成路径: internal/app/system/service/plan_daily.go +// 生成人:gfast +// desc:日报 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IPlanDaily interface { + List(ctx context.Context, req *system.PlanDailySearchReq) (res *system.PlanDailySearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.PlanDailyInfoRes, err error) + Add(ctx context.Context, req *system.PlanDailyAddReq) (err error) + Edit(ctx context.Context, req *system.PlanDailyEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localPlanDaily IPlanDaily + +func PlanDaily() IPlanDaily { + if localPlanDaily == nil { + panic("implement not found for interface IPlanDaily, forgot register?") + } + return localPlanDaily +} + +func RegisterPlanDaily(i IPlanDaily) { + localPlanDaily = i +} diff --git a/internal/app/system/service/plan_week.go b/internal/app/system/service/plan_week.go new file mode 100644 index 0000000..0211434 --- /dev/null +++ b/internal/app/system/service/plan_week.go @@ -0,0 +1,40 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-04 17:26:59 +// 生成路径: internal/app/system/service/plan_week.go +// 生成人:gfast +// desc:周计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IPlanWeek interface { + List(ctx context.Context, req *system.PlanWeekSearchReq) (res *system.PlanWeekSearchRes, err error) + PlanWeekGetInfoByPlanID(ctx context.Context, req *system.PlanWeekGetInfoByPlanIDReq) (res *system.PlanWeekGetInfoByPlanIDRes, err error) + GetById(ctx context.Context, Id int) (res *model.PlanWeekInfoRes, err error) + Add(ctx context.Context, req *system.PlanWeekAddReq) (err error) + Edit(ctx context.Context, req *system.PlanWeekEditReq) (err error) + Delete(ctx context.Context, planID string) (err error) + WeekAndWeekRealityListFunc(ctx context.Context, req *system.WeekAndWeekRealityListReq) (res *system.WeekAndWeekRealityListRes, err error) + WeeklyAndMonthlyReportDataGenerationFunc(ctx context.Context, req *system.WeeklyAndMonthlyReportDataGenerationReq) (res *system.WeeklyAndMonthlyReportDataGenerationRes, err error) +} + +var localPlanWeek IPlanWeek + +func PlanWeek() IPlanWeek { + if localPlanWeek == nil { + panic("implement not found for interface IPlanWeek, forgot register?") + } + return localPlanWeek +} + +func RegisterPlanWeek(i IPlanWeek) { + localPlanWeek = i +} diff --git a/internal/app/system/service/plan_week_reality.go b/internal/app/system/service/plan_week_reality.go new file mode 100644 index 0000000..eef6ff3 --- /dev/null +++ b/internal/app/system/service/plan_week_reality.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-17 17:23:07 +// 生成路径: internal/app/system/service/plan_week_reality.go +// 生成人:xyb +// desc:实际完成的周计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IPlanWeekReality interface { + List(ctx context.Context, req *system.PlanWeekRealitySearchReq) (res *system.PlanWeekRealitySearchRes, err error) + GetById(ctx context.Context, Id int) (res *model.PlanWeekRealityInfoRes, err error) + PlanWeekRealityCompare(ctx context.Context, req *system.PlanWeekRealityCompareReq) (res *system.PlanWeekRealityCompareRes, err error) + Add(ctx context.Context, req *system.PlanWeekRealityAddReq) (err error) + Edit(ctx context.Context, req *system.PlanWeekRealityEditReq) (err error) + Delete(ctx context.Context, Id []int) (err error) +} + +var localPlanWeekReality IPlanWeekReality + +func PlanWeekReality() IPlanWeekReality { + if localPlanWeekReality == nil { + panic("implement not found for interface IPlanWeekReality, forgot register?") + } + return localPlanWeekReality +} + +func RegisterPlanWeekReality(i IPlanWeekReality) { + localPlanWeekReality = i +} diff --git a/internal/app/system/service/plant.go b/internal/app/system/service/plant.go new file mode 100644 index 0000000..b7ff3a6 --- /dev/null +++ b/internal/app/system/service/plant.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-04-12 10:38:43 +// 生成路径: internal/app/system/service/plant.go +// 生成人:gfast +// desc:电站信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IPlant interface { + List(ctx context.Context, req *system.PlantSearchReq) (res *system.PlantSearchRes, err error) + GetById(ctx context.Context, Id string) (res *model.PlantInfoRes, err error) + Add(ctx context.Context, req *system.PlantAddReq) (err error) + Edit(ctx context.Context, req *system.PlantEditReq) (err error) + Delete(ctx context.Context, Id []string) (err error) +} + +var localPlant IPlant + +func Plant() IPlant { + if localPlant == nil { + panic("implement not found for interface IPlant, forgot register?") + } + return localPlant +} + +func RegisterPlant(i IPlant) { + localPlant = i +} diff --git a/internal/app/system/service/project_finance.go b/internal/app/system/service/project_finance.go new file mode 100644 index 0000000..e17b10f --- /dev/null +++ b/internal/app/system/service/project_finance.go @@ -0,0 +1,39 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-04-29 12:01:01 +// 生成路径: internal/app/system/service/project_finance.go +// 生成人:gfast +// desc:项目财务 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IProjectFinance interface { + List(ctx context.Context, req *system.ProjectFinanceSearchReq) (res *system.ProjectFinanceSearchRes, err error) + GetById(ctx context.Context, Id int) (res *model.ProjectFinanceInfoResVo, err error) + Add(ctx context.Context, req *system.ProjectFinanceAddReq) (err error) + Edit(ctx context.Context, req *system.ProjectFinanceEditReq) (err error) + Delete(ctx context.Context, Id []int) (err error) + GetByProjectId(ctx context.Context, id int) (res *model.ProjectFinanceInfoResVo, err error) + UploadExcel(ctx context.Context, id int64) (res *system.UploadExcelRes, err error) +} + +var localProjectFinance IProjectFinance + +func ProjectFinance() IProjectFinance { + if localProjectFinance == nil { + panic("implement not found for interface IProjectFinance, forgot register?") + } + return localProjectFinance +} + +func RegisterProjectFinance(i IProjectFinance) { + localProjectFinance = i +} diff --git a/internal/app/system/service/project_schedule.go b/internal/app/system/service/project_schedule.go new file mode 100644 index 0000000..c85ee35 --- /dev/null +++ b/internal/app/system/service/project_schedule.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-03-13 18:17:32 +// 生成路径: internal/app/system/service/project_schedule.go +// 生成人:gfast +// desc:项目排期 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IProjectSchedule interface { + List(ctx context.Context, req *system.ProjectScheduleSearchReq) (res *system.ProjectScheduleSearchRes, err error) + GetById(ctx context.Context, Id uint) (res *model.ProjectScheduleInfoRes, err error) + Add(ctx context.Context, req *system.ProjectScheduleAddReq) (err error) + Edit(ctx context.Context, req *system.ProjectScheduleEditReq) (err error) + Delete(ctx context.Context, Id []uint) (err error) +} + +var localProjectSchedule IProjectSchedule + +func ProjectSchedule() IProjectSchedule { + if localProjectSchedule == nil { + panic("implement not found for interface IProjectSchedule, forgot register?") + } + return localProjectSchedule +} + +func RegisterProjectSchedule(i IProjectSchedule) { + localProjectSchedule = i +} diff --git a/internal/app/system/service/pv_ module.go b/internal/app/system/service/pv_ module.go new file mode 100644 index 0000000..f4ae9d3 --- /dev/null +++ b/internal/app/system/service/pv_ module.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-03-23 10:25:39 +// 生成路径: internal/app/system/service/pv_ module.go +// 生成人:gfast +// desc:光伏组件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IPvModule interface { + List(ctx context.Context, req *system.PvModuleSearchReq) (res *system.PvModuleSearchRes, err error) + GetById(ctx context.Context, Id uint) (res *model.PvModuleInfoRes, err error) + Add(ctx context.Context, req *system.PvModuleAddReq) (err error) + Edit(ctx context.Context, req *system.PvModuleEditReq) (err error) + Delete(ctx context.Context, Id []uint) (err error) + Import(ctx context.Context, req *system.PvModuleImportReq) (err error) + // 导入逆变器 + ImportInverter(ctx context.Context, req *system.PvModuleImportInverterReq) (err error) + // ImportPvBoard 导入光伏板 + ImportPvBoard(ctx context.Context, req *system.PvModuleImportPvBoardReq) error + // AddWorkSchedule 添加工作日报 + AddWorkSchedule(ctx context.Context, req *system.PvModuleAddDailyReq) error + // 获取日报 + GetDaily(ctx context.Context, req *system.PvModuleGetDailyReq) (res *system.PvModuleGetDailyRes, err error) + DeleteDaily(ctx context.Context, req *system.PvModuleDeleteDailyReq) error + + //cory改版本 + ImportCory(ctx context.Context, req *system.PvModuleImportCory) (err error) + ImportInverterCory(ctx context.Context, req *system.ImportInverterCory) (err error) + ImportPvBoardCory(ctx context.Context, req *system.ImportPvBoardCory) error +} + +var localPvModule IPvModule + +func PvModule() IPvModule { + if localPvModule == nil { + panic("implement not found for interface IPvModule, forgot register?") + } + return localPvModule +} + +func RegisterPvModule(i IPvModule) { + localPvModule = i +} diff --git a/internal/app/system/service/qianqi_bubantu.go b/internal/app/system/service/qianqi_bubantu.go new file mode 100644 index 0000000..47ffc12 --- /dev/null +++ b/internal/app/system/service/qianqi_bubantu.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-07-31 11:44:41 +// 生成路径: internal/app/system/service/qianqi_bubantu.go +// 生成人:gfast +// desc:布板图 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IQianqiBubantu interface { + List(ctx context.Context, req *system.QianqiBubantuSearchReq) (res *system.QianqiBubantuSearchRes, err error) + GetById(ctx context.Context, Id int) (res *model.QianqiBubantuInfoRes, err error) + Add(ctx context.Context, req *system.QianqiBubantuAddReq) (err error) + Edit(ctx context.Context, req *system.QianqiBubantuEditReq) (err error) + Delete(ctx context.Context, Id []int) (err error) +} + +var localQianqiBubantu IQianqiBubantu + +func QianqiBubantu() IQianqiBubantu { + if localQianqiBubantu == nil { + panic("implement not found for interface IQianqiBubantu, forgot register?") + } + return localQianqiBubantu +} + +func RegisterQianqiBubantu(i IQianqiBubantu) { + localQianqiBubantu = i +} diff --git a/internal/app/system/service/qianqi_camera.go b/internal/app/system/service/qianqi_camera.go new file mode 100644 index 0000000..f171a61 --- /dev/null +++ b/internal/app/system/service/qianqi_camera.go @@ -0,0 +1,43 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-09-30 22:37:34 +// 生成路径: internal/app/system/service/qianqi_camera.go +// 生成人:gfast +// desc:摄像头 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + wxSystem "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IQianqiCamera interface { + List(ctx context.Context, req *system.QianqiCameraSearchReq) (res *system.QianqiCameraSearchRes, err error) + NotPageList(ctx context.Context, req *wxSystem.QianqiCameraSearchReq) (res *wxSystem.QianqiCameraSearchRes, err error) + GetById(ctx context.Context, Id int) (res *model.QianqiCameraInfoRes, err error) + Add(ctx context.Context, req *system.QianqiCameraAddReq) (err error) + Edit(ctx context.Context, req *system.QianqiCameraEditReq) (err error) + EditNameAndDetail(ctx context.Context, req *system.QianqiCameraEditNameAndDetailReq) (err error) + WxEditNameAndDetail(ctx context.Context, req *system.QianqiCameraEditNameAndDetailReq) (err error) + Delete(ctx context.Context, Id []int) (err error) + PeriodicCameraSnapshotFunc(ctx context.Context) + EditCameraFunc(ctx context.Context, req *system.EditCameraReq) (err error) +} + +var localQianqiCamera IQianqiCamera + +func QianqiCamera() IQianqiCamera { + if localQianqiCamera == nil { + panic("implement not found for interface IQianqiCamera, forgot register?") + } + return localQianqiCamera +} + +func RegisterQianqiCamera(i IQianqiCamera) { + localQianqiCamera = i +} diff --git a/internal/app/system/service/qianqi_dixing.go b/internal/app/system/service/qianqi_dixing.go new file mode 100644 index 0000000..33dd575 --- /dev/null +++ b/internal/app/system/service/qianqi_dixing.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-07-31 11:44:56 +// 生成路径: internal/app/system/service/qianqi_dixing.go +// 生成人:gfast +// desc:地形 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IQianqiDixing interface { + List(ctx context.Context, req *system.QianqiDixingSearchReq) (res *system.QianqiDixingSearchRes, err error) + GetById(ctx context.Context, Id int) (res *model.QianqiDixingInfoRes, err error) + Add(ctx context.Context, req *system.QianqiDixingAddReq) (err error) + Edit(ctx context.Context, req *system.QianqiDixingEditReq) (err error) + Delete(ctx context.Context, Id []int) (err error) +} + +var localQianqiDixing IQianqiDixing + +func QianqiDixing() IQianqiDixing { + if localQianqiDixing == nil { + panic("implement not found for interface IQianqiDixing, forgot register?") + } + return localQianqiDixing +} + +func RegisterQianqiDixing(i IQianqiDixing) { + localQianqiDixing = i +} diff --git a/internal/app/system/service/qianqi_fangzhen.go b/internal/app/system/service/qianqi_fangzhen.go new file mode 100644 index 0000000..78950b8 --- /dev/null +++ b/internal/app/system/service/qianqi_fangzhen.go @@ -0,0 +1,40 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-07-31 11:20:54 +// 生成路径: internal/app/system/service/qianqi_fangzhen.go +// 生成人:gfast +// desc:方阵 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IQianqiFangzhen interface { + List(ctx context.Context, req *system.QianqiFangzhenSearchReq) (res *system.QianqiFangzhenSearchRes, err error) + GetById(ctx context.Context, Id int) (res *model.QianqiFangzhenInfoRes, err error) + Add(ctx context.Context, req *system.QianqiFangzhenAddReq) (err error) + Edit(ctx context.Context, req *system.QianqiFangzhenEditReq) (err error) + Delete(ctx context.Context, Id []int) (err error) + EditDetail(ctx context.Context, req *system.QianqiFangzhenEditDetailReq) (err error) + UpdateViewName(ctx context.Context, req *system.QianqiFangzhenUpdateViewNameReq) error +} + +var localQianqiFangzhen IQianqiFangzhen + +func QianqiFangzhen() IQianqiFangzhen { + if localQianqiFangzhen == nil { + panic("implement not found for interface IQianqiFangzhen, forgot register?") + } + return localQianqiFangzhen +} + +func RegisterQianqiFangzhen(i IQianqiFangzhen) { + localQianqiFangzhen = i +} diff --git a/internal/app/system/service/qianqi_guangfuban.go b/internal/app/system/service/qianqi_guangfuban.go new file mode 100644 index 0000000..279c97a --- /dev/null +++ b/internal/app/system/service/qianqi_guangfuban.go @@ -0,0 +1,41 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-07-31 11:31:49 +// 生成路径: internal/app/system/service/qianqi_guangfuban.go +// 生成人:gfast +// desc:光伏板模型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IQianqiGuangfuban interface { + List(ctx context.Context, req *system.QianqiGuangfubanSearchReq) (res *system.QianqiGuangfubanSearchRes, err error) + GetById(ctx context.Context, Id int) (res *model.QianqiGuangfubanInfoRes, err error) + Add(ctx context.Context, req *system.QianqiGuangfubanAddReq) (err error) + Edit(ctx context.Context, req *system.QianqiGuangfubanEditReq) (err error) + ImportZuchuan(ctx context.Context, req *system.QianqiGuangfubanImportZuchuanReq) (err error) + CaculateZuchuan(ctx context.Context, req *system.QianqiGuangfubanCalZuchuanReq) (err error) + Delete(ctx context.Context, SourceIDs []string) (err error) + CorrectFunc(ctx context.Context, req *system.CorrectFuncReq) (err error) + CorrectQueryFunc(ctx context.Context, req *system.CorrectQueryFuncReq) (res *system.CorrectQueryFuncRes, err error) +} + +var localQianqiGuangfuban IQianqiGuangfuban + +func QianqiGuangfuban() IQianqiGuangfuban { + if localQianqiGuangfuban == nil { + panic("implement not found for interface IQianqiGuangfuban, forgot register?") + } + return localQianqiGuangfuban +} + +func RegisterQianqiGuangfuban(i IQianqiGuangfuban) { + localQianqiGuangfuban = i +} diff --git a/internal/app/system/service/qianqi_guangfuban_ids.go b/internal/app/system/service/qianqi_guangfuban_ids.go new file mode 100644 index 0000000..8a2d484 --- /dev/null +++ b/internal/app/system/service/qianqi_guangfuban_ids.go @@ -0,0 +1,36 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-05 16:00:23 +// 生成路径: internal/app/system/service/qianqi_guangfuban_ids.go +// 生成人:gfast +// desc:光伏板模型的id +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" +) + +type IQianqiGuangfubanIds interface { + List(ctx context.Context, req *system.QianqiGuangfubanIdsSearchReq) (res *system.QianqiGuangfubanIdsSearchRes, err error) + GetById(ctx context.Context, req *system.QianqiGuangfubanIdsGetReq) (res *system.QianqiGuangfubanIdsGetRes, err error) + Add(ctx context.Context, req *system.QianqiGuangfubanIdsAddReq) (err error) + Edit(ctx context.Context, req *system.QianqiGuangfubanIdsEditReq) (err error) + Delete(ctx context.Context, Id []int) (err error) +} + +var localQianqiGuangfubanIds IQianqiGuangfubanIds + +func QianqiGuangfubanIds() IQianqiGuangfubanIds { + if localQianqiGuangfubanIds == nil { + panic("implement not found for interface IQianqiGuangfubanIds, forgot register?") + } + return localQianqiGuangfubanIds +} + +func RegisterQianqiGuangfubanIds(i IQianqiGuangfubanIds) { + localQianqiGuangfubanIds = i +} diff --git a/internal/app/system/service/qianqi_guangfuban_ids_lizhu.go b/internal/app/system/service/qianqi_guangfuban_ids_lizhu.go new file mode 100644 index 0000000..9264556 --- /dev/null +++ b/internal/app/system/service/qianqi_guangfuban_ids_lizhu.go @@ -0,0 +1,39 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-09-05 12:10:40 +// 生成路径: internal/app/system/service/qianqi_guangfuban_ids_lizhu.go +// 生成人:gfast +// desc:光伏板立柱 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IQianqiGuangfubanIdsLizhu interface { + GisListFunc(ctx context.Context, req *system.GisListLizhuReq, num string) (res *system.GisListLizhuRes, err error) + List(ctx context.Context, req *system.QianqiGuangfubanIdsLizhuSearchReq) (res *system.QianqiGuangfubanIdsLizhuSearchRes, err error) + GetById(ctx context.Context, Id int) (res *model.QianqiGuangfubanIdsLizhuInfoRes, err error) + Add(ctx context.Context, req *system.QianqiGuangfubanIdsLizhuAddReq) (err error) + Edit(ctx context.Context, req *system.QianqiGuangfubanIdsLizhuEditReq) (err error) + Delete(ctx context.Context, Id []int) (err error) + BooleanValueFunc(ctx context.Context, req *system.BooleanValueEditReq) (err error) +} + +var localQianqiGuangfubanIdsLizhu IQianqiGuangfubanIdsLizhu + +func QianqiGuangfubanIdsLizhu() IQianqiGuangfubanIdsLizhu { + if localQianqiGuangfubanIdsLizhu == nil { + panic("implement not found for interface IQianqiGuangfubanIdsLizhu, forgot register?") + } + return localQianqiGuangfubanIdsLizhu +} + +func RegisterQianqiGuangfubanIdsLizhu(i IQianqiGuangfubanIdsLizhu) { + localQianqiGuangfubanIdsLizhu = i +} diff --git a/internal/app/system/service/qianqi_guangfuban_ids_zhijia.go b/internal/app/system/service/qianqi_guangfuban_ids_zhijia.go new file mode 100644 index 0000000..fc967b8 --- /dev/null +++ b/internal/app/system/service/qianqi_guangfuban_ids_zhijia.go @@ -0,0 +1,41 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-09-05 12:10:51 +// 生成路径: internal/app/system/service/qianqi_guangfuban_ids_zhijia.go +// 生成人:gfast +// desc:光伏板支架 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IQianqiGuangfubanIdsZhijia interface { + GisListFunc(ctx context.Context, req *system.GisZhijiaReq, num string) (res *system.GisZhijiaRes, err error) + List(ctx context.Context, req *system.QianqiGuangfubanIdsZhijiaSearchReq) (res *system.QianqiGuangfubanIdsZhijiaSearchRes, err error) + GetById(ctx context.Context, Id int) (res *model.QianqiGuangfubanIdsZhijiaInfoRes, err error) + Add(ctx context.Context, req *system.QianqiGuangfubanIdsZhijiaAddReq) (err error) + Edit(ctx context.Context, req *system.QianqiGuangfubanIdsZhijiaEditReq) (err error) + Delete(ctx context.Context, Id []int) (err error) + EditDetail(ctx context.Context, req *system.QianqiGuangfubanIdsZhijiaDetailReq) (err error) + PrewarningValueFunc(ctx context.Context, req *system.PrewarningValueReq) (res *system.PrewarningValueRes, err error) + QueryDetailsFunc(ctx context.Context, req *system.QueryDetailsReq) (res *system.QueryDetailsRes, err error) +} + +var localQianqiGuangfubanIdsZhijia IQianqiGuangfubanIdsZhijia + +func QianqiGuangfubanIdsZhijia() IQianqiGuangfubanIdsZhijia { + if localQianqiGuangfubanIdsZhijia == nil { + panic("implement not found for interface IQianqiGuangfubanIdsZhijia, forgot register?") + } + return localQianqiGuangfubanIdsZhijia +} + +func RegisterQianqiGuangfubanIdsZhijia(i IQianqiGuangfubanIdsZhijia) { + localQianqiGuangfubanIdsZhijia = i +} diff --git a/internal/app/system/service/qianqi_guangfuban_ids_zhuangdian.go b/internal/app/system/service/qianqi_guangfuban_ids_zhuangdian.go new file mode 100644 index 0000000..5677f09 --- /dev/null +++ b/internal/app/system/service/qianqi_guangfuban_ids_zhuangdian.go @@ -0,0 +1,39 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-09-05 12:07:41 +// 生成路径: internal/app/system/service/qianqi_guangfuban_ids_zhuangdian.go +// 生成人:gfast +// desc:光伏板桩点 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IQianqiGuangfubanIdsZhuangdian interface { + GisListFunc(ctx context.Context, req *system.GisListReq, num string) (res *system.GisListRes, err error) + List(ctx context.Context, req *system.QianqiGuangfubanIdsZhuangdianSearchReq) (res *system.QianqiGuangfubanIdsZhuangdianSearchRes, err error) + GetById(ctx context.Context, Id int) (res *model.QianqiGuangfubanIdsZhuangdianInfoRes, err error) + Add(ctx context.Context, req *system.QianqiGuangfubanIdsZhuangdianAddReq) (err error) + Edit(ctx context.Context, req *system.QianqiGuangfubanIdsZhuangdianEditReq) (err error) + EditDetail(ctx context.Context, req *system.QianqiGuangfubanIdsZhuangdianEditDetailReq) (err error) + Delete(ctx context.Context, Id []int) (err error) +} + +var localQianqiGuangfubanIdsZhuangdian IQianqiGuangfubanIdsZhuangdian + +func QianqiGuangfubanIdsZhuangdian() IQianqiGuangfubanIdsZhuangdian { + if localQianqiGuangfubanIdsZhuangdian == nil { + panic("implement not found for interface IQianqiGuangfubanIdsZhuangdian, forgot register?") + } + return localQianqiGuangfubanIdsZhuangdian +} + +func RegisterQianqiGuangfubanIdsZhuangdian(i IQianqiGuangfubanIdsZhuangdian) { + localQianqiGuangfubanIdsZhuangdian = i +} diff --git a/internal/app/system/service/qianqi_guangfuban_zuchuan.go b/internal/app/system/service/qianqi_guangfuban_zuchuan.go new file mode 100644 index 0000000..bac66b7 --- /dev/null +++ b/internal/app/system/service/qianqi_guangfuban_zuchuan.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-17 10:37:21 +// 生成路径: internal/app/system/service/qianqi_guangfuban_zuchuan.go +// 生成人:xyb +// desc:组串 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IQianqiGuangfubanZuchuan interface { + List(ctx context.Context, req *system.QianqiGuangfubanZuchuanSearchReq) (res *system.QianqiGuangfubanZuchuanSearchRes, err error) + GetById(ctx context.Context, Id int) (res *model.QianqiGuangfubanZuchuanInfoRes, err error) + Add(ctx context.Context, req *system.QianqiGuangfubanZuchuanAddReq) (err error) + Edit(ctx context.Context, req *system.QianqiGuangfubanZuchuanEditReq) (err error) + Delete(ctx context.Context, Id []int) (err error) +} + +var localQianqiGuangfubanZuchuan IQianqiGuangfubanZuchuan + +func QianqiGuangfubanZuchuan() IQianqiGuangfubanZuchuan { + if localQianqiGuangfubanZuchuan == nil { + panic("implement not found for interface IQianqiGuangfubanZuchuan, forgot register?") + } + return localQianqiGuangfubanZuchuan +} + +func RegisterQianqiGuangfubanZuchuan(i IQianqiGuangfubanZuchuan) { + localQianqiGuangfubanZuchuan = i +} diff --git a/internal/app/system/service/qianqi_jidianxianlu.go b/internal/app/system/service/qianqi_jidianxianlu.go new file mode 100644 index 0000000..ffd3043 --- /dev/null +++ b/internal/app/system/service/qianqi_jidianxianlu.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-04 16:29:44 +// 生成路径: internal/app/system/service/qianqi_jidianxianlu.go +// 生成人:gfast +// desc:集电线路 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IQianqiJidianxianlu interface { + List(ctx context.Context, req *system.QianqiJidianxianluSearchReq) (res *system.QianqiJidianxianluSearchRes, err error) + GetById(ctx context.Context, Id int) (res *model.QianqiJidianxianluInfoRes, err error) + Add(ctx context.Context, req *system.QianqiJidianxianluAddReq) (err error) + Edit(ctx context.Context, req *system.QianqiJidianxianluEditReq) (err error) + Delete(ctx context.Context, Id []int) (err error) +} + +var localQianqiJidianxianlu IQianqiJidianxianlu + +func QianqiJidianxianlu() IQianqiJidianxianlu { + if localQianqiJidianxianlu == nil { + panic("implement not found for interface IQianqiJidianxianlu, forgot register?") + } + return localQianqiJidianxianlu +} + +func RegisterQianqiJidianxianlu(i IQianqiJidianxianlu) { + localQianqiJidianxianlu = i +} diff --git a/internal/app/system/service/qianqi_moxing.go b/internal/app/system/service/qianqi_moxing.go new file mode 100644 index 0000000..fe3abd4 --- /dev/null +++ b/internal/app/system/service/qianqi_moxing.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-07-31 11:09:26 +// 生成路径: internal/app/system/service/qianqi_moxing.go +// 生成人:gfast +// desc:倾斜模型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IQianqiMoxing interface { + List(ctx context.Context, req *system.QianqiMoxingSearchReq) (res *system.QianqiMoxingSearchRes, err error) + GetById(ctx context.Context, Id int) (res *model.QianqiMoxingInfoRes, err error) + Add(ctx context.Context, req *system.QianqiMoxingAddReq) (err error) + Edit(ctx context.Context, req *system.QianqiMoxingEditReq) (err error) + Delete(ctx context.Context, Id []int) (err error) +} + +var localQianqiMoxing IQianqiMoxing + +func QianqiMoxing() IQianqiMoxing { + if localQianqiMoxing == nil { + panic("implement not found for interface IQianqiMoxing, forgot register?") + } + return localQianqiMoxing +} + +func RegisterQianqiMoxing(i IQianqiMoxing) { + localQianqiMoxing = i +} diff --git a/internal/app/system/service/qianqi_nibianqi.go b/internal/app/system/service/qianqi_nibianqi.go new file mode 100644 index 0000000..55cc174 --- /dev/null +++ b/internal/app/system/service/qianqi_nibianqi.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-07-31 09:40:17 +// 生成路径: internal/app/system/service/qianqi_nibianqi.go +// 生成人:gfast +// desc:逆变器 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IQianqiNibianqi interface { + List(ctx context.Context, req *system.QianqiNibianqiSearchReq) (res *system.QianqiNibianqiSearchRes, err error) + GetById(ctx context.Context, Id int) (res *model.QianqiNibianqiInfoRes, err error) + Add(ctx context.Context, req *system.QianqiNibianqiAddReq) (err error) + Edit(ctx context.Context, req *system.QianqiNibianqiEditReq) (err error) + EditDetail(ctx context.Context, req *system.QianqiNibianqiEditDetailReq) (err error) + Delete(ctx context.Context, Id []int) (err error) +} + +var localQianqiNibianqi IQianqiNibianqi + +func QianqiNibianqi() IQianqiNibianqi { + if localQianqiNibianqi == nil { + panic("implement not found for interface IQianqiNibianqi, forgot register?") + } + return localQianqiNibianqi +} + +func RegisterQianqiNibianqi(i IQianqiNibianqi) { + localQianqiNibianqi = i +} diff --git a/internal/app/system/service/qianqi_pingchang.go b/internal/app/system/service/qianqi_pingchang.go new file mode 100644 index 0000000..249e8df --- /dev/null +++ b/internal/app/system/service/qianqi_pingchang.go @@ -0,0 +1,36 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-08 10:08:24 +// 生成路径: internal/app/system/service/qianqi_pingchang.go +// 生成人:gfast +// desc:平场数据 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IQianqiPingchang interface { + //List(ctx context.Context, req *system.QianqiPingchangSearchReq) (res *system.QianqiPingchangSearchRes, err error) + GetById(ctx context.Context, Id uint64) (res *model.QianqiPingchangInfoRes, err error) + //Add(ctx context.Context, req *system.QianqiPingchangAddReq) (err error) + //Edit(ctx context.Context, req *system.QianqiPingchangEditReq) (err error) + Delete(ctx context.Context, Id []uint64) (err error) +} + +var localQianqiPingchang IQianqiPingchang + +func QianqiPingchang() IQianqiPingchang { + if localQianqiPingchang == nil { + panic("implement not found for interface IQianqiPingchang, forgot register?") + } + return localQianqiPingchang +} + +func RegisterQianqiPingchang(i IQianqiPingchang) { + localQianqiPingchang = i +} diff --git a/internal/app/system/service/qianqi_redline.go b/internal/app/system/service/qianqi_redline.go new file mode 100644 index 0000000..218c763 --- /dev/null +++ b/internal/app/system/service/qianqi_redline.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-07-31 11:45:12 +// 生成路径: internal/app/system/service/qianqi_redline.go +// 生成人:gfast +// desc:红线 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IQianqiRedline interface { + List(ctx context.Context, req *system.QianqiRedlineSearchReq) (res *system.QianqiRedlineSearchRes, err error) + GetById(ctx context.Context, Id int) (res *model.QianqiRedlineInfoRes, err error) + Add(ctx context.Context, req *system.QianqiRedlineAddReq) (err error) + Edit(ctx context.Context, req *system.QianqiRedlineEditReq) (err error) + Delete(ctx context.Context, Id []int) (err error) +} + +var localQianqiRedline IQianqiRedline + +func QianqiRedline() IQianqiRedline { + if localQianqiRedline == nil { + panic("implement not found for interface IQianqiRedline, forgot register?") + } + return localQianqiRedline +} + +func RegisterQianqiRedline(i IQianqiRedline) { + localQianqiRedline = i +} diff --git a/internal/app/system/service/qianqi_redline_tudiliuzhuan.go b/internal/app/system/service/qianqi_redline_tudiliuzhuan.go new file mode 100644 index 0000000..bac2ffe --- /dev/null +++ b/internal/app/system/service/qianqi_redline_tudiliuzhuan.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-04 11:47:15 +// 生成路径: internal/app/system/service/qianqi_redline_tudiliuzhuan.go +// 生成人:gfast +// desc:土地流转 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IQianqiRedlineTudiliuzhuan interface { + List(ctx context.Context, req *system.QianqiRedlineTudiliuzhuanSearchReq) (res *system.QianqiRedlineTudiliuzhuanSearchRes, err error) + GetById(ctx context.Context, Id int) (res *model.QianqiRedlineTudiliuzhuanInfoRes, err error) + Add(ctx context.Context, req *system.QianqiRedlineTudiliuzhuanAddReq) (err error) + Edit(ctx context.Context, req *system.QianqiRedlineTudiliuzhuanEditReq) (err error) + Delete(ctx context.Context, Id []int) (err error) +} + +var localQianqiRedlineTudiliuzhuan IQianqiRedlineTudiliuzhuan + +func QianqiRedlineTudiliuzhuan() IQianqiRedlineTudiliuzhuan { + if localQianqiRedlineTudiliuzhuan == nil { + panic("implement not found for interface IQianqiRedlineTudiliuzhuan, forgot register?") + } + return localQianqiRedlineTudiliuzhuan +} + +func RegisterQianqiRedlineTudiliuzhuan(i IQianqiRedlineTudiliuzhuan) { + localQianqiRedlineTudiliuzhuan = i +} diff --git a/internal/app/system/service/qianqi_road.go b/internal/app/system/service/qianqi_road.go new file mode 100644 index 0000000..1bfd0ae --- /dev/null +++ b/internal/app/system/service/qianqi_road.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-04 16:24:38 +// 生成路径: internal/app/system/service/qianqi_road.go +// 生成人:gfast +// desc:道路 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IQianqiRoad interface { + List(ctx context.Context, req *system.QianqiRoadSearchReq) (res *system.QianqiRoadSearchRes, err error) + GetById(ctx context.Context, Id int) (res *model.QianqiRoadInfoRes, err error) + Add(ctx context.Context, req *system.QianqiRoadAddReq) (err error) + Edit(ctx context.Context, req *system.QianqiRoadEditReq) (err error) + Delete(ctx context.Context, Id []int) (err error) +} + +var localQianqiRoad IQianqiRoad + +func QianqiRoad() IQianqiRoad { + if localQianqiRoad == nil { + panic("implement not found for interface IQianqiRoad, forgot register?") + } + return localQianqiRoad +} + +func RegisterQianqiRoad(i IQianqiRoad) { + localQianqiRoad = i +} diff --git a/internal/app/system/service/qianqi_xiangbian.go b/internal/app/system/service/qianqi_xiangbian.go new file mode 100644 index 0000000..1521a15 --- /dev/null +++ b/internal/app/system/service/qianqi_xiangbian.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-07-31 09:52:13 +// 生成路径: internal/app/system/service/qianqi_xiangbian.go +// 生成人:gfast +// desc:箱变 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IQianqiXiangbian interface { + List(ctx context.Context, req *system.QianqiXiangbianSearchReq) (res *system.QianqiXiangbianSearchRes, err error) + GetById(ctx context.Context, Id int) (res *model.QianqiXiangbianInfoRes, err error) + Add(ctx context.Context, req *system.QianqiXiangbianAddReq) (err error) + Edit(ctx context.Context, req *system.QianqiXiangbianEditReq) (err error) + EditDetail(ctx context.Context, req *system.QianqiXiangbianEditDetailReq) (err error) + Delete(ctx context.Context, Id []int) (err error) +} + +var localQianqiXiangbian IQianqiXiangbian + +func QianqiXiangbian() IQianqiXiangbian { + if localQianqiXiangbian == nil { + panic("implement not found for interface IQianqiXiangbian, forgot register?") + } + return localQianqiXiangbian +} + +func RegisterQianqiXiangbian(i IQianqiXiangbian) { + localQianqiXiangbian = i +} diff --git a/internal/app/system/service/reminders.go b/internal/app/system/service/reminders.go new file mode 100644 index 0000000..ca9d324 --- /dev/null +++ b/internal/app/system/service/reminders.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-05-14 14:55:52 +// 生成路径: internal/app/system/service/reminders.go +// 生成人:gfast +// desc:App-消息-提醒 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IReminders interface { + List(ctx context.Context, req *system.RemindersSearchReq) (res *system.RemindersSearchRes, err error) + GetById(ctx context.Context, Id uint) (res *model.RemindersInfoRes, err error) + Add(ctx context.Context, req *system.RemindersAddReq) (err error) + Edit(ctx context.Context, req *system.RemindersEditReq) (err error) + Delete(ctx context.Context, Id []uint) (err error) +} + +var localReminders IReminders + +func Reminders() IReminders { + if localReminders == nil { + panic("implement not found for interface IReminders, forgot register?") + } + return localReminders +} + +func RegisterReminders(i IReminders) { + localReminders = i +} diff --git a/internal/app/system/service/sub_project.go b/internal/app/system/service/sub_project.go new file mode 100644 index 0000000..348b77a --- /dev/null +++ b/internal/app/system/service/sub_project.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-03-21 18:53:15 +// 生成路径: internal/app/system/service/sub_project.go +// 生成人:gfast +// desc:子项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type ISubProject interface { + List(ctx context.Context, req *system.SubProjectSearchReq) (res *system.SubProjectSearchRes, err error) + GetById(ctx context.Context, Id uint) (res *model.SubProjectInfoRes, err error) + Add(ctx context.Context, req *system.SubProjectAddReq) (err error) + Edit(ctx context.Context, req *system.SubProjectEditReq) (err error) + Delete(ctx context.Context, Id []uint) (err error) +} + +var localSubProject ISubProject + +func SubProject() ISubProject { + if localSubProject == nil { + panic("implement not found for interface ISubProject, forgot register?") + } + return localSubProject +} + +func RegisterSubProject(i ISubProject) { + localSubProject = i +} diff --git a/internal/app/system/service/sys_auth_rule.go b/internal/app/system/service/sys_auth_rule.go new file mode 100644 index 0000000..376966c --- /dev/null +++ b/internal/app/system/service/sys_auth_rule.go @@ -0,0 +1,47 @@ +// ================================================================================ +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +type ( + ISysAuthRule interface { + GetMenuListSearch(ctx context.Context, req *system.RuleSearchReq) (res []*model.SysAuthRuleInfoRes, err error) + GetIsMenuList(ctx context.Context) ([]*model.SysAuthRuleInfoRes, error) + GetMenuList(ctx context.Context) (list []*model.SysAuthRuleInfoRes, err error) + GetIsButtonList(ctx context.Context) ([]*model.SysAuthRuleInfoRes, error) + Add(ctx context.Context, req *system.RuleAddReq) (err error) + BindRoleRule(ctx context.Context, ruleId interface{}, roleIds []uint) (err error) + Get(ctx context.Context, id uint) (rule *entity.SysAuthRule, err error) + GetMenuRoles(ctx context.Context, id uint) (roleIds []uint, err error) + Update(ctx context.Context, req *system.RuleUpdateReq) (err error) + UpdateRoleRule(ctx context.Context, ruleId uint, roleIds []uint) (err error) + GetMenuListTree(pid uint, list []*model.SysAuthRuleInfoRes) []*model.SysAuthRuleTreeRes + DeleteMenuByIds(ctx context.Context, ids []int) (err error) + FindSonByParentId(list []*model.SysAuthRuleInfoRes, pid uint) []*model.SysAuthRuleInfoRes + } +) + +var ( + localSysAuthRule ISysAuthRule +) + +func SysAuthRule() ISysAuthRule { + if localSysAuthRule == nil { + panic("implement not found for interface ISysAuthRule, forgot register?") + } + return localSysAuthRule +} + +func RegisterSysAuthRule(i ISysAuthRule) { + localSysAuthRule = i +} diff --git a/internal/app/system/service/sys_dept.go b/internal/app/system/service/sys_dept.go new file mode 100644 index 0000000..83157aa --- /dev/null +++ b/internal/app/system/service/sys_dept.go @@ -0,0 +1,38 @@ +// ================================================================================ +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +type ISysDept interface { + GetList(ctx context.Context, req *system.DeptSearchReq) (list []*entity.SysDept, err error) + GetFromCache(ctx context.Context) (list []*entity.SysDept, err error) + Add(ctx context.Context, req *system.DeptAddReq) (err error) + Edit(ctx context.Context, req *system.DeptEditReq) (err error) + Delete(ctx context.Context, id uint64) (err error) + FindSonByParentId(deptList []*entity.SysDept, deptId uint64) []*entity.SysDept + GetListTree(pid uint64, list []*entity.SysDept) (deptTree []*model.SysDeptTreeRes) + GetByDeptId(ctx context.Context, deptId uint64) (dept *entity.SysDept, err error) +} + +var localSysDept ISysDept + +func SysDept() ISysDept { + if localSysDept == nil { + panic("implement not found for interface ISysDept, forgot register?") + } + return localSysDept +} + +func RegisterSysDept(i ISysDept) { + localSysDept = i +} diff --git a/internal/app/system/service/sys_file.go b/internal/app/system/service/sys_file.go new file mode 100644 index 0000000..a6380f2 --- /dev/null +++ b/internal/app/system/service/sys_file.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-07-29 15:32:09 +// 生成路径: internal/app/system/service/sys_file.go +// 生成人:gfast +// desc:文件 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type ISysFile interface { + List(ctx context.Context, req *system.SysFileSearchReq) (res *system.SysFileSearchRes, err error) + GetByFileId(ctx context.Context, FileId int) (res *model.SysFileInfoRes, err error) + Add(ctx context.Context, req *system.SysFileAddReq) (err error) + Edit(ctx context.Context, req *system.SysFileEditReq) (err error) + Delete(ctx context.Context, FileId []int) (err error) +} + +var localSysFile ISysFile + +func SysFile() ISysFile { + if localSysFile == nil { + panic("implement not found for interface ISysFile, forgot register?") + } + return localSysFile +} + +func RegisterSysFile(i ISysFile) { + localSysFile = i +} diff --git a/internal/app/system/service/sys_file_type.go b/internal/app/system/service/sys_file_type.go new file mode 100644 index 0000000..dc325ef --- /dev/null +++ b/internal/app/system/service/sys_file_type.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-07-29 15:27:54 +// 生成路径: internal/app/system/service/sys_file_type.go +// 生成人:gfast +// desc:文件类型 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type ISysFileType interface { + List(ctx context.Context, req *system.SysFileTypeSearchReq) (res *system.SysFileTypeSearchRes, err error) + GetById(ctx context.Context, Id int) (res *model.SysFileTypeInfoRes, err error) + Add(ctx context.Context, req *system.SysFileTypeAddReq) (err error) + Edit(ctx context.Context, req *system.SysFileTypeEditReq) (err error) + Delete(ctx context.Context, Id []int) (err error) +} + +var localSysFileType ISysFileType + +func SysFileType() ISysFileType { + if localSysFileType == nil { + panic("implement not found for interface ISysFileType, forgot register?") + } + return localSysFileType +} + +func RegisterSysFileType(i ISysFileType) { + localSysFileType = i +} diff --git a/internal/app/system/service/sys_job.go b/internal/app/system/service/sys_job.go new file mode 100644 index 0000000..cb3abb8 --- /dev/null +++ b/internal/app/system/service/sys_job.go @@ -0,0 +1,43 @@ +// ================================================================================ +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type ( + ISysJob interface { + List(ctx context.Context, req *system.SysJobSearchReq) (listRes *system.SysJobSearchRes, err error) + GetByJobId(ctx context.Context, jobId uint64) (res *model.SysJobInfoRes, err error) + Add(ctx context.Context, req *system.SysJobAddReq) (err error) + Edit(ctx context.Context, req *system.SysJobEditReq) (err error) + Delete(ctx context.Context, jobIds []uint64) (err error) + Start(ctx context.Context, jobId uint64) (err error) + Stop(ctx context.Context, jobId uint64) (err error) + Run(ctx context.Context, jobId uint64) (err error) + GetJobs(ctx context.Context) (jobs []*model.SysJobInfoRes, err error) + JobStart(ctx context.Context, job *model.SysJobInfoRes) error + } +) + +var ( + localSysJob ISysJob +) + +func SysJob() ISysJob { + if localSysJob == nil { + panic("implement not found for interface ISysJob, forgot register?") + } + return localSysJob +} + +func RegisterSysJob(i ISysJob) { + localSysJob = i +} diff --git a/internal/app/system/service/sys_job_log.go b/internal/app/system/service/sys_job_log.go new file mode 100644 index 0000000..1bc7247 --- /dev/null +++ b/internal/app/system/service/sys_job_log.go @@ -0,0 +1,36 @@ +// ================================================================================ +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" +) + +type ( + ISysJobLog interface { + Add(ctx context.Context, data *do.SysJobLog) (err error) + List(ctx context.Context, req *system.SysJobLogListReq) (listRes *system.SysJobLogListRes, err error) + Delete(ctx context.Context, logIds []uint64) (err error) + } +) + +var ( + localSysJobLog ISysJobLog +) + +func SysJobLog() ISysJobLog { + if localSysJobLog == nil { + panic("implement not found for interface ISysJobLog, forgot register?") + } + return localSysJobLog +} + +func RegisterSysJobLog(i ISysJobLog) { + localSysJobLog = i +} diff --git a/internal/app/system/service/sys_login_log.go b/internal/app/system/service/sys_login_log.go new file mode 100644 index 0000000..281ab2c --- /dev/null +++ b/internal/app/system/service/sys_login_log.go @@ -0,0 +1,33 @@ +// ================================================================================ +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type ISysLoginLog interface { + Invoke(ctx context.Context, data *model.LoginLogParams) + List(ctx context.Context, req *system.LoginLogSearchReq) (res *system.LoginLogSearchRes, err error) + DeleteLoginLogByIds(ctx context.Context, ids []int) (err error) + ClearLoginLog(ctx context.Context) (err error) +} + +var localSysLoginLog ISysLoginLog + +func SysLoginLog() ISysLoginLog { + if localSysLoginLog == nil { + panic("implement not found for interface ISysLoginLog, forgot register?") + } + return localSysLoginLog +} + +func RegisterSysLoginLog(i ISysLoginLog) { + localSysLoginLog = i +} diff --git a/internal/app/system/service/sys_oper_log.go b/internal/app/system/service/sys_oper_log.go new file mode 100644 index 0000000..39eb261 --- /dev/null +++ b/internal/app/system/service/sys_oper_log.go @@ -0,0 +1,40 @@ +// ================================================================================ +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" + + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type ( + IOperateLog interface { + OperationLog(r *ghttp.Request) + Invoke(ctx context.Context, data *model.SysOperLogAdd) + List(ctx context.Context, req *system.SysOperLogSearchReq) (listRes *system.SysOperLogSearchRes, err error) + GetByOperId(ctx context.Context, operId uint64) (res *model.SysOperLogInfoRes, err error) + DeleteByIds(ctx context.Context, ids []uint64) (err error) + ClearLog(ctx context.Context) (err error) + } +) + +var ( + localOperateLog IOperateLog +) + +func OperateLog() IOperateLog { + if localOperateLog == nil { + panic("implement not found for interface IOperateLog, forgot register?") + } + return localOperateLog +} + +func RegisterOperateLog(i IOperateLog) { + localOperateLog = i +} diff --git a/internal/app/system/service/sys_post.go b/internal/app/system/service/sys_post.go new file mode 100644 index 0000000..2ecace1 --- /dev/null +++ b/internal/app/system/service/sys_post.go @@ -0,0 +1,34 @@ +// ================================================================================ +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +type ISysPost interface { + List(ctx context.Context, req *system.PostSearchReq) (res *system.PostSearchRes, err error) + Add(ctx context.Context, req *system.PostAddReq) (err error) + Edit(ctx context.Context, req *system.PostEditReq) (err error) + Delete(ctx context.Context, ids []int) (err error) + GetUsedPost(ctx context.Context) (list []*entity.SysPost, err error) +} + +var localSysPost ISysPost + +func SysPost() ISysPost { + if localSysPost == nil { + panic("implement not found for interface ISysPost, forgot register?") + } + return localSysPost +} + +func RegisterSysPost(i ISysPost) { + localSysPost = i +} diff --git a/internal/app/system/service/sys_project.go b/internal/app/system/service/sys_project.go new file mode 100644 index 0000000..0519e9b --- /dev/null +++ b/internal/app/system/service/sys_project.go @@ -0,0 +1,46 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-07-27 15:20:49 +// 生成路径: internal/app/system/service/sys_project.go +// 生成人:gfast +// desc:项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type ISysProject interface { + List(ctx context.Context, req *system.SysProjectSearchReq) (res *system.SysProjectSearchRes, err error) + AllList(ctx context.Context, req *system.SysProjectSearchAllReq) (res *system.SysProjectSearchAllRes, err error) + GetById(ctx context.Context, Id int64) (res *model.SysProjectInfoRes, err error) + GetByProjectId(ctx context.Context, projectId string) (res *model.SysProjectInfoRes, err error) + Add(ctx context.Context, req *system.SysProjectAddReq) (err error) + Edit(ctx context.Context, req *system.SysProjectEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + CountProjectFunc(ctx context.Context, req *system.ParticipantNumberReq) (res *system.ParticipantNumberRes, err error) + ProgressOfWorksFunc(ctx context.Context, req *system.ProgressOfWorksReq) (res *system.ProgressOfWorksRes, err error) + ProjectCapacityFunc(ctx context.Context, req *system.ProjectCapacityReq) (res *system.ProjectCapacityRes, err error) + ProjectCapacityTwoFunc(ctx context.Context, req *system.ProjectCapacityTwoReq) (res *system.ProjectCapacityTwoRes, err error) + OneProjectFunc(ctx context.Context, req *system.OneProjectReq) (res *system.OneProjectRes, err error) + SafetyReqFunc(ctx context.Context, req *system.SafetyReq) (res *system.SafetyRes, err error) + SecurityAgreementFunc(ctx context.Context, req *system.SecurityAgreementReq) (err error) +} + +var localSysProject ISysProject + +func SysProject() ISysProject { + if localSysProject == nil { + panic("implement not found for interface ISysProject, forgot register?") + } + return localSysProject +} + +func RegisterSysProject(i ISysProject) { + localSysProject = i +} diff --git a/internal/app/system/service/sys_project_introduce.go b/internal/app/system/service/sys_project_introduce.go new file mode 100644 index 0000000..1020167 --- /dev/null +++ b/internal/app/system/service/sys_project_introduce.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-03-29 10:05:03 +// 生成路径: internal/app/system/service/sys_project_introduce.go +// 生成人:gfast +// desc:项目新闻 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type ISysProjectIntroduce interface { + List(ctx context.Context, req *system.SysProjectIntroduceSearchReq) (res *system.SysProjectIntroduceSearchRes, err error) + GetByProjectId(ctx context.Context, ProjectId int64) (res *model.SysProjectIntroduceInfoRes, err error) + Add(ctx context.Context, req *system.SysProjectIntroduceAddReq) (err error) + Edit(ctx context.Context, req *system.SysProjectIntroduceEditReq) (err error) + Delete(ctx context.Context, id []int64) (err error) +} + +var localSysProjectIntroduce ISysProjectIntroduce + +func SysProjectIntroduce() ISysProjectIntroduce { + if localSysProjectIntroduce == nil { + panic("implement not found for interface ISysProjectIntroduce, forgot register?") + } + return localSysProjectIntroduce +} + +func RegisterSysProjectIntroduce(i ISysProjectIntroduce) { + localSysProjectIntroduce = i +} diff --git a/internal/app/system/service/sys_project_value.go b/internal/app/system/service/sys_project_value.go new file mode 100644 index 0000000..0d7f682 --- /dev/null +++ b/internal/app/system/service/sys_project_value.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-03-27 12:55:26 +// 生成路径: internal/app/system/service/sys_project_value.go +// 生成人:xiaoyang +// desc:projectValue +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type ISysProjectValue interface { + EveryList(ctx context.Context, req *system.EveryProjectValueSearchReq) (listRes *system.EveryProjectValueSearchRes, err error) + List(ctx context.Context, req *system.SysProjectValueSearchReq) (res *system.SysProjectValueSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.SysProjectValueListRes, err error) + Add(ctx context.Context, req *system.SysProjectValueAddReq) (err error) + Edit(ctx context.Context, req *system.SysProjectValueEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localSysProjectValue ISysProjectValue + +func SysProjectValue() ISysProjectValue { + if localSysProjectValue == nil { + panic("implement not found for interface ISysProjectValue, forgot register?") + } + return localSysProjectValue +} + +func RegisterSysProjectValue(i ISysProjectValue) { + localSysProjectValue = i +} diff --git a/internal/app/system/service/sys_role.go b/internal/app/system/service/sys_role.go new file mode 100644 index 0000000..b93d10d --- /dev/null +++ b/internal/app/system/service/sys_role.go @@ -0,0 +1,45 @@ +// ================================================================================ +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +type ( + ISysRole interface { + GetRoleListSearch(ctx context.Context, req *system.RoleListReq) (res *system.RoleListRes, err error) + GetRoleList(ctx context.Context) (list []*entity.SysRole, err error) + AddRoleRule(ctx context.Context, ruleIds []uint, roleId int64) (err error) + DelRoleRule(ctx context.Context, roleId int64) (err error) + AddRole(ctx context.Context, req *system.RoleAddReq) (err error) + Get(ctx context.Context, id uint) (res *entity.SysRole, err error) + GetFilteredNamedPolicy(ctx context.Context, id uint) (gpSlice []int, err error) + EditRole(ctx context.Context, req *system.RoleEditReq) (err error) + DeleteByIds(ctx context.Context, ids []int64) (err error) + RoleDeptTreeSelect(ctx context.Context, roleId int64) (res *system.RoleDeptTreeSelectRes, err error) + GetRoleDepts(ctx context.Context, roleId int64) ([]int64, error) + RoleDataScope(ctx context.Context, req *system.DataScopeReq) error + } +) + +var ( + localSysRole ISysRole +) + +func SysRole() ISysRole { + if localSysRole == nil { + panic("implement not found for interface ISysRole, forgot register?") + } + return localSysRole +} + +func RegisterSysRole(i ISysRole) { + localSysRole = i +} diff --git a/internal/app/system/service/sys_user.go b/internal/app/system/service/sys_user.go new file mode 100644 index 0000000..b1b025a --- /dev/null +++ b/internal/app/system/service/sys_user.go @@ -0,0 +1,70 @@ +// ================================================================================ +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" + + "github.com/gogf/gf/v2/container/gset" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +type ( + ISysUser interface { + GetCasBinUserPrefix() string + NotCheckAuthAdminIds(ctx context.Context) *gset.Set + GetAdminUserByUsernamePassword(ctx context.Context, req *system.UserLoginReq) (user *model.LoginUserRes, err error) + GetUserByUsername(ctx context.Context, userName string) (user *model.LoginUserRes, err error) + GetUserById(ctx context.Context, id uint64) (user *model.LoginUserRes, err error) + LoginLog(ctx context.Context, params *model.LoginLogParams) + UpdateLoginInfo(ctx context.Context, id uint64, ip string) (err error) + GetAdminRules(ctx context.Context, userId uint64) (menuList []*model.UserMenus, permissions []string, err error) + GetAdminRole(ctx context.Context, userId uint64, allRoleList []*entity.SysRole) (roles []*entity.SysRole, err error) + GetAdminRoleIds(ctx context.Context, userId uint64) (roleIds []uint, err error) + GetAllMenus(ctx context.Context) (menus []*model.UserMenus, err error) + GetAdminMenusByRoleIds(ctx context.Context, roleIds []uint) (menus []*model.UserMenus, err error) + GetMenusTree(menus []*model.UserMenus, pid uint) []*model.UserMenus + GetPermissions(ctx context.Context, roleIds []uint) (userButtons []string, err error) + List(ctx context.Context, req *system.UserSearchReq) (total interface{}, userList []*entity.SysUser, err error) + GetUsersRoleDept(ctx context.Context, userList []*entity.SysUser) (users []*model.SysUserRoleDeptRes, err error) + Add(ctx context.Context, req *system.UserAddReq) (err error) + Edit(ctx context.Context, req *system.UserEditReq) (err error) + AddUserPost(ctx context.Context, tx gdb.TX, postIds []int64, userId int64) (err error) + EditUserRole(ctx context.Context, roleIds []int64, userId int64) (err error) + UserNameOrMobileExists(ctx context.Context, userName, mobile string, id ...int64) error + UserNameOrMobileData(ctx context.Context, userName, mobile string) (user *entity.SysUser, err error) + GetEditUser(ctx context.Context, id uint64) (res *system.UserGetEditRes, err error) + GetUserInfoById(ctx context.Context, id uint64, withPwd ...bool) (user *entity.SysUser, err error) + GetUserPostIds(ctx context.Context, userId uint64) (postIds []int64, err error) + ResetUserPwd(ctx context.Context, req *system.UserResetPwdReq) (err error) + ChangeUserStatus(ctx context.Context, req *system.UserStatusReq) (err error) + Delete(ctx context.Context, ids []int) (err error) + GetUsers(ctx context.Context, ids []int) (users []*model.SysUserSimpleRes, err error) + GetDataWhere(ctx context.Context, userInfo *model.ContextUser, entityData interface{}) (where g.Map, err error) + HasAccessByDataWhere(ctx context.Context, where g.Map, uid interface{}) bool + AccessRule(ctx context.Context, userId uint64, rule string) bool + AddUserRole(ctx context.Context, roleIds []int64, userId int64) (err error) // 添加用户角色 + } +) + +var ( + localSysUser ISysUser +) + +func SysUser() ISysUser { + if localSysUser == nil { + panic("implement not found for interface ISysUser, forgot register?") + } + return localSysUser +} + +func RegisterSysUser(i ISysUser) { + localSysUser = i +} diff --git a/internal/app/system/service/sys_user_online.go b/internal/app/system/service/sys_user_online.go new file mode 100644 index 0000000..790ec83 --- /dev/null +++ b/internal/app/system/service/sys_user_online.go @@ -0,0 +1,42 @@ +// ================================================================================ +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +type ( + ISysUserOnline interface { + Invoke(ctx context.Context, params *model.SysUserOnlineParams) + SaveOnline(ctx context.Context, params *model.SysUserOnlineParams) + CheckUserOnline(ctx context.Context) + GetOnlineListPage(ctx context.Context, req *system.SysUserOnlineSearchReq, hasToken ...bool) (res *system.SysUserOnlineSearchRes, err error) + UserIsOnline(ctx context.Context, token string) bool + DeleteOnlineByToken(ctx context.Context, token string) (err error) + ForceLogout(ctx context.Context, ids []int) (err error) + GetInfosByIds(ctx context.Context, ids []int) (onlineList []*entity.SysUserOnline, err error) + } +) + +var ( + localSysUserOnline ISysUserOnline +) + +func SysUserOnline() ISysUserOnline { + if localSysUserOnline == nil { + panic("implement not found for interface ISysUserOnline, forgot register?") + } + return localSysUserOnline +} + +func RegisterSysUserOnline(i ISysUserOnline) { + localSysUserOnline = i +} diff --git a/internal/app/system/service/sys_user_project.go b/internal/app/system/service/sys_user_project.go new file mode 100644 index 0000000..9e558f2 --- /dev/null +++ b/internal/app/system/service/sys_user_project.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-07-27 15:20:52 +// 生成路径: internal/app/system/service/sys_user_project.go +// 生成人:gfast +// desc:用户和项目关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type ISysUserProject interface { + List(ctx context.Context, req *system.SysUserProjectSearchReq) (res *system.SysUserProjectSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.SysUserProjectInfoRes, err error) + Add(ctx context.Context, req *system.SysUserProjectAddReq) (err error) + Edit(ctx context.Context, req *system.SysUserProjectEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localSysUserProject ISysUserProject + +func SysUserProject() ISysUserProject { + if localSysUserProject == nil { + panic("implement not found for interface ISysUserProject, forgot register?") + } + return localSysUserProject +} + +func RegisterSysUserProject(i ISysUserProject) { + localSysUserProject = i +} diff --git a/internal/app/system/service/sys_wechat_role.go b/internal/app/system/service/sys_wechat_role.go new file mode 100644 index 0000000..72dd65b --- /dev/null +++ b/internal/app/system/service/sys_wechat_role.go @@ -0,0 +1,39 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-01-22 15:05:43 +// 生成路径: internal/app/system/service/sys_wechat_role.go +// 生成人:gfast +// desc:微信角色 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type ISysWechatRole interface { + List(ctx context.Context, req *system.SysWechatRoleSearchReq) (res *system.SysWechatRoleSearchRes, err error) + RoleList(ctx context.Context, req *system.SysWechatRoleSearchNoPageReq) (res *system.SysWechatRoleSearchNoPageRes, err error) + GetById(ctx context.Context, Id int64) (res *model.SysWechatRoleListTwoRes, err error) + Add(ctx context.Context, req *system.SysWechatRoleAddReq) (err error) + Edit(ctx context.Context, req *system.SysWechatRoleEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + ModuleList(ctx context.Context, req *system.SysWechatModuleSearchReq) (res *system.SysWechatModuleSearchRes, err error) +} + +var localSysWechatRole ISysWechatRole + +func SysWechatRole() ISysWechatRole { + if localSysWechatRole == nil { + panic("implement not found for interface ISysWechatRole, forgot register?") + } + return localSysWechatRole +} + +func RegisterSysWechatRole(i ISysWechatRole) { + localSysWechatRole = i +} diff --git a/internal/app/system/service/template_data.go b/internal/app/system/service/template_data.go new file mode 100644 index 0000000..d4bab45 --- /dev/null +++ b/internal/app/system/service/template_data.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-12-08 14:21:01 +// 生成路径: internal/app/system/service/template_data.go +// 生成人:gfast +// desc:工程资料>资料 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type ITemplateData interface { + List(ctx context.Context, req *system.TemplateDataSearchReq) (res *system.TemplateDataSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.TemplateDataInfoRes, err error) + Add(ctx context.Context, req *system.TemplateDataAddReq) (err error) + Edit(ctx context.Context, req *system.TemplateDataEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localTemplateData ITemplateData + +func TemplateData() ITemplateData { + if localTemplateData == nil { + panic("implement not found for interface ITemplateData, forgot register?") + } + return localTemplateData +} + +func RegisterTemplateData(i ITemplateData) { + localTemplateData = i +} diff --git a/internal/app/system/service/template_data_junior.go b/internal/app/system/service/template_data_junior.go new file mode 100644 index 0000000..d0aa900 --- /dev/null +++ b/internal/app/system/service/template_data_junior.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-12-08 14:21:01 +// 生成路径: internal/app/system/service/template_data_junior.go +// 生成人:gfast +// desc:工程资料>资料>下级模板 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type ITemplateDataJunior interface { + List(ctx context.Context, req *system.TemplateDataJuniorSearchReq) (res *system.TemplateDataJuniorSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.TemplateDataJuniorInfoRes, err error) + Add(ctx context.Context, req *system.TemplateDataJuniorAddReq) (err error) + Edit(ctx context.Context, req *system.TemplateDataJuniorEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localTemplateDataJunior ITemplateDataJunior + +func TemplateDataJunior() ITemplateDataJunior { + if localTemplateDataJunior == nil { + panic("implement not found for interface ITemplateDataJunior, forgot register?") + } + return localTemplateDataJunior +} + +func RegisterTemplateDataJunior(i ITemplateDataJunior) { + localTemplateDataJunior = i +} diff --git a/internal/app/system/service/template_data_source_data.go b/internal/app/system/service/template_data_source_data.go new file mode 100644 index 0000000..24ff4cd --- /dev/null +++ b/internal/app/system/service/template_data_source_data.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-12-08 10:06:54 +// 生成路径: internal/app/system/service/template_data_source_data.go +// 生成人:gfast +// desc:模板资料源数据 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type ITemplateDataSourceData interface { + List(ctx context.Context, req *system.TemplateDataSourceDataSearchReq) (res *system.TemplateDataSourceDataSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.TemplateDataSourceDataInfoRes, err error) + Add(ctx context.Context, req *system.TemplateDataSourceDataAddReq) (err error) + Edit(ctx context.Context, req *system.TemplateDataSourceDataEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localTemplateDataSourceData ITemplateDataSourceData + +func TemplateDataSourceData() ITemplateDataSourceData { + if localTemplateDataSourceData == nil { + panic("implement not found for interface ITemplateDataSourceData, forgot register?") + } + return localTemplateDataSourceData +} + +func RegisterTemplateDataSourceData(i ITemplateDataSourceData) { + localTemplateDataSourceData = i +} diff --git a/internal/app/system/service/time_task.go b/internal/app/system/service/time_task.go new file mode 100644 index 0000000..b477d26 --- /dev/null +++ b/internal/app/system/service/time_task.go @@ -0,0 +1,33 @@ +// ================================================================================ +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type ( + ITaskList interface { + AddTask(task *model.TimeTask) + GetByName(funcName string) *model.TimeTask + EditParams(funcName string, params []string) + } +) + +var ( + localTaskList ITaskList +) + +func TaskList() ITaskList { + if localTaskList == nil { + panic("implement not found for interface ITaskList, forgot register?") + } + return localTaskList +} + +func RegisterTaskList(i ITaskList) { + localTaskList = i +} diff --git a/internal/app/system/service/todo_tasks.go b/internal/app/system/service/todo_tasks.go new file mode 100644 index 0000000..3418ce7 --- /dev/null +++ b/internal/app/system/service/todo_tasks.go @@ -0,0 +1,39 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-05-15 17:30:14 +// 生成路径: internal/app/system/service/todo_tasks.go +// 生成人:gfast +// desc:App-待办 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type ITodoTasks interface { + MyList(ctx context.Context, req *system.TodoTasksMyListReq) (res *system.TodoTasksMyListRes, err error) + List(ctx context.Context, req *system.TodoTasksSearchReq) (res *system.TodoTasksSearchRes, err error) + GetById(ctx context.Context, Id uint) (res *model.TodoTasksInfoRes, err error) + Add(ctx context.Context, req *system.TodoTasksAddReq) (err error) + Edit(ctx context.Context, req *system.TodoTasksEditReq) (err error) + Delete(ctx context.Context, Id []uint) (err error) +} + +var localTodoTasks ITodoTasks + +func TodoTasks() ITodoTasks { + if localTodoTasks == nil { + panic("implement not found for interface ITodoTasks, forgot register?") + } + return localTodoTasks +} + +func RegisterTodoTasks(i ITodoTasks) { + localTodoTasks = i +} diff --git a/internal/app/system/service/token.go b/internal/app/system/service/token.go new file mode 100644 index 0000000..f0bcae2 --- /dev/null +++ b/internal/app/system/service/token.go @@ -0,0 +1,38 @@ +/* +* @desc:token功能 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/8 15:54 + */ + +package service + +import ( + "context" + + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast-token/gftoken" +) + +type IGfToken interface { + GenerateToken(ctx context.Context, key string, data interface{}) (keys string, err error) + Middleware(group *ghttp.RouterGroup) error + ParseToken(r *ghttp.Request) (*gftoken.CustomClaims, error) + IsLogin(r *ghttp.Request) (b bool, failed *gftoken.AuthFailed) + GetRequestToken(r *ghttp.Request) (token string) + RemoveToken(ctx context.Context, token string) (err error) + GetTokenData(ctx context.Context, token string) (tData *gftoken.TokenData, key string, err error) +} + +var gt IGfToken + +func RegisterGToken(gtk IGfToken) { + gt = gtk +} + +func GfToken() IGfToken { + if gt == nil { + panic("implement not found for interface IGfToken, forgot register?") + } + return gt +} diff --git a/internal/app/system/service/tools_gen_table.go b/internal/app/system/service/tools_gen_table.go new file mode 100644 index 0000000..93bbe9b --- /dev/null +++ b/internal/app/system/service/tools_gen_table.go @@ -0,0 +1,50 @@ +// ================================================================================ +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" + + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +type ( + IToolsGenTable interface { + List(ctx context.Context, req *system.ToolsGenTableSearchReq) (res *system.ToolsGenTableSearchRes, err error) + SelectDbTableList(ctx context.Context, req *system.ToolsGenTableImportSearchReq) (res *system.ToolsGenTableSearchRes, err error) + SelectDbTableListByNames(ctx context.Context, tableNames []string) ([]*entity.ToolsGenTable, error) + ImportGenTable(ctx context.Context, tableList []*entity.ToolsGenTable) error + InitTable(ctx context.Context, table *entity.ToolsGenTable, columns []*entity.ToolsGenTableColumn) error + ConvertClassName(ctx context.Context, tableName string) string + GetBusinessName(ctx context.Context, tableName string) string + DeleteTable(ctx context.Context, req *system.ToolsGenTableDeleteReq) error + ColumnList(ctx context.Context, req *system.ToolsGenTableEditReq) (res *system.ToolsGenTableEditRes, err error) + GetTableInfoByTableId(ctx context.Context, tableId int64) (data *entity.ToolsGenTable, err error) + GetRelationTable(ctx context.Context) (res []*model.ToolsGenTableColumnsData, err error) + SaveEdit(ctx context.Context, req *system.ToolsGenTableColumnsEditReq) (err error) + GenData(ctx context.Context, tableId int64) (data g.MapStrStr, extendData *model.ToolsGenTableEx, err error) + SelectRecordById(ctx context.Context, tableId int64) (tableEx *model.ToolsGenTableEx, err error) + GenCode(ctx context.Context, ids []int) (err error) + } +) + +var ( + localToolsGenTable IToolsGenTable +) + +func ToolsGenTable() IToolsGenTable { + if localToolsGenTable == nil { + panic("implement not found for interface IToolsGenTable, forgot register?") + } + return localToolsGenTable +} + +func RegisterToolsGenTable(i IToolsGenTable) { + localToolsGenTable = i +} diff --git a/internal/app/system/service/tools_gen_table_column.go b/internal/app/system/service/tools_gen_table_column.go new file mode 100644 index 0000000..2e0e3de --- /dev/null +++ b/internal/app/system/service/tools_gen_table_column.go @@ -0,0 +1,53 @@ +// ================================================================================ +// Code generated by GoFrame CLI tool. DO NOT EDIT. +// You can delete these comments if you wish manually maintain this interface file. +// ================================================================================ + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +type ( + IToolsGenTableColumn interface { + SelectDbTableColumnsByName(ctx context.Context, tableName string) ([]*entity.ToolsGenTableColumn, error) + InitColumnField(column *entity.ToolsGenTableColumn, table *entity.ToolsGenTable) + GetDbType(columnType string) string + IsExistInArray(value string, array []string) bool + IsStringObject(dataType string) bool + IsTimeObject(dataType string) bool + IsNumberObject(dataType string) bool + IsNotEdit(name string) bool + IsNotList(name string) bool + IsNotDetail(name string) bool + IsNotQuery(name string) bool + CheckNameColumn(columnName string) bool + CheckStatusColumn(columnName string) bool + CheckTypeColumn(columnName string) bool + CheckSexColumn(columnName string) bool + SelectGenTableColumnListByTableId(ctx context.Context, tableId int64) (list []*entity.ToolsGenTableColumn, err error) + GetAllTableColumns(ctx context.Context) (list []*entity.ToolsGenTableColumn, err error) + SetPkColumn(table *model.ToolsGenTableEx, columns []*model.ToolsGenTableColumnEx) + GetColumnLength(columnType string) int + SelectDbTableColumnMapByName(ctx context.Context, tableName string) (res map[string]*entity.ToolsGenTableColumn, err error) + } +) + +var ( + localToolsGenTableColumn IToolsGenTableColumn +) + +func ToolsGenTableColumn() IToolsGenTableColumn { + if localToolsGenTableColumn == nil { + panic("implement not found for interface IToolsGenTableColumn, forgot register?") + } + return localToolsGenTableColumn +} + +func RegisterToolsGenTableColumn(i IToolsGenTableColumn) { + localToolsGenTableColumn = i +} diff --git a/internal/app/system/service/user_registration.go b/internal/app/system/service/user_registration.go new file mode 100644 index 0000000..190ddd8 --- /dev/null +++ b/internal/app/system/service/user_registration.go @@ -0,0 +1,40 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-07-26 15:32:12 +// 生成路径: internal/app/system/service/user_registration.go +// 生成人:gfast +// desc:极光推送 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IUserRegistration interface { + List(ctx context.Context, req *system.UserRegistrationSearchReq) (res *system.UserRegistrationSearchRes, err error) + GetById(ctx context.Context, Id uint) (res *model.UserRegistrationInfoRes, err error) + Add(ctx context.Context, req *system.UserRegistrationAddReq) (err error) + Edit(ctx context.Context, req *system.UserRegistrationEditReq) (err error) + Delete(ctx context.Context, Id []uint) (err error) + // 是否已经绑定 + IsBind(ctx context.Context, userID int) bool +} + +var localUserRegistration IUserRegistration + +func UserRegistration() IUserRegistration { + if localUserRegistration == nil { + panic("implement not found for interface IUserRegistration, forgot register?") + } + return localUserRegistration +} + +func RegisterUserRegistration(i IUserRegistration) { + localUserRegistration = i +} diff --git a/internal/app/system/service/work_schedule.go b/internal/app/system/service/work_schedule.go new file mode 100644 index 0000000..f5052a6 --- /dev/null +++ b/internal/app/system/service/work_schedule.go @@ -0,0 +1,39 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-03-20 10:02:26 +// 生成路径: internal/app/system/service/work_schedule.go +// 生成人:gfast +// desc:工作计划 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IWorkSchedule interface { + List(ctx context.Context, req *system.WorkScheduleSearchReq) (res *system.WorkScheduleSearchRes, err error) + GetById(ctx context.Context, Id uint) (res *model.WorkScheduleInfoRes, err error) + Add(ctx context.Context, req *system.WorkScheduleAddReq) (err error) + Edit(ctx context.Context, req *system.WorkScheduleEditReq) (err error) + Delete(ctx context.Context, req *system.WorkScheduleDeleteReq) (err error) + IsExistWorkSchedule(ctx context.Context, subProjectID, fangzhenID string, startAt, endAt string) bool +} + +var localWorkSchedule IWorkSchedule + +func WorkSchedule() IWorkSchedule { + if localWorkSchedule == nil { + panic("implement not found for interface IWorkSchedule, forgot register?") + } + return localWorkSchedule +} + +func RegisterWorkSchedule(i IWorkSchedule) { + localWorkSchedule = i +} diff --git a/internal/app/system/service/work_status.go b/internal/app/system/service/work_status.go new file mode 100644 index 0000000..217ccc9 --- /dev/null +++ b/internal/app/system/service/work_status.go @@ -0,0 +1,40 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-03-19 11:45:09 +// 生成路径: internal/app/system/service/work_status.go +// 生成人:gfast +// desc:工作状态 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IWorkStatus interface { + List(ctx context.Context, req *system.WorkStatusSearchReq) (res *system.WorkStatusSearchRes, err error) + GetById(ctx context.Context, Id uint) (res *model.WorkStatusInfoRes, err error) + Add(ctx context.Context, req *system.WorkStatusAddReq) (err error) + Edit(ctx context.Context, req *system.WorkStatusEditReq) (err error) + Delete(ctx context.Context, Id []uint) (err error) + Progress(ctx context.Context, fangzhenID string) ([]*model.WorkStatusProgressRes, error) + GetParentProgress(ctx context.Context, req *system.WorkStatusGetParentProgressReq) (*system.WorkStatusGetProgressRes, error) +} + +var localWorkStatus IWorkStatus + +func WorkStatus() IWorkStatus { + if localWorkStatus == nil { + panic("implement not found for interface IWorkStatus, forgot register?") + } + return localWorkStatus +} + +func RegisterWorkStatus(i IWorkStatus) { + localWorkStatus = i +} diff --git a/internal/app/system/service/xiangmuhuafenbiao.go b/internal/app/system/service/xiangmuhuafenbiao.go new file mode 100644 index 0000000..e2b6da9 --- /dev/null +++ b/internal/app/system/service/xiangmuhuafenbiao.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-10-07 16:08:10 +// 生成路径: internal/app/system/service/xiangmuhuafenbiao.go +// 生成人:gfast +// desc:项目划分 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IXiangmuhuafenbiao interface { + List(ctx context.Context, req *system.XiangmuhuafenbiaoSearchReq) (res *system.XiangmuhuafenbiaoSearchRes, err error) + GetById(ctx context.Context, Id int) (res *model.XiangmuhuafenbiaoInfoRes, err error) + Add(ctx context.Context, req *system.XiangmuhuafenbiaoAddReq) (err error) + Edit(ctx context.Context, req *system.XiangmuhuafenbiaoEditReq) (err error) + Delete(ctx context.Context, Id []int) (err error) + EditExcelFunc(ctx context.Context, req *system.EditExcelFuncReq) (err error) +} + +var localXiangmuhuafenbiao IXiangmuhuafenbiao + +func Xiangmuhuafenbiao() IXiangmuhuafenbiao { + if localXiangmuhuafenbiao == nil { + panic("implement not found for interface IXiangmuhuafenbiao, forgot register?") + } + return localXiangmuhuafenbiao +} + +func RegisterXiangmuhuafenbiao(i IXiangmuhuafenbiao) { + localXiangmuhuafenbiao = i +} diff --git a/internal/app/system/service/ys7devices.go b/internal/app/system/service/ys7devices.go new file mode 100644 index 0000000..40e0821 --- /dev/null +++ b/internal/app/system/service/ys7devices.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-03-01 12:49:32 +// 生成路径: internal/app/system/service/ys7devices.go +// 生成人:gfast +// desc:荧石摄像头 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IYs7Devices interface { + List(ctx context.Context, req *system.Ys7DevicesSearchReq) (res *system.Ys7DevicesSearchRes, err error) + GetById(ctx context.Context, Id uint) (res *model.Ys7DevicesInfoRes, err error) + Add(ctx context.Context, req *system.Ys7DevicesAddReq) (err error) + Edit(ctx context.Context, req *system.Ys7DevicesEditReq) (err error) + Delete(ctx context.Context, Id []uint) (err error) +} + +var localYs7Devices IYs7Devices + +func Ys7Devices() IYs7Devices { + if localYs7Devices == nil { + panic("implement not found for interface IYs7Devices, forgot register?") + } + return localYs7Devices +} + +func RegisterYs7Devices(i IYs7Devices) { + localYs7Devices = i +} diff --git a/internal/app/system/service/ys7devices_img.go b/internal/app/system/service/ys7devices_img.go new file mode 100644 index 0000000..b14b945 --- /dev/null +++ b/internal/app/system/service/ys7devices_img.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2024-08-19 11:51:53 +// 生成路径: internal/app/system/service/ys7devices_img.go +// 生成人:gfast +// desc:摄像头所拍摄到的所有图片(每月会定时清除) +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IYs7DevicesImg interface { + List(ctx context.Context, req *system.Ys7DevicesImgSearchReq) (res *system.Ys7DevicesImgSearchRes, err error) + GetById(ctx context.Context, Id uint64) (res *model.Ys7DevicesImgInfoRes, err error) + Add(ctx context.Context, req *system.Ys7DevicesImgAddReq) (err error) + Edit(ctx context.Context, req *system.Ys7DevicesImgEditReq) (err error) + Delete(ctx context.Context, Id []uint64) (err error) +} + +var localYs7DevicesImg IYs7DevicesImg + +func Ys7DevicesImg() IYs7DevicesImg { + if localYs7DevicesImg == nil { + panic("implement not found for interface IYs7DevicesImg, forgot register?") + } + return localYs7DevicesImg +} + +func RegisterYs7DevicesImg(i IYs7DevicesImg) { + localYs7DevicesImg = i +} diff --git a/internal/app/system/service/zmkg_gis_model_lib.go b/internal/app/system/service/zmkg_gis_model_lib.go new file mode 100644 index 0000000..c25c23d --- /dev/null +++ b/internal/app/system/service/zmkg_gis_model_lib.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-07-31 10:18:14 +// 生成路径: internal/app/system/service/zmkg_gis_model_lib.go +// 生成人:gfast +// desc:模型库 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/model" +) + +type IZmkgGisModelLib interface { + List(ctx context.Context, req *system.ZmkgGisModelLibSearchReq) (res *system.ZmkgGisModelLibSearchRes, err error) + GetById(ctx context.Context, Id int) (res *model.ZmkgGisModelLibInfoRes, err error) + Add(ctx context.Context, req *system.ZmkgGisModelLibAddReq) (err error) + Edit(ctx context.Context, req *system.ZmkgGisModelLibEditReq) (err error) + Delete(ctx context.Context, Id []int) (err error) +} + +var localZmkgGisModelLib IZmkgGisModelLib + +func ZmkgGisModelLib() IZmkgGisModelLib { + if localZmkgGisModelLib == nil { + panic("implement not found for interface IZmkgGisModelLib, forgot register?") + } + return localZmkgGisModelLib +} + +func RegisterZmkgGisModelLib(i IZmkgGisModelLib) { + localZmkgGisModelLib = i +} diff --git a/internal/app/test/controller/test_contact_info.go b/internal/app/test/controller/test_contact_info.go new file mode 100644 index 0000000..0b27ab3 --- /dev/null +++ b/internal/app/test/controller/test_contact_info.go @@ -0,0 +1,54 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-09-01 17:36:18 +// 生成路径: internal/app/test/controller/test_contact_info.go +// 生成人:yqq +// desc:业主方联系人关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/test" + systemController "github.com/tiger1103/gfast/v3/internal/app/system/controller" + "github.com/tiger1103/gfast/v3/internal/app/test/service" +) + +type testContactInfoController struct { + systemController.BaseController +} + +var TestContactInfo = new(testContactInfoController) + +// List 列表 +func (c *testContactInfoController) List(ctx context.Context, req *test.TestContactInfoSearchReq) (res *test.TestContactInfoSearchRes, err error) { + res, err = service.TestContactInfo().List(ctx, req) + return +} + +// Get 获取业主方联系人关联 +func (c *testContactInfoController) Get(ctx context.Context, req *test.TestContactInfoGetReq) (res *test.TestContactInfoGetRes, err error) { + res = new(test.TestContactInfoGetRes) + res.TestContactInfoInfoRes, err = service.TestContactInfo().GetById(ctx, req.Id) + return +} + +// Add 添加业主方联系人关联 +func (c *testContactInfoController) Add(ctx context.Context, req *test.TestContactInfoAddReq) (res *test.TestContactInfoAddRes, err error) { + err = service.TestContactInfo().Add(ctx, req) + return +} + +// Edit 修改业主方联系人关联 +func (c *testContactInfoController) Edit(ctx context.Context, req *test.TestContactInfoEditReq) (res *test.TestContactInfoEditRes, err error) { + err = service.TestContactInfo().Edit(ctx, req) + return +} + +// Delete 删除业主方联系人关联 +func (c *testContactInfoController) Delete(ctx context.Context, req *test.TestContactInfoDeleteReq) (res *test.TestContactInfoDeleteRes, err error) { + err = service.TestContactInfo().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/test/controller/test_follow_info.go b/internal/app/test/controller/test_follow_info.go new file mode 100644 index 0000000..b97e176 --- /dev/null +++ b/internal/app/test/controller/test_follow_info.go @@ -0,0 +1,54 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-09-01 16:38:07 +// 生成路径: internal/app/test/controller/test_follow_info.go +// 生成人:yqq +// desc:跟进信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/test" + systemController "github.com/tiger1103/gfast/v3/internal/app/system/controller" + "github.com/tiger1103/gfast/v3/internal/app/test/service" +) + +type testFollowInfoController struct { + systemController.BaseController +} + +var TestFollowInfo = new(testFollowInfoController) + +// List 列表 +func (c *testFollowInfoController) List(ctx context.Context, req *test.TestFollowInfoSearchReq) (res *test.TestFollowInfoSearchRes, err error) { + res, err = service.TestFollowInfo().List(ctx, req) + return +} + +// Get 获取跟进信息 +func (c *testFollowInfoController) Get(ctx context.Context, req *test.TestFollowInfoGetReq) (res *test.TestFollowInfoGetRes, err error) { + res = new(test.TestFollowInfoGetRes) + res.TestFollowInfoInfoRes, err = service.TestFollowInfo().GetById(ctx, req.Id) + return +} + +// Add 添加跟进信息 +func (c *testFollowInfoController) Add(ctx context.Context, req *test.TestFollowInfoAddReq) (res *test.TestFollowInfoAddRes, err error) { + err = service.TestFollowInfo().Add(ctx, req) + return +} + +// Edit 修改跟进信息 +func (c *testFollowInfoController) Edit(ctx context.Context, req *test.TestFollowInfoEditReq) (res *test.TestFollowInfoEditRes, err error) { + err = service.TestFollowInfo().Edit(ctx, req) + return +} + +// Delete 删除跟进信息 +func (c *testFollowInfoController) Delete(ctx context.Context, req *test.TestFollowInfoDeleteReq) (res *test.TestFollowInfoDeleteRes, err error) { + err = service.TestFollowInfo().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/test/controller/test_owner_info.go b/internal/app/test/controller/test_owner_info.go new file mode 100644 index 0000000..3629a4e --- /dev/null +++ b/internal/app/test/controller/test_owner_info.go @@ -0,0 +1,54 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-09-01 17:51:42 +// 生成路径: internal/app/test/controller/test_owner_info.go +// 生成人:yqq +// desc:业主方基本情况 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/test" + systemController "github.com/tiger1103/gfast/v3/internal/app/system/controller" + "github.com/tiger1103/gfast/v3/internal/app/test/service" +) + +type testOwnerInfoController struct { + systemController.BaseController +} + +var TestOwnerInfo = new(testOwnerInfoController) + +// List 列表 +func (c *testOwnerInfoController) List(ctx context.Context, req *test.TestOwnerInfoSearchReq) (res *test.TestOwnerInfoSearchRes, err error) { + res, err = service.TestOwnerInfo().List(ctx, req) + return +} + +// Get 获取业主方基本情况 +func (c *testOwnerInfoController) Get(ctx context.Context, req *test.TestOwnerInfoGetReq) (res *test.TestOwnerInfoGetRes, err error) { + res = new(test.TestOwnerInfoGetRes) + res.TestOwnerInfoInfoRes, err = service.TestOwnerInfo().GetById(ctx, req.Id) + return +} + +// Add 添加业主方基本情况 +func (c *testOwnerInfoController) Add(ctx context.Context, req *test.TestOwnerInfoAddReq) (res *test.TestOwnerInfoAddRes, err error) { + err = service.TestOwnerInfo().Add(ctx, req) + return +} + +// Edit 修改业主方基本情况 +func (c *testOwnerInfoController) Edit(ctx context.Context, req *test.TestOwnerInfoEditReq) (res *test.TestOwnerInfoEditRes, err error) { + err = service.TestOwnerInfo().Edit(ctx, req) + return +} + +// Delete 删除业主方基本情况 +func (c *testOwnerInfoController) Delete(ctx context.Context, req *test.TestOwnerInfoDeleteReq) (res *test.TestOwnerInfoDeleteRes, err error) { + err = service.TestOwnerInfo().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/test/controller/test_project_info.go b/internal/app/test/controller/test_project_info.go new file mode 100644 index 0000000..cc4aba3 --- /dev/null +++ b/internal/app/test/controller/test_project_info.go @@ -0,0 +1,54 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-09-01 16:15:09 +// 生成路径: internal/app/test/controller/test_project_info.go +// 生成人:yqq +// desc:项目备案信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/test" + systemController "github.com/tiger1103/gfast/v3/internal/app/system/controller" + "github.com/tiger1103/gfast/v3/internal/app/test/service" +) + +type testProjectInfoController struct { + systemController.BaseController +} + +var TestProjectInfo = new(testProjectInfoController) + +// List 列表 +func (c *testProjectInfoController) List(ctx context.Context, req *test.TestProjectInfoSearchReq) (res *test.TestProjectInfoSearchRes, err error) { + res, err = service.TestProjectInfo().List(ctx, req) + return +} + +// Get 获取项目备案信息 +func (c *testProjectInfoController) Get(ctx context.Context, req *test.TestProjectInfoGetReq) (res *test.TestProjectInfoGetRes, err error) { + res = new(test.TestProjectInfoGetRes) + res.TestProjectInfoInfoRes, err = service.TestProjectInfo().GetById(ctx, req.Id) + return +} + +// Add 添加项目备案信息 +func (c *testProjectInfoController) Add(ctx context.Context, req *test.TestProjectInfoAddReq) (res *test.TestProjectInfoAddRes, err error) { + err = service.TestProjectInfo().Add(ctx, req) + return +} + +// Edit 修改项目备案信息 +func (c *testProjectInfoController) Edit(ctx context.Context, req *test.TestProjectInfoEditReq) (res *test.TestProjectInfoEditRes, err error) { + err = service.TestProjectInfo().Edit(ctx, req) + return +} + +// Delete 删除项目备案信息 +func (c *testProjectInfoController) Delete(ctx context.Context, req *test.TestProjectInfoDeleteReq) (res *test.TestProjectInfoDeleteRes, err error) { + err = service.TestProjectInfo().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/test/dao/internal/test_contact_info.go b/internal/app/test/dao/internal/test_contact_info.go new file mode 100644 index 0000000..886af9c --- /dev/null +++ b/internal/app/test/dao/internal/test_contact_info.go @@ -0,0 +1,86 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-09-01 17:36:18 +// 生成路径: internal/app/test/dao/internal/test_contact_info.go +// 生成人:yqq +// desc:业主方联系人关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// TestContactInfoDao is the manager for logic model data accessing and custom defined data operations functions management. +type TestContactInfoDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns TestContactInfoColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// TestContactInfoColumns defines and stores column names for table test_contact_info. +type TestContactInfoColumns struct { + Id string // + OwenerId string // + ContactName string // + ContactPost string // + ContactPhone string // + Creator string // +} + +var testContactInfoColumns = TestContactInfoColumns{ + Id: "id", + OwenerId: "owener_id", + ContactName: "contact_name", + ContactPost: "contact_post", + ContactPhone: "contact_phone", + Creator: "creator", +} + +// NewTestContactInfoDao creates and returns a new DAO object for table data access. +func NewTestContactInfoDao() *TestContactInfoDao { + return &TestContactInfoDao{ + group: "default", + table: "test_contact_info", + columns: testContactInfoColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *TestContactInfoDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *TestContactInfoDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *TestContactInfoDao) Columns() TestContactInfoColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *TestContactInfoDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *TestContactInfoDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *TestContactInfoDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/test/dao/internal/test_follow_info.go b/internal/app/test/dao/internal/test_follow_info.go new file mode 100644 index 0000000..98708a0 --- /dev/null +++ b/internal/app/test/dao/internal/test_follow_info.go @@ -0,0 +1,100 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-09-01 16:38:07 +// 生成路径: internal/app/test/dao/internal/test_follow_info.go +// 生成人:yqq +// desc:跟进信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// TestFollowInfoDao is the manager for logic model data accessing and custom defined data operations functions management. +type TestFollowInfoDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns TestFollowInfoColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// TestFollowInfoColumns defines and stores column names for table test_follow_info. +type TestFollowInfoColumns struct { + Id string // + ProjectId string // 关联的项目 + FollowName string // 跟进人姓名 + OwnerId string // 业主名 + ContactName string // 对接人姓名 + ConPostName string // 对接人职称 + ContactPhone string // 对接人电话 + FollowInfo string // 跟进情况 + FollowFile string // 相关附件 + CreatedAt string // 创建日期 + UpdatedAt string // 修改日期 + DeletedAt string // 删除日期 + Creator string // 删除日期 +} + +var testFollowInfoColumns = TestFollowInfoColumns{ + Id: "id", + ProjectId: "project_id", + FollowName: "follow_name", + OwnerId: "owner_id", + ContactName: "contact_name", + ConPostName: "con_post_name", + ContactPhone: "contact_phone", + FollowInfo: "follow_info", + FollowFile: "follow_file", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + Creator: "creator", +} + +// NewTestFollowInfoDao creates and returns a new DAO object for table data access. +func NewTestFollowInfoDao() *TestFollowInfoDao { + return &TestFollowInfoDao{ + group: "default", + table: "test_follow_info", + columns: testFollowInfoColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *TestFollowInfoDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *TestFollowInfoDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *TestFollowInfoDao) Columns() TestFollowInfoColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *TestFollowInfoDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *TestFollowInfoDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *TestFollowInfoDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/test/dao/internal/test_owner_info.go b/internal/app/test/dao/internal/test_owner_info.go new file mode 100644 index 0000000..78bdfbf --- /dev/null +++ b/internal/app/test/dao/internal/test_owner_info.go @@ -0,0 +1,96 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-09-01 17:51:41 +// 生成路径: internal/app/test/dao/internal/test_owner_info.go +// 生成人:yqq +// desc:业主方基本情况 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// TestOwnerInfoDao is the manager for logic model data accessing and custom defined data operations functions management. +type TestOwnerInfoDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns TestOwnerInfoColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// TestOwnerInfoColumns defines and stores column names for table test_owner_info. +type TestOwnerInfoColumns struct { + Id string // + CompanyName string // 企业名称 + CompanyAddress string // 单位地址 + RegistrationType string // 企业登记注册类型 + RegisteredCapital string // 注册资金 + Legaler string // 法人代表 + LegalerPhone string // 法人电话 + CreatedAt string // 创建日期 + UpdatedAt string // 修改日期 + DeletedAt string // 删除日期 + Creator string // 删除日期 +} + +var testOwnerInfoColumns = TestOwnerInfoColumns{ + Id: "id", + CompanyName: "company_name", + CompanyAddress: "company_address", + RegistrationType: "registration_type", + RegisteredCapital: "registered_capital", + Legaler: "legaler", + LegalerPhone: "legaler_phone", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + Creator: "creator", +} + +// NewTestOwnerInfoDao creates and returns a new DAO object for table data access. +func NewTestOwnerInfoDao() *TestOwnerInfoDao { + return &TestOwnerInfoDao{ + group: "default", + table: "test_owner_info", + columns: testOwnerInfoColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *TestOwnerInfoDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *TestOwnerInfoDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *TestOwnerInfoDao) Columns() TestOwnerInfoColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *TestOwnerInfoDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *TestOwnerInfoDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *TestOwnerInfoDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/test/dao/internal/test_project_info.go b/internal/app/test/dao/internal/test_project_info.go new file mode 100644 index 0000000..8d4cab5 --- /dev/null +++ b/internal/app/test/dao/internal/test_project_info.go @@ -0,0 +1,100 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-09-01 16:15:09 +// 生成路径: internal/app/test/dao/internal/test_project_info.go +// 生成人:yqq +// desc:项目备案信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// TestProjectInfoDao is the manager for logic model data accessing and custom defined data operations functions management. +type TestProjectInfoDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns TestProjectInfoColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// TestProjectInfoColumns defines and stores column names for table test_project_info. +type TestProjectInfoColumns struct { + Id string // + ProjectName string // 项目名称 + ProjectAddress string // 单位地址 + ProjectLeader string // 项目负责人 + ResourceName string // 资源方 + OwnerId string // 业主名id + ProjectType string // 项目类型 + ProjectInfo string // 项目概况 + ProjectState string // 项目状态(0未开始 1进行中 2已完成) + CreatedAt string // 创建日期 + UpdatedAt string // 修改日期 + DeletedAt string // 删除日期 + Creator string // 删除日期 +} + +var testProjectInfoColumns = TestProjectInfoColumns{ + Id: "id", + ProjectName: "project_name", + ProjectAddress: "project_address", + ProjectLeader: "project_leader", + ResourceName: "resource_name", + OwnerId: "owner_id", + ProjectType: "project_type", + ProjectInfo: "project_info", + ProjectState: "project_state", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + Creator: "creator", +} + +// NewTestProjectInfoDao creates and returns a new DAO object for table data access. +func NewTestProjectInfoDao() *TestProjectInfoDao { + return &TestProjectInfoDao{ + group: "default", + table: "test_project_info", + columns: testProjectInfoColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *TestProjectInfoDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *TestProjectInfoDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *TestProjectInfoDao) Columns() TestProjectInfoColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *TestProjectInfoDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *TestProjectInfoDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *TestProjectInfoDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/test/dao/test_contact_info.go b/internal/app/test/dao/test_contact_info.go new file mode 100644 index 0000000..2ca05e5 --- /dev/null +++ b/internal/app/test/dao/test_contact_info.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-09-01 17:36:18 +// 生成路径: internal/app/test/dao/test_contact_info.go +// 生成人:yqq +// desc:业主方联系人关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/test/dao/internal" +) + +// testContactInfoDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type testContactInfoDao struct { + *internal.TestContactInfoDao +} + +var ( + // TestContactInfo is globally public accessible object for table tools_gen_table operations. + TestContactInfo = testContactInfoDao{ + internal.NewTestContactInfoDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/test/dao/test_follow_info.go b/internal/app/test/dao/test_follow_info.go new file mode 100644 index 0000000..f7f84d0 --- /dev/null +++ b/internal/app/test/dao/test_follow_info.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-09-01 16:38:07 +// 生成路径: internal/app/test/dao/test_follow_info.go +// 生成人:yqq +// desc:跟进信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/test/dao/internal" +) + +// testFollowInfoDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type testFollowInfoDao struct { + *internal.TestFollowInfoDao +} + +var ( + // TestFollowInfo is globally public accessible object for table tools_gen_table operations. + TestFollowInfo = testFollowInfoDao{ + internal.NewTestFollowInfoDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/test/dao/test_owner_info.go b/internal/app/test/dao/test_owner_info.go new file mode 100644 index 0000000..e402c7a --- /dev/null +++ b/internal/app/test/dao/test_owner_info.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-09-01 17:51:41 +// 生成路径: internal/app/test/dao/test_owner_info.go +// 生成人:yqq +// desc:业主方基本情况 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/test/dao/internal" +) + +// testOwnerInfoDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type testOwnerInfoDao struct { + *internal.TestOwnerInfoDao +} + +var ( + // TestOwnerInfo is globally public accessible object for table tools_gen_table operations. + TestOwnerInfo = testOwnerInfoDao{ + internal.NewTestOwnerInfoDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/test/dao/test_project_info.go b/internal/app/test/dao/test_project_info.go new file mode 100644 index 0000000..b3e5ddc --- /dev/null +++ b/internal/app/test/dao/test_project_info.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-09-01 16:15:09 +// 生成路径: internal/app/test/dao/test_project_info.go +// 生成人:yqq +// desc:项目备案信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/test/dao/internal" +) + +// testProjectInfoDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type testProjectInfoDao struct { + *internal.TestProjectInfoDao +} + +var ( + // TestProjectInfo is globally public accessible object for table tools_gen_table operations. + TestProjectInfo = testProjectInfoDao{ + internal.NewTestProjectInfoDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/test/logic/logic.go b/internal/app/test/logic/logic.go new file mode 100644 index 0000000..1838493 --- /dev/null +++ b/internal/app/test/logic/logic.go @@ -0,0 +1,6 @@ +package logic + +import _ "github.com/tiger1103/gfast/v3/internal/app/test/logic/testContactInfo" +import _ "github.com/tiger1103/gfast/v3/internal/app/test/logic/testFollowInfo" +import _ "github.com/tiger1103/gfast/v3/internal/app/test/logic/testOwnerInfo" +import _ "github.com/tiger1103/gfast/v3/internal/app/test/logic/testProjectInfo" diff --git a/internal/app/test/logic/testContactInfo/test_contact_info.go b/internal/app/test/logic/testContactInfo/test_contact_info.go new file mode 100644 index 0000000..5a906d0 --- /dev/null +++ b/internal/app/test/logic/testContactInfo/test_contact_info.go @@ -0,0 +1,140 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-09-01 17:36:18 +// 生成路径: internal/app/test/logic/test_contact_info.go +// 生成人:yqq +// desc:业主方联系人关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/test" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/test/dao" + "github.com/tiger1103/gfast/v3/internal/app/test/model" + "github.com/tiger1103/gfast/v3/internal/app/test/model/do" + "github.com/tiger1103/gfast/v3/internal/app/test/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterTestContactInfo(New()) +} + +func New() *sTestContactInfo { + return &sTestContactInfo{} +} + +type sTestContactInfo struct{} + +func (s *sTestContactInfo) List(ctx context.Context, req *test.TestContactInfoSearchReq) (listRes *test.TestContactInfoSearchRes, err error) { + listRes = new(test.TestContactInfoSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.TestContactInfo.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.TestContactInfo.Columns().Id+" = ?", req.Id) + } + //1、判断当前用户是否查看所有数据,如果不是获取到手机号来查询数据 + user := ct.New().GetLoginUser(ctx) + if user.IsData == "2" { + m = m.Where(dao.TestContactInfo.Columns().Creator+" = ?", user.Mobile) + } + if req.OwenerId != "" { + m = m.Where(dao.TestContactInfo.Columns().OwenerId+" = ?", gconv.Uint(req.OwenerId)) + } + if req.ContactName != "" { + m = m.Where(dao.TestContactInfo.Columns().ContactName+" like ?", "%"+req.ContactName+"%") + } + if req.ContactPost != "" { + m = m.Where(dao.TestContactInfo.Columns().ContactPost+" like ?", "%"+req.ContactPost+"%") + } + if req.ContactPhone != "" { + m = m.Where(dao.TestContactInfo.Columns().ContactPhone+" = ?", req.ContactPhone) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.TestContactInfoInfoRes + err = m.Fields(test.TestContactInfoSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.TestContactInfoListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.TestContactInfoListRes{ + Id: v.Id, + OwenerId: v.OwenerId, + LinkedOwenerId: v.LinkedOwenerId, + ContactName: v.ContactName, + ContactPost: v.ContactPost, + ContactPhone: v.ContactPhone, + Creator: v.Creator, + } + } + }) + return +} + +func (s *sTestContactInfo) GetById(ctx context.Context, id uint) (res *model.TestContactInfoInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.TestContactInfo.Ctx(ctx).WithAll().Where(dao.TestContactInfo.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sTestContactInfo) Add(ctx context.Context, req *test.TestContactInfoAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + if req.WxOrPc == "1" { + req.Creator = ct.New().GetLoginUser(ctx).Mobile + } + _, err = dao.TestContactInfo.Ctx(ctx).Insert(do.TestContactInfo{ + OwenerId: req.OwenerId, + ContactName: req.ContactName, + ContactPost: req.ContactPost, + ContactPhone: req.ContactPhone, + Creator: req.Creator, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sTestContactInfo) Edit(ctx context.Context, req *test.TestContactInfoEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + if req.WxOrPc == "1" { + req.Creator = ct.New().GetLoginUser(ctx).Mobile + } + _, err = dao.TestContactInfo.Ctx(ctx).WherePri(req.Id).Update(do.TestContactInfo{ + OwenerId: req.OwenerId, + ContactName: req.ContactName, + ContactPost: req.ContactPost, + ContactPhone: req.ContactPhone, + Creator: req.Creator, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sTestContactInfo) Delete(ctx context.Context, ids []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.TestContactInfo.Ctx(ctx).Delete(dao.TestContactInfo.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/test/logic/testFollowInfo/test_follow_info.go b/internal/app/test/logic/testFollowInfo/test_follow_info.go new file mode 100644 index 0000000..e992363 --- /dev/null +++ b/internal/app/test/logic/testFollowInfo/test_follow_info.go @@ -0,0 +1,171 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-09-01 16:38:07 +// 生成路径: internal/app/test/logic/test_follow_info.go +// 生成人:yqq +// desc:跟进信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/test" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/test/dao" + "github.com/tiger1103/gfast/v3/internal/app/test/model" + "github.com/tiger1103/gfast/v3/internal/app/test/model/do" + "github.com/tiger1103/gfast/v3/internal/app/test/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + fmt.Println("注册逻辑层服务") + service.RegisterTestFollowInfo(New()) +} + +func New() *sTestFollowInfo { + return &sTestFollowInfo{} +} + +type sTestFollowInfo struct{} + +func (s *sTestFollowInfo) List(ctx context.Context, req *test.TestFollowInfoSearchReq) (listRes *test.TestFollowInfoSearchRes, err error) { + listRes = new(test.TestFollowInfoSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.TestFollowInfo.Ctx(ctx).WithAll() + //1、判断当前用户是否查看所有数据,如果不是获取到手机号来查询数据 + user := ct.New().GetLoginUser(ctx) + if user.IsData == "2" { + m = m.Where(dao.TestFollowInfo.Columns().Creator+" = ?", user.Mobile) + } + if req.Id != "" { + m = m.Where(dao.TestFollowInfo.Columns().Id+" = ?", req.Id) + } + if req.ProjectId != "" { + m = m.Where(dao.TestFollowInfo.Columns().ProjectId+" = ?", gconv.Int(req.ProjectId)) + } + if req.FollowName != "" { + m = m.Where(dao.TestFollowInfo.Columns().FollowName+" like ?", "%"+req.FollowName+"%") + } + if req.OwnerId != "" { + m = m.Where(dao.TestFollowInfo.Columns().OwnerId+" = ?", gconv.Uint(req.OwnerId)) + } + if req.ContactName != "" { + m = m.Where(dao.TestFollowInfo.Columns().ContactName+" like ?", "%"+req.ContactName+"%") + } + if req.ConPostName != "" { + m = m.Where(dao.TestFollowInfo.Columns().ConPostName+" like ?", "%"+req.ConPostName+"%") + } + if req.ContactPhone != "" { + m = m.Where(dao.TestFollowInfo.Columns().ContactPhone+" = ?", req.ContactPhone) + } + if req.FollowInfo != "" { + m = m.Where(dao.TestFollowInfo.Columns().FollowInfo+" = ?", req.FollowInfo) + } + if req.FollowFile != "" { + m = m.Where(dao.TestFollowInfo.Columns().FollowFile+" = ?", req.FollowFile) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.TestFollowInfo.Columns().CreatedAt+" >=? AND "+dao.TestFollowInfo.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.TestFollowInfoInfoRes + err = m.Fields(test.TestFollowInfoSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.TestFollowInfoListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.TestFollowInfoListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + LinkedProjectId: v.LinkedProjectId, + FollowName: v.FollowName, + OwnerId: v.OwnerId, + LinkedOwnerId: v.LinkedOwnerId, + ContactName: v.ContactName, + ConPostName: v.ConPostName, + ContactPhone: v.ContactPhone, + FollowInfo: v.FollowInfo, + FollowFile: v.FollowFile, + CreatedAt: v.CreatedAt, + Creator: v.Creator, + } + } + }) + return +} + +func (s *sTestFollowInfo) GetById(ctx context.Context, id uint) (res *model.TestFollowInfoInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.TestFollowInfo.Ctx(ctx).WithAll().Where(dao.TestFollowInfo.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sTestFollowInfo) Add(ctx context.Context, req *test.TestFollowInfoAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + if req.WxOrPc == "1" { + req.Creator = ct.New().GetLoginUser(ctx).Mobile + } + _, err = dao.TestFollowInfo.Ctx(ctx).Insert(do.TestFollowInfo{ + ProjectId: req.ProjectId, + FollowName: req.FollowName, + OwnerId: req.OwnerId, + ContactName: req.ContactName, + ConPostName: req.ConPostName, + ContactPhone: req.ContactPhone, + FollowInfo: req.FollowInfo, + FollowFile: req.FollowFile, + Creator: req.Creator, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sTestFollowInfo) Edit(ctx context.Context, req *test.TestFollowInfoEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + if req.WxOrPc == "1" { + req.Creator = ct.New().GetLoginUser(ctx).Mobile + } + _, err = dao.TestFollowInfo.Ctx(ctx).WherePri(req.Id).Update(do.TestFollowInfo{ + ProjectId: req.ProjectId, + FollowName: req.FollowName, + OwnerId: req.OwnerId, + ContactName: req.ContactName, + ConPostName: req.ConPostName, + ContactPhone: req.ContactPhone, + FollowInfo: req.FollowInfo, + FollowFile: req.FollowFile, + Creator: req.Creator, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sTestFollowInfo) Delete(ctx context.Context, ids []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.TestFollowInfo.Ctx(ctx).Delete(dao.TestFollowInfo.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/test/logic/testOwnerInfo/test_owner_info.go b/internal/app/test/logic/testOwnerInfo/test_owner_info.go new file mode 100644 index 0000000..3ad4554 --- /dev/null +++ b/internal/app/test/logic/testOwnerInfo/test_owner_info.go @@ -0,0 +1,156 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-09-01 17:51:42 +// 生成路径: internal/app/test/logic/test_owner_info.go +// 生成人:yqq +// desc:业主方基本情况 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/test" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/test/dao" + "github.com/tiger1103/gfast/v3/internal/app/test/model" + "github.com/tiger1103/gfast/v3/internal/app/test/model/do" + "github.com/tiger1103/gfast/v3/internal/app/test/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterTestOwnerInfo(New()) +} + +func New() *sTestOwnerInfo { + return &sTestOwnerInfo{} +} + +type sTestOwnerInfo struct{} + +func (s *sTestOwnerInfo) List(ctx context.Context, req *test.TestOwnerInfoSearchReq) (listRes *test.TestOwnerInfoSearchRes, err error) { + listRes = new(test.TestOwnerInfoSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.TestOwnerInfo.Ctx(ctx).WithAll() + //1、判断当前用户是否查看所有数据,如果不是获取到手机号来查询数据 + user := ct.New().GetLoginUser(ctx) + if user.IsData == "2" { + m = m.Where(dao.TestOwnerInfo.Columns().Creator+" = ?", user.Mobile) + } + if req.Id != "" { + m = m.Where(dao.TestOwnerInfo.Columns().Id+" = ?", req.Id) + } + if req.CompanyName != "" { + m = m.Where(dao.TestOwnerInfo.Columns().CompanyName+" like ?", "%"+req.CompanyName+"%") + } + if req.CompanyAddress != "" { + m = m.Where(dao.TestOwnerInfo.Columns().CompanyAddress+" = ?", req.CompanyAddress) + } + if req.RegistrationType != "" { + m = m.Where(dao.TestOwnerInfo.Columns().RegistrationType+" = ?", req.RegistrationType) + } + if req.RegisteredCapital != "" { + m = m.Where(dao.TestOwnerInfo.Columns().RegisteredCapital+" = ?", gconv.Int(req.RegisteredCapital)) + } + if req.Legaler != "" { + m = m.Where(dao.TestOwnerInfo.Columns().Legaler+" like ?", "%"+req.Legaler+"%") + } + if req.LegalerPhone != "" { + m = m.Where(dao.TestOwnerInfo.Columns().LegalerPhone+" = ?", req.LegalerPhone) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.TestOwnerInfo.Columns().CreatedAt+" >=? AND "+dao.TestOwnerInfo.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.TestOwnerInfoInfoRes + err = m.Fields(test.TestOwnerInfoSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.TestOwnerInfoListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.TestOwnerInfoListRes{ + Id: v.Id, + CompanyName: v.CompanyName, + CompanyAddress: v.CompanyAddress, + RegistrationType: v.RegistrationType, + RegisteredCapital: v.RegisteredCapital, + Legaler: v.Legaler, + LegalerPhone: v.LegalerPhone, + Children: v.Children, + CreatedAt: v.CreatedAt, + Creator: v.Creator, + } + } + }) + return +} + +func (s *sTestOwnerInfo) GetById(ctx context.Context, id uint) (res *model.TestOwnerInfoInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.TestOwnerInfo.Ctx(ctx).WithAll().Where(dao.TestOwnerInfo.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sTestOwnerInfo) Add(ctx context.Context, req *test.TestOwnerInfoAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + if req.WxOrPc == "1" { + req.Creator = ct.New().GetLoginUser(ctx).Mobile + } + _, err = dao.TestOwnerInfo.Ctx(ctx).Insert(do.TestOwnerInfo{ + CompanyName: req.CompanyName, + CompanyAddress: req.CompanyAddress, + RegistrationType: req.RegistrationType, + RegisteredCapital: req.RegisteredCapital, + Legaler: req.Legaler, + LegalerPhone: req.LegalerPhone, + Creator: req.Creator, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sTestOwnerInfo) Edit(ctx context.Context, req *test.TestOwnerInfoEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + if req.WxOrPc == "1" { + req.Creator = ct.New().GetLoginUser(ctx).Mobile + } + _, err = dao.TestOwnerInfo.Ctx(ctx).WherePri(req.Id).Update(do.TestOwnerInfo{ + CompanyName: req.CompanyName, + CompanyAddress: req.CompanyAddress, + RegistrationType: req.RegistrationType, + RegisteredCapital: req.RegisteredCapital, + Legaler: req.Legaler, + LegalerPhone: req.LegalerPhone, + Creator: req.Creator, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sTestOwnerInfo) Delete(ctx context.Context, ids []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.TestOwnerInfo.Ctx(ctx).Delete(dao.TestOwnerInfo.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/test/logic/testProjectInfo/test_project_info.go b/internal/app/test/logic/testProjectInfo/test_project_info.go new file mode 100644 index 0000000..fd8a09a --- /dev/null +++ b/internal/app/test/logic/testProjectInfo/test_project_info.go @@ -0,0 +1,165 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-09-01 16:15:09 +// 生成路径: internal/app/test/logic/test_project_info.go +// 生成人:yqq +// desc:项目备案信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/test" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/test/dao" + "github.com/tiger1103/gfast/v3/internal/app/test/model" + "github.com/tiger1103/gfast/v3/internal/app/test/model/do" + "github.com/tiger1103/gfast/v3/internal/app/test/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterTestProjectInfo(New()) +} + +func New() *sTestProjectInfo { + return &sTestProjectInfo{} +} + +type sTestProjectInfo struct{} + +func (s *sTestProjectInfo) List(ctx context.Context, req *test.TestProjectInfoSearchReq) (listRes *test.TestProjectInfoSearchRes, err error) { + listRes = new(test.TestProjectInfoSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.TestProjectInfo.Ctx(ctx).WithAll() + //1、判断当前用户是否查看所有数据,如果不是获取到手机号来查询数据 + user := ct.New().GetLoginUser(ctx) + if user.IsData == "2" { + m = m.Where(dao.TestProjectInfo.Columns().Creator+" = ?", user.Mobile) + } + if req.ProjectAddress != "" { + m = m.Where(dao.TestProjectInfo.Columns().ProjectAddress+" = ?", req.ProjectAddress) + } + if req.ProjectLeader != "" { + m = m.Where(dao.TestProjectInfo.Columns().ProjectLeader+" = ?", req.ProjectLeader) + } + if req.OwnerId != "" { + m = m.Where(dao.TestProjectInfo.Columns().OwnerId+" = ?", gconv.Int(req.OwnerId)) + } + if req.ProjectType != "" { + m = m.Where(dao.TestProjectInfo.Columns().ProjectType+" = ?", req.ProjectType) + } + if req.ProjectInfo != "" { + m = m.Where(dao.TestProjectInfo.Columns().ProjectInfo+" = ?", req.ProjectInfo) + } + if req.ProjectState != "" { + m = m.Where(dao.TestProjectInfo.Columns().ProjectState+" = ?", gconv.Int(req.ProjectState)) + } + if req.ProjectName != "" { + m = m.Where(dao.TestProjectInfo.Columns().ProjectName+" like ?", "%"+req.ProjectName+"%") + } + if req.ResourceName != "" { + m = m.Where(dao.TestProjectInfo.Columns().ResourceName+" like ?", "%"+req.ResourceName+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.TestProjectInfo.Columns().CreatedAt+" >=? AND "+dao.TestProjectInfo.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id asc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.TestProjectInfoInfoRes + err = m.Fields(test.TestProjectInfoSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.TestProjectInfoListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.TestProjectInfoListRes{ + Id: v.Id, + ProjectName: v.ProjectName, + ProjectAddress: v.ProjectAddress, + ProjectLeader: v.ProjectLeader, + ResourceName: v.ResourceName, + OwnerId: v.OwnerId, + LinkedOwnerId: v.LinkedOwnerId, + ProjectType: v.ProjectType, + ProjectInfo: v.ProjectInfo, + ProjectState: v.ProjectState, + CreatedAt: v.CreatedAt, + Creator: v.Creator, + } + } + }) + return +} + +func (s *sTestProjectInfo) GetById(ctx context.Context, id uint) (res *model.TestProjectInfoInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.TestProjectInfo.Ctx(ctx).WithAll().Where(dao.TestProjectInfo.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sTestProjectInfo) Add(ctx context.Context, req *test.TestProjectInfoAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + if req.WxOrPc == "1" { + req.Creator = ct.New().GetLoginUser(ctx).Mobile + } + _, err = dao.TestProjectInfo.Ctx(ctx).Insert(do.TestProjectInfo{ + ProjectName: req.ProjectName, + ProjectAddress: req.ProjectAddress, + ProjectLeader: req.ProjectLeader, + ResourceName: req.ResourceName, + OwnerId: req.OwnerId, + ProjectType: req.ProjectType, + ProjectInfo: req.ProjectInfo, + ProjectState: req.ProjectState, + Creator: req.Creator, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sTestProjectInfo) Edit(ctx context.Context, req *test.TestProjectInfoEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + if req.WxOrPc == "1" { + req.Creator = ct.New().GetLoginUser(ctx).Mobile + } + _, err = dao.TestProjectInfo.Ctx(ctx).WherePri(req.Id).Update(do.TestProjectInfo{ + ProjectName: req.ProjectName, + ProjectAddress: req.ProjectAddress, + ProjectLeader: req.ProjectLeader, + ResourceName: req.ResourceName, + OwnerId: req.OwnerId, + ProjectType: req.ProjectType, + ProjectInfo: req.ProjectInfo, + ProjectState: req.ProjectState, + Creator: req.Creator, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sTestProjectInfo) Delete(ctx context.Context, ids []uint) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.TestProjectInfo.Ctx(ctx).Delete(dao.TestProjectInfo.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/test/model/do/test_contact_info.go b/internal/app/test/model/do/test_contact_info.go new file mode 100644 index 0000000..f091dad --- /dev/null +++ b/internal/app/test/model/do/test_contact_info.go @@ -0,0 +1,25 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-01 17:36:18 +// 生成路径: internal/app/test/model/entity/test_contact_info.go +// 生成人:yqq +// desc:业主方联系人关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// TestContactInfo is the golang structure for table test_contact_info. +type TestContactInfo struct { + gmeta.Meta `orm:"table:test_contact_info, do:true"` + Id interface{} `orm:"id,primary" json:"id"` + OwenerId interface{} `orm:"owener_id" json:"owenerId"` + ContactName interface{} `orm:"contact_name" json:"contactName"` + ContactPost interface{} `orm:"contact_post" json:"contactPost"` + ContactPhone interface{} `orm:"contact_phone" json:"contactPhone"` + Creator interface{} `orm:"creator,primary" json:"creator"` +} diff --git a/internal/app/test/model/do/test_follow_info.go b/internal/app/test/model/do/test_follow_info.go new file mode 100644 index 0000000..8040aa2 --- /dev/null +++ b/internal/app/test/model/do/test_follow_info.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-01 16:38:07 +// 生成路径: internal/app/test/model/entity/test_follow_info.go +// 生成人:yqq +// desc:跟进信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// TestFollowInfo is the golang structure for table test_follow_info. +type TestFollowInfo struct { + gmeta.Meta `orm:"table:test_follow_info, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // + ProjectId interface{} `orm:"project_id" json:"projectId"` // 关联的项目 + FollowName interface{} `orm:"follow_name" json:"followName"` // 跟进人姓名 + OwnerId interface{} `orm:"owner_id" json:"ownerId"` // 业主名 + ContactName interface{} `orm:"contact_name" json:"contactName"` // 对接人姓名 + ConPostName interface{} `orm:"con_post_name" json:"conPostName"` // 对接人职称 + ContactPhone interface{} `orm:"contact_phone" json:"contactPhone"` // 对接人电话 + FollowInfo interface{} `orm:"follow_info" json:"followInfo"` // 跟进情况 + FollowFile interface{} `orm:"follow_file" json:"followFile"` // 相关附件 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建日期 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 修改日期 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除日期 + Creator interface{} `orm:"creator,primary" json:"creator"` // +} diff --git a/internal/app/test/model/do/test_owner_info.go b/internal/app/test/model/do/test_owner_info.go new file mode 100644 index 0000000..ad247dd --- /dev/null +++ b/internal/app/test/model/do/test_owner_info.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-01 17:51:42 +// 生成路径: internal/app/test/model/entity/test_owner_info.go +// 生成人:yqq +// desc:业主方基本情况 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// TestOwnerInfo is the golang structure for table test_owner_info. +type TestOwnerInfo struct { + gmeta.Meta `orm:"table:test_owner_info, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // + CompanyName interface{} `orm:"company_name" json:"companyName"` // 企业名称 + CompanyAddress interface{} `orm:"company_address" json:"companyAddress"` // 单位地址 + RegistrationType interface{} `orm:"registration_type" json:"registrationType"` // 企业登记注册类型 + RegisteredCapital interface{} `orm:"registered_capital" json:"registeredCapital"` // 注册资金 + Legaler interface{} `orm:"legaler" json:"legaler"` // 法人代表 + LegalerPhone interface{} `orm:"legaler_phone" json:"legalerPhone"` // 法人电话 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建日期 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 修改日期 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除日期 + Creator interface{} `orm:"creator,primary" json:"creator"` // +} diff --git a/internal/app/test/model/do/test_project_info.go b/internal/app/test/model/do/test_project_info.go new file mode 100644 index 0000000..c58ca4b --- /dev/null +++ b/internal/app/test/model/do/test_project_info.go @@ -0,0 +1,33 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-01 16:15:09 +// 生成路径: internal/app/test/model/entity/test_project_info.go +// 生成人:yqq +// desc:项目备案信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// TestProjectInfo is the golang structure for table test_project_info. +type TestProjectInfo struct { + gmeta.Meta `orm:"table:test_project_info, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // + ProjectName interface{} `orm:"project_name" json:"projectName"` // 项目名称 + ProjectAddress interface{} `orm:"project_address" json:"projectAddress"` // 单位地址 + ProjectLeader interface{} `orm:"project_leader" json:"projectLeader"` // 项目负责人 + ResourceName interface{} `orm:"resource_name" json:"resourceName"` // 资源方 + OwnerId interface{} `orm:"owner_id" json:"ownerId"` // 业主名id + ProjectType interface{} `orm:"project_type" json:"projectType"` // 项目类型 + ProjectInfo interface{} `orm:"project_info" json:"projectInfo"` // 项目概况 + ProjectState interface{} `orm:"project_state" json:"projectState"` // 项目状态(0未开始 1进行中 2已完成) + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建日期 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 修改日期 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除日期 + Creator interface{} `orm:"creator,primary" json:"creator"` // +} diff --git a/internal/app/test/model/entity/test_contact_info.go b/internal/app/test/model/entity/test_contact_info.go new file mode 100644 index 0000000..3ccbe11 --- /dev/null +++ b/internal/app/test/model/entity/test_contact_info.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-01 17:36:18 +// 生成路径: internal/app/test/model/entity/test_contact_info.go +// 生成人:yqq +// desc:业主方联系人关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// TestContactInfo is the golang structure for table test_contact_info. +type TestContactInfo struct { + gmeta.Meta `orm:"table:test_contact_info"` + Id uint `orm:"id,primary" json:"id"` // + OwenerId uint `orm:"owener_id" json:"owenerId"` // + LinkedOwenerId *LinkedTestContactInfoTestOwnerInfo `orm:"with:id=owener_id" json:"linkedOwenerId"` + ContactName string `orm:"contact_name" json:"contactName"` // + ContactPost string `orm:"contact_post" json:"contactPost"` // + ContactPhone string `orm:"contact_phone" json:"contactPhone"` // +} + +type LinkedTestContactInfoTestOwnerInfo struct { + gmeta.Meta `orm:"table:test_owner_info"` + Id uint `orm:"id" json:"id"` // + CompanyName string `orm:"company_name" json:"companyName"` // 企业名称 +} diff --git a/internal/app/test/model/entity/test_follow_info.go b/internal/app/test/model/entity/test_follow_info.go new file mode 100644 index 0000000..c54de68 --- /dev/null +++ b/internal/app/test/model/entity/test_follow_info.go @@ -0,0 +1,46 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-01 16:38:07 +// 生成路径: internal/app/test/model/entity/test_follow_info.go +// 生成人:yqq +// desc:跟进信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// TestFollowInfo is the golang structure for table test_follow_info. +type TestFollowInfo struct { + gmeta.Meta `orm:"table:test_follow_info"` + Id uint `orm:"id,primary" json:"id"` // + ProjectId int `orm:"project_id" json:"projectId"` // 关联的项目 + LinkedProjectId *LinkedTestFollowInfoTestProjectInfo `orm:"with:id=project_id" json:"linkedProjectId"` + FollowName string `orm:"follow_name" json:"followName"` // 跟进人姓名 + OwnerId uint `orm:"owner_id" json:"ownerId"` // 业主名 + LinkedOwnerId *LinkedTestFollowInfoTestOwnerInfo `orm:"with:id=owner_id" json:"linkedOwnerId"` + ContactName string `orm:"contact_name" json:"contactName"` // 对接人姓名 + ConPostName string `orm:"con_post_name" json:"conPostName"` // 对接人职称 + ContactPhone string `orm:"contact_phone" json:"contactPhone"` // 对接人电话 + FollowInfo string `orm:"follow_info" json:"followInfo"` // 跟进情况 + FollowFile string `orm:"follow_file" json:"followFile"` // 相关附件 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建日期 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 修改日期 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除日期 +} + +type LinkedTestFollowInfoTestProjectInfo struct { + gmeta.Meta `orm:"table:test_project_info"` + Id uint `orm:"id" json:"id"` // + ProjectName string `orm:"project_name" json:"projectName"` // 项目名称 +} + +type LinkedTestFollowInfoTestOwnerInfo struct { + gmeta.Meta `orm:"table:test_owner_info"` + Id uint `orm:"id" json:"id"` // + CompanyName string `orm:"company_name" json:"companyName"` // 企业名称 +} diff --git a/internal/app/test/model/entity/test_owner_info.go b/internal/app/test/model/entity/test_owner_info.go new file mode 100644 index 0000000..ca11d00 --- /dev/null +++ b/internal/app/test/model/entity/test_owner_info.go @@ -0,0 +1,30 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-01 17:51:42 +// 生成路径: internal/app/test/model/entity/test_owner_info.go +// 生成人:yqq +// desc:业主方基本情况 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// TestOwnerInfo is the golang structure for table test_owner_info. +type TestOwnerInfo struct { + gmeta.Meta `orm:"table:test_owner_info"` + Id uint `orm:"id,primary" json:"id"` // + CompanyName string `orm:"company_name" json:"companyName"` // 企业名称 + CompanyAddress string `orm:"company_address" json:"companyAddress"` // 单位地址 + RegistrationType string `orm:"registration_type" json:"registrationType"` // 企业登记注册类型 + RegisteredCapital int `orm:"registered_capital" json:"registeredCapital"` // 注册资金 + Legaler string `orm:"legaler" json:"legaler"` // 法人代表 + LegalerPhone string `orm:"legaler_phone" json:"legalerPhone"` // 法人电话 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建日期 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 修改日期 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除日期 +} diff --git a/internal/app/test/model/entity/test_project_info.go b/internal/app/test/model/entity/test_project_info.go new file mode 100644 index 0000000..2b0b600 --- /dev/null +++ b/internal/app/test/model/entity/test_project_info.go @@ -0,0 +1,39 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-09-01 16:15:09 +// 生成路径: internal/app/test/model/entity/test_project_info.go +// 生成人:yqq +// desc:项目备案信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// TestProjectInfo is the golang structure for table test_project_info. +type TestProjectInfo struct { + gmeta.Meta `orm:"table:test_project_info"` + Id uint `orm:"id,primary" json:"id"` // + ProjectName string `orm:"project_name" json:"projectName"` // 项目名称 + ProjectAddress string `orm:"project_address" json:"projectAddress"` // 单位地址 + ProjectLeader string `orm:"project_leader" json:"projectLeader"` // 项目负责人 + ResourceName string `orm:"resource_name" json:"resourceName"` // 资源方 + OwnerId int `orm:"owner_id" json:"ownerId"` // 业主名id + LinkedOwnerId *LinkedTestProjectInfoTestOwnerInfo `orm:"with:id=owner_id" json:"linkedOwnerId"` + ProjectType string `orm:"project_type" json:"projectType"` // 项目类型 + ProjectInfo string `orm:"project_info" json:"projectInfo"` // 项目概况 + ProjectState int `orm:"project_state" json:"projectState"` // 项目状态(0未开始 1进行中 2已完成) + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建日期 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 修改日期 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除日期 +} + +type LinkedTestProjectInfoTestOwnerInfo struct { + gmeta.Meta `orm:"table:test_owner_info"` + Id uint `orm:"id" json:"id"` // + CompanyName string `orm:"company_name" json:"companyName"` // 企业名称 +} diff --git a/internal/app/test/model/test_contact_info.go b/internal/app/test/model/test_contact_info.go new file mode 100644 index 0000000..cd1cf6e --- /dev/null +++ b/internal/app/test/model/test_contact_info.go @@ -0,0 +1,42 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-09-01 17:36:18 +// 生成路径: internal/app/test/model/test_contact_info.go +// 生成人:yqq +// desc:业主方联系人关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// TestContactInfoInfoRes is the golang structure for table test_contact_info. +type TestContactInfoInfoRes struct { + gmeta.Meta `orm:"table:test_contact_info"` + Id uint `orm:"id,primary" json:"id"` // + OwenerId uint `orm:"owener_id" json:"owenerId"` // + LinkedOwenerId *LinkedTestContactInfoTestOwnerInfo `orm:"with:id=owener_id" json:"linkedOwenerId"` + ContactName string `orm:"contact_name" json:"contactName"` // + ContactPost string `orm:"contact_post" json:"contactPost"` // + ContactPhone string `orm:"contact_phone" json:"contactPhone"` // + Creator string `orm:"creator" json:"creator"` // +} + +type LinkedTestContactInfoTestOwnerInfo struct { + gmeta.Meta `orm:"table:test_owner_info"` + Id uint `orm:"id" json:"id"` // + CompanyName string `orm:"company_name" json:"companyName"` // 企业名称 +} + +type TestContactInfoListRes struct { + Id uint `json:"id"` + OwenerId uint `json:"owenerId"` + LinkedOwenerId *LinkedTestContactInfoTestOwnerInfo `orm:"with:id=owener_id" json:"linkedOwenerId"` + ContactName string `json:"contactName"` + ContactPost string `json:"contactPost"` + ContactPhone string `json:"contactPhone"` + Creator string `json:"creator"` +} diff --git a/internal/app/test/model/test_follow_info.go b/internal/app/test/model/test_follow_info.go new file mode 100644 index 0000000..626b815 --- /dev/null +++ b/internal/app/test/model/test_follow_info.go @@ -0,0 +1,62 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-09-01 16:38:07 +// 生成路径: internal/app/test/model/test_follow_info.go +// 生成人:yqq +// desc:跟进信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// TestFollowInfoInfoRes is the golang structure for table test_follow_info. +type TestFollowInfoInfoRes struct { + gmeta.Meta `orm:"table:test_follow_info"` + Id uint `orm:"id,primary" json:"id"` // + ProjectId int `orm:"project_id" json:"projectId"` // 关联的项目 + LinkedProjectId *LinkedTestFollowInfoTestProjectInfo `orm:"with:id=project_id" json:"linkedProjectId"` + FollowName string `orm:"follow_name" json:"followName"` // 跟进人姓名 + OwnerId uint `orm:"owner_id" json:"ownerId"` // 业主名 + LinkedOwnerId *LinkedTestFollowInfoTestOwnerInfo `orm:"with:id=owner_id" json:"linkedOwnerId"` + ContactName string `orm:"contact_name" json:"contactName"` // 对接人姓名 + ConPostName string `orm:"con_post_name" json:"conPostName"` // 对接人职称 + ContactPhone string `orm:"contact_phone" json:"contactPhone"` // 对接人电话 + FollowInfo string `orm:"follow_info" json:"followInfo"` // 跟进情况 + FollowFile string `orm:"follow_file" json:"followFile"` // 相关附件 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建日期 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 修改日期 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除日期 + Creator string `orm:"creator" json:"creator"` // +} + +type LinkedTestFollowInfoTestProjectInfo struct { + gmeta.Meta `orm:"table:test_project_info"` + Id uint `orm:"id" json:"id"` // + ProjectName string `orm:"project_name" json:"projectName"` // 项目名称 +} +type LinkedTestFollowInfoTestOwnerInfo struct { + gmeta.Meta `orm:"table:test_owner_info"` + Id uint `orm:"id" json:"id"` // + CompanyName string `orm:"company_name" json:"companyName"` // 企业名称 +} + +type TestFollowInfoListRes struct { + Id uint `json:"id" dc:"主键ID"` + ProjectId int `json:"projectId" dc:"项目id"` + LinkedProjectId *LinkedTestFollowInfoTestProjectInfo `orm:"with:id=project_id" json:"linkedProjectId"` + FollowName string `json:"followName" dc:"跟进人姓名"` + OwnerId uint `json:"ownerId" dc:"业主名"` + LinkedOwnerId *LinkedTestFollowInfoTestOwnerInfo `orm:"with:id=owner_id" json:"linkedOwnerId"` + ContactName string `json:"contactName" dc:"对接人姓名"` + ConPostName string `json:"conPostName" dc:"对接人职称"` + ContactPhone string `json:"contactPhone" dc:"对接人电话"` + FollowInfo string `json:"followInfo" dc:"跟进情况"` + FollowFile string `json:"followFile" dc:"相关附件"` + CreatedAt *gtime.Time `json:"createdAt"` + Creator string `json:"creator"` +} diff --git a/internal/app/test/model/test_owner_info.go b/internal/app/test/model/test_owner_info.go new file mode 100644 index 0000000..030c5d0 --- /dev/null +++ b/internal/app/test/model/test_owner_info.go @@ -0,0 +1,56 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-09-01 17:51:42 +// 生成路径: internal/app/test/model/test_owner_info.go +// 生成人:yqq +// desc:业主方基本情况 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// TestOwnerInfoInfoRes is the golang structure for table test_owner_info. +type TestOwnerInfoInfoRes struct { + gmeta.Meta `orm:"table:test_owner_info"` + Id uint `orm:"id,primary" json:"id"` // + CompanyName string `orm:"company_name" json:"companyName"` // 企业名称 + CompanyAddress string `orm:"company_address" json:"companyAddress"` // 单位地址 + RegistrationType string `orm:"registration_type" json:"registrationType"` // 企业登记注册类型 + RegisteredCapital int `orm:"registered_capital" json:"registeredCapital"` // 注册资金 + Legaler string `orm:"legaler" json:"legaler"` // 法人代表 + LegalerPhone string `orm:"legaler_phone" json:"legalerPhone"` // 法人电话 + Children []*LinkedTestOwnerInfoTestContact `orm:"with:owener_id=id" ` + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建日期 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 修改日期 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除日期 + Creator string `orm:"creator" json:"creator"` // + +} + +// 增加owner表子数据array +type LinkedTestOwnerInfoTestContact struct { + gmeta.Meta `orm:"table:test_contact_info"` + Id uint `orm:"id,primary" json:"id"` + OwenerId uint `orm:"owener_id" json:"owenerId"` //业主方id + ContactName string `orm:"contact_name" json:"contactName"` //对接人姓名 + ContactPost string `orm:"contact_post" json:"contactPost"` //对接人职称 + ContactPhone string `orm:"contact_phone" json:"contactPhone"` //对接人电话 +} + +type TestOwnerInfoListRes struct { + Id uint `json:"id"` + CompanyName string `json:"companyName"` + CompanyAddress string `json:"companyAddress"` + RegistrationType string `json:"registrationType"` + RegisteredCapital int `json:"registeredCapital"` + Legaler string `json:"legaler"` + LegalerPhone string `json:"legalerPhone"` + Children []*LinkedTestOwnerInfoTestContact `orm:"with:owener_id=id" ` + CreatedAt *gtime.Time `json:"createdAt"` + Creator string `json:"creator"` +} diff --git a/internal/app/test/model/test_project_info.go b/internal/app/test/model/test_project_info.go new file mode 100644 index 0000000..4d43109 --- /dev/null +++ b/internal/app/test/model/test_project_info.go @@ -0,0 +1,55 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-09-01 16:15:09 +// 生成路径: internal/app/test/model/test_project_info.go +// 生成人:yqq +// desc:项目备案信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// TestProjectInfoInfoRes is the golang structure for table test_project_info. +type TestProjectInfoInfoRes struct { + gmeta.Meta `orm:"table:test_project_info"` + Id uint `orm:"id,primary" json:"id"` // + ProjectName string `orm:"project_name" json:"projectName"` // 项目名称 + ProjectAddress string `orm:"project_address" json:"projectAddress"` // 单位地址 + ProjectLeader string `orm:"project_leader" json:"projectLeader"` // 项目负责人 + ResourceName string `orm:"resource_name" json:"resourceName"` // 资源方 + OwnerId int `orm:"owner_id" json:"ownerId"` // 业主名id + LinkedOwnerId *LinkedTestProjectInfoTestOwnerInfo `orm:"with:id=owner_id" json:"linkedOwnerId"` + ProjectType string `orm:"project_type" json:"projectType"` // 项目类型 + ProjectInfo string `orm:"project_info" json:"projectInfo"` // 项目概况 + ProjectState int `orm:"project_state" json:"projectState"` // 项目状态(0未开始 1进行中 2已完成) + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建日期 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 修改日期 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除日期 + Creator string `orm:"creator" json:"creator"` // +} + +type LinkedTestProjectInfoTestOwnerInfo struct { + gmeta.Meta `orm:"table:test_owner_info"` + Id uint `orm:"id" json:"id"` // + CompanyName string `orm:"company_name" json:"companyName"` // 企业名称 +} + +type TestProjectInfoListRes struct { + Id uint `json:"id"` + ProjectName string `json:"projectName" dc:"项目名称"` + ProjectAddress string `json:"projectAddress" dc:"单位地址"` + ProjectLeader string `json:"projectLeader" dc:"项目负责人"` + ResourceName string `json:"resourceName" dc:"资源方"` + OwnerId int `json:"ownerId" dc:"业主名id"` + LinkedOwnerId *LinkedTestProjectInfoTestOwnerInfo `orm:"with:id=owner_id" json:"linkedOwnerId" ` + ProjectType string `json:"projectType" dc:"项目类型"` + ProjectInfo string `json:"projectInfo" dc:"项目概况"` + ProjectState int `json:"projectState" dc:"项目状态(0未开始 1进行中 2已完成)"` + CreatedAt *gtime.Time `json:"createdAt" dc:"创建日期"` + Creator string `json:"creator"` +} diff --git a/internal/app/test/router/router.go b/internal/app/test/router/router.go new file mode 100644 index 0000000..fd13857 --- /dev/null +++ b/internal/app/test/router/router.go @@ -0,0 +1,41 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-09-01 17:51:42 +// 生成路径: internal/app/test/router/test_owner_info.go +// 生成人:yqq +// desc:业主方基本情况 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/internal/app/test/controller" + "github.com/tiger1103/gfast/v3/library/libRouter" +) + +var R = new(Router) + +type Router struct{} + +func (router *Router) BindController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/", func(group *ghttp.RouterGroup) { + //登录验证拦截 + service.GfToken().Middleware(group) + ////context拦截器 + group.Middleware(service.Middleware().Ctx, service.Middleware().Auth) + //后台操作日志记录 + group.Hook("/*", ghttp.HookAfterOutput, service.OperateLog().OperationLog) + group.Bind( + controller.TestContactInfo, + controller.TestFollowInfo, + ) + //自动绑定定义的控制器 + if err := libRouter.RouterAutoBind(ctx, router, group); err != nil { + panic(err) + } + }) +} diff --git a/internal/app/test/router/test_contact_info.go b/internal/app/test/router/test_contact_info.go new file mode 100644 index 0000000..a8e0238 --- /dev/null +++ b/internal/app/test/router/test_contact_info.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-09-01 17:36:18 +// 生成路径: internal/app/test/router/test_contact_info.go +// 生成人:yqq +// desc:业主方联系人关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/test/controller" +) + +func (router *Router) BindTestContactInfoController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/testContactInfo", func(group *ghttp.RouterGroup) { + group.Bind( + controller.TestContactInfo, + ) + }) +} diff --git a/internal/app/test/router/test_follow_info.go b/internal/app/test/router/test_follow_info.go new file mode 100644 index 0000000..d574462 --- /dev/null +++ b/internal/app/test/router/test_follow_info.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-09-01 16:38:07 +// 生成路径: internal/app/test/router/test_follow_info.go +// 生成人:yqq +// desc:跟进信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/test/controller" +) + +func (router *Router) BindTestFollowInfoController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/testFollowInfo", func(group *ghttp.RouterGroup) { + group.Bind( + controller.TestFollowInfo, + ) + }) +} diff --git a/internal/app/test/router/test_owner_info.go b/internal/app/test/router/test_owner_info.go new file mode 100644 index 0000000..f1dd956 --- /dev/null +++ b/internal/app/test/router/test_owner_info.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-09-01 17:51:42 +// 生成路径: internal/app/test/router/test_owner_info.go +// 生成人:yqq +// desc:业主方基本情况 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/test/controller" +) + +func (router *Router) BindTestOwnerInfoController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/testOwnerInfo", func(group *ghttp.RouterGroup) { + group.Bind( + controller.TestOwnerInfo, + ) + }) +} diff --git a/internal/app/test/router/test_project_info.go b/internal/app/test/router/test_project_info.go new file mode 100644 index 0000000..bac7266 --- /dev/null +++ b/internal/app/test/router/test_project_info.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-09-01 16:15:09 +// 生成路径: internal/app/test/router/test_project_info.go +// 生成人:yqq +// desc:项目备案信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/test/controller" +) + +func (router *Router) BindTestProjectInfoController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/testProjectInfo", func(group *ghttp.RouterGroup) { + group.Bind( + controller.TestProjectInfo, + ) + }) +} diff --git a/internal/app/test/service/test_contact_info.go b/internal/app/test/service/test_contact_info.go new file mode 100644 index 0000000..9c80962 --- /dev/null +++ b/internal/app/test/service/test_contact_info.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-09-01 17:36:18 +// 生成路径: internal/app/test/service/test_contact_info.go +// 生成人:yqq +// desc:业主方联系人关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/test" + "github.com/tiger1103/gfast/v3/internal/app/test/model" +) + +type ITestContactInfo interface { + List(ctx context.Context, req *test.TestContactInfoSearchReq) (res *test.TestContactInfoSearchRes, err error) + GetById(ctx context.Context, Id uint) (res *model.TestContactInfoInfoRes, err error) + Add(ctx context.Context, req *test.TestContactInfoAddReq) (err error) + Edit(ctx context.Context, req *test.TestContactInfoEditReq) (err error) + Delete(ctx context.Context, Id []uint) (err error) +} + +var localTestContactInfo ITestContactInfo + +func TestContactInfo() ITestContactInfo { + if localTestContactInfo == nil { + panic("implement not found for interface ITestContactInfo, forgot register?") + } + return localTestContactInfo +} + +func RegisterTestContactInfo(i ITestContactInfo) { + localTestContactInfo = i +} diff --git a/internal/app/test/service/test_follow_info.go b/internal/app/test/service/test_follow_info.go new file mode 100644 index 0000000..55f02be --- /dev/null +++ b/internal/app/test/service/test_follow_info.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-09-01 16:38:07 +// 生成路径: internal/app/test/service/test_follow_info.go +// 生成人:yqq +// desc:跟进信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/test" + "github.com/tiger1103/gfast/v3/internal/app/test/model" +) + +type ITestFollowInfo interface { + List(ctx context.Context, req *test.TestFollowInfoSearchReq) (res *test.TestFollowInfoSearchRes, err error) + GetById(ctx context.Context, Id uint) (res *model.TestFollowInfoInfoRes, err error) + Add(ctx context.Context, req *test.TestFollowInfoAddReq) (err error) + Edit(ctx context.Context, req *test.TestFollowInfoEditReq) (err error) + Delete(ctx context.Context, Id []uint) (err error) +} + +var localTestFollowInfo ITestFollowInfo + +func TestFollowInfo() ITestFollowInfo { + if localTestFollowInfo == nil { + panic("implement not found for interface ITestFollowInfo, forgot register?") + } + return localTestFollowInfo +} + +func RegisterTestFollowInfo(i ITestFollowInfo) { + localTestFollowInfo = i +} diff --git a/internal/app/test/service/test_owner_info.go b/internal/app/test/service/test_owner_info.go new file mode 100644 index 0000000..f7a8679 --- /dev/null +++ b/internal/app/test/service/test_owner_info.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-09-01 17:51:42 +// 生成路径: internal/app/test/service/test_owner_info.go +// 生成人:yqq +// desc:业主方基本情况 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/test" + "github.com/tiger1103/gfast/v3/internal/app/test/model" +) + +type ITestOwnerInfo interface { + List(ctx context.Context, req *test.TestOwnerInfoSearchReq) (res *test.TestOwnerInfoSearchRes, err error) + GetById(ctx context.Context, Id uint) (res *model.TestOwnerInfoInfoRes, err error) + Add(ctx context.Context, req *test.TestOwnerInfoAddReq) (err error) + Edit(ctx context.Context, req *test.TestOwnerInfoEditReq) (err error) + Delete(ctx context.Context, Id []uint) (err error) +} + +var localTestOwnerInfo ITestOwnerInfo + +func TestOwnerInfo() ITestOwnerInfo { + if localTestOwnerInfo == nil { + panic("implement not found for interface ITestOwnerInfo, forgot register?") + } + return localTestOwnerInfo +} + +func RegisterTestOwnerInfo(i ITestOwnerInfo) { + localTestOwnerInfo = i +} diff --git a/internal/app/test/service/test_project_info.go b/internal/app/test/service/test_project_info.go new file mode 100644 index 0000000..c4e4d76 --- /dev/null +++ b/internal/app/test/service/test_project_info.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-09-01 16:15:09 +// 生成路径: internal/app/test/service/test_project_info.go +// 生成人:yqq +// desc:项目备案信息 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/v1/test" + "github.com/tiger1103/gfast/v3/internal/app/test/model" +) + +type ITestProjectInfo interface { + List(ctx context.Context, req *test.TestProjectInfoSearchReq) (res *test.TestProjectInfoSearchRes, err error) + GetById(ctx context.Context, Id uint) (res *model.TestProjectInfoInfoRes, err error) + Add(ctx context.Context, req *test.TestProjectInfoAddReq) (err error) + Edit(ctx context.Context, req *test.TestProjectInfoEditReq) (err error) + Delete(ctx context.Context, Id []uint) (err error) +} + +var localTestProjectInfo ITestProjectInfo + +func TestProjectInfo() ITestProjectInfo { + if localTestProjectInfo == nil { + panic("implement not found for interface ITestProjectInfo, forgot register?") + } + return localTestProjectInfo +} + +func RegisterTestProjectInfo(i ITestProjectInfo) { + localTestProjectInfo = i +} diff --git a/internal/app/wxApplet/controller/appPort.go b/internal/app/wxApplet/controller/appPort.go new file mode 100644 index 0000000..070377d --- /dev/null +++ b/internal/app/wxApplet/controller/appPort.go @@ -0,0 +1,923 @@ +package controller + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "strconv" + + "github.com/samber/lo" + "github.com/tiger1103/gfast/v3/api/v1/system" + + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/library/liberr" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/jinzhu/copier" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + wxSystem "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + systemController "github.com/tiger1103/gfast/v3/internal/app/system/controller" + controllerDao "github.com/tiger1103/gfast/v3/internal/app/system/dao" + + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + serviceController "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + wxAppletModel "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" + "golang.org/x/net/context" +) + +type appPortController struct { + systemController.BaseController +} + +var AppPortController = new(appPortController) + +// ===========================================APP首页=========================================== +// ===========================================APP首页=========================================== +// ===========================================APP首页=========================================== + +// GetsTheAttendanceOfASpecifiedShiftGroupFunc 班组长人员打卡统计 +func (c *appPortController) GetsTheAttendanceOfASpecifiedShiftGroupFunc(ctx context.Context, req *wxApplet.GetsTheAttendanceOfASpecifiedShiftGroupReq) (res *wxApplet.GetsTheAttendanceOfASpecifiedShiftGroupRes, err error) { + res, err = service.SysProjectTeam().GetsTheAttendanceOfASpecifiedShiftGroupFunc(ctx, req) + return +} + +// ListOfAttendancePersonnelFunc 获取用户对应出勤状态的人员列表 +func (c *appPortController) ListOfAttendancePersonnelFunc(ctx context.Context, req *wxApplet.ListOfAttendancePersonnelReq) (res *wxApplet.ListOfAttendancePersonnelRes, err error) { + res, err = service.SysProjectTeam().ListOfAttendancePersonnelFunc(ctx, req) + return +} + +// AppUserMenuFunc 获取用户菜单 +func (c *appPortController) AppUserMenuFunc(ctx context.Context, req *wxApplet.AppUserMenusReq) (*wxApplet.AppUserMenusRes, error) { + // 获取用户信息 + userInfo := ct.New().GetLoginUser(ctx) + + // 获取用户角色 + roleIds, err := getUserRoles(ctx, userInfo, req.UserType) + if err != nil { + return nil, err + } + + var userMenuList []wxApplet.AppUserMenu + // 获取用户菜单 + if err := controllerDao.AppMenus.Ctx(ctx).As("menu"). + InnerJoin("app_role_menus roleMenu", "menu.menu_id = roleMenu.menu_id"). + Where("roleMenu.role_id IN (?)", roleIds). + Fields("menu.menu_id, menu.menu_name").Scan(&userMenuList); err != nil { + return nil, fmt.Errorf("获取用户菜单失败:%w", err) + } + + userMenuList = lo.UniqBy(userMenuList, func(item wxApplet.AppUserMenu) uint { + return item.MenuID + }) + + return &wxApplet.AppUserMenusRes{MenuList: userMenuList}, nil +} + +// getUserRoles 获取用户角色 +func getUserRoles(ctx context.Context, user *model.ContextUser, role int) ([]int, error) { + rules := []model.Ruler{} + + query := controllerDao.AppUserRoles.Ctx(ctx).As("aur"). + InnerJoin("app_roles ar", "aur.role_id = ar.role_id"). + Fields("ar.role_id,ar.role_name,aur.user_id"). + Where("aur.user_id", user.Id). + Where("aur.major_role", role) + if err := query.Scan(&rules); err != nil { + return nil, fmt.Errorf("获取用户角色失败:%w", err) + } + + roleID := lo.FilterMap(rules, func(item model.Ruler, _ int) (int, bool) { + return item.RoleId, true + }) + + return roleID, nil +} + +// AppMyAttendanceFunc 我的考勤 +func (c *appPortController) AppMyAttendanceFunc(ctx context.Context, req *wxApplet.AppMyAttendanceReq) (res *wxApplet.AppMyAttendanceRes, err error) { + res = new(wxApplet.AppMyAttendanceRes) + res, err = service.BusAttendance().AppMyAttendanceFunc(ctx, req) + return +} + +// AppMyAttendanceDetailsFunc 我的考勤详情数据 +func (c *appPortController) AppMyAttendanceDetailsFunc(ctx context.Context, req *wxApplet.AppMyAttendanceDetailsReq) (res *wxApplet.AppMyAttendanceDetailsRes, err error) { + res = new(wxApplet.AppMyAttendanceDetailsRes) + res, err = service.BusAttendance().AppMyAttendanceDetailsFunc(ctx, req) + return +} + +// AppProjectOverviewFunc 项目概况 +func (c *appPortController) AppProjectOverviewFunc(ctx context.Context, req *wxApplet.AppProjectOverviewReq) (res *wxApplet.AppProjectOverviewRes, err error) { + res = new(wxApplet.AppProjectOverviewRes) + res, err = service.BusAttendance().AppProjectOverviewFunc(ctx, req) + return +} + +// AppSafetyHazardTodayFunc 项目概况>今日AI安全隐患 +func (c *appPortController) AppSafetyHazardTodayFunc(ctx context.Context, req *wxApplet.AppSafetyHazardTodayReq) (res *wxApplet.AppSafetyHazardTodayRes, err error) { + res, err = serviceController.BusViolationRecord().AppSafetyHazardTodayFunc(ctx, req) + return +} + +// AppWeatherFunc 【小程序】获取施工人员天气 +func (c *appPortController) AppWeatherFunc(ctx context.Context, req *wxApplet.AppWeatherReq) (res *wxApplet.AppWeatherRes, err error) { + res = new(wxApplet.AppWeatherRes) + we := coryCommon.Weather(req.Location) + bodyData := []byte(we) + err = json.Unmarshal(bodyData, &res) + if err != nil { + fmt.Println("Failed to parse JSON data:", err) + return + } + return +} + +// AppProjectNoticeListFunc 首页获取滚动的项目公告列表 +func (c *appPortController) AppProjectNoticeListFunc(ctx context.Context, req *wxApplet.AppProjectNoticeReq) (*wxApplet.AppProjectNoticeRes, error) { + userId := ct.New().GetLoginUser(ctx).Id + + noticeList := []*wxApplet.ProjectNoticeList{} + if err := controllerDao.Notifications.Ctx(ctx). + Fields(controllerDao.Notifications.Columns().Title). + LeftJoin("notification_recipients nf", "notifications.id = nf.notification_id"). + Where(controllerDao.Notifications.Columns().ProjectId, req.ProjectId). + Where(controllerDao.Notifications.Columns().IsApp, 1). + Where("nf.recipient_id", userId). + Limit(20).OrderDesc("notifications.id").Scan(¬iceList); err != nil { + return nil, fmt.Errorf("获取项目公告失败:%w", err) + } + return &wxApplet.AppProjectNoticeRes{ + List: noticeList, + }, nil +} + +// AppRegisteredButNotVerifiedWithRealName 获取所有已注册未实名的用户 +func (c *appPortController) AppRegisteredButNotVerifiedWithRealName(ctx context.Context, req *wxApplet.AppRegisteredButNotVerifiedWithRealNameReq) (res *wxApplet.AppRegisteredButNotVerifiedWithRealNameRes, err error) { + res, err = serviceController.BusConstructionUser().AppRegisteredButNotVerifiedWithRealNameFunc(ctx, req) + return +} + +// ===========================================定位考勤=========================================== +// ===========================================定位考勤=========================================== +// ===========================================定位考勤=========================================== + +// AppCodedBackwardsByLatitudeAndLongitudeFunc 根据经度纬度逆编码为省市区信息 +func (c *appPortController) AppCodedBackwardsByLatitudeAndLongitudeFunc(ctx context.Context, req *wxApplet.AppCodedBackwardsByLatitudeAndLongitudeReq) (res *wxApplet.AppCodedBackwardsByLatitudeAndLongitudeRes, err error) { + res = new(wxApplet.AppCodedBackwardsByLatitudeAndLongitudeRes) + we := coryCommon.InverseGeocoding(req.Location) + bodyData := []byte(we) + err = json.Unmarshal(bodyData, &res) + if err != nil { + return + } + return +} + +// AppOpenidByFounderFunc 返回当前用户所在项目的打卡范围 +func (c *appPortController) AppOpenidByFounderFunc(ctx context.Context, req *wxApplet.AppOpenidByFounderReq) (res *wxApplet.AppOpenidByFounderRes, err error) { + res = new(wxApplet.AppOpenidByFounderRes) + founderFunc, err := OpenidByFounderFunc(ctx, req.Openid) + err = copier.Copy(&res, founderFunc) + return +} + +// AppWhetherToEnterTheClockRangeFunc 判断当前用户是否进入打卡范围 +func (c *appPortController) AppWhetherToEnterTheClockRangeFunc(ctx context.Context, req *wxApplet.AppWhetherToEnterTheClockRangeReq) (res *wxApplet.AppWhetherToEnterTheClockRangeRes, err error) { + res = new(wxApplet.AppWhetherToEnterTheClockRangeRes) + res, err = service.BusAttendance().AppWhetherToEnterTheClockRangeFunc(ctx, req) + return +} + +// AppClockingStatusOfTheDayFunc 判断当前用户当天的打卡状态(1未打卡、2已打上班卡、3已打下班卡) +func (c *appPortController) AppClockingStatusOfTheDayFunc(ctx context.Context, req *wxApplet.AppClockingStatusOfTheDayReq) (res *wxApplet.AppClockingStatusOfTheDayRes, err error) { + res = new(wxApplet.AppClockingStatusOfTheDayRes) + res, err = service.BusAttendance().AppClockingStatusOfTheDayFunc(ctx, req) + return +} + +// AppFaceDetectionFunc 人脸检测 +func (c *appPortController) AppFaceDetectionFunc(ctx context.Context, req *wxApplet.AppFaceDetectionReq) (res *wxApplet.AppFaceDetectionRes, err error) { + res = new(wxApplet.AppFaceDetectionRes) + res.Path, err = FaceDetectionFunc(ctx, req.File) + return +} + +// AppAttendanceCardFunc 考勤打卡 +func (c *appPortController) AppAttendanceCardFunc(ctx context.Context, req *wxApplet.AppAttendanceCardReq) (res *wxApplet.AppAttendanceCardRes, err error) { + res = new(wxApplet.AppAttendanceCardRes) + addReq := wxApplet.BusAttendanceAddReq{} + copier.Copy(&addReq, &req) + err = service.BusAttendance().Add(ctx, &addReq) + return +} + +// AppAllMembersOfTheCurrentGroupFunc 获取当前组的所有成员(除自己) +func (c *appPortController) AppAllMembersOfTheCurrentGroupFunc(ctx context.Context, req *wxApplet.AppAllMembersOfTheCurrentGroupReq) (res *wxApplet.AppAllMembersOfTheCurrentGroupRes, err error) { + res, err = service.BusConstructionUser().AppAllMembersOfTheCurrentGroupFunc(ctx, req) + return +} + +// AppSelectThisUserByCardRecordFunc 为指定用户查询打卡记录 +func (c *appPortController) AppSelectThisUserByCardRecordFunc(ctx context.Context, req *wxApplet.AppSelectThisUserByCardRecordReq) (res *wxApplet.AppSelectThisUserByCardRecordRes, err error) { + res, err = service.BusAttendance().AppSelectThisUserByCardRecordFunc(ctx, req) + return +} + +// AppLocationAttendanceStatisticsFunc 定位考勤统计 +func (c *appPortController) AppLocationAttendanceStatisticsFunc(ctx context.Context, req *wxApplet.AppLocationAttendanceStatisticsReq) (res *wxApplet.AppLocationAttendanceStatisticsRes, err error) { + res, err = service.BusAttendance().AppLocationAttendanceStatisticsFunc(ctx, req) + return +} + +// AppSelectBySiteDateAndTimeFunc 根据openid获取到项目的逆编码地址及项目的上下班打卡时间 +func (c *appPortController) AppSelectBySiteDateAndTimeFunc(ctx context.Context, req *wxApplet.AppSelectBySiteDateAndTimeReq) (res *wxApplet.AppSelectBySiteDateAndTimeRes, err error) { + res = new(wxApplet.AppSelectBySiteDateAndTimeRes) + data, err := serviceController.SysProject().GetById(ctx, req.ProjectId) + res.PunchRange = data.PunchRange + res.Lng = data.Lng + res.Lat = data.Lat + // 逆编码 + var entity *coryCommon.InverseGeocodingRep + we := coryCommon.InverseGeocoding(data.Lng + "," + data.Lat) + bodyData := []byte(we) + err = json.Unmarshal(bodyData, &entity) + if err != nil { + return + } + res.Site = entity.Regeocode.FormattedAddress + return +} + +// AppMyProjectListFunc 获取项目列表 +func (c *appPortController) AppMyProjectListFunc(ctx context.Context, req *wxApplet.AppMyProjectListReq) (*wxApplet.SysUserProjectRelevancySearchRes, error) { + // 获取当前登录用户ID + userInfo := ct.New().GetLoginUser(ctx) + + // 当前登录用户ID + userID := userInfo.Id + + // 用户手机号 + phone := userInfo.Mobile + + var query *gdb.Model + + fields := `a.*, + CASE WHEN (b.short_name IS NULL OR b.project_name = '') THEN b.project_name ELSE b.short_name END AS project_name, + b.lng, b.lat, b.type, b.project_site` + + if req.ProjectType == 0 { + // 管理员获取项目时,将获取后台所拥有的项目 + query = dao.SysUserProjectRelevancy.Ctx(ctx).As("a"). + InnerJoin("sys_project as b on a.project_id = b.id"). + Fields(fields).Where("a.user_id", userID) + } else { + // 当请求者为施工人员时,从 bus_construction_user 表中获取其绑定的项目信息 + query = dao.BusConstructionUser.Ctx(ctx).As("a"). + InnerJoin("sys_project as b on a.project_id = b.id"). + Fields(fields).Where("a.phone", phone) + } + + var projectList []*wxAppletModel.SysUserProjectRelevancyListRes + if err := query.Scan(&projectList); err != nil { + return nil, fmt.Errorf("获取项目列表失败:%w", err) + } + + return &wxApplet.SysUserProjectRelevancySearchRes{ + List: projectList, + }, nil +} + +// AppReissueACardListFunc 补卡申请列表(目前只会展示缺卡的数据) +func (c *appPortController) AppReissueACardListFunc(ctx context.Context, req *wxApplet.AppReissueACardListReq) (res *wxApplet.AppReissueACardListRes, err error) { + res, err = service.BusAttendance().AppReissueACardListFunc(ctx, req) + return +} + +// AppReissueACardIdFunc 补卡申请ID查询 +func (c *appPortController) AppReissueACardIdFunc(ctx context.Context, req *wxApplet.AppReissueACardIdReq) (res *wxApplet.AppReissueACardIdRes, err error) { + res, err = service.BusAttendance().AppReissueACardIdFunc(ctx, req) + return +} + +// AppCardReplacementApplicationAddFunc 新增补卡申请 +func (c *appPortController) AppCardReplacementApplicationAddFunc(ctx context.Context, req *wxApplet.AppCardReplacementApplicationAddReq) (res *wxApplet.AppCardReplacementApplicationAddRes, err error) { + r := wxApplet.ReissueACardWxAddReq{} + copier.Copy(&r, &req) + err = serviceController.BusReissueACard().ReissueACardWxAdd(ctx, &r) + return +} + +// AppReplacementCardApplicationRecordFunc 申请人补卡记录(分页) +func (c *appPortController) AppReplacementCardApplicationRecordFunc(ctx context.Context, req *wxApplet.AppReplacementCardApplicationRecordReq) (res *wxApplet.AppReplacementCardApplicationRecordRes, err error) { + res = new(wxApplet.AppReplacementCardApplicationRecordRes) + // 请求 + r := wxApplet.ReissueACardWxGetByIdReq{} + copier.Copy(&r, &req) + // 返回 + idFunc, err := serviceController.BusReissueACard().ReissueACardWxGetByIdFunc(ctx, &r) + copier.Copy(&res, &idFunc) + return +} + +// AppTheTeamLeaderSupplementCardApprovalListFun 班组长补卡审批列表(分页) +func (c *appPortController) AppTheTeamLeaderSupplementCardApprovalListFun(ctx context.Context, req *wxApplet.AppTheTeamLeaderSupplementCardApprovalListReq) (res *wxApplet.AppTheTeamLeaderSupplementCardApprovalListRes, err error) { + entity := model.AppTheTeamLeaderSupplementCardApprovalRes{} + copier.Copy(&entity, &req) + entity.Type = "1" + res, err = serviceController.BusReissueACard().AppTheTeamLeaderSupplementCardApprovalListFun(ctx, &entity) + return +} + +// AppTheTeamLeaderSupplementCardApprovalRecordListFunc 班组长补卡审批记录列表(分页) +func (c *appPortController) AppTheTeamLeaderSupplementCardApprovalRecordListFunc(ctx context.Context, req *wxApplet.AppTheTeamLeaderSupplementCardApprovalRecordListReq) (res *wxApplet.AppTheTeamLeaderSupplementCardApprovalListRes, err error) { + entity := model.AppTheTeamLeaderSupplementCardApprovalRes{} + copier.Copy(&entity, &req) + entity.Type = "2" + res, err = serviceController.BusReissueACard().AppTheTeamLeaderSupplementCardApprovalListFun(ctx, &entity) + return +} + +// AppApprovalRecordDetailsFunc 审批记录详情 +func (c *appPortController) AppApprovalRecordDetailsFunc(ctx context.Context, req *wxApplet.AppApprovalRecordDetailsReq) (res *wxApplet.AppApprovalRecordDetailsRes, err error) { + res, err = serviceController.BusReissueACard().AppApprovalRecordDetailsFunc(ctx, req) + return +} + +// AppForemanApprovalFunc 班组长审批 +func (c *appPortController) AppForemanApprovalFunc(ctx context.Context, req *wxApplet.AppForemanApprovalReq) (res *wxApplet.AppForemanApprovalRes, err error) { + entity := wxApplet.ReissueACardWxEditTeamReq{} + copier.Copy(&entity, &req) + err = serviceController.BusReissueACard().ReissueACardWxEditTeam(ctx, &entity) + return +} + +// @Title AdministratorApprovalFunc 2024/7/26 15:20:00 +// @Description 管理员审批(仅限于管理员操作) +// @Auth Cory +func (c *appPortController) AdministratorApprovalFunc(ctx context.Context, req *wxApplet.AdministratorApprovalReq) (res *wxApplet.AdministratorApprovalRes, err error) { + editReq := system.BusReissueACardEditReq{} + copier.Copy(&editReq, &req) + err = serviceController.BusReissueACard().Edit(ctx, &editReq) + return +} + +// ===========================================安全(HSE)巡检工单=========================================== +// ===========================================安全(HSE)巡检工单=========================================== +// ===========================================安全(HSE)巡检工单=========================================== + +// AppManagementAppletListInformFunc 安全巡检工单列表-全部(分页) +func (c *appPortController) AppManagementAppletListInformFunc(ctx context.Context, req *wxApplet.AppManagementAppletListInformReq) (res *wxApplet.AppManagementAppletListRes, err error) { + res = new(wxApplet.AppManagementAppletListRes) + entity := wxApplet.HseManagementAppletListReq{} + copier.Copy(&entity, &req) + entity.Status = "0" + listFunc, err := serviceController.BusHseManagement().HseManagementAppletListFunc(ctx, &entity) + copier.Copy(&res, listFunc) + return +} + +// AppManagementAppletListAbarbeitungFunc 安全巡检工单列表-整改(分页) +func (c *appPortController) AppManagementAppletListAbarbeitungFunc(ctx context.Context, req *wxApplet.AppManagementAppletListAbarbeitungReq) (res *wxApplet.AppManagementAppletListRes, err error) { + res = new(wxApplet.AppManagementAppletListRes) + entity := wxApplet.HseManagementAppletListReq{} + copier.Copy(&entity, &req) + entity.Status = "1" + listFunc, err := serviceController.BusHseManagement().HseManagementAppletListFunc(ctx, &entity) + copier.Copy(&res, listFunc) + return +} + +// AppManagementAppletListReviewFunc 安全巡检工单列表-复查(分页) +func (c *appPortController) AppManagementAppletListReviewFunc(ctx context.Context, req *wxApplet.AppManagementAppletListReviewReq) (res *wxApplet.AppManagementAppletListRes, err error) { + res = new(wxApplet.AppManagementAppletListRes) + entity := wxApplet.HseManagementAppletListReq{} + copier.Copy(&entity, &req) + entity.Status = "2" + listFunc, err := serviceController.BusHseManagement().HseManagementAppletListFunc(ctx, &entity) + copier.Copy(&res, listFunc) + return +} + +// APPAddedDataSecurityForBackgroundUsersFunc APP的后台用户新增安全数据 +func (c *appPortController) APPAddedDataSecurityForBackgroundUsersFunc(ctx context.Context, req *wxApplet.APPAddedDataSecurityForBackgroundUsersReq) (res *wxApplet.APPAddedDataSecurityForBackgroundUsersRes, err error) { + entity := system.BusHseManagementAddReq{} + copier.Copy(&entity, &req) + entity.HseManagementAdd = 1 + entity.FileTwo = req.File + err = serviceController.BusHseManagement().Add(ctx, &entity) + return +} + +// APPReviewDataSecurityForBackgroundUsersFunc APP的后台用户复查安全数据 +func (c *appPortController) APPReviewDataSecurityForBackgroundUsersFunc(ctx context.Context, req *wxApplet.APPReviewDataSecurityForBackgroundUsersReq) (res *wxApplet.APPReviewDataSecurityForBackgroundUsersRes, err error) { + entity := system.EditReviewReq{} + copier.Copy(&entity, &req) + err = serviceController.BusHseManagement().EditReview(ctx, &entity) + return +} + +// ===========================================质量管理=========================================== +// ===========================================质量管理=========================================== +// ===========================================质量管理=========================================== + +// AppInspectionTicketAppletListInformFunc 质量管理列表-全部(分页) +func (c *appPortController) AppInspectionTicketAppletListInformFunc(ctx context.Context, req *wxApplet.AppInspectionTicketAppletListInformReq) (res *wxApplet.AppInspectionTicketAppletListRes, err error) { + res = new(wxApplet.AppInspectionTicketAppletListRes) + entity := wxApplet.InspectionTicketAppletListReq{} + copier.Copy(&entity, &req) + entity.Status = "0" + listFunc, err := serviceController.BusInspectionTicket().InspectionTicketAppletListFunc(ctx, &entity) + copier.Copy(&res, listFunc) + return +} + +// AppInspectionTicketAppletListAbarbeitungFunc 质量管理列表-整改(分页) +func (c *appPortController) AppInspectionTicketAppletListAbarbeitungFunc(ctx context.Context, req *wxApplet.AppInspectionTicketAppletListAbarbeitungReq) (res *wxApplet.AppInspectionTicketAppletListRes, err error) { + res = new(wxApplet.AppInspectionTicketAppletListRes) + entity := wxApplet.InspectionTicketAppletListReq{} + copier.Copy(&entity, &req) + entity.Status = "1" + listFunc, err := serviceController.BusInspectionTicket().InspectionTicketAppletListFunc(ctx, &entity) + copier.Copy(&res, listFunc) + return +} + +// AppInspectionTicketAppletListReviewFunc 质量管理列表-复查(分页) +func (c *appPortController) AppInspectionTicketAppletListReviewFunc(ctx context.Context, req *wxApplet.AppInspectionTicketAppletListReviewReq) (res *wxApplet.AppInspectionTicketAppletListRes, err error) { + res = new(wxApplet.AppInspectionTicketAppletListRes) + entity := wxApplet.InspectionTicketAppletListReq{} + copier.Copy(&entity, &req) + entity.Status = "2" + listFunc, err := serviceController.BusInspectionTicket().InspectionTicketAppletListFunc(ctx, &entity) + copier.Copy(&res, listFunc) + return +} + +// AppQualityDataIsAddedForBackgroundUsersFunc APP的后台用户新增质量数据 +func (c *appPortController) AppQualityDataIsAddedForBackgroundUsersFunc(ctx context.Context, req *wxApplet.AppQualityDataIsAddedForBackgroundUsersReq) (res *wxApplet.AppQualityDataIsAddedForBackgroundUsersRes, err error) { + entity := system.BusInspectionTicketAddReq{} + copier.Copy(&entity, &req) + entity.HseManagementAdd = 1 + entity.FileTwo = req.File + err = serviceController.BusInspectionTicket().Add(ctx, &entity) + return +} + +// AppBackgroundUsersReviewQualityDataFunc APP的后台用户复查质量数据 +func (c *appPortController) AppBackgroundUsersReviewQualityDataFunc(ctx context.Context, req *wxApplet.AppBackgroundUsersReviewQualityDataReq) (res *wxApplet.AppBackgroundUsersReviewQualityDataRes, err error) { + entity := system.BusInspectionTicketVerificationReq{} + copier.Copy(&entity, &req) + err = serviceController.BusInspectionTicket().EditVerification(ctx, &entity) + return +} + +// ===========================================AI=========================================== +// ===========================================AI=========================================== +// ===========================================AI=========================================== + +// AppAiInformFunc 选择处理人 +func (c *appPortController) AppAiInformFunc(ctx context.Context, req *wxApplet.AppAiInformReq) (res *wxApplet.AppAiInformRes, err error) { + err = serviceController.BusViolationRecord().AppAiInformFunc(ctx, req) + return +} + +// AppGetsAllThePeopleUnderTheCurrentPersonsProjectFunc 取当前人所在项目下的所有人 +func (c *appPortController) AppGetsAllThePeopleUnderTheCurrentPersonsProjectFunc(ctx context.Context, req *wxApplet.AppGetsAllThePeopleUnderTheCurrentPersonsProjectReq) (res *wxApplet.AppGetsAllThePeopleUnderTheCurrentPersonsProjectRes, err error) { + res = new(wxApplet.AppGetsAllThePeopleUnderTheCurrentPersonsProjectRes) + projectFunc, err := serviceController.BusViolationRecord().AppGetsAllThePeopleUnderTheCurrentPersonsProjectFunc(ctx, req) + res = projectFunc + return +} + +// AppWorkOrderPcListFunc AI工单列表(根据pc用户主键ID进行分页获取) +func (c *appPortController) AppWorkOrderPcListFunc(ctx context.Context, req *wxApplet.AppWorkOrderPcListReq) (res *wxApplet.AppWorkOrderPcListRes, err error) { + res = new(wxApplet.AppWorkOrderPcListRes) + projectFunc, err := serviceController.BusViolationRecord().AppWorkOrderPcListFunc(ctx, req) + res = projectFunc + return +} + +// AppWorkOrderAppListFunc AI工单列表(根据App用户主键ID进行分页获取) +func (c *appPortController) AppWorkOrderAppListFunc(ctx context.Context, req *wxApplet.AppWorkOrderAppListReq) (res *wxApplet.AppWorkOrderPcListRes, err error) { + res = new(wxApplet.AppWorkOrderPcListRes) + projectFunc, err := serviceController.BusViolationRecord().AppWorkOrderAppListFunc(ctx, req) + res = projectFunc + return +} + +// AppRectificationReplyFunc AI整改回复 +func (c *appPortController) AppRectificationReplyFunc(ctx context.Context, req *wxApplet.AppRectificationReplyReq) (res *wxApplet.AppRectificationReplyRes, err error) { + res = new(wxApplet.AppRectificationReplyRes) + err = serviceController.BusViolationRecord().AppRectificationReplyFunc(ctx, req) + return +} + +// AppReviewFuncFunc AI复查 +func (c *appPortController) AppReviewFuncFunc(ctx context.Context, req *wxApplet.AppReviewReq) (res *wxApplet.AppReviewRes, err error) { + res = new(wxApplet.AppReviewRes) + req.Operator = ct.New().GetLoginUser(ctx).OpenId + err = serviceController.BusViolationRecord().AppReviewFuncFunc(ctx, req) + return +} + +// AppWorkOrderParticularsFunc AI工单详情 +func (c *appPortController) AppWorkOrderParticularsFunc(ctx context.Context, req *wxApplet.AppWorkOrderParticularsReq) (res *wxApplet.AppWorkOrderParticularsRes, err error) { + res = new(wxApplet.AppWorkOrderParticularsRes) + particularsFunc, err := serviceController.BusViolationRecord().AppWorkOrderParticularsFunc(ctx, req) + res = particularsFunc + return +} + +// =========================================== 消息 =========================================== +// =========================================== 消息 =========================================== +// =========================================== 消息 =========================================== + +// AppMessageListFunc 消息列表 +func (c *appPortController) AppMessageListFunc(ctx context.Context, req *wxApplet.AppMessageListReq) (res *wxApplet.AppMessageListRes, err error) { + // 获取用户信息 + user := ct.New().GetLoginUser(ctx) + + res = new(wxApplet.AppMessageListRes) + + fields := "title,created_at, (SELECT COUNT(*) FROM reminders WHERE is_read = 0 and user_id = '%s' and project_id = %s) AS unread_count" + + userID := lo.If(req.OpenID != "", user.OpenId).Else(strconv.Itoa(int(user.Id))) + + // 查询提醒 + controllerDao.Reminders.Ctx(ctx).Fields(fmt.Sprintf(fields, userID, req.ProjectId)). + Where("is_read", 0). + Where("project_id", req.ProjectId). + OrderDesc("id"). + Where("user_id", userID). + Limit(1).Scan(&res.Remind) + + fields = "content as title,created_at, (SELECT COUNT(*) FROM comment_list WHERE is_read = 0 and receiver = %d and project_id = %s) AS unread_count" + controllerDao.CommentList.Ctx(ctx).Fields(fmt.Sprintf(fields, user.Id, req.ProjectId)). + Where("is_read", 0). + Where("receiver", user.Id). + Where("project_id", req.ProjectId). + OrderDesc("id"). + Limit(1).Scan(&res.Comment) + + return +} + +// ===========================================人员管理=========================================== +// ===========================================人员管理=========================================== +// ===========================================人员管理=========================================== + +// AppChangeThePunchStatusForTheSpecifiedPersonFunc 给指定人更改打卡状态 +func (c *appPortController) AppChangeThePunchStatusForTheSpecifiedPersonFunc(ctx context.Context, req *wxApplet.AppChangeThePunchStatusForTheSpecifiedPersonReq) (res *wxApplet.AppChangeThePunchStatusForTheSpecifiedPersonRes, err error) { + entity := system.ClockingConditionReq{} + copier.Copy(&entity, &req) + err = serviceController.BusConstructionUser().ClockingConditionFunc(ctx, &entity) + return +} + +// AppSelectAppointProjectAllTeamFunc 获取指定项目所有班组 +func (c *appPortController) AppSelectAppointProjectAllTeamFunc(ctx context.Context, req *wxApplet.AppSelectAppointProjectAllTeamReq) (res *wxApplet.AppSelectAppointProjectAllTeamRes, err error) { + res = new(wxApplet.AppSelectAppointProjectAllTeamRes) + var entity []*wxAppletModel.SysProjectTeamListRes + err = dao.SysProjectTeam.Ctx(ctx).Where(dao.SysProjectTeam.Columns().ProjectId, req.ProjectId).Scan(&entity) + res.List = entity + return +} + +// AppListOfParticipatingUnitsFunc 参建单位列表 +func (c *appPortController) AppListOfParticipatingUnitsFunc(ctx context.Context, req *wxApplet.AppListOfParticipatingUnitsReq) (res *wxApplet.AppListOfParticipatingUnitsRes, err error) { + res, err = service.BusLabourservice().AppListOfParticipatingUnitsFunc(ctx, req) + return +} + +// AppListOfConstructionPersonnelFunc 施工人员列表(分页) +func (c *appPortController) AppListOfConstructionPersonnelFunc(ctx context.Context, req *wxApplet.AppListOfConstructionPersonnelReq) (res *wxApplet.AppListOfConstructionPersonnelRes, err error) { + res, err = service.BusConstructionUser().AppListOfConstructionPersonnelFunc(ctx, req) + return +} + +// AppExitFunc 退场 +func (c *appPortController) AppExitFunc(ctx context.Context, req *wxApplet.AppExitReq) (res *wxApplet.AppExitRes, err error) { + res = new(wxApplet.AppExitRes) + err = serviceController.BusConstructionUser().AppExitFunc(ctx, req) + return +} + +// AppResubmitTheExitAttachmentFunc 补交退场附件 +func (c *appPortController) AppResubmitTheExitAttachmentFunc(ctx context.Context, req *wxApplet.AppResubmitTheExitAttachmentReq) (res *wxApplet.AppResubmitTheExitAttachmentRes, err error) { + res = new(wxApplet.AppResubmitTheExitAttachmentRes) + err = serviceController.BusConstructionUser().AppResubmitTheExitAttachmentFunc(ctx, req) + return +} + +// AppTeamAttendanceFunc 团队出勤 +func (c *appPortController) AppTeamAttendanceFunc(ctx context.Context, req *wxApplet.AppTeamAttendanceReq) (res *wxApplet.AppTeamAttendanceRes, err error) { + res, err = service.BusAttendance().AppTeamAttendanceFunc(ctx, req) + return +} + +// AppGetsThePeopleUnderTheSpecifiedProjectFunc 获取指定项目下已实名认证或已退出班组的人 +func (c *appPortController) AppGetsThePeopleUnderTheSpecifiedProjectFunc(ctx context.Context, req *wxApplet.AppGetsThePeopleUnderTheSpecifiedProjectReq) (res *wxApplet.AppGetsThePeopleUnderTheSpecifiedProjectRes, err error) { + res, err = service.BusConstructionUser().AppGetsThePeopleUnderTheSpecifiedProjectFunc(ctx, req) + return +} + +// AppJoinATeamFunc 加入指定项目下的指定班组 +func (c *appPortController) AppJoinATeamFunc(ctx context.Context, req *wxApplet.AppJoinATeamReq) (res *wxApplet.AppJoinATeamRes, err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + for _, openid := range req.Openids { + r := new(wxSystem.SysProjectTeamMemberAddReq) + r.Openid = openid + r.PostId = 4 + copier.Copy(r, req) + err = service.SysProjectTeamMember().Add(ctx, r) + liberr.ErrIsNil(ctx, err) + } + }) + return err + }) + return +} + +// AppGetPersonnelDetailsFunc 获取人员详情 +func (c *appPortController) AppGetPersonnelDetailsFunc(ctx context.Context, req *wxApplet.AppGetPersonnelDetailsReq) (res *wxApplet.AppGetPersonnelDetailsRes, err error) { + res, err = service.BusConstructionUser().AppGetPersonnelDetailsFunc(ctx, req) + return +} + +// ===========================================提醒=========================================== +// ===========================================提醒=========================================== +// ===========================================提醒=========================================== + +// AIWorkOrderDetailsFunc AI工单详情 +func (c *appPortController) AIWorkOrderDetailsFunc(ctx context.Context, req *wxApplet.AIWorkOrderDetailsReq) (res *wxApplet.AIWorkOrderDetailsRes, err error) { + res = new(wxApplet.AIWorkOrderDetailsRes) + err = g.Try(ctx, func(ctx context.Context) { + // 1、获取主体信息 + err = g.DB().Model("reminders").As("e"). + LeftJoin("bus_violation_record", "a", "a.id = e.order_id"). + LeftJoin("sys_dict_data", "b", "b.dict_type = 'tour_type' and b.dict_value = a.tour_type"). + LeftJoin("sys_dict_data", "c", "c.dict_type = 'violation_record_data_source' and c.dict_value = a.data_source"). + LeftJoin("sys_project", "d", "d.id = a.project_id"). + Fields("a.*,b.dict_label as tt,c.dict_label as ds,d.project_name as projectName,e.status"). + Where("e.id", req.Id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取当前AI数据失败") + if res.Openid != "" { // 获取处理人名称 + value, _ := dao.BusConstructionUser.Ctx(ctx).Where("openid", res.Openid).Fields("user_name").Value() + res.OpenidName = value.String() + } + if res.Status == "3" { // 复查人名称 + value, _ := g.DB().Model("sys_user").Ctx(ctx).Where("id", res.SelectPeople).Fields("user_nickname").Value() + res.ReviewName = value.String() + } + i2, _ := g.DB().Model("bus_violation_record_correlation").Ctx(ctx). + Where("a.record_id", res.Id).As("a"). + LeftJoin("sys_user", "b", "b.id = a.user_id"). + Fields("b.user_nickname").Array() + for i3 := range i2 { // 哪些人可以复查(只需有一个复查就行了) + res.SuperintendName = append(res.SuperintendName, i2[i3].String()) + } + // 2、获取附件 + var pathEntity []*model.BusViolationRecordPathLogicRes + err = g.DB().Model("bus_violation_record_path").Ctx(ctx).Where("ticket_id", req.Id).Scan(&pathEntity) + liberr.ErrIsNil(ctx, err, "查询失败") + // 3、分类附件 + var one []*model.BusViolationRecordPathLogicRes + var two []*model.BusViolationRecordPathLogicRes + for i := range pathEntity { + if pathEntity[i].Type == "1" { + one = append(one, pathEntity[i]) + } else { + two = append(two, pathEntity[i]) + } + } + res.CheckAttachment = one + res.AbarbeitungAttachment = two + }) + return +} + +// QualityControlDetailsFunc 质量管理详情 +func (c *appPortController) QualityControlDetailsFunc(ctx context.Context, req *wxApplet.QualityControlDetailsReq) (res *wxApplet.QualityControlDetailsRes, err error) { + res = new(wxApplet.QualityControlDetailsRes) + err = g.Try(ctx, func(ctx context.Context) { + m := g.DB().Model("reminders").As("e"). + LeftJoin("bus_inspection_ticket", "a", "a.id = e.order_id"). + LeftJoin("sys_project", "b", "b.id = a.project_id"). + LeftJoin("sys_dict_data", "c", "dict_type = 'inspection_type' and dict_value = a.Inspection_type"). + LeftJoin(dao.BusConstructionUser.Table(), "d", "d.openid = a.corrector"). + Fields( + "a.id,b.project_name as projectName," + // 主键ID、项目名称 + "c.dict_label," + // 巡检类型 + "a.inspection_headline," + // 巡检主题 + "a.inspection_result," + // 巡检结果 + "d.user_name as abarbeitung," + // 整改人 + "a.is_reply,a.reply_date," + // 是否回复、回复时间 + "a.created_by as fill,a.created_at," + // 填报人、填报时间 + "a.feedback," + // 整改反馈 + "a.verification_result," + // 验证结果 + "e.status,a.verification_type," + // 工单状态、验证状态 + "a.updated_at as updatedAt," + // 更新时间 + "a.rectification_time as rectificationTime", // 整改时间 + ) + err = m.Where("e.id", req.Id).Scan(&res) + liberr.ErrIsNil(ctx, err, "查询失败") + // 2、获取附件 + var pathEntity []*wxApplet.SecurityManagementDetailsPath + err = g.DB().Model("bus_inspection_ticket_path").Ctx(ctx).Where("ticket_id", res.Id).Scan(&pathEntity) + liberr.ErrIsNil(ctx, err, "查询失败") + // 3、分类附件 + var one []*wxApplet.SecurityManagementDetailsPath + var two []*wxApplet.SecurityManagementDetailsPath + for i := range pathEntity { + if pathEntity[i].Type == "1" { + one = append(one, pathEntity[i]) + } else { + two = append(two, pathEntity[i]) + } + } + res.Inspectionccessories = one + res.CorrectiveAttachment = two + // 3、获取 + res.Fill = coryCommon.SelectByString(ctx, coryCommon.IsNumeric(res.Fill), res.Fill) + }) + return +} + +// SecurityManagementDetailsFunc 安全管理详情 +func (c *appPortController) SecurityManagementDetailsFunc(ctx context.Context, req *wxApplet.SecurityManagementDetailsReq) (res *wxApplet.SecurityManagementDetailsRes, err error) { + res = new(wxApplet.SecurityManagementDetailsRes) + err = g.Try(ctx, func(ctx context.Context) { + m := g.DB().Model("reminders").As("f"). + LeftJoin("bus_hse_management", "a", "a.id = f.order_id"). + LeftJoin("sys_project", "b", "b.id = a.project_id"). + LeftJoin("sys_dict_data", "c", "c.dict_type = 'study_type' and c.dict_value = a.study_type"). + LeftJoin("sys_dict_data", "e", "e.dict_type = 'tour_type' and e.dict_value = a.tour_type"). + LeftJoin(dao.BusConstructionUser.Table(), "d", "d.openid = a.corrector"). + Fields( + "a.id,b.project_name as projectName," + // 主键ID、项目名称 + "c.dict_label as studyTypeName," + // 检查类型 + "e.dict_label as tourTypeName," + // 违章类型 + "a.inspection_result," + // 巡检结果 + "a.check_time," + // 检查时间 + "a.reply_date," + // 要求整改期限 + "a.team_name as teamName," + // 班组 + "d.user_name as abarbeitung," + // 整改人 + "a.rectification_time," + // 整改时间 + "a.hidden_danger," + // 问题隐患 + "a.measure," + // 整改措施 + "a.review_time," + // 复查时间 + "a.review," + // 复查情况 + "f.status," + // 工单状态 + "a.review_type," + // 复查状态 + "a.created_by as fill," + // 复查状态 + "a.created_at") // 创建人(检查、复查) + err = m.Where("f.id", req.Id).Scan(&res) + + liberr.ErrIsNil(ctx, err, "查询失败") + // 2、获取附件 + var pathEntity []*wxApplet.SecurityManagementDetailsPath + err = g.DB().Model("bus_hse_management_path").Ctx(ctx).Where("ticket_id", req.Id).Scan(&pathEntity) + liberr.ErrIsNil(ctx, err, "查询失败") + // 3、分类附件 + var one []*wxApplet.SecurityManagementDetailsPath + var two []*wxApplet.SecurityManagementDetailsPath + for i := range pathEntity { + if pathEntity[i].Type == "1" { + one = append(one, pathEntity[i]) + } else { + two = append(two, pathEntity[i]) + } + } + res.CheckAttachment = one + res.AbarbeitungAttachment = two + // 3、获取 + res.Fill = coryCommon.SelectByString(ctx, coryCommon.IsNumeric(res.Fill), res.Fill) + }) + return +} + +// ===========================================请假=========================================== +// ===========================================请假=========================================== +// ===========================================请假=========================================== + +// AppAskForLeaveAdd 务工者-请假新增 +func (c *appPortController) AppAskForLeaveAdd(ctx context.Context, req *wxApplet.AppAskForLeaveAddReq) (res *wxApplet.AppBusAskforleaveAddRes, err error) { + err = service.BusAskforleave().AppAskForLeaveAdd(ctx, req) + return +} + +// AppAskForLeaveListPage 务工者-请假记录列表-分页 +func (c *appPortController) AppAskForLeaveListPage(ctx context.Context, req *wxApplet.AppAskForLeaveListPageReq) (res *wxApplet.AppAskForLeaveListPageRes, err error) { + return service.BusAskforleave().AppAskForLeaveListPage(ctx, req) +} + +// AppAskForLeaveInfo 务工者-请假详情 +func (c *appPortController) AppAskForLeaveInfo(ctx context.Context, req *wxApplet.AppAskForLeaveInfoReq) (res *wxApplet.AppAskForLeaveInfoRes, err error) { + return service.BusAskforleave().AppAskForLeaveInfo(ctx, req) +} + +// AppBzzAskForLeaveListPage 班组长-审批 +func (c *appPortController) AppBzzAskForLeaveUpdate(ctx context.Context, req *wxApplet.AppBzzAskForLeaveUpdateReq) (res *wxApplet.AppBzzAskForLeaveUpdateRes, err error) { + err = service.BusAskforleave().AppBzzAskForLeaveUpdate(ctx, req) + return +} + +// ===========================================其它=========================================== +// ===========================================其它=========================================== +// ===========================================其它=========================================== + +// AppBase64ToImgFuncFunc 将图片的base64转成png存储到本地,返回相对路径 +func (c *appPortController) AppBase64ToImgFuncFunc(ctx context.Context, req *wxApplet.AppBase64ToImgFuncReq) (res *wxApplet.AppBase64ToImgFuncRes, err error) { + res = new(wxApplet.AppBase64ToImgFuncRes) + path, err := coryCommon.Base64ToImgFunc(req.Base64Str, "1", coryCommon.Helmet) + res.Path = "/" + path + return +} + +// AppGetLatestAppVersionFunc 获取最新的App版本号 +func (c *appPortController) AppGetLatestAppVersionFunc(ctx context.Context, req *wxApplet.GetLatestAppVersionReq) (*wxApplet.GetLatestAppVersionRes, error) { + var AppVersionInfo entity.AppVersions + err := controllerDao.AppVersions.Ctx(ctx).Fields(entity.AppVersions{}). + Where(controllerDao.AppVersions.Columns().Platform, req.Platform). + OrderDesc(controllerDao.AppVersions.Columns().Id).Limit(1).Scan(&AppVersionInfo) + if err != nil { + return nil, err + } + + return &wxApplet.GetLatestAppVersionRes{ + Info: AppVersionInfo, + }, nil +} + +// AppReleaseAppVersionFunc 发布一个新的版本 +func (c *appPortController) AppReleaseAppVersionFunc(ctx context.Context, req *wxApplet.ReleaseAppVersionReq) (*wxApplet.ReleaseAppVersionRes, error) { + var ( + path, _ = os.Getwd() + Version = req.Version + plantType = req.Platform + ) + + // 根据平台类型拼接版本号 + var devicePlatform string + switch plantType { + case 0: + devicePlatform = "Android" + case 1: + devicePlatform = "IOS" + } + + // 拼接文件保存路径: 当前路径 + resource + public + version + 版本号 + 平台类型 + filePath := filepath.Join(path, "resource", "public", "version", Version, devicePlatform) + + // 保存到数据库的静态文件托管路径: file + version + 版本号 + 平台类型 + 文件名 + savePath := filepath.Join("file", "version", Version, devicePlatform, req.File.Filename) + + // 检查版本号是否已存在,如果存在则用新版本替换旧版本 + var appVersion entity.AppVersions + if err := controllerDao.AppVersions.Ctx(ctx).Where(controllerDao.AppVersions.Columns().Version, Version).Where(controllerDao.AppVersions.Columns().Platform, plantType).Scan(&appVersion); err == nil { + // 删除旧版本文件 + if err := os.RemoveAll(filepath.Join(filePath, filepath.Base(appVersion.FilePath))); err != nil { + return nil, fmt.Errorf("删除以往的版本文件失败:%w", err) + } + + // 保存新版本文件 + if _, err := req.File.Save(filePath); err != nil { + return nil, err + } + + // 更新数据库中的文件路径 + if _, err := controllerDao.AppVersions.Ctx(ctx).Data(gdb.Map{controllerDao.AppVersions.Columns().FilePath: savePath}).Where(controllerDao.AppVersions.Columns().Id, appVersion.Id).Update(); err != nil { + return nil, err + } + + return &wxApplet.ReleaseAppVersionRes{}, nil + } + + if _, err := req.File.Save(filePath); err != nil { + return nil, err + } + + // 构造数据库记录 + appVersionInfo := entity.AppVersions{ + Version: Version, // 版本号 + FilePath: savePath, // 文件路径 + Platform: plantType, // 平台类型 + } + + // 保存到数据库 + _, err := controllerDao.AppVersions.Ctx(ctx).Data(appVersionInfo).Insert() + if err != nil { + return nil, err + } + + return &wxApplet.ReleaseAppVersionRes{}, nil +} diff --git a/internal/app/wxApplet/controller/base.go b/internal/app/wxApplet/controller/base.go new file mode 100644 index 0000000..5dae69a --- /dev/null +++ b/internal/app/wxApplet/controller/base.go @@ -0,0 +1,22 @@ +/* +* @desc:system base controller +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/4 18:12 + */ + +package controller + +import ( + "github.com/gogf/gf/v2/net/ghttp" + commonController "github.com/tiger1103/gfast/v3/internal/app/common/controller" +) + +type BaseController struct { + commonController.BaseController +} + +// Init 自动执行的初始化方法 +func (c *BaseController) Init(r *ghttp.Request) { + c.BaseController.Init(r) +} diff --git a/internal/app/wxApplet/controller/bus_attendance.go b/internal/app/wxApplet/controller/bus_attendance.go new file mode 100644 index 0000000..06bfeb2 --- /dev/null +++ b/internal/app/wxApplet/controller/bus_attendance.go @@ -0,0 +1,145 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-07 16:29:52 +// 生成路径: internal/app/wxApplet/controller/bus_attendance.go +// 生成人:gfast +// desc:考勤 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "errors" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon/excelUtil" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + systemController "github.com/tiger1103/gfast/v3/internal/app/system/controller" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" + "strings" +) + +type busAttendanceController struct { + systemController.BaseController +} + +var BusAttendance = new(busAttendanceController) + +// SalaryDetailsFunc 小程序工资详情 +func (c *busAttendanceController) SalaryDetailsFunc(ctx context.Context, req *wxApplet.SalaryDetailsReq) (res *wxApplet.SalaryDetailsRes, err error) { + res = new(wxApplet.SalaryDetailsRes) + res, err = service.BusAttendance().SalaryDetailsFunc(ctx, req) + return +} + +// ProjectExport 导出(项目专用) +func (c *busAttendanceController) ProjectExport(ctx context.Context, req *wxApplet.PunchingCardRecordProjectReq) (res *wxApplet.PunchingCardRecordTwoRes, err error) { + recordReq := &wxApplet.PunchingCardRecordReq{ + ProjectId: req.ProjectId, + SelectDate: req.SelectDate, + Type: req.Type, + } + res = new(wxApplet.PunchingCardRecordTwoRes) + res, err = PublicExport(ctx, recordReq) + return res, err +} + +// Export 导出 +func (c *busAttendanceController) Export(ctx context.Context, req *wxApplet.PunchingCardRecordReq) (res *wxApplet.PunchingCardRecordTwoRes, err error) { + res = new(wxApplet.PunchingCardRecordTwoRes) + res, err = PublicExport(ctx, req) + return res, err +} + +func PublicExport(ctx context.Context, req *wxApplet.PunchingCardRecordReq) (res *wxApplet.PunchingCardRecordTwoRes, err error) { + var resList *wxApplet.PunchingCardRecordRes + //1、生成数据 + resList, err = service.BusAttendance().Export(ctx, req) + //2、生成excel数据表 + _, filePath, _ := excelUtil.ExcelThree(resList.List) + if filePath == "" { + err = errors.New("导出失败!") + return nil, err + } + res = new(wxApplet.PunchingCardRecordTwoRes) + getwd := strings.ReplaceAll(filePath, "\\", "/") + all := strings.ReplaceAll(getwd, "/resource/public", "/file") + res.Path = all + return res, err +} + +//// delFile 删除文件 +//func delFile(file string) { +// time.Sleep(10 * time.Second) +// // 5. 删除本地临时文件 +// if err := os.Remove(file); err != nil { +// fmt.Println("Failed to delete temporary file:", err) +// } +//10秒过后自动删除文件 +//go delFile(file) +//} + +// List 列表 +func (c *busAttendanceController) List(ctx context.Context, req *wxApplet.BusAttendanceSearchReq) (res *wxApplet.BusAttendanceSearchRes, err error) { + res, err = service.BusAttendance().List(ctx, req) + return res, err +} + +// Get 获取考勤 +func (c *busAttendanceController) Get(ctx context.Context, req *wxApplet.BusAttendanceGetReq) (res *wxApplet.BusAttendanceGetRes, err error) { + res = new(wxApplet.BusAttendanceGetRes) + res.BusAttendanceInfoRes, err = service.BusAttendance().GetById(ctx, req.Id) + return +} + +// Add 添加考勤 +func (c *busAttendanceController) Add(ctx context.Context, req *wxApplet.BusAttendanceAddReq) (res *wxApplet.BusAttendanceAddRes, err error) { + err = service.BusAttendance().Add(ctx, req) + return +} + +// Edit 修改考勤 +func (c *busAttendanceController) Edit(ctx context.Context, req *wxApplet.BusAttendanceEditReq) (res *wxApplet.BusAttendanceEditRes, err error) { + err = service.BusAttendance().Edit(ctx, req) + return +} + +// Delete 删除考勤 +func (c *busAttendanceController) Delete(ctx context.Context, req *wxApplet.BusAttendanceDeleteReq) (res *wxApplet.BusAttendanceDeleteRes, err error) { + err = service.BusAttendance().Delete(ctx, req.Ids) + return +} + +// ByOpenidFunc 打卡日历 +func (c *busAttendanceController) ByOpenidFunc(ctx context.Context, req *wxApplet.ByOpenIdFuncReq) (res *wxApplet.ByOpenIdFuncRes, err error) { + res, err = service.BusAttendance().ByOpenidFunc(ctx, req) + return res, err +} + +// PCListFunc 后端pc考勤打卡列表 +func (c *busAttendanceController) PCListFunc(ctx context.Context, req *wxApplet.PCListReq) (res *wxApplet.PCListRes, err error) { + res, err = service.BusAttendance().PCListFunc(ctx, req) + return res, err +} + +// AttendanceByOpenIdFunc 根据openid去获取到当前用户当天的打卡信息 +func (c *busAttendanceController) AttendanceByOpenIdFunc(ctx context.Context, req *wxApplet.AttendanceByOpenIdGetReq) (res *wxApplet.AttendanceByOpenIdRes, err error) { + res = new(wxApplet.AttendanceByOpenIdRes) + idFunc, err := service.BusAttendance().AttendanceByOpenIdFunc(ctx, req.Openid) + res = idFunc + return +} + +// ListOfAttendanceMachines 建立考勤机列表 +func (c *busAttendanceController) ListOfAttendanceMachines(ctx context.Context, req *wxApplet.AttendanceByOpenIdGetReq) (res *wxApplet.AttendanceByOpenIdRes, err error) { + res = new(wxApplet.AttendanceByOpenIdRes) + idFunc, err := service.BusAttendance().AttendanceByOpenIdFunc(ctx, req.Openid) + res = idFunc + return +} + +// 修改考勤机的基本信息(如项目选择、班组) + +// 修改考勤机的基本信息(如项) + +// 获取当前设备所关联到的班组下的所有成员消息 diff --git a/internal/app/wxApplet/controller/bus_construction_project.go b/internal/app/wxApplet/controller/bus_construction_project.go new file mode 100644 index 0000000..5d50057 --- /dev/null +++ b/internal/app/wxApplet/controller/bus_construction_project.go @@ -0,0 +1,54 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-07 11:17:50 +// 生成路径: internal/app/wxApplet/controller/bus_construction_project.go +// 生成人:gfast +// desc:施工人员对应项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + systemController "github.com/tiger1103/gfast/v3/internal/app/system/controller" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" +) + +type busConstructionProjectController struct { + systemController.BaseController +} + +var BusConstructionProject = new(busConstructionProjectController) + +// List 列表 +func (c *busConstructionProjectController) List(ctx context.Context, req *wxApplet.BusConstructionProjectSearchReq) (res *wxApplet.BusConstructionProjectSearchRes, err error) { + res, err = service.BusConstructionProject().List(ctx, req) + return +} + +// Get 获取施工人员对应项目 +func (c *busConstructionProjectController) Get(ctx context.Context, req *wxApplet.BusConstructionProjectGetReq) (res *wxApplet.BusConstructionProjectGetRes, err error) { + res = new(wxApplet.BusConstructionProjectGetRes) + res.BusConstructionProjectInfoRes, err = service.BusConstructionProject().GetById(ctx, req.Id) + return +} + +// Add 添加施工人员对应项目 +func (c *busConstructionProjectController) Add(ctx context.Context, req *wxApplet.BusConstructionProjectAddReq) (res *wxApplet.BusConstructionProjectAddRes, err error) { + err = service.BusConstructionProject().Add(ctx, req) + return +} + +// Edit 修改施工人员对应项目 +func (c *busConstructionProjectController) Edit(ctx context.Context, req *wxApplet.BusConstructionProjectEditReq) (res *wxApplet.BusConstructionProjectEditRes, err error) { + err = service.BusConstructionProject().Edit(ctx, req) + return +} + +// Delete 删除施工人员对应项目 +func (c *busConstructionProjectController) Delete(ctx context.Context, req *wxApplet.BusConstructionProjectDeleteReq) (res *wxApplet.BusConstructionProjectDeleteRes, err error) { + err = service.BusConstructionProject().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/wxApplet/controller/bus_construction_user.go b/internal/app/wxApplet/controller/bus_construction_user.go new file mode 100644 index 0000000..9bd4919 --- /dev/null +++ b/internal/app/wxApplet/controller/bus_construction_user.go @@ -0,0 +1,475 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-07 11:17:50 +// 生成路径: internal/app/wxApplet/controller/bus_construction_user.go +// 生成人:gfast +// desc:施工人员 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/os/gfile" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + systemController "github.com/tiger1103/gfast/v3/internal/app/system/controller" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + controllerModel "github.com/tiger1103/gfast/v3/internal/app/system/model" + systemService "github.com/tiger1103/gfast/v3/internal/app/system/service" + daoTwo "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "os" + "strings" +) + +type busConstructionUserController struct { + systemController.BaseController +} + +var BusConstructionUser = new(busConstructionUserController) + +// ImgUpload 图片(银行卡或身份证)上传并返回图片内容 +func (c *busConstructionUserController) ImgUpload(ctx context.Context, req *wxApplet.ImgUploadReq) (res *wxApplet.ImgUploadRes, err error) { + m := make(map[string]interface{}) + //1、上传图片 + str, err := coryCommon.UploadFile(ctx, req.ImgUpload, coryCommon.LargeFilePrivacy) + if len(str) > 0 && str[0] == '/' { + str = str[1:] + } + //2、获取图片的二进制 + getwd, err := os.Getwd() + join := gfile.Join(getwd, str) + //3、解析图片内容 + var ocr coryCommon.OcrReq + strType := req.StrType + switch strType { + case "1": + err, urlBase64 := coryCommon.ImgDataBase64(join) + if err != nil { + return nil, err + } + ocr = coryCommon.OcrReq{ + Image: urlBase64, + IdCardSide: "front", + DetectPhoto: true, + } + m = coryCommon.ImgOCR(ocr) + case "2": + err, urlBase64 := coryCommon.ImgDataBase64(join) + if err != nil { + return nil, err + } + ocr = coryCommon.OcrReq{ + Image: urlBase64, + IdCardSide: "back", + } + m = coryCommon.ImgOCR(ocr) + case "3": + urlBase64Two, err := coryCommon.EncodeAndUrlEncodeImage(join, 4) + if err != nil { + return nil, err + } + ocr = coryCommon.OcrReq{ + Image: urlBase64Two, + } + m = coryCommon.ImgYhkOCR(ocr) + } + //合同4不进行校验 + if strType == "3" && len(m) < 3 { + err = errors.New("银行卡无效,请重新上传!") + return nil, err + } + if strType != "4" && len(m) < 1 { + err = errors.New("身份证无效,请重新上传!") + return nil, err + } + + //修改str的路径 resource/public 改成 file /resource/public/privacy/2023-08-10/16916519795176443.png + str = strings.ReplaceAll(str, "resource/public", "file") + m["ImgPath"] = "/" + str + res = &wxApplet.ImgUploadRes{} + res.MapKV = &m + return +} + +// PacePhotoFunc 人脸检测() +func (c *busConstructionUserController) PacePhotoFunc(ctx context.Context, req *wxApplet.PacePhotoReq) (res *wxApplet.PacePhotoRes, err error) { + res = new(wxApplet.PacePhotoRes) + res.Path, err = FaceDetectionFunc(ctx, req.File) + return +} + +// List 列表 获取所有的图片资源(0~10) +func (c *busConstructionUserController) List(ctx context.Context, req *wxApplet.BusConstructionUserSearchReq) (res *wxApplet.BusConstructionUserSearchRes, err error) { + res, err = service.BusConstructionUser().List(ctx, req) + return +} + +// PersonnelListFunc 人员列表(只返回id、头像、名称、电话) +func (c *busConstructionUserController) PersonnelListFunc(ctx context.Context, req *wxApplet.PersonnelListReq) (res *wxApplet.PersonnelListRes, err error) { + res, err = service.BusConstructionUser().PersonnelListFunc(ctx, req) + return +} + +// PersonnelInquiryFunc 查询在职施工人员(只返回id、名称) +func (c *busConstructionUserController) PersonnelInquiryFunc(ctx context.Context, req *wxApplet.PersonnelInquiryReq) (res *wxApplet.PersonnelInquiryRes, err error) { + res, err = service.BusConstructionUser().PersonnelInquiryFunc(ctx, req) + return +} + +// Get 施工人员列表_文件上传【详情】 +func (c *busConstructionUserController) Get(ctx context.Context, req *wxApplet.BusConstructionUserGetReq) (res *wxApplet.BusConstructionUserGetRes, err error) { + res = new(wxApplet.BusConstructionUserGetRes) + res.BusConstructionUserInfoRes, err = service.BusConstructionUser().GetById(ctx, req.Id) + //2、图片资源 + var dataInfo2 []*model.BusConstructionUserFileListRes + dao.BusConstructionUserFile.Ctx(ctx).Where("user_id", res.Id).Where("user_img_type in (0,1,2,3)").Scan(&dataInfo2) + res.ImgFileListTwo = dataInfo2 + //2、图片资源 + var dataInfo []*model.BusConstructionUserFileListRes + daoTwo.BusConstructionUserFile.Ctx(ctx).As("a"). + LeftJoin("sys_dict_data", "a.user_img_type = b.dict_value and dict_type= 'user_img_type' ").As("b"). + Where("a.user_id", res.Id). + Where("a.user_img_type in (4,5,6,7,8,10)"). //0,1,2,3, + Fields("a.*,b.dict_label"). + Scan(&dataInfo) + res.ImgFileList = dataInfo + return +} + +// GetDetailsFunc 施工人员列表_详情 +func (c *busConstructionUserController) GetDetailsFunc(ctx context.Context, req *wxApplet.GetDetailsReq) (res *wxApplet.GetDetailsRes, err error) { + res = new(wxApplet.GetDetailsRes) + res, err = service.BusConstructionUser().GetDetailsFunc(ctx, req) + return +} + +// Add 添加施工人员 +func (c *busConstructionUserController) Add(ctx context.Context, req *wxApplet.BusConstructionUserAddReq) (res *wxApplet.BusConstructionUserAddRes, err error) { + res = new(wxApplet.BusConstructionUserAddRes) + add, err := service.BusConstructionUser().Add(ctx, req) + res.Id = add + return +} + +// Edit 修改施工人员 +func (c *busConstructionUserController) Edit(ctx context.Context, req *wxApplet.BusConstructionUserEditReq) (res *wxApplet.BusConstructionUserEditRes, err error) { + err = service.BusConstructionUser().Edit(ctx, req) + return +} + +// Delete 删除施工人员 +func (c *busConstructionUserController) Delete(ctx context.Context, req *wxApplet.BusConstructionUserDeleteReq) (res *wxApplet.BusConstructionUserDeleteRes, err error) { + err = service.BusConstructionUser().Delete(ctx, req.Ids) + return +} + +// ChangeStateFunc 【小程序】变更施工人员在职/离职情况 +func (c *busConstructionUserController) ChangeStateFunc(ctx context.Context, req *wxApplet.ChangeStateReq) (res *wxApplet.ChangeStateRes, err error) { + res = new(wxApplet.ChangeStateRes) + err = service.BusConstructionUser().ChangeStateFunc(ctx, req) + return +} + +// GetByOpenId 【小程序】获取施工人员 获取部分图片资源(0,1,2,3) +func (c *busConstructionUserController) GetByOpenId(ctx context.Context, req *wxApplet.BusConstructionUserByOpenIdGetReq) (res *wxApplet.BusConstructionUserByOpenIdGetRes, err error) { + res = new(wxApplet.BusConstructionUserByOpenIdGetRes) + res, err = service.BusConstructionUser().GetByOpenId(ctx, req.OpenId) + //根据角色获取到所有的模块,然后对模块进行去重 + var swmi []*controllerModel.SysWechatModuleInfoRes + g.DB().Model("sys_wxchat_role_module").As("a"). + Fields("DISTINCT b.name,b.id,b.list_order"). + LeftJoin("sys_wechat_module", "b", "a.module_id = b.id"). + Where("a.role_id in (?)", res.RoleIds). + Order("b.list_order asc,b.id asc").Scan(&swmi) + var mk []string + for i := range swmi { + mk = append(mk, swmi[i].Name) + } + res.ModuleName = mk + return +} + +// WeatherFunc 【小程序】获取施工人员天气 +func (c *busConstructionUserController) WeatherFunc(ctx context.Context, req *wxApplet.WeatherReq) (res *wxApplet.WeatherRes, err error) { + res = new(wxApplet.WeatherRes) + we := coryCommon.Weather(req.Location) + bodyData := []byte(we) + err = json.Unmarshal(bodyData, &res) + if err != nil { + fmt.Println("Failed to parse JSON data:", err) + return + } + return +} + +// GridPointFunc 【小程序】获取格点天气 +func (c *busConstructionUserController) GridPointFunc(ctx context.Context, req *wxApplet.GridPointFuncReq) (res *wxApplet.GridPointFuncRes, err error) { + res = new(wxApplet.GridPointFuncRes) + gp, err := coryCommon.GridPoint(req.Location) + if err != nil { + return + } else { + res.GridPointRes = gp + return + } +} + +// InverseGeocodingFunc 【小程序】逆地理编码 +func (c *busConstructionUserController) InverseGeocodingFunc(ctx context.Context, req *wxApplet.InverseGeocodingReq) (res *wxApplet.InverseGeocodingRes, err error) { + res = new(wxApplet.InverseGeocodingRes) + we := coryCommon.InverseGeocoding(req.Location) + bodyData := []byte(we) + err = json.Unmarshal(bodyData, &res) + if err != nil { + fmt.Println("Failed to parse JSON data:", err) + return + } + return +} + +// GroupLeader 【小程序】班组长成员列表 +func (c *busConstructionUserController) GroupLeader(ctx context.Context, req *wxApplet.GroupLeaderReq) (res *wxApplet.GroupLeaderRes, err error) { + res = new(wxApplet.GroupLeaderRes) + res, err = service.BusConstructionUser().GroupLeader(ctx, req) + return +} + +// PayFunc 【小程序】薪水变更 +func (c *busConstructionUserController) PayFunc(ctx context.Context, req *wxApplet.PayFuncReq) (res *wxApplet.PayFuncRes, err error) { + res = new(wxApplet.PayFuncRes) + res, err = service.BusConstructionUser().PayFunc(ctx, req) + return +} + +// AttendanceCountFunc 【小程序】出勤统计情况 +func (c *busConstructionUserController) AttendanceCountFunc(ctx context.Context, req *wxApplet.AttendanceReq) (res *wxApplet.AttendanceRes, err error) { + res, err = service.BusConstructionUser().AttendanceFunc(ctx, req) + return +} + +// AttendanceCountListFunc 【小程序】出勤人员列表 +func (c *busConstructionUserController) AttendanceCountListFunc(ctx context.Context, req *wxApplet.AttendanceListReq) (res *wxApplet.AttendanceListRes, err error) { + res, err = service.BusConstructionUser().AttendanceCountListFunc(ctx, req) + return +} + +// ProjectRecordFunc 【小程序】是否开启小程序项目备案project_record +func (c *busConstructionUserController) ProjectRecordFunc(ctx context.Context, req *wxApplet.ProjectRecordReq) (res *wxApplet.ProjectRecordRes, err error) { + res = new(wxApplet.ProjectRecordRes) + res, err = service.BusConstructionUser().ProjectRecordFunc(ctx, req) + return +} + +// HumanFaceFunc 【小程序】更换实名认证的人脸照片 +func (c *busConstructionUserController) HumanFaceFunc(ctx context.Context, req *wxApplet.HumanFaceReq) (res *wxApplet.HumanFaceReqRes, err error) { + res = new(wxApplet.HumanFaceReqRes) + res, err = service.BusConstructionUser().HumanFaceFunc(ctx, req) + return +} + +// SubscriptionFunc 【小程序】小程序变更消息订阅状态 +func (c *busConstructionUserController) SubscriptionFunc(ctx context.Context, req *wxApplet.SubscriptionFuncReq) (res *wxApplet.SubscriptionFuncRes, err error) { + res, err = service.BusConstructionUser().SubscriptionFunc(ctx, req) + return +} + +// ChangePayFunc 【小程序】根据openid改变当前微信用户的项目id +func (c *busConstructionUserController) ChangePayFunc(ctx context.Context, req *wxApplet.ChangePayReq) (res *wxApplet.ChangePayRes, err error) { + err = service.BusConstructionUser().ChangePayFunc(ctx, req) + return +} + +// OpenidByFounder 【小程序】获取当前用户当前项目的打卡坐标 +func (c *busConstructionUserController) OpenidByFounder(ctx context.Context, req *wxApplet.OpenidByFounderReq) (res *wxApplet.OpenidByFounderRes, err error) { + res = new(wxApplet.OpenidByFounderRes) + res, err = OpenidByFounderFunc(ctx, req.Openid) + return +} + +func OpenidByFounderFunc(ctx context.Context, openid string) (res *wxApplet.OpenidByFounderRes, err error) { + res = new(wxApplet.OpenidByFounderRes) + var fz []*wxApplet.FangzhengEntity + var pp []*wxApplet.ProjectPunchEntity + g.Try(ctx, func(ctx context.Context) { + pid, err := dao.BusConstructionUser.Ctx(ctx).Where("openid", openid).Fields("project_id").Value() + value, err := dao.SysProject.Ctx(ctx).Where("id", pid).Fields("CONCAT(lng,',',lat) as jwd").Value() + if err == nil { + res.LongAndLat = value.String() + } + type fzEntity struct { + Name string `json:"name" dc:"方正名称"` + Detail string `json:"detail" dc:"方正边界坐标"` + } + //方正坐标范围 + var fe []*fzEntity + err = dao.QianqiFangzhen.Ctx(ctx).Where("project_id", pid).Fields("name", "detail").Scan(&fe) + for _, data := range fe { + jsonData := data.Detail + var fzTwo *wxApplet.FangzhengEntity + err = json.Unmarshal([]byte(jsonData), &fzTwo) + for i, position := range fzTwo.Entity { + //坐标转换 + fzTwo.Entity[i].Lng, fzTwo.Entity[i].Lat = coryCommon.WGS84toGCJ02(position.Lng, position.Lat) + } + fzTwo.FangzhengName = data.Name + fz = append(fz, fzTwo) + } + //打卡坐标范围 + var ppe []*fzEntity + err = g.DB().Model("sys_project_punch_range").Ctx(ctx).Where("project_id", pid).Fields("punch_name as name", "punch_range as detail").Scan(&ppe) + for _, data := range ppe { + jsonData := data.Detail + var arr []*wxApplet.Position + err = json.Unmarshal([]byte(jsonData), &arr) + for i := range arr { + arr[i].Lng, arr[i].Lat = coryCommon.WGS84toGCJ02(arr[i].Lng, arr[i].Lat) + } + ppeTwo := wxApplet.ProjectPunchEntity{ + PunchName: data.Name, + Entity: arr, + } + pp = append(pp, &ppeTwo) + } + liberr.ErrIsNil(ctx, err, "获取数据失败!") + return + }) + res.FangzhengEntity = fz + res.ProjectPunchEntity = pp + return +} + +// ActionPathFunc 根据openid获取到当前人的行动轨迹(前提是当前人有安全帽) +func (c *busConstructionUserController) ActionPathFunc(ctx context.Context, req *wxApplet.ActionPathReq) (res *wxApplet.ActionPathRes, err error) { + res = new(wxApplet.ActionPathRes) + res.LatAndLonList, err = service.BusConstructionUser().ActionPathFunc(ctx, req) + return +} + +// CameraListFunc 获取摄像头列表(坐标进行转换了的) +func (c *busConstructionUserController) CameraListFunc(ctx context.Context, req *wxApplet.QianqiCameraSearchReq) (res *wxApplet.QianqiCameraSearchRes, err error) { + res = new(wxApplet.QianqiCameraSearchRes) + data, err := systemService.QianqiCamera().NotPageList(ctx, req) + res = data + return +} + +// EditNameAndDetail 修改摄像头 +func (c *busConstructionUserController) EditNameAndDetail(ctx context.Context, req *wxApplet.QianqiCameraEditNameAndDetailReq) (res *wxApplet.QianqiCameraEditNameAndDetailRes, err error) { + detailReq := system.QianqiCameraEditNameAndDetailReq{ + CameraName: req.CameraName, + CameraCode: req.CameraCode, + Detail: req.Detail, + } + err = systemService.QianqiCamera().WxEditNameAndDetail(ctx, &detailReq) + return +} + +// ReissueACardWxAddFunc 《补卡申请》提交补卡申请 +func (c *busConstructionUserController) ReissueACardWxAddFunc(ctx context.Context, req *wxApplet.ReissueACardWxAddReq) (res *wxApplet.ReissueACardWxAddRes, err error) { + err = systemService.BusReissueACard().ReissueACardWxAdd(ctx, req) + return +} + +// ReissueACardWxGetByIdFunc 《补卡申请》(我)补卡申请记录查看 +func (c *busConstructionUserController) ReissueACardWxGetByIdFunc(ctx context.Context, req *wxApplet.ReissueACardWxGetByIdReq) (res *wxApplet.ReissueACardWxGetByIdRes, err error) { + res = new(wxApplet.ReissueACardWxGetByIdRes) + res, err = systemService.BusReissueACard().ReissueACardWxGetByIdFunc(ctx, req) + return +} + +// ReissueACardWxGetByIdTeamFunc 《补卡申请》班组长查看自己需要同意或拒绝的补卡申请 +func (c *busConstructionUserController) ReissueACardWxGetByIdTeamFunc(ctx context.Context, req *wxApplet.ReissueACardWxGetByIdTeamReq) (res *wxApplet.ReissueACardWxGetByIdTeamRes, err error) { + res = new(wxApplet.ReissueACardWxGetByIdTeamRes) + res, err = systemService.BusReissueACard().ReissueACardWxGetByIdTeam(ctx, req) + return +} + +// ReissueACardWxEditTeamFunc 《补卡申请》班组长审批修改提交补卡申请的状态 +func (c *busConstructionUserController) ReissueACardWxEditTeamFunc(ctx context.Context, req *wxApplet.ReissueACardWxEditTeamReq) (res *wxApplet.ReissueACardWxGetByIdTeamRes, err error) { + err = systemService.BusReissueACard().ReissueACardWxEditTeam(ctx, req) + return +} + +// JobForemanSumnumberFunc 《补卡申请》班组长未读的补卡申请有多少条? +func (c *busConstructionUserController) JobForemanSumnumberFunc(ctx context.Context, req *wxApplet.JobForemanSumnumberReq) (res *wxApplet.JobForemanSumnumberRes, err error) { + res = new(wxApplet.JobForemanSumnumberRes) + number, err := systemService.BusReissueACard().JobForemanSumnumberFunc(ctx, req) + res.Number = number + return +} + +// BusConstructiomUserSignatureAddFunc 【签名】给指定用户新增签名 +func (c *busConstructionUserController) BusConstructiomUserSignatureAddFunc(ctx context.Context, req *wxApplet.BusConstructiomUserSignatureAddReq) (res *wxApplet.BusConstructiomUserSignatureAddRes, err error) { + res = new(wxApplet.BusConstructiomUserSignatureAddRes) + err = g.Try(ctx, func(ctx context.Context) { + m := g.DB().Model("bus_constructiom_user_signature").Safe() + //0、图片上传 + str, imgErr := coryCommon.UploadFile(ctx, req.Sign, coryCommon.Helmet) + liberr.ErrIsNil(ctx, imgErr, "签名错误!") + //1、删除指定openid的数据 + value, _ := m.Where("openid", req.Openid).Fields("signature").Value() + os.Remove(strings.ReplaceAll(coryCommon.GetCWD()+"/"+value.String(), "\\", "/")) + _, err := m.Where("openid", req.Openid).Delete() + liberr.ErrIsNil(ctx, err, "添加失败") + //2、新增指定用户签名 + g2 := g.Map{ + "openid": req.Openid, + "signature": str, + } + _, err = m.Insert(g2) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +// BusConstructiomUserSignatureQueryFunc 【签名】查询指定用户签名信息 +func (c *busConstructionUserController) BusConstructiomUserSignatureQueryFunc(ctx context.Context, req *wxApplet.BusConstructiomUserSignatureQueryReq) (res *wxApplet.BusConstructiomUserSignatureQueryRes, err error) { + res = new(wxApplet.BusConstructiomUserSignatureQueryRes) + err = g.Try(ctx, func(ctx context.Context) { + var signature *model.BusConstructiomUserSignatureRes + err = g.DB().Model("bus_constructiom_user_signature").Where("openid", req.Openid).Scan(&signature) + liberr.ErrIsNil(ctx, err, "获取数据失败") + res.Signature = signature + }) + return +} + +func FaceDetectionFunc(ctx context.Context, file *ghttp.UploadFile) (path string, err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、获取文件相对路径 + str, err := coryCommon.UploadFileTwo(ctx, file, coryCommon.Portrait+"/") + liberr.ErrIsNil(ctx, err) + getwd, err := os.Getwd() + liberr.ErrIsNil(ctx, err) + join := gfile.Join(getwd, str) + //2、根据绝对路径获取到base64 + urlBase64Two, err := coryCommon.EncodeAndUrlEncodeImage(join, 2) + liberr.ErrIsNil(ctx, err) + if err != nil { + return + } + //3、检测是否是人脸 + hfReq := &coryCommon.HumanFaceReq{} + hfReq.Image = urlBase64Two + hfReq.ImageType = "BASE64" + hfReq.FaceField = "face_type,quality" + err = coryCommon.HumanFace(hfReq) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + path = strings.Replace(str, "resource/public", "/wxfile", 1) + }) + return +} diff --git a/internal/app/wxApplet/controller/bus_construction_user_file.go b/internal/app/wxApplet/controller/bus_construction_user_file.go new file mode 100644 index 0000000..bff199d --- /dev/null +++ b/internal/app/wxApplet/controller/bus_construction_user_file.go @@ -0,0 +1,54 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-07 11:17:55 +// 生成路径: internal/app/wxApplet/controller/bus_construction_user_file.go +// 生成人:gfast +// desc:微信用户的文件存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + systemController "github.com/tiger1103/gfast/v3/internal/app/system/controller" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" +) + +type busConstructionUserFileController struct { + systemController.BaseController +} + +var BusConstructionUserFile = new(busConstructionUserFileController) + +// List 列表 +func (c *busConstructionUserFileController) List(ctx context.Context, req *wxApplet.BusConstructionUserFileSearchReq) (res *wxApplet.BusConstructionUserFileSearchRes, err error) { + res, err = service.BusConstructionUserFile().List(ctx, req) + return +} + +// Get 获取微信用户的文件存储 +func (c *busConstructionUserFileController) Get(ctx context.Context, req *wxApplet.BusConstructionUserFileGetReq) (res *wxApplet.BusConstructionUserFileGetRes, err error) { + res = new(wxApplet.BusConstructionUserFileGetRes) + res.BusConstructionUserFileInfoRes, err = service.BusConstructionUserFile().GetById(ctx, req.Id) + return +} + +// Add 添加微信用户的文件存储 +func (c *busConstructionUserFileController) Add(ctx context.Context, req *wxApplet.BusConstructionUserFileAddReq) (res *wxApplet.BusConstructionUserFileAddRes, err error) { + err = service.BusConstructionUserFile().Add(ctx, req) + return +} + +// Edit 修改微信用户的文件存储 +func (c *busConstructionUserFileController) Edit(ctx context.Context, req *wxApplet.BusConstructionUserFileEditReq) (res *wxApplet.BusConstructionUserFileEditRes, err error) { + err = service.BusConstructionUserFile().Edit(ctx, req) + return +} + +// Delete 删除微信用户的文件存储 +func (c *busConstructionUserFileController) Delete(ctx context.Context, req *wxApplet.BusConstructionUserFileDeleteReq) (res *wxApplet.BusConstructionUserFileDeleteRes, err error) { + err = service.BusConstructionUserFile().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/wxApplet/controller/bus_construction_user_post.go b/internal/app/wxApplet/controller/bus_construction_user_post.go new file mode 100644 index 0000000..27582e7 --- /dev/null +++ b/internal/app/wxApplet/controller/bus_construction_user_post.go @@ -0,0 +1,54 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-07 11:17:55 +// 生成路径: internal/app/wxApplet/controller/bus_construction_user_post.go +// 生成人:gfast +// desc:施工人员岗位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + systemController "github.com/tiger1103/gfast/v3/internal/app/system/controller" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" +) + +type busConstructionUserPostController struct { + systemController.BaseController +} + +var BusConstructionUserPost = new(busConstructionUserPostController) + +// List 列表 +func (c *busConstructionUserPostController) List(ctx context.Context, req *wxApplet.BusConstructionUserPostSearchReq) (res *wxApplet.BusConstructionUserPostSearchRes, err error) { + res, err = service.BusConstructionUserPost().List(ctx, req) + return +} + +// Get 获取施工人员岗位 +func (c *busConstructionUserPostController) Get(ctx context.Context, req *wxApplet.BusConstructionUserPostGetReq) (res *wxApplet.BusConstructionUserPostGetRes, err error) { + res = new(wxApplet.BusConstructionUserPostGetRes) + res.BusConstructionUserPostInfoRes, err = service.BusConstructionUserPost().GetById(ctx, req.Id) + return +} + +// Add 添加施工人员岗位 +func (c *busConstructionUserPostController) Add(ctx context.Context, req *wxApplet.BusConstructionUserPostAddReq) (res *wxApplet.BusConstructionUserPostAddRes, err error) { + err = service.BusConstructionUserPost().Add(ctx, req) + return +} + +// Edit 修改施工人员岗位 +func (c *busConstructionUserPostController) Edit(ctx context.Context, req *wxApplet.BusConstructionUserPostEditReq) (res *wxApplet.BusConstructionUserPostEditRes, err error) { + err = service.BusConstructionUserPost().Edit(ctx, req) + return +} + +// Delete 删除施工人员岗位 +func (c *busConstructionUserPostController) Delete(ctx context.Context, req *wxApplet.BusConstructionUserPostDeleteReq) (res *wxApplet.BusConstructionUserPostDeleteRes, err error) { + err = service.BusConstructionUserPost().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/wxApplet/controller/bus_labourservice.go b/internal/app/wxApplet/controller/bus_labourservice.go new file mode 100644 index 0000000..7a43e43 --- /dev/null +++ b/internal/app/wxApplet/controller/bus_labourservice.go @@ -0,0 +1,72 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-14 11:24:31 +// 生成路径: internal/app/wxApplet/controller/bus_labourservice.go +// 生成人:gfast +// desc:劳务公司 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + systemController "github.com/tiger1103/gfast/v3/internal/app/system/controller" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" +) + +type busLabourserviceController struct { + systemController.BaseController +} + +var BusLabourservice = new(busLabourserviceController) + +// List 列表 +func (c *busLabourserviceController) List(ctx context.Context, req *wxApplet.BusLabourserviceSearchReq) (res *wxApplet.BusLabourserviceSearchRes, err error) { + res, err = service.BusLabourservice().List(ctx, req) + return +} + +// Get 获取劳务公司 +func (c *busLabourserviceController) Get(ctx context.Context, req *wxApplet.BusLabourserviceGetReq) (res *wxApplet.BusLabourserviceGetRes, err error) { + res = new(wxApplet.BusLabourserviceGetRes) + res.BusLabourserviceInfoRes, err = service.BusLabourservice().GetById(ctx, req.Id) + return +} + +// Add 添加劳务公司 +func (c *busLabourserviceController) Add(ctx context.Context, req *wxApplet.BusLabourserviceAddReq) (res *wxApplet.BusLabourserviceAddRes, err error) { + err = service.BusLabourservice().Add(ctx, req) + return +} + +// Edit 修改劳务公司 +func (c *busLabourserviceController) Edit(ctx context.Context, req *wxApplet.BusLabourserviceEditReq) (res *wxApplet.BusLabourserviceEditRes, err error) { + err = service.BusLabourservice().Edit(ctx, req) + return +} + +// Delete 删除劳务公司 +func (c *busLabourserviceController) Delete(ctx context.Context, req *wxApplet.BusLabourserviceDeleteReq) (res *wxApplet.BusLabourserviceDeleteRes, err error) { + err = service.BusLabourservice().Delete(ctx, req.Ids) + return +} + +// PcAdd pc劳务公司资料新增 +func (c *busLabourserviceController) PcAdd(ctx context.Context, req *wxApplet.BusPcAddReq) (res *wxApplet.BusPcAddRes, err error) { + err = service.BusLabourservice().PcAdd(ctx, req) + return +} + +// PcDel pc劳务公司资料删除 +func (c *busLabourserviceController) PcDel(ctx context.Context, req *wxApplet.BusPcDelReq) (res *wxApplet.BusPcDelRes, err error) { + err = service.BusLabourservice().PcDel(ctx, req) + return +} + +// PcFind pc劳务公司资料查询 +func (c *busLabourserviceController) PcFind(ctx context.Context, req *wxApplet.BusPcFindReq) (res *wxApplet.BusPcFindRes, err error) { + res, err = service.BusLabourservice().PcFind(ctx, req) + return +} diff --git a/internal/app/wxApplet/controller/sys_project_team.go b/internal/app/wxApplet/controller/sys_project_team.go new file mode 100644 index 0000000..564f44b --- /dev/null +++ b/internal/app/wxApplet/controller/sys_project_team.go @@ -0,0 +1,54 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-15 09:34:52 +// 生成路径: internal/app/wxApplet/controller/sys_project_team.go +// 生成人:gfast +// desc:项目班组 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + systemController "github.com/tiger1103/gfast/v3/internal/app/system/controller" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" +) + +type sysProjectTeamController struct { + systemController.BaseController +} + +var SysProjectTeam = new(sysProjectTeamController) + +// List 列表 +func (c *sysProjectTeamController) List(ctx context.Context, req *wxApplet.SysProjectTeamSearchReq) (res *wxApplet.SysProjectTeamSearchRes, err error) { + res, err = service.SysProjectTeam().List(ctx, req) + return +} + +// Get 获取项目班组 +func (c *sysProjectTeamController) Get(ctx context.Context, req *wxApplet.SysProjectTeamGetReq) (res *wxApplet.SysProjectTeamGetRes, err error) { + res = new(wxApplet.SysProjectTeamGetRes) + res.SysProjectTeamInfoRes, err = service.SysProjectTeam().GetById(ctx, req.Id) + return +} + +// Add 添加项目班组 +func (c *sysProjectTeamController) Add(ctx context.Context, req *wxApplet.SysProjectTeamAddReq) (res *wxApplet.SysProjectTeamAddRes, err error) { + err = service.SysProjectTeam().Add(ctx, req) + return +} + +// Edit 修改项目班组 +func (c *sysProjectTeamController) Edit(ctx context.Context, req *wxApplet.SysProjectTeamEditReq) (res *wxApplet.SysProjectTeamEditRes, err error) { + err = service.SysProjectTeam().Edit(ctx, req) + return +} + +// Delete 删除项目班组 +func (c *sysProjectTeamController) Delete(ctx context.Context, req *wxApplet.SysProjectTeamDeleteReq) (res *wxApplet.SysProjectTeamDeleteRes, err error) { + err = service.SysProjectTeam().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/wxApplet/controller/sys_project_team_member.go b/internal/app/wxApplet/controller/sys_project_team_member.go new file mode 100644 index 0000000..3d905ce --- /dev/null +++ b/internal/app/wxApplet/controller/sys_project_team_member.go @@ -0,0 +1,54 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-15 09:34:52 +// 生成路径: internal/app/wxApplet/controller/sys_project_team_member.go +// 生成人:gfast +// desc:项目班组下的成员 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + systemController "github.com/tiger1103/gfast/v3/internal/app/system/controller" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" +) + +type sysProjectTeamMemberController struct { + systemController.BaseController +} + +var SysProjectTeamMember = new(sysProjectTeamMemberController) + +// List 列表 +func (c *sysProjectTeamMemberController) List(ctx context.Context, req *wxApplet.SysProjectTeamMemberSearchReq) (res *wxApplet.SysProjectTeamMemberSearchRes, err error) { + res, err = service.SysProjectTeamMember().List(ctx, req) + return +} + +// Get 获取项目班组下的成员 +func (c *sysProjectTeamMemberController) Get(ctx context.Context, req *wxApplet.SysProjectTeamMemberGetReq) (res *wxApplet.SysProjectTeamMemberGetRes, err error) { + res = new(wxApplet.SysProjectTeamMemberGetRes) + res.SysProjectTeamMemberInfoRes, err = service.SysProjectTeamMember().GetById(ctx, req.Id) + return +} + +// Add 添加项目班组下的成员 +func (c *sysProjectTeamMemberController) Add(ctx context.Context, req *wxApplet.SysProjectTeamMemberAddReq) (res *wxApplet.SysProjectTeamMemberAddRes, err error) { + err = service.SysProjectTeamMember().Add(ctx, req) + return +} + +// Edit 修改项目班组下的成员 +func (c *sysProjectTeamMemberController) Edit(ctx context.Context, req *wxApplet.SysProjectTeamMemberEditReq) (res *wxApplet.SysProjectTeamMemberEditRes, err error) { + err = service.SysProjectTeamMember().Edit(ctx, req) + return +} + +// Delete 删除项目班组下的成员 +func (c *sysProjectTeamMemberController) Delete(ctx context.Context, req *wxApplet.SysProjectTeamMemberDeleteReq) (res *wxApplet.SysProjectTeamMemberDeleteRes, err error) { + err = service.SysProjectTeamMember().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/wxApplet/controller/sys_project_team_squad.go b/internal/app/wxApplet/controller/sys_project_team_squad.go new file mode 100644 index 0000000..9a47e47 --- /dev/null +++ b/internal/app/wxApplet/controller/sys_project_team_squad.go @@ -0,0 +1,67 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-30 15:24:06 +// 生成路径: internal/app/wxApplet/controller/sys_project_team_squad.go +// 生成人:gfast +// desc:站班会 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + systemController "github.com/tiger1103/gfast/v3/internal/app/system/controller" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" +) + +type sysProjectTeamSquadController struct { + systemController.BaseController +} + +var SysProjectTeamSquad = new(sysProjectTeamSquadController) + +// List 列表 +func (c *sysProjectTeamSquadController) List(ctx context.Context, req *wxApplet.SysProjectTeamSquadSearchReq) (res *wxApplet.SysProjectTeamSquadSearchRes, err error) { + res, err = service.SysProjectTeamSquad().List(ctx, req) + return +} + +// Get 获取站班会 +func (c *sysProjectTeamSquadController) Get(ctx context.Context, req *wxApplet.SysProjectTeamSquadGetReq) (res *wxApplet.SysProjectTeamSquadGetRes, err error) { + res = new(wxApplet.SysProjectTeamSquadGetRes) + res.SysProjectTeamSquadInfoRes, err = service.SysProjectTeamSquad().GetById(ctx, req.Id) + return +} + +// Add 添加站班会 +func (c *sysProjectTeamSquadController) Add(ctx context.Context, req *wxApplet.SysProjectTeamSquadAddReq) (res *wxApplet.SysProjectTeamSquadAddRes, err error) { + err = service.SysProjectTeamSquad().Add(ctx, req) + return +} + +// Edit 修改站班会 +func (c *sysProjectTeamSquadController) Edit(ctx context.Context, req *wxApplet.SysProjectTeamSquadEditReq) (res *wxApplet.SysProjectTeamSquadEditRes, err error) { + err = service.SysProjectTeamSquad().Edit(ctx, req) + return +} + +// Delete 删除站班会 +func (c *sysProjectTeamSquadController) Delete(ctx context.Context, req *wxApplet.SysProjectTeamSquadDeleteReq) (res *wxApplet.SysProjectTeamSquadDeleteRes, err error) { + err = service.SysProjectTeamSquad().Delete(ctx, req.Ids) + return +} + +func (c *sysProjectTeamSquadController) Count(ctx context.Context, req *wxApplet.SysProjectTeamSquadCountReq) (res *wxApplet.SysProjectTeamSquadCountRes, err error) { + count, err := dao.SysProjectTeamSquad.Ctx(ctx).Count() + res.Number = count + return +} + +// List 列表 +func (c *sysProjectTeamSquadController) SelectByOpenidTeamSquadSearchFunc(ctx context.Context, req *wxApplet.SelectByOpenidTeamSquadSearchReq) (res *wxApplet.SelectByOpenidTeamSquadSearchRes, err error) { + res, err = service.SysProjectTeamSquad().SelectByOpenidTeamSquadSearch(ctx, req) + return +} diff --git a/internal/app/wxApplet/controller/sys_user_project_relevancy.go b/internal/app/wxApplet/controller/sys_user_project_relevancy.go new file mode 100644 index 0000000..0239f46 --- /dev/null +++ b/internal/app/wxApplet/controller/sys_user_project_relevancy.go @@ -0,0 +1,54 @@ +// ========================================================================== +// GFast自动生成controller操作代码。 +// 生成日期:2023-08-21 09:19:15 +// 生成路径: internal/app/wxApplet/controller/sys_user_project_relevancy.go +// 生成人:gfast +// desc:系统用户与项目关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package controller + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + systemController "github.com/tiger1103/gfast/v3/internal/app/system/controller" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" +) + +type sysUserProjectRelevancyController struct { + systemController.BaseController +} + +var SysUserProjectRelevancy = new(sysUserProjectRelevancyController) + +// List 列表 +func (c *sysUserProjectRelevancyController) List(ctx context.Context, req *wxApplet.SysUserProjectRelevancySearchReq) (res *wxApplet.SysUserProjectRelevancySearchRes, err error) { + res, err = service.SysUserProjectRelevancy().List(ctx, req) + return +} + +// Get 获取系统用户与项目关联 +func (c *sysUserProjectRelevancyController) Get(ctx context.Context, req *wxApplet.SysUserProjectRelevancyGetReq) (res *wxApplet.SysUserProjectRelevancyGetRes, err error) { + res = new(wxApplet.SysUserProjectRelevancyGetRes) + res.SysUserProjectRelevancyInfoRes, err = service.SysUserProjectRelevancy().GetById(ctx, req.Id) + return +} + +// Add 添加系统用户与项目关联 +func (c *sysUserProjectRelevancyController) Add(ctx context.Context, req *wxApplet.SysUserProjectRelevancyAddReq) (res *wxApplet.SysUserProjectRelevancyAddRes, err error) { + err = service.SysUserProjectRelevancy().Add(ctx, req) + return +} + +// Edit 修改系统用户与项目关联 +func (c *sysUserProjectRelevancyController) Edit(ctx context.Context, req *wxApplet.SysUserProjectRelevancyEditReq) (res *wxApplet.SysUserProjectRelevancyEditRes, err error) { + err = service.SysUserProjectRelevancy().Edit(ctx, req) + return +} + +// Delete 删除系统用户与项目关联 +func (c *sysUserProjectRelevancyController) Delete(ctx context.Context, req *wxApplet.SysUserProjectRelevancyDeleteReq) (res *wxApplet.SysUserProjectRelevancyDeleteRes, err error) { + err = service.SysUserProjectRelevancy().Delete(ctx, req.Ids) + return +} diff --git a/internal/app/wxApplet/controller/wx_login.go b/internal/app/wxApplet/controller/wx_login.go new file mode 100644 index 0000000..f1eef2a --- /dev/null +++ b/internal/app/wxApplet/controller/wx_login.go @@ -0,0 +1,200 @@ +package controller + +import ( + "context" + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/gogf/gf/v2/crypto/gmd5" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gctx" + "github.com/gogf/gf/v2/util/grand" + "github.com/medivhzhan/weapp/v3" + "github.com/medivhzhan/weapp/v3/auth" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + systemController "github.com/tiger1103/gfast/v3/internal/app/system/controller" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + se "github.com/tiger1103/gfast/v3/internal/app/system/service" + wxDao "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + wxModel "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model/do" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" + "github.com/tiger1103/gfast/v3/library/libUtils" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +type WXLoginController struct { + systemController.BaseController +} + +var WXLogin = new(WXLoginController) + +func (e *WXLoginController) BusLogin(ctx context.Context, req *wxApplet.LoginReq) (res *wxApplet.LoginRes, err error) { + res = &wxApplet.LoginRes{} + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + appId, err := g.Cfg().Get(gctx.New(), "wx.appId") + if err != nil { + return + } + appSecret, err := g.Cfg().Get(gctx.New(), "wx.appSecret") + if err != nil { + return + } + sdk := weapp.NewClient(appId.String(), appSecret.String()) + cli := sdk.NewAuth() + //// 登录凭证校验 + rsp, err := cli.Code2Session(&auth.Code2SessionRequest{ + Appid: appId.String(), + Secret: appSecret.String(), + JsCode: req.Code, + GrantType: "authorization_code", + }) + if err != nil { + return + } + if rsp.ErrCode != 0 { + err = rsp.GetResponseError() + return + } + user := wxApplet.BusConstructionUserAddReq{} + user.Openid = rsp.Openid + res.Openid = user.Openid + value, err := dao.BusConstructionUser.Ctx(ctx).Where("openid=?", user.Openid).Fields("head_icon").Value() + if err != nil { + return + } + result := 0 + if value != nil { + result = 1 + } + // 上传微信头像 + str, err := coryCommon.UploadFileTwo(ctx, req.HeadIcon, coryCommon.Helmet) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + replace := strings.Replace(str, "resource/public", "/wxfile", 1) + // 删除以前的头像 + if strings.Contains(value.String(), "/wxfile/") { + s := strings.Replace(value.String(), "/wxfile/", coryCommon.GetCWD()+"/resource/public/", 1) + os.Remove(filepath.ToSlash(s)) + } + if result == 0 { + // user.HeadIcon = req.HeadIcon + //user.NickName = req.NickName + //user.HeadIcon = replace + _, err := service.BusConstructionUser().Add(ctx, &user) + if err != nil { + return + } + } else { + _, err = dao.BusConstructionUser.Ctx(ctx).Data(g.Map{ + //"head_icon": req.HeadIcon, + "nick_name": req.NickName, + "head_icon": replace, + }).Where("openid=?", user.Openid).Update() + if err != nil { + return + } + } + res.Token = gettoken(ctx, user.Openid, user) + return + }) + return err + }) + return +} + +//func gettoken(ctx context.Context, openid string, user wxApplet.BusConstructionUserAddReq) string { +// key := gmd5.MustEncryptString(openid) +// token, err := se.GfToken().GenerateToken(ctx, key+key, user) +// fmt.Println("创建的token", token) +// fmt.Println(err) +// token = "Bearer " + token +// fmt.Println("更改的-----", token) +// return token +//} + +func gettoken(ctx context.Context, openid string, user wxApplet.BusConstructionUserAddReq) string { + encryptedKey := gmd5.MustEncryptString(openid) + + key := openid + "-" + encryptedKey + authToken, _ := se.GfToken().GenerateToken(ctx, key, user) + + return "Bearer " + authToken +} + +// IsBindApp 是否绑定 App +func (e *WXLoginController) IsBindApp(ctx context.Context, req *wxApplet.IsBindAppReq) (*wxApplet.IsBindAppRes, error) { + exist, err := dao.BusConstructionUser.Ctx(ctx).As("bcu"). + InnerJoin("sys_user AS su", `bcu.user_name COLLATE utf8mb4_general_ci = su.user_name COLLATE utf8mb4_general_ci + AND bcu.phone COLLATE utf8mb4_general_ci = su.mobile COLLATE utf8mb4_general_ci`). + Where("bcu.openid", req.Openid). + Count() + if err != nil { + return nil, err + } + + // 如果已绑定 App 则返回 1,否则返回 0 + if exist > 0 { + return &wxApplet.IsBindAppRes{IsBind: 1}, nil + } + + return &wxApplet.IsBindAppRes{IsBind: 0}, nil +} + +// AppletBindApp 小程序绑定 App +func (e *WXLoginController) AppletBindApp(ctx context.Context, req *wxApplet.AppletBindAppReq) (*wxApplet.AppletBindAppRes, error) { + // 获取小程序用户信息 + busConstructUser := entity.BusConstructionUser{} + if err := dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().Openid, req.Openid).Scan(&busConstructUser); err != nil { + return nil, err + } + + // 判断当前用户的手机号和用户名是否为空 + if busConstructUser.Phone == "" || busConstructUser.UserName == "" { + return nil, fmt.Errorf("当前用户的手机号和用户名为空") + } + + exist, err := dao.SysUser.Ctx(ctx).Where(dao.SysUser.Columns().UserNickname, busConstructUser.UserName). + Where(dao.SysUser.Columns().Mobile, busConstructUser.Phone).Count() + if err != nil { + return nil, err + } + + // 判断是否已绑定 App + if exist > 0 { + return nil, fmt.Errorf("当前用户已经绑定了 App") + } + + passwordSalt := grand.S(10) // 密码盐值 + encryptedPassword := libUtils.EncryptPassword(req.Password, passwordSalt) // 加密密码 + + err = g.Try(ctx, func(ctx context.Context) { + // 创建用户 + userId, err := dao.SysUser.Ctx(ctx).InsertAndGetId(do.SysUser{ + UserName: busConstructUser.UserName, // 用户名 + UserNickname: busConstructUser.NickName, // 用户昵称 + Mobile: busConstructUser.Phone, // 手机号 + UserPassword: encryptedPassword, // 密码 + UserSalt: passwordSalt, // 密码盐 + Sex: busConstructUser.Sex, // 性别 + }) + liberr.ErrIsNil(ctx, err, "创建用户失败") + + // 关联后台项目 + _, err = wxDao.SysUserProjectRelevancy.Ctx(ctx).Insert(wxModel.SysUserProjectRelevancy{ + UserId: userId, // 用户 ID + ProjectId: busConstructUser.ProjectId, // 项目 ID + }) + liberr.ErrIsNil(ctx, err, "关联后台管理项目失败") + }) + + return nil, nil +} diff --git a/internal/app/wxApplet/dao/bus_askforleave.go b/internal/app/wxApplet/dao/bus_askforleave.go new file mode 100644 index 0000000..739685b --- /dev/null +++ b/internal/app/wxApplet/dao/bus_askforleave.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2025-03-27 14:14:25 +// 生成路径: internal/app/wxApplet/dao/bus_askforleave.go +// 生成人:gfast +// desc:请假 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao/internal" +) + +// busAskforleaveDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busAskforleaveDao struct { + *internal.BusAskforleaveDao +} + +var ( + // BusAskforleave is globally public accessible object for table tools_gen_table operations. + BusAskforleave = busAskforleaveDao{ + internal.NewBusAskforleaveDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/wxApplet/dao/bus_attendance.go b/internal/app/wxApplet/dao/bus_attendance.go new file mode 100644 index 0000000..b1a0370 --- /dev/null +++ b/internal/app/wxApplet/dao/bus_attendance.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-07 16:29:52 +// 生成路径: internal/app/wxApplet/dao/bus_attendance.go +// 生成人:gfast +// desc:考勤 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao/internal" +) + +// busAttendanceDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busAttendanceDao struct { + *internal.BusAttendanceDao +} + +var ( + // BusAttendance is globally public accessible object for table tools_gen_table operations. + BusAttendance = busAttendanceDao{ + internal.NewBusAttendanceDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/wxApplet/dao/bus_construction_project.go b/internal/app/wxApplet/dao/bus_construction_project.go new file mode 100644 index 0000000..34f1166 --- /dev/null +++ b/internal/app/wxApplet/dao/bus_construction_project.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-07 11:17:50 +// 生成路径: internal/app/wxApplet/dao/bus_construction_project.go +// 生成人:gfast +// desc:施工人员对应项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao/internal" +) + +// busConstructionProjectDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busConstructionProjectDao struct { + *internal.BusConstructionProjectDao +} + +var ( + // BusConstructionProject is globally public accessible object for table tools_gen_table operations. + BusConstructionProject = busConstructionProjectDao{ + internal.NewBusConstructionProjectDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/wxApplet/dao/bus_construction_user.go b/internal/app/wxApplet/dao/bus_construction_user.go new file mode 100644 index 0000000..c594e52 --- /dev/null +++ b/internal/app/wxApplet/dao/bus_construction_user.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-07 11:17:50 +// 生成路径: internal/app/wxApplet/dao/bus_construction_user.go +// 生成人:gfast +// desc:施工人员 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao/internal" +) + +// busConstructionUserDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busConstructionUserDao struct { + *internal.BusConstructionUserDao +} + +var ( + // BusConstructionUser is globally public accessible object for table tools_gen_table operations. + BusConstructionUser = busConstructionUserDao{ + internal.NewBusConstructionUserDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/wxApplet/dao/bus_construction_user_file.go b/internal/app/wxApplet/dao/bus_construction_user_file.go new file mode 100644 index 0000000..6fca28d --- /dev/null +++ b/internal/app/wxApplet/dao/bus_construction_user_file.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-07 11:17:55 +// 生成路径: internal/app/wxApplet/dao/bus_construction_user_file.go +// 生成人:gfast +// desc:微信用户的文件存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao/internal" +) + +// busConstructionUserFileDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busConstructionUserFileDao struct { + *internal.BusConstructionUserFileDao +} + +var ( + // BusConstructionUserFile is globally public accessible object for table tools_gen_table operations. + BusConstructionUserFile = busConstructionUserFileDao{ + internal.NewBusConstructionUserFileDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/wxApplet/dao/bus_construction_user_post.go b/internal/app/wxApplet/dao/bus_construction_user_post.go new file mode 100644 index 0000000..219807b --- /dev/null +++ b/internal/app/wxApplet/dao/bus_construction_user_post.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-07 11:17:55 +// 生成路径: internal/app/wxApplet/dao/bus_construction_user_post.go +// 生成人:gfast +// desc:施工人员岗位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao/internal" +) + +// busConstructionUserPostDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busConstructionUserPostDao struct { + *internal.BusConstructionUserPostDao +} + +var ( + // BusConstructionUserPost is globally public accessible object for table tools_gen_table operations. + BusConstructionUserPost = busConstructionUserPostDao{ + internal.NewBusConstructionUserPostDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/wxApplet/dao/bus_labourservice.go b/internal/app/wxApplet/dao/bus_labourservice.go new file mode 100644 index 0000000..b62fde9 --- /dev/null +++ b/internal/app/wxApplet/dao/bus_labourservice.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-14 11:24:31 +// 生成路径: internal/app/wxApplet/dao/bus_labourservice.go +// 生成人:gfast +// desc:劳务公司 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao/internal" +) + +// busLabourserviceDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type busLabourserviceDao struct { + *internal.BusLabourserviceDao +} + +var ( + // BusLabourservice is globally public accessible object for table tools_gen_table operations. + BusLabourservice = busLabourserviceDao{ + internal.NewBusLabourserviceDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/wxApplet/dao/internal/bus_askforleave.go b/internal/app/wxApplet/dao/internal/bus_askforleave.go new file mode 100644 index 0000000..bd72a79 --- /dev/null +++ b/internal/app/wxApplet/dao/internal/bus_askforleave.go @@ -0,0 +1,120 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2025-03-27 14:14:25 +// 生成路径: internal/app/wxApplet/dao/internal/bus_askforleave.go +// 生成人:gfast +// desc:请假 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusAskforleaveDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusAskforleaveDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusAskforleaveColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusAskforleaveColumns defines and stores column names for table bus_askforleave. +type BusAskforleaveColumns struct { + Id string // 主键ID + ProjectId string // 项目ID + ProjectName string // 项目名称 + TeamId string // 班组ID + TeamName string // 班组名称 + StartTime string // 开始时间 + EndTime string // 结束时间 + Argument string // 请假理由 + Ganger string // 班组长 + GangerOpinion string // 班组长意见(1未读 2同意 3拒绝) + GangerExplain string // 拒绝理由 + GangerTime string // 班组长操作时间 + Manager string // 管理员 + ManagerOpinion string // 管理员意见(1未读 2同意 3拒绝) + ManagerExplain string // 拒绝理由 + ManagerTime string // 管理员操作时间 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + Remark string // 备注 + Openid string // 备注 +} + +var busAskforleaveColumns = BusAskforleaveColumns{ + Id: "id", + ProjectId: "project_id", + ProjectName: "project_name", + TeamId: "team_id", + TeamName: "team_name", + StartTime: "start time", + EndTime: "end_time", + Argument: "argument", + Ganger: "ganger", + GangerOpinion: "ganger_opinion", + GangerExplain: "ganger_explain", + GangerTime: "ganger_time", + Manager: "manager", + ManagerOpinion: "manager_opinion", + ManagerExplain: "manager_explain", + ManagerTime: "manager_time", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + Remark: "remark", + Openid: "openid", +} + +// NewBusAskforleaveDao creates and returns a new DAO object for table data access. +func NewBusAskforleaveDao() *BusAskforleaveDao { + return &BusAskforleaveDao{ + group: "default", + table: "bus_askforleave", + columns: busAskforleaveColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusAskforleaveDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusAskforleaveDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusAskforleaveDao) Columns() BusAskforleaveColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusAskforleaveDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusAskforleaveDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusAskforleaveDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/wxApplet/dao/internal/bus_attendance.go b/internal/app/wxApplet/dao/internal/bus_attendance.go new file mode 100644 index 0000000..1e424a4 --- /dev/null +++ b/internal/app/wxApplet/dao/internal/bus_attendance.go @@ -0,0 +1,110 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-07 16:29:52 +// 生成路径: internal/app/wxApplet/dao/internal/bus_attendance.go +// 生成人:gfast +// desc:考勤 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusAttendanceDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusAttendanceDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusAttendanceColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusAttendanceColumns defines and stores column names for table bus_attendance. +type BusAttendanceColumns struct { + Id string // 序号 + UserName string // 人员姓名 + PacePhoto string // 人脸照 + ProjectId string // 项目id + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + ClockOn string // 上午打卡 + ClockOff string // 下午打卡 + PrintingDate string // 年月日打卡时间 + IsPinch string // 打卡状态 + Openid string // 微信id + PinchOpenId string // 代打id + ClockRecord string // 多次打卡时间记录 + PinchUserName string // 代打人姓名 + Commuter string // 上下班(1上班2下班) +} + +var busAttendanceColumns = BusAttendanceColumns{ + Id: "id", + UserName: "user_name", + PacePhoto: "pace_photo", + ProjectId: "project_id", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + ClockOn: "clock_on", + ClockOff: "clock_off", + PrintingDate: "printing_date", + IsPinch: "is_pinch", + Openid: "openid", + PinchOpenId: "pinch_openId", + ClockRecord: "clock_record", + PinchUserName: "pinch_user_name", + Commuter: "commuter", +} + +// NewBusAttendanceDao creates and returns a new DAO object for table data access. +func NewBusAttendanceDao() *BusAttendanceDao { + return &BusAttendanceDao{ + group: "default", + table: "bus_attendance", + columns: busAttendanceColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusAttendanceDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusAttendanceDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusAttendanceDao) Columns() BusAttendanceColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusAttendanceDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusAttendanceDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusAttendanceDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/wxApplet/dao/internal/bus_construction_project.go b/internal/app/wxApplet/dao/internal/bus_construction_project.go new file mode 100644 index 0000000..a23b940 --- /dev/null +++ b/internal/app/wxApplet/dao/internal/bus_construction_project.go @@ -0,0 +1,80 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-07 11:17:50 +// 生成路径: internal/app/wxApplet/dao/internal/bus_construction_project.go +// 生成人:gfast +// desc:施工人员对应项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusConstructionProjectDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusConstructionProjectDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusConstructionProjectColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusConstructionProjectColumns defines and stores column names for table bus_construction_project. +type BusConstructionProjectColumns struct { + Id string // 序号 + ConstructionUserId string // 微信用户id + ProjectId string // 项目id +} + +var busConstructionProjectColumns = BusConstructionProjectColumns{ + Id: "id", + ConstructionUserId: "construction_user_id", + ProjectId: "project_id", +} + +// NewBusConstructionProjectDao creates and returns a new DAO object for table data access. +func NewBusConstructionProjectDao() *BusConstructionProjectDao { + return &BusConstructionProjectDao{ + group: "default", + table: "bus_construction_project", + columns: busConstructionProjectColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusConstructionProjectDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusConstructionProjectDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusConstructionProjectDao) Columns() BusConstructionProjectColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusConstructionProjectDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusConstructionProjectDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusConstructionProjectDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/wxApplet/dao/internal/bus_construction_user.go b/internal/app/wxApplet/dao/internal/bus_construction_user.go new file mode 100644 index 0000000..a0cd845 --- /dev/null +++ b/internal/app/wxApplet/dao/internal/bus_construction_user.go @@ -0,0 +1,133 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-07 11:17:50 +// 生成路径: internal/app/wxApplet/dao/internal/bus_construction_user.go +// 生成人:gfast +// desc:施工人员 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusConstructionUserDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusConstructionUserDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusConstructionUserColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusConstructionUserColumns defines and stores column names for table bus_construction_user. +type BusConstructionUserColumns struct { + Id string // 序号 + Openid string // 微信id + NickName string // 微信名称 + TeamId string // 班组id + HeadIcon string // 登陆照片 + PacePhoto string // 人脸照 + UserName string // 人员姓名 + ProjectId string // 项目id + Status string // 状态 + WxOrPc string // 状态 + IsPinch string // 是否代打 + IfManagement string // 是否班组管理 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + Phone string // 电话 + Sex string // 性别 + SfzNation string // 身份证民族 + SfzNumber string // 身份证号码 + SfzStart string // 身份证有效开始期 + SfzEnd string // 身份证有效结束期 + SfzSite string // 身份证地址 + NativePlace string // 籍贯 + YhkNumber string // 银行卡号 + YhkOpeningBank string // 开户行 + YhkCardholder string // 持卡人 + TypeOfWork string // 持卡人 + LabourserviceId string // 劳务公司ID +} + +var busConstructionUserColumns = BusConstructionUserColumns{ + Id: "id", + Openid: "openid", + NickName: "nick_name", + TeamId: "team_id", + HeadIcon: "head_icon", + PacePhoto: "pace_photo", + UserName: "user_name", + ProjectId: "project_id", + Status: "status", + IsPinch: "is_pinch", + IfManagement: "if_management", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + Phone: "phone", + Sex: "sex", + SfzNation: "sfz_nation", + SfzNumber: "sfz_number", + SfzStart: "sfz_start", + SfzEnd: "sfz_end", + SfzSite: "sfz_site", + NativePlace: "native_place", + YhkNumber: "yhk_number", + YhkOpeningBank: "yhk_opening_bank", + YhkCardholder: "yhk_cardholder", + TypeOfWork: "type_of_work", + LabourserviceId: "labourservice_id", +} + +// NewBusConstructionUserDao creates and returns a new DAO object for table data access. +func NewBusConstructionUserDao() *BusConstructionUserDao { + return &BusConstructionUserDao{ + group: "default", + table: "bus_construction_user", + columns: busConstructionUserColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusConstructionUserDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusConstructionUserDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusConstructionUserDao) Columns() BusConstructionUserColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusConstructionUserDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusConstructionUserDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusConstructionUserDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/wxApplet/dao/internal/bus_construction_user_file.go b/internal/app/wxApplet/dao/internal/bus_construction_user_file.go new file mode 100644 index 0000000..10038d5 --- /dev/null +++ b/internal/app/wxApplet/dao/internal/bus_construction_user_file.go @@ -0,0 +1,94 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-07 11:17:55 +// 生成路径: internal/app/wxApplet/dao/internal/bus_construction_user_file.go +// 生成人:gfast +// desc:微信用户的文件存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusConstructionUserFileDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusConstructionUserFileDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusConstructionUserFileColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusConstructionUserFileColumns defines and stores column names for table bus_construction_user_file. +type BusConstructionUserFileColumns struct { + Id string // 主键ID + UserId string // 用户id + UserImgType string // 图片类型 + Path string // 图片路径 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + Remark string // 备注 +} + +var busConstructionUserFileColumns = BusConstructionUserFileColumns{ + Id: "id", + UserId: "user_id", + UserImgType: "user_img_type", + Path: "path", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + Remark: "remark", +} + +// NewBusConstructionUserFileDao creates and returns a new DAO object for table data access. +func NewBusConstructionUserFileDao() *BusConstructionUserFileDao { + return &BusConstructionUserFileDao{ + group: "default", + table: "bus_construction_user_file", + columns: busConstructionUserFileColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusConstructionUserFileDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusConstructionUserFileDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusConstructionUserFileDao) Columns() BusConstructionUserFileColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusConstructionUserFileDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusConstructionUserFileDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusConstructionUserFileDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/wxApplet/dao/internal/bus_construction_user_post.go b/internal/app/wxApplet/dao/internal/bus_construction_user_post.go new file mode 100644 index 0000000..f9edaac --- /dev/null +++ b/internal/app/wxApplet/dao/internal/bus_construction_user_post.go @@ -0,0 +1,80 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-07 11:17:55 +// 生成路径: internal/app/wxApplet/dao/internal/bus_construction_user_post.go +// 生成人:gfast +// desc:施工人员岗位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusConstructionUserPostDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusConstructionUserPostDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusConstructionUserPostColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusConstructionUserPostColumns defines and stores column names for table bus_construction_user_post. +type BusConstructionUserPostColumns struct { + Id string // 序号 + ConstructionUserId string // 施工人员id + PostId string // 岗位id +} + +var busConstructionUserPostColumns = BusConstructionUserPostColumns{ + Id: "id", + ConstructionUserId: "construction_user_id", + PostId: "post_id", +} + +// NewBusConstructionUserPostDao creates and returns a new DAO object for table data access. +func NewBusConstructionUserPostDao() *BusConstructionUserPostDao { + return &BusConstructionUserPostDao{ + group: "default", + table: "bus_construction_user_post", + columns: busConstructionUserPostColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusConstructionUserPostDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusConstructionUserPostDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusConstructionUserPostDao) Columns() BusConstructionUserPostColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusConstructionUserPostDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusConstructionUserPostDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusConstructionUserPostDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/wxApplet/dao/internal/bus_labourservice.go b/internal/app/wxApplet/dao/internal/bus_labourservice.go new file mode 100644 index 0000000..f93ca66 --- /dev/null +++ b/internal/app/wxApplet/dao/internal/bus_labourservice.go @@ -0,0 +1,94 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-14 11:24:31 +// 生成路径: internal/app/wxApplet/dao/internal/bus_labourservice.go +// 生成人:gfast +// desc:劳务公司 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// BusLabourserviceDao is the manager for logic model data accessing and custom defined data operations functions management. +type BusLabourserviceDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns BusLabourserviceColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// BusLabourserviceColumns defines and stores column names for table bus_labourservice. +type BusLabourserviceColumns struct { + Id string // 主键ID + Name string // 劳务公司 + Principal string // 负责人 + Phone string // 联系电话 + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + Remark string // 备注 +} + +var busLabourserviceColumns = BusLabourserviceColumns{ + Id: "id", + Name: "name", + Principal: "principal", + Phone: "phone", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", + Remark: "remark", +} + +// NewBusLabourserviceDao creates and returns a new DAO object for table data access. +func NewBusLabourserviceDao() *BusLabourserviceDao { + return &BusLabourserviceDao{ + group: "default", + table: "bus_labourservice", + columns: busLabourserviceColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *BusLabourserviceDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *BusLabourserviceDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *BusLabourserviceDao) Columns() BusLabourserviceColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *BusLabourserviceDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *BusLabourserviceDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *BusLabourserviceDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/wxApplet/dao/internal/sys_project_team.go b/internal/app/wxApplet/dao/internal/sys_project_team.go new file mode 100644 index 0000000..42d4232 --- /dev/null +++ b/internal/app/wxApplet/dao/internal/sys_project_team.go @@ -0,0 +1,90 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-15 09:34:52 +// 生成路径: internal/app/wxApplet/dao/internal/sys_project_team.go +// 生成人:gfast +// desc:项目班组 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysProjectTeamDao is the manager for logic model data accessing and custom defined data operations functions management. +type SysProjectTeamDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns SysProjectTeamColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// SysProjectTeamColumns defines and stores column names for table sys_project_team. +type SysProjectTeamColumns struct { + Id string // 主键ID + ProjectId string // 项目id + Name string // 班组名称 + CreateBy string // 创建者 + UpdateBy string // 更新者 + CreateTime string // 创建时间 + UpdateTime string // 更新时间 + DeletedAt string // 删除时间 +} + +var sysProjectTeamColumns = SysProjectTeamColumns{ + Id: "id", + ProjectId: "project_id", + Name: "name", + CreateBy: "create_by", + UpdateBy: "update_by", + CreateTime: "create_time", + UpdateTime: "update_time", + DeletedAt: "deleted_at", +} + +// NewSysProjectTeamDao creates and returns a new DAO object for table data access. +func NewSysProjectTeamDao() *SysProjectTeamDao { + return &SysProjectTeamDao{ + group: "default", + table: "sys_project_team", + columns: sysProjectTeamColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysProjectTeamDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysProjectTeamDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysProjectTeamDao) Columns() SysProjectTeamColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysProjectTeamDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysProjectTeamDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysProjectTeamDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/wxApplet/dao/internal/sys_project_team_member.go b/internal/app/wxApplet/dao/internal/sys_project_team_member.go new file mode 100644 index 0000000..b7b0e51 --- /dev/null +++ b/internal/app/wxApplet/dao/internal/sys_project_team_member.go @@ -0,0 +1,90 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-15 09:34:52 +// 生成路径: internal/app/wxApplet/dao/internal/sys_project_team_member.go +// 生成人:gfast +// desc:项目班组下的成员 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysProjectTeamMemberDao is the manager for logic model data accessing and custom defined data operations functions management. +type SysProjectTeamMemberDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns SysProjectTeamMemberColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// SysProjectTeamMemberColumns defines and stores column names for table sys_project_team_member. +type SysProjectTeamMemberColumns struct { + Id string // 主键ID + TeamId string // 班组id + Openid string // 微信用户标识 + PostId string // 岗位(默认为4普通员工,组长为10) + ProjectId string // 项目id + CreateTime string // 创建时间 + UpdateTime string // 更新时间 + DeletedAt string // 删除时间 +} + +var sysProjectTeamMemberColumns = SysProjectTeamMemberColumns{ + Id: "id", + TeamId: "team_id", + Openid: "openid", + PostId: "post_id", + ProjectId: "project_id", + CreateTime: "create_time", + UpdateTime: "update_time", + DeletedAt: "deleted_at", +} + +// NewSysProjectTeamMemberDao creates and returns a new DAO object for table data access. +func NewSysProjectTeamMemberDao() *SysProjectTeamMemberDao { + return &SysProjectTeamMemberDao{ + group: "default", + table: "sys_project_team_member", + columns: sysProjectTeamMemberColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysProjectTeamMemberDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysProjectTeamMemberDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysProjectTeamMemberDao) Columns() SysProjectTeamMemberColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysProjectTeamMemberDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysProjectTeamMemberDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysProjectTeamMemberDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/wxApplet/dao/internal/sys_project_team_squad.go b/internal/app/wxApplet/dao/internal/sys_project_team_squad.go new file mode 100644 index 0000000..d811243 --- /dev/null +++ b/internal/app/wxApplet/dao/internal/sys_project_team_squad.go @@ -0,0 +1,99 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-30 15:24:06 +// 生成路径: internal/app/wxApplet/dao/internal/sys_project_team_squad.go +// 生成人:gfast +// desc:站班会 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysProjectTeamSquadDao is the manager for logic model data accessing and custom defined data operations functions management. +type SysProjectTeamSquadDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns SysProjectTeamSquadColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// SysProjectTeamSquadColumns defines and stores column names for table sys_project_team_squad. +type SysProjectTeamSquadColumns struct { + Id string // 主键ID + TeamId string // 班组ID + MeetingDate string // 开会时间 + CompereId string // 宣讲人 + ParticipantId string // 参与人ID(多个用,号隔开) + Content string // 班会内容 + Picture string // 班会图片(多个用,号隔开) + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 + ProjectId string // 删除时间 +} + +var sysProjectTeamSquadColumns = SysProjectTeamSquadColumns{ + Id: "id", + TeamId: "team_id", + MeetingDate: "meeting_date", + CompereId: "compere_id", + ParticipantId: "participant_id", + Content: "content", + Picture: "picture", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + ProjectId: "project_id", +} + +// NewSysProjectTeamSquadDao creates and returns a new DAO object for table data access. +func NewSysProjectTeamSquadDao() *SysProjectTeamSquadDao { + return &SysProjectTeamSquadDao{ + group: "default", + table: "sys_project_team_squad", + columns: sysProjectTeamSquadColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysProjectTeamSquadDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysProjectTeamSquadDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysProjectTeamSquadDao) Columns() SysProjectTeamSquadColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysProjectTeamSquadDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysProjectTeamSquadDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysProjectTeamSquadDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/wxApplet/dao/internal/sys_user_project_relevancy.go b/internal/app/wxApplet/dao/internal/sys_user_project_relevancy.go new file mode 100644 index 0000000..e8d5684 --- /dev/null +++ b/internal/app/wxApplet/dao/internal/sys_user_project_relevancy.go @@ -0,0 +1,90 @@ +// ========================================================================== +// GFast自动生成dao internal操作代码。 +// 生成日期:2023-08-21 09:19:15 +// 生成路径: internal/app/wxApplet/dao/internal/sys_user_project_relevancy.go +// 生成人:gfast +// desc:系统用户与项目关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package internal + +import ( + "context" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// SysUserProjectRelevancyDao is the manager for logic model data accessing and custom defined data operations functions management. +type SysUserProjectRelevancyDao struct { + table string // Table is the underlying table name of the DAO. + group string // Group is the database configuration group name of current DAO. + columns SysUserProjectRelevancyColumns // Columns is the short type for Columns, which contains all the column names of Table for convenient usage. +} + +// SysUserProjectRelevancyColumns defines and stores column names for table sys_user_project_relevancy. +type SysUserProjectRelevancyColumns struct { + Id string // 主键ID + UserId string // 用户ID + ProjectId string // 项目ID + CreateBy string // 创建人 + UpdateBy string // 更新人 + CreatedAt string // 创建时间 + UpdatedAt string // 更新时间 + DeletedAt string // 删除时间 +} + +var sysUserProjectRelevancyColumns = SysUserProjectRelevancyColumns{ + Id: "id", + UserId: "user_id", + ProjectId: "project_id", + CreateBy: "create_by", + UpdateBy: "update_by", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + DeletedAt: "deleted_at", +} + +// NewSysUserProjectRelevancyDao creates and returns a new DAO object for table data access. +func NewSysUserProjectRelevancyDao() *SysUserProjectRelevancyDao { + return &SysUserProjectRelevancyDao{ + group: "default", + table: "sys_user_project_relevancy", + columns: sysUserProjectRelevancyColumns, + } +} + +// DB retrieves and returns the underlying raw database management object of current DAO. +func (dao *SysUserProjectRelevancyDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of current dao. +func (dao *SysUserProjectRelevancyDao) Table() string { + return dao.table +} + +// Columns returns all column names of current dao. +func (dao *SysUserProjectRelevancyDao) Columns() SysUserProjectRelevancyColumns { + return dao.columns +} + +// Group returns the configuration group name of database of current dao. +func (dao *SysUserProjectRelevancyDao) Group() string { + return dao.group +} + +// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation. +func (dao *SysUserProjectRelevancyDao) Ctx(ctx context.Context) *gdb.Model { + return dao.DB().Model(dao.table).Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rollbacks the transaction and returns the error from function f if it returns non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note that, you should not Commit or Rollback the transaction in function f +// as it is automatically handled by this function. +func (dao *SysUserProjectRelevancyDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/app/wxApplet/dao/sys_project_team.go b/internal/app/wxApplet/dao/sys_project_team.go new file mode 100644 index 0000000..31286b5 --- /dev/null +++ b/internal/app/wxApplet/dao/sys_project_team.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-15 09:34:52 +// 生成路径: internal/app/wxApplet/dao/sys_project_team.go +// 生成人:gfast +// desc:项目班组 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao/internal" +) + +// sysProjectTeamDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type sysProjectTeamDao struct { + *internal.SysProjectTeamDao +} + +var ( + // SysProjectTeam is globally public accessible object for table tools_gen_table operations. + SysProjectTeam = sysProjectTeamDao{ + internal.NewSysProjectTeamDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/wxApplet/dao/sys_project_team_member.go b/internal/app/wxApplet/dao/sys_project_team_member.go new file mode 100644 index 0000000..741755d --- /dev/null +++ b/internal/app/wxApplet/dao/sys_project_team_member.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-15 09:34:52 +// 生成路径: internal/app/wxApplet/dao/sys_project_team_member.go +// 生成人:gfast +// desc:项目班组下的成员 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao/internal" +) + +// sysProjectTeamMemberDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type sysProjectTeamMemberDao struct { + *internal.SysProjectTeamMemberDao +} + +var ( + // SysProjectTeamMember is globally public accessible object for table tools_gen_table operations. + SysProjectTeamMember = sysProjectTeamMemberDao{ + internal.NewSysProjectTeamMemberDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/wxApplet/dao/sys_project_team_squad.go b/internal/app/wxApplet/dao/sys_project_team_squad.go new file mode 100644 index 0000000..ed314f5 --- /dev/null +++ b/internal/app/wxApplet/dao/sys_project_team_squad.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-30 15:24:06 +// 生成路径: internal/app/wxApplet/dao/sys_project_team_squad.go +// 生成人:gfast +// desc:站班会 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao/internal" +) + +// sysProjectTeamSquadDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type sysProjectTeamSquadDao struct { + *internal.SysProjectTeamSquadDao +} + +var ( + // SysProjectTeamSquad is globally public accessible object for table tools_gen_table operations. + SysProjectTeamSquad = sysProjectTeamSquadDao{ + internal.NewSysProjectTeamSquadDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/wxApplet/dao/sys_user_project_relevancy.go b/internal/app/wxApplet/dao/sys_user_project_relevancy.go new file mode 100644 index 0000000..395ba94 --- /dev/null +++ b/internal/app/wxApplet/dao/sys_user_project_relevancy.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成dao操作代码。 +// 生成日期:2023-08-21 09:19:14 +// 生成路径: internal/app/wxApplet/dao/sys_user_project_relevancy.go +// 生成人:gfast +// desc:系统用户与项目关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package dao + +import ( + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao/internal" +) + +// sysUserProjectRelevancyDao is the manager for logic model data accessing and custom defined data operations functions management. +// You can define custom methods on it to extend its functionality as you wish. +type sysUserProjectRelevancyDao struct { + *internal.SysUserProjectRelevancyDao +} + +var ( + // SysUserProjectRelevancy is globally public accessible object for table tools_gen_table operations. + SysUserProjectRelevancy = sysUserProjectRelevancyDao{ + internal.NewSysUserProjectRelevancyDao(), + } +) + +// Fill with you ideas below. diff --git a/internal/app/wxApplet/logic/busAskforleave/bus_askforleave.go b/internal/app/wxApplet/logic/busAskforleave/bus_askforleave.go new file mode 100644 index 0000000..8b91539 --- /dev/null +++ b/internal/app/wxApplet/logic/busAskforleave/bus_askforleave.go @@ -0,0 +1,406 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2025-03-27 14:14:25 +// 生成路径: internal/app/wxApplet/logic/bus_askforleave.go +// 生成人:gfast +// desc:请假 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + sysDao "github.com/tiger1103/gfast/v3/internal/app/system/dao" + logic "github.com/tiger1103/gfast/v3/internal/app/system/logic/busReissueACard" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model/do" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "github.com/tiger1103/gfast/v3/third/todo" + "strconv" +) + +func init() { + service.RegisterBusAskforleave(New()) +} + +func New() *sBusAskforleave { + return &sBusAskforleave{} +} + +type sBusAskforleave struct{} + +func (s *sBusAskforleave) AppBzzAskForLeaveUpdate(ctx context.Context, req *wxApplet.AppBzzAskForLeaveUpdateReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 获取当前数据的班组,然后根据班组获取到班组长的openid + var aCard model.BusAskforleaveInfoRes + err := dao.BusAskforleave.Ctx(ctx).WherePri(req.Id).Fields("id,openid,team_id,project_id").Scan(&aCard) + liberr.ErrIsNil(ctx, err) + fields, err := dao.SysProjectTeamMember.Ctx(ctx). + Where("team_id", aCard.TeamId). + Where("post_id", 10). + Fields("openid").Value() + liberr.ErrIsNil(ctx, err) + if fields.String() == "" { + err = errors.New("变更失败,申请人所在的班组未设置班组长") + return + } + UpdateG2 := g.Map{"ganger": fields, "ganger_opinion": req.GangerOpinion, "ganger_explain": req.GangerExplain, "ganger_time": gtime.Now()} + if req.GangerOpinion == "3" { + UpdateG2["attendance_id"] = nil + } + // 变更班组长对补卡的状态,并且填写班组长的openid + _, err = dao.BusAskforleave.Ctx(ctx).OmitEmpty().WherePri(req.Id).Update(UpdateG2) + liberr.ErrIsNil(ctx, err, "变更班组长失败") + // 标记特定的待办任务为已处理 + err = todo.MarkTaskAsProcessed(int(req.Id)) + // 然后将数据提交给管理员操作 + ids, err := logic.GetAdministrator(ctx, aCard.ProjectId) + liberr.ErrIsNil(ctx, err) + if len(ids) == 0 { + liberr.ErrIsNil(ctx, errors.New("当前项目暂无后台管理人员可以进行审批,需要联系管理人员解决!")) + return + } + var listReissueReminder []todo.ReissueReminder + for i := range ids { + listReissueReminder = append(listReissueReminder, todo.ReissueReminder{ + UserID: strconv.Itoa(int(ids[i])), + Role: 0, + ProjectID: int(aCard.ProjectId), + CreatorID: aCard.Openid, + TargetID: int(aCard.Id), + }) + } + err = todo.CreateAttendanceApprovalGroup(listReissueReminder, todo.ApprovalReminder) + liberr.ErrIsNil(ctx, err) + }) + return err + }) + return +} + +func (s *sBusAskforleave) AppAskForLeaveInfo(ctx context.Context, req *wxApplet.AppAskForLeaveInfoReq) (res *wxApplet.AppAskForLeaveInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusAskforleave.Ctx(ctx).WithAll().As("a"). + LeftJoin(dao.BusConstructionUser.Table(), "b", "b.openid = a.openid"). + Fields("a.*,b.user_name"). + Where("a."+dao.BusAskforleave.Columns().Id, req.Id). + Scan(&res) + // 获取班组长的名称和管理员名称 + if res.Ganger != "" { + var busUser *model.BusConstructionUserInfoRes + err = dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().Openid, res.Ganger).Fields("user_name").Scan(&busUser) + liberr.ErrIsNil(ctx, err) + res.GangerName = busUser.UserName + } + if res.Manager != "" { + var busUser *model.BusConstructionUserInfoRes + err = sysDao.SysUser.Ctx(ctx).Where(sysDao.SysUser.Columns().Id, res.Manager).Fields("user_nickname").Scan(&busUser) + liberr.ErrIsNil(ctx, err) + res.ManagerName = busUser.UserName + } + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusAskforleave) AppAskForLeaveListPage(ctx context.Context, req *wxApplet.AppAskForLeaveListPageReq) (listRes *wxApplet.AppAskForLeaveListPageRes, err error) { + listRes = new(wxApplet.AppAskForLeaveListPageRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusAskforleave.Ctx(ctx).WithAll().As("a"). + LeftJoin(dao.BusConstructionUser.Table(), "b", "b.openid = a.openid") + if req.Openid != "" { + m = m.Where("a."+dao.BusAskforleave.Columns().Openid+" = ?", req.Openid) + } + if req.ProjectId != "" { + m = m.Where("a."+dao.BusAskforleave.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + if req.TeamId != "" { + m = m.Where("a."+dao.BusAskforleave.Columns().TeamId+" = ?", gconv.Int64(req.TeamId)) + } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.BusAskforleave.Columns().CreatedAt+" >=? AND "+"a."+dao.BusAskforleave.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusAskforleaveListAppRes + err = m.Fields("a.*,b.user_name").Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = res + }) + return +} + +func (s *sBusAskforleave) AppAskForLeaveAdd(ctx context.Context, req *wxApplet.AppAskForLeaveAddReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 1、根据openid获取到当前小程序用户所在班组的班组长 + var busUser *model.BusConstructionUserInfoRes + err := dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().Openid, req.Openid).Fields("project_id,team_id").Scan(&busUser) + liberr.ErrIsNil(ctx, err, "添加失败") + if busUser == nil || busUser.TeamId == 0 { + liberr.ErrIsNil(ctx, err, "请先加入班组!") + } + //2、获取项目名称、班组名称 + columnsP := sysDao.SysProject.Columns() + valueP, projectNameErr := sysDao.SysProject.Ctx(ctx).Where(columnsP.Id, busUser.ProjectId).Fields(columnsP.ProjectName).Value() + liberr.ErrIsNil(ctx, projectNameErr, "获取项目失败") + columnsT := dao.SysProjectTeam.Columns() + valueT, teamNameErr := dao.SysProjectTeam.Ctx(ctx).Where(columnsT.Id, busUser.TeamId).Fields(columnsT.Name).Value() + liberr.ErrIsNil(ctx, teamNameErr, "获取班组失败") + // 判断当前请假的时间是否重复请假 + count, err := dao.BusAskforleave.Ctx(ctx). + Where(dao.BusAskforleave.Columns().ProjectId, busUser.ProjectId). + Where(dao.BusAskforleave.Columns().Openid, req.Openid). + Where("("+ + "DATE_FORMAT(start_time,'%Y-%m-%d') BETWEEN DATE_FORMAT(?,'%Y-%m-%d') AND DATE_FORMAT(?,'%Y-%m-%d')"+ + " or "+ + "DATE_FORMAT(end_time,'%Y-%m-%d') BETWEEN DATE_FORMAT(?,'%Y-%m-%d') AND DATE_FORMAT(?,'%Y-%m-%d')"+ + ")", req.StartTime, req.EndTime, req.StartTime, req.EndTime).Count() + liberr.ErrIsNil(ctx, err) + if count > 0 { + liberr.ErrIsNil(ctx, errors.New("当前请假时间重复")) + return + } + //3、插入请假数据 + info, err := dao.BusAskforleave.Ctx(ctx).Insert(do.BusAskforleave{ + ProjectId: busUser.ProjectId, + ProjectName: valueP.String(), + TeamId: busUser.TeamId, + TeamName: valueT.String(), + StartTime: req.StartTime, + EndTime: req.EndTime, + Argument: req.Argument, + Openid: req.Openid, + CreateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + //4、发送审批 + keyId, _ := info.LastInsertId() + openidVal, err := dao.SysProjectTeamMember.Ctx(ctx). + Where(dao.SysProjectTeamMember.Columns().TeamId, busUser.TeamId). + Where(dao.SysProjectTeamMember.Columns().PostId, 10). + Fields(dao.SysProjectTeamMember.Columns().Openid).Value() + if openidVal.String() == "" || err != nil { + liberr.ErrIsNil(ctx, errors.New("当前班组未发现班组长职位")) + return + } + var listReissueReminder []todo.ReissueReminder + + listReissueReminder = append(listReissueReminder, todo.ReissueReminder{ + UserID: openidVal.String(), + Role: 1, + ProjectID: int(busUser.ProjectId), + CreatorID: req.Openid, + TargetID: int(keyId), + }) + err = todo.CreateAttendanceApprovalGroup(listReissueReminder, todo.ApprovalReminder) + //err = todo.CreateAskForLeaveReminder(openidVal.String(), int(busUser.ProjectId), req.Openid, int(keyId)) + liberr.ErrIsNil(ctx, err) + }) + return err + }) + return err +} + +func (s *sBusAskforleave) List(ctx context.Context, req *wxApplet.BusAskforleaveSearchReq) (listRes *wxApplet.BusAskforleaveSearchRes, err error) { + listRes = new(wxApplet.BusAskforleaveSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + values, err2 := dao.BusConstructionUser.Ctx(ctx).Where("user_name like ?", "%"+req.Name+"%").Fields("openid").Array() + liberr.ErrIsNil(ctx, err2) + m := dao.BusAskforleave.Ctx(ctx).WithAll().As("a"). + LeftJoin("bus_construction_user", "b", "a.openid=b.openid"). + //LeftJoin("sys_project", "c", "c.id=b.project_id"). + //LeftJoin("sys_project_team", "d", "d.id=b.team_id"). + Fields("a.*,b.user_name") + if req.Name != "" { + m = m.Where("a."+dao.BusAskforleave.Columns().Openid+" in (?)", values) + } + if req.ProjectId > 0 { + m = m.Where("a.project_id", req.ProjectId) + } + if req.TeamId > 0 { + m = m.Where("a.team_id", req.TeamId) + } + if req.ManagerOpinion != "" { + m = m.Where("a."+dao.BusAskforleave.Columns().ManagerOpinion+" = ?", req.ManagerOpinion) + } + if len(req.LeaveDateRange) != 0 { + m = m.Where("date(a.start_time) <= ? AND date(a.end_time) >= ?", req.LeaveDateRange[0], req.LeaveDateRange[1]) + } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.BusAskforleave.Columns().CreatedAt+" >=? AND "+"a."+dao.BusAskforleave.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + array, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + listRes.Total = len(array) + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusAskforleaveInfoRes + err = m.Fields(wxApplet.BusAskforleaveSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusAskforleaveListRes, len(res)) + for k, v := range res { + cardMode := "" + cardNumber := "" + if v.GangerOpinion == "1" && v.ManagerOpinion == "1" { + cardMode = "待审核" + cardNumber = "1" + } + if v.GangerOpinion == "2" || v.ManagerOpinion == "2" { + cardMode = "审核中" + cardNumber = "2" + } + if v.GangerOpinion == "3" || v.ManagerOpinion == "3" { + cardMode = "已拒绝" + cardNumber = "3" + } + if v.GangerOpinion == "2" && v.ManagerOpinion == "2" { + cardMode = "已同意" + cardNumber = "4" + } + + listRes.List[k] = &model.BusAskforleaveListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + ProjectName: v.ProjectName, + TeamId: v.TeamId, + TeamName: v.TeamName, + StartTime: v.StartTime, + EndTime: v.EndTime, + Argument: v.Argument, + Ganger: v.Ganger, + GangerOpinion: v.GangerOpinion, + GangerExplain: v.GangerExplain, + GangerTime: v.GangerTime, + Manager: v.Manager, + ManagerOpinion: v.ManagerOpinion, + ManagerExplain: v.ManagerExplain, + ManagerTime: v.ManagerTime, + CreateBy: v.CreateBy, + UpdateBy: v.UpdateBy, + CreatedAt: v.CreatedAt, + Remark: v.Remark, + CardMode: cardMode, + CardNumber: cardNumber, + UserName: v.UserName, + } + } + }) + return +} + +func (s *sBusAskforleave) GetById(ctx context.Context, id int64) (res *model.BusAskforleaveInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusAskforleave.Ctx(ctx).WithAll().As("a"). + LeftJoin("bus_construction_user", "b", "a.openid=b.openid"). + Fields("a.*,b.user_name"). + Where("a."+dao.BusAskforleave.Columns().Id, id).Scan(&res) + if res != nil { + cardMode := "" + cardNumber := "" + if res.GangerOpinion == "1" && res.ManagerOpinion == "1" { + cardMode = "待审核" + cardNumber = "1" + } + if res.GangerOpinion == "2" || res.ManagerOpinion == "2" { + cardMode = "审核中" + cardNumber = "2" + } + if res.GangerOpinion == "3" || res.ManagerOpinion == "3" { + cardMode = "已拒绝" + cardNumber = "3" + } + if res.GangerOpinion == "2" && res.ManagerOpinion == "2" { + cardMode = "已同意" + cardNumber = "4" + } + res.CardMode = cardMode + res.CardNumber = cardNumber + } + + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusAskforleave) Add(ctx context.Context, req *wxApplet.BusAskforleaveAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusAskforleave.Ctx(ctx).Insert(do.BusAskforleave{ + ProjectId: req.ProjectId, + ProjectName: req.ProjectName, + TeamId: req.TeamId, + TeamName: req.TeamName, + StartTime: req.StartTime, + EndTime: req.EndTime, + Argument: req.Argument, + Ganger: req.Ganger, + GangerOpinion: req.GangerOpinion, + GangerExplain: req.GangerExplain, + GangerTime: req.GangerTime, + Manager: req.Manager, + ManagerOpinion: req.ManagerOpinion, + ManagerExplain: req.ManagerExplain, + ManagerTime: req.ManagerTime, + CreateBy: req.CreateBy, + UpdateBy: req.UpdateBy, + Remark: req.Remark, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusAskforleave) Edit(ctx context.Context, req *wxApplet.BusAskforleaveEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusAskforleave.Ctx(ctx).WherePri(req.Id).Update(do.BusAskforleave{ + ManagerOpinion: req.ManagerOpinion, + ManagerExplain: req.ManagerExplain, + UpdateBy: ct.New().GetLoginUser(ctx).Id, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + //批量同意 + err2 := todo.MarkTasksAsProcessedByUUID(req.Id) + liberr.ErrIsNil(ctx, err2) + }) + return +} + +func (s *sBusAskforleave) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusAskforleave.Ctx(ctx).Delete(dao.BusAskforleave.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/wxApplet/logic/busAttendance/bus_attendance.go b/internal/app/wxApplet/logic/busAttendance/bus_attendance.go new file mode 100644 index 0000000..f97a9d9 --- /dev/null +++ b/internal/app/wxApplet/logic/busAttendance/bus_attendance.go @@ -0,0 +1,1560 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-07 16:29:52 +// 生成路径: internal/app/wxApplet/logic/bus_attendance.go +// 生成人:gfast +// desc:考勤 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "github.com/gogf/gf/v2/os/gtime" + "github.com/tiger1103/gfast/v3/third/todo" + "math" + "os" + "path/filepath" + "sort" + "strconv" + "strings" + "time" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gfile" + "github.com/gogf/gf/v2/util/gconv" + "github.com/jinzhu/copier" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + sysDao "github.com/tiger1103/gfast/v3/internal/app/system/dao" + sysModel "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model/do" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterBusAttendance(New()) +} + +func New() *sBusAttendance { + return &sBusAttendance{} +} + +type DAFEntity struct { + Openid string `json:"openid"` + PrintingDate string `json:"printingDate"` + RowCount string `json:"rowCount"` +} +type ByOpenIdFuncThree struct { + Commuter string `json:"commuter" dc:"上下班(1上班2下班)"` + ClockOn string `json:"clockOn" dc:"打卡时间(具体打卡时间)"` + PacePhoto string `json:"pacePhoto" dc:"头像"` +} +type ProjectPunchRangeRes struct { + Id string `json:"id" dc:"主键ID"` + ProjectId string `json:"projectId" dc:"项目ID"` + PunchName string `json:"punchName" dc:"范围名称"` + PunchRange string `json:"punchRange" dc:"打卡范围"` +} + +type sBusAttendance struct{} + +func (s *sBusAttendance) AppTeamAttendanceFunc(ctx context.Context, req *wxApplet.AppTeamAttendanceReq) (res *wxApplet.AppTeamAttendanceRes, err error) { + res = new(wxApplet.AppTeamAttendanceRes) + var tj []*model.AppResubmitTheExitAttachmentModelRes + err = g.Try(ctx, func(ctx context.Context) { + // 1、获取指定施工人员的openid + var openids []string + user := dao.BusConstructionUser + g := user.Ctx(ctx) + if req.ProjectId > 0 { + g = g.Where(user.Columns().ProjectId, req.ProjectId) + } + if req.TeamId > 0 { + g = g.Where(user.Columns().TeamId, req.TeamId) + } + if req.TypeOfWork != "" { + g = g.Where(user.Columns().TypeOfWork, req.TypeOfWork) + } + array, _ := g.Fields(user.Columns().Openid).Array() + for i := range array { + openids = append(openids, array[i].String()) + } + if len(openids) == 0 { + return + } + // 2、通过openids得到所有的 + var at []*model.AppResubmitTheExitAttachmentModelRes + m := dao.BusAttendance.Ctx(ctx).WithAll().As("a"). + LeftJoin(dao.BusConstructionUser.Table(), "b", "b.openid = a.openid"). + LeftJoin("sys_dict_data", "c", "c.dict_type = 'type_of_work' and c.dict_value = b.type_of_work"). + LeftJoin(dao.SysProjectTeam.Table(), "d", "d.id = b.team_id"). + Where("a.printing_date", req.SelectDate). + Where("a.openid in (?)", openids). + Group("openid") + if req.ProjectId > 0 { + m = m.Where("b.project_id", req.ProjectId) + } + if req.TeamId > 0 { + m = m.Where("b.team_id", req.TeamId) + } + zd := "a.id," + + "b.openid as openid," + + "b.pace_photo as pacePhoto," + + "b.user_name as userName," + + "d.name as bzName," + + "c.dict_label as typeOfWorkName," + + "a.printing_date as printingDate" + if req.Type == 1 || req.Type == 2 { // 出勤、半勤 + zd = zd + ",(SELECT COUNT(id) FROM bus_attendance WHERE openid = a.openid and printing_date= a.printing_date and is_pinch not IN (4)) as number" + m = m.Fields(zd) + if req.Type == 1 { + m = m.Having("number=2") + } else { + m = m.Having("number=1") + } + } else if req.Type == 3 { // 缺勤 + zd = zd + ",(SELECT COUNT(id) FROM bus_attendance WHERE openid = a.openid and printing_date= a.printing_date and is_pinch =4 ) as lackOfCard" + m = m.Fields(zd).Having("lackOfCard >= 1") + } else { + m = m.Fields(zd) + } + err = m.Scan(&tj) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + res.Total = len(tj) + if req.PageNum == 0 { + req.PageNum = 1 + } + res.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&at) + liberr.ErrIsNil(ctx, err, "查询出勤信息失败") + // 3、全部才去细分状态 + if req.Type == 0 { + if len(at) > 0 { + err, at, _, _, _ = AppTeamAttendanceFunc(ctx, at) + liberr.ErrIsNil(ctx, err) + } + if len(tj) > 0 { + err2, _, n1, n2, n3 := AppTeamAttendanceFunc(ctx, tj) + liberr.ErrIsNil(ctx, err2) + res.Absenteeism = n1 + res.HalfDuty = n2 + res.Attendance = n3 + } + + } + res.List = at + return + }) + return +} + +func AppTeamAttendanceFunc(ctx context.Context, at []*model.AppResubmitTheExitAttachmentModelRes) (error, []*model.AppResubmitTheExitAttachmentModelRes, int, int, int) { + var err error + for i, data := range at { + var entity []*model.BusAttendanceInfoRes + err = dao.BusAttendance.Ctx(ctx). + Where("openid", data.Openid). + Where("printing_date", data.PrintingDate).Scan(&entity) + if err != nil { + err = errors.New("查询子数据失败") + return err, nil, 0, 0, 0 + } + at[i].List = entity + } + // 3-1、分类数据 + mp := make(map[string][]*model.BusAttendanceInfoRes) + for _, data := range at { + var dataEntity []*model.BusAttendanceInfoRes + for _, dataj := range data.List { + ddd := new(model.BusAttendanceInfoRes) + copier.Copy(ddd, dataj) + dataEntity = append(dataEntity, ddd) + mp[dataj.Openid] = dataEntity + } + } + n1 := 0 + n2 := 0 + n3 := 0 + // 3-2、根据数据判断(出勤、半勤、缺勤) + for datai, data := range at { + num := 0 // 打卡次数 + flag := false // 是否缺卡 + for k, v := range mp { + if data.Openid == k { + for i := range v { + if v[i].IsPinch == "4" { + flag = true + } else { + flag = false + num = num + 1 + } + } + } + } + if num == 2 && flag == false { // 出勤 + at[datai].Status = "1" + n3 = n3 + 1 + } + if num == 1 && flag == false { // 半勤 + at[datai].Status = "2" + n2 = n2 + 1 + } + if flag { // 缺卡 + at[datai].Status = "3" + n1 = n1 + 1 + } + + } + return err, at, n1, n2, n3 +} + +func (s *sBusAttendance) AppLocationAttendanceStatisticsFunc(ctx context.Context, req *wxApplet.AppLocationAttendanceStatisticsReq) (res *wxApplet.AppLocationAttendanceStatisticsRes, err error) { + res = new(wxApplet.AppLocationAttendanceStatisticsRes) + err = g.Try(ctx, func(ctx context.Context) { + // 1、查询当月的所有打卡记录 + var thisMonth []*model.BusAttendanceInfoRes + err := dao.BusAttendance.Ctx(ctx).Where("openid", req.Openid).Where("DATE_FORMAT(printing_date,'%Y-%m') = ?", req.YearAndMonth).Scan(&thisMonth) + liberr.ErrIsNil(ctx, err) + if len(thisMonth) == 0 { // 没有任何打卡数据 + return + } + // 2、按天区分打卡的数据 + mp := make(map[string]model.AppLocationAttendanceStatisticsOneRes) + for _, data := range thisMonth { // 明确有多少天 + var entityOne model.AppLocationAttendanceStatisticsOneRes + entityOne.PrintingDate = data.PrintingDate + entityOne.ClockInTimeRange = data.PunchRange + mp[data.PrintingDate] = entityOne + } + for k := range mp { + var entityTwo []*model.AppLocationAttendanceStatisticsTwoRes + for _, data := range thisMonth { // 根据日期来分离出打卡出勤消息 + if k == data.PrintingDate { + // 获取对比数据的时间 + timeStr := "" + split := strings.Split(data.PunchRange, ",") + if data.IsPinch == "2" { + timeStr = split[0] + } else if data.IsPinch == "3" { + timeStr = split[1] + } + + util := tool.New() + fromString, _ := util.ParseDateTimeFromString(data.ClockOn) + formattedTime := util.GetFormattedTime(fromString) + + twoRes := model.AppLocationAttendanceStatisticsTwoRes{ + Id: data.Id, + Commuter: data.Commuter, + CommutingTime: formattedTime, + IsPinch: data.IsPinch, + Location: data.Location, + } + if data.IsPinch == "2" || data.IsPinch == "3" { + abs := math.Abs(tool.CalculateTheDifferenceBetweenTheTwoTimePoints(data.ClockOn, data.PrintingDate+" "+timeStr+":00")) + sprintf := fmt.Sprintf("%.2f", abs) + twoRes.MinutesLate, _ = strconv.ParseFloat(sprintf, 64) + } + entityTwo = append(entityTwo, &twoRes) + + oneRes := mp[k] + oneRes.List = entityTwo + mp[k] = oneRes + } + } + } + for k := range mp { // 遍历map进行数据统计 + oneRes := mp[k] + var types []string + for _, data := range oneRes.List { + types = append(types, data.IsPinch) + } + oneRes.Types = removeDuplicates(types) + oneRes.Number = len(oneRes.List) + if len(oneRes.List) > 1 { + hours := tool.CalculatesTheTimeDifferenceBetweenTwoStringsInHours(oneRes.List[0].CommutingTime, oneRes.List[1].CommutingTime) + xc, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", hours), 64) + oneRes.WorkingHours = math.Abs(xc) + } + res.List = append(res.List, &oneRes) + } + // 对切片进行排序 + sort.Slice(res.List, func(i, j int) bool { + return res.List[i].PrintingDate < res.List[j].PrintingDate + }) + }) + return +} + +func removeDuplicates(slice []string) []string { + result := make([]string, 0, len(slice)) + m := make(map[string]bool) + for _, item := range slice { + if !m[item] { + m[item] = true + result = append(result, item) + } + } + return result +} + +func (s *sBusAttendance) AppReissueACardListFunc(ctx context.Context, req *wxApplet.AppReissueACardListReq) (res *wxApplet.AppReissueACardListRes, err error) { + res = new(wxApplet.AppReissueACardListRes) + var list []*model.AppReissueACardListRes + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusAttendance.Ctx(ctx).As("a"). + LeftJoin(sysDao.BusReissueACard.Table(), "b", "a.id = b.attendance_id AND b.openid = '"+req.Openid+"'"). + Where("a."+dao.BusAttendance.Columns().Openid, req.Openid). + //Where("a.openid = '"+req.Openid+"' or pinch_openId = '"+req.Openid+"'"). + Where("a."+dao.BusAttendance.Columns().IsPinch, 4). + WhereNull("b.attendance_id"). + Fields("a.id, a.is_pinch, a.printing_date, a.commuter").OrderDesc("a.printing_date"). + Scan(&list) + if len(list) == 0 { + return + } + liberr.ErrIsNil(ctx, err, "获取补卡申请列表失败") + for i, data := range list { + list[i].Week = getWeekday(data.PrintingDate) + } + res.List = list + }) + return +} + +func (s *sBusAttendance) AppReissueACardIdFunc(ctx context.Context, req *wxApplet.AppReissueACardIdReq) (res *wxApplet.AppReissueACardIdRes, err error) { + res = new(wxApplet.AppReissueACardIdRes) + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusAttendance.Ctx(ctx).As("a"). + Where("a.id", req.Id). + Fields("a.id, a.is_pinch, a.printing_date, a.commuter").OrderDesc("a.printing_date"). + Scan(&res) + liberr.ErrIsNil(ctx, err) + }) + return +} + +func (s *sBusAttendance) AppSelectThisUserByCardRecordFunc(ctx context.Context, req *wxApplet.AppSelectThisUserByCardRecordReq) (listRes *wxApplet.AppSelectThisUserByCardRecordRes, err error) { + listRes = new(wxApplet.AppSelectThisUserByCardRecordRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusAttendance.Ctx(ctx).As("a"). + LeftJoin(dao.BusConstructionUser.Table(), "b", "b.openid = a.openid"). + Where("a."+dao.BusAttendance.Columns().PinchOpenId, req.Openid). + Where("a."+dao.BusAttendance.Columns().PrintingDate, req.YearAndMonth) + order := "a.id desc" + var res []*model.AppSelectThisUserByCardRecordReqRes + err = m.Fields("b.openid,b.pace_photo,b.user_name,a.clock_on as clockingTime,a.commuter").Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = res + }) + return listRes, err +} + +func (s *sBusAttendance) AppClockingStatusOfTheDayFunc(ctx context.Context, req *wxApplet.AppClockingStatusOfTheDayReq) (res *wxApplet.AppClockingStatusOfTheDayRes, err error) { + res = new(wxApplet.AppClockingStatusOfTheDayRes) + err = g.Try(ctx, func(ctx context.Context) { + count, _ := dao.BusAttendance.Ctx(ctx).Where("printing_date = CURRENT_DATE").Where("openid", req.Openid).Count() + if count == 0 { + res.ReturnState = "1" + } else if count == 1 { + res.ReturnState = "2" + } else { + res.ReturnState = "3" + } + }) + return +} + +func (s *sBusAttendance) AppWhetherToEnterTheClockRangeFunc(ctx context.Context, req *wxApplet.AppWhetherToEnterTheClockRangeReq) (res *wxApplet.AppWhetherToEnterTheClockRangeRes, err error) { + res = new(wxApplet.AppWhetherToEnterTheClockRangeRes) + err = g.Try(ctx, func(ctx context.Context) { + // 1、部分班组可以直接跳过在范围内打卡,获取当前用户班组,看看是否是可以在任何地点打卡 + var userInfo *model.BusConstructionUserInfoRes + err = dao.BusConstructionUser.Ctx(ctx).Where("openid", req.Openid).Scan(&userInfo) + value, errvalue := dao.SysProjectTeam.Ctx(ctx).Where("id", userInfo.TeamId).Fields("is_clock_in").Value() + if errvalue != nil { + err = errors.New("获取班组打卡状态失败!") + liberr.ErrIsNil(ctx, err) + return + } + if value.String() == "2" { // 表示任意范围都可打卡 + res.ReturnState = "3" + return + } + // 2、查询当前用户是否有加入班组,有的话看看是什么项目,是否指定打卡范围 + projectId, _ := dao.SysProjectTeamMember.Ctx(ctx).As("a"). + LeftJoin("sys_project_team as b on a.team_id = b.id"). + Fields("a.project_id"). + Where("a.openid", req.Openid).Value() + if projectId == nil { + err = errors.New("未指定打卡范围,请联系管理员!") + liberr.ErrIsNil(ctx, err) + return + } + // 3、再根据项目获取到方正,最后根据方正数据得出打卡范围 + var qf []*system.ProjectPunchRangeRes + err = g.DB().Model("sys_project_punch_range").Where("project_id", projectId).Fields("punch_range").Scan(&qf) + if err != nil { + err = errors.New("系统错误,请联系管理员!") + liberr.ErrIsNil(ctx, err) + return + } + if len(qf) == 0 { + err = errors.New("未设置打卡范围!请联系管理员设置!") + liberr.ErrIsNil(ctx, err) + return + } + // 4、判断是否进入打卡范围 + countI := len(qf) + countII := 0 + for _, dakaStr := range qf { + countII = countII + 1 + var dataInfo coryCommon.DetailedMap + marshal, _ := json.Marshal(dakaStr.PunchRange) + err = json.Unmarshal(marshal, &dataInfo.Positions) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + flag := coryCommon.RectangularFrameRange(dataInfo, req.LocationLng, req.LocationLat) + // 匹配上了任意一个范围,那就说明zai范围内,可以进行打卡 + if flag { + res.ReturnState = "2" + return + } else { + // 没有一次范围匹配上,那就说明不在范围内 + if countII == countI { + res.ReturnState = "1" + return + } + } + } + }) + return +} + +func (s *sBusAttendance) AppMyAttendanceDetailsFunc(ctx context.Context, req *wxApplet.AppMyAttendanceDetailsReq) (res *wxApplet.AppMyAttendanceDetailsRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 1、获取当前人员的头像、名称、状态(入场or退场)、出入场时间 + err = sysDao.BusConstructionUser.Ctx(ctx). + Where(sysDao.BusConstructionUser.Columns().Openid, req.Openid). + Fields( + "user_name as userName," + + "project_id as projectId," + + "pace_photo as pacePhoto," + + "entry_date as entryDate," + + "leave_date as leaveDate").Scan(&res) + liberr.ErrIsNil(ctx, err, "获取人员基本考勤信息失败") + // 2、我的考勤 + res.MyAttendance, err = PublicAppMyAttendanceFunc(ctx, req.Openid, req.YearAndMonth, res.ProjectId) + liberr.ErrIsNil(ctx, err, "统计考勤信息失败") + // 3、出勤详情列表(根据身份证号码+年月) + var rs []*sysModel.DateTwoRes + err = g.DB().Model("bus_salary_details_record").Ctx(ctx). + Where("sfz_number", res.SfzNumber). + Where("date_of_issue", req.YearAndMonth).Scan(&rs) + if len(rs) > 0 { + var ListOne []*wxApplet.MyAttendanceDetailsListRes + for _, r := range rs { + dataStr := r.DateOfIssue + "-" + r.WorkingDate // 根据年月日得到星期N + ListOne = append(ListOne, &wxApplet.MyAttendanceDetailsListRes{ + ResDate: dataStr, + Week: getWeekday(dataStr), + Duration: r.Duration, + }) + } + } + // 4、迟到、早退、缺卡列表数据 + var all []wxApplet.MyAttendanceDetailsListRes + num := []string{"2", "3", "4"} + var attendanceEntity []model.BusAttendanceInfoRes + err = dao.BusAttendance.Ctx(ctx). + Where("openid", req.Openid). + Where("project_id = ?", res.ProjectId). + Where("is_pinch in (?)", num). + Where("printing_date like ?", req.YearAndMonth+"%").Scan(&attendanceEntity) + liberr.ErrIsNil(ctx, err, "获取考勤信息失败") + for _, data := range attendanceEntity { + timeStr := "" + split := strings.Split(data.PunchRange, ",") + if data.IsPinch == "2" { + timeStr = split[0] + } else if data.IsPinch == "3" { + timeStr = split[1] + } + details := wxApplet.MyAttendanceDetailsListRes{ + Id: data.Id, + Commuter: data.Commuter, + ResDate: data.PrintingDate, + Week: getWeekday(data.PrintingDate), + Type: data.IsPinch, + ClockingTime: data.ClockOn, + } + if data.IsPinch == "4" { // 如果为4,查看是否补过卡了 + count, _ := g.DB().Model("bus_reissue_a_card").Ctx(ctx).Where("attendance_id", data.Id).Count() + if count > 0 { + details.FourType = "1" + } else { + details.FourType = "2" + } + } + if timeStr != "" { + abs := math.Abs(tool.CalculateTheDifferenceBetweenTheTwoTimePoints(data.ClockOn, data.PrintingDate+" "+timeStr+":00")) // 迟到、早退的差(单位分钟) + sprintf := fmt.Sprintf("%.2f", abs) + details.Minute, _ = strconv.ParseFloat(sprintf, 64) + } + all = append(all, details) + } + var detailsList []wxApplet.MyAttendanceDetailsListRes + var beLateList []wxApplet.MyAttendanceDetailsListRes + var leaveEarlyList []wxApplet.MyAttendanceDetailsListRes + var lackOfCardList []wxApplet.MyAttendanceDetailsListRes + mp := make(map[string][]wxApplet.MyAttendanceDetailsListRes) + for _, data := range all { + // 数据分类 + if data.Type == "2" { + beLateList = append(beLateList, data) + } else if data.Type == "3" { + leaveEarlyList = append(leaveEarlyList, data) + } else if data.Type == "4" { + lackOfCardList = append(lackOfCardList, data) + } + // 存放map + if data.Type != "4" { + _, ok := mp[data.ResDate] + if ok { + infoRes := mp[data.ResDate] + infoRes = append(infoRes, data) + mp[data.ResDate] = infoRes + } else { + var lists []wxApplet.MyAttendanceDetailsListRes + lists = append(lists, data) + mp[data.ResDate] = lists + } + } + } + for _, v := range mp { + if len(v) > 2 { + v[0].Duration = "1" + } else { + v[0].Duration = "0.5" + } + detailsList = append(detailsList, v[0]) + } + // 对 listEntity的dateStr排序 + sort.Slice(detailsList, func(i, j int) bool { + return detailsList[i].ResDate > detailsList[j].ResDate + }) + res.DetailsList = detailsList + res.BeLateList = beLateList + res.LeaveEarlyList = leaveEarlyList + res.LackOfCardList = lackOfCardList + res.BeLate = StatisticalAttendanceFunc(beLateList) + res.LeaveEarly = StatisticalAttendanceFunc(leaveEarlyList) + res.LackOfCard = strconv.Itoa(len(lackOfCardList)) + "次" + }) + return +} + +func (s *sBusAttendance) AppProjectOverviewFunc(ctx context.Context, req *wxApplet.AppProjectOverviewReq) (res *wxApplet.AppProjectOverviewRes, err error) { + res = new(wxApplet.AppProjectOverviewRes) + err = g.Try(ctx, func(ctx context.Context) { + sqlWhere := "DATE_FORMAT( created_at, '%Y-%m-%d' ) = CURRENT_DATE" + // 1、查询监控个数 + res.VideoSurveillance, err = sysDao.Ys7Devices.Ctx(ctx).Where("ProjectId", req.ProjectId).Count() + liberr.ErrIsNil(ctx, err, "监控视频点位统计失败") + // 2、查询违章记录 + res.SafetyLoophole, err = sysDao.BusViolationRecord.Ctx(ctx).Where("project_id", req.ProjectId).Where(sqlWhere).Count() + liberr.ErrIsNil(ctx, err, "安全隐患统计失败") + // 3、查询安全工单 + res.SafetyInspection, err = sysDao.BusHseManagement.Ctx(ctx).Where("project_id", req.ProjectId).Where(sqlWhere).Count() + liberr.ErrIsNil(ctx, err, "安全巡检统计失败") + }) + return +} + +func (s *sBusAttendance) AppMyAttendanceFunc(ctx context.Context, req *wxApplet.AppMyAttendanceReq) (res *wxApplet.AppMyAttendanceRes, err error) { + res = new(wxApplet.AppMyAttendanceRes) + res, err = PublicAppMyAttendanceFunc(ctx, req.Openid, req.YearAndMonth, 0) + return +} + +func (s *sBusAttendance) SalaryDetailsFunc(ctx context.Context, req *wxApplet.SalaryDetailsReq) (details *wxApplet.SalaryDetailsRes, err error) { + details = new(wxApplet.SalaryDetailsRes) + thisDate := tool.New().GetFormattedDate(time.Now()) + err = g.Try(ctx, func(ctx context.Context) { + var data []wxApplet.CalendarData + one := 0 + two := 0 + // statr, end := tool.TheBeginningAndTheEndOfTheMonthAssign(yearMonth) + // 1、得到考勤数据 + var oneData []*model.BusAttendanceInfoRes + err = dao.BusAttendance.Ctx(ctx).Fields("clock_on,printing_date,is_pinch,commuter,punch_range,daily_wage").Where("DATE_FORMAT(printing_date,'%Y-%m') = '" + req.YearMonth + "' and openid = '" + req.Openid + "'").Scan(&oneData) + liberr.ErrIsNil(ctx, err, "获取考勤信息失败") + // 2、处理考勤数据 + mp := make(map[string]int) + currentTime, _ := time.Parse("2006-01", req.YearMonth) + firstDay := time.Date(currentTime.Year(), currentTime.Month(), 1, 0, 0, 0, 0, currentTime.Location()) + lastDay := firstDay.AddDate(0, 1, 0).Add(-time.Second) + for day := firstDay; day.Before(lastDay); day = day.AddDate(0, 0, 1) { + dateStr := fmt.Sprintf("%d-%02d-%02d", day.Year(), day.Month(), day.Day()) + for _, one := range oneData { + if dateStr == one.PrintingDate { + value := mp[dateStr] + value++ + mp[dateStr] = value + } + } + } + for s := range mp { + calendarData := wxApplet.CalendarData{ + Days: s, + } + value := mp[s] + if value == 2 { + one = one + 1 + calendarData.Type = "3" + } else if value == 1 { + two = two + 1 + calendarData.Type = "2" + } else { + calendarData.Type = "1" + } + if strings.Contains(s, thisDate) { + calendarData.Type = "4" + } + data = append(data, calendarData) + } + details.OneDays = one + details.TwoDays = two + // details.PunchRange = + type entity struct { + Salary string `json:"salary"` + SumDuration string `json:"sumDuration"` + } + var ey entity + err = dao.BusConstructionUser.Ctx(ctx).As("a"). + LeftJoin("bus_type_of_wage as f on a.type_of_work = f.type_of_work"). + LeftJoin("bus_salary_details as g on g.sfz_number = a.sfz_number"). + Fields("if (a.salary>0, a.salary,f.standard) as salary,g.sum_duration as sumDuration"). + Where("a.openid", req.Openid).Scan(&ey) + liberr.ErrIsNil(ctx, err, "获取薪资失败") + details.PerDiem = ey.Salary + details.SumDuration = ey.SumDuration + details.List = data + return + }) + return +} + +func (s *sBusAttendance) AttendanceByOpenIdFunc(ctx context.Context, openid string) (res *wxApplet.AttendanceByOpenIdRes, err error) { + res = new(wxApplet.AttendanceByOpenIdRes) + var bair []*model.BusAttendanceInfoRes + currentTime := time.Now() + date := tool.New().GetFormattedDate(currentTime) + err = dao.BusAttendance.Ctx(ctx).Where("openid", openid).Where("printing_date", date).Fields("openid,commuter").Scan(&bair) + if len(bair) == 0 { + res.Status = "1" + } else if len(bair) == 1 { + res.Status = "2" + } else { + res.Status = "3" + } + return +} + +func (s *sBusAttendance) PCListFunc(ctx context.Context, req *wxApplet.PCListReq) (listRes *wxApplet.PCListRes, err error) { + listRes = new(wxApplet.PCListRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusAttendance.Ctx(ctx).As("a").LeftJoin("bus_construction_user as b on a.openid = b.openid and b.deleted_at is null") + //if req.IsPinch != "" { + // m = m.Where("a."+dao.BusAttendance.Columns().IsPinch+" = ?", req.IsPinch) + //} + //if req.Commuter != "" { + // m = m.Where("a."+dao.BusAttendance.Columns().Commuter+" = ?", req.Commuter) + //} + if req.ProjectId > 0 { + m = m.Where("b.project_id", req.ProjectId).Where("a.project_id", req.ProjectId) + } + + if req.Absenteeism != "" { + switch req.Absenteeism { + case "2": + m = m.Where("a.clock_on", "缺卡") + case "1": + m = m.WhereNot("a.clock_on", "缺卡") + } + } + + if req.TeamId > 0 { + m = m.Where("b.team_id", req.TeamId) + } + if req.PrintingDate != "" { + m = m.Where("a."+dao.BusAttendance.Columns().PrintingDate, req.PrintingDate) + } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.BusAttendance.Columns().CreatedAt+" >=? AND "+"a."+dao.BusAttendance.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.UserName != "" { + m = m.Where("a."+dao.BusAttendance.Columns().UserName+" like ?", "%"+req.UserName+"%") + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusAttendanceInfoRes + err = m.Fields("a.*").Page(req.PageNum, req.PageSize).Order("a." + order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusAttendanceListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusAttendanceListRes{ + Id: v.Id, + UserName: v.UserName, + ClockOn: v.ClockOn, + PrintingDate: v.PrintingDate, + IsPinch: v.IsPinch, + Openid: v.Openid, + Commuter: v.Commuter, + } + } + }) + return listRes, err +} + +func (s *sBusAttendance) DailyAbsenteeismFunc(ctx context.Context) { + // 获取哪些人需要打卡 + var absenteeismRecords []*DAFEntity + attendanceQuery, queryError := g.DB().Query(ctx, `SELECT + openid,printing_date as printingDate,row_count as rowCount + FROM( + SELECT + openid,printing_date,( SELECT COUNT(*) FROM bus_attendance WHERE openid = a.openid AND printing_date = a.printing_date AND deleted_at IS NULL ) AS row_count + FROM + bus_attendance AS a + WHERE + printing_date = DATE_FORMAT(NOW(),'%Y-%m-%d') and + deleted_at IS NULL + GROUP BY openid, printing_date + ) + AS subquery HAVING row_count = 1`) + if queryError != nil { + return + } + if err := attendanceQuery.Structs(&absenteeismRecords); err != nil { + return + } + + t := gtime.New(time.Now()) + formattedTime := t.Format("Y-m-d H:i") // "Y-m-d H:i" 琛ㄧず骞?鏈?鏃?鏃?鍒? + // 1、根据openid查询最后一次打卡记录,生成缺卡数据 + var attendanceInfo []*model.BusAttendanceInfoRes + for _, record := range absenteeismRecords { + // 生成缺勤数据 + attendanceRecord := &model.BusAttendanceInfoRes{} + if err := dao.BusAttendance.Ctx(ctx). + Fields("user_name,project_id,printing_date,openid,commuter,punch_range,daily_wage").Where("openid", record.Openid). + OrderDesc("id").Limit(1).Scan(&attendanceRecord); err != nil { + continue + } + + commuterStatus := attendanceRecord.Commuter + + if commuterStatus == "1" { + commuterStatus = "2" + } else { + commuterStatus = "1" + } + + attendanceRecord.Commuter = commuterStatus + attendanceRecord.IsPinch = "4" + attendanceRecord.ClockOn = "缺卡" + attendanceRecord.Missing = t + attendanceInfo = append(attendanceInfo, attendanceRecord) + } + + if len(attendanceInfo) > 0 { + _, err := dao.BusAttendance.Ctx(ctx).Insert(attendanceInfo) + if err != nil { + return + } else { + time.Sleep(2) + array, _ := dao.BusAttendance.Ctx(ctx).Where("missing like ?", formattedTime+"%").Fields("id").Array() + for i, attendanceRecord := range attendanceInfo { + attendanceText := attendanceRecord.PrintingDate + commuterStatus := attendanceRecord.Commuter + if commuterStatus == "1" { + attendanceText += " 下班缺卡" + } else { + attendanceText += " 上班缺卡" + } + todo.CreateMissingCardReminder(attendanceRecord.Openid, 1, int(attendanceRecord.ProjectId), attendanceText, array[i].Int64()) + } + } + } + + // 2、根据1返回的openid 去打卡表里面查询最后一次打卡记录,把返回数据的pace_photo清空;clock_on、is_pinch改成缺卡;commuter改变下状态; +} + +func (s *sBusAttendance) ByOpenidFunc(ctx context.Context, req *wxApplet.ByOpenIdFuncReq) (res *wxApplet.ByOpenIdFuncRes, err error) { + res = new(wxApplet.ByOpenIdFuncRes) + var oneData []*wxApplet.ByOpenIdFuncOne + + // err = dao.BusAttendance.Ctx(ctx).As("a").Fields( + // "DISTINCT a.printing_date as printingDate," + + // "b.clock_on as clockOn," + + // "b.commuter"). + // LeftJoin("(select openid,printing_date,clock_on,commuter from bus_attendance) as b on a.openid = b.openid and a.printing_date = b.printing_date"). + // Where("DATE_FORMAT(a.printing_date,'%Y-%m') = DATE_FORMAT(now(),'%Y-%m') and a.openid = '" + req.Openid + "'"). + // Scan(&oneData) + + // 1、获取当前用户当月的所有打卡天数 + err = dao.BusAttendance.Ctx(ctx).Fields("DISTINCT printing_date as printingDate"). + Where("DATE_FORMAT(printing_date,'%Y-%m') = '" + req.Years + "' and openid = '" + req.Openid + "'"). + Scan(&oneData) + // 2、遍历天数获取数据打卡数据 + if len(oneData) > 0 { + for _, data := range oneData { + twoSon := new(wxApplet.ByOpenIdFuncTwo) + var son []*ByOpenIdFuncThree + err = dao.BusAttendance.Ctx(ctx).Fields( + "clock_on as clockOn,commuter,pace_photo as pacePhoto"). + Where("openid = '" + req.Openid + "' and printing_date = '" + data.PrintingDate + "'"). + Scan(&son) + if len(son) == 2 { + data.Type = "3" + } else if len(son) == 1 { + data.Type = "2" + } else { + data.Type = "0" + } + for _, sonData := range son { + if sonData.Commuter == "1" { + twoSon.ClockOn = sonData.ClockOn + twoSon.HeadOn = sonData.PacePhoto + } + if sonData.Commuter == "2" { + twoSon.ClockOff = sonData.ClockOn + twoSon.HeadOff = sonData.PacePhoto + } + } + data.Clock = twoSon + } + } + if oneData == nil { + res.List = []*wxApplet.ByOpenIdFuncOne{} + } else { + res.List = oneData + } + return +} + +func (s *sBusAttendance) Export(ctx context.Context, req *wxApplet.PunchingCardRecordReq) (listRes *wxApplet.PunchingCardRecordRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + listRes = new(wxApplet.PunchingCardRecordRes) + var ge []*wxApplet.GroupEntity + var oneDateOneList []*wxApplet.PunchingCardRecordOne + // 1、获取必要查询条件-------根据成员获取考勤打卡 or 根据单个成员获取考勤打卡 + g2 := dao.BusAttendance.Ctx(ctx).As("a") + if req.Type != "" { + if req.Type == "1" { + g2 = g2.Where("DATE_FORMAT(a.printing_date,'%Y') = DATE_FORMAT(" + "'" + req.SelectDate + "'" + ",'%Y')") + } else if req.Type == "2" { + g2 = g2.Where("DATE_FORMAT(a.printing_date,'%Y%m') = DATE_FORMAT(" + "'" + req.SelectDate + "'" + ",'%Y%m')") + } else { + err = errors.New("type字段只能输入1~2") + liberr.ErrIsNil(ctx, err) + } + } + g2 = g2.InnerJoin("bus_construction_user", "u", "a.openid = u.openid").Fields("" + + "a.openid," + + "u.user_name,u.phone," + + "GROUP_CONCAT(a.clock_on) as clock").Group("a.openid,u.user_name,u.phone,a.printing_date") + if req.ProjectId > 0 { + // 1-1、根据项目id获取到下面的班组 + var teamEntity []*wxApplet.GroupEntity + err := dao.SysProjectTeam.Ctx(ctx).Where("project_id", req.ProjectId).Fields("id,name as groupName").Scan(&teamEntity) + if len(teamEntity) < 0 && err != nil { + err = errors.New("当前项目暂无班组!") + liberr.ErrIsNil(ctx, err) + return + } + // 1-2、组装数据 + ge, err = TeamFunc(ctx, teamEntity, g2) + if err != nil { + liberr.ErrIsNil(ctx, err, "获取数据失败!") + return + } + } + if len(req.TeamId) > 0 { + var teamEntity []*wxApplet.GroupEntity + err := dao.SysProjectTeam.Ctx(ctx).Where("id", req.TeamId).Fields("id,name as groupName").Scan(&teamEntity) + if len(teamEntity) < 0 && err != nil { + err = errors.New("当前项目暂无班组!") + liberr.ErrIsNil(ctx, err) + return + } + ge, err = TeamFunc(ctx, teamEntity, g2) + if err != nil { + liberr.ErrIsNil(ctx, err, "获取数据失败!") + return + } + } else if len(req.OpenId) > 0 { + mp := make(map[string][]*wxApplet.PunchingCardRecordTwo) + var wxUser []*wxApplet.GroupEntity + err = dao.BusConstructionUser.Ctx(ctx).As("a"). + InnerJoin("sys_project_team", "b", "a.team_id = b.id"). + Fields("a.openid,b.id,b.name as groupName"). + Where("a.openid in (?)", req.OpenId).Scan(&wxUser) + for i := range wxUser { + // 以下代码为一个员工的数据 + var sjInfo []*wxApplet.PunchingCardRecordTwo + g2.Where("a."+dao.BusAttendance.Columns().Openid, wxUser[i].Openid).Scan(&sjInfo) + for _, record := range sjInfo { + mp[record.Openid] = append(mp[record.Openid], record) + } + for _, group := range mp { + one := ExportSelect(ctx, group) + oneDateOneList = append(oneDateOneList, one) + } + wxUser[i].PunchingCardRecordOne = oneDateOneList + } + ge = wxUser + } + for i := range ge { + // 解析时间字符串 + parsedTime, err := time.Parse("2006-01-02", req.SelectDate) + if err != nil { + liberr.ErrIsNil(ctx, err, "解析时间出错") + return + } + for i2 := range ge[i].PunchingCardRecordOne { + // 提取年份和月份 + if req.Type == "1" { + ge[i].PunchingCardRecordOne[i2].Years = strconv.Itoa(parsedTime.Year()) + "年" + } + if req.Type == "2" { + ge[i].PunchingCardRecordOne[i2].Years = strconv.Itoa(int(parsedTime.Month())) + "月" + } + } + } + liberr.ErrIsNil(ctx, err, "获取数据失败!") + listRes.List = ge + }) + return listRes, err +} + +func (s *sBusAttendance) List(ctx context.Context, req *wxApplet.BusAttendanceSearchReq) (listRes *wxApplet.BusAttendanceSearchRes, err error) { + listRes = new(wxApplet.BusAttendanceSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusAttendance.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.BusAttendance.Columns().Id+" = ?", req.Id) + } + if req.UserName != "" { + m = m.Where(dao.BusAttendance.Columns().UserName+" like ?", "%"+req.UserName+"%") + } + if req.PacePhoto != "" { + m = m.Where(dao.BusAttendance.Columns().PacePhoto+" = ?", req.PacePhoto) + } + if req.ProjectId != "" { + m = m.Where(dao.BusAttendance.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + if req.CreateBy != "" { + m = m.Where(dao.BusAttendance.Columns().CreateBy+" = ?", req.CreateBy) + } + if req.UpdateBy != "" { + m = m.Where(dao.BusAttendance.Columns().UpdateBy+" = ?", req.UpdateBy) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusAttendance.Columns().CreatedAt+" >=? AND "+dao.BusAttendance.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.ClockOn != "" { + m = m.Where(dao.BusAttendance.Columns().ClockOn+" = ?", req.ClockOn) + } + //if req.ClockOff != "" { + // m = m.Where(dao.BusAttendance.Columns().ClockOff+" = ?", req.ClockOff) + //} + if req.IsPinch != "" { + m = m.Where(dao.BusAttendance.Columns().IsPinch+" = ?", req.IsPinch) + } + if req.Openid != "" { + m = m.Where(dao.BusAttendance.Columns().Openid+" = ?", req.Openid) + } + if req.PinchOpenId != "" { + m = m.Where(dao.BusAttendance.Columns().PinchOpenId+" = ?", req.PinchOpenId) + } + if req.ClockRecord != "" { + m = m.Where(dao.BusAttendance.Columns().ClockRecord+" = ?", req.ClockRecord) + } + if req.PinchUserName != "" { + m = m.Where(dao.BusAttendance.Columns().PinchUserName+" like ?", "%"+req.PinchUserName+"%") + } + // 打卡日期模糊查询 + if req.PrintingDate != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.PrintingDate)) + m = m.Where(dao.BusAttendance.Columns().PrintingDate+" like ?", "%"+date+"%") + } + // 创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.BusAttendance.Columns().CreatedAt+" like ?", "%"+date+"%") + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusAttendanceInfoRes + err = m.Fields(wxApplet.BusAttendanceSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusAttendanceListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusAttendanceListRes{ + Id: v.Id, + UserName: v.UserName, + PacePhoto: v.PacePhoto, + ProjectId: v.ProjectId, + ClockOn: v.ClockOn, + ClockOff: v.ClockOff, + PrintingDate: v.PrintingDate, + IsPinch: v.IsPinch, + Openid: v.Openid, + PinchOpenId: v.PinchOpenId, + ClockRecord: v.ClockRecord, + PinchUserName: v.PinchUserName, + CreatedAt: v.CreatedAt, + Commuter: v.Commuter, + } + } + }) + return listRes, err +} + +func (s *sBusAttendance) GetById(ctx context.Context, id uint64) (res *model.BusAttendanceInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusAttendance.Ctx(ctx).WithAll().Where(dao.BusAttendance.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusAttendance) Add(ctx context.Context, req *wxApplet.BusAttendanceAddReq) (err error) { + f1 := strconv.FormatFloat(req.LocationLng, 'f', -1, 64) + f2 := strconv.FormatFloat(req.LocationLat, 'f', -1, 64) + res, err := ThisInverseGeocodingFunc(f1 + "," + f2) + liberr.ErrIsNil(ctx, err) + // 上次打卡距离此次打卡不超过3分支,那么提示“你刚刚已打上/下班卡了哦!” + currentTime := time.Now() + date := tool.New().GetFormattedDate(currentTime) + var bair *model.BusAttendanceInfoRes + err = dao.BusAttendance.Ctx(ctx). + Where("openid", req.Openid). + Where("printing_date", date). + Fields("clock_on,commuter").OrderDesc("clock_on").Limit().Scan(&bair) + liberr.ErrIsNil(ctx, err, "打卡失败!") + if err == nil && bair != nil { + //判断t1和t2是否相差180秒,如果小于180秒就直接return + flag, err := IsWithinThreeMinutes(currentTime, bair.ClockOn) + if err != nil { + return err + } + if flag { + txt := "" + if bair.Commuter == "1" { + txt = "您已上班打卡成功!杜绝重复打卡!" + } else { + txt = "您已下班打卡成功!杜绝重复打卡!" + } + err = errors.New(txt) + return err + } + } + req.LocationLng, req.LocationLat = coryCommon.GCJ02toWGS84(req.LocationLng, req.LocationLat) + // 查看当前用户的打卡时间是否请假,如果请假就提示不用打卡 + count, err := dao.BusAskforleave.Ctx(ctx). + Where(dao.BusAskforleave.Columns().ProjectId, req.ProjectId). + Where(dao.BusAskforleave.Columns().Openid, req.Openid). + Where("(" + + "DATE_FORMAT(" + date + ",'%Y-%m-%d') BETWEEN DATE_FORMAT(start_time,'%Y-%m-%d') AND DATE_FORMAT(end_time,'%Y-%m-%d')" + + " or " + + "DATE_FORMAT(" + date + ",'%Y-%m-%d') BETWEEN DATE_FORMAT(start_time,'%Y-%m-%d') AND DATE_FORMAT(end_time,'%Y-%m-%d')" + + ")").Count() + liberr.ErrIsNil(ctx, err) + if count > 0 { + liberr.ErrIsNil(ctx, errors.New("您已请假,无需打卡!")) + return + } + // 0-0、判断是否开启打卡功能 (禁止打卡和离职都不允许打卡) + var userInfo *model.BusConstructionUserInfoRes + err = dao.BusConstructionUser.Ctx(ctx).Where("openid", req.Openid).Scan(&userInfo) + if userInfo.TeamId == 0 { + err = errors.New("当前用户暂无班组,无法打卡!") + return + } + // 根据数据库存储的图片路径 转成bae64进行打卡,如果不是存储的路径就不转 + str1 := "/wxfile/" + str2 := "/file/" + if strings.Contains(userInfo.PacePhoto, str1) { + userInfo.PacePhoto, err = EncodeAndUrlEncodeImageFunc(userInfo.PacePhoto, str1) + if err != nil { + return + } + } else if strings.Contains(userInfo.PacePhoto, str2) { + userInfo.PacePhoto, err = EncodeAndUrlEncodeImageFunc(userInfo.PacePhoto, str2) + if err != nil { + return + } + } + // 部分班组可以直接跳过在范围内打卡,获取当前用户班组,看看是否是可以在任何地点打卡 + value, errvalue := dao.SysProjectTeam.Ctx(ctx).Where("id", userInfo.TeamId).Fields("is_clock_in").Value() + if errvalue != nil { + err = errors.New("获取班组打卡状态失败!") + return err + } + if value.String() == "2" { + goto breakHere + } + // 计算是否在打卡范围中 + if true { + // 查询当前用户是否有加入班组,有的话看看是什么项目,再根据项目获取到方正,最后根据方正数据得出打卡范围 + projectId, _ := dao.SysProjectTeamMember.Ctx(ctx).As("a"). + LeftJoin("sys_project_team as b on a.team_id = b.id"). + Fields("a.project_id"). + Where("a.openid", req.Openid).Value() + if projectId != nil { + var qf []*ProjectPunchRangeRes + err = g.DB().Model("sys_project_punch_range").Where("project_id", projectId).Fields("punch_range").Scan(&qf) + if err != nil { + err = errors.New("系统错误,请联系管理员!") + return err + } + if len(qf) == 0 { + err = errors.New("未设置打卡范围!请联系管理员设置!") + return err + } + countI := len(qf) + countII := 0 + for _, dakaStr := range qf { + countII = countII + 1 + var dataInfo coryCommon.DetailedMap + err = json.Unmarshal([]byte(fmt.Sprint(dakaStr.PunchRange)), &dataInfo.Positions) + flag := coryCommon.RectangularFrameRange(dataInfo, req.LocationLng, req.LocationLat) + if flag { + goto breakHere + } else { + // 没有一次范围匹配上,那就直接返回 + if countII == countI { + err = errors.New("不在范围内,打卡无效!") + return err + } + } + } + } else { + err = errors.New("未指定打卡范围,请联系管理员!") + return err + } + } +breakHere: + if userInfo.Status == "1" { + err = errors.New("已离职,请联系管理员!") + return + } + if userInfo.Clock == "2" { + err = errors.New("已禁止打卡,请联系管理员!") + return + } + + if len(strings.Trim(userInfo.LeaveDate.String(), "")) != 0 { + err = errors.New("已退场,请联系管理员!") + return + } + // 0-1、先检测是否是人脸 + hfReq := &coryCommon.HumanFaceReq{} + hfReq.Image = req.PacePhoto + hfReq.ImageType = "BASE64" + hfReq.FaceField = "face_type,quality" + + err = coryCommon.HumanFace(hfReq) + if err != nil { + return err + } + // 0-2、对比人脸信息是否相同 h1身份证的人脸信息 h2打卡的人脸信息 + var hfReqArr []*coryCommon.HumanFaceReq + // headIcon, _ := dao.BusConstructionUser.Ctx(ctx).Where("openid", req.Openid).Fields("pace_photo").Value() + h1 := coryCommon.HumanFaceReq{ + Image: userInfo.PacePhoto, + ImageType: "BASE64", + FaceField: "face_type,quality", + } + h2 := coryCommon.HumanFaceReq{ + Image: req.PacePhoto, + ImageType: "BASE64", + FaceField: "face_type,quality", + } + hfReqArr = append(hfReqArr, &h1, &h2) + str, err := coryCommon.Comparison(hfReqArr) + if err != nil { + return err + } + if str < 75 { + float := strconv.FormatFloat(str, 'f', 2, 64) + errStr := "人脸不匹配!" + float + err = errors.New(errStr) + return + } + clockStatus := "" + // 1、获取当日时间 + // 2、查询今日打卡记录 + gm := dao.BusAttendance.Ctx(ctx). + Where(dao.BusAttendance.Columns().Openid, req.Openid). + Where(dao.BusAttendance.Columns().PrintingDate, date) + // 3、如果有判断是否打了上班卡,如果没有就打上班卡 + count1, _ := gm.Where("commuter", "1").Count() + if count1 == 0 { + // 打上班卡 + clockStatus = "1" + } + // 4、如果有判断是否打了下班卡,如果没有就打下班卡 + count2, _ := gm.Where("commuter", "2").Count() + if clockStatus == "" && count2 == 0 { + // 打下班卡 + clockStatus = "2" + } + // 5、上下班卡都打了,那么就提示今日打卡完成 + if count1 != 0 && count2 != 0 { + // 已完成当日打卡 + err = errors.New("当日打卡已完成!") + return err + } + + // 提交数据 + name := userInfo.NickName + if userInfo.UserName != "" { + name = userInfo.UserName + } + // 将base64人脸换成图片存储到本地 + req.PacePhoto, err = coryCommon.Base64ToImgFunc(req.PacePhoto, "2", coryCommon.Portrait+"/") + if err != nil { + return + } + attendance := do.BusAttendance{ + PacePhoto: "/" + req.PacePhoto, + UserName: name, + ProjectId: req.ProjectId, + Openid: req.Openid, + PinchOpenId: req.PinchOpenId, + Commuter: clockStatus, + Lng: req.LocationLng, + Lat: req.LocationLat, + PrintingDate: date, + } + // 判断此次打卡状态 默认就为缺勤 + dateTime := tool.New().GetFormattedDateTime(time.Now()) + if userInfo.ProjectId > 0 { + value, err := sysDao.SysProject.Ctx(ctx).WherePri(userInfo.ProjectId).Fields("punch_range as punchRange").Value() + if err != nil { + err = errors.New("获取项目打卡范围失败!") + } + split := strings.Split(value.String(), ",") + strType := tool.New().TimeWithin(dateTime, split[0], split[1], clockStatus) + attendance.IsPinch = strType + attendance.PunchRange = value.String() // 记录项目的打卡时间,保留字段,后期有大用 + } + // 获取此次打卡的日薪 + vl, err := dao.BusConstructionUser.Ctx(ctx).As("a"). + LeftJoin("bus_type_of_wage as f on a.type_of_work = f.type_of_work"). + Fields("if (a.salary>0, a.salary,f.standard) as salary"). + Where("a.openid", req.Openid).Value() + liberr.ErrIsNil(ctx, err, "获取薪资失败") + // 记录打卡时间(上下班打卡时间统一用clock_on) + attendance.ClockOn = dateTime + attendance.DailyWage = vl + attendance.Lng = req.LocationLng + attendance.Lat = req.LocationLat + attendance.Location = res.Regeocode.FormattedAddress + _, err = dao.BusAttendance.Ctx(ctx).Insert(attendance) + liberr.ErrIsNil(ctx, err, "添加失败") + return +} + +func (s *sBusAttendance) Edit(ctx context.Context, req *wxApplet.BusAttendanceEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusAttendance.Ctx(ctx).WherePri(req.Id).Update(do.BusAttendance{ + // UserName: req.UserName, + // PacePhoto: req.PacePhoto, + // ProjectId: req.ProjectId, + // CreateBy: req.CreateBy, + // UpdateBy: req.UpdateBy, + ClockOn: req.ClockOn, + // ClockOff: req.ClockOff, + // PrintingDate: req.PrintingDate, + // IsPinch: req.IsPinch, + // Openid: req.Openid, + // PinchOpenId: req.PinchOpenId, + // ClockRecord: req.ClockRecord, + // PinchUserName: req.PinchUserName, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusAttendance) Delete(ctx context.Context, ids []uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusAttendance.Ctx(ctx).Delete(dao.BusAttendance.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +func TeamFunc(ctx context.Context, teamEntity []*wxApplet.GroupEntity, g2 *gdb.Model) (gEntity []*wxApplet.GroupEntity, err error) { + err = g.Try(ctx, func(ctx context.Context) { + for i := range teamEntity { + var oneDateOneList []*wxApplet.PunchingCardRecordOne + // 2-1、根据班组id获取到下面的成员 + array, err := dao.SysProjectTeamMember.Ctx(ctx).Where("team_id", teamEntity[i].GroupId).Fields("openid").Array() + if len(array) < 0 && err != nil { + err = errors.New("当前组暂无成员!") + liberr.ErrIsNil(ctx, err) + return + } + // 以下代码为一个员工的数据 map 实现数据分组(人分) 然后进行计算数据 + openids := "" + for i, value := range array { + if i == len(array)-1 { + openids = openids + value.String() + } else { + openids = openids + value.String() + "," + } + } + var sjInfo []*wxApplet.PunchingCardRecordTwo + g2.Where("a."+dao.BusAttendance.Columns().Openid+" in (?)", strings.Split(openids, ",")).Scan(&sjInfo) + mp := make(map[string][]*wxApplet.PunchingCardRecordTwo) + for _, record := range sjInfo { + mp[record.Openid] = append(mp[record.Openid], record) + } + for _, group := range mp { + one := ExportSelect(ctx, group) + oneDateOneList = append(oneDateOneList, one) + } + teamEntity[i].PunchingCardRecordOne = oneDateOneList + } + liberr.ErrIsNil(ctx, err, "获取数据失败!") + }) + gEntity = teamEntity + return +} + +func ExportSelect(ctx context.Context, sjInfo []*wxApplet.PunchingCardRecordTwo) (oneDateOne *wxApplet.PunchingCardRecordOne) { + oneDateOne = new(wxApplet.PunchingCardRecordOne) + // 总工作时长 + sumHour := 0 + // 总工作天数 + sumDay := 0 + // 2、 遍历数据进行计算出小时 + for i, d := range sjInfo { + clock := d.Clock + split := strings.Split(clock, ",") + if i == 0 { + oneDateOne.Name = d.UserName + d.Phone + } + ////第0条数据的时候取openid 然后去查询数据获取数据 + //if sjInfo[0] != nil { + // value, _ := dao.BusConstructionUser.Ctx(ctx).Where("openid", sjInfo[0].Openid).Fields("concat(user_name,phone) as name").Value() + // oneDateOne.Name = value.String() + //} + //有两条数据那么才进行计算(工时) + if len(split) > 1 { + sj := calculate(clock) + d.Hour = strconv.Itoa(sj) + sumHour = sumHour + sj + sumDay = sumDay + 1 + } + } + oneDateOne.PunchCard = sjInfo + oneDateOne.SumHour = sumHour + oneDateOne.SumDay = sumDay + return oneDateOne +} + +// 计算出时间差值 +func calculate(str string) (sj int) { + hours := 0 + // 使用逗号分割字符串 + parts := strings.Split(str, ",") + + // 解析时间字符串 + layout := "2006-01-02 15:04:05" + t1, err := time.Parse(layout, parts[0]) + if err != nil { + fmt.Println("无法解析时间字符串:", parts[0]) + return + } + t2, err := time.Parse(layout, parts[1]) + if err != nil { + fmt.Println("无法解析时间字符串:", parts[1]) + return + } + + // 计算时间差 + duration := t2.Sub(t1) + + // 计算小时数 + hours = int(duration.Hours()) + if duration.Minutes()-float64(hours*60) >= 30 { + hours++ + } + // fmt.Printf("按照整数小时计算,小时数为:%d\n", hours) + return hours +} + +// 根据时间得到星期N +func getWeekday(dateStr string) string { + t, err := time.Parse("2006-01-02", dateStr) + if err != nil { + return "无效日期" + } + weekday := t.Weekday().String() + // 中文星期几的映射 + weekdayMap := map[string]string{ + "Monday": "星期一", + "Tuesday": "星期二", + "Wednesday": "星期三", + "Thursday": "星期四", + "Friday": "星期五", + "Saturday": "星期六", + "Sunday": "星期日", + } + return weekdayMap[weekday] +} + +func PublicAppMyAttendanceFunc(ctx context.Context, openid string, yearAndMonth string, projectId int64) (res *wxApplet.AppMyAttendanceRes, err error) { + res = new(wxApplet.AppMyAttendanceRes) + err = g.Try(ctx, func(ctx context.Context) { + // 1、获取当前人员指定年月的所有出勤数据 + var busAttendance []*model.BusAttendanceInfoRes + sq := dao.BusAttendance.Ctx(ctx). + Where(dao.BusAttendance.Columns().Openid, openid). + //Where("((openid = '"+openid+"') or (pinch_openId = '"+openid+"'))"). + Where("DATE_FORMAT(printing_date,'%Y-%m') = ?", yearAndMonth) + if projectId > 0 { + sq = sq.Where("project_id = ?", projectId) + } + err = sq.Scan(&busAttendance) + liberr.ErrIsNil(ctx, err) + if len(busAttendance) == 0 { + return + } + // 2、分别获取出勤、迟到、早退、缺卡等数据 + mpOut := make(map[string]int) + late := res.BeLate + early := res.LeaveEarly + card := res.LackOfCard + for _, data := range busAttendance { + switch data.IsPinch { + case "1": + // map的val为2表示当前满勤,1表示打卡一次 + value, ok := mpOut[data.PrintingDate] + if ok { + mpOut[data.PrintingDate] = value + 1 + } else { + mpOut[data.PrintingDate] = 1 + } + case "2": + late = late + 1 + case "3": + early = early + 1 + case "4": + card = card + 1 + } + } + res.GoOut = len(mpOut) + late // 正常+迟到 = 出勤天数 + res.BeLate = late + res.LeaveEarly = early + res.LackOfCard = card + }) + return +} + +func StatisticalAttendanceFunc(list []wxApplet.MyAttendanceDetailsListRes) (str string) { + var fz float64 + for i := range list { + fz = fz + list[i].Minute + } + str = strconv.Itoa(len(list)) + "次," + strconv.FormatFloat(fz, 'f', 2, 64) + "分钟" + return str +} + +func EncodeAndUrlEncodeImageFunc(pacePhoto string, prefix string) (string, error) { + if len(pacePhoto) == 0 && pacePhoto[0] != '/' { + return "", nil + } + pacePhoto = pacePhoto[1:] + prefix = prefix[1:] + pacePhoto = strings.Replace(pacePhoto, prefix, "resource/public/", 1) + getwd, _ := os.Getwd() + join := gfile.Join(getwd, pacePhoto) + join = filepath.ToSlash(join) + str, err := coryCommon.EncodeAndUrlEncodeImage(join, 4) + return str, err +} + +func ThisInverseGeocodingFunc(location string) (res *wxApplet.AppCodedBackwardsByLatitudeAndLongitudeRes, err error) { + res = new(wxApplet.AppCodedBackwardsByLatitudeAndLongitudeRes) + we := coryCommon.InverseGeocoding(location) + bodyData := []byte(we) + err = json.Unmarshal(bodyData, &res) + return +} + +// 判断两个时间的秒数差是否 <= 180 秒 +func IsWithinThreeMinutes(currentTime time.Time, strTime string) (bool, error) { + // 解析字符串时间,使用本地时区 + loc, _ := time.LoadLocation("Local") // 获取本地时区 + parsedTime, err := time.ParseInLocation("2006-01-02 15:04:05", strTime, loc) + if err != nil { + fmt.Println("时间解析错误:", err) + return false, err + } + // 计算时间差(秒) + diff := math.Abs(currentTime.Sub(parsedTime).Seconds()) + + // 判断是否相差 180 秒 + return diff <= 180, nil +} diff --git a/internal/app/wxApplet/logic/busConstructionProject/bus_construction_project.go b/internal/app/wxApplet/logic/busConstructionProject/bus_construction_project.go new file mode 100644 index 0000000..bd3a8fb --- /dev/null +++ b/internal/app/wxApplet/logic/busConstructionProject/bus_construction_project.go @@ -0,0 +1,112 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-07 11:17:50 +// 生成路径: internal/app/wxApplet/logic/bus_construction_project.go +// 生成人:gfast +// desc:施工人员对应项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model/do" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterBusConstructionProject(New()) +} + +func New() *sBusConstructionProject { + return &sBusConstructionProject{} +} + +type sBusConstructionProject struct{} + +func (s *sBusConstructionProject) List(ctx context.Context, req *wxApplet.BusConstructionProjectSearchReq) (listRes *wxApplet.BusConstructionProjectSearchRes, err error) { + listRes = new(wxApplet.BusConstructionProjectSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusConstructionProject.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.BusConstructionProject.Columns().Id+" = ?", req.Id) + } + if req.ConstructionUserId != "" { + m = m.Where(dao.BusConstructionProject.Columns().ConstructionUserId+" = ?", gconv.Int64(req.ConstructionUserId)) + } + if req.ProjectId != "" { + m = m.Where(dao.BusConstructionProject.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusConstructionProjectInfoRes + err = m.Fields(wxApplet.BusConstructionProjectSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusConstructionProjectListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusConstructionProjectListRes{ + Id: v.Id, + ConstructionUserId: v.ConstructionUserId, + ProjectId: v.ProjectId, + } + } + }) + return +} + +func (s *sBusConstructionProject) GetById(ctx context.Context, id uint64) (res *model.BusConstructionProjectInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusConstructionProject.Ctx(ctx).WithAll().Where(dao.BusConstructionProject.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusConstructionProject) Add(ctx context.Context, req *wxApplet.BusConstructionProjectAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionProject.Ctx(ctx).Insert(do.BusConstructionProject{ + ConstructionUserId: req.ConstructionUserId, + ProjectId: req.ProjectId, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusConstructionProject) Edit(ctx context.Context, req *wxApplet.BusConstructionProjectEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionProject.Ctx(ctx).WherePri(req.Id).Update(do.BusConstructionProject{ + ConstructionUserId: req.ConstructionUserId, + ProjectId: req.ProjectId, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusConstructionProject) Delete(ctx context.Context, ids []uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionProject.Ctx(ctx).Delete(dao.BusConstructionProject.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/wxApplet/logic/busConstructionUser/bus_construction_user.go b/internal/app/wxApplet/logic/busConstructionUser/bus_construction_user.go new file mode 100644 index 0000000..88c2c8b --- /dev/null +++ b/internal/app/wxApplet/logic/busConstructionUser/bus_construction_user.go @@ -0,0 +1,1603 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-07 11:17:50 +// 生成路径: internal/app/wxApplet/logic/bus_construction_user.go +// 生成人:gfast +// desc:施工人员 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "bytes" + "context" + "crypto/aes" + "crypto/cipher" + "database/sql" + "encoding/base64" + "errors" + "fmt" + serviceController "github.com/tiger1103/gfast/v3/internal/app/system/service" + "math/rand" + "os" + "strconv" + "strings" + "time" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/common/controller" + sysControler "github.com/tiger1103/gfast/v3/internal/app/common/logic/sysDictData" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + controllerDao "github.com/tiger1103/gfast/v3/internal/app/system/dao" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + controllerModel "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model/do" + wxAppletDo "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model/do" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterBusConstructionUser(New()) +} + +func New() *sBusConstructionUser { + return &sBusConstructionUser{} +} + +const ( + coryMy = "averylongkeyforAES256totally32cy" +) + +type sBusConstructionUser struct{} + +func (s *sBusConstructionUser) AppGetPersonnelDetailsFunc(ctx context.Context, req *wxApplet.AppGetPersonnelDetailsReq) (res *wxApplet.AppGetPersonnelDetailsRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、获取基本信息 + err := dao.BusConstructionUser.Ctx(ctx).As("a"). + LeftJoin("sys_project", "b", "b.id = a.project_id"). + LeftJoin("sys_project_team", "c", "c.id=a.team_id"). + LeftJoin("sys_dict_data", "d", "d.dict_type = 'type_of_work' and d.dict_value = a.type_of_work"). + LeftJoin("bus_labourservice", "e", "e.id = a.labourservice_id"). + Fields( + "a.id,a.openid,a.clock,"+ + "a.pace_photo,"+ + "a.user_name,"+ + "if(a.sex = 1,'男',if(a.sex = 2,'女','保密')) as sexName,"+ + "a.phone,"+ + "a.sfz_number,"+ + "a.sfz_nation,"+ + "a.sfz_birth,"+ + "a.sfz_site,"+ + "a.yhk_opening_bank,"+ + "a.yhk_number,"+ + "b.project_name as projectName,"+ + "e.name as lw_name,"+ + "c.name as bz_name,,"+ + "d.dict_label as typeOfWorkName,"+ + "if(a.status = 0,'在职','离职') as statusStr,"+ + "a.entry_date,"+ + "a.leave_date"). + Where("a."+dao.BusConstructionUser.Columns().Openid, req.Openid).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + //2、获取用户附件信息 + if res != nil { + if res.Clock == "1" { + res.IsClockIn = true + } else { + res.IsClockIn = false + } + var dataInfo []*model.BusConstructionUserFileListRes + dao.BusConstructionUserFile.Ctx(ctx).Where("user_id", res.Id).Where("user_img_type in (3,4,5,6,7,8,10)").Order("CAST(user_img_type AS UNSIGNED) ASC").Scan(&dataInfo) + res.ImgFileList = dataInfo + } + }) + return +} + +func (s *sBusConstructionUser) AppGetsThePeopleUnderTheSpecifiedProjectFunc(ctx context.Context, req *wxApplet.AppGetsThePeopleUnderTheSpecifiedProjectReq) (listRes *wxApplet.AppGetsThePeopleUnderTheSpecifiedProjectRes, err error) { + listRes = new(wxApplet.AppGetsThePeopleUnderTheSpecifiedProjectRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusConstructionUser.Ctx(ctx).WithAll().As("a"). + LeftJoin("sys_dict_data", "d", "d.dict_type = 'type_of_work' and d.dict_value = a.type_of_work"). + LeftJoin("bus_labourservice", "e", "e.id = a.labourservice_id"). + Fields("a.openid," + + "a.user_name," + + "a.pace_photo," + + "a.sex," + + "a.sfz_birth," + + "d.dict_label as typeOfWorkName," + + "e.name as lw_name," + + "a.entry_date," + + "a.leave_date") + + if req.ProjectId > 0 { //班组筛选 + m = m.Where("a.project_id", req.ProjectId) + } + //if req.TeamID > 0 { //班组筛选 + // m = m.Where("a.team_id", req.TeamID) + //} + if req.Type == 0 { //查询实名认证却没有分班组的人(未退场), + m = m.Where("" + + "(a.sfz_number is not null and a.sfz_number != '') " + + "and (a.team_id IS NULL or a.team_id < 1) " + + "and (a.leave_date IS NULL or a.leave_date = '')") + } + if req.Type == 1 { //查询实名认证却没有分班组的人(已退场), + m = m.Where("" + + "(a.sfz_number is not null and a.sfz_number != '') " + + "and (a.team_id IS NULL or a.team_id < 1) " + + "and (a.leave_date IS not NULL and a.leave_date != '')") + } + if req.FuzzyQuery != "" { //模糊查询 + var cx = "%" + req.FuzzyQuery + "%" + m = m.Where("a.user_name like ? or a.phone like ? or a.sfz_number like ?", cx, cx, cx) + } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.BusConstructionUser.Columns().CreatedAt+" >=? AND "+"a."+dao.BusConstructionUser.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + array, err := m.Array() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + listRes.Total = len(array) + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "a.id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.AppListOfConstructionPersonnelModelRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + for i := range res { + //性别 + switch res[i].Sex { + case "1": + res[i].SexName = "男" + case "2": + res[i].SexName = "女" + case "3": + res[i].SexName = "保密" + } + //获取年龄 + res[i].Age = tool.New().CalculateAge(res[i].SfzBirth) + } + listRes.List = res + }) + return +} + +func (s *sBusConstructionUser) AppListOfConstructionPersonnelFunc(ctx context.Context, req *wxApplet.AppListOfConstructionPersonnelReq) (listRes *wxApplet.AppListOfConstructionPersonnelRes, err error) { + listRes = new(wxApplet.AppListOfConstructionPersonnelRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusConstructionUser.Ctx(ctx).WithAll().As("a"). + LeftJoin("sys_project_team as b on b.id=a.team_id"). + LeftJoin("sys_dict_data as d", "d.dict_type = 'type_of_work' and d.dict_value = a.type_of_work"). + LeftJoin("bus_labourservice as e on e.id = a.labourservice_id"). + Fields("a.openid," + + "a.id," + + "a.clock," + + "if(a.sfz_number is not null and a.sfz_number !='',true,false) as isAuthentication," + + "a.nick_name," + + "a.head_icon," + + "a.user_name," + + "a.pace_photo," + + "a.sex," + + "a.sfz_birth," + + "b.name bz_name," + + "d.dict_label as typeOfWorkName," + + "e.name as lw_name," + + "a.entry_date," + + "a.leave_date,") + //if req.ApproachTime != "" { //进场时间筛选 + // m = m.Where("DATE_FORMAT( a.entry_date, '%Y-%m-%d' ) = ?", req.ApproachTime) + //} + if req.ApproachTime > 0 { + var zd string + if req.OnGuard == "1" || req.OnGuard == "2" { + zd = "a.entry_date" + } else if req.OnGuard == "3" { + zd = "a.leave_date" + } + rawCurdate := gdb.Raw("CURDATE()") + now := time.Now() + switch req.ApproachTime { + case 1: + m = m.WhereBetween(zd, now.AddDate(0, 0, -7), rawCurdate) + case 2: + m = m.WhereBetween(zd, now.AddDate(0, -1, 0), rawCurdate) + case 3: + m = m.WhereBetween(zd, now.AddDate(0, -3, 0), rawCurdate) + case 4: + m = m.WhereBetween(zd, now.AddDate(0, -6, 0), rawCurdate) + case 5: + m = m.WhereBetween(zd, now.AddDate(-1, 0, 0), rawCurdate) + } + //switch req.ApproachTime { + //case 1: + // m = m.WhereBetween(zd, gdb.Raw("DATE_SUB(CURDATE(), INTERVAL 7 DAY)"), rawCurdate) + //case 2: + // m = m.WhereBetween(zd, gdb.Raw("DATE_SUB(CURDATE(), INTERVAL 1 MONTH)"), rawCurdate) + //case 3: + // m = m.WhereBetween(zd, gdb.Raw("DATE_SUB(CURDATE(), INTERVAL 3 MONTH)"), rawCurdate) + //case 4: + // m = m.WhereBetween(zd, gdb.Raw("DATE_SUB(CURDATE(), INTERVAL 6 MONTH)"), rawCurdate) + //case 5: + // m = m.WhereBetween(zd, gdb.Raw("DATE_SUB(CURDATE(), INTERVAL 1 YEAR)"), rawCurdate) + //} + } + if req.ProjectId > 0 { //班组筛选 + m = m.Where("a.project_id", req.ProjectId) + } + if req.TeamID > 0 { //班组筛选 + m = m.Where("a.team_id", req.TeamID) + } + if req.TypeOfWork != "" { //工种筛选 + m = m.Where("a.type_of_work", req.TypeOfWork) + } + if req.ClockIn != "1" { //打卡状态 + if req.ClockIn == "2" { + m = m.Where("a.clock = 1") + } else { + m = m.Where("a.clock = 2") + } + } + if req.ParticipatingUnit > 0 { //参建单位(劳务公司) + m = m.Where("a.labourservice_id", req.ParticipatingUnit) + } + if req.UserName != "" { //模糊查询 + m = m.Where("a."+dao.BusConstructionUser.Columns().UserName+" like ?", "%"+req.UserName+"%") + } + if req.OnGuard != "1" { //筛选入场or退场数据 + if req.OnGuard == "2" { + m = m.Where("a.entry_date is not null and a.entry_date!='' and (a.leave_date is null or a.leave_date = '')") + } else if req.OnGuard == "3" { + m = m.Where("a.leave_date is not null and a.leave_date!=''") + } + } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.BusConstructionUser.Columns().CreatedAt+" >=? AND "+"a."+dao.BusConstructionUser.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + array, err := m.Array() + listRes.Total = len(array) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "a.id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.AppListOfConstructionPersonnelModelRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + for i := range res { + //性别 + switch res[i].Sex { + case "1": + res[i].SexName = "男" + case "2": + res[i].SexName = "女" + case "3": + res[i].SexName = "保密" + } + //获取年龄 + res[i].Age = tool.New().CalculateAge(res[i].SfzBirth) + } + listRes.List = res + }) + return +} + +func (s *sBusConstructionUser) AppAllMembersOfTheCurrentGroupFunc(ctx context.Context, req *wxApplet.AppAllMembersOfTheCurrentGroupReq) (listRes *wxApplet.AppAllMembersOfTheCurrentGroupRes, err error) { + listRes = new(wxApplet.AppAllMembersOfTheCurrentGroupRes) + err = g.Try(ctx, func(ctx context.Context) { + // 1、获取当前用户的班组 + value, _ := dao.BusConstructionUser.Ctx(ctx). + Where(dao.BusConstructionUser.Columns().Openid, req.Openid). + Fields("team_id"). + Value() + if value.Int64() == 0 { + err = errors.New("暂无班组,请联系管理员!") + liberr.ErrIsNil(ctx, err) + return + } + // 2、根据班组获取的所有成员(除了当前用户) + var res []*model.AppAllMembersOfTheCurrentGroupRes + m := dao.SysProjectTeamMember.Ctx(ctx).As("a"). + LeftJoin(dao.BusConstructionUser.Table(), "b", "b.openid = a.openid"). + Where("a."+dao.SysProjectTeamMember.Columns().TeamId, value.Int64()). + WhereNot("a."+dao.SysProjectTeamMember.Columns().Openid, req.Openid) + if req.LikeName != "" { + m = m.Where("b."+dao.BusConstructionUser.Columns().UserName+" like ?", "%"+req.LikeName+"%") + } + array, err := m.Array() + listRes.Total = len(array) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "a.id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + err = m.Fields("b.pace_photo,b.user_name,b.openid").Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取班组成员信息失败") + listRes.List = res + }) + return +} + +func (s *sBusConstructionUser) ActionPathFunc(ctx context.Context, req *wxApplet.ActionPathReq) (latAndLon []*wxApplet.ActionPathLatAndLonActionPathLatAndLon, err error) { + g.Try(ctx, func(ctx context.Context) { + // 1、查询当前人是否有安全帽 + value, err := dao.BusConstructionUser.Ctx(ctx).Where("openid", req.Openid).Fields("dev_num").Value() + if value.String() == "" { + err = errors.New("当前用户暂无安全帽设备!") + liberr.ErrIsNil(ctx, err) + return + } + // 2、查询设备是否被删除 + count, err := g.DB().Model("device").Ctx(ctx).Where("dev_num", value.String()).Count() + if count == 0 { + err = errors.New("当前用户安全帽设备已被删除!") + liberr.ErrIsNil(ctx, err) + return + } + // 3、插叙当前用户的足迹,按照日期时间范围筛选 + m := g.DB().Model("location").Ctx(ctx).Where("dev_num", value.String()) + if len(req.DateRange) > 0 { + m = m.Where("DATE_FORMAT(time,'%Y-%m-%d') >=? AND DATE_FORMAT(time,'%Y-%m-%d') <=?", req.DateRange[0], req.DateRange[1]) + } + err = m.OrderAsc("time").Scan(&latAndLon) + // 4、坐标转换 + for i := range latAndLon { + latAndLon[i].Longitude, latAndLon[i].Latitude = coryCommon.WGS84toGCJ02(latAndLon[i].Longitude, latAndLon[i].Latitude) + } + liberr.ErrIsNil(ctx, err, "获取足迹失败!") + }) + return +} + +func (s *sBusConstructionUser) GetDetailsFunc(ctx context.Context, req *wxApplet.GetDetailsReq) (res *wxApplet.GetDetailsRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 1、获取数据 + m := dao.BusConstructionUser.Ctx(ctx).WithAll() + m = m.As("a"). + LeftJoin("sys_project_team as b on b.id=a.team_id"). + LeftJoin("bus_labourservice as e on e.id = a.labourservice_id"). + LeftJoin("bus_type_of_wage as f on a.type_of_work = f.type_of_work"). + // LeftJoin("sys_project_team_member as c on c.team_id = c.team_id and c.post_id = 10"). + Fields("a.pace_photo,a.id,a.openid,a.nick_name,a.salary,a.team_id,a.user_name,a.project_id,a.status,a.phone,a.sex,a.sfz_nation,a.sfz_number,a.sfz_start,a.sfz_end,a.sfz_site,a.sfz_birth,a.native_place,a.yhk_number,a.yhk_opening_bank,a.yhk_cardholder,a.type_of_work,a.clock,a.labourservice_id,a.entry_date,a.leave_date,"+ + "b.name bz_name,"+ + //"IFNULL(c.user_name,c.nick_name) as bzzName," + + "e.name as lw_name,"+ + "f.standard as original").Where("a.id", req.Id) + order := "id desc" + err = m.Order(order).Scan(&res) + if err != nil { + liberr.ErrIsNil(ctx, err, "获取数据失败") + return + } + // 2、计算年龄、得到班组长名字 + value, errValue := dao.SysProjectTeamMember.Ctx(ctx).As("a"). + LeftJoin("bus_construction_user as b on b.openid = a.openid"). + Fields("IFNULL(b.user_name,b.nick_name) as bzzName"). + Where("a.team_id", res.TeamId).Where("a.post_id", "10").Value() + if errValue != nil { + liberr.ErrIsNil(ctx, errValue, "获取数据失败") + return + } + res.Age = tool.New().CalculateAge(res.SfzBirth) + res.BzzName = value.String() + // 查询是否有试卷 + valueTwo, errTwo := g.DB().Model("bus_question_save_pdf").Ctx(ctx).Where("openid", res.Openid).Fields("path").Value() + if errTwo == nil { + res.WoPdf = valueTwo.String() + } + }) + return +} + +func (s *sBusConstructionUser) ChangePayFunc(ctx context.Context, req *wxApplet.ChangePayReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //1、查询当前用户bus_construction_user的班组id + var entity *model.BusConstructionUserInfoRes + dao.BusConstructionUser.Ctx(ctx).Where("openid", req.Openid).Fields("team_id,phone").Scan(&entity) + if entity == nil { + return + } + // 2、如果当前用户有班组id,那么去sys_project_team_member中把当前用户删除 + if err == nil && entity.TeamId > 0 { + //_, err = dao.SysProjectTeamMember.Ctx(ctx).Where("openid", req.Openid).Delete() + err = errors.New("当前人员还未退场,不允许迁移!") + liberr.ErrIsNil(ctx, err) + return + } + // 3、修改当前用户bus_construction_user的项目id + g2 := g.Map{ + //"leave_date": tool.New().GetFormattedDateTime(time.Now()), + "project_id": req.ProjectId, + //"team_id": nil, + "if_management": nil, + } + _, err = dao.BusConstructionUser.Ctx(ctx).Where("openid", req.Openid).Update(g2) + liberr.ErrIsNil(ctx, err, "修改失败") + //4、更换项目成功,那么存缓存清除token,使人员重新登录 + userId, _ := g.DB().Model("sys_user").Ctx(ctx).Where("mobile", entity.Phone).Fields("id").Value() + err := deleteKeys(userId.String(), req.Openid) + liberr.ErrIsNil(ctx, err, "强制下线失败") + }) + return err + }) + return err +} + +func deleteKeys(userID, openID string) error { + ctx := context.Background() + UserIDResponse, err := g.Redis().Do(ctx, "KEYS", "gfToken:"+userID+"-*") + if err != nil { + return err + } + OpenIDResponse, err := g.Redis().Do(ctx, "KEYS", "gfToken:"+openID+"-*") + if err != nil { + return err + } + redisResponse := append(UserIDResponse.Strings(), OpenIDResponse.Strings()...) + for _, key := range redisResponse { + g.Redis().Do(ctx, "DEL", key) + } + return nil +} + +func (s *sBusConstructionUser) PersonnelInquiryFunc(ctx context.Context, req *wxApplet.PersonnelInquiryReq) (listRes *wxApplet.PersonnelInquiryRes, err error) { + listRes = new(wxApplet.PersonnelInquiryRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusConstructionUser.Ctx(ctx).As("a").Where("a.status", "0").Fields("id,openid,user_name") + if req.ProjectId > 0 { + m = m.Where("a.project_id", req.ProjectId) + } + if req.UserName != "" { + m = m.Where("a."+dao.BusConstructionUser.Columns().UserName+" like ?", "%"+req.UserName+"%") + } + array, err := m.Array() + listRes.Total = len(array) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusConstructionUserInfoRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusConstructionUserListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusConstructionUserListRes{ + Id: v.Id, + Openid: v.Openid, + UserName: v.UserName, + } + } + return + }) + return listRes, err +} + +func (s *sBusConstructionUser) ChangeStateFunc(ctx context.Context, req *wxApplet.ChangeStateReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionUser.Ctx(ctx). + Where(dao.BusConstructionUser.Columns().Id+" in (?)", req.Ids). + Update(g.Map{"status": req.Status}) + liberr.ErrIsNil(ctx, err, "更新状态失败!") + }) + return err + }) + return +} + +func (s *sBusConstructionUser) SubscriptionFunc(ctx context.Context, req *wxApplet.SubscriptionFuncReq) (res *wxApplet.SubscriptionFuncRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionUser.Ctx(ctx). + Where(dao.BusConstructionUser.Columns().Openid, req.Openid). + Update(g.Map{"subscription": req.Subscription}) + liberr.ErrIsNil(ctx, err, "变更订阅状态失败!") + }) + return +} + +func (s *sBusConstructionUser) HumanFaceFunc(ctx context.Context, req *wxApplet.HumanFaceReq) (res *wxApplet.HumanFaceReqRes, err error) { + path, pathErr := moveImage(req.FacePhoto) + if pathErr == nil { + req.FacePhoto = path + } + _, err = dao.BusConstructionUser.Ctx(ctx).WherePri("openid", req.Openid).Update(g.Map{"pace_photo": req.FacePhoto}) + if err != nil { + return + } + return +} + +func (s *sBusConstructionUser) ProjectRecordFunc(ctx context.Context, req *wxApplet.ProjectRecordReq) (res *wxApplet.ProjectRecordRes, err error) { + _, err = dao.BusConstructionUser.Ctx(ctx).Where("openid", req.Openid).Update(g.Map{"project_record": req.ProjectRecord}) + if err != nil { + return + } + return +} + +func (s *sBusConstructionUser) AttendanceCountListFunc(ctx context.Context, req *wxApplet.AttendanceListReq) (res *wxApplet.AttendanceListRes, err error) { + //查询当前班组的班组长,是否是当前请求人,如若不是就不返回电话号码 + od := ct.New().GetLoginUser(ctx).OpenId + count, _ := dao.SysProjectTeamMember.Ctx(ctx). + Where(dao.SysProjectTeamMember.Columns().Openid, od). + Where(dao.SysProjectTeamMember.Columns().PostId, "10").Count() + + res = new(wxApplet.AttendanceListRes) + err = g.Try(ctx, func(ctx context.Context) { + // 模糊查询名字 + var openids []string + if req.UserName != "" { + value, err := dao.BusConstructionUser.Ctx(ctx).Where("user_name like ?", "%"+req.UserName+"%").Fields("GROUP_CONCAT(openid)").Value() + liberr.ErrIsNil(ctx, err) + split := strings.Split(value.String(), ",") + for i := range split { + openids = append(openids, split[i]) + } + } + // 1、获取当前班组下的人员 + sqlSrtr := "" + var plList []*wxApplet.PersonnelList + // 连接字典表 bus_attendance考勤表 施工人员表 + m := dao.BusConstructionUser.Ctx(ctx).As("a"). + LeftJoin("bus_attendance", "b", "b.openid = a.openid"). + LeftJoin("sys_dict_data", "c", "c.dict_type = 'type_of_work' and c.dict_value = a.type_of_work"). + Fields(` + a.user_name as userName, + a.sex, + a.phone, + c.dict_label as dictLabel, + if(b.printing_date=CURRENT_DATE,1,2) as isStatus + `).Group("a.openid") // a.pace_photo as pacePhoto, + if req.TeamId > 0 { + sqlSrtr = "SELECT 1 " + + "FROM bus_construction_user a2 LEFT JOIN bus_attendance b2 ON b2.openid = a2.openid " + + "WHERE a2.team_id = " + strconv.FormatInt(req.TeamId, 10) + " AND a2.project_id = " + strconv.FormatInt(req.ProjectId, 10) + " AND b2.printing_date = CURRENT_DATE AND a.openid = a2.openid" + m = m.Where("a."+dao.SysProjectTeamMember.Columns().TeamId, req.TeamId) + } + if req.ProjectId > 0 { + sqlSrtr = "SELECT 1 " + + "FROM bus_construction_user a2 LEFT JOIN bus_attendance b2 ON b2.openid = a2.openid " + + "WHERE a2.project_id = " + strconv.FormatInt(req.ProjectId, 10) + " AND b2.printing_date = CURRENT_DATE AND a.openid = a2.openid" + m = m.Where("a."+dao.SysProjectTeamMember.Columns().ProjectId, req.ProjectId) + } + if len(openids) > 0 { + m = m.Where("a.openid in (?)", openids) + } + if req.Status == 1 { + m = m.Where("b.printing_date=CURRENT_DATE") + } + if req.Status == 2 { + m = m.Where("b.printing_date<>CURRENT_DATE or b.printing_date is null") + m = m.Where("NOT EXISTS (" + sqlSrtr + ")") + } + array, err := m.Array() + res.Total = len(array) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + res.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + if req.Status == 0 { + order := "isStatus asc" + if req.OrderBy != "" { + order = req.OrderBy + } + m = m.Order(order) + } + + err = m.Page(req.PageNum, req.PageSize).Scan(&plList) + + for i := range plList { + if count > 0 { + plList[i].Phone = encryptAES256(plList[i].Phone) + } else { + plList[i].Phone = "" + } + + } + + res.PersonnelList = plList + liberr.ErrIsNil(ctx, err, "获取数据失败") + return + }) + return +} + +func encryptAES256(plaintext string) string { + key := []byte(coryMy) + block, err := aes.NewCipher(key) + if err != nil { + panic(err) + } + blockSize := block.BlockSize() + padding := blockSize - len(plaintext)%blockSize + padtext := append([]byte(plaintext), bytes.Repeat([]byte{byte(padding)}, padding)...) + ciphertext := make([]byte, len(padtext)) + mode := cipher.NewCBCEncrypter(block, key[:blockSize]) + mode.CryptBlocks(ciphertext, padtext) + return base64.StdEncoding.EncodeToString(ciphertext) +} + +func (s *sBusConstructionUser) AttendanceFunc(ctx context.Context, req *wxApplet.AttendanceReq) (res *wxApplet.AttendanceRes, err error) { + res = new(wxApplet.AttendanceRes) + // 1、获取当前班组的总人数 + one1 := dao.SysProjectTeamMember.Ctx(ctx) + g2 := dao.BusAskforleave.Ctx(ctx) + if req.TeamId != "" { + one1 = one1.Where(dao.SysProjectTeamMember.Columns().TeamId, req.TeamId) + g2 = g2.Where(dao.BusAskforleave.Columns().TeamId, req.TeamId) + } else if req.ProjectId != "" { + one1 = one1.Where(dao.SysProjectTeamMember.Columns().ProjectId, req.ProjectId) + g2 = g2.Where(dao.BusAskforleave.Columns().Openid, req.ProjectId) + } else { + err = errors.New("请求参数错误") + return + } + var valOpenids []string + arr, err := g2.Fields(dao.BusAskforleave.Columns().Openid).Where(gdb.Raw("current_date BETWEEN DATE_FORMAT(start_time,'%Y-%m-%d') AND DATE_FORMAT(end_time,'%Y-%m-%d')")).Array() + for _, openid := range arr { + valOpenids = append(valOpenids, gconv.String(openid)) + } + if len(valOpenids) > 0 { + one1 = one1.WhereNotIn(dao.SysProjectTeamMember.Columns().Openid, valOpenids) + } + res.Headcount, err = one1.Count() + if err != nil { + return + } + // 2、获取当天实际出勤人数 + one2 := dao.SysProjectTeamMember.Ctx(ctx).As("a"). + RightJoin("bus_attendance as b on b.printing_date = current_date and a.openid = b.openid") + if req.TeamId != "" { + one2 = one2.Where("a."+dao.SysProjectTeamMember.Columns().TeamId, req.TeamId) + } else if req.ProjectId != "" { + one2 = one2.Where("a."+dao.SysProjectTeamMember.Columns().ProjectId, req.ProjectId) + } + count, err := one2.Fields("COUNT( DISTINCT b.openid )").Value() + if err != nil { + return + } + res.ResponseCunt = count.Int() + //3、获取到请假人数 + array, err := dao.BusAskforleave.Ctx(ctx). + Where(dao.BusAskforleave.Columns().ProjectId, req.ProjectId). + Where(dao.BusAskforleave.Columns().GangerOpinion, "2"). + Where(dao.BusAskforleave.Columns().ManagerOpinion, "2"). + Where(gdb.Raw("current_date BETWEEN DATE_FORMAT(start_time,'%Y-%m-%d') AND DATE_FORMAT(end_time,'%Y-%m-%d')")). + Fields(dao.BusAskforleave.Columns().Openid). + Array() + liberr.ErrIsNil(ctx, err, "获取请假人数失败") + res.AskForLeave = len(array) + // 3、计算出勤率 + if res.Headcount != 0 && res.ResponseCunt != 0 { + bai := 100.00 / float64(res.Headcount-len(array)) * float64(res.ResponseCunt) + res.Ratio = strconv.FormatFloat(bai, 'f', 2, 64) + } + if res.Ratio == "" { + res.Ratio = "0" + } + return +} + +func (s *sBusConstructionUser) PayFunc(ctx context.Context, req *wxApplet.PayFuncReq) (res *wxApplet.PayFuncRes, err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 1、修改原数据 + xz := "0" + str := req.TypeStr + if str == "1" { + xz = req.Salary + } else if str == "2" { + xz = "0" + } else { + err = errors.New("typeStr参数错误,取值范围1~2!") + return + } + _, err = dao.BusConstructionUser.Ctx(ctx).Where("openid", req.Openid).Update(g.Map{"salary": xz}) + }) + return err + }) + return +} + +func (s *sBusConstructionUser) GroupLeader(ctx context.Context, req *wxApplet.GroupLeaderReq) (listRes *wxApplet.GroupLeaderRes, err error) { + listRes = new(wxApplet.GroupLeaderRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SysProjectTeamMember.Ctx(ctx).As("a"). + LeftJoin(dao.BusConstructionUser.Table()+" b", "a.openid = b.openid"). + Fields("a.id,a.openid,b.head_icon,b.phone,b.user_name"). + Where("a.team_id", req.TeamId) + + if req.UserName != "" { + array, err := dao.BusConstructionUser.Ctx(ctx).Where("team_id", req.TeamId).Where("user_name like ?", "%"+req.UserName+"%").Fields("openid").Array() + liberr.ErrIsNil(ctx, err) + if err == nil && len(array) > 0 { + var strt []string + for i := range array { + strt = append(strt, array[i].String()) + } + m = m.Where("a.openid in (?)", strt) + } + } + array, err := m.Array() + listRes.Total = len(array) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "a.id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusConstructionUserInfoRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusConstructionUserListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusConstructionUserListRes{ + Openid: v.Openid, + UserName: v.UserName, + // HeadIcon: v.HeadIcon, + Phone: v.Phone, + Id: v.Id, + } + } + }) + return +} + +func (s *sBusConstructionUser) GetByOpenId(ctx context.Context, OpenId string) (res *wxApplet.BusConstructionUserByOpenIdGetRes, err error) { + res = new(wxApplet.BusConstructionUserByOpenIdGetRes) + err = g.Try(ctx, func(ctx context.Context) { + // 1-1、基本数据 + err = dao.BusConstructionUser.Ctx(ctx).As("a").WithAll(). + LeftJoin("sys_project as b on a.project_id = b.id"). + LeftJoin(dao.SysProjectTeam.Table(), "c", "c.id = a.team_id"). + Where("a."+dao.BusConstructionUser.Columns().Openid, OpenId). + Fields("a.*,b.project_name as name,c.name as bzName").Scan(&res) + + // 1-2、获取当前用户是否有加入组,是否是组长 + var memberEntity *model.SysProjectTeamMemberInfoRes + err = dao.SysProjectTeamMember.Ctx(ctx).Where("openid", OpenId).Limit(1).Scan(&memberEntity) + if err == nil && memberEntity != nil { + res.TeamId = memberEntity.TeamId // 设置组id + if memberEntity.PostId == 10 { + res.IfManagement = "1" // 班组长 + } else { + res.IfManagement = "0" // 普通成员 + } + } + // 2、图片资源 + var dataInfo []*model.BusConstructionUserFileListRes + dao.BusConstructionUserFile.Ctx(ctx).Where("user_id", res.Id).Where("user_img_type in (0,1,2,3)").Scan(&dataInfo) + res.ImgFileList = dataInfo + // 3、获取当前用户是否是某个项目的管理人员 + value, err := controllerDao.SysProject.Ctx(ctx).Where(controllerDao.SysProject.Columns().PrincipalXz, OpenId).Fields("id").Value() + if value != nil { + res.IfAdministrator = "1" // 开启项目管理 + // res.ProjectId = value.Int64() + } else { + res.IfAdministrator = "0" // 不开启项目管理 + } + // 获取当前项目简称 + shortName, err := controllerDao.SysProject.Ctx(ctx).WherePri(res.ProjectId).Fields("short_name").Value() + res.ShortName = shortName.String() + liberr.ErrIsNil(ctx, err, "获取数据失败!") + // 2、获取用户拥有的角色 + var swuri []*controllerModel.SysWechatUserRoleInfoRes + err = g.DB().Model("sys_wechat_user_role").Where("user_id", res.Id).Scan(&swuri) + liberr.ErrIsNil(ctx, err, "获取角色模块失败") + for i := range swuri { + res.RoleIds = append(res.RoleIds, swuri[i].RoleId) + } + }) + return res, err +} + +func (s *sBusConstructionUser) List(ctx context.Context, req *wxApplet.BusConstructionUserSearchReq) (listRes *wxApplet.BusConstructionUserSearchRes, err error) { + listRes = new(wxApplet.BusConstructionUserSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusConstructionUser.Ctx(ctx).WithAll() + m = m.As("a"). + LeftJoin("sys_project_team as b on b.id=a.team_id"). + LeftJoin("bus_labourservice as e on e.id = a.labourservice_id"). + LeftJoin("bus_type_of_wage as f on a.type_of_work = f.type_of_work"). + LeftJoin("bus_construction_blacklist as g on a.openid = g.openid"). + LeftJoin("bus_constructiom_user_signature as h on h.openid = a.openid"). + // LeftJoin("sys_project_team_member as c on c.team_id = c.team_id and c.post_id = 10"). + LeftJoin("bus_construction_user_file AS bcuf ON bcuf.user_id = a.id AND bcuf.user_img_type IN ('4','5','6','7','8','10') AND bcuf.path <> '' "). + Fields("g.openid as blackOpenid,a.dev_num,a.id,a.openid,a.nick_name,a.salary,a.team_id,a.user_name,a.project_id,a.status,a.phone,a.sex,a.sfz_nation,a.sfz_number,a.sfz_start,a.sfz_end,a.sfz_site,a.sfz_birth,a.native_place,a.yhk_number,a.yhk_opening_bank,a.yhk_cardholder,a.type_of_work,a.clock,a.labourservice_id,a.entry_date,a.leave_date," + + "b.name bz_name," + + //"IFNULL(c.user_name,c.nick_name) as bzzName," + + "e.name as lw_name," + + "f.standard as original," + + "h.signature as signature," + + " COUNT(bcuf.id) AS numbercount") + if req.FileStatus == "3" { + m = m.Having("numbercount = 6 ") + } + if req.FileStatus == "2" { + m = m.Having("numbercount <> 0 and numbercount <> 6 ") + } + if req.FileStatus == "1" { + m = m.Having("numbercount = 0 ") + } + if req.LabourserviceId != 0 { + m = m.Where("a."+dao.BusConstructionUser.Columns().LabourserviceId, req.LabourserviceId) + } + if req.Clock != "" { + m = m.Where("a.clock = ?", req.Clock) + } + if req.ProjectId != "" { + m = m.Where("a."+dao.BusConstructionUser.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + if req.Status != "" { + m = m.Where("a."+dao.BusConstructionUser.Columns().Status+" = ?", req.Status) + } + if req.WxOrPc != "" { + m = m.Where("a."+dao.BusConstructionUser.Columns().WxOrPc+" = ?", req.WxOrPc) + } + if req.Sex != "" { + m = m.Where("a."+dao.BusConstructionUser.Columns().Sex+" = ?", req.Sex) + } + if req.TeamId > 0 { + m = m.Where("a."+dao.BusConstructionUser.Columns().TeamId+" = ?", req.TeamId) + } + if req.TypeOfWork != "" { + m = m.Where("a."+dao.BusConstructionUser.Columns().TypeOfWork+" = ?", req.TypeOfWork) + } + // 查询没有分班组的,表示新用户 + if req.NewUser == 1 { + m = m.Where("a.team_id IS NULL or a.team_id < 1") + } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.BusConstructionUser.Columns().CreatedAt+" >=? AND "+"a."+dao.BusConstructionUser.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + if req.NickName != "" { + m = m.Where("a."+dao.BusConstructionUser.Columns().NickName+" like ?", "%"+req.NickName+"%") + } + if req.UserName != "" { + m = m.Where("a."+dao.BusConstructionUser.Columns().UserName+" like ?", "%"+req.UserName+"%") + } + if req.Phone != "" { + m = m.Where("a."+dao.BusConstructionUser.Columns().Phone+" like ?", "%"+req.Phone+"%") + } + if req.SfzNation != "" { + m = m.Where("a."+dao.BusConstructionUser.Columns().SfzNation+" like ?", "%"+req.SfzNation+"%") + } + if req.NativePlace != "" { + m = m.Where("a."+dao.BusConstructionUser.Columns().NativePlace+" like ?", "%"+req.NativePlace+"%") + } + // 分组 + m = m.Group(" a.user_name,a.phone,a.sex,a.openid,a.id") + array, err := m.Array() + listRes.Total = len(array) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusConstructionUserInfoTwoRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusConstructionUserListRes, len(res)) + var sfz []string + for k, v := range res { + // 施工人员的文件资料是否上传完毕 + j := 0 + jList := v.UserFileList + v.FileStatus = "1" // 一张都没上传 + for _, jData := range jList { + if jData.Path != "" { + j = j + 1 + v.FileStatus = "2" // 没有上传完 + } + if j == len(jList) { + v.FileStatus = "3" // 上传完毕了 + } + } + // 班组长名字 + // value, _ := dao.SysProjectTeamMember.Ctx(ctx).As("a"). + // LeftJoin("bus_construction_user as b on b.openid = a.openid"). + // Fields("IFNULL(b.user_name,b.nick_name) as bzzName"). + // Where("a.team_id", v.TeamId).Where("a.post_id", "10").Value() + sfz = append(sfz, v.SfzNumber) + listRes.List[k] = &model.BusConstructionUserListRes{ + Id: v.Id, + Openid: v.Openid, + NickName: v.NickName, + TeamId: v.TeamId, + // HeadIcon: v.HeadIcon, + // PacePhoto: v.PacePhoto, + UserName: v.UserName, + ProjectId: v.ProjectId, + Status: v.Status, + // IsPinch: v.IsPinch, + // IfManagement: v.IfManagement, + // CreatedAt: v.CreatedAt, + Phone: v.Phone, + Sex: v.Sex, + SfzNation: v.SfzNation, + SfzNumber: v.SfzNumber, + SfzStart: v.SfzStart, + SfzEnd: v.SfzEnd, + SfzSite: v.SfzSite, + Age: tool.New().CalculateAge(v.SfzBirth), + NativePlace: v.NativePlace, + YhkNumber: v.YhkNumber, + YhkOpeningBank: v.YhkOpeningBank, + YhkCardholder: v.YhkCardholder, + TypeOfWork: v.TypeOfWork, + Clock: v.Clock, + LabourserviceId: v.LabourserviceId, + EntryDate: v.EntryDate, + LeaveDate: v.LeaveDate, + Salary: v.Salary, + BzName: v.BzName, + // BzzName: value.String(), + // BzzName: v.BzzName, + LwName: v.LwName, + OriginalSalary: v.Original, + ProjectRecord: v.ProjectRecord, + BlackOpenid: v.BlackOpenid, + // IsPass: funt.IsPass, + // PdfStr: funt.PdfStr, + FileStatus: v.FileStatus, + Signature: strings.Replace(v.Signature, "resource/public", "/wxfile", 1), + } + } + // 获取到身份证,去查询入场退场记录信息是否有 + var entity []controllerModel.BusConstructionUserDepartureInfoRes + err = g.DB().Model("bus_construction_user_departure").Ctx(ctx).Where("sfz_number in (?)", sfz).Scan(&entity) + for i := range listRes.List { + for j := range entity { + if listRes.List[i].SfzNumber == entity[j].SfzNumber { + listRes.List[i].HistoricalRetreat = true + } + } + } + liberr.ErrIsNil(ctx, err, "获取数据失败") + }) + return +} + +func (s *sBusConstructionUser) PersonnelListFunc(ctx context.Context, req *wxApplet.PersonnelListReq) (listRes *wxApplet.PersonnelListRes, err error) { + listRes = new(wxApplet.PersonnelListRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusConstructionUser.Ctx(ctx).WithAll() + m = m.As("a"). + LeftJoin("sys_project_team_member as b on a.openid = b.openid and b.deleted_at is NULL"). + Fields("a.id,a.openid,a.head_icon,a.user_name"). + WhereNull("b.openid"). + WhereNull("a.deleted_at"). + WhereNotNull("a.sfz_number"). + Where("a.sfz_number!=''"). + Unscoped() + // 查询没有分班组的,表示新用户 + if req.NewUser == 1 { + // m = m.WhereNull("a." + dao.BusConstructionUser.Columns().TeamId).WhereOr("a.team_id < 1") + m = m.Where("a.team_id IS NULL or a.team_id < 1") + } + if req.UserName != "" { + m = m.Where("a."+dao.BusConstructionUser.Columns().UserName+" like ?", "%"+req.UserName+"%") + } + array, err := m.Array() + listRes.Total = len(array) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusConstructionUserInfoRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusConstructionUserListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusConstructionUserListRes{ + Id: v.Id, + Openid: v.Openid, + HeadIcon: v.HeadIcon, + UserName: v.UserName, + } + } + return + }) + return listRes, err +} + +func (s *sBusConstructionUser) GetById(ctx context.Context, id int64) (res *model.BusConstructionUserInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + // 1、基本数据 + err = dao.BusConstructionUser.Ctx(ctx).FieldsEx("head_icon,pace_photo").WithAll().Where(dao.BusConstructionUser.Columns().Id, id).Scan(&res) + // 1-2、获取当前用户是否有加入组,是否是组长 + var memberEntity *model.SysProjectTeamMemberInfoRes + err = dao.SysProjectTeamMember.Ctx(ctx).Where("openid", res.Openid).Limit(1).Scan(&memberEntity) + if err == nil && memberEntity != nil { + res.TeamId = memberEntity.TeamId // 设置组id + if memberEntity.PostId == 10 { + res.IfManagement = "1" // 班组长 + } else { + res.IfManagement = "0" // 普通成员 + } + // 查询是否有试卷 + value, err2 := g.DB().Model("bus_question_save_pdf").Ctx(ctx).Where("openid", memberEntity.Openid).Fields("path").Value() + if err2 == nil { + memberEntity.WoPdf = value.String() + } + } + liberr.ErrIsNil(ctx, err, "获取信息失败") + // 2、获取用户拥有的角色 + var swuri []*controllerModel.SysWechatUserRoleInfoRes + err = g.DB().Model("sys_wechat_user_role").Where("user_id", res.Id).Scan(&swuri) + liberr.ErrIsNil(ctx, err, "获取角色模块失败") + for i := range swuri { + res.RoleIds = append(res.RoleIds, swuri[i].RoleId) + } + }) + return +} + +func (s *sBusConstructionUser) Add(ctx context.Context, req *wxApplet.BusConstructionUserAddReq) (idInt int64, err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + var ( + result sql.Result + err error + ) + // 避免重复创建小程序用户 + count, err := dao.BusConstructionUser.Ctx(ctx).Where("openid", req.Openid).Count() + liberr.ErrIsNil(ctx, err, "查询当前用户是否存在失败!") + if count > 0 { + err = errors.New("请不要重复注册该小程序") + liberr.ErrIsNil(ctx, err) + return + } + //// 根据数据库存储的图片路径 转成bae64进行打卡,如果不是存储的路径就不转 + //if !strings.Contains(req.PacePhoto, "wxfile") && !strings.Contains(req.PacePhoto, "file") { + // //将base64人脸换成图片存储到本地 + if req.WxOrPc == "1" { + currentTime := time.Now() + timestamp := currentTime.UnixNano() / int64(time.Millisecond) + randomNum := rand.Intn(1000) + req.Openid = fmt.Sprintf("%d_%d", timestamp, randomNum) + req.CreateBy = strconv.FormatUint(ct.New().GetLoginUser(ctx).Id, 10) + //req.PacePhoto, err = coryCommon.Base64ToImgFunc(req.PacePhoto, "1") + } else { + // req.PacePhoto, err = coryCommon.Base64ToImgFunc(req.PacePhoto, "2") + req.WxOrPc = "2" + req.CreateBy = req.Openid + } + //} + //if err != nil { + // liberr.ErrIsNil(ctx, err) + // return + //} + // + //如果身份证信息已经存在,就不允许插入 + if req.SfzNumber != "" { + count, err := dao.BusConstructionUser.Ctx(ctx).Where("sfz_number", req.SfzNumber).Count() + liberr.ErrIsNil(ctx, err) + if count > 0 { + err = errors.New("当前身份证已被使用!") + liberr.ErrIsNil(ctx, err) + return + } + } + path, pathErr := moveImage(req.PacePhoto) + if pathErr == nil { + req.PacePhoto = path + } + // 1、新增微信用户数据 + result, err = dao.BusConstructionUser.Ctx(ctx).Insert(do.BusConstructionUser{ + Openid: req.Openid, + //NickName: req.NickName, + TeamId: req.TeamId, + //HeadIcon: req.HeadIcon, + PacePhoto: req.PacePhoto, + UserName: req.UserName, + ProjectId: req.ProjectId, + // Status: req.Status, + IsPinch: req.IsPinch, + IfManagement: req.IfManagement, + CreateBy: req.CreateBy, + Phone: req.Phone, + Sex: req.Sex, + SfzNation: req.SfzNation, + SfzNumber: req.SfzNumber, + SfzStart: req.SfzStart, + SfzEnd: req.SfzEnd, + SfzSite: req.SfzSite, + NativePlace: req.NativePlace, + YhkNumber: req.YhkNumber, + YhkOpeningBank: req.YhkOpeningBank, + YhkCardholder: req.YhkCardholder, + WxOrPc: req.WxOrPc, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + // 2、获取新增返回的主键ID + id, err := result.LastInsertId() + idInt = id + // 3、新增微信用户与岗位关联 + postEntity := req.PostReq + if req.PostReq != nil && id != 0 { + postEntity.ConstructionUserId = id + _, err = dao.BusConstructionUserPost.Ctx(ctx).Insert(postEntity) + liberr.ErrIsNil(ctx, err, "新增微信用户与岗位关联失败") + } + // 4、施工人员对应项目 + listReq := req.ProjectListReq + if listReq != nil && len(listReq) > 0 { + for _, data := range listReq { + data.ConstructionUserId = id + } + _, err = dao.BusConstructionProject.Ctx(ctx).Insert(listReq) + liberr.ErrIsNil(ctx, err, "新增施工人员对应项目失败") + } + ////5、初始化数据 //cory 批量新增身份证等图片数据 + //var reqDataType *system.GetDictReq + //reqDataType = &system.GetDictReq{ + // DictType: "user_img_type", + //} + //dict, err := sysControler.New().GetDictWithDataByType(ctx, reqDataType) + //var reqDataTypeList []*model.BusConstructionUserFileInfoRes + //for _, dataInfo := range dict.Values { + // var reqDataType = model.BusConstructionUserFileInfoRes{ + // UserId: id, + // UserImgType: dataInfo.DictValue, + // } + // reqDataTypeList = append(reqDataTypeList, &reqDataType) + //} + //_, err = dao.BusConstructionUserFile.Ctx(ctx).Insert(reqDataTypeList) + err = InitializationDataFunc(ctx, id) + liberr.ErrIsNil(ctx, err, "初始化施工人员信息失败数据") + // 6、用户与角色管理 + var roleIds []int64 + roleIds = append(roleIds, 1) + err = InsertRoleModuleFunc(ctx, roleIds, id) + liberr.ErrIsNil(ctx, err, "修改用户角色失败") + }) + return err + }) + return +} + +// 将人脸的图片从a移到b +func moveImage(yPath string) (path string, err error) { + if strings.Contains(yPath, "/file") { + yPath = strings.Replace(yPath, "/file", coryCommon.GetCWD()+"/resource/public", 1) + } else if strings.Contains(yPath, "/wxfile") { + yPath = strings.Replace(yPath, "/wxfile", coryCommon.GetCWD()+"/resource/public", 1) + } + // 先判断源文件是否存在 + _, err = os.Stat(yPath) + if err != nil { + return + } + // 重命名(移动)文件,其实底层在同一个文件系统内移动文件就是重命名操作 + replace := strings.Replace(yPath, "/resource/public/upload_file", coryCommon.Portrait, 1) + err = os.Rename(yPath, replace) + if err != nil { + return + } + return coryCommon.ResourcePublicToFunc(replace, 1), err +} + +// AgeLimitFunc 判断实名认证的时候年龄是否满足要求 +func AgeLimitFunc(ctx context.Context, sex, sfzBirth string) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + str := tool.New().CalculateAge(sfzBirth) + age, err := strconv.Atoi(str) + if err != nil { + liberr.ErrIsNil(ctx, err, "年龄转换失败") + } + if age < 18 { + err = errors.New("您还是未成年,不给予实名认证!") + liberr.ErrIsNil(ctx, err) + } + if sex == "1" && age >= 60 { + err = errors.New("不好意思,您的年龄为" + str + ",不给予实名认证!") + liberr.ErrIsNil(ctx, err) + } + if sex == "2" && age >= 55 { + err = errors.New("不好意思,您的年龄为" + str + ",不给予实名认证!") + liberr.ErrIsNil(ctx, err) + } + }) + return +} + +func (s *sBusConstructionUser) Edit(ctx context.Context, req *wxApplet.BusConstructionUserEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + var ( + _ sql.Result + err error + ) + if req.Sex != "" && req.SfzBirth != "" { + err = AgeLimitFunc(ctx, req.Sex, req.SfzBirth) + liberr.ErrIsNil(ctx, err) + } + // 身份证不为空,那么就看看是否有人使用,如果有就不允许再次录入 + if req.SfzNumber != "" { + count, _ := dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().SfzNumber, req.SfzNumber).Where("openid <> ?", req.Openid).Count() + if count > 0 { + err = errors.New("当前身份证已被其他账号绑定使用!") + liberr.ErrIsNil(ctx, err) + return + } + } + if req.Phone != "" { + count, _ := dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().Phone, req.Phone).Where("openid <> ?", req.Openid).Count() + if count > 0 { + err = errors.New("当前手机号已被其他账号绑定使用!") + liberr.ErrIsNil(ctx, err) + return + } + } + //// 根据数据库存储的图片路径 转成bae64进行打卡,如果不是存储的路径就不转 + //if !strings.Contains(req.PacePhoto, "wxfile") && !strings.Contains(req.PacePhoto, "file") { + // //将base64人脸换成图片存储到本地 + // if req.WxOrPc == "1" { + // req.PacePhoto, err = coryCommon.Base64ToImgFunc(req.PacePhoto, "1") + // } else { + // req.PacePhoto, err = coryCommon.Base64ToImgFunc(req.PacePhoto, "2") + // } + //} + //if err != nil { + // liberr.ErrIsNil(ctx, err) + // return + //} + //如果身份证信息已经存在,就不允许 + count, err := dao.BusConstructionUser.Ctx(ctx).Where("sfz_number", req.SfzNumber).Count() + liberr.ErrIsNil(ctx, err) + if count > 0 { + err = errors.New("当前身份证已被使用!") + liberr.ErrIsNil(ctx, err) + return + } + // 1、修改 原数据 + user := do.BusConstructionUser{ + NickName: req.NickName, + UserName: req.UserName, + Status: req.Status, + IsPinch: req.IsPinch, + IfManagement: req.IfManagement, + Phone: req.Phone, + Sex: req.Sex, + SfzNation: req.SfzNation, + SfzNumber: req.SfzNumber, + SfzStart: req.SfzStart, + SfzEnd: req.SfzEnd, + SfzSite: req.SfzSite, + NativePlace: req.NativePlace, + YhkNumber: req.YhkNumber, + YhkOpeningBank: req.YhkOpeningBank, + YhkCardholder: req.YhkCardholder, + SfzBirth: req.SfzBirth, + TypeOfWork: req.TypeOfWork, + ProjectRecord: req.ProjectRecord, + DevNum: req.DevNum, + // EntryDate: req.EntryDate, + // LeaveDate: req.LeaveDate, + } + if req.ProjectId > 0 { + user.ProjectId = req.ProjectId + } + if req.TeamId > 0 { + if !(req.PostId == 10 || req.PostId == 4) { + liberr.ErrIsNil(ctx, errors.New("teamId大于0的时候必须传递postId字段!")) + return + } + user.TeamId = req.TeamId + } + if req.Openid != "" { + user.Openid = req.Openid + } + if req.Clock != "" { + user.Clock = req.Clock + } + if req.LabourserviceId > 0 { + user.LabourserviceId = req.LabourserviceId + } + if req.PacePhoto != "" { + user.PacePhoto = req.PacePhoto + fmt.Println("1人脸检测结果:", req.PacePhoto) + //人脸检测 + join := coryCommon.FileToFunc(req.PacePhoto, 2) + fmt.Println("2人脸检测结果:", join) + //2、根据绝对路径获取到base64 + urlBase64Two, err := coryCommon.EncodeAndUrlEncodeImage(join, 2) + liberr.ErrIsNil(ctx, err) + if err != nil { + return + } + //3、检测是否是人脸 + hfReq := &coryCommon.HumanFaceReq{} + hfReq.Image = urlBase64Two + hfReq.ImageType = "BASE64" + hfReq.FaceField = "face_type,quality" + err = coryCommon.HumanFace(hfReq) + if err != nil { + liberr.ErrIsNil(ctx, err) + return + } + } + if req.HeadIcon != "" { + user.HeadIcon = req.HeadIcon + } + //if !(req.SiteNum == "") { + // now := time.Now() + // date := tool.New().GetFormattedDateTime(now) + // if req.SiteNum == "1" { + // //每次入场都需清空离职时间 + // user.EntryDate = date + // user.LeaveDate = "" + // } else if req.SiteNum == "2" { + // //离职时间 + // user.LeaveDate = date + // } + //} + _, err = dao.BusConstructionUser.Ctx(ctx).WherePri(req.Id).OmitEmpty().Update(user) + id := req.Id + if err == nil { + // 2、修改微信用户与岗位关联 + if req.PostReq != nil && req.PostReq.PostId != 0 { + // 直接删除原本的数据再插入一条新的 + _, err = dao.BusConstructionUserPost.Ctx(ctx).Where(dao.BusConstructionUserPost.Columns().ConstructionUserId, id).Delete() + postEntity := req.PostReq + postEntity.ConstructionUserId = id + _, err = dao.BusConstructionUserPost.Ctx(ctx).Insert(postEntity) + } + // 3、施工人员对应项目 + if req.ProjectListReq != nil && len(req.ProjectListReq) > 0 { + listReq := req.ProjectListReq + req.ProjectId = listReq[0].ProjectId + var projectList []*model.BusConstructionProjectInfoRes + for _, data := range listReq { + if data.ProjectId != 0 { + // 删除 + _, err = dao.BusConstructionProject.Ctx(ctx).Where(dao.BusConstructionProject.Columns().ConstructionUserId, req.Id).Delete() + // 新增 + listReq := &model.BusConstructionProjectInfoRes{ + ConstructionUserId: req.Id, + } + projectList = append(projectList, listReq) + } + } + _, err = dao.BusConstructionProject.Ctx(ctx).Insert(projectList) + } + // 4、批量修改身份证等图片数据 + err = controller.CommmonUpdateFile(ctx, req.FilesListReq, id, req.WxOrPc, req.Openid, req.ProjectId) + liberr.ErrIsNil(ctx, err) + // 5、添加进班组 + if req.TeamId != 0 { + if err := service.SysProjectTeamMember().Add(ctx, &wxApplet.SysProjectTeamMemberAddReq{ + TeamId: req.TeamId, + Openid: req.Openid, + PostId: req.PostId, + }); err != nil { + liberr.ErrIsNil(ctx, errors.New("进入班组未成功!")) + } + } + } + liberr.ErrIsNil(ctx, err, "修改失败") + + // 在用户实名的时候,如果有项目ID,那么就需要将用户与 PC 项目表关联 + if req.ProjectId != 0 { + err := s.AddProjectFunc(ctx, req.Phone, req.ProjectId) + liberr.ErrIsNil(ctx, err) + } + + // 用户与角色管理 + if len(req.RoleIds) > 0 { + // 先删除再去新增数据 + _, err = g.DB().Model("sys_wechat_user_role").Ctx(ctx).Delete("user_id", req.Id) + liberr.ErrIsNil(ctx, err, "修改用户角色失败") + err = InsertRoleModuleFunc(ctx, req.RoleIds, req.Id) + liberr.ErrIsNil(ctx, err, "修改用户角色失败") + } + // 如果是微信小程序,并且有身份证号码,那么证明是在微信小程序进行实名认证,那么就需要修改一遍其他地方存储了当前openid的数据 + if req.WxOrPc == "2" && req.SfzNumber != "" { + err = controller.BatchUpdateTheOpenidsOfIndividualTables(ctx, req.Openid) + liberr.ErrIsNil(ctx, err, "变更openid失败!") + } + }) + return err + }) + return err +} + +func (s *sBusConstructionUser) Delete(ctx context.Context, ids []int64) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 0、查询是否有人员没有退出班组就在执行删除操作,如果有就不允许删除数据 + count, _ := dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().Id+" in (?)", ids).Where("(team_id is not null and team_id <> 0)").Count() + if count > 0 { + err = errors.New("当前人员还未退场,请先退场再操作!") + liberr.ErrIsNil(ctx, err) + return + } + //1、删除数据 + var openids []string + for i := range ids { + //获取app用户信息 + var datai *model.BusConstructionUserInfoRes + err := dao.BusConstructionUser.Ctx(ctx).WherePri(ids[i]).Scan(&datai) + if err != nil { + liberr.ErrIsNil(ctx, err, "查询app用户信息失败") + return + } + if datai == nil { + break + } + //删除app用户 + _, err = dao.BusConstructionUser.Ctx(ctx).Delete(dao.BusConstructionUser.Columns().Id, ids[i]) + if err != nil { + liberr.ErrIsNil(ctx, err, "删除app用户信息失败") + return + } + _, err = dao.BusConstructionUserFile.Ctx(ctx).Where(dao.BusConstructionUserFile.Columns().UserId, ids[i]).Delete() + if err != nil { + liberr.ErrIsNil(ctx, err, "删除app用户附件信息失败") + return + } + //查询是否有对应的系统用户、有就删除 + user, err := serviceController.SysUser().UserNameOrMobileData(ctx, datai.Phone, datai.Phone) + if err != nil { + break //由于可能只有app没有系统,所以这里就不做处理了 + } + if user != nil { + if err := serviceController.SysUser().Delete(ctx, []int{int(user.Id)}); err != nil { + liberr.ErrIsNil(ctx, err, "删除sys用户信息失败") + return + } + } + openids = append(openids, datai.Openid) + } + _, err = dao.SysProjectTeamMember.Ctx(ctx).Delete(dao.SysProjectTeamMember.Columns().Openid+" in (?)", openids) + liberr.ErrIsNil(ctx, err, "删除班组下面的人员失败") + ////3、删除安全考试数据 + //var ar []string + //for i := range array { + // ar = append(ar, array[i].String()) + //} + //err = logic.DeleteFunc(ctx, ar) + //liberr.ErrIsNil(ctx, err, "删除失败") + }) + return err + }) + return +} + +func InsertRoleModuleFunc(ctx context.Context, roleIds []int64, insertId int64) (err error) { + var swrmi []controllerModel.SysWechatUserRoleInfoRes + for _, id := range roleIds { + res := controllerModel.SysWechatUserRoleInfoRes{ + UserId: insertId, + RoleId: id, + } + swrmi = append(swrmi, res) + } + _, err = g.DB().Model("sys_wechat_user_role").Ctx(ctx).Insert(swrmi) + return err +} + +// InitializationDataFunc 初始化表数据 +func InitializationDataFunc(ctx context.Context, id int64) (err error) { + var reqDataType *system.GetDictReq + reqDataType = &system.GetDictReq{ + DictType: "user_img_type", + } + dict, err := sysControler.New().GetDictWithDataByType(ctx, reqDataType) + var reqDataTypeList []*model.BusConstructionUserFileInfoRes + for _, dataInfo := range dict.Values { + reqDataType := model.BusConstructionUserFileInfoRes{ + UserId: id, + UserImgType: dataInfo.DictValue, + } + reqDataTypeList = append(reqDataTypeList, &reqDataType) + } + _, err = dao.BusConstructionUserFile.Ctx(ctx).Insert(reqDataTypeList) + return +} + +// 用户实名后为用户在 PC 中新增项目 +func (s *sBusConstructionUser) AddProjectFunc(ctx context.Context, mobile string, projectID int64) error { + // 获取用户信息 + userInfo := ct.New().GetLoginUser(ctx) + if userInfo == nil { + return errors.New("获取用户信息失败") + } + + // 用户 ID + UserID := userInfo.Id + + // 首先检查用户是否已经与项目关联 + exists, err := dao.SysUserProjectRelevancy.Ctx(ctx). + Where(dao.SysUserProjectRelevancy.Columns().ProjectId, projectID). + Where(dao.SysUserProjectRelevancy.Columns().UserId, UserID). + Where("source", 0).Count() + if err != nil { + return fmt.Errorf("检查项目用户关联失败: %w", err) + } + + // 如果已经存在,直接返回 + if exists > 0 { + return nil + } + + // 插入新的项目与用户关联 + projectUser := wxAppletDo.SysUserProjectRelevancy{ + UserId: UserID, // 用户 ID + ProjectId: projectID, // 项目 ID + Source: 0, + } + + _, err = dao.SysUserProjectRelevancy.Ctx(ctx).Insert(projectUser) + if err != nil { + return fmt.Errorf("插入项目用户关联失败: %w", err) + } + + return nil +} diff --git a/internal/app/wxApplet/logic/busConstructionUserFile/bus_construction_user_file.go b/internal/app/wxApplet/logic/busConstructionUserFile/bus_construction_user_file.go new file mode 100644 index 0000000..bee3cc4 --- /dev/null +++ b/internal/app/wxApplet/logic/busConstructionUserFile/bus_construction_user_file.go @@ -0,0 +1,124 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-07 11:17:55 +// 生成路径: internal/app/wxApplet/logic/bus_construction_user_file.go +// 生成人:gfast +// desc:微信用户的文件存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model/do" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterBusConstructionUserFile(New()) +} + +func New() *sBusConstructionUserFile { + return &sBusConstructionUserFile{} +} + +type sBusConstructionUserFile struct{} + +func (s *sBusConstructionUserFile) List(ctx context.Context, req *wxApplet.BusConstructionUserFileSearchReq) (listRes *wxApplet.BusConstructionUserFileSearchRes, err error) { + listRes = new(wxApplet.BusConstructionUserFileSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusConstructionUserFile.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.BusConstructionUserFile.Columns().Id+" = ?", req.Id) + } + if req.UserId != "" { + m = m.Where(dao.BusConstructionUserFile.Columns().UserId+" = ?", gconv.Int64(req.UserId)) + } + if req.UserImgType != "" { + m = m.Where(dao.BusConstructionUserFile.Columns().UserImgType+" = ?", req.UserImgType) + } + if req.Path != "" { + m = m.Where(dao.BusConstructionUserFile.Columns().Path+" = ?", req.Path) + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusConstructionUserFile.Columns().CreatedAt+" >=? AND "+dao.BusConstructionUserFile.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusConstructionUserFileInfoRes + err = m.Fields(wxApplet.BusConstructionUserFileSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusConstructionUserFileListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusConstructionUserFileListRes{ + Id: v.Id, + UserId: v.UserId, + UserImgType: v.UserImgType, + Path: v.Path, + CreatedAt: v.CreatedAt, + } + } + }) + return +} + +func (s *sBusConstructionUserFile) GetById(ctx context.Context, id int64) (res *model.BusConstructionUserFileInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusConstructionUserFile.Ctx(ctx).WithAll().Where(dao.BusConstructionUserFile.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusConstructionUserFile) Add(ctx context.Context, req *wxApplet.BusConstructionUserFileAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionUserFile.Ctx(ctx).Insert(do.BusConstructionUserFile{ + UserId: req.UserId, + UserImgType: req.UserImgType, + Name: req.Name, + Path: req.Path, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusConstructionUserFile) Edit(ctx context.Context, req *wxApplet.BusConstructionUserFileEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionUserFile.Ctx(ctx).WherePri(req.Id).Update(do.BusConstructionUserFile{ + UserId: req.UserId, + UserImgType: req.UserImgType, + Name: req.Name, + Path: req.Path, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusConstructionUserFile) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionUserFile.Ctx(ctx).Delete(dao.BusConstructionUserFile.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/wxApplet/logic/busConstructionUserPost/bus_construction_user_post.go b/internal/app/wxApplet/logic/busConstructionUserPost/bus_construction_user_post.go new file mode 100644 index 0000000..e495849 --- /dev/null +++ b/internal/app/wxApplet/logic/busConstructionUserPost/bus_construction_user_post.go @@ -0,0 +1,112 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-07 11:17:55 +// 生成路径: internal/app/wxApplet/logic/bus_construction_user_post.go +// 生成人:gfast +// desc:施工人员岗位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model/do" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func init() { + service.RegisterBusConstructionUserPost(New()) +} + +func New() *sBusConstructionUserPost { + return &sBusConstructionUserPost{} +} + +type sBusConstructionUserPost struct{} + +func (s *sBusConstructionUserPost) List(ctx context.Context, req *wxApplet.BusConstructionUserPostSearchReq) (listRes *wxApplet.BusConstructionUserPostSearchRes, err error) { + listRes = new(wxApplet.BusConstructionUserPostSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusConstructionUserPost.Ctx(ctx).WithAll() + if req.Id != "" { + m = m.Where(dao.BusConstructionUserPost.Columns().Id+" = ?", req.Id) + } + if req.ConstructionUserId != "" { + m = m.Where(dao.BusConstructionUserPost.Columns().ConstructionUserId+" = ?", gconv.Int64(req.ConstructionUserId)) + } + if req.PostId != "" { + m = m.Where(dao.BusConstructionUserPost.Columns().PostId+" = ?", gconv.Int64(req.PostId)) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusConstructionUserPostInfoRes + err = m.Fields(wxApplet.BusConstructionUserPostSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusConstructionUserPostListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusConstructionUserPostListRes{ + Id: v.Id, + ConstructionUserId: v.ConstructionUserId, + PostId: v.PostId, + } + } + }) + return +} + +func (s *sBusConstructionUserPost) GetById(ctx context.Context, id uint64) (res *model.BusConstructionUserPostInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusConstructionUserPost.Ctx(ctx).WithAll().Where(dao.BusConstructionUserPost.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sBusConstructionUserPost) Add(ctx context.Context, req *wxApplet.BusConstructionUserPostAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionUserPost.Ctx(ctx).Insert(do.BusConstructionUserPost{ + ConstructionUserId: req.ConstructionUserId, + PostId: req.PostId, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sBusConstructionUserPost) Edit(ctx context.Context, req *wxApplet.BusConstructionUserPostEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionUserPost.Ctx(ctx).WherePri(req.Id).Update(do.BusConstructionUserPost{ + ConstructionUserId: req.ConstructionUserId, + PostId: req.PostId, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sBusConstructionUserPost) Delete(ctx context.Context, ids []uint64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusConstructionUserPost.Ctx(ctx).Delete(dao.BusConstructionUserPost.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/wxApplet/logic/busLabourservice/bus_labourservice.go b/internal/app/wxApplet/logic/busLabourservice/bus_labourservice.go new file mode 100644 index 0000000..028ef68 --- /dev/null +++ b/internal/app/wxApplet/logic/busLabourservice/bus_labourservice.go @@ -0,0 +1,218 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-14 11:24:31 +// 生成路径: internal/app/wxApplet/logic/bus_labourservice.go +// 生成人:gfast +// desc:劳务公司 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model/do" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" + "strings" +) + +func init() { + service.RegisterBusLabourservice(New()) +} + +func New() *sBusLabourservice { + return &sBusLabourservice{} +} + +type sBusLabourservice struct{} + +func (s *sBusLabourservice) PcAdd(ctx context.Context, req *wxApplet.BusPcAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, InsertErr := g.DB().Model("bus_labourservice_file").Data(&model.BusLabourserviceFileRes{ + Pid: req.Pid, + Type: req.Type, + Name: req.Name, + Path: req.Path, + }).Insert() + liberr.ErrIsNil(ctx, InsertErr, "资料添加错误!") + }) + return +} + +func (s *sBusLabourservice) PcDel(ctx context.Context, req *wxApplet.BusPcDelReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + m := g.DB().Model("bus_labourservice_file").Where("id", req.Id).Safe() + //1、查询数据 + path, err := m.Fields("path").Value() + liberr.ErrIsNil(ctx, err) + //2、删除数据 + _, err = m.Delete() + liberr.ErrIsNil(ctx, err) + //3、删除文件 + coryCommon.BatchFile(strings.Split(path.String(), ",")) + }) + return +} + +func (s *sBusLabourservice) PcFind(ctx context.Context, req *wxApplet.BusPcFindReq) (res *wxApplet.BusPcFindRes, err error) { + res = new(wxApplet.BusPcFindRes) + err = g.Try(ctx, func(ctx context.Context) { + var fileRes []*model.BusLabourserviceFileRes + err = g.DB().Model("bus_labourservice_file").Where("pid", req.Pid).Scan(&fileRes) + res.List = fileRes + liberr.ErrIsNil(ctx, err) + }) + return +} + +func (s *sBusLabourservice) AppListOfParticipatingUnitsFunc(ctx context.Context, req *wxApplet.AppListOfParticipatingUnitsReq) (listRes *wxApplet.AppListOfParticipatingUnitsRes, err error) { + listRes = new(wxApplet.AppListOfParticipatingUnitsRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusLabourservice.Ctx(ctx).WithAll() + if req.FuzzyQuery != "" { + m = m.Where(dao.BusLabourservice.Columns().Name+" like ?", "%"+req.FuzzyQuery+"%") + } + order := "name asc" + var res []*model.BusLabourserviceInfoRes + err = m.Fields(wxApplet.BusLabourserviceSearchRes{}).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusLabourserviceListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusLabourserviceListRes{ + Id: v.Id, + Name: v.Name, + Principal: v.Principal, + Phone: v.Phone, + Custodian: v.Custodian, + CustodianPhone: v.CustodianPhone, + CreatedAt: v.CreatedAt, + Remark: v.Remark, + } + } + }) + return +} + +func (s *sBusLabourservice) List(ctx context.Context, req *wxApplet.BusLabourserviceSearchReq) (listRes *wxApplet.BusLabourserviceSearchRes, err error) { + listRes = new(wxApplet.BusLabourserviceSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.BusLabourservice.Ctx(ctx).WithAll() + if req.Name != "" { + m = m.Where(dao.BusLabourservice.Columns().Name+" like ?", "%"+req.Name+"%") + } + //创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where(dao.BusLabourservice.Columns().CreatedAt+" like ?", "%"+date+"%") + } + if len(req.DateRange) != 0 { + m = m.Where(dao.BusLabourservice.Columns().CreatedAt+" >=? AND "+dao.BusLabourservice.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.BusLabourserviceInfoRes + err = m.Fields(wxApplet.BusLabourserviceSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.BusLabourserviceListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.BusLabourserviceListRes{ + Id: v.Id, + Name: v.Name, + Principal: v.Principal, + Phone: v.Phone, + Custodian: v.Custodian, + CustodianPhone: v.CustodianPhone, + CreatedAt: v.CreatedAt, + Remark: v.Remark, + } + } + }) + return +} + +func (s *sBusLabourservice) GetById(ctx context.Context, id int64) (res *model.BusLabourserviceInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.BusLabourservice.Ctx(ctx).WithAll().Where(dao.BusLabourservice.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.BusLabourserviceInfoRes) + res = &infoRes + }) + return +} + +func (s *sBusLabourservice) Add(ctx context.Context, req *wxApplet.BusLabourserviceAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + columns := dao.BusLabourservice.Columns() + //1、判断劳务公司是否重复 + count, countErr := dao.BusLabourservice.Ctx(ctx).Where(columns.Name, req.Name).Count() + liberr.ErrIsNil(ctx, countErr, "获取劳务信息失败!") + if count > 0 { + liberr.ErrIsNil(ctx, errors.New("该劳务公司已存在!")) + return + } + //2、添加劳务公司 + name := ct.New().GetLoginUser(ctx).Id + _, errInsertInfo := dao.BusLabourservice.Ctx(ctx).Insert(do.BusLabourservice{ + Name: req.Name, + Principal: req.Principal, + Phone: req.Phone, + Custodian: req.Custodian, + CustodianPhone: req.CustodianPhone, + Remark: req.Remark, + CreateBy: name, + }) + liberr.ErrIsNil(ctx, errInsertInfo, "添加失败") + + }) + return err +} + +func (s *sBusLabourservice) Edit(ctx context.Context, req *wxApplet.BusLabourserviceEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、修改资料 + name := ct.New().GetLoginUser(ctx).Id + _, err = dao.BusLabourservice.Ctx(ctx).WherePri(req.Id).Update(do.BusLabourservice{ + Name: req.Name, + Principal: req.Principal, + Phone: req.Phone, + Custodian: req.Custodian, + CustodianPhone: req.CustodianPhone, + Remark: req.Remark, + UpdateBy: name, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return err +} + +func (s *sBusLabourservice) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.BusLabourservice.Ctx(ctx).Delete(dao.BusLabourservice.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/wxApplet/logic/logic.go b/internal/app/wxApplet/logic/logic.go new file mode 100644 index 0000000..a9d4629 --- /dev/null +++ b/internal/app/wxApplet/logic/logic.go @@ -0,0 +1,13 @@ +package logic + +import _ "github.com/tiger1103/gfast/v3/internal/app/wxApplet/logic/busAskforleave" +import _ "github.com/tiger1103/gfast/v3/internal/app/wxApplet/logic/busAttendance" +import _ "github.com/tiger1103/gfast/v3/internal/app/wxApplet/logic/busConstructionProject" +import _ "github.com/tiger1103/gfast/v3/internal/app/wxApplet/logic/busConstructionUser" +import _ "github.com/tiger1103/gfast/v3/internal/app/wxApplet/logic/busConstructionUserFile" +import _ "github.com/tiger1103/gfast/v3/internal/app/wxApplet/logic/busConstructionUserPost" +import _ "github.com/tiger1103/gfast/v3/internal/app/wxApplet/logic/busLabourservice" +import _ "github.com/tiger1103/gfast/v3/internal/app/wxApplet/logic/sysProjectTeam" +import _ "github.com/tiger1103/gfast/v3/internal/app/wxApplet/logic/sysProjectTeamMember" +import _ "github.com/tiger1103/gfast/v3/internal/app/wxApplet/logic/sysProjectTeamSquad" +import _ "github.com/tiger1103/gfast/v3/internal/app/wxApplet/logic/sysUserProjectRelevancy" diff --git a/internal/app/wxApplet/logic/sysProjectTeam/sys_project_team.go b/internal/app/wxApplet/logic/sysProjectTeam/sys_project_team.go new file mode 100644 index 0000000..d42cd53 --- /dev/null +++ b/internal/app/wxApplet/logic/sysProjectTeam/sys_project_team.go @@ -0,0 +1,331 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-15 09:34:52 +// 生成路径: internal/app/wxApplet/logic/sys_project_team.go +// 生成人:gfast +// desc:项目班组 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model/do" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterSysProjectTeam(New()) +} + +func New() *sSysProjectTeam { + return &sSysProjectTeam{} +} + +type sSysProjectTeam struct{} + +func (s *sSysProjectTeam) ListOfAttendancePersonnelFunc(ctx context.Context, req *wxApplet.ListOfAttendancePersonnelReq) (res *wxApplet.ListOfAttendancePersonnelRes, err error) { + res = &wxApplet.ListOfAttendancePersonnelRes{} + err = g.Try(ctx, func(ctx context.Context) { + var ry []*wxApplet.ListOfAttendancePersonnelTwo + switch req.Type { + case "0": + //1、获取到所有人员 + columns := dao.BusConstructionUser.Columns() + err := dao.BusConstructionUser.Ctx(ctx).Where(columns.TeamId, req.TeamId).Fields(columns.Openid, columns.PacePhoto+" as userHead", columns.UserName, columns.Phone).Scan(&ry) + liberr.ErrIsNil(ctx, err, "获取全部人员失败!") + break + case "1": + //2、获取到打卡人员信息 + all, err := g.DB().GetAll(ctx, `SELECT + DISTINCT + a.openid, + b.pace_photo as userHead, + b.user_name as userName, + b.phone, + FROM + bus_attendance AS a + RIGHT JOIN bus_construction_user AS b ON ( b.team_id = ? AND b.openid = a.openid ) + WHERE + a.is_pinch <> 4 and DATE_FORMAT(clock_on,"%Y-%m-%d") = ?`, + g.Slice{req.TeamId, req.LocalDate}) + liberr.ErrIsNil(ctx, err, "获取打卡人员失败") + err = all.Structs(&ry) + liberr.ErrIsNil(ctx, err, "获取打卡人员转换失败") + break + case "2": + all, err := g.DB().GetAll(ctx, `SELECT + a.openid, + a.pace_photo as userHead, + a.user_name as userName, + a.phone, + c.ganger_opinion as gangerOpinion, + c.manager_opinion as managerOpinion + FROM + bus_construction_user as a + left join bus_askforleave as c on ( c.openid = a.openid and c.team_id = ? ) + WHERE + a.openid in ( + SELECT + openid + FROM + bus_askforleave + WHERE + team_id = ? and + ? BETWEEN DATE_FORMAT(start_time,'%Y-%m-%d') AND DATE_FORMAT(end_time,'%Y-%m-%d') + ) and ? BETWEEN DATE_FORMAT(c.start_time,'%Y-%m-%d') AND DATE_FORMAT(c.end_time,'%Y-%m-%d')`, + g.Slice{req.TeamId, req.TeamId, req.LocalDate, req.LocalDate}) + liberr.ErrIsNil(ctx, err, "获取请假人员失败") + err = all.Structs(&ry) + liberr.ErrIsNil(ctx, err, "获取请假人员转换失败") + for i := range ry { + cardMode := "" + cardNumber := "" + if ry[i].GangerOpinion == "1" && ry[i].ManagerOpinion == "1" { + cardMode = "待审核" + cardNumber = "1" + } + if ry[i].GangerOpinion == "2" || ry[i].ManagerOpinion == "2" { + cardMode = "审核中" + cardNumber = "2" + } + if ry[i].GangerOpinion == "3" || ry[i].ManagerOpinion == "3" { + cardMode = "已拒绝" + cardNumber = "3" + } + if ry[i].GangerOpinion == "2" && ry[i].ManagerOpinion == "2" { + cardMode = "已同意" + cardNumber = "4" + } + ry[i].CardMode = cardMode + ry[i].CardNumber = cardNumber + } + break + case "3": + all, err := g.DB().GetAll(ctx, `SELECT + a.openid, + a.pace_photo as userHead, + a.user_name as userName, + a.phone + FROM + bus_construction_user as a + WHERE + team_id = ? and deleted_at is null and + openid not in ( + SELECT DISTINCT + a.openid + FROM + bus_attendance AS a + RIGHT JOIN bus_construction_user AS b ON ( b.team_id = ? AND b.openid = a.openid ) + WHERE + a.is_pinch <> 4 AND + DATE_FORMAT( a.clock_on, "%Y-%m-%d" ) = ? + + UNION + + SELECT DISTINCT + openid + FROM + bus_askforleave + WHERE + team_id = ? AND + ? BETWEEN DATE_FORMAT( start_time, '%Y-%m-%d' ) AND DATE_FORMAT( end_time, '%Y-%m-%d' ) + )`, g.Slice{req.TeamId, req.TeamId, req.LocalDate, req.TeamId, req.LocalDate}) + liberr.ErrIsNil(ctx, err, "获取未出勤人员失败") + err = all.Structs(&ry) + liberr.ErrIsNil(ctx, err, "获取未出勤人员转换失败") + break + } + res.List = ry + }) + return +} + +func (s *sSysProjectTeam) GetsTheAttendanceOfASpecifiedShiftGroupFunc(ctx context.Context, req *wxApplet.GetsTheAttendanceOfASpecifiedShiftGroupReq) (res *wxApplet.GetsTheAttendanceOfASpecifiedShiftGroupRes, err error) { + res = new(wxApplet.GetsTheAttendanceOfASpecifiedShiftGroupRes) + err = g.Try(ctx, func(ctx context.Context) { + //1、根据班组id获取到班组总人数 + columns := dao.BusConstructionUser.Columns() + array, err := dao.BusConstructionUser.Ctx(ctx).Where(columns.TeamId, req.TeamId).Fields(columns.Openid).Array() + liberr.ErrIsNil(ctx, err, "获取当前班组总人数失败") + res.All = len(array) + //2、获取到打卡人数;根据班组获取到指定的人、在根据人去考勤里面查询数据 + count, err := g.DB().GetCount(ctx, `SELECT + COUNT(DISTINCT a.openid) + FROM + bus_attendance AS a + RIGHT JOIN bus_construction_user AS b ON ( b.team_id = ? AND b.openid = a.openid ) + WHERE + a.is_pinch <> 4 and DATE_FORMAT(clock_on,"%Y-%m-%d") = ?`, + g.Slice{req.TeamId, req.LocalDate}) + liberr.ErrIsNil(ctx, err, "获取打卡人数失败") + res.ClockIn = count + //3、获取到请假人数 + valOpenids, err := dao.BusAskforleave.Ctx(ctx). + Where(dao.BusAskforleave.Columns().TeamId, req.TeamId). + Where(gdb.Raw("current_date BETWEEN DATE_FORMAT(start_time,'%Y-%m-%d') AND DATE_FORMAT(end_time,'%Y-%m-%d')")). + Fields(dao.BusAskforleave.Columns().Openid). + Array() + liberr.ErrIsNil(ctx, err, "获取请假人数失败") + res.AskForLeave = len(valOpenids) + //4、获取到未出勤人数 = 总人数-打卡人数-请假人数 + res.NotClockIn = res.All - res.ClockIn - res.AskForLeave + }) + return +} + +func (s *sSysProjectTeam) List(ctx context.Context, req *wxApplet.SysProjectTeamSearchReq) (listRes *wxApplet.SysProjectTeamSearchRes, err error) { + listRes = new(wxApplet.SysProjectTeamSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SysProjectTeam.Ctx(ctx).WithAll() + if req.ProjectId != "" { + m = m.Where(dao.SysProjectTeam.Columns().ProjectId+" = ?", req.ProjectId) + } + if req.Name != "" { + m = m.Where(dao.SysProjectTeam.Columns().Name+" like ?", "%"+req.Name+"%") + } + //创建时间模糊查询 + if req.CreateTime != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreateTime)) + m = m.Where(dao.SysProjectTeam.Columns().CreateTime+" like ?", "%"+date+"%") + } + if req.CreateTime != "" { + m = m.Where(dao.SysProjectTeam.Columns().CreateTime+" = ?", gconv.Time(req.CreateTime)) + } + listRes.Total, err = m.Count() + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.SysProjectTeamInfoRes + err = m.Fields(wxApplet.SysProjectTeamSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.SysProjectTeamListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.SysProjectTeamListRes{ + Id: v.Id, + ProjectId: v.ProjectId, + Name: v.Name, + IsClockIn: v.IsClockIn, + CreateTime: v.CreateTime, + } + } + }) + return +} + +func (s *sSysProjectTeam) GetById(ctx context.Context, id int64) (res *model.SysProjectTeamInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.SysProjectTeam.Ctx(ctx).WithAll().Where(dao.SysProjectTeam.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + //获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.SysProjectTeamInfoRes) + res = &infoRes + }) + return +} + +func (s *sSysProjectTeam) Add(ctx context.Context, req *wxApplet.SysProjectTeamAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、判断班组名称是否存在 + count, err := dao.SysProjectTeam. + Ctx(ctx).Where(dao.SysProjectTeam.Columns().ProjectId, req.ProjectId). + Ctx(ctx).Where(dao.SysProjectTeam.Columns().Name, req.Name). + Count() + liberr.ErrIsNil(ctx, err, "获取班组名称失败") + if count > 0 { + liberr.ErrIsNil(ctx, errors.New("班组名称已存在")) + return + } + name := ct.New().GetLoginUser(ctx).Id + _, err = dao.SysProjectTeam.Ctx(ctx).Insert(do.SysProjectTeam{ + ProjectId: req.ProjectId, + Name: req.Name, + IsClockIn: req.IsClockIn, + CreateBy: name, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sSysProjectTeam) Edit(ctx context.Context, req *wxApplet.SysProjectTeamEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + name := ct.New().GetLoginUser(ctx).Id + count, err := dao.SysProjectTeam.Ctx(ctx). + Where(dao.SysProjectTeam.Columns().ProjectId, req.ProjectId). + Where(dao.SysProjectTeam.Columns().Name, req.Name). + Count() + liberr.ErrIsNil(ctx, err, "获取班组名称失败") + if count > 0 { + liberr.ErrIsNil(ctx, errors.New("班组名称已存在")) + return + } + _, err = dao.SysProjectTeam.Ctx(ctx).WherePri(req.Id).Update(do.SysProjectTeam{ + ProjectId: req.ProjectId, + Name: req.Name, + UpdateBy: name, + IsClockIn: req.IsClockIn, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sSysProjectTeam) Delete(ctx context.Context, ids []int64) (err error) { + g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //1、删除组成员 + _, err = dao.SysProjectTeamMember.Ctx(ctx).Delete(dao.SysProjectTeamMember.Columns().TeamId+" in (?)", ids) + //2、清除施工人员中关联到这个项目的人 + _, err = dao.BusConstructionUser.Ctx(ctx).Where(dao.SysProjectTeamMember.Columns().TeamId+" in (?)", ids).Update(g.Map{"team_id": nil}) + //2、删除组 + _, err = dao.SysProjectTeam.Ctx(ctx).Delete(dao.SysProjectTeam.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return err + }) + return +} + +// TeamOrGroupFunc 根据项目ID获取当前项目下的所有班组信息 +func TeamOrGroupFunc(ctx context.Context, id int64) (teamEntity []*model.SysProjectTeamListRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.SysProjectTeam.Ctx(ctx). + Where(dao.SysProjectTeam.Columns().ProjectId, id).Scan(&teamEntity) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} + +// TeamFunc 根据班组ID获取班组信息 +func TeamFunc(ctx context.Context, id int64) (teamEntity []*model.SysProjectTeamListRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.SysProjectTeam.Ctx(ctx). + Where(dao.SysProjectTeam.Columns().Id, id).Scan(&teamEntity) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/wxApplet/logic/sysProjectTeamMember/sys_project_team_member.go b/internal/app/wxApplet/logic/sysProjectTeamMember/sys_project_team_member.go new file mode 100644 index 0000000..b2d18ad --- /dev/null +++ b/internal/app/wxApplet/logic/sysProjectTeamMember/sys_project_team_member.go @@ -0,0 +1,340 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-15 09:34:52 +// 生成路径: internal/app/wxApplet/logic/sys_project_team_member.go +// 生成人:gfast +// desc:项目班组下的成员 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "time" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/samber/lo" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + sdao "github.com/tiger1103/gfast/v3/internal/app/system/dao" + logic2 "github.com/tiger1103/gfast/v3/internal/app/system/logic/busConstructionUser" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model/do" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterSysProjectTeamMember(New()) +} + +func New() *sSysProjectTeamMember { + return &sSysProjectTeamMember{} +} + +type sSysProjectTeamMember struct{} + +func (s *sSysProjectTeamMember) List(ctx context.Context, req *wxApplet.SysProjectTeamMemberSearchReq) (listRes *wxApplet.SysProjectTeamMemberSearchRes, err error) { + listRes = new(wxApplet.SysProjectTeamMemberSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + // 获取人员名称 + var openids []string + if req.UserName != "" { + values, err := dao.BusConstructionUser.Ctx(ctx).Where("user_name like ?", "%"+req.UserName+"%").Fields("openid").Array() + liberr.ErrIsNil(ctx, err, "获取数据失败") + if len(values) > 0 { + for i := range values { + openids = append(openids, values[i].String()) + } + } + } + m := dao.SysProjectTeamMember.Ctx(ctx) + m = m.As("a"). + RightJoin("bus_construction_user as b on a.openid = b.openid"). + LeftJoin("bus_type_of_wage as c on b.type_of_work = c.type_of_work"). + Fields("a.*," + + "b.head_icon," + + "b.nick_name,b.user_name," + + "b.phone," + + "c.standard as original,b.salary") + if req.TeamId != "" { + m = m.Where("a."+dao.SysProjectTeamMember.Columns().TeamId+" = ?", gconv.Int64(req.TeamId)) + } + if req.Openid != "" { + m = m.Where("a."+dao.SysProjectTeamMember.Columns().Openid+" = ?", req.Openid) + } + if req.PostId != "" { + m = m.Where("a."+dao.SysProjectTeamMember.Columns().PostId+" = ?", gconv.Int64(req.PostId)) + } + if req.IsPcSysUser != "" && (req.IsPcSysUser != "1" || req.IsPcSysUser != "2") { + m = m.Where("b.wx_or_pc", req.IsPcSysUser) + } + if len(openids) > 0 { + m = m.Where("a.openid in (?) ", openids) + } + // 创建时间模糊查询 + if req.CreateTime != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreateTime)) + m = m.Where("a."+dao.SysProjectTeam.Columns().CreateTime+" like ?", "%"+date+"%") + } + if req.CreateTime != "" { + m = m.Where("a."+dao.SysProjectTeamMember.Columns().UpdateTime+" = ?", gconv.Time(req.CreateTime)) + } + m = m.Where("`a`.`deleted_at` IS NULL") + m = m.Where("`b`.`deleted_at` IS NULL") + array, err := m.Array() + listRes.Total = len(array) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.SysProjectTeamMemberInfoRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.SysProjectTeamMemberListRes, len(res)) + for k, v := range res { + // var sj *model.BusConstructionUserInfoRes + // dao.BusConstructionUser.Ctx(ctx).Where("openid", v.Openid).Fields("user_name,nick_name").Scan(&sj) + listRes.List[k] = &model.SysProjectTeamMemberListRes{ + Id: v.Id, + TeamId: v.TeamId, + Openid: v.Openid, + PostId: v.PostId, + // HeadIcon: v.HeadIcon, + Phone: v.Phone, + UserName: v.UserName, + NickName: v.NickName, + Original: v.Original, + Salary: v.Salary, + } + } + }) + return +} + +func (s *sSysProjectTeamMember) GetById(ctx context.Context, id int64) (res *model.SysProjectTeamMemberInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.SysProjectTeamMember.Ctx(ctx).WithAll().Where(dao.SysProjectTeamMember.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sSysProjectTeamMember) Add(ctx context.Context, req *wxApplet.SysProjectTeamMemberAddReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 1、当前成员已经被添加就不允许再次添加 + // count, err := dao.SysProjectTeamMember.Ctx(ctx).Where("team_id", req.TeamId).Where("openid", req.Openid).Count() + count, err := dao.SysProjectTeamMember.Ctx(ctx).Where("openid", req.Openid).Count() + if count > 0 { + err = errors.New("当前成员已分配组!") + liberr.ErrIsNil(ctx, err) + return + } + // 2、获取当前项目的班组长openid + value, err := dao.SysProjectTeamMember.Ctx(ctx).Where("team_id", req.TeamId).Where("post_id", "10").Fields("openid").Value() + liberr.ErrIsNil(ctx, err) + originalOpenid := value.String() + if req.PostId == 10 { + // 新增数据如果是组长,那么就将当前组的所有成员修改为组员 + _, err = dao.SysProjectTeamMember.Ctx(ctx).Where("team_id", req.TeamId).Update(g.Map{"post_id": 4}) + liberr.ErrIsNil(ctx, err, "新增班组长失败") + } + // 删除班组长这个角色,如果当前用户没得班组长也不影响,不管如何先删再说 + if originalOpenid != "" { + err := OpenidByDelFunc(ctx, originalOpenid) + liberr.ErrIsNil(ctx, err, "班组长交接失败") + } + // 新增数据 + value, err = dao.SysProjectTeam.Ctx(ctx).WherePri(req.TeamId).Fields("project_id").Value() + _, err = dao.SysProjectTeamMember.Ctx(ctx).Insert(do.SysProjectTeamMember{ + TeamId: req.TeamId, + Openid: req.Openid, + PostId: req.PostId, + ProjectId: value, + }) + openidValue, err := dao.SysProjectTeamMember.Ctx(ctx).Where("team_id", req.TeamId).Where("post_id", "10").Fields("openid").Value() + liberr.ErrIsNil(ctx, err) + if openidValue.String() != "" { + err := OpenidByAddFunc(ctx, openidValue.String()) + liberr.ErrIsNil(ctx, err) + } + ////如果与元原来班组长的补卡申请未处理完毕,那么就由新的班组长接任处理 + //_, err = g.DB().Model("bus_reissue_a_card"). + // Where("ganger", originalOpenid). + // Where("ganger_opinion", "1"). + // Update(g.Map{"ganger": req.Openid}) + //liberr.ErrIsNil(ctx, err, "新增失败") + //新增完还得操作一下用户的team_id字段 + now := time.Now() + date := tool.New().GetFormattedDateTime(now) + g2 := g.Map{ + "team_id": req.TeamId, + "project_id": value, + //"type_of_work": req.TypeOfWork, + //"native_place": req.NativePlace, + "entry_date": date, + "leave_date": "", + } + _, err = dao.BusConstructionUser.Ctx(ctx).Where("openid", req.Openid).Update(g2) + liberr.ErrIsNil(ctx, err, "修改失败") + + subQuery := g.Model("sys_user").As("su").LeftJoin("bus_construction_user bcu", "bcu.phone = su.mobile").Where("bcu.openid", req.Openid).Fields("su.id") + //user_id := lo.Must(subQuery.Value()).Int() + user_ids, err := subQuery.Value() + liberr.ErrIsNil(ctx, err, "修改失败") + + user_id := user_ids.Int() + + if req.PostId == 4 { // 删除班组长角色菜单,添加施工人员角色菜单 + _, err = sdao.AppUserRoles.Ctx(ctx).Where("user_id = ?", user_id).Where("role_id", 1).Where("major_role", 1).Delete() + liberr.ErrIsNil(ctx, err, "修改失败") + sdao.AppUserRoles.Ctx(ctx).Where("user_id = ?", user_id).Data(g.Map{"role_id": 2, "major_role": 1, "user_id": user_id}).Insert() + } else if req.PostId == 10 { // 添加班组长角色菜单 + // 添加班组长角色 + _, err = sdao.AppUserRoles.Ctx(ctx).Where("user_id = ?", user_id).Where("role_id", 1).Where("major_role", 1).Delete() + _, err := sdao.AppUserRoles.Ctx(ctx).Where("user_id = ?", user_id).Data(g.Map{"role_id": 1, "major_role": 1, "user_id": user_id}).Insert() + liberr.ErrIsNil(ctx, err, "修改失败") + } + + }) + return err + }) + return +} + +func (s *sSysProjectTeamMember) Edit(ctx context.Context, req *wxApplet.SysProjectTeamMemberEditReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + // 1、新增数据如果是组长,那么就将当前组的所有成员修改为组员 + value, err := dao.SysProjectTeamMember.Ctx(ctx).Where("team_id", req.TeamId).Where("post_id", "10").Fields("openid").Value() + originalOpenid := value.String() + if req.PostId == 10 { + _, err = dao.SysProjectTeamMember.Ctx(ctx).Where("team_id", req.TeamId).Update(g.Map{"post_id": 4}) + liberr.ErrIsNil(ctx, err, "修改失败") + } + + subQuery := g.Model("sys_user").As("su").LeftJoin("bus_construction_user bcu", "bcu.phone = su.mobile").Where("bcu.openid", req.Openid).Fields("su.id") + user_id := lo.Must(subQuery.Value()).Int() + if req.PostId == 4 { // 删除班组长角色菜单,添加施工人员角色菜单 + _, err = sdao.AppUserRoles.Ctx(ctx).Where("user_id = ?", user_id).Where("role_id", 1).Where("major_role", 1).Delete() + liberr.ErrIsNil(ctx, err, "修改失败") + sdao.AppUserRoles.Ctx(ctx).Where("user_id = ?", user_id).Data(g.Map{"role_id": 2, "major_role": 1, "user_id": user_id}).Insert() + } else if req.PostId == 10 { // 添加班组长角色菜单 + // 添加班组长角色 + _, err = sdao.AppUserRoles.Ctx(ctx).Where("user_id = ?", user_id).Where("role_id", 1).Where("major_role", 1).Delete() + _, err := sdao.AppUserRoles.Ctx(ctx).Where("user_id = ?", user_id).Data(g.Map{"role_id": 1, "major_role": 1, "user_id": user_id}).Insert() + liberr.ErrIsNil(ctx, err, "修改失败") + } + + // 2、删除班组长角色,不管如何先删再说 + if originalOpenid != "" { + err := OpenidByDelFunc(ctx, originalOpenid) + liberr.ErrIsNil(ctx, err, "班组长交接失败") + } + // 3、修改用户信息 + value, err = dao.SysProjectTeam.Ctx(ctx).WherePri(req.TeamId).Fields("project_id").Value() + _, err = dao.SysProjectTeamMember.Ctx(ctx).WherePri(req.Id).Update(do.SysProjectTeamMember{ + TeamId: req.TeamId, + ProjectId: value, + Openid: req.Openid, + PostId: req.PostId, + }) + // 4、查询是否有班组长,有就增加班组长角色 + openidValue, err := dao.SysProjectTeamMember.Ctx(ctx).Where("team_id", req.TeamId).Where("post_id", "10").Fields("openid").Value() + liberr.ErrIsNil(ctx, err) + if openidValue.String() != "" { + err := OpenidByAddFunc(ctx, openidValue.String()) + liberr.ErrIsNil(ctx, err) + } + // 5、如果与原来班组长的补卡申请未处理完毕,那么就由新的班组长接任处理 + _, err = g.DB().Model("bus_reissue_a_card"). + Where("ganger", originalOpenid). + Where("ganger_opinion", "1"). + Update(g.Map{"ganger": req.Openid}) + liberr.ErrIsNil(ctx, err, "新增失败") + ////如果是离场就操作一下施工人员,并且删除成员 + //if req.SiteNum == "2" { + // g2 := g.Map{ + // "leave_date": tool.New().GetFormattedDateTime(time.Now()), + // "team_id": nil, + // "project_id": nil, + // "if_management": nil, + // } + // _, err = dao.BusConstructionUser.Ctx(ctx).Where("openid", req.Openid).Update(g2) + // //1、查询数据 + // value, err := dao.SysProjectTeamMember.Ctx(ctx).WherePri(req.Id).Fields("openid").Value() + // //2、更新数据 + // _, err = dao.BusConstructionUser.Ctx(ctx).Where("openid", value.String()).Update(g.Map{"team_id": nil, "if_management": ""}) + // liberr.ErrIsNil(ctx, err, "删除失败") + // //3、删除成员 + // _, err = dao.SysProjectTeamMember.Ctx(ctx).Delete(dao.SysProjectTeamMember.Columns().Id+" = ", req.Id) + // liberr.ErrIsNil(ctx, err, "删除失败") + //} + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return err + }) + return +} + +// OpenidByDelFunc 根据openid查询用户删除班组长角色 +func OpenidByDelFunc(ctx context.Context, openid string) error { + v, err := dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().Openid, openid).Fields("id").Value() + _, err = g.DB().Model("sys_wechat_user_role").Ctx(ctx). + Where("user_id", v). + Where("role_id = 4"). + Delete("user_id", v) + return err +} + +// OpenidByAddFunc 根据openid查询用户增加班组长角色 +func OpenidByAddFunc(ctx context.Context, openid string) error { + // 根据openid去获取到微信用户的主键ID + v, err := dao.BusConstructionUser.Ctx(ctx).Where(dao.BusConstructionUser.Columns().Openid, openid).Fields("id").Value() + liberr.ErrIsNil(ctx, err) + // 给当前用户追加班组长角色 + var roleIds []int64 + roleIds = append(roleIds, 4) + err = logic2.InsertRoleModuleFunc(ctx, roleIds, v.Int64()) + return err +} + +// 删除先不用给干掉 +func (s *sSysProjectTeamMember) Delete(ctx context.Context, ids []int64) (err error) { + //err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + // //err = g.Try(ctx, func(ctx context.Context) { + // // for _, dataId := range ids { + // // //1、查询数据 + // // value, err := dao.SysProjectTeamMember.Ctx(ctx).WherePri(dataId).Fields("openid").Value() + // // //2、更新数据 + // // g2 := g.Map{ + // // "leave_date": tool.New().GetFormattedDateTime(time.Now()), + // // "team_id": nil, + // // "if_management": nil, + // // } + // // _, err = dao.BusConstructionUser.Ctx(ctx).Where("openid", value.String()).Update(g2) + // // liberr.ErrIsNil(ctx, err, "删除失败") + // // } + // // //3、删除成员 + // // _, err = dao.SysProjectTeamMember.Ctx(ctx).Delete(dao.SysProjectTeamMember.Columns().Id+" in (?)", ids) + // // liberr.ErrIsNil(ctx, err, "删除失败") + // //}) + // //return err + //}) + return err +} diff --git a/internal/app/wxApplet/logic/sysProjectTeamSquad/sys_project_team_squad.go b/internal/app/wxApplet/logic/sysProjectTeamSquad/sys_project_team_squad.go new file mode 100644 index 0000000..a25866c --- /dev/null +++ b/internal/app/wxApplet/logic/sysProjectTeamSquad/sys_project_team_squad.go @@ -0,0 +1,322 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-30 15:24:06 +// 生成路径: internal/app/wxApplet/logic/sys_project_team_squad.go +// 生成人:gfast +// desc:站班会 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + "errors" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + busFolderFile "github.com/tiger1103/gfast/v3/internal/app/system/logic/busFolderFile" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model/do" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "strings" +) + +func init() { + service.RegisterSysProjectTeamSquad(New()) +} + +func New() *sSysProjectTeamSquad { + return &sSysProjectTeamSquad{} +} + +type sSysProjectTeamSquad struct{} + +func (s *sSysProjectTeamSquad) SelectByOpenidTeamSquadSearch(ctx context.Context, req *wxApplet.SelectByOpenidTeamSquadSearchReq) (listRes *wxApplet.SelectByOpenidTeamSquadSearchRes, err error) { + listRes = new(wxApplet.SelectByOpenidTeamSquadSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SysProjectTeamSquad.Ctx(ctx).WithAll().As("a"). + LeftJoin("bus_construction_user as b on a.compere_id = b.openid"). + Fields( + "DISTINCT a.id as s,a.*," + + "CASE WHEN b.user_name IS NULL OR b.user_name = '' THEN b.nick_name ELSE b.user_name END AS compere_name") + if req.Openid != "" { + m = m.Where("a."+dao.SysProjectTeamSquad.Columns().CompereId, req.Openid) + } + //创建时间模糊查询 + if req.MeetingDate != "" { + m = m.Where("a."+dao.SysProjectTeamSquad.Columns().MeetingDate+" like ?", "%"+req.MeetingDate+"%") + } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.SysProjectTeamSquad.Columns().CreatedAt+" >=? AND "+"a."+dao.SysProjectTeamSquad.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + array, err := m.Array() + listRes.Total = len(array) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.SysProjectTeamSquadInfoRes + err = m.Fields(wxApplet.SysProjectTeamSquadSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.SysProjectTeamSquadListRes, len(res)) + for k, v := range res { + ////单独获取参与人的名称 + //str := "" + //split := strings.Split(v.ParticipantId, ",") + //for i := range split { + // str = str + "'" + split[i] + "'," + // if i == len(split)-1 { + // str = str + "'" + split[i] + "'" + // } else { + // str = str + "'" + split[i] + "'," + // } + //} + //name, _ := dao.BusConstructionUser.Ctx(ctx). + // Where("openid in (" + str + ")"). + // Fields("GROUP_CONCAT(CASE WHEN user_name IS NULL OR user_name = '' THEN nick_name ELSE user_name END) AS participant_name").Value() + listRes.List[k] = &model.SysProjectTeamSquadListRes{ + Id: v.Id, + TeamId: v.TeamId, + MeetingDate: v.MeetingDate, + CompereId: v.CompereId, + ParticipantId: v.ParticipantId, + Content: v.Content, + Picture: v.Picture, + CreatedAt: v.CreatedAt, + TeamName: v.TeamName, + LabourserviceName: v.LabourserviceName, + CompereName: v.CompereName, + //ParticipantName: name.String(), + } + } + }) + return +} + +func (s *sSysProjectTeamSquad) List(ctx context.Context, req *wxApplet.SysProjectTeamSquadSearchReq) (listRes *wxApplet.SysProjectTeamSquadSearchRes, err error) { + listRes = new(wxApplet.SysProjectTeamSquadSearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SysProjectTeamSquad.Ctx(ctx).WithAll().As("a"). + LeftJoin("bus_construction_user as b on a.compere_id = b.openid"). + Fields( + "DISTINCT a.id as s,a.*," + + "CASE WHEN b.user_name IS NULL OR b.user_name = '' THEN b.nick_name ELSE b.user_name END AS compere_name") + + if req.ProjectId != "" { + m = m.Where("a."+dao.SysProjectTeamSquad.Columns().ProjectId, req.ProjectId) + } + //创建时间模糊查询 + if req.MeetingDate != "" { + m = m.Where("a."+dao.SysProjectTeamSquad.Columns().MeetingDate+" like ?", "%"+req.MeetingDate+"%") + } + ////创建时间模糊查询 + //if req.CreatedAt != "" { + // date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + // m = m.Where("a."+dao.SysProjectTeamSquad.Columns().CreatedAt+" like ?", "%"+date+"%") + //} + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.SysProjectTeamSquad.Columns().CreatedAt+" >=? AND "+"a."+dao.SysProjectTeamSquad.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + array, err := m.Array() + listRes.Total = len(array) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.SysProjectTeamSquadInfoRes + err = m.Fields(wxApplet.SysProjectTeamSquadSearchRes{}).Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.SysProjectTeamSquadListRes, len(res)) + for k, v := range res { + ////单独获取参与人的名称 + //str := "" + //split := strings.Split(v.ParticipantId, ",") + //for i := range split { + // str = str + "'" + split[i] + "'," + // if i == len(split)-1 { + // str = str + "'" + split[i] + "'" + // } else { + // str = str + "'" + split[i] + "'," + // } + //} + //name, _ := dao.BusConstructionUser.Ctx(ctx). + // Where("openid in (" + str + ")"). + // Fields("GROUP_CONCAT(CASE WHEN user_name IS NULL OR user_name = '' THEN nick_name ELSE user_name END) AS participant_name").Value() + listRes.List[k] = &model.SysProjectTeamSquadListRes{ + Id: v.Id, + TeamId: v.TeamId, + MeetingDate: v.MeetingDate, + CompereId: v.CompereId, + ParticipantId: v.ParticipantId, + Content: v.Content, + Picture: v.Picture, + CreatedAt: v.CreatedAt, + TeamName: v.TeamName, + LabourserviceName: v.LabourserviceName, + CompereName: v.CompereName, + //ParticipantName: name.String(), + } + } + }) + return +} + +func (s *sSysProjectTeamSquad) GetById(ctx context.Context, id int64) (res *model.SysProjectTeamSquadInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.SysProjectTeamSquad.Ctx(ctx).WithAll().As("a"). + LeftJoin("bus_construction_user as b on a.compere_id = b.openid"). + Fields( + "a.*,"+ + "CASE WHEN b.user_name IS NULL OR b.user_name = '' THEN b.nick_name ELSE b.user_name END AS compere_name"). + Where("a."+dao.SysProjectTeamSquad.Columns().Id, id).Scan(&res) + //单独获取参与人的名称 + str := "" + split := strings.Split(res.ParticipantId, ",") + for i := range split { + str = str + "'" + split[i] + "'," + if i == len(split)-1 { + str = str + "'" + split[i] + "'" + } else { + str = str + "'" + split[i] + "'," + } + } + name, _ := dao.BusConstructionUser.Ctx(ctx). + Where("openid in (" + str + ")"). + Fields("GROUP_CONCAT(CASE WHEN user_name IS NULL OR user_name = '' THEN nick_name ELSE user_name END) AS participant_name").Value() + res.ParticipantName = name.String() + liberr.ErrIsNil(ctx, err, "获取信息失败") + }) + return +} + +func (s *sSysProjectTeamSquad) Add(ctx context.Context, req *wxApplet.SysProjectTeamSquadAddReq) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + //err = g.Try(ctx, func(ctx context.Context) { + //1、校验当前人是否在此班组下 + count, err := dao.SysProjectTeamMember.Ctx(ctx).Where("team_id", req.TeamId).Where("openid", req.CompereId).Count() + if count == 0 { + err = errors.New("操作人与班组有误!") + } + splitStr := strings.Split(req.Picture, ",") + req.Picture = "" + for _, img := range splitStr { + req.Picture = req.Picture + strings.ReplaceAll(img, "/file", "/wxfile") + "," + } + req.Picture = strings.TrimRight(req.Picture, ",") + //2、数据组装 + value, err := dao.SysProjectTeam.Ctx(ctx).WherePri(req.TeamId).Fields("project_id").Value() + squad := do.SysProjectTeamSquad{ + TeamId: req.TeamId, + ProjectId: value, + MeetingDate: req.MeetingDate, + CompereId: req.CompereId, + ParticipantId: req.ParticipantId, + Content: req.Content, + Picture: req.Picture, + } + //3、填充 班组名称、劳务公司名称 + var wxUserEntity *model.BusConstructionUserInfoRes + dao.BusConstructionUser.Ctx(ctx).Where("openid", req.CompereId).Scan(&wxUserEntity) + if wxUserEntity != nil { + //获取班组名称 + var spt *model.SysProjectTeamInfoRes + err := dao.SysProjectTeam.Ctx(ctx).WherePri(req.TeamId).Scan(&spt) + if err != nil || spt == nil { + err = errors.New("代码错误,请联系管理员!") + //return + } + //bzName, _ := dao.SysProjectTeam.Ctx(ctx).WherePri(req.TeamId).Fields("name").Value() + //获取劳务名称 + lwName, _ := dao.BusLabourservice.Ctx(ctx).WherePri(wxUserEntity.LabourserviceId).Fields("name").Value() + squad.ProjectId = spt.ProjectId + squad.TeamName = spt.Name + squad.LabourserviceName = lwName.String() + } + //4、新增数据 + dataInfo, err := dao.SysProjectTeamSquad.Ctx(ctx).Insert(squad) + id, err := dataInfo.LastInsertId() + + ////百度转高德 + //split := strings.Split(req.LongitudeAndLatitude, ",") + //lon, err := strconv.ParseFloat(split[0], 64) + //lat, err := strconv.ParseFloat(split[1], 64) + //gcj021, gcj022 := coryCommon.BD09toGCJ02(lon, lat) + //req.LongitudeAndLatitude = fmt.Sprintf("%.2f", gcj021) + "," + fmt.Sprintf("%.2f", gcj022) + ////逆编码 + //var res *coryCommon.InverseGeocodingRep + //we := coryCommon.InverseGeocoding(req.LongitudeAndLatitude) + //bodyData := []byte(we) + //err = json.Unmarshal(bodyData, &res) + //if err != nil { + // fmt.Println("Failed to parse JSON data:", err) + // return err + //} + ////s2 := squad.TeamName.(string) + //site := res.Regeocode.FormattedAddress + //v, err := dao.BusConstructionUser.Ctx(ctx).Where("openid", req.CompereId).Fields("IFNULL(user_name,nick_name) as bzzName").Value() + //meetingDate := req.MeetingDate.Format("Y-m-d") + //给图片添加水印 + //go coryCommon.MultiPicture(req.Picture, v.String(), meetingDate, site, squad.TeamName.(string), squad.LabourserviceName.(string)) + //5、将图片信息添加到图库中 + pe := strings.Split(req.Picture, ",") + err = busFolderFile.New().AllPicture(ctx, + pe, + 2, + dao.SysProjectTeamSquad.Table(), + id, + "2", + req.CompereId, + "", + value.Int64(), + ) + liberr.ErrIsNil(ctx, err, "添加失败") + return err + }) + return +} + +func (s *sSysProjectTeamSquad) Edit(ctx context.Context, req *wxApplet.SysProjectTeamSquadEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysProjectTeamSquad.Ctx(ctx).WherePri(req.Id).Update(do.SysProjectTeamSquad{}) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sSysProjectTeamSquad) Delete(ctx context.Context, ids []int64) (err error) { + err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + err = g.Try(ctx, func(ctx context.Context) { + //删除图库 + err = busFolderFile.New().AllDelete( + ctx, + dao.SysProjectTeamSquad.Table(), + ids, + ) + //删除站班会 + _, err = dao.SysProjectTeamSquad.Ctx(ctx).Delete(dao.SysProjectTeamSquad.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return err + }) + return +} diff --git a/internal/app/wxApplet/logic/sysUserProjectRelevancy/sys_user_project_relevancy.go b/internal/app/wxApplet/logic/sysUserProjectRelevancy/sys_user_project_relevancy.go new file mode 100644 index 0000000..a089ec3 --- /dev/null +++ b/internal/app/wxApplet/logic/sysUserProjectRelevancy/sys_user_project_relevancy.go @@ -0,0 +1,143 @@ +// ========================================================================== +// GFast自动生成logic操作代码。 +// 生成日期:2023-08-21 09:19:15 +// 生成路径: internal/app/wxApplet/logic/sys_user_project_relevancy.go +// 生成人:gfast +// desc:系统用户与项目关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package logic + +import ( + "context" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/system/consts" + ct "github.com/tiger1103/gfast/v3/internal/app/system/logic/context" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model/do" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" + "github.com/tiger1103/gfast/v3/library/liberr" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" +) + +func init() { + service.RegisterSysUserProjectRelevancy(New()) +} + +func New() *sSysUserProjectRelevancy { + return &sSysUserProjectRelevancy{} +} + +type sSysUserProjectRelevancy struct{} + +func (s *sSysUserProjectRelevancy) List(ctx context.Context, req *wxApplet.SysUserProjectRelevancySearchReq) (listRes *wxApplet.SysUserProjectRelevancySearchRes, err error) { + listRes = new(wxApplet.SysUserProjectRelevancySearchRes) + err = g.Try(ctx, func(ctx context.Context) { + m := dao.SysUserProjectRelevancy.Ctx(ctx).WithAll().As("a"). + LeftJoin("sys_project as b on a.project_id = b.id"). + Fields(`a.*, + CASE WHEN (b.short_name IS NULL OR b.project_name = '') THEN b.project_name ELSE b.short_name END AS project_name, + b.lng,b.lat,b.type,b.project_site`) + if req.UserId != "" { + m = m.Where("a."+dao.SysUserProjectRelevancy.Columns().UserId+" = ?", gconv.Int64(req.UserId)) + } + if req.ProjectId != "" { + m = m.Where("a."+dao.SysUserProjectRelevancy.Columns().ProjectId+" = ?", gconv.Int64(req.ProjectId)) + } + if len(req.DateRange) != 0 { + m = m.Where("a."+dao.SysUserProjectRelevancy.Columns().CreatedAt+" >=? AND "+dao.SysUserProjectRelevancy.Columns().CreatedAt+" <=?", req.DateRange[0], req.DateRange[1]) + } + // 创建时间模糊查询 + if req.CreatedAt != "" { + date := tool.New().GetFormattedDate(gconv.Time(req.CreatedAt)) + m = m.Where("a."+dao.SysUserProjectRelevancy.Columns().CreatedAt+" like ?", "%"+date+"%") + } + array, err := m.Array() + listRes.Total = len(array) + liberr.ErrIsNil(ctx, err, "获取总行数失败") + if req.PageNum == 0 { + req.PageNum = 1 + } + listRes.CurrentPage = req.PageNum + if req.PageSize == 0 { + req.PageSize = consts.PageSize + } + order := "id desc" + if req.OrderBy != "" { + order = req.OrderBy + } + var res []*model.SysUserProjectRelevancyInfoRes + err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取数据失败") + listRes.List = make([]*model.SysUserProjectRelevancyListRes, len(res)) + for k, v := range res { + listRes.List[k] = &model.SysUserProjectRelevancyListRes{ + Id: v.Id, + UserId: v.UserId, + ProjectId: v.ProjectId, + CreatedAt: v.CreatedAt, + ProjectName: v.ProjectName, + Lng: v.Lng, + Lat: v.Lat, + Type: v.Type, + ProjectSite: v.ProjectSite, + } + } + }) + return +} + +func (s *sSysUserProjectRelevancy) GetById(ctx context.Context, id int64) (res *model.SysUserProjectRelevancyInfoRes, err error) { + err = g.Try(ctx, func(ctx context.Context) { + err = dao.SysUserProjectRelevancy.Ctx(ctx).WithAll().As("a"). + LeftJoin("sys_project as b on a.project_id = b.id"). + Fields("a.*,b.project_name,b.lng,b.lat"). + Where("a."+dao.SysUserProjectRelevancy.Columns().Id, id).Scan(&res) + liberr.ErrIsNil(ctx, err, "获取信息失败") + // 获取创建人 更新人 + by := coryCommon.New().CreateByOrUpdateBy(ctx, res) + infoRes := by.(model.SysUserProjectRelevancyInfoRes) + res = &infoRes + }) + return +} + +func (s *sSysUserProjectRelevancy) Add(ctx context.Context, req *wxApplet.SysUserProjectRelevancyAddReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + name := ct.New().GetLoginUser(ctx).Id + _, err = dao.SysUserProjectRelevancy.Ctx(ctx).Insert(do.SysUserProjectRelevancy{ + UserId: req.UserId, + ProjectId: req.ProjectId, + CreateBy: name, + }) + liberr.ErrIsNil(ctx, err, "添加失败") + }) + return +} + +func (s *sSysUserProjectRelevancy) Edit(ctx context.Context, req *wxApplet.SysUserProjectRelevancyEditReq) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + name := ct.New().GetLoginUser(ctx).Id + _, err = dao.SysUserProjectRelevancy.Ctx(ctx).WherePri(req.Id).Update(do.SysUserProjectRelevancy{ + UserId: req.UserId, + ProjectId: req.ProjectId, + UpdateBy: name, + }) + liberr.ErrIsNil(ctx, err, "修改失败") + }) + return +} + +func (s *sSysUserProjectRelevancy) Delete(ctx context.Context, ids []int64) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + _, err = dao.SysUserProjectRelevancy.Ctx(ctx).Delete(dao.SysUserProjectRelevancy.Columns().Id+" in (?)", ids) + liberr.ErrIsNil(ctx, err, "删除失败") + }) + return +} diff --git a/internal/app/wxApplet/model/app_port_do.go b/internal/app/wxApplet/model/app_port_do.go new file mode 100644 index 0000000..19ef1a3 --- /dev/null +++ b/internal/app/wxApplet/model/app_port_do.go @@ -0,0 +1,15 @@ +package model + +type AppAllMembersOfTheCurrentGroupRes struct { + Openid string `json:"openid" dc:"openid"` + PacePhoto string `json:"pacePhoto" dc:"人脸"` + UserName string `json:"userName" dc:"姓名"` +} + +type AppSelectThisUserByCardRecordReqRes struct { + Openid string `json:"openid" dc:"openid"` + PacePhoto string `json:"pacePhoto" dc:"人脸"` + UserName string `json:"userName" dc:"姓名"` + ClockingTime string `json:"clockingTime" dc:"打卡时间"` + Commuter string `json:"commuter" dc:"上下班(1上班2下班)"` +} diff --git a/internal/app/wxApplet/model/bus_askforleave.go b/internal/app/wxApplet/model/bus_askforleave.go new file mode 100644 index 0000000..8f38014 --- /dev/null +++ b/internal/app/wxApplet/model/bus_askforleave.go @@ -0,0 +1,99 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2025-03-27 14:14:25 +// 生成路径: internal/app/wxApplet/model/bus_askforleave.go +// 生成人:gfast +// desc:请假 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusAskforleaveInfoRes is the golang structure for table bus_askforleave. +type BusAskforleaveInfoRes struct { + gmeta.Meta `orm:"table:bus_askforleave"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目ID + ProjectName string `orm:"project_name" json:"projectName"` // 项目名称 + TeamId int64 `orm:"team_id" json:"teamId"` // 班组ID + TeamName string `orm:"team_name" json:"teamName"` // 班组名称 + StartTime *gtime.Time `orm:"start time" json:"startTime"` // 开始时间 + EndTime *gtime.Time `orm:"end_time" json:"endTime"` // 结束时间 + Argument string `orm:"argument" json:"argument"` // 请假理由 + Ganger string `orm:"ganger" json:"ganger"` // 班组长 + GangerOpinion string `orm:"ganger_opinion" json:"gangerOpinion"` // 班组长意见(1未读 2同意 3拒绝) + GangerExplain string `orm:"ganger_explain" json:"gangerExplain"` // 拒绝理由 + GangerTime *gtime.Time `orm:"ganger_time" json:"gangerTime"` // 班组长操作时间 + Manager string `orm:"manager" json:"manager"` // 管理员 + ManagerOpinion string `orm:"manager_opinion" json:"managerOpinion"` // 管理员意见(1未读 2同意 3拒绝) + ManagerExplain string `orm:"manager_explain" json:"managerExplain"` // 拒绝理由 + ManagerTime *gtime.Time `orm:"manager_time" json:"managerTime"` // 管理员操作时间 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Remark string `orm:"remark" json:"remark"` // 备注 + Openid string `orm:"openid" json:"openid"` // openid + + CardMode string `json:"cardMode" dc:"卡片状态(文字)"` + CardNumber string `json:"cardNumber" dc:"卡片状态(数字:1待审核 2审核中 3已拒绝 4已同意)"` + UserName string `json:"userName" dc:"真实姓名"` +} + +type BusAskforleaveListRes struct { + Id int64 `json:"id"` + ProjectId int64 `json:"projectId"` + ProjectName string `json:"projectName"` + TeamId int64 `json:"teamId"` + TeamName string `json:"teamName"` + StartTime *gtime.Time `json:"startTime"` + EndTime *gtime.Time `json:"endTime"` + Argument string `json:"argument"` + Ganger string `json:"ganger"` + GangerOpinion string `json:"gangerOpinion"` + GangerExplain string `json:"gangerExplain"` + GangerTime *gtime.Time `json:"gangerTime"` + Manager string `json:"manager"` + ManagerOpinion string `json:"managerOpinion"` + ManagerExplain string `json:"managerExplain"` + ManagerTime *gtime.Time `json:"managerTime"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` + Remark string `json:"remark"` + Openid string `json:"openid"` + + CardMode string `json:"cardMode" dc:"卡片状态(文字)"` + CardNumber string `json:"cardNumber" dc:"卡片状态(数字:1待审核 2审核中 3已拒绝 4已同意)"` + UserName string `json:"userName" dc:"真实姓名"` +} + +type BusAskforleaveListAppRes struct { + Id int64 `dc:"主键ID" json:"id"` + ProjectId int64 `dc:"项目ID" json:"projectId"` + ProjectName string `dc:"项目名称" json:"projectName"` + TeamId int64 `dc:"班组ID" json:"teamId"` + TeamName string `dc:"班组名称" json:"teamName"` + StartTime *gtime.Time `dc:"开始时间" json:"startTime"` + EndTime *gtime.Time `dc:"结束时间" json:"endTime"` + Argument string `dc:"请假理由" json:"argument"` + Ganger string `dc:"班组长" json:"ganger"` + GangerName string `dc:"班组长名称" json:"gangerName"` + GangerOpinion string `dc:"班组长意见(1未读 2同意 3拒绝)" json:"gangerOpinion"` + GangerExplain string `dc:"拒绝理由" json:"gangerExplain"` + GangerTime *gtime.Time `dc:"班组长操作时间" json:"gangerTime"` + Manager string `dc:"管理员" json:"manager"` + ManagerName string `dc:"管理员" json:"managerName"` + ManagerOpinion string `dc:"管理员意见(1未读 2同意 3拒绝)" json:"managerOpinion"` + ManagerExplain string `dc:"拒绝理由" json:"managerExplain"` + ManagerTime *gtime.Time `dc:"管理员操作时间" json:"managerTime"` + CreatedAt *gtime.Time `dc:"创建时间" json:"createdAt"` + Openid string `dc:"申请人openid" json:"openid"` + UserName string `dc:"申请人名称" json:"userName"` +} diff --git a/internal/app/wxApplet/model/bus_attendance.go b/internal/app/wxApplet/model/bus_attendance.go new file mode 100644 index 0000000..bbfbddf --- /dev/null +++ b/internal/app/wxApplet/model/bus_attendance.go @@ -0,0 +1,108 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-07 16:29:52 +// 生成路径: internal/app/wxApplet/model/bus_attendance.go +// 生成人:gfast +// desc:考勤 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusAttendanceInfoRes is the golang structure for table bus_attendance. +type BusAttendanceInfoRes struct { + gmeta.Meta `orm:"table:bus_attendance"` + Id uint64 `orm:"id,primary" json:"id"` // 序号 + UserName string `orm:"user_name" json:"userName"` // 人员姓名 + PacePhoto string `orm:"pace_photo" json:"pacePhoto"` // 人脸照 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + ClockOn string `orm:"clock_on" json:"clockOn"` // 上午打卡 + ClockOff string `orm:"clock_off" json:"clockOff"` // 下午打卡 + PrintingDate string `orm:"printing_date" json:"printingDate"` // 年月日打卡时间 + IsPinch string `orm:"is_pinch" json:"isPinch"` // 打卡状态 + Openid string `orm:"openid" json:"openid"` // 微信id + PinchOpenId string `orm:"pinch_openId" json:"pinchOpenId"` // 代打id + ClockRecord string `orm:"clock_record" json:"clockRecord"` // 多次打卡时间记录 + PinchUserName string `orm:"pinch_user_name" json:"pinchUserName"` // 代打人姓名 + Commuter string `orm:"commuter" json:"commuter"` // 上下班(1上班2下班) + PunchRange string `orm:"punch_range" json:"punchRange"` // 打卡范围 + DailyWage float64 `orm:"daily_wage" json:"dailyWage"` // 日薪 + Lng string `orm:"lng" json:"lng"` // 经度 + Lat string `orm:"lat" json:"lat"` // 纬度 + Location string `orm:"location" json:"location"` // 逆编码地址 + Missing *gtime.Time `orm:"missing" json:"missing"` // 逆编码地址 +} + +type BusAttendanceListRes struct { + Id uint64 `json:"id"` + UserName string `json:"userName"` + PacePhoto string `json:"pacePhoto"` + ProjectId int64 `json:"projectId"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` + ClockOn string `json:"clockOn"` + ClockOff string `json:"clockOff"` + PrintingDate string `json:"printingDate"` + IsPinch string `json:"isPinch"` + Openid string `json:"openid"` + PinchOpenId string `json:"pinchOpenId"` + ClockRecord string `json:"clockRecord"` + PinchUserName string `json:"pinchUserName"` + Commuter string `json:"commuter"` + PunchRange string `json:"punchRange"` + DailyWage float64 `json:"dailyWage"` + Lng string `json:"lng"` // 经度 + Lat string `json:"lat"` // 纬度 + Location string `json:"location"` // 逆编码地址 +} +type AppReissueACardListRes struct { + Id uint64 `json:"id" dc:"主键ID"` + IsPinch string `json:"isPinch" dc:"打卡状态(1正常 2迟到 3早退 4缺勤)"` + PrintingDate string `json:"printingDate" dc:"日期"` + Week string `json:"week" dc:"星期"` + Commuter int64 `json:"commuter" dc:"上下班状态(1上班 2下班)"` +} + +type AppLocationAttendanceStatisticsOneRes struct { + PrintingDate string `json:"printingDate" dc:"打卡日期"` + Types []string `json:"types" dc:"考勤状态(1正常 2迟到 3早退 4缺卡 5提交过补卡申请)"` + ClockInTimeRange string `json:"clockInTimeRange" dc:"上下班打卡时间范围"` + Number int `json:"number" dc:"打卡次数"` + WorkingHours float64 `json:"workingHours" dc:"工作时长(单位/小时)"` + List []*AppLocationAttendanceStatisticsTwoRes `json:"list" dc:"上下班打卡明细"` +} + +type AppLocationAttendanceStatisticsTwoRes struct { + Id uint64 `json:"id" dc:"主键ID"` + Commuter string `json:"commuter" dc:"上下班状态(1上班 2下班)"` + CommutingTime string `json:"commutingTime" dc:"上下班时间"` + IsPinch string `json:"isPinch" dc:"打卡状态(1正常 2迟到 3早退 4缺勤)"` + Location string `json:"location" dc:"打卡详细地址"` + MinutesLate float64 `json:"minutesLate" dc:"迟到分钟数"` +} + +type AppResubmitTheExitAttachmentModelRes struct { + gmeta.Meta `orm:"table:bus_attendance"` + Id int64 `json:"id" dc:"考勤打卡的主键ID"` + PrintingDate string `json:"printingDate" dc:"考勤打卡的主键ID"` + Openid string `json:"openid" dc:"openid"` + PacePhoto string `json:"pacePhoto" dc:"人脸照"` + UserName string `json:"userName" dc:"用户名称"` + BzName string `json:"bzName" dc:"班组名称"` + TypeOfWorkName string `json:"typeOfWorkName" dc:"工种名称"` + Status string `json:"status" dc:"1出勤 2半勤 3缺勤 0(请求参数Type是什么就是什么)"` + Number int `json:"number" dc:"当天出勤次数"` + LackOfCard int `json:"lackOfCard" dc:"当天缺卡次数"` + List []*BusAttendanceInfoRes `json:"list"` +} diff --git a/internal/app/wxApplet/model/bus_construction_project.go b/internal/app/wxApplet/model/bus_construction_project.go new file mode 100644 index 0000000..204389b --- /dev/null +++ b/internal/app/wxApplet/model/bus_construction_project.go @@ -0,0 +1,28 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-07 11:17:50 +// 生成路径: internal/app/wxApplet/model/bus_construction_project.go +// 生成人:gfast +// desc:施工人员对应项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionProjectInfoRes is the golang structure for table bus_construction_project. +type BusConstructionProjectInfoRes struct { + gmeta.Meta `orm:"table:bus_construction_project"` + Id uint64 `orm:"id,primary" json:"id"` // 序号 + ConstructionUserId int64 `orm:"construction_user_id" json:"constructionUserId"` // 微信用户id + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id +} + +type BusConstructionProjectListRes struct { + Id uint64 `json:"id"` + ConstructionUserId int64 `json:"constructionUserId"` + ProjectId int64 `json:"projectId"` +} diff --git a/internal/app/wxApplet/model/bus_construction_user.go b/internal/app/wxApplet/model/bus_construction_user.go new file mode 100644 index 0000000..5c5dd66 --- /dev/null +++ b/internal/app/wxApplet/model/bus_construction_user.go @@ -0,0 +1,171 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-07 11:17:50 +// 生成路径: internal/app/wxApplet/model/bus_construction_user.go +// 生成人:gfast +// desc:施工人员 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionUserInfoRes is the golang structure for table bus_construction_user. +type BusConstructionUserInfoRes struct { + gmeta.Meta `orm:"table:bus_construction_user"` + Id int64 `orm:"id,primary,omitempty" json:"id"` // 序号 + Openid string `orm:"openid,omitempty" json:"openid"` // 微信id + NickName string `orm:"nick_name,omitempty" json:"nickName"` // 微信名称 + TeamId int64 `orm:"team_id,omitempty" json:"teamId"` // 班组id + HeadIcon string `orm:"head_icon,omitempty" json:"headIcon"` // 登陆照片 + PacePhoto string `orm:"pace_photo,omitempty" json:"pacePhoto"` // 人脸照 + UserName string `orm:"user_name,omitempty" json:"userName"` // 人员姓名 + ProjectId int64 `orm:"project_id,omitempty" json:"projectId"` // 项目id + Status string `orm:"status,omitempty" json:"status"` // 状态 + IsPinch string `orm:"is_pinch,omitempty" json:"isPinch"` // 是否代打 + IfManagement string `orm:"if_management,omitempty" json:"ifManagement"` // 是否班组管理 + CreateBy string `orm:"create_by,omitempty" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by,omitempty" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Phone string `orm:"phone,omitempty" json:"phone"` // 电话 + Sex string `orm:"sex,omitempty" json:"sex"` // 性别 + SfzNation string `orm:"sfz_nation,omitempty" json:"sfzNation"` // 身份证民族 + SfzNumber string `orm:"sfz_number,omitempty" json:"sfzNumber"` // 身份证号码 + SfzStart string `orm:"sfz_start,omitempty" json:"sfzStart"` // 身份证有效开始期 + SfzEnd string `orm:"sfz_end,omitempty" json:"sfzEnd"` // 身份证有效结束期 + SfzSite string `orm:"sfz_site,omitempty" json:"sfzSite"` // 身份证地址 + NativePlace string `orm:"native_place,omitempty" json:"nativePlace"` // 籍贯 + YhkNumber string `orm:"yhk_number,omitempty" json:"yhkNumber"` // 银行卡号 + YhkOpeningBank string `orm:"yhk_opening_bank,omitempty" json:"yhkOpeningBank"` // 开户行 + YhkCardholder string `orm:"yhk_cardholder,omitempty" json:"yhkCardholder"` // 持卡人 + TypeOfWork string `orm:"type_of_work,omitempty" json:"typeOfWork"` // 工种 + SfzBirth string `orm:"sfz_birth,omitempty" json:"sfzBirth"` // 出生日期 + Clock string `orm:"clock,omitempty" json:"clock"` // 1打卡 2禁止打卡 + LabourserviceId string `orm:"labourservice_id,omitempty" json:"labourserviceId"` // 劳务公司id + BzName string `orm:"bz_name,omitempty" json:"bzName"` // 班组 + BzzName string `orm:"bzz_mame,omitempty" json:"bzzName"` // 班组长 + LwName string `orm:"lw_name,omitempty" json:"lwName"` // 劳务公司 + EntryDate *gtime.Time `orm:"entry_date" json:"entryDate"` // 入场时间 + LeaveDate *gtime.Time `orm:"leave_date,omitempty" json:"leaveDate"` // 离场时间 + Original string `orm:"original" json:"original"` // 离场时间 + Salary string `orm:"salary" json:"salary"` // 离场时间 + IfAdministrator string `orm:"if_administrator" json:"ifAdministrator"` // 是否是管理员 + ProjectRecord string `orm:"project_record" json:"projectRecord"` // 是否开启项目备案 + WxOrPc string `orm:"wx_or_pc" json:"wxOrPc"` //哪添加的(1表示pc 2表示小程序) + Name string `orm:"name" json:"name"` //项目名称 + DevNum string `orm:"dev_num" json:"devNum"` //安全帽标识 + BlackOpenid string `orm:"blackOpenid" json:"blackOpenid"` //此字段前端判断是否加入黑名单 + RoleIds []int64 `orm:"roleIds" json:"roleIds"` //角色权限 +} + +type BusConstructionUserListRes struct { + Id int64 `json:"id"` + Openid string `json:"openid"` + NickName string `json:"nickName"` + TeamId int64 `json:"teamId"` + HeadIcon string `json:"headIcon"` + PacePhoto string `json:"pacePhoto"` + UserName string `json:"userName"` + ProjectId int64 `json:"projectId"` + Status string `json:"status"` + IsPinch string `json:"isPinch"` + IfManagement string `json:"ifManagement"` + CreateBy string `json:"createBy"` + UpdateBy string `json:"updateBy"` + CreatedAt *gtime.Time `json:"createdAt"` + Phone string `json:"phone"` + Sex string `json:"sex"` + SfzNation string `json:"sfzNation"` + SfzNumber string `json:"sfzNumber"` + SfzStart string `json:"sfzStart"` + SfzEnd string `json:"sfzEnd"` + SfzSite string `json:"sfzSite"` + NativePlace string `json:"nativePlace"` + YhkNumber string `json:"yhkNumber"` + YhkOpeningBank string `json:"yhkOpeningBank"` + YhkCardholder string `json:"yhkCardholder"` + TypeOfWork string `json:"typeOfWork"` + SfzBirth string `json:"sfzBirth"` + Age string `json:"age"` + Clock string `json:"clock"` + LabourserviceId string `json:"labourserviceId"` + BzName string `json:"bzName"` + BzzName string `json:"bzzName"` + LwName string `json:"lwName"` + EntryDate *gtime.Time `json:"entryDate"` + LeaveDate *gtime.Time `json:"leaveDate"` + OriginalSalary string `json:"original"` + Salary string `json:"salary"` + ProjectRecord string `json:"projectRecord"` + WxOrPc string `json:"wxOrPc"` + //IsPass string `json:"isPass" dc:"成绩是否合格(1及格 2不及格 3暂无记录)"` + PdfStr string `json:"pdfStr" dc:"上次考试的试卷(PDF格式)"` + DevNum string `json:"devNum" dc:"安全帽标识"` + BlackOpenid string `json:"blackOpenid" dc:"此字段前端判断是否加入黑名单"` // + HistoricalRetreat bool `json:"historicalRetreat" dc:"布尔值:true代表有记录,反之无记录"` + FileStatus string `json:"fileStatus" dc:"1未上传 2上传中 3已上传"` + Signature string `json:"signature" dc:"签名(图片路径)"` +} + +type BusConstructiomUserSignatureRes struct { + gmeta.Meta `orm:"table:bus_constructiom_user_signature"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + Openid string `orm:"openid" json:"openid"` // 微信id + Signature string `orm:"signature" json:"signature" dc:"签名路径"` // 签名 + Change int64 `orm:"change" json:"change" dc:"是否更改签名(1不更改 2更改)"` // 是否更改签名(1不更改 2更改) +} + +type BusConstructionUserInfoTwoRes struct { + BusConstructionUserInfoRes + FileStatus string `json:"fileStatus" dc:"1未上传 2上传中 3已上传"` + Signature string `json:"signature" dc:"签名(图片路径)"` + UserFileList []*BusConstructionUserFileInfoRes `orm:"with:user_id=id, where:user_img_type in (4,5,6,7,8,10)" json:"userFileList"` //当前用户的文件资料 +} + +type AppListOfConstructionPersonnelModelRes struct { + Id int64 `dc:"施工人员主键ID" json:"id"` + Clock string `dc:"打卡(1启用打卡 2禁止打卡)" json:"clock"` + NickName string `dc:"微信名称" json:"nickName"` + HeadIcon string `dc:"微信头像" json:"headIcon"` + UserName string `dc:"人员姓名" json:"userName"` + PacePhoto string `dc:"人脸照" json:"pacePhoto"` + Sex string `dc:"性别(1男 2女 3保密)" json:"sex"` + SexName string `dc:"性别(中文)" json:"sexName"` + SfzBirth string `dc:"出生日期" json:"sfzBirth"` + Age string `dc:"年龄" json:"age"` + BzName string `dc:"班组" json:"bzName"` + TypeOfWorkName string `dc:"工种" json:"typeOfWorkName"` + LwName string `dc:"劳务公司" json:"lwName"` + EntryDate *gtime.Time `dc:"入场时间" json:"entryDate"` + LeaveDate *gtime.Time `dc:"离场时间" json:"leaveDate"` + Openid string `dc:"openid" json:"openid"` + IsAuthentication bool `dc:"isAuthentication" json:"isAuthentication"` +} + +type AppGetPersonnelDetailsModelRes struct { + Id int64 `json:"id" dc:"主键ID"` + Openid string `json:"openid" dc:"openid"` + PacePhoto string `json:"pacePhoto" dc:"人脸"` + UserName string `json:"userName" dc:"名称"` + SexName string `json:"sexName" dc:"性别"` + Phone string `json:"phone" dc:"电话"` + SfzNumber string `json:"sfzNumber" dc:"身份证号码"` + SfzNation string `json:"sfzNation" dc:"民族"` + SfzBirth string `json:"sfzBirth" dc:"出生日期"` + SfzSite string `json:"sfzSite" dc:"地址" ` + YhkOpeningBank string `json:"yhkOpeningBank" dc:"开户行(银行)"` + YhkNumber string `json:"yhkNumber" dc:"银行卡号"` + ProjectName string `json:"projectName" dc:"项目名称"` + LwName string `json:"lwName" dc:"劳务名称(施工单位)"` + BzName string `json:"bzName," dc:"班组名称"` + TypeOfWorkName string `json:"typeOfWorkName" dc:"工种"` + StatusStr string `json:"statusStr" dc:"状态"` + EntryDate *gtime.Time `json:"entryDate" dc:"入场时间"` + LeaveDate *gtime.Time `json:"leaveDate" dc:"退场时间"` +} diff --git a/internal/app/wxApplet/model/bus_construction_user_file.go b/internal/app/wxApplet/model/bus_construction_user_file.go new file mode 100644 index 0000000..3df67c4 --- /dev/null +++ b/internal/app/wxApplet/model/bus_construction_user_file.go @@ -0,0 +1,42 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-07 11:17:55 +// 生成路径: internal/app/wxApplet/model/bus_construction_user_file.go +// 生成人:gfast +// desc:微信用户的文件存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionUserFileInfoRes is the golang structure for table bus_construction_user_file. +type BusConstructionUserFileInfoRes struct { + gmeta.Meta `orm:"table:bus_construction_user_file"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + UserId int64 `orm:"user_id" json:"userId"` // 用户id + UserImgType string `orm:"user_img_type" json:"userImgType"` // 图片类型 + Name string `orm:"name" json:"name"` // 图片名字 + Path string `orm:"path" json:"path"` // 图片路径 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Remark string `orm:"remark" json:"remark"` // 备注 + DictLabel string `orm:"dict_label" json:"dictLabel"` // 备注 +} + +type BusConstructionUserFileListRes struct { + Id int64 `json:"id"` + UserId int64 `json:"userId"` + UserImgType string `json:"userImgType"` + Name string `json:"name"` + Path string `json:"path"` + CreatedAt *gtime.Time `json:"createdAt"` + DictLabel string `json:"dictLabel"` +} diff --git a/internal/app/wxApplet/model/bus_construction_user_post.go b/internal/app/wxApplet/model/bus_construction_user_post.go new file mode 100644 index 0000000..5d8421a --- /dev/null +++ b/internal/app/wxApplet/model/bus_construction_user_post.go @@ -0,0 +1,28 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-07 11:17:55 +// 生成路径: internal/app/wxApplet/model/bus_construction_user_post.go +// 生成人:gfast +// desc:施工人员岗位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionUserPostInfoRes is the golang structure for table bus_construction_user_post. +type BusConstructionUserPostInfoRes struct { + gmeta.Meta `orm:"table:bus_construction_user_post"` + Id uint64 `orm:"id,primary" json:"id"` // 序号 + ConstructionUserId int64 `orm:"construction_user_id" json:"constructionUserId"` // 施工人员id + PostId int64 `orm:"post_id" json:"postId"` // 岗位id +} + +type BusConstructionUserPostListRes struct { + Id uint64 `json:"id"` + ConstructionUserId int64 `json:"constructionUserId"` + PostId int64 `json:"postId"` +} diff --git a/internal/app/wxApplet/model/bus_labourservice.go b/internal/app/wxApplet/model/bus_labourservice.go new file mode 100644 index 0000000..7ee898f --- /dev/null +++ b/internal/app/wxApplet/model/bus_labourservice.go @@ -0,0 +1,52 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-14 11:24:31 +// 生成路径: internal/app/wxApplet/model/bus_labourservice.go +// 生成人:gfast +// desc:劳务公司 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusLabourserviceInfoRes is the golang structure for table bus_labourservice. +type BusLabourserviceInfoRes struct { + gmeta.Meta `orm:"table:bus_labourservice"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + Name string `orm:"name" json:"name"` // 劳务公司 + Principal string `orm:"principal" json:"principal"` // 负责人 + Phone string `orm:"phone" json:"phone"` // 联系电话 + Custodian string `orm:"custodian" json:"custodian"` // 管理人 + CustodianPhone string `orm:"custodian_phone" json:"custodianPhone"` // 管理人联系电话 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Remark string `orm:"remark" json:"remark"` // 备注 +} + +type BusLabourserviceListRes struct { + Id int64 `json:"id"` + Name string `json:"name"` + Principal string `json:"principal"` + Phone string `json:"phone"` + Custodian string `json:"custodian"` + CustodianPhone string `json:"custodianPhone"` + CreatedAt *gtime.Time `json:"createdAt"` + Remark string `json:"remark"` +} + +type BusLabourserviceFileRes struct { + gmeta.Meta `orm:"table:bus_labourservice_file"` + Id int64 `orm:"id,primary" json:"id" dc:"资料ID"` + Pid int64 `orm:"pid" json:"pid" dc:"劳务公司主键ID"` + Type string `orm:"type" json:"type" dc:"资料类型"` + Name string `orm:"name" json:"name" dc:"文件名称"` + Path string `orm:"path" json:"path" dc:"路径"` +} diff --git a/internal/app/wxApplet/model/do/bus_askforleave.go b/internal/app/wxApplet/model/do/bus_askforleave.go new file mode 100644 index 0000000..b2d2c43 --- /dev/null +++ b/internal/app/wxApplet/model/do/bus_askforleave.go @@ -0,0 +1,43 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2025-03-27 14:14:25 +// 生成路径: internal/app/wxApplet/model/entity/bus_askforleave.go +// 生成人:gfast +// desc:请假 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusAskforleave is the golang structure for table bus_askforleave. +type BusAskforleave struct { + gmeta.Meta `orm:"table:bus_askforleave, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目ID + ProjectName interface{} `orm:"project_name" json:"projectName"` // 项目名称 + TeamId interface{} `orm:"team_id" json:"teamId"` // 班组ID + TeamName interface{} `orm:"team_name" json:"teamName"` // 班组名称 + StartTime *gtime.Time `orm:"start time" json:"startTime"` // 开始时间 + EndTime *gtime.Time `orm:"end_time" json:"endTime"` // 结束时间 + Argument interface{} `orm:"argument" json:"argument"` // 请假理由 + Ganger interface{} `orm:"ganger" json:"ganger"` // 班组长 + GangerOpinion interface{} `orm:"ganger_opinion" json:"gangerOpinion"` // 班组长意见(1未读 2同意 3拒绝) + GangerExplain interface{} `orm:"ganger_explain" json:"gangerExplain"` // 拒绝理由 + GangerTime *gtime.Time `orm:"ganger_time" json:"gangerTime"` // 班组长操作时间 + Manager interface{} `orm:"manager" json:"manager"` // 管理员 + ManagerOpinion interface{} `orm:"manager_opinion" json:"managerOpinion"` // 管理员意见(1未读 2同意 3拒绝) + ManagerExplain interface{} `orm:"manager_explain" json:"managerExplain"` // 拒绝理由 + ManagerTime *gtime.Time `orm:"manager_time" json:"managerTime"` // 管理员操作时间 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Remark interface{} `orm:"remark" json:"remark"` // 备注 + Openid interface{} `orm:"openid" json:"openid"` // openid +} diff --git a/internal/app/wxApplet/model/do/bus_attendance.go b/internal/app/wxApplet/model/do/bus_attendance.go new file mode 100644 index 0000000..57a87b6 --- /dev/null +++ b/internal/app/wxApplet/model/do/bus_attendance.go @@ -0,0 +1,43 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-07 16:29:52 +// 生成路径: internal/app/wxApplet/model/entity/bus_attendance.go +// 生成人:gfast +// desc:考勤 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusAttendance is the golang structure for table bus_attendance. +type BusAttendance struct { + gmeta.Meta `orm:"table:bus_attendance, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + UserName interface{} `orm:"user_name" json:"userName"` // 人员姓名 + PacePhoto interface{} `orm:"pace_photo" json:"pacePhoto"` // 人脸照 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + ClockOn interface{} `orm:"clock_on" json:"clockOn"` // 上午打卡 + ClockOff interface{} `orm:"clock_off" json:"clockOff"` // 下午打卡 + PrintingDate interface{} `orm:"printing_date" json:"printingDate"` // 年月日打卡时间 + IsPinch interface{} `orm:"is_pinch" json:"isPinch"` // 打卡状态 + Openid interface{} `orm:"openid" json:"openid"` // 微信id + PinchOpenId interface{} `orm:"pinch_openId" json:"pinchOpenId"` // 代打id + ClockRecord interface{} `orm:"clock_record" json:"clockRecord"` // 多次打卡时间记录 + PinchUserName interface{} `orm:"pinch_user_name" json:"pinchUserName"` // 代打人姓名 + Commuter interface{} `orm:"commuter" json:"commuter"` // 上下班 + PunchRange interface{} `orm:"punch_range" json:"punchRange"` // 打卡范围 + DailyWage interface{} `orm:"daily_wage" json:"dailyWage"` // 日薪 + Lng interface{} `orm:"lng" json:"lng"` // 经度 + Lat interface{} `orm:"lat" json:"lat"` // 纬度 + Location interface{} `orm:"location" json:"location"` // 逆编码地址 +} diff --git a/internal/app/wxApplet/model/do/bus_construction_project.go b/internal/app/wxApplet/model/do/bus_construction_project.go new file mode 100644 index 0000000..4c12666 --- /dev/null +++ b/internal/app/wxApplet/model/do/bus_construction_project.go @@ -0,0 +1,22 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-07 11:17:50 +// 生成路径: internal/app/wxApplet/model/entity/bus_construction_project.go +// 生成人:gfast +// desc:施工人员对应项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionProject is the golang structure for table bus_construction_project. +type BusConstructionProject struct { + gmeta.Meta `orm:"table:bus_construction_project, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + ConstructionUserId interface{} `orm:"construction_user_id" json:"constructionUserId"` // 微信用户id + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id +} diff --git a/internal/app/wxApplet/model/do/bus_construction_user.go b/internal/app/wxApplet/model/do/bus_construction_user.go new file mode 100644 index 0000000..59dbba0 --- /dev/null +++ b/internal/app/wxApplet/model/do/bus_construction_user.go @@ -0,0 +1,57 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-07 11:17:50 +// 生成路径: internal/app/wxApplet/model/entity/bus_construction_user.go +// 生成人:gfast +// desc:施工人员 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionUser is the golang structure for table bus_construction_user. +type BusConstructionUser struct { + gmeta.Meta `orm:"table:bus_construction_user, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + Openid interface{} `orm:"openid,primary" json:"openid"` // 微信id + NickName interface{} `orm:"nick_name" json:"nickName"` // 微信名称 + TeamId interface{} `orm:"team_id" json:"teamId"` // 班组id + HeadIcon interface{} `orm:"head_icon" json:"headIcon"` // 登陆照片 + PacePhoto interface{} `orm:"pace_photo" json:"pacePhoto"` // 人脸照 + UserName interface{} `orm:"user_name" json:"userName"` // 人员姓名 + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + Status interface{} `orm:"status,primary" json:"status"` // 状态 + IsPinch interface{} `orm:"is_pinch" json:"isPinch"` // 是否代打 + IfManagement interface{} `orm:"if_management" json:"ifManagement"` // 是否班组管理 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Phone interface{} `orm:"phone" json:"phone"` // 电话 + Sex interface{} `orm:"sex" json:"sex"` // 性别 + SfzNation interface{} `orm:"sfz_nation" json:"sfzNation"` // 身份证民族 + SfzNumber interface{} `orm:"sfz_number" json:"sfzNumber"` // 身份证号码 + SfzStart interface{} `orm:"sfz_start" json:"sfzStart"` // 身份证有效开始期 + SfzEnd interface{} `orm:"sfz_end" json:"sfzEnd"` // 身份证有效结束期 + SfzSite interface{} `orm:"sfz_site" json:"sfzSite"` // 身份证地址 + NativePlace interface{} `orm:"native_place" json:"nativePlace"` // 籍贯 + YhkNumber interface{} `orm:"yhk_number" json:"yhkNumber"` // 银行卡号 + YhkOpeningBank interface{} `orm:"yhk_opening_bank" json:"yhkOpeningBank"` // 开户行 + YhkCardholder interface{} `orm:"yhk_cardholder" json:"yhkCardholder"` // 持卡人 + WxOrPc interface{} `orm:"wx_or_pc,primary" json:"wxOrPc"` + SfzBirth interface{} `orm:"sfz_birth" json:"sfzBirth"` + LabourserviceId interface{} `orm:"labourservice_id" json:"labourserviceId"` + TypeOfWork interface{} `orm:"type_of_work" json:"typeOfWork"` + Clock interface{} `orm:"clock" json:"clock"` + EntryDate *gtime.Time `orm:"entry_date,primary" json:"entryDate"` + LeaveDate *gtime.Time `orm:"leave_date,primary" json:"leaveDate"` + Salary interface{} `orm:"salary" json:"salary"` // 薪水 + ProjectRecord interface{} `orm:"project_record,primary" json:"projectRecord"` // 是否开启项目备案 + DevNum interface{} `orm:"dev_num" json:"devNum"` // 安全帽标识 +} diff --git a/internal/app/wxApplet/model/do/bus_construction_user_file.go b/internal/app/wxApplet/model/do/bus_construction_user_file.go new file mode 100644 index 0000000..63e9f00 --- /dev/null +++ b/internal/app/wxApplet/model/do/bus_construction_user_file.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-07 11:17:55 +// 生成路径: internal/app/wxApplet/model/entity/bus_construction_user_file.go +// 生成人:gfast +// desc:微信用户的文件存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionUserFile is the golang structure for table bus_construction_user_file. +type BusConstructionUserFile struct { + gmeta.Meta `orm:"table:bus_construction_user_file, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + UserId interface{} `orm:"user_id" json:"userId"` // 用户id + UserImgType interface{} `orm:"user_img_type" json:"userImgType"` // 图片类型 + Name interface{} `orm:"name" json:"name"` // 名称 + Path interface{} `orm:"path" json:"path"` // 图片路径 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Remark interface{} `orm:"remark" json:"remark"` // 备注 +} diff --git a/internal/app/wxApplet/model/do/bus_construction_user_post.go b/internal/app/wxApplet/model/do/bus_construction_user_post.go new file mode 100644 index 0000000..0772216 --- /dev/null +++ b/internal/app/wxApplet/model/do/bus_construction_user_post.go @@ -0,0 +1,22 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-07 11:17:55 +// 生成路径: internal/app/wxApplet/model/entity/bus_construction_user_post.go +// 生成人:gfast +// desc:施工人员岗位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionUserPost is the golang structure for table bus_construction_user_post. +type BusConstructionUserPost struct { + gmeta.Meta `orm:"table:bus_construction_user_post, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 序号 + ConstructionUserId interface{} `orm:"construction_user_id" json:"constructionUserId"` // 施工人员id + PostId interface{} `orm:"post_id" json:"postId"` // 岗位id +} diff --git a/internal/app/wxApplet/model/do/bus_labourservice.go b/internal/app/wxApplet/model/do/bus_labourservice.go new file mode 100644 index 0000000..df848a7 --- /dev/null +++ b/internal/app/wxApplet/model/do/bus_labourservice.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-14 11:24:31 +// 生成路径: internal/app/wxApplet/model/entity/bus_labourservice.go +// 生成人:gfast +// desc:劳务公司 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusLabourservice is the golang structure for table bus_labourservice. +type BusLabourservice struct { + gmeta.Meta `orm:"table:bus_labourservice, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + Name interface{} `orm:"name" json:"name"` // 劳务公司 + Principal interface{} `orm:"principal" json:"principal"` // 负责人 + Phone interface{} `orm:"phone" json:"phone"` // 联系电话 + Custodian interface{} `orm:"custodian" json:"custodian"` // 管理人 + CustodianPhone interface{} `orm:"custodian_phone" json:"custodianPhone"` // 管理人联系电话 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Remark interface{} `orm:"remark" json:"remark"` // 备注 +} diff --git a/internal/app/wxApplet/model/do/sys_project_team.go b/internal/app/wxApplet/model/do/sys_project_team.go new file mode 100644 index 0000000..0ad161a --- /dev/null +++ b/internal/app/wxApplet/model/do/sys_project_team.go @@ -0,0 +1,29 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-15 09:34:52 +// 生成路径: internal/app/wxApplet/model/entity/sys_project_team.go +// 生成人:gfast +// desc:项目班组 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysProjectTeam is the golang structure for table sys_project_team. +type SysProjectTeam struct { + gmeta.Meta `orm:"table:sys_project_team, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目id + Name interface{} `orm:"name" json:"name"` // 班组名称 + IsClockIn interface{} `orm:"is_clock_in" json:"isClockIn"` // 班组名称 + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新者 + CreateTime *gtime.Time `orm:"create_time" json:"createTime"` // 创建时间 + UpdateTime *gtime.Time `orm:"update_time" json:"updateTime"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/wxApplet/model/do/sys_project_team_member.go b/internal/app/wxApplet/model/do/sys_project_team_member.go new file mode 100644 index 0000000..bb36e70 --- /dev/null +++ b/internal/app/wxApplet/model/do/sys_project_team_member.go @@ -0,0 +1,28 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-15 09:34:52 +// 生成路径: internal/app/wxApplet/model/entity/sys_project_team_member.go +// 生成人:gfast +// desc:项目班组下的成员 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysProjectTeamMember is the golang structure for table sys_project_team_member. +type SysProjectTeamMember struct { + gmeta.Meta `orm:"table:sys_project_team_member, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + TeamId interface{} `orm:"team_id" json:"teamId"` // 班组id + Openid interface{} `orm:"openid" json:"openid"` // 微信用户标识 + PostId interface{} `orm:"post_id" json:"postId"` // 岗位(默认为4普通员工,组长为10) + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目ID + CreateTime *gtime.Time `orm:"create_time" json:"createTime"` // 创建时间 + UpdateTime *gtime.Time `orm:"update_time" json:"updateTime"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/wxApplet/model/do/sys_project_team_squad.go b/internal/app/wxApplet/model/do/sys_project_team_squad.go new file mode 100644 index 0000000..d83b3c5 --- /dev/null +++ b/internal/app/wxApplet/model/do/sys_project_team_squad.go @@ -0,0 +1,35 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-30 15:24:06 +// 生成路径: internal/app/wxApplet/model/entity/sys_project_team_squad.go +// 生成人:gfast +// desc:站班会 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysProjectTeamSquad is the golang structure for table sys_project_team_squad. +type SysProjectTeamSquad struct { + gmeta.Meta `orm:"table:sys_project_team_squad, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目ID + TeamId interface{} `orm:"team_id" json:"teamId"` // 班组ID + MeetingDate *gtime.Time `orm:"meeting_date" json:"meetingDate"` // 开会时间 + CompereId interface{} `orm:"compere_id" json:"compereId"` // 宣讲人 + ParticipantId interface{} `orm:"participant_id" json:"participantId"` // 参与人ID(多个用,号隔开) + Content interface{} `orm:"content" json:"content"` // 班会内容 + Picture interface{} `orm:"picture,primary" json:"picture"` // 班会图片(多个用,号隔开) + CreateBy interface{} `orm:"create_by,primary" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by,primary" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + TeamName interface{} `orm:"team_name" json:"teamName"` // 班组名称 + LabourserviceName interface{} `orm:"labourservice_name" json:"labourserviceName"` // 劳务公司名称 +} diff --git a/internal/app/wxApplet/model/do/sys_user_project_relevancy.go b/internal/app/wxApplet/model/do/sys_user_project_relevancy.go new file mode 100644 index 0000000..f69e442 --- /dev/null +++ b/internal/app/wxApplet/model/do/sys_user_project_relevancy.go @@ -0,0 +1,31 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-21 09:19:15 +// 生成路径: internal/app/wxApplet/model/entity/sys_user_project_relevancy.go +// 生成人:gfast +// desc:系统用户与项目关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package do + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysUserProjectRelevancy is the golang structure for table sys_user_project_relevancy. +type SysUserProjectRelevancy struct { + gmeta.Meta `orm:"table:sys_user_project_relevancy, do:true"` + Id interface{} `orm:"id,primary" json:"id"` // 主键ID + UserId interface{} `orm:"user_id" json:"userId"` // 用户ID + ProjectId interface{} `orm:"project_id" json:"projectId"` // 项目ID + CreateBy interface{} `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy interface{} `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + + ProjectName interface{} `orm:"project_name" json:"projectName"` // 删除时间 + Source interface{} `orm:"source" json:"source"` // 来源 | 0 小程序 | 1 后台管理 +} diff --git a/internal/app/wxApplet/model/entity/bus_askforleave.go b/internal/app/wxApplet/model/entity/bus_askforleave.go new file mode 100644 index 0000000..b85d50f --- /dev/null +++ b/internal/app/wxApplet/model/entity/bus_askforleave.go @@ -0,0 +1,43 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2025-03-27 14:14:25 +// 生成路径: internal/app/wxApplet/model/entity/bus_askforleave.go +// 生成人:gfast +// desc:请假 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusAskforleave is the golang structure for table bus_askforleave. +type BusAskforleave struct { + gmeta.Meta `orm:"table:bus_askforleave"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目ID + ProjectName string `orm:"project_name" json:"projectName"` // 项目名称 + TeamId int64 `orm:"team_id" json:"teamId"` // 班组ID + TeamName string `orm:"team_name" json:"teamName"` // 班组名称 + StartTime *gtime.Time `orm:"start time" json:"startTime"` // 开始时间 + EndTime *gtime.Time `orm:"end_time" json:"endTime"` // 结束时间 + Argument string `orm:"argument" json:"argument"` // 请假理由 + Ganger string `orm:"ganger" json:"ganger"` // 班组长 + GangerOpinion string `orm:"ganger_opinion" json:"gangerOpinion"` // 班组长意见(1未读 2同意 3拒绝) + GangerExplain string `orm:"ganger_explain" json:"gangerExplain"` // 拒绝理由 + GangerTime *gtime.Time `orm:"ganger_time" json:"gangerTime"` // 班组长操作时间 + Manager string `orm:"manager" json:"manager"` // 管理员 + ManagerOpinion string `orm:"manager_opinion" json:"managerOpinion"` // 管理员意见(1未读 2同意 3拒绝) + ManagerExplain string `orm:"manager_explain" json:"managerExplain"` // 拒绝理由 + ManagerTime *gtime.Time `orm:"manager_time" json:"managerTime"` // 管理员操作时间 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Remark string `orm:"remark" json:"remark"` // 备注 + Openid string `orm:"openid" json:"openid"` // openid +} diff --git a/internal/app/wxApplet/model/entity/bus_attendance.go b/internal/app/wxApplet/model/entity/bus_attendance.go new file mode 100644 index 0000000..c0e917a --- /dev/null +++ b/internal/app/wxApplet/model/entity/bus_attendance.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-07 16:29:52 +// 生成路径: internal/app/wxApplet/model/entity/bus_attendance.go +// 生成人:gfast +// desc:考勤 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusAttendance is the golang structure for table bus_attendance. +type BusAttendance struct { + gmeta.Meta `orm:"table:bus_attendance"` + Id uint64 `orm:"id,primary" json:"id"` // 序号 + UserName string `orm:"user_name" json:"userName"` // 人员姓名 + PacePhoto string `orm:"pace_photo" json:"pacePhoto"` // 人脸照 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + ClockOn string `orm:"clock_on" json:"clockOn"` // 上午打卡 + ClockOff string `orm:"clock_off" json:"clockOff"` // 下午打卡 + PrintingDate string `orm:"printing_date" json:"printingDate"` // 年月日打卡时间 + IsPinch string `orm:"is_pinch" json:"isPinch"` // 打卡状态 + Openid string `orm:"openid" json:"openid"` // 微信id + PinchOpenId string `orm:"pinch_openId" json:"pinchOpenId"` // 代打id + ClockRecord string `orm:"clock_record" json:"clockRecord"` // 多次打卡时间记录 + PinchUserName string `orm:"pinch_user_name" json:"pinchUserName"` // 代打人姓名 +} diff --git a/internal/app/wxApplet/model/entity/bus_construction_project.go b/internal/app/wxApplet/model/entity/bus_construction_project.go new file mode 100644 index 0000000..95e1bb4 --- /dev/null +++ b/internal/app/wxApplet/model/entity/bus_construction_project.go @@ -0,0 +1,22 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-07 11:17:50 +// 生成路径: internal/app/wxApplet/model/entity/bus_construction_project.go +// 生成人:gfast +// desc:施工人员对应项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionProject is the golang structure for table bus_construction_project. +type BusConstructionProject struct { + gmeta.Meta `orm:"table:bus_construction_project"` + Id uint64 `orm:"id,primary" json:"id"` // 序号 + ConstructionUserId int64 `orm:"construction_user_id" json:"constructionUserId"` // 微信用户id + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id +} diff --git a/internal/app/wxApplet/model/entity/bus_construction_user.go b/internal/app/wxApplet/model/entity/bus_construction_user.go new file mode 100644 index 0000000..18a9248 --- /dev/null +++ b/internal/app/wxApplet/model/entity/bus_construction_user.go @@ -0,0 +1,47 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-07 11:17:50 +// 生成路径: internal/app/wxApplet/model/entity/bus_construction_user.go +// 生成人:gfast +// desc:施工人员 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionUser is the golang structure for table bus_construction_user. +type BusConstructionUser struct { + gmeta.Meta `orm:"table:bus_construction_user"` + Id int64 `orm:"id,primary" json:"id"` // 序号 + Openid string `orm:"openid" json:"openid"` // 微信id + NickName string `orm:"nick_name" json:"nickName"` // 微信名称 + TeamId int64 `orm:"team_id" json:"teamId"` // 班组id + HeadIcon string `orm:"head_icon" json:"headIcon"` // 登陆照片 + PacePhoto string `orm:"pace_photo" json:"pacePhoto"` // 人脸照 + UserName string `orm:"user_name" json:"userName"` // 人员姓名 + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Status string `orm:"status" json:"status"` // 状态 + IsPinch string `orm:"is_pinch" json:"isPinch"` // 是否代打 + IfManagement string `orm:"if_management" json:"ifManagement"` // 是否班组管理 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Phone string `orm:"phone" json:"phone"` // 电话 + Sex string `orm:"sex" json:"sex"` // 性别 + SfzNation string `orm:"sfz_nation" json:"sfzNation"` // 身份证民族 + SfzNumber string `orm:"sfz_number" json:"sfzNumber"` // 身份证号码 + SfzStart string `orm:"sfz_start" json:"sfzStart"` // 身份证有效开始期 + SfzEnd string `orm:"sfz_end" json:"sfzEnd"` // 身份证有效结束期 + SfzSite string `orm:"sfz_site" json:"sfzSite"` // 身份证地址 + NativePlace string `orm:"native_place" json:"nativePlace"` // 籍贯 + YhkNumber string `orm:"yhk_number" json:"yhkNumber"` // 银行卡号 + YhkOpeningBank string `orm:"yhk_opening_bank" json:"yhkOpeningBank"` // 开户行 + YhkCardholder string `orm:"yhk_cardholder" json:"yhkCardholder"` // 持卡人 +} diff --git a/internal/app/wxApplet/model/entity/bus_construction_user_file.go b/internal/app/wxApplet/model/entity/bus_construction_user_file.go new file mode 100644 index 0000000..af5fe3c --- /dev/null +++ b/internal/app/wxApplet/model/entity/bus_construction_user_file.go @@ -0,0 +1,30 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-07 11:17:55 +// 生成路径: internal/app/wxApplet/model/entity/bus_construction_user_file.go +// 生成人:gfast +// desc:微信用户的文件存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionUserFile is the golang structure for table bus_construction_user_file. +type BusConstructionUserFile struct { + gmeta.Meta `orm:"table:bus_construction_user_file"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + UserId int64 `orm:"user_id" json:"userId"` // 用户id + UserImgType string `orm:"user_img_type" json:"userImgType"` // 图片类型 + Path string `orm:"path" json:"path"` // 图片路径 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Remark string `orm:"remark" json:"remark"` // 备注 +} diff --git a/internal/app/wxApplet/model/entity/bus_construction_user_post.go b/internal/app/wxApplet/model/entity/bus_construction_user_post.go new file mode 100644 index 0000000..1ada141 --- /dev/null +++ b/internal/app/wxApplet/model/entity/bus_construction_user_post.go @@ -0,0 +1,22 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-07 11:17:55 +// 生成路径: internal/app/wxApplet/model/entity/bus_construction_user_post.go +// 生成人:gfast +// desc:施工人员岗位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusConstructionUserPost is the golang structure for table bus_construction_user_post. +type BusConstructionUserPost struct { + gmeta.Meta `orm:"table:bus_construction_user_post"` + Id uint64 `orm:"id,primary" json:"id"` // 序号 + ConstructionUserId int64 `orm:"construction_user_id" json:"constructionUserId"` // 施工人员id + PostId int64 `orm:"post_id" json:"postId"` // 岗位id +} diff --git a/internal/app/wxApplet/model/entity/bus_labourservice.go b/internal/app/wxApplet/model/entity/bus_labourservice.go new file mode 100644 index 0000000..a686eb4 --- /dev/null +++ b/internal/app/wxApplet/model/entity/bus_labourservice.go @@ -0,0 +1,30 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-14 11:24:31 +// 生成路径: internal/app/wxApplet/model/entity/bus_labourservice.go +// 生成人:gfast +// desc:劳务公司 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// BusLabourservice is the golang structure for table bus_labourservice. +type BusLabourservice struct { + gmeta.Meta `orm:"table:bus_labourservice"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + Name string `orm:"name" json:"name"` // 劳务公司 + Principal string `orm:"principal" json:"principal"` // 负责人 + Phone string `orm:"phone" json:"phone"` // 联系电话 + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + Remark string `orm:"remark" json:"remark"` // 备注 +} diff --git a/internal/app/wxApplet/model/entity/sys_project_team.go b/internal/app/wxApplet/model/entity/sys_project_team.go new file mode 100644 index 0000000..25039e9 --- /dev/null +++ b/internal/app/wxApplet/model/entity/sys_project_team.go @@ -0,0 +1,28 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-15 09:34:52 +// 生成路径: internal/app/wxApplet/model/entity/sys_project_team.go +// 生成人:gfast +// desc:项目班组 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysProjectTeam is the golang structure for table sys_project_team. +type SysProjectTeam struct { + gmeta.Meta `orm:"table:sys_project_team"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 班组名称 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreateTime *gtime.Time `orm:"create_time" json:"createTime"` // 创建时间 + UpdateTime *gtime.Time `orm:"update_time" json:"updateTime"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/wxApplet/model/entity/sys_project_team_member.go b/internal/app/wxApplet/model/entity/sys_project_team_member.go new file mode 100644 index 0000000..5760901 --- /dev/null +++ b/internal/app/wxApplet/model/entity/sys_project_team_member.go @@ -0,0 +1,27 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-15 09:34:52 +// 生成路径: internal/app/wxApplet/model/entity/sys_project_team_member.go +// 生成人:gfast +// desc:项目班组下的成员 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysProjectTeamMember is the golang structure for table sys_project_team_member. +type SysProjectTeamMember struct { + gmeta.Meta `orm:"table:sys_project_team_member"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目id + Openid string `orm:"openid" json:"openid"` // 微信用户标识 + PostId int64 `orm:"post_id" json:"postId"` // 岗位(默认为4普通员工,组长为10) + CreateTime *gtime.Time `orm:"create_time" json:"createTime"` // 创建时间 + UpdateTime *gtime.Time `orm:"update_time" json:"updateTime"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/wxApplet/model/entity/sys_project_team_squad.go b/internal/app/wxApplet/model/entity/sys_project_team_squad.go new file mode 100644 index 0000000..e6c7f7b --- /dev/null +++ b/internal/app/wxApplet/model/entity/sys_project_team_squad.go @@ -0,0 +1,32 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-30 15:24:06 +// 生成路径: internal/app/wxApplet/model/entity/sys_project_team_squad.go +// 生成人:gfast +// desc:站班会 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysProjectTeamSquad is the golang structure for table sys_project_team_squad. +type SysProjectTeamSquad struct { + gmeta.Meta `orm:"table:sys_project_team_squad"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + TeamId int64 `orm:"team_id" json:"teamId"` // 班组ID + MeetingDate *gtime.Time `orm:"meeting_date" json:"meetingDate"` // 开会时间 + CompereId int64 `orm:"compere_id" json:"compereId"` // 宣讲人 + ParticipantId string `orm:"participant_id" json:"participantId"` // 参与人ID(多个用,号隔开) + Content string `orm:"content" json:"content"` // 班会内容 + Picture string `orm:"picture" json:"picture"` // 班会图片(多个用,号隔开) + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/wxApplet/model/entity/sys_user_project_relevancy.go b/internal/app/wxApplet/model/entity/sys_user_project_relevancy.go new file mode 100644 index 0000000..7babdbc --- /dev/null +++ b/internal/app/wxApplet/model/entity/sys_user_project_relevancy.go @@ -0,0 +1,28 @@ +// ========================================================================== +// GFast自动生成model entity操作代码。 +// 生成日期:2023-08-21 09:19:15 +// 生成路径: internal/app/wxApplet/model/entity/sys_user_project_relevancy.go +// 生成人:gfast +// desc:系统用户与项目关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysUserProjectRelevancy is the golang structure for table sys_user_project_relevancy. +type SysUserProjectRelevancy struct { + gmeta.Meta `orm:"table:sys_user_project_relevancy"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + UserId int64 `orm:"user_id" json:"userId"` // 用户ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目ID + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} diff --git a/internal/app/wxApplet/model/sys_project_team.go b/internal/app/wxApplet/model/sys_project_team.go new file mode 100644 index 0000000..56eea95 --- /dev/null +++ b/internal/app/wxApplet/model/sys_project_team.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-15 09:34:52 +// 生成路径: internal/app/wxApplet/model/sys_project_team.go +// 生成人:gfast +// desc:项目班组 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysProjectTeamInfoRes is the golang structure for table sys_project_team. +type SysProjectTeamInfoRes struct { + gmeta.Meta `orm:"table:sys_project_team"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + ProjectId string `orm:"project_id" json:"projectId"` // 项目id + Name string `orm:"name" json:"name"` // 班组名称 + IsClockIn string `orm:"is_clock_in" json:"isClockIn"` // 班组名称 + CreateBy string `orm:"create_by" json:"createBy"` // 创建者 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新者 + CreateTime *gtime.Time `orm:"create_time" json:"createTime"` // 创建时间 + UpdateTime *gtime.Time `orm:"update_time" json:"updateTime"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 +} + +type SysProjectTeamListRes struct { + Id int64 `json:"id" dc:"班组主键ID"` + ProjectId string `json:"projectId" dc:"项目ID"` + Name string `json:"name" dc:"班组名称"` + IsClockIn string `json:"isClockIn" dc:"范围内打卡(1范围内打卡 2任何地点打卡)默认为2"` + CreateTime *gtime.Time `json:"createTime" dc:"创建时间"` +} diff --git a/internal/app/wxApplet/model/sys_project_team_member.go b/internal/app/wxApplet/model/sys_project_team_member.go new file mode 100644 index 0000000..c171569 --- /dev/null +++ b/internal/app/wxApplet/model/sys_project_team_member.go @@ -0,0 +1,49 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-15 09:34:52 +// 生成路径: internal/app/wxApplet/model/sys_project_team_member.go +// 生成人:gfast +// desc:项目班组下的成员 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysProjectTeamMemberInfoRes is the golang structure for table sys_project_team_member. +type SysProjectTeamMemberInfoRes struct { + gmeta.Meta `orm:"table:sys_project_team_member"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + TeamId int64 `orm:"team_id" json:"teamId"` // 班组id + Openid string `orm:"openid" json:"openid"` // 微信用户标识 + PostId int64 `orm:"post_id" json:"postId"` // 岗位(默认为4普通员工,组长为10) + CreateTime *gtime.Time `orm:"create_time" json:"createTime"` // 创建时间 + UpdateTime *gtime.Time `orm:"update_time" json:"updateTime"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + ProjectId int64 `orm:"projectId" json:"project_id"` // 项目ID + + HeadIcon string `orm:"head_icon" json:"headIcon"` + Phone string `orm:"phone" json:"phone"` + UserName string `orm:"user_name" json:"userName"` + NickName string `orm:"nick_name" json:"nickName"` + Original string `orm:"original" json:"original"` + Salary string `orm:"salary" json:"salary"` + WoPdf string `orm:"wo_pdf" json:"WoPdf" dc:"是否有试卷(不为空表示有)"` +} + +type SysProjectTeamMemberListRes struct { + Id int64 `json:"id"` + TeamId int64 `json:"teamId"` + Openid string `json:"openid"` + PostId int64 `json:"postId"` + HeadIcon string `json:"headIcon"` + Phone string `json:"phone"` + UserName string `json:"userName"` + NickName string `json:"nickName"` + Original string `json:"original"` + Salary string `json:"salary"` +} diff --git a/internal/app/wxApplet/model/sys_project_team_squad.go b/internal/app/wxApplet/model/sys_project_team_squad.go new file mode 100644 index 0000000..1aa9c52 --- /dev/null +++ b/internal/app/wxApplet/model/sys_project_team_squad.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-30 15:24:06 +// 生成路径: internal/app/wxApplet/model/sys_project_team_squad.go +// 生成人:gfast +// desc:站班会 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysProjectTeamSquadInfoRes is the golang structure for table sys_project_team_squad. +type SysProjectTeamSquadInfoRes struct { + gmeta.Meta `orm:"table:sys_project_team_squad"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + TeamId int64 `orm:"team_id" json:"teamId"` // 班组ID + MeetingDate *gtime.Time `orm:"meeting_date" json:"meetingDate"` // 开会时间 + CompereId string `orm:"compere_id" json:"compereId"` // 宣讲人 + ParticipantId string `orm:"participant_id" json:"participantId"` // 参与人ID(多个用,号隔开) + Content string `orm:"content" json:"content"` // 班会内容 + Picture string `orm:"picture" json:"picture"` // 班会图片(多个用,号隔开) + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + TeamName string `orm:"team_name" json:"teamName"` // 班组名称 + LabourserviceName string `orm:"labourservice_name" json:"labourserviceName"` // 劳务公司名称 + CompereName string `orm:"compere_name" json:"compereName"` // 主持人名称 + ParticipantName string `orm:"participant_name" json:"participantName"` // 参与人名称 +} + +type SysProjectTeamSquadListRes struct { + Id int64 `json:"id"` + TeamId int64 `json:"teamId"` + MeetingDate *gtime.Time `json:"meetingDate"` + CompereId string `json:"compereId"` + ParticipantId string `json:"participantId"` + Content string `json:"content"` + Picture string `json:"picture"` + CreatedAt *gtime.Time `json:"createdAt"` + TeamName string `json:"teamName"` + LabourserviceName string `json:"labourserviceName"` + CompereName string `json:"compereName"` + ParticipantName string `json:"participantName"` +} +type name struct { +} diff --git a/internal/app/wxApplet/model/sys_user_project_relevancy.go b/internal/app/wxApplet/model/sys_user_project_relevancy.go new file mode 100644 index 0000000..4367446 --- /dev/null +++ b/internal/app/wxApplet/model/sys_user_project_relevancy.go @@ -0,0 +1,47 @@ +// ========================================================================== +// GFast自动生成model操作代码。 +// 生成日期:2023-08-21 09:19:15 +// 生成路径: internal/app/wxApplet/model/sys_user_project_relevancy.go +// 生成人:gfast +// desc:系统用户与项目关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package model + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/gmeta" +) + +// SysUserProjectRelevancyInfoRes is the golang structure for table sys_user_project_relevancy. +type SysUserProjectRelevancyInfoRes struct { + gmeta.Meta `orm:"table:sys_user_project_relevancy"` + Id int64 `orm:"id,primary" json:"id"` // 主键ID + UserId int64 `orm:"user_id" json:"userId"` // 用户ID + ProjectId int64 `orm:"project_id" json:"projectId"` // 项目ID + CreateBy string `orm:"create_by" json:"createBy"` // 创建人 + UpdateBy string `orm:"update_by" json:"updateBy"` // 更新人 + CreatedAt *gtime.Time `orm:"created_at" json:"createdAt"` // 创建时间 + UpdatedAt *gtime.Time `orm:"updated_at" json:"updatedAt"` // 更新时间 + DeletedAt *gtime.Time `orm:"deleted_at" json:"deletedAt"` // 删除时间 + + ProjectName string `orm:"project_name" json:"projectName"` // 项目名称 + ProjectSite string `orm:"project_site"` + Lng string `orm:"lng" json:"lng"` // 经度 + Lat string `orm:"lat" json:"lat"` // 纬度 + Type string `orm:"type" json:"type"` // 项目类型 +} + +type SysUserProjectRelevancyListRes struct { + Id int64 `json:"id"` + UserId int64 `json:"userId"` + ProjectId int64 `json:"projectId"` + CreatedAt *gtime.Time `json:"createdAt"` + + ProjectName string ` json:"projectName"` // 项目名称 + ProjectSite string ` json:"project_site" dc:"项目地址"` + Lng string ` json:"lng"` // 经度 + Lat string ` json:"lat"` // 纬度 + Type string ` json:"type"` // 项目类型 +} diff --git a/internal/app/wxApplet/router/appPort.go b/internal/app/wxApplet/router/appPort.go new file mode 100644 index 0000000..4b5b042 --- /dev/null +++ b/internal/app/wxApplet/router/appPort.go @@ -0,0 +1,15 @@ +package router + +import ( + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/controller" + "golang.org/x/net/context" +) + +func (router *Router) BindAppPortController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/appPort", func(group *ghttp.RouterGroup) { + group.Bind( + controller.AppPortController, + ) + }) +} diff --git a/internal/app/wxApplet/router/bus_attendance.go b/internal/app/wxApplet/router/bus_attendance.go new file mode 100644 index 0000000..70b7d03 --- /dev/null +++ b/internal/app/wxApplet/router/bus_attendance.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-07 16:29:52 +// 生成路径: internal/app/wxApplet/router/bus_attendance.go +// 生成人:gfast +// desc:考勤 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/controller" +) + +func (router *Router) BindBusAttendanceController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busAttendance", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusAttendance, + ) + }) +} diff --git a/internal/app/wxApplet/router/bus_construction_project.go b/internal/app/wxApplet/router/bus_construction_project.go new file mode 100644 index 0000000..4187777 --- /dev/null +++ b/internal/app/wxApplet/router/bus_construction_project.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-07 11:17:50 +// 生成路径: internal/app/wxApplet/router/bus_construction_project.go +// 生成人:gfast +// desc:施工人员对应项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/controller" +) + +func (router *Router) BindBusConstructionProjectController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busConstructionProject", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusConstructionProject, + ) + }) +} diff --git a/internal/app/wxApplet/router/bus_construction_user.go b/internal/app/wxApplet/router/bus_construction_user.go new file mode 100644 index 0000000..dc65161 --- /dev/null +++ b/internal/app/wxApplet/router/bus_construction_user.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-07 11:17:50 +// 生成路径: internal/app/wxApplet/router/bus_construction_user.go +// 生成人:gfast +// desc:施工人员 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/controller" +) + +func (router *Router) BindBusConstructionUserController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busConstructionUser", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusConstructionUser, + ) + }) +} diff --git a/internal/app/wxApplet/router/bus_construction_user_file.go b/internal/app/wxApplet/router/bus_construction_user_file.go new file mode 100644 index 0000000..e988e86 --- /dev/null +++ b/internal/app/wxApplet/router/bus_construction_user_file.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-07 11:17:55 +// 生成路径: internal/app/wxApplet/router/bus_construction_user_file.go +// 生成人:gfast +// desc:微信用户的文件存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/controller" +) + +func (router *Router) BindBusConstructionUserFileController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busConstructionUserFile", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusConstructionUserFile, + ) + }) +} diff --git a/internal/app/wxApplet/router/bus_construction_user_post.go b/internal/app/wxApplet/router/bus_construction_user_post.go new file mode 100644 index 0000000..e175efa --- /dev/null +++ b/internal/app/wxApplet/router/bus_construction_user_post.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-07 11:17:55 +// 生成路径: internal/app/wxApplet/router/bus_construction_user_post.go +// 生成人:gfast +// desc:施工人员岗位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/controller" +) + +func (router *Router) BindBusConstructionUserPostController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busConstructionUserPost", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusConstructionUserPost, + ) + }) +} diff --git a/internal/app/wxApplet/router/bus_labourservice.go b/internal/app/wxApplet/router/bus_labourservice.go new file mode 100644 index 0000000..683f7ba --- /dev/null +++ b/internal/app/wxApplet/router/bus_labourservice.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-14 11:24:31 +// 生成路径: internal/app/wxApplet/router/bus_labourservice.go +// 生成人:gfast +// desc:劳务公司 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/controller" +) + +func (router *Router) BindBusLabourserviceController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/busLabourservice", func(group *ghttp.RouterGroup) { + group.Bind( + controller.BusLabourservice, + ) + }) +} diff --git a/internal/app/wxApplet/router/process.go b/internal/app/wxApplet/router/process.go new file mode 100644 index 0000000..e58dab6 --- /dev/null +++ b/internal/app/wxApplet/router/process.go @@ -0,0 +1,15 @@ +package router + +import ( + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/api/app/process" +) + +func InitAppProcessAPI(group *ghttp.RouterGroup) { + group.Middleware(ghttp.MiddlewareCORS) + group.Group("/process", func(group *ghttp.RouterGroup) { + group.Group("/api/v1", func(group *ghttp.RouterGroup) { + group.Bind(new(process.ProcessApi)) + }) + }) +} diff --git a/internal/app/wxApplet/router/project.go b/internal/app/wxApplet/router/project.go new file mode 100644 index 0000000..5d9dccc --- /dev/null +++ b/internal/app/wxApplet/router/project.go @@ -0,0 +1,15 @@ +package router + +import ( + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/api/app/project" +) + +func InitAppProjectAPI(group *ghttp.RouterGroup) { + group.Middleware(ghttp.MiddlewareCORS) + group.Group("/project", func(group *ghttp.RouterGroup) { + group.Group("/api/v1", func(group *ghttp.RouterGroup) { + group.Bind(new(project.Project)) + }) + }) +} diff --git a/internal/app/wxApplet/router/router.go b/internal/app/wxApplet/router/router.go new file mode 100644 index 0000000..fc3ce76 --- /dev/null +++ b/internal/app/wxApplet/router/router.go @@ -0,0 +1,36 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2025-03-27 14:14:25 +// 生成路径: internal/app/wxApplet/router/bus_askforleave.go +// 生成人:gfast +// desc:请假 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/library/libRouter" +) + +var R = new(Router) + +type Router struct{} + +func (router *Router) BindController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/wxApplet", func(group *ghttp.RouterGroup) { + //登录验证拦截 + service.GfToken().Middleware(group) + //context拦截器 + group.Middleware(service.Middleware().Ctx, service.Middleware().Auth) + //后台操作日志记录 + group.Hook("/*", ghttp.HookAfterOutput, service.OperateLog().OperationLog) + //自动绑定定义的控制器 + if err := libRouter.RouterAutoBind(ctx, router, group); err != nil { + panic(err) + } + }) +} diff --git a/internal/app/wxApplet/router/stage.go b/internal/app/wxApplet/router/stage.go new file mode 100644 index 0000000..101c0c8 --- /dev/null +++ b/internal/app/wxApplet/router/stage.go @@ -0,0 +1,15 @@ +package router + +import ( + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/api/app/stage" +) + +func InitAppStageAPI(group *ghttp.RouterGroup) { + group.Middleware(ghttp.MiddlewareCORS) + group.Group("/stage", func(group *ghttp.RouterGroup) { + group.Group("/api/v1", func(group *ghttp.RouterGroup) { + group.Bind(new(stage.StageApi)) + }) + }) +} diff --git a/internal/app/wxApplet/router/sys_project_team.go b/internal/app/wxApplet/router/sys_project_team.go new file mode 100644 index 0000000..05b92e4 --- /dev/null +++ b/internal/app/wxApplet/router/sys_project_team.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-15 09:34:52 +// 生成路径: internal/app/wxApplet/router/sys_project_team.go +// 生成人:gfast +// desc:项目班组 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/controller" +) + +func (router *Router) BindSysProjectTeamController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/sysProjectTeam", func(group *ghttp.RouterGroup) { + group.Bind( + controller.SysProjectTeam, + ) + }) +} diff --git a/internal/app/wxApplet/router/sys_project_team_member.go b/internal/app/wxApplet/router/sys_project_team_member.go new file mode 100644 index 0000000..1a43fae --- /dev/null +++ b/internal/app/wxApplet/router/sys_project_team_member.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-15 09:34:52 +// 生成路径: internal/app/wxApplet/router/sys_project_team_member.go +// 生成人:gfast +// desc:项目班组下的成员 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/controller" +) + +func (router *Router) BindSysProjectTeamMemberController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/sysProjectTeamMember", func(group *ghttp.RouterGroup) { + group.Bind( + controller.SysProjectTeamMember, + ) + }) +} diff --git a/internal/app/wxApplet/router/sys_project_team_squad.go b/internal/app/wxApplet/router/sys_project_team_squad.go new file mode 100644 index 0000000..bbea519 --- /dev/null +++ b/internal/app/wxApplet/router/sys_project_team_squad.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-30 15:24:06 +// 生成路径: internal/app/wxApplet/router/sys_project_team_squad.go +// 生成人:gfast +// desc:站班会 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/controller" +) + +func (router *Router) BindSysProjectTeamSquadController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/sysProjectTeamSquad", func(group *ghttp.RouterGroup) { + group.Bind( + controller.SysProjectTeamSquad, + ) + }) +} diff --git a/internal/app/wxApplet/router/sys_user_project_relevancy.go b/internal/app/wxApplet/router/sys_user_project_relevancy.go new file mode 100644 index 0000000..b7608df --- /dev/null +++ b/internal/app/wxApplet/router/sys_user_project_relevancy.go @@ -0,0 +1,24 @@ +// ========================================================================== +// GFast自动生成router操作代码。 +// 生成日期:2023-08-21 09:19:15 +// 生成路径: internal/app/wxApplet/router/sys_user_project_relevancy.go +// 生成人:gfast +// desc:系统用户与项目关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/controller" +) + +func (router *Router) BindSysUserProjectRelevancyController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/sysUserProjectRelevancy", func(group *ghttp.RouterGroup) { + group.Bind( + controller.SysUserProjectRelevancy, + ) + }) +} diff --git a/internal/app/wxApplet/router/visual.go b/internal/app/wxApplet/router/visual.go new file mode 100644 index 0000000..c4cd40d --- /dev/null +++ b/internal/app/wxApplet/router/visual.go @@ -0,0 +1,16 @@ +package router + +import ( + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/api/app/visual" +) + +// 形象进度API +func InitAppProjectVisualAPI(group *ghttp.RouterGroup) { + group.Middleware(ghttp.MiddlewareCORS) + group.Group("/visual", func(group *ghttp.RouterGroup) { + group.Group("/api/v1", func(group *ghttp.RouterGroup) { + group.Bind(new(visual.Visual)) + }) + }) +} diff --git a/internal/app/wxApplet/router/visual_remark.go b/internal/app/wxApplet/router/visual_remark.go new file mode 100644 index 0000000..4d0f2e6 --- /dev/null +++ b/internal/app/wxApplet/router/visual_remark.go @@ -0,0 +1,15 @@ +package router + +import ( + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/api/app/visual_remark" +) + +func InitAppVisualRemarkAPI(group *ghttp.RouterGroup) { + group.Middleware(ghttp.MiddlewareCORS) + group.Group("/remark", func(group *ghttp.RouterGroup) { + group.Group("/api/v1", func(group *ghttp.RouterGroup) { + group.Bind(new(visual_remark.VisualRemark)) + }) + }) +} diff --git a/internal/app/wxApplet/service/bus_askforleave.go b/internal/app/wxApplet/service/bus_askforleave.go new file mode 100644 index 0000000..887873b --- /dev/null +++ b/internal/app/wxApplet/service/bus_askforleave.go @@ -0,0 +1,42 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2025-03-27 14:14:25 +// 生成路径: internal/app/wxApplet/service/bus_askforleave.go +// 生成人:gfast +// desc:请假 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" +) + +type IBusAskforleave interface { + List(ctx context.Context, req *wxApplet.BusAskforleaveSearchReq) (res *wxApplet.BusAskforleaveSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusAskforleaveInfoRes, err error) + Add(ctx context.Context, req *wxApplet.BusAskforleaveAddReq) (err error) + Edit(ctx context.Context, req *wxApplet.BusAskforleaveEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + + AppAskForLeaveAdd(ctx context.Context, req *wxApplet.AppAskForLeaveAddReq) (err error) + AppAskForLeaveListPage(ctx context.Context, req *wxApplet.AppAskForLeaveListPageReq) (res *wxApplet.AppAskForLeaveListPageRes, err error) + AppAskForLeaveInfo(ctx context.Context, req *wxApplet.AppAskForLeaveInfoReq) (res *wxApplet.AppAskForLeaveInfoRes, err error) + AppBzzAskForLeaveUpdate(ctx context.Context, req *wxApplet.AppBzzAskForLeaveUpdateReq) (err error) +} + +var localBusAskforleave IBusAskforleave + +func BusAskforleave() IBusAskforleave { + if localBusAskforleave == nil { + panic("implement not found for interface IBusAskforleave, forgot register?") + } + return localBusAskforleave +} + +func RegisterBusAskforleave(i IBusAskforleave) { + localBusAskforleave = i +} diff --git a/internal/app/wxApplet/service/bus_attendance.go b/internal/app/wxApplet/service/bus_attendance.go new file mode 100644 index 0000000..5d97c18 --- /dev/null +++ b/internal/app/wxApplet/service/bus_attendance.go @@ -0,0 +1,53 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-07 16:29:52 +// 生成路径: internal/app/wxApplet/service/bus_attendance.go +// 生成人:gfast +// desc:考勤 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" +) + +type IBusAttendance interface { + SalaryDetailsFunc(ctx context.Context, req *wxApplet.SalaryDetailsReq) (res *wxApplet.SalaryDetailsRes, err error) + Export(ctx context.Context, req *wxApplet.PunchingCardRecordReq) (res *wxApplet.PunchingCardRecordRes, err error) + List(ctx context.Context, req *wxApplet.BusAttendanceSearchReq) (res *wxApplet.BusAttendanceSearchRes, err error) + GetById(ctx context.Context, Id uint64) (res *model.BusAttendanceInfoRes, err error) + Add(ctx context.Context, req *wxApplet.BusAttendanceAddReq) (err error) + Edit(ctx context.Context, req *wxApplet.BusAttendanceEditReq) (err error) + Delete(ctx context.Context, Id []uint64) (err error) + ByOpenidFunc(ctx context.Context, req *wxApplet.ByOpenIdFuncReq) (res *wxApplet.ByOpenIdFuncRes, err error) + DailyAbsenteeismFunc(ctx context.Context) + PCListFunc(ctx context.Context, req *wxApplet.PCListReq) (res *wxApplet.PCListRes, err error) + AttendanceByOpenIdFunc(ctx context.Context, openid string) (res *wxApplet.AttendanceByOpenIdRes, err error) + AppMyAttendanceFunc(ctx context.Context, req *wxApplet.AppMyAttendanceReq) (res *wxApplet.AppMyAttendanceRes, err error) + AppProjectOverviewFunc(ctx context.Context, req *wxApplet.AppProjectOverviewReq) (res *wxApplet.AppProjectOverviewRes, err error) + AppMyAttendanceDetailsFunc(ctx context.Context, req *wxApplet.AppMyAttendanceDetailsReq) (res *wxApplet.AppMyAttendanceDetailsRes, err error) + AppWhetherToEnterTheClockRangeFunc(ctx context.Context, req *wxApplet.AppWhetherToEnterTheClockRangeReq) (res *wxApplet.AppWhetherToEnterTheClockRangeRes, err error) + AppClockingStatusOfTheDayFunc(ctx context.Context, req *wxApplet.AppClockingStatusOfTheDayReq) (res *wxApplet.AppClockingStatusOfTheDayRes, err error) + AppSelectThisUserByCardRecordFunc(ctx context.Context, req *wxApplet.AppSelectThisUserByCardRecordReq) (res *wxApplet.AppSelectThisUserByCardRecordRes, err error) + AppReissueACardListFunc(ctx context.Context, req *wxApplet.AppReissueACardListReq) (res *wxApplet.AppReissueACardListRes, err error) + AppReissueACardIdFunc(ctx context.Context, req *wxApplet.AppReissueACardIdReq) (res *wxApplet.AppReissueACardIdRes, err error) + AppLocationAttendanceStatisticsFunc(ctx context.Context, req *wxApplet.AppLocationAttendanceStatisticsReq) (res *wxApplet.AppLocationAttendanceStatisticsRes, err error) + AppTeamAttendanceFunc(ctx context.Context, req *wxApplet.AppTeamAttendanceReq) (res *wxApplet.AppTeamAttendanceRes, err error) +} + +var localBusAttendance IBusAttendance + +func BusAttendance() IBusAttendance { + if localBusAttendance == nil { + panic("implement not found for interface IBusAttendance, forgot register?") + } + return localBusAttendance +} + +func RegisterBusAttendance(i IBusAttendance) { + localBusAttendance = i +} diff --git a/internal/app/wxApplet/service/bus_construction_project.go b/internal/app/wxApplet/service/bus_construction_project.go new file mode 100644 index 0000000..0e86ebb --- /dev/null +++ b/internal/app/wxApplet/service/bus_construction_project.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-07 11:17:50 +// 生成路径: internal/app/wxApplet/service/bus_construction_project.go +// 生成人:gfast +// desc:施工人员对应项目 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" +) + +type IBusConstructionProject interface { + List(ctx context.Context, req *wxApplet.BusConstructionProjectSearchReq) (res *wxApplet.BusConstructionProjectSearchRes, err error) + GetById(ctx context.Context, Id uint64) (res *model.BusConstructionProjectInfoRes, err error) + Add(ctx context.Context, req *wxApplet.BusConstructionProjectAddReq) (err error) + Edit(ctx context.Context, req *wxApplet.BusConstructionProjectEditReq) (err error) + Delete(ctx context.Context, Id []uint64) (err error) +} + +var localBusConstructionProject IBusConstructionProject + +func BusConstructionProject() IBusConstructionProject { + if localBusConstructionProject == nil { + panic("implement not found for interface IBusConstructionProject, forgot register?") + } + return localBusConstructionProject +} + +func RegisterBusConstructionProject(i IBusConstructionProject) { + localBusConstructionProject = i +} diff --git a/internal/app/wxApplet/service/bus_construction_user.go b/internal/app/wxApplet/service/bus_construction_user.go new file mode 100644 index 0000000..ca70d20 --- /dev/null +++ b/internal/app/wxApplet/service/bus_construction_user.go @@ -0,0 +1,57 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-07 11:17:50 +// 生成路径: internal/app/wxApplet/service/bus_construction_user.go +// 生成人:gfast +// desc:施工人员 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" +) + +type IBusConstructionUser interface { + List(ctx context.Context, req *wxApplet.BusConstructionUserSearchReq) (res *wxApplet.BusConstructionUserSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusConstructionUserInfoRes, err error) + Add(ctx context.Context, req *wxApplet.BusConstructionUserAddReq) (id int64, err error) + Edit(ctx context.Context, req *wxApplet.BusConstructionUserEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + //GetByOpenId(ctx context.Context, OpenId string) (res *model.BusConstructionUserInfoRes, err error) + GetByOpenId(ctx context.Context, OpenId string) (res *wxApplet.BusConstructionUserByOpenIdGetRes, err error) + GroupLeader(ctx context.Context, req *wxApplet.GroupLeaderReq) (res *wxApplet.GroupLeaderRes, err error) + PayFunc(ctx context.Context, req *wxApplet.PayFuncReq) (res *wxApplet.PayFuncRes, err error) + AttendanceFunc(ctx context.Context, req *wxApplet.AttendanceReq) (res *wxApplet.AttendanceRes, err error) + AttendanceCountListFunc(ctx context.Context, req *wxApplet.AttendanceListReq) (res *wxApplet.AttendanceListRes, err error) + PersonnelListFunc(ctx context.Context, req *wxApplet.PersonnelListReq) (res *wxApplet.PersonnelListRes, err error) + ProjectRecordFunc(ctx context.Context, req *wxApplet.ProjectRecordReq) (res *wxApplet.ProjectRecordRes, err error) + HumanFaceFunc(ctx context.Context, req *wxApplet.HumanFaceReq) (res *wxApplet.HumanFaceReqRes, err error) + SubscriptionFunc(ctx context.Context, req *wxApplet.SubscriptionFuncReq) (res *wxApplet.SubscriptionFuncRes, err error) + ChangeStateFunc(ctx context.Context, req *wxApplet.ChangeStateReq) (err error) + PersonnelInquiryFunc(ctx context.Context, req *wxApplet.PersonnelInquiryReq) (res *wxApplet.PersonnelInquiryRes, err error) + ChangePayFunc(ctx context.Context, req *wxApplet.ChangePayReq) (err error) + GetDetailsFunc(ctx context.Context, req *wxApplet.GetDetailsReq) (res *wxApplet.GetDetailsRes, err error) + ActionPathFunc(ctx context.Context, req *wxApplet.ActionPathReq) (latAndLon []*wxApplet.ActionPathLatAndLonActionPathLatAndLon, err error) + + AppAllMembersOfTheCurrentGroupFunc(ctx context.Context, req *wxApplet.AppAllMembersOfTheCurrentGroupReq) (res *wxApplet.AppAllMembersOfTheCurrentGroupRes, err error) + AppListOfConstructionPersonnelFunc(ctx context.Context, req *wxApplet.AppListOfConstructionPersonnelReq) (res *wxApplet.AppListOfConstructionPersonnelRes, err error) + AppGetsThePeopleUnderTheSpecifiedProjectFunc(ctx context.Context, req *wxApplet.AppGetsThePeopleUnderTheSpecifiedProjectReq) (res *wxApplet.AppGetsThePeopleUnderTheSpecifiedProjectRes, err error) + AppGetPersonnelDetailsFunc(ctx context.Context, req *wxApplet.AppGetPersonnelDetailsReq) (res *wxApplet.AppGetPersonnelDetailsRes, err error) +} + +var localBusConstructionUser IBusConstructionUser + +func BusConstructionUser() IBusConstructionUser { + if localBusConstructionUser == nil { + panic("implement not found for interface IBusConstructionUser, forgot register?") + } + return localBusConstructionUser +} + +func RegisterBusConstructionUser(i IBusConstructionUser) { + localBusConstructionUser = i +} diff --git a/internal/app/wxApplet/service/bus_construction_user_file.go b/internal/app/wxApplet/service/bus_construction_user_file.go new file mode 100644 index 0000000..769e0a3 --- /dev/null +++ b/internal/app/wxApplet/service/bus_construction_user_file.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-07 11:17:55 +// 生成路径: internal/app/wxApplet/service/bus_construction_user_file.go +// 生成人:gfast +// desc:微信用户的文件存储 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" +) + +type IBusConstructionUserFile interface { + List(ctx context.Context, req *wxApplet.BusConstructionUserFileSearchReq) (res *wxApplet.BusConstructionUserFileSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusConstructionUserFileInfoRes, err error) + Add(ctx context.Context, req *wxApplet.BusConstructionUserFileAddReq) (err error) + Edit(ctx context.Context, req *wxApplet.BusConstructionUserFileEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localBusConstructionUserFile IBusConstructionUserFile + +func BusConstructionUserFile() IBusConstructionUserFile { + if localBusConstructionUserFile == nil { + panic("implement not found for interface IBusConstructionUserFile, forgot register?") + } + return localBusConstructionUserFile +} + +func RegisterBusConstructionUserFile(i IBusConstructionUserFile) { + localBusConstructionUserFile = i +} diff --git a/internal/app/wxApplet/service/bus_construction_user_post.go b/internal/app/wxApplet/service/bus_construction_user_post.go new file mode 100644 index 0000000..a3ab6e0 --- /dev/null +++ b/internal/app/wxApplet/service/bus_construction_user_post.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-07 11:17:55 +// 生成路径: internal/app/wxApplet/service/bus_construction_user_post.go +// 生成人:gfast +// desc:施工人员岗位 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" +) + +type IBusConstructionUserPost interface { + List(ctx context.Context, req *wxApplet.BusConstructionUserPostSearchReq) (res *wxApplet.BusConstructionUserPostSearchRes, err error) + GetById(ctx context.Context, Id uint64) (res *model.BusConstructionUserPostInfoRes, err error) + Add(ctx context.Context, req *wxApplet.BusConstructionUserPostAddReq) (err error) + Edit(ctx context.Context, req *wxApplet.BusConstructionUserPostEditReq) (err error) + Delete(ctx context.Context, Id []uint64) (err error) +} + +var localBusConstructionUserPost IBusConstructionUserPost + +func BusConstructionUserPost() IBusConstructionUserPost { + if localBusConstructionUserPost == nil { + panic("implement not found for interface IBusConstructionUserPost, forgot register?") + } + return localBusConstructionUserPost +} + +func RegisterBusConstructionUserPost(i IBusConstructionUserPost) { + localBusConstructionUserPost = i +} diff --git a/internal/app/wxApplet/service/bus_labourservice.go b/internal/app/wxApplet/service/bus_labourservice.go new file mode 100644 index 0000000..9cdbe7e --- /dev/null +++ b/internal/app/wxApplet/service/bus_labourservice.go @@ -0,0 +1,42 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-14 11:24:31 +// 生成路径: internal/app/wxApplet/service/bus_labourservice.go +// 生成人:gfast +// desc:劳务公司 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" +) + +type IBusLabourservice interface { + PcAdd(ctx context.Context, req *wxApplet.BusPcAddReq) (err error) + PcDel(ctx context.Context, req *wxApplet.BusPcDelReq) (err error) + PcFind(ctx context.Context, req *wxApplet.BusPcFindReq) (res *wxApplet.BusPcFindRes, err error) + + List(ctx context.Context, req *wxApplet.BusLabourserviceSearchReq) (res *wxApplet.BusLabourserviceSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.BusLabourserviceInfoRes, err error) + Add(ctx context.Context, req *wxApplet.BusLabourserviceAddReq) (err error) + Edit(ctx context.Context, req *wxApplet.BusLabourserviceEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + AppListOfParticipatingUnitsFunc(ctx context.Context, req *wxApplet.AppListOfParticipatingUnitsReq) (res *wxApplet.AppListOfParticipatingUnitsRes, err error) +} + +var localBusLabourservice IBusLabourservice + +func BusLabourservice() IBusLabourservice { + if localBusLabourservice == nil { + panic("implement not found for interface IBusLabourservice, forgot register?") + } + return localBusLabourservice +} + +func RegisterBusLabourservice(i IBusLabourservice) { + localBusLabourservice = i +} diff --git a/internal/app/wxApplet/service/sys_project_team.go b/internal/app/wxApplet/service/sys_project_team.go new file mode 100644 index 0000000..3cc0ddc --- /dev/null +++ b/internal/app/wxApplet/service/sys_project_team.go @@ -0,0 +1,41 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-15 09:34:52 +// 生成路径: internal/app/wxApplet/service/sys_project_team.go +// 生成人:gfast +// desc:项目班组 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" +) + +type ISysProjectTeam interface { + List(ctx context.Context, req *wxApplet.SysProjectTeamSearchReq) (res *wxApplet.SysProjectTeamSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.SysProjectTeamInfoRes, err error) + Add(ctx context.Context, req *wxApplet.SysProjectTeamAddReq) (err error) + Edit(ctx context.Context, req *wxApplet.SysProjectTeamEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + //获取指定班组的出勤情况 + GetsTheAttendanceOfASpecifiedShiftGroupFunc(ctx context.Context, req *wxApplet.GetsTheAttendanceOfASpecifiedShiftGroupReq) (res *wxApplet.GetsTheAttendanceOfASpecifiedShiftGroupRes, err error) + //获取用户对应出勤状态的人员列表 + ListOfAttendancePersonnelFunc(ctx context.Context, req *wxApplet.ListOfAttendancePersonnelReq) (res *wxApplet.ListOfAttendancePersonnelRes, err error) +} + +var localSysProjectTeam ISysProjectTeam + +func SysProjectTeam() ISysProjectTeam { + if localSysProjectTeam == nil { + panic("implement not found for interface ISysProjectTeam, forgot register?") + } + return localSysProjectTeam +} + +func RegisterSysProjectTeam(i ISysProjectTeam) { + localSysProjectTeam = i +} diff --git a/internal/app/wxApplet/service/sys_project_team_member.go b/internal/app/wxApplet/service/sys_project_team_member.go new file mode 100644 index 0000000..c6ba9ef --- /dev/null +++ b/internal/app/wxApplet/service/sys_project_team_member.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-15 09:34:52 +// 生成路径: internal/app/wxApplet/service/sys_project_team_member.go +// 生成人:gfast +// desc:项目班组下的成员 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" +) + +type ISysProjectTeamMember interface { + List(ctx context.Context, req *wxApplet.SysProjectTeamMemberSearchReq) (res *wxApplet.SysProjectTeamMemberSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.SysProjectTeamMemberInfoRes, err error) + Add(ctx context.Context, req *wxApplet.SysProjectTeamMemberAddReq) (err error) + Edit(ctx context.Context, req *wxApplet.SysProjectTeamMemberEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localSysProjectTeamMember ISysProjectTeamMember + +func SysProjectTeamMember() ISysProjectTeamMember { + if localSysProjectTeamMember == nil { + panic("implement not found for interface ISysProjectTeamMember, forgot register?") + } + return localSysProjectTeamMember +} + +func RegisterSysProjectTeamMember(i ISysProjectTeamMember) { + localSysProjectTeamMember = i +} diff --git a/internal/app/wxApplet/service/sys_project_team_squad.go b/internal/app/wxApplet/service/sys_project_team_squad.go new file mode 100644 index 0000000..febca22 --- /dev/null +++ b/internal/app/wxApplet/service/sys_project_team_squad.go @@ -0,0 +1,38 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-30 15:24:06 +// 生成路径: internal/app/wxApplet/service/sys_project_team_squad.go +// 生成人:gfast +// desc:站班会 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" +) + +type ISysProjectTeamSquad interface { + List(ctx context.Context, req *wxApplet.SysProjectTeamSquadSearchReq) (res *wxApplet.SysProjectTeamSquadSearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.SysProjectTeamSquadInfoRes, err error) + Add(ctx context.Context, req *wxApplet.SysProjectTeamSquadAddReq) (err error) + Edit(ctx context.Context, req *wxApplet.SysProjectTeamSquadEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) + SelectByOpenidTeamSquadSearch(ctx context.Context, req *wxApplet.SelectByOpenidTeamSquadSearchReq) (res *wxApplet.SelectByOpenidTeamSquadSearchRes, err error) +} + +var localSysProjectTeamSquad ISysProjectTeamSquad + +func SysProjectTeamSquad() ISysProjectTeamSquad { + if localSysProjectTeamSquad == nil { + panic("implement not found for interface ISysProjectTeamSquad, forgot register?") + } + return localSysProjectTeamSquad +} + +func RegisterSysProjectTeamSquad(i ISysProjectTeamSquad) { + localSysProjectTeamSquad = i +} diff --git a/internal/app/wxApplet/service/sys_user_project_relevancy.go b/internal/app/wxApplet/service/sys_user_project_relevancy.go new file mode 100644 index 0000000..c11b403 --- /dev/null +++ b/internal/app/wxApplet/service/sys_user_project_relevancy.go @@ -0,0 +1,37 @@ +// ========================================================================== +// GFast自动生成service操作代码。 +// 生成日期:2023-08-21 09:19:15 +// 生成路径: internal/app/wxApplet/service/sys_user_project_relevancy.go +// 生成人:gfast +// desc:系统用户与项目关联 +// company:云南奇讯科技有限公司 +// ========================================================================== + +package service + +import ( + "context" + "github.com/tiger1103/gfast/v3/api/wxApplet/wxApplet" + "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" +) + +type ISysUserProjectRelevancy interface { + List(ctx context.Context, req *wxApplet.SysUserProjectRelevancySearchReq) (res *wxApplet.SysUserProjectRelevancySearchRes, err error) + GetById(ctx context.Context, Id int64) (res *model.SysUserProjectRelevancyInfoRes, err error) + Add(ctx context.Context, req *wxApplet.SysUserProjectRelevancyAddReq) (err error) + Edit(ctx context.Context, req *wxApplet.SysUserProjectRelevancyEditReq) (err error) + Delete(ctx context.Context, Id []int64) (err error) +} + +var localSysUserProjectRelevancy ISysUserProjectRelevancy + +func SysUserProjectRelevancy() ISysUserProjectRelevancy { + if localSysUserProjectRelevancy == nil { + panic("implement not found for interface ISysUserProjectRelevancy, forgot register?") + } + return localSysUserProjectRelevancy +} + +func RegisterSysUserProjectRelevancy(i ISysUserProjectRelevancy) { + localSysUserProjectRelevancy = i +} diff --git a/internal/cmd/cmd.go b/internal/cmd/cmd.go new file mode 100644 index 0000000..a9b59a4 --- /dev/null +++ b/internal/cmd/cmd.go @@ -0,0 +1,292 @@ +package cmd + +import ( + "context" + "fmt" + "net/http" + "net/url" + "os" + "reflect" + "strings" + "unsafe" + _ "unsafe" + + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/net/goai" + "github.com/gogf/gf/v2/os/gcmd" + "github.com/gogf/gf/v2/os/gctx" + "github.com/gogf/gf/v2/os/glog" + "github.com/gogf/gf/v2/os/gres" + "github.com/gogf/gf/v2/os/gsession" + "github.com/gogf/gf/v2/os/gspath" + "github.com/gogf/gf/v2/os/gview" + "github.com/gogf/gf/v2/text/gstr" + "github.com/tiger1103/gfast/v3/api/saft_hat" + "github.com/tiger1103/gfast/v3/api/video_hat" + "github.com/tiger1103/gfast/v3/internal/consts" + "github.com/tiger1103/gfast/v3/internal/router" + "github.com/tiger1103/gfast/v3/library/libValidate" + "github.com/tiger1103/gfast/v3/library/upload" + "github.com/tiger1103/gfast/v3/task" +) + +var Main = gcmd.Command{ + Name: "main", + Usage: "main", + Brief: "start http server", + Func: func(ctx context.Context, parser *gcmd.Parser) (err error) { + g.Log().SetFlags(glog.F_ASYNC | glog.F_TIME_DATE | glog.F_TIME_TIME | glog.F_FILE_LONG) + g.Log().Info(ctx, "GFast version:", consts.Version) + s := g.Server() + getwd, err := os.Getwd() + getwd = strings.ReplaceAll(getwd, "\\", "/") + + //s.Group("/file", func(group *ghttp.RouterGroup) { + // group.Middleware(commonService.Middleware().MiddlewareCORS) + //}) + + s.AddStaticPath("/resource", getwd+"/resource") // 指向当前资源 + s.AddStaticPath(coryCommon.GlobalFile, getwd+"/resource/public") // 指向pc + s.AddStaticPath("/wxfile", getwd+"/resource/public") // 指向小程序 + + s.Group("/", func(group *ghttp.RouterGroup) { + router.R.BindController(ctx, group) + }) + + //// zm/api/wxApplet/wxApplet/ + //s.BindHookHandler("/zm/api/wxApplet/wxApplet/*", ghttp.HookBeforeServe, bandWxApp) + + s.BindHookHandler("/file/*", ghttp.HookBeforeServe, reStaticFile) + + // 重新配置swaggerUI静态页面--start--,若要使用原版gf字段swaggerUI请删除或注释此段 + s.BindHookHandler(g.Cfg().MustGet(ctx, "server.swaggerPath").String()+"/*", ghttp.HookBeforeServe, func(r *ghttp.Request) { + content := gstr.ReplaceByMap(consts.SwaggerUITemplate, map[string]string{ + `{SwaggerUIDocUrl}`: g.Cfg().MustGet(ctx, "server.openapiPath").String(), + `{SwaggerUIDocNamePlaceHolder}`: gstr.TrimRight(fmt.Sprintf(`//%s`, r.Host)), + }) + r.Response.Write(content) + r.ExitAll() + }) + + // 重新配置swaggerUI静态页面--end-- + enhanceOpenAPIDoc(s) + // 注册相关组件 + register() + key := g.Cfg().MustGet(gctx.New(), "wx.key") + crt := g.Cfg().MustGet(gctx.New(), "wx.crt") + if len(key.String()) > 0 && len(crt.String()) > 0 { + s.EnableHTTPS(crt.String(), key.String()) + } + s.Run() + return nil + }, +} + +type staticFile struct { + File *gres.File // Resource file object. + Path string // File path. + IsDir bool // Is directory. +} +type middleware struct { + served bool // Is the request served, which is used for checking response status 404. + request *Request // The request object pointer. + handlerIndex int // Index number for executing sequence purpose for handler items. + handlerMDIndex int // Index number for executing sequence purpose for bound middleware of handler item. +} + +type Request struct { + *http.Request + Server *ghttp.Server // Server. + Cookie *ghttp.Cookie // Cookie. + Session *gsession.Session // Session. + Response *ghttp.Response // Corresponding Response of this request. + Router *ghttp.Router // Matched Router for this request. Note that it's not available in HOOK handler. + EnterTime int64 // Request starting time in milliseconds. + LeaveTime int64 // Request to end time in milliseconds. + Middleware *middleware // Middleware manager. + StaticFile *staticFile // Static file object for static file serving. + + // ================================================================================================================= + // Private attributes for internal usage purpose. + // ================================================================================================================= + + handlers []*ghttp.HandlerItemParsed // All matched handlers containing handler, hook and middleware for this request. + serveHandler *ghttp.HandlerItemParsed // Real handler serving for this request, not hook or middleware. + handlerResponse interface{} // Handler response object for Request/Response handler. + hasHookHandler bool // A bool marking whether there's hook handler in the handlers for performance purpose. + hasServeHandler bool // A bool marking whether there's serving handler in the handlers for performance purpose. + parsedQuery bool // A bool marking whether the GET parameters parsed. + parsedBody bool // A bool marking whether the request body parsed. + parsedForm bool // A bool marking whether request Form parsed for HTTP method PUT, POST, PATCH. + paramsMap map[string]interface{} // Custom parameters map. + routerMap map[string]string // Router parameters map, which might be nil if there are no router parameters. + queryMap map[string]interface{} // Query parameters map, which is nil if there's no query string. + formMap map[string]interface{} // Form parameters map, which is nil if there's no form of data from the client. + bodyMap map[string]interface{} // Body parameters map, which might be nil if their nobody content. + error error // Current executing error of the request. + exitAll bool // A bool marking whether current request is exited. + parsedHost string // The parsed host name for current host used by GetHost function. + clientIp string // The parsed client ip for current host used by GetClientIp function. + bodyContent []byte // Request body content. + isFileRequest bool // A bool marking whether current request is file serving. + viewObject *gview.View // Custom template view engine object for this response. + viewParams gview.Params // Custom template view variables for this response. + originUrlPath string // Original URL path that passed from client. +} + +type staticPathItem struct { + Prefix string + Path string +} + +//// bandWxApp 禁止访问小程序 +//func bandWxApp(r *ghttp.Request) { +// // 如果不为 /zm/api/wxApplet/wxApplet/sysUserProjectRelevancy/list +// if r.URL.Path != "/zm/api/wxApplet/wxApplet/sysUserProjectRelevancy/list" { +// r.Response.WriteJsonExit(g.Map{"code": 403, "msg": "禁止访问"}) +// } +//} + +// staticFile 重赋值中间件 +func reStaticFile(r *ghttp.Request) { + isURLEncoded := func(s string) bool { + // 如果 s 为空,直接返回 false + if s == "" { + return false + } + + _, err := url.QueryUnescape(s) + return err == nil + } + + if !isURLEncoded(r.URL.RawPath) { + return + } + + // 解码 URL + r.URL.Path, _ = url.QueryUnescape(r.URL.RawPath) + + fileRequestField := reflect.ValueOf(r).Elem().FieldByName("isFileRequest") + reflect.NewAt(fileRequestField.Type(), unsafe.Pointer(fileRequestField.UnsafeAddr())).Elem().Set(reflect.ValueOf(true)) + + configField := reflect.ValueOf(r.Server) + + staticPathList := []staticPathItem{} + staticPaths := configField.Elem().FieldByName("config").FieldByName("StaticPaths") + for i := range make([]struct{}, staticPaths.Len()) { + prefix := staticPaths.Index(i).FieldByName("Prefix").String() + path := staticPaths.Index(i).FieldByName("Path").String() + + staticPathList = append(staticPathList, staticPathItem{ + Prefix: prefix, + Path: path, + }) + } + + indexFileList := []string{} + IndexFiles := configField.Elem().FieldByName("config").FieldByName("IndexFiles") + for i := range make([]struct{}, IndexFiles.Len()) { + indexFileList = append(indexFileList, IndexFiles.Index(i).String()) + } + + SearchPathsList := []string{} + SearchPaths := configField.Elem().FieldByName("config").FieldByName("SearchPaths") + for i := range make([]struct{}, SearchPaths.Len()) { + SearchPathsList = append(SearchPathsList, SearchPaths.Index(i).String()) + } + + (*Request)(unsafe.Pointer(r)).StaticFile = searchStaticFile(r.URL.Path, staticPathList, SearchPathsList, indexFileList) +} + +func searchStaticFile(uri string, StaticPaths []staticPathItem, SearchPaths, indexFileList []string) *staticFile { + var ( + file *gres.File + path string + dir bool + ) + // Firstly search the StaticPaths mapping. + if len(StaticPaths) > 0 { + for _, item := range StaticPaths { + if len(uri) >= len(item.Prefix) && strings.EqualFold(item.Prefix, uri[0:len(item.Prefix)]) { + // To avoid case like: /static/style -> /static/style.css + if len(uri) > len(item.Prefix) && uri[len(item.Prefix)] != '/' { + continue + } + file = gres.GetWithIndex(item.Path+uri[len(item.Prefix):], indexFileList) + if file != nil { + return &staticFile{ + File: file, + IsDir: file.FileInfo().IsDir(), + } + } + path, dir = gspath.Search(item.Path, uri[len(item.Prefix):], indexFileList...) + if path != "" { + return &staticFile{ + Path: path, + IsDir: dir, + } + } + } + } + } + // Secondly search the root and searching paths. + if len(SearchPaths) > 0 { + for _, p := range SearchPaths { + file = gres.GetWithIndex(p+uri, indexFileList) + if file != nil { + return &staticFile{ + File: file, + IsDir: file.FileInfo().IsDir(), + } + } + if path, dir = gspath.Search(p, uri, indexFileList...); path != "" { + return &staticFile{ + Path: path, + IsDir: dir, + } + } + } + } + // Lastly search the resource manager. + if len(StaticPaths) == 0 && len(SearchPaths) == 0 { + if file = gres.GetWithIndex(uri, indexFileList); file != nil { + return &staticFile{ + File: file, + IsDir: file.FileInfo().IsDir(), + } + } + } + return nil +} + +// 相关组件注册 +func register() { + // 注册上传组件 + upload.Register() + // 注册自定义验证规则 + libValidate.Register() + // 执行计划任务 + task.Run() + go video_hat.WsConnection() // 连接视频安全帽平台 + // go saft_hat.StartWs() // 开启安全帽 WS 推送,端口8222 + go saft_hat.HeartCheck() // 开启安全帽设备数据的心跳检测 +} + +func enhanceOpenAPIDoc(s *ghttp.Server) { + openapi := s.GetOpenApi() + openapi.Config.CommonResponse = ghttp.DefaultHandlerResponse{} + openapi.Config.CommonResponseDataField = `Data` + + // API description. + openapi.Info = goai.Info{ + Title: consts.OpenAPITitle, + Description: consts.OpenAPIDescription, + Contact: &goai.Contact{ + Name: consts.OpenAPIContactName, + URL: consts.OpenAPIContactUrl, + }, + } +} diff --git a/internal/consts/consts_openapi.go b/internal/consts/consts_openapi.go new file mode 100644 index 0000000..9029d8e --- /dev/null +++ b/internal/consts/consts_openapi.go @@ -0,0 +1,24 @@ +package consts + +const ( + OpenAPITitle = `GFast-v3` + OpenAPIDescription = `基于 GoFrame2.0的后台管理系统。 Enjoy 💖 ` + OpenAPIContactName = "GFast" + OpenAPIContactUrl = "http://www.g-fast.cn" + SwaggerUITemplate = ` + + + + + + + + + + + +
+ + +` +) diff --git a/internal/consts/role.go b/internal/consts/role.go new file mode 100644 index 0000000..87ff3f4 --- /dev/null +++ b/internal/consts/role.go @@ -0,0 +1,6 @@ +package consts + +const ( + PostLeader = 1 // 班组长 + PostConstruction = 2 // 施工人员 +) diff --git a/internal/consts/version.go b/internal/consts/version.go new file mode 100644 index 0000000..d1dccd9 --- /dev/null +++ b/internal/consts/version.go @@ -0,0 +1,12 @@ +/* +* @desc:版本号 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/11 11:24 + */ + +package consts + +const ( + Version = "3.2.3" +) diff --git a/internal/consts/work_var.go b/internal/consts/work_var.go new file mode 100644 index 0000000..bbb6da1 --- /dev/null +++ b/internal/consts/work_var.go @@ -0,0 +1,77 @@ +package consts + +const ( + // 防雷接地网 + LightningProtectionNet int = iota + 1 + // 接地沟 + GroundingDitch + // 接地敷设 + GroundingLaying + // 接地检测 + GroundingTesting + + // 围栏 + Fence + // 围栏基础 + FenceFoundation + // 围栏安装 + FenceInstallation + + // 道路 + Road + // 道路路基 + RoadBase + // 道路排水沟 + RoadDrainageDitch + + // 低压部分 + LowVoltage + // 低压钻孔 + LowVoltageDrilling + // 低压桩基 + LowVoltagePileFoundation + // 低压支架 + LowVoltageBracket + // 低压光伏板 + LowVoltagePhotovoltaicPanel + // 低压直流电缆 + LowVoltageDC + // 低压接地线 + LowVoltageGroundWire + // 低压逆变器安装 + LowVoltageInverterInstallation + // 低压电缆沟开挖 + LowVoltageCableTrenchExcavation + // 低压敷设 + LowVoltageLaying + // 低压调试 + LowVoltageDebugging + + // 高压部分 + HighVoltage + // 高压箱变基础 + HighVoltageBoxChangeFoundation + // 高压箱变安装 + HighVoltageBoxChangeInstallation + // 高压电缆线开挖 + HighVoltageCableLineExcavation + // 高压电缆敷设 + HighVoltageCableLaying + // 高压电缆试验 + HighVoltageCableTest + // 高压电缆调式试验 + HighVoltageCableDebuggingTest + + // 环网柜 + RingMainCabinet + // 环网柜基础 + RingMainCabinetFoundation + // 环网柜安装 + RingMainCabinetInstallation + // 环网柜敷设 + RingMainCabinetLaying + // 环网柜试验 + RingMainCabinetTest + // 环网柜调试试验 + RingMainCabinetDebuggingTest +) diff --git a/internal/router/router.go b/internal/router/router.go new file mode 100644 index 0000000..d2965a7 --- /dev/null +++ b/internal/router/router.go @@ -0,0 +1,158 @@ +/* +* @desc:路由绑定 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/2/18 16:23 + */ + +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/api/attendanceMachine" + hwy "github.com/tiger1103/gfast/v3/api/hwy/router" + "github.com/tiger1103/gfast/v3/api/pilot" + "github.com/tiger1103/gfast/v3/api/project" + "github.com/tiger1103/gfast/v3/api/saft_hat" + "github.com/tiger1103/gfast/v3/api/v1/common/source" + "github.com/tiger1103/gfast/v3/api/v1/common/source/clt" + "github.com/tiger1103/gfast/v3/api/v1/common/source/mbt" + "github.com/tiger1103/gfast/v3/api/v1/common/source/pak" + "github.com/tiger1103/gfast/v3/api/v1/common/source/shp" + "github.com/tiger1103/gfast/v3/api/video_hat" + "github.com/tiger1103/gfast/v3/api/webodm" + commonRouter "github.com/tiger1103/gfast/v3/internal/app/common/router" + commonService "github.com/tiger1103/gfast/v3/internal/app/common/service" + systemRouter "github.com/tiger1103/gfast/v3/internal/app/system/router" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + testRouter "github.com/tiger1103/gfast/v3/internal/app/test/router" + wxAppletRouter "github.com/tiger1103/gfast/v3/internal/app/wxApplet/router" + "github.com/tiger1103/gfast/v3/library/libRouter" + "github.com/tiger1103/gfast/v3/third/isc" + "github.com/tiger1103/gfast/v3/third/plane" +) + +var R = new(Router) + +type Router struct{} + +func (router *Router) BindController(ctx context.Context, group *ghttp.RouterGroup) { + group.Group("/zm/api/v1", func(group *ghttp.RouterGroup) { + //跨域处理,安全起见正式环境请注释该行 + group.Middleware(commonService.Middleware().MiddlewareCORS) + group.Middleware(ghttp.MiddlewareHandlerResponse) + //工程资料权限拦截进行校验 + group.Middleware(service.Middleware().Ctx, service.Middleware().EngineeringDataPermission) + // 绑定后台路由 + systemRouter.R.BindController(ctx, group) + plane.InitPlaneApi(group) + source.InitSource(group) + clt.InitCltData(group) + mbt.InitMbtData(group) + pak.InitPakData(group) + shp.InitShp(group) + // 绑定公共路由 + commonRouter.R.BindController(ctx, group) + /*前期项目备案管理*/ + //testRouter.R.BindController(ctx, group) + isc.InitIscApi() + //自动绑定定义的模块 + if err := libRouter.RouterAutoBind(ctx, router, group); err != nil { + panic(err) + } + }) + + group.Group("/zm/api/wxApplet", func(group *ghttp.RouterGroup) { + //group.Middleware(utility.SignatureMiddleware) + group.Middleware(service.Middleware().Ctx) + //跨域处理,安全起见正式环境请注释该行 + group.Middleware(commonService.Middleware().MiddlewareCORS) + group.Middleware(ghttp.MiddlewareHandlerResponse) + // 绑定后台路由 + wxAppletRouter.R.BindController(ctx, group) + // 绑定公共路由 + commonRouter.R.BindController(ctx, group) + wxAppletRouter.InitAppProjectAPI(group) + wxAppletRouter.InitAppStageAPI(group) + wxAppletRouter.InitAppProcessAPI(group) + wxAppletRouter.InitAppVisualRemarkAPI(group) + wxAppletRouter.InitAppProjectVisualAPI(group) + + //自动绑定定义的模块 + if err := libRouter.RouterAutoBind(ctx, router, group); err != nil { + panic(err) + } + }) + group.Group("/zm/api/v1/test", func(group *ghttp.RouterGroup) { + //跨域处理,安全起见正式环境请注释该行 + group.Middleware(commonService.Middleware().MiddlewareCORS) + group.Middleware(ghttp.MiddlewareHandlerResponse) + // 绑定后台路由 + // 绑定公共路由 + testRouter.R.BindController(ctx, group) + //自动绑定定义的模块 + if err := libRouter.RouterAutoBind(ctx, router, group); err != nil { + panic(err) + } + }) + group.Group("/pilot", func(group *ghttp.RouterGroup) { + group.Middleware(commonService.Middleware().MiddlewareCORS) + group.Middleware(ghttp.MiddlewareHandlerResponse) + pilot.InitPlilotAPI(group) + }) + + // 安全帽 + group.Group("/zm/hat", func(group *ghttp.RouterGroup) { + service.GfToken().Middleware(group) + group.Middleware(commonService.Middleware().MiddlewareCORS) + group.Middleware(service.Middleware().Ctx, service.Middleware().Auth) + group.Middleware(ghttp.MiddlewareHandlerResponse) + saft_hat.InitHatAPI(group) + }) + + // 项目首页数据相关 + group.Group("/zm/project/pv", func(group *ghttp.RouterGroup) { + service.GfToken().Middleware(group) + group.Middleware(service.Middleware().Ctx, service.Middleware().Auth) + group.Middleware(commonService.Middleware().MiddlewareCORS) + group.Middleware(ghttp.MiddlewareHandlerResponse) + project.InitProjectAPI(group) + }) + + // 视频安全帽相关 + group.Group("/zm/video/hat", func(group *ghttp.RouterGroup) { + service.GfToken().Middleware(group) + group.Middleware(service.Middleware().Ctx, service.Middleware().Auth) + group.Middleware(commonService.Middleware().MiddlewareCORS) + group.Middleware(ghttp.MiddlewareHandlerResponse) + video_hat.InitHatAPI(group) + }) + + // 禾望云相关 + group.Group("/zm/hwy", func(group *ghttp.RouterGroup) { + service.GfToken().Middleware(group) + group.Middleware(service.Middleware().Ctx, service.Middleware().Auth) + group.Middleware(commonService.Middleware().MiddlewareCORS) + group.Middleware(ghttp.MiddlewareHandlerResponse) + hwy.InitHwyAPI(group) + }) + + // 图片合成相关 + group.Group("/zm/webodm", func(group *ghttp.RouterGroup) { + //service.GfToken().Middleware(group) + group.Middleware(service.Middleware().Ctx, service.Middleware().Auth) + group.Middleware(commonService.Middleware().MiddlewareCORS) + group.Middleware(ghttp.MiddlewareHandlerResponse) + webodm.InitWebOdmAPI(group) + }) + + // 考勤机人脸 + group.Group("/", func(group *ghttp.RouterGroup) { + //service.GfToken().Middleware(group) + group.Middleware(service.Middleware().Ctx, service.Middleware().Auth) + group.Middleware(commonService.Middleware().MiddlewareCORS) + group.Middleware(ghttp.MiddlewareHandlerResponse) + attendanceMachine.InitAttendanceMachineAPI(group) + }) +} diff --git a/internal/router/wxApplet.go b/internal/router/wxApplet.go new file mode 100644 index 0000000..1289c75 --- /dev/null +++ b/internal/router/wxApplet.go @@ -0,0 +1,10 @@ +package router + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" +) + +func (router *Router) BindWxAppletModuleController(ctx context.Context, group *ghttp.RouterGroup) { + //wxAppletRouter.R.BindController(ctx, group) +} diff --git a/library/libResponse/response.go b/library/libResponse/response.go new file mode 100644 index 0000000..8af8614 --- /dev/null +++ b/library/libResponse/response.go @@ -0,0 +1,106 @@ +package libResponse + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/os/gview" + "github.com/gogf/gf/v2/text/gstr" + "github.com/gogf/gf/v2/util/gconv" +) + +const ( + SuccessCode int = 0 + ErrorCode int = -1 +) + +type Response struct { + // 代码 + Code int `json:"code" example:"200"` + // 数据集 + Data interface{} `json:"data"` + // 消息 + Msg string `json:"message"` +} + +var response = new(Response) + +func JsonExit(r *ghttp.Request, code int, msg string, data ...interface{}) { + response.JsonExit(r, code, msg, data...) +} + +func RJson(r *ghttp.Request, code int, msg string, data ...interface{}) { + response.RJson(r, code, msg, data...) +} + +func SusJson(isExit bool, r *ghttp.Request, msg string, data ...interface{}) { + response.SusJson(isExit, r, msg, data...) +} + +func FailJson(isExit bool, r *ghttp.Request, msg string, data ...interface{}) { + response.FailJson(isExit, r, msg, data...) +} + +func WriteTpl(r *ghttp.Request, tpl string, view *gview.View, params ...gview.Params) error { + return response.WriteTpl(r, tpl, view, params...) +} + +// 返回JSON数据并退出当前HTTP执行函数。 +func (res *Response) JsonExit(r *ghttp.Request, code int, msg string, data ...interface{}) { + res.RJson(r, code, msg, data...) + r.ExitAll() +} + +// 标准返回结果数据结构封装。 +// 返回固定数据结构的JSON: +// code: 状态码(200:成功,302跳转,和http请求状态码一至); +// msg: 请求结果信息; +// data: 请求结果,根据不同接口返回结果的数据结构不同; +func (res *Response) RJson(r *ghttp.Request, code int, msg string, data ...interface{}) { + responseData := interface{}(nil) + if len(data) > 0 { + responseData = data[0] + } + r.Response.WriteJson(&Response{ + Code: code, + Msg: msg, + Data: responseData, + }) +} + +// 成功返回JSON +func (res *Response) SusJson(isExit bool, r *ghttp.Request, msg string, data ...interface{}) { + if isExit { + res.JsonExit(r, SuccessCode, msg, data...) + } + res.RJson(r, SuccessCode, msg, data...) +} + +// 失败返回JSON +func (res *Response) FailJson(isExit bool, r *ghttp.Request, msg string, data ...interface{}) { + if isExit { + res.JsonExit(r, ErrorCode, msg, data...) + } + res.RJson(r, ErrorCode, msg, data...) +} + +// WriteTpl 模板输出 +func (res *Response) WriteTpl(r *ghttp.Request, tpl string, view *gview.View, params ...gview.Params) error { + //绑定模板中需要用到的方法 + view.BindFuncMap(g.Map{ + // 根据长度i来切割字符串 + "subStr": func(str interface{}, i int) (s string) { + s1 := gconv.String(str) + if gstr.LenRune(s1) > i { + s = gstr.SubStrRune(s1, 0, i) + "..." + return s + } + return s1 + }, + }) + r.Response.Write(view.Parse(r.GetCtx(), tpl, params...)) + return nil +} + +func (res *Response) Redirect(r *ghttp.Request, location string, code ...int) { + r.Response.RedirectTo(location, code...) +} diff --git a/library/libRouter/router.go b/library/libRouter/router.go new file mode 100644 index 0000000..77963ab --- /dev/null +++ b/library/libRouter/router.go @@ -0,0 +1,36 @@ +/* +* @desc:路由处理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/11/16 11:09 + */ + +package libRouter + +import ( + "context" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/text/gregex" + "reflect" +) + +// RouterAutoBind 收集需要被绑定的控制器,自动绑定 +// 路由的方法命名规则必须为:BindXXXController +func RouterAutoBind(ctx context.Context, R interface{}, group *ghttp.RouterGroup) (err error) { + //TypeOf会返回目标数据的类型,比如int/float/struct/指针等 + typ := reflect.TypeOf(R) + //ValueOf返回目标数据的的值 + val := reflect.ValueOf(R) + if val.Elem().Kind() != reflect.Struct { + err = gerror.New("expect struct but a " + val.Elem().Kind().String()) + return + } + for i := 0; i < typ.NumMethod(); i++ { + if match := gregex.IsMatchString(`^Bind(.+)Controller$`, typ.Method(i).Name); match { + //调用绑定方法 + val.Method(i).Call([]reflect.Value{reflect.ValueOf(ctx), reflect.ValueOf(group)}) + } + } + return +} diff --git a/library/libUtils/slice_tree.go b/library/libUtils/slice_tree.go new file mode 100644 index 0000000..e1b3a3e --- /dev/null +++ b/library/libUtils/slice_tree.go @@ -0,0 +1,249 @@ +package libUtils + +import ( + "fmt" + "github.com/gogf/gf/v2/container/garray" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" + "reflect" +) + +// ParentSonSort 有层级关系的数组,父级-》子级 排序 +func ParentSonSort(list g.List, params ...interface{}) g.List { + args := make([]interface{}, 8) + for k, v := range params { + if k == 8 { + break + } + args[k] = v + } + var ( + pid int //父级id + level int //层级数 + fieldName string //父级id键名 + id string //id键名 + levelName string //层级名称 + title string //标题名称 + breaks int //中断层级 + prefixStr string //字符串前缀 + ) + pid = gconv.Int(GetSliceByKey(args, 0, 0)) + level = gconv.Int(GetSliceByKey(args, 1, 0)) + fieldName = gconv.String(GetSliceByKey(args, 2, "pid")) + id = gconv.String(GetSliceByKey(args, 3, "id")) + levelName = gconv.String(GetSliceByKey(args, 4, "flg")) + title = gconv.String(GetSliceByKey(args, 5, "title")) + breaks = gconv.Int(GetSliceByKey(args, 6, -1)) + prefixStr = gconv.String(GetSliceByKey(args, 7, "─")) + //定义一个新slice用于返回 + var returnSlice g.List + for _, v := range list { + if pid == gconv.Int(v[fieldName]) { + v[levelName] = level + levelClone := level + titlePrefix := "" + for { + if levelClone < 0 { + break + } + titlePrefix += prefixStr + levelClone-- + } + titlePrefix = "├" + titlePrefix + if level == 0 { + v["title_prefix"] = "" + } else { + v["title_prefix"] = titlePrefix + } + v["title_show"] = fmt.Sprintf("%s%s", v["title_prefix"], v[title]) + returnSlice = append(returnSlice, v) + if breaks != -1 && breaks == level { + continue + } + args[0] = v[id] + args[1] = level + 1 + newSlice2 := ParentSonSort(list, args...) + if len(newSlice2) > 0 { + returnSlice = append(returnSlice, newSlice2...) + } + } + } + return returnSlice +} + +// PushSonToParent 有层级关系的数组 ,将子级压入到父级(树形结构) +func PushSonToParent(list g.List, params ...interface{}) g.List { + args := make([]interface{}, 7) + for k, v := range params { + if k == 7 { + break + } + args[k] = v + } + var ( + pid string //父级id + fieldName string //父级id键名 + id string //id键名 + key string //子级数组键名 + filter string //过滤键名 + filterVal interface{} //过滤的值 + showNoChild bool //是否显示不存在的子级健 + ) + pid = gconv.String(GetSliceByKey(args, 0, 0)) + fieldName = gconv.String(GetSliceByKey(args, 1, "pid")) + id = gconv.String(GetSliceByKey(args, 2, "id")) + key = gconv.String(GetSliceByKey(args, 3, "children")) + filter = gconv.String(GetSliceByKey(args, 4, "")) + filterVal = GetSliceByKey(args, 5, nil) + showNoChild = gconv.Bool(GetSliceByKey(args, 6, true)) + var returnList g.List + for _, v := range list { + if gconv.String(v[fieldName]) == pid { + if filter != "" { + if reflect.DeepEqual(v[filter], filterVal) { + args[0] = v[id] + child := PushSonToParent(list, args...) + if child != nil || showNoChild { + v[key] = child + } + returnList = append(returnList, v) + } + } else { + args[0] = v[id] + child := PushSonToParent(list, args...) + if child != nil || showNoChild { + v[key] = child + } + returnList = append(returnList, v) + } + } + } + return returnList +} + +// GetSliceByKey 获取切片里的值 若为nil 可设置默认值val +func GetSliceByKey(args []interface{}, key int, val interface{}) interface{} { + var value interface{} + if args[key] != nil { + value = args[key] + } else { + value = val + } + return value +} + +// FindSonByParentId 有层级关系的切片,通过父级id查找所有子级id数组 +// parentId 父级id +// parentIndex 父级索引名称 +// idIndex id索引名称 +func FindSonByParentId(list g.List, parentId interface{}, parentIndex, idIndex string) g.List { + newList := make(g.List, 0, len(list)) + for _, v := range list { + if reflect.DeepEqual(v[parentIndex], parentId) { + newList = append(newList, v) + fList := FindSonByParentId(list, v[idIndex], parentIndex, idIndex) + newList = append(newList, fList...) + } + } + return newList +} + +// GetTopPidList 获取最顶层 parent Id +func GetTopPidList(list g.List, parentIndex, idIndex string) *garray.Array { + arr := garray.NewArray() + for _, v1 := range list { + tag := true + for _, v2 := range list { + if v1[parentIndex] == v2[idIndex] { + tag = false + break + } + } + if tag { + arr.PushRight(v1[parentIndex]) + } + } + return arr.Unique() +} + +// FindParentBySonPid 有层级关系的数组,通过子级fid查找所有父级数组 +func FindParentBySonPid(list g.List, id int, params ...interface{}) g.List { + args := make([]interface{}, 4) + for k, v := range params { + if k == 4 { + break + } + args[k] = v + } + var ( + filter = gconv.String(GetSliceByKey(args, 0, "filter")) //过滤键名 + fPid = gconv.String(GetSliceByKey(args, 1, "pid")) //父级id字段键名 + filterValue = GetSliceByKey(args, 2, nil) //过滤键值 + fid = gconv.String(GetSliceByKey(args, 3, "id")) //id字段键名 + ) + rList := make(g.List, 0, len(list)) + for _, v := range list { + if gconv.Int(v[fid]) == id { + if fv, ok := v[filter]; ok { + if reflect.DeepEqual(fv, filterValue) { + rList = append(rList, v) + } + } else { + rList = append(rList, v) + } + r := FindParentBySonPid(list, gconv.Int(v[fPid]), filter, fPid, filterValue, fid) + rList = append(rList, r...) + } + } + return rList +} + +// FindTopParent +/** + * 根据id查询最顶层父级信息 + * @param list 有层级关系的数组 + * @param id 查找的id + * @param string fpid 父级id键名 + * @param string fid 当前id键名 + * @return g.Map + */ +func FindTopParent(list g.List, id int64, params ...interface{}) g.Map { + if len(list) == 0 { + return g.Map{} + } + args := make([]interface{}, 2) + for k, v := range params { + if k == 2 { + break + } + args[k] = v + } + var ( + fPid = gconv.String(GetSliceByKey(args, 0, "pid")) //父级id字段键名 + fid = gconv.String(GetSliceByKey(args, 1, "id")) //id字段键名 + ) + hasParent := true + top := g.Map{} + //找到要查找id值的数组 + for _, v := range list { + if gconv.Int64(v[fid]) == gconv.Int64(id) { + top = v + break + } + } + for { + if !hasParent { + break + } + //查询最顶层 + for _, v := range list { + if gconv.Int64(top[fPid]) == gconv.Int64(v[fid]) { + top = v + hasParent = true + break + } + hasParent = false + } + } + return top +} diff --git a/library/libUtils/utils.go b/library/libUtils/utils.go new file mode 100644 index 0000000..d940e1e --- /dev/null +++ b/library/libUtils/utils.go @@ -0,0 +1,232 @@ +/* +* @desc:工具 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/4 22:16 + */ + +package libUtils + +import ( + "context" + "errors" + "fmt" + "github.com/bwmarrin/snowflake" + "github.com/gogf/gf/v2/crypto/gmd5" + "github.com/gogf/gf/v2/encoding/gcharset" + "github.com/gogf/gf/v2/encoding/gjson" + "github.com/gogf/gf/v2/encoding/gurl" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/text/gstr" + "github.com/samber/lo" + "github.com/tiger1103/gfast/v3/internal/app/common/consts" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "net" + "net/http" + "os" + "path" + "strings" +) + +// EncryptPassword 密码加密 +func EncryptPassword(password, salt string) string { + return gmd5.MustEncryptString(gmd5.MustEncryptString(password) + gmd5.MustEncryptString(salt)) +} + +// GetDomain 获取当前请求接口域名 +func GetDomain(ctx context.Context) string { + r := g.RequestFromCtx(ctx) + pathInfo, err := gurl.ParseURL(r.GetUrl(), -1) + if err != nil { + g.Log().Error(ctx, err) + return "" + } + return fmt.Sprintf("%s://%s:%s/", pathInfo["scheme"], pathInfo["host"], pathInfo["port"]) +} + +// GetClientIp 获取客户端IP +func GetClientIp(ctx context.Context) string { + return g.RequestFromCtx(ctx).GetClientIp() +} + +// GetUserAgent 获取user-agent +func GetUserAgent(ctx context.Context) string { + return ghttp.RequestFromCtx(ctx).Header.Get("User-Agent") +} + +// GetLocalIP 服务端ip +func GetLocalIP() (ip string, err error) { + var addrs []net.Addr + addrs, err = net.InterfaceAddrs() + if err != nil { + return + } + for _, addr := range addrs { + ipAddr, ok := addr.(*net.IPNet) + if !ok { + continue + } + if ipAddr.IP.IsLoopback() { + continue + } + if !ipAddr.IP.IsGlobalUnicast() { + continue + } + return ipAddr.IP.String(), nil + } + return +} + +// GetCityByIp 获取ip所属城市 +func GetCityByIp(ip string) string { + if ip == "" { + return "" + } + if ip == "::1" || ip == "127.0.0.1" { + return "内网IP" + } + url := "http://whois.pconline.com.cn/ipJson.jsp?json=true&ip=" + ip + bytes := g.Client().GetBytes(context.TODO(), url) + src := string(bytes) + srcCharset := "GBK" + tmp, _ := gcharset.ToUTF8(srcCharset, src) + json, err := gjson.DecodeToJson(tmp) + if err != nil { + return "" + } + if json.Get("code").Int() == 0 { + city := fmt.Sprintf("%s %s", json.Get("pro").String(), json.Get("city").String()) + return city + } else { + return "" + } +} + +// 写入文件 +func WriteToFile(fileName string, content string) error { + f, err := os.OpenFile(fileName, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644) + if err != nil { + return err + } + n, _ := f.Seek(0, os.SEEK_END) + _, err = f.WriteAt([]byte(content), n) + defer f.Close() + return err +} + +// 文件或文件夹是否存在 +func FileIsExisted(filename string) bool { + existed := true + if _, err := os.Stat(filename); os.IsNotExist(err) { + existed = false + } + return existed +} + +// 解析路径获取文件名称及后缀 +func ParseFilePath(pathStr string) (fileName string, fileType string) { + fileNameWithSuffix := path.Base(pathStr) + fileType = path.Ext(fileNameWithSuffix) + fileName = strings.TrimSuffix(fileNameWithSuffix, fileType) + return +} + +// IsNotExistMkDir 检查文件夹是否存在 +// 如果不存在则新建文件夹 +func IsNotExistMkDir(src string) error { + if exist := !FileIsExisted(src); exist == false { + if err := MkDir(src); err != nil { + return err + } + } + + return nil +} + +// MkDir 新建文件夹 +func MkDir(src string) error { + err := os.MkdirAll(src, os.ModePerm) + if err != nil { + return err + } + + return nil +} + +// 获取文件后缀 +func GetExt(fileName string) string { + return path.Ext(fileName) +} + +// GetType 获取文件类型 +func GetType(p string) (result string, err error) { + file, err := os.Open(p) + if err != nil { + g.Log().Error(context.TODO(), err) + return + } + buff := make([]byte, 512) + + _, err = file.Read(buff) + + if err != nil { + g.Log().Error(context.TODO(), err) + return + } + filetype := http.DetectContentType(buff) + return filetype, nil +} + +// GetFilesPath 获取附件相对路径 +func GetFilesPath(ctx context.Context, fileUrl string) (path string, err error) { + upType := g.Cfg().MustGet(ctx, "upload.default").Int() + if upType != 0 || (upType == 0 && !gstr.ContainsI(fileUrl, consts.UploadPath)) { + path = fileUrl + return + } + pathInfo, err := gurl.ParseURL(fileUrl, 32) + if err != nil { + g.Log().Error(ctx, err) + err = gerror.New("解析附件路径失败") + return + } + pos := gstr.PosI(pathInfo["path"], consts.UploadPath) + if pos >= 0 { + path = gstr.SubStr(pathInfo["path"], pos) + } + return +} + +// GetFakeOpenID 生成 Fake OpenID +func GetFakeOpenID() (string, error) { + node, err := snowflake.NewNode(1) + if err != nil { + return "", err + } + + // 生成一个 Fake OpenID + openID := node.Generate().Base64() + + // 保证生成的 OpenID 在 bus_construction_user 表中唯一 + _, err = lo.Attempt(3, func(_ int) error { + exist, err := dao.BusConstructionUser.Ctx(context.Background()).Where(dao.BusConstructionUser.Columns().Openid, openID).Count() + if err != nil { + openID = node.Generate().Base64() + return err + } + + if exist > 0 { + openID = node.Generate().Base64() + return errors.New("OpenID 已存在") + } + + return nil + }) + if err != nil { + return "", err + } + + return openID, nil +} diff --git a/library/libValidate/custom_validations.go b/library/libValidate/custom_validations.go new file mode 100644 index 0000000..60a94aa --- /dev/null +++ b/library/libValidate/custom_validations.go @@ -0,0 +1,108 @@ +package libValidate + +import ( + "context" + "github.com/gogf/gf/v2/errors/gerror" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/text/gregex" + "github.com/gogf/gf/v2/util/gconv" + "github.com/gogf/gf/v2/util/gvalid" + "strconv" + "strings" +) + +func Register() { + gvalid.RegisterRule("integer-array", IntegerArray) + gvalid.RegisterRule("float-array", FloatArray) + gvalid.RegisterRule("date-array", DateArray) + gvalid.RegisterRule("datetime-array", DatetimeArray) +} + +func IntegerArray(ctx context.Context, RI gvalid.RuleFuncInput) error { + if RI.Value.IsNil() { + return nil + } + + if RI.Value.IsSlice() { + return gerror.New(RI.Message) + } + for _, v := range RI.Value.Array() { + valueStr := strings.TrimSpace(gconv.String(v)) + if valueStr == "" { + continue + } + if _, err := strconv.Atoi(valueStr); err != nil { + continue + } + return gerror.New(RI.Message) + } + return nil +} + +func FloatArray(ctx context.Context, RI gvalid.RuleFuncInput) error { + if RI.Value.IsNil() { + return nil + } + if !RI.Value.IsSlice() { + return gerror.New(RI.Message) + } + for _, v := range RI.Value.Array() { + valueStr := strings.TrimSpace(gconv.String(v)) + if valueStr == "" { + continue + } + if _, err := strconv.ParseFloat(valueStr, 10); err == nil { + continue + } + return gerror.New(RI.Message) + } + return nil +} + +func DateArray(ctx context.Context, RI gvalid.RuleFuncInput) error { + if RI.Value.IsNil() { + return nil + } + if !RI.Value.IsSlice() { + return gerror.New(RI.Message) + } + for _, v := range RI.Value.Array() { + // support for time value, eg: gtime.Time/*gtime.Time, time.Time/*time.Time. + if _, ok := v.(gtime.Time); ok { + continue + } + valueStr := strings.TrimSpace(gconv.String(v)) + if valueStr == "" { + continue + } + if gregex.IsMatchString(`\d{4}[\.\-\_/]{0,1}\d{2}[\.\-\_/]{0,1}\d{2}`, valueStr) { + continue + } + return gerror.New(RI.Message) + } + return nil +} + +func DatetimeArray(ctx context.Context, RI gvalid.RuleFuncInput) error { + if RI.Value.IsNil() { + return nil + } + if !RI.Value.IsSlice() { + return gerror.New(RI.Message) + } + for _, v := range RI.Value.Array() { + // support for time value, eg: gtime.Time/*gtime.Time, time.Time/*time.Time. + if _, ok := v.(gtime.Time); ok { + continue + } + valueStr := strings.TrimSpace(gconv.String(v)) + if valueStr == "" { + continue + } + if _, err := gtime.StrToTimeFormat(valueStr, "Y-m-d H:i:s"); err == nil { + continue + } + return gerror.New(RI.Message) + } + return nil +} diff --git a/library/liberr/err.go b/library/liberr/err.go new file mode 100644 index 0000000..dd5ec83 --- /dev/null +++ b/library/liberr/err.go @@ -0,0 +1,30 @@ +/* +* @desc:错误处理 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/3/2 14:53 + */ + +package liberr + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" +) + +func ErrIsNil(ctx context.Context, err error, msg ...string) { + if !g.IsNil(err) { + if len(msg) > 0 { + g.Log().Error(ctx, err.Error()) + panic(msg[0]) + } else { + panic(err.Error()) + } + } +} + +func ValueIsNil(value interface{}, msg string) { + if g.IsNil(value) { + panic(msg) + } +} diff --git a/library/upload/init.go b/library/upload/init.go new file mode 100644 index 0000000..4384911 --- /dev/null +++ b/library/upload/init.go @@ -0,0 +1,47 @@ +package upload + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/api/v1/system" +) + +const ( + SourceLocal UploaderType = iota // 上传到本地 + SourceTencent // 上传至腾讯云 + SourceQiniu // 上传到七牛云 +) + +type UploaderType int + +type IUpload interface { + Upload(ctx context.Context, file *ghttp.UploadFile) (result system.UploadResponse, err error) +} + +var uploadCollection map[UploaderType]IUpload + +// 注册上传接口 +func RegisterUploader(key UploaderType, value IUpload) { + if uploadCollection == nil { + uploadCollection = make(map[UploaderType]IUpload) + } + uploadCollection[key] = value +} + +// 获取上传接口 +func GetUploader(key UploaderType) IUpload { + if uploadCollection == nil { + return nil + } + if v, ok := uploadCollection[key]; ok { + return v + } + return nil +} + +func Register() { + + RegisterUploader(SourceLocal, &Local{}) + RegisterUploader(SourceTencent, &Tencent{}) + RegisterUploader(SourceQiniu, &Qiniou{}) +} diff --git a/library/upload/local.go b/library/upload/local.go new file mode 100644 index 0000000..0ba2d84 --- /dev/null +++ b/library/upload/local.go @@ -0,0 +1,57 @@ +package upload + +import ( + "context" + "errors" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/common/consts" + "strings" + "time" +) + +type Local struct { +} + +func (s *Local) Upload(ctx context.Context, file *ghttp.UploadFile) (result system.UploadResponse, err error) { + if file == nil { + err = errors.New("文件必须!") + return + } + r := g.RequestFromCtx(ctx) + urlPerfix := fmt.Sprintf("http://%s/", r.Host) + p := strings.Trim(consts.UploadPath, "/") + sp := s.getStaticPath(ctx) + if sp != "" { + sp = strings.Trim(sp, "/") + } + nowData := time.Now().Format("2006-01-02") + // 包含静态文件夹的路径 + fullDirPath := sp + "/" + p + "/" + nowData + fileName, err := file.Save(fullDirPath, true) + if err != nil { + return + } + // 不含静态文件夹的路径 + fullPath := p + "/" + nowData + "/" + fileName + + result = system.UploadResponse{ + Size: file.Size, + Path: fullPath, + FullPath: urlPerfix + fullPath, + Name: file.Filename, + Type: file.Header.Get("Content-type"), + } + return +} + +// 静态文件夹目录 +func (s *Local) getStaticPath(ctx context.Context) string { + value, _ := g.Cfg().Get(ctx, "server.serverRoot") + if !value.IsEmpty() { + return value.String() + } + return "" +} diff --git a/library/upload/qiniou.go b/library/upload/qiniou.go new file mode 100644 index 0000000..58de5e7 --- /dev/null +++ b/library/upload/qiniou.go @@ -0,0 +1,75 @@ +package upload + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/util/guid" + "github.com/qiniu/go-sdk/v7/auth/qbox" + "github.com/qiniu/go-sdk/v7/storage" + "github.com/tiger1103/gfast/v3/api/v1/system" + "path" +) + +type Qiniou struct{} + +func (s *Qiniou) Upload(ctx context.Context, file *ghttp.UploadFile) (result system.UploadResponse, err error) { + + url, err := s.toQiniou(ctx, file) + if err != nil { + return + } + result = system.UploadResponse{ + Size: file.Size, + Path: url, + FullPath: url, + Name: file.Filename, + Type: file.Header.Get("Content-type"), + } + + return +} + +func (s *Qiniou) toQiniou(ctx context.Context, f *ghttp.UploadFile) (url string, err error) { + file, err := f.Open() + if err != nil { + return + } + defer file.Close() + v, err := g.Cfg().Get(ctx, "upload.qiniou") + if err != nil { + return + } + m := v.MapStrVar() + var AccessKey = m["accessKey"].String() + var SerectKey = m["sercetKey"].String() + var Bucket = m["bucket"].String() + var ImgUrl = m["qiniuServer"].String() + + putPlicy := storage.PutPolicy{ + Scope: Bucket, + } + mac := qbox.NewMac(AccessKey, SerectKey) + upToken := putPlicy.UploadToken(mac) + cfg := storage.Config{ + Zone: &storage.ZoneHuanan, + UseCdnDomains: false, + UseHTTPS: false, + } + putExtra := storage.PutExtra{ + MimeType: f.Header.Get("Content-type"), + } + formUploader := storage.NewFormUploader(&cfg) + ret := storage.PutRet{} + filename := guid.S() + path.Ext(f.Filename) + fileSize := f.Size + //err = formUploader.PutWithoutKey(context.Background(), &ret, upToken, file, fileSize, &putExtra) + err = formUploader.Put(context.Background(), &ret, upToken, filename, file, fileSize, &putExtra) + if err != nil { + return + } + + url = ImgUrl + "/" + filename + return url, nil + +} diff --git a/library/upload/tencent.go b/library/upload/tencent.go new file mode 100644 index 0000000..d006b2b --- /dev/null +++ b/library/upload/tencent.go @@ -0,0 +1,75 @@ +package upload + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/os/gfile" + "github.com/gogf/gf/v2/os/gtime" + "github.com/gogf/gf/v2/util/grand" + "github.com/tencentyun/cos-go-sdk-v5" + "github.com/tencentyun/cos-go-sdk-v5/debug" + "github.com/tiger1103/gfast/v3/api/v1/system" + "io" + "net/http" + "net/url" + "strconv" + "strings" +) + +type Tencent struct { +} + +func (s *Tencent) Upload(ctx context.Context, file *ghttp.UploadFile) (result system.UploadResponse, err error) { + v, err := g.Cfg().Get(ctx, "upload.tencentCOS") + if err != nil { + return + } + m := v.MapStrVar() + var ( + upPath = m["upPath"].String() + rawUrl = m["rawUrl"].String() + secretID = m["secretID"].String() + secretKey = m["secretKey"].String() + ) + name := gfile.Basename(file.Filename) + name = strings.ToLower(strconv.FormatInt(gtime.TimestampNano(), 36) + grand.S(6)) + name = name + gfile.Ext(file.Filename) + + path := upPath + name + + url, _ := url.Parse(rawUrl) + b := &cos.BaseURL{BucketURL: url} + client := cos.NewClient(b, &http.Client{ + Transport: &cos.AuthorizationTransport{ + SecretID: secretID, + SecretKey: secretKey, + Transport: &debug.DebugRequestTransport{ + RequestHeader: false, + RequestBody: false, + ResponseHeader: false, + ResponseBody: false, + }, + }, + }) + opt := &cos.ObjectPutOptions{ + ObjectPutHeaderOptions: &cos.ObjectPutHeaderOptions{ + ContentLength: int64(file.Size), + }, + } + var f io.ReadCloser + f, err = file.Open() + if err != nil { + return + } + defer f.Close() + _, err = client.Object.Put(context.Background(), path, f, opt) + result = system.UploadResponse{ + Size: file.Size, + Path: rawUrl + path, + FullPath: rawUrl + path, + Name: file.Filename, + Type: file.Header.Get("Content-type"), + } + return +} diff --git a/library/upload_chunk/consts.go b/library/upload_chunk/consts.go new file mode 100644 index 0000000..04f799d --- /dev/null +++ b/library/upload_chunk/consts.go @@ -0,0 +1,7 @@ +package upload_chunk + +const ( + Tmp = "./resource/public/big_file/" // 文件保存目录 + RelativePath = "big_file/" // 返回前端的相对路径 + FileName = "upfile" // 上传文件的文件名 +) diff --git a/library/upload_chunk/helper.go b/library/upload_chunk/helper.go new file mode 100644 index 0000000..b46da79 --- /dev/null +++ b/library/upload_chunk/helper.go @@ -0,0 +1,81 @@ +package upload_chunk + +import ( + "errors" + "fmt" + "os" + "path" + "strings" +) + +// 解析文件目录,文件前缀及文件后缀 +func parseFilePath(filename string) (dir, prefix, suffix string) { + filenameall := path.Base(filename) //不含目录的文件名 + filesuffix := path.Ext(filename) // 后缀 + fileprefix := strings.TrimSuffix(filenameall, filesuffix) // 前缀 + + dir = strings.TrimRight(filename, filenameall) // 文件目录 + prefix = fileprefix // 文件前缀 + suffix = filesuffix // 文件后缀 + return +} + +// 创建文件 +func createFile(fullFilePath string) (ok bool, err error) { + ok = fileExists(fullFilePath) + if ok { + return + } + dir, _, _ := parseFilePath(fullFilePath) + if dir != "" { + err = mkDir(dir) + if err != nil { + return + } + } + newFile, err := os.Create(fullFilePath) + defer newFile.Close() + if err != nil { + return + } + return +} + +// 创建文件夹 +func mkDir(path string) (err error) { + if !fileExists(path) { + if err = os.MkdirAll(path, os.ModePerm); err != nil { + return errors.New(fmt.Sprintf(`os.MkdirAll failed for path "%s" with perm "%d" , err : %v`, path, os.ModePerm, err)) + } + return nil + } + + return +} + +// 判断所给路径是否为文件夹 +func IsDir(path string) bool { + s, err := os.Stat(path) + if err != nil { + return false + } + return s.IsDir() +} + +// 是否文件 +func IsFile(path string) bool { + return !IsDir(path) +} + +// 判断文件或文件夹是否存在 +func fileExists(path string) bool { + if stat, err := os.Stat(path); stat != nil && !os.IsNotExist(err) { + return true + } + return false +} + +// 生成分片文件名 +func getChunkFilename(identifier, chunkNumber string) string { + return fmt.Sprintf("uploader-%s.%s", identifier, chunkNumber) +} diff --git a/library/upload_chunk/option.go b/library/upload_chunk/option.go new file mode 100644 index 0000000..4d32fe9 --- /dev/null +++ b/library/upload_chunk/option.go @@ -0,0 +1,241 @@ +package upload_chunk + +import ( + "encoding/json" + "errors" + "io" + "mime/multipart" + "net/http" + "strconv" +) + +type checkErr func() error + +type UploadReq struct { + ChunkNumber int `json:"chunkNumber"` // 分片序列号 + ChunkSize int `json:"chunkSize"` // 分片大小 + CurrentChunkSize int `json:"currentChunkSize"` // 当前分片大小 + TotalSize int64 `json:"totalSize"` // 文件总大小 + Identifier string `json:"identifier"` // 标识 + Filename string `json:"filename"` // 文件名 + RelativePath string `json:"relativePath"` //文件夹上传的时候文件的相对路径属性 + TotalChunks int `json:"totalChunks"` // 分片总数 + File multipart.File + FileHeader *multipart.FileHeader + + verification map[interface{}][]checkErr +} + +func (u *UploadReq) verificationInit() { + if u.verification == nil { + u.verification = make(map[interface{}][]checkErr) + } +} + +func (u *UploadReq) MustChunkNumber() *UploadReq { + u.verificationInit() + u.verification["ChunkNumber"] = append(u.verification["ChunkNumber"], func() error { + if u.ChunkNumber == 0 { + return errors.New("ChunkNumber不能为空") + } + return nil + }) + + return u +} + +func (u *UploadReq) MustChunkSize() *UploadReq { + u.verificationInit() + u.verification["ChunkSize"] = append(u.verification["ChunkSize"], func() error { + if u.ChunkSize == 0 { + return errors.New("ChunkSize不能为空") + } + return nil + }) + + return u +} + +func (u *UploadReq) MustCurrentChunkSize() *UploadReq { + u.verificationInit() + u.verification["CurrentChunkSize"] = append(u.verification["CurrentChunkSize"], func() error { + if u.CurrentChunkSize == 0 { + return errors.New("CurrentChunkSize不能为空") + } + return nil + }) + return u +} + +func (u *UploadReq) MustTotalSize() *UploadReq { + u.verificationInit() + u.verification["TotalSize"] = append(u.verification["TotalSize"], func() error { + if u.TotalSize == 0 { + return errors.New("TotalSize不能为空") + } + return nil + }) + return u +} + +func (u *UploadReq) MustIdentifier() *UploadReq { + u.verificationInit() + u.verification["Identifier"] = append(u.verification["Identifier"], func() error { + if u.Identifier == "" { + return errors.New("Identifier不能为空") + } + return nil + }) + return u +} + +func (u *UploadReq) MustFilename() *UploadReq { + u.verificationInit() + u.verification["Filename"] = append(u.verification["Filename"], func() error { + if u.Filename == "" { + return errors.New("Filename不能为空") + } + return nil + }) + return u +} + +func (u *UploadReq) MustTotalChunks() *UploadReq { + u.verificationInit() + u.verification["TotalChunks"] = append(u.verification["TotalChunks"], func() error { + if u.TotalChunks == 0 { + return errors.New("TotalChunks不能为空") + } + return nil + }) + return u +} + +func (u *UploadReq) MustFile() *UploadReq { + u.verificationInit() + u.verification["File"] = append(u.verification["File"], func() error { + if u.File == nil || u.FileHeader == nil { + return errors.New("File不能为空") + } + return nil + }) + return u +} + +func (u *UploadReq) Check() (err error) { + for _, item := range u.verification { + for _, fn := range item { + err = fn() + if err != nil { + return + } + + } + } + return +} + +func (u *UploadReq) Bind(r *http.Request) (err error) { + if r.Header.Get("Content-Type") == "application/json" { + l := r.ContentLength + if l == 0 { + return + } + buf := make([]byte, l) + _, err = r.Body.Read(buf) + + if err != nil && err != io.EOF { + return + } + err = json.Unmarshal(buf, u) + if err != nil { + return + } + + } else { + chunkNumber := r.FormValue("chunkNumber") + if chunkNumber != "" { + u.ChunkNumber, _ = strconv.Atoi(chunkNumber) + } + + chunkSize := r.FormValue("chunkSize") + if chunkSize != "" { + u.ChunkSize, _ = strconv.Atoi(chunkSize) + } + + currentChunkSize := r.FormValue("currentChunkSize") + if currentChunkSize != "" { + u.CurrentChunkSize, _ = strconv.Atoi(currentChunkSize) + } + + totalSize := r.FormValue("totalSize") + if totalSize != "" { + u.TotalSize, _ = strconv.ParseInt(totalSize, 10, 64) + } + + identifier := r.FormValue("identifier") + if identifier != "" { + u.Identifier = identifier + } + + filename := r.FormValue("filename") + if filename != "" { + u.Filename = filename + } + + relativePath := r.FormValue("relativePath") + if relativePath != "" { + u.RelativePath = relativePath + } + + totalChunks := r.FormValue("totalChunks") + if totalChunks != "" { + u.TotalChunks, _ = strconv.Atoi(totalChunks) + } + } + + u.File, u.FileHeader, _ = r.FormFile(FileName) + return +} + +type BaseRes struct { + Filename string `json:"filename"` // 文件名 + TotalSize int64 `json:"totalSize"` // 文件总大小 + Url string `json:"url"` // 上传文件路径 +} + +// 返回前端的相对路径 +func (b *BaseRes) RelativePath() { + _, prefix, suffix := parseFilePath(b.Url) + b.Url = RelativePath + prefix + suffix +} + +type UpLoadRes struct { + BaseRes + NeedMerge bool `json:"needMerge"` // 是否合并文件 + Identifier string `json:"identifier"` // 标识 + TotalChunks int `json:"totalChunks"` // 分片总数 +} + +type CheckRes struct { + SkipUpload bool `json:"skipUpload"` // 秒传 + Uploaded []int `json:"uploaded"` // 已上传过的分片 + BaseRes +} + +func (r *CheckRes) HasUploaded(i int) (ok bool) { + for _, item := range r.Uploaded { + if item == i { + return true + } + } + return +} + +func (r *CheckRes) HasFirst() (ok bool) { + return r.HasUploaded(1) +} + +type MergeRes struct { + BaseRes +} diff --git a/library/upload_chunk/upload_chunk.go b/library/upload_chunk/upload_chunk.go new file mode 100644 index 0000000..bec7656 --- /dev/null +++ b/library/upload_chunk/upload_chunk.go @@ -0,0 +1,309 @@ +package upload_chunk + +import ( + "errors" + "fmt" + "io" + "log" + "mime/multipart" + "os" + "strconv" + "strings" + "sync" +) + +type UploadChunk struct{} + +// 检查分片 +func (u *UploadChunk) CheckChunk(uploadReq UploadReq) (result *CheckRes, err error) { + + err = uploadReq.MustIdentifier().MustTotalChunks().MustFilename().MustTotalSize().Check() + if err != nil { + return + } + identifier, totalChunks, filename, totalSize := uploadReq.Identifier, uploadReq.TotalChunks, uploadReq.Filename, uploadReq.TotalSize + + dir, prefix, suffix := parseFilePath(filename) + _, _, _ = dir, prefix, suffix + + if !strings.Contains(suffix, ".") { + err = errors.New("文件名解析错误") + return + } + + result = &CheckRes{} + + // 秒传 + resultFilePath := u.Tmp() + identifier + suffix + if fileExists(resultFilePath) { + result.SkipUpload = true + result.Url = resultFilePath + result.Filename = filename + result.TotalSize = totalSize + result.RelativePath() + return + } + + // 断点续传 + for i := 1; i <= totalChunks; i++ { + chunkFilePath := u.chunkPath(identifier, strconv.FormatInt(int64(i), 10)) + if fileExists(chunkFilePath) { + result.Uploaded = append(result.Uploaded, i) + } + } + + return +} + +// 合并文件 +func (u *UploadChunk) MergeChunk(uploadReq UploadReq) (result *MergeRes, err error) { + err = uploadReq.MustIdentifier().MustTotalChunks().MustTotalSize().MustFilename().Check() + if err != nil { + return + } + identifier, totalChunks, totalSize, filename := uploadReq.Identifier, uploadReq.TotalChunks, uploadReq.TotalSize, uploadReq.Filename + + _, _, suffix := parseFilePath(filename) + if !strings.Contains(suffix, ".") { + return nil, errors.New("文件名解析错误") + } + + // 合并后的文件 + resultFilePath := u.Tmp() + identifier + suffix + ok, err := createFile(resultFilePath) + if err != nil { + return + } + result = new(MergeRes) + // 文件已存在 + if ok { + result.Url = resultFilePath + result.Filename = filename + result.TotalSize = totalSize + result.RelativePath() + return + } + + // 检查分片文件是否完整 + ok, err = u.checkChunkAll(identifier, totalChunks, totalSize) + if err != nil { + err = fmt.Errorf("分片文件检查错误:%s", err) + return + } + + if !ok { + err = errors.New("分片文件不完整") + return + } + + var chunkSize int64 + var wg sync.WaitGroup + ch := make(chan struct{}, 10) + for i := 1; i <= totalChunks; i++ { + // 分片文件 + filePath := u.chunkPath(identifier, fmt.Sprintf("%d", i)) + if chunkSize == 0 { + fi, _ := os.Stat(filePath) + if chunkSize = fi.Size(); chunkSize == 0 { + err = errors.New("分片文件大小为0") + return + } + } + ch <- struct{}{} + wg.Add(1) + go func(i int) { + defer func() { + <-ch + wg.Done() + }() + uploadChunk := &UploadChunk{} + err = uploadChunk.mergeFile(filePath, resultFilePath, chunkSize*int64(i-1)) + if err != nil { + log.Println(err) + return + } + }(i) + } + wg.Wait() + + result.Url = resultFilePath + result.Filename = filename + result.TotalSize = totalSize + result.RelativePath() + return +} + +// 上传分片文件 +func (u *UploadChunk) Upload(uploadReq UploadReq) (result *UpLoadRes, err error) { + err = uploadReq.MustTotalChunks().MustChunkNumber().MustIdentifier().MustFile().MustTotalSize().MustFilename().Check() + if err != nil { + return + } + totalChunks, chunkNumber, identifier, upFile, filename := uploadReq.TotalChunks, uploadReq.ChunkNumber, uploadReq.Identifier, uploadReq.File, uploadReq.Filename + var fullFilePath string + if totalChunks > 1 { + // 分片文件路径 + fullFilePath = u.chunkPath(identifier, strconv.Itoa(chunkNumber)) + } else { + _, _, suffix := parseFilePath(filename) + if !strings.Contains(suffix, ".") { + return nil, errors.New("文件名解析错误") + } + fullFilePath = u.Tmp() + identifier + suffix + } + + // 创建文件 + ok, err := createFile(fullFilePath) + + if err != nil { + return + } + if ok { + // 文件已经存在 + result = &UpLoadRes{ + BaseRes: BaseRes{ + Filename: uploadReq.Filename, + TotalSize: uploadReq.TotalSize, + Url: fullFilePath, + }, + NeedMerge: totalChunks > 1, + Identifier: uploadReq.Identifier, + TotalChunks: uploadReq.TotalChunks, + } + result.RelativePath() + return + } + + // 打开分片文件 + file, err := os.OpenFile(fullFilePath, os.O_CREATE|os.O_WRONLY, 0666) + if err != nil { + return + } + defer file.Close() + // 文件偏移量 + var fi os.FileInfo + fi, err = os.Stat(fullFilePath) + if err != nil { + return + } + start := fi.Size() + // 写入分片文件 + _, err = u.writeFile(upFile, start, file, start) + if err != nil { + return + } + result = &UpLoadRes{ + BaseRes: BaseRes{ + Filename: uploadReq.Filename, + TotalSize: uploadReq.TotalSize, + Url: fullFilePath, + }, + NeedMerge: totalChunks > 1, + Identifier: uploadReq.Identifier, + TotalChunks: uploadReq.TotalChunks, + } + result.RelativePath() + return +} + +func (u *UploadChunk) Tmp() string { + return Tmp +} + +// 合并文件 +func (u *UploadChunk) mergeFile(chunkFile, mergeFile string, offset int64) (err error) { + + // 合并后的文件 + file, err := os.OpenFile(mergeFile, os.O_CREATE|os.O_WRONLY, os.ModePerm) + if err != nil { + return + } + defer file.Close() + + _, err = file.Seek(offset, 0) + if err != nil { + return + } + // 分片文件 + chunkFileObj, err := os.Open(chunkFile) + if err != nil { + return + } + defer chunkFileObj.Close() + // 写入数据 + data := make([]byte, 1024, 1024) + + for { + tal, e := chunkFileObj.Read(data) + if e == io.EOF { + chunkFileObj.Close() + os.Remove(chunkFile) + break + } + _, e = file.Write(data[:tal]) + if e != nil { + return e + } + } + return +} + +// 检查分片文件是否完整 +func (u *UploadChunk) checkChunkAll(identifier string, totalChunks int, totalSize int64) (ok bool, err error) { + if identifier == "" || totalChunks == 0 { + return false, errors.New("checkChunkAll 参数错误") + } + var _totalSize int64 + for i := 1; i <= totalChunks; i++ { + filePath := u.chunkPath(identifier, fmt.Sprintf("%d", i)) + fi, e := os.Stat(filePath) + if e != nil { + return false, e + } + _totalSize += fi.Size() + } + + return _totalSize == totalSize, nil +} + +// 获取分片文件路径 +func (u *UploadChunk) chunkPath(identifier string, chunkNumber string) string { + return fmt.Sprintf("%s%s", u.Tmp(), getChunkFilename(identifier, chunkNumber)) +} + +// 检查文件完整性 +func (u *UploadChunk) verifyFileSize(fullFilePath string, size int64) (ok bool, err error) { + fi, err := os.Stat(fullFilePath) + if err != nil { + return + } + if fi.Size() == size { + return true, nil + } + return false, nil +} + +// 写入文件 +func (u *UploadChunk) writeFile(upfile multipart.File, upSeek int64, file *os.File, fSeek int64) (result int, err error) { + // 上传文件大小记录 + fileSzie := 0 + // 设置上传偏移量 + upfile.Seek(upSeek, 0) + // 设置文件偏移量 + file.Seek(fSeek, 0) + data := make([]byte, 1024, 1024) + for { + total, e := upfile.Read(data) + if e == io.EOF { + // 文件复制完毕 + break + } + l, e := file.Write(data[:total]) + if e != nil { + return 0, errors.New("文件上传失败") + } + // 记录上传长度 + fileSzie += l + } + return fileSzie, nil +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..ea0fc57 --- /dev/null +++ b/main.go @@ -0,0 +1,99 @@ +package main + +import ( + _ "github.com/gogf/gf/contrib/drivers/mysql/v2" + _ "github.com/gogf/gf/contrib/nosql/redis/v2" + "github.com/gogf/gf/v2/os/gctx" + _ "github.com/tiger1103/gfast/v3/internal/app/boot" + _ "github.com/tiger1103/gfast/v3/internal/app/system/packed" + "github.com/tiger1103/gfast/v3/internal/cmd" + _ "github.com/tiger1103/gfast/v3/task" +) + +func main() { + + ctx := gctx.New() + + //video_hat.InitToken() // 加载初始化视频安全帽的 Token + //toolTurf.InitTurfjs() // 初始化 供打卡范围 + //ys7.InitYs7() // 摄像头 + //mqtt.InitMQTT() // 无人机 + //task.UavRun(ctx) // 执行无人机的cronc + // + ////考勤机 + //http.HandleFunc("/ws", ws.HandleWebSocket) + //go func() { + // if err := http.ListenAndServe(":8913", nil); err != nil { + // log.Fatal("考勤机ws服务启动失败", err) + // } + //}() + + cmd.Main.Run(ctx) + + //mo() + + //===================注意===================== + //===================注意===================== + //===================注意===================== + //===================注意===================== + //===================注意===================== + //===================注意===================== + /** + 如果新建表,并且和openid有关联,需要将表名放入到 BatchUpdateTheOpenidsOfIndividualTables(全局搜索) 方法下的切片中 + */ +} + +//func main() { +// //jsonData := `{"originalImgSize": [2560, 1440], "targets": [{"type": "head", "size": [71, 89], "leftTopPoint": [1345, 702], "score": 0.40652531385421753}, {"type": "head", "size": [68, 81], "leftTopPoint": [1488, 707], "score": 0.756232500076294}, {"type": "head", "size": [71, 79], "leftTopPoint": [1109, 726], "score": 0.8591576218605042}, {"type": "head", "size": [63, 81], "leftTopPoint": [1160, 681], "score": 0.8899233341217041}, {"type": "head", "size": [61, 80], "leftTopPoint": [1679, 709], "score": 0.9004907011985779}, {"type": "head", "size": [68, 87], "leftTopPoint": [997, 690], "score": 0.9115070104598999}, null], "hasTarget": 1}` +// // +// //var result SpartaApi.RecognizeRes +// //err := json.Unmarshal([]byte(jsonData), &result) +// //if err != nil { +// // fmt.Println("JSON解析错误:", err) +// // return +// //} +// +// fmt.Println("开始识别") +// // 将大图交给AI识别 +// recognizeRequest := SpartaApi.RecognizeReq{ +// CapUrl: "http://xny.yj-3d.com:7363/file/tif/20250625160218orthophoto.png", +// RecType: SpartaApi.UAV_MATRIX, +// Async: "False", +// CallBackUrl: "", +// AreaHigh: "", +// } +// fmt.Println("发送---", recognizeRequest) +// recognizeResult, _, recognizeErr := SpartaApi.CommonAlgorithmTwoUav(gctx.New(), &recognizeRequest) +// fmt.Println("识别结果:", recognizeResult) +// fmt.Println("错误信息:", recognizeErr) +//} + +//func mo() { +// ctx := gctx.New() +// minioClient, _ := dj.PublicMinioClient() +// +// arr := [...]string{ +// "f61f015bf09143bd910234aaeb4b9168", +// } +// for _, v := range arr { +// var path = "D:\\aaaaaaaa\\" + v +// var uav = "uav/" + v +// _ = dj.DownloadTheFileWithTheSpecifiedPrefixBasedOnTheObjectSet(ctx, minioClient, dj.BucketName, uav, path, true) +// } +//} + +//func FanWei(positions []commonshp.Point, point orb.Point) bool { +// var newRing []orb.Point +// for _, p := range positions { +// newRing = append(newRing, orb.Point{p.Lng, p.Lat}) +// } +// var polygon orb.Polygon +// +// polygon = append(polygon, newRing) +// // 判断点是否在多边形内 +// if planar.PolygonContains(polygon, point) { +// return true +// } else { +// return false +// } +//} diff --git a/manifest/config/config.yaml.bak b/manifest/config/config.yaml.bak new file mode 100644 index 0000000..d5b0023 --- /dev/null +++ b/manifest/config/config.yaml.bak @@ -0,0 +1,110 @@ +server: + address: ":8808" + serverRoot: "resource/public" + dumpRouterMap: false + routeOverWrite: true + openapiPath: "/api.json" + swaggerPath: "/swagger" + NameToUriType: 3 + maxHeaderBytes: "20KB" + clientMaxBodySize: "50MB" + # Logging配置 + logPath: "resource/log/server" # 日志文件存储目录路径,建议使用绝对路径。默认为空,表示关闭 + logStdout: true # 日志是否输出到终端。默认为true + errorStack: true # 当Server捕获到异常时是否记录堆栈信息到日志中。默认为true + errorLogEnabled: true # 是否记录异常日志信息到日志中。默认为true + errorLogPattern: "error-{Ymd}.log" # 异常错误日志文件格式。默认为"error-{Ymd}.log" + accessLogEnabled: true # 是否记录访问日志。默认为false + accessLogPattern: "access-{Ymd}.log" # 访问日志文件格式。默认为"access-{Ymd}.log" + +logger: + path: "resource/log/run" + file: "{Y-m-d}.log" + level: "all" + stdout: true + +# Database. +database: + logger: + level: "all" + stdout: true + Path: "resource/log/sql" + + default: + link: "mysql:gfast3:gfast333@tcp(localhost111:3306)/gfast-v32?charset=utf8mb4&parseTime=true&loc=Local" + debug: true + charset: "utf8mb4" #数据库编码 + dryRun: false #空跑 + maxIdle: 10 #连接池最大闲置的连接数 + maxOpen: 10 #连接池最大打开的连接数 + maxLifetime: "30s" #(单位秒)连接对象可重复使用的时间长度 + +gfToken: + cacheKey: "gfToken:" + timeOut: 10800 + maxRefresh: 5400 + multiLogin: true + encryptKey: "49c54195e750b04e74a8429b17896586" + cacheModel: "redis" + excludePaths: + - "/api/v1/system/login" + + +# Redis 配置示例 +redis: + # 单实例配置 + default: + address: 127.0.0.1:6379 + db: 1 + idleTimeout: "60s" #连接最大空闲时间,使用时间字符串例如30s/1m/1d + maxConnLifetime: "90s" #连接最长存活时间,使用时间字符串例如30s/1m/1d + waitTimeout: "60s" #等待连接池连接的超时时间,使用时间字符串例如30s/1m/1d + dialTimeout: "30s" #TCP连接的超时时间,使用时间字符串例如30s/1m/1d + readTimeout: "30s" #TCP的Read操作超时时间,使用时间字符串例如30s/1m/1d + writeTimeout: "30s" #TCP的Write操作超时时间,使用时间字符串例如30s/1m/1d + maxActive: 100 + +system: + notCheckAuthAdminIds: [1,2,31] #无需验证后台权限的用户id + dataDir: "./resource/data" + cache: + model: "redis" #缓存模式 memory OR redis + prefix: "gFastV3Cache:" #缓存前缀 + +#casbin配置 +casbin: + modelFile: "./resource/casbin/rbac_model.conf" + policyFile: "./resource/casbin/rbac_policy.csv" + + +# CLI. +gfcli: + gen: + dao: + - link: "mysql:gfast3:gfast333@tcp(localhost:3306)/gfast-v32" + tables: "tools_gen_table,tools_gen_table_column" + removePrefix: "gf_" + descriptionTag: true + noModelComment: true + path: "./internal/app/system" + +# 上传配置 +upload: + default: 0 # 默认上传至本地 + tencentCOS: + upPath : "/gfast/" + rawUrl : "https://xxxxxx.ap-xxxxx.myqcloud.com" + secretID : "xxxxxxxxxx" + secretKey : "xxxxxxxxxx" + +# 代码生成配置 +gen: + author: "gfast" + moduleName: "system" + apiName: "api/v1" + packageName: "internal/app/system" + goModName: "github.com/tiger1103/gfast/v3" + autoRemovePre: true #是否自动删除表前缀 + tablePrefix: "table_,qxkj_" #表前缀 + templatePath: "./resource/template/vm" #代码生成模板路径 + frontDir: "../../../project/webProject/p2022/gfast-v3.2-ui/gfast3.2-ui" #前端路径 \ No newline at end of file diff --git a/manifest/deploy/kustomize/base/deployment.yaml b/manifest/deploy/kustomize/base/deployment.yaml new file mode 100644 index 0000000..28f1d69 --- /dev/null +++ b/manifest/deploy/kustomize/base/deployment.yaml @@ -0,0 +1,21 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: template-single + labels: + app: template-single +spec: + replicas: 1 + selector: + matchLabels: + app: template-single + template: + metadata: + labels: + app: template-single + spec: + containers: + - name : main + image: template-single + imagePullPolicy: Always + diff --git a/manifest/deploy/kustomize/base/kustomization.yaml b/manifest/deploy/kustomize/base/kustomization.yaml new file mode 100644 index 0000000..302d92d --- /dev/null +++ b/manifest/deploy/kustomize/base/kustomization.yaml @@ -0,0 +1,8 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: +- deployment.yaml +- service.yaml + + + diff --git a/manifest/deploy/kustomize/base/service.yaml b/manifest/deploy/kustomize/base/service.yaml new file mode 100644 index 0000000..608771c --- /dev/null +++ b/manifest/deploy/kustomize/base/service.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: template-single +spec: + ports: + - port: 80 + protocol: TCP + targetPort: 8000 + selector: + app: template-single + diff --git a/manifest/deploy/kustomize/overlays/develop/configmap.yaml b/manifest/deploy/kustomize/overlays/develop/configmap.yaml new file mode 100644 index 0000000..3b1d0af --- /dev/null +++ b/manifest/deploy/kustomize/overlays/develop/configmap.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: template-single-configmap +data: + config.yaml: | + server: + address: ":8000" + openapiPath: "/api.json" + swaggerPath: "/swagger" + + logger: + level : "all" + stdout: true diff --git a/manifest/deploy/kustomize/overlays/develop/deployment.yaml b/manifest/deploy/kustomize/overlays/develop/deployment.yaml new file mode 100644 index 0000000..04e4851 --- /dev/null +++ b/manifest/deploy/kustomize/overlays/develop/deployment.yaml @@ -0,0 +1,10 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: template-single +spec: + template: + spec: + containers: + - name : main + image: template-single:develop \ No newline at end of file diff --git a/manifest/deploy/kustomize/overlays/develop/kustomization.yaml b/manifest/deploy/kustomize/overlays/develop/kustomization.yaml new file mode 100644 index 0000000..4731c47 --- /dev/null +++ b/manifest/deploy/kustomize/overlays/develop/kustomization.yaml @@ -0,0 +1,14 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +resources: +- ../../base +- configmap.yaml + +patchesStrategicMerge: +- deployment.yaml + +namespace: default + + + diff --git a/manifest/docker/Dockerfile b/manifest/docker/Dockerfile new file mode 100644 index 0000000..399619e --- /dev/null +++ b/manifest/docker/Dockerfile @@ -0,0 +1,19 @@ +FROM loads/alpine:3.8 + +############################################################################### +# INSTALLATION +############################################################################### + +ENV WORKDIR /app + +ADD resource $WORKDIR/ + +ADD ./bin/linux_amd64/main $WORKDIR/main + +RUN chmod +x $WORKDIR/main + +############################################################################### +# START +############################################################################### +WORKDIR $WORKDIR +CMD ./main diff --git a/manifest/docker/docker.sh b/manifest/docker/docker.sh new file mode 100644 index 0000000..ff393f9 --- /dev/null +++ b/manifest/docker/docker.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# This shell is executed before docker build. + + + + + diff --git a/output.txt b/output.txt new file mode 100644 index 0000000..b3ed4dc --- /dev/null +++ b/output.txt @@ -0,0 +1,15382 @@ +{"tid":"cff3343d-3a4e-42f1-bbbf-310377712b22","bid":"90dfc175-d116-4e3d-acf0-77c03db44d10","timestamp":1743156351133,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":3,"device_list":[{"sn":"4SEDL9C001X8GE","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F5BMD238V00172JR","available_video_number":0,"coexist_video_number_max":2,"camera_list":[]}]}},"gateway":"4SEDL9C001X8GE"} + +{"tid":"d2cbb403-b8ed-4e05-a553-46c0f0670a1f","bid":"9fd75e4a-cb81-4aa0-9163-daa6589a9a01","timestamp":1743156351186,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":3,"device_list":[{"sn":"4SEDL9C001X8GE","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F5BMD238V00172JR","available_video_number":0,"coexist_video_number_max":2,"camera_list":[]}]}},"gateway":"4SEDL9C001X8GE"} + +{"tid":"52b1eae5-cf46-4525-8a82-ea07142c0f6e","bid":"3548e556-a2ec-4877-827b-19e5820357a3","timestamp":1743156351187,"data":{"live_status":[{"video_id":"4SEDL9C001X8GE/165-0-7/normal-0","video_type":"normal","video_quality":4,"status":1,"error_status":0}]},"gateway":"4SEDL9C001X8GE"} + +{"bid":"55679455-80c3-4522-bba2-a942d21f99d5","data":{"mode_code_reason":0},"need_reply":1,"tid":"7b0023c7-23eb-49c4-86ed-db43e3f7767e","timestamp":1743156351187,"gateway":"4SEDL9C001X8GE"} + +{"tid":"9a349367-a2d0-43cd-90b3-d28a3a324838","bid":"eb9b0e6f-5009-4571-9045-1f7ce7f2bfe3","timestamp":1743156351189,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":3,"device_list":[{"sn":"4SEDL9C001X8GE","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F5BMD238V00172JR","available_video_number":0,"coexist_video_number_max":2,"camera_list":[]}]}},"gateway":"4SEDL9C001X8GE"} + +{"bid":"633ce740-771d-4553-aca9-5451d2ac751e","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603103756904602,"left":0.41173645853996277,"right":0.605324387550354,"top":0.40332147479057312},"payload_index":"53-0-0","photo_state":0,"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"zoom_calibrate_farthest_focus_value":179,"zoom_calibrate_nearest_focus_value":220,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":313,"zoom_max_focus_value":240,"zoom_min_focus_value":159}]},"tid":"bfb9956f-ff0c-4a69-94db-6b105b14d977","timestamp":1743156351196,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a3b6d9c3-4695-4a43-ba2c-0e487d8e8656","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603103756904602,"left":0.41173645853996277,"right":0.605324387550354,"top":0.40332147479057312},"payload_index":"53-0-0","photo_state":0,"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"zoom_calibrate_farthest_focus_value":179,"zoom_calibrate_nearest_focus_value":220,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":322,"zoom_iso":4,"zoom_max_focus_value":240,"zoom_min_focus_value":159,"zoom_shutter_speed":31}]},"tid":"a4bbc65c-086f-42b1-aa9d-eb331015b7c9","timestamp":1743156351205,"gateway":"4SEDL9C001X8GE"} + +{"bid":"932efd82-9bfd-4aa9-92d6-5b4bd4d0017c","data":{"control_source":"A","home_latitude":26.173879894620317,"home_longitude":106.29197386053654,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"A","payload_index":"53-0-0","sn":""}],"serious_low_battery_warning_threshold":10},"tid":"a329caf4-73b4-4534-b10c-98c0625dec5d","timestamp":1743156351215,"gateway":"4SEDL9C001X8GE"} + +{"bid":"eb343db1-be60-4c7e-b63f-6eb0fdf90332","data":{"wpmz_version":"1.0.5"},"tid":"61678772-047b-4094-84f1-a33c44304c0f","timestamp":1743156351217,"gateway":"4SEDL9C001X8GE"} + +{"bid":"0854f29a-63da-46a6-a48c-5f2cbe8c958f","data":{"uom_real_name_state":9},"tid":"f351a2e6-51c9-4038-8b4f-3ba67bd54c54","timestamp":1743156351217,"gateway":"4SEDL9C001X8GE"} + +{"bid":"86b4df4c-331d-4fe3-98fe-ab52a8575d99","data":{"control_source":"A","home_latitude":26.173879894620317,"home_longitude":106.29197386053654,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"A","payload_index":"53-0-0","sn":""}],"serious_low_battery_warning_threshold":10},"tid":"b896d1d8-1b23-4155-b123-cb7e463904d4","timestamp":1743156351218,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b239f807-bedb-431e-aa39-90f034b13a9b","data":{"wpmz_version":"1.0.5"},"tid":"3684107f-6630-4302-8ff4-ccbcb175b6bf","timestamp":1743156351219,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4545c40e-fabd-4cdf-801f-f9f0fa8f3d82","data":{"uom_real_name_state":9},"tid":"c8e50c94-28b1-4d2e-bfb8-f5d620fadef3","timestamp":1743156351219,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2be49b64-a7fe-4aed-932f-963f689fd124","data":{"control_source":"A","home_latitude":45836623.610465862,"home_longitude":45836623.610465862,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"A","payload_index":"53-0-0","sn":""}],"serious_low_battery_warning_threshold":10},"tid":"73d3f525-135a-4df3-8f10-46def5f1981c","timestamp":1743156351242,"gateway":"4SEDL9C001X8GE"} + +{"bid":"23b72005-7a20-43f2-883e-dbbe564b9154","data":{"wpmz_version":"1.0.5"},"tid":"0d4a8fd8-4e52-413a-be16-feeef85fe592","timestamp":1743156351243,"gateway":"4SEDL9C001X8GE"} + +{"bid":"585f4ddd-d8bb-4e54-9386-9b7e9725f198","data":{"uom_real_name_state":9},"tid":"b5a98efc-7916-4d2d-8d15-b4dafbe2f576","timestamp":1743156351244,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6d39f5b5-6982-4fea-a9f6-2d7bdb6d72cf","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60308539867401123,"left":0.41163888573646545,"right":0.605226218700409,"top":0.40330320596694946},"payload_index":"53-0-0","photo_state":0,"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":27,"zoom_calibrate_farthest_focus_value":179,"zoom_calibrate_nearest_focus_value":220,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":251,"zoom_iso":4,"zoom_max_focus_value":240,"zoom_min_focus_value":159,"zoom_shutter_speed":31}]},"tid":"7ad125c9-2090-4e13-a189-3e03864e51db","timestamp":1743156351306,"gateway":"4SEDL9C001X8GE"} + +{"bid":"404560f1-aa7a-44bf-bfe5-6832d14696c6","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60305005311965942,"left":0.41176635026931763,"right":0.6053544282913208,"top":0.40326809883117676},"payload_index":"53-0-0","photo_state":0,"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":27,"zoom_calibrate_farthest_focus_value":179,"zoom_calibrate_nearest_focus_value":220,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":279,"zoom_iso":4,"zoom_max_focus_value":240,"zoom_min_focus_value":159,"zoom_shutter_speed":31}]},"tid":"a39279e0-d369-4960-b9d1-c0e1c0009deb","timestamp":1743156351670,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1c0bd8c0-1ef1-4da8-a8a1-80a3b52ff2d9","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60305005311965942,"left":0.41176635026931763,"right":0.6053544282913208,"top":0.40326809883117676},"payload_index":"53-0-0","photo_state":0,"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":27,"zoom_calibrate_farthest_focus_value":179,"zoom_calibrate_nearest_focus_value":220,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":293,"zoom_iso":4,"zoom_max_focus_value":240,"zoom_min_focus_value":159,"zoom_shutter_speed":31}]},"tid":"f10ab101-83ed-4bd6-a10b-70717b91fde6","timestamp":1743156351693,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a96cb2ac-0c6b-4bae-abcf-bbba0e9fb5dc","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"76371c47-b2fd-4922-88d0-794524d9dd34","timestamp":1743156352020,"gateway":"4SEDL9C001X8GE"} + +{"bid":"288f3f36-f969-4cce-918d-987c420baa23","data":{"commander_flight_height":100},"need_reply":1,"tid":"413a4619-0ce3-47d5-99d6-3f14b893ae31","timestamp":1743156352130,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6c6888fd-5420-431e-a17d-bfdf7d3286a8","data":{"offline_map_enable":false},"need_reply":1,"tid":"d9129e27-ac11-40ae-bbbb-5878870d1da8","timestamp":1743156352133,"gateway":"4SEDL9C001X8GE"} + +{"bid":"988d66a7-2af6-4d8e-beed-3604775b48c6","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"f822b096-24c2-4bc2-9cc9-782f89e24ecf","timestamp":1743156352187,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7677b7b8-2f84-49eb-b0e7-71806878fdab","data":{"control_source":"A","home_latitude":45836623.610465862,"home_longitude":45836623.610465862,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"A","payload_index":"53-0-0","sn":"1581F5BMD238V00172JR-0"}],"serious_low_battery_warning_threshold":10},"tid":"ae02c12c-53cb-4d27-b637-da60481277f0","timestamp":1743156352293,"gateway":"4SEDL9C001X8GE"} + +{"bid":"23b21c22-fd7f-4b5c-ac7d-587d0e7efbfc","data":{"wpmz_version":"1.0.5"},"tid":"82ef435e-77ac-4d4f-a09b-5b1e0af4ae44","timestamp":1743156352295,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e6f377d3-676d-454e-9901-ed962f47617c","data":{"uom_real_name_state":9},"tid":"03a894c9-b0d9-43f2-be69-265d0bddfd4f","timestamp":1743156352296,"gateway":"4SEDL9C001X8GE"} + +{"bid":"835d9784-dad8-4463-b562-518a10006a8a","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"5b0b040b-78cd-4007-98ae-2bea49953065","timestamp":1743156352297,"gateway":"4SEDL9C001X8GE"} + +{"tid":"a85e1447-5ec1-456d-bac2-fff03eecbb31","bid":"baffa735-bca1-4e64-9bed-b06105ff90b5","timestamp":1743156352625,"data":{"live_capacity":{"available_video_number":3,"coexist_video_number_max":3,"device_list":[{"sn":"4SEDL9C001X8GE","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F5BMD238V00172JR","available_video_number":2,"coexist_video_number_max":2,"camera_list":[{"camera_index":"39-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]},{"camera_index":"53-0-0","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"wide","switchable_video_types":["normal","wide","zoom","ir"]}]}]}]}},"gateway":"4SEDL9C001X8GE"} + +{"bid":"9ef94839-7d10-4d83-aba5-84407088a853","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094220161438,"left":0.41155749559402466,"right":0.60514432191848755,"top":0.40331199765205383},"payload_index":"53-0-0","photo_state":0,"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":27,"zoom_calibrate_farthest_focus_value":179,"zoom_calibrate_nearest_focus_value":220,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":249,"zoom_iso":4,"zoom_max_focus_value":240,"zoom_min_focus_value":159,"zoom_shutter_speed":30}]},"tid":"c1a82d96-afb6-4075-9c5e-6cbf0649748e","timestamp":1743156352988,"gateway":"4SEDL9C001X8GE"} + +{"bid":"55679455-80c3-4522-bba2-a942d21f99d5","data":{"mode_code_reason":0},"need_reply":1,"tid":"7b0023c7-23eb-49c4-86ed-db43e3f7767e","timestamp":1743156351187,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a96cb2ac-0c6b-4bae-abcf-bbba0e9fb5dc","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"76371c47-b2fd-4922-88d0-794524d9dd34","timestamp":1743156352020,"gateway":"4SEDL9C001X8GE"} + +{"bid":"0b020126-e8c2-4eba-9fde-de36aef73246","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309439897537231,"left":0.41160163283348083,"right":0.60518878698349,"top":0.40331220626831055},"payload_index":"53-0-0","photo_state":0,"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":6,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":179,"zoom_calibrate_nearest_focus_value":220,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":97,"zoom_iso":7,"zoom_max_focus_value":240,"zoom_min_focus_value":159,"zoom_shutter_speed":33}]},"tid":"e0a2800f-4c18-4404-93c1-63e886858fc4","timestamp":1743156354061,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9bf02c71-f6f2-40f5-ad49-6bd2fb802a01","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309439897537231,"left":0.41160163283348083,"right":0.60518878698349,"top":0.40331220626831055},"payload_index":"53-0-0","photo_state":0,"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":6,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":179,"zoom_calibrate_nearest_focus_value":220,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":84,"zoom_iso":7,"zoom_max_focus_value":240,"zoom_min_focus_value":159,"zoom_shutter_speed":33}]},"tid":"dafec8db-1b57-4eeb-9030-a8c5c37b39dc","timestamp":1743156354077,"gateway":"4SEDL9C001X8GE"} + +{"bid":"288f3f36-f969-4cce-918d-987c420baa23","data":{"commander_flight_height":100},"need_reply":1,"tid":"413a4619-0ce3-47d5-99d6-3f14b893ae31","timestamp":1743156352130,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6c6888fd-5420-431e-a17d-bfdf7d3286a8","data":{"offline_map_enable":false},"need_reply":1,"tid":"d9129e27-ac11-40ae-bbbb-5878870d1da8","timestamp":1743156352133,"gateway":"4SEDL9C001X8GE"} + +{"bid":"988d66a7-2af6-4d8e-beed-3604775b48c6","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"f822b096-24c2-4bc2-9cc9-782f89e24ecf","timestamp":1743156352187,"gateway":"4SEDL9C001X8GE"} + +{"bid":"835d9784-dad8-4463-b562-518a10006a8a","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"5b0b040b-78cd-4007-98ae-2bea49953065","timestamp":1743156352297,"gateway":"4SEDL9C001X8GE"} + +{"tid":"3f0972d0-2455-481d-a05b-479d97ffad8f","bid":"431ba867-50e7-4b52-bc3f-c665cd07f95b","timestamp":1743156354878,"data":{"firmware_version":"09.01.0006","compatible_status":0,"firmware_upgrade_status":0},"gateway":"4SEDL9C001X8GE"} + +{"bid":"8464fbce-d297-4798-91c8-198a520f6c3c","data":{"control_source":"A","home_latitude":45836623.610465862,"home_longitude":45836623.610465862,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"A","payload_index":"53-0-0","sn":"1581F5BMD238V00172JR-0"}],"serious_low_battery_warning_threshold":10},"tid":"9c02a951-c8d2-4e72-9bba-8432d7b1d6d5","timestamp":1743156356219,"gateway":"4SEDL9C001X8GE"} + +{"bid":"cf1b0f72-21ca-43b9-bd70-58023c448795","data":{"wpmz_version":"1.0.5"},"tid":"57a29c7a-1f65-4d99-b9af-e669dce594df","timestamp":1743156356220,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d6923e83-4a92-4652-a7ab-d3a5cf2563b0","data":{"uom_real_name_state":9},"tid":"238b85f2-c9e1-4ca0-b137-6d5389dd8010","timestamp":1743156356221,"gateway":"4SEDL9C001X8GE"} + +{"bid":"55679455-80c3-4522-bba2-a942d21f99d5","data":{"mode_code_reason":0},"need_reply":1,"tid":"7b0023c7-23eb-49c4-86ed-db43e3f7767e","timestamp":1743156351187,"gateway":"4SEDL9C001X8GE"} + +{"tid":"03820d6a-5565-4fbd-a5ca-1ecfbc562b2e","bid":"6601b981-889a-480f-a8ed-49282dff4ddb","timestamp":1743156358114,"data":{"live_status":[{"video_id":"1581F5BMD238V00172JR/39-0-7/normal-0","video_type":"normal","video_quality":4,"status":1,"error_status":0},{"video_id":"4SEDL9C001X8GE/165-0-7/normal-0","video_type":"normal","video_quality":4,"status":1,"error_status":0}]},"gateway":"4SEDL9C001X8GE"} + +{"bid":"a96cb2ac-0c6b-4bae-abcf-bbba0e9fb5dc","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"76371c47-b2fd-4922-88d0-794524d9dd34","timestamp":1743156352020,"gateway":"4SEDL9C001X8GE"} + +{"bid":"288f3f36-f969-4cce-918d-987c420baa23","data":{"commander_flight_height":100},"need_reply":1,"tid":"413a4619-0ce3-47d5-99d6-3f14b893ae31","timestamp":1743156352130,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6c6888fd-5420-431e-a17d-bfdf7d3286a8","data":{"offline_map_enable":false},"need_reply":1,"tid":"d9129e27-ac11-40ae-bbbb-5878870d1da8","timestamp":1743156352133,"gateway":"4SEDL9C001X8GE"} + +{"bid":"988d66a7-2af6-4d8e-beed-3604775b48c6","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"f822b096-24c2-4bc2-9cc9-782f89e24ecf","timestamp":1743156352187,"gateway":"4SEDL9C001X8GE"} + +{"bid":"835d9784-dad8-4463-b562-518a10006a8a","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"5b0b040b-78cd-4007-98ae-2bea49953065","timestamp":1743156352297,"gateway":"4SEDL9C001X8GE"} + +{"bid":"55679455-80c3-4522-bba2-a942d21f99d5","data":{"mode_code_reason":0},"need_reply":1,"tid":"7b0023c7-23eb-49c4-86ed-db43e3f7767e","timestamp":1743156351187,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a96cb2ac-0c6b-4bae-abcf-bbba0e9fb5dc","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"76371c47-b2fd-4922-88d0-794524d9dd34","timestamp":1743156352020,"gateway":"4SEDL9C001X8GE"} + +{"bid":"288f3f36-f969-4cce-918d-987c420baa23","data":{"commander_flight_height":100},"need_reply":1,"tid":"413a4619-0ce3-47d5-99d6-3f14b893ae31","timestamp":1743156352130,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6c6888fd-5420-431e-a17d-bfdf7d3286a8","data":{"offline_map_enable":false},"need_reply":1,"tid":"d9129e27-ac11-40ae-bbbb-5878870d1da8","timestamp":1743156352133,"gateway":"4SEDL9C001X8GE"} + +{"bid":"988d66a7-2af6-4d8e-beed-3604775b48c6","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"f822b096-24c2-4bc2-9cc9-782f89e24ecf","timestamp":1743156352187,"gateway":"4SEDL9C001X8GE"} + +{"bid":"835d9784-dad8-4463-b562-518a10006a8a","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"5b0b040b-78cd-4007-98ae-2bea49953065","timestamp":1743156352297,"gateway":"4SEDL9C001X8GE"} + +{"bid":"55679455-80c3-4522-bba2-a942d21f99d5","data":{"mode_code_reason":0},"need_reply":1,"tid":"7b0023c7-23eb-49c4-86ed-db43e3f7767e","timestamp":1743156351187,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a96cb2ac-0c6b-4bae-abcf-bbba0e9fb5dc","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"76371c47-b2fd-4922-88d0-794524d9dd34","timestamp":1743156352020,"gateway":"4SEDL9C001X8GE"} + +{"bid":"288f3f36-f969-4cce-918d-987c420baa23","data":{"commander_flight_height":100},"need_reply":1,"tid":"413a4619-0ce3-47d5-99d6-3f14b893ae31","timestamp":1743156352130,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6c6888fd-5420-431e-a17d-bfdf7d3286a8","data":{"offline_map_enable":false},"need_reply":1,"tid":"d9129e27-ac11-40ae-bbbb-5878870d1da8","timestamp":1743156352133,"gateway":"4SEDL9C001X8GE"} + +{"bid":"988d66a7-2af6-4d8e-beed-3604775b48c6","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"f822b096-24c2-4bc2-9cc9-782f89e24ecf","timestamp":1743156352187,"gateway":"4SEDL9C001X8GE"} + +{"bid":"835d9784-dad8-4463-b562-518a10006a8a","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"5b0b040b-78cd-4007-98ae-2bea49953065","timestamp":1743156352297,"gateway":"4SEDL9C001X8GE"} + +{"bid":"84b782c5-091d-4807-bbc5-e2fd6a6d439e","data":{"current_rth_mode":1},"need_reply":1,"tid":"f8174ec1-af49-4b24-83f5-57d27dd6a22f","timestamp":1743156378124,"gateway":"4SEDL9C001X8GE"} + +{"bid":"95285e0c-7663-43d0-ac8b-eff382ff5a4b","data":{"control_source":"A","home_latitude":26.173879936126269,"home_longitude":106.29197377279797,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"A","payload_index":"53-0-0","sn":"1581F5BMD238V00172JR-0"}],"serious_low_battery_warning_threshold":10},"tid":"065f57e7-e4ba-4611-9a6a-804580311ac5","timestamp":1743156378187,"gateway":"4SEDL9C001X8GE"} + +{"bid":"34fca203-f078-4529-ba8c-77a9fb6cec41","data":{"wpmz_version":"1.0.5"},"tid":"410d688d-9b68-484c-bd39-38efa771f78c","timestamp":1743156378188,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e0d8493e-b43e-4cdc-b0f7-6cb640dbf853","data":{"uom_real_name_state":9},"tid":"541b9286-23b6-43e4-9311-b97b2c3fe6eb","timestamp":1743156378191,"gateway":"4SEDL9C001X8GE"} + +{"bid":"84b782c5-091d-4807-bbc5-e2fd6a6d439e","data":{"current_rth_mode":1},"need_reply":1,"tid":"f8174ec1-af49-4b24-83f5-57d27dd6a22f","timestamp":1743156378124,"gateway":"4SEDL9C001X8GE"} + +{"bid":"55679455-80c3-4522-bba2-a942d21f99d5","data":{"mode_code_reason":0},"need_reply":1,"tid":"7b0023c7-23eb-49c4-86ed-db43e3f7767e","timestamp":1743156351187,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a96cb2ac-0c6b-4bae-abcf-bbba0e9fb5dc","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"76371c47-b2fd-4922-88d0-794524d9dd34","timestamp":1743156352020,"gateway":"4SEDL9C001X8GE"} + +{"bid":"288f3f36-f969-4cce-918d-987c420baa23","data":{"commander_flight_height":100},"need_reply":1,"tid":"413a4619-0ce3-47d5-99d6-3f14b893ae31","timestamp":1743156352130,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6c6888fd-5420-431e-a17d-bfdf7d3286a8","data":{"offline_map_enable":false},"need_reply":1,"tid":"d9129e27-ac11-40ae-bbbb-5878870d1da8","timestamp":1743156352133,"gateway":"4SEDL9C001X8GE"} + +{"bid":"988d66a7-2af6-4d8e-beed-3604775b48c6","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"f822b096-24c2-4bc2-9cc9-782f89e24ecf","timestamp":1743156352187,"gateway":"4SEDL9C001X8GE"} + +{"bid":"835d9784-dad8-4463-b562-518a10006a8a","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"5b0b040b-78cd-4007-98ae-2bea49953065","timestamp":1743156352297,"gateway":"4SEDL9C001X8GE"} + +{"bid":"84b782c5-091d-4807-bbc5-e2fd6a6d439e","data":{"current_rth_mode":1},"need_reply":1,"tid":"f8174ec1-af49-4b24-83f5-57d27dd6a22f","timestamp":1743156378124,"gateway":"4SEDL9C001X8GE"} + +{"bid":"55679455-80c3-4522-bba2-a942d21f99d5","data":{"mode_code_reason":0},"need_reply":1,"tid":"7b0023c7-23eb-49c4-86ed-db43e3f7767e","timestamp":1743156351187,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a96cb2ac-0c6b-4bae-abcf-bbba0e9fb5dc","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"76371c47-b2fd-4922-88d0-794524d9dd34","timestamp":1743156352020,"gateway":"4SEDL9C001X8GE"} + +{"bid":"288f3f36-f969-4cce-918d-987c420baa23","data":{"commander_flight_height":100},"need_reply":1,"tid":"413a4619-0ce3-47d5-99d6-3f14b893ae31","timestamp":1743156352130,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6c6888fd-5420-431e-a17d-bfdf7d3286a8","data":{"offline_map_enable":false},"need_reply":1,"tid":"d9129e27-ac11-40ae-bbbb-5878870d1da8","timestamp":1743156352133,"gateway":"4SEDL9C001X8GE"} + +{"bid":"988d66a7-2af6-4d8e-beed-3604775b48c6","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"f822b096-24c2-4bc2-9cc9-782f89e24ecf","timestamp":1743156352187,"gateway":"4SEDL9C001X8GE"} + +{"bid":"835d9784-dad8-4463-b562-518a10006a8a","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"5b0b040b-78cd-4007-98ae-2bea49953065","timestamp":1743156352297,"gateway":"4SEDL9C001X8GE"} + +{"bid":"84b782c5-091d-4807-bbc5-e2fd6a6d439e","data":{"current_rth_mode":1},"need_reply":1,"tid":"f8174ec1-af49-4b24-83f5-57d27dd6a22f","timestamp":1743156378124,"gateway":"4SEDL9C001X8GE"} + +{"bid":"55679455-80c3-4522-bba2-a942d21f99d5","data":{"mode_code_reason":0},"need_reply":1,"tid":"7b0023c7-23eb-49c4-86ed-db43e3f7767e","timestamp":1743156351187,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a96cb2ac-0c6b-4bae-abcf-bbba0e9fb5dc","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"76371c47-b2fd-4922-88d0-794524d9dd34","timestamp":1743156352020,"gateway":"4SEDL9C001X8GE"} + +{"bid":"288f3f36-f969-4cce-918d-987c420baa23","data":{"commander_flight_height":100},"need_reply":1,"tid":"413a4619-0ce3-47d5-99d6-3f14b893ae31","timestamp":1743156352130,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6c6888fd-5420-431e-a17d-bfdf7d3286a8","data":{"offline_map_enable":false},"need_reply":1,"tid":"d9129e27-ac11-40ae-bbbb-5878870d1da8","timestamp":1743156352133,"gateway":"4SEDL9C001X8GE"} + +{"bid":"988d66a7-2af6-4d8e-beed-3604775b48c6","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"f822b096-24c2-4bc2-9cc9-782f89e24ecf","timestamp":1743156352187,"gateway":"4SEDL9C001X8GE"} + +{"bid":"835d9784-dad8-4463-b562-518a10006a8a","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"5b0b040b-78cd-4007-98ae-2bea49953065","timestamp":1743156352297,"gateway":"4SEDL9C001X8GE"} + +{"bid":"84b782c5-091d-4807-bbc5-e2fd6a6d439e","data":{"current_rth_mode":1},"need_reply":1,"tid":"f8174ec1-af49-4b24-83f5-57d27dd6a22f","timestamp":1743156378124,"gateway":"4SEDL9C001X8GE"} + +{"bid":"55679455-80c3-4522-bba2-a942d21f99d5","data":{"mode_code_reason":0},"need_reply":1,"tid":"7b0023c7-23eb-49c4-86ed-db43e3f7767e","timestamp":1743156351187,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a96cb2ac-0c6b-4bae-abcf-bbba0e9fb5dc","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"76371c47-b2fd-4922-88d0-794524d9dd34","timestamp":1743156352020,"gateway":"4SEDL9C001X8GE"} + +{"bid":"288f3f36-f969-4cce-918d-987c420baa23","data":{"commander_flight_height":100},"need_reply":1,"tid":"413a4619-0ce3-47d5-99d6-3f14b893ae31","timestamp":1743156352130,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6c6888fd-5420-431e-a17d-bfdf7d3286a8","data":{"offline_map_enable":false},"need_reply":1,"tid":"d9129e27-ac11-40ae-bbbb-5878870d1da8","timestamp":1743156352133,"gateway":"4SEDL9C001X8GE"} + +{"bid":"988d66a7-2af6-4d8e-beed-3604775b48c6","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"f822b096-24c2-4bc2-9cc9-782f89e24ecf","timestamp":1743156352187,"gateway":"4SEDL9C001X8GE"} + +{"bid":"835d9784-dad8-4463-b562-518a10006a8a","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"5b0b040b-78cd-4007-98ae-2bea49953065","timestamp":1743156352297,"gateway":"4SEDL9C001X8GE"} + +{"bid":"84b782c5-091d-4807-bbc5-e2fd6a6d439e","data":{"current_rth_mode":1},"need_reply":1,"tid":"f8174ec1-af49-4b24-83f5-57d27dd6a22f","timestamp":1743156378124,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b640e79d-6dd8-49d0-8473-c3b96a639f4f","data":{"control_source":"A","home_latitude":26.173879991479488,"home_longitude":106.29197385061633,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"A","payload_index":"53-0-0","sn":"1581F5BMD238V00172JR-0"}],"serious_low_battery_warning_threshold":10},"tid":"070e2bac-5f2e-426d-b965-2dcede68b538","timestamp":1743156409192,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7b67cde8-7c05-43f9-99d5-e32609d9df4d","data":{"wpmz_version":"1.0.5"},"tid":"48d89abc-79ce-4d7a-93db-58335a74caf1","timestamp":1743156409193,"gateway":"4SEDL9C001X8GE"} + +{"bid":"056785cb-02d7-436a-9225-c7139b2c47d1","data":{"uom_real_name_state":9},"tid":"b3ed6d8c-7496-4c57-a08d-72d055a0e3ae","timestamp":1743156409195,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d98b5e65-9263-4334-a7cc-22e11ab78714","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309427976608276,"left":0.41152286529541016,"right":0.60510939359664917,"top":0.40331205725669861},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":254,"zoom_iso":4,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":29}]},"tid":"d21ad93b-14c3-4f15-9a46-c06aff09414f","timestamp":1743156415865,"gateway":"4SEDL9C001X8GE"} + +{"bid":"855e9652-b73e-4d48-920a-5f8bb204e0d9","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309487581253052,"left":0.41143816709518433,"right":0.60502427816391,"top":0.40331265330314636},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":161,"zoom_iso":4,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":29}]},"tid":"369b5f4b-f3d9-4576-b62c-08d6b8218f37","timestamp":1743156416313,"gateway":"4SEDL9C001X8GE"} + +{"bid":"331aa415-37dc-436c-b06f-cd4e96040a60","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309487581253052,"left":0.41143816709518433,"right":0.60502427816391,"top":0.40331265330314636},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":147,"zoom_iso":4,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":29}]},"tid":"4e9c47f3-1ae4-4f9f-a725-bb58d2fe5079","timestamp":1743156416326,"gateway":"4SEDL9C001X8GE"} + +{"bid":"dfb4e06f-8a6a-420e-954c-8d78b547917b","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603095293045044,"left":0.411334753036499,"right":0.604920268058777,"top":0.4033130407333374},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":192,"zoom_iso":4,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":29}]},"tid":"60306150-b009-4533-a629-b321da22991a","timestamp":1743156416514,"gateway":"4SEDL9C001X8GE"} + +{"bid":"dd656c4c-97a7-48e7-8375-dc4906897fc7","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309600830078125,"left":0.41117054224014282,"right":0.60475504398345947,"top":0.40331381559371948},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":234,"zoom_iso":4,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":30}]},"tid":"7f09d02c-c1eb-4f6c-82bf-cdffe90832e8","timestamp":1743156416803,"gateway":"4SEDL9C001X8GE"} + +{"bid":"71a6bb5a-e357-4379-905c-754ff05b0cf1","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309666395187378,"left":0.41104504466056824,"right":0.60462886095047,"top":0.40331444144248962},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":247,"zoom_iso":4,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":30}]},"tid":"dfea2a1f-678e-4388-8986-012c748a05c3","timestamp":1743156416811,"gateway":"4SEDL9C001X8GE"} + +{"bid":"84b782c5-091d-4807-bbc5-e2fd6a6d439e","data":{"current_rth_mode":1},"need_reply":1,"tid":"f8174ec1-af49-4b24-83f5-57d27dd6a22f","timestamp":1743156378124,"gateway":"4SEDL9C001X8GE"} + +{"bid":"84b782c5-091d-4807-bbc5-e2fd6a6d439e","data":{"current_rth_mode":1},"need_reply":1,"tid":"f8174ec1-af49-4b24-83f5-57d27dd6a22f","timestamp":1743156378124,"gateway":"4SEDL9C001X8GE"} + +{"tid":"8abc1a61-33e8-4813-b4df-ec84e041dd75","bid":"155525dc-9b9b-4e02-9dea-8a73f80865d7","timestamp":1743156433141,"data":{"live_status":[{"video_id":"1581F5BMD238V00172JR/39-0-7/normal-0","video_type":"normal","video_quality":4,"status":1,"error_status":0},{"video_id":"1581F5BMD238V00172JR/53-0-0/normal-0","video_type":"wide","video_quality":4,"status":1,"error_status":0},{"video_id":"4SEDL9C001X8GE/165-0-7/normal-0","video_type":"normal","video_quality":4,"status":1,"error_status":0}]},"gateway":"4SEDL9C001X8GE"} + +{"bid":"84b782c5-091d-4807-bbc5-e2fd6a6d439e","data":{"current_rth_mode":1},"need_reply":1,"tid":"f8174ec1-af49-4b24-83f5-57d27dd6a22f","timestamp":1743156378124,"gateway":"4SEDL9C001X8GE"} + +{"bid":"0e199ef7-9cf0-4fa3-a39c-6cea9bf9dabc","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":196,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"8ec523c5-729a-4e7d-9c32-b4c676d94edf","timestamp":1743156455347,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2ccaf665-05fc-42e8-b77c-063ac11a71e1","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":224,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"d76544b8-0fe1-4b97-a4d9-db5a1ed411d1","timestamp":1743156455606,"gateway":"4SEDL9C001X8GE"} + +{"bid":"122d6238-f132-4963-9bfb-d88607e27d49","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":237,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"2dab05d8-cc93-4c3b-9841-d3efcbd5726e","timestamp":1743156455663,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c14021b0-77c8-45ea-89b9-0cfcb2f07e0d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":183,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"de2698e9-2c63-4a86-b820-a205e210b8a1","timestamp":1743156468858,"gateway":"4SEDL9C001X8GE"} + +{"bid":"812368f5-ca81-4aeb-b12e-daac87acfc7f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":225,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"34c4c399-76ec-4251-ad4a-a77c06377b7c","timestamp":1743156469285,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7571d8ec-ad71-4f7a-985c-601849fbc091","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":238,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"8e514e4a-fd20-445b-94d9-b13260925665","timestamp":1743156469311,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6230190f-258c-4a40-b75c-f1f12dff6a07","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"5b455375-c97e-4061-8851-eadbefd07bae","timestamp":1743156469514,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6a137ff5-9590-45b6-a73d-8af28c66ac90","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":225,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"906f86f4-f4c2-4b0a-8511-7333bedc77d0","timestamp":1743156469810,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e28db557-8ee4-44a2-b4c9-887ac241b5d5","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":238,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"f7fcca0a-ec91-416f-abee-a4d086c6fcb4","timestamp":1743156469843,"gateway":"4SEDL9C001X8GE"} + +{"bid":"74385b9b-40b0-4e8d-8d2c-d1b9f8677c46","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"dbb1c90c-68e6-4caf-97bb-f1d2f72a93fc","timestamp":1743156470102,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5953bd7f-ee0b-49d8-b8cc-cee30b56d764","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":215,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"d4e975d7-cc1d-4af3-b721-0200e7bc758d","timestamp":1743156470352,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7b08760a-8973-4311-9ebc-4c6408f079f4","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":229,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"6518b585-9912-46af-9ed5-924ad4bb6daf","timestamp":1743156470385,"gateway":"4SEDL9C001X8GE"} + +{"bid":"3f7f9e25-860b-41c0-8b28-72c69402d91d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"69ba0df7-1e2b-40f5-a380-7ea286cac539","timestamp":1743156470579,"gateway":"4SEDL9C001X8GE"} + +{"bid":"df2ae986-aa0a-499b-9760-0a13e95e0512","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":219,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"99178085-d25c-4e2a-9818-e36002d4f788","timestamp":1743156470881,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9f704a46-21d7-4889-be82-4cc3d894a946","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":232,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"636ae0c9-7005-4a8b-9722-574f17883165","timestamp":1743156470916,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ed5be127-d354-4457-bd57-fd3cffb95ade","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"92e636e2-5420-4563-821d-108d7f90c33e","timestamp":1743156471138,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f151ba77-4f93-4e45-810c-2b036dbd21d2","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":216,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"8b546959-c0e9-419e-ae86-4373f721539e","timestamp":1743156471398,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6e76cf66-e115-415b-96d9-e0da811ecc2f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":229,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"4699c25b-4a75-4f82-a224-9b297065f08d","timestamp":1743156471434,"gateway":"4SEDL9C001X8GE"} + +{"bid":"fae7e4d2-b2bc-4677-9f50-e0f3de23656e","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"b83d1fce-d6c8-4ad6-8ddf-63a9a2feb3b0","timestamp":1743156471696,"gateway":"4SEDL9C001X8GE"} + +{"bid":"87d0dc89-cb6b-438b-90c2-d85df29b1b49","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":222,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"20dc5d75-6d8c-4333-9f66-29ec3389cd32","timestamp":1743156471962,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c7455fd9-a9a5-47fb-8295-f2290c62c519","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":235,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"b263ffb0-7f91-400e-af8c-16cc639cbb10","timestamp":1743156471994,"gateway":"4SEDL9C001X8GE"} + +{"bid":"72c09d0b-eaaa-443d-b46a-acfbdac0db98","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"f3d8d36e-55c4-4629-859b-267dadc461fc","timestamp":1743156472239,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ebb0b28f-4f0e-4631-9438-cb59a9b8440d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":220,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"42f7e941-fb35-4293-b244-1dc9ea4f416a","timestamp":1743156472506,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f4a48dc6-4ac7-40ed-bd84-9a2a1d2d751d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":233,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"184e53a7-8a40-48e0-98a6-143865fc9fb0","timestamp":1743156472531,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1f70bb13-ffcd-475b-ae04-984502bfad2c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"5396f1a3-22ff-46dd-aee1-3ef2e20f4578","timestamp":1743156472865,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5062d3c6-61c1-40b9-98c0-4fb1ad449401","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":215,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"37d8575a-706e-4e63-a046-04f098defc36","timestamp":1743156473217,"gateway":"4SEDL9C001X8GE"} + +{"bid":"beb7913b-bd09-47ea-b806-bf8d4d843e7d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":229,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"315db2d6-9d5a-4e2e-9d9f-586b514f80ef","timestamp":1743156473251,"gateway":"4SEDL9C001X8GE"} + +{"bid":"aaedc425-cf37-4439-a1bd-70566d5d7305","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"e5dee11f-efa4-48cc-a802-344c5778322e","timestamp":1743156473444,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9f1e2e13-0fa0-416d-99d6-6041839c3a7e","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":223,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"03c2b12d-5f13-4afc-9809-0d463f79b783","timestamp":1743156473697,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f4e854a7-faf9-4f3e-aba3-d0debc0593fc","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":236,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"3835fe8e-bd75-4940-8ed3-27172dcf1868","timestamp":1743156473748,"gateway":"4SEDL9C001X8GE"} + +{"bid":"546f07eb-7ed3-4c0f-bc3b-9abd0a481429","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":183,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"c30c0b83-16a3-4c63-ba08-e20f25cf831c","timestamp":1743156474025,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8230397b-d4ff-4c0a-a27a-7f5307a48f5f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":225,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"7b42937b-0458-4edd-9833-dc3b7d931055","timestamp":1743156474304,"gateway":"4SEDL9C001X8GE"} + +{"bid":"89f16d50-4fb9-4e84-bf99-666e8fa7faba","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":238,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"2dc3ae82-fa3a-499e-a019-736864aa2d47","timestamp":1743156474351,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9f441b95-6bcf-49d8-96c5-d9736e75c8b3","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"e8ebf17a-94ee-484b-88e5-cab190e07bb6","timestamp":1743156474662,"gateway":"4SEDL9C001X8GE"} + +{"bid":"42015bee-cf74-4ad9-853f-17272d63573a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":213,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"bf07b6e2-f21f-4d55-a582-d0c7cfdb7afb","timestamp":1743156474900,"gateway":"4SEDL9C001X8GE"} + +{"bid":"aff13278-df7d-42b5-9d92-9ab4d5ef34bf","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":227,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"33302a60-4baa-4573-b2a6-14aaa1c15d05","timestamp":1743156474929,"gateway":"4SEDL9C001X8GE"} + +{"bid":"273c349a-9ec7-4c82-81de-92c5c832d71e","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"b6cf9cdb-d8df-4df4-8f73-55bf1bcbf132","timestamp":1743156475176,"gateway":"4SEDL9C001X8GE"} + +{"bid":"3e4e4f8b-4592-462e-bd08-0853d260ed61","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":220,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"51ac12c2-fd71-4e0d-acdf-84bcc63eff46","timestamp":1743156475472,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c417b798-2e57-4c52-8c10-7a5d1133843e","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":233,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"d93ec14c-0642-4735-9979-4f74789aeee0","timestamp":1743156475501,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e92704f1-6da0-4ce2-b1bd-632b9650ba73","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"8b398799-4805-467c-a17f-ebd05cfca62e","timestamp":1743156476250,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f5843fad-dffa-484a-afb8-2b9a154f61ca","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":219,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"cb956185-d944-46b4-b19d-3a18a6c3eb3e","timestamp":1743156476533,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8ac8a20b-f2aa-4366-9495-ee5ab8118534","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":232,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"9cd50c97-f0d1-49da-81e1-8dd521a573bd","timestamp":1743156476570,"gateway":"4SEDL9C001X8GE"} + +{"bid":"00baa49d-e9eb-430a-b787-cd6e5960fac2","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"f96d69cb-8cef-4b12-a541-b821e067686f","timestamp":1743156476816,"gateway":"4SEDL9C001X8GE"} + +{"bid":"0e965b2f-b234-4281-bc50-24d740ce8ca0","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":222,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"a39b3468-a0c9-4e85-8817-4dcc99721634","timestamp":1743156477118,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ce31d317-6c2f-462e-a79f-bd4f8b70ad8d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":235,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"5e3ef8a7-7939-4466-8864-2289214905e7","timestamp":1743156477161,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ca8328c2-bd40-42e0-a980-5e98ca9edea1","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"16860c86-1a8a-4e1c-bc53-58cdd6c9f07d","timestamp":1743156477369,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f4ed8c01-f2e0-444f-bad4-2d254e20b70a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":217,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"7cc13491-4292-4bc3-adfc-df87d8951fe2","timestamp":1743156477679,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d73a5155-0b7e-4d75-871b-7395e2aa6b7f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":231,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"f61820fe-ac0c-4f9f-a87e-59a3848d21c2","timestamp":1743156477692,"gateway":"4SEDL9C001X8GE"} + +{"bid":"444c1a47-e5f4-4d7d-b62d-48b34d02db1c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"6705c49e-df4c-486a-a75f-421fe2c5def2","timestamp":1743156478501,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ff25e134-2874-424d-b26b-fed61679104f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":219,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"14892b2a-d35f-4938-9f1a-5fecd354a205","timestamp":1743156478761,"gateway":"4SEDL9C001X8GE"} + +{"bid":"dbe0787d-5733-40d9-9fdf-6f9c8f441bdd","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":233,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"78956ff4-e88c-4431-9133-fb0e62369857","timestamp":1743156478808,"gateway":"4SEDL9C001X8GE"} + +{"bid":"999b9574-5edb-4ec1-9f3e-43b8bc5ee850","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"58ca09c4-973c-454b-9844-16503a42b94d","timestamp":1743156479018,"gateway":"4SEDL9C001X8GE"} + +{"bid":"3e1e9d71-85fe-4c16-9816-579d64920cd3","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":219,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"85bc7185-898d-4e7e-a0a7-ee9304df7550","timestamp":1743156479307,"gateway":"4SEDL9C001X8GE"} + +{"bid":"da6e002a-d299-4b74-b893-64e4726e0bde","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":232,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"9f839478-8925-4ff7-8e5d-b5ab8881de5f","timestamp":1743156479335,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d4d31ece-9ae2-4814-b989-a22a08a279d5","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"a062d38e-d6ce-41de-9c7c-f5aa414c08e6","timestamp":1743156479743,"gateway":"4SEDL9C001X8GE"} + +{"bid":"591a91d5-a824-4106-ba8b-d6dfc3a3e971","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":218,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"b4c75f73-15ae-4775-b388-9a57f3b4f02c","timestamp":1743156480022,"gateway":"4SEDL9C001X8GE"} + +{"bid":"40c7a7bc-f8c3-46df-bb9e-491e2469aa9b","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":231,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"24f0c3ed-beac-4498-b539-f7774a1a279d","timestamp":1743156480035,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9d18ed5a-502e-4cdd-932a-66ebbdefe4e6","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"0b1986cb-a58c-4ea9-82ae-8f481afd3572","timestamp":1743156482923,"gateway":"4SEDL9C001X8GE"} + +{"bid":"3878f0e2-f0ae-445f-83ff-30931f3e4f8c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":220,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"00db15f0-1b29-4e21-a0a7-37d01dc1898a","timestamp":1743156483238,"gateway":"4SEDL9C001X8GE"} + +{"bid":"3a17c09e-bdd5-453e-946b-7db764078b98","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":233,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"cace7fa9-dd17-40bf-8703-38bf7ef8fbaf","timestamp":1743156483249,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2aa41342-59dc-454d-9411-6e5eb36ebc8d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"b82ae5f8-a263-4432-b203-5d19125348a6","timestamp":1743156484171,"gateway":"4SEDL9C001X8GE"} + +{"bid":"02ac31b5-4730-4b14-a0a9-15504ed84733","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":218,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"b790c6ff-d4b4-4a22-aaef-896997e7cfda","timestamp":1743156484479,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c3d171bd-8e0e-4dd1-8064-24f42ed036de","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":231,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"41fd57e2-5638-4ea6-b380-cc12d1ae0201","timestamp":1743156484549,"gateway":"4SEDL9C001X8GE"} + +{"bid":"41ce4dd0-9582-4d09-a9a6-035680c302a9","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"7ec8c45a-f6cc-4780-8d29-5fe70b5aef83","timestamp":1743156486749,"gateway":"4SEDL9C001X8GE"} + +{"bid":"27947f7b-9d4e-42f5-b5a8-e95c6988684f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":220,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"2b69c57d-b837-498c-a3cd-9bab0b2436a2","timestamp":1743156487111,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6fb54b02-0806-469a-b9b1-e570c876d6eb","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":233,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"693e7948-99e5-423a-8f58-fc67cd78dd36","timestamp":1743156487125,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ab72821e-8f76-4adc-9d02-81537db318d9","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"1c0dd058-74c2-42dd-a828-d4f41936aa1d","timestamp":1743156487356,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1aa7b3dc-5159-4626-8131-a6070c256048","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":222,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"75145e0d-33db-4863-848e-0cc8e5a1cbd1","timestamp":1743156487719,"gateway":"4SEDL9C001X8GE"} + +{"bid":"3ffb8ed4-13f8-46a3-b030-b7515ba85a55","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":235,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"7eb5b3ca-dd3b-44a8-8c1b-e31294d260b0","timestamp":1743156487746,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d88b266b-4c37-4cef-b587-294e51830aea","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"f7a2975e-d72a-4519-9a00-7f023fffb56d","timestamp":1743156487955,"gateway":"4SEDL9C001X8GE"} + +{"bid":"959b5a7f-d908-4daa-9bd8-cb39e9deffd7","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":213,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"56cb54c3-8a36-4231-b49c-8d3a1699764d","timestamp":1743156488277,"gateway":"4SEDL9C001X8GE"} + +{"bid":"39aeb57f-0bbf-4882-846f-054eb36210cb","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":227,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"4f0b5d01-7a03-4cdc-9bb7-67b7487bb6e6","timestamp":1743156488320,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d18f19a8-1a35-4518-9b21-bbf02b51341c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"20ac538f-25ef-4b5c-92a0-55d0e97b2d07","timestamp":1743156488609,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e6b741c0-8efa-45ac-b39e-c1509b42fdad","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":221,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"d3fb756f-eff6-4b24-936e-3db22f36cca3","timestamp":1743156488884,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4eaa0269-396a-4bb6-8674-dfe3b132c25b","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":235,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"7a40dd70-6706-4ee3-af5c-5c64721724e1","timestamp":1743156488948,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e755784d-1383-47f4-b8de-1092827d575e","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"ebea17b5-444b-44e2-ab26-a1565f021665","timestamp":1743156489131,"gateway":"4SEDL9C001X8GE"} + +{"bid":"30b7d610-72a7-4e89-9768-b9bc6a972f52","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":224,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"ef9a4de0-75b5-465c-b2e1-0551d7973fd3","timestamp":1743156489455,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2e75bd02-de74-47d8-a8cd-22e24cc60742","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":237,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"db1a20d4-5bbc-4fa3-ad96-7054efe1f151","timestamp":1743156489469,"gateway":"4SEDL9C001X8GE"} + +{"bid":"03621bf1-3b22-4d45-99fb-1f9525f3c525","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"b1120bc4-f2ce-453f-97f6-a1bff7be7e4c","timestamp":1743156489681,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9185eb0f-7dfe-47bc-b093-57379f2f8551","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":224,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"34d46388-8b39-4c44-bdc3-1917ecff29f5","timestamp":1743156489981,"gateway":"4SEDL9C001X8GE"} + +{"bid":"82d99c63-720d-4974-a0db-a538c6d731c0","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":237,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"cfa94aba-aeba-4de1-9e91-8c3aa45bec48","timestamp":1743156490028,"gateway":"4SEDL9C001X8GE"} + +{"bid":"64888c7e-2a5c-4ede-ae33-2b8d637b2286","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"6667f4ab-81ed-410c-af21-956c37684099","timestamp":1743156490220,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7886bf7a-5026-4a93-9554-e8a23c0f48c6","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":220,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"101fe17c-fb7c-4a9c-b676-a7251440b724","timestamp":1743156490477,"gateway":"4SEDL9C001X8GE"} + +{"bid":"275a9f7b-844d-40a2-b42b-b120b4293ef2","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":234,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"47186b7b-9424-4a6c-99fd-6e5ea9cd8282","timestamp":1743156490538,"gateway":"4SEDL9C001X8GE"} + +{"bid":"64e9dc75-d15a-48f0-aff5-e96ea2b66785","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":183,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"e43aed95-d5e8-43b4-a7f3-6ac593f041b7","timestamp":1743156490762,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a5510676-030e-4aeb-8c31-daae93de69ef","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":215,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"f96ebfe3-40aa-4c92-863d-a6733b826161","timestamp":1743156491061,"gateway":"4SEDL9C001X8GE"} + +{"bid":"81e4963a-b26f-4aae-b592-c83b1f8c2618","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":228,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"e7fb3f80-ddcf-42e4-9bab-afcd4d39248e","timestamp":1743156491096,"gateway":"4SEDL9C001X8GE"} + +{"bid":"76ab7732-9eb0-428e-bc30-241763eaf65b","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"dbcc04fe-2cff-4c8a-b7df-2fa906f30ec7","timestamp":1743156491256,"gateway":"4SEDL9C001X8GE"} + +{"bid":"91e0555b-632b-43c3-a067-d2da6b3099e4","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":219,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"0b7755a3-bce4-43a4-b5d9-2fc6dd24944b","timestamp":1743156491527,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e7a28719-612d-455c-9114-c48f3e6239ee","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":232,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"22c9b997-ec94-45f2-b25f-b7b698c4b138","timestamp":1743156491552,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5d717bc8-97b0-41e7-930a-968ca869fdb5","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"77619a40-88cb-4b74-9981-912f64500c90","timestamp":1743156491779,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7b83a134-c32a-4815-8ac8-ed9281d61d81","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":137,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"a654aafb-4da6-462a-b346-96a0df740fa8","timestamp":1743156492325,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6268cc5b-4b08-4a63-b74e-5ae84e93f765","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":124,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"8ed304cb-6656-48ff-8b89-6fff95fcdd1a","timestamp":1743156492351,"gateway":"4SEDL9C001X8GE"} + +{"bid":"afd330a7-f6d4-4565-be35-300b14f772a6","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":182,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"9a82da67-a00f-4094-aa3d-d180d4ad839d","timestamp":1743156492548,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d5deebd9-38ea-452f-851e-619c79c3ef3b","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":226,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"205307a1-4da8-4554-bbbe-4e9abe3858fe","timestamp":1743156492862,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6fb6665a-26ec-4608-a513-085de8031ac8","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":239,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"bc242bec-e708-4c00-91db-53b3539608d4","timestamp":1743156492870,"gateway":"4SEDL9C001X8GE"} + +{"bid":"cae26028-721c-4bbc-9357-bfa306a6f8bb","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"df300057-39ec-4c04-aec1-eabab7572f49","timestamp":1743156493056,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b3b8da6c-5115-4093-91dd-bb4be93c22c8","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":137,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"ca773293-a937-4dda-8aac-fbef745bc51f","timestamp":1743156493606,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a5096136-fb4a-47ac-9743-c79be8de11ec","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":124,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"1c7a5398-063c-428c-93a9-d2df3f4d19d6","timestamp":1743156493627,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f70c1783-b79c-42bc-989a-8a8676be0aa0","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":181,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"37841c6d-298e-4067-a292-679fce8d856a","timestamp":1743156493828,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4662a3c4-63f8-4199-b68b-47e1b5203292","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":225,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"7afd26b0-869e-4330-9584-6c07f5fc45ad","timestamp":1743156494098,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6671e04d-7d95-452e-bd7c-9fabf4efc432","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":239,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"abc84d2f-3be0-4255-9c7c-187ef4c9aba7","timestamp":1743156494123,"gateway":"4SEDL9C001X8GE"} + +{"bid":"01d14205-bc13-492f-a7aa-fe003eb40b40","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"85109547-f5bc-48a0-87b9-4ac3babee77c","timestamp":1743156494321,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b56f969f-c3bb-4331-b31d-c4b6617b8ba0","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":135,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"f7864511-6975-494b-b608-6d8ea98d05f4","timestamp":1743156494857,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d92e2914-99ec-4e3a-9771-8563abed6c4a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":122,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"d1141500-3db1-4002-942d-6a3c2d5778ce","timestamp":1743156494894,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5cf88f67-25f2-4771-b8c8-077b75275fb0","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":181,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"f50aa1c2-e086-4d8d-8eed-01cb625881b4","timestamp":1743156495112,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5ed91c58-e47a-4459-ac40-e86dc8e2d597","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":225,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"794282a7-9c61-4cd8-8fdb-1655cafdae29","timestamp":1743156495359,"gateway":"4SEDL9C001X8GE"} + +{"bid":"31d92468-07da-4cac-8aa3-79cf85dc97a2","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":238,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"baa7a752-0a81-48b5-8bb1-524141f04d73","timestamp":1743156495387,"gateway":"4SEDL9C001X8GE"} + +{"bid":"464c92f8-0b27-4dbf-a79f-7eaaaabeb164","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":183,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"ff4a9f18-ee01-4851-8df6-6774b69d19dd","timestamp":1743156495601,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8a81bf13-3306-4f8c-bd31-3f517cc4eac2","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":136,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"0cb35282-65cd-406f-87ea-9f5e48107408","timestamp":1743156496194,"gateway":"4SEDL9C001X8GE"} + +{"bid":"479bc43f-bfd2-460b-8e1a-5b9a88924da9","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":123,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"a773802a-cf65-439c-b6b9-3ee63233a574","timestamp":1743156496203,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c8f16224-9a66-4724-9922-2777186c264c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":181,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"8a22dfff-ba3a-44f6-b638-a997e97cf5bb","timestamp":1743156496366,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a9f789af-1648-4c89-b903-7e754104ab53","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":221,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"f042ffa6-90df-48d4-b749-1eeadaeffb6b","timestamp":1743156496619,"gateway":"4SEDL9C001X8GE"} + +{"bid":"82d9c124-30ba-4596-ade0-61bb657657b8","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":235,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"b1ecad3a-8a44-429c-98b4-b22fa6c1f8a9","timestamp":1743156496676,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b8aed2e7-ed29-42d6-a99e-a77cd8e4a77b","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":183,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"bced8397-c765-42fe-bf0e-e18f6c009c00","timestamp":1743156496884,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a99302d4-cb0f-44e7-a83e-82838f75eadf","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":137,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"368b8422-92c4-4bf3-8105-f3fa1546f866","timestamp":1743156497445,"gateway":"4SEDL9C001X8GE"} + +{"bid":"bf2c4ecd-e2a5-4d6c-8cab-9fb23c2353e0","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":124,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"6d2187d0-b4f2-4700-99ce-fda9ffdd8b93","timestamp":1743156497478,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8e5b007e-5ef6-4b24-9b84-f03228940564","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":181,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"99ea5be9-7e5c-481e-97c3-4fd19fe88689","timestamp":1743156497684,"gateway":"4SEDL9C001X8GE"} + +{"bid":"3568f01e-3826-4914-bd70-cb58366240c7","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":119,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"e94f159c-2b48-4aae-ade4-ebb516d237ef","timestamp":1743156498281,"gateway":"4SEDL9C001X8GE"} + +{"bid":"164ceb72-fa50-4e51-882d-fb52f49ea9f7","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":121,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"4754d8a4-67ae-47b2-9361-226e845bb9f9","timestamp":1743156498314,"gateway":"4SEDL9C001X8GE"} + +{"bid":"677b3bab-d1d6-4198-9f02-94d67d727ff9","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":182,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"f271c1e8-6419-4593-8ead-9063471c15eb","timestamp":1743156498517,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b91f791c-d67d-4308-9bd2-d6dd20d2af4c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":223,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"d6d11128-98de-438c-9409-cb1f4d8de52f","timestamp":1743156498811,"gateway":"4SEDL9C001X8GE"} + +{"bid":"92cba3a3-9457-49cb-b32b-2f5e53db5e59","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":237,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"ea45dc3d-d77a-4ae5-8fa6-8adcf9e66296","timestamp":1743156498824,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d357af99-918b-42ce-8b5e-7fcf5912a4fc","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":183,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"3cc8b912-1eeb-4a77-85d0-27acce3d08e8","timestamp":1743156505664,"gateway":"4SEDL9C001X8GE"} + +{"bid":"325811f4-604a-477f-b132-6b3bb849b00e","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":141,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"69849800-767d-4cd3-a654-6ac316817d53","timestamp":1743156506182,"gateway":"4SEDL9C001X8GE"} + +{"bid":"30b0d19a-b9b7-43cb-974d-bdbd30ab409d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":127,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"33daa1d5-9a37-48d8-bfb1-804f04434767","timestamp":1743156506206,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9cb92014-bbae-4e2e-bfeb-c0d3da61b287","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":182,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"bc2f939d-cff2-460d-a046-2b7bba2cd162","timestamp":1743156506391,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4b3ede86-717d-4dda-ac3b-a4f5606cf1c3","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":214,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"94bba637-1e39-455e-8ef2-4f612878f2e2","timestamp":1743156506671,"gateway":"4SEDL9C001X8GE"} + +{"bid":"daf772a4-2636-4504-84b2-f30fbc53603c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":226,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"bdb28407-b5d8-4996-b73f-08437625d947","timestamp":1743156506680,"gateway":"4SEDL9C001X8GE"} + +{"bid":"cbeea03d-5adf-49d3-8f1c-39d375992c0f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"e0dab722-2276-4e6c-8025-a70cef5638a0","timestamp":1743156507189,"gateway":"4SEDL9C001X8GE"} + +{"bid":"02529d89-857f-4130-8e34-fa127c7353ea","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":134,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"1f68d345-485f-4180-80cf-bf47e1f217cd","timestamp":1743156507803,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c7d8e8ee-69fb-4bce-acd3-2e1a9a44d174","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":121,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"301e71e1-3518-4352-8bd5-e9c08138aff6","timestamp":1743156507837,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f04fe518-1e6c-42d9-981c-f46ae5c85940","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":188,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"ef7e8fc5-be27-450f-97d8-382d5ca15bc5","timestamp":1743156507990,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7b7f9b5b-53d7-4f58-8896-2351c67ec1c7","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":221,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"8eb0f2f2-e6a1-46fa-926c-30e3a77a13ff","timestamp":1743156508267,"gateway":"4SEDL9C001X8GE"} + +{"bid":"36915256-c2cd-45ed-a65a-a97868138598","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":235,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"9ee4657a-8c18-4781-a3fa-51a1e40f91e3","timestamp":1743156508303,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e0291109-490c-4b11-8e29-82de16dfbde1","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"ae8eb91f-8049-4890-aeea-1c7961949b00","timestamp":1743156508484,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6703d4b9-32f2-4c65-a7f4-31192e083908","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":223,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"62ec621e-5d1f-46de-8d4e-b84ce11bb19d","timestamp":1743156508777,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d6ce4cdf-91a8-406d-a359-3ac1bbc8ad77","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":236,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"0dc7ab59-65cb-4451-a55f-7c255c22fbaf","timestamp":1743156508796,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5ce218e1-fa67-43cf-ac82-f690c99eb892","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"0ef4e2c1-462e-4044-888f-27b43bc7f7fd","timestamp":1743156508997,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d593aee4-e975-433d-8cf0-c0f1887abb05","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":224,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"206c242b-4521-4780-9c36-0860041f8113","timestamp":1743156509294,"gateway":"4SEDL9C001X8GE"} + +{"bid":"075adf17-0a28-425b-bfc2-7ca2b4cde012","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":237,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"1f9f12bd-8ccf-4e8b-b074-4a6a51936670","timestamp":1743156509327,"gateway":"4SEDL9C001X8GE"} + +{"bid":"3c1d6cae-fbd8-42f2-9b2d-275a8aaf0360","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"2716209a-79a4-4957-a1c7-4738fbaec165","timestamp":1743156509532,"gateway":"4SEDL9C001X8GE"} + +{"bid":"373f109e-3532-4780-a1ad-34a3ffdfd43b","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":221,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"c3d0281e-4b13-4040-bdee-8f40de260610","timestamp":1743156509786,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d48086c8-ff2d-4a50-8421-24f833d21dfb","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":235,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"07252fd9-ced1-4e62-b1ce-df58b94bdc23","timestamp":1743156509819,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6f94aecd-c22c-42f8-8f64-fdd2e4a8bf97","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":183,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"4e585506-4bca-40b5-8b52-a666314f9632","timestamp":1743156510073,"gateway":"4SEDL9C001X8GE"} + +{"bid":"eb25f818-3982-4ae8-99d9-7eaa0b2a2359","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":224,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"337125ba-bf2d-48ce-843a-86da8db38747","timestamp":1743156510325,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e65cb701-5d35-41ab-addb-02633f490ba2","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":237,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"eb9eddec-8a43-485a-81a1-e7b9c20f1d41","timestamp":1743156510376,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ec39302f-30e5-4f6f-8d1b-7c7ac89a5ebf","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"230afc63-671e-4166-ba2a-6d60b446cc46","timestamp":1743156510600,"gateway":"4SEDL9C001X8GE"} + +{"bid":"777d7612-1e91-4508-a5aa-42742f8b5d14","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":224,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"1bb0e695-4f49-4509-be1f-b5952e0dd09f","timestamp":1743156510866,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c26b2d89-9e7d-4fc7-b509-c9068309209d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":238,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"eec078ab-55f8-45fc-89e9-63db904d5696","timestamp":1743156510897,"gateway":"4SEDL9C001X8GE"} + +{"bid":"eb78339e-212f-4a2c-855e-d9c18b786f24","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"2cdbb971-488e-453f-a9b2-81f3b1ff73ca","timestamp":1743156511117,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2bdf9b90-28e8-4559-abf0-56d32cee9133","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":145,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"8f2de570-11c8-4a5d-80a5-875c4da8f31e","timestamp":1743156511666,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8e8a0308-0881-45ca-9457-e5d1e86d2605","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":132,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"c44a3476-f79d-4ba3-8539-16be0ce18c8b","timestamp":1743156511728,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2b85eca9-0145-4251-9974-be7c254bafde","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":30,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"c688748a-d05e-483e-b250-11a27012bfa1","timestamp":1743156511896,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6b91dda0-90ed-4a0e-8ddb-aeb201256390","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":136,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"bf1d6f2a-7a01-4e15-96ec-23f17c9fd1e1","timestamp":1743156512478,"gateway":"4SEDL9C001X8GE"} + +{"bid":"0ff78740-6680-4766-9527-36ab1ace6547","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":123,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"ac3ad764-c852-48a6-a552-29d6e9c71d3d","timestamp":1743156512507,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4c78e77c-a0de-4ee6-8f20-3877991c2851","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"7467417d-2f07-4e22-b418-9a1e7f1b2def","timestamp":1743156512746,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2e3924e2-7969-4213-80fe-ea15e57111fd","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":141,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"323ae780-3cf3-401f-bd80-8e88637e7736","timestamp":1743156513341,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6a6c141e-4f9f-49fa-b50c-39b65ef1710d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":127,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"68de13c6-d4a6-4a22-8406-a2958bb4670d","timestamp":1743156513380,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d0c4d5b5-47c2-4d79-b756-fd038c89797e","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":183,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"b28fe1cf-b684-41f0-be18-9f7180cf3ada","timestamp":1743156513561,"gateway":"4SEDL9C001X8GE"} + +{"bid":"00570d27-10ce-419f-b7f5-28e3ee83b340","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":135,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"001c3036-936c-4c26-8da4-f255453f2323","timestamp":1743156514235,"gateway":"4SEDL9C001X8GE"} + +{"bid":"db7c6c34-2a29-4e56-8727-fa43455a439d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":122,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"55c575b7-038f-43bf-9b91-30c0e819e8ef","timestamp":1743156514248,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7b37fdf2-f0b5-48b1-b81a-31d1ea1eaded","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":181,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"d3246e84-0f4b-4dff-9995-1e384eeab2de","timestamp":1743156514471,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7b14517e-ed0c-40ad-9d73-4e46c5bdf2d1","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":139,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"4363e015-aa14-495e-852b-73994b88616f","timestamp":1743156515112,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9def8fb2-afc2-4b4a-8cbf-9737c09d7e13","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":126,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"8129526c-b568-4b0c-a283-37c20f17a1d9","timestamp":1743156515157,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6d040836-7e41-4c03-af53-057ab4d63153","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":180,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"dc66d646-b2a8-4e94-8ddf-7b81a16f7447","timestamp":1743156515424,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7f20eb17-b0bb-4432-a816-a3e26a752979","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":212,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"8a5d7403-bc82-4e93-ab38-fcaa72e1543e","timestamp":1743156515708,"gateway":"4SEDL9C001X8GE"} + +{"bid":"123e5af0-1738-4b09-a740-bf9df16eee7a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":226,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"904e2153-be11-4ee6-9c5b-14e111d31c04","timestamp":1743156515757,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2b403340-c671-4825-b9da-01f226c4407a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":187,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"630f56a5-3b77-4013-900e-3bcd9e50d98d","timestamp":1743156515941,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2f6d84a3-5bd9-4f85-89c8-7cb32ded15f6","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":223,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"673beed8-40db-430f-bcce-6c7fc7a11166","timestamp":1743156516233,"gateway":"4SEDL9C001X8GE"} + +{"bid":"71392e3b-15f1-485a-93eb-f30dcb585381","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":236,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"0c5eb70d-e2f7-4fdd-bb76-77583b4ac800","timestamp":1743156516260,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c5603a6c-ea2d-45ca-8aaa-5b7bfc3d8341","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"aa0e1d99-fef3-45dd-8b03-a2efefc3acbd","timestamp":1743156516569,"gateway":"4SEDL9C001X8GE"} + +{"bid":"fbfe0327-f484-40ba-b397-6258a71c20f6","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":223,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"9630d6c3-e4ec-4b20-82f0-ffe864eb649d","timestamp":1743156516881,"gateway":"4SEDL9C001X8GE"} + +{"bid":"01d87a17-bf7f-49b8-93fd-64379b095287","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":237,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"0b6937cd-3c11-47d5-9e5b-dc3c794e3a08","timestamp":1743156516904,"gateway":"4SEDL9C001X8GE"} + +{"bid":"dffd7c14-e326-4e19-9aaa-c3aea6b85bf7","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"d1e8e5a9-9213-46b3-9092-de26e264b312","timestamp":1743156517174,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a315f29a-59b7-4f90-8fee-7ea0c1051b8a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":213,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"0569ef3e-5d1e-4ce3-8f68-57fd05d4265c","timestamp":1743156517401,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9fa9584d-d706-4a06-8b66-7986fc6f2bee","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":226,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"47af0b42-b28f-47c3-b062-d45d08e47bfa","timestamp":1743156517437,"gateway":"4SEDL9C001X8GE"} + +{"bid":"0f2a47c0-9dcd-46b8-af85-2d56c7a6e988","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":188,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"eb5997a7-31b2-4c43-a223-e3c9768c483b","timestamp":1743156517674,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6e581260-40b7-4f53-878f-892d6249eaa6","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":140,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"8934c910-2cb9-499e-bfab-61e9a4c548fa","timestamp":1743156518226,"gateway":"4SEDL9C001X8GE"} + +{"bid":"3616b147-212e-4eda-b2f3-79b29357b47a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":127,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"f3a7b683-00b1-40e5-b11b-610ccdaf10a1","timestamp":1743156518235,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8a43f248-9b5e-4e3b-a0b9-dfa7e5ee27fe","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":182,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"d0c1ba62-11f3-4de9-be02-d6b2c0547a85","timestamp":1743156518436,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f6dfc131-fab9-4e01-973e-29bb1289a26d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":224,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"d23b9e36-369b-451f-a508-3c2222aef688","timestamp":1743156518732,"gateway":"4SEDL9C001X8GE"} + +{"bid":"0cb605e5-cae0-4ec9-8d4f-dd66db7ec6b9","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":238,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"97793fd1-522d-4cef-8a8e-046c4efbbffe","timestamp":1743156518746,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c1317ac0-9d08-4d85-9471-ec136c88437b","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"f410572a-cbe2-49af-9644-864d2c2192da","timestamp":1743156519024,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e00e0e94-0ad2-40da-8710-bda5edee34fa","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":219,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"079b4e1a-bddf-4ad0-90af-aa4ce03de511","timestamp":1743156519276,"gateway":"4SEDL9C001X8GE"} + +{"bid":"88d4fb64-fbb3-4d99-921b-50c3cddf7499","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":232,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"98c56c19-ec67-4b91-af6b-b930068ccf15","timestamp":1743156519316,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a4b63668-7541-4e8e-8642-946194d00725","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"3dd7dc17-51ec-49be-969b-950989a59d18","timestamp":1743156519606,"gateway":"4SEDL9C001X8GE"} + +{"bid":"510227ec-4922-4a88-9b9f-c4baf9bcc565","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":138,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"1d36301c-59c2-470f-a282-3ad17dceb41a","timestamp":1743156520166,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d2b84b6c-57f9-47c9-8125-19bd2b7b8275","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":125,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"256cde52-b21c-45a2-9874-888e367b09e6","timestamp":1743156520175,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a48e921a-bb8e-4211-a924-d230422430ee","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":181,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"bfcb2aa9-46f8-4864-8c40-ae8bde3ce78b","timestamp":1743156520439,"gateway":"4SEDL9C001X8GE"} + +{"bid":"96aea47d-627a-4480-80e2-f76d7107d215","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":142,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"a152530e-b60d-4f9e-b5bd-8216dc39e693","timestamp":1743156520927,"gateway":"4SEDL9C001X8GE"} + +{"bid":"348aa95e-5b9e-4f67-9e67-d518c1ec82b5","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":129,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"f45046dd-25b3-4d9f-ada4-fbdbd47c0d42","timestamp":1743156520966,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5bea7682-b285-46bf-aca4-4908fa2b9de0","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":182,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"993a123d-24b1-4ccd-8760-c9f09d53b1d7","timestamp":1743156521187,"gateway":"4SEDL9C001X8GE"} + +{"bid":"93e37fc7-496a-41d0-bef2-df7a27672227","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":144,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"65bc56e5-4642-40e3-9266-d98ed5de8825","timestamp":1743156521750,"gateway":"4SEDL9C001X8GE"} + +{"bid":"07da0daf-c357-4b83-9801-a7efd38c4ac3","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":130,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"ab4f9c67-0b0c-4089-b4db-ed8a7e547ca1","timestamp":1743156521758,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8ae9d420-cb9c-4855-b020-47ada4bb0ff3","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":182,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"2c624981-9b35-4461-aa0f-ab20b35c2ea9","timestamp":1743156522001,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1c2a9da2-73c9-42c1-9218-1a3729cf6207","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":143,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"48a10c3e-2af8-4ab2-bca3-4ed8b1c86ad5","timestamp":1743156522532,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d3e1e266-44bf-40ad-ac5b-873ebde7502c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":129,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"64bb3967-dc2b-46b3-8bea-2d00426140fa","timestamp":1743156522593,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7ecb742a-41db-4c3d-8e72-819dd156cac1","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":181,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"84113803-98be-4343-8526-8db1a1c34f7e","timestamp":1743156522759,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7d2a7911-715a-4722-85e3-e11c1434c91c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":217,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"c98cf218-8953-4df8-b2e8-70d0f8a4802b","timestamp":1743156523008,"gateway":"4SEDL9C001X8GE"} + +{"bid":"98ee2bea-600f-4d8b-af76-658a07161b5f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":231,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"fd589b41-8ff8-46cc-9865-8f7ebf22a624","timestamp":1743156523035,"gateway":"4SEDL9C001X8GE"} + +{"bid":"64a5c332-3890-433e-a3f7-d10786d14c30","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":183,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"8f951725-755e-4b93-9984-215d506aeb12","timestamp":1743156523303,"gateway":"4SEDL9C001X8GE"} + +{"bid":"841eb550-6086-4f14-9fcf-5e520eaa5390","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":223,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"d72c91c9-b161-4057-81f7-bd3c995ff758","timestamp":1743156523545,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2da496cb-d1d0-4e69-88f0-998954066d86","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":237,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"6d4ec126-2927-4c04-88b6-bcba397d526d","timestamp":1743156523583,"gateway":"4SEDL9C001X8GE"} + +{"bid":"98369b06-ef0b-4004-a087-f7c2d85226b8","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":183,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"14b4ee60-41c6-4387-b22d-45b84b2d309a","timestamp":1743156523805,"gateway":"4SEDL9C001X8GE"} + +{"bid":"21119108-9b00-4d09-8291-5d4e8b1824fb","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":223,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"b13949df-65f3-4fca-9912-980c0de3635f","timestamp":1743156524078,"gateway":"4SEDL9C001X8GE"} + +{"bid":"581ecfbb-1e65-44eb-b249-06946ea03dc5","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":237,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"89762e29-f947-49d6-a9d1-2b1c658c8996","timestamp":1743156524127,"gateway":"4SEDL9C001X8GE"} + +{"bid":"31d003d5-2256-4809-8759-18a3236e56ac","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"c46ffea2-0d3a-4199-b871-b64404030c2d","timestamp":1743156524308,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2582e455-1e15-4a2f-baf8-43be8dd3ac2d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":222,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"d65d4acd-b34a-4738-b650-ba83a79744d9","timestamp":1743156524580,"gateway":"4SEDL9C001X8GE"} + +{"bid":"71460b32-9036-4d47-93a2-777e01218b0a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":236,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"57c927cb-84d4-48e0-82ac-59ab73d8b2ce","timestamp":1743156524607,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6770ef8b-0b23-497d-9587-a47d7a0c7357","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":183,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"e4cd8f6f-7e04-482e-91dd-312c6f12d1f4","timestamp":1743156524842,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c153eed4-1766-4161-af54-8bb9a0663fb0","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":135,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"24409e55-1c98-436e-bb3f-33f553fb785e","timestamp":1743156525378,"gateway":"4SEDL9C001X8GE"} + +{"bid":"383fc431-6be0-4148-939e-74dd4df5910e","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":121,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"d6f9e096-2e37-4a25-9626-b87d5cdffdf8","timestamp":1743156525404,"gateway":"4SEDL9C001X8GE"} + +{"bid":"730efc8a-96f5-46f0-bea5-cc4a3951c559","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":182,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"a1485f53-ea31-49eb-8fea-4cb7d2bbddcd","timestamp":1743156525669,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6e569890-441f-42c7-a466-b9a87bbf31d0","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":223,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"6c2f06a2-90c1-4ba8-856b-9a3aee183bd9","timestamp":1743156525905,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f46d2df5-33f2-4f8e-ab12-bacec4682ce4","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":237,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"7bc539ec-c408-40d4-b069-b4ad3eac586c","timestamp":1743156525931,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d8906305-23a7-4297-a240-1e608390456e","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"8f9f1e1c-c3ab-43ad-8d0d-30a2864df501","timestamp":1743156526158,"gateway":"4SEDL9C001X8GE"} + +{"bid":"868c203b-5c27-4f84-9e45-3813975841f0","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":135,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"1b89621b-a408-4764-b405-915d7f224b72","timestamp":1743156526677,"gateway":"4SEDL9C001X8GE"} + +{"bid":"fecbed89-98bb-4e1f-a927-001b7d9260c7","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":122,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"75bcb595-711a-4c1e-80a0-eb239d6b941e","timestamp":1743156526760,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2ed097fd-93f9-4434-bf7d-c73eac85684c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":182,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"8a4aba57-169b-4808-bac7-0fbcf5620f69","timestamp":1743156526932,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e4bd162a-a10b-4acd-9552-21181d506a49","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":225,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"70488641-2c53-4c0f-9e7a-950a5d339c0e","timestamp":1743156527232,"gateway":"4SEDL9C001X8GE"} + +{"bid":"05604238-c661-48c3-b9cf-a266406f7900","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":238,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"32771210-77f6-4c38-bb1f-99c0a8819795","timestamp":1743156527242,"gateway":"4SEDL9C001X8GE"} + +{"bid":"85996379-bc15-4901-8fd9-199f749dd34c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"ae9488f3-6f00-4e05-98f5-b6639a4c4d8a","timestamp":1743156527472,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b4581aaa-b17b-4439-94c0-2a243a66e069","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":135,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"14872748-4919-4f5d-9658-a1ad1c2c5001","timestamp":1743156528005,"gateway":"4SEDL9C001X8GE"} + +{"bid":"70a801e5-5b48-40ff-b420-bc555f970d11","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":122,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"422548d5-88b8-4043-88c3-918196a7b525","timestamp":1743156528037,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f5c9e2aa-7d0f-4eb3-ad25-55ed4ce5b107","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":182,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"393f1e5c-4826-43b9-bf15-d19dcd02a624","timestamp":1743156528243,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ed48f225-d1fb-4dc2-839a-93804da2ca91","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":135,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"89a2a79b-12f3-4047-9544-108534a0e343","timestamp":1743156528805,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d344654b-4b69-4b35-b085-c65317d22254","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":121,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"aec836bd-4aac-495f-9b39-5eb06019344e","timestamp":1743156528813,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9a16159c-17b2-4b9f-a66e-b80162e054fb","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":182,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"51cda518-6c8d-4b95-ad6c-54d4ff6e064e","timestamp":1743156529035,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b5d2c9f9-22c8-46c5-ac87-9bba25870474","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":135,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"4d11981a-4562-4f32-8c15-cb8619a0d883","timestamp":1743156529578,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f8287898-08b7-4f53-a44f-82790b24ef4a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":121,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"ccbffe31-79b7-4da7-807b-9e7d28239eea","timestamp":1743156529617,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a8737e76-e069-47d3-95a1-66322b6ac6ed","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":182,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"8646bbbc-ce2e-4a8a-affe-7fa809f72073","timestamp":1743156529809,"gateway":"4SEDL9C001X8GE"} + +{"bid":"fe117219-9cd7-4fe4-8f46-8ab551522d15","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":219,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"b823ebff-adfe-41ae-8f9b-b31856bc9040","timestamp":1743156530165,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8b508019-d1b4-4637-82d7-cd71d0ac317a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":232,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"381bf537-ed3d-4a5b-a2b9-9e5e9d24ab39","timestamp":1743156530179,"gateway":"4SEDL9C001X8GE"} + +{"bid":"bad423d1-79d1-49af-af82-42609fd44a34","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"9166ec2d-6444-4dd3-a212-5bdf3f950c7e","timestamp":1743156530416,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c64bed6c-aa7f-4f1d-93a6-64d916dc175b","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":220,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"07a3a328-d7da-4dfb-83b5-222d504e580b","timestamp":1743156530684,"gateway":"4SEDL9C001X8GE"} + +{"bid":"0038b257-bff1-4630-9f37-9444384c9858","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":234,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"2b2439ea-203d-47e5-815a-b28a48a7d520","timestamp":1743156530754,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e936f36d-7976-4bbc-a912-9709383c6f5f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":183,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"62dc8613-4414-48fa-b1ef-307ebe152287","timestamp":1743156530957,"gateway":"4SEDL9C001X8GE"} + +{"bid":"16005018-8362-4d4b-a0ec-7be3e6533227","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":145,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"1c5675f9-db2b-449f-9e62-8b57f573e02f","timestamp":1743156531453,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5839669d-4a18-4386-a471-762fcda01bf7","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":131,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"cdab8556-f37c-4640-9767-b42dea9e9d32","timestamp":1743156531475,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c678e178-1e9d-4fc8-9e2c-83443bb3e6e7","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"e09359ad-4b74-4aca-9437-eaa91bd7bbc2","timestamp":1743156531726,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9e07ec7d-0652-487d-b761-109f5fafaf0e","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":137,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"a455a8fb-1f3a-4e74-b950-794b437f8d20","timestamp":1743156532255,"gateway":"4SEDL9C001X8GE"} + +{"bid":"27ba29f4-6d79-44c1-96f0-843eda14ee9b","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":124,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"73d39e00-810c-4401-a671-f96e4486ad53","timestamp":1743156532275,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7f2a0242-7aaa-414c-9177-a65dc335285b","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"29951cf5-5f40-4b00-8482-0a009ee84599","timestamp":1743156532514,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9290613c-9cba-4c0d-92f4-b202c924e393","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":138,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"a89405bd-5fc5-49b2-a93b-1b817da8db1b","timestamp":1743156533047,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ddb94af7-4441-44de-9bf6-f1eceb12073c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":125,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"b7376b7c-4f37-4d3a-947c-e197169ddd7e","timestamp":1743156533079,"gateway":"4SEDL9C001X8GE"} + +{"bid":"0ba0670c-0066-4829-b0ef-cb80b36a8c71","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"38430aa3-e2e6-41fc-adef-6de4b98be444","timestamp":1743156533278,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a1f8f6a9-3105-40e6-b601-aa0c92373b1a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":119,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"4e32368b-c0ea-4183-a8e3-2ff0a4afa4ea","timestamp":1743156533886,"gateway":"4SEDL9C001X8GE"} + +{"bid":"0065e0e5-3ecf-4429-8bc0-15442872ce54","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":120,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"33b296a1-6206-4f89-b174-0baebc264133","timestamp":1743156533917,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ec91b021-b8ab-44dd-b025-f5514484c367","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"b5aa2f64-a146-4ba4-852e-3fb57d811f31","timestamp":1743156534168,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f2ca4ae9-4609-4339-a6cf-1f1de064b6e7","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":230,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"5e926c93-ee87-4c56-92d4-0c8d35287d42","timestamp":1743156534669,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c4091af3-1de8-4e82-9f38-a241b509675f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":243,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"1a747441-b95a-446c-ba30-f52145701d3a","timestamp":1743156534737,"gateway":"4SEDL9C001X8GE"} + +{"bid":"42c29904-44f0-4f60-8e05-9a7a9e02e008","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"7f9e8969-cc8d-4cd3-9959-cc6938e3b593","timestamp":1743156534888,"gateway":"4SEDL9C001X8GE"} + +{"bid":"45147e02-cfb2-4f9f-89fa-8cac0770c843","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":222,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":30}]},"tid":"e2c3accf-394f-441d-b310-5783aed2c5b0","timestamp":1743156535180,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5ca981a7-8b83-4162-a9b2-0bd0bbbd6eae","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":236,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"76c1eb51-a522-489c-857e-feea6dc42a93","timestamp":1743156535195,"gateway":"4SEDL9C001X8GE"} + +{"bid":"64cc6230-c967-4478-b84d-2844234ff259","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"49add044-276d-4faa-a5f7-fbed297f1a21","timestamp":1743156535402,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d9e51876-5458-4322-ab7d-d5274dd09137","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":217,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"7d1d8597-9be4-4b46-85c6-cf22ac9a180b","timestamp":1743156535691,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b021d981-5d6b-4950-a570-9701c2c4804a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":230,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"374c754b-c592-4e0c-8fb8-54d8d17a435b","timestamp":1743156535749,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8d936f4c-0ed3-4b6d-8163-2b171e6b8f21","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"743d457f-2335-4bc6-b905-b9fc9da1f723","timestamp":1743156535917,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9ad7342e-b360-41c9-a062-f31f7cd8bf3b","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":224,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"39f05750-9a10-47de-a11c-b4a70d200233","timestamp":1743156536194,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4ecb5326-0fa9-4138-bd1a-7afc1f1b4f36","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":237,"zoom_iso":4,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"a21a558f-e9db-40f6-8e89-e526d891972c","timestamp":1743156536238,"gateway":"4SEDL9C001X8GE"} + +{"bid":"976bd29f-a99a-46a4-89af-b079c4caf3e9","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"79ac550a-a426-4e9c-83de-84102d823848","timestamp":1743156536457,"gateway":"4SEDL9C001X8GE"} + +{"bid":"809dcc88-b1b8-4fd3-8074-c1270dd3d5d8","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":122,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"ede76b2b-9472-48b4-83e9-b5c0de3def66","timestamp":1743156537065,"gateway":"4SEDL9C001X8GE"} + +{"bid":"49b86013-6572-4e03-bed1-3571c3edae4e","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":123,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"98558f11-b8f2-478f-a761-e8ce09a9c1ea","timestamp":1743156537096,"gateway":"4SEDL9C001X8GE"} + +{"bid":"841afcd2-91dd-4a1e-b752-e8de2658df6b","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":192,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"c917a130-5983-469a-a0d0-b432c2d5073f","timestamp":1743156709780,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8a43911a-b282-49e7-ad5a-eb5325db0f36","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":215,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"250245db-7a01-4530-8844-d8582f9869e4","timestamp":1743156710118,"gateway":"4SEDL9C001X8GE"} + +{"bid":"78f1ce97-0cb9-4e63-8168-1fb207610a93","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":228,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"1febfe43-6a71-4a54-a329-2d77d755d289","timestamp":1743156710131,"gateway":"4SEDL9C001X8GE"} + +{"bid":"07406831-04d1-4888-ae81-c659713558f1","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2558,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"1d301079-fe4b-4016-845e-b1118c5161e8","timestamp":1743156714160,"gateway":"4SEDL9C001X8GE"} + +{"bid":"96baca1b-74ab-430f-acae-b57751b445c1","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2558,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":222,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"c49074bd-8b5e-4b7b-893a-7fb7b944f54e","timestamp":1743156714425,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8e2d0369-8e36-4659-b883-2146da98112a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2558,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":236,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"cbf585b5-a6a8-46dd-ad88-de7f29f35d19","timestamp":1743156714506,"gateway":"4SEDL9C001X8GE"} + +{"bid":"87ca4954-96e0-4bef-b772-79ddc0a679b6","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2558,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"eddd3792-ac8b-4c86-b4ec-ea99e76d0b4c","timestamp":1743156714699,"gateway":"4SEDL9C001X8GE"} + +{"bid":"fa6d73ac-b8eb-428f-9dc6-cb54d6e95d09","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2558,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":137,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"653cfbb3-3259-4c6d-a7a6-585298de764d","timestamp":1743156715250,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1c62d883-d29c-4cd1-ba8c-9442f56ef61a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2558,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":124,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"5af25264-077c-4946-bd8b-916b30da8d50","timestamp":1743156715319,"gateway":"4SEDL9C001X8GE"} + +{"bid":"dff6ad89-320f-4fbf-843c-46a84ddc342c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2558,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":181,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"c6c57d4e-b3a8-463a-ac92-d8cd5e26ac46","timestamp":1743156715620,"gateway":"4SEDL9C001X8GE"} + +{"bid":"dbd7dde2-852b-4de7-a383-c4c012663068","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2558,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":222,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"dfcb4794-21b1-469a-be42-19d34457211b","timestamp":1743156715850,"gateway":"4SEDL9C001X8GE"} + +{"bid":"358c3f0f-c6f9-414b-97ba-6acd48f9c3e2","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2558,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":236,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"f21c73ae-6913-46ef-9590-511a2cf6e2b6","timestamp":1743156715889,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7c2b1395-c501-4bc2-87fe-bb2e805b4022","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2558,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"3d199fe7-f13c-4c9a-99f0-46600e0372db","timestamp":1743156716119,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5276ff5f-a81a-4bbe-a279-089a3788dc2b","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2558,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":137,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"ea101bb7-1ee5-4238-bc1e-7e13d96829e7","timestamp":1743156716656,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e86d589a-6e69-4561-9d21-bd4439aa6bab","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2558,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":124,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"3421a5e4-c571-46cc-8ca0-060dd626dd5b","timestamp":1743156716699,"gateway":"4SEDL9C001X8GE"} + +{"bid":"960ddb0c-6152-4f17-ad43-94952ad147a5","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2558,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":189,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"b3052546-d3b4-463c-8bba-5bac69f1e9ce","timestamp":1743156716890,"gateway":"4SEDL9C001X8GE"} + +{"bid":"006e6a45-834f-42e0-95a6-7585d453f674","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2558,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":142,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"27ba8748-cc90-4dca-b6eb-5c97f0c6a620","timestamp":1743156717423,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e1529b2f-0f45-4f24-9a9a-15b62768ac7d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2558,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":128,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"8c833d41-5ed6-45f4-8fb5-ced559748d59","timestamp":1743156717451,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c7179280-ab93-4a00-8c38-1bb23bbab8d6","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2558,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":183,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"0a3ae96e-06b8-4ee6-8e4a-77ba9a1806bd","timestamp":1743156717656,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4993cb1e-5012-4922-8154-f821c90be2de","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2558,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":141,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"1de3061e-ee5a-41af-b3d7-00f7b5d05bb7","timestamp":1743156718206,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4499ff6c-6373-4b4e-8beb-b58f6435f61f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2558,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":128,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"92ec226f-dcaa-43e6-8875-2cd96c1e5ce3","timestamp":1743156718225,"gateway":"4SEDL9C001X8GE"} + +{"bid":"224b5084-6bdd-490e-83d1-855562dc8ce2","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2558,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":182,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"d79613e8-2ed0-4883-913e-da06132d98bc","timestamp":1743156720577,"gateway":"4SEDL9C001X8GE"} + +{"bid":"069c773d-06ce-451e-a76a-6e59815c0305","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2558,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":221,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"c7225119-17a5-4e39-a074-b93ff010cc93","timestamp":1743156720823,"gateway":"4SEDL9C001X8GE"} + +{"bid":"83831322-d809-4eb9-a124-54935625a477","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2558,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":234,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"167ab78d-4f95-48b3-9f30-8755c87779f2","timestamp":1743156720856,"gateway":"4SEDL9C001X8GE"} + +{"bid":"aa49b2c6-208b-465a-8eb0-c54c83e544a0","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2558,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"1533bd6d-b85d-4e8e-b5d5-7d950e7aedff","timestamp":1743156723677,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c7891e65-74ee-43ca-acd1-2ca484751612","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2558,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":145,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"708b874e-a867-4106-a8c6-fa5fcd4b7cd9","timestamp":1743156724188,"gateway":"4SEDL9C001X8GE"} + +{"bid":"fc19d09d-522f-4c5f-b571-342b6c8de230","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2558,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":132,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"55bee4e5-bec4-440f-ac67-97410a91c6e9","timestamp":1743156724220,"gateway":"4SEDL9C001X8GE"} + +{"bid":"555769d7-e72b-4e80-bd58-9e9275c9bc6f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":183,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"0df0304c-137d-4b4e-a74c-e546dc845208","timestamp":1743156737754,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a4ceda7d-57e5-4e9d-a470-d806717edd6d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":222,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"c831612f-64f1-4b52-8303-36f3c4e665e0","timestamp":1743156738046,"gateway":"4SEDL9C001X8GE"} + +{"bid":"583dd988-5eed-4dfe-9d89-6b3c8f657999","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":235,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"a6e393f9-9387-4fae-a2de-e52a568b0945","timestamp":1743156738065,"gateway":"4SEDL9C001X8GE"} + +{"bid":"eaef21cb-70e2-44d3-b0c3-2c2247a55588","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"643993c8-a3ec-4c1a-8adf-3eb5bb789709","timestamp":1743156740019,"gateway":"4SEDL9C001X8GE"} + +{"bid":"3c5812af-434e-4fa2-89c6-4b5c4217ed2a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":217,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"a751d50a-65bf-45bb-abde-0362f5b42099","timestamp":1743156740256,"gateway":"4SEDL9C001X8GE"} + +{"bid":"35893a6a-043a-4aac-b2f3-6de04e94d464","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":230,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"cd963a97-a8e9-45ca-8d9e-f5d52de04418","timestamp":1743156740276,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9d4cc5b0-ee34-4e75-82d9-35957ee15a2d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":190,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"dc3fb7d1-40d7-4e3e-93a3-d45b0a06449a","timestamp":1743156740480,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5899cd11-f55d-484c-9631-a141700c2d9a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":125,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"92076447-5c74-4501-9d72-a8a5a146978c","timestamp":1743156741055,"gateway":"4SEDL9C001X8GE"} + +{"bid":"92948d23-f1f9-4aea-bfd9-68b853164086","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":130,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"d43f843b-f107-41e6-a6a9-d5e159853817","timestamp":1743156741102,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5c2acd81-8abb-4045-bc73-68d754154ee7","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":195,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"5030c557-ee0b-447d-8b72-c4a7102991c1","timestamp":1743156741921,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5d6cf1ca-14e2-40d5-942f-f1566c56c395","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":215,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"d4d38016-b763-4c14-b34d-e50fa8457557","timestamp":1743156742216,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f09a7924-0706-4f49-b2b3-7c6bcbde47f9","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":228,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"8b9b4db6-036e-4672-8c5f-6279a7bf562c","timestamp":1743156742223,"gateway":"4SEDL9C001X8GE"} + +{"bid":"fc219a72-ba2f-4b9b-b54b-cce11ce108fc","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"bc9395e8-e0cf-408c-8b89-6b7829a5670b","timestamp":1743156742429,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2b69fa9d-68d7-4181-b9e7-5755f60e1767","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":138,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"ddfd8728-bbbb-4e70-a438-becb40563ea7","timestamp":1743156742961,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6569d37a-8715-4ff0-97aa-99bb67afa8c5","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":124,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"1b83f208-5037-43db-b927-d788a87df11f","timestamp":1743156742991,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5d1c010c-b27a-4982-bc0f-5197c03519dd","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"35b89459-d623-4123-941f-f2e1167d3b0a","timestamp":1743156743226,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e9ea46e3-4b83-4cb1-b1ae-13f3a679ff8f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":219,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"b98d61e2-fe37-40a3-b27a-4e4a5482a1bf","timestamp":1743156743501,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9ea72085-3509-4e8a-9745-9bd215b26bea","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":233,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"c2a533a8-7098-4736-89e9-bd05d77edbf4","timestamp":1743156743520,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d832177b-2b37-4129-b585-c4af2479b8eb","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":188,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"0469f6a2-49cc-4dd0-ab26-e1ed791cf631","timestamp":1743156743731,"gateway":"4SEDL9C001X8GE"} + +{"bid":"44f134de-a4e7-4ded-b5e4-f5c6030df9ea","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":222,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"7762fc6c-463e-4c50-9e81-fbfdd61c02f6","timestamp":1743156744026,"gateway":"4SEDL9C001X8GE"} + +{"bid":"418e102e-ba9a-44d9-988f-d0f5ecdbeb96","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":235,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"97a423fb-d8b4-41bb-bd05-e9197be8283f","timestamp":1743156744063,"gateway":"4SEDL9C001X8GE"} + +{"bid":"adcbe231-e8f4-46d2-9e0a-a54eac9ef3fd","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":188,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"888fbd65-c9ae-472e-9bba-cfaa983d0ab6","timestamp":1743156744257,"gateway":"4SEDL9C001X8GE"} + +{"bid":"10f5b6dd-da9f-4a11-a60f-0fbdda86570c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":221,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"2d241bf3-2532-47d9-9ae1-4936b55d6a95","timestamp":1743156744576,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d6738593-b598-4f72-8fb2-85d9ca324bd5","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":234,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"6108eaf9-d018-4dd7-9fc4-3e6367da0821","timestamp":1743156744594,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ebe7d142-7691-4894-bf0e-8d2b66a7385a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":187,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"3543030d-5626-46c6-b82c-bc1907ffbf84","timestamp":1743156744822,"gateway":"4SEDL9C001X8GE"} + +{"bid":"73ae1384-cae0-4ed4-b429-95766347297e","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":216,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"377a6ef4-8eb2-402e-89f4-95e3335d4c15","timestamp":1743156745085,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ff7ba678-c980-48a4-8005-4fd132cadded","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":230,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"4a59276d-1fe7-4d37-8b8c-8ec34a2e4168","timestamp":1743156745098,"gateway":"4SEDL9C001X8GE"} + +{"bid":"23a16ad5-da1a-4723-8fee-2f8c628b89c0","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"9e842f52-aeb0-41c4-bae0-df1594cd0d23","timestamp":1743156745372,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1afc21cb-a6fe-427a-9ce9-f2014b6143cf","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":218,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"46b595f1-3771-4c2a-8129-d9667dd1cda1","timestamp":1743156745668,"gateway":"4SEDL9C001X8GE"} + +{"bid":"cacc7b56-1143-43f9-8a3e-111b0a1b933e","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":232,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"98ce6de7-189a-4db2-a3f1-9d48ec6b49ea","timestamp":1743156745676,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ccbefe31-8d93-40bf-80e4-0c2fda2d8a72","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"c6f2f1eb-ddf3-4919-9353-960abad00fbd","timestamp":1743156745894,"gateway":"4SEDL9C001X8GE"} + +{"bid":"013c9433-2e70-49f3-8fc4-29f7b3545854","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":224,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"146552c3-abe6-4743-b259-9e47b3dece4f","timestamp":1743156746166,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6631d7bb-44d6-47ea-b551-31be99a25ab3","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":237,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"29f89d12-3fd6-431c-9498-6cd53ad2b682","timestamp":1743156746220,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b943a1bb-dfe9-407a-a093-a1b9ddc583f5","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"53c11778-0c42-4e14-940e-138b22682ebd","timestamp":1743156746433,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a067ce3a-eb02-49ab-84df-379d6bece729","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":216,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"8ae7cb52-2897-491d-852b-ccc0e324766e","timestamp":1743156746682,"gateway":"4SEDL9C001X8GE"} + +{"bid":"fa220abd-8b8c-4925-86b6-fd0e288a2df3","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":230,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"ffb4efaa-57e2-4c9c-acc5-5e5b4d157c1e","timestamp":1743156746781,"gateway":"4SEDL9C001X8GE"} + +{"bid":"705a3cac-1b75-464e-a282-c5267c70d6a0","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"041c94f7-d62e-49f6-b5f2-dafe44525ff9","timestamp":1743156746923,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c829b486-971e-4d2f-8915-cc045245d462","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":220,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"7fa3ba21-0881-478c-ad36-7a28e7638c56","timestamp":1743156747227,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9349bb1a-c8b5-4fab-90f1-5871053aeeb0","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":234,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"f1c40c3b-6a6d-4361-acf6-a1c67ac5a7eb","timestamp":1743156747235,"gateway":"4SEDL9C001X8GE"} + +{"bid":"82cbf1d2-e945-4bd6-815d-1579f5d12204","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"ea7349f6-6875-4ec9-9b38-83f6e5717b5b","timestamp":1743156747484,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ebf4b85f-d06e-45b7-9897-f56372474596","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":219,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"3fb64df0-f81b-4a98-99e0-15d0cd8013e3","timestamp":1743156747831,"gateway":"4SEDL9C001X8GE"} + +{"bid":"65c83a61-69ca-4303-aaa3-0817fa60523c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":233,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"bd170f8e-a124-4ca6-a8c3-a040ca2990bb","timestamp":1743156747870,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4e2ec544-60f0-42ff-b459-3fe908e9bc0f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"85b14281-d717-4507-afcf-dc2e1075b279","timestamp":1743156748190,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d8428ac5-0de2-4d56-b30c-7e4f9532bff1","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":140,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"04e0b0b2-c756-4d4d-8b5b-7387bd90740a","timestamp":1743156748772,"gateway":"4SEDL9C001X8GE"} + +{"bid":"65d1d08c-8be1-4c1f-aaf5-53b678402574","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":126,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"59480d05-6617-40bd-b597-179c3e691770","timestamp":1743156748800,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b55fdeb1-3951-48d0-9304-9ea1f2e06153","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":182,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"c23f047a-0dd6-4f35-b857-bc427fb2914c","timestamp":1743156749025,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5033ae36-d297-45b1-9700-e42e806ac2aa","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":230,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"7cf237d0-18ba-44b9-98f7-e950cd870794","timestamp":1743156749526,"gateway":"4SEDL9C001X8GE"} + +{"bid":"3db1447d-85de-4983-a918-c6c4ac758fad","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":243,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"e7fb260f-f493-4c8f-8401-565e43ce1293","timestamp":1743156749579,"gateway":"4SEDL9C001X8GE"} + +{"bid":"bac31e30-65cd-4678-847f-51114d65df70","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"c0256a57-68e9-4900-b7a7-13625c33f222","timestamp":1743156749796,"gateway":"4SEDL9C001X8GE"} + +{"bid":"05a178cc-9547-4463-970c-1f4d7b75fb76","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":243,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"9bb6b834-1868-4365-b14e-c6a5638389b4","timestamp":1743156750331,"gateway":"4SEDL9C001X8GE"} + +{"bid":"62e695e9-2db1-40c1-8e37-002364946382","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":249,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"1caed022-0a9a-4764-be0a-11bcddcfc670","timestamp":1743156750368,"gateway":"4SEDL9C001X8GE"} + +{"bid":"acfac633-4176-44fd-9d25-d10ca05ec87f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"aa61c716-b0f8-47aa-9815-170c95dbf2a4","timestamp":1743156750663,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e9a07d06-05d6-43f8-9e3d-b3869d12b13a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":230,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"86dbb01e-24d7-49ca-8629-baa5ba3ac23a","timestamp":1743156751163,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4948e2aa-f30c-45ca-b406-690697d10e46","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":243,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"5ed92991-161e-442d-9fc4-2b5907145c8b","timestamp":1743156751186,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c2a3dca8-4f32-4bd2-974b-b78f7388e4f3","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":187,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"46285345-66de-4b40-9551-83706f18a164","timestamp":1743156751970,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2dc90c37-8e6c-4f15-9ad5-bbf6f75d1756","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":215,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"49650ec4-f015-49af-926e-6415c6b9abd8","timestamp":1743156752300,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b5853833-ad22-4887-ba87-268dd13f8355","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":229,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"864b8eba-14cd-4977-8b1a-661a6c7b91c5","timestamp":1743156752339,"gateway":"4SEDL9C001X8GE"} + +{"bid":"bcfad882-8025-4b2a-9cdc-77c057910976","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":187,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"ec201495-d716-44e1-857b-d996e325c368","timestamp":1743156752565,"gateway":"4SEDL9C001X8GE"} + +{"bid":"43525875-c338-41e6-98ac-94f5a3363997","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":221,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"c3df4696-e8e8-46b1-9471-d693685505a8","timestamp":1743156752827,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8d08a9df-0d39-4b59-a4c3-09c2a55b61a0","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":235,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"53f39748-f29a-45ad-b680-e4776903575a","timestamp":1743156752856,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8c34b48a-4144-4e86-ba17-bd6c29502e66","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"e4982475-bd8f-4de1-b33d-289da4102fb8","timestamp":1743156753062,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4b51c5e7-6b14-4d4c-af5e-15a9512d76ac","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":223,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"3b218b79-0532-4001-a4be-dba7557f695d","timestamp":1743156753325,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8d2d1b6a-3ea6-4522-a04f-11205c6f4df8","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":237,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"f642f607-fc80-478a-8480-cecf28455780","timestamp":1743156753385,"gateway":"4SEDL9C001X8GE"} + +{"bid":"481f7765-bf52-436e-a23e-82bc5e3724ac","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"439e1cb1-5abc-443b-b3a7-188f1cf3e43e","timestamp":1743156753664,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8700e855-8562-4517-86a5-9d87f85491ab","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":224,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"c339af28-4a45-4083-8f78-b049acac8b72","timestamp":1743156753896,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1baadd0a-b3d2-4223-a66b-e6f7e4540705","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":237,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"2cfab344-b032-448c-89e9-5894c6697b5b","timestamp":1743156753929,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1e03736a-d8a3-4332-a9ce-aac19c2c408f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"b13aa92a-d287-455e-bdcb-812e83b5acf3","timestamp":1743156754177,"gateway":"4SEDL9C001X8GE"} + +{"bid":"09fc642e-c361-4d51-8e17-22cd387b4d3e","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":213,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"15850fb8-388e-42f7-afd5-47829379e78e","timestamp":1743156754396,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5f9af55f-188f-4d44-b75d-04a3e1a6b902","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2557,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":227,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"ebe1eff2-e09d-49a8-ae94-df96fb6d70ae","timestamp":1743156754439,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6358a0c2-f7e9-4a7f-95ae-9e69abdae0bf","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"e67262f7-131f-4279-9cb7-5f686e13ac9f","timestamp":1743156771927,"gateway":"4SEDL9C001X8GE"} + +{"bid":"248d44ee-8890-46a5-99f8-67229af174b1","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":145,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"9568d42b-6b10-40c3-b540-91bb0f2299fe","timestamp":1743156772512,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b5e2c7ce-e449-4205-8517-f285460e5765","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":132,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"844cc1e1-6567-4c02-b82b-e79036a1e242","timestamp":1743156772544,"gateway":"4SEDL9C001X8GE"} + +{"bid":"eddf59d0-b6ec-4014-b9ea-84a4a9194b60","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"fcfd70e8-598d-4625-9b99-c6624d248496","timestamp":1743156772739,"gateway":"4SEDL9C001X8GE"} + +{"bid":"cc2cf89e-622e-41c0-a92b-950cade7b871","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":219,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"4e293849-d794-4972-b6b3-cdc7d4ad124c","timestamp":1743156773004,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f7bca8ad-d7ea-4cd2-bd34-3965ca441157","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":233,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"3082e598-5bbb-41c0-888f-685168175eaa","timestamp":1743156773033,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c95a4178-9ebb-49e2-a952-16f52743b8cd","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"5c1042d2-e79c-4208-8eaf-b548601393e1","timestamp":1743156773258,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a3c669bb-c7cf-4763-89a1-2b2ce643e309","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":127,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"84ff68b5-cdc2-475d-b84f-7f0241927d91","timestamp":1743156773822,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7488f5cc-b190-4c86-8617-d46322373a2e","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":118,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"240fade4-f945-487b-a30a-323a662d2978","timestamp":1743156773857,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f049756d-ebf2-4472-ab10-63a6a62a3013","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":182,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"5f851c6c-3310-40a1-9e9a-d3e69270ec35","timestamp":1743156774096,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a0a1c237-7317-4dc2-bd32-0428e19b3abe","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":230,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"5ecc6a6b-3ff8-443e-b41b-fda7cab193c3","timestamp":1743156774602,"gateway":"4SEDL9C001X8GE"} + +{"bid":"acc1a747-92eb-47b1-8a52-ad840f66786d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":243,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"e24956ed-6fad-40b5-86d0-7f7c8a91a990","timestamp":1743156774659,"gateway":"4SEDL9C001X8GE"} + +{"bid":"737a6322-4c8c-4bfa-8a1e-e52c538a6318","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":187,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"1313b968-974d-4d6b-b356-9e0fad296207","timestamp":1743156774886,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2404e56a-2378-476a-9bb4-d7c66f4873d2","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":217,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"371afdb2-366b-47d1-bd1f-70c8a9bc2138","timestamp":1743156775266,"gateway":"4SEDL9C001X8GE"} + +{"bid":"bd859467-34a0-4b33-beb9-4185cd057698","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":230,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"dcb3fec4-676b-4c32-8550-c920aa8f7ac4","timestamp":1743156775297,"gateway":"4SEDL9C001X8GE"} + +{"bid":"cd0ee86d-0781-44e1-9023-4e0f8cd00734","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"7c2a1fde-98de-4263-b8e2-b3f68a1c36eb","timestamp":1743156775535,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4b808688-8e30-410c-9879-cef21bd6da83","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":218,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"58cab338-0c34-4e2d-8338-7dd6341e5eaf","timestamp":1743156775903,"gateway":"4SEDL9C001X8GE"} + +{"bid":"12616272-d5c4-4bfe-a7c5-618d04c2a49d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":231,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"f5554d32-c79b-4885-a65e-939f7ff7886c","timestamp":1743156775933,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2a20ec77-58bb-4aa6-a30c-79253434a09f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"b7daf5be-6410-4606-8a4e-72f874654d36","timestamp":1743156776246,"gateway":"4SEDL9C001X8GE"} + +{"bid":"45ab727f-95e5-4d91-b3c4-318d98bce77f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":224,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"7e61b6f2-2b6e-4294-8475-ecd41febaebd","timestamp":1743156776555,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4eb4d5bd-924b-4c95-a464-33b0e1eadde4","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":237,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"e96baf6b-9c93-4b08-89e2-8c37c303f838","timestamp":1743156776580,"gateway":"4SEDL9C001X8GE"} + +{"bid":"3b9477df-2844-47f4-b8d4-1990655019f2","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"def09288-7c5b-4ecb-9322-06c9b7212b0c","timestamp":1743156776786,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ba6f9611-2ae5-4fb2-8863-ae850aa35b27","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":244,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"fbbd3d96-dfa8-4a96-954e-fd4e9ec5d5e0","timestamp":1743156777287,"gateway":"4SEDL9C001X8GE"} + +{"bid":"69c0f845-debc-4955-98fd-e5be1faacff7","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":253,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"3c994049-7a25-4b43-a3e2-32828b2ece9f","timestamp":1743156777331,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2decf91d-ee4f-452c-9044-e22426e95e44","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"4e0cc7e0-f405-4c9a-b5fb-7edfe7075692","timestamp":1743156777560,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2a3c21b0-1ccb-44bc-bd8a-05009aa206fd","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":243,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"e2b327b0-5be7-47f0-8bb5-02d1ace25d81","timestamp":1743156778105,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c5cebf60-8c61-4a94-b370-96ab894a14bc","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":251,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"256b8725-e46e-40f6-8fff-749da334d055","timestamp":1743156778154,"gateway":"4SEDL9C001X8GE"} + +{"bid":"129874dd-0dcc-4f9c-b5ab-372a88a5be19","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"64b6ab08-0f32-4e5d-8132-ef2eb8b5f6da","timestamp":1743156778358,"gateway":"4SEDL9C001X8GE"} + +{"bid":"69fe2c39-eb73-49fc-8a4b-978a55fe7177","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":244,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"221fe4ac-fd9a-491b-b817-aaddce63ae18","timestamp":1743156778897,"gateway":"4SEDL9C001X8GE"} + +{"bid":"be20d13a-a775-4d74-af81-215c05b66a75","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":253,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"864ce2d1-f3aa-4f47-9d44-e6ba189f3a6b","timestamp":1743156778925,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9b35dcd3-e964-4c62-8fa4-2ea1019d41f9","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"22d97e18-8866-4692-a9cb-87f1713e25e8","timestamp":1743156779151,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6ea1e8f3-b2e0-4d21-a6de-b2d843bb1b91","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":243,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"de04d13e-c636-4553-b69d-dedf85c1bdca","timestamp":1743156779674,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1cded454-fbb6-40a0-9f43-f6378923a344","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":248,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"726be587-e77b-4153-a70b-68f5d2dfafea","timestamp":1743156779729,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e757c0bb-1408-4077-a7d7-972ae0ab21d0","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"514b165c-e59a-4ebf-8fb2-f319d79ecb65","timestamp":1743156779924,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a8994c70-f02f-4916-b9a2-3e6ccd87219d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":243,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"1a29b69f-0e23-45a5-8006-e415ce1a3563","timestamp":1743156780464,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4f00b605-da0e-4ec4-af40-3aafb19a6dc1","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":254,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"6c705f60-30df-4e76-b7f6-89cc21a85268","timestamp":1743156780506,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e51b0ad8-ee60-46c4-a3b7-998ef218f513","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"7b47bc38-d42e-44d0-b576-88a5c158fe9f","timestamp":1743156780733,"gateway":"4SEDL9C001X8GE"} + +{"bid":"191cc955-f083-4087-883a-b4e202d90ab5","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":243,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"c737b40d-fafe-4000-8817-aa0ab0d883e1","timestamp":1743156781271,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d81ef75f-c533-40fd-a46a-b1c4510e6b78","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":246,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"68fd46b8-f24f-44e3-808c-f09d3caf71a6","timestamp":1743156781296,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2362831b-5c38-4449-aa23-200b076548e1","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"155dfa0a-ffaa-4758-af73-0582f8c026cf","timestamp":1743156781500,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5be73992-bd09-47eb-b9e2-51d1728d98a8","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":230,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"793dd703-856d-49c7-bcb0-65beebfca19c","timestamp":1743156782004,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f67ead63-e1ed-46cb-8579-ac2b4eca284a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":244,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"31051630-b0d8-4bb5-b66a-f274b14f9ce5","timestamp":1743156782047,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c4c6df0b-241e-474b-a37b-cd9103b96167","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"6143b49d-2a51-4c33-a9e6-061af730c149","timestamp":1743156782264,"gateway":"4SEDL9C001X8GE"} + +{"bid":"393122bd-fc19-4612-9979-1afadf17f814","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":243,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"772c2e3b-854e-4811-90fc-6fe95bcd2d01","timestamp":1743156782797,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f2857db6-d101-4dfa-b5c9-030ec5d04e85","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":246,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"a32d4709-07ed-450b-8e7d-459d144bc0d2","timestamp":1743156782838,"gateway":"4SEDL9C001X8GE"} + +{"bid":"3a2408cc-dee7-45ff-8b69-01577bb64036","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"e72e315b-5f03-447f-bba2-ef7f6a4c3ce5","timestamp":1743156783298,"gateway":"4SEDL9C001X8GE"} + +{"bid":"dc1f1131-346e-4ba3-a7e6-3ce63da5e9eb","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":243,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"bd1095a2-fca9-464c-9c73-cc4767912f37","timestamp":1743156783842,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8c00609b-f572-4810-a544-df904d696d5d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":251,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"63d6ec88-76bd-4bbb-8500-020343741297","timestamp":1743156783884,"gateway":"4SEDL9C001X8GE"} + +{"bid":"58af527b-7d71-47da-b819-d92117d0bd6f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"c1c1995f-8235-47c4-bd21-ae7e890de63a","timestamp":1743156784251,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f4cea24a-80dc-4b1c-94d8-16213723ca92","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":219,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"ec6d6f5f-afb2-491d-ac7a-725e3e1cf943","timestamp":1743156784545,"gateway":"4SEDL9C001X8GE"} + +{"bid":"607ff71e-a1f7-41bb-81de-2edb6b335467","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":232,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"d34d547b-7f16-446c-8d81-648021257327","timestamp":1743156784581,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6ac482b8-ed39-4e32-9a06-274a69ad3f25","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"6c21c7f6-4425-4e51-a2e3-a2b1abe293cf","timestamp":1743156784816,"gateway":"4SEDL9C001X8GE"} + +{"bid":"720d97d7-3d26-43c8-9410-54d9501c7518","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":223,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"5c19338f-db87-492b-a74f-669a9ed97527","timestamp":1743156785122,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6a83e629-6df3-43b2-9e08-42e5e11c49a0","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2556,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":236,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"6451d2de-980c-403b-b73d-cee78b745f4f","timestamp":1743156785166,"gateway":"4SEDL9C001X8GE"} + +{"bid":"36b2c94d-db77-452a-adea-d6a815670f1a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2555,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"3887fbed-ecbe-4af2-bcc1-c8ab218f3cde","timestamp":1743156805161,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1ff954d1-2ca1-4447-a1c1-bbb63afe5c0a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2555,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":138,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"08ff64c9-96de-4526-9077-77d13e95d5b9","timestamp":1743156805738,"gateway":"4SEDL9C001X8GE"} + +{"bid":"29a5b458-4d93-4e4d-8cbb-58d89a83e0e2","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2555,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":125,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"dbbff192-7e3e-4547-9fe8-5055634ef62b","timestamp":1743156805787,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c9021bab-f854-4102-9bff-7e77c9512eb6","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2555,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":182,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"5729795f-78ce-4148-90d3-941a423fab80","timestamp":1743156805964,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8932ae07-15cc-465f-8f35-8240b8a6b004","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2555,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":223,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"aba6092e-5c5a-40e1-809f-bc78f68b6121","timestamp":1743156806228,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c760dd25-b363-40ce-a6a0-44a30595d09c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2555,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":236,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"2c35d23f-1e7b-4559-af36-ee4f8f991e0a","timestamp":1743156806277,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9af5c5df-ecec-40bc-952a-e5a8a97dfa8d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2555,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"49c1cd14-9927-40a5-a70a-fd943aad7709","timestamp":1743156808038,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4d6ef7c2-a589-49bf-a3d7-a3d76dc604c1","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2555,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":135,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"c0c5116d-d32d-49ef-b049-cfc6eac8e19e","timestamp":1743156808609,"gateway":"4SEDL9C001X8GE"} + +{"bid":"dc0b1188-c416-4c82-8f5a-0bb63d95b9bb","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2555,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":122,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"47792c1d-707c-4cc0-a3e4-23fcd0c56b80","timestamp":1743156808652,"gateway":"4SEDL9C001X8GE"} + +{"bid":"78fe7680-0566-42b4-93dd-00675fafd05a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2555,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"e60bf510-2fe6-4e00-b7ec-63e9214d3009","timestamp":1743156817025,"gateway":"4SEDL9C001X8GE"} + +{"bid":"fdc7beb4-4dc9-424e-bf7b-8cc9b6c41d4c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2555,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":213,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"91f3deda-406b-4b47-8971-2776cb53cf25","timestamp":1743156817346,"gateway":"4SEDL9C001X8GE"} + +{"bid":"65a7115c-6d0b-4d34-bd97-dba077b02e1c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2555,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":226,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"b6b6c1d8-714c-4aa6-82e9-5c64a077298f","timestamp":1743156817429,"gateway":"4SEDL9C001X8GE"} + +{"bid":"be66fe60-81b0-477a-8564-a8ad4c8c043f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"fae944d2-7138-4b65-8e59-7443f713b927","timestamp":1743156857725,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5ffbfae0-1a7a-43f9-af8e-c79665210545","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":212,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"c36174b8-066f-4d56-a5db-62ff79a2f1d9","timestamp":1743156857988,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6cab00d4-27df-42a9-b8f2-230d12475630","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":225,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"4d98e4ef-6b61-438f-99ce-91d9c3e4924d","timestamp":1743156858028,"gateway":"4SEDL9C001X8GE"} + +{"bid":"96dbf038-9233-4d70-b29b-71f67b2030df","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":188,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"d3609f79-4b90-4870-bc69-6eedf5d4fc35","timestamp":1743156858489,"gateway":"4SEDL9C001X8GE"} + +{"bid":"31d59921-fdae-4e06-b035-fd8c4f1bb510","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":215,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"5a362df1-84b2-4729-bd1c-662a666e5faa","timestamp":1743156858755,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a5cf9671-5a61-41f6-9800-31edb1591a42","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":229,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"2ca6c0a2-e1f7-4dcb-835e-44b0ff18e149","timestamp":1743156858783,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b18b190a-eead-4bd6-bb0f-986b32c7c274","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"2e503e16-7544-4113-95c4-bec1cc45ae90","timestamp":1743156859022,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7e177a9e-1905-43d4-86cc-854f75079e53","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":223,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"281c9442-188f-426d-bbe4-679d3bd78ac0","timestamp":1743156859402,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c4f33dcd-1a54-47a2-97aa-789771c07c66","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":236,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"1fd5615f-0f32-422f-9c2f-b177f727e519","timestamp":1743156859462,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b23c58a4-ab91-424a-bace-73b7e344f6c6","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":188,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"1fb0583f-5685-4ae2-9c9c-a8d0a4a69a9b","timestamp":1743156859633,"gateway":"4SEDL9C001X8GE"} + +{"bid":"70552233-2146-4454-88df-1b00db9bf723","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":221,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"a01d4957-017a-4ff3-adc8-e1eae1a3c7fd","timestamp":1743156859921,"gateway":"4SEDL9C001X8GE"} + +{"bid":"3721f117-fbf9-47a7-a6d6-bca1b7be7158","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":234,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"0a73003d-9f8d-4ab6-af2f-6be16439a72e","timestamp":1743156859956,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1cfb5b0a-aa21-419b-98b1-c02fe62e9e8e","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":187,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"d689405a-db95-42f3-b391-e6e4601bad73","timestamp":1743156860460,"gateway":"4SEDL9C001X8GE"} + +{"bid":"eb87d0fd-c595-4982-b950-a3f58b2e98c8","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":223,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"49e572fb-53db-44f7-95f4-6fa31d8e5a18","timestamp":1743156860742,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f2b7eefd-c57b-46fe-b730-55c34be2a894","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":236,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"16af19fb-da78-46ba-997e-1d88d13b8447","timestamp":1743156860758,"gateway":"4SEDL9C001X8GE"} + +{"bid":"96588d5c-08a8-4441-bc00-606b9fafe0ab","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"26487e75-55f3-41d1-8b76-3f628b596ab0","timestamp":1743156860988,"gateway":"4SEDL9C001X8GE"} + +{"bid":"258b76f1-6c28-4759-9b44-8cff922add53","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":211,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"61420211-f374-4f65-886b-f44e7b751aaa","timestamp":1743156861296,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4341cfc0-e5f2-456f-99c2-61b41c59008a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":224,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"b586d197-e70c-4ec3-af9b-db779e43dff3","timestamp":1743156861322,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f765cc54-6ca0-4170-a12e-af43a7b648d8","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":189,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"b6459b4f-3e22-44bd-9772-c195336b3985","timestamp":1743156861640,"gateway":"4SEDL9C001X8GE"} + +{"bid":"331e0b11-6bdc-4f1c-85a9-d0550c6cf4ff","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":212,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"9eab8c84-541d-48d0-a21a-0c3f1aa52048","timestamp":1743156861875,"gateway":"4SEDL9C001X8GE"} + +{"bid":"869da5d9-f150-4dee-a206-7dcd7528cf42","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":225,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"1df461be-5fdc-457b-8a4f-37e5c7713814","timestamp":1743156861912,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7246bd6a-20d3-45b8-a489-492b7d19a95d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":187,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"8faacf17-cd7d-44d3-8cb6-6a83f73b2a97","timestamp":1743156862159,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a7d82022-3820-451e-a894-53518a06bc1d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":230,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"b9174baa-d80d-4236-ac6b-72be1eccb7e6","timestamp":1743156862658,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f0bb150b-f80d-4abe-b931-c2a42a9e9489","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":243,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"7532ebc6-2e5b-4d0e-8c4a-8e4823c9f7cc","timestamp":1743156862693,"gateway":"4SEDL9C001X8GE"} + +{"bid":"43895fab-5747-4444-9514-bf91359c8eae","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":187,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"48267e7d-ad9b-4e2e-8da9-42fbf72e08b7","timestamp":1743156862893,"gateway":"4SEDL9C001X8GE"} + +{"bid":"bd9b674b-9d1d-4593-99b8-d3d1b6303661","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":243,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"952093d3-2345-4900-8cce-11aa04991de6","timestamp":1743156863425,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d50ae768-1db5-4615-9d2d-906404331040","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":248,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"6bc5c189-7d5c-41d3-ad30-ae7a902f05b0","timestamp":1743156863459,"gateway":"4SEDL9C001X8GE"} + +{"bid":"aef09a2a-36a2-4fce-881a-31257cdc5a69","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"714650bc-f1f0-4a64-9165-b4c7a0e3f9e0","timestamp":1743156863703,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c0659a78-06f9-4ba3-aef9-3c57a970dae3","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":230,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"ce500f43-68db-4438-97e2-5a3cffabeff3","timestamp":1743156864206,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c9b83090-0d97-48a2-ae08-3a0d9ab737b7","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":243,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"bfd30753-93ff-45da-9b7c-82d1c3bdef7a","timestamp":1743156864243,"gateway":"4SEDL9C001X8GE"} + +{"bid":"493cc6ea-b191-461f-8394-8123a1b652c2","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"9019547a-2a3e-45bd-90a1-79eac8a0aff9","timestamp":1743156864469,"gateway":"4SEDL9C001X8GE"} + +{"bid":"fe9f76e8-911a-4e9f-93c1-63ecafcd5d9d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":243,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"0b50bd38-14b4-4357-a383-c5587d7f66ea","timestamp":1743156864995,"gateway":"4SEDL9C001X8GE"} + +{"bid":"41f72479-b353-4fd6-a9dd-78cf3743f0e5","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":247,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"35350143-45fd-4cdf-b7f2-2cdda1f5f14f","timestamp":1743156865085,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8bba540a-0ca6-4ce9-bcd2-015946130c6e","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"133b4093-541b-490b-b4fe-3a788ada1e35","timestamp":1743156865225,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9bb671b5-c1f4-45a4-8fee-c4a8ac5623a6","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":243,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"c8a0e866-7430-4d16-b038-f74589823a94","timestamp":1743156865767,"gateway":"4SEDL9C001X8GE"} + +{"bid":"da306160-f0b8-4dc9-809f-ab3a6830fd60","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":248,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"d12740ba-3348-421e-988d-5f76b5a57034","timestamp":1743156865800,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b9ee5a69-d377-44dd-9f98-a952e3c71d6d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":187,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"6660844b-feb8-49b3-a5bf-2d51f0077686","timestamp":1743156866074,"gateway":"4SEDL9C001X8GE"} + +{"bid":"40696dee-8657-4af3-a17b-ac0c32c03bee","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":243,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"2e5d1de3-5039-493b-a67f-dfb4d9905bb0","timestamp":1743156866647,"gateway":"4SEDL9C001X8GE"} + +{"bid":"3b563d17-c68a-46be-8c8f-206ad591618f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":249,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"b7684505-62cb-4f7b-b51c-4385c956feb2","timestamp":1743156866657,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8b0ca628-b948-4ca7-bfdf-907ad15399c6","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"054de360-b96b-46b9-b2a5-923a06f6ce6d","timestamp":1743156866827,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e957a8e0-d343-4411-a4a1-b64296e65d89","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":211,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"9782859c-d83d-45c7-8aa8-b39e3932edbd","timestamp":1743156867107,"gateway":"4SEDL9C001X8GE"} + +{"bid":"fcabfc35-da33-4567-bcaf-cfa5c3aa1a6c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":225,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"1f2e46e3-8688-4ce7-b236-2be06857d9aa","timestamp":1743156867179,"gateway":"4SEDL9C001X8GE"} + +{"bid":"10fa7f20-58ec-4cf0-99e4-3e35ca4fd1cc","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"54bc63d5-41b9-4748-ad07-0e6a5fbfb4d3","timestamp":1743156867377,"gateway":"4SEDL9C001X8GE"} + +{"bid":"17b30cca-9a8f-41de-9a91-3a855d3266e6","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":222,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"697f0485-689a-44d9-a1c0-bb04eb7c2b6f","timestamp":1743156867697,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f1e1fa8f-af9f-485c-8dd5-cfc9482150eb","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":236,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"b8cf88ac-d91f-4a95-800e-6242ed9abe15","timestamp":1743156867716,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6a13b3ff-b5f1-401e-9f38-3aa18ebd5949","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"887ace62-db9d-4394-b739-3b04702a0210","timestamp":1743156867932,"gateway":"4SEDL9C001X8GE"} + +{"bid":"060dfe17-5adb-4fd1-ab62-30218b9289cb","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":133,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"ab38aba8-1f84-40dd-96d0-c51cd654ec9e","timestamp":1743156868483,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8783d982-3f7b-49d6-ac44-cbb7d943a7f3","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":120,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"e019cafb-be94-45b0-a9b6-0f570f257bc0","timestamp":1743156868520,"gateway":"4SEDL9C001X8GE"} + +{"bid":"52dd7429-a9aa-4c71-a6b1-e186e8f34af3","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":182,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"27b382b8-479d-47fe-94a4-32c8843c3087","timestamp":1743156868796,"gateway":"4SEDL9C001X8GE"} + +{"bid":"57f0cf81-4daf-4994-b90e-3b4b0d2b126f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":212,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"671bb4aa-1561-41c9-8b34-c230b7eac513","timestamp":1743156869180,"gateway":"4SEDL9C001X8GE"} + +{"bid":"846104d2-530a-4809-ae54-a8c515a837a8","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":225,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"ad2bd34e-01dd-4795-9b8b-974e8a840ce2","timestamp":1743156869200,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b3e3783a-4c9b-4c1d-b3cc-c2bc74d251ed","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"69f32d75-1ea9-4de9-8713-38d09c05c160","timestamp":1743156869422,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8dc275ac-c1fc-47a9-a7cd-0b8a1905bac0","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":213,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"85680b72-8091-483a-8ae3-0d1d6e620bd1","timestamp":1743156869795,"gateway":"4SEDL9C001X8GE"} + +{"bid":"cdc55817-5242-4aff-87f7-9b43dcc453fb","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":227,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"63ae2b2c-8260-4d37-946f-b7f68299dd5f","timestamp":1743156869816,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f7ae7d2a-139a-40cf-b8b2-6682312aa02f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"28f71d7f-9e36-47d3-b653-79721f89ceaa","timestamp":1743156870052,"gateway":"4SEDL9C001X8GE"} + +{"bid":"399f1577-93cd-4cb5-ba96-11bc6b61be13","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":214,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"e39776f3-241d-4b56-a2c1-f1441a8eb7fb","timestamp":1743156870418,"gateway":"4SEDL9C001X8GE"} + +{"bid":"616e4135-23b7-45ee-b1de-21538b33c077","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":227,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"45b55b72-b35c-4879-bc5a-e39abec8312f","timestamp":1743156870471,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f51465a0-137b-4f87-8861-a3e351015295","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"71d57d42-fb8a-453c-93d8-c3f4f25dce64","timestamp":1743156870722,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2bd766fa-a584-4515-a25a-264c59becdf2","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":222,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"34c83f23-0849-4d00-93f0-4d222623af32","timestamp":1743156871020,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ab469236-baa5-45b9-874d-b5aeb96de864","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":236,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"715f49a3-937d-43ac-a48e-bbc3e13ec4f0","timestamp":1743156871056,"gateway":"4SEDL9C001X8GE"} + +{"bid":"41768f74-9610-42df-9e5c-8e93b8e22ef3","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":187,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"b4ff3a57-8a44-4582-9d79-e3df8bcb1f2c","timestamp":1743156871258,"gateway":"4SEDL9C001X8GE"} + +{"bid":"37d4c2ad-bfe6-40ac-8512-c99168f75048","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":243,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"8b37e9ad-ed76-4b60-bc75-d29f212672ae","timestamp":1743156871815,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d06912f5-e4b5-4397-b673-50d5377cfc6f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":249,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"78e3ada2-99e4-4b1c-ba09-817c56316d22","timestamp":1743156871829,"gateway":"4SEDL9C001X8GE"} + +{"bid":"cb9bb6a2-2f9c-4ef1-8718-e709267e5867","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"8e4707d0-0818-462c-a768-cd64979be5b5","timestamp":1743156872055,"gateway":"4SEDL9C001X8GE"} + +{"bid":"dcf547ee-e93d-4e03-b863-563f2e30ec68","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":243,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"f7848ca1-52e4-4f29-864b-c513b958b8ff","timestamp":1743156872587,"gateway":"4SEDL9C001X8GE"} + +{"bid":"84ec8a7f-f7f6-449f-ac0e-9b9d18a125a0","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":249,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"c0089618-526a-4ec9-ada5-882a55099a0f","timestamp":1743156872676,"gateway":"4SEDL9C001X8GE"} + +{"bid":"bbbe70e3-17b2-4c83-a9e7-e513bff03668","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"1d605e90-ce92-4c67-bfa4-e5ad6f953179","timestamp":1743156872835,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5868fe4a-52fd-4036-b6e4-f70d13c6a0b5","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":230,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"dba10030-58da-4cdd-aea3-ce131fa29d84","timestamp":1743156873335,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5ec0acf5-ed52-4ced-8161-bef313419d5a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":243,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"aa26c176-2657-4c2b-bdaf-43dbb64a7b98","timestamp":1743156873372,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2ebae5e5-ba69-4c54-90ac-1815517e98d7","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"6e0ac494-0727-4203-aaf4-5c9df0306e92","timestamp":1743156873590,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f72715fc-f251-496e-8862-2c95c272c875","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":244,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"5492d8be-97d2-4b74-be9d-d34c5f0d4380","timestamp":1743156874160,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ba6e3bb4-e2aa-4ba7-bf2b-2c90325a6780","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":246,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"819e3b0f-f3c9-4641-9b93-d7143ae37537","timestamp":1743156874186,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6b5598a4-ce61-498d-8152-c8ec9aa7bc55","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"048dafb8-c80e-4cb6-a0b5-3f762b60f5c4","timestamp":1743156874364,"gateway":"4SEDL9C001X8GE"} + +{"bid":"dd49ef8c-12df-430b-a3d4-351172cf253c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":243,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"e4d34ba2-95c4-4488-b789-d23cb3c855ab","timestamp":1743156874901,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f1ed519e-df68-46be-9996-e5337396f561","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":251,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"1893f1ca-3497-4f3f-bb9f-ed4430d9d106","timestamp":1743156874931,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6015e229-98ca-4da5-8120-e8dd17f5d7b2","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"847dac0a-1fdb-4559-b733-b35ae7724282","timestamp":1743156875177,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5245edc9-7569-436f-90cf-9ef661424281","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":244,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"04b82ec3-0a87-4a0b-827a-0d1cfc3ec0d5","timestamp":1743156875699,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9272cfe1-87cb-45ae-ab93-85ee49a14241","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":248,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"ac01f3a9-445d-4130-bbc2-e5f069580ee5","timestamp":1743156875760,"gateway":"4SEDL9C001X8GE"} + +{"bid":"11dcf4ef-19ea-4459-97f4-2a71059ccc72","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"8c0e5b9f-eb6c-4763-b8a3-3d9348264c69","timestamp":1743156875927,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f01d7b52-5543-487a-8086-80f1c3971a39","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":224,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"584b8dfd-bdff-4f38-b779-c3c8fed8ea6b","timestamp":1743156876257,"gateway":"4SEDL9C001X8GE"} + +{"bid":"21040cac-346c-4869-9ac1-07eabaa50d7e","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":237,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"cf5bad6f-1b1b-4a74-af14-caa98bcbf826","timestamp":1743156876266,"gateway":"4SEDL9C001X8GE"} + +{"bid":"bd4e50fb-fb27-4401-a2c0-770c69953db1","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"b1799291-ef70-475f-9f2a-e1820f1fccfc","timestamp":1743156877064,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9a35c12c-e78f-489c-a11a-08d6704fb457","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":243,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"85892bf8-550a-43bf-85d9-6508573949ff","timestamp":1743156877611,"gateway":"4SEDL9C001X8GE"} + +{"bid":"39f16542-f0cf-45f7-9e2b-b58d58ea7c52","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":249,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"7b18fde1-6945-4ce9-a272-912a5fccd9bb","timestamp":1743156877680,"gateway":"4SEDL9C001X8GE"} + +{"bid":"83ae3ddb-ebd6-47f6-8f3a-65900053c0a5","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"1b2ca106-fa73-4fac-9f8e-a6091d858b2d","timestamp":1743156877823,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e5125cb5-2587-4c18-a79a-6d55563878ba","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":221,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"fe4c6f02-f1d6-440e-9231-0b2f54200397","timestamp":1743156878180,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c20ec8c3-ca90-4a79-a3b9-809c0969ec38","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":234,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"912846c0-7334-4a43-a3c4-8fc86bbfeafb","timestamp":1743156878197,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2f6b32d8-fb09-4473-9963-6f5cb8fe689b","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"e75e7801-034a-408a-9e6f-7632ea1ca4bc","timestamp":1743156878394,"gateway":"4SEDL9C001X8GE"} + +{"bid":"06856c81-1120-4538-a652-1d52eb335549","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":223,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"8a8798ea-93b0-4f34-885f-ac64cecf301c","timestamp":1743156878671,"gateway":"4SEDL9C001X8GE"} + +{"bid":"18a074ed-7ef9-4fc3-9ddb-1d77de9ca18b","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":236,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"c715ff38-b27e-4b8f-a84e-9ce13a25cdc5","timestamp":1743156878697,"gateway":"4SEDL9C001X8GE"} + +{"bid":"dcfefa0c-fef4-4f4c-8d70-dfe2ab13287d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"4e0bc9a6-9ec5-4acc-bb99-bb14e1cfd34e","timestamp":1743156879400,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e1000c1e-230b-426e-bc6a-525dec90d436","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":216,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"8e9152ea-d1fd-4054-9358-3ca913cf8804","timestamp":1743156879678,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7a0dad4e-d140-4703-acf5-13f0309e5a9c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2552,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":229,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"3ca44f3e-fe03-4d8e-8cd1-e1df2b7a8eef","timestamp":1743156879699,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6f68bc6f-f6a8-4d15-b500-cec5ccd64a25","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"63d0a006-8865-45fb-820b-e4383786986e","timestamp":1743156890477,"gateway":"4SEDL9C001X8GE"} + +{"bid":"82cd4756-8c81-4b7e-ad97-37bb3ba77fcf","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":222,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"e6674976-4d8e-4958-8584-a89bf045f59c","timestamp":1743156890751,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c1840e37-c47c-4fc5-9739-831e3eeef0c9","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":236,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"87ebe7b9-862e-4833-b661-fa3cbd163b7b","timestamp":1743156890803,"gateway":"4SEDL9C001X8GE"} + +{"bid":"26b58c2f-035f-4be2-9b5e-79a953bfcff5","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":182,"zoom_calibrate_nearest_focus_value":223,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":243,"zoom_min_focus_value":162,"zoom_shutter_speed":31}]},"tid":"4fc61f68-3c21-4173-854e-f882c8203644","timestamp":1743156891047,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a5ed4f3d-6b9c-4aad-ac3c-13616da7c0ee","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":135,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"662ad0d8-b193-42c0-83c5-a948f17138bc","timestamp":1743156891579,"gateway":"4SEDL9C001X8GE"} + +{"bid":"108be49b-f0bf-46ce-9734-1354c3d506e4","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":122,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"bc2297f7-ec3c-4ffd-9931-792a3ec5be49","timestamp":1743156891596,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ebae88bf-5942-42d1-b4ce-c58b6de9bf19","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":182,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"83ba953e-a873-4b57-8264-3db062d2fc1f","timestamp":1743156891839,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a48d19da-3030-4d66-9a43-c73ce84d027a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":135,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"ff706682-a956-4f67-9402-168ce0e7d390","timestamp":1743156892418,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d62c4ac6-f42e-4095-a8da-5c6977138fec","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":121,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"89d91196-35fd-4d93-b5af-23078a51df5c","timestamp":1743156892461,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8ce95c99-b29b-4031-b320-92cbbac07ce8","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"020168c3-35b6-470d-8bc5-757c8ec65d00","timestamp":1743156892884,"gateway":"4SEDL9C001X8GE"} + +{"bid":"bdf41ae5-842d-4224-a2c1-5a768d98539e","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":243,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"b2141ca2-4f59-4ecd-a7d1-b227960cc686","timestamp":1743156893405,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4c885fff-1df7-4501-a182-4195189cde19","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":248,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"395a41f3-24e7-4fe1-b2b7-ecf5c8ca5476","timestamp":1743156893443,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6f3977d5-fd8d-47e4-a193-c3c8730d5cc1","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"237f4649-06dd-4c12-ba68-4ae3c7ed54b9","timestamp":1743156893683,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8465ecfe-765a-4b13-a97a-cac579d0a050","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":230,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"d917fdfb-8e54-40c3-a4c8-60c3b502e456","timestamp":1743156894172,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ea1f792d-97f9-45d6-82cc-83518985f9b8","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":243,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"dc2612d3-ce6d-4acc-bfbb-037f6bb75855","timestamp":1743156894192,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ba4da3b3-a60d-4dd9-bd3c-37528426bf0f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"bca37a9c-be45-459d-a536-6aaa4a9ccec5","timestamp":1743156894413,"gateway":"4SEDL9C001X8GE"} + +{"bid":"823d9648-f06b-45e6-b697-a4595fdd3455","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":243,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"aa6a6b01-f517-4c41-a58c-d1e82f740aa5","timestamp":1743156894958,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a90fabf1-7ef1-4b51-95a6-b4c77df0bfc9","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":249,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"1d5ba70c-2a39-42a2-a399-fc636602e716","timestamp":1743156895000,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2fdc12e3-bb09-45f9-b6ac-102f0f1bec7c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"48a7e191-ec3c-4c63-ad22-3ada31eb3f81","timestamp":1743156895193,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ee7e4316-b322-42f0-91bf-fc85cc135ef1","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":141,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"be0b94e5-9126-40a4-80ed-9f71ad6ce07b","timestamp":1743156895778,"gateway":"4SEDL9C001X8GE"} + +{"bid":"222dcb04-ab49-4ace-9e13-adffe95d4e12","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":128,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"235fda55-cb7b-47cb-a8b4-a4ddd4b6a0b7","timestamp":1743156895817,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8106b6cc-4f06-4c51-805e-53eb63075f74","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":182,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"87c6d0ab-f6f5-4b9e-b2ab-e5c568ae2d6c","timestamp":1743156895985,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d9cb8225-b5ec-47a5-82b3-6fceb0d3d9dd","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":230,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"9345a9e0-e554-4572-b4b7-02892c8baa08","timestamp":1743156896497,"gateway":"4SEDL9C001X8GE"} + +{"bid":"24900e9a-4642-4552-ab15-cff942aff60e","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":244,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"ec12e870-25ce-481e-ac56-51132e1b8a1b","timestamp":1743156896505,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7368c0e0-3a72-4377-88fe-abf54f5c1080","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"6af7c04f-af24-438c-bda5-7b54c18a0a21","timestamp":1743156896742,"gateway":"4SEDL9C001X8GE"} + +{"bid":"78c33ac2-d773-44cc-ab2d-2a9a013708f2","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":220,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"c48ef222-9406-46e2-b3a2-7d749ed45951","timestamp":1743156897047,"gateway":"4SEDL9C001X8GE"} + +{"bid":"23d46b77-1775-4921-adaf-e643f46753a9","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":233,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"b7cc5c9f-6997-4c21-b640-e0eeaa4e4688","timestamp":1743156897114,"gateway":"4SEDL9C001X8GE"} + +{"bid":"73aa63e6-700d-4eb0-a9cf-89a6a340632b","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"b4314a16-401d-455b-933f-15a4fbdf6305","timestamp":1743156897345,"gateway":"4SEDL9C001X8GE"} + +{"bid":"43249b30-654f-4f41-8c43-7cfdf106ca4f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":225,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"7b8870de-7626-4528-9bc0-55ccfca442b2","timestamp":1743156897612,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6c1be832-9754-4e78-b513-4b42513a8386","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":238,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"0b15135c-ed94-4f01-9d7e-75299b71a1ff","timestamp":1743156897663,"gateway":"4SEDL9C001X8GE"} + +{"bid":"dbf437ae-1e58-4be2-92b6-30c7f9da57e7","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"f42a7579-40b1-4e28-8ed1-253024537046","timestamp":1743156897844,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1495ef6f-7ebb-4321-b873-a31ff669cd93","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":223,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"ebf88c32-fb31-4768-bcc3-30d8ae5bf9c2","timestamp":1743156898152,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4b014745-1c45-4489-aefe-58f4440689aa","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":236,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"e4996482-beff-48de-8f6d-5ef02d6c589e","timestamp":1743156898182,"gateway":"4SEDL9C001X8GE"} + +{"bid":"36083d3a-90f2-4574-b3e6-3c7a0e1bd508","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"8de3ba92-f161-43af-b9b4-78f762e055cf","timestamp":1743156898418,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8e091b8a-0923-4f5b-b046-083005e136b9","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":219,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"bcab4b34-1f73-4a81-a2d6-b243bba26a66","timestamp":1743156898729,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4d892a44-6e62-4a6c-9303-9f404670abed","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":233,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"b9dbea2a-7170-4be2-900d-46ce25bfd862","timestamp":1743156898748,"gateway":"4SEDL9C001X8GE"} + +{"bid":"62f1a11f-a6d5-4d37-af8f-0458f005350b","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"2ba33ae9-749f-4a0c-aa2c-8b0a2df23522","timestamp":1743156898925,"gateway":"4SEDL9C001X8GE"} + +{"bid":"db1f82b8-ebec-453c-9aea-3a404b11d494","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":214,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"33526bb0-d522-433f-a45c-65c26fc6e0d0","timestamp":1743156899305,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9fed8345-f3e9-4bb9-99b6-3e11a59b56ab","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":227,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"af1d2ca7-5ee5-4bfc-bfeb-c989c3909ea9","timestamp":1743156899316,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f0027672-886d-41be-b63a-e3cb28f47c71","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"1bb51d33-51a8-4967-8b6d-17535c55b639","timestamp":1743156899571,"gateway":"4SEDL9C001X8GE"} + +{"bid":"fe54fd40-97c2-4f20-a0b6-930cd9c1adaa","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":221,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"c491caa4-5c2d-438f-8d8c-374d7a1bb3e1","timestamp":1743156899848,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ccb6f592-1a1a-45a5-95e9-2eee1b5737fa","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":234,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"86531a47-9648-4fb7-b7c3-5224805e3280","timestamp":1743156899879,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a419db7b-9179-428e-87c1-7f57b44a4b72","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"5758b3ec-4886-4a45-8720-7c0be9e8ff03","timestamp":1743156900110,"gateway":"4SEDL9C001X8GE"} + +{"bid":"0edba89c-1f87-484f-b058-6d76b3c1fe83","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":221,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"8ff821fd-3771-444c-ac39-7af6302be196","timestamp":1743156900450,"gateway":"4SEDL9C001X8GE"} + +{"bid":"3b0c0f4f-cd30-4ac6-af55-a02cf863ea0c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":235,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"ddecdc21-d323-42fd-b32c-92d46e86069a","timestamp":1743156900483,"gateway":"4SEDL9C001X8GE"} + +{"bid":"fcc99158-b758-4e57-8cfc-25ea03c35f22","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"4c3eacdc-852b-4abb-aab0-6f246385827c","timestamp":1743156900684,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c762cd14-8cdb-4f38-bfa4-4b6d579e733a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":223,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"fa4967ad-856c-4738-ba0b-7c47615bcedf","timestamp":1743156900997,"gateway":"4SEDL9C001X8GE"} + +{"bid":"3c9ae49e-b7ce-4793-baaa-faa2c2534835","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":236,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"7833ff64-2173-489b-a7e0-d37190a1feb2","timestamp":1743156901026,"gateway":"4SEDL9C001X8GE"} + +{"bid":"3fbb4d57-2924-43c4-97e0-38e7dabee421","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"64a5b119-26d6-4c5b-ace0-f267b467d059","timestamp":1743156901460,"gateway":"4SEDL9C001X8GE"} + +{"bid":"82b3d27d-67d9-409c-9abb-a338478c1284","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":215,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"d207fd04-042f-478e-8777-763f5a58fcd0","timestamp":1743156901834,"gateway":"4SEDL9C001X8GE"} + +{"bid":"97becf29-e58a-452f-91d6-728e7e99c845","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":228,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"2fbef3d4-6462-4a50-96be-f7cde2d7dfc0","timestamp":1743156901848,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5bfca7ce-044c-4e1c-a97e-67794417cc63","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":185,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"693bece2-18b7-4066-b562-cce243b81332","timestamp":1743156902128,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d133c28f-e572-48b3-836f-7c842a80b2c4","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":152,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"6ea8a504-0ec4-4874-b655-652969d12ee1","timestamp":1743156902515,"gateway":"4SEDL9C001X8GE"} + +{"bid":"99e88179-e6de-491c-a2c6-cd0dd514828e","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":139,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"5d1591b1-df83-4ede-b129-07b232a3ff2c","timestamp":1743156902551,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f060d909-4c88-4abc-be93-ada3820fecd7","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":182,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"047e409c-3148-4eb6-b50d-e3ecd1266ec9","timestamp":1743156902799,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6e6b00bf-7efb-4482-8e0d-0192e6caa881","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":224,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"6518016c-be86-4b61-ad94-46fd73c3e0eb","timestamp":1743156903049,"gateway":"4SEDL9C001X8GE"} + +{"bid":"35bb6367-2bd7-4588-b6a6-eb5371e1b045","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":237,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"0465dbec-6594-4d3c-ae06-78ca5821d7c5","timestamp":1743156903112,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2780b878-4610-407d-b764-c70aab34da01","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"6411937a-860b-4f59-8787-e65719422fc7","timestamp":1743156903282,"gateway":"4SEDL9C001X8GE"} + +{"bid":"76fdf1c6-99fd-4cef-a1bd-69454550658e","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":224,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"eb33e465-97c5-42bf-88c6-b118e4c36bf9","timestamp":1743156903671,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f38ed741-7ce6-4889-b088-157201662e80","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":237,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"1213f57e-9793-4796-a26c-591b9f7eb282","timestamp":1743156903679,"gateway":"4SEDL9C001X8GE"} + +{"bid":"14290df1-cac3-46b1-8159-5d7e290a3829","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":188,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"7df6406e-8ab3-4653-850b-fafa642dcb4b","timestamp":1743156903920,"gateway":"4SEDL9C001X8GE"} + +{"bid":"869913a5-763d-49bc-b9f2-68801e5da636","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":218,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"ae61c0d6-4723-4416-b517-4d151bbf400b","timestamp":1743156904235,"gateway":"4SEDL9C001X8GE"} + +{"bid":"67ee5a2c-1f6e-4e09-8544-712550981df7","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":231,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"a5b8a7d6-1b8a-4b7f-99a0-61ab2a40cf3c","timestamp":1743156904260,"gateway":"4SEDL9C001X8GE"} + +{"bid":"028480c0-cbcf-4f3c-b382-26845426e14f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"bbbe8770-e556-4efe-9dd8-c07f031968e5","timestamp":1743156904457,"gateway":"4SEDL9C001X8GE"} + +{"bid":"187ad820-e81d-4b88-a0db-3b443f4ceaa6","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":221,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"33d2dd50-78a3-4257-afd8-84791e45212a","timestamp":1743156904734,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7f27e6b1-73c4-4bad-b922-5b906fab9e69","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":234,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"60ef83f7-7960-420a-9286-544fd364a060","timestamp":1743156904789,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e05eab0c-41ad-48be-a591-fa64e67cd005","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"ee94f189-641b-4d61-9867-c7215e3f74a8","timestamp":1743156905150,"gateway":"4SEDL9C001X8GE"} + +{"bid":"fb19bf6f-5329-43ea-a9b9-57c642931fff","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":137,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"98c3041b-9d8c-4430-a0b0-265e5a4a8d69","timestamp":1743156905696,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d1b21384-8ac1-4ac2-927d-747baf175905","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":124,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"189a7335-4c7d-4519-af48-ed090c411dcf","timestamp":1743156905735,"gateway":"4SEDL9C001X8GE"} + +{"bid":"604473b3-a958-4c74-9547-a68a73fc2f3f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":183,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"abe1eead-c8b1-44e1-a07f-29f7e8c1c8a6","timestamp":1743156905933,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1069bc70-32df-4073-a528-8e61996446ad","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":222,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"48940b98-d4d0-4061-aa60-9f95e80fc020","timestamp":1743156906229,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a7350369-3fa0-4acc-b30b-379b24f983ec","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":235,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"79ff9866-f70c-4e65-84cf-e7ba6f6d1483","timestamp":1743156906256,"gateway":"4SEDL9C001X8GE"} + +{"bid":"50d9a526-cefd-4f50-8922-a62816c311fe","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":186,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"6d146cc8-896e-499a-a03b-be3809e8750e","timestamp":1743156906477,"gateway":"4SEDL9C001X8GE"} + +{"bid":"118a0b5a-469b-47f6-b9ac-1a937f6c8505","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":217,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"41b1748a-8a64-4a36-a79f-d69272bc0418","timestamp":1743156906879,"gateway":"4SEDL9C001X8GE"} + +{"bid":"3b4b5e5b-df55-43ba-8ef3-3739d378c6e8","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":230,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"35087aff-57f0-48a4-b60e-000e873b70f9","timestamp":1743156906924,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9c45cb9d-299b-4821-8c83-58534c0547a2","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":184,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"4237ff1d-dee6-4767-be7c-f94906467ba6","timestamp":1743156907174,"gateway":"4SEDL9C001X8GE"} + +{"bid":"0e028de2-5b7b-4b83-abf3-06a466670a5b","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":216,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"d10b38ff-e1e1-4eb3-9f4e-414c0cfb37eb","timestamp":1743156907484,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a46e50bf-4e4a-46d2-9459-d491e61920d6","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2551,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":5,"wide_shutter_speed":31,"zoom_calibrate_farthest_focus_value":181,"zoom_calibrate_nearest_focus_value":222,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":229,"zoom_iso":5,"zoom_max_focus_value":242,"zoom_min_focus_value":161,"zoom_shutter_speed":31}]},"tid":"cb8f8bcc-d6d2-418e-928c-a7a7eb318c1a","timestamp":1743156907513,"gateway":"4SEDL9C001X8GE"} + +{"tid":"f24df1ab-6d36-45c3-b3b3-4cc2612f9c6f","bid":"a2a0c719-d823-4fba-875c-cb6d0ad69ecc","timestamp":1744944130737,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":3,"device_list":[{"sn":"4SEDL9C001X8GE","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F5BMD238V00172JR","available_video_number":0,"coexist_video_number_max":2,"camera_list":[]}]}},"gateway":"4SEDL9C001X8GE"} + +{"tid":"1c66ed59-78f1-4bbc-a187-1a06be587bc5","bid":"9b76288a-11c0-4d38-beb1-c4a3a8551942","timestamp":1744944130777,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":3,"device_list":[{"sn":"4SEDL9C001X8GE","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F5BMD238V00172JR","available_video_number":0,"coexist_video_number_max":2,"camera_list":[]}]}},"gateway":"4SEDL9C001X8GE"} + +{"tid":"ba8a8873-aa7a-4dc2-a71c-b662c6f2ba2c","bid":"0586b841-bd69-4945-b408-4385ac00bc0d","timestamp":1744944130778,"data":{"live_status":[{"video_id":"4SEDL9C001X8GE/165-0-7/normal-0","video_type":"normal","video_quality":4,"status":1,"error_status":0}]},"gateway":"4SEDL9C001X8GE"} + +{"tid":"751d5369-57b2-4f85-9ac7-7d835d4a7542","bid":"1b176f3f-996f-430e-afb8-29efef3cc079","timestamp":1744944130783,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":3,"device_list":[{"sn":"4SEDL9C001X8GE","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F5BMD238V00172JR","available_video_number":0,"coexist_video_number_max":2,"camera_list":[]}]}},"gateway":"4SEDL9C001X8GE"} + +{"tid":"eb39b67b-ac25-4003-8e08-441775a9d7af","bid":"c73da34c-5e99-4a96-9b9b-0fb98f92e224","timestamp":1744944130786,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":3,"device_list":[{"sn":"4SEDL9C001X8GE","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F5BMD238V00172JR","available_video_number":0,"coexist_video_number_max":2,"camera_list":[]}]}},"gateway":"4SEDL9C001X8GE"} + +{"tid":"8606da4c-0abd-4ad4-9d0c-4d106a1c92bd","bid":"8d982fe2-86d4-4a95-9885-159e3eee512e","timestamp":1744944130787,"data":{"live_status":[{"video_id":"4SEDL9C001X8GE/165-0-7/normal-0","video_type":"normal","video_quality":4,"status":1,"error_status":0}]},"gateway":"4SEDL9C001X8GE"} + +{"bid":"9f7d5037-fd81-480b-8883-b487a817aac6","data":{"mode_code_reason":0},"need_reply":1,"tid":"6a9edb3f-04c8-4203-8e2c-aa12e1650050","timestamp":1744944130878,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9e4e2cd5-270f-4e8d-a2c5-2bf7aef3d5fa","data":{"control_source":"A","home_latitude":26.173879851113739,"home_longitude":106.29197386876363,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"","payload_index":"53-0-0","sn":""}],"serious_low_battery_warning_threshold":10},"tid":"f632215e-2c19-40c1-bf3e-c14deb8171b3","timestamp":1744944130894,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c64a0a13-44ed-444b-8965-1b29f140db06","data":{"wpmz_version":"1.0.5"},"tid":"88e1e2f6-ff1a-4657-98bc-60281b40c17f","timestamp":1744944130895,"gateway":"4SEDL9C001X8GE"} + +{"bid":"0e349baa-a414-42ff-b61f-8c6801a848e9","data":{"uom_real_name_state":9},"tid":"f3c82711-a953-4a9d-8d35-3c5ed66f6ad5","timestamp":1744944130896,"gateway":"4SEDL9C001X8GE"} + +{"bid":"999d2852-e0cb-4f6a-b0d7-97b4f9598e16","data":{"control_source":"","home_latitude":26.173879851113739,"home_longitude":106.29197386876363,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"","payload_index":"53-0-0","sn":""}],"serious_low_battery_warning_threshold":10},"tid":"9e60f2cf-7c8f-4b29-bc6e-e60cebed906d","timestamp":1744944130901,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f86b048b-3389-4134-8f78-b02f69c64b3c","data":{"wpmz_version":"1.0.5"},"tid":"574f5593-4016-40fc-bb23-43f0a5dc3f47","timestamp":1744944130903,"gateway":"4SEDL9C001X8GE"} + +{"bid":"78c7d7d0-a292-4504-be65-70edbd156e09","data":{"uom_real_name_state":9},"tid":"606767e7-62dc-4235-b0e0-93f76b6526f9","timestamp":1744944130903,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7d426548-0a6c-49f2-993c-b953a3876aa3","data":{"control_source":"","home_latitude":26.173879851113739,"home_longitude":106.29197386876363,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"A","payload_index":"53-0-0","sn":""}],"serious_low_battery_warning_threshold":10},"tid":"9f80506c-6322-444b-ad14-88a592c9d23e","timestamp":1744944130907,"gateway":"4SEDL9C001X8GE"} + +{"bid":"16823fee-3f7a-47c6-8ab6-3f83df6f61bb","data":{"wpmz_version":"1.0.5"},"tid":"18dd20df-64d0-4390-91e2-4f62a3bae96b","timestamp":1744944130908,"gateway":"4SEDL9C001X8GE"} + +{"bid":"bc16ac1e-185f-4a5f-8ef1-b5072efc059b","data":{"uom_real_name_state":9},"tid":"8cc4eb55-b3a6-428c-b72f-3f9fb73aabe5","timestamp":1744944130909,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4aae1364-bfd4-4821-9c00-d9915f37cbf1","data":{"control_source":"A","home_latitude":26.173879851113739,"home_longitude":106.29197386876363,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"A","payload_index":"53-0-0","sn":""}],"serious_low_battery_warning_threshold":10},"tid":"2d7a2783-7170-49c8-994c-86fa7cda2d96","timestamp":1744944130911,"gateway":"4SEDL9C001X8GE"} + +{"bid":"366ee9c7-08f2-43e0-98d9-890917ca0f7d","data":{"wpmz_version":"1.0.5"},"tid":"d08bd664-a682-491e-a09b-572415971a48","timestamp":1744944130912,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6551c201-ad93-4775-b3d2-fc0ab5311352","data":{"uom_real_name_state":9},"tid":"28969a9f-9844-48e7-adc3-200179f2bca9","timestamp":1744944130913,"gateway":"4SEDL9C001X8GE"} + +{"bid":"730dea19-f9a9-4319-b96b-fd3fc97f363f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603079319000244,"left":0.41160669922828674,"right":0.605193853378296,"top":0.40329715609550476},"payload_index":"53-0-0","photo_state":0,"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"zoom_calibrate_farthest_focus_value":189,"zoom_calibrate_nearest_focus_value":230,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":253,"zoom_iso":3,"zoom_max_focus_value":250,"zoom_min_focus_value":169,"zoom_shutter_speed":13}]},"tid":"d9d3b0ff-3c0f-4f8d-a3cd-49cab97afd08","timestamp":1744944130947,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2faabb1d-0ee7-4520-95fe-3f43a6b4bdb0","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"58f7b600-b126-4bbd-8861-1fa965badc2e","timestamp":1744944130966,"gateway":"4SEDL9C001X8GE"} + +{"bid":"31f6f910-8330-4345-a1a8-4c3f91a78550","data":{"current_rth_mode":1},"need_reply":1,"tid":"5d0c2f75-8c22-41a0-9711-4a68cb0fd61c","timestamp":1744944130970,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d7e611d5-7ecf-481d-8625-fa5dbc0ed75a","data":{"control_source":"A","home_latitude":26.173879851113739,"home_longitude":106.29197386876363,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"A","payload_index":"53-0-0","sn":""}],"serious_low_battery_warning_threshold":10},"tid":"e317a667-1940-4238-8647-f60b05ed6a7d","timestamp":1744944131089,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5962eab0-c68c-4639-8d94-a59c7ebe21e9","data":{"wpmz_version":"1.0.5"},"tid":"c8ae275e-ae8b-4298-8610-db451ada8110","timestamp":1744944131091,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f1022e96-7b92-450f-bb72-269358c677e3","data":{"uom_real_name_state":9},"tid":"e214cf9e-81ce-447c-ad83-3bbb6ef3c3e0","timestamp":1744944131093,"gateway":"4SEDL9C001X8GE"} + +{"bid":"96c2ee8d-206e-4109-b471-1edf621fe6c5","data":{"control_source":"A","home_latitude":26.173879851113739,"home_longitude":106.29197386876363,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"A","payload_index":"53-0-0","sn":""}],"serious_low_battery_warning_threshold":10},"tid":"5e0591ce-0124-488c-afe4-fa921d2449c3","timestamp":1744944131095,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f16c198e-2bf9-4342-a7ea-ac22a8e22982","data":{"wpmz_version":"1.0.5"},"tid":"d0a3bf68-94ad-4966-91e0-f55c381c41d2","timestamp":1744944131096,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c1c1bf13-5e78-4db0-8343-db98fc38ddb2","data":{"uom_real_name_state":9},"tid":"9f48f8b3-5e6d-45f4-9d74-e80e4b3fc94b","timestamp":1744944131097,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f72e2555-628e-4c9e-b88d-fea220c3d297","data":{"control_source":"A","home_latitude":26.173895055725826,"home_longitude":106.29198354203929,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"A","payload_index":"53-0-0","sn":""}],"serious_low_battery_warning_threshold":10},"tid":"2014a7d2-e8e8-4040-843c-57856b8074b0","timestamp":1744944131148,"gateway":"4SEDL9C001X8GE"} + +{"bid":"72632f35-9686-445f-af94-a041a1271c80","data":{"wpmz_version":"1.0.5"},"tid":"d8040729-3b88-4879-bd70-f52706d2d01f","timestamp":1744944131149,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c294553b-83be-45ac-a8d2-2a82e9bb871b","data":{"uom_real_name_state":9},"tid":"f1263be8-bef1-42d1-982e-a7e803e719e1","timestamp":1744944131150,"gateway":"4SEDL9C001X8GE"} + +{"bid":"74acd31e-c21f-4b18-9bce-2d05f225c337","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"fe5ee63a-2b6f-49a3-ac39-df3726b9b711","timestamp":1744944131762,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2abc0cf0-9eef-4654-8924-72784e859ae4","data":{"commander_flight_height":100},"need_reply":1,"tid":"430feb91-7db0-4aa8-9a2c-1397063ea1b2","timestamp":1744944131792,"gateway":"4SEDL9C001X8GE"} + +{"bid":"56afeeb1-29a3-41f7-b6c1-92e243bcc15d","data":{"offline_map_enable":false},"need_reply":1,"tid":"dff42720-8bbc-410f-a4d6-67c0022c4fa7","timestamp":1744944131793,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d01790bd-32fd-4a0f-89c3-a425957158e0","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"3c1db0c9-a3c3-4d3c-a754-de00f6bd3ada","timestamp":1744944131907,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6045f012-ba76-4ab3-94bb-10c62545e9f8","data":{"control_source":"A","home_latitude":26.173895055725826,"home_longitude":106.29198354203929,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"A","payload_index":"53-0-0","sn":"1581F5BMD238V00172JR-0"}],"serious_low_battery_warning_threshold":10},"tid":"5780d010-9e0b-403f-aee6-1f6183d3d7c7","timestamp":1744944131908,"gateway":"4SEDL9C001X8GE"} + +{"bid":"db7e7c4f-b48e-486c-9727-5ed4157b6d29","data":{"wpmz_version":"1.0.5"},"tid":"83a103c6-3544-4a65-9edd-35c4366e470e","timestamp":1744944131920,"gateway":"4SEDL9C001X8GE"} + +{"bid":"40e057fa-b63c-4298-ab60-9d4ca5b39f46","data":{"uom_real_name_state":9},"tid":"7722fe9f-3a0c-470f-8392-6044692c21d2","timestamp":1744944131921,"gateway":"4SEDL9C001X8GE"} + +{"tid":"371b66b2-92b9-4962-ac5a-e09acf6544af","bid":"13d17fa7-9e69-495a-b9e1-cf2b76dc8fac","timestamp":1744944132565,"data":{"live_capacity":{"available_video_number":3,"coexist_video_number_max":3,"device_list":[{"sn":"4SEDL9C001X8GE","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F5BMD238V00172JR","available_video_number":2,"coexist_video_number_max":2,"camera_list":[{"camera_index":"39-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]},{"camera_index":"53-0-0","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"wide","switchable_video_types":["normal","wide","zoom","ir"]}]}]}]}},"gateway":"4SEDL9C001X8GE"} + +{"bid":"fc4eb9d4-b940-4e07-af0d-d21a213eddd7","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309267044067383,"left":0.41153895854949951,"right":0.60512572526931763,"top":0.40331044793128967},"payload_index":"53-0-0","photo_state":0,"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":19,"zoom_calibrate_farthest_focus_value":189,"zoom_calibrate_nearest_focus_value":230,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":253,"zoom_iso":3,"zoom_max_focus_value":250,"zoom_min_focus_value":169,"zoom_shutter_speed":13}]},"tid":"c7ca4de2-2564-455e-93e4-5103d4b15cfc","timestamp":1744944132649,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9f7d5037-fd81-480b-8883-b487a817aac6","data":{"mode_code_reason":0},"need_reply":1,"tid":"6a9edb3f-04c8-4203-8e2c-aa12e1650050","timestamp":1744944130878,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2faabb1d-0ee7-4520-95fe-3f43a6b4bdb0","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"58f7b600-b126-4bbd-8861-1fa965badc2e","timestamp":1744944130966,"gateway":"4SEDL9C001X8GE"} + +{"bid":"31f6f910-8330-4345-a1a8-4c3f91a78550","data":{"current_rth_mode":1},"need_reply":1,"tid":"5d0c2f75-8c22-41a0-9711-4a68cb0fd61c","timestamp":1744944130970,"gateway":"4SEDL9C001X8GE"} + +{"bid":"984be8e2-1557-4177-ac56-dee7435eb3fc","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309404134750366,"left":0.411509096622467,"right":0.605095624923706,"top":0.40331184864044189},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":22,"zoom_calibrate_farthest_focus_value":189,"zoom_calibrate_nearest_focus_value":230,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":100,"zoom_iso":4,"zoom_max_focus_value":250,"zoom_min_focus_value":169,"zoom_shutter_speed":29}]},"tid":"b5a48db2-86f7-43b1-9827-b2064594e94e","timestamp":1744944133853,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b21c81e0-8b1c-472e-a902-bb4bfcf23a32","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309404134750366,"left":0.411509096622467,"right":0.605095624923706,"top":0.40331184864044189},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":22,"zoom_calibrate_farthest_focus_value":189,"zoom_calibrate_nearest_focus_value":230,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":87,"zoom_iso":4,"zoom_max_focus_value":250,"zoom_min_focus_value":169,"zoom_shutter_speed":29}]},"tid":"452c5689-b4ee-4374-8d66-78e0dc5ada5d","timestamp":1744944133860,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d01790bd-32fd-4a0f-89c3-a425957158e0","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"3c1db0c9-a3c3-4d3c-a754-de00f6bd3ada","timestamp":1744944131907,"gateway":"4SEDL9C001X8GE"} + +{"bid":"74acd31e-c21f-4b18-9bce-2d05f225c337","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"fe5ee63a-2b6f-49a3-ac39-df3726b9b711","timestamp":1744944131762,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2abc0cf0-9eef-4654-8924-72784e859ae4","data":{"commander_flight_height":100},"need_reply":1,"tid":"430feb91-7db0-4aa8-9a2c-1397063ea1b2","timestamp":1744944131792,"gateway":"4SEDL9C001X8GE"} + +{"bid":"56afeeb1-29a3-41f7-b6c1-92e243bcc15d","data":{"offline_map_enable":false},"need_reply":1,"tid":"dff42720-8bbc-410f-a4d6-67c0022c4fa7","timestamp":1744944131793,"gateway":"4SEDL9C001X8GE"} + +{"tid":"2ea8e361-74dd-46bf-8725-9cfa7146be40","bid":"3e299383-35c2-4424-8dc4-8fcedd3e5e2b","timestamp":1744944134083,"data":{"firmware_version":"09.01.0006","compatible_status":0,"firmware_upgrade_status":0},"gateway":"4SEDL9C001X8GE"} + +{"bid":"adadbebc-c802-4dc9-b7e7-e554e2301601","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603088915348053,"left":0.41073933243751526,"right":0.604321300983429,"top":0.40330672264099121},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":22,"zoom_calibrate_farthest_focus_value":189,"zoom_calibrate_nearest_focus_value":230,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":90,"zoom_iso":4,"zoom_max_focus_value":250,"zoom_min_focus_value":169,"zoom_shutter_speed":30}]},"tid":"c495568b-59c9-4231-bd6b-25930e5624a4","timestamp":1744944134104,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d0179d16-cc36-43c5-b963-53c861244ab4","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603086233139038,"left":0.4100874662399292,"right":0.60366547107696533,"top":0.40330407023429871},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":22,"zoom_calibrate_farthest_focus_value":189,"zoom_calibrate_nearest_focus_value":230,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":430,"zoom_iso":4,"zoom_max_focus_value":250,"zoom_min_focus_value":169,"zoom_shutter_speed":30}]},"tid":"d1ae56fe-dd02-4ea6-8da3-4c0d5dfb27d7","timestamp":1744944134943,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e0167713-ea30-402d-a6b4-bf7eda233f2b","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60308247804641724,"left":0.4102313220500946,"right":0.60381019115448,"top":0.40330028533935547},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":22,"zoom_calibrate_farthest_focus_value":189,"zoom_calibrate_nearest_focus_value":230,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":441,"zoom_iso":4,"zoom_max_focus_value":250,"zoom_min_focus_value":169,"zoom_shutter_speed":30}]},"tid":"e5997886-b937-416a-ac74-a271c814c4fd","timestamp":1744944134970,"gateway":"4SEDL9C001X8GE"} + +{"bid":"db55055e-3406-43f5-9cd7-85651d8ec602","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60308480262756348,"left":0.41050556302070618,"right":0.60408610105514526,"top":0.40330258011817932},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":22,"zoom_calibrate_farthest_focus_value":189,"zoom_calibrate_nearest_focus_value":230,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":419,"zoom_iso":4,"zoom_max_focus_value":250,"zoom_min_focus_value":169,"zoom_shutter_speed":30}]},"tid":"0933dbdf-f911-4d16-8e92-34701da5db6a","timestamp":1744944135151,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a6effcdb-3d36-4b90-ba66-63fa7ce4c21c","data":{"control_source":"A","home_latitude":26.173895055725826,"home_longitude":106.29198354203929,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"A","payload_index":"53-0-0","sn":"1581F5BMD238V00172JR-0"}],"serious_low_battery_warning_threshold":10},"tid":"30036abf-e87f-4dff-b910-ffa9fc9f46c2","timestamp":1744944135864,"gateway":"4SEDL9C001X8GE"} + +{"bid":"499473ee-2b0f-4e71-8d33-80d998d42c6a","data":{"wpmz_version":"1.0.5"},"tid":"6f5b7dc9-3bd1-4d4f-b478-219e8056a7ef","timestamp":1744944135867,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c5cc440c-3cd8-4883-b0ea-a0ac3af0bef1","data":{"uom_real_name_state":9},"tid":"7c319acf-8027-4557-9732-c9c23209b274","timestamp":1744944135868,"gateway":"4SEDL9C001X8GE"} + +{"bid":"674a42af-9a73-4b2a-96a9-72a670ee2e0d","data":{"control_source":"A","home_latitude":26.173879915473769,"home_longitude":106.29197376774765,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"A","payload_index":"53-0-0","sn":"1581F5BMD238V00172JR-0"}],"serious_low_battery_warning_threshold":10},"tid":"04a30abb-211e-4dc9-bea7-0bca6fa36379","timestamp":1744944136144,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6eb43788-f79d-48a4-a68a-35bef1b5a510","data":{"wpmz_version":"1.0.5"},"tid":"15718c0f-ac3b-43e8-a85e-976c16611f83","timestamp":1744944136146,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7bba0669-c410-42b9-9d31-ba90ef27d2cb","data":{"uom_real_name_state":9},"tid":"b1deff8e-edac-46e2-a9cb-a071380575ca","timestamp":1744944136147,"gateway":"4SEDL9C001X8GE"} + +{"bid":"132a94c0-5276-4697-931b-e3fe9c8ee87b","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603093385696411,"left":0.41139695048332214,"right":0.604982852935791,"top":0.40331113338470459},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":22,"zoom_calibrate_farthest_focus_value":189,"zoom_calibrate_nearest_focus_value":230,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":206,"zoom_iso":4,"zoom_max_focus_value":250,"zoom_min_focus_value":169,"zoom_shutter_speed":30}]},"tid":"986e35f6-eac9-4e37-bc51-5cfbff4e6355","timestamp":1744944136156,"gateway":"4SEDL9C001X8GE"} + +{"bid":"99c446f7-cc71-43f5-80bc-24a0e18887d6","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309404134750366,"left":0.41154119372367859,"right":0.60512787103652954,"top":0.40331181883811951},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":22,"zoom_calibrate_farthest_focus_value":189,"zoom_calibrate_nearest_focus_value":230,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":339,"zoom_iso":4,"zoom_max_focus_value":250,"zoom_min_focus_value":169,"zoom_shutter_speed":30}]},"tid":"b6329a19-558b-4eca-beaa-4c152647ebe7","timestamp":1744944136165,"gateway":"4SEDL9C001X8GE"} + +{"bid":"51f0e844-0386-4781-91df-4724ec047ccd","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309410095214844,"left":0.411559134721756,"right":0.60514593124389648,"top":0.40331190824508667},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":22,"zoom_calibrate_farthest_focus_value":189,"zoom_calibrate_nearest_focus_value":230,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":426,"zoom_iso":4,"zoom_max_focus_value":250,"zoom_min_focus_value":169,"zoom_shutter_speed":30}]},"tid":"7683be28-aea3-4ef6-96fe-373051f0fd54","timestamp":1744944136458,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9f7d5037-fd81-480b-8883-b487a817aac6","data":{"mode_code_reason":0},"need_reply":1,"tid":"6a9edb3f-04c8-4203-8e2c-aa12e1650050","timestamp":1744944130878,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2faabb1d-0ee7-4520-95fe-3f43a6b4bdb0","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"58f7b600-b126-4bbd-8861-1fa965badc2e","timestamp":1744944130966,"gateway":"4SEDL9C001X8GE"} + +{"bid":"31f6f910-8330-4345-a1a8-4c3f91a78550","data":{"current_rth_mode":1},"need_reply":1,"tid":"5d0c2f75-8c22-41a0-9711-4a68cb0fd61c","timestamp":1744944130970,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4e82978c-f831-436e-adc4-058652e11dd5","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309427976608276,"left":0.41149604320526123,"right":0.60508251190185547,"top":0.40331205725669861},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":22,"zoom_calibrate_farthest_focus_value":189,"zoom_calibrate_nearest_focus_value":230,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":207,"zoom_iso":4,"zoom_max_focus_value":250,"zoom_min_focus_value":169,"zoom_shutter_speed":30}]},"tid":"b747f84d-6051-4891-8aec-e3f2db9f75b0","timestamp":1744944137362,"gateway":"4SEDL9C001X8GE"} + +{"bid":"dbe82d24-9274-4ac0-ba00-95fa06bd11ce","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309427976608276,"left":0.41149604320526123,"right":0.60508251190185547,"top":0.40331205725669861},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":22,"zoom_calibrate_farthest_focus_value":189,"zoom_calibrate_nearest_focus_value":230,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":339,"zoom_iso":4,"zoom_max_focus_value":250,"zoom_min_focus_value":169,"zoom_shutter_speed":30}]},"tid":"6280f1aa-e257-4203-b863-2a09730ba5af","timestamp":1744944137413,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5fec88ab-8922-4ce6-ae5f-608d257f66f9","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309416055679321,"left":0.41150784492492676,"right":0.60509437322616577,"top":0.403311938047409},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":22,"zoom_calibrate_farthest_focus_value":189,"zoom_calibrate_nearest_focus_value":230,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":426,"zoom_iso":4,"zoom_max_focus_value":250,"zoom_min_focus_value":169,"zoom_shutter_speed":30}]},"tid":"42c7a7c4-d626-471e-912b-b10e9f742f02","timestamp":1744944137654,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d01790bd-32fd-4a0f-89c3-a425957158e0","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"3c1db0c9-a3c3-4d3c-a754-de00f6bd3ada","timestamp":1744944131907,"gateway":"4SEDL9C001X8GE"} + +{"bid":"74acd31e-c21f-4b18-9bce-2d05f225c337","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"fe5ee63a-2b6f-49a3-ac39-df3726b9b711","timestamp":1744944131762,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2abc0cf0-9eef-4654-8924-72784e859ae4","data":{"commander_flight_height":100},"need_reply":1,"tid":"430feb91-7db0-4aa8-9a2c-1397063ea1b2","timestamp":1744944131792,"gateway":"4SEDL9C001X8GE"} + +{"bid":"56afeeb1-29a3-41f7-b6c1-92e243bcc15d","data":{"offline_map_enable":false},"need_reply":1,"tid":"dff42720-8bbc-410f-a4d6-67c0022c4fa7","timestamp":1744944131793,"gateway":"4SEDL9C001X8GE"} + +{"bid":"583846d8-8f58-40f9-989f-d00e0c105990","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60308873653411865,"left":0.41084152460098267,"right":0.60442405939102173,"top":0.40330657362937927},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":22,"zoom_calibrate_farthest_focus_value":189,"zoom_calibrate_nearest_focus_value":230,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":207,"zoom_iso":4,"zoom_max_focus_value":250,"zoom_min_focus_value":169,"zoom_shutter_speed":30}]},"tid":"fc9425c0-e54d-4a9c-bb79-836b435f05d2","timestamp":1744944138597,"gateway":"4SEDL9C001X8GE"} + +{"bid":"29e35ee7-5905-4b64-9b81-6fb8467b2d3b","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60308873653411865,"left":0.41084152460098267,"right":0.60442405939102173,"top":0.40330657362937927},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":22,"zoom_calibrate_farthest_focus_value":189,"zoom_calibrate_nearest_focus_value":230,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":340,"zoom_iso":4,"zoom_max_focus_value":250,"zoom_min_focus_value":169,"zoom_shutter_speed":30}]},"tid":"4c45c7a1-349e-4733-9fea-ff1c70f9752d","timestamp":1744944138648,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6f0ce63c-cf09-4a9e-a071-2f526256baf0","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603085994720459,"left":0.41049951314926147,"right":0.60408002138137817,"top":0.40330380201339722},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":22,"zoom_calibrate_farthest_focus_value":189,"zoom_calibrate_nearest_focus_value":230,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":426,"zoom_iso":4,"zoom_max_focus_value":250,"zoom_min_focus_value":169,"zoom_shutter_speed":30}]},"tid":"1b387b66-4118-4741-8fdf-cd6f1ca88580","timestamp":1744944138849,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9b319d5f-b287-45e7-baba-0d84e0b69820","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60308271646499634,"left":0.41002017259597778,"right":0.60359776020050049,"top":0.403300553560257},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":22,"zoom_calibrate_farthest_focus_value":189,"zoom_calibrate_nearest_focus_value":230,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":208,"zoom_iso":4,"zoom_max_focus_value":250,"zoom_min_focus_value":169,"zoom_shutter_speed":30}]},"tid":"b7c15d9d-1330-446d-8c89-91b00e4a6176","timestamp":1744944139816,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a1526f88-9049-4f0d-9bbd-77a5d1e31c58","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60308271646499634,"left":0.41002017259597778,"right":0.60359776020050049,"top":0.403300553560257},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":22,"zoom_calibrate_farthest_focus_value":189,"zoom_calibrate_nearest_focus_value":230,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":341,"zoom_iso":4,"zoom_max_focus_value":250,"zoom_min_focus_value":169,"zoom_shutter_speed":30}]},"tid":"148897cf-37c7-4061-aaa1-2bba32bdd2a4","timestamp":1744944139882,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5c2ad952-d560-4c4e-b854-fa7fec50c0e4","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60307765007019043,"left":0.40970197319984436,"right":0.60327768325805664,"top":0.403295487165451},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":22,"zoom_calibrate_farthest_focus_value":189,"zoom_calibrate_nearest_focus_value":230,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":426,"zoom_iso":4,"zoom_max_focus_value":250,"zoom_min_focus_value":169,"zoom_shutter_speed":30}]},"tid":"a2b608ef-be59-46ef-983a-fb4dc321f72b","timestamp":1744944140058,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4a45b7be-d775-4e61-9267-7e849b493e00","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603089928627014,"left":0.41107475757598877,"right":0.60465872287750244,"top":0.40330773591995239},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":22,"zoom_calibrate_farthest_focus_value":191,"zoom_calibrate_nearest_focus_value":232,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":207,"zoom_iso":4,"zoom_max_focus_value":252,"zoom_min_focus_value":171,"zoom_shutter_speed":30}]},"tid":"b6af5eea-d89e-4053-ba0e-e87ae8d1d199","timestamp":1744944141018,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ce200a9b-9488-48b7-90f0-ac4c38cab546","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603089928627014,"left":0.41107475757598877,"right":0.60465872287750244,"top":0.40330773591995239},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":22,"zoom_calibrate_farthest_focus_value":191,"zoom_calibrate_nearest_focus_value":232,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":340,"zoom_iso":4,"zoom_max_focus_value":252,"zoom_min_focus_value":171,"zoom_shutter_speed":30}]},"tid":"9e2c7d1b-6b24-469a-b05d-4cd1998662a1","timestamp":1744944141063,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9f7d5037-fd81-480b-8883-b487a817aac6","data":{"mode_code_reason":0},"need_reply":1,"tid":"6a9edb3f-04c8-4203-8e2c-aa12e1650050","timestamp":1744944130878,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2faabb1d-0ee7-4520-95fe-3f43a6b4bdb0","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"58f7b600-b126-4bbd-8861-1fa965badc2e","timestamp":1744944130966,"gateway":"4SEDL9C001X8GE"} + +{"bid":"31f6f910-8330-4345-a1a8-4c3f91a78550","data":{"current_rth_mode":1},"need_reply":1,"tid":"5d0c2f75-8c22-41a0-9711-4a68cb0fd61c","timestamp":1744944130970,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d01790bd-32fd-4a0f-89c3-a425957158e0","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"3c1db0c9-a3c3-4d3c-a754-de00f6bd3ada","timestamp":1744944131907,"gateway":"4SEDL9C001X8GE"} + +{"bid":"74acd31e-c21f-4b18-9bce-2d05f225c337","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"fe5ee63a-2b6f-49a3-ac39-df3726b9b711","timestamp":1744944131762,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2abc0cf0-9eef-4654-8924-72784e859ae4","data":{"commander_flight_height":100},"need_reply":1,"tid":"430feb91-7db0-4aa8-9a2c-1397063ea1b2","timestamp":1744944131792,"gateway":"4SEDL9C001X8GE"} + +{"bid":"56afeeb1-29a3-41f7-b6c1-92e243bcc15d","data":{"offline_map_enable":false},"need_reply":1,"tid":"dff42720-8bbc-410f-a4d6-67c0022c4fa7","timestamp":1744944131793,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9f7d5037-fd81-480b-8883-b487a817aac6","data":{"mode_code_reason":0},"need_reply":1,"tid":"6a9edb3f-04c8-4203-8e2c-aa12e1650050","timestamp":1744944130878,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2faabb1d-0ee7-4520-95fe-3f43a6b4bdb0","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"58f7b600-b126-4bbd-8861-1fa965badc2e","timestamp":1744944130966,"gateway":"4SEDL9C001X8GE"} + +{"bid":"31f6f910-8330-4345-a1a8-4c3f91a78550","data":{"current_rth_mode":1},"need_reply":1,"tid":"5d0c2f75-8c22-41a0-9711-4a68cb0fd61c","timestamp":1744944130970,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d01790bd-32fd-4a0f-89c3-a425957158e0","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"3c1db0c9-a3c3-4d3c-a754-de00f6bd3ada","timestamp":1744944131907,"gateway":"4SEDL9C001X8GE"} + +{"bid":"74acd31e-c21f-4b18-9bce-2d05f225c337","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"fe5ee63a-2b6f-49a3-ac39-df3726b9b711","timestamp":1744944131762,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2abc0cf0-9eef-4654-8924-72784e859ae4","data":{"commander_flight_height":100},"need_reply":1,"tid":"430feb91-7db0-4aa8-9a2c-1397063ea1b2","timestamp":1744944131792,"gateway":"4SEDL9C001X8GE"} + +{"bid":"56afeeb1-29a3-41f7-b6c1-92e243bcc15d","data":{"offline_map_enable":false},"need_reply":1,"tid":"dff42720-8bbc-410f-a4d6-67c0022c4fa7","timestamp":1744944131793,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9f7d5037-fd81-480b-8883-b487a817aac6","data":{"mode_code_reason":0},"need_reply":1,"tid":"6a9edb3f-04c8-4203-8e2c-aa12e1650050","timestamp":1744944130878,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2faabb1d-0ee7-4520-95fe-3f43a6b4bdb0","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"58f7b600-b126-4bbd-8861-1fa965badc2e","timestamp":1744944130966,"gateway":"4SEDL9C001X8GE"} + +{"bid":"31f6f910-8330-4345-a1a8-4c3f91a78550","data":{"current_rth_mode":1},"need_reply":1,"tid":"5d0c2f75-8c22-41a0-9711-4a68cb0fd61c","timestamp":1744944130970,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d01790bd-32fd-4a0f-89c3-a425957158e0","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"3c1db0c9-a3c3-4d3c-a754-de00f6bd3ada","timestamp":1744944131907,"gateway":"4SEDL9C001X8GE"} + +{"bid":"74acd31e-c21f-4b18-9bce-2d05f225c337","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"fe5ee63a-2b6f-49a3-ac39-df3726b9b711","timestamp":1744944131762,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2abc0cf0-9eef-4654-8924-72784e859ae4","data":{"commander_flight_height":100},"need_reply":1,"tid":"430feb91-7db0-4aa8-9a2c-1397063ea1b2","timestamp":1744944131792,"gateway":"4SEDL9C001X8GE"} + +{"bid":"56afeeb1-29a3-41f7-b6c1-92e243bcc15d","data":{"offline_map_enable":false},"need_reply":1,"tid":"dff42720-8bbc-410f-a4d6-67c0022c4fa7","timestamp":1744944131793,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9f7d5037-fd81-480b-8883-b487a817aac6","data":{"mode_code_reason":0},"need_reply":1,"tid":"6a9edb3f-04c8-4203-8e2c-aa12e1650050","timestamp":1744944130878,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2faabb1d-0ee7-4520-95fe-3f43a6b4bdb0","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"58f7b600-b126-4bbd-8861-1fa965badc2e","timestamp":1744944130966,"gateway":"4SEDL9C001X8GE"} + +{"bid":"31f6f910-8330-4345-a1a8-4c3f91a78550","data":{"current_rth_mode":1},"need_reply":1,"tid":"5d0c2f75-8c22-41a0-9711-4a68cb0fd61c","timestamp":1744944130970,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d01790bd-32fd-4a0f-89c3-a425957158e0","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"3c1db0c9-a3c3-4d3c-a754-de00f6bd3ada","timestamp":1744944131907,"gateway":"4SEDL9C001X8GE"} + +{"bid":"74acd31e-c21f-4b18-9bce-2d05f225c337","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"fe5ee63a-2b6f-49a3-ac39-df3726b9b711","timestamp":1744944131762,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2abc0cf0-9eef-4654-8924-72784e859ae4","data":{"commander_flight_height":100},"need_reply":1,"tid":"430feb91-7db0-4aa8-9a2c-1397063ea1b2","timestamp":1744944131792,"gateway":"4SEDL9C001X8GE"} + +{"bid":"56afeeb1-29a3-41f7-b6c1-92e243bcc15d","data":{"offline_map_enable":false},"need_reply":1,"tid":"dff42720-8bbc-410f-a4d6-67c0022c4fa7","timestamp":1744944131793,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9f7d5037-fd81-480b-8883-b487a817aac6","data":{"mode_code_reason":0},"need_reply":1,"tid":"6a9edb3f-04c8-4203-8e2c-aa12e1650050","timestamp":1744944130878,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2faabb1d-0ee7-4520-95fe-3f43a6b4bdb0","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"58f7b600-b126-4bbd-8861-1fa965badc2e","timestamp":1744944130966,"gateway":"4SEDL9C001X8GE"} + +{"bid":"31f6f910-8330-4345-a1a8-4c3f91a78550","data":{"current_rth_mode":1},"need_reply":1,"tid":"5d0c2f75-8c22-41a0-9711-4a68cb0fd61c","timestamp":1744944130970,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d01790bd-32fd-4a0f-89c3-a425957158e0","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"3c1db0c9-a3c3-4d3c-a754-de00f6bd3ada","timestamp":1744944131907,"gateway":"4SEDL9C001X8GE"} + +{"bid":"74acd31e-c21f-4b18-9bce-2d05f225c337","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"fe5ee63a-2b6f-49a3-ac39-df3726b9b711","timestamp":1744944131762,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2abc0cf0-9eef-4654-8924-72784e859ae4","data":{"commander_flight_height":100},"need_reply":1,"tid":"430feb91-7db0-4aa8-9a2c-1397063ea1b2","timestamp":1744944131792,"gateway":"4SEDL9C001X8GE"} + +{"bid":"56afeeb1-29a3-41f7-b6c1-92e243bcc15d","data":{"offline_map_enable":false},"need_reply":1,"tid":"dff42720-8bbc-410f-a4d6-67c0022c4fa7","timestamp":1744944131793,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9f7d5037-fd81-480b-8883-b487a817aac6","data":{"mode_code_reason":0},"need_reply":1,"tid":"6a9edb3f-04c8-4203-8e2c-aa12e1650050","timestamp":1744944130878,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2faabb1d-0ee7-4520-95fe-3f43a6b4bdb0","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"58f7b600-b126-4bbd-8861-1fa965badc2e","timestamp":1744944130966,"gateway":"4SEDL9C001X8GE"} + +{"bid":"31f6f910-8330-4345-a1a8-4c3f91a78550","data":{"current_rth_mode":1},"need_reply":1,"tid":"5d0c2f75-8c22-41a0-9711-4a68cb0fd61c","timestamp":1744944130970,"gateway":"4SEDL9C001X8GE"} + +{"tid":"a4fc404e-7454-4f61-a290-f8e928156f1e","bid":"36c47253-f3cd-4bc2-b544-31af3d9cb6d3","timestamp":1749035757754,"data":{"live_capacity":{"available_video_number":3,"coexist_video_number_max":3,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F8HGX253U00A0626","available_video_number":2,"coexist_video_number_max":1,"camera_list":[{"camera_index":"176-0-0","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]},{"camera_index":"99-0-0","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal","wide","zoom","ir"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"2ad751af-2b4c-489a-96a4-cd22a9aa0237","bid":"e23b31c7-1601-499c-972a-510fc11b1521","timestamp":1749035757760,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"3e4203cb-b6f5-4bcb-bb70-6c2cffc06db9","bid":"a777a736-f4be-47f5-be25-6cff63654fc1","timestamp":1749035758363,"data":{"live_status":[{"video_id":"8UUXN4P00A06NK/165-0-7/normal-0","video_type":"normal","video_quality":4,"status":1,"error_status":0}]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"b01c9674-e5c2-49e7-848c-e9cfa2ffa7a2","bid":"9797f829-a201-4062-a0a4-73accc830c65","timestamp":1749035758271,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"567eee97-a777-4e73-b2a2-4424c4f6ae1b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"b8f54b99-40b2-4875-a978-af91169920f4","timestamp":1749035758769,"gateway":"8UUXN4P00A06NK"} + +{"bid":"567eee97-a777-4e73-b2a2-4424c4f6ae1b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"b8f54b99-40b2-4875-a978-af91169920f4","timestamp":1749035760966,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c63a0c47-9f5a-45a0-99bb-3e06707a1897","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"317be44b-266d-4104-a64b-11369199b5e4","timestamp":1749035761629,"gateway":"8UUXN4P00A06NK"} + +{"bid":"832128e7-6fe6-47d3-bd3b-e24949b25654","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0c144693-d5ee-4218-8222-9c1eb9bb55a0","timestamp":1749035761779,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7ef3a065-8d54-4d6e-9930-73f0023e414f","data":{"dongle_infos":[]},"tid":"9f11dc4e-f3f2-489e-b2d1-f1b1d1aa0533","timestamp":1749035762161,"gateway":"8UUXN4P00A06NK"} + +{"bid":"567eee97-a777-4e73-b2a2-4424c4f6ae1b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"b8f54b99-40b2-4875-a978-af91169920f4","timestamp":1749035814761,"gateway":"8UUXN4P00A06NK"} + +{"bid":"832128e7-6fe6-47d3-bd3b-e24949b25654","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0c144693-d5ee-4218-8222-9c1eb9bb55a0","timestamp":1749035817336,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3ca06cef-4912-4512-a97a-f9c69986dd38","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"868d3785-f059-4b4f-8c39-8e95dcdfc213","timestamp":1749035820141,"gateway":"8UUXN4P00A06NK"} + +{"bid":"09879e1a-c637-4ce9-be2d-96175e931876","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"93b2f42f-f2af-4df7-a86e-cba038c853aa","timestamp":1749035820935,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7b63129d-371e-4969-b635-f1f02ee3172a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"40d5a8d4-dc95-4111-87bd-bad83df249ce","timestamp":1749104182786,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7b63129d-371e-4969-b635-f1f02ee3172a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"40d5a8d4-dc95-4111-87bd-bad83df249ce","timestamp":1749104190981,"gateway":"8UUXN4P00A06NK"} + +{"tid":"1ff8cf08-fd9d-46a7-ad2c-ac4cc1c9650c","bid":"23fe9e31-aaa5-4860-9b7b-49669f96ab8d","timestamp":1749105308402,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":3,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F8HGX253U00A0626","available_video_number":0,"coexist_video_number_max":1,"camera_list":[]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"651bd2cc-5e99-4863-abbe-4e8bbbfbe084","bid":"dc2df82b-5759-4cc0-bf93-a39d3c03f887","timestamp":1749105346721,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"dfda0d99-d293-4c04-bf23-03cca7754977","bid":"978aa057-c796-4c33-aff4-f0e30cb2dbfc","timestamp":1749105346729,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"347273b7-d45c-4715-8636-75b17cc22a41","bid":"f3e5a221-2d2c-4282-8b48-738ca5d2977d","timestamp":1749105347143,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"4c7ecc83-c12d-4ce0-a25d-819cbd29d383","bid":"6e763e42-d933-4997-ae66-83858c0daf38","timestamp":1749105347151,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"b8080604-7636-4380-8f51-6fb59745d6c7","bid":"982946ee-33f7-4d5a-a23e-a76abbeaa4fc","timestamp":1749105347157,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"df03f687-7d9e-41fb-95a6-39c39af3ed26","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2287e944-d3a9-4d4f-8b19-98e9d337afc2","timestamp":1749105349958,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0909f53a-7807-4591-a2d3-708b3e946db2","data":{"mobility_status_notify":0},"need_reply":1,"tid":"11e2b179-de33-4d48-99f2-ba376033e7ed","timestamp":1749105351943,"gateway":"8UUXN4P00A06NK"} + +{"tid":"eb48c839-d452-46ae-b710-ffba3ab0625e","bid":"0468d8b5-6e0d-484e-867e-e6b34f3bd086","timestamp":1749105352127,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"cb7994a4-add6-4a3e-bb68-41df584df37c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9861b554-e0cc-4f1e-9795-7bc9925d8028","timestamp":1749105352161,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8cde64af-ebaa-407a-b81a-626b6f103402","data":{"dongle_infos":[]},"tid":"cf9ae011-bcd5-47d9-8c4f-9d6a0c37032d","timestamp":1749105352370,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a0a1e046-1173-4fa6-bdf5-05a33c53f3ce","data":{"firmware_version":"13.01.0002"},"tid":"074cf4da-d51a-4ea4-b7c4-40f8bb5c7a81","timestamp":1749105352378,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df03f687-7d9e-41fb-95a6-39c39af3ed26","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2287e944-d3a9-4d4f-8b19-98e9d337afc2","timestamp":1749105352573,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c5b0c31a-6cc1-4780-bb67-8a0d6b59d7d4","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3ae5ae69-3087-4dbb-ba63-454909a8f54f","timestamp":1749105353032,"gateway":"8UUXN4P00A06NK"} + +{"bid":"15cb09f5-d5ef-459f-b3ce-bd2bae50776f","data":{"dongle_infos":[]},"tid":"23ea5289-3ed6-46f4-8d1c-4c788caed017","timestamp":1749105353389,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0909f53a-7807-4591-a2d3-708b3e946db2","data":{"mobility_status_notify":0},"need_reply":1,"tid":"11e2b179-de33-4d48-99f2-ba376033e7ed","timestamp":1749105354107,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cb7994a4-add6-4a3e-bb68-41df584df37c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9861b554-e0cc-4f1e-9795-7bc9925d8028","timestamp":1749105354309,"gateway":"8UUXN4P00A06NK"} + +{"bid":"18541cfc-cf67-4c4f-a5f8-a565e09166d3","data":{"dongle_infos":[]},"tid":"7760e6ce-0c5f-46f7-8f98-5458c1594498","timestamp":1749105355081,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c5b0c31a-6cc1-4780-bb67-8a0d6b59d7d4","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3ae5ae69-3087-4dbb-ba63-454909a8f54f","timestamp":1749105355106,"gateway":"8UUXN4P00A06NK"} + +{"bid":"910b7678-bcaa-44e5-9b09-534ffc9d88cf","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5be3d6e0-6727-440b-ac52-042189763979","timestamp":1749105356716,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df03f687-7d9e-41fb-95a6-39c39af3ed26","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2287e944-d3a9-4d4f-8b19-98e9d337afc2","timestamp":1749105356763,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f2ae6129-40e0-4354-8883-275032af5931","data":{"departure_trajectory":[]},"tid":"f3d0d566-34f9-4022-ae36-226220759ffa","timestamp":1749105356770,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bf3a1080-3fb0-46b1-a986-45b85f6e222f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e1856dea-34de-48af-a5cb-4cffcf1cd4e4","timestamp":1749105357149,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b4e54d20-6d12-4d6e-9a47-a3afb0426c22","data":{"departure_trajectory":[]},"tid":"dd600cac-c4f0-4e75-9398-a4807f72d7b7","timestamp":1749105357367,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0909f53a-7807-4591-a2d3-708b3e946db2","data":{"mobility_status_notify":0},"need_reply":1,"tid":"11e2b179-de33-4d48-99f2-ba376033e7ed","timestamp":1749105358307,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c5b0c31a-6cc1-4780-bb67-8a0d6b59d7d4","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3ae5ae69-3087-4dbb-ba63-454909a8f54f","timestamp":1749105359306,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bf3a1080-3fb0-46b1-a986-45b85f6e222f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e1856dea-34de-48af-a5cb-4cffcf1cd4e4","timestamp":1749105359307,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ac219439-586b-44d3-8b19-886a45863ed9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4d061cf8-0f36-4afc-a561-41417960cafb","timestamp":1749105361720,"gateway":"8UUXN4P00A06NK"} + +{"tid":"86607454-bbb7-46e9-87c8-19e76df21247","bid":"32de8b14-fb01-49a1-976e-e27ee14c0521","timestamp":1749105387658,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"f4355e98-aa1d-428d-afb5-478dbff6f690","bid":"b3a19ed1-54f8-4d1d-b27c-1e20c01363b8","timestamp":1749105387663,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"14fc3c64-116c-40f9-b2db-a9181a6a1aa9","bid":"a2e8bb3a-55ad-40dc-91bb-aa2542432d6a","timestamp":1749105388228,"data":{"live_status":[{"video_id":"8UUXN4P00A06NK/165-0-7/normal-0","video_type":"normal","video_quality":4,"status":1,"error_status":0}]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f031cb5b-cb4a-4e5e-9b65-7844c9c1ae6a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"46e3bbc9-2d19-498a-b1fd-57fc984b32c2","timestamp":1749105389150,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9e9f2cb5-866f-4ae0-bcf0-65846bb16d0e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"59f831f9-35c7-4e22-8f14-0e294a447ee3","timestamp":1749105389902,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f213d175-1ad8-44e7-9edf-ff2fdeb26979","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"824f387c-c49c-40b7-814c-20505a58631e","timestamp":1749105389990,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b6901d29-4208-472e-adb5-13e929674538","data":{"dongle_infos":[]},"tid":"55096ef5-e76c-4c97-9dc6-29fa514ee65f","timestamp":1749105390012,"gateway":"8UUXN4P00A06NK"} + +{"bid":"145f14d3-a03d-40a2-a62f-f5e478c5f183","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e10152bc-f976-4e32-885e-ddfb86538f30","timestamp":1749105390017,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fe575c99-bdbb-49e9-b51e-eff6c8d5e860","data":{"firmware_version":"13.01.0002"},"tid":"910db217-4afc-4f2c-8a8a-b84245d642df","timestamp":1749105390042,"gateway":"8UUXN4P00A06NK"} + +{"tid":"8fead08f-6c8d-437c-91d2-fd92ce3b63cf","bid":"1fd801e3-02e4-4ea8-9ae5-7f4c883f12c9","timestamp":1749105390794,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"2bba62fc-d649-48dd-b7f1-aa04ead06589","data":{"dongle_infos":[]},"tid":"3366b013-4acd-4ac4-ada9-43105b817a23","timestamp":1749105390999,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f031cb5b-cb4a-4e5e-9b65-7844c9c1ae6a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"46e3bbc9-2d19-498a-b1fd-57fc984b32c2","timestamp":1749105391297,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f213d175-1ad8-44e7-9edf-ff2fdeb26979","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"824f387c-c49c-40b7-814c-20505a58631e","timestamp":1749105392096,"gateway":"8UUXN4P00A06NK"} + +{"bid":"145f14d3-a03d-40a2-a62f-f5e478c5f183","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e10152bc-f976-4e32-885e-ddfb86538f30","timestamp":1749105392097,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dc3ceedb-8df9-4100-9c81-75f34bb1aa23","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6ae322b3-1c23-4f4b-a612-93268df34fa3","timestamp":1749105392657,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ab8de208-dfa0-4055-bfe1-862dbfaf4949","data":{"dongle_infos":[]},"tid":"781af8ef-8409-4f69-be00-b19958482fe4","timestamp":1749105393626,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8c22c845-8b2a-40a4-8850-9e7a62ed9597","data":{"departure_trajectory":[]},"tid":"56a5a096-afe7-47b1-a25d-76fdda31ddab","timestamp":1749105393972,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9e9f2cb5-866f-4ae0-bcf0-65846bb16d0e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"59f831f9-35c7-4e22-8f14-0e294a447ee3","timestamp":1749105394098,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dc3ceedb-8df9-4100-9c81-75f34bb1aa23","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6ae322b3-1c23-4f4b-a612-93268df34fa3","timestamp":1749105394697,"gateway":"8UUXN4P00A06NK"} + +{"bid":"369cc01b-46fa-43dd-9aae-6a35137ea12b","data":{"departure_trajectory":[]},"tid":"fd37391a-c27a-4c82-bd04-7779e9360086","timestamp":1749105394987,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f213d175-1ad8-44e7-9edf-ff2fdeb26979","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"824f387c-c49c-40b7-814c-20505a58631e","timestamp":1749105396297,"gateway":"8UUXN4P00A06NK"} + +{"bid":"145f14d3-a03d-40a2-a62f-f5e478c5f183","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e10152bc-f976-4e32-885e-ddfb86538f30","timestamp":1749105396298,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ed8a9a1a-5e04-424f-9ddf-1322062dba12","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"33dbb42d-7dad-417d-a872-fa1b9e4dd624","timestamp":1749105397656,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ed8a9a1a-5e04-424f-9ddf-1322062dba12","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"33dbb42d-7dad-417d-a872-fa1b9e4dd624","timestamp":1749105399696,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9e9f2cb5-866f-4ae0-bcf0-65846bb16d0e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"59f831f9-35c7-4e22-8f14-0e294a447ee3","timestamp":1749105402294,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e96a4cd4-9b2c-43d2-b3d1-01af89f26faf","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6d945768-3b5c-4788-937a-a1083589f3df","timestamp":1749105402658,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f213d175-1ad8-44e7-9edf-ff2fdeb26979","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"824f387c-c49c-40b7-814c-20505a58631e","timestamp":1749105404493,"gateway":"8UUXN4P00A06NK"} + +{"bid":"145f14d3-a03d-40a2-a62f-f5e478c5f183","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e10152bc-f976-4e32-885e-ddfb86538f30","timestamp":1749105404494,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e96a4cd4-9b2c-43d2-b3d1-01af89f26faf","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6d945768-3b5c-4788-937a-a1083589f3df","timestamp":1749105404693,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e96a4cd4-9b2c-43d2-b3d1-01af89f26faf","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6d945768-3b5c-4788-937a-a1083589f3df","timestamp":1749105408895,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9e9f2cb5-866f-4ae0-bcf0-65846bb16d0e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"59f831f9-35c7-4e22-8f14-0e294a447ee3","timestamp":1749105410499,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f213d175-1ad8-44e7-9edf-ff2fdeb26979","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"824f387c-c49c-40b7-814c-20505a58631e","timestamp":1749105412695,"gateway":"8UUXN4P00A06NK"} + +{"bid":"145f14d3-a03d-40a2-a62f-f5e478c5f183","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e10152bc-f976-4e32-885e-ddfb86538f30","timestamp":1749105412696,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e96a4cd4-9b2c-43d2-b3d1-01af89f26faf","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6d945768-3b5c-4788-937a-a1083589f3df","timestamp":1749105417097,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9e9f2cb5-866f-4ae0-bcf0-65846bb16d0e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"59f831f9-35c7-4e22-8f14-0e294a447ee3","timestamp":1749105418699,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f213d175-1ad8-44e7-9edf-ff2fdeb26979","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"824f387c-c49c-40b7-814c-20505a58631e","timestamp":1749105420895,"gateway":"8UUXN4P00A06NK"} + +{"bid":"145f14d3-a03d-40a2-a62f-f5e478c5f183","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e10152bc-f976-4e32-885e-ddfb86538f30","timestamp":1749105420896,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e96a4cd4-9b2c-43d2-b3d1-01af89f26faf","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6d945768-3b5c-4788-937a-a1083589f3df","timestamp":1749105425297,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9e9f2cb5-866f-4ae0-bcf0-65846bb16d0e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"59f831f9-35c7-4e22-8f14-0e294a447ee3","timestamp":1749105426894,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f213d175-1ad8-44e7-9edf-ff2fdeb26979","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"824f387c-c49c-40b7-814c-20505a58631e","timestamp":1749105429094,"gateway":"8UUXN4P00A06NK"} + +{"bid":"145f14d3-a03d-40a2-a62f-f5e478c5f183","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e10152bc-f976-4e32-885e-ddfb86538f30","timestamp":1749105429095,"gateway":"8UUXN4P00A06NK"} + +{"bid":"52db0fc0-7f4d-4e8a-a99c-ac701cb5a67d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"625c7d3f-e81a-4238-ac82-4d11c5e4578f","timestamp":1749105430375,"gateway":"8UUXN4P00A06NK"} + +{"bid":"52db0fc0-7f4d-4e8a-a99c-ac701cb5a67d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"625c7d3f-e81a-4238-ac82-4d11c5e4578f","timestamp":1749105432494,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e96a4cd4-9b2c-43d2-b3d1-01af89f26faf","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6d945768-3b5c-4788-937a-a1083589f3df","timestamp":1749105433496,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9e9f2cb5-866f-4ae0-bcf0-65846bb16d0e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"59f831f9-35c7-4e22-8f14-0e294a447ee3","timestamp":1749105435100,"gateway":"8UUXN4P00A06NK"} + +{"bid":"52db0fc0-7f4d-4e8a-a99c-ac701cb5a67d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"625c7d3f-e81a-4238-ac82-4d11c5e4578f","timestamp":1749105436694,"gateway":"8UUXN4P00A06NK"} + +{"bid":"145f14d3-a03d-40a2-a62f-f5e478c5f183","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e10152bc-f976-4e32-885e-ddfb86538f30","timestamp":1749105437296,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e96a4cd4-9b2c-43d2-b3d1-01af89f26faf","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6d945768-3b5c-4788-937a-a1083589f3df","timestamp":1749105441693,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9e9f2cb5-866f-4ae0-bcf0-65846bb16d0e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"59f831f9-35c7-4e22-8f14-0e294a447ee3","timestamp":1749105443298,"gateway":"8UUXN4P00A06NK"} + +{"bid":"52db0fc0-7f4d-4e8a-a99c-ac701cb5a67d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"625c7d3f-e81a-4238-ac82-4d11c5e4578f","timestamp":1749105444896,"gateway":"8UUXN4P00A06NK"} + +{"bid":"145f14d3-a03d-40a2-a62f-f5e478c5f183","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e10152bc-f976-4e32-885e-ddfb86538f30","timestamp":1749105445496,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e96a4cd4-9b2c-43d2-b3d1-01af89f26faf","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6d945768-3b5c-4788-937a-a1083589f3df","timestamp":1749105449894,"gateway":"8UUXN4P00A06NK"} + +{"bid":"52db0fc0-7f4d-4e8a-a99c-ac701cb5a67d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"625c7d3f-e81a-4238-ac82-4d11c5e4578f","timestamp":1749105453095,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e96a4cd4-9b2c-43d2-b3d1-01af89f26faf","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6d945768-3b5c-4788-937a-a1083589f3df","timestamp":1749105458093,"gateway":"8UUXN4P00A06NK"} + +{"bid":"52db0fc0-7f4d-4e8a-a99c-ac701cb5a67d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"625c7d3f-e81a-4238-ac82-4d11c5e4578f","timestamp":1749105461294,"gateway":"8UUXN4P00A06NK"} + +{"bid":"52db0fc0-7f4d-4e8a-a99c-ac701cb5a67d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"625c7d3f-e81a-4238-ac82-4d11c5e4578f","timestamp":1749105469495,"gateway":"8UUXN4P00A06NK"} + +{"bid":"52db0fc0-7f4d-4e8a-a99c-ac701cb5a67d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"625c7d3f-e81a-4238-ac82-4d11c5e4578f","timestamp":1749105477695,"gateway":"8UUXN4P00A06NK"} + +{"bid":"52db0fc0-7f4d-4e8a-a99c-ac701cb5a67d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"625c7d3f-e81a-4238-ac82-4d11c5e4578f","timestamp":1749105485894,"gateway":"8UUXN4P00A06NK"} + +{"tid":"fa764315-6170-4228-85eb-ba2bad7b1336","bid":"8fb1eb1e-ee1e-4820-984f-dc5ef3249545","timestamp":1749107234164,"data":{"live_capacity":{"available_video_number":3,"coexist_video_number_max":3,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F8HGX253U00A0626","available_video_number":2,"coexist_video_number_max":1,"camera_list":[{"camera_index":"176-0-0","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]},{"camera_index":"99-0-0","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal","wide","zoom","ir"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"b9de0519-4c7f-404d-b32a-a5e76b5c20c2","bid":"6cf59a6c-695e-42e4-8489-21b46a5895ac","timestamp":1749107234166,"data":{"live_capacity":{"available_video_number":3,"coexist_video_number_max":3,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F8HGX253U00A0626","available_video_number":2,"coexist_video_number_max":1,"camera_list":[{"camera_index":"176-0-0","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]},{"camera_index":"99-0-0","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"wide","switchable_video_types":["normal","wide","zoom","ir"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"bc18e80a-18b4-44d0-9b24-90cecbab35a0","bid":"628e4c5d-57ca-470e-ae35-6f110b5a9cb5","timestamp":1749107312044,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":3,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F8HGX253U00A0626","available_video_number":0,"coexist_video_number_max":1,"camera_list":[]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"e082a66d-e67c-4c1d-8f68-6f53fc9a1ea8","bid":"5504f256-b01c-4b97-bdec-a476af4ed00b","timestamp":1749107364114,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"fa680d84-92f7-4e0b-898f-e4ef272bd82e","bid":"fe925bb2-152e-4b0c-a682-1b2047df014a","timestamp":1749107364117,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"17b30023-6d43-469e-a154-b43e7e610092","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d72faf4e-97de-4177-b830-cc1c24ae6600","timestamp":1749107365496,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e2b937e4-9f22-44f9-b418-35c468e79ec8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4506d06d-519d-42fe-87b9-31c84a4910de","timestamp":1749107365532,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a64f9f2b-6743-4a17-b8e5-d703de663bf3","data":{"air_transfer_enable":false},"need_reply":1,"tid":"eb314d44-0bb7-4451-879b-cabe243978cd","timestamp":1749107365909,"gateway":"8UUXN4P00A06NK"} + +{"bid":"04e64ae0-fac4-45c8-8aed-f1ceaa619826","data":{"dongle_infos":[]},"tid":"d5017a66-0fd8-490f-bb9f-00abcffd4412","timestamp":1749107365917,"gateway":"8UUXN4P00A06NK"} + +{"bid":"757d7827-9a89-4752-af2b-943b7f0478f4","data":{"firmware_version":"13.01.0002"},"tid":"0810ee86-7e6c-4ebf-9721-ef8720b91d31","timestamp":1749107365924,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c8634821-891b-4e91-b2fe-55bac0da6c43","bid":"8c00825d-d601-425d-961c-e1eed45bc528","timestamp":1749107366325,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"cf5ad2f1-0767-48bb-8fc6-db66d891a267","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"afb38836-d8e1-405a-95f5-ac7229982fd7","timestamp":1749107366657,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e4ddef52-fe43-41a5-9af2-a385cd0602be","data":{"dongle_infos":[]},"tid":"8fdbd2e9-8f0d-4e36-ae65-71db9c09359b","timestamp":1749107366951,"gateway":"8UUXN4P00A06NK"} + +{"bid":"17b30023-6d43-469e-a154-b43e7e610092","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d72faf4e-97de-4177-b830-cc1c24ae6600","timestamp":1749107367585,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e2b937e4-9f22-44f9-b418-35c468e79ec8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4506d06d-519d-42fe-87b9-31c84a4910de","timestamp":1749107367586,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cf5ad2f1-0767-48bb-8fc6-db66d891a267","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"afb38836-d8e1-405a-95f5-ac7229982fd7","timestamp":1749107368786,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6275db73-f330-4585-9774-4d42f3a6c7e1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0d11d9ff-fca7-463e-9c2a-ef40837d2b1d","timestamp":1749107369118,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0cdb95e2-470d-4924-9b45-2205f73aa564","data":{"dongle_infos":[]},"tid":"92c4de0f-9ad8-40f2-90e8-1adfc7089e94","timestamp":1749107369997,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a64f9f2b-6743-4a17-b8e5-d703de663bf3","data":{"air_transfer_enable":false},"need_reply":1,"tid":"eb314d44-0bb7-4451-879b-cabe243978cd","timestamp":1749107370110,"gateway":"8UUXN4P00A06NK"} + +{"bid":"38d5da42-1603-4f14-a441-9753b8113e2b","data":{"departure_trajectory":[]},"tid":"fce09883-cca3-459f-8483-416c927ebb3d","timestamp":1749107370248,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9be88789-2dfc-4a30-851d-61ef6b7d76aa","data":{"departure_trajectory":[]},"tid":"ce9fad90-0060-4385-8838-4865f1e87064","timestamp":1749107370909,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6275db73-f330-4585-9774-4d42f3a6c7e1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0d11d9ff-fca7-463e-9c2a-ef40837d2b1d","timestamp":1749107371187,"gateway":"8UUXN4P00A06NK"} + +{"bid":"17b30023-6d43-469e-a154-b43e7e610092","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d72faf4e-97de-4177-b830-cc1c24ae6600","timestamp":1749107371783,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cf5ad2f1-0767-48bb-8fc6-db66d891a267","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"afb38836-d8e1-405a-95f5-ac7229982fd7","timestamp":1749107372983,"gateway":"8UUXN4P00A06NK"} + +{"bid":"43117a55-8380-45f7-809b-90682b145d81","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c7501131-9ccf-4385-84d1-3cfe54098863","timestamp":1749107374116,"gateway":"8UUXN4P00A06NK"} + +{"bid":"43117a55-8380-45f7-809b-90682b145d81","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c7501131-9ccf-4385-84d1-3cfe54098863","timestamp":1749107376186,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a64f9f2b-6743-4a17-b8e5-d703de663bf3","data":{"air_transfer_enable":false},"need_reply":1,"tid":"eb314d44-0bb7-4451-879b-cabe243978cd","timestamp":1749107378306,"gateway":"8UUXN4P00A06NK"} + +{"bid":"41cffeba-9669-4b89-8544-7d171d04f7a0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"631adf1a-71ba-42b1-bcdc-cd997c2818b9","timestamp":1749107379117,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d9d53f73-3982-4f03-a7d6-e8d0ff20addb","bid":"2145eb06-45f3-493f-a902-d231ca219bac","timestamp":1749107404583,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"ec1faa5b-253a-4952-ab0c-6ec966db7a2a","bid":"0f8b66b3-3460-4d8b-a1c0-58a7eac3f26d","timestamp":1749107404586,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"813d4d29-f748-4e93-925c-fe0504bedb9a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"debe1890-e9c3-4bb0-80b3-45dccfe69ef5","timestamp":1749107405049,"gateway":"8UUXN4P00A06NK"} + +{"bid":"79defcd2-108d-41c5-a7f6-d474bed56c65","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5bb0f02d-0542-4541-bc61-165f35444bb3","timestamp":1749107406990,"gateway":"8UUXN4P00A06NK"} + +{"bid":"813d4d29-f748-4e93-925c-fe0504bedb9a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"debe1890-e9c3-4bb0-80b3-45dccfe69ef5","timestamp":1749107407674,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bdee76dd-1b73-41cf-9872-1862f256dc06","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ac061f21-0c9f-4d30-973a-2559cdc5e560","timestamp":1749107407903,"gateway":"8UUXN4P00A06NK"} + +{"bid":"381bca78-11ca-459c-b063-5758db764c66","data":{"dongle_infos":[]},"tid":"a789379e-2831-4e69-9004-eab9c7f82ca1","timestamp":1749107407917,"gateway":"8UUXN4P00A06NK"} + +{"bid":"11784b97-a74e-4f37-b6e2-3d3f00ede796","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c367951f-a5af-466d-ad0f-c53c2743ec5f","timestamp":1749107407923,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0bf26dbf-c279-4ef4-ba2a-199ce32f93a6","data":{"firmware_version":"13.01.0002"},"tid":"b7cc1916-4513-4b18-aed2-9b7145cc05a1","timestamp":1749107407963,"gateway":"8UUXN4P00A06NK"} + +{"tid":"1cd36bbd-860f-40cf-b171-755abc2334cd","bid":"a9c7a677-afdf-42b8-8742-356069840c12","timestamp":1749107408368,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"8f4076fc-30bf-4801-814a-8f30d8965d92","data":{"dongle_infos":[]},"tid":"fa7daffa-1387-4349-ad12-e8df8af551ef","timestamp":1749107408923,"gateway":"8UUXN4P00A06NK"} + +{"bid":"79defcd2-108d-41c5-a7f6-d474bed56c65","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5bb0f02d-0542-4541-bc61-165f35444bb3","timestamp":1749107409083,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9574a107-9154-4f2c-a71c-c79807e6d38c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"dc9e4efe-0047-4b3b-9a8c-7772ecc62d7d","timestamp":1749107409583,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bdee76dd-1b73-41cf-9872-1862f256dc06","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ac061f21-0c9f-4d30-973a-2559cdc5e560","timestamp":1749107410081,"gateway":"8UUXN4P00A06NK"} + +{"bid":"11784b97-a74e-4f37-b6e2-3d3f00ede796","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c367951f-a5af-466d-ad0f-c53c2743ec5f","timestamp":1749107410081,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9574a107-9154-4f2c-a71c-c79807e6d38c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"dc9e4efe-0047-4b3b-9a8c-7772ecc62d7d","timestamp":1749107411681,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f25ac728-88ba-4d70-bc69-e326593e1d09","data":{"dongle_infos":[]},"tid":"f6d236e7-0e6d-431c-9f73-702dbb7443d8","timestamp":1749107411703,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c90b0c94-9c47-4107-b4ba-2c23e5600dc9","data":{"departure_trajectory":[]},"tid":"5aa022cd-2a59-4589-b9fa-604418636a78","timestamp":1749107411875,"gateway":"8UUXN4P00A06NK"} + +{"bid":"813d4d29-f748-4e93-925c-fe0504bedb9a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"debe1890-e9c3-4bb0-80b3-45dccfe69ef5","timestamp":1749107411877,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1030750f-933c-4bdc-ae25-eeb955655317","data":{"departure_trajectory":[]},"tid":"2a6962a9-730c-4d52-9419-18007c9078c2","timestamp":1749107412915,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bdee76dd-1b73-41cf-9872-1862f256dc06","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ac061f21-0c9f-4d30-973a-2559cdc5e560","timestamp":1749107414282,"gateway":"8UUXN4P00A06NK"} + +{"bid":"11784b97-a74e-4f37-b6e2-3d3f00ede796","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c367951f-a5af-466d-ad0f-c53c2743ec5f","timestamp":1749107414283,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6c3736b7-1491-4ec5-b267-7f709b212c2d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"178a0b07-4174-4c00-bc30-bd2a38fcfe70","timestamp":1749107414584,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6c3736b7-1491-4ec5-b267-7f709b212c2d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"178a0b07-4174-4c00-bc30-bd2a38fcfe70","timestamp":1749107416681,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cd584adf-48df-4ebf-8a4b-aad5966668ce","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"204d41a3-63d9-4028-9e0f-1e785dd94631","timestamp":1749107419583,"gateway":"8UUXN4P00A06NK"} + +{"tid":"f182f86f-fa12-47cf-8c65-93d1e17aa093","bid":"06e12916-1303-489e-9efc-3eed8e490390","timestamp":1749107444849,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"fb16febc-c236-43df-898d-ba3c8d057d87","bid":"87b258d2-b946-4594-92bb-4dab394ed601","timestamp":1749107444852,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"6abb1e47-72b5-4e78-90a6-3bd8d17ac0d9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5ae82516-17f7-4726-8905-717033768adc","timestamp":1749107446764,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5803f1bc-b98a-42ff-8358-53e39e14dc2f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d81e5492-0f62-4bf6-afd7-06d24877e45d","timestamp":1749107447311,"gateway":"8UUXN4P00A06NK"} + +{"bid":"37f37a5a-2fc4-4bfa-9e05-016c0d28afab","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"543ebe5c-6e47-4d28-ad56-039a8e8c16dc","timestamp":1749107447440,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dc114eeb-9911-436d-ad12-a5fafb748425","data":{"dongle_infos":[]},"tid":"6c54de6e-67a0-457f-b693-58725f79eb52","timestamp":1749107447453,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1fd0488f-964c-474e-bb08-ebf5c442b96d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0dd30697-a5a4-4a09-8765-94747a7b3c6d","timestamp":1749107447459,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5f42bfa0-64bb-4c94-a6f1-e4c41da3d8f8","data":{"firmware_version":"13.01.0002"},"tid":"a8b4260c-e924-4dc9-a37e-f04b19e7f751","timestamp":1749107447474,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c7401fe0-1662-452a-abc2-8052c408635f","data":{"dongle_infos":[]},"tid":"021d1a53-1a12-4664-aad1-8e1d42bb5d39","timestamp":1749107448467,"gateway":"8UUXN4P00A06NK"} + +{"tid":"cf8d6ba5-6390-4939-854e-27f93bd8b029","bid":"d51dd37c-2e2d-46fd-a7ef-7477098dbc83","timestamp":1749107448492,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"6abb1e47-72b5-4e78-90a6-3bd8d17ac0d9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5ae82516-17f7-4726-8905-717033768adc","timestamp":1749107448814,"gateway":"8UUXN4P00A06NK"} + +{"bid":"37f37a5a-2fc4-4bfa-9e05-016c0d28afab","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"543ebe5c-6e47-4d28-ad56-039a8e8c16dc","timestamp":1749107449610,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1fd0488f-964c-474e-bb08-ebf5c442b96d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0dd30697-a5a4-4a09-8765-94747a7b3c6d","timestamp":1749107449611,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e3600245-0a16-4b72-a61b-8dd6b73be178","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6599b243-3b2f-4fb7-9338-076925892aeb","timestamp":1749107449859,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e63e080-b5cb-41e6-8e80-6c7af8d7de45","data":{"departure_trajectory":[]},"tid":"93b86927-94d6-403f-8be3-94718e6f46ca","timestamp":1749107451444,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5803f1bc-b98a-42ff-8358-53e39e14dc2f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d81e5492-0f62-4bf6-afd7-06d24877e45d","timestamp":1749107451514,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e3600245-0a16-4b72-a61b-8dd6b73be178","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6599b243-3b2f-4fb7-9338-076925892aeb","timestamp":1749107452016,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9df61284-28fa-421e-b413-760c40a365ef","data":{"dongle_infos":[]},"tid":"6faf879e-e160-48a6-a3c9-cec4276dc584","timestamp":1749107452162,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9330579a-c28e-4209-bd21-e5450fc3f982","data":{"departure_trajectory":[]},"tid":"664d3058-8f5f-446b-a863-d6486f32735a","timestamp":1749107452441,"gateway":"8UUXN4P00A06NK"} + +{"bid":"37f37a5a-2fc4-4bfa-9e05-016c0d28afab","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"543ebe5c-6e47-4d28-ad56-039a8e8c16dc","timestamp":1749107453813,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1fd0488f-964c-474e-bb08-ebf5c442b96d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0dd30697-a5a4-4a09-8765-94747a7b3c6d","timestamp":1749107453814,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4925a08d-f3d8-4fe0-9597-899aa953143c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1196efd7-e903-4dd1-b92e-26e499056d08","timestamp":1749107454856,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4925a08d-f3d8-4fe0-9597-899aa953143c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1196efd7-e903-4dd1-b92e-26e499056d08","timestamp":1749107457012,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5803f1bc-b98a-42ff-8358-53e39e14dc2f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d81e5492-0f62-4bf6-afd7-06d24877e45d","timestamp":1749107459715,"gateway":"8UUXN4P00A06NK"} + +{"bid":"676f9322-1bf9-4761-a48e-e1b31e0c71df","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ecd9bfd0-85a7-48e6-b396-088b171a466e","timestamp":1749107459853,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ec6186c0-fdd5-4648-bbee-8654347d5069","bid":"d2c0a165-64dc-4aed-9b02-95c3b9b98247","timestamp":1749107484760,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"e27150f4-884d-4514-9273-1b6e6a5813a8","bid":"7e76f65a-b7f5-4646-aa9c-2d7eed72cf10","timestamp":1749107484767,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"bf51fa0e-e8ac-4808-8b9e-5ae13d2e3db6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7186df64-f71c-45f0-86eb-508dad6949cf","timestamp":1749107486472,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f688db12-c303-47b9-b008-73f7b08bf4c2","data":{"air_transfer_enable":false},"need_reply":1,"tid":"74b28d44-694e-4f26-9bd2-89e12309a97c","timestamp":1749107486754,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cfdcc9ec-eef2-44f2-9096-e08096b3742e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a0d01721-bcdf-48be-a065-befe58de1a73","timestamp":1749107487095,"gateway":"8UUXN4P00A06NK"} + +{"bid":"15fd23a9-ecb9-40ae-a51e-7df89add730f","data":{"dongle_infos":[]},"tid":"cefe75a3-ec30-491b-acd8-a0fbc5adeee4","timestamp":1749107487111,"gateway":"8UUXN4P00A06NK"} + +{"bid":"38e356dc-b7f2-4818-bfc8-f8449dce06a9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"6b345d55-2f58-498e-beac-dcc562bbda4f","timestamp":1749107487116,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b5b76afb-ddb8-4e7d-89b6-58982d5124d0","data":{"dongle_infos":[]},"tid":"17983774-814d-45ca-8dc4-d2f8bc0b5fa8","timestamp":1749107487120,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e6a4bfbb-2774-43ab-970f-5621a6b7ef0d","data":{"firmware_version":"13.01.0002"},"tid":"3c6eff69-5858-4aa2-9fe1-222b91ed79e1","timestamp":1749107487137,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9cd3250a-f250-4a7b-9ebd-94df5813f27c","data":{"dongle_infos":[]},"tid":"d170d858-25ad-4caa-a114-cd7f95a7c242","timestamp":1749107488130,"gateway":"8UUXN4P00A06NK"} + +{"tid":"5a07a524-a682-4445-8e3c-7154aeede4d0","bid":"16371f51-f6d4-4369-ac89-8c6a3223e0e2","timestamp":1749107488164,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"bf51fa0e-e8ac-4808-8b9e-5ae13d2e3db6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7186df64-f71c-45f0-86eb-508dad6949cf","timestamp":1749107488599,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cfdcc9ec-eef2-44f2-9096-e08096b3742e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a0d01721-bcdf-48be-a065-befe58de1a73","timestamp":1749107489198,"gateway":"8UUXN4P00A06NK"} + +{"bid":"38e356dc-b7f2-4818-bfc8-f8449dce06a9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"6b345d55-2f58-498e-beac-dcc562bbda4f","timestamp":1749107489199,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ebab42b0-e368-4779-82a0-5183bba31206","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8ccca564-8ec2-40c4-98ee-c4782b1d573b","timestamp":1749107489763,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f688db12-c303-47b9-b008-73f7b08bf4c2","data":{"air_transfer_enable":false},"need_reply":1,"tid":"74b28d44-694e-4f26-9bd2-89e12309a97c","timestamp":1749107490955,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a8230ab0-c285-46ec-aa6f-003c53258811","data":{"departure_trajectory":[]},"tid":"35fbebd5-1639-4568-9f6b-5b049858c12a","timestamp":1749107491107,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ebab42b0-e368-4779-82a0-5183bba31206","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8ccca564-8ec2-40c4-98ee-c4782b1d573b","timestamp":1749107491799,"gateway":"8UUXN4P00A06NK"} + +{"bid":"40763f38-e6f1-4945-b6a3-1e910f77aeb7","data":{"departure_trajectory":[]},"tid":"08b4a2d5-5012-449d-9fcb-68e1ff38cc26","timestamp":1749107492108,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cfdcc9ec-eef2-44f2-9096-e08096b3742e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a0d01721-bcdf-48be-a065-befe58de1a73","timestamp":1749107493399,"gateway":"8UUXN4P00A06NK"} + +{"bid":"38e356dc-b7f2-4818-bfc8-f8449dce06a9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"6b345d55-2f58-498e-beac-dcc562bbda4f","timestamp":1749107493400,"gateway":"8UUXN4P00A06NK"} + +{"bid":"167be47b-3a00-4215-b784-8941a9e40a44","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ee3f14fc-d4dc-438f-8a58-2130a2aa7ccb","timestamp":1749107494760,"gateway":"8UUXN4P00A06NK"} + +{"bid":"167be47b-3a00-4215-b784-8941a9e40a44","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ee3f14fc-d4dc-438f-8a58-2130a2aa7ccb","timestamp":1749107496799,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f688db12-c303-47b9-b008-73f7b08bf4c2","data":{"air_transfer_enable":false},"need_reply":1,"tid":"74b28d44-694e-4f26-9bd2-89e12309a97c","timestamp":1749107499149,"gateway":"8UUXN4P00A06NK"} + +{"bid":"407d331c-21c8-407a-821f-1bef77ecceb0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"340db47f-3a31-41f9-8e6f-52bd33de4d5c","timestamp":1749107499765,"gateway":"8UUXN4P00A06NK"} + +{"tid":"8870b237-56f3-486b-a938-178a4b39002d","bid":"3fad6ce1-8dc2-484e-92ae-4850ee1e9c6f","timestamp":1749107522887,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"96a7701d-eeef-4fd6-ae84-55afe66a895c","bid":"5577dea5-c5bb-4f86-9859-cfdd855f1eb3","timestamp":1749107522896,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"0799d3fa-b353-4ec9-989f-0382aacc180e","bid":"fcaaebe0-efea-4ddd-8108-72e5338eae71","timestamp":1749107523410,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"6236a1aa-f9e0-45ee-a9a3-f460ba07f719","bid":"606530ff-b28b-41c3-b350-68bf67cdb74e","timestamp":1749107523421,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"af6c3d31-f592-466b-b136-de8fe0871513","data":{"air_transfer_enable":false},"need_reply":1,"tid":"af273820-097f-4d38-bf2b-4544ca5a3ec1","timestamp":1749107524597,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c25b79b7-a4af-4262-a76d-262e826e9572","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"acc0721c-d4d8-4332-8177-12f69c3e4adc","timestamp":1749107526887,"gateway":"8UUXN4P00A06NK"} + +{"bid":"20810911-72e3-4fe4-8e10-b9700f795770","data":{"dongle_infos":[]},"tid":"a30b7b30-8d9f-4dfc-a2cb-09d9ff01d2c5","timestamp":1749107526917,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e8436992-033b-470f-bf42-9ceb65262d3d","data":{"dongle_infos":[]},"tid":"aed692ef-8613-48cc-8675-2fb66c5bad28","timestamp":1749107526919,"gateway":"8UUXN4P00A06NK"} + +{"bid":"af6c3d31-f592-466b-b136-de8fe0871513","data":{"air_transfer_enable":false},"need_reply":1,"tid":"af273820-097f-4d38-bf2b-4544ca5a3ec1","timestamp":1749107527111,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d7639dca-8275-4d42-b195-7905b143dfbd","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"75c238ed-55b3-49be-b466-bac0d0a3dcd6","timestamp":1749107527498,"gateway":"8UUXN4P00A06NK"} + +{"bid":"179ed0a4-d84a-44ce-9a96-b2890d8f2475","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a6bc1272-1083-4b78-9f3b-f6da3c820ca3","timestamp":1749107527506,"gateway":"8UUXN4P00A06NK"} + +{"bid":"356b2f9f-3b20-4bbd-9143-b1532ab1a498","data":{"firmware_version":"13.01.0002"},"tid":"89728f00-b371-4d0c-832a-3f121c73aeec","timestamp":1749107527506,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9a23633d-9620-486e-a4f6-3a868e5b61cd","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"64df3e5d-58a6-4500-b931-c07265632953","timestamp":1749107527894,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b8a74752-7199-4d72-a92a-bd7beab7ead7","data":{"dongle_infos":[]},"tid":"32f030ad-a2e4-4802-b89a-f197f7324f98","timestamp":1749107527982,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bf1cf8a8-7a0f-4b0a-b0d0-d7f48161f3ce","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f0bb518a-594b-47dd-8860-8a0080d795b4","timestamp":1749107528413,"gateway":"8UUXN4P00A06NK"} + +{"tid":"6c590f67-0f8a-4f75-b7ab-834126c4de15","bid":"636a80da-19ea-4c5f-bdb3-d439708b5bf8","timestamp":1749107528594,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"d7639dca-8275-4d42-b195-7905b143dfbd","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"75c238ed-55b3-49be-b466-bac0d0a3dcd6","timestamp":1749107529576,"gateway":"8UUXN4P00A06NK"} + +{"bid":"179ed0a4-d84a-44ce-9a96-b2890d8f2475","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a6bc1272-1083-4b78-9f3b-f6da3c820ca3","timestamp":1749107529577,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bf1cf8a8-7a0f-4b0a-b0d0-d7f48161f3ce","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f0bb518a-594b-47dd-8860-8a0080d795b4","timestamp":1749107530568,"gateway":"8UUXN4P00A06NK"} + +{"bid":"af6c3d31-f592-466b-b136-de8fe0871513","data":{"air_transfer_enable":false},"need_reply":1,"tid":"af273820-097f-4d38-bf2b-4544ca5a3ec1","timestamp":1749107531316,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f534abca-3a03-440b-9d10-96c983cbcd23","data":{"departure_trajectory":[]},"tid":"e9ffcf52-e3a5-4eec-ba7e-dfd32fc4fb62","timestamp":1749107531364,"gateway":"8UUXN4P00A06NK"} + +{"bid":"843e60bf-aae0-4b42-8622-3b03c0c7f8c4","data":{"departure_trajectory":[]},"tid":"cda68334-479c-417a-9ff1-51b82de3cda6","timestamp":1749107531909,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7ca902f8-1659-4226-ad64-12f83e7d615a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2e41ccec-b14d-41c9-b912-740a9e3406f2","timestamp":1749107532895,"gateway":"8UUXN4P00A06NK"} + +{"bid":"37802087-91d2-44ae-a958-a1cbf708c668","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a3972a03-d360-4d98-9d21-0659b17557ad","timestamp":1749107533410,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d7639dca-8275-4d42-b195-7905b143dfbd","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"75c238ed-55b3-49be-b466-bac0d0a3dcd6","timestamp":1749107533771,"gateway":"8UUXN4P00A06NK"} + +{"bid":"179ed0a4-d84a-44ce-9a96-b2890d8f2475","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a6bc1272-1083-4b78-9f3b-f6da3c820ca3","timestamp":1749107533772,"gateway":"8UUXN4P00A06NK"} + +{"bid":"37802087-91d2-44ae-a958-a1cbf708c668","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a3972a03-d360-4d98-9d21-0659b17557ad","timestamp":1749107535575,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c8e9cedd-976a-47d9-b72d-f841d4c76a8c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6c732319-b465-42ca-8ebe-503960d840b0","timestamp":1749107537894,"gateway":"8UUXN4P00A06NK"} + +{"bid":"18036d9f-bc6a-4658-9af4-ffb1ddc1d5c7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b6d971cd-0908-40eb-bc29-6089d4fa744d","timestamp":1749107538412,"gateway":"8UUXN4P00A06NK"} + +{"bid":"af6c3d31-f592-466b-b136-de8fe0871513","data":{"air_transfer_enable":false},"need_reply":1,"tid":"af273820-097f-4d38-bf2b-4544ca5a3ec1","timestamp":1749107539512,"gateway":"8UUXN4P00A06NK"} + +{"bid":"18036d9f-bc6a-4658-9af4-ffb1ddc1d5c7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b6d971cd-0908-40eb-bc29-6089d4fa744d","timestamp":1749107540571,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d7639dca-8275-4d42-b195-7905b143dfbd","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"75c238ed-55b3-49be-b466-bac0d0a3dcd6","timestamp":1749107541975,"gateway":"8UUXN4P00A06NK"} + +{"bid":"179ed0a4-d84a-44ce-9a96-b2890d8f2475","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a6bc1272-1083-4b78-9f3b-f6da3c820ca3","timestamp":1749107541976,"gateway":"8UUXN4P00A06NK"} + +{"bid":"18036d9f-bc6a-4658-9af4-ffb1ddc1d5c7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b6d971cd-0908-40eb-bc29-6089d4fa744d","timestamp":1749107544769,"gateway":"8UUXN4P00A06NK"} + +{"bid":"af6c3d31-f592-466b-b136-de8fe0871513","data":{"air_transfer_enable":false},"need_reply":1,"tid":"af273820-097f-4d38-bf2b-4544ca5a3ec1","timestamp":1749107547717,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d7639dca-8275-4d42-b195-7905b143dfbd","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"75c238ed-55b3-49be-b466-bac0d0a3dcd6","timestamp":1749107550172,"gateway":"8UUXN4P00A06NK"} + +{"bid":"179ed0a4-d84a-44ce-9a96-b2890d8f2475","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a6bc1272-1083-4b78-9f3b-f6da3c820ca3","timestamp":1749107550174,"gateway":"8UUXN4P00A06NK"} + +{"bid":"18036d9f-bc6a-4658-9af4-ffb1ddc1d5c7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b6d971cd-0908-40eb-bc29-6089d4fa744d","timestamp":1749107552977,"gateway":"8UUXN4P00A06NK"} + +{"bid":"af6c3d31-f592-466b-b136-de8fe0871513","data":{"air_transfer_enable":false},"need_reply":1,"tid":"af273820-097f-4d38-bf2b-4544ca5a3ec1","timestamp":1749107555915,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d7639dca-8275-4d42-b195-7905b143dfbd","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"75c238ed-55b3-49be-b466-bac0d0a3dcd6","timestamp":1749107558368,"gateway":"8UUXN4P00A06NK"} + +{"bid":"179ed0a4-d84a-44ce-9a96-b2890d8f2475","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a6bc1272-1083-4b78-9f3b-f6da3c820ca3","timestamp":1749107558368,"gateway":"8UUXN4P00A06NK"} + +{"bid":"18036d9f-bc6a-4658-9af4-ffb1ddc1d5c7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b6d971cd-0908-40eb-bc29-6089d4fa744d","timestamp":1749107561174,"gateway":"8UUXN4P00A06NK"} + +{"tid":"20ec804e-dd05-4a30-9ade-5d396a3277af","bid":"3077cf43-764c-48c3-bd18-56e9d57cbd36","timestamp":1749107562908,"data":{"live_status":[{"video_id":"8UUXN4P00A06NK/165-0-7/normal-0","video_type":"normal","video_quality":4,"status":1,"error_status":0}]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"af6c3d31-f592-466b-b136-de8fe0871513","data":{"air_transfer_enable":false},"need_reply":1,"tid":"af273820-097f-4d38-bf2b-4544ca5a3ec1","timestamp":1749107564112,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d7639dca-8275-4d42-b195-7905b143dfbd","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"75c238ed-55b3-49be-b466-bac0d0a3dcd6","timestamp":1749107566574,"gateway":"8UUXN4P00A06NK"} + +{"bid":"179ed0a4-d84a-44ce-9a96-b2890d8f2475","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a6bc1272-1083-4b78-9f3b-f6da3c820ca3","timestamp":1749107566575,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fd841b71-045c-4326-bf86-df991cf43d4c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"1190d168-2861-4479-ac04-d73dd45ee8fd","timestamp":1749107567911,"gateway":"8UUXN4P00A06NK"} + +{"bid":"18036d9f-bc6a-4658-9af4-ffb1ddc1d5c7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b6d971cd-0908-40eb-bc29-6089d4fa744d","timestamp":1749107569369,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fd841b71-045c-4326-bf86-df991cf43d4c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"1190d168-2861-4479-ac04-d73dd45ee8fd","timestamp":1749107569972,"gateway":"8UUXN4P00A06NK"} + +{"bid":"af6c3d31-f592-466b-b136-de8fe0871513","data":{"air_transfer_enable":false},"need_reply":1,"tid":"af273820-097f-4d38-bf2b-4544ca5a3ec1","timestamp":1749107572311,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fd841b71-045c-4326-bf86-df991cf43d4c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"1190d168-2861-4479-ac04-d73dd45ee8fd","timestamp":1749107574169,"gateway":"8UUXN4P00A06NK"} + +{"bid":"179ed0a4-d84a-44ce-9a96-b2890d8f2475","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a6bc1272-1083-4b78-9f3b-f6da3c820ca3","timestamp":1749107574773,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fd841b71-045c-4326-bf86-df991cf43d4c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"1190d168-2861-4479-ac04-d73dd45ee8fd","timestamp":1749107623369,"gateway":"8UUXN4P00A06NK"} + +{"tid":"474ba2cd-b42b-4e6d-8c6c-d97b9b1d2a18","bid":"7c5ffb10-cf59-4b2b-acad-e49d85aa6d61","timestamp":1749107668047,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"0a83c8f6-f2d1-4e65-933b-957d7256c43d","bid":"ff7b9379-e566-4dea-82dd-341716362878","timestamp":1749107668050,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"429e43e7-c7ba-4add-aafb-d5695792ae87","data":{"air_transfer_enable":false},"need_reply":1,"tid":"6b11edad-6fa5-4e31-80f3-51dfea54ad31","timestamp":1749107668292,"gateway":"8UUXN4P00A06NK"} + +{"bid":"97f4f778-d59c-409f-8600-f9eccb6aaab4","data":{"mobility_status_notify":0},"need_reply":1,"tid":"51473b55-c537-48b9-8ded-a5b9d51632f7","timestamp":1749107670519,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e179e634-a312-4037-a081-d83c69cd4251","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7034b189-414c-4af8-ad95-4df986edab7f","timestamp":1749107670521,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fbd0bdbc-785f-4ce3-a8c6-d2b5c0bdedb6","data":{"dongle_infos":[]},"tid":"a8240c10-4919-42dd-ba2a-b569db52d0cf","timestamp":1749107670725,"gateway":"8UUXN4P00A06NK"} + +{"bid":"43dcd54a-9975-40f8-bba8-a78127a0415b","data":{"firmware_version":"13.01.0002"},"tid":"3df273d8-c06f-496d-962d-c3a904ec1c4f","timestamp":1749107670747,"gateway":"8UUXN4P00A06NK"} + +{"bid":"429e43e7-c7ba-4add-aafb-d5695792ae87","data":{"air_transfer_enable":false},"need_reply":1,"tid":"6b11edad-6fa5-4e31-80f3-51dfea54ad31","timestamp":1749107670923,"gateway":"8UUXN4P00A06NK"} + +{"tid":"777b7749-bec2-40e6-b447-97c7ce41b297","bid":"86af2817-642d-46f7-a8e4-b7c26bd83270","timestamp":1749107671546,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"6e6cfd3f-29c7-4a2f-a247-bef8faa6946d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3ce50188-1231-4860-b2f2-9c2bb33d9813","timestamp":1749107671673,"gateway":"8UUXN4P00A06NK"} + +{"bid":"012fa646-0000-44b4-8fb0-aacd79890741","data":{"dongle_infos":[]},"tid":"0e7ecf65-59f8-4177-947e-7d6be9588f16","timestamp":1749107671773,"gateway":"8UUXN4P00A06NK"} + +{"bid":"97f4f778-d59c-409f-8600-f9eccb6aaab4","data":{"mobility_status_notify":0},"need_reply":1,"tid":"51473b55-c537-48b9-8ded-a5b9d51632f7","timestamp":1749107672599,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e179e634-a312-4037-a081-d83c69cd4251","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7034b189-414c-4af8-ad95-4df986edab7f","timestamp":1749107672600,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fb5a3c04-fb23-4b54-8de1-90525c01e49c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"68cf30dc-e5e0-4385-9ace-261425c3112a","timestamp":1749107673049,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6e6cfd3f-29c7-4a2f-a247-bef8faa6946d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3ce50188-1231-4860-b2f2-9c2bb33d9813","timestamp":1749107673799,"gateway":"8UUXN4P00A06NK"} + +{"bid":"429e43e7-c7ba-4add-aafb-d5695792ae87","data":{"air_transfer_enable":false},"need_reply":1,"tid":"6b11edad-6fa5-4e31-80f3-51dfea54ad31","timestamp":1749107675118,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b1d78d33-51a3-405a-a78f-b7c7d5c5a6bb","data":{"departure_trajectory":[]},"tid":"e2c9b426-710f-44d1-9056-ba92d7d27b6c","timestamp":1749107675177,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fb5a3c04-fb23-4b54-8de1-90525c01e49c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"68cf30dc-e5e0-4385-9ace-261425c3112a","timestamp":1749107675198,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5dfff5bb-96d5-436d-9655-9fae6b3ce1ff","data":{"dongle_infos":[]},"tid":"25dc907f-7f14-45bb-9001-38552e729c04","timestamp":1749107675313,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e54244c1-c8d3-4dbc-9f24-2e1bb258f120","data":{"departure_trajectory":[]},"tid":"5972f1bb-3351-42d1-ad09-dbd9109f9548","timestamp":1749107675718,"gateway":"8UUXN4P00A06NK"} + +{"bid":"97f4f778-d59c-409f-8600-f9eccb6aaab4","data":{"mobility_status_notify":0},"need_reply":1,"tid":"51473b55-c537-48b9-8ded-a5b9d51632f7","timestamp":1749107676798,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6e6cfd3f-29c7-4a2f-a247-bef8faa6946d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3ce50188-1231-4860-b2f2-9c2bb33d9813","timestamp":1749107677995,"gateway":"8UUXN4P00A06NK"} + +{"bid":"64e4fc19-2d81-401d-82ab-eedbcdd52788","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"dd04081e-4722-4db4-bb07-17348522689a","timestamp":1749107678045,"gateway":"8UUXN4P00A06NK"} + +{"bid":"64e4fc19-2d81-401d-82ab-eedbcdd52788","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"dd04081e-4722-4db4-bb07-17348522689a","timestamp":1749107680198,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6982e3f8-8370-4566-bbb6-034eb9f0f6cb","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"23c809ce-8eef-487b-9330-5d0aca098682","timestamp":1749107683046,"gateway":"8UUXN4P00A06NK"} + +{"tid":"418574d7-a9b9-4a6d-a3b7-9037bf9ce6b3","bid":"a45b6bb4-7be3-4339-ab8e-ef53cb563f82","timestamp":1749107707836,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"d5e7962e-a8af-4562-ba0c-e5d247e63729","bid":"9fed47b0-40bf-4d65-87e3-e57594b274e3","timestamp":1749107707838,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"613ad6e2-b1bb-4a88-bdb5-964b7dd1b863","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ba37107b-15ec-4641-9343-e406274c71b6","timestamp":1749107709450,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b2bbdd68-40f6-421d-9400-014b9eb16338","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a4fbc490-869d-4de3-a32f-64361a76652f","timestamp":1749107709453,"gateway":"8UUXN4P00A06NK"} + +{"bid":"77210ec4-146c-4653-8db5-9fb417bd9063","data":{"dongle_infos":[]},"tid":"9d99d8aa-f71a-4808-a51e-dc4d302b5aac","timestamp":1749107709927,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9d6fcc72-28df-4de7-999e-61c681e724a6","data":{"firmware_version":"13.01.0002"},"tid":"8252b204-905b-4cf8-b7ba-203cd84dbef0","timestamp":1749107709957,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e5093410-b261-424e-aff5-578e8f011d42","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3757fe63-2036-4e4e-9998-26c714248758","timestamp":1749107710121,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2229867f-2501-429f-b4b5-6b8e27654ca2","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c3cb73c9-571b-4eff-8248-2cdd344ea9fa","timestamp":1749107710530,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cc466aee-5ec1-487e-96f4-d9127a0a304c","data":{"dongle_infos":[]},"tid":"db199d2c-4bbd-42be-810f-22ed078dcfcc","timestamp":1749107710957,"gateway":"8UUXN4P00A06NK"} + +{"tid":"6af8eade-7667-4e8b-9e29-825a688002cd","bid":"a665ec20-7e31-4391-8426-c002994e1886","timestamp":1749107711415,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"613ad6e2-b1bb-4a88-bdb5-964b7dd1b863","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ba37107b-15ec-4641-9343-e406274c71b6","timestamp":1749107711636,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b2bbdd68-40f6-421d-9400-014b9eb16338","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a4fbc490-869d-4de3-a32f-64361a76652f","timestamp":1749107711637,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2229867f-2501-429f-b4b5-6b8e27654ca2","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c3cb73c9-571b-4eff-8248-2cdd344ea9fa","timestamp":1749107712632,"gateway":"8UUXN4P00A06NK"} + +{"bid":"67189100-dde6-4f0e-9896-3a8f899ee48e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6cf9b534-f0c3-463c-9520-a745507fa915","timestamp":1749107712844,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a6aa0a5b-5f5e-435a-8cf9-a343614a1723","data":{"dongle_infos":[]},"tid":"6264dd07-7f28-44bd-a1fa-449479d7b509","timestamp":1749107714072,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4d74949c-975f-41d6-a74b-26d5cfbbf127","data":{"departure_trajectory":[]},"tid":"a496861a-3f65-4fe9-9f6c-a014b041400d","timestamp":1749107714253,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e5093410-b261-424e-aff5-578e8f011d42","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3757fe63-2036-4e4e-9998-26c714248758","timestamp":1749107714318,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fc9bcabb-b423-48c2-aa66-8fcb970047a8","data":{"departure_trajectory":[]},"tid":"19372e8f-fc65-440f-b5fc-b7ee5e60a3dd","timestamp":1749107714921,"gateway":"8UUXN4P00A06NK"} + +{"bid":"67189100-dde6-4f0e-9896-3a8f899ee48e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6cf9b534-f0c3-463c-9520-a745507fa915","timestamp":1749107715035,"gateway":"8UUXN4P00A06NK"} + +{"bid":"613ad6e2-b1bb-4a88-bdb5-964b7dd1b863","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ba37107b-15ec-4641-9343-e406274c71b6","timestamp":1749107715828,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2229867f-2501-429f-b4b5-6b8e27654ca2","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c3cb73c9-571b-4eff-8248-2cdd344ea9fa","timestamp":1749107716833,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b481338d-f0db-45e6-8578-0526b52ea301","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f083cd22-1c0f-4ec7-a3df-4085982011ae","timestamp":1749107717845,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b481338d-f0db-45e6-8578-0526b52ea301","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f083cd22-1c0f-4ec7-a3df-4085982011ae","timestamp":1749107720029,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e5093410-b261-424e-aff5-578e8f011d42","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3757fe63-2036-4e4e-9998-26c714248758","timestamp":1749107722523,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a350ab07-b3ad-417c-ac94-3f3b02dedac1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bccb3b5f-0ad8-427b-9e07-7345641c8380","timestamp":1749107722847,"gateway":"8UUXN4P00A06NK"} + +{"tid":"84a990b7-47df-43c0-b57e-07e4185c3314","bid":"699d9961-2938-47ec-afc1-e70ba0d9dec1","timestamp":1749107747526,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"cdc09f6d-2c58-4757-a9e7-94ab5c1ceba9","bid":"e68bb7c0-1ed4-4fc1-9443-573d695ab51f","timestamp":1749107747529,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"09ae848b-cc87-42cb-bd34-031e6cd22c0c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3e061189-b24b-457f-b010-d4687df48c02","timestamp":1749107749357,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fef1b347-c3d3-42e4-8773-b639d557d94b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"187f4f75-1c61-4bc4-bcf3-841f4f534097","timestamp":1749107750012,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a85ceed2-6f04-49d9-b658-aad30412c286","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"59f30563-5be1-4537-9ca2-7b3c67e0b5c4","timestamp":1749107750401,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e5ea16ea-3028-434d-a6f5-1dd1dadd7bff","data":{"dongle_infos":[]},"tid":"84af7fdb-804c-49c9-825a-7c85312645ac","timestamp":1749107750411,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fecaa492-97cd-427b-82ae-a7f034c8a3d6","data":{"dongle_infos":[]},"tid":"90b73d34-3cae-4099-be9d-dfd6413cbaee","timestamp":1749107750412,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4967efbf-1786-42b3-ae0d-959043554573","data":{"mobility_status_notify":0},"need_reply":1,"tid":"28264528-f5a9-4200-a46d-5cca61133e24","timestamp":1749107750419,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bf8eb4ad-750e-46e4-a3b0-20b779296196","data":{"firmware_version":"13.01.0002"},"tid":"0c9430c1-79b7-408e-b6cf-dcfefdaf9cc2","timestamp":1749107750445,"gateway":"8UUXN4P00A06NK"} + +{"tid":"f3dd4441-d29d-4089-93a4-99f2aabbebf6","bid":"c7bd0d5c-c423-4ca5-b0af-49e4711007c7","timestamp":1749107751167,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"7b3564f0-031a-47a3-a356-b1146ef6f575","data":{"dongle_infos":[]},"tid":"340ba853-4817-451f-9123-5f882ac6647f","timestamp":1749107751455,"gateway":"8UUXN4P00A06NK"} + +{"bid":"09ae848b-cc87-42cb-bd34-031e6cd22c0c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3e061189-b24b-457f-b010-d4687df48c02","timestamp":1749107751503,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a85ceed2-6f04-49d9-b658-aad30412c286","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"59f30563-5be1-4537-9ca2-7b3c67e0b5c4","timestamp":1749107752504,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4967efbf-1786-42b3-ae0d-959043554573","data":{"mobility_status_notify":0},"need_reply":1,"tid":"28264528-f5a9-4200-a46d-5cca61133e24","timestamp":1749107752505,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b4088ddd-af20-45c7-bea4-f11626631d52","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9ef21bda-15fa-469b-8f89-62b5b24d83ed","timestamp":1749107752524,"gateway":"8UUXN4P00A06NK"} + +{"bid":"215e8443-5207-464a-af6f-8a86d7aeda76","data":{"departure_trajectory":[]},"tid":"b4fdfea0-037b-4bbb-91de-93077331cf37","timestamp":1749107754203,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fef1b347-c3d3-42e4-8773-b639d557d94b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"187f4f75-1c61-4bc4-bcf3-841f4f534097","timestamp":1749107754217,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b4088ddd-af20-45c7-bea4-f11626631d52","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9ef21bda-15fa-469b-8f89-62b5b24d83ed","timestamp":1749107754702,"gateway":"8UUXN4P00A06NK"} + +{"bid":"47d0cdec-475e-49b0-94bc-4c19dc2b0f67","data":{"departure_trajectory":[]},"tid":"e766ef19-a8e2-4dd0-9538-d037e7be4f54","timestamp":1749107755403,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a85ceed2-6f04-49d9-b658-aad30412c286","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"59f30563-5be1-4537-9ca2-7b3c67e0b5c4","timestamp":1749107756705,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4967efbf-1786-42b3-ae0d-959043554573","data":{"mobility_status_notify":0},"need_reply":1,"tid":"28264528-f5a9-4200-a46d-5cca61133e24","timestamp":1749107756706,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a548df05-9091-495f-ae8a-6e50affe9cec","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"89bc2fa8-bba5-4205-884f-d512c8062113","timestamp":1749107757526,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a548df05-9091-495f-ae8a-6e50affe9cec","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"89bc2fa8-bba5-4205-884f-d512c8062113","timestamp":1749107759703,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fef1b347-c3d3-42e4-8773-b639d557d94b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"187f4f75-1c61-4bc4-bcf3-841f4f534097","timestamp":1749107762415,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bb35785a-4a55-476a-98ee-7a9280e3d0b5","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a15debc4-8fd8-47fa-9066-671211283d0d","timestamp":1749107762522,"gateway":"8UUXN4P00A06NK"} + +{"tid":"0b96ac76-a3ba-4137-994b-ebc562bd84f4","bid":"6480f5ad-d168-4e23-8325-982388dd1206","timestamp":1749107788147,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"d63c82b6-38d9-43f7-a5dc-36942d9f98ff","bid":"28cf69bf-76b2-4686-b69b-194af35ef324","timestamp":1749107788149,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"aaa86c8c-74c1-4ede-9af3-942b3111d87f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"64ff821f-d345-498e-b1e1-744559503a6b","timestamp":1749107789897,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e2fde65f-8b12-41bf-8e08-d4dcdd57ab16","data":{"air_transfer_enable":false},"need_reply":1,"tid":"f7b33f86-03de-463c-9ff6-a4203e2a16d3","timestamp":1749107790249,"gateway":"8UUXN4P00A06NK"} + +{"bid":"293359af-442e-48d2-9a38-f2dc72464abb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e75e496c-22fb-4ae3-a8b7-7ed37061c42a","timestamp":1749107790535,"gateway":"8UUXN4P00A06NK"} + +{"bid":"97cd25da-c1e3-439d-8862-5ab2053c8700","data":{"dongle_infos":[]},"tid":"f6d43279-0d71-4435-ae28-a84d8fe8610e","timestamp":1749107790545,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5b6a266d-26a2-47d2-9d8c-7fc2bae65490","data":{"mobility_status_notify":0},"need_reply":1,"tid":"64c10474-bb91-4f27-8c7d-c277a3718ec4","timestamp":1749107790553,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b8b7a931-1dfe-4424-b501-956595fc042c","data":{"firmware_version":"13.01.0002"},"tid":"0f484de1-ff9d-4203-bf45-dee5a902da40","timestamp":1749107790582,"gateway":"8UUXN4P00A06NK"} + +{"tid":"3562436b-b7b2-4fef-b0ef-d105a2ee2658","bid":"f4e7a886-412d-4406-b6fc-0de2a598448e","timestamp":1749107791524,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"b503d84b-2395-4897-9596-23d2a1bc38fe","data":{"dongle_infos":[]},"tid":"e49843cf-e7a3-4d16-9a60-fd78fc2cdecf","timestamp":1749107791534,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aaa86c8c-74c1-4ede-9af3-942b3111d87f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"64ff821f-d345-498e-b1e1-744559503a6b","timestamp":1749107792097,"gateway":"8UUXN4P00A06NK"} + +{"bid":"293359af-442e-48d2-9a38-f2dc72464abb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e75e496c-22fb-4ae3-a8b7-7ed37061c42a","timestamp":1749107792696,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5b6a266d-26a2-47d2-9d8c-7fc2bae65490","data":{"mobility_status_notify":0},"need_reply":1,"tid":"64c10474-bb91-4f27-8c7d-c277a3718ec4","timestamp":1749107792697,"gateway":"8UUXN4P00A06NK"} + +{"bid":"52dc5fe5-3a6b-4d0d-a445-aae7b3800944","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1cc238e9-bb76-4125-a7ea-2b183d1b52a5","timestamp":1749107793150,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e2fde65f-8b12-41bf-8e08-d4dcdd57ab16","data":{"air_transfer_enable":false},"need_reply":1,"tid":"f7b33f86-03de-463c-9ff6-a4203e2a16d3","timestamp":1749107794450,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3303383d-ef82-47a3-90fe-07cd629f4477","data":{"departure_trajectory":[]},"tid":"e01288cf-35ff-4859-b350-313c6f679352","timestamp":1749107794481,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3efe9366-b5e1-4ffb-a06e-afe138f63c06","data":{"dongle_infos":[]},"tid":"3aca5e80-e8b9-4f42-9be5-c36c0c30908a","timestamp":1749107795078,"gateway":"8UUXN4P00A06NK"} + +{"bid":"52dc5fe5-3a6b-4d0d-a445-aae7b3800944","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1cc238e9-bb76-4125-a7ea-2b183d1b52a5","timestamp":1749107795297,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1d5fe3ff-fd4b-48c0-b00a-4db74b740339","data":{"departure_trajectory":[]},"tid":"84fa4be2-2657-42b8-9b8b-938a00d55567","timestamp":1749107795529,"gateway":"8UUXN4P00A06NK"} + +{"bid":"293359af-442e-48d2-9a38-f2dc72464abb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e75e496c-22fb-4ae3-a8b7-7ed37061c42a","timestamp":1749107796896,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5b6a266d-26a2-47d2-9d8c-7fc2bae65490","data":{"mobility_status_notify":0},"need_reply":1,"tid":"64c10474-bb91-4f27-8c7d-c277a3718ec4","timestamp":1749107796898,"gateway":"8UUXN4P00A06NK"} + +{"bid":"11eadec1-9dbd-4c37-b29c-5cfded5d1877","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"22c502c4-aef7-4f4d-9619-936f8b20c4e9","timestamp":1749107798150,"gateway":"8UUXN4P00A06NK"} + +{"bid":"11eadec1-9dbd-4c37-b29c-5cfded5d1877","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"22c502c4-aef7-4f4d-9619-936f8b20c4e9","timestamp":1749107800296,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e2fde65f-8b12-41bf-8e08-d4dcdd57ab16","data":{"air_transfer_enable":false},"need_reply":1,"tid":"f7b33f86-03de-463c-9ff6-a4203e2a16d3","timestamp":1749107802649,"gateway":"8UUXN4P00A06NK"} + +{"bid":"baa5ca76-6f17-4eda-97c1-b5d69ee8bcd6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7305f943-abe4-4cc3-bdbd-6c4fab7e3b27","timestamp":1749107803150,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c969ad39-98d6-448e-9656-6e6ba4b40cfb","bid":"18421532-71c8-4a6b-aa38-b3280c688c48","timestamp":1749107828141,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"c85ca208-4039-40ed-9d85-33caf06e5cfe","bid":"38bb92f0-9e81-4712-ab06-9bf5f7b797b1","timestamp":1749107828144,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"19305823-6c11-4c16-a7d0-4059c1970bd8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"40b98c85-b523-490d-bc98-5fd58f1501d3","timestamp":1749107829887,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f5688cac-bd80-425e-8f41-ad3299fbf056","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8d184ba8-d3bd-4fd0-97a9-7dab40c523c9","timestamp":1749107830337,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d6028a20-1b68-4e66-8830-7acc4d0de407","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1c9147d2-41f7-4542-99de-7c0a934fe969","timestamp":1749107830512,"gateway":"8UUXN4P00A06NK"} + +{"bid":"abbe4737-f4b7-46d8-8394-8709ce7e3d30","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c5e3e754-c89d-4d66-9fca-2a7586b35758","timestamp":1749107830521,"gateway":"8UUXN4P00A06NK"} + +{"bid":"096d04ac-2bbe-403a-801a-0d17ac5932a1","data":{"dongle_infos":[]},"tid":"c2a89fb4-0713-423f-b4a9-c69e8cb5dcf7","timestamp":1749107830527,"gateway":"8UUXN4P00A06NK"} + +{"bid":"46062d0a-a449-48e1-ba78-92f8b5c5feae","data":{"firmware_version":"13.01.0002"},"tid":"3421d6c8-15b5-4f4f-9e66-5e3f9c91c0b8","timestamp":1749107830555,"gateway":"8UUXN4P00A06NK"} + +{"bid":"737c23c1-4a67-4e03-98ca-af8326d90b8d","data":{"dongle_infos":[]},"tid":"d1957ca3-47f8-4b65-bb78-9343c89ea9b5","timestamp":1749107831515,"gateway":"8UUXN4P00A06NK"} + +{"tid":"062fd28f-f0f5-4be4-960c-06a67d65d9ba","bid":"72e5d98e-6c95-481b-8f1c-086ab4a1116b","timestamp":1749107831674,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"19305823-6c11-4c16-a7d0-4059c1970bd8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"40b98c85-b523-490d-bc98-5fd58f1501d3","timestamp":1749107831915,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d6028a20-1b68-4e66-8830-7acc4d0de407","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1c9147d2-41f7-4542-99de-7c0a934fe969","timestamp":1749107832714,"gateway":"8UUXN4P00A06NK"} + +{"bid":"abbe4737-f4b7-46d8-8394-8709ce7e3d30","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c5e3e754-c89d-4d66-9fca-2a7586b35758","timestamp":1749107832715,"gateway":"8UUXN4P00A06NK"} + +{"bid":"83ec097e-cef8-4b3f-a933-1fabce895f97","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bad8ae5f-0fae-40f2-a924-7c9204257f2f","timestamp":1749107833140,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ad48a772-c1fa-4e63-82f6-d67c91f3ae09","data":{"departure_trajectory":[]},"tid":"461c8743-7868-4ce3-95ba-64687f7a7b94","timestamp":1749107834477,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f5688cac-bd80-425e-8f41-ad3299fbf056","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8d184ba8-d3bd-4fd0-97a9-7dab40c523c9","timestamp":1749107834541,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b8eaf242-1ba8-491e-b2e4-cfc63c3a8076","data":{"dongle_infos":[]},"tid":"536383d3-2e3b-4ec7-a589-440d9cf86cbe","timestamp":1749107834970,"gateway":"8UUXN4P00A06NK"} + +{"bid":"83ec097e-cef8-4b3f-a933-1fabce895f97","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bad8ae5f-0fae-40f2-a924-7c9204257f2f","timestamp":1749107835315,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cce4fd27-2073-4b58-80e6-112e639431fe","data":{"departure_trajectory":[]},"tid":"5e3f812b-1ed3-43d8-975f-878f19e8a377","timestamp":1749107835506,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d6028a20-1b68-4e66-8830-7acc4d0de407","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1c9147d2-41f7-4542-99de-7c0a934fe969","timestamp":1749107836915,"gateway":"8UUXN4P00A06NK"} + +{"bid":"abbe4737-f4b7-46d8-8394-8709ce7e3d30","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c5e3e754-c89d-4d66-9fca-2a7586b35758","timestamp":1749107836917,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0ffd6c28-15d3-43cd-a556-24dd21f8890b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"105648ec-8a56-4578-b80a-634ed8c8c652","timestamp":1749107838136,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0ffd6c28-15d3-43cd-a556-24dd21f8890b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"105648ec-8a56-4578-b80a-634ed8c8c652","timestamp":1749107840313,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f5688cac-bd80-425e-8f41-ad3299fbf056","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8d184ba8-d3bd-4fd0-97a9-7dab40c523c9","timestamp":1749107842737,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bf38640d-2de5-47ff-a4fb-84de2bebd531","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"abb14b7c-28a6-4f16-a305-ca41b46cdcea","timestamp":1749107843139,"gateway":"8UUXN4P00A06NK"} + +{"tid":"bd592d26-b1e7-400c-942f-de5e74794303","bid":"5b637902-7b85-4e80-9266-9114b5ba961c","timestamp":1749107868360,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"e5e8f665-4ed1-4f53-8fc6-5634471f62e8","bid":"02395679-2b5c-421a-9e5a-d0400e73a3e0","timestamp":1749107868379,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"62dc4dd5-4cf6-4a97-9f2d-c899a1e9ab20","data":{"air_transfer_enable":false},"need_reply":1,"tid":"84a4e05d-055a-4e9f-be0e-b381aaae8ce0","timestamp":1749107868753,"gateway":"8UUXN4P00A06NK"} + +{"bid":"05494d1e-45e7-4655-be94-66fa034f860d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e30f1aec-95db-489b-a41e-51f794e01dae","timestamp":1749107871261,"gateway":"8UUXN4P00A06NK"} + +{"bid":"11a6ce98-2012-4236-adc3-58f8f513ed83","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7160bc26-6f6c-4823-ae0e-ac2babfe8e48","timestamp":1749107871274,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dde0c9c2-72dc-40b3-9237-dfd277bf03f4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e1e22aee-1bf1-41eb-8059-14eb9b73369f","timestamp":1749107871275,"gateway":"8UUXN4P00A06NK"} + +{"bid":"03342ff1-1866-4a78-971e-5404d3319ed2","data":{"dongle_infos":[]},"tid":"4b07fe54-80fa-4b04-b4a7-702479357be0","timestamp":1749107871306,"gateway":"8UUXN4P00A06NK"} + +{"bid":"41b3fe7b-e6e2-405e-ba43-f25c3d8bc6c0","data":{"firmware_version":"13.01.0002"},"tid":"640f5cd5-eadd-472c-ab44-dfb62411606d","timestamp":1749107871313,"gateway":"8UUXN4P00A06NK"} + +{"bid":"62dc4dd5-4cf6-4a97-9f2d-c899a1e9ab20","data":{"air_transfer_enable":false},"need_reply":1,"tid":"84a4e05d-055a-4e9f-be0e-b381aaae8ce0","timestamp":1749107871499,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ebd27aa4-de14-4679-8a33-c314dbddc1bf","bid":"7d80316c-3018-4a06-8b53-a5b57df25c7d","timestamp":1749107872013,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"dcb24715-4d91-454a-b80f-2ba8880939d0","data":{"dongle_infos":[]},"tid":"a4e7997e-34ee-4dbe-83bb-ea216b09943d","timestamp":1749107872344,"gateway":"8UUXN4P00A06NK"} + +{"bid":"05494d1e-45e7-4655-be94-66fa034f860d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e30f1aec-95db-489b-a41e-51f794e01dae","timestamp":1749107873268,"gateway":"8UUXN4P00A06NK"} + +{"bid":"711d0af2-5aa4-40eb-a426-8a12fc2a3e78","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4b4644a5-22f4-4e94-b03a-d649d8b25608","timestamp":1749107873359,"gateway":"8UUXN4P00A06NK"} + +{"bid":"11a6ce98-2012-4236-adc3-58f8f513ed83","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7160bc26-6f6c-4823-ae0e-ac2babfe8e48","timestamp":1749107873464,"gateway":"8UUXN4P00A06NK"} + +{"bid":"711d0af2-5aa4-40eb-a426-8a12fc2a3e78","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4b4644a5-22f4-4e94-b03a-d649d8b25608","timestamp":1749107875463,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e337c53e-b44a-458e-95af-115ded7bd404","data":{"departure_trajectory":[]},"tid":"a037afb1-20e7-493e-a7bc-d6e9f2507d80","timestamp":1749107875536,"gateway":"8UUXN4P00A06NK"} + +{"bid":"62dc4dd5-4cf6-4a97-9f2d-c899a1e9ab20","data":{"air_transfer_enable":false},"need_reply":1,"tid":"84a4e05d-055a-4e9f-be0e-b381aaae8ce0","timestamp":1749107875696,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6c951184-cc9b-449c-9bfc-5116430d71d2","data":{"dongle_infos":[]},"tid":"f5f4b9a4-9fa5-4d15-9f2a-ce0ef71e80e0","timestamp":1749107876055,"gateway":"8UUXN4P00A06NK"} + +{"bid":"14c2ae10-7c8d-4049-9f84-7c9804a38ecf","data":{"departure_trajectory":[]},"tid":"2216490f-5bc0-40f1-9aad-cf32c758e55c","timestamp":1749107876292,"gateway":"8UUXN4P00A06NK"} + +{"bid":"05494d1e-45e7-4655-be94-66fa034f860d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e30f1aec-95db-489b-a41e-51f794e01dae","timestamp":1749107877461,"gateway":"8UUXN4P00A06NK"} + +{"bid":"11a6ce98-2012-4236-adc3-58f8f513ed83","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7160bc26-6f6c-4823-ae0e-ac2babfe8e48","timestamp":1749107877663,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b501343a-52c8-4942-a901-bde091102f0a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6c1f8b7f-24ee-41c5-a5c7-0b64ec9a77d6","timestamp":1749107878357,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b501343a-52c8-4942-a901-bde091102f0a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6c1f8b7f-24ee-41c5-a5c7-0b64ec9a77d6","timestamp":1749107880471,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3be0816c-c5d4-4d27-abc7-2bad242c23cd","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"300ade45-dbb5-4336-980a-a25631739563","timestamp":1749107883351,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c346c957-b12d-4c25-860c-8c7c31768a4b","bid":"3e938dac-9ffc-43dc-89d9-df9207cce06b","timestamp":1749110409840,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"8454871f-03ce-4efc-8ef3-347cafba027c","bid":"3e22bc5d-8bf1-4038-8532-9d62c20945bc","timestamp":1749110409844,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"1ae84540-6033-4fa9-bcd8-387346cb2d6e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"babc5952-d319-4ee2-87ee-9af75a2aa95c","timestamp":1749110411629,"gateway":"8UUXN4P00A06NK"} + +{"bid":"923c29e0-941e-468f-8a80-8b08a3c9faa7","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0cb918bb-bd2d-4086-b57d-b10c3ee0dec7","timestamp":1749110411639,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c31d0088-3832-4abc-a391-2734c87b0d82","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f2cfe083-5c0e-4094-a1b2-1b5b316b3bf1","timestamp":1749110411639,"gateway":"8UUXN4P00A06NK"} + +{"bid":"614436c3-2f27-4f3e-a0fd-702e9c2a7f6b","data":{"dongle_infos":[]},"tid":"4aec128f-5486-45f7-957f-09812c1de2e1","timestamp":1749110411646,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c1e5d164-2671-47f7-b177-ed10e25ee078","data":{"firmware_version":"13.01.0002"},"tid":"d7243543-8e89-47de-b943-883cafd4d3eb","timestamp":1749110411697,"gateway":"8UUXN4P00A06NK"} + +{"bid":"75998f45-4175-47ad-958a-904872ef0b1a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"9a0e42b8-3266-4a2b-ad70-3c6d3e9697b2","timestamp":1749110411729,"gateway":"8UUXN4P00A06NK"} + +{"bid":"51401409-07a0-43dd-aee1-25ab504dafdc","data":{"dongle_infos":[]},"tid":"cf4da198-a9de-4af8-a7e6-3d5fc3bfe1e6","timestamp":1749110412698,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b3f447a6-6747-4975-9e4c-7e4367ab0ab5","bid":"22455626-9383-4008-a773-86a78e69999d","timestamp":1749110412735,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"1ae84540-6033-4fa9-bcd8-387346cb2d6e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"babc5952-d319-4ee2-87ee-9af75a2aa95c","timestamp":1749110413784,"gateway":"8UUXN4P00A06NK"} + +{"bid":"923c29e0-941e-468f-8a80-8b08a3c9faa7","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0cb918bb-bd2d-4086-b57d-b10c3ee0dec7","timestamp":1749110413785,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c31d0088-3832-4abc-a391-2734c87b0d82","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f2cfe083-5c0e-4094-a1b2-1b5b316b3bf1","timestamp":1749110413786,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3e129d96-58ea-4b55-b60b-9f812fd4ef99","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0cbc9508-c9b9-47af-b53e-a8fc4e1b0e76","timestamp":1749110414838,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6aae8376-78ee-449c-bfb4-bcfd67843c12","data":{"departure_trajectory":[]},"tid":"9b334efb-8a39-4211-939a-f7e64b9a693f","timestamp":1749110415777,"gateway":"8UUXN4P00A06NK"} + +{"bid":"75998f45-4175-47ad-958a-904872ef0b1a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"9a0e42b8-3266-4a2b-ad70-3c6d3e9697b2","timestamp":1749110415929,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f5086850-faa9-45ce-8127-72b218f179f7","data":{"dongle_infos":[]},"tid":"8285794e-ef80-403a-81cf-75d42f96fa82","timestamp":1749110416250,"gateway":"8UUXN4P00A06NK"} + +{"bid":"542a3880-d1ab-445b-8b1b-206fd9a1801b","data":{"departure_trajectory":[]},"tid":"65c5034d-3d91-43ad-86ed-8c82c332143b","timestamp":1749110416640,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3e129d96-58ea-4b55-b60b-9f812fd4ef99","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0cbc9508-c9b9-47af-b53e-a8fc4e1b0e76","timestamp":1749110416983,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1ae84540-6033-4fa9-bcd8-387346cb2d6e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"babc5952-d319-4ee2-87ee-9af75a2aa95c","timestamp":1749110417985,"gateway":"8UUXN4P00A06NK"} + +{"bid":"923c29e0-941e-468f-8a80-8b08a3c9faa7","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0cb918bb-bd2d-4086-b57d-b10c3ee0dec7","timestamp":1749110417987,"gateway":"8UUXN4P00A06NK"} + +{"bid":"33722efb-0d28-4136-995b-9b8120372c08","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cd55b4ce-6977-4020-b91d-f62e5ce74600","timestamp":1749110419838,"gateway":"8UUXN4P00A06NK"} + +{"bid":"33722efb-0d28-4136-995b-9b8120372c08","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cd55b4ce-6977-4020-b91d-f62e5ce74600","timestamp":1749110421983,"gateway":"8UUXN4P00A06NK"} + +{"bid":"75998f45-4175-47ad-958a-904872ef0b1a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"9a0e42b8-3266-4a2b-ad70-3c6d3e9697b2","timestamp":1749110424125,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7a95c76b-96e3-44e5-be37-06fe62876717","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"17e2be5c-cef5-4d7a-bf34-ad52a05304a3","timestamp":1749110424837,"gateway":"8UUXN4P00A06NK"} + +{"tid":"e0eca284-89f2-441a-a932-8466002923fe","bid":"9ada2aa8-52cc-41ca-92df-994ff7ed0fad","timestamp":1749110450065,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"2813511f-81af-4db1-9aeb-80281ece2742","bid":"202f5895-593b-4aab-a542-a0e4cbd7ba0e","timestamp":1749110450071,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"e5422f99-e287-4f54-8360-e20e9e37d5c6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7c0637ed-4c5e-4c8c-ae00-4857a12b6728","timestamp":1749110452000,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4bd1586e-cc63-4653-93a9-da6f702e853e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"948e21d0-c5b4-4cb1-bf14-98e6511ff9c4","timestamp":1749110452177,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4f9ef8de-6ec5-462b-948f-eb1d6c896e00","data":{"dongle_infos":[]},"tid":"d42e6e08-0e40-4252-b689-92e2f5d0e7e3","timestamp":1749110452461,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9402fa7e-abfa-49e4-aca1-fec9a0d92502","data":{"firmware_version":"13.01.0002"},"tid":"b3c802fe-f544-4706-a364-313c07f9e8c5","timestamp":1749110452476,"gateway":"8UUXN4P00A06NK"} + +{"bid":"abe22218-29ef-4f08-be13-4e08eefa1671","data":{"air_transfer_enable":false},"need_reply":1,"tid":"602a0323-b78c-43a6-9449-3addb536fb46","timestamp":1749110452657,"gateway":"8UUXN4P00A06NK"} + +{"bid":"37f619bc-ad95-4324-8de1-74c211460472","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ec5780ab-bc82-41b7-bf35-26dc3b2b0176","timestamp":1749110453335,"gateway":"8UUXN4P00A06NK"} + +{"bid":"64bbaf25-11a6-4fc5-8a72-4693d9eaf766","data":{"dongle_infos":[]},"tid":"76c44467-17eb-4fad-b9c4-a52895defbc3","timestamp":1749110453469,"gateway":"8UUXN4P00A06NK"} + +{"tid":"25f142d7-8e7e-46ae-af36-ddb325753f0c","bid":"91a30471-0ab5-469a-9b31-aab687dea64f","timestamp":1749110453628,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"e5422f99-e287-4f54-8360-e20e9e37d5c6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7c0637ed-4c5e-4c8c-ae00-4857a12b6728","timestamp":1749110454145,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4bd1586e-cc63-4653-93a9-da6f702e853e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"948e21d0-c5b4-4cb1-bf14-98e6511ff9c4","timestamp":1749110454344,"gateway":"8UUXN4P00A06NK"} + +{"bid":"64115f3a-aa6b-4f26-83f9-ecb38f5bb6d7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"42084ea0-f7ed-4828-abee-909de1ea2bc1","timestamp":1749110455070,"gateway":"8UUXN4P00A06NK"} + +{"bid":"37f619bc-ad95-4324-8de1-74c211460472","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ec5780ab-bc82-41b7-bf35-26dc3b2b0176","timestamp":1749110455347,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1ce6509f-046a-491d-97ec-cde6558b5460","data":{"dongle_infos":[]},"tid":"8f5107e3-fd44-4946-bcc2-6a8836766a48","timestamp":1749110456249,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a367a24a-0de7-44fb-b115-5ceaf7a5a7dc","data":{"departure_trajectory":[]},"tid":"16b63a44-051a-44b2-aa71-a5a7df32f5db","timestamp":1749110456851,"gateway":"8UUXN4P00A06NK"} + +{"bid":"abe22218-29ef-4f08-be13-4e08eefa1671","data":{"air_transfer_enable":false},"need_reply":1,"tid":"602a0323-b78c-43a6-9449-3addb536fb46","timestamp":1749110456855,"gateway":"8UUXN4P00A06NK"} + +{"bid":"64115f3a-aa6b-4f26-83f9-ecb38f5bb6d7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"42084ea0-f7ed-4828-abee-909de1ea2bc1","timestamp":1749110457148,"gateway":"8UUXN4P00A06NK"} + +{"bid":"93a47a41-fcd8-4835-8b42-43a14064de06","data":{"departure_trajectory":[]},"tid":"0b3112cb-bf9e-4041-94e9-22884e59c28a","timestamp":1749110457461,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4bd1586e-cc63-4653-93a9-da6f702e853e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"948e21d0-c5b4-4cb1-bf14-98e6511ff9c4","timestamp":1749110458543,"gateway":"8UUXN4P00A06NK"} + +{"bid":"37f619bc-ad95-4324-8de1-74c211460472","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ec5780ab-bc82-41b7-bf35-26dc3b2b0176","timestamp":1749110459544,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5047938a-13eb-4145-9743-d924c6fe6703","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3f7a10d1-688d-4ebc-afdf-8fdd802a4abd","timestamp":1749110460069,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5047938a-13eb-4145-9743-d924c6fe6703","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3f7a10d1-688d-4ebc-afdf-8fdd802a4abd","timestamp":1749110462148,"gateway":"8UUXN4P00A06NK"} + +{"bid":"abe22218-29ef-4f08-be13-4e08eefa1671","data":{"air_transfer_enable":false},"need_reply":1,"tid":"602a0323-b78c-43a6-9449-3addb536fb46","timestamp":1749110465058,"gateway":"8UUXN4P00A06NK"} + +{"bid":"46e80a1b-ecbf-4c15-be1c-8a3ecfa9707a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8a4c991c-f3bd-4b2f-8c4d-ec0cc3dfa911","timestamp":1749110465068,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b3672239-6333-42c6-a884-591a70e9b373","bid":"ffe36bc5-e365-4803-aa99-058b033264d7","timestamp":1749110490507,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"517e010a-4494-461a-8f56-1e212d129d13","bid":"8cdc36f2-7b64-409e-a74c-5f30ce82d19d","timestamp":1749110490511,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"9ceea585-ebc2-44ca-8d8a-cab357c2168a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c57e5742-3f44-490f-9268-8bddbf2be55e","timestamp":1749110492293,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3dd9e804-4645-471a-a14a-dc645d738a24","data":{"mobility_status_notify":0},"need_reply":1,"tid":"aa43c836-ea77-4ae9-869b-21412959c1d8","timestamp":1749110492399,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3fa1c443-6ebe-4eba-bda0-c1c310afabf1","data":{"dongle_infos":[]},"tid":"47c9c1e1-de6e-4df4-85c1-cab6ede89e03","timestamp":1749110492702,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7511339e-e3e6-4ac7-b9d3-4050a14e6a8f","data":{"dongle_infos":[]},"tid":"47911f59-ba3c-41bf-b72f-c99998040caf","timestamp":1749110492703,"gateway":"8UUXN4P00A06NK"} + +{"bid":"88b0c630-84fa-4e8d-8991-dbf2644802c2","data":{"firmware_version":"13.01.0002"},"tid":"3dd4b406-845e-406f-a760-c0820a38170d","timestamp":1749110492710,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9cf324d2-3f9a-4cd1-b2b7-4b6a858d689f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3c1aac0b-a60f-449b-8c5f-e37a93128401","timestamp":1749110492899,"gateway":"8UUXN4P00A06NK"} + +{"tid":"da56c671-70b7-44bb-aef9-35b589acbe72","bid":"7211ab13-a26e-4ca2-83db-1608dd4ec4f7","timestamp":1749110493517,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"66b9e377-2019-40a0-b882-a46f6b97d067","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f60d85cb-85e2-4376-abf9-cf64718fdc70","timestamp":1749110493528,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6d810fda-7e03-4bae-b9e1-9e41f5da83ae","data":{"dongle_infos":[]},"tid":"2855e408-20fc-49e3-8f29-59a2e1af1968","timestamp":1749110493769,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9ceea585-ebc2-44ca-8d8a-cab357c2168a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c57e5742-3f44-490f-9268-8bddbf2be55e","timestamp":1749110494408,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3dd9e804-4645-471a-a14a-dc645d738a24","data":{"mobility_status_notify":0},"need_reply":1,"tid":"aa43c836-ea77-4ae9-869b-21412959c1d8","timestamp":1749110494409,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9ff1d567-a722-4a91-9e84-c2464534d43a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7f99a02e-f206-427d-bfb5-79fe25654969","timestamp":1749110495512,"gateway":"8UUXN4P00A06NK"} + +{"bid":"66b9e377-2019-40a0-b882-a46f6b97d067","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f60d85cb-85e2-4376-abf9-cf64718fdc70","timestamp":1749110495609,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9cf324d2-3f9a-4cd1-b2b7-4b6a858d689f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3c1aac0b-a60f-449b-8c5f-e37a93128401","timestamp":1749110497102,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dcbdf98f-312b-4c5e-9b04-3f1ce378c631","data":{"departure_trajectory":[]},"tid":"45f82147-1eaf-4d7c-8148-41e09087cc1c","timestamp":1749110497121,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9ff1d567-a722-4a91-9e84-c2464534d43a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7f99a02e-f206-427d-bfb5-79fe25654969","timestamp":1749110497606,"gateway":"8UUXN4P00A06NK"} + +{"bid":"da5e9748-f9c2-4da3-b826-3b2bf086741a","data":{"departure_trajectory":[]},"tid":"523cfdf2-5280-416b-92c0-617253c81bac","timestamp":1749110497702,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3dd9e804-4645-471a-a14a-dc645d738a24","data":{"mobility_status_notify":0},"need_reply":1,"tid":"aa43c836-ea77-4ae9-869b-21412959c1d8","timestamp":1749110498608,"gateway":"8UUXN4P00A06NK"} + +{"bid":"66b9e377-2019-40a0-b882-a46f6b97d067","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f60d85cb-85e2-4376-abf9-cf64718fdc70","timestamp":1749110499810,"gateway":"8UUXN4P00A06NK"} + +{"bid":"951a7777-4f77-4c95-9404-06bf411badc7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"456ae393-e80b-4ffa-be60-da2505f8679e","timestamp":1749110500510,"gateway":"8UUXN4P00A06NK"} + +{"bid":"951a7777-4f77-4c95-9404-06bf411badc7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"456ae393-e80b-4ffa-be60-da2505f8679e","timestamp":1749110502609,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9cf324d2-3f9a-4cd1-b2b7-4b6a858d689f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3c1aac0b-a60f-449b-8c5f-e37a93128401","timestamp":1749110505301,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6aedcc9e-fc34-4fa7-923b-3d75ca08c46c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9aeebeef-4b3b-451e-bce7-2b13b937bf51","timestamp":1749110505507,"gateway":"8UUXN4P00A06NK"} + +{"tid":"144224e8-b14b-4fa1-9a2c-ca48ff79ce3e","bid":"b1327c77-e7c0-4302-be00-08d5a766f39d","timestamp":1749110568631,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"8fbdc30b-ff02-4707-80ff-f1aa839932a4","bid":"9a3ec7bc-ace7-49b9-b66d-da4df1881bc8","timestamp":1749110568635,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"1f7e7fa6-5d85-42f6-845d-b3b2215ef146","bid":"457d17f3-f2f5-4783-8327-17d95bfdb7d4","timestamp":1749112354874,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"d0a6c0b2-11db-44bf-87a2-2be68eb3afb1","bid":"3801c95e-6d53-4860-8736-b8b353e51746","timestamp":1749112354876,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"3b6864ad-d9d8-4906-b60c-fa1bda969b18","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ca4db589-d8e7-4ac6-ad24-c5e4814ab4b0","timestamp":1749112356752,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9695adb5-b17b-40bd-a237-f2e47abb6a54","data":{"mobility_status_notify":0},"need_reply":1,"tid":"56d1b59a-49fe-4962-8bbd-86b784bc96bb","timestamp":1749112356771,"gateway":"8UUXN4P00A06NK"} + +{"bid":"47d06239-c6ca-4062-ad73-8b315a7b7c0c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ab9a5f26-1c20-4f63-b349-ed676771ab15","timestamp":1749112356773,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2f8277a7-cc24-46cb-ba02-e14c745bbc81","data":{"dongle_infos":[]},"tid":"5318a1d4-96a0-46fb-988a-91e830607332","timestamp":1749112356785,"gateway":"8UUXN4P00A06NK"} + +{"bid":"92b84dc7-4408-4e56-ad4a-226a6c35ed9f","data":{"dongle_infos":[]},"tid":"1155f157-d239-407b-91cb-ef39e303725b","timestamp":1749112356787,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b4a010a2-897b-41cc-9189-14e5ccf3be8f","data":{"firmware_version":"13.01.0002"},"tid":"d07b7190-a82a-430c-a1ec-e638360469bd","timestamp":1749112356798,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3e06ba8d-071d-45a2-8d38-324083e81fde","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7b3194d3-4c23-4f2a-b75c-c3bc8cb30f21","timestamp":1749112356927,"gateway":"8UUXN4P00A06NK"} + +{"bid":"509036fb-074e-45cc-9a42-eb5fcb82946c","data":{"dongle_infos":[]},"tid":"d2cfb3db-71dc-4590-b72d-4aa188bc6204","timestamp":1749112357775,"gateway":"8UUXN4P00A06NK"} + +{"tid":"37cb19fe-23d7-49d8-9d09-09d2fd193f1f","bid":"b3fc3be0-f000-461f-ad48-46726d78add5","timestamp":1749112357803,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"3b6864ad-d9d8-4906-b60c-fa1bda969b18","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ca4db589-d8e7-4ac6-ad24-c5e4814ab4b0","timestamp":1749112358918,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9695adb5-b17b-40bd-a237-f2e47abb6a54","data":{"mobility_status_notify":0},"need_reply":1,"tid":"56d1b59a-49fe-4962-8bbd-86b784bc96bb","timestamp":1749112358919,"gateway":"8UUXN4P00A06NK"} + +{"bid":"47d06239-c6ca-4062-ad73-8b315a7b7c0c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ab9a5f26-1c20-4f63-b349-ed676771ab15","timestamp":1749112358919,"gateway":"8UUXN4P00A06NK"} + +{"bid":"23824871-fc1d-43f7-a119-9c8512481a58","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4e915075-41cd-44b4-b985-ebe0547f9021","timestamp":1749112359872,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7d41d993-9bf8-4dfd-91a1-a0828f045348","data":{"departure_trajectory":[]},"tid":"49bb4776-d1ef-415d-b17a-629d045bd65b","timestamp":1749112360967,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3e06ba8d-071d-45a2-8d38-324083e81fde","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7b3194d3-4c23-4f2a-b75c-c3bc8cb30f21","timestamp":1749112361118,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6d383137-9ece-4910-bc1e-69c5df8ba840","data":{"departure_trajectory":[]},"tid":"b263b3ba-4828-4cd4-a0dd-2e8f7b244ff5","timestamp":1749112361761,"gateway":"8UUXN4P00A06NK"} + +{"bid":"23824871-fc1d-43f7-a119-9c8512481a58","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4e915075-41cd-44b4-b985-ebe0547f9021","timestamp":1749112361919,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3b6864ad-d9d8-4906-b60c-fa1bda969b18","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ca4db589-d8e7-4ac6-ad24-c5e4814ab4b0","timestamp":1749112363118,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9695adb5-b17b-40bd-a237-f2e47abb6a54","data":{"mobility_status_notify":0},"need_reply":1,"tid":"56d1b59a-49fe-4962-8bbd-86b784bc96bb","timestamp":1749112363119,"gateway":"8UUXN4P00A06NK"} + +{"bid":"869432de-70e1-4735-ae42-e5bfb1b4ebae","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5f58652e-dd08-4172-94a1-08fe0c606787","timestamp":1749112364870,"gateway":"8UUXN4P00A06NK"} + +{"bid":"869432de-70e1-4735-ae42-e5bfb1b4ebae","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5f58652e-dd08-4172-94a1-08fe0c606787","timestamp":1749112366921,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3e06ba8d-071d-45a2-8d38-324083e81fde","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7b3194d3-4c23-4f2a-b75c-c3bc8cb30f21","timestamp":1749112369325,"gateway":"8UUXN4P00A06NK"} + +{"bid":"86d57d1e-93cf-4b96-abf0-4be3dd52f08d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"33a12ea9-cff9-47c9-a263-cb405ba41fc3","timestamp":1749112369870,"gateway":"8UUXN4P00A06NK"} + +{"tid":"1aa25600-fc6a-48ac-95d6-165c2b82ed82","bid":"1477f685-a65d-4335-9f1e-4ae127de10a8","timestamp":1749112395113,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"afdccc58-2d9d-4739-b26b-f9327e74a8e7","bid":"b3103273-237e-49fc-9fe7-9d04d70bacf5","timestamp":1749112395117,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"60a5f439-b510-4439-9331-6ae25716ec18","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"57cc1988-a29b-495a-89e1-a817f7048265","timestamp":1749112396976,"gateway":"8UUXN4P00A06NK"} + +{"bid":"15978284-5b53-4a79-98fb-4119244f3f83","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ec796695-692b-4724-bd28-453a2454990e","timestamp":1749112397136,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ddd05fd4-98ee-4934-bc83-dd49a42a238e","data":{"dongle_infos":[]},"tid":"fe3ad2c4-1c90-4d84-b666-06b710393d85","timestamp":1749112397452,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ccdb7c7f-3f52-4257-9e79-5f9ee9867d27","data":{"firmware_version":"13.01.0002"},"tid":"b38bbaed-6239-42cf-91bb-4b628179f14c","timestamp":1749112397462,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3591a6da-9275-434f-bbc3-5b5f1bf44a32","data":{"air_transfer_enable":false},"need_reply":1,"tid":"69f89a39-1fc9-498a-9afa-37f6c9362a73","timestamp":1749112397645,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7718ffc2-0a78-4b6d-80d2-96a2d9fe6700","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"0e0b1751-5e9d-4e85-a393-af3ed526c3b3","timestamp":1749112398282,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9586550b-5247-4405-bbf0-e6401cc6296e","data":{"dongle_infos":[]},"tid":"83846a79-088d-4c66-8c50-e2475286dd17","timestamp":1749112398470,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d2efc354-c87c-4b51-b02d-944d966b7ab6","bid":"1efadd0e-7878-4616-8762-a00fb86105ee","timestamp":1749112398604,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"60a5f439-b510-4439-9331-6ae25716ec18","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"57cc1988-a29b-495a-89e1-a817f7048265","timestamp":1749112399076,"gateway":"8UUXN4P00A06NK"} + +{"bid":"15978284-5b53-4a79-98fb-4119244f3f83","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ec796695-692b-4724-bd28-453a2454990e","timestamp":1749112399273,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b03fb699-e3dd-4248-8c61-72cb56e5226c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8118aa3e-f88a-45aa-8cb6-29f3194ca810","timestamp":1749112400120,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7718ffc2-0a78-4b6d-80d2-96a2d9fe6700","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"0e0b1751-5e9d-4e85-a393-af3ed526c3b3","timestamp":1749112400480,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f858d65a-3e7a-4a83-ae8a-921168d471a8","data":{"dongle_infos":[]},"tid":"1cfe0b62-9a0b-435b-8c46-90f921f73d0c","timestamp":1749112401387,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3591a6da-9275-434f-bbc3-5b5f1bf44a32","data":{"air_transfer_enable":false},"need_reply":1,"tid":"69f89a39-1fc9-498a-9afa-37f6c9362a73","timestamp":1749112401843,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4aeb946e-8bb3-4c25-bfb4-4b4a08b62ef8","data":{"departure_trajectory":[]},"tid":"c08ca795-8bb6-4726-8860-8ad1b02fc07c","timestamp":1749112401868,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b03fb699-e3dd-4248-8c61-72cb56e5226c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8118aa3e-f88a-45aa-8cb6-29f3194ca810","timestamp":1749112402280,"gateway":"8UUXN4P00A06NK"} + +{"bid":"da38146a-0270-4fd5-aeb7-b63be73c3a8a","data":{"departure_trajectory":[]},"tid":"63e99d87-3598-4b31-8369-d0fa282b091d","timestamp":1749112402446,"gateway":"8UUXN4P00A06NK"} + +{"bid":"15978284-5b53-4a79-98fb-4119244f3f83","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ec796695-692b-4724-bd28-453a2454990e","timestamp":1749112403474,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7718ffc2-0a78-4b6d-80d2-96a2d9fe6700","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"0e0b1751-5e9d-4e85-a393-af3ed526c3b3","timestamp":1749112404676,"gateway":"8UUXN4P00A06NK"} + +{"bid":"33d1178f-7530-4640-b84b-4aa06dc59b08","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4365d5ee-7698-412f-af68-aaf52e655bbd","timestamp":1749112405122,"gateway":"8UUXN4P00A06NK"} + +{"bid":"33d1178f-7530-4640-b84b-4aa06dc59b08","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4365d5ee-7698-412f-af68-aaf52e655bbd","timestamp":1749112407277,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3591a6da-9275-434f-bbc3-5b5f1bf44a32","data":{"air_transfer_enable":false},"need_reply":1,"tid":"69f89a39-1fc9-498a-9afa-37f6c9362a73","timestamp":1749112410051,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b50a64fa-930b-44b9-8f6f-2038d37e5112","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"36a3bb10-b01f-469b-9149-5dda9baa1eba","timestamp":1749112410122,"gateway":"8UUXN4P00A06NK"} + +{"tid":"614b9b0b-898b-4155-80c2-0c3f6df0eb82","bid":"1e123ddf-001b-4bac-a6a0-a81f35b80543","timestamp":1749112435788,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"df3dcde3-a9f9-4484-91ad-877b7a21913b","bid":"3f440824-b6c4-4bba-a8c4-4f404510947b","timestamp":1749112435790,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"8af00003-9353-4f0a-9b74-c59d67d3a2bd","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"fad6d78e-13fc-4069-b90f-d5ed2899431a","timestamp":1749112437527,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9e5b4129-80c2-48d8-83db-cbf1aa31df2f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"37981faf-969c-4376-907d-f92f4b77315a","timestamp":1749112437580,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8dd5f8af-c774-48bd-a5a5-f6d0b7093fef","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"626d601d-e338-41f4-90c5-0ec7c44c052f","timestamp":1749112437582,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6a1f71e6-4e4d-4434-8520-579eab2ff502","data":{"dongle_infos":[]},"tid":"b79b52ec-5490-4748-93bb-11c19518cbd1","timestamp":1749112437598,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2aa2fd09-853d-405f-9965-b111cae9f367","data":{"firmware_version":"13.01.0002"},"tid":"ee260874-4826-418a-9f68-30a3d043b845","timestamp":1749112437608,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b65a9137-1d8d-431d-9dd7-9685c96eb8d8","data":{"air_transfer_enable":false},"need_reply":1,"tid":"0d4a7d6b-cf1e-4e62-a972-a2f2578ecd19","timestamp":1749112437791,"gateway":"8UUXN4P00A06NK"} + +{"bid":"33aca66b-73b4-4132-89a0-91ea2c0b6906","data":{"dongle_infos":[]},"tid":"96b73c82-02a9-45b0-ab15-761b727d5e7a","timestamp":1749112438597,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d06ead6d-2747-4f93-8258-33fd387cc04d","bid":"8b3d6a7e-d4df-410f-8bce-9b738f40950a","timestamp":1749112438598,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"8af00003-9353-4f0a-9b74-c59d67d3a2bd","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"fad6d78e-13fc-4069-b90f-d5ed2899431a","timestamp":1749112439573,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9e5b4129-80c2-48d8-83db-cbf1aa31df2f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"37981faf-969c-4376-907d-f92f4b77315a","timestamp":1749112439776,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8dd5f8af-c774-48bd-a5a5-f6d0b7093fef","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"626d601d-e338-41f4-90c5-0ec7c44c052f","timestamp":1749112439777,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c26720d0-d826-40ad-bfe9-e8f83f6e98a6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"683a0fde-922c-43ae-95fd-c105214a0d71","timestamp":1749112440800,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4c16e362-b742-4666-b17e-f24c68983cb2","data":{"dongle_infos":[]},"tid":"760a05c1-0dd3-4fd1-979e-1d70e1db2511","timestamp":1749112441214,"gateway":"8UUXN4P00A06NK"} + +{"bid":"677c8737-8e7e-4e3d-8d29-49cee36a04ab","data":{"departure_trajectory":[]},"tid":"bb72c4c9-4e1c-4638-b0d5-68c31a08ec8b","timestamp":1749112441775,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b65a9137-1d8d-431d-9dd7-9685c96eb8d8","data":{"air_transfer_enable":false},"need_reply":1,"tid":"0d4a7d6b-cf1e-4e62-a972-a2f2578ecd19","timestamp":1749112441983,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0b7076c8-f3c6-4f11-a394-367dde10a4c8","data":{"departure_trajectory":[]},"tid":"b7ab30fe-96ca-4715-a2d7-48e613a7f55d","timestamp":1749112442588,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c26720d0-d826-40ad-bfe9-e8f83f6e98a6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"683a0fde-922c-43ae-95fd-c105214a0d71","timestamp":1749112442975,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8af00003-9353-4f0a-9b74-c59d67d3a2bd","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"fad6d78e-13fc-4069-b90f-d5ed2899431a","timestamp":1749112443771,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9e5b4129-80c2-48d8-83db-cbf1aa31df2f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"37981faf-969c-4376-907d-f92f4b77315a","timestamp":1749112443973,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b605121e-628c-4734-af7d-c5dc6c836251","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"10e9dc30-3a93-4f55-b2e1-5ff8cf3a9400","timestamp":1749112445795,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b605121e-628c-4734-af7d-c5dc6c836251","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"10e9dc30-3a93-4f55-b2e1-5ff8cf3a9400","timestamp":1749112447975,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b65a9137-1d8d-431d-9dd7-9685c96eb8d8","data":{"air_transfer_enable":false},"need_reply":1,"tid":"0d4a7d6b-cf1e-4e62-a972-a2f2578ecd19","timestamp":1749112450184,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e6ebe9ac-f2b6-4e6e-abf6-1bd5137acf3c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"83cb6ee8-cdf6-4640-950c-ac0b78ab55cb","timestamp":1749112450798,"gateway":"8UUXN4P00A06NK"} + +{"tid":"19075757-50e8-4243-997c-66480b6ffbdf","bid":"36a51893-d29f-4d86-a925-79658cd7fc97","timestamp":1749112476094,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"c3e2e9c7-ed67-4e04-b999-8844a1beb0d4","bid":"a4d65469-fe32-4cbc-ad11-0d7427a0fa9b","timestamp":1749112476098,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"e0d48794-5061-45db-bb00-48a5e00240ea","data":{"mobility_status_notify":0},"need_reply":1,"tid":"07dd332b-b076-43a9-a9bc-7c5900ccf16b","timestamp":1749112477610,"gateway":"8UUXN4P00A06NK"} + +{"bid":"42b1443f-0f84-4d38-8c7c-2407c2a0f503","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"01d17533-1807-4682-8659-df0f0e1ad979","timestamp":1749112477675,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dc600372-1897-4a77-a818-bdc630adb655","data":{"dongle_infos":[]},"tid":"52b289ba-0a24-4774-9775-0cf652371e40","timestamp":1749112477913,"gateway":"8UUXN4P00A06NK"} + +{"bid":"617e6e2c-c77b-45bb-919c-ab27e899ef69","data":{"firmware_version":"13.01.0002"},"tid":"877a4526-4352-407b-8bc6-b151ffde0cf5","timestamp":1749112477921,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e29ba318-04f3-4a40-90a6-05b4ffed150e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"efcaf34b-4ac7-4b18-b8d8-623f47e0ff7f","timestamp":1749112478098,"gateway":"8UUXN4P00A06NK"} + +{"bid":"405dee9a-fecd-4dce-9f5a-251687c7064e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"174261ae-0df2-46ba-a81f-88185ae498e0","timestamp":1749112478795,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6500a9e3-2a2b-468b-ad68-202ea2ae6749","data":{"dongle_infos":[]},"tid":"b4d5918e-40e7-44b5-9b0d-3dee8e47f7a6","timestamp":1749112478910,"gateway":"8UUXN4P00A06NK"} + +{"tid":"9290af07-371a-467d-9aa5-0736958ec617","bid":"83c8b8ba-c79f-41f1-aade-94a6e11cb105","timestamp":1749112479391,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"e0d48794-5061-45db-bb00-48a5e00240ea","data":{"mobility_status_notify":0},"need_reply":1,"tid":"07dd332b-b076-43a9-a9bc-7c5900ccf16b","timestamp":1749112479732,"gateway":"8UUXN4P00A06NK"} + +{"bid":"42b1443f-0f84-4d38-8c7c-2407c2a0f503","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"01d17533-1807-4682-8659-df0f0e1ad979","timestamp":1749112479734,"gateway":"8UUXN4P00A06NK"} + +{"bid":"405dee9a-fecd-4dce-9f5a-251687c7064e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"174261ae-0df2-46ba-a81f-88185ae498e0","timestamp":1749112480928,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6d825de9-393e-4861-bea6-90850749db44","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d17c7624-ef0e-4993-92a3-47edf31487d9","timestamp":1749112481098,"gateway":"8UUXN4P00A06NK"} + +{"bid":"53064c2b-271e-4645-ba25-48b7f7976f23","data":{"dongle_infos":[]},"tid":"be8f6387-a296-41e0-92a6-c00a5275e969","timestamp":1749112481873,"gateway":"8UUXN4P00A06NK"} + +{"bid":"88fb24f9-b72e-4f66-847b-3cf5800aa32b","data":{"departure_trajectory":[]},"tid":"3d176c89-2e7b-4e65-b6a2-62a7d93e9487","timestamp":1749112482289,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e29ba318-04f3-4a40-90a6-05b4ffed150e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"efcaf34b-4ac7-4b18-b8d8-623f47e0ff7f","timestamp":1749112482298,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2e889422-1789-4537-888c-f1192c2854b9","data":{"departure_trajectory":[]},"tid":"4f1ead0c-85f1-4805-9794-6757ae74a6e8","timestamp":1749112482901,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6d825de9-393e-4861-bea6-90850749db44","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d17c7624-ef0e-4993-92a3-47edf31487d9","timestamp":1749112483132,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e0d48794-5061-45db-bb00-48a5e00240ea","data":{"mobility_status_notify":0},"need_reply":1,"tid":"07dd332b-b076-43a9-a9bc-7c5900ccf16b","timestamp":1749112483929,"gateway":"8UUXN4P00A06NK"} + +{"bid":"405dee9a-fecd-4dce-9f5a-251687c7064e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"174261ae-0df2-46ba-a81f-88185ae498e0","timestamp":1749112485131,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e54ab11-7719-4b8a-baef-cbbbd43cedeb","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c006720c-e77f-4161-9d68-f97c248f6313","timestamp":1749112486092,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e54ab11-7719-4b8a-baef-cbbbd43cedeb","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c006720c-e77f-4161-9d68-f97c248f6313","timestamp":1749112488130,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e29ba318-04f3-4a40-90a6-05b4ffed150e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"efcaf34b-4ac7-4b18-b8d8-623f47e0ff7f","timestamp":1749112490502,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b04e613d-fa5a-4691-9d7e-7083bea32bd0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b0fc8abf-cc63-4a7a-b74d-f5a55535ddbb","timestamp":1749112491091,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4af02fec-f5f0-4b33-bcba-65d1b162d410","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ab688c6b-190d-420f-9ca9-d788faac7ba4","timestamp":1749112529989,"gateway":"8UUXN4P00A06NK"} + +{"tid":"fcd1b55d-3875-4237-81c4-ffb3a73ce57c","bid":"3c3c11d4-2197-4132-919e-e1b5f9a516a0","timestamp":1749112555196,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"7345daab-1cac-45f3-9ed0-e7aef1e00aa7","bid":"59356cb5-47e1-44b9-9afe-3855cfe9c774","timestamp":1749112555199,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"21cbc2e2-406c-43ef-90ea-023262a6a3cd","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"82285eba-00c3-417f-b07b-946b3aa0b850","timestamp":1749112557293,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b7b5668f-8915-4846-9b4b-2d99b1afdd74","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e8639abd-fb9a-4e10-a103-65aca6460bdb","timestamp":1749112557313,"gateway":"8UUXN4P00A06NK"} + +{"bid":"888c3815-df95-4200-bbbf-76abe50425c3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3fe231b8-4c6d-44c2-9735-67dd7b49d330","timestamp":1749112557315,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1180fa44-9f59-45a0-866e-dce17cf1ff5b","data":{"dongle_infos":[]},"tid":"673f77c3-3dea-4ba2-ba18-34fedff94745","timestamp":1749112557349,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fc1441d5-bec2-49de-b582-bbc8ca4c9b9a","data":{"dongle_infos":[]},"tid":"ff4edb42-2c93-4bd6-acee-a28b574ebddd","timestamp":1749112557350,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2b5c4bd7-b3fc-4373-917f-81949a178086","data":{"firmware_version":"13.01.0002"},"tid":"e4a13572-0731-43a0-8d9a-d50f6dd43202","timestamp":1749112557361,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d0342e86-fbbf-4934-a065-29bfbb8dcaad","data":{"air_transfer_enable":false},"need_reply":1,"tid":"869bff32-e768-4076-b38e-72d529893b47","timestamp":1749112557539,"gateway":"8UUXN4P00A06NK"} + +{"tid":"5cab378f-9450-4a55-a541-10ce81e7c3b7","bid":"9209697d-a498-4d21-9905-c718294d54de","timestamp":1749112558190,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"7cef5d50-e8de-42ab-b6ce-e1311289d832","data":{"dongle_infos":[]},"tid":"9b38ae63-4d8f-448b-9857-a89bc6b83032","timestamp":1749112558357,"gateway":"8UUXN4P00A06NK"} + +{"bid":"21cbc2e2-406c-43ef-90ea-023262a6a3cd","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"82285eba-00c3-417f-b07b-946b3aa0b850","timestamp":1749112559385,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b7b5668f-8915-4846-9b4b-2d99b1afdd74","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e8639abd-fb9a-4e10-a103-65aca6460bdb","timestamp":1749112559386,"gateway":"8UUXN4P00A06NK"} + +{"bid":"888c3815-df95-4200-bbbf-76abe50425c3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3fe231b8-4c6d-44c2-9735-67dd7b49d330","timestamp":1749112559388,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fcc979e6-39f5-46eb-96e9-15e2b9f6528f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bcfd96bd-f655-4ce9-8a16-1df8b48f14de","timestamp":1749112560199,"gateway":"8UUXN4P00A06NK"} + +{"bid":"40adec3b-bac9-4761-825f-dcb74e360a21","data":{"departure_trajectory":[]},"tid":"5779ecb5-9d90-406d-a7b1-9e0bebde4cfe","timestamp":1749112561492,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d0342e86-fbbf-4934-a065-29bfbb8dcaad","data":{"air_transfer_enable":false},"need_reply":1,"tid":"869bff32-e768-4076-b38e-72d529893b47","timestamp":1749112561744,"gateway":"8UUXN4P00A06NK"} + +{"bid":"67ce8b0f-e1eb-448c-9ba7-c9a45622df49","data":{"departure_trajectory":[]},"tid":"55f6c4f4-cf60-453b-b0cf-1df475b36f16","timestamp":1749112562339,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fcc979e6-39f5-46eb-96e9-15e2b9f6528f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bcfd96bd-f655-4ce9-8a16-1df8b48f14de","timestamp":1749112562387,"gateway":"8UUXN4P00A06NK"} + +{"bid":"21cbc2e2-406c-43ef-90ea-023262a6a3cd","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"82285eba-00c3-417f-b07b-946b3aa0b850","timestamp":1749112563588,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b7b5668f-8915-4846-9b4b-2d99b1afdd74","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e8639abd-fb9a-4e10-a103-65aca6460bdb","timestamp":1749112563589,"gateway":"8UUXN4P00A06NK"} + +{"bid":"54ef1cbb-a099-4aa8-978f-efe9810b9a2e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ef5690ad-e1ce-4434-bd59-65a25a9cb0c5","timestamp":1749112565198,"gateway":"8UUXN4P00A06NK"} + +{"bid":"54ef1cbb-a099-4aa8-978f-efe9810b9a2e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ef5690ad-e1ce-4434-bd59-65a25a9cb0c5","timestamp":1749112567384,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d0342e86-fbbf-4934-a065-29bfbb8dcaad","data":{"air_transfer_enable":false},"need_reply":1,"tid":"869bff32-e768-4076-b38e-72d529893b47","timestamp":1749112569934,"gateway":"8UUXN4P00A06NK"} + +{"bid":"13d0c619-59e6-441e-a48c-e6d239247591","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cb12dcb7-92d1-4788-978a-f697516b747f","timestamp":1749112570200,"gateway":"8UUXN4P00A06NK"} + +{"tid":"07327632-b5b7-47db-b90f-2fab599b63ea","bid":"52600274-f6ce-4bf1-9648-475a727c8937","timestamp":1749112595580,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"94cfd76e-b128-406f-81ce-65e26f6d4dc9","bid":"926b1823-40f1-4299-a376-e12606a61e3f","timestamp":1749112595591,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"005ad33f-5427-46be-b7f9-2f651c3975ac","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7e5341b6-506c-4a9c-9f72-47c8c4acde0f","timestamp":1749112595667,"gateway":"8UUXN4P00A06NK"} + +{"bid":"617bcaae-162c-468c-8ab9-5f08fff5c9b5","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"849a5301-1e7b-41b3-b830-8fc46fc5ccf3","timestamp":1749112597890,"gateway":"8UUXN4P00A06NK"} + +{"bid":"005ad33f-5427-46be-b7f9-2f651c3975ac","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7e5341b6-506c-4a9c-9f72-47c8c4acde0f","timestamp":1749112598280,"gateway":"8UUXN4P00A06NK"} + +{"tid":"bd66ee3e-52e0-4118-a799-f6a85ab9c97f","bid":"fae6e101-3d50-4aa1-92be-6da31bce62c2","timestamp":1749112598479,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"d3edea66-d2d1-4e7a-8fa1-d4c85c720f01","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"7e5691b6-0053-4c14-ac60-ba10c873ed0a","timestamp":1749112598580,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a219eebf-c819-4759-b036-372da3ac3db4","data":{"dongle_infos":[]},"tid":"721007cb-b7e3-48c2-9617-3e599cb44af4","timestamp":1749112598588,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d315460c-0d08-4349-bc85-b8e26dc846cf","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f1d2e77f-d602-4870-90dd-fe46b22eab0f","timestamp":1749112598594,"gateway":"8UUXN4P00A06NK"} + +{"bid":"40485001-2b0c-4d54-b526-82b0a542b1ee","data":{"firmware_version":"13.01.0002"},"tid":"ceec2ef9-229a-4946-81c5-3336f08245e1","timestamp":1749112598639,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6e2c72d3-7310-47d7-a693-9fee5c4d264b","data":{"dongle_infos":[]},"tid":"e11504be-541d-4ebe-ab1f-d0dd8b194c1a","timestamp":1749112599601,"gateway":"8UUXN4P00A06NK"} + +{"tid":"14e53bc7-d9b9-4c78-b299-688929580a2f","bid":"cbea1e3a-4dc3-4bb3-a11c-3c7d999e41de","timestamp":1749112635513,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"77bb4559-4cab-46d8-a39f-a17715adcb02","bid":"2cb3dfb2-d367-428b-b3d2-191728d7d264","timestamp":1749112635517,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"442bae3d-a909-41d3-a2e1-9b7e1e5aba03","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cda9e47f-0a88-4140-8284-5b0caf4aa243","timestamp":1749112637457,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1706a983-642d-4391-8069-640dd6d99bcb","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e9900ccd-0599-45b2-9e74-b597787ac900","timestamp":1749112638039,"gateway":"8UUXN4P00A06NK"} + +{"bid":"61eb5b6e-01eb-4f15-a936-79213d6346bf","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3a42dba2-d2d5-4743-a9ea-57b158c49531","timestamp":1749112638373,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b2b30f31-bdb4-4bda-abba-04f084a0191f","data":{"dongle_infos":[]},"tid":"6e0748e9-81b9-46a4-9e3b-a17ac678f29a","timestamp":1749112638383,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9e06449c-2315-49fe-8305-8aa4549057f0","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ac83c865-b52d-4c0b-ac08-58a5c06e8310","timestamp":1749112638389,"gateway":"8UUXN4P00A06NK"} + +{"bid":"503dfded-e1df-4b4f-83f4-7e10372875fe","data":{"firmware_version":"13.01.0002"},"tid":"b2cfe7f5-a6e5-4869-887b-29ca13d4deb8","timestamp":1749112638410,"gateway":"8UUXN4P00A06NK"} + +{"tid":"3992d0a7-c9b1-4052-82b2-f1308e02c5df","bid":"9e9501b4-eda1-46ae-b234-03d6b7e53087","timestamp":1749112638565,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"62744f8e-ee99-4f4e-b4ff-264724c17d18","data":{"dongle_infos":[]},"tid":"ed5dbe40-c19f-4b55-b11d-668d88e8eb78","timestamp":1749112639408,"gateway":"8UUXN4P00A06NK"} + +{"bid":"442bae3d-a909-41d3-a2e1-9b7e1e5aba03","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cda9e47f-0a88-4140-8284-5b0caf4aa243","timestamp":1749112639643,"gateway":"8UUXN4P00A06NK"} + +{"bid":"61eb5b6e-01eb-4f15-a936-79213d6346bf","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3a42dba2-d2d5-4743-a9ea-57b158c49531","timestamp":1749112640444,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9e06449c-2315-49fe-8305-8aa4549057f0","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ac83c865-b52d-4c0b-ac08-58a5c06e8310","timestamp":1749112640445,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eea3d541-6bb6-4185-a623-e4bdd791141e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3bbd1f38-ac18-4cbb-bb1a-b65c8310602a","timestamp":1749112640519,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8f6bf417-0718-4c83-8402-cfdd93689ae6","data":{"dongle_infos":[]},"tid":"228c1467-a9cd-48a6-9cc3-eebbea7655a7","timestamp":1749112641215,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1706a983-642d-4391-8069-640dd6d99bcb","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e9900ccd-0599-45b2-9e74-b597787ac900","timestamp":1749112642239,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f93dc592-253c-4fe0-a476-46275c9b5c28","data":{"departure_trajectory":[]},"tid":"09e62339-631d-4d8b-9d7d-57371ddc526c","timestamp":1749112642286,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eea3d541-6bb6-4185-a623-e4bdd791141e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3bbd1f38-ac18-4cbb-bb1a-b65c8310602a","timestamp":1749112642646,"gateway":"8UUXN4P00A06NK"} + +{"bid":"24f843ed-f5e0-4bcb-907e-21bc5b62d57f","data":{"departure_trajectory":[]},"tid":"f6fd20fb-6286-40f6-b050-d23438dce977","timestamp":1749112643371,"gateway":"8UUXN4P00A06NK"} + +{"bid":"61eb5b6e-01eb-4f15-a936-79213d6346bf","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3a42dba2-d2d5-4743-a9ea-57b158c49531","timestamp":1749112644643,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9e06449c-2315-49fe-8305-8aa4549057f0","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ac83c865-b52d-4c0b-ac08-58a5c06e8310","timestamp":1749112644644,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eb3ad155-db5d-434d-929b-770bf38b1399","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"77d2957e-06dd-4b7b-8a73-7de77ed741a8","timestamp":1749112645517,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eb3ad155-db5d-434d-929b-770bf38b1399","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"77d2957e-06dd-4b7b-8a73-7de77ed741a8","timestamp":1749112647646,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1706a983-642d-4391-8069-640dd6d99bcb","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e9900ccd-0599-45b2-9e74-b597787ac900","timestamp":1749112650440,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0fcbce60-8ad0-45fa-b90c-d57fd9802334","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7f94feaf-a9f5-45b1-9291-e2d93c0317cf","timestamp":1749112650522,"gateway":"8UUXN4P00A06NK"} + +{"tid":"f458b742-0bb5-4e4b-b65b-5527572c8d33","bid":"33d98192-51fe-4022-86af-0ed98e39528c","timestamp":1749112675868,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"096f9b01-5a04-423b-84d1-3c15966789d3","bid":"3202555c-a1e3-45fe-9c7c-26d3dd398258","timestamp":1749112675872,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"dd5574ae-6646-472c-84e0-faa4c35e7b44","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b58cdbe2-4c85-4426-85df-d5ef21d6140b","timestamp":1749112677249,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ab9af155-df46-4895-9b2b-1055ae1142ec","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"fccb9e20-96ed-4748-8105-926ebd72c1b5","timestamp":1749112677902,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b02d868d-a75f-4004-a080-aaa11754beb6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1b30aa62-ff6f-436e-b41b-126e226d11b9","timestamp":1749112677919,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2d7880f5-3c0c-482b-b34d-ef4f305c472d","data":{"dongle_infos":[]},"tid":"83065ba2-27ba-4e7d-995d-56886ed5c603","timestamp":1749112677927,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1da064d4-7ca1-4f88-979a-c1773031ad1e","data":{"firmware_version":"13.01.0002"},"tid":"e185f178-bc2d-4c40-b4d2-705f12f819e0","timestamp":1749112677941,"gateway":"8UUXN4P00A06NK"} + +{"bid":"91258a3c-0dcd-4b60-9154-99db52e9f5b0","data":{"air_transfer_enable":false},"need_reply":1,"tid":"0dc461d7-3425-4002-90b7-a4d6dcbfcfb1","timestamp":1749112678040,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8e3744e2-fa67-4e80-bf02-aba47de37d2f","data":{"dongle_infos":[]},"tid":"171e20b6-5ec6-443d-9670-e48a4ae01311","timestamp":1749112678147,"gateway":"8UUXN4P00A06NK"} + +{"bid":"070fe8ec-14cc-4fcb-82fe-565c5a4606bd","data":{"dongle_infos":[]},"tid":"31ee8382-0c86-45e0-8756-5ea867190953","timestamp":1749112678919,"gateway":"8UUXN4P00A06NK"} + +{"tid":"1e64b30b-7278-44eb-b3d7-9d72efd7a718","bid":"6f341182-bfc0-4844-a984-72eded3de164","timestamp":1749112679022,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"dd5574ae-6646-472c-84e0-faa4c35e7b44","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b58cdbe2-4c85-4426-85df-d5ef21d6140b","timestamp":1749112679308,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ab9af155-df46-4895-9b2b-1055ae1142ec","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"fccb9e20-96ed-4748-8105-926ebd72c1b5","timestamp":1749112679911,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b02d868d-a75f-4004-a080-aaa11754beb6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1b30aa62-ff6f-436e-b41b-126e226d11b9","timestamp":1749112680104,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f7da73b3-9d83-4390-8204-218c7775a910","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d59327ea-f78c-4267-ae4b-b9d0602b5ebb","timestamp":1749112680870,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f7edc15c-2554-4af6-b38c-7eec91961f75","data":{"departure_trajectory":[]},"tid":"31d0a767-5092-4168-b848-2c6aaf3240f6","timestamp":1749112682098,"gateway":"8UUXN4P00A06NK"} + +{"bid":"91258a3c-0dcd-4b60-9154-99db52e9f5b0","data":{"air_transfer_enable":false},"need_reply":1,"tid":"0dc461d7-3425-4002-90b7-a4d6dcbfcfb1","timestamp":1749112682233,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f7da73b3-9d83-4390-8204-218c7775a910","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d59327ea-f78c-4267-ae4b-b9d0602b5ebb","timestamp":1749112682906,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e0eeb571-6b4f-4163-b68c-ee3398943912","data":{"departure_trajectory":[]},"tid":"b45a81b7-2e1d-4ca1-b8e8-9f4a49f94b39","timestamp":1749112682920,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ab9af155-df46-4895-9b2b-1055ae1142ec","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"fccb9e20-96ed-4748-8105-926ebd72c1b5","timestamp":1749112684104,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b02d868d-a75f-4004-a080-aaa11754beb6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1b30aa62-ff6f-436e-b41b-126e226d11b9","timestamp":1749112684306,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eb8bef02-b18d-41a0-b3c2-c4755b86719a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"384e8c86-647b-46e3-9a37-0fb51e839193","timestamp":1749112685868,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eb8bef02-b18d-41a0-b3c2-c4755b86719a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"384e8c86-647b-46e3-9a37-0fb51e839193","timestamp":1749112687911,"gateway":"8UUXN4P00A06NK"} + +{"bid":"91258a3c-0dcd-4b60-9154-99db52e9f5b0","data":{"air_transfer_enable":false},"need_reply":1,"tid":"0dc461d7-3425-4002-90b7-a4d6dcbfcfb1","timestamp":1749112690441,"gateway":"8UUXN4P00A06NK"} + +{"bid":"73e65f98-c887-4c53-b86d-117e6b921693","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c7e26e4f-113d-4c3f-a901-e01933d28097","timestamp":1749112690871,"gateway":"8UUXN4P00A06NK"} + +{"tid":"6e0f36db-2567-43ff-af6e-3d6d4f3d424e","bid":"963b3ff0-76fa-47c7-8ff8-e875f3c7a1a1","timestamp":1749112716097,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"055edf79-b3e6-4036-9b17-aacb596dc14e","bid":"5149f065-e0dc-4174-9eb4-11c7179964a4","timestamp":1749112716102,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"23d22225-d454-4b2a-9e46-87a7940f70ae","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0def2e12-a99a-48c0-870d-7629c62a6223","timestamp":1749112717853,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f8b404e7-82f4-47fd-8ac3-152fdb1c52ec","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ad87eada-831b-4875-ae98-89c0251368dc","timestamp":1749112717941,"gateway":"8UUXN4P00A06NK"} + +{"bid":"51efe6f5-9c12-4ac4-b0f6-c21047c114e3","data":{"air_transfer_enable":false},"need_reply":1,"tid":"025d7e30-cf38-4b59-b2e9-8d7b850c0cc9","timestamp":1749112718345,"gateway":"8UUXN4P00A06NK"} + +{"bid":"306460dc-4880-4caf-a8d4-48ce7117dd8e","data":{"dongle_infos":[]},"tid":"6206521b-d55f-4a8d-a6ef-4a7500d4b458","timestamp":1749112718351,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3fde4336-767b-491e-8087-317a7d0ea068","data":{"firmware_version":"13.01.0002"},"tid":"b35abc7f-7eee-428e-8ea7-3c91a999fc4d","timestamp":1749112718358,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3f6ff72d-98b8-4144-861a-d4c4d9fd8ec9","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"520720dd-378d-4d33-843b-45be3a4da0a1","timestamp":1749112719138,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8c7312df-924d-4daa-a022-198e92312b0b","data":{"dongle_infos":[]},"tid":"e398ba5a-eba5-4be1-b452-762d569a51a0","timestamp":1749112719369,"gateway":"8UUXN4P00A06NK"} + +{"tid":"1f204d07-58ac-4e5c-8188-a0eb4f3c38c7","bid":"4a909352-4032-4e14-82c6-15b227cbd43c","timestamp":1749112719905,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"23d22225-d454-4b2a-9e46-87a7940f70ae","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0def2e12-a99a-48c0-870d-7629c62a6223","timestamp":1749112720037,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f8b404e7-82f4-47fd-8ac3-152fdb1c52ec","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ad87eada-831b-4875-ae98-89c0251368dc","timestamp":1749112720038,"gateway":"8UUXN4P00A06NK"} + +{"bid":"855eb107-a11d-4701-a89b-c9b9ece83e62","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d13430d2-73a3-424b-8e85-71510c9be979","timestamp":1749112721100,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3f6ff72d-98b8-4144-861a-d4c4d9fd8ec9","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"520720dd-378d-4d33-843b-45be3a4da0a1","timestamp":1749112721236,"gateway":"8UUXN4P00A06NK"} + +{"bid":"091c07bd-a701-4628-8010-6ce11a0f8655","data":{"dongle_infos":[]},"tid":"661ade7c-07fe-490e-938c-c92f153ea7aa","timestamp":1749112722238,"gateway":"8UUXN4P00A06NK"} + +{"bid":"51efe6f5-9c12-4ac4-b0f6-c21047c114e3","data":{"air_transfer_enable":false},"need_reply":1,"tid":"025d7e30-cf38-4b59-b2e9-8d7b850c0cc9","timestamp":1749112722542,"gateway":"8UUXN4P00A06NK"} + +{"bid":"74373df5-28e2-4369-9e18-594d246883c5","data":{"departure_trajectory":[]},"tid":"11b2757a-fc5c-44f0-b30d-ea9a9c7bf236","timestamp":1749112722708,"gateway":"8UUXN4P00A06NK"} + +{"bid":"855eb107-a11d-4701-a89b-c9b9ece83e62","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d13430d2-73a3-424b-8e85-71510c9be979","timestamp":1749112723235,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b0e2d489-8f69-487b-956e-20f86c2df407","data":{"departure_trajectory":[]},"tid":"397991cc-a0b4-4d3e-96c1-98c7cf7c5e12","timestamp":1749112723337,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f8b404e7-82f4-47fd-8ac3-152fdb1c52ec","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ad87eada-831b-4875-ae98-89c0251368dc","timestamp":1749112724237,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3f6ff72d-98b8-4144-861a-d4c4d9fd8ec9","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"520720dd-378d-4d33-843b-45be3a4da0a1","timestamp":1749112725435,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c22f162a-f77d-4e1f-b22f-f62a1eab0658","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"697d9abd-a374-4e19-96a9-023993b56309","timestamp":1749112726100,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c22f162a-f77d-4e1f-b22f-f62a1eab0658","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"697d9abd-a374-4e19-96a9-023993b56309","timestamp":1749112728236,"gateway":"8UUXN4P00A06NK"} + +{"bid":"51efe6f5-9c12-4ac4-b0f6-c21047c114e3","data":{"air_transfer_enable":false},"need_reply":1,"tid":"025d7e30-cf38-4b59-b2e9-8d7b850c0cc9","timestamp":1749112730743,"gateway":"8UUXN4P00A06NK"} + +{"bid":"65f2a189-100a-4901-9b6a-23f1d35b0e43","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"695d7f66-9cc7-4d56-953b-f98bf5df01f3","timestamp":1749112731100,"gateway":"8UUXN4P00A06NK"} + +{"bid":"810db35f-c250-43b1-ac76-38d03db81af1","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7067853f-6a00-41cb-abcf-bb85489a842f","timestamp":1749112772076,"gateway":"8UUXN4P00A06NK"} + +{"bid":"364653e2-596a-4427-9c3f-96d5dae1a2a4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a4901994-2c17-4fb8-98bf-4340072ab3d8","timestamp":1749112772340,"gateway":"8UUXN4P00A06NK"} + +{"tid":"922b5baf-7110-4648-9a3b-79a65da40b15","bid":"87be0ddd-034c-469f-abfc-0d7f7c9eec1e","timestamp":1749112796151,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"826c4060-6859-41be-b502-22a1313c7d37","bid":"df3670c8-c594-4135-b494-d372083a1b3b","timestamp":1749112796157,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"8ec53abc-048a-4273-a0a5-28f687408e81","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2f4a5951-2869-425b-961f-5e80004cfa4b","timestamp":1749112797440,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8fe398f5-ef23-413b-8bca-192e91a05b3c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c82b566a-36a8-4a55-8111-b7e56f81a7d9","timestamp":1749112799438,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bb4f718b-ac6f-457d-90df-2d83c7d8f766","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9166ce42-6fa5-4f1e-a3aa-e379cb635fc4","timestamp":1749112799443,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a336e58a-8aae-4799-bbc4-904f42f43ca8","data":{"dongle_infos":[]},"tid":"b8bd833e-db3e-4820-8df9-a5c77cdf8b74","timestamp":1749112799873,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0a57bf8a-2d42-46de-9be0-af6ccaa077e1","data":{"dongle_infos":[]},"tid":"85c75597-3413-4b2e-8b0c-f94b92676782","timestamp":1749112799875,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f5a8e809-1c6b-42a9-9b8d-3de1f75ca617","data":{"firmware_version":"13.01.0002"},"tid":"22f248e8-da4b-44d7-9244-709600fd78f8","timestamp":1749112799880,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8ec53abc-048a-4273-a0a5-28f687408e81","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2f4a5951-2869-425b-961f-5e80004cfa4b","timestamp":1749112800070,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0a152673-9bc9-4a8f-b447-57566e6eb082","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c5d28dd3-c87d-4903-b8b0-0b3a7587d320","timestamp":1749112800522,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0c75b612-1e9b-4371-90af-a6bf96301f57","data":{"dongle_infos":[]},"tid":"e024c378-16ac-40d3-8a8c-431b11b48c77","timestamp":1749112800871,"gateway":"8UUXN4P00A06NK"} + +{"tid":"5b9eb4a2-d724-4514-8638-4f6257e6e393","bid":"58083067-909f-4b92-8fe8-24bc3dea075e","timestamp":1749112801087,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"966885fe-9e5b-404a-92d2-08f6aec4d3f3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"fb5e4437-2b10-4994-bf10-a81ef6c73919","timestamp":1749112801149,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8fe398f5-ef23-413b-8bca-192e91a05b3c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c82b566a-36a8-4a55-8111-b7e56f81a7d9","timestamp":1749112801595,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0a152673-9bc9-4a8f-b447-57566e6eb082","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c5d28dd3-c87d-4903-b8b0-0b3a7587d320","timestamp":1749112802595,"gateway":"8UUXN4P00A06NK"} + +{"bid":"966885fe-9e5b-404a-92d2-08f6aec4d3f3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"fb5e4437-2b10-4994-bf10-a81ef6c73919","timestamp":1749112803196,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cf61a443-b914-4fe8-8096-a10111fd2484","data":{"departure_trajectory":[]},"tid":"26888b4a-94f9-4a2d-955e-4d17b7ba974c","timestamp":1749112804264,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8ec53abc-048a-4273-a0a5-28f687408e81","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2f4a5951-2869-425b-961f-5e80004cfa4b","timestamp":1749112804268,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bddb2086-3f43-469b-891a-8fbb13f26eb3","data":{"departure_trajectory":[]},"tid":"64033933-85f7-40b8-8503-cda5e16e1b9d","timestamp":1749112804866,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8fe398f5-ef23-413b-8bca-192e91a05b3c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c82b566a-36a8-4a55-8111-b7e56f81a7d9","timestamp":1749112805793,"gateway":"8UUXN4P00A06NK"} + +{"bid":"889cccc4-fe55-4c37-ac29-d7f7dcb5244c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ddcbf418-4e65-4027-a873-08d04987fb93","timestamp":1749112806146,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0a152673-9bc9-4a8f-b447-57566e6eb082","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c5d28dd3-c87d-4903-b8b0-0b3a7587d320","timestamp":1749112806794,"gateway":"8UUXN4P00A06NK"} + +{"bid":"889cccc4-fe55-4c37-ac29-d7f7dcb5244c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ddcbf418-4e65-4027-a873-08d04987fb93","timestamp":1749112808194,"gateway":"8UUXN4P00A06NK"} + +{"bid":"024814c9-4f43-45fe-b945-020ba6eafc12","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"eeaaa336-0615-479e-8229-8aac0bcaf2b1","timestamp":1749112811147,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0a94461d-4553-46e9-93b0-64821a811a73","data":{"air_transfer_enable":false},"need_reply":1,"tid":"39416043-ba11-4076-9959-213734a6ca90","timestamp":1749112843009,"gateway":"8UUXN4P00A06NK"} + +{"bid":"833c6e8a-afda-457d-a0a9-fa7b94d53625","data":{"departure_trajectory":[]},"tid":"24a8e5be-ffd5-4a7f-891e-52f0baa4a34a","timestamp":1749112843031,"gateway":"8UUXN4P00A06NK"} + +{"bid":"80aa18b1-4f99-4a76-b48e-5a6f1cfdb7be","data":{"departure_trajectory":[]},"tid":"13d3aa9f-3ff0-4203-af7a-72b01d3bc89c","timestamp":1749112844025,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1fc90794-8124-4b57-8ff4-8735d0258c43","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b6e4341a-2a2b-4514-bb72-06184d389472","timestamp":1749112844511,"gateway":"8UUXN4P00A06NK"} + +{"bid":"47e9445a-efa1-49b5-8c31-86eedb71f7a7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"50710e9f-3fdc-462e-ab0b-b1ac6662e150","timestamp":1749112844552,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0e7222c0-b3a3-42a9-8828-7eb3157a036b","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"55d513a5-8754-4b68-986b-0459f9fe8aae","timestamp":1749112845228,"gateway":"8UUXN4P00A06NK"} + +{"bid":"64a0d365-986f-49b0-becf-e8180bbd6bd5","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7535c8a3-92e5-4f0e-8098-3bfd5a6f5e7d","timestamp":1749112845429,"gateway":"8UUXN4P00A06NK"} + +{"bid":"47e9445a-efa1-49b5-8c31-86eedb71f7a7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"50710e9f-3fdc-462e-ab0b-b1ac6662e150","timestamp":1749112846628,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a6535606-d8af-4636-ace2-e100e8208654","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0928cd65-efd5-4a7b-9307-c25eaccf3472","timestamp":1749112849509,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f0c08613-f463-42d9-919e-583f9330bbb8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"58ef6d5c-6a86-46ea-9eea-d34098d12bda","timestamp":1749112849556,"gateway":"8UUXN4P00A06NK"} + +{"tid":"2300b3d9-6a8a-4152-8693-33bd0b52d485","bid":"59345847-fd11-48c8-ab03-a206f0a6d416","timestamp":1749112873567,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"0dd3bc0c-d532-4468-aa8a-61064dcdf6ac","bid":"c8764161-24ba-4653-b499-8e262bc3a97c","timestamp":1749112873570,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"e50e9f6c-9b5f-4f49-b14a-7f79dcbd989e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"95b024d3-e02d-4b2b-b5d9-335d5c9d46e2","timestamp":1749112874999,"gateway":"8UUXN4P00A06NK"} + +{"bid":"88a4a035-9f1c-44a0-9bac-0b87cada3af6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"aac7dd2c-a4f8-4a0f-9c36-fb7c8ea36cd3","timestamp":1749112877179,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e50e9f6c-9b5f-4f49-b14a-7f79dcbd989e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"95b024d3-e02d-4b2b-b5d9-335d5c9d46e2","timestamp":1749112877654,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c5a52960-20b4-4ff4-8f24-56781ff248e3","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1b524b41-df26-4b21-a6fd-0007af685565","timestamp":1749112877886,"gateway":"8UUXN4P00A06NK"} + +{"bid":"20828276-0637-46b4-8540-1ee4ad6ec312","data":{"dongle_infos":[]},"tid":"41427340-78fc-4ed9-8d40-ee3c19f495b9","timestamp":1749112877898,"gateway":"8UUXN4P00A06NK"} + +{"bid":"65df0f05-1164-4820-a4c9-1ebf6a3ff438","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d10d8053-7fdf-4e2c-ac87-1828147919be","timestamp":1749112877905,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4eab867f-8c13-43d8-a956-d7bf4cf21953","data":{"firmware_version":"13.01.0002"},"tid":"d35c3b19-4aa0-449e-9b42-c5cd61189bd1","timestamp":1749112877923,"gateway":"8UUXN4P00A06NK"} + +{"bid":"22c324a5-9091-4e20-b187-9bb3ff083119","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f43634f4-13b3-4ee4-9492-5c17f06be86f","timestamp":1749112878568,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ec0a9824-fd0a-41bd-b703-1976ab9a4899","bid":"fe758db6-cb41-4b81-87e5-fcde433222c7","timestamp":1749112878742,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"7a1f426c-0491-4bb4-893b-7d16d5d95a90","data":{"dongle_infos":[]},"tid":"c77bf5e8-09d3-47a3-b3f2-144788d1c5c0","timestamp":1749112878897,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c5a52960-20b4-4ff4-8f24-56781ff248e3","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1b524b41-df26-4b21-a6fd-0007af685565","timestamp":1749112879978,"gateway":"8UUXN4P00A06NK"} + +{"bid":"65df0f05-1164-4820-a4c9-1ebf6a3ff438","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d10d8053-7fdf-4e2c-ac87-1828147919be","timestamp":1749112879978,"gateway":"8UUXN4P00A06NK"} + +{"bid":"22c324a5-9091-4e20-b187-9bb3ff083119","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f43634f4-13b3-4ee4-9492-5c17f06be86f","timestamp":1749112880577,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c4cbe792-20a4-4f54-a3cc-9e9374b4971a","data":{"dongle_infos":[]},"tid":"832a45ef-e3ba-4f86-befd-5130be4d03d3","timestamp":1749112881300,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ace385f7-1a34-44ae-b6a0-1458b91963a1","data":{"departure_trajectory":[]},"tid":"4739d60f-4ff0-40b9-9330-625d5d306397","timestamp":1749112881828,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e50e9f6c-9b5f-4f49-b14a-7f79dcbd989e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"95b024d3-e02d-4b2b-b5d9-335d5c9d46e2","timestamp":1749112881859,"gateway":"8UUXN4P00A06NK"} + +{"bid":"95890c17-37fa-4e24-9099-93161c192dc4","data":{"departure_trajectory":[]},"tid":"8a75a922-074e-43e4-b41d-d8e07927b85c","timestamp":1749112882887,"gateway":"8UUXN4P00A06NK"} + +{"bid":"698f5bfb-49dd-46ba-92bf-9fe0bf6ac2b6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b639fb30-28ed-4def-a4fb-da90554598a2","timestamp":1749112883566,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c5a52960-20b4-4ff4-8f24-56781ff248e3","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1b524b41-df26-4b21-a6fd-0007af685565","timestamp":1749112884175,"gateway":"8UUXN4P00A06NK"} + +{"bid":"65df0f05-1164-4820-a4c9-1ebf6a3ff438","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d10d8053-7fdf-4e2c-ac87-1828147919be","timestamp":1749112884176,"gateway":"8UUXN4P00A06NK"} + +{"bid":"698f5bfb-49dd-46ba-92bf-9fe0bf6ac2b6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b639fb30-28ed-4def-a4fb-da90554598a2","timestamp":1749112885576,"gateway":"8UUXN4P00A06NK"} + +{"bid":"654400dc-bfa0-4a88-ba7c-d845374288df","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"58adbd78-ba69-4107-919e-482bd01bdf19","timestamp":1749112888568,"gateway":"8UUXN4P00A06NK"} + +{"tid":"a3145f7a-580e-42cd-a6e7-183eca5d9cc5","bid":"9f3acdc0-5980-4fa6-a299-275e834d88bc","timestamp":1749112914495,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"4d86b010-749c-4ab9-854d-fbb8b2954ccc","bid":"3cb53ee5-c8e8-4776-979a-4cd5872bd1a2","timestamp":1749112914498,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"36f88f5f-cb8d-408d-bdd2-46c02d0ee513","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"cfb0faec-0b8a-4508-82ae-220fc6c422a9","timestamp":1749112916530,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cb653766-ca53-4354-a74d-364f789d29c8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3c3eae13-73ee-4b9f-b15e-fe74f6a91ad9","timestamp":1749112916556,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4fd11e8e-daee-478d-aa0e-ab386d39a6a4","data":{"mobility_status_notify":0},"need_reply":1,"tid":"93330f2d-7714-4a91-ac83-92037548d064","timestamp":1749112916560,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a98bd799-a376-4ca7-bce8-ea0005f5a56b","data":{"dongle_infos":[]},"tid":"19f489eb-8af6-4f39-98f4-2134ce48a41b","timestamp":1749112916570,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c6fff77f-f2eb-4460-932e-a20eb15fad91","data":{"dongle_infos":[]},"tid":"86ea6220-db6c-435b-8674-617b72046272","timestamp":1749112916572,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2dea8063-dfe3-45b2-9d0b-3c7ca05acd62","data":{"firmware_version":"13.01.0002"},"tid":"8399a1d7-7837-43aa-8d1a-58eea71f83e4","timestamp":1749112916603,"gateway":"8UUXN4P00A06NK"} + +{"bid":"717bd322-fa62-4658-9fd1-2f442a970a21","data":{"air_transfer_enable":false},"need_reply":1,"tid":"58c671ca-ccdc-4fad-90fa-f4bebcd2db28","timestamp":1749112916740,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1c5f1e22-f1ba-4f0b-a284-9ef65ba77c1b","data":{"dongle_infos":[]},"tid":"6b8f9ac2-7d49-47e4-9cac-23c086ac824b","timestamp":1749112917558,"gateway":"8UUXN4P00A06NK"} + +{"tid":"56964b7e-eb3a-4ab8-bad5-2353ae80265a","bid":"24632a51-0416-4a8c-b0dc-6ab8a8b80e16","timestamp":1749112917758,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"36f88f5f-cb8d-408d-bdd2-46c02d0ee513","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"cfb0faec-0b8a-4508-82ae-220fc6c422a9","timestamp":1749112918538,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cb653766-ca53-4354-a74d-364f789d29c8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3c3eae13-73ee-4b9f-b15e-fe74f6a91ad9","timestamp":1749112918738,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4fd11e8e-daee-478d-aa0e-ab386d39a6a4","data":{"mobility_status_notify":0},"need_reply":1,"tid":"93330f2d-7714-4a91-ac83-92037548d064","timestamp":1749112918740,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e10387c8-e059-4340-a878-62739d40c4f9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"40484877-4658-4410-af68-66b4dca5baef","timestamp":1749112919495,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e614af78-7fc9-48c4-8c20-aa3617af141a","data":{"departure_trajectory":[]},"tid":"2f5cd119-c40f-43e9-968e-31ac3c538dd1","timestamp":1749112920723,"gateway":"8UUXN4P00A06NK"} + +{"bid":"717bd322-fa62-4658-9fd1-2f442a970a21","data":{"air_transfer_enable":false},"need_reply":1,"tid":"58c671ca-ccdc-4fad-90fa-f4bebcd2db28","timestamp":1749112920944,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e10387c8-e059-4340-a878-62739d40c4f9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"40484877-4658-4410-af68-66b4dca5baef","timestamp":1749112921539,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8c77458a-23e0-4218-93cf-d39fecb93ae0","data":{"departure_trajectory":[]},"tid":"b40803b3-fee6-460f-9ce5-ba1ed8acd955","timestamp":1749112921551,"gateway":"8UUXN4P00A06NK"} + +{"bid":"36f88f5f-cb8d-408d-bdd2-46c02d0ee513","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"cfb0faec-0b8a-4508-82ae-220fc6c422a9","timestamp":1749112922740,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4fd11e8e-daee-478d-aa0e-ab386d39a6a4","data":{"mobility_status_notify":0},"need_reply":1,"tid":"93330f2d-7714-4a91-ac83-92037548d064","timestamp":1749112922941,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c9fa1e0a-e435-4876-b41b-f93afa026497","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"47b47f50-8f6a-4ec2-bc06-98253efde0dc","timestamp":1749112924490,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c9fa1e0a-e435-4876-b41b-f93afa026497","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"47b47f50-8f6a-4ec2-bc06-98253efde0dc","timestamp":1749112926540,"gateway":"8UUXN4P00A06NK"} + +{"bid":"717bd322-fa62-4658-9fd1-2f442a970a21","data":{"air_transfer_enable":false},"need_reply":1,"tid":"58c671ca-ccdc-4fad-90fa-f4bebcd2db28","timestamp":1749112929143,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0248de6c-c5e9-4828-a036-d17c19e24d52","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f37f0ebe-be3f-4cef-a290-1d30dbd68a5b","timestamp":1749112929494,"gateway":"8UUXN4P00A06NK"} + +{"tid":"31cc14e8-a167-4154-a9be-19d65caf1f01","bid":"007e2f03-159f-4792-ba5a-d9ad3e99ffcc","timestamp":1749112954418,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"d233021a-8e0c-4784-9883-9f94c8f5432b","bid":"6facbc1b-c57e-4723-9d83-4f7a62a5fd1f","timestamp":1749112954421,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"b61d9916-2890-418c-b844-6f6e8466e152","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7a535b9f-6025-4a57-9654-78a3de05bfdf","timestamp":1749112956218,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c0885fe5-2155-45a9-8573-6d154b33f2b8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"23e39b60-ed34-498b-b0b2-d5d0450f31e9","timestamp":1749112956266,"gateway":"8UUXN4P00A06NK"} + +{"bid":"554f1e8c-a541-45bf-b5c6-068382f05772","data":{"dongle_infos":[]},"tid":"e7e39dc3-347a-4390-8149-081baaca24bf","timestamp":1749112956547,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b600eaeb-6aba-4159-94f3-7194079b35d6","data":{"firmware_version":"13.01.0002"},"tid":"5bf99088-5566-4bd2-9f3e-19ada780b96e","timestamp":1749112956557,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cfda8d74-6fdb-45d4-9c09-75e9eac9a068","data":{"air_transfer_enable":false},"need_reply":1,"tid":"71d0f2ed-7dce-453c-b87d-25a7cef012ce","timestamp":1749112956747,"gateway":"8UUXN4P00A06NK"} + +{"tid":"fb6ed9c7-521d-4d12-af9a-9aecfaefc0b7","bid":"df5cb48d-62cc-4e98-bd83-7afa15c3994f","timestamp":1749112957325,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"09f9e493-447b-4a14-8bcd-e51010d1d8b2","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5e5b6104-40eb-47ae-8404-d42bcab7786e","timestamp":1749112957365,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cf63f8f6-e1f8-4eeb-b888-3fc786d9c492","data":{"dongle_infos":[]},"tid":"d7ff23f4-da5a-4609-a662-09cda80e8c33","timestamp":1749112957572,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b61d9916-2890-418c-b844-6f6e8466e152","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7a535b9f-6025-4a57-9654-78a3de05bfdf","timestamp":1749112958399,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c0885fe5-2155-45a9-8573-6d154b33f2b8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"23e39b60-ed34-498b-b0b2-d5d0450f31e9","timestamp":1749112958400,"gateway":"8UUXN4P00A06NK"} + +{"bid":"09f9e493-447b-4a14-8bcd-e51010d1d8b2","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5e5b6104-40eb-47ae-8404-d42bcab7786e","timestamp":1749112959395,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3aaefcc3-df1d-4930-a026-6a027f3d4540","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"90fb3c02-2824-4450-a417-9f83543d60a6","timestamp":1749112959420,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c9f8410b-2730-4f54-99fd-65ea502d887f","data":{"dongle_infos":[]},"tid":"438551a4-6112-4b0e-b343-8ad60da580bd","timestamp":1749112960531,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cfda8d74-6fdb-45d4-9c09-75e9eac9a068","data":{"air_transfer_enable":false},"need_reply":1,"tid":"71d0f2ed-7dce-453c-b87d-25a7cef012ce","timestamp":1749112960948,"gateway":"8UUXN4P00A06NK"} + +{"bid":"263d4a92-58ac-4690-9eda-4476c7fd2044","data":{"departure_trajectory":[]},"tid":"4892556e-b40d-4fc1-8396-be3282bf4578","timestamp":1749112961005,"gateway":"8UUXN4P00A06NK"} + +{"bid":"017320ec-eedf-4d3a-ba5c-fb4f24694cc4","data":{"departure_trajectory":[]},"tid":"5f351e23-9cda-4dfb-8c24-511ed2e2659f","timestamp":1749112961546,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3aaefcc3-df1d-4930-a026-6a027f3d4540","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"90fb3c02-2824-4450-a417-9f83543d60a6","timestamp":1749112961604,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b61d9916-2890-418c-b844-6f6e8466e152","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7a535b9f-6025-4a57-9654-78a3de05bfdf","timestamp":1749112962598,"gateway":"8UUXN4P00A06NK"} + +{"bid":"09f9e493-447b-4a14-8bcd-e51010d1d8b2","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5e5b6104-40eb-47ae-8404-d42bcab7786e","timestamp":1749112963594,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f8b69ec1-1fee-4385-a01d-21ad355f626e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"aa8940ef-af86-4531-bd32-92164878b260","timestamp":1749112964418,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f8b69ec1-1fee-4385-a01d-21ad355f626e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"aa8940ef-af86-4531-bd32-92164878b260","timestamp":1749112966595,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cfda8d74-6fdb-45d4-9c09-75e9eac9a068","data":{"air_transfer_enable":false},"need_reply":1,"tid":"71d0f2ed-7dce-453c-b87d-25a7cef012ce","timestamp":1749112969147,"gateway":"8UUXN4P00A06NK"} + +{"bid":"169a91d1-64a0-4f49-9991-8eee2a8c52cb","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c97cf656-5302-4db5-9549-1d8ad5a7defc","timestamp":1749112969422,"gateway":"8UUXN4P00A06NK"} + +{"tid":"6637ac2b-32d2-4706-9597-7ac228cc39a8","bid":"f98fff76-8d08-47e4-99d7-6315eea2b45c","timestamp":1749112994536,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"e6e1d5fa-3e48-4c48-8354-6ac6e97092ee","bid":"4bb346ed-ff2b-463b-ba96-d00da44d9d96","timestamp":1749112994539,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f76bd20d-a16e-48d7-907e-2a49c0a194b3","data":{"air_transfer_enable":false},"need_reply":1,"tid":"19394437-a10e-432f-a3ad-0301e5617cd0","timestamp":1749112994734,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a6240fe6-f058-4583-883d-8be4ead9de7e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7cfc777a-b15e-453d-8714-a61c8c03b95d","timestamp":1749112997084,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f76bd20d-a16e-48d7-907e-2a49c0a194b3","data":{"air_transfer_enable":false},"need_reply":1,"tid":"19394437-a10e-432f-a3ad-0301e5617cd0","timestamp":1749112997274,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c54e19ea-eab2-4937-93f6-6a767e7b491c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"96acaed7-66e8-484e-8659-82a0538e51bb","timestamp":1749112997818,"gateway":"8UUXN4P00A06NK"} + +{"bid":"16443e09-9c90-4ef3-a935-185fcd3db317","data":{"dongle_infos":[]},"tid":"809a23b9-bb92-49d5-acf2-006ca5234da3","timestamp":1749112997828,"gateway":"8UUXN4P00A06NK"} + +{"bid":"48e325e5-bbaa-4e32-bfce-ef9e19307ac6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"37a76c04-ab4e-4cc5-87ba-8b77f207e83b","timestamp":1749112997834,"gateway":"8UUXN4P00A06NK"} + +{"bid":"09a5f7b3-6293-4d95-b570-66ad1b2ffee9","data":{"firmware_version":"13.01.0002"},"tid":"bea08068-c3eb-4438-9c8f-b39fdd7e769c","timestamp":1749112997856,"gateway":"8UUXN4P00A06NK"} + +{"tid":"98cc5ab2-0fb6-4a8b-afc3-982b1ebd41f8","bid":"5bb1f860-988c-4f61-997d-8e4b03abca1e","timestamp":1749112998054,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"3829364a-de08-417a-9fe3-343ba88a6250","data":{"dongle_infos":[]},"tid":"9209dfd4-bb47-49a8-8cdd-97173cc22d7d","timestamp":1749112998829,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a6240fe6-f058-4583-883d-8be4ead9de7e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7cfc777a-b15e-453d-8714-a61c8c03b95d","timestamp":1749112999181,"gateway":"8UUXN4P00A06NK"} + +{"bid":"03940bc9-84ba-4bb2-b0da-db9b79b12770","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2a6f0a55-1de3-4cde-8996-bf04d771bb0c","timestamp":1749112999543,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c54e19ea-eab2-4937-93f6-6a767e7b491c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"96acaed7-66e8-484e-8659-82a0538e51bb","timestamp":1749112999978,"gateway":"8UUXN4P00A06NK"} + +{"bid":"48e325e5-bbaa-4e32-bfce-ef9e19307ac6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"37a76c04-ab4e-4cc5-87ba-8b77f207e83b","timestamp":1749112999980,"gateway":"8UUXN4P00A06NK"} + +{"bid":"273f5075-f443-4b4e-a9c9-33b631717312","data":{"dongle_infos":[]},"tid":"7628c392-76a2-4f37-b3c0-93698a6e3b86","timestamp":1749113000785,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f76bd20d-a16e-48d7-907e-2a49c0a194b3","data":{"air_transfer_enable":false},"need_reply":1,"tid":"19394437-a10e-432f-a3ad-0301e5617cd0","timestamp":1749113001475,"gateway":"8UUXN4P00A06NK"} + +{"bid":"03940bc9-84ba-4bb2-b0da-db9b79b12770","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2a6f0a55-1de3-4cde-8996-bf04d771bb0c","timestamp":1749113001584,"gateway":"8UUXN4P00A06NK"} + +{"bid":"31e82078-86ea-4599-8f7b-68dc8a62950a","data":{"departure_trajectory":[]},"tid":"ccbd61c9-9dc5-489d-be54-c39f848be74d","timestamp":1749113001682,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4b4b65f6-ca77-4f79-aa4d-2640122f6a73","data":{"departure_trajectory":[]},"tid":"a1352cb0-5157-4edd-b147-b96ff12788e9","timestamp":1749113002820,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c54e19ea-eab2-4937-93f6-6a767e7b491c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"96acaed7-66e8-484e-8659-82a0538e51bb","timestamp":1749113004178,"gateway":"8UUXN4P00A06NK"} + +{"bid":"48e325e5-bbaa-4e32-bfce-ef9e19307ac6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"37a76c04-ab4e-4cc5-87ba-8b77f207e83b","timestamp":1749113004179,"gateway":"8UUXN4P00A06NK"} + +{"bid":"31455f0e-21b5-47f2-8bd2-1e41af0fa813","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bff6cb30-60b3-4b75-a124-d78ecd1ff4a9","timestamp":1749113004547,"gateway":"8UUXN4P00A06NK"} + +{"bid":"31455f0e-21b5-47f2-8bd2-1e41af0fa813","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bff6cb30-60b3-4b75-a124-d78ecd1ff4a9","timestamp":1749113006588,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2b4dd5cb-7b75-4844-b222-1714d929e9a7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"aeec6526-7f90-4fa1-aac5-8c85ece0e217","timestamp":1749113009542,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f76bd20d-a16e-48d7-907e-2a49c0a194b3","data":{"air_transfer_enable":false},"need_reply":1,"tid":"19394437-a10e-432f-a3ad-0301e5617cd0","timestamp":1749113009669,"gateway":"8UUXN4P00A06NK"} + +{"tid":"57c01705-71e7-49ab-ab6a-9af7c1956ffe","bid":"80cd4d99-e929-4913-abae-5322a8c7842e","timestamp":1749113032668,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"6546b9fe-d67a-44f1-8c99-1e25ee8a4f84","bid":"7777ef0c-3b5a-482c-bf46-c654f37f3ffe","timestamp":1749113032671,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"ee38cb02-163e-4e2f-b78e-616b80811a41","bid":"74655707-7a2c-47ff-ae59-1a1b4870e5ab","timestamp":1749113033044,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"3b826979-cc89-4426-8d38-5c2061fe04ad","bid":"d888687d-1b80-4361-9e29-dea589ad25c0","timestamp":1749113033047,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"e95e8a92-8bb5-430e-a02a-634378b58089","bid":"a7c91636-5aeb-4cf2-b97b-2b9806354c86","timestamp":1749113033049,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"22b4ee82-554e-4af7-921d-a2bb8e2dd322","data":{"air_transfer_enable":false},"need_reply":1,"tid":"ffe0cbc0-6748-47e2-aff0-75fae100dba0","timestamp":1749113034443,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e028f685-311b-4ce5-910a-fc41360c8222","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1b917293-0bbc-4a7c-a5d2-dc89df34cf96","timestamp":1749113036505,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b0468df1-9bd1-4978-a50a-74305f2ad188","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"198ba406-d9b5-4e88-a666-7f183a7d3abf","timestamp":1749113037154,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5693ee6b-6902-4551-b172-ce061591530c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f50631cd-4ea4-42a7-874d-8a1b80a03897","timestamp":1749113037160,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7008ae89-7456-4686-a692-944971344706","data":{"dongle_infos":[]},"tid":"a4c1171d-5744-4252-9a57-5c9d35db39f7","timestamp":1749113037166,"gateway":"8UUXN4P00A06NK"} + +{"bid":"22b4ee82-554e-4af7-921d-a2bb8e2dd322","data":{"air_transfer_enable":false},"need_reply":1,"tid":"ffe0cbc0-6748-47e2-aff0-75fae100dba0","timestamp":1749113037203,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c9d2dd5-f4fc-4a29-920e-6f8da3afd41a","data":{"firmware_version":"13.01.0002"},"tid":"ab0f3062-8e36-4a05-8e13-9bb8026e4843","timestamp":1749113037211,"gateway":"8UUXN4P00A06NK"} + +{"tid":"e1f424d8-b7a6-4bc2-935b-0069d6863ed4","bid":"62fddd95-9677-46a4-88fc-56bb84c4579b","timestamp":1749113037280,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"1e6e0d6a-f03b-4ded-914a-62d129c9721c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"49969970-ddcc-4cb0-a79a-6b417cadd50f","timestamp":1749113037668,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4502c594-7972-4055-919a-1d31126bb775","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"97c88cdf-92fb-42eb-8a07-42d87f23e8e0","timestamp":1749113038038,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ea42c6d7-8506-4d74-81aa-66fa2819da20","data":{"dongle_infos":[]},"tid":"c3c5316c-c26f-4064-ba99-deeacccfcba0","timestamp":1749113038193,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b0468df1-9bd1-4978-a50a-74305f2ad188","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"198ba406-d9b5-4e88-a666-7f183a7d3abf","timestamp":1749113039337,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5693ee6b-6902-4551-b172-ce061591530c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f50631cd-4ea4-42a7-874d-8a1b80a03897","timestamp":1749113039338,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e9001e90-ab4d-4487-aba5-a9bf1a57fbe4","data":{"dongle_infos":[]},"tid":"ff674be1-8a79-49ce-95a3-813159f9aa8c","timestamp":1749113040090,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4502c594-7972-4055-919a-1d31126bb775","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"97c88cdf-92fb-42eb-8a07-42d87f23e8e0","timestamp":1749113040138,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9f5cd162-7a2a-404d-af14-36b341c0b13e","data":{"departure_trajectory":[]},"tid":"ac860a6f-6773-48bb-a6de-16d247735f32","timestamp":1749113041321,"gateway":"8UUXN4P00A06NK"} + +{"bid":"22b4ee82-554e-4af7-921d-a2bb8e2dd322","data":{"air_transfer_enable":false},"need_reply":1,"tid":"ffe0cbc0-6748-47e2-aff0-75fae100dba0","timestamp":1749113041399,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bda091f1-0ede-4913-bec0-1bb5d20fb2e9","data":{"departure_trajectory":[]},"tid":"5639cd98-99e1-4d6a-9cba-c7ea81e6bae0","timestamp":1749113042159,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d91db26f-9a75-47f2-bd25-e847cad93e81","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"34f119f7-91cd-488f-8729-8c244c05c70a","timestamp":1749113042668,"gateway":"8UUXN4P00A06NK"} + +{"bid":"012d9789-82dc-4e5d-af9c-ecafb38e951f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"73027660-af41-4f98-bf2d-d4f7b47ad1ed","timestamp":1749113043037,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b0468df1-9bd1-4978-a50a-74305f2ad188","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"198ba406-d9b5-4e88-a666-7f183a7d3abf","timestamp":1749113043537,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5693ee6b-6902-4551-b172-ce061591530c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f50631cd-4ea4-42a7-874d-8a1b80a03897","timestamp":1749113043539,"gateway":"8UUXN4P00A06NK"} + +{"bid":"012d9789-82dc-4e5d-af9c-ecafb38e951f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"73027660-af41-4f98-bf2d-d4f7b47ad1ed","timestamp":1749113045137,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6527cf40-ee4a-4ded-9444-ac877207775f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"95ea518f-53c6-4a89-8277-5fe38992ac26","timestamp":1749113047668,"gateway":"8UUXN4P00A06NK"} + +{"tid":"e781ff11-5ef9-40b8-a733-a1a2b70995d6","bid":"e38129fb-bc75-42f6-b1e6-8caa0b291966","timestamp":1749113073533,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"99d9296a-e7ad-438c-adba-d641011482bf","bid":"fbd85038-9400-4438-8683-e94991f75bc4","timestamp":1749113073539,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"3162633a-1557-4d43-8dbe-d99b07ee9398","data":{"mobility_status_notify":0},"need_reply":1,"tid":"874d7aed-36c6-4ee9-b215-83772aca7b18","timestamp":1749113075176,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a9389fe3-eaf2-42cf-ae10-4ef592c7966c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a19bd03e-7070-4900-98f6-ae791a62d3c9","timestamp":1749113075235,"gateway":"8UUXN4P00A06NK"} + +{"bid":"be20d15c-71c0-4e3b-87c9-b685db26c223","data":{"dongle_infos":[]},"tid":"d42d39b3-77d1-4771-b0ad-ea03afc84881","timestamp":1749113075608,"gateway":"8UUXN4P00A06NK"} + +{"bid":"74a33702-b1f3-4f19-a9e3-589b298057a0","data":{"firmware_version":"13.01.0002"},"tid":"c288b8ff-7466-4ac6-a86f-4c7a51fe190a","timestamp":1749113075614,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c0a2897c-ea60-4994-b8b2-61aa4a54997a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2aac29d5-1983-4dde-9690-67757721e1fa","timestamp":1749113075804,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ab5afcce-813d-412f-8c24-109b386dd168","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3b05e1a1-0794-4c2a-9227-c408db614c44","timestamp":1749113076296,"gateway":"8UUXN4P00A06NK"} + +{"bid":"526c202c-7aff-4710-8484-730420530fa9","data":{"dongle_infos":[]},"tid":"2c903dae-2c05-45ab-930e-0dbf08d20841","timestamp":1749113076640,"gateway":"8UUXN4P00A06NK"} + +{"tid":"1c760e7d-5d03-4139-8a96-60174a46d3c2","bid":"30278368-8781-4b42-a2ba-cd25dc88bc03","timestamp":1749113077275,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"3162633a-1557-4d43-8dbe-d99b07ee9398","data":{"mobility_status_notify":0},"need_reply":1,"tid":"874d7aed-36c6-4ee9-b215-83772aca7b18","timestamp":1749113077303,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a9389fe3-eaf2-42cf-ae10-4ef592c7966c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a19bd03e-7070-4900-98f6-ae791a62d3c9","timestamp":1749113077304,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ab5afcce-813d-412f-8c24-109b386dd168","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3b05e1a1-0794-4c2a-9227-c408db614c44","timestamp":1749113078302,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ba1c92be-5305-434a-b9df-2843512e3722","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f0390539-634c-4b5e-82b9-75a550a1fc3c","timestamp":1749113078533,"gateway":"8UUXN4P00A06NK"} + +{"bid":"90ad86e3-894b-481f-a179-dc344475e9b4","data":{"dongle_infos":[]},"tid":"230ed7ad-7d60-42da-aff9-f40478728403","timestamp":1749113079329,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a9b1fd42-4c66-437c-b581-bbe224d314eb","data":{"departure_trajectory":[]},"tid":"daaa0276-14b1-4d1a-b613-b03162068434","timestamp":1749113079938,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c0a2897c-ea60-4994-b8b2-61aa4a54997a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2aac29d5-1983-4dde-9690-67757721e1fa","timestamp":1749113080008,"gateway":"8UUXN4P00A06NK"} + +{"bid":"54d970ef-debc-4654-9f31-66664648ea30","data":{"departure_trajectory":[]},"tid":"283257e5-6ad9-4e03-ad8d-94a63e4fcbcb","timestamp":1749113080605,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ba1c92be-5305-434a-b9df-2843512e3722","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f0390539-634c-4b5e-82b9-75a550a1fc3c","timestamp":1749113080702,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3162633a-1557-4d43-8dbe-d99b07ee9398","data":{"mobility_status_notify":0},"need_reply":1,"tid":"874d7aed-36c6-4ee9-b215-83772aca7b18","timestamp":1749113081503,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ab5afcce-813d-412f-8c24-109b386dd168","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3b05e1a1-0794-4c2a-9227-c408db614c44","timestamp":1749113082502,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c7e90f5a-26d6-481b-8c4e-0a30b2fae7da","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6ce2baac-872f-4b1a-8450-3b259af970aa","timestamp":1749113083533,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c7e90f5a-26d6-481b-8c4e-0a30b2fae7da","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6ce2baac-872f-4b1a-8450-3b259af970aa","timestamp":1749113085704,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c0a2897c-ea60-4994-b8b2-61aa4a54997a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2aac29d5-1983-4dde-9690-67757721e1fa","timestamp":1749113088204,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3959bb4d-5c02-4c64-9ac7-6afce037c63e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f0977311-a935-4a43-925d-ab5792143d8d","timestamp":1749113088539,"gateway":"8UUXN4P00A06NK"} + +{"tid":"47c40129-087b-4b37-96f6-4915a7c85d51","bid":"369fd9e9-0159-4649-b228-6fcbb6a05f3b","timestamp":1749113111619,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"009d54ad-b87e-4d28-afb0-b7a3627d5df3","bid":"631adc25-8d35-4986-92c3-857953ab80dd","timestamp":1749113111623,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"7fd81cfd-3382-4c85-8b57-36ec984d5fbb","bid":"780d6e01-aa66-416c-a377-e3683dc8ce01","timestamp":1749113112224,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"3117f30f-5653-48cd-b63b-c03317ed0e1c","bid":"4305c1c7-7394-47d4-83fe-025a9dce40b9","timestamp":1749113112232,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"769ae493-34de-44c0-90fe-37020c71cf6d","bid":"8b71a736-1d42-40e7-b305-6d73593871ac","timestamp":1749113112237,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"9bfd3bc0-b99c-4191-be38-db1efcd37a2b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1207c590-6800-46c6-b2af-952a0da33b47","timestamp":1749113114003,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e2acaecc-b9bf-431e-bd15-5db220746b4f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"89848c8f-5c21-45b9-99b3-97374e1ed779","timestamp":1749113116303,"gateway":"8UUXN4P00A06NK"} + +{"bid":"836341fa-50d3-47ea-8127-d23e7d283a99","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b3e01077-cc58-4bd2-929b-f7e891b2ae79","timestamp":1749113116664,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9bfd3bc0-b99c-4191-be38-db1efcd37a2b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1207c590-6800-46c6-b2af-952a0da33b47","timestamp":1749113116735,"gateway":"8UUXN4P00A06NK"} + +{"tid":"730da7c6-95f1-4e09-9d62-43443bed83c7","bid":"39baeabc-4cf3-46de-9d88-a07072e756f0","timestamp":1749113116937,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"57fe424b-fecb-4959-a856-c8dacaeab25b","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c626b186-1adc-402e-bdb2-1966d609614a","timestamp":1749113116973,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7509e33c-987a-4534-9beb-d214bf5d7eab","data":{"dongle_infos":[]},"tid":"11cfbeef-f4cd-420d-b8bc-4d26b4cc3d53","timestamp":1749113116982,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dff06211-1b27-4b63-b451-7922f9987ee9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c6f3a00f-466e-4fc7-a085-b61080b7e2a9","timestamp":1749113116988,"gateway":"8UUXN4P00A06NK"} + +{"bid":"23a84a38-f307-4c31-85fc-7231e4acd9e1","data":{"firmware_version":"13.01.0002"},"tid":"f4c55ced-2e40-4a84-9c06-ef79d88f6c02","timestamp":1749113117013,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e4cae19-f1c8-49fd-9c45-a571b7854009","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"caf92b2e-12c0-4ccf-8bc8-a16c3d0a8473","timestamp":1749113117218,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b6731105-e7cf-450a-8de8-e13aaaa21c63","data":{"dongle_infos":[]},"tid":"daba66ba-c1cb-4528-9605-1fdc31288062","timestamp":1749113117998,"gateway":"8UUXN4P00A06NK"} + +{"bid":"57fe424b-fecb-4959-a856-c8dacaeab25b","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c626b186-1adc-402e-bdb2-1966d609614a","timestamp":1749113119139,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dff06211-1b27-4b63-b451-7922f9987ee9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c6f3a00f-466e-4fc7-a085-b61080b7e2a9","timestamp":1749113119140,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e4cae19-f1c8-49fd-9c45-a571b7854009","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"caf92b2e-12c0-4ccf-8bc8-a16c3d0a8473","timestamp":1749113119341,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e295cad4-3ef4-415d-bac2-5c995bf714b6","data":{"departure_trajectory":[]},"tid":"b116b51b-e251-4ee5-9495-8098216220a8","timestamp":1749113120902,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9bfd3bc0-b99c-4191-be38-db1efcd37a2b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1207c590-6800-46c6-b2af-952a0da33b47","timestamp":1749113120930,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a5311f4d-18d4-409a-ad30-a82cb3eebc11","data":{"dongle_infos":[]},"tid":"3eb6a7f8-9066-4c6d-a8cf-bbb75a051010","timestamp":1749113121002,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b2c78274-e658-4e12-afd1-7cb0c1a3c69b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6d889ce6-213c-4ff4-a2c6-7673b52773d5","timestamp":1749113121621,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e002b507-f3b5-4378-8118-ea61da2e87bf","data":{"departure_trajectory":[]},"tid":"a2cbd289-9667-45ae-ba54-6b82911d4efb","timestamp":1749113121968,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2283fff2-7363-49af-a0fd-0f1b0982513c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cb8209bc-f5de-4a6f-a75c-f035bcb271c6","timestamp":1749113122224,"gateway":"8UUXN4P00A06NK"} + +{"bid":"57fe424b-fecb-4959-a856-c8dacaeab25b","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c626b186-1adc-402e-bdb2-1966d609614a","timestamp":1749113123337,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dff06211-1b27-4b63-b451-7922f9987ee9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c6f3a00f-466e-4fc7-a085-b61080b7e2a9","timestamp":1749113123338,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2283fff2-7363-49af-a0fd-0f1b0982513c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cb8209bc-f5de-4a6f-a75c-f035bcb271c6","timestamp":1749113124340,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4ceed8f9-168c-4bbb-8e9c-1cc633f4c616","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1f81f657-8076-4246-ad25-9bcd6f155e57","timestamp":1749113126621,"gateway":"8UUXN4P00A06NK"} + +{"tid":"9894f21a-408d-476e-8c72-0098e47e81ec","bid":"4ddb7582-5d5c-41d3-8c3b-4cc31ef898d9","timestamp":1749113152174,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"dd9538df-ca99-413d-a914-7813250f91fe","bid":"09487562-9f34-481c-8b0c-cefc5deb00e6","timestamp":1749113152184,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"781b415b-354f-4e50-bc99-a4b2e69bfc29","data":{"mobility_status_notify":0},"need_reply":1,"tid":"22a30f7b-f6f3-4346-9672-0a3c3259a057","timestamp":1749113153802,"gateway":"8UUXN4P00A06NK"} + +{"bid":"728cd39e-cdf4-4af8-8653-4a929000362c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e7c92c76-2b42-4420-ba8d-47a60f925d4b","timestamp":1749113153833,"gateway":"8UUXN4P00A06NK"} + +{"bid":"426a3f4f-3fb2-46d1-92d9-70e3fd08e1ca","data":{"air_transfer_enable":false},"need_reply":1,"tid":"ff93d1b6-a9d3-409c-8850-c569780ed0e5","timestamp":1749113154239,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d32661b6-f0b6-4d56-b962-123a5d27dfbd","data":{"dongle_infos":[]},"tid":"3b622eaf-716a-46f2-a781-1c575387157e","timestamp":1749113154243,"gateway":"8UUXN4P00A06NK"} + +{"bid":"80b5cbcf-ae26-48d7-9e98-465620f1a475","data":{"firmware_version":"13.01.0002"},"tid":"f6d76f55-6134-4884-870f-c2d9b5a6681c","timestamp":1749113154250,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3214a30a-cb82-47be-98b9-070efba94ae3","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"298e0a08-27f2-4952-af83-645c7b6f2e59","timestamp":1749113154970,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c7166853-c2b5-4df4-8e4e-f763c2f151b1","bid":"4b076d69-3852-4164-9840-dc47115f6872","timestamp":1749113155057,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"tid":"53265847-c730-4bc0-b49c-6e9a4e1a6462","bid":"2454cdb3-01e9-45bd-a471-d4d70f8f4257","timestamp":1749113192831,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"8a3df922-d739-414f-a385-4b926eb7f315","bid":"924d38e6-84ed-450b-adfd-cc7272f755c1","timestamp":1749113192840,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"d3d9eafb-f829-46e0-8bd0-467250a33341","data":{"mobility_status_notify":0},"need_reply":1,"tid":"4d8b3db2-5544-447e-93c2-cea62c03a7d0","timestamp":1749113194489,"gateway":"8UUXN4P00A06NK"} + +{"bid":"390a0880-4442-4930-8987-0c00b90a48ec","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ae0b2af2-ad82-4fcf-88de-6cf2af0ec872","timestamp":1749113194494,"gateway":"8UUXN4P00A06NK"} + +{"bid":"406b84dc-afb4-4a46-900c-81cfec292cba","data":{"dongle_infos":[]},"tid":"8f13d333-b7e0-4bd5-8a13-8c79c0a40979","timestamp":1749113194922,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b39222df-46b5-44d5-92cd-ecbd472f38fa","data":{"dongle_infos":[]},"tid":"2449cb28-46a2-4a51-a12d-c94c5c3472ef","timestamp":1749113194923,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df707bf0-0231-41eb-a9e0-7176ba677405","data":{"firmware_version":"13.01.0002"},"tid":"2ab7b58e-8517-420a-a95d-be26030628db","timestamp":1749113194929,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d8270c31-ac83-41ca-9cdf-4603858d4992","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1c010711-1a10-4881-ae77-886c81071d33","timestamp":1749113195117,"gateway":"8UUXN4P00A06NK"} + +{"tid":"cfc6136c-8119-4c7d-ba30-97c89060bca1","bid":"664111dc-0aa4-4162-81f9-81663c3dcc65","timestamp":1749113195479,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"a4efd247-85a6-4c4b-a002-24be13561777","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"52973ad7-f9ff-4198-9532-22bb2ca142f8","timestamp":1749113195544,"gateway":"8UUXN4P00A06NK"} + +{"bid":"593fe016-5cfc-4ac1-b539-0d9674f1844b","data":{"dongle_infos":[]},"tid":"64c0c688-6fd3-457f-ae9d-556fc6200333","timestamp":1749113195922,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d3d9eafb-f829-46e0-8bd0-467250a33341","data":{"mobility_status_notify":0},"need_reply":1,"tid":"4d8b3db2-5544-447e-93c2-cea62c03a7d0","timestamp":1749113196629,"gateway":"8UUXN4P00A06NK"} + +{"bid":"390a0880-4442-4930-8987-0c00b90a48ec","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ae0b2af2-ad82-4fcf-88de-6cf2af0ec872","timestamp":1749113196630,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a4efd247-85a6-4c4b-a002-24be13561777","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"52973ad7-f9ff-4198-9532-22bb2ca142f8","timestamp":1749113197629,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7f0318d0-d003-4a6a-ba61-b9bd82a6cdc6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f564cdf3-ecff-4c74-a197-d5437f3fc3ff","timestamp":1749113197828,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d8270c31-ac83-41ca-9cdf-4603858d4992","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1c010711-1a10-4881-ae77-886c81071d33","timestamp":1749113199316,"gateway":"8UUXN4P00A06NK"} + +{"bid":"901e9108-b2a6-4245-b685-09175ee2db27","data":{"departure_trajectory":[]},"tid":"4d4ae597-b586-44dd-ad3e-d462a78f3499","timestamp":1749113199386,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4f3004f5-bdc7-44a4-9b3f-52d85691ef97","data":{"departure_trajectory":[]},"tid":"f015e6a4-2d16-4732-9ea9-1fb3853ea5d3","timestamp":1749113199917,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7f0318d0-d003-4a6a-ba61-b9bd82a6cdc6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f564cdf3-ecff-4c74-a197-d5437f3fc3ff","timestamp":1749113200024,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d3d9eafb-f829-46e0-8bd0-467250a33341","data":{"mobility_status_notify":0},"need_reply":1,"tid":"4d8b3db2-5544-447e-93c2-cea62c03a7d0","timestamp":1749113200829,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a4efd247-85a6-4c4b-a002-24be13561777","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"52973ad7-f9ff-4198-9532-22bb2ca142f8","timestamp":1749113201824,"gateway":"8UUXN4P00A06NK"} + +{"bid":"588c6066-9db4-45cb-9f66-e8ee4ecabfe7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"56c170f2-49dd-4616-bcd8-6ed4739708f6","timestamp":1749113202824,"gateway":"8UUXN4P00A06NK"} + +{"bid":"588c6066-9db4-45cb-9f66-e8ee4ecabfe7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"56c170f2-49dd-4616-bcd8-6ed4739708f6","timestamp":1749113205028,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d8270c31-ac83-41ca-9cdf-4603858d4992","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1c010711-1a10-4881-ae77-886c81071d33","timestamp":1749113207519,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dd718c65-e7d4-43bc-9cfd-78c5c67e359c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"087b5f10-4560-466e-bcc3-eedd2a4f9ed5","timestamp":1749113207829,"gateway":"8UUXN4P00A06NK"} + +{"tid":"50f3080f-4299-4f5b-be9a-dd644b70a3f8","bid":"65fe5002-d724-4308-8d4a-403d02321e15","timestamp":1749113232155,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"aaa2304a-b828-4417-834a-0e87aad3632a","bid":"65f75a56-8204-41b3-af43-c7fc9d900ee9","timestamp":1749113232157,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"dc094040-dcee-4334-9f9f-4c852499c564","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8048bed8-c12a-4aa1-9e11-6824dd138a1f","timestamp":1749113232193,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e9901b7-945f-462c-9179-fb41032fc828","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3fe25321-8b83-45f2-aebb-692251693b39","timestamp":1749113234243,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6c4c3e8b-710f-471c-95d7-e847b5a22fa1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f0c4dd70-1017-43ea-84fe-c405178b5b0c","timestamp":1749113234246,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dc094040-dcee-4334-9f9f-4c852499c564","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8048bed8-c12a-4aa1-9e11-6824dd138a1f","timestamp":1749113234679,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d357de82-671a-4c3e-9ec9-c954b1596aeb","data":{"dongle_infos":[]},"tid":"999522ca-4dca-4652-a93d-0ab7c5b274f2","timestamp":1749113235237,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e408ffb-0acd-4f4c-9cc9-053b2e972657","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6938ca50-3d27-4479-a6b4-43abffa72f01","timestamp":1749113235243,"gateway":"8UUXN4P00A06NK"} + +{"bid":"00806b3d-303f-42dd-b5e7-3d10d2030bd3","data":{"firmware_version":"13.01.0002"},"tid":"2fdccd7b-fb88-4c4a-b93a-d16db82a3f1b","timestamp":1749113235263,"gateway":"8UUXN4P00A06NK"} + +{"tid":"184eed3d-1d70-448b-a401-b7f465680138","bid":"8cf8e62e-c4f1-4274-87ab-04a1dbbc7e11","timestamp":1749113235295,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e9901b7-945f-462c-9179-fb41032fc828","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3fe25321-8b83-45f2-aebb-692251693b39","timestamp":1749113236248,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6c4c3e8b-710f-471c-95d7-e847b5a22fa1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f0c4dd70-1017-43ea-84fe-c405178b5b0c","timestamp":1749113236249,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9b2d9b9d-3918-457e-8d17-6eb84dbd61c3","data":{"dongle_infos":[]},"tid":"68896a21-7803-4b5e-b344-f466677f6fd1","timestamp":1749113236249,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f68379b7-5ea8-455a-8697-328b1e2ea368","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"36c376da-5ae1-4af9-a794-ce1115f635b7","timestamp":1749113237151,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e408ffb-0acd-4f4c-9cc9-053b2e972657","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6938ca50-3d27-4479-a6b4-43abffa72f01","timestamp":1749113237247,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dc094040-dcee-4334-9f9f-4c852499c564","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8048bed8-c12a-4aa1-9e11-6824dd138a1f","timestamp":1749113238882,"gateway":"8UUXN4P00A06NK"} + +{"bid":"92ab8085-de11-42ab-b9bc-5c3d71d9f236","data":{"departure_trajectory":[]},"tid":"fa72ea2c-35a6-4a8c-a50a-c652b922cb97","timestamp":1749113239089,"gateway":"8UUXN4P00A06NK"} + +{"bid":"18e7a21d-1a73-48d8-a9af-5c1af765b820","data":{"dongle_infos":[]},"tid":"f4d845c6-8937-4973-8d90-ddc3af4595c3","timestamp":1749113239090,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f68379b7-5ea8-455a-8697-328b1e2ea368","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"36c376da-5ae1-4af9-a794-ce1115f635b7","timestamp":1749113239247,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2cfd2ea9-c18a-4c9b-9b8e-196bbe1d6083","data":{"departure_trajectory":[]},"tid":"40cdd263-00a5-415d-95d3-f7a1fd638c89","timestamp":1749113240233,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e9901b7-945f-462c-9179-fb41032fc828","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3fe25321-8b83-45f2-aebb-692251693b39","timestamp":1749113240447,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e408ffb-0acd-4f4c-9cc9-053b2e972657","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6938ca50-3d27-4479-a6b4-43abffa72f01","timestamp":1749113241447,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2e5da64b-9f5a-4d56-8523-320dedbbf50f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a88141f1-b265-4e03-a500-19d6a2f881ac","timestamp":1749113242150,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2e5da64b-9f5a-4d56-8523-320dedbbf50f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a88141f1-b265-4e03-a500-19d6a2f881ac","timestamp":1749113244248,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dc094040-dcee-4334-9f9f-4c852499c564","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8048bed8-c12a-4aa1-9e11-6824dd138a1f","timestamp":1749113247079,"gateway":"8UUXN4P00A06NK"} + +{"bid":"73af0974-54e4-4ff2-b45b-41285206fc53","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"674da62f-328c-4055-9f73-dbc5c37c575b","timestamp":1749113247153,"gateway":"8UUXN4P00A06NK"} + +{"tid":"74ae5569-35c0-4035-b6cb-115ae12fa8a4","bid":"6646d920-9c3e-4005-bf42-75373e7a6978","timestamp":1749113272817,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"e98e4654-f564-40f2-ae68-7708d1c87a74","bid":"4b1ad4ae-2d19-4703-ae34-e58b936a8f33","timestamp":1749113272824,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"0ac060ea-7cc5-40a8-addc-71571616fc51","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c6adb951-df58-4f36-93ee-1e52c9696007","timestamp":1749113274690,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b69227fd-5a1d-4bef-8fba-9cfe47b89fb9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"03c6d13c-d52d-4416-8ba7-237d991427f6","timestamp":1749113274693,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a4e38d00-0898-4f87-9efd-30e258c36cbb","data":{"dongle_infos":[]},"tid":"82f1642c-5592-46b5-bfef-99f3476c31aa","timestamp":1749113275088,"gateway":"8UUXN4P00A06NK"} + +{"bid":"33b8c924-78a6-49af-8115-cdccb95d4b16","data":{"firmware_version":"13.01.0002"},"tid":"d6bb52fc-3c65-4420-a613-4c1d9e43833f","timestamp":1749113275100,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9d9879c2-fc0b-4bf7-a789-8e37d3729a61","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2fae1442-d3b6-473f-b619-1523d50f9790","timestamp":1749113275282,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aeef02eb-de94-4511-a57d-edebe919c6a5","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"01e57b7d-2bb0-49c4-bc1b-2cd1878f0f0f","timestamp":1749113275836,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e9e6ac89-9138-48f6-8fe1-ed564bd9b71c","data":{"dongle_infos":[]},"tid":"ae0b807d-22e5-4216-abc3-576c4750329d","timestamp":1749113276091,"gateway":"8UUXN4P00A06NK"} + +{"tid":"3fe2af88-e475-4a33-a703-0a8e76df4585","bid":"b2725240-975b-4cb2-8009-9be8861c9f9e","timestamp":1749113276182,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"0ac060ea-7cc5-40a8-addc-71571616fc51","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c6adb951-df58-4f36-93ee-1e52c9696007","timestamp":1749113276823,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b69227fd-5a1d-4bef-8fba-9cfe47b89fb9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"03c6d13c-d52d-4416-8ba7-237d991427f6","timestamp":1749113276824,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6616e7d6-563a-4905-8035-b0413637a09e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1e0ccdc4-87a9-41c2-8d58-fee4660f6509","timestamp":1749113277817,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aeef02eb-de94-4511-a57d-edebe919c6a5","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"01e57b7d-2bb0-49c4-bc1b-2cd1878f0f0f","timestamp":1749113278023,"gateway":"8UUXN4P00A06NK"} + +{"bid":"da9ec134-e935-49b4-bceb-496812be4a17","data":{"dongle_infos":[]},"tid":"0264a223-da3b-4482-bd4a-021c0eab4f0e","timestamp":1749113278737,"gateway":"8UUXN4P00A06NK"} + +{"bid":"265ca35d-27bc-4254-a287-6f3f352d03d8","data":{"departure_trajectory":[]},"tid":"c68c8e5d-479f-4527-b53a-5075cf14ef72","timestamp":1749113279461,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9d9879c2-fc0b-4bf7-a789-8e37d3729a61","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2fae1442-d3b6-473f-b619-1523d50f9790","timestamp":1749113279479,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6616e7d6-563a-4905-8035-b0413637a09e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1e0ccdc4-87a9-41c2-8d58-fee4660f6509","timestamp":1749113279823,"gateway":"8UUXN4P00A06NK"} + +{"bid":"65e79987-a421-4916-93b5-bda95f7af832","data":{"departure_trajectory":[]},"tid":"e9725f94-e192-45b8-a98b-124c09fc5430","timestamp":1749113280080,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0ac060ea-7cc5-40a8-addc-71571616fc51","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c6adb951-df58-4f36-93ee-1e52c9696007","timestamp":1749113281023,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aeef02eb-de94-4511-a57d-edebe919c6a5","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"01e57b7d-2bb0-49c4-bc1b-2cd1878f0f0f","timestamp":1749113282222,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6517a575-0753-4ca0-b64c-cb5761cdf180","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"700a1408-27bd-41e1-9e43-9d9e9ed7eb07","timestamp":1749113282814,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6517a575-0753-4ca0-b64c-cb5761cdf180","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"700a1408-27bd-41e1-9e43-9d9e9ed7eb07","timestamp":1749113284822,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9d9879c2-fc0b-4bf7-a789-8e37d3729a61","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2fae1442-d3b6-473f-b619-1523d50f9790","timestamp":1749113287678,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b038157a-4fdb-4e21-837c-dda191432325","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f7016399-b997-46dd-b8e4-874249d477a5","timestamp":1749113287817,"gateway":"8UUXN4P00A06NK"} + +{"tid":"16561dbb-d7a4-47cb-99e5-c2adc93a578e","bid":"8dbe604a-52c8-4359-b0c5-77ef1c44e084","timestamp":1749113311372,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"013ec6ea-97a9-4122-bec1-4af1c8bc8627","bid":"47ad3cbc-3b39-462a-9342-366b4ecb0b96","timestamp":1749113311374,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"17c72d68-420a-424d-9d5c-07718e04c355","data":{"air_transfer_enable":false},"need_reply":1,"tid":"39172538-72ac-4425-a00b-27f7c38353ed","timestamp":1749113312901,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ef3433ea-23ad-4181-9b31-2885534d589d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"08682589-cb94-4b67-a4ba-1cddb08fff57","timestamp":1749113314871,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c037105b-1ca0-4237-b07e-b43274c409d8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ecd7300e-b021-4f7e-b349-bdb8aded7050","timestamp":1749113314874,"gateway":"8UUXN4P00A06NK"} + +{"bid":"17c72d68-420a-424d-9d5c-07718e04c355","data":{"air_transfer_enable":false},"need_reply":1,"tid":"39172538-72ac-4425-a00b-27f7c38353ed","timestamp":1749113315535,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5cc76b7f-f3a7-4f33-b839-480f79c0c0f8","data":{"dongle_infos":[]},"tid":"c9ea53df-c612-4d62-ad50-f32a7ce5e546","timestamp":1749113315903,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f7fc0e40-1742-4703-b4d9-4c4e2f371d9d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"7ab1b9ef-4051-4827-9aa0-8239d22ed810","timestamp":1749113315909,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ed50e594-91b9-4828-83ab-bbda7d3cfd11","data":{"firmware_version":"13.01.0002"},"tid":"b220a28e-35c8-43ff-9ef9-dba9e0cbd631","timestamp":1749113315957,"gateway":"8UUXN4P00A06NK"} + +{"tid":"f5d3ecea-7367-4aaf-8f3e-1e2f4c2802e2","bid":"f75ae746-3620-4db9-83cb-fe0117d9e517","timestamp":1749113316340,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"b56ba620-d598-4e3c-9d4f-a79724de3065","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3223cc0c-95f7-437f-8b4e-3441319be998","timestamp":1749113316378,"gateway":"8UUXN4P00A06NK"} + +{"bid":"89a30ef1-bf8f-470a-b5cf-869298437bdd","data":{"dongle_infos":[]},"tid":"c4118338-a2ac-4eb7-829e-7db7f8027dc1","timestamp":1749113316899,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ef3433ea-23ad-4181-9b31-2885534d589d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"08682589-cb94-4b67-a4ba-1cddb08fff57","timestamp":1749113316902,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f7fc0e40-1742-4703-b4d9-4c4e2f371d9d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"7ab1b9ef-4051-4827-9aa0-8239d22ed810","timestamp":1749113317910,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b56ba620-d598-4e3c-9d4f-a79724de3065","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3223cc0c-95f7-437f-8b4e-3441319be998","timestamp":1749113318507,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0127580b-4c90-46de-a6dd-de798473a88c","data":{"departure_trajectory":[]},"tid":"ec9c9002-a4d5-40f2-a417-c5aa195cd819","timestamp":1749113319734,"gateway":"8UUXN4P00A06NK"} + +{"bid":"17c72d68-420a-424d-9d5c-07718e04c355","data":{"air_transfer_enable":false},"need_reply":1,"tid":"39172538-72ac-4425-a00b-27f7c38353ed","timestamp":1749113319740,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c7c12133-e48b-436d-a406-1f264c84c7d8","data":{"dongle_infos":[]},"tid":"75f65b6d-df23-4ee1-bbdb-a60df426ec40","timestamp":1749113320189,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f3e31d09-da76-4721-9bb0-d59a84b1d58f","data":{"departure_trajectory":[]},"tid":"da396451-05c2-4de1-94a4-eb74749d5741","timestamp":1749113320894,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ef3433ea-23ad-4181-9b31-2885534d589d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"08682589-cb94-4b67-a4ba-1cddb08fff57","timestamp":1749113321108,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f883f310-ad9a-461d-9764-50656687e37e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"43d118fa-2bf9-49f6-b003-7abdbedaf663","timestamp":1749113321379,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f7fc0e40-1742-4703-b4d9-4c4e2f371d9d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"7ab1b9ef-4051-4827-9aa0-8239d22ed810","timestamp":1749113322112,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f883f310-ad9a-461d-9764-50656687e37e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"43d118fa-2bf9-49f6-b003-7abdbedaf663","timestamp":1749113323511,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c117d8ec-ecf0-4628-8f72-bc8bfb396121","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"92cacbed-9cf7-4389-a127-2efb25b89eac","timestamp":1749113326378,"gateway":"8UUXN4P00A06NK"} + +{"tid":"578ff771-5fc8-4060-b21b-00901e848999","bid":"fd5b4c4c-328e-447f-8afa-2ab4a59ca81d","timestamp":1749113348531,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"9565525f-a553-47ef-8b2c-3211737044bf","bid":"32a2543d-480b-4d37-932c-a51720089766","timestamp":1749113348538,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"bb2d9fdd-bdae-4a0c-bc89-5acf3377de27","bid":"fffc8a08-f38b-4642-a98c-2f6fb4081000","timestamp":1749113350134,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"77c0cd58-6408-4b3f-bfca-0f27642910b3","bid":"a6f0e808-426c-4009-ab36-364d9ec7e779","timestamp":1749113350141,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"770f4f19-b19d-4f58-8f5c-3ff826050b02","data":{"air_transfer_enable":false},"need_reply":1,"tid":"34470531-b66f-42b1-b5ca-3b23779f6ed7","timestamp":1749113351086,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1caf877c-8553-44ff-a892-f106aab9ea4b","data":{"mobility_status_notify":0},"need_reply":1,"tid":"35d25c9b-36db-4906-8337-f2f8b1d445c1","timestamp":1749113353037,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d99938ca-781d-488f-9db7-6dbac9e805d9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"60e3a607-cef3-4d06-b09f-1780fddee7ca","timestamp":1749113353142,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1d63f46b-4299-435b-84ad-cf497f7276fe","data":{"dongle_infos":[]},"tid":"7fab68df-aec4-42c9-b782-969dbc5638bd","timestamp":1749113353420,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0eb0ac76-bfda-41d9-b803-aa7ff748663b","data":{"firmware_version":"13.01.0002"},"tid":"f228520c-6106-4480-af49-262b94de7b08","timestamp":1749113353448,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6790bbeb-c6a9-462f-9aec-503c51aef78d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e92896b1-e653-4a13-8797-1e5a0fa4c6c3","timestamp":1749113353533,"gateway":"8UUXN4P00A06NK"} + +{"bid":"770f4f19-b19d-4f58-8f5c-3ff826050b02","data":{"air_transfer_enable":false},"need_reply":1,"tid":"34470531-b66f-42b1-b5ca-3b23779f6ed7","timestamp":1749113353613,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e23bf77-20b5-4c88-ada5-43fe3b31921e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"95d3b877-bef0-4368-a498-2294d7e6638b","timestamp":1749113354239,"gateway":"8UUXN4P00A06NK"} + +{"bid":"74e7e638-5d74-42da-ba80-45ac744afd4d","data":{"dongle_infos":[]},"tid":"f387cf72-00f7-4268-91dd-f864f4ebeb77","timestamp":1749113354443,"gateway":"8UUXN4P00A06NK"} + +{"tid":"84f9bf03-962e-4ea0-8fa8-5a6893eddc67","bid":"933af69c-76d6-4d68-b52e-574840b671fe","timestamp":1749113354562,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"1caf877c-8553-44ff-a892-f106aab9ea4b","data":{"mobility_status_notify":0},"need_reply":1,"tid":"35d25c9b-36db-4906-8337-f2f8b1d445c1","timestamp":1749113355113,"gateway":"8UUXN4P00A06NK"} + +{"bid":"607cfd2c-2bc3-4027-ba7d-d45520728069","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e34006ab-d09b-438a-81eb-77566dc957ef","timestamp":1749113355134,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e23bf77-20b5-4c88-ada5-43fe3b31921e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"95d3b877-bef0-4368-a498-2294d7e6638b","timestamp":1749113356313,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f62a9fcd-5e12-4ba9-815d-0dedaad9f4e4","data":{"dongle_infos":[]},"tid":"01bd18ca-3431-483a-b83f-6b83d6dfda40","timestamp":1749113357040,"gateway":"8UUXN4P00A06NK"} + +{"bid":"607cfd2c-2bc3-4027-ba7d-d45520728069","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e34006ab-d09b-438a-81eb-77566dc957ef","timestamp":1749113357311,"gateway":"8UUXN4P00A06NK"} + +{"bid":"770f4f19-b19d-4f58-8f5c-3ff826050b02","data":{"air_transfer_enable":false},"need_reply":1,"tid":"34470531-b66f-42b1-b5ca-3b23779f6ed7","timestamp":1749113357810,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1607762c-19e0-4f2a-a27e-e15fabacbd83","data":{"departure_trajectory":[]},"tid":"be3ba61a-cd18-4f1f-a379-f658f7f4e83f","timestamp":1749113357871,"gateway":"8UUXN4P00A06NK"} + +{"bid":"da75f3fb-42ad-49e1-8119-190ba8241f4e","data":{"departure_trajectory":[]},"tid":"f086ef10-cefd-43f1-b288-52a072b5795d","timestamp":1749113358412,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7a189a71-e1ad-4692-a869-e0e13d2dfdd2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"26e25685-a1e6-4ece-aebe-e86609f2318e","timestamp":1749113358528,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1caf877c-8553-44ff-a892-f106aab9ea4b","data":{"mobility_status_notify":0},"need_reply":1,"tid":"35d25c9b-36db-4906-8337-f2f8b1d445c1","timestamp":1749113359315,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c638374a-19c5-4472-983b-fb6363517545","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"fc8f1faf-fcf3-4ec6-88f8-00019e9c9d7c","timestamp":1749113360133,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e23bf77-20b5-4c88-ada5-43fe3b31921e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"95d3b877-bef0-4368-a498-2294d7e6638b","timestamp":1749113360507,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c638374a-19c5-4472-983b-fb6363517545","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"fc8f1faf-fcf3-4ec6-88f8-00019e9c9d7c","timestamp":1749113362308,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b9a3970e-8ca6-4823-a0d0-363d4add5e5e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"66111d17-1146-4c77-9f83-9558847d5b11","timestamp":1749113363537,"gateway":"8UUXN4P00A06NK"} + +{"tid":"06c9863c-90ae-4cca-9b00-d1761ed176cd","bid":"5dcbd3d0-eb48-4f59-9169-7701618bf99a","timestamp":1749113389374,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"1e8be4fb-a58c-4963-a422-50fd90f636ce","bid":"f6b22996-ac6e-4b9a-9785-37f1450e854c","timestamp":1749113389384,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e14889f-11b3-451b-a3f5-0d9d90d34287","data":{"mobility_status_notify":0},"need_reply":1,"tid":"4ca452c8-4e76-4ad3-b97b-b08840cb9e9d","timestamp":1749113391327,"gateway":"8UUXN4P00A06NK"} + +{"bid":"78796e65-6908-429b-812c-1c430eeae875","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c92f828c-ed25-4d6f-8cf7-f3d24bc2a84e","timestamp":1749113391492,"gateway":"8UUXN4P00A06NK"} + +{"bid":"927ac9d0-80f3-4fad-9b28-cf6e5e955999","data":{"dongle_infos":[]},"tid":"6d0f271c-8a8d-4dd8-9ae4-6fa13d1e4e2c","timestamp":1749113391694,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b08bf11e-acb4-4dda-8af9-dd9c325376c4","data":{"firmware_version":"13.01.0002"},"tid":"25c509a3-69be-47fd-9342-db79623e7a03","timestamp":1749113391745,"gateway":"8UUXN4P00A06NK"} + +{"bid":"839d4e06-b07e-4bd8-8ce2-a10747f6546f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3258c413-b926-44bf-9f82-53135961ebfe","timestamp":1749113391892,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b7af437d-3a83-4c54-8160-5079f478593c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"82f4ebf7-9d16-4087-a890-efb935d720cc","timestamp":1749113392346,"gateway":"8UUXN4P00A06NK"} + +{"tid":"56034978-df2c-439f-9d7f-f8483544fee1","bid":"2c86cc69-274b-4bc3-b7a1-fac3d15a95be","timestamp":1749113392500,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"abcb2334-90ea-43ab-a631-db0eefcad281","data":{"dongle_infos":[]},"tid":"b17aba41-8f1d-486f-8e2b-815ad6721948","timestamp":1749113392743,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e14889f-11b3-451b-a3f5-0d9d90d34287","data":{"mobility_status_notify":0},"need_reply":1,"tid":"4ca452c8-4e76-4ad3-b97b-b08840cb9e9d","timestamp":1749113393376,"gateway":"8UUXN4P00A06NK"} + +{"bid":"78796e65-6908-429b-812c-1c430eeae875","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c92f828c-ed25-4d6f-8cf7-f3d24bc2a84e","timestamp":1749113393577,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b7af437d-3a83-4c54-8160-5079f478593c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"82f4ebf7-9d16-4087-a890-efb935d720cc","timestamp":1749113394377,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f5850acd-ae1d-47b9-bcd0-5d55b3d0bc45","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b8649a75-f515-4a3d-87df-8aedb756e903","timestamp":1749113394380,"gateway":"8UUXN4P00A06NK"} + +{"bid":"743236c1-44d3-4667-ac1e-74d60e81db50","data":{"dongle_infos":[]},"tid":"3462e44c-11e2-45e6-ac9d-9ae4695c1b60","timestamp":1749113395390,"gateway":"8UUXN4P00A06NK"} + +{"bid":"839d4e06-b07e-4bd8-8ce2-a10747f6546f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3258c413-b926-44bf-9f82-53135961ebfe","timestamp":1749113396091,"gateway":"8UUXN4P00A06NK"} + +{"bid":"31ac1b32-5bbe-4be4-b3b0-31f9ac92dd3b","data":{"departure_trajectory":[]},"tid":"92444f07-8cb0-4b45-bd0a-938d5d8a02d9","timestamp":1749113396164,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f5850acd-ae1d-47b9-bcd0-5d55b3d0bc45","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b8649a75-f515-4a3d-87df-8aedb756e903","timestamp":1749113396577,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9fefbb11-b979-4a1d-b3b0-53d537ad7031","data":{"departure_trajectory":[]},"tid":"4b37eaf3-b415-440b-a235-83d3812eebd8","timestamp":1749113396692,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e14889f-11b3-451b-a3f5-0d9d90d34287","data":{"mobility_status_notify":0},"need_reply":1,"tid":"4ca452c8-4e76-4ad3-b97b-b08840cb9e9d","timestamp":1749113397577,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b7af437d-3a83-4c54-8160-5079f478593c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"82f4ebf7-9d16-4087-a890-efb935d720cc","timestamp":1749113398576,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a0d6d21b-bd6d-4f72-aee6-2dc2736c8cb7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d6020a46-d4fd-4fcc-80c0-807fb5535c15","timestamp":1749113399377,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a0d6d21b-bd6d-4f72-aee6-2dc2736c8cb7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d6020a46-d4fd-4fcc-80c0-807fb5535c15","timestamp":1749113401577,"gateway":"8UUXN4P00A06NK"} + +{"bid":"839d4e06-b07e-4bd8-8ce2-a10747f6546f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3258c413-b926-44bf-9f82-53135961ebfe","timestamp":1749113404292,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6cacf566-101f-48d7-acb5-83d8acb03622","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6f6155b4-f7db-487e-abca-bf8ed6806106","timestamp":1749113404380,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b87b4629-dbaa-44e0-8d1d-0ad58db3bd01","bid":"f9bab01d-7a0c-4ea2-aa99-6eba0c138221","timestamp":1749113427508,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"ea521a95-cde3-431b-9286-1e2d5bba4ea0","bid":"b09d6496-7322-4fff-b08a-fd6e6d73fe2b","timestamp":1749113427518,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"b97cc6b1-f09e-4323-a773-c4560fed8a26","bid":"d1c79b4a-ac36-45f5-90c1-7c72c828f3fe","timestamp":1749113428177,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"8d14bc19-d951-4b9c-8848-f16e20f75c22","bid":"0c95fcd0-6566-45c6-8452-22afde67c5f2","timestamp":1749113428183,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"567b0a57-d495-4fd3-848d-eca31b9a1a94","data":{"air_transfer_enable":false},"need_reply":1,"tid":"08aa421f-4f47-41a5-8177-f08178c0e51f","timestamp":1749113429861,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d1eed78f-da3e-450e-880d-0a4044fa86f9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7a39b49c-110c-4bc1-821a-b9b2d5ba4c16","timestamp":1749113432045,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8b278e8b-b196-4aea-a6c4-10426d41e790","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"fab31ad9-bc3c-458c-9bf3-1ebdb8cb5138","timestamp":1749113432117,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9fa58d49-7e0a-4aa6-9e5e-8492648d3454","data":{"dongle_infos":[]},"tid":"13252632-bf89-41f3-b6b0-3b2819006a28","timestamp":1749113432214,"gateway":"8UUXN4P00A06NK"} + +{"bid":"192619b4-b221-4651-b2fa-0b53e0cd5bab","data":{"firmware_version":"13.01.0002"},"tid":"1ecee2fa-79ba-47e7-9332-fb7cfc7461da","timestamp":1749113432222,"gateway":"8UUXN4P00A06NK"} + +{"bid":"567b0a57-d495-4fd3-848d-eca31b9a1a94","data":{"air_transfer_enable":false},"need_reply":1,"tid":"08aa421f-4f47-41a5-8177-f08178c0e51f","timestamp":1749113432409,"gateway":"8UUXN4P00A06NK"} + +{"tid":"81e6a88a-b5ad-497b-bfb0-50ab5edae259","bid":"0fc1d21b-4256-4bba-8657-9c90885e0f9b","timestamp":1749113432489,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"dec54414-586d-4d65-8dfe-d214a137a6ea","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"50e5e193-a50d-4edb-a59f-d30fa56286fa","timestamp":1749113432508,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8369db76-5b5f-43df-8952-4ef6edcbe585","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cb01a6f9-3aca-4dc8-932a-cf02643d4338","timestamp":1749113433178,"gateway":"8UUXN4P00A06NK"} + +{"bid":"07c5691e-fabb-4897-998e-57dc95784518","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6157ae5c-5985-4e3b-9cd2-4ed68afaa3f5","timestamp":1749113433199,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fa2e9b3a-0e8a-48e8-9403-cb0d6e7ceec9","data":{"dongle_infos":[]},"tid":"cbf535d6-ab67-4b40-83fd-b2185365f2b3","timestamp":1749113433259,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d1eed78f-da3e-450e-880d-0a4044fa86f9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7a39b49c-110c-4bc1-821a-b9b2d5ba4c16","timestamp":1749113434074,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8369db76-5b5f-43df-8952-4ef6edcbe585","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cb01a6f9-3aca-4dc8-932a-cf02643d4338","timestamp":1749113435274,"gateway":"8UUXN4P00A06NK"} + +{"bid":"07c5691e-fabb-4897-998e-57dc95784518","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6157ae5c-5985-4e3b-9cd2-4ed68afaa3f5","timestamp":1749113435275,"gateway":"8UUXN4P00A06NK"} + +{"bid":"19d2611f-3e9a-431b-9743-1e38467f20b3","data":{"dongle_infos":[]},"tid":"a81c4705-4036-4926-87e8-ecf94782a33e","timestamp":1749113436344,"gateway":"8UUXN4P00A06NK"} + +{"bid":"567b0a57-d495-4fd3-848d-eca31b9a1a94","data":{"air_transfer_enable":false},"need_reply":1,"tid":"08aa421f-4f47-41a5-8177-f08178c0e51f","timestamp":1749113436605,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e2fa55b8-e9f0-4762-bd48-72079c6ec95b","data":{"departure_trajectory":[]},"tid":"2059fd3e-80cb-4340-aaa6-85374a5735ff","timestamp":1749113436643,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dd9f1402-c737-480c-b7df-ba5b5fe92fea","data":{"departure_trajectory":[]},"tid":"4b0db049-11bf-447c-9bb7-9091fecac185","timestamp":1749113437206,"gateway":"8UUXN4P00A06NK"} + +{"bid":"10e94fa0-6355-4b42-be89-563c4f40e369","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"39f933b3-25bd-481e-8635-6b00bc256a1d","timestamp":1749113437508,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8ca10f6f-6e0b-40d6-8f96-568dd5ae1b75","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ac512867-237d-442f-8aaf-dfc2db45d94a","timestamp":1749113438175,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d1eed78f-da3e-450e-880d-0a4044fa86f9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7a39b49c-110c-4bc1-821a-b9b2d5ba4c16","timestamp":1749113438271,"gateway":"8UUXN4P00A06NK"} + +{"bid":"07c5691e-fabb-4897-998e-57dc95784518","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6157ae5c-5985-4e3b-9cd2-4ed68afaa3f5","timestamp":1749113439474,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8ca10f6f-6e0b-40d6-8f96-568dd5ae1b75","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ac512867-237d-442f-8aaf-dfc2db45d94a","timestamp":1749113440275,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ab815a70-7afc-4d8a-9406-36d41b5b45f1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2dadfa64-40ea-4fb0-92f4-0396ff288054","timestamp":1749113442507,"gateway":"8UUXN4P00A06NK"} + +{"tid":"2d0c7ade-e459-47ac-831c-d608b71c73ea","bid":"021a708d-e580-4149-a4b9-a0dff8cd687a","timestamp":1749113468754,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"0dedf217-31b4-4aa0-991e-ae1f423e604d","bid":"5187ca8d-8085-4edd-9eda-06f7e54fe4a6","timestamp":1749113468756,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"8895e5be-763d-4a54-8920-2fc36ec5690a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"743f0066-21fb-4739-9e76-596dfd6913e7","timestamp":1749113470373,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6bed5a01-79a9-4f1b-9eb8-698692ed03a1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d2c02ede-891e-4c28-b050-d0c3fcd263bb","timestamp":1749113470472,"gateway":"8UUXN4P00A06NK"} + +{"bid":"89c7eb49-2166-4ef4-a850-806debc68da0","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d24cb3c6-6975-45fb-872a-acbdc948187a","timestamp":1749113470862,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1bb731d2-f9a1-4a09-bf50-ac77a0021389","data":{"dongle_infos":[]},"tid":"4f335997-2d7c-4004-8fd0-a74a46c2ea5d","timestamp":1749113471413,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f4bb175b-a79c-4e49-8523-7a4bc368de24","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5d9fd09d-7c24-4013-8b7c-edaa0c31f970","timestamp":1749113471418,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fe906cc1-ab68-4e02-bde3-09ae1b4a1466","data":{"firmware_version":"13.01.0002"},"tid":"1f2f7ba6-ff80-4007-95d3-66ad5ae201e1","timestamp":1749113471451,"gateway":"8UUXN4P00A06NK"} + +{"tid":"9dbcd6d7-c719-4212-8872-d95d6479a235","bid":"6859b4f0-8e69-4068-82f5-cb0d5b32d61b","timestamp":1749113471515,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"b01db7fe-9add-416a-91ac-cefffc759312","data":{"dongle_infos":[]},"tid":"a595e2ba-6daf-4df1-84be-60afdf8f4838","timestamp":1749113472436,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8895e5be-763d-4a54-8920-2fc36ec5690a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"743f0066-21fb-4739-9e76-596dfd6913e7","timestamp":1749113472533,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6bed5a01-79a9-4f1b-9eb8-698692ed03a1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d2c02ede-891e-4c28-b050-d0c3fcd263bb","timestamp":1749113472534,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f4bb175b-a79c-4e49-8523-7a4bc368de24","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5d9fd09d-7c24-4013-8b7c-edaa0c31f970","timestamp":1749113473536,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e84d36f-428c-401a-8f87-444582f487e5","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"809deed7-764b-43ae-99e6-73daf3b47d89","timestamp":1749113473758,"gateway":"8UUXN4P00A06NK"} + +{"bid":"554ba67b-34d2-48e1-88ee-1a493e03a274","data":{"dongle_infos":[]},"tid":"ce5391a9-dde8-43a6-b070-9e7c8dd11853","timestamp":1749113474367,"gateway":"8UUXN4P00A06NK"} + +{"bid":"89c7eb49-2166-4ef4-a850-806debc68da0","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d24cb3c6-6975-45fb-872a-acbdc948187a","timestamp":1749113475055,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7f173199-0426-43ab-a5fe-3446908b8d9a","data":{"departure_trajectory":[]},"tid":"ebc78cab-f8df-4ec9-8266-ee55a72aea2d","timestamp":1749113475188,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e84d36f-428c-401a-8f87-444582f487e5","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"809deed7-764b-43ae-99e6-73daf3b47d89","timestamp":1749113475935,"gateway":"8UUXN4P00A06NK"} + +{"bid":"26920768-d2ff-4947-9e44-2894c1b9bdbb","data":{"departure_trajectory":[]},"tid":"a2102990-f00e-412c-890b-48bf8e0fa436","timestamp":1749113476407,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8895e5be-763d-4a54-8920-2fc36ec5690a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"743f0066-21fb-4739-9e76-596dfd6913e7","timestamp":1749113476738,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f4bb175b-a79c-4e49-8523-7a4bc368de24","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5d9fd09d-7c24-4013-8b7c-edaa0c31f970","timestamp":1749113477736,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6d59584b-20b8-4899-9be5-5fc0834e7d88","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9cc323d6-c603-4912-99df-bcdc959b4486","timestamp":1749113478759,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6d59584b-20b8-4899-9be5-5fc0834e7d88","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9cc323d6-c603-4912-99df-bcdc959b4486","timestamp":1749113480937,"gateway":"8UUXN4P00A06NK"} + +{"bid":"89c7eb49-2166-4ef4-a850-806debc68da0","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d24cb3c6-6975-45fb-872a-acbdc948187a","timestamp":1749113483262,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4b299119-0967-4eb6-b7bb-cbe5dcf5eb48","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5b39360b-30b3-4224-a6d4-0e319af4532f","timestamp":1749113483761,"gateway":"8UUXN4P00A06NK"} + +{"tid":"cb64cd18-5261-4fc8-b6b2-f1c4aa43a789","bid":"86987b02-5a5c-4af5-9ca2-5734a81afbfc","timestamp":1749113506662,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"794b9e71-a9c8-411a-90aa-684d6825d776","bid":"e2942f11-2995-40d8-b1e9-c5a30d29118a","timestamp":1749113506667,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"693ff2b0-9ed3-4fef-83e1-11f1bab212fb","data":{"air_transfer_enable":false},"need_reply":1,"tid":"6592390d-93f0-4f1c-87c3-15d2558d813b","timestamp":1749113508535,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2b226aac-58c7-4ece-9fbd-5f4cccff80f2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"62a6a7f1-7ccc-4f17-ba3f-d5b46809abfb","timestamp":1749113510580,"gateway":"8UUXN4P00A06NK"} + +{"tid":"6f4ce4ba-60d0-452c-94fc-b68bab5085fe","bid":"f9140d48-36b7-46cd-a1cd-77a777818937","timestamp":1749113510950,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"1f668866-cb3d-40aa-bfe6-b91764ad5e2d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3c179f29-dd35-43ff-9edc-4471e9639f30","timestamp":1749113511163,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a6090f15-9ac4-4e26-8877-3bd5c5e6df29","data":{"mobility_status_notify":0},"need_reply":1,"tid":"2a5a7dea-9dd7-4100-9273-f0de8866c4df","timestamp":1749113511169,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7f25790c-a12a-48af-9c4d-8cf7fddaa377","data":{"dongle_infos":[]},"tid":"e326abe0-bde4-4734-83f9-e30de67a88db","timestamp":1749113511212,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4aa9564a-e1ec-43dd-896b-780bc7b11532","data":{"firmware_version":"13.01.0002"},"tid":"2a92ecd8-6358-4f97-8af7-913589556b07","timestamp":1749113511222,"gateway":"8UUXN4P00A06NK"} + +{"bid":"693ff2b0-9ed3-4fef-83e1-11f1bab212fb","data":{"air_transfer_enable":false},"need_reply":1,"tid":"6592390d-93f0-4f1c-87c3-15d2558d813b","timestamp":1749113511406,"gateway":"8UUXN4P00A06NK"} + +{"bid":"57f73b08-b090-4a15-925b-4bb9db05fef0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6ca9d8e1-22ae-4e7d-8d9a-9345922b45a9","timestamp":1749113511671,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3c2b9ad8-a96c-42c2-a2b9-4399fa8c7905","data":{"dongle_infos":[]},"tid":"85a82473-0a79-4553-97e2-7886ce56d5b3","timestamp":1749113512213,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1f668866-cb3d-40aa-bfe6-b91764ad5e2d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3c179f29-dd35-43ff-9edc-4471e9639f30","timestamp":1749113513234,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a6090f15-9ac4-4e26-8877-3bd5c5e6df29","data":{"mobility_status_notify":0},"need_reply":1,"tid":"2a5a7dea-9dd7-4100-9273-f0de8866c4df","timestamp":1749113513235,"gateway":"8UUXN4P00A06NK"} + +{"bid":"57f73b08-b090-4a15-925b-4bb9db05fef0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6ca9d8e1-22ae-4e7d-8d9a-9345922b45a9","timestamp":1749113513831,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dbc77e47-1c3e-4938-accd-993686151533","data":{"dongle_infos":[]},"tid":"0c3b708d-1f00-44b0-ae62-87b2923495de","timestamp":1749113514984,"gateway":"8UUXN4P00A06NK"} + +{"bid":"96680e9c-dd6c-4ba3-91d3-45c7aed28759","data":{"departure_trajectory":[]},"tid":"1d035048-baf0-48e0-ae75-d4002ae43738","timestamp":1749113515387,"gateway":"8UUXN4P00A06NK"} + +{"bid":"693ff2b0-9ed3-4fef-83e1-11f1bab212fb","data":{"air_transfer_enable":false},"need_reply":1,"tid":"6592390d-93f0-4f1c-87c3-15d2558d813b","timestamp":1749113515604,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7564478d-a5cc-4e52-9526-e491ab28f5d9","data":{"departure_trajectory":[]},"tid":"57369c26-3a5b-4361-a01a-2bba13c2fde1","timestamp":1749113516205,"gateway":"8UUXN4P00A06NK"} + +{"bid":"77cd411c-609f-4e53-8fdb-d8940d30f9d8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0148de12-d5bc-40de-8daf-d59da943b5d1","timestamp":1749113516662,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1f668866-cb3d-40aa-bfe6-b91764ad5e2d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3c179f29-dd35-43ff-9edc-4471e9639f30","timestamp":1749113517436,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a6090f15-9ac4-4e26-8877-3bd5c5e6df29","data":{"mobility_status_notify":0},"need_reply":1,"tid":"2a5a7dea-9dd7-4100-9273-f0de8866c4df","timestamp":1749113517437,"gateway":"8UUXN4P00A06NK"} + +{"bid":"77cd411c-609f-4e53-8fdb-d8940d30f9d8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0148de12-d5bc-40de-8daf-d59da943b5d1","timestamp":1749113518835,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ec26d64b-f16f-4a91-b4ac-f794372ea755","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ce29b49f-b81f-445e-ab2e-2264b3744b2b","timestamp":1749113521665,"gateway":"8UUXN4P00A06NK"} + +{"tid":"cb872dc6-2726-4d9a-b822-5595a840f92d","bid":"2d4adb11-5107-4955-a31f-581ef110caa6","timestamp":1749113547622,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"a2e541b3-9f3a-491c-80bd-d2b6c174c6a7","bid":"5a5701fd-50f4-4847-8927-b28bec199f0d","timestamp":1749113547627,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"d7df7c80-c27d-4e60-96c2-7631bd840c52","data":{"mobility_status_notify":0},"need_reply":1,"tid":"33534270-1076-408b-8e29-b3826a058b5b","timestamp":1749113549111,"gateway":"8UUXN4P00A06NK"} + +{"bid":"02244c48-bdab-44a7-89f7-34e5c261ca30","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"56b2c42a-e6bc-456f-ab39-90ea01bc0f09","timestamp":1749113549113,"gateway":"8UUXN4P00A06NK"} + +{"bid":"674db3dc-6765-439a-8ce8-5eddc94c274e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"61acd0f6-1935-499b-b989-fda2fae61932","timestamp":1749113549766,"gateway":"8UUXN4P00A06NK"} + +{"bid":"55bf36c4-96b3-4033-b082-90266f635e19","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"8b4ecd55-b97d-41bf-b552-f75533463c27","timestamp":1749113550103,"gateway":"8UUXN4P00A06NK"} + +{"bid":"00615157-b330-4119-9d05-005bdf8f73d8","data":{"dongle_infos":[]},"tid":"c9e0fe54-f92d-485e-825e-6decf4d4aff9","timestamp":1749113550113,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d5d3f222-ff84-44fc-949c-2fc46f65e93a","data":{"firmware_version":"13.01.0002"},"tid":"cede0018-70c6-48ea-b810-2f80e5894169","timestamp":1749113550151,"gateway":"8UUXN4P00A06NK"} + +{"tid":"568d574a-d3c8-4349-90c5-171eca8fa55c","bid":"9fa7cba6-daa9-467d-97ad-95a1c725e369","timestamp":1749113550251,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"97ad086c-7942-42a3-8f0d-3bb610a80fb3","data":{"dongle_infos":[]},"tid":"04892769-5870-4cee-aac6-06911f3add4c","timestamp":1749113551169,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d7df7c80-c27d-4e60-96c2-7631bd840c52","data":{"mobility_status_notify":0},"need_reply":1,"tid":"33534270-1076-408b-8e29-b3826a058b5b","timestamp":1749113551280,"gateway":"8UUXN4P00A06NK"} + +{"bid":"02244c48-bdab-44a7-89f7-34e5c261ca30","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"56b2c42a-e6bc-456f-ab39-90ea01bc0f09","timestamp":1749113551282,"gateway":"8UUXN4P00A06NK"} + +{"bid":"55bf36c4-96b3-4033-b082-90266f635e19","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"8b4ecd55-b97d-41bf-b552-f75533463c27","timestamp":1749113552283,"gateway":"8UUXN4P00A06NK"} + +{"bid":"74aecc4f-4aed-4ad8-b796-b2891c72cb84","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5ba80611-9f2d-4fa4-ae44-f2e813d0d549","timestamp":1749113552623,"gateway":"8UUXN4P00A06NK"} + +{"bid":"11ef36ff-9d2f-4111-bee8-25991b69056c","data":{"dongle_infos":[]},"tid":"e70d2161-c60c-4e3d-8c00-6f84a3528af6","timestamp":1749113553149,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b60b58a6-7dae-4f3a-8f5c-02db140cc09b","data":{"departure_trajectory":[]},"tid":"04bf4211-b089-4f22-b108-7a7bfaeb992d","timestamp":1749113553929,"gateway":"8UUXN4P00A06NK"} + +{"bid":"674db3dc-6765-439a-8ce8-5eddc94c274e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"61acd0f6-1935-499b-b989-fda2fae61932","timestamp":1749113553959,"gateway":"8UUXN4P00A06NK"} + +{"bid":"74aecc4f-4aed-4ad8-b796-b2891c72cb84","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5ba80611-9f2d-4fa4-ae44-f2e813d0d549","timestamp":1749113554677,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a3693217-1f5c-4af4-bfaa-ca86550ca5f6","data":{"departure_trajectory":[]},"tid":"8918550f-17fb-40a7-8dfd-162e81e43fb4","timestamp":1749113555111,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d7df7c80-c27d-4e60-96c2-7631bd840c52","data":{"mobility_status_notify":0},"need_reply":1,"tid":"33534270-1076-408b-8e29-b3826a058b5b","timestamp":1749113555481,"gateway":"8UUXN4P00A06NK"} + +{"bid":"55bf36c4-96b3-4033-b082-90266f635e19","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"8b4ecd55-b97d-41bf-b552-f75533463c27","timestamp":1749113556479,"gateway":"8UUXN4P00A06NK"} + +{"bid":"39a543d9-f689-4f65-b0dd-4cdda185c2c0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b46bc7f3-b5c9-48ec-8ed5-ab922a0bbc0d","timestamp":1749113557625,"gateway":"8UUXN4P00A06NK"} + +{"bid":"39a543d9-f689-4f65-b0dd-4cdda185c2c0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b46bc7f3-b5c9-48ec-8ed5-ab922a0bbc0d","timestamp":1749113559678,"gateway":"8UUXN4P00A06NK"} + +{"bid":"674db3dc-6765-439a-8ce8-5eddc94c274e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"61acd0f6-1935-499b-b989-fda2fae61932","timestamp":1749113562162,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8b6ef369-a7c8-4e19-b1dc-04c2b291389b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"144193b3-fd78-4252-ac02-5754457b5abc","timestamp":1749113562624,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c02df21d-0fdb-474e-9b2d-d9b73fe50f51","bid":"1d0038c7-095e-4e0e-aa15-07fc09495f2e","timestamp":1749113588616,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"e65860b4-b243-4e95-8206-a20a7767626e","bid":"068a348c-3549-45e1-a147-edc1c094e4d9","timestamp":1749113588622,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"50cf326a-5397-46f6-9c4c-11eeae08097c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a851df03-a0f6-4cb8-99cd-b34181f2163f","timestamp":1749113590321,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1e41916b-f87a-4e2e-adf7-31360d17ec54","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f162238c-29bf-4b55-bdf3-0c387e80a111","timestamp":1749113590348,"gateway":"8UUXN4P00A06NK"} + +{"bid":"75f77bd9-bc55-468a-8f58-3614b26cb200","data":{"dongle_infos":[]},"tid":"276773b7-69f0-407a-9168-db6fb9c93147","timestamp":1749113590759,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c71f3af7-fd66-4a79-954d-79e172093f73","data":{"dongle_infos":[]},"tid":"a6e74b0e-2b58-4db1-a758-70e5a3c6cae1","timestamp":1749113590760,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7f2efff6-de93-451c-990c-71618dc33033","data":{"firmware_version":"13.01.0002"},"tid":"918140d8-4fad-4176-ac4f-a7f2dd450c18","timestamp":1749113590769,"gateway":"8UUXN4P00A06NK"} + +{"bid":"81e559f0-4c1a-4791-952c-cf0798107768","data":{"air_transfer_enable":false},"need_reply":1,"tid":"5a6d9bd4-b2ec-4fc9-9c69-4997d564d35d","timestamp":1749113590953,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b02f9ab7-11ac-4ceb-ba5f-1c5643fe4259","bid":"2737c8f1-cb68-4ef6-a14c-2cdae8430e7e","timestamp":1749113591331,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"cd173901-d66d-4741-a8df-03752a080f9b","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"95603928-1af4-4830-8f7e-13e615c98b34","timestamp":1749113591469,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ca3316e5-30fa-46e5-8f05-b426aa247ac7","data":{"dongle_infos":[]},"tid":"d1df96fd-c352-4ebe-a0c9-873322e42666","timestamp":1749113591759,"gateway":"8UUXN4P00A06NK"} + +{"bid":"50cf326a-5397-46f6-9c4c-11eeae08097c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a851df03-a0f6-4cb8-99cd-b34181f2163f","timestamp":1749113592518,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1e41916b-f87a-4e2e-adf7-31360d17ec54","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f162238c-29bf-4b55-bdf3-0c387e80a111","timestamp":1749113592519,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cd173901-d66d-4741-a8df-03752a080f9b","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"95603928-1af4-4830-8f7e-13e615c98b34","timestamp":1749113593519,"gateway":"8UUXN4P00A06NK"} + +{"bid":"803220aa-c4e0-48e3-8abd-cda4a70e248a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4e93d3c5-2c7f-4ee0-9bc5-5bbb46e2901c","timestamp":1749113593622,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5c420d84-688c-442b-86cd-b4d2b74d060f","data":{"departure_trajectory":[]},"tid":"6190d01d-abc2-4d20-9161-71dd33113d4b","timestamp":1749113595101,"gateway":"8UUXN4P00A06NK"} + +{"bid":"81e559f0-4c1a-4791-952c-cf0798107768","data":{"air_transfer_enable":false},"need_reply":1,"tid":"5a6d9bd4-b2ec-4fc9-9c69-4997d564d35d","timestamp":1749113595156,"gateway":"8UUXN4P00A06NK"} + +{"bid":"803220aa-c4e0-48e3-8abd-cda4a70e248a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4e93d3c5-2c7f-4ee0-9bc5-5bbb46e2901c","timestamp":1749113595721,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9578d80a-8cd9-423c-bb5c-d3639fc2fd3d","data":{"departure_trajectory":[]},"tid":"749038bb-d686-48e6-a66b-f4271902bb87","timestamp":1749113595753,"gateway":"8UUXN4P00A06NK"} + +{"bid":"50cf326a-5397-46f6-9c4c-11eeae08097c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a851df03-a0f6-4cb8-99cd-b34181f2163f","timestamp":1749113596720,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cd173901-d66d-4741-a8df-03752a080f9b","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"95603928-1af4-4830-8f7e-13e615c98b34","timestamp":1749113597720,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eb98c9c4-6238-4b36-9dbc-876817967e85","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c0db8a61-a54e-4879-8e56-5b3fac5b71a0","timestamp":1749113598618,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eb98c9c4-6238-4b36-9dbc-876817967e85","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c0db8a61-a54e-4879-8e56-5b3fac5b71a0","timestamp":1749113600721,"gateway":"8UUXN4P00A06NK"} + +{"bid":"81e559f0-4c1a-4791-952c-cf0798107768","data":{"air_transfer_enable":false},"need_reply":1,"tid":"5a6d9bd4-b2ec-4fc9-9c69-4997d564d35d","timestamp":1749113603355,"gateway":"8UUXN4P00A06NK"} + +{"bid":"74000b9e-2245-445c-a952-3d33d7a534b6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"20713db4-8d36-454a-9f68-f23bc2c1595f","timestamp":1749113603624,"gateway":"8UUXN4P00A06NK"} + +{"tid":"418c51f6-83b1-40a3-a097-6d14f4db0178","bid":"9b5384fb-63f7-4fec-bdbc-c4fe1f4f8248","timestamp":1749113627875,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"013cbd2a-d6b9-495b-821e-4684276ca997","bid":"176054a9-382e-4792-890a-0e7942498e45","timestamp":1749113627883,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"4feb7bab-1d7e-4183-85fa-63a5be38aada","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1a275759-d8eb-4194-a619-2dfdb46236de","timestamp":1749113628030,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fca64658-cbe9-4fb3-97ba-ca789242f4f7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"920a37df-fbbd-4378-8e04-82be8bde2833","timestamp":1749113630359,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4feb7bab-1d7e-4183-85fa-63a5be38aada","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1a275759-d8eb-4194-a619-2dfdb46236de","timestamp":1749113630643,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c426ac99-c18e-44ac-9755-d9e22ba3efd2","data":{"dongle_infos":[]},"tid":"16ec7c1d-0ab3-49ef-88e4-7b40cf709ce9","timestamp":1749113630983,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ee674a44-2749-48ca-9dbb-a0bf8fbf5084","data":{"dongle_infos":[]},"tid":"84821d83-3e67-42dd-ac3b-83af1c961c9d","timestamp":1749113630984,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0851bcf1-c1a7-4955-a17b-f55e746558be","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e6b952af-59e3-44e3-8574-6e8951641ae0","timestamp":1749113630989,"gateway":"8UUXN4P00A06NK"} + +{"bid":"332f5579-943f-4e12-bffb-a7d747b4238a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"2027c54b-53e6-427f-8809-23b677c923b6","timestamp":1749113630995,"gateway":"8UUXN4P00A06NK"} + +{"bid":"630570de-b67c-40da-82ca-edad2e12e45c","data":{"firmware_version":"13.01.0002"},"tid":"56da8839-0b11-4113-b7e7-20bdc4a2a55b","timestamp":1749113631030,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b56e51be-274f-4131-bc89-832b189b9dfc","bid":"2f1bd04a-4ff4-4807-8f0c-243bf89f1815","timestamp":1749113631272,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"8d259fe5-9df3-4ff9-a65a-2584fd16e517","data":{"dongle_infos":[]},"tid":"442e6dc0-8008-4c59-a75d-c95c865a9541","timestamp":1749113632008,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fca64658-cbe9-4fb3-97ba-ca789242f4f7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"920a37df-fbbd-4378-8e04-82be8bde2833","timestamp":1749113632543,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ca5a0cb9-3aa9-4f23-bd08-a2e41652f55c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f6860941-ffd8-4239-af42-3a313019d35e","timestamp":1749113632877,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0851bcf1-c1a7-4955-a17b-f55e746558be","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e6b952af-59e3-44e3-8574-6e8951641ae0","timestamp":1749113633143,"gateway":"8UUXN4P00A06NK"} + +{"bid":"332f5579-943f-4e12-bffb-a7d747b4238a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"2027c54b-53e6-427f-8809-23b677c923b6","timestamp":1749113633144,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4feb7bab-1d7e-4183-85fa-63a5be38aada","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1a275759-d8eb-4194-a619-2dfdb46236de","timestamp":1749113634839,"gateway":"8UUXN4P00A06NK"} + +{"bid":"09e04cc8-0e17-48e2-a754-3f3584a24ea8","data":{"departure_trajectory":[]},"tid":"8aeedbaa-8b62-425c-9a67-dd2200472d31","timestamp":1749113634907,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ca5a0cb9-3aa9-4f23-bd08-a2e41652f55c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f6860941-ffd8-4239-af42-3a313019d35e","timestamp":1749113634944,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6228317e-0626-4792-82ae-13a8ebbcbca8","data":{"departure_trajectory":[]},"tid":"da7221c7-da74-4e13-8d47-527e902a6fed","timestamp":1749113635977,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0851bcf1-c1a7-4955-a17b-f55e746558be","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e6b952af-59e3-44e3-8574-6e8951641ae0","timestamp":1749113637344,"gateway":"8UUXN4P00A06NK"} + +{"bid":"332f5579-943f-4e12-bffb-a7d747b4238a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"2027c54b-53e6-427f-8809-23b677c923b6","timestamp":1749113637346,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c0be5096-cb1e-496c-a151-ca9c8d30adb5","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ec99686f-2fdb-4aad-8e5a-45ce8128dcbf","timestamp":1749113637877,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c0be5096-cb1e-496c-a151-ca9c8d30adb5","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ec99686f-2fdb-4aad-8e5a-45ce8128dcbf","timestamp":1749113639944,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e0d8cb34-b3cd-4640-bdd0-cf2e0858d820","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1821dfdb-90de-43a9-ad2c-2cbfedb9b954","timestamp":1749113642875,"gateway":"8UUXN4P00A06NK"} + +{"tid":"356888c2-1de9-485e-ae93-71b1ba8df6d9","bid":"c7f0e496-680d-4e15-a6c0-663d9fa6d6da","timestamp":1749113668926,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"2f879b36-6ca8-4494-ad4c-7701d31180cc","bid":"fa72a656-01a4-4342-91f4-5966eb44d452","timestamp":1749113668932,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"cb01d445-dd76-4b6b-8490-330329a4c0a5","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e44fc773-ad61-467d-bdcd-5a9a6e18249a","timestamp":1749113670866,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4bae26db-ffcc-4cc7-a4ec-5995b4b9d7b0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e891808c-a76b-4bd6-b7ca-66b621a1d810","timestamp":1749113670869,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b166a3a6-5011-4a82-9ca0-2bda77b78d9a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7684a092-426c-4b88-871e-814e20e93ac8","timestamp":1749113671583,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ae3eac68-0b8f-4ce3-833f-f3f687da300f","bid":"5a7f10ea-b5b9-48e0-b80c-d85260d8efb5","timestamp":1749113671785,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"ec349913-7622-4eca-be74-e2c1a2dab058","data":{"dongle_infos":[]},"tid":"f14a567b-04e3-41e5-8e07-8ec2776d4a64","timestamp":1749113671918,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d5e7d5e4-bd3c-4025-bfdd-700d35453dc6","data":{"dongle_infos":[]},"tid":"72e21dd5-310b-4fe6-9ec8-af4f669fec56","timestamp":1749113671919,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fea8b1f2-4f5a-42be-b8f9-85382ecd9169","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"94ce4684-8aa5-40b5-9d12-12fd33800e45","timestamp":1749113671923,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b6fd698c-3657-4a99-acf2-aa85941391d2","data":{"firmware_version":"13.01.0002"},"tid":"671c20f7-5204-4740-ac92-f12d0b2a49f3","timestamp":1749113671956,"gateway":"8UUXN4P00A06NK"} + +{"bid":"31e35155-24b8-41d1-bd48-8de9a9771fd0","data":{"dongle_infos":[]},"tid":"290dd077-c5d8-4288-84f8-b543c3fcf3d4","timestamp":1749113672928,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cb01d445-dd76-4b6b-8490-330329a4c0a5","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e44fc773-ad61-467d-bdcd-5a9a6e18249a","timestamp":1749113672966,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4bae26db-ffcc-4cc7-a4ec-5995b4b9d7b0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e891808c-a76b-4bd6-b7ca-66b621a1d810","timestamp":1749113672967,"gateway":"8UUXN4P00A06NK"} + +{"bid":"78a76f3c-f0dd-41e4-96d2-4fdd3581c267","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"db5a0590-7a6b-48b6-a789-1013aa67b349","timestamp":1749113673931,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fea8b1f2-4f5a-42be-b8f9-85382ecd9169","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"94ce4684-8aa5-40b5-9d12-12fd33800e45","timestamp":1749113673969,"gateway":"8UUXN4P00A06NK"} + +{"bid":"96fd5b82-dfdb-4d57-a9e0-f0bcfe5df3c3","data":{"departure_trajectory":[]},"tid":"3ac47629-a1aa-497d-815e-b46c81e1e35a","timestamp":1749113675725,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b166a3a6-5011-4a82-9ca0-2bda77b78d9a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7684a092-426c-4b88-871e-814e20e93ac8","timestamp":1749113675778,"gateway":"8UUXN4P00A06NK"} + +{"bid":"78a76f3c-f0dd-41e4-96d2-4fdd3581c267","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"db5a0590-7a6b-48b6-a789-1013aa67b349","timestamp":1749113675970,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b8f10766-0b82-4d08-936e-3d09a1febfbb","data":{"departure_trajectory":[]},"tid":"7b76dbb1-c90c-4b5e-bb0f-26e3c31f4fb6","timestamp":1749113676907,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cb01d445-dd76-4b6b-8490-330329a4c0a5","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e44fc773-ad61-467d-bdcd-5a9a6e18249a","timestamp":1749113677164,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fea8b1f2-4f5a-42be-b8f9-85382ecd9169","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"94ce4684-8aa5-40b5-9d12-12fd33800e45","timestamp":1749113678164,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2ba88aca-3d36-4fc3-bd43-cd561ea208e8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f78330aa-01b7-4710-91e7-dfd38d79096f","timestamp":1749113678925,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2ba88aca-3d36-4fc3-bd43-cd561ea208e8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f78330aa-01b7-4710-91e7-dfd38d79096f","timestamp":1749113680968,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3781f3d6-e2a3-458b-a007-e0ec335411eb","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d0358525-6126-44bc-91b1-de35a335aa4f","timestamp":1749113683932,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b166a3a6-5011-4a82-9ca0-2bda77b78d9a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7684a092-426c-4b88-871e-814e20e93ac8","timestamp":1749113683980,"gateway":"8UUXN4P00A06NK"} + +{"tid":"9c4d0f62-03e7-4edd-b6f1-ae0c34dcd165","bid":"d2d8403b-f356-402c-9451-5f43984f2bc9","timestamp":1749113707132,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"833f5339-4203-440d-9bda-6fd9539b19bd","bid":"764853ad-e03e-4844-b081-3cddb67dc16d","timestamp":1749113707139,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"fa0ab03a-ec8d-476f-91b7-7546bebe37eb","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e0a7694e-c788-43e2-a35c-8a6bd96cc8d0","timestamp":1749113708954,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d0b3ff22-aff3-4c80-b143-8ff9a0f2216d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4c72f497-2bef-4e66-8edb-c9a4964487dc","timestamp":1749113711034,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fa0ab03a-ec8d-476f-91b7-7546bebe37eb","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e0a7694e-c788-43e2-a35c-8a6bd96cc8d0","timestamp":1749113711541,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7865a908-2ea3-411a-8b27-704c8f78146c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"82b269f5-36de-48db-8442-138713afe3c9","timestamp":1749113711727,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e690bbe2-049d-4693-9324-792d1451879d","data":{"dongle_infos":[]},"tid":"9620d660-4cc3-42e3-92cc-db5a2d4578f2","timestamp":1749113711737,"gateway":"8UUXN4P00A06NK"} + +{"bid":"81e2a5ae-bffb-4401-9cfd-12e950f5a900","data":{"mobility_status_notify":0},"need_reply":1,"tid":"382c40eb-97d4-4794-a5f0-b2fdfbbf4585","timestamp":1749113711745,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3f23a800-9751-4817-aaca-5f7ed9c039ba","data":{"firmware_version":"13.01.0002"},"tid":"b92b7b15-e6cb-4087-bb39-72afae6abaf6","timestamp":1749113711774,"gateway":"8UUXN4P00A06NK"} + +{"tid":"25e5cc84-2a7d-4c5f-bdf4-1696cf354945","bid":"57f5dfc9-3c3e-4bb7-aec5-62459ec5ba18","timestamp":1749113712003,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"6ad0b6df-1b16-4162-9227-1356a5fe4cbd","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"fee054bb-4abf-49d4-8f49-a002219a38bd","timestamp":1749113712130,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6d7cb099-78ad-4443-8086-3099c34b7038","data":{"dongle_infos":[]},"tid":"175ccd1d-f83e-41fe-9c40-260d2f8ee209","timestamp":1749113712749,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7865a908-2ea3-411a-8b27-704c8f78146c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"82b269f5-36de-48db-8442-138713afe3c9","timestamp":1749113713889,"gateway":"8UUXN4P00A06NK"} + +{"bid":"81e2a5ae-bffb-4401-9cfd-12e950f5a900","data":{"mobility_status_notify":0},"need_reply":1,"tid":"382c40eb-97d4-4794-a5f0-b2fdfbbf4585","timestamp":1749113713891,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6ad0b6df-1b16-4162-9227-1356a5fe4cbd","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"fee054bb-4abf-49d4-8f49-a002219a38bd","timestamp":1749113714295,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1f62ed02-c2ad-432e-b793-373d66ced8d1","data":{"dongle_infos":[]},"tid":"d9460655-c1a7-47b5-b1d8-455a992ec815","timestamp":1749113715680,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fa0ab03a-ec8d-476f-91b7-7546bebe37eb","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e0a7694e-c788-43e2-a35c-8a6bd96cc8d0","timestamp":1749113715747,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8606d366-19cc-4f17-85a8-2889bb1181f3","data":{"departure_trajectory":[]},"tid":"ab09306e-8497-40c3-ab7c-4e902cec4fdd","timestamp":1749113715781,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5f45a318-a33e-4ad0-8a3d-85c574044687","data":{"departure_trajectory":[]},"tid":"17fca941-58eb-4d22-beaf-c96f93af256e","timestamp":1749113716732,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2d0a673c-d1a2-430e-a193-5079f13a45da","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6b988f41-2a1f-495b-bac4-c35d290ea274","timestamp":1749113717131,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7865a908-2ea3-411a-8b27-704c8f78146c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"82b269f5-36de-48db-8442-138713afe3c9","timestamp":1749113718091,"gateway":"8UUXN4P00A06NK"} + +{"bid":"81e2a5ae-bffb-4401-9cfd-12e950f5a900","data":{"mobility_status_notify":0},"need_reply":1,"tid":"382c40eb-97d4-4794-a5f0-b2fdfbbf4585","timestamp":1749113718092,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2d0a673c-d1a2-430e-a193-5079f13a45da","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6b988f41-2a1f-495b-bac4-c35d290ea274","timestamp":1749113719290,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8d991237-c3d7-48be-abda-b4a13204d498","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d2e21e87-cb7a-46f5-b62d-c977e2cf2088","timestamp":1749113722132,"gateway":"8UUXN4P00A06NK"} + +{"tid":"e1009e78-4dcc-4b58-b61e-cf67b8c3f131","bid":"c4c44c9e-c842-4c11-be7b-b293fdb794fc","timestamp":1749113744510,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"508655f2-d91a-4d0b-a79d-bb3d92e16a69","bid":"3db7ae3c-4f8e-4f8d-bdf2-5beac36bda50","timestamp":1749113744518,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"f71dfe14-3d62-4a16-897d-c2e0ab54c457","bid":"06f5d40d-10af-4a8b-b771-8fdbbd2ba918","timestamp":1749113745544,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"f86907fd-7525-4acc-ad49-2011eddcdef6","bid":"dc146ce4-69ce-4910-8d4e-692aed0bc960","timestamp":1749113745546,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"70bce12b-1956-4f33-b7cc-6c4e10cd20aa","bid":"0c5dcfe8-a1d0-40ad-adcd-9ce10b8335a7","timestamp":1749113745548,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"cb8570b6-4059-4af6-a09f-dba6c6517fb9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"9f166918-310f-4c77-abca-c66e78fc0eea","timestamp":1749113747465,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cbac46c3-6682-477c-9638-d59012f62ec9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1a97ca0a-b685-4a48-9583-263b26e01b8e","timestamp":1749113749548,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1b28580-83ed-4a57-97a4-9b00fedb1f52","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3f3a9c6d-f86b-4fc1-a378-c952ffc547aa","timestamp":1749113750193,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b174a178-0abc-4dca-8424-8292be5c2d7f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"de34fe1f-7b30-47a8-aefa-74bf6d7d1ecc","timestamp":1749113750199,"gateway":"8UUXN4P00A06NK"} + +{"bid":"41553c15-cd4b-4523-89ae-8dbe36d15d16","data":{"dongle_infos":[]},"tid":"40153df9-4a13-4a04-b2f7-a1e477061ab0","timestamp":1749113750205,"gateway":"8UUXN4P00A06NK"} + +{"bid":"02a54582-6f5a-4edc-b632-ae55c707e3b5","data":{"firmware_version":"13.01.0002"},"tid":"9bf22b2e-4c33-4b3f-aeb9-0de9fc314156","timestamp":1749113750229,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cb8570b6-4059-4af6-a09f-dba6c6517fb9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"9f166918-310f-4c77-abca-c66e78fc0eea","timestamp":1749113750242,"gateway":"8UUXN4P00A06NK"} + +{"tid":"3e80bdef-7534-4b49-a25d-393385751f91","bid":"e671ca2e-82ec-4f3e-a8ca-0df5c8584005","timestamp":1749113750442,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"94f06979-fc76-49a7-90cb-e741d7b4cce2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"29200ec2-cf30-41c3-a2d8-c0359ad7ce20","timestamp":1749113750541,"gateway":"8UUXN4P00A06NK"} + +{"bid":"67f67694-a09a-4646-a8e9-99a58e6c2806","data":{"dongle_infos":[]},"tid":"9c6051a2-6676-437a-92f1-9a845c030ed9","timestamp":1749113751209,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1b28580-83ed-4a57-97a4-9b00fedb1f52","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3f3a9c6d-f86b-4fc1-a378-c952ffc547aa","timestamp":1749113752357,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b174a178-0abc-4dca-8424-8292be5c2d7f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"de34fe1f-7b30-47a8-aefa-74bf6d7d1ecc","timestamp":1749113752358,"gateway":"8UUXN4P00A06NK"} + +{"bid":"94f06979-fc76-49a7-90cb-e741d7b4cce2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"29200ec2-cf30-41c3-a2d8-c0359ad7ce20","timestamp":1749113752559,"gateway":"8UUXN4P00A06NK"} + +{"bid":"daa1c330-b8b6-4748-9a55-6bcb0d8f316d","data":{"dongle_infos":[]},"tid":"07f8fc39-251d-418a-94e8-0c080c8a8a21","timestamp":1749113753343,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7edb55cf-1650-4ef4-859f-c7c68dea9b6f","data":{"departure_trajectory":[]},"tid":"e943b55b-a572-427e-9ad7-f0f6c4e2ac5d","timestamp":1749113754266,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cb8570b6-4059-4af6-a09f-dba6c6517fb9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"9f166918-310f-4c77-abca-c66e78fc0eea","timestamp":1749113754442,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7703a9e4-b23a-4c18-b38a-1246a167beaa","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d9c15f2e-1cd4-4089-ad60-7a1f9b861e91","timestamp":1749113754510,"gateway":"8UUXN4P00A06NK"} + +{"bid":"537a114b-af52-4237-84b0-f5be58610f93","data":{"departure_trajectory":[]},"tid":"e314360a-e623-4643-91cd-ec9c8ea4d6a0","timestamp":1749113755204,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ce8b1ce8-e3f4-4179-86ee-a3838991bb2b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"aea5b00d-bafc-4a92-8e71-45a627d6a46d","timestamp":1749113755541,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1b28580-83ed-4a57-97a4-9b00fedb1f52","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3f3a9c6d-f86b-4fc1-a378-c952ffc547aa","timestamp":1749113756558,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b174a178-0abc-4dca-8424-8292be5c2d7f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"de34fe1f-7b30-47a8-aefa-74bf6d7d1ecc","timestamp":1749113756560,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ce8b1ce8-e3f4-4179-86ee-a3838991bb2b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"aea5b00d-bafc-4a92-8e71-45a627d6a46d","timestamp":1749113757557,"gateway":"8UUXN4P00A06NK"} + +{"bid":"643e39ed-82c0-4372-86c1-601e2ca3d023","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"16636261-e907-4064-8b70-1f4b6bc0341d","timestamp":1749113759513,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ad6975cf-dd24-48f7-82eb-a2cda3d4bbac","bid":"2026618f-45b3-4c61-806b-9a54fb695182","timestamp":1749113783574,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"cf6ea6ef-412a-49e7-a458-e9e0b39589ea","bid":"bf80c371-96c3-4cbc-ae8e-df19ff395d25","timestamp":1749113783585,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"28840df6-1016-45e7-bbe0-257e6cf1976d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"f2829492-3524-4a71-a108-82067c6af966","timestamp":1749113784874,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1fdde32e-b043-409e-8dce-7d44c5d91ac1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5632638c-da91-4e0f-8979-4ce66998379d","timestamp":1749113786868,"gateway":"8UUXN4P00A06NK"} + +{"bid":"28840df6-1016-45e7-bbe0-257e6cf1976d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"f2829492-3524-4a71-a108-82067c6af966","timestamp":1749113787675,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df288e72-be16-4821-bc98-25d1000ee466","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"df3273ed-7c9a-484d-9b18-17305269fe52","timestamp":1749113787772,"gateway":"8UUXN4P00A06NK"} + +{"bid":"17ffa320-c8d5-4ff3-84a7-faaea9a52e4c","data":{"dongle_infos":[]},"tid":"e21661c0-cf19-40ee-bab6-9eefbfe2de12","timestamp":1749113787783,"gateway":"8UUXN4P00A06NK"} + +{"bid":"644a5048-6dae-4e43-8669-1e6adb82daf9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"21b7290f-c6a8-4cef-8749-6c6b42893a89","timestamp":1749113787788,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b2ec2fde-8963-4581-aea4-f0ec136c3130","data":{"firmware_version":"13.01.0002"},"tid":"1a2ac2ea-1c7e-4948-a08a-9143f83abbb7","timestamp":1749113787820,"gateway":"8UUXN4P00A06NK"} + +{"tid":"357effb3-7cb1-4fd0-ab1b-f45f3ee6abb7","bid":"caeaa895-da6b-4103-8fcf-3ff71b7f5d6f","timestamp":1749113788467,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"a9c3015e-c9bd-40ab-b21d-90a40512d33e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"881c7369-97dc-4b1a-909e-ea17ecabffbd","timestamp":1749113788576,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e08910f1-ead6-4db1-9295-2b49f59bcd0a","data":{"dongle_infos":[]},"tid":"c4528d36-9243-4bb9-9147-23525f48daad","timestamp":1749113788827,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df288e72-be16-4821-bc98-25d1000ee466","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"df3273ed-7c9a-484d-9b18-17305269fe52","timestamp":1749113789913,"gateway":"8UUXN4P00A06NK"} + +{"bid":"644a5048-6dae-4e43-8669-1e6adb82daf9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"21b7290f-c6a8-4cef-8749-6c6b42893a89","timestamp":1749113789914,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a9c3015e-c9bd-40ab-b21d-90a40512d33e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"881c7369-97dc-4b1a-909e-ea17ecabffbd","timestamp":1749113790710,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2a73f09b-defd-443d-8547-5f32da9ac967","data":{"dongle_infos":[]},"tid":"2f8c55c2-8ffb-4651-85c3-a5438e4d5f13","timestamp":1749113791407,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8b82a539-6d35-42b2-8d1d-d4e1bcf23870","data":{"departure_trajectory":[]},"tid":"c14f5c7c-d286-4699-8302-5743bf96a56f","timestamp":1749113791718,"gateway":"8UUXN4P00A06NK"} + +{"bid":"28840df6-1016-45e7-bbe0-257e6cf1976d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"f2829492-3524-4a71-a108-82067c6af966","timestamp":1749113791874,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7b5d96e3-aae9-4c69-b87c-1c03a0b71788","data":{"departure_trajectory":[]},"tid":"e46125fe-4140-445a-8a3c-0e97930a6a2c","timestamp":1749113792773,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e43c7099-a662-4593-8975-a2d07359563e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f4438f65-6892-46f5-9650-f0b439c5b012","timestamp":1749113793575,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df288e72-be16-4821-bc98-25d1000ee466","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"df3273ed-7c9a-484d-9b18-17305269fe52","timestamp":1749113794111,"gateway":"8UUXN4P00A06NK"} + +{"bid":"644a5048-6dae-4e43-8669-1e6adb82daf9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"21b7290f-c6a8-4cef-8749-6c6b42893a89","timestamp":1749113794113,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e43c7099-a662-4593-8975-a2d07359563e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f4438f65-6892-46f5-9650-f0b439c5b012","timestamp":1749113795713,"gateway":"8UUXN4P00A06NK"} + +{"bid":"71f86352-07d3-4dcb-9039-78da9543b71d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"42ff7f90-9cbe-4818-8226-f6723ff705f8","timestamp":1749113798574,"gateway":"8UUXN4P00A06NK"} + +{"tid":"18c1c867-a9b3-4c67-897c-6173d7d15f98","bid":"62e04c87-5e97-4a11-af69-8e9bad2500d7","timestamp":1749113824454,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"bebb2a86-fefe-421e-ae72-60b9b080fade","bid":"0058be01-ce27-43ae-8d5f-328127db3940","timestamp":1749113824460,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"ad09b10f-a939-4814-a932-1b6c705054eb","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ac7c3cc3-e24c-4792-9f53-4fa67340317f","timestamp":1749113825802,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e92a6fb0-ff3b-4391-892d-e0816fd629a2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"59c06c5c-e4b9-4d81-86ab-fc667044753a","timestamp":1749113825883,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d546b175-7a62-4380-930d-7e5c8deabb98","data":{"dongle_infos":[]},"tid":"bf9f1987-5013-4b26-87e7-b449c8b81719","timestamp":1749113826062,"gateway":"8UUXN4P00A06NK"} + +{"bid":"61e9f0e8-2ebd-431e-9b06-c0e162cf2b09","data":{"firmware_version":"13.01.0002"},"tid":"6a18def8-211d-44fd-b105-babc7ca88d9f","timestamp":1749113826071,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a77414b1-a094-436d-837a-633ab71b6c47","data":{"air_transfer_enable":false},"need_reply":1,"tid":"25dcc36b-b1d4-4e75-be53-2132124e8dc7","timestamp":1749113826249,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e4d79023-e01c-454d-a9d9-113fac6f650e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"dd48a95a-58d3-4136-9a46-6ef295f4fd80","timestamp":1749113826972,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b2abce99-f950-493e-8db0-b0c2ce11350a","bid":"d0e74955-2471-4517-b9a0-eecfd03a79f1","timestamp":1749113827051,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"fed22032-4ece-44dd-b59e-78ed70f120f1","data":{"dongle_infos":[]},"tid":"a818f785-ad43-4c5a-977e-cc5f2a0b9d52","timestamp":1749113827067,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ad09b10f-a939-4814-a932-1b6c705054eb","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ac7c3cc3-e24c-4792-9f53-4fa67340317f","timestamp":1749113827901,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e92a6fb0-ff3b-4391-892d-e0816fd629a2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"59c06c5c-e4b9-4d81-86ab-fc667044753a","timestamp":1749113827902,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e4d79023-e01c-454d-a9d9-113fac6f650e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"dd48a95a-58d3-4136-9a46-6ef295f4fd80","timestamp":1749113829099,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0f01487a-8ea8-4c33-ba59-ad6ab572da22","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e704335c-c726-4b84-9e96-8c699c51efeb","timestamp":1749113829448,"gateway":"8UUXN4P00A06NK"} + +{"bid":"365f012c-4f7a-4840-a672-fe04d92f75d0","data":{"dongle_infos":[]},"tid":"7cb69b76-b036-4ba3-96f9-2941fbafcd1b","timestamp":1749113829928,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dec18e54-c30f-4453-8a2a-7272545fb5e4","data":{"departure_trajectory":[]},"tid":"77f5d3bb-1337-493b-a79c-f7485b5c3e42","timestamp":1749113830425,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a77414b1-a094-436d-837a-633ab71b6c47","data":{"air_transfer_enable":false},"need_reply":1,"tid":"25dcc36b-b1d4-4e75-be53-2132124e8dc7","timestamp":1749113830455,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a3060132-f2d9-4f74-9896-971e3bf9b995","data":{"departure_trajectory":[]},"tid":"3dff28c3-94a5-4554-a8af-7e13adcd1abc","timestamp":1749113831049,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0f01487a-8ea8-4c33-ba59-ad6ab572da22","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e704335c-c726-4b84-9e96-8c699c51efeb","timestamp":1749113831506,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ad09b10f-a939-4814-a932-1b6c705054eb","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ac7c3cc3-e24c-4792-9f53-4fa67340317f","timestamp":1749113832099,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e4d79023-e01c-454d-a9d9-113fac6f650e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"dd48a95a-58d3-4136-9a46-6ef295f4fd80","timestamp":1749113833301,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0052c6b2-49a2-42ff-9138-3ed9ad05328a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9a777f91-428c-428b-847b-49256d554ab2","timestamp":1749113834455,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0052c6b2-49a2-42ff-9138-3ed9ad05328a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9a777f91-428c-428b-847b-49256d554ab2","timestamp":1749113836503,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a77414b1-a094-436d-837a-633ab71b6c47","data":{"air_transfer_enable":false},"need_reply":1,"tid":"25dcc36b-b1d4-4e75-be53-2132124e8dc7","timestamp":1749113838651,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f683cb73-2414-48e4-968e-6cfacbbb21c0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6cbacf0f-f294-4f75-9ca2-5f708106ed4e","timestamp":1749113839458,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ef610d1e-f7b5-4053-9f18-d2734bd0de5c","bid":"a8fba420-44c8-4237-b39d-b1380e29bec0","timestamp":1749113865128,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"2d3f9ac8-a37b-4802-9931-a4b551bfd5a9","bid":"6c52aabc-fe2d-4835-b2a9-aec283f95688","timestamp":1749113865136,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"2121dacf-47fe-43aa-a07a-a3ec41b0558d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"2dfa30e8-2ab0-4875-a775-f37a62f4b2f2","timestamp":1749113866548,"gateway":"8UUXN4P00A06NK"} + +{"bid":"941b4b69-ee09-425a-884b-f463153c4d3a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"92fdae86-6090-43b5-8a84-6c5b2da50f46","timestamp":1749113866555,"gateway":"8UUXN4P00A06NK"} + +{"bid":"59d1f80e-2fbf-414a-8a3f-da24a5e12e81","data":{"dongle_infos":[]},"tid":"42f16ac0-ec8e-4a12-8be8-d1b67b99aa92","timestamp":1749113866871,"gateway":"8UUXN4P00A06NK"} + +{"bid":"60c42e47-270a-4f32-af55-63558bb63a90","data":{"firmware_version":"13.01.0002"},"tid":"9e79a2e5-57cd-4fa5-82aa-3a536ef18908","timestamp":1749113866901,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c6ab4a91-095b-4cd9-a264-faf8db7d116d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"57d9b996-6222-420c-9eb2-b1cb6af58bc1","timestamp":1749113867064,"gateway":"8UUXN4P00A06NK"} + +{"tid":"be906265-c573-4b65-ac71-892af847553c","bid":"72ec00b9-eea5-422e-b3df-1ebb7f6bb026","timestamp":1749113867677,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"9f8528e6-ed9b-45d9-8a73-275b7087e97c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ef618d3f-908d-4f8c-9a8e-68041786e476","timestamp":1749113867710,"gateway":"8UUXN4P00A06NK"} + +{"bid":"924419c6-2643-4b3e-9a45-543674180b3a","data":{"dongle_infos":[]},"tid":"a8a8485c-113e-46af-bed1-fedf3aa57c02","timestamp":1749113867925,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2121dacf-47fe-43aa-a07a-a3ec41b0558d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"2dfa30e8-2ab0-4875-a775-f37a62f4b2f2","timestamp":1749113868709,"gateway":"8UUXN4P00A06NK"} + +{"bid":"941b4b69-ee09-425a-884b-f463153c4d3a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"92fdae86-6090-43b5-8a84-6c5b2da50f46","timestamp":1749113868710,"gateway":"8UUXN4P00A06NK"} + +{"tid":"3f08e1e5-ba7c-4c4f-8ec2-97145dc94582","bid":"05367b24-076f-4e1c-bfdd-f81671f9b734","timestamp":1749113903357,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"5eb61cfb-8e8c-4a3d-a3d9-540848475182","bid":"95a32ba9-731f-469c-af03-95420b56800c","timestamp":1749113903363,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"02086396-bc11-4cf2-8b71-59dd7debf6da","bid":"3698bcdc-184f-4712-aed9-d0a38b09e611","timestamp":1749113903915,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"a607eb38-64c0-454f-b91a-182a87ad4235","bid":"73cc7b28-c10b-47a8-9e23-413f8bf87a02","timestamp":1749113903922,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"ebb2c57f-9b04-41f0-b323-0976dbe680ff","bid":"da569ef6-f0ce-458c-887a-557fb03823b1","timestamp":1749113903927,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f3f66077-661d-4464-8c23-997270b53d8e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"6ed48e8f-d583-4542-bacc-df895b84916c","timestamp":1749113905312,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a35ef5ac-adaf-4c89-8d69-f75eb8e4d9aa","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9f5a3701-3977-49ae-8711-8863261961ff","timestamp":1749113907532,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f3f66077-661d-4464-8c23-997270b53d8e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"6ed48e8f-d583-4542-bacc-df895b84916c","timestamp":1749113907873,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e0a4b57-49e6-452d-820c-14caa4aed7f4","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"4ddd9252-4f63-4857-92d4-530853692baa","timestamp":1749113908153,"gateway":"8UUXN4P00A06NK"} + +{"bid":"33ec7555-f712-4e41-8c88-feb8aad6715e","data":{"dongle_infos":[]},"tid":"19dbb042-784a-4cda-83cc-abe7a02bfcbe","timestamp":1749113908173,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ab377955-fa01-4f80-90f9-d5f97e91b7ea","data":{"mobility_status_notify":0},"need_reply":1,"tid":"b7e2df69-ca8c-45b7-b0db-40f1b3afdd9e","timestamp":1749113908179,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b3dd50a3-4173-4ff9-bd22-24344c13251f","data":{"firmware_version":"13.01.0002"},"tid":"b852f00b-ee18-4af0-bd76-a6623fa560e7","timestamp":1749113908222,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dfb5cfd0-5e80-47dc-a54d-29dc2e447cae","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"db045183-4488-456a-a33e-8b66c9e3ef06","timestamp":1749113908365,"gateway":"8UUXN4P00A06NK"} + +{"tid":"7aadc404-309f-4f1b-be99-89ad9dd5533f","bid":"daffb582-87b8-4a35-a45c-ff54d28cb1e9","timestamp":1749113908711,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"b8c1885c-32ba-433a-bcfa-731b6539bea9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"636b660c-b8de-4db2-a7d0-3e86d7fdcb46","timestamp":1749113908920,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a88d0681-ae30-4c42-b0c8-95c390aa5f64","data":{"dongle_infos":[]},"tid":"610e0967-9100-4237-b4a4-c947975115bc","timestamp":1749113909195,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e0a4b57-49e6-452d-820c-14caa4aed7f4","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"4ddd9252-4f63-4857-92d4-530853692baa","timestamp":1749113910226,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ab377955-fa01-4f80-90f9-d5f97e91b7ea","data":{"mobility_status_notify":0},"need_reply":1,"tid":"b7e2df69-ca8c-45b7-b0db-40f1b3afdd9e","timestamp":1749113910228,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b8c1885c-32ba-433a-bcfa-731b6539bea9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"636b660c-b8de-4db2-a7d0-3e86d7fdcb46","timestamp":1749113911029,"gateway":"8UUXN4P00A06NK"} + +{"bid":"56ef96db-9674-4886-8db1-67921f964ebe","data":{"dongle_infos":[]},"tid":"31bebc96-c5ab-4d6b-a89c-cdfaa4c8261f","timestamp":1749113911590,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f3f66077-661d-4464-8c23-997270b53d8e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"6ed48e8f-d583-4542-bacc-df895b84916c","timestamp":1749113912069,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c04f5e6b-b17f-456d-adac-3d35312ffc8a","data":{"departure_trajectory":[]},"tid":"88e9c552-ee94-4092-abe2-9fc2073edd10","timestamp":1749113912193,"gateway":"8UUXN4P00A06NK"} + +{"bid":"51fdde40-32f8-4ad2-8a8e-fb5f49f1a165","data":{"departure_trajectory":[]},"tid":"e920306d-2718-46eb-8a5b-03e3f9453d7a","timestamp":1749113913162,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c5f9f958-9134-406c-af03-186ebf3c8ac7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cafe396f-6792-4bb8-9b38-3a553270dd81","timestamp":1749113913361,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f3ae386a-637f-4b10-b601-a8459f032f87","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"19b833e0-c8cc-4282-ac08-9ab7d1dfdd87","timestamp":1749113913916,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e0a4b57-49e6-452d-820c-14caa4aed7f4","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"4ddd9252-4f63-4857-92d4-530853692baa","timestamp":1749113914430,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ab377955-fa01-4f80-90f9-d5f97e91b7ea","data":{"mobility_status_notify":0},"need_reply":1,"tid":"b7e2df69-ca8c-45b7-b0db-40f1b3afdd9e","timestamp":1749113914431,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f3ae386a-637f-4b10-b601-a8459f032f87","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"19b833e0-c8cc-4282-ac08-9ab7d1dfdd87","timestamp":1749113916026,"gateway":"8UUXN4P00A06NK"} + +{"bid":"215bb2d6-ffff-4842-87aa-fb27cbf1f19b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4e1fca19-a297-4e38-8cda-7968703dab9b","timestamp":1749113918362,"gateway":"8UUXN4P00A06NK"} + +{"tid":"e5e4deaf-9fcb-45a9-b79a-d8fb25c8c4ac","bid":"985a6c38-3ed8-46c6-9ccd-2594e6a5a254","timestamp":1749113944624,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"e03e4e5c-d2f8-4270-9531-26917061568f","bid":"976c6c8f-c5b9-4dc5-9e85-1aed9b30adc7","timestamp":1749113944630,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"e63fea5d-00c6-425d-91c8-9da6916bbf55","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"de1be76a-15fd-4757-8a88-1422d34c2b49","timestamp":1749113945351,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a5d86c08-dca6-4279-8572-638f3787e33c","data":{"air_transfer_enable":false},"need_reply":1,"tid":"bf875b8f-b39b-4e4d-a5e9-67778d1314d1","timestamp":1749113945932,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5874f706-8425-4f88-bc04-e90bd3627af0","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"bda4fcc6-d459-40e6-8ff0-ee8339bc6418","timestamp":1749113946023,"gateway":"8UUXN4P00A06NK"} + +{"bid":"75e96d72-fad0-45bb-9d4c-4f8c1d42d054","data":{"mobility_status_notify":0},"need_reply":1,"tid":"657ca79c-753b-47d9-9aeb-8178d0433888","timestamp":1749113946053,"gateway":"8UUXN4P00A06NK"} + +{"bid":"959da16b-7bf0-4a72-b635-aad086967441","data":{"dongle_infos":[]},"tid":"f2790e05-ad42-453f-bd2f-1e96a7ff2968","timestamp":1749113946072,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e894cff3-999a-4008-a155-3e9b0cd1f783","data":{"firmware_version":"13.01.0002"},"tid":"240eb8e1-ce93-465e-bb57-32fade732dfe","timestamp":1749113946081,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4514c6c3-4f33-454b-8cf7-327e2dc462f7","data":{"dongle_infos":[]},"tid":"daf86c8b-44b9-4057-a46e-4fdd15329712","timestamp":1749113947069,"gateway":"8UUXN4P00A06NK"} + +{"tid":"efc15b97-9348-4285-ae46-8e115359976f","bid":"19213251-7958-492c-b0b0-19ac598d9569","timestamp":1749113947173,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"e63fea5d-00c6-425d-91c8-9da6916bbf55","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"de1be76a-15fd-4757-8a88-1422d34c2b49","timestamp":1749113947515,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5874f706-8425-4f88-bc04-e90bd3627af0","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"bda4fcc6-d459-40e6-8ff0-ee8339bc6418","timestamp":1749113948117,"gateway":"8UUXN4P00A06NK"} + +{"bid":"75e96d72-fad0-45bb-9d4c-4f8c1d42d054","data":{"mobility_status_notify":0},"need_reply":1,"tid":"657ca79c-753b-47d9-9aeb-8178d0433888","timestamp":1749113948117,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ab19943a-701a-4d59-8e91-5752157a29f7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2faaad12-3e50-4bcc-bf7c-a7cd4deee711","timestamp":1749113949629,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a78cb6fe-13d8-416a-8f8b-10a02fd339ae","data":{"dongle_infos":[]},"tid":"88a92433-3ee6-44d3-b04d-78847aad9bec","timestamp":1749113949915,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a5d86c08-dca6-4279-8572-638f3787e33c","data":{"air_transfer_enable":false},"need_reply":1,"tid":"bf875b8f-b39b-4e4d-a5e9-67778d1314d1","timestamp":1749113950125,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a59cf0db-66fb-4d57-8821-e7fdc9b15b5b","data":{"departure_trajectory":[]},"tid":"2ca392e0-480f-431f-8685-57441a126e40","timestamp":1749113950191,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0eefe4ec-bf8a-44ef-9986-89936510da90","data":{"departure_trajectory":[]},"tid":"44ad3bb2-e7ae-4386-bb84-c0d768cb8a5f","timestamp":1749113951046,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ab19943a-701a-4d59-8e91-5752157a29f7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2faaad12-3e50-4bcc-bf7c-a7cd4deee711","timestamp":1749113951716,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5874f706-8425-4f88-bc04-e90bd3627af0","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"bda4fcc6-d459-40e6-8ff0-ee8339bc6418","timestamp":1749113952314,"gateway":"8UUXN4P00A06NK"} + +{"bid":"75e96d72-fad0-45bb-9d4c-4f8c1d42d054","data":{"mobility_status_notify":0},"need_reply":1,"tid":"657ca79c-753b-47d9-9aeb-8178d0433888","timestamp":1749113952315,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2eb9f6e3-e821-498e-b9e2-5a8ece38d893","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"555dfc95-4700-422c-aeac-e188157db732","timestamp":1749113954628,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2eb9f6e3-e821-498e-b9e2-5a8ece38d893","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"555dfc95-4700-422c-aeac-e188157db732","timestamp":1749113956718,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a5d86c08-dca6-4279-8572-638f3787e33c","data":{"air_transfer_enable":false},"need_reply":1,"tid":"bf875b8f-b39b-4e4d-a5e9-67778d1314d1","timestamp":1749113958330,"gateway":"8UUXN4P00A06NK"} + +{"bid":"662c7daf-41b1-4c10-afd7-b8aecbdb8cde","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a5b7d668-5ca0-4b87-bf46-b8e8407de9a5","timestamp":1749113959628,"gateway":"8UUXN4P00A06NK"} + +{"tid":"917d8c91-6481-4dda-8fe7-411dadb4bc10","bid":"07c5dac8-9219-451a-81f2-a940037984d5","timestamp":1749113983804,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"95cac81a-c9e2-4669-b6b0-7197d2d1efe0","bid":"82e8de08-e7fe-4d28-8466-fc55b68d77ee","timestamp":1749113983815,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"947bc454-a517-435e-9323-04605380d499","data":{"air_transfer_enable":false},"need_reply":1,"tid":"434a462f-7bf3-443f-b93c-8ba52919c232","timestamp":1749113985456,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c1c5135c-4bbe-4a37-a32a-68e1dad54e16","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"65d4cb92-d81d-4b19-8ad0-d9535d6d954a","timestamp":1749113987467,"gateway":"8UUXN4P00A06NK"} + +{"bid":"70310108-bd7b-4393-857a-eee54683a52e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c7d1266e-267f-460f-8109-e420329dd6cc","timestamp":1749113988106,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e70f398e-1895-43b9-93a3-fb91c29159b7","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7a2720d3-badb-478d-a517-7174cf525026","timestamp":1749113988112,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2ad2d523-fcf6-4c2c-983b-0335eccf02a7","data":{"dongle_infos":[]},"tid":"433bb505-fc20-4407-9bcd-f61bb4554245","timestamp":1749113988118,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f79d4200-4b7c-4245-91a5-7ee840fe3005","data":{"firmware_version":"13.01.0002"},"tid":"dd4563ce-05c8-4d00-86e6-f6eb0d3a8335","timestamp":1749113988155,"gateway":"8UUXN4P00A06NK"} + +{"tid":"7bee9d78-934d-4522-b78d-4512d81ba082","bid":"4128cde3-48e2-469c-b775-e2df746ebdba","timestamp":1749113988251,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"947bc454-a517-435e-9323-04605380d499","data":{"air_transfer_enable":false},"need_reply":1,"tid":"434a462f-7bf3-443f-b93c-8ba52919c232","timestamp":1749113988256,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8a863606-ee2d-4fc0-9972-ff224f12ee09","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"069fecd6-afd8-4d2c-9e7c-390f1bff5968","timestamp":1749113988806,"gateway":"8UUXN4P00A06NK"} + +{"bid":"02134178-9b19-4631-9190-eb66b0f13846","data":{"dongle_infos":[]},"tid":"9f57c555-7c86-489b-b2fb-e1c8d1c60071","timestamp":1749113989113,"gateway":"8UUXN4P00A06NK"} + +{"bid":"70310108-bd7b-4393-857a-eee54683a52e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c7d1266e-267f-460f-8109-e420329dd6cc","timestamp":1749113990211,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e70f398e-1895-43b9-93a3-fb91c29159b7","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7a2720d3-badb-478d-a517-7174cf525026","timestamp":1749113990212,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8a863606-ee2d-4fc0-9972-ff224f12ee09","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"069fecd6-afd8-4d2c-9e7c-390f1bff5968","timestamp":1749113990811,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1cc0ceb0-9c33-42fd-baed-f23fe2b35cf7","data":{"dongle_infos":[]},"tid":"dfcd52fc-baee-467d-be95-9cfcdaa2ab23","timestamp":1749113991108,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d3902ad1-10c0-4554-8d6d-fabefbfb4477","data":{"departure_trajectory":[]},"tid":"be44be05-e479-4b5e-b8ec-be340de33d3c","timestamp":1749113992334,"gateway":"8UUXN4P00A06NK"} + +{"bid":"947bc454-a517-435e-9323-04605380d499","data":{"air_transfer_enable":false},"need_reply":1,"tid":"434a462f-7bf3-443f-b93c-8ba52919c232","timestamp":1749113992454,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a700d4d0-a582-47a7-a5a0-1753098132f2","data":{"departure_trajectory":[]},"tid":"eba6a01b-d6e0-4b1a-bb77-c2a9db7ffeb5","timestamp":1749113993105,"gateway":"8UUXN4P00A06NK"} + +{"bid":"17650c0b-307d-4df7-9035-32668e089056","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3473a913-d610-437e-82ab-76de8e84b113","timestamp":1749113993800,"gateway":"8UUXN4P00A06NK"} + +{"bid":"70310108-bd7b-4393-857a-eee54683a52e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c7d1266e-267f-460f-8109-e420329dd6cc","timestamp":1749113994411,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e70f398e-1895-43b9-93a3-fb91c29159b7","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7a2720d3-badb-478d-a517-7174cf525026","timestamp":1749113994412,"gateway":"8UUXN4P00A06NK"} + +{"bid":"17650c0b-307d-4df7-9035-32668e089056","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3473a913-d610-437e-82ab-76de8e84b113","timestamp":1749113995811,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d8234b3e-0bda-4bea-a7d5-fe34e38bf375","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d7da6a41-a535-4fe0-8c84-ea367e589aa7","timestamp":1749113998804,"gateway":"8UUXN4P00A06NK"} + +{"tid":"7db1f0fc-1ea3-4312-a936-01cd80e029bf","bid":"c56dac52-0f7d-4766-81c8-f5ac8f7a9a75","timestamp":1749114024420,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"6440b8e3-24f1-450f-99ce-a0da01c01837","bid":"52ab349d-465a-4d50-9eca-59d4763e1740","timestamp":1749114024426,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"713f629c-c9b0-4592-b80a-0d7b19fab959","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8797e936-f9c6-4e9f-807c-a6bd9f0cb811","timestamp":1749114026014,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3ba2361f-3e0b-46e3-a5eb-77187a50cba5","data":{"mobility_status_notify":0},"need_reply":1,"tid":"20b9286f-39aa-47fd-9348-97b58700b432","timestamp":1749114026019,"gateway":"8UUXN4P00A06NK"} + +{"bid":"85658f2b-8220-48eb-961a-09776d4d2c40","data":{"dongle_infos":[]},"tid":"1937705e-44f6-47f9-9c27-dd87775537fd","timestamp":1749114026506,"gateway":"8UUXN4P00A06NK"} + +{"bid":"89508d0c-8198-45c1-b571-4ec5ba3eeaf9","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"16daeb1a-8557-4478-a47b-edf80cf122d3","timestamp":1749114026514,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7ef61196-efda-4900-9a92-b7532d17ac85","data":{"firmware_version":"13.01.0002"},"tid":"b6ac8ccb-d5de-4f74-819d-ea8d22f5865d","timestamp":1749114026517,"gateway":"8UUXN4P00A06NK"} + +{"bid":"42104f52-2bdd-4e99-a901-6a23e7e61710","data":{"dongle_infos":[]},"tid":"8c549b02-6c64-4ab0-9666-806d4690424e","timestamp":1749114026591,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4fc8a9be-f887-461d-a90f-513ff1974c55","data":{"air_transfer_enable":false},"need_reply":1,"tid":"be03fb40-4b2f-49f1-b045-22ec5674c386","timestamp":1749114026702,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d7674512-395f-453e-ab5c-b48c7208e73d","bid":"370ebfdf-b9a1-46eb-a455-e3e696421647","timestamp":1749114027308,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"cefd668b-da1b-433b-a59c-e11f3500be51","data":{"dongle_infos":[]},"tid":"cf821c73-1ea2-4874-971d-5f7eb8cba87f","timestamp":1749114027512,"gateway":"8UUXN4P00A06NK"} + +{"bid":"713f629c-c9b0-4592-b80a-0d7b19fab959","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8797e936-f9c6-4e9f-807c-a6bd9f0cb811","timestamp":1749114028196,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3ba2361f-3e0b-46e3-a5eb-77187a50cba5","data":{"mobility_status_notify":0},"need_reply":1,"tid":"20b9286f-39aa-47fd-9348-97b58700b432","timestamp":1749114028197,"gateway":"8UUXN4P00A06NK"} + +{"bid":"89508d0c-8198-45c1-b571-4ec5ba3eeaf9","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"16daeb1a-8557-4478-a47b-edf80cf122d3","timestamp":1749114028596,"gateway":"8UUXN4P00A06NK"} + +{"bid":"670d4609-714e-443c-aaa6-f385e2caa4aa","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"02970e64-cecd-4848-86ea-42008f4c4273","timestamp":1749114029419,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4fc8a9be-f887-461d-a90f-513ff1974c55","data":{"air_transfer_enable":false},"need_reply":1,"tid":"be03fb40-4b2f-49f1-b045-22ec5674c386","timestamp":1749114030905,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6c51a41d-d443-41c7-8136-e08096e88144","data":{"departure_trajectory":[]},"tid":"8437292b-ca8d-4083-822d-d7931ac3d23c","timestamp":1749114031142,"gateway":"8UUXN4P00A06NK"} + +{"bid":"646a22ea-28ce-4046-b26e-58a1943e300c","data":{"departure_trajectory":[]},"tid":"94c76794-3c59-455d-b714-3c51e25bc964","timestamp":1749114031527,"gateway":"8UUXN4P00A06NK"} + +{"bid":"670d4609-714e-443c-aaa6-f385e2caa4aa","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"02970e64-cecd-4848-86ea-42008f4c4273","timestamp":1749114031596,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3ba2361f-3e0b-46e3-a5eb-77187a50cba5","data":{"mobility_status_notify":0},"need_reply":1,"tid":"20b9286f-39aa-47fd-9348-97b58700b432","timestamp":1749114032396,"gateway":"8UUXN4P00A06NK"} + +{"bid":"89508d0c-8198-45c1-b571-4ec5ba3eeaf9","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"16daeb1a-8557-4478-a47b-edf80cf122d3","timestamp":1749114032796,"gateway":"8UUXN4P00A06NK"} + +{"bid":"29b52306-37dc-4cea-8e28-03145e085299","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d3c92a08-4a03-4073-87c0-16791c795627","timestamp":1749114034419,"gateway":"8UUXN4P00A06NK"} + +{"bid":"29b52306-37dc-4cea-8e28-03145e085299","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d3c92a08-4a03-4073-87c0-16791c795627","timestamp":1749114036596,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4fc8a9be-f887-461d-a90f-513ff1974c55","data":{"air_transfer_enable":false},"need_reply":1,"tid":"be03fb40-4b2f-49f1-b045-22ec5674c386","timestamp":1749114039098,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c7928e95-9170-416e-8e03-35111226ce7f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8bb6d4eb-7a2e-46d9-b182-0bcd5bbcf677","timestamp":1749114039419,"gateway":"8UUXN4P00A06NK"} + +{"tid":"1eaa5ec7-6df3-4e49-825b-1eecb8086858","bid":"4c229da1-bc0e-469d-917c-c6c559e0029e","timestamp":1749114063283,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"00271d59-46d3-4a5c-b1dc-125abde1f136","bid":"58cea308-102d-430e-8b93-3ecb25844832","timestamp":1749114063285,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"e58ed90f-b0fd-48ce-a325-1871d317691a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d69f8e42-6ad2-4b32-9f18-e17972630930","timestamp":1749114064832,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d30920ff-78d2-402c-9273-6ec5c2bac1f1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3fc7a707-568e-4b70-b734-52272730d8f2","timestamp":1749114066820,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3d8060ae-5c8d-421f-b046-4bb0749db1c8","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"71831b03-e748-4dff-98ea-36ef33595ddf","timestamp":1749114067010,"gateway":"8UUXN4P00A06NK"} + +{"bid":"30a02402-48e2-4196-becf-8eb8b3a7aa86","data":{"dongle_infos":[]},"tid":"f3fc9324-245b-43b9-97ef-9a76a3be2893","timestamp":1749114067256,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d2068aa6-0b8f-4052-9ee4-e04d5ba97601","data":{"firmware_version":"13.01.0002"},"tid":"47dae770-033d-4244-be6d-6cbfdf501404","timestamp":1749114067262,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3dd514d0-a412-4ae2-9dc8-09f81a709b50","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c9d98797-dde7-4864-a8bd-f3e7a53f78b7","timestamp":1749114067407,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e58ed90f-b0fd-48ce-a325-1871d317691a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d69f8e42-6ad2-4b32-9f18-e17972630930","timestamp":1749114067453,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c33ac1fb-dd04-41b0-a579-b0d9d1bfe1b7","bid":"8381a0a9-d30f-4f12-9a94-0e769abd2802","timestamp":1749114067949,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"62962351-d117-45e3-b880-1a657b309769","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f96a8267-5e07-44b9-aefb-d6ff9ddf55b1","timestamp":1749114068279,"gateway":"8UUXN4P00A06NK"} + +{"bid":"79442414-2974-402d-9909-13629dcece06","data":{"dongle_infos":[]},"tid":"76790167-3389-40a7-9b24-eca3fcb44ef9","timestamp":1749114068334,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3d8060ae-5c8d-421f-b046-4bb0749db1c8","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"71831b03-e748-4dff-98ea-36ef33595ddf","timestamp":1749114069047,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3dd514d0-a412-4ae2-9dc8-09f81a709b50","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c9d98797-dde7-4864-a8bd-f3e7a53f78b7","timestamp":1749114069446,"gateway":"8UUXN4P00A06NK"} + +{"bid":"62962351-d117-45e3-b880-1a657b309769","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f96a8267-5e07-44b9-aefb-d6ff9ddf55b1","timestamp":1749114070445,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9e9a6b49-f077-4f58-8cf0-26b243123a8e","data":{"dongle_infos":[]},"tid":"f550ebae-a3e5-45f6-95b9-adfdf3a58d94","timestamp":1749114070574,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e58ed90f-b0fd-48ce-a325-1871d317691a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d69f8e42-6ad2-4b32-9f18-e17972630930","timestamp":1749114071647,"gateway":"8UUXN4P00A06NK"} + +{"bid":"91788444-d2d3-4125-ae7e-0f6d56049295","data":{"departure_trajectory":[]},"tid":"78ee18ec-bfdd-4aca-a356-a5a7dbbc3220","timestamp":1749114071659,"gateway":"8UUXN4P00A06NK"} + +{"bid":"010bb9b2-7428-40fb-bbca-f4a6c6c315f7","data":{"departure_trajectory":[]},"tid":"b43cb8dc-5f7a-4a10-9673-8c7e7e5bdb90","timestamp":1749114072250,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3d8060ae-5c8d-421f-b046-4bb0749db1c8","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"71831b03-e748-4dff-98ea-36ef33595ddf","timestamp":1749114073248,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1669eede-bbdc-46ed-82dd-03a4cb60381c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"42ee5a9b-aeb4-4d74-b8bd-1ecb20ccce38","timestamp":1749114073280,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3dd514d0-a412-4ae2-9dc8-09f81a709b50","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c9d98797-dde7-4864-a8bd-f3e7a53f78b7","timestamp":1749114073651,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1669eede-bbdc-46ed-82dd-03a4cb60381c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"42ee5a9b-aeb4-4d74-b8bd-1ecb20ccce38","timestamp":1749114075450,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b95c6ba8-74e2-43a2-beef-d5c47dddaa22","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b944881c-f736-4269-8e29-94a85dcb9272","timestamp":1749114078284,"gateway":"8UUXN4P00A06NK"} + +{"tid":"f9a93c72-57d9-4570-b47b-634126be2ca2","bid":"3bd2359e-eafe-4cd8-aefa-306f0e7f4058","timestamp":1749114101664,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"a6e23eac-5ac0-4d1c-a2f7-017b910eea16","bid":"1bd01c27-bf85-45de-a4fa-5ff09371ee62","timestamp":1749114101667,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"22587b95-ef06-4e78-b7ff-7398f93d96da","bid":"c5f71014-1258-46a1-84c4-6fef4ee4ed80","timestamp":1749114102712,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"6dfd6760-60f9-4e98-aca5-ec8bcb2a46fc","bid":"0054f03b-7960-4539-be67-a5e5970a73b6","timestamp":1749114102723,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"fc497460-8b7e-4856-8004-2b209920b658","data":{"air_transfer_enable":false},"need_reply":1,"tid":"c7cbe1f1-c66a-483d-8fc5-ed1a1f3c6d93","timestamp":1749114104186,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cb4b6699-0fd9-4ea2-9a94-066b310fd5d6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8ab1192d-4719-447a-ba2e-df72baf79ed6","timestamp":1749114106278,"gateway":"8UUXN4P00A06NK"} + +{"bid":"24f9928d-d722-41bf-a6fe-3b95bbda75d6","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6757b691-7b59-40e0-ac5b-9d4b3f095012","timestamp":1749114106335,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bf0324c8-7c60-4dc9-9a08-eb8ca11ae823","data":{"dongle_infos":[]},"tid":"befb52a5-acf5-4e78-a5b9-0de5621f2bad","timestamp":1749114106561,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4d941c25-1891-4868-bfb3-572bf31a6969","data":{"firmware_version":"13.01.0002"},"tid":"234ae8dd-0e54-482e-a11c-f6414b434f99","timestamp":1749114106566,"gateway":"8UUXN4P00A06NK"} + +{"bid":"85076509-5a6b-4d94-9983-be2065e14ec5","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b1c8691b-e2a4-41ba-971c-9f63e0e1f2cb","timestamp":1749114106667,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fc497460-8b7e-4856-8004-2b209920b658","data":{"air_transfer_enable":false},"need_reply":1,"tid":"c7cbe1f1-c66a-483d-8fc5-ed1a1f3c6d93","timestamp":1749114106754,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f4679ddc-a0b2-477b-9541-f693680e537e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f1f6c221-cb56-44ee-8bf0-b9d2c41908b2","timestamp":1749114106762,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b3f8f884-8638-4ac7-9cdc-e98bdea55e00","data":{"dongle_infos":[]},"tid":"61acd711-36e9-452c-86d9-144bca1d7492","timestamp":1749114107565,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a562ce2f-ba9f-48de-b61a-ae39546ae0ac","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3e8485ab-c8dc-4fbd-881c-c055f7136233","timestamp":1749114107715,"gateway":"8UUXN4P00A06NK"} + +{"tid":"7de48d23-e10e-40a3-a36e-b026c5393421","bid":"e4b262f9-f88c-4da1-bfc1-17a9f074b85d","timestamp":1749114107733,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"24f9928d-d722-41bf-a6fe-3b95bbda75d6","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6757b691-7b59-40e0-ac5b-9d4b3f095012","timestamp":1749114108532,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f4679ddc-a0b2-477b-9541-f693680e537e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f1f6c221-cb56-44ee-8bf0-b9d2c41908b2","timestamp":1749114108930,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a562ce2f-ba9f-48de-b61a-ae39546ae0ac","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3e8485ab-c8dc-4fbd-881c-c055f7136233","timestamp":1749114109731,"gateway":"8UUXN4P00A06NK"} + +{"bid":"16fac216-b52b-4687-8467-9d70f5a5d4e4","data":{"dongle_infos":[]},"tid":"2d04430c-0d48-4c9f-8113-36a02bdd7e6e","timestamp":1749114110933,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fc497460-8b7e-4856-8004-2b209920b658","data":{"air_transfer_enable":false},"need_reply":1,"tid":"c7cbe1f1-c66a-483d-8fc5-ed1a1f3c6d93","timestamp":1749114110952,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9f6670d3-002d-489f-a1ec-c6e9588b1fdf","data":{"departure_trajectory":[]},"tid":"8ce79b13-07fb-49de-b3fc-46690bd25453","timestamp":1749114110976,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6f2b3055-fcf4-4296-8b17-9e951b458b2e","data":{"departure_trajectory":[]},"tid":"3055c79c-37a7-4b7c-ad9a-52333c97a593","timestamp":1749114111557,"gateway":"8UUXN4P00A06NK"} + +{"bid":"67996b37-1077-4857-94af-aa018db6d105","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"81bf8a85-dc98-4098-bb4a-a8d3ba83a27a","timestamp":1749114111662,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3ce68de0-67a1-4271-93dc-cf04db4a7fa8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3866f1a9-f446-43c4-896f-c33c0da835e5","timestamp":1749114112720,"gateway":"8UUXN4P00A06NK"} + +{"bid":"24f9928d-d722-41bf-a6fe-3b95bbda75d6","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6757b691-7b59-40e0-ac5b-9d4b3f095012","timestamp":1749114112734,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f4679ddc-a0b2-477b-9541-f693680e537e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f1f6c221-cb56-44ee-8bf0-b9d2c41908b2","timestamp":1749114113134,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3ce68de0-67a1-4271-93dc-cf04db4a7fa8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3866f1a9-f446-43c4-896f-c33c0da835e5","timestamp":1749114114732,"gateway":"8UUXN4P00A06NK"} + +{"bid":"45fcd631-8094-4ccf-b351-c0846be1b7e1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c989714a-1fdf-48b1-9526-80b1515a6747","timestamp":1749114116664,"gateway":"8UUXN4P00A06NK"} + +{"tid":"8dd74823-660c-4c40-9cf5-e2bb1979dce5","bid":"e9a3cc7d-f424-4c81-8d4a-505c1efe67dc","timestamp":1749114138761,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"2397ab24-dbd0-4019-be4e-8a9ed2c9b126","bid":"10cb7575-90e8-4a92-b6ee-233672f9aff3","timestamp":1749114138764,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"8b9ca6b2-ab8c-40b8-b3ca-3ec616525b1e","bid":"be0d4d70-28a2-45b9-81c2-889f75fe9d51","timestamp":1749114139118,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"8534dac6-2b22-41b6-adf1-a0cb5aef2d6f","bid":"01d88f58-64a6-4d2f-b936-f4b8ae2e6100","timestamp":1749114139122,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"1f6e8417-6a26-4e1a-ab30-1b978a00f1dd","bid":"282ac81c-2617-4adf-ba26-7d91e855bfda","timestamp":1749114139125,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"3978913d-6509-4fec-90a9-b827a39a661d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"a4c390e7-1c3e-423f-9e18-5c661d85e63e","timestamp":1749114141240,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4b99f760-aef0-43f7-b666-c12e74ccc78a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1a8618ff-eef7-43f1-a0fa-e9909cd8aea1","timestamp":1749114143375,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8d66eea7-1e96-4fcc-9492-54918703b6c4","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"0f5c8cdf-a02e-4cce-a6d3-d82b7a534bcb","timestamp":1749114143436,"gateway":"8UUXN4P00A06NK"} + +{"bid":"52db6538-d910-4a4f-bb80-0b495ddbb6d4","data":{"dongle_infos":[]},"tid":"35b63c60-6f95-4b82-b0d0-cd5c7ccbf330","timestamp":1749114143642,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3e31f9cf-b305-459a-8a82-193019f4319d","data":{"firmware_version":"13.01.0002"},"tid":"40ab3454-cae6-48b1-893a-af45584a1c2d","timestamp":1749114143686,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dc1c473d-d7ca-4b5a-89ff-76811eff7d86","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7d887eb3-c25f-4938-b04f-f644b9ff6f3c","timestamp":1749114143762,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3978913d-6509-4fec-90a9-b827a39a661d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"a4c390e7-1c3e-423f-9e18-5c661d85e63e","timestamp":1749114143838,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a43a2380-59a0-4272-90cb-a18a03418592","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ecd1fdef-d27e-466e-88d4-b39e80ba353c","timestamp":1749114143870,"gateway":"8UUXN4P00A06NK"} + +{"tid":"74eeca08-24db-4b9e-9954-c14758f5e144","bid":"f2092631-dafb-426a-994f-d30719bf597d","timestamp":1749114143989,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"111fe34e-29fb-48b9-8a71-f4f42643c367","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"30b8c121-be52-4c6f-b9a7-ddab860e5c7c","timestamp":1749114144122,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e5626df-9ad0-4abc-960f-6a95c1fe3202","data":{"dongle_infos":[]},"tid":"4826b5e9-6ba9-4a49-b961-cbd04e1d418e","timestamp":1749114144689,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8d66eea7-1e96-4fcc-9492-54918703b6c4","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"0f5c8cdf-a02e-4cce-a6d3-d82b7a534bcb","timestamp":1749114145453,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a43a2380-59a0-4272-90cb-a18a03418592","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ecd1fdef-d27e-466e-88d4-b39e80ba353c","timestamp":1749114146056,"gateway":"8UUXN4P00A06NK"} + +{"bid":"111fe34e-29fb-48b9-8a71-f4f42643c367","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"30b8c121-be52-4c6f-b9a7-ddab860e5c7c","timestamp":1749114146260,"gateway":"8UUXN4P00A06NK"} + +{"bid":"609a5061-48a0-4cb1-8a72-15a84d77c9da","data":{"dongle_infos":[]},"tid":"e6b442c6-bc27-4845-92b4-060791dd27ec","timestamp":1749114147089,"gateway":"8UUXN4P00A06NK"} + +{"bid":"600449aa-25f9-4cf9-a185-bcd9d7f567a9","data":{"departure_trajectory":[]},"tid":"c7114d62-ac38-42e3-9322-02f00bd58c3c","timestamp":1749114148012,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3978913d-6509-4fec-90a9-b827a39a661d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"a4c390e7-1c3e-423f-9e18-5c661d85e63e","timestamp":1749114148036,"gateway":"8UUXN4P00A06NK"} + +{"bid":"da49f14a-506c-48af-9f95-cd50b0fb5c72","data":{"departure_trajectory":[]},"tid":"d09d0a92-aefc-4412-b811-d8d4b94d5903","timestamp":1749114148638,"gateway":"8UUXN4P00A06NK"} + +{"bid":"16f64c20-e39e-41fb-a605-c76a70fbc627","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f5bce31f-86d3-452d-8a35-cae66dbe748f","timestamp":1749114148761,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0e734d95-13e1-43ea-ba2f-306fc3173ab3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1349b3a2-83a4-4c3d-bf84-6f8fdc7953f6","timestamp":1749114149117,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8d66eea7-1e96-4fcc-9492-54918703b6c4","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"0f5c8cdf-a02e-4cce-a6d3-d82b7a534bcb","timestamp":1749114149656,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a43a2380-59a0-4272-90cb-a18a03418592","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ecd1fdef-d27e-466e-88d4-b39e80ba353c","timestamp":1749114150253,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0e734d95-13e1-43ea-ba2f-306fc3173ab3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1349b3a2-83a4-4c3d-bf84-6f8fdc7953f6","timestamp":1749114151259,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d8823472-5082-40f6-a231-4c021e9f42c4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"15b0a172-f18b-4b51-818d-7fd9384645f5","timestamp":1749114153763,"gateway":"8UUXN4P00A06NK"} + +{"bid":"33c488f6-efac-4e32-8577-3c5bbf693b50","data":{"mobility_status_notify":0},"need_reply":1,"tid":"80e10897-4a70-4c4e-8aed-c24f55d7cc57","timestamp":1749121035975,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8c0b1310-01d0-4713-baee-f0ba4856f2b8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6573396f-a5aa-4a0f-9445-593b9a1e96ac","timestamp":1749121035978,"gateway":"8UUXN4P00A06NK"} + +{"bid":"afc0b94d-e2cc-4df2-9031-81f91c2768fd","data":{"dongle_infos":[]},"tid":"70ca39aa-42a8-4cf7-af7f-fcde84561398","timestamp":1749121036407,"gateway":"8UUXN4P00A06NK"} + +{"bid":"db6427a0-3dba-42f2-a1cf-ffbc9826525a","data":{"firmware_version":"13.01.0002"},"tid":"23f91ff4-6d55-4a56-8d12-ce002035be83","timestamp":1749121036473,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8ea8a792-8e5c-4e16-9ad6-88943fde4085","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"546afba3-fd75-4627-ba0e-630a761e1c14","timestamp":1749121036523,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1a7b83b3-427a-4165-8b29-0ab56c1ba0a1","data":{"air_transfer_enable":false},"need_reply":1,"tid":"70de87be-7e67-4a77-b14e-7179b71114c7","timestamp":1749121036594,"gateway":"8UUXN4P00A06NK"} + +{"tid":"221eb231-700d-4051-a645-2a47f18bad51","bid":"0af503e1-79d5-433a-bd7b-4c605070aebe","timestamp":1749121036645,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"0ef9e412-af1d-457d-baf8-0867596d7da9","data":{"dongle_infos":[]},"tid":"63431db3-5f89-4953-b172-c2bbcdcca942","timestamp":1749121037448,"gateway":"8UUXN4P00A06NK"} + +{"bid":"33c488f6-efac-4e32-8577-3c5bbf693b50","data":{"mobility_status_notify":0},"need_reply":1,"tid":"80e10897-4a70-4c4e-8aed-c24f55d7cc57","timestamp":1749121038149,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8c0b1310-01d0-4713-baee-f0ba4856f2b8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6573396f-a5aa-4a0f-9445-593b9a1e96ac","timestamp":1749121038150,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8ea8a792-8e5c-4e16-9ad6-88943fde4085","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"546afba3-fd75-4627-ba0e-630a761e1c14","timestamp":1749121038549,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b6fa31f3-9ebf-405d-83e3-82d38fa738f1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4eefc9ba-c089-4f88-8697-9354ec3402ea","timestamp":1749172548369,"gateway":"8UUXN4P00A06NK"} + +{"tid":"8e6f5ee8-6a69-410a-8ad6-fc61c380c576","bid":"ca5d1b9f-20c1-4661-bc81-e45e29b66086","timestamp":1749172574798,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"8b8cfa57-4c7e-4308-a4b6-c4ae7a695ada","bid":"9bc9d852-ec58-456c-8b67-a42a96149675","timestamp":1749172574803,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"97e20d46-0236-459b-b5a8-cf17e6f8f8c6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"09e91b1f-8cc8-49f8-b022-094e0deee497","timestamp":1749172576001,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d093388e-b92f-4adb-8df5-86991d596c1d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f08e853e-fb8d-4654-a4e8-1994c48d7fe7","timestamp":1749172576035,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c7ffb667-1ef1-4488-a20d-c9cfd3b97c79","bid":"d0e06cb3-0aea-4d41-ad35-875c756d0e24","timestamp":1749172576451,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"df6b9e40-522f-4a52-8b84-7cf9d21913da","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2350fee9-53a8-4060-b61c-c41c053d72e6","timestamp":1749172576452,"gateway":"8UUXN4P00A06NK"} + +{"bid":"641c13a1-1684-4670-9b93-f65d4e419254","data":{"dongle_infos":[]},"tid":"d25dbf6c-584d-4110-a1b0-ae4ca4c0c5cf","timestamp":1749172576456,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6580cc32-21ad-4f44-9b9c-93b6278dfebc","data":{"firmware_version":"13.01.0002"},"tid":"bc10dc7b-e981-4843-8e21-c9af509f4acc","timestamp":1749172576462,"gateway":"8UUXN4P00A06NK"} + +{"bid":"563fc0e8-a774-4958-a3f1-bc0f795234b9","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"12425709-e6a0-44f3-be27-b36ef6dd031a","timestamp":1749172576558,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8abaa4ce-766c-4b74-9f1f-0aa24d33ddd3","data":{"dongle_infos":[]},"tid":"aa36cadf-27b4-4a64-8a72-d71bfd80bfed","timestamp":1749172577457,"gateway":"8UUXN4P00A06NK"} + +{"bid":"97e20d46-0236-459b-b5a8-cf17e6f8f8c6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"09e91b1f-8cc8-49f8-b022-094e0deee497","timestamp":1749172578077,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d093388e-b92f-4adb-8df5-86991d596c1d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f08e853e-fb8d-4654-a4e8-1994c48d7fe7","timestamp":1749172578079,"gateway":"8UUXN4P00A06NK"} + +{"bid":"563fc0e8-a774-4958-a3f1-bc0f795234b9","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"12425709-e6a0-44f3-be27-b36ef6dd031a","timestamp":1749172578677,"gateway":"8UUXN4P00A06NK"} + +{"bid":"690a72fd-1c41-4f88-858b-9d409f9eee41","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"03be39e6-e0ee-4a12-8b15-c1a729a0f736","timestamp":1749172579797,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ac764f22-4c05-4096-845d-b4ba13212555","data":{"dongle_infos":[]},"tid":"bb328cbe-e072-4af6-a3d8-d4e0e2061dbd","timestamp":1749172580536,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df6b9e40-522f-4a52-8b84-7cf9d21913da","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2350fee9-53a8-4060-b61c-c41c053d72e6","timestamp":1749172580647,"gateway":"8UUXN4P00A06NK"} + +{"bid":"448d0ede-5db8-4f50-a67e-b24f019dad50","data":{"departure_trajectory":[]},"tid":"2d186f3f-1b5c-4bc0-9b5d-a3f693601106","timestamp":1749172580862,"gateway":"8UUXN4P00A06NK"} + +{"bid":"240a9d36-bb1b-4b62-bd5a-6d71131a80ff","data":{"departure_trajectory":[]},"tid":"902e96f5-9927-47b3-b228-f6746e1f942d","timestamp":1749172581446,"gateway":"8UUXN4P00A06NK"} + +{"bid":"690a72fd-1c41-4f88-858b-9d409f9eee41","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"03be39e6-e0ee-4a12-8b15-c1a729a0f736","timestamp":1749172581876,"gateway":"8UUXN4P00A06NK"} + +{"bid":"97e20d46-0236-459b-b5a8-cf17e6f8f8c6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"09e91b1f-8cc8-49f8-b022-094e0deee497","timestamp":1749172582276,"gateway":"8UUXN4P00A06NK"} + +{"bid":"563fc0e8-a774-4958-a3f1-bc0f795234b9","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"12425709-e6a0-44f3-be27-b36ef6dd031a","timestamp":1749172582874,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2abff111-2a45-4f6b-80cb-d510b71fd224","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3b0fb892-72a2-41d6-81b0-cbdc58e59548","timestamp":1749172584797,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2abff111-2a45-4f6b-80cb-d510b71fd224","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3b0fb892-72a2-41d6-81b0-cbdc58e59548","timestamp":1749172586875,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df6b9e40-522f-4a52-8b84-7cf9d21913da","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2350fee9-53a8-4060-b61c-c41c053d72e6","timestamp":1749172588847,"gateway":"8UUXN4P00A06NK"} + +{"bid":"72d74d02-0f1c-45fb-a321-083f1ced90e7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c3612bce-6eb0-43f3-8a32-2d4c63787113","timestamp":1749172589794,"gateway":"8UUXN4P00A06NK"} + +{"bid":"97e20d46-0236-459b-b5a8-cf17e6f8f8c6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"09e91b1f-8cc8-49f8-b022-094e0deee497","timestamp":1749172590476,"gateway":"8UUXN4P00A06NK"} + +{"bid":"563fc0e8-a774-4958-a3f1-bc0f795234b9","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"12425709-e6a0-44f3-be27-b36ef6dd031a","timestamp":1749172591076,"gateway":"8UUXN4P00A06NK"} + +{"bid":"72d74d02-0f1c-45fb-a321-083f1ced90e7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c3612bce-6eb0-43f3-8a32-2d4c63787113","timestamp":1749172591877,"gateway":"8UUXN4P00A06NK"} + +{"bid":"72d74d02-0f1c-45fb-a321-083f1ced90e7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c3612bce-6eb0-43f3-8a32-2d4c63787113","timestamp":1749172596077,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df6b9e40-522f-4a52-8b84-7cf9d21913da","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2350fee9-53a8-4060-b61c-c41c053d72e6","timestamp":1749172597046,"gateway":"8UUXN4P00A06NK"} + +{"bid":"97e20d46-0236-459b-b5a8-cf17e6f8f8c6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"09e91b1f-8cc8-49f8-b022-094e0deee497","timestamp":1749172598676,"gateway":"8UUXN4P00A06NK"} + +{"bid":"563fc0e8-a774-4958-a3f1-bc0f795234b9","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"12425709-e6a0-44f3-be27-b36ef6dd031a","timestamp":1749172599275,"gateway":"8UUXN4P00A06NK"} + +{"bid":"72d74d02-0f1c-45fb-a321-083f1ced90e7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c3612bce-6eb0-43f3-8a32-2d4c63787113","timestamp":1749172604274,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df6b9e40-522f-4a52-8b84-7cf9d21913da","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2350fee9-53a8-4060-b61c-c41c053d72e6","timestamp":1749172605245,"gateway":"8UUXN4P00A06NK"} + +{"bid":"97e20d46-0236-459b-b5a8-cf17e6f8f8c6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"09e91b1f-8cc8-49f8-b022-094e0deee497","timestamp":1749172606876,"gateway":"8UUXN4P00A06NK"} + +{"bid":"563fc0e8-a774-4958-a3f1-bc0f795234b9","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"12425709-e6a0-44f3-be27-b36ef6dd031a","timestamp":1749172607477,"gateway":"8UUXN4P00A06NK"} + +{"bid":"72d74d02-0f1c-45fb-a321-083f1ced90e7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c3612bce-6eb0-43f3-8a32-2d4c63787113","timestamp":1749172612477,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df6b9e40-522f-4a52-8b84-7cf9d21913da","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2350fee9-53a8-4060-b61c-c41c053d72e6","timestamp":1749172613452,"gateway":"8UUXN4P00A06NK"} + +{"bid":"97e20d46-0236-459b-b5a8-cf17e6f8f8c6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"09e91b1f-8cc8-49f8-b022-094e0deee497","timestamp":1749172615075,"gateway":"8UUXN4P00A06NK"} + +{"bid":"563fc0e8-a774-4958-a3f1-bc0f795234b9","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"12425709-e6a0-44f3-be27-b36ef6dd031a","timestamp":1749172615673,"gateway":"8UUXN4P00A06NK"} + +{"bid":"72d74d02-0f1c-45fb-a321-083f1ced90e7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c3612bce-6eb0-43f3-8a32-2d4c63787113","timestamp":1749172620675,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df6b9e40-522f-4a52-8b84-7cf9d21913da","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2350fee9-53a8-4060-b61c-c41c053d72e6","timestamp":1749172621652,"gateway":"8UUXN4P00A06NK"} + +{"bid":"97e20d46-0236-459b-b5a8-cf17e6f8f8c6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"09e91b1f-8cc8-49f8-b022-094e0deee497","timestamp":1749172623275,"gateway":"8UUXN4P00A06NK"} + +{"bid":"563fc0e8-a774-4958-a3f1-bc0f795234b9","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"12425709-e6a0-44f3-be27-b36ef6dd031a","timestamp":1749172623874,"gateway":"8UUXN4P00A06NK"} + +{"bid":"72d74d02-0f1c-45fb-a321-083f1ced90e7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c3612bce-6eb0-43f3-8a32-2d4c63787113","timestamp":1749172628875,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df6b9e40-522f-4a52-8b84-7cf9d21913da","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2350fee9-53a8-4060-b61c-c41c053d72e6","timestamp":1749172629847,"gateway":"8UUXN4P00A06NK"} + +{"bid":"97e20d46-0236-459b-b5a8-cf17e6f8f8c6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"09e91b1f-8cc8-49f8-b022-094e0deee497","timestamp":1749172631477,"gateway":"8UUXN4P00A06NK"} + +{"bid":"563fc0e8-a774-4958-a3f1-bc0f795234b9","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"12425709-e6a0-44f3-be27-b36ef6dd031a","timestamp":1749172632076,"gateway":"8UUXN4P00A06NK"} + +{"bid":"72d74d02-0f1c-45fb-a321-083f1ced90e7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c3612bce-6eb0-43f3-8a32-2d4c63787113","timestamp":1749172637075,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bf35e5cb-714c-4128-9ee7-f8c6a385b6c7","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"0560c2c7-277e-4a78-9c8a-84fc9c7be7c5","timestamp":1749172642559,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bf35e5cb-714c-4128-9ee7-f8c6a385b6c7","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"0560c2c7-277e-4a78-9c8a-84fc9c7be7c5","timestamp":1749172644676,"gateway":"8UUXN4P00A06NK"} + +{"bid":"72d74d02-0f1c-45fb-a321-083f1ced90e7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c3612bce-6eb0-43f3-8a32-2d4c63787113","timestamp":1749172645274,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bf35e5cb-714c-4128-9ee7-f8c6a385b6c7","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"0560c2c7-277e-4a78-9c8a-84fc9c7be7c5","timestamp":1749172648876,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bf35e5cb-714c-4128-9ee7-f8c6a385b6c7","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"0560c2c7-277e-4a78-9c8a-84fc9c7be7c5","timestamp":1749172657074,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bf35e5cb-714c-4128-9ee7-f8c6a385b6c7","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"0560c2c7-277e-4a78-9c8a-84fc9c7be7c5","timestamp":1749172665275,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bf35e5cb-714c-4128-9ee7-f8c6a385b6c7","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"0560c2c7-277e-4a78-9c8a-84fc9c7be7c5","timestamp":1749172673476,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bf35e5cb-714c-4128-9ee7-f8c6a385b6c7","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"0560c2c7-277e-4a78-9c8a-84fc9c7be7c5","timestamp":1749172681676,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bf35e5cb-714c-4128-9ee7-f8c6a385b6c7","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"0560c2c7-277e-4a78-9c8a-84fc9c7be7c5","timestamp":1749172689561,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bf35e5cb-714c-4128-9ee7-f8c6a385b6c7","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"0560c2c7-277e-4a78-9c8a-84fc9c7be7c5","timestamp":1749172697761,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c057659b-4459-4dc4-ad99-2521952bde63","bid":"81907264-2f27-4837-976a-71537cc14406","timestamp":1749174745004,"data":{"live_status":[{"video_id":"8UUXN4P00A06NK/165-0-7/normal-0","video_type":"normal","video_quality":4,"status":1,"error_status":0}]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1cd0599-7bdc-4cea-ba71-9b5cadae25b4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"89fa999b-bbc7-400c-8765-a9a8c27408c0","timestamp":1749174757865,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1cd0599-7bdc-4cea-ba71-9b5cadae25b4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"89fa999b-bbc7-400c-8765-a9a8c27408c0","timestamp":1749174759895,"gateway":"8UUXN4P00A06NK"} + +{"tid":"5c0e3ca4-d328-4f7f-9b87-b0325a978e2c","bid":"f9c8ca0d-eff1-4c38-8097-75dbab6a338e","timestamp":1749174760787,"data":{"live_capacity":{"available_video_number":3,"coexist_video_number_max":3,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F8HGX253U00A0626","available_video_number":2,"coexist_video_number_max":1,"camera_list":[{"camera_index":"176-0-0","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]},{"camera_index":"99-0-0","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"wide","switchable_video_types":["normal","wide","zoom","ir"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1cd0599-7bdc-4cea-ba71-9b5cadae25b4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"89fa999b-bbc7-400c-8765-a9a8c27408c0","timestamp":1749174764090,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1cd0599-7bdc-4cea-ba71-9b5cadae25b4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"89fa999b-bbc7-400c-8765-a9a8c27408c0","timestamp":1749174772294,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1cd0599-7bdc-4cea-ba71-9b5cadae25b4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"89fa999b-bbc7-400c-8765-a9a8c27408c0","timestamp":1749174780487,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1cd0599-7bdc-4cea-ba71-9b5cadae25b4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"89fa999b-bbc7-400c-8765-a9a8c27408c0","timestamp":1749174788695,"gateway":"8UUXN4P00A06NK"} + +{"tid":"f5f44d5d-c2bf-40b8-b965-010bf2ea374c","bid":"6f2ea46d-4e7c-463e-b12c-eaa768a0c1eb","timestamp":1749174789405,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":3,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F8HGX253U00A0626","available_video_number":0,"coexist_video_number_max":1,"camera_list":[]}]}},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1cd0599-7bdc-4cea-ba71-9b5cadae25b4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"89fa999b-bbc7-400c-8765-a9a8c27408c0","timestamp":1749174796889,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1cd0599-7bdc-4cea-ba71-9b5cadae25b4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"89fa999b-bbc7-400c-8765-a9a8c27408c0","timestamp":1749174805095,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1cd0599-7bdc-4cea-ba71-9b5cadae25b4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"89fa999b-bbc7-400c-8765-a9a8c27408c0","timestamp":1749174813295,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1cd0599-7bdc-4cea-ba71-9b5cadae25b4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"89fa999b-bbc7-400c-8765-a9a8c27408c0","timestamp":1749174821489,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1cd0599-7bdc-4cea-ba71-9b5cadae25b4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"89fa999b-bbc7-400c-8765-a9a8c27408c0","timestamp":1749174829689,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1cd0599-7bdc-4cea-ba71-9b5cadae25b4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"89fa999b-bbc7-400c-8765-a9a8c27408c0","timestamp":1749174837888,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1cd0599-7bdc-4cea-ba71-9b5cadae25b4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"89fa999b-bbc7-400c-8765-a9a8c27408c0","timestamp":1749174846088,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1cd0599-7bdc-4cea-ba71-9b5cadae25b4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"89fa999b-bbc7-400c-8765-a9a8c27408c0","timestamp":1749174854935,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1cd0599-7bdc-4cea-ba71-9b5cadae25b4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"89fa999b-bbc7-400c-8765-a9a8c27408c0","timestamp":1749174863135,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1cd0599-7bdc-4cea-ba71-9b5cadae25b4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"89fa999b-bbc7-400c-8765-a9a8c27408c0","timestamp":1749174871334,"gateway":"8UUXN4P00A06NK"} + +{"tid":"29ada673-02d7-4401-a87f-04cefde5e479","bid":"39c9dda2-b862-49e2-8443-7d075ac9079c","timestamp":1749175884779,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"77624297-656d-4708-b949-015424a83bb0","bid":"84890a6a-10cd-468f-99ac-25c6e9b63feb","timestamp":1749175884786,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"cc68ae41-48c8-45fc-a9f6-69b65de3c99c","bid":"71c0266e-93ed-4506-8e37-c0a080e1cf06","timestamp":1749175884977,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"a062ce5e-70cd-4138-9ac8-4da96d244c58","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ee379ffc-e548-421a-813a-284c68fc9201","timestamp":1749175885385,"gateway":"8UUXN4P00A06NK"} + +{"bid":"afa13819-162e-40df-b262-0e371f818994","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5c6ffe87-a43b-4504-94c1-861e3833cf73","timestamp":1749175885636,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b556f0ce-4c19-4e77-b09b-ad8bf100a754","data":{"air_transfer_enable":false},"need_reply":1,"tid":"ea4bbc8c-3942-4a23-8b0c-5359d07a55d2","timestamp":1749175885731,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6abb091b-221f-4168-8e51-02d4bca92e69","data":{"dongle_infos":[]},"tid":"89d33a2f-b608-4add-ba84-26004e50a1a0","timestamp":1749175885737,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e45d668d-3c15-4463-90c5-18d6f1839286","data":{"firmware_version":"13.01.0002"},"tid":"b8356c84-0b94-46c7-b681-1f6fd2ebbdf7","timestamp":1749175885743,"gateway":"8UUXN4P00A06NK"} + +{"bid":"355866b1-a1a1-4f6d-b7f6-ed0dc56cdcbc","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e2e24e8b-503b-4a0b-8a29-bd1c4349ab05","timestamp":1749175886492,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1c9c53ad-5eac-4f55-b401-4d07feb53e40","data":{"dongle_infos":[]},"tid":"7985503d-2296-489c-9d05-136b3c50d38e","timestamp":1749175886742,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a062ce5e-70cd-4138-9ac8-4da96d244c58","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ee379ffc-e548-421a-813a-284c68fc9201","timestamp":1749175887573,"gateway":"8UUXN4P00A06NK"} + +{"bid":"afa13819-162e-40df-b262-0e371f818994","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5c6ffe87-a43b-4504-94c1-861e3833cf73","timestamp":1749175887772,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d7eef5a5-e568-4135-9422-30e40d2050fb","data":{"dongle_infos":[]},"tid":"ccdb554b-0fb4-4035-b3d7-f3df2305c49c","timestamp":1749175888186,"gateway":"8UUXN4P00A06NK"} + +{"bid":"355866b1-a1a1-4f6d-b7f6-ed0dc56cdcbc","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e2e24e8b-503b-4a0b-8a29-bd1c4349ab05","timestamp":1749175888573,"gateway":"8UUXN4P00A06NK"} + +{"bid":"72fa1a63-aa2f-45fb-afbf-a1ae528fa901","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4f0eedd1-05a6-4cc0-92bc-1be226b35657","timestamp":1749175889845,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b556f0ce-4c19-4e77-b09b-ad8bf100a754","data":{"air_transfer_enable":false},"need_reply":1,"tid":"ea4bbc8c-3942-4a23-8b0c-5359d07a55d2","timestamp":1749175889926,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4f47e2eb-15e1-4884-a20b-004745bb1c7a","data":{"departure_trajectory":[]},"tid":"7d1cf651-7893-49ee-8d5d-aab9cf718470","timestamp":1749175890725,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0b843c9a-4e06-4259-994e-ec36fd312344","data":{"departure_trajectory":[]},"tid":"809e1583-d974-4ea2-9194-a3c7f2989289","timestamp":1749175891685,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a062ce5e-70cd-4138-9ac8-4da96d244c58","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ee379ffc-e548-421a-813a-284c68fc9201","timestamp":1749175891772,"gateway":"8UUXN4P00A06NK"} + +{"bid":"72fa1a63-aa2f-45fb-afbf-a1ae528fa901","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4f0eedd1-05a6-4cc0-92bc-1be226b35657","timestamp":1749175891974,"gateway":"8UUXN4P00A06NK"} + +{"bid":"355866b1-a1a1-4f6d-b7f6-ed0dc56cdcbc","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e2e24e8b-503b-4a0b-8a29-bd1c4349ab05","timestamp":1749175892772,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8f53f746-311f-4db1-b08e-0976e08d2dc3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8d7286fb-2159-4c85-84ec-67f93aea1653","timestamp":1749175894777,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8f53f746-311f-4db1-b08e-0976e08d2dc3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8d7286fb-2159-4c85-84ec-67f93aea1653","timestamp":1749175896973,"gateway":"8UUXN4P00A06NK"} + +{"tid":"88a50dcd-4005-44ae-a3af-beb3005d58e9","bid":"92469630-192d-437e-8550-6a1af4393149","timestamp":1749175921528,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"9714ce55-521c-4c38-98c2-6fec20920ccd","bid":"d576cf81-eb85-42a5-9a05-b67d610a4406","timestamp":1749175921536,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"8fe225a6-3174-4dff-beb2-d87b98f45c51","data":{"air_transfer_enable":false},"need_reply":1,"tid":"a5635482-e611-4487-859b-979789470a1e","timestamp":1749175923293,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8109ad2c-9891-4828-ac6b-8a3ec0c22e5e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2f4f8199-263f-4edd-afe4-a26e1960cf5e","timestamp":1749175925255,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8fe225a6-3174-4dff-beb2-d87b98f45c51","data":{"air_transfer_enable":false},"need_reply":1,"tid":"a5635482-e611-4487-859b-979789470a1e","timestamp":1749175926007,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5f24ebdf-3c76-401a-b07d-0d4bcb88804d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b96dec44-5ccc-44f8-989a-46abf6896648","timestamp":1749175926036,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1962f2b5-eba8-4bbf-9cdc-af8b4f78ca11","data":{"dongle_infos":[]},"tid":"c0b26034-84d5-43e6-b240-5586e61c16fb","timestamp":1749175926047,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cf74b9a3-b7f2-42c4-800c-e85daac24415","data":{"mobility_status_notify":0},"need_reply":1,"tid":"52a50d48-6234-401b-80fa-85c18fea0f31","timestamp":1749175926052,"gateway":"8UUXN4P00A06NK"} + +{"bid":"853cce80-0642-4c00-ab84-c5dce7cce721","data":{"firmware_version":"13.01.0002"},"tid":"17a08ba4-4fc7-40ba-9567-d23c86867499","timestamp":1749175926056,"gateway":"8UUXN4P00A06NK"} + +{"tid":"2a726c23-88c2-4667-877a-82720ddaf556","bid":"51cf4550-aed6-4f1a-8efd-15d95b22759c","timestamp":1749175926389,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"64dad810-093a-4da8-b173-5cba4fd9a344","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c0b6c135-8b0a-47c8-9cc8-efb4a2ffb6a4","timestamp":1749175926535,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b6b3660f-2e63-411e-952f-b6312afe8b75","data":{"dongle_infos":[]},"tid":"57125191-111e-4177-9341-cc142b26fdfe","timestamp":1749175927086,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5f24ebdf-3c76-401a-b07d-0d4bcb88804d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b96dec44-5ccc-44f8-989a-46abf6896648","timestamp":1749175928190,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cf74b9a3-b7f2-42c4-800c-e85daac24415","data":{"mobility_status_notify":0},"need_reply":1,"tid":"52a50d48-6234-401b-80fa-85c18fea0f31","timestamp":1749175928191,"gateway":"8UUXN4P00A06NK"} + +{"tid":"96b2be2c-d1b4-4511-9d65-f5b4ac79242d","bid":"c2557503-d989-407d-9933-075690c7f9de","timestamp":1749175952726,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"8b32662c-37b8-4c52-99cf-6e9f1460f807","bid":"539fc06c-f7d7-48c8-a86f-08d6937825a3","timestamp":1749175952731,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"25cce090-1eff-4904-97a4-16497a0e8500","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3901e81e-da00-4426-a717-ba8b157656a6","timestamp":1749175955271,"gateway":"8UUXN4P00A06NK"} + +{"bid":"037e803b-9d57-424c-ae2f-8edf06f8022c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"82b9987f-b3af-4a64-a926-5e98c0678150","timestamp":1749175957257,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a873bd10-e39a-4ea2-92f2-9f5cd5ff36ad","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"adda6a48-4536-44ab-a2c1-073ea2aeb4d9","timestamp":1749175957260,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fb87d4f6-346b-459a-a085-2f110536af9b","data":{"dongle_infos":[]},"tid":"c6c2cf68-401b-4386-8980-81ca698c4855","timestamp":1749175957676,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fd46c7f3-8b98-4534-8acc-02e5d60b81a2","data":{"firmware_version":"13.01.0002"},"tid":"f316a365-d842-46f5-979d-9349c34076e3","timestamp":1749175957683,"gateway":"8UUXN4P00A06NK"} + +{"bid":"85d7cccf-2b58-4fd7-98d7-c7223ecbca59","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a5a4d27b-140e-4717-806e-35e54964a5ff","timestamp":1749175957727,"gateway":"8UUXN4P00A06NK"} + +{"bid":"25cce090-1eff-4904-97a4-16497a0e8500","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3901e81e-da00-4426-a717-ba8b157656a6","timestamp":1749175957889,"gateway":"8UUXN4P00A06NK"} + +{"tid":"6c61b950-0c65-40ac-9407-c32b1e609f0a","bid":"69f9fdce-430a-4b7d-829a-699ce3712c3f","timestamp":1749175958143,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"76beac09-8385-4445-8f15-d5d60b4437a7","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ad9ffd56-8bca-441b-a4d2-5f3f059468f1","timestamp":1749175958297,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ac4a69ed-5a5d-4534-8453-2621ff670232","data":{"dongle_infos":[]},"tid":"d5329a95-bc8e-4fb1-9def-326c086920ac","timestamp":1749175958712,"gateway":"8UUXN4P00A06NK"} + +{"bid":"037e803b-9d57-424c-ae2f-8edf06f8022c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"82b9987f-b3af-4a64-a926-5e98c0678150","timestamp":1749175959403,"gateway":"8UUXN4P00A06NK"} + +{"tid":"35991167-4259-47b9-b37a-dcdaf41b159f","bid":"64582283-7148-44b2-a471-355e9df4e2a0","timestamp":1749175982167,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"a19fdbce-5576-48dc-80af-0f04d27e4b19","bid":"d30f450f-3d3b-42bc-97f6-c9864254ae06","timestamp":1749175982211,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"a153139e-2b87-4801-b336-61cbbcfeb47d","bid":"b13e0461-36aa-491b-923f-489e158991f7","timestamp":1749175982846,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"fe109673-455e-461c-8dcb-d5679ff6f7e0","bid":"100fbbf7-66fa-4e62-b099-66a7d84db1d0","timestamp":1749175982849,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"e468dd79-d007-4167-8728-087aee2a456d","bid":"37a90819-2e16-4b8f-990f-d40789700fbd","timestamp":1749175982852,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"2fc08203-c6ab-419e-9f2f-f32e035fda1d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2c7ffce7-ab53-42d6-83c9-52c97e9a3b5e","timestamp":1749175984645,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8597a71d-ba93-4504-8e88-89447e38db2e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"2e70147c-0310-40b3-a3fe-2a1a03a694ba","timestamp":1749175987211,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d2037bc4-cf50-42db-8b8c-5fd61118c1c1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"599ebbc2-e1ec-4c2b-b36a-ba44c2004ca9","timestamp":1749175987227,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d6355157-80e8-44c1-b343-140072850d1a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"b1be041f-ea2e-45d4-b52e-02a459c41489","timestamp":1749175987230,"gateway":"8UUXN4P00A06NK"} + +{"bid":"863382a2-eb8a-42bf-9863-07afbcd332a4","data":{"dongle_infos":[]},"tid":"7b292db7-ec24-4010-9d49-e64a0e6c2468","timestamp":1749175987238,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e436c31d-79ad-4594-a993-7d27ec8b8f6a","data":{"firmware_version":"13.01.0002"},"tid":"97c900dc-0f1c-43d2-b1eb-6c3ffed35a64","timestamp":1749175987249,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2fc08203-c6ab-419e-9f2f-f32e035fda1d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2c7ffce7-ab53-42d6-83c9-52c97e9a3b5e","timestamp":1749175987371,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b6793083-e3a7-4f14-b3d7-163b7097f957","bid":"7ae2315a-6065-42b8-bfb3-631d810b5726","timestamp":1749175987796,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"06f89807-c5ed-4d24-98a2-7bc177f4fc06","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f6b5b9e4-507e-452f-908d-954e20625b89","timestamp":1749175987843,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cb213802-368a-464e-a62f-b6dd50e37434","data":{"dongle_infos":[]},"tid":"48a00de1-2283-4af0-8bcc-b9481d74d7e6","timestamp":1749175988231,"gateway":"8UUXN4P00A06NK"} + +{"tid":"bf1c9142-e6fc-4c08-abe6-ca81b09b7926","bid":"d3fbe15f-448d-4858-ac97-959ea14822a7","timestamp":1749176013021,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"32fd1ae0-6eb0-41ba-80dd-678bbf32e18e","bid":"10a9787e-270f-4c45-8fa6-64da6548e99c","timestamp":1749176013024,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"c1ed0942-13f7-4c06-98a6-8ec0ea378057","bid":"597b0667-1fb0-4e09-adde-c6a8d3d59571","timestamp":1749176014068,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"d86b2d38-355e-441f-932d-2d3463af5a60","bid":"19191f91-1069-446d-9bb6-fe5dbcaf1805","timestamp":1749176014070,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"561f3d05-08f6-4709-bc9a-4c9aef4344cc","bid":"6ff58e74-67d3-4d9f-b0c3-be156e7beb15","timestamp":1749176014076,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"70975e56-56bd-4254-9219-0d610e2925c2","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7040e3bb-02c8-48a4-adcf-6703418c16ee","timestamp":1749176015238,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ef5af824-9881-4f20-a06e-5a18ead4dfa4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"70866f86-5cec-4e20-bfa2-cf1608645d56","timestamp":1749176017147,"gateway":"8UUXN4P00A06NK"} + +{"bid":"70975e56-56bd-4254-9219-0d610e2925c2","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7040e3bb-02c8-48a4-adcf-6703418c16ee","timestamp":1749176017833,"gateway":"8UUXN4P00A06NK"} + +{"bid":"202500b8-6f9e-4676-b746-11fd4060020d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"35dd4bee-56c9-4884-b53d-6bfa2cbff38c","timestamp":1749176017922,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2548aa09-3c2d-41c8-b0c3-d0b6b08287af","data":{"dongle_infos":[]},"tid":"9d3fdc23-cff4-4282-a70e-00a3005c3858","timestamp":1749176017941,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7c170e80-8a60-4d09-a63f-748ddc9cdabe","data":{"mobility_status_notify":0},"need_reply":1,"tid":"b8ab38aa-76ad-46e7-aa11-57fc32d82269","timestamp":1749176017947,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dbee9c81-82b4-451c-91ab-fa4f04827344","data":{"firmware_version":"13.01.0002"},"tid":"206ee611-1cce-4e40-924a-b2c37a712511","timestamp":1749176017954,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cf256b13-432a-43cc-bb95-0d2037916cd5","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c2917455-3382-4d77-87f8-fe499a7ceb5a","timestamp":1749176018024,"gateway":"8UUXN4P00A06NK"} + +{"tid":"a9106518-09b5-4854-a385-b05a75bb1f6a","bid":"279d847f-5415-4208-ac98-c5d3052f6d09","timestamp":1749176018241,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"ba988996-498e-4501-adc0-08fe20b38852","data":{"dongle_infos":[]},"tid":"aa9caedb-dda9-44ed-95b0-3d886e367e61","timestamp":1749176018987,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6b126dfe-388b-4f8d-bbb0-c98af70f4654","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ab51b2d6-b91f-45dd-bc36-e235632c0a51","timestamp":1749176019070,"gateway":"8UUXN4P00A06NK"} + +{"tid":"8c7a276c-0e14-453a-8feb-2767a25c947a","bid":"e39933b1-75b7-4565-a0b2-d4e4e44e4c06","timestamp":1749176043600,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"f9daed4b-8929-4ab2-9491-c30f31fb3381","bid":"eaaf4b09-34b6-4eb5-8646-6c2260500137","timestamp":1749176043603,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"d5a7d93e-bdd5-4544-a2f7-ec509dd5ba2e","bid":"74c914d3-3cb9-4aca-98af-329cd70f97a3","timestamp":1749176052087,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"21c575d8-7446-4844-a2a6-44d02d0f844b","bid":"2485b8ec-264a-4221-8a82-338f11ef257b","timestamp":1749176052088,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"tid":"cbbbf7f7-4eb8-4df6-acf5-1ce5c3ca0dfb","bid":"5f4b772c-1415-41b8-baee-7729792f79dd","timestamp":1749176052089,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f5650155-90f2-4580-af3e-96794d4c2b91","data":{"dongle_infos":[]},"tid":"13726e5d-5390-41d7-bf9a-228297d30669","timestamp":1749176052151,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a562a086-af4c-4ab2-bbe9-8011e923eba1","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8efeea9c-374e-4259-acf7-3a2f2b56106c","timestamp":1749176052313,"gateway":"8UUXN4P00A06NK"} + +{"bid":"44827752-d795-447f-8f65-fbf5fd33d20c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"469d00c2-c728-4a31-a7e3-48b8956452f0","timestamp":1749176053606,"gateway":"8UUXN4P00A06NK"} + +{"bid":"60e17e26-ddd1-4599-a4d5-77a29347f426","data":{"departure_trajectory":[]},"tid":"00837a53-2462-44ef-abe6-9e02e65e6f26","timestamp":1749176053654,"gateway":"8UUXN4P00A06NK"} + +{"bid":"322ad0d5-a17a-4d00-b7be-702ab54ba60c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"96948a23-1a46-4a4a-8402-38f9e2822644","timestamp":1749176053730,"gateway":"8UUXN4P00A06NK"} + +{"bid":"67893a49-673e-42de-bdf5-d6e306fc5790","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"106d9a53-eed1-482e-819b-06b46069b0fc","timestamp":1749176054930,"gateway":"8UUXN4P00A06NK"} + +{"bid":"be463f68-873f-405e-bc03-ba344a9ef212","data":{"departure_trajectory":[]},"tid":"2b5b02a4-a253-4fa7-b955-eddde74aa2d4","timestamp":1749176055484,"gateway":"8UUXN4P00A06NK"} + +{"bid":"44827752-d795-447f-8f65-fbf5fd33d20c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"469d00c2-c728-4a31-a7e3-48b8956452f0","timestamp":1749176055732,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e6d4e228-ed92-41e5-8bb2-5f4cf91b1fa6","data":{"dongle_infos":[]},"tid":"0d3fa052-26a7-48c3-8660-8d6036bb67e4","timestamp":1749176057089,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c442e344-e898-44bd-810f-285af885956c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5855acb8-4121-423a-9f59-196a8570f6ca","timestamp":1749176057092,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e760ffc3-ab67-44dd-9a0b-a4cd03d71fde","data":{"departure_trajectory":[]},"tid":"bcf87d2d-cabf-4d30-82fd-abf93afff429","timestamp":1749176057091,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6818b1c5-59d0-47d2-a448-071fe79642de","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6a7a18f6-01b9-4144-8088-fbb15b2ff716","timestamp":1749176058608,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a562a086-af4c-4ab2-bbe9-8011e923eba1","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8efeea9c-374e-4259-acf7-3a2f2b56106c","timestamp":1749176060513,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6818b1c5-59d0-47d2-a448-071fe79642de","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6a7a18f6-01b9-4144-8088-fbb15b2ff716","timestamp":1749176060732,"gateway":"8UUXN4P00A06NK"} + +{"tid":"a9c3b6d4-5809-4226-b26d-546c7fb949d1","bid":"6aac02b2-8860-4856-8c68-649f0f302387","timestamp":1749176086719,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"b5645428-a4f5-467a-9322-49002bccf894","bid":"214b966b-0899-4712-bca4-b62f903c1b06","timestamp":1749176086725,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"8c350207-623a-4d8e-84a0-f6e3fbbdf6c4","data":{"air_transfer_enable":false},"need_reply":1,"tid":"db2e253b-fc6d-46b9-b5be-d7d1dfbd10aa","timestamp":1749176086810,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1e04ac07-7d2b-41c6-9378-f2035a7f326f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"23fa7708-cd4d-41ea-a4a6-7195a1ef9164","timestamp":1749176089030,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ed38889a-5a6f-4528-964a-cae15aebb424","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"157fb08a-0c7a-4654-81e7-20f999571bf4","timestamp":1749176089053,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8c350207-623a-4d8e-84a0-f6e3fbbdf6c4","data":{"air_transfer_enable":false},"need_reply":1,"tid":"db2e253b-fc6d-46b9-b5be-d7d1dfbd10aa","timestamp":1749176089426,"gateway":"8UUXN4P00A06NK"} + +{"bid":"653a16d2-2aff-49e7-b2cc-79555d1348ec","data":{"dongle_infos":[]},"tid":"7dfc409d-a2f5-4738-961a-25333edceeab","timestamp":1749176089433,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a5a9e157-4731-4974-8adb-2729ee3f69b3","data":{"firmware_version":"13.01.0002"},"tid":"8ab72d9f-c2a1-4186-b746-637c365f868d","timestamp":1749176089442,"gateway":"8UUXN4P00A06NK"} + +{"tid":"2c9607fd-b03c-49d6-b0bc-0950c4b0a680","bid":"3b1c3f5b-0233-487c-9168-770085f2d89b","timestamp":1749176089762,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"fc629c0a-6f8b-4e14-bde1-99729a909c58","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"36a838c0-c163-4d25-b6e7-0966ee3daaff","timestamp":1749176090187,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d9ebf774-d352-430e-9b2b-4cab9e980ea5","data":{"dongle_infos":[]},"tid":"52c17a76-9f3a-456d-95ab-ea36799f55b0","timestamp":1749176090444,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1e04ac07-7d2b-41c6-9378-f2035a7f326f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"23fa7708-cd4d-41ea-a4a6-7195a1ef9164","timestamp":1749176091130,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ed38889a-5a6f-4528-964a-cae15aebb424","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"157fb08a-0c7a-4654-81e7-20f999571bf4","timestamp":1749176091131,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e713204e-4733-4395-8c71-f0bc3a723b94","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c9834468-9b18-4389-874b-ab3883fa0078","timestamp":1749176091721,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fc629c0a-6f8b-4e14-bde1-99729a909c58","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"36a838c0-c163-4d25-b6e7-0966ee3daaff","timestamp":1749176092328,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c1b58882-f35a-4dc9-a583-957de16bb6c6","data":{"dongle_infos":[]},"tid":"2cec9021-b54e-4125-9044-0354e6a22276","timestamp":1749176092841,"gateway":"8UUXN4P00A06NK"} + +{"tid":"cc93c6db-1c2a-47f8-bb47-087aa8a371af","bid":"899947d8-1ea6-4857-ab02-f4aeea425942","timestamp":1749176119799,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"f5ce2bd1-9136-4c30-86ed-c4ccdd352414","bid":"1d6788dd-42f8-4cb2-8810-79e60846a61b","timestamp":1749176119801,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"5ce2f3f1-2612-45d3-84d6-83acdb22cb5b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c7486463-46ad-4cb9-b518-35e9118db4dc","timestamp":1749176120869,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ef31f3e2-4c2b-4cc7-97df-8cb0fd044f5f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7fea321a-6e6a-425f-a479-31982a713b7a","timestamp":1749176121511,"gateway":"8UUXN4P00A06NK"} + +{"bid":"53505fca-9b4d-493e-9d3a-f5df995a8b89","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"98c95ab7-bc53-45f8-a108-f6ec83cfc1ca","timestamp":1749176121512,"gateway":"8UUXN4P00A06NK"} + +{"bid":"781fae3d-cbbf-4a58-9a21-241b0f20426e","data":{"dongle_infos":[]},"tid":"b4ac6a82-24bd-4c5a-8c6d-190b0bf87015","timestamp":1749176121529,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d9ee52af-660d-42b2-9edc-a0c1cdd00f5f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"14604a7c-1722-42db-92a3-6ad95e4322a0","timestamp":1749176121536,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1c1ef92-ee5c-4c80-a2eb-f56a4a073aee","data":{"firmware_version":"13.01.0002"},"tid":"4e6039fc-ad34-42ee-8230-01d6a1c1bd41","timestamp":1749176121544,"gateway":"8UUXN4P00A06NK"} + +{"tid":"9e541fda-a9ef-4ece-b035-979ae3ae77ae","bid":"1c1da634-b63f-4e9a-b4ce-acd35ea7ca48","timestamp":1749176121757,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"6aa38ec8-f2ff-49e4-a9ac-83dfbcfd5490","data":{"dongle_infos":[]},"tid":"1dd186cf-966c-4057-a562-07aae298940d","timestamp":1749176122537,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5ce2f3f1-2612-45d3-84d6-83acdb22cb5b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c7486463-46ad-4cb9-b518-35e9118db4dc","timestamp":1749176122912,"gateway":"8UUXN4P00A06NK"} + +{"bid":"53505fca-9b4d-493e-9d3a-f5df995a8b89","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"98c95ab7-bc53-45f8-a108-f6ec83cfc1ca","timestamp":1749176123710,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d9ee52af-660d-42b2-9edc-a0c1cdd00f5f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"14604a7c-1722-42db-92a3-6ad95e4322a0","timestamp":1749176123711,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c48e2bf-5315-44c8-a646-a9f1d0d2d103","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ef611f4f-7e8f-4e7f-88c4-cd3fa8ae744c","timestamp":1749176124793,"gateway":"8UUXN4P00A06NK"} + +{"bid":"07198bf1-f5f2-4570-af13-2200d8d53d6f","data":{"dongle_infos":[]},"tid":"5a12f022-7bf9-403f-88ee-d8a426309a76","timestamp":1749176125684,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ef31f3e2-4c2b-4cc7-97df-8cb0fd044f5f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7fea321a-6e6a-425f-a479-31982a713b7a","timestamp":1749176125714,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a573e49d-1d88-44ea-9e97-8764df67289c","data":{"departure_trajectory":[]},"tid":"fdde714c-32d0-4dbc-bfb6-81fe1b96fb0b","timestamp":1749176126512,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6189ac92-fad2-47d7-adbd-0c29541e994f","data":{"departure_trajectory":[]},"tid":"46a201bc-d920-4c7d-aef6-ae9790033a9e","timestamp":1749176126523,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c48e2bf-5315-44c8-a646-a9f1d0d2d103","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ef611f4f-7e8f-4e7f-88c4-cd3fa8ae744c","timestamp":1749176126911,"gateway":"8UUXN4P00A06NK"} + +{"bid":"53505fca-9b4d-493e-9d3a-f5df995a8b89","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"98c95ab7-bc53-45f8-a108-f6ec83cfc1ca","timestamp":1749176127910,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d9ee52af-660d-42b2-9edc-a0c1cdd00f5f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"14604a7c-1722-42db-92a3-6ad95e4322a0","timestamp":1749176127910,"gateway":"8UUXN4P00A06NK"} + +{"bid":"78acacd3-57ad-4689-8f9d-79826091dfc5","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b3086139-eb19-4c56-8e37-2db03dad4a35","timestamp":1749176129793,"gateway":"8UUXN4P00A06NK"} + +{"bid":"78acacd3-57ad-4689-8f9d-79826091dfc5","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b3086139-eb19-4c56-8e37-2db03dad4a35","timestamp":1749176131910,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c202d1ed-8b10-4e9f-903c-86a1f3b49f3a","bid":"d50a4bd7-ea55-4bb6-ba54-9a3c947d879f","timestamp":1749176159376,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"84ad2460-a03e-474a-a5ce-ea68e38c48f9","bid":"f23eb94f-8589-4357-ba75-ba0690b12cfb","timestamp":1749176159386,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"dfd09755-fd80-471e-893c-5f591ec3d0b8","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e44e6235-5026-4f84-bfa4-992f84a134dc","timestamp":1749176160914,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3628f498-7886-4597-ae64-e7463f5f5e3e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d23cf8aa-03ae-4f32-89c5-e61d630e8de9","timestamp":1749176160931,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d366ba99-c659-4816-b455-9e75241cd0de","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c1095d50-fdff-4a65-b86f-3ad4ff2defcb","timestamp":1749176160933,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cbf71ad7-49f2-47de-a203-b88671ec0fed","data":{"air_transfer_enable":false},"need_reply":1,"tid":"dbdec4c2-05f4-4b2d-98ac-e6f36d9230cb","timestamp":1749176160951,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0032ea97-09d8-42cb-8345-daa6fb1afedb","data":{"dongle_infos":[]},"tid":"299fa8f9-f75a-42e4-8e96-9d95ce571a84","timestamp":1749176160956,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4031fb67-f42f-4f93-93a7-90546812175c","data":{"firmware_version":"13.01.0002"},"tid":"5e54a496-4ce7-4071-87a7-6389a8d5530d","timestamp":1749176160965,"gateway":"8UUXN4P00A06NK"} + +{"tid":"69ee08a1-634c-4d0c-a22e-678e65fd5232","bid":"cb7876b8-b375-4648-a240-b4bc65f54c9e","timestamp":1749176161127,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"21378596-1162-421b-baeb-0cf9cd2bec33","data":{"dongle_infos":[]},"tid":"85873be5-9f9e-45b3-8798-6836a84e8e74","timestamp":1749176161959,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dfd09755-fd80-471e-893c-5f591ec3d0b8","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e44e6235-5026-4f84-bfa4-992f84a134dc","timestamp":1749176163002,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3628f498-7886-4597-ae64-e7463f5f5e3e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d23cf8aa-03ae-4f32-89c5-e61d630e8de9","timestamp":1749176163003,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d366ba99-c659-4816-b455-9e75241cd0de","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c1095d50-fdff-4a65-b86f-3ad4ff2defcb","timestamp":1749176163004,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ed225578-c4e5-4786-8303-28259120ffe2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ac84d94c-67a7-41c0-b34e-f93ec69b32eb","timestamp":1749176164384,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0b560783-fdea-412a-8163-c2dac8c4201a","data":{"dongle_infos":[]},"tid":"f5e0c5f1-21dd-446b-a4c5-7fb7eb345ea1","timestamp":1749176165118,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cbf71ad7-49f2-47de-a203-b88671ec0fed","data":{"air_transfer_enable":false},"need_reply":1,"tid":"dbdec4c2-05f4-4b2d-98ac-e6f36d9230cb","timestamp":1749176165148,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1a99ee5e-428e-4e8e-9081-ca5049951953","data":{"departure_trajectory":[]},"tid":"9328e15e-bd8c-4684-b260-d1dfa401a82b","timestamp":1749176165951,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6f54274e-9b90-405f-9523-2c8a838a9631","data":{"departure_trajectory":[]},"tid":"b20da2f9-3ca6-4d16-8ba4-8d1d6d133e19","timestamp":1749176166067,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ed225578-c4e5-4786-8303-28259120ffe2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ac84d94c-67a7-41c0-b34e-f93ec69b32eb","timestamp":1749176166403,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dfd09755-fd80-471e-893c-5f591ec3d0b8","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e44e6235-5026-4f84-bfa4-992f84a134dc","timestamp":1749176167200,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3628f498-7886-4597-ae64-e7463f5f5e3e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d23cf8aa-03ae-4f32-89c5-e61d630e8de9","timestamp":1749176167202,"gateway":"8UUXN4P00A06NK"} + +{"bid":"01ab4fcf-6e49-44a9-8914-f2495613c70a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"68f13201-6b99-4e83-95c9-81bf4dd0c89a","timestamp":1749176169390,"gateway":"8UUXN4P00A06NK"} + +{"bid":"01ab4fcf-6e49-44a9-8914-f2495613c70a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"68f13201-6b99-4e83-95c9-81bf4dd0c89a","timestamp":1749176171400,"gateway":"8UUXN4P00A06NK"} + +{"tid":"9164b074-c79c-44d5-9c02-a8b14fe05f23","bid":"307e4828-4cc6-4507-96f6-a8333cd50d31","timestamp":1749176195965,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"56a0869e-51c2-48f2-b66d-f05e50ba486a","bid":"1d6842df-26fa-49e7-b5d4-8eff8c73295c","timestamp":1749176195970,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"04798096-68ad-4d32-a7a8-b026c2821552","data":{"air_transfer_enable":false},"need_reply":1,"tid":"adb56c6a-78e3-4eca-a573-a8a1ee79f64e","timestamp":1749176196877,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dba27b6a-68e5-4d5c-b0bb-f55962e03675","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7b48ca9e-f894-4d40-ad54-fccf08616609","timestamp":1749176198931,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b30dabda-7056-4607-9174-828d66d16c1e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1efde05f-5c25-40c9-b250-fac8f1fb68e5","timestamp":1749176198982,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9810909c-7f18-4c7c-b34b-085b99453b98","data":{"dongle_infos":[]},"tid":"2e355cde-960e-4df5-8ac8-b37ea4585d8c","timestamp":1749176199350,"gateway":"8UUXN4P00A06NK"} + +{"bid":"73ca0975-596e-4e68-a344-397e3eafe227","data":{"firmware_version":"13.01.0002"},"tid":"c8bd91de-a667-4a40-9dfb-dd06c0eeb991","timestamp":1749176199356,"gateway":"8UUXN4P00A06NK"} + +{"bid":"04798096-68ad-4d32-a7a8-b026c2821552","data":{"air_transfer_enable":false},"need_reply":1,"tid":"adb56c6a-78e3-4eca-a573-a8a1ee79f64e","timestamp":1749176199543,"gateway":"8UUXN4P00A06NK"} + +{"tid":"3f52dd3a-3b28-4047-b4c6-4b1ec731d128","bid":"8b5359b2-ac11-466a-8117-3db21ccf8166","timestamp":1749176199940,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"24cfde93-ea06-4720-8513-e36b6491dc6b","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"8e46c4f0-4283-44af-bfc3-558c7af2a028","timestamp":1749176200065,"gateway":"8UUXN4P00A06NK"} + +{"bid":"be5a8e83-8031-4ecd-b986-43762c08f90a","data":{"dongle_infos":[]},"tid":"5de882b7-470a-4f80-82ca-e92ab3ca3859","timestamp":1749176200369,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dba27b6a-68e5-4d5c-b0bb-f55962e03675","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7b48ca9e-f894-4d40-ad54-fccf08616609","timestamp":1749176200956,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3b8f23d8-dd15-49a9-ad87-f8fc8073ee24","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ddffaa1f-6c66-4c0b-bceb-d58588a0a1a8","timestamp":1749176200971,"gateway":"8UUXN4P00A06NK"} + +{"bid":"24cfde93-ea06-4720-8513-e36b6491dc6b","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"8e46c4f0-4283-44af-bfc3-558c7af2a028","timestamp":1749176202158,"gateway":"8UUXN4P00A06NK"} + +{"tid":"6a73d102-6300-485f-a5f3-3c204b35f7aa","bid":"eebc1ba3-9a80-41d8-934f-a299f5f2dfb7","timestamp":1749176229420,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"290d726c-b615-42bc-8508-a4d2114cbb86","bid":"be8751d3-c395-4923-9f66-aa40de9ec520","timestamp":1749176229423,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"bca9470d-88ad-430e-a6be-fa5afbe97bd9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"8bd23f0c-4410-4d65-81c8-b8c5f8a43f8d","timestamp":1749176230103,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1a691e2e-a4a0-4be7-baf9-b533783ee1ba","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"33f8affb-9caf-4b82-92a7-cb18c5efbde0","timestamp":1749176230386,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a14ad94f-49b5-4199-b8d1-67b830ff3a3f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"58643b7e-c2e6-4490-9390-f648ca7f05d0","timestamp":1749176230526,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4d885459-1cf6-4715-b71a-1e7d93511d9b","data":{"dongle_infos":[]},"tid":"b3454194-b18e-4b89-936f-86f85f9f3761","timestamp":1749176230532,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1e13c18f-e234-4fb5-9711-04d0d7ebd19d","data":{"firmware_version":"13.01.0002"},"tid":"e1574dd8-21e1-495b-9427-8ba93daccde6","timestamp":1749176230540,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b37855a1-c092-416d-afb2-45623f58b9fb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b49e26ab-c6c7-4380-afa4-f5aa015660dd","timestamp":1749176231282,"gateway":"8UUXN4P00A06NK"} + +{"bid":"315a7b6b-f483-43a3-84f8-5a2160cd3001","data":{"dongle_infos":[]},"tid":"cbbc0d59-af47-4b32-85da-07e900e4b75d","timestamp":1749176231533,"gateway":"8UUXN4P00A06NK"} + +{"tid":"bd4553e9-63dc-41da-9262-8751366b6473","bid":"b2cb661c-d674-4808-90d1-421ddb248bb0","timestamp":1749176231603,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"bca9470d-88ad-430e-a6be-fa5afbe97bd9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"8bd23f0c-4410-4d65-81c8-b8c5f8a43f8d","timestamp":1749176232201,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1a691e2e-a4a0-4be7-baf9-b533783ee1ba","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"33f8affb-9caf-4b82-92a7-cb18c5efbde0","timestamp":1749176232400,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b37855a1-c092-416d-afb2-45623f58b9fb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b49e26ab-c6c7-4380-afa4-f5aa015660dd","timestamp":1749176233399,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4fee3d52-b4b0-4051-9345-7d1900fbbd4e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8e3221b5-f618-4b9c-afc8-8989fbb768f3","timestamp":1749176234421,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b8a91aa3-95ca-4761-b109-c2b819f7e0da","data":{"dongle_infos":[]},"tid":"a0ef4c77-10de-48ed-8f8f-037618873af8","timestamp":1749176234667,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a14ad94f-49b5-4199-b8d1-67b830ff3a3f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"58643b7e-c2e6-4490-9390-f648ca7f05d0","timestamp":1749176234729,"gateway":"8UUXN4P00A06NK"} + +{"bid":"159b5bdc-7898-4762-bff2-548f9dfa6b8f","data":{"departure_trajectory":[]},"tid":"bf5482c7-d6e6-4a68-befa-a8efd1904945","timestamp":1749176235527,"gateway":"8UUXN4P00A06NK"} + +{"bid":"952d6b57-988c-4ef1-8367-e48816ccc36c","data":{"departure_trajectory":[]},"tid":"8cb5021e-f5ff-4cef-a06c-980ee07563af","timestamp":1749176236087,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bca9470d-88ad-430e-a6be-fa5afbe97bd9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"8bd23f0c-4410-4d65-81c8-b8c5f8a43f8d","timestamp":1749176236398,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4fee3d52-b4b0-4051-9345-7d1900fbbd4e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8e3221b5-f618-4b9c-afc8-8989fbb768f3","timestamp":1749176236600,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b37855a1-c092-416d-afb2-45623f58b9fb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b49e26ab-c6c7-4380-afa4-f5aa015660dd","timestamp":1749176237599,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dc5ebae7-b1bd-43b4-bf00-b7dd0a6593e2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f794c92d-46ce-46c5-9a9a-21491b35c353","timestamp":1749176239420,"gateway":"8UUXN4P00A06NK"} + +{"tid":"73813003-31ba-41ca-a5d0-ffa887d27797","bid":"a49ccd6b-9291-46b4-bc5a-a86e102b9475","timestamp":1749176267041,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"2b9886a3-b97a-4265-9b68-e784840c5343","bid":"c522fb8d-194d-4b92-8d96-12409d6ab371","timestamp":1749176267044,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"2b606d13-5da3-4367-8b51-a5e969c47d42","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e57781a8-fce3-49fe-a710-e7117009a043","timestamp":1749176268026,"gateway":"8UUXN4P00A06NK"} + +{"tid":"7cc782ea-54aa-49fe-8400-ccd7685163fa","bid":"2fd10531-791d-4de4-99d6-ef2776839a32","timestamp":1749176300666,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"a8b247d8-d7ac-4e15-89f5-abc21af4ba1a","bid":"af572b6a-a12f-4dde-93a2-dfa0ce963e9b","timestamp":1749176300669,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"09058be4-553e-44a7-ba86-5cdd3f915489","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ecd25284-5a08-4c64-9c8e-ab8f0edc557c","timestamp":1749176301925,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0c09dac0-7b38-45f1-8133-0b2bd83d8127","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f10fafb3-60e0-4d0e-897e-66fcb4652b2d","timestamp":1749176301950,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c24a9f23-7728-4190-87e2-21caec24444a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"85f51d29-564c-48f0-9626-29245ebf2ae2","timestamp":1749176301956,"gateway":"8UUXN4P00A06NK"} + +{"bid":"46ee66ce-fc59-4b19-8277-37c95d866ac4","data":{"air_transfer_enable":false},"need_reply":1,"tid":"f6adb456-c50f-4602-81ad-3f689c0b4fbf","timestamp":1749176301994,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1df4b045-b2d1-4ab3-9cda-9d32abd8f72d","data":{"dongle_infos":[]},"tid":"81b20a00-5848-47de-b727-90720afecd04","timestamp":1749176302001,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d153786a-1363-4b55-9cf9-cd5aa5e89fd7","data":{"firmware_version":"13.01.0002"},"tid":"e220ec75-7d6a-4773-a0a7-5634d9ad9450","timestamp":1749176302007,"gateway":"8UUXN4P00A06NK"} + +{"tid":"2519dc1f-4a25-4c50-8842-4cc66eae8b6b","bid":"c42a9ea8-8715-461a-b3d8-c9d3d3cc9054","timestamp":1749176302353,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"281be972-bdb5-45bf-8588-603e17a5bf01","data":{"dongle_infos":[]},"tid":"2f5c7d59-b06c-4db1-a15f-df68136d6bc3","timestamp":1749176303003,"gateway":"8UUXN4P00A06NK"} + +{"bid":"09058be4-553e-44a7-ba86-5cdd3f915489","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ecd25284-5a08-4c64-9c8e-ab8f0edc557c","timestamp":1749176304002,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0c09dac0-7b38-45f1-8133-0b2bd83d8127","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f10fafb3-60e0-4d0e-897e-66fcb4652b2d","timestamp":1749176304003,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c24a9f23-7728-4190-87e2-21caec24444a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"85f51d29-564c-48f0-9626-29245ebf2ae2","timestamp":1749176304004,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7784510b-2cdd-47f8-9002-45b6b413a314","data":{"dongle_infos":[]},"tid":"83c94fcc-e6f4-49de-be1b-ce1525e780f1","timestamp":1749176305144,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7288874c-eade-4020-9d9b-814b90a2af43","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"db888f34-2d24-4d08-8c99-ff62ad15b90e","timestamp":1749176305664,"gateway":"8UUXN4P00A06NK"} + +{"bid":"46ee66ce-fc59-4b19-8277-37c95d866ac4","data":{"air_transfer_enable":false},"need_reply":1,"tid":"f6adb456-c50f-4602-81ad-3f689c0b4fbf","timestamp":1749176306194,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1886fd52-cd31-4e76-8557-0a0ac2a85fab","data":{"departure_trajectory":[]},"tid":"1fe8e690-a1e3-4bb3-9bcc-d31383a9742b","timestamp":1749176306992,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d9b874c7-1a5a-41a7-b7c4-0defe3b5e043","data":{"departure_trajectory":[]},"tid":"08c8c56c-257d-438a-8cf5-b6190043cdfe","timestamp":1749176307443,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7288874c-eade-4020-9d9b-814b90a2af43","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"db888f34-2d24-4d08-8c99-ff62ad15b90e","timestamp":1749176307802,"gateway":"8UUXN4P00A06NK"} + +{"bid":"09058be4-553e-44a7-ba86-5cdd3f915489","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ecd25284-5a08-4c64-9c8e-ab8f0edc557c","timestamp":1749176308201,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c24a9f23-7728-4190-87e2-21caec24444a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"85f51d29-564c-48f0-9626-29245ebf2ae2","timestamp":1749176308201,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2df5c3a9-9146-4634-b84a-364ed82f5877","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"aab264e8-3cbc-4dfb-8089-a5d85bbe4621","timestamp":1749176310666,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2df5c3a9-9146-4634-b84a-364ed82f5877","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"aab264e8-3cbc-4dfb-8089-a5d85bbe4621","timestamp":1749176312798,"gateway":"8UUXN4P00A06NK"} + +{"tid":"4b50f6b2-b107-48ea-9284-171d5dee0630","bid":"5fb96818-14d6-43cc-8a95-bff1c5569593","timestamp":1749176336818,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"69b9ea87-d0fb-436f-a483-e9b26f454119","bid":"8ab4aae4-ce79-4a74-b224-cb505224d8f7","timestamp":1749176336820,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"b1e1562f-4613-48d3-a0ce-3f8223595bac","bid":"14a080b6-2880-46a9-8cdf-1851f774b966","timestamp":1749176337708,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"c4a8c9a7-2809-42eb-bc3f-e217f0c839fc","bid":"deec76af-db03-4790-a52c-4da6c90b2723","timestamp":1749176337711,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"f603748a-f4f4-4483-b76b-6e1c4ff14150","bid":"1ccb716a-482b-4f89-9af0-c85bb85a9cdf","timestamp":1749176337713,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"64465478-4a8a-414e-aabb-a0a471ea8454","data":{"air_transfer_enable":false},"need_reply":1,"tid":"bf2aeac7-88dc-47f5-9283-9b547eb61085","timestamp":1749176339125,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9eccb848-638a-497a-99f8-9e7d0a0d1825","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"fe9114cd-c65e-4897-a2ea-7c5956bffbc8","timestamp":1749176341081,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d32a2b0c-2493-4b42-9ad0-d6be06718367","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a960f17a-118d-44bf-aebd-de6210a70150","timestamp":1749176341689,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0a8d5b4c-6bab-4f5b-9a21-115dce35548f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"56b706d1-0ca8-4a35-94f6-da55b696148d","timestamp":1749176341702,"gateway":"8UUXN4P00A06NK"} + +{"bid":"13134149-d58c-4210-a26b-8b9cb056e842","data":{"dongle_infos":[]},"tid":"7b2da762-297e-41ce-b477-a49fb2bea406","timestamp":1749176341710,"gateway":"8UUXN4P00A06NK"} + +{"bid":"79feb573-a038-4f40-a824-8d531ab4297b","data":{"firmware_version":"13.01.0002"},"tid":"20015958-3439-4882-84d3-2dbd7e19b2b1","timestamp":1749176341721,"gateway":"8UUXN4P00A06NK"} + +{"bid":"97d4fbc5-a931-42b5-91c7-a8816188276b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"80e213e5-dbd8-45e6-9ed3-065923727043","timestamp":1749176341823,"gateway":"8UUXN4P00A06NK"} + +{"bid":"64465478-4a8a-414e-aabb-a0a471ea8454","data":{"air_transfer_enable":false},"need_reply":1,"tid":"bf2aeac7-88dc-47f5-9283-9b547eb61085","timestamp":1749176341859,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b301f15d-596c-42a5-b7ec-9b67287659c6","bid":"6c894767-9b04-4b6c-8939-a8ea7795f8c4","timestamp":1749176341940,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f91b2f13-cb29-47f8-9006-e8c6907f7e0e","data":{"dongle_infos":[]},"tid":"8004d12b-bca9-48bb-947b-b846cca3df60","timestamp":1749176342707,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3decd78b-e051-47a4-9d8f-d74c2d4a99fe","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9e9cae02-843a-472b-93a5-4c14d711214f","timestamp":1749176342710,"gateway":"8UUXN4P00A06NK"} + +{"tid":"5c741094-b82a-4aaa-a106-28171db4ea5b","bid":"a4da2a25-6d78-4809-b5b3-bf3789b2294b","timestamp":1749176367372,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"90d0ede3-d80b-4c7a-a33f-428423cdcef7","bid":"f17430aa-fed3-4936-9d00-73663e7cc188","timestamp":1749176367379,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"b87ff610-1f5d-4a2b-a2ed-a3d9a33024ea","bid":"9775c91e-99c7-49b9-a4ec-ac0fd71b4fb4","timestamp":1749176367738,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"c9dd0949-b7d9-444e-8e93-2b1783a465bd","bid":"4cda7b02-bb6d-4bd8-8b6c-361bacc02161","timestamp":1749176367742,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"99aa8efd-cdfe-4e89-a34e-d9bba7e26aad","bid":"f7e321bb-cba5-4598-a2ce-e4a13659fb1e","timestamp":1749176367747,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"5c77567c-07ac-4419-ab50-b4c57f98a7e8","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8fd03681-b35b-4906-9c63-380b3f586d38","timestamp":1749176369339,"gateway":"8UUXN4P00A06NK"} + +{"bid":"be0f445d-8d47-4e06-b383-15e2c8259360","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"11534d09-95f5-4cdc-b0cb-49e6eb14924a","timestamp":1749176371883,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8265d598-4cd0-4d07-836d-fa567fe84b16","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c49aa93c-d6c8-4430-9934-1d69126fbf8e","timestamp":1749176371898,"gateway":"8UUXN4P00A06NK"} + +{"bid":"518030a9-adfd-482c-a3ae-3e3b8b801e79","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7abf5c7d-5b0c-4983-8f80-c8d7d229b573","timestamp":1749176371904,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a2b4c3e7-d7db-4734-a1cf-8425d0338938","data":{"dongle_infos":[]},"tid":"ed45bd0c-cec3-4cf6-8973-707849e01396","timestamp":1749176371917,"gateway":"8UUXN4P00A06NK"} + +{"bid":"37f10562-586e-4997-806d-a3cf0ee52bce","data":{"firmware_version":"13.01.0002"},"tid":"e39b4738-5f98-4460-8bca-1fdb828db1c6","timestamp":1749176371923,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5c77567c-07ac-4419-ab50-b4c57f98a7e8","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8fd03681-b35b-4906-9c63-380b3f586d38","timestamp":1749176372096,"gateway":"8UUXN4P00A06NK"} + +{"tid":"f6104e19-15fb-41f2-83f6-a032835e64a4","bid":"d3e837d1-313e-487f-9b17-2c23beae510b","timestamp":1749176372287,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"ece5b13a-d96b-46ec-a66f-ff1d856b0240","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ae52e55c-14d7-4d43-904e-538f31ddc050","timestamp":1749176372378,"gateway":"8UUXN4P00A06NK"} + +{"bid":"37c3f1f5-aa6b-4927-8573-bc668be31ada","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"77ddc88b-15c2-42c7-8779-cb3f683b8eff","timestamp":1749176372746,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bbd29748-10a7-4720-a0c6-5bf062f5be7b","data":{"dongle_infos":[]},"tid":"41e09896-1778-479e-96fb-29853c60bd69","timestamp":1749176372914,"gateway":"8UUXN4P00A06NK"} + +{"bid":"be0f445d-8d47-4e06-b383-15e2c8259360","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"11534d09-95f5-4cdc-b0cb-49e6eb14924a","timestamp":1749176374052,"gateway":"8UUXN4P00A06NK"} + +{"bid":"518030a9-adfd-482c-a3ae-3e3b8b801e79","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7abf5c7d-5b0c-4983-8f80-c8d7d229b573","timestamp":1749176374053,"gateway":"8UUXN4P00A06NK"} + +{"tid":"20ad5199-35b5-4e38-89ff-0ac902cc4493","bid":"38a1a62e-c645-4adf-98d7-d2e8ca403bb6","timestamp":1749176399185,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"c11506f9-27e3-4bb6-b074-5f5404e85a5d","bid":"807ce134-2faf-4144-8e3d-03869283b77c","timestamp":1749176399195,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"51240c16-04fe-4463-a987-fd676a4f9ed9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7dc7ec23-4f85-4add-8c5c-29bc2463016f","timestamp":1749176399757,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4fff131a-8ad3-466b-8f35-466a090b6081","data":{"mobility_status_notify":0},"need_reply":1,"tid":"cbfad650-1835-4265-b664-fbedafbd6319","timestamp":1749176401740,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d594c22b-9271-4bb0-9369-9e29219bfcc0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"85ae03fb-287a-4c0d-aa40-e3e147b87f9b","timestamp":1749176401760,"gateway":"8UUXN4P00A06NK"} + +{"bid":"08988b4e-39b8-49da-a7ae-d21b81d26479","data":{"dongle_infos":[]},"tid":"518cbd4f-f05d-4bd6-9d3e-b1003da9da6a","timestamp":1749176402120,"gateway":"8UUXN4P00A06NK"} + +{"bid":"71016a16-70ad-43ca-9511-cce2ebcbc4cf","data":{"firmware_version":"13.01.0002"},"tid":"baccf445-529a-434e-bbd2-78c462a3e5c9","timestamp":1749176402146,"gateway":"8UUXN4P00A06NK"} + +{"bid":"51240c16-04fe-4463-a987-fd676a4f9ed9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7dc7ec23-4f85-4add-8c5c-29bc2463016f","timestamp":1749176402316,"gateway":"8UUXN4P00A06NK"} + +{"tid":"72ed9e57-cea5-47aa-ab15-674af3e82ed5","bid":"5efa40db-66c2-4f59-93d9-bcaa24575a04","timestamp":1749176402344,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"adc3ce42-0d12-4a3d-9625-8937e6948191","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a7670651-1939-46ea-a470-9d37ac8e9e70","timestamp":1749176402855,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8690e6c7-fe2b-41b7-94b1-c6b9c37fd15d","data":{"dongle_infos":[]},"tid":"24e64e50-d08e-4280-a306-7c38c4449b10","timestamp":1749176403128,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4fff131a-8ad3-466b-8f35-466a090b6081","data":{"mobility_status_notify":0},"need_reply":1,"tid":"cbfad650-1835-4265-b664-fbedafbd6319","timestamp":1749176403757,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d594c22b-9271-4bb0-9369-9e29219bfcc0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"85ae03fb-287a-4c0d-aa40-e3e147b87f9b","timestamp":1749176403959,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e6f367ec-40f7-40a3-b9e8-81fecda53357","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a1eda3dd-d963-4ca7-9c18-c38845350ff9","timestamp":1749176404180,"gateway":"8UUXN4P00A06NK"} + +{"bid":"adc3ce42-0d12-4a3d-9625-8937e6948191","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a7670651-1939-46ea-a470-9d37ac8e9e70","timestamp":1749176404957,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ab6eb792-d97b-4d6d-9c05-1fd2af5569a7","data":{"dongle_infos":[]},"tid":"a0bd895b-8eb2-413d-b333-21e80f478ea9","timestamp":1749176405314,"gateway":"8UUXN4P00A06NK"} + +{"tid":"89945532-caaa-4915-a535-c201fe596f09","bid":"3f11ced6-1e6f-4f5f-86cc-796160ed158a","timestamp":1749176433123,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"1c11ef90-eb9d-40ce-8e8f-3ad60679e839","bid":"c80a626e-5526-4319-bc12-2bb77d0ccb91","timestamp":1749176433129,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"57603d43-535f-4de2-9ea9-2d2e9195e59e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"8837e0bc-2326-4260-a892-638c36075f5d","timestamp":1749176434491,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8a2c97a6-6a70-425b-b208-0eaa516dd81e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"42296cc9-3196-458b-861e-cddf7f3f6244","timestamp":1749176434493,"gateway":"8UUXN4P00A06NK"} + +{"bid":"92b3b80c-b111-4491-a05a-1e02a92dd84d","data":{"dongle_infos":[]},"tid":"9fb5e955-e129-4f4b-bcfc-c7679fe0f209","timestamp":1749176434939,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fb34b072-0291-4b8a-bde8-31b0a7ad6dab","data":{"firmware_version":"13.01.0002"},"tid":"74bc6014-8a19-4bee-8b5e-a3e06fee1bb0","timestamp":1749176434946,"gateway":"8UUXN4P00A06NK"} + +{"tid":"2dfa60aa-b5b9-4d29-9eb8-d5e77175c6ee","bid":"9768d5b4-c52c-4244-9f3b-09ae44976ee4","timestamp":1749176435060,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"b9d9f011-15bd-41f6-9d37-7ec07bda807e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1403547c-5eb1-4eee-a5c3-195a15337545","timestamp":1749176435135,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1cbe26bf-8d6f-4f98-8530-a7807918a637","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"074e5fb9-09b5-4aa8-bac2-ef58bba3b666","timestamp":1749176435562,"gateway":"8UUXN4P00A06NK"} + +{"bid":"33099f5e-922d-4b36-963f-39ac477d9ae0","data":{"dongle_infos":[]},"tid":"b78c6191-2143-4ba0-a62f-fd407a62ad5a","timestamp":1749176435951,"gateway":"8UUXN4P00A06NK"} + +{"bid":"57603d43-535f-4de2-9ea9-2d2e9195e59e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"8837e0bc-2326-4260-a892-638c36075f5d","timestamp":1749176436689,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8a2c97a6-6a70-425b-b208-0eaa516dd81e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"42296cc9-3196-458b-861e-cddf7f3f6244","timestamp":1749176436691,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1cbe26bf-8d6f-4f98-8530-a7807918a637","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"074e5fb9-09b5-4aa8-bac2-ef58bba3b666","timestamp":1749176437687,"gateway":"8UUXN4P00A06NK"} + +{"bid":"57a2d303-aba4-4c88-846d-970b3de8049d","data":{"dongle_infos":[]},"tid":"fa682515-f0e4-48c4-a2c1-c4d12510d1d8","timestamp":1749176437930,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a5d2a76f-bae9-4b18-83fc-3610cf8d17a1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a580b102-f66e-49d9-9ed2-a31a68b5f1b6","timestamp":1749176438121,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b9d9f011-15bd-41f6-9d37-7ec07bda807e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1403547c-5eb1-4eee-a5c3-195a15337545","timestamp":1749176439332,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eaf0aea7-3834-49a7-a34e-be186865bb1b","data":{"departure_trajectory":[]},"tid":"24d60f40-a245-4530-b8e1-924c81e59d71","timestamp":1749176439819,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a439a530-e43d-4549-9421-5175c1da9e6a","data":{"departure_trajectory":[]},"tid":"08d0711b-1db0-45d9-83f2-c6c651dd8d74","timestamp":1749176439931,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a5d2a76f-bae9-4b18-83fc-3610cf8d17a1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a580b102-f66e-49d9-9ed2-a31a68b5f1b6","timestamp":1749176440287,"gateway":"8UUXN4P00A06NK"} + +{"bid":"57603d43-535f-4de2-9ea9-2d2e9195e59e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"8837e0bc-2326-4260-a892-638c36075f5d","timestamp":1749176440889,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1cbe26bf-8d6f-4f98-8530-a7807918a637","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"074e5fb9-09b5-4aa8-bac2-ef58bba3b666","timestamp":1749176441889,"gateway":"8UUXN4P00A06NK"} + +{"bid":"412e0f6d-6305-4143-aada-163da32663f7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"fc4a27b0-a7ab-4b79-bb4a-e949b2a508bb","timestamp":1749176443117,"gateway":"8UUXN4P00A06NK"} + +{"bid":"412e0f6d-6305-4143-aada-163da32663f7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"fc4a27b0-a7ab-4b79-bb4a-e949b2a508bb","timestamp":1749176445289,"gateway":"8UUXN4P00A06NK"} + +{"tid":"78768769-62d2-450f-9bc4-5f1a1102feca","bid":"3b59cfa1-0d67-4d62-9660-23638086defa","timestamp":1749176471702,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"4cf9220c-d6a1-4d00-ae5d-af6170785f73","bid":"ce0679cc-fcdf-4b71-9371-7933b5236a32","timestamp":1749176471709,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"71ba179f-6938-405d-ab9e-9b17492be7cb","bid":"997ada63-24db-44d2-95be-b2c9769f0792","timestamp":1749176507165,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"55a4b0c3-d2a0-4e79-8b9a-337176b33e7f","bid":"e6f15336-8281-4512-962e-be38f2d656a9","timestamp":1749176507171,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"e1256ede-e703-450e-ab12-18d2971d5dc6","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e192b77c-d614-4d72-9bfc-096b7aee2ff0","timestamp":1749176509087,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8689ae82-2968-4cfb-ba09-124f2be50ab8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"39862c4b-0cc1-401c-8e95-3d9bf4c32f22","timestamp":1749176511038,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ab8b53a0-edbc-4a03-bdcc-e4821ad61f98","data":{"mobility_status_notify":0},"need_reply":1,"tid":"b66f0d72-87fe-4b21-92e5-275e2b878508","timestamp":1749176511231,"gateway":"8UUXN4P00A06NK"} + +{"bid":"94a74d8a-d4e5-4a5b-9957-533f42933679","data":{"dongle_infos":[]},"tid":"2a20b06c-7a88-4bb8-a4a0-a7e5879fe34b","timestamp":1749176511472,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d36735e7-cdcb-4374-a777-57fb9a3925d1","data":{"firmware_version":"13.01.0002"},"tid":"6f9d9dc7-5db9-45b7-9692-a6d00d229b20","timestamp":1749176511479,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e1256ede-e703-450e-ab12-18d2971d5dc6","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e192b77c-d614-4d72-9bfc-096b7aee2ff0","timestamp":1749176511660,"gateway":"8UUXN4P00A06NK"} + +{"tid":"8c2ec550-88dd-48ff-a36c-575c80a43822","bid":"00ae5410-b2e7-490c-b08d-28b2d3c7f67f","timestamp":1749176511791,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"c8555603-50d6-46d1-9d71-3a2c25d891ab","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cef0ece9-45be-4bf8-8c3f-0be04d9d0326","timestamp":1749176512170,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b5ac6bc3-ac2e-4c97-bc72-71c7d528ee30","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"87fe48fb-060b-44bc-9bd4-55b034ea368d","timestamp":1749176512355,"gateway":"8UUXN4P00A06NK"} + +{"bid":"964001be-0b1f-439e-89c0-82f9b89ca410","data":{"dongle_infos":[]},"tid":"32611458-9712-4bfd-af69-2be85f738984","timestamp":1749176512480,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ab8b53a0-edbc-4a03-bdcc-e4821ad61f98","data":{"mobility_status_notify":0},"need_reply":1,"tid":"b66f0d72-87fe-4b21-92e5-275e2b878508","timestamp":1749176513350,"gateway":"8UUXN4P00A06NK"} + +{"tid":"2c8fa08e-61c1-4039-8fd2-a8219f51117d","bid":"8269dbc9-c5a7-48f6-8fad-72ec2a559c13","timestamp":1749176539728,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"b9895dcf-913e-4983-8b27-81751ff06f69","bid":"f381ee8a-2504-4c14-9c04-a2bc8fe57cbd","timestamp":1749176539732,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"47979be2-cbcd-40b1-a8cb-5d16b7fec7fb","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e073df80-eeaa-4916-81e5-3304ead92820","timestamp":1749176540342,"gateway":"8UUXN4P00A06NK"} + +{"bid":"931549ad-6ccf-495e-bc5b-26986d34c731","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5acec4d6-08ff-40d5-b567-e1f36dbc9e93","timestamp":1749176542923,"gateway":"8UUXN4P00A06NK"} + +{"bid":"813f253e-4a11-4470-855a-0b585970e8f1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6a78557f-ac95-4a60-a8d9-7b51c3242968","timestamp":1749176542939,"gateway":"8UUXN4P00A06NK"} + +{"bid":"304962ab-c3c9-442f-bb71-31eb69281f4d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"50710108-5c27-41ff-92f0-34669e85f104","timestamp":1749176542945,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0cad9d1d-8903-4a82-95ed-015f176f44ed","data":{"dongle_infos":[]},"tid":"5a71ac4f-1d20-4400-992e-8f17f206bdb6","timestamp":1749176542973,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4f4281cb-3275-4059-a856-0900c79f6fe5","data":{"firmware_version":"13.01.0002"},"tid":"a1315d82-91d5-46a2-bc0d-d80af51c59e9","timestamp":1749176542982,"gateway":"8UUXN4P00A06NK"} + +{"bid":"47979be2-cbcd-40b1-a8cb-5d16b7fec7fb","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e073df80-eeaa-4916-81e5-3304ead92820","timestamp":1749176543175,"gateway":"8UUXN4P00A06NK"} + +{"tid":"6f8f0b3d-49b2-4f75-adc2-b1760101879c","bid":"11960c2e-8bc3-4986-8f36-d44bd093efcb","timestamp":1749176543363,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"cc1e4c75-70f8-43b9-9052-9c8e07bad18c","data":{"dongle_infos":[]},"tid":"9f55e98d-7401-44c7-a2d9-068abdbcce28","timestamp":1749176543978,"gateway":"8UUXN4P00A06NK"} + +{"bid":"75754bfa-ba46-46c1-b26b-ae3972aa088e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"626dade5-6a43-41cf-99a1-89db28a03f1a","timestamp":1749176544733,"gateway":"8UUXN4P00A06NK"} + +{"bid":"931549ad-6ccf-495e-bc5b-26986d34c731","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5acec4d6-08ff-40d5-b567-e1f36dbc9e93","timestamp":1749176544988,"gateway":"8UUXN4P00A06NK"} + +{"bid":"304962ab-c3c9-442f-bb71-31eb69281f4d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"50710108-5c27-41ff-92f0-34669e85f104","timestamp":1749176544990,"gateway":"8UUXN4P00A06NK"} + +{"tid":"9af98a7e-c1a2-4a0c-92f3-52e6b06caad7","bid":"aa9b8dd7-a476-404a-9290-1dd8cb9ec8f6","timestamp":1749176572607,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"b6d85952-b765-4cab-9ab1-5b552e875e98","bid":"b7404b92-fc7f-401b-8b74-d06ebfa37f49","timestamp":1749176572611,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"a70429b5-cf75-4972-aa13-dd530d52a5f3","data":{"air_transfer_enable":false},"need_reply":1,"tid":"647901fe-40b8-403c-9395-149871d6ff01","timestamp":1749176572920,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ebfea2ed-bf35-4646-8e56-1a05a73a9f1b","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f0fa4d18-9141-4358-8c51-f78c57c90687","timestamp":1749176574841,"gateway":"8UUXN4P00A06NK"} + +{"bid":"76bb4f2e-bf83-44b8-baa9-af30ed5b428b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1088c7f5-a35f-4b21-9d2e-c29ac35d8360","timestamp":1749176574843,"gateway":"8UUXN4P00A06NK"} + +{"bid":"36673cda-7602-41a3-879b-8a281316ad72","data":{"dongle_infos":[]},"tid":"1c6a38e0-9919-4535-a526-b7aa4cb99cd0","timestamp":1749176575333,"gateway":"8UUXN4P00A06NK"} + +{"tid":"904f9d68-5ffd-4ab9-8bb1-5d702b91ff1b","bid":"24fdf1db-d696-435a-a4c6-fabfdf4f17e0","timestamp":1749176575333,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"60e6af7f-38bd-4cec-9a96-4395da4250ee","data":{"firmware_version":"13.01.0002"},"tid":"78b86738-1307-457f-b146-c615f617d9fe","timestamp":1749176575350,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a70429b5-cf75-4972-aa13-dd530d52a5f3","data":{"air_transfer_enable":false},"need_reply":1,"tid":"647901fe-40b8-403c-9395-149871d6ff01","timestamp":1749176575588,"gateway":"8UUXN4P00A06NK"} + +{"bid":"baec4083-50b0-4c82-a1d8-c92d57311a96","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"d85929d4-a94c-4673-a652-70c79998de63","timestamp":1749176575951,"gateway":"8UUXN4P00A06NK"} + +{"bid":"33d6a013-1485-4020-9174-9ff4542cb868","data":{"dongle_infos":[]},"tid":"2c6e2a43-7c19-4d32-93ea-e7017fce480a","timestamp":1749176576334,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ebfea2ed-bf35-4646-8e56-1a05a73a9f1b","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f0fa4d18-9141-4358-8c51-f78c57c90687","timestamp":1749176577024,"gateway":"8UUXN4P00A06NK"} + +{"bid":"76bb4f2e-bf83-44b8-baa9-af30ed5b428b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1088c7f5-a35f-4b21-9d2e-c29ac35d8360","timestamp":1749176577025,"gateway":"8UUXN4P00A06NK"} + +{"bid":"db3c17a4-6920-4eb3-8023-4b25e068ee7d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c78ab8cf-df72-43c1-a352-e00970fdf235","timestamp":1749176577607,"gateway":"8UUXN4P00A06NK"} + +{"bid":"baec4083-50b0-4c82-a1d8-c92d57311a96","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"d85929d4-a94c-4673-a652-70c79998de63","timestamp":1749176578025,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f8940272-a753-4317-8063-ae455aedf0fc","data":{"dongle_infos":[]},"tid":"60029159-9a5c-4166-8d52-83f157304a11","timestamp":1749176578350,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ee235c41-8a80-44d9-9931-dbd6c695c968","bid":"e69d5ace-5e8f-4563-af7b-f5495af45ae5","timestamp":1749176605307,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"58308b35-6fb3-4e33-96ac-e58b84cdd424","bid":"dc336e35-eeac-44be-95a6-1f3bb9727336","timestamp":1749176605310,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"8efd866a-5b0c-4619-b143-ef5a36ac1142","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b04b9679-3a3a-4008-8945-ee15f60cd1a6","timestamp":1749176606472,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bd88741a-67e3-4c0e-9298-7dfa71e7441c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5aff791d-93c5-4e66-b1ab-df89d1a2773c","timestamp":1749176606659,"gateway":"8UUXN4P00A06NK"} + +{"bid":"06f43208-ea99-4f29-b4d0-5db7cba7f112","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d2974085-4dca-4447-8765-26bf2bfed19b","timestamp":1749176606877,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c7c5062f-eddd-4ffa-a385-d37b292054d0","data":{"dongle_infos":[]},"tid":"9c8e85e2-eef9-4680-b4c4-20af67555b49","timestamp":1749176606883,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e168d70e-adce-48d2-882d-56dc811ce7a1","data":{"firmware_version":"13.01.0002"},"tid":"ea8b482c-d989-420d-83d4-0327df914d91","timestamp":1749176606888,"gateway":"8UUXN4P00A06NK"} + +{"tid":"21a39cbd-d1b3-45f2-92d9-c4a5bc6e9947","bid":"fc75c2f2-4329-48c6-aad6-2676fc91fb31","timestamp":1749176607250,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"23138749-9135-4cdf-b766-4a14963dcec4","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5649f28a-89cf-4a47-86fb-df1eb1bc5dcc","timestamp":1749176607800,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e1e7f09b-5a26-4251-a86a-5cfc6ba35260","data":{"dongle_infos":[]},"tid":"45fbccae-6f54-4b2a-b60d-5a456faea499","timestamp":1749176607930,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8efd866a-5b0c-4619-b143-ef5a36ac1142","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b04b9679-3a3a-4008-8945-ee15f60cd1a6","timestamp":1749176608562,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bd88741a-67e3-4c0e-9298-7dfa71e7441c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5aff791d-93c5-4e66-b1ab-df89d1a2773c","timestamp":1749176608762,"gateway":"8UUXN4P00A06NK"} + +{"bid":"23138749-9135-4cdf-b766-4a14963dcec4","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5649f28a-89cf-4a47-86fb-df1eb1bc5dcc","timestamp":1749176609964,"gateway":"8UUXN4P00A06NK"} + +{"bid":"acba77b7-6042-4b95-bcb0-07a6fbc0d977","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"633aacba-f13a-4070-8459-452641c77e31","timestamp":1749176610305,"gateway":"8UUXN4P00A06NK"} + +{"bid":"06f43208-ea99-4f29-b4d0-5db7cba7f112","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d2974085-4dca-4447-8765-26bf2bfed19b","timestamp":1749176611079,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ef1c1345-c03a-4ffd-b365-fcba198f36ce","data":{"dongle_infos":[]},"tid":"4b2e1b40-cde2-4b5d-84e2-9b0e44a126b4","timestamp":1749176611217,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fc5d3f4d-6321-4953-9a7b-e598482a5fc0","data":{"departure_trajectory":[]},"tid":"d1db0d21-d884-417d-ad62-1aaa4d47a5d6","timestamp":1749176611877,"gateway":"8UUXN4P00A06NK"} + +{"bid":"956d4e9e-efe7-463f-8b37-ed1a822b0f22","data":{"departure_trajectory":[]},"tid":"2bdf4053-6887-445e-83bd-799361c02fd6","timestamp":1749176611917,"gateway":"8UUXN4P00A06NK"} + +{"bid":"acba77b7-6042-4b95-bcb0-07a6fbc0d977","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"633aacba-f13a-4070-8459-452641c77e31","timestamp":1749176612363,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bd88741a-67e3-4c0e-9298-7dfa71e7441c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5aff791d-93c5-4e66-b1ab-df89d1a2773c","timestamp":1749176612965,"gateway":"8UUXN4P00A06NK"} + +{"bid":"23138749-9135-4cdf-b766-4a14963dcec4","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5649f28a-89cf-4a47-86fb-df1eb1bc5dcc","timestamp":1749176614162,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d99c7d85-f97a-4fe2-88f4-4e8b725dd358","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e5ce14d9-296c-46df-af20-d8cdd5262d9a","timestamp":1749176615303,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d99c7d85-f97a-4fe2-88f4-4e8b725dd358","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e5ce14d9-296c-46df-af20-d8cdd5262d9a","timestamp":1749176617362,"gateway":"8UUXN4P00A06NK"} + +{"tid":"7005b53a-1374-4c32-be9d-4e1d7e59615b","bid":"9b53dfa0-72d0-42db-baef-62855e4097e4","timestamp":1749176643807,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"9dbc74b7-d40e-44f3-8e69-f47fd6d63901","bid":"c3c6128f-d88c-4b4b-a589-aac9f1685a3c","timestamp":1749176643811,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"580a2db5-c8d1-40d5-91c3-832817ab1d35","data":{"mobility_status_notify":0},"need_reply":1,"tid":"98578962-b733-4b4e-8440-cf8450312636","timestamp":1749176645567,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1399566d-295f-434a-8675-febb76eabd3e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c5707b11-be4a-4ee7-b1ee-c34aab461f39","timestamp":1749176645609,"gateway":"8UUXN4P00A06NK"} + +{"bid":"94d58046-2bba-46a1-9105-b80efe7a48a8","data":{"dongle_infos":[]},"tid":"9247d0c3-db26-410c-906c-b50ac90d4d9d","timestamp":1749176646013,"gateway":"8UUXN4P00A06NK"} + +{"bid":"406a17bf-b090-49ba-9b44-2c912d42309a","data":{"firmware_version":"13.01.0002"},"tid":"f8969c30-9de2-476d-8d62-c0a21d84a999","timestamp":1749176646020,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1a439345-c8bc-4445-82f1-5c6085b84ed9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"c6a964a9-9bd5-4c1a-ba2b-6d7380237821","timestamp":1749176646254,"gateway":"8UUXN4P00A06NK"} + +{"tid":"f58847d4-cd89-4467-8ba0-0db64f9433f7","bid":"4c63cc9d-cdf5-40a8-834f-f78e9d60d1ee","timestamp":1749176646279,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f9a02e0b-02ee-47d6-a9a1-019894e4434f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"42aa3aff-a155-44c6-ba5a-e6cbddbca175","timestamp":1749176646725,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ff232c5e-36ac-4c86-ba12-a768e35ad773","data":{"dongle_infos":[]},"tid":"bd749945-1575-4556-85f1-c6edf8ef3aba","timestamp":1749176647041,"gateway":"8UUXN4P00A06NK"} + +{"bid":"580a2db5-c8d1-40d5-91c3-832817ab1d35","data":{"mobility_status_notify":0},"need_reply":1,"tid":"98578962-b733-4b4e-8440-cf8450312636","timestamp":1749176647619,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1399566d-295f-434a-8675-febb76eabd3e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c5707b11-be4a-4ee7-b1ee-c34aab461f39","timestamp":1749176647621,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c1ed4a64-38f0-40e1-8193-95045415623e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3de535ef-6f3a-4cef-a6b4-f56282e2e8d1","timestamp":1749176648810,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f9a02e0b-02ee-47d6-a9a1-019894e4434f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"42aa3aff-a155-44c6-ba5a-e6cbddbca175","timestamp":1749176648821,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0967c2a9-d10a-4c76-8050-09fe96e98020","data":{"dongle_infos":[]},"tid":"253d23f2-4b47-4c6e-87c6-eaa34084c1e3","timestamp":1749176649108,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2d6ad906-240a-4ce0-a2ec-2c8123c104ab","data":{"departure_trajectory":[]},"tid":"973c284d-aa2d-49dc-9935-f6e10c0127e1","timestamp":1749176650408,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1a439345-c8bc-4445-82f1-5c6085b84ed9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"c6a964a9-9bd5-4c1a-ba2b-6d7380237821","timestamp":1749176650451,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c1ed4a64-38f0-40e1-8193-95045415623e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3de535ef-6f3a-4cef-a6b4-f56282e2e8d1","timestamp":1749176650821,"gateway":"8UUXN4P00A06NK"} + +{"bid":"58b212e6-0e8e-441d-b2da-879936cbcf3a","data":{"departure_trajectory":[]},"tid":"54bf0157-08f4-4ec8-8ede-29f20d1146c3","timestamp":1749176651009,"gateway":"8UUXN4P00A06NK"} + +{"bid":"580a2db5-c8d1-40d5-91c3-832817ab1d35","data":{"mobility_status_notify":0},"need_reply":1,"tid":"98578962-b733-4b4e-8440-cf8450312636","timestamp":1749176651819,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f9a02e0b-02ee-47d6-a9a1-019894e4434f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"42aa3aff-a155-44c6-ba5a-e6cbddbca175","timestamp":1749176653024,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8dc19dd8-e680-4649-ad58-c47b0993c79a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a3a88dae-2947-45a6-9b78-3f527ef6733c","timestamp":1749176653813,"gateway":"8UUXN4P00A06NK"} + +{"tid":"00f4d5c0-1bf7-4d26-be49-2eb4892707ad","bid":"4156ab80-6780-4360-85b3-b2ea38b7e490","timestamp":1749176679910,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"2e980397-1927-4810-9cad-2e62f8b31176","bid":"6691697c-f51c-4953-83d0-57a867d2bc47","timestamp":1749176679913,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"92adbe35-d0e1-4835-916f-3059afe9f395","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1e7976c4-0bad-4d03-abbd-ec2f88f98233","timestamp":1749176681093,"gateway":"8UUXN4P00A06NK"} + +{"bid":"be2de984-cd59-4f75-b501-752614e56dab","data":{"mobility_status_notify":0},"need_reply":1,"tid":"97eb4892-9b96-47cb-9a56-48daf5df5048","timestamp":1749176683078,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cd2e7b40-bd1c-4736-972c-e6968392a8f0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7c10f6ce-1925-48cd-9f50-520e4b9be39d","timestamp":1749176683085,"gateway":"8UUXN4P00A06NK"} + +{"tid":"fa8657ca-a5e0-40ca-a0e0-c41bf361d2e1","bid":"4cd57b16-eb5c-4508-aa87-4e2bbd31785c","timestamp":1749176683514,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"6742f08b-b8a5-44c7-a68f-b2d1b717e9ef","data":{"dongle_infos":[]},"tid":"115e2b3d-58df-4dd2-83fc-68d08a0e47e6","timestamp":1749176683520,"gateway":"8UUXN4P00A06NK"} + +{"bid":"564cab32-ae3b-4611-bfdd-499c263c315c","data":{"firmware_version":"13.01.0002"},"tid":"ccc9de0d-b5bf-4bb7-abb1-933a4fcaa6b4","timestamp":1749176683531,"gateway":"8UUXN4P00A06NK"} + +{"bid":"92adbe35-d0e1-4835-916f-3059afe9f395","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1e7976c4-0bad-4d03-abbd-ec2f88f98233","timestamp":1749176683717,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f0680fc4-45fc-4f8c-a050-12c14374f4fe","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"209fcc65-f366-41a8-b637-a7bf267fd281","timestamp":1749176684169,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e3fcbb8b-5e1e-42cf-a16f-1a395bce2ba0","data":{"dongle_infos":[]},"tid":"0b8abea1-5444-4665-a55d-28b7a064c1df","timestamp":1749176684531,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1fb7d4a-9ee9-4959-8b63-b0a29fc2a22e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1e73ad54-4d3e-41d2-b53c-0b90898219e6","timestamp":1749176684928,"gateway":"8UUXN4P00A06NK"} + +{"bid":"be2de984-cd59-4f75-b501-752614e56dab","data":{"mobility_status_notify":0},"need_reply":1,"tid":"97eb4892-9b96-47cb-9a56-48daf5df5048","timestamp":1749176685129,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f0680fc4-45fc-4f8c-a050-12c14374f4fe","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"209fcc65-f366-41a8-b637-a7bf267fd281","timestamp":1749176686325,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ca7a9527-c2ab-48b4-8ced-2001049a17b8","bid":"1c79c7c8-3d5f-4c07-91b5-fd38491e4ecc","timestamp":1749176743379,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"ada1b97e-36b6-4c84-b502-84fa9649f163","bid":"9a8fa027-c528-47c3-a29f-3523bd328e85","timestamp":1749176743390,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"89641733-4d45-414e-91b2-39fbe51eb299","data":{"air_transfer_enable":false},"need_reply":1,"tid":"ee68a3eb-982d-4cf0-ad0b-6faef2db569e","timestamp":1749176745122,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6dedf330-bdf4-4348-ad98-b8b97644cc02","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c38ccfda-34d0-4db6-81c1-9d17d6c8cd0a","timestamp":1749176747629,"gateway":"8UUXN4P00A06NK"} + +{"bid":"15920092-3ad3-415f-9206-799a22e0518a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"34d34b13-97b7-4b6b-bbba-13463a9df7c5","timestamp":1749176747645,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3d0edaec-74d0-424c-af1c-a28cd1d2d083","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f6d42520-572b-4f19-8826-8f018a893cc5","timestamp":1749176747651,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0457612e-6453-4828-b86d-d9b73842448c","data":{"dongle_infos":[]},"tid":"07f56dfd-d15e-4e30-9c3e-0e92867415c8","timestamp":1749176747715,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ca75e07d-b911-4ad7-b4c5-4e9b5d85f0a3","data":{"firmware_version":"13.01.0002"},"tid":"95faf8ba-07b9-4689-b6b7-3c10fa7bdf03","timestamp":1749176747722,"gateway":"8UUXN4P00A06NK"} + +{"bid":"89641733-4d45-414e-91b2-39fbe51eb299","data":{"air_transfer_enable":false},"need_reply":1,"tid":"ee68a3eb-982d-4cf0-ad0b-6faef2db569e","timestamp":1749176747912,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b75726a4-81a9-420a-8914-7c21143bce1d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cc44bbb1-2d3f-40b8-b60a-ac8a0967d48f","timestamp":1749176748379,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c8d2e9d8-d22a-49cd-ae0d-efb53387a269","bid":"d54e5839-f3eb-4d00-a752-ee25cfd6fcda","timestamp":1749176748534,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"471f2139-1d4a-4a2e-841d-237ad080e1d9","data":{"dongle_infos":[]},"tid":"e721f237-1093-4191-aa36-6390caee3ed8","timestamp":1749176748726,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6dedf330-bdf4-4348-ad98-b8b97644cc02","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c38ccfda-34d0-4db6-81c1-9d17d6c8cd0a","timestamp":1749176749807,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3d0edaec-74d0-424c-af1c-a28cd1d2d083","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f6d42520-572b-4f19-8826-8f018a893cc5","timestamp":1749176749809,"gateway":"8UUXN4P00A06NK"} + +{"tid":"75a49cc8-a85c-431c-a9ea-94b04c875194","bid":"5dfda2a6-f68b-4c9f-8afc-442f34bb0fc8","timestamp":1749176776726,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"be02fda5-c36c-4921-9278-4223689e4776","bid":"629ac8df-80d1-4ac8-805f-752af4b81408","timestamp":1749176776730,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"12d22012-c4af-43af-ac95-3ee1f4337570","data":{"air_transfer_enable":false},"need_reply":1,"tid":"461ecf7b-ae10-41bc-811d-4ee451cfcc62","timestamp":1749176776811,"gateway":"8UUXN4P00A06NK"} + +{"bid":"720a437c-d02c-483f-a5a5-3243e09c6913","data":{"mobility_status_notify":0},"need_reply":1,"tid":"105705f1-16fe-4926-88bb-552a8f65fcf9","timestamp":1749176778829,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a4712a44-4b4a-4545-92ca-34f348767160","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e4f755a2-ea0b-4f44-9a8d-e26370f6c12d","timestamp":1749176778832,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bbaada44-7479-4b7d-b718-c3627a5d4335","data":{"dongle_infos":[]},"tid":"c17b7715-7020-4fd6-88d0-2eab38b13b46","timestamp":1749176779291,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1225d2c-10d1-40c0-ab3d-3e64cd40d121","data":{"firmware_version":"13.01.0002"},"tid":"e11672c7-58d6-42ad-a9df-a0c4e0cc842b","timestamp":1749176779298,"gateway":"8UUXN4P00A06NK"} + +{"tid":"633dc792-105e-44cd-bff6-29af727c01fc","bid":"5292c22f-cdc9-4eff-b4ad-16ba37af1f36","timestamp":1749176779428,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"12d22012-c4af-43af-ac95-3ee1f4337570","data":{"air_transfer_enable":false},"need_reply":1,"tid":"461ecf7b-ae10-41bc-811d-4ee451cfcc62","timestamp":1749176779486,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d8c9808e-250c-4b39-bf1f-6735e36e1fbc","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"aa4fbfe0-3b60-4739-94a5-bdeb2295db8f","timestamp":1749176779937,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c1a1e7bb-4865-4e1d-aecc-35b77440ad00","data":{"dongle_infos":[]},"tid":"ff9b76a6-61cb-4be0-af47-e119659cd5eb","timestamp":1749176780313,"gateway":"8UUXN4P00A06NK"} + +{"bid":"720a437c-d02c-483f-a5a5-3243e09c6913","data":{"mobility_status_notify":0},"need_reply":1,"tid":"105705f1-16fe-4926-88bb-552a8f65fcf9","timestamp":1749176780902,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a4712a44-4b4a-4545-92ca-34f348767160","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e4f755a2-ea0b-4f44-9a8d-e26370f6c12d","timestamp":1749176780903,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c513ef05-7b2a-4972-8c9e-b6aa286b3633","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d8228f12-0a94-4002-90af-7f3b551c266e","timestamp":1749176781727,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d8c9808e-250c-4b39-bf1f-6735e36e1fbc","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"aa4fbfe0-3b60-4739-94a5-bdeb2295db8f","timestamp":1749176782104,"gateway":"8UUXN4P00A06NK"} + +{"bid":"deab96c8-9ddf-4507-85df-85f1406bc493","data":{"dongle_infos":[]},"tid":"775e73a4-35a1-4fda-b4c1-b35faed49a13","timestamp":1749176782441,"gateway":"8UUXN4P00A06NK"} + +{"bid":"12d22012-c4af-43af-ac95-3ee1f4337570","data":{"air_transfer_enable":false},"need_reply":1,"tid":"461ecf7b-ae10-41bc-811d-4ee451cfcc62","timestamp":1749176783681,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6604c577-0e92-42da-8be7-ad837d4b6027","data":{"departure_trajectory":[]},"tid":"b19b7350-a1c9-4455-ad85-5440a1d44cf9","timestamp":1749176783753,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c513ef05-7b2a-4972-8c9e-b6aa286b3633","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d8228f12-0a94-4002-90af-7f3b551c266e","timestamp":1749176783900,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dfaee689-eaa9-4638-9299-e4f9a83de0d3","data":{"departure_trajectory":[]},"tid":"b9e3242b-9e37-47ee-b1fb-94e07e7cd99c","timestamp":1749176784285,"gateway":"8UUXN4P00A06NK"} + +{"bid":"720a437c-d02c-483f-a5a5-3243e09c6913","data":{"mobility_status_notify":0},"need_reply":1,"tid":"105705f1-16fe-4926-88bb-552a8f65fcf9","timestamp":1749176785099,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d8c9808e-250c-4b39-bf1f-6735e36e1fbc","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"aa4fbfe0-3b60-4739-94a5-bdeb2295db8f","timestamp":1749176786301,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c0d07a6-3f22-4a3b-9227-c2bb16f8f698","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"07f05e48-bf17-4bf2-8ea0-1347a29141fb","timestamp":1749176786723,"gateway":"8UUXN4P00A06NK"} + +{"tid":"e482f2ea-e23c-4b16-9b1b-6f052ced60c2","bid":"ad389a61-ceff-499b-b35e-567b40eadb56","timestamp":1749176815366,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"b7c4b094-bac1-4325-bf19-a36faab00125","bid":"a3a15bb4-3004-4f1d-91ce-e36a4316579e","timestamp":1749176815369,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"09d8b43a-a957-497f-b6b7-7772684a40d5","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"69c16065-2f81-4652-b146-6ad82b34debb","timestamp":1749176817068,"gateway":"8UUXN4P00A06NK"} + +{"tid":"eba7ee8e-b679-420c-af63-4b83a9f899b5","bid":"8ee4db1c-0c13-47d3-bd21-8819c5942c82","timestamp":1749176817471,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"377e4edc-97bc-4569-aae0-864e3abb04ce","data":{"air_transfer_enable":false},"need_reply":1,"tid":"6e1252e3-ad92-47ef-ad31-69806df926ad","timestamp":1749176817608,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e599e597-47a6-49ee-8580-cb286bd6ce66","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"4ac68f58-3a40-44a9-a815-5aec7f99ad84","timestamp":1749176817929,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3e8743dd-a864-430c-99d9-cbd0927898cb","data":{"dongle_infos":[]},"tid":"0ca01c60-feb2-4952-b76a-3a0e05b8dd35","timestamp":1749176817949,"gateway":"8UUXN4P00A06NK"} + +{"bid":"02dc6b61-2641-4c2c-ac49-de17613b8873","data":{"mobility_status_notify":0},"need_reply":1,"tid":"761dfc09-ff19-4982-adb6-7ec6c3f9f1b1","timestamp":1749176817958,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e7377004-5ced-4b17-ab81-c23db6953f08","data":{"firmware_version":"13.01.0002"},"tid":"914475ed-2f94-4d71-a632-939fe810c2e4","timestamp":1749176818003,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ad37f47d-1535-4881-9e40-54b1407a6491","data":{"dongle_infos":[]},"tid":"a9e514d7-53ec-4541-9500-12a5e8f216e1","timestamp":1749176818981,"gateway":"8UUXN4P00A06NK"} + +{"bid":"09d8b43a-a957-497f-b6b7-7772684a40d5","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"69c16065-2f81-4652-b146-6ad82b34debb","timestamp":1749176819260,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e599e597-47a6-49ee-8580-cb286bd6ce66","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"4ac68f58-3a40-44a9-a815-5aec7f99ad84","timestamp":1749176820059,"gateway":"8UUXN4P00A06NK"} + +{"bid":"02dc6b61-2641-4c2c-ac49-de17613b8873","data":{"mobility_status_notify":0},"need_reply":1,"tid":"761dfc09-ff19-4982-adb6-7ec6c3f9f1b1","timestamp":1749176820059,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ddb29a36-76ac-4151-ae07-b61d7e834adb","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3a2a1a93-3f31-40d7-ac4f-77362bccc396","timestamp":1749176820365,"gateway":"8UUXN4P00A06NK"} + +{"bid":"377e4edc-97bc-4569-aae0-864e3abb04ce","data":{"air_transfer_enable":false},"need_reply":1,"tid":"6e1252e3-ad92-47ef-ad31-69806df926ad","timestamp":1749176821800,"gateway":"8UUXN4P00A06NK"} + +{"bid":"899823ed-42ee-4e2b-afd1-e5988da1d8f0","data":{"dongle_infos":[]},"tid":"d5b92e2f-3d21-467f-9fa8-01b17e262760","timestamp":1749176821807,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b256f9e6-3099-481d-a55f-47cbaa73279d","data":{"departure_trajectory":[]},"tid":"89dbb1de-f16e-40cd-b539-7fc3795f08ba","timestamp":1749176821808,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ddb29a36-76ac-4151-ae07-b61d7e834adb","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3a2a1a93-3f31-40d7-ac4f-77362bccc396","timestamp":1749176822459,"gateway":"8UUXN4P00A06NK"} + +{"bid":"78c4fecb-6eb7-4b81-82e9-7d402c08dc6d","data":{"departure_trajectory":[]},"tid":"eba712f8-994a-4801-8a5f-407b990f5bfe","timestamp":1749176822942,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e599e597-47a6-49ee-8580-cb286bd6ce66","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"4ac68f58-3a40-44a9-a815-5aec7f99ad84","timestamp":1749176824260,"gateway":"8UUXN4P00A06NK"} + +{"bid":"02dc6b61-2641-4c2c-ac49-de17613b8873","data":{"mobility_status_notify":0},"need_reply":1,"tid":"761dfc09-ff19-4982-adb6-7ec6c3f9f1b1","timestamp":1749176824261,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dec4f191-84df-4554-bccf-e27d5514bfb0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ab6e73fa-0742-4de1-aadf-4771beba6d75","timestamp":1749176825363,"gateway":"8UUXN4P00A06NK"} + +{"tid":"e9491c10-7c81-480d-b74e-b8bbf952a1bd","bid":"56f10ef5-af55-4dc6-a358-c1805df1c74c","timestamp":1749176852959,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"0ec9a2c9-688d-425a-9a7a-a37e7c997d37","bid":"b9b1c0ba-c0a1-43e6-8442-9e05695b0e1d","timestamp":1749176852962,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"838c275d-00aa-40b0-a8a4-7d8d2ba05438","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ddb630f2-70e3-42e3-9b87-a548bd4fd00b","timestamp":1749176854761,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9f606021-ca41-4985-a5b3-c003604d7d6d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1197e05e-a5c5-49c2-840d-96da0dbc8f8a","timestamp":1749176854781,"gateway":"8UUXN4P00A06NK"} + +{"bid":"77e4ee83-2ccc-4358-a03f-308d2fee65f7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b711e66a-2a5a-49cc-bbdb-ef4b5b33a065","timestamp":1749176854785,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ffd17cdd-dceb-4c2a-ac90-45015059093f","data":{"dongle_infos":[]},"tid":"74ea0721-fda1-4d67-9d7c-d071615eb08d","timestamp":1749176854888,"gateway":"8UUXN4P00A06NK"} + +{"bid":"110c5766-8d81-4ac0-b4d3-793a12838d55","data":{"dongle_infos":[]},"tid":"ccf4ba49-bff1-48a5-aa14-825d6385787c","timestamp":1749176854889,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a7fec455-0511-448b-bdd7-8c2036c75e3c","data":{"firmware_version":"13.01.0002"},"tid":"78491026-5ec6-4c56-ac80-ca84d6061ad7","timestamp":1749176854925,"gateway":"8UUXN4P00A06NK"} + +{"bid":"db45d672-333e-468d-9248-24085e0a2d34","data":{"air_transfer_enable":false},"need_reply":1,"tid":"53575a53-1cbd-4c7e-887f-4221e2dd27b5","timestamp":1749176855085,"gateway":"8UUXN4P00A06NK"} + +{"tid":"782cd9f0-09c3-4b5f-9f1b-acd86497a116","bid":"af2f4868-e806-419a-a706-f86d8db9564a","timestamp":1749176855128,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"c2a8df13-6921-46d2-8b10-2b0a87a2b76a","data":{"dongle_infos":[]},"tid":"f5132c41-cc8d-4940-9422-8cbbfe67a8da","timestamp":1749176855945,"gateway":"8UUXN4P00A06NK"} + +{"bid":"838c275d-00aa-40b0-a8a4-7d8d2ba05438","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ddb630f2-70e3-42e3-9b87-a548bd4fd00b","timestamp":1749176856784,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9f606021-ca41-4985-a5b3-c003604d7d6d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1197e05e-a5c5-49c2-840d-96da0dbc8f8a","timestamp":1749176856785,"gateway":"8UUXN4P00A06NK"} + +{"bid":"77e4ee83-2ccc-4358-a03f-308d2fee65f7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b711e66a-2a5a-49cc-bbdb-ef4b5b33a065","timestamp":1749176856988,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cae03888-8628-4dfc-a1f2-f26cd5c42afa","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9d1fe866-672b-4398-87e6-ca723f12fe6a","timestamp":1749176857962,"gateway":"8UUXN4P00A06NK"} + +{"bid":"db45d672-333e-468d-9248-24085e0a2d34","data":{"air_transfer_enable":false},"need_reply":1,"tid":"53575a53-1cbd-4c7e-887f-4221e2dd27b5","timestamp":1749176859287,"gateway":"8UUXN4P00A06NK"} + +{"bid":"07780f9f-c945-4a84-b4e0-cbd54d0df9e3","data":{"departure_trajectory":[]},"tid":"74299186-1f48-4a9e-b1cb-5b2c2f0deb63","timestamp":1749176859598,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2fd5916f-9de8-4c7c-aa79-09179fcc8ab4","data":{"departure_trajectory":[]},"tid":"e87299e5-3af4-4c10-a9be-4891c77f68ae","timestamp":1749176859889,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cae03888-8628-4dfc-a1f2-f26cd5c42afa","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9d1fe866-672b-4398-87e6-ca723f12fe6a","timestamp":1749176859987,"gateway":"8UUXN4P00A06NK"} + +{"bid":"838c275d-00aa-40b0-a8a4-7d8d2ba05438","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ddb630f2-70e3-42e3-9b87-a548bd4fd00b","timestamp":1749176860990,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9f606021-ca41-4985-a5b3-c003604d7d6d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1197e05e-a5c5-49c2-840d-96da0dbc8f8a","timestamp":1749176860990,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7ba6c5fc-2b7f-45b0-b2c2-1c889c5ae027","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"952df33e-a507-4294-9e8b-7f252ad222a0","timestamp":1749176862956,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7ba6c5fc-2b7f-45b0-b2c2-1c889c5ae027","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"952df33e-a507-4294-9e8b-7f252ad222a0","timestamp":1749176864986,"gateway":"8UUXN4P00A06NK"} + +{"tid":"e6611c8d-be09-4499-bf0e-ae7090f2c524","bid":"c016687d-dd8f-45cb-a50c-6e89b9ab4c58","timestamp":1749176890021,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"7cd24653-9f44-492e-9866-28448038a94d","bid":"10f60b32-fae9-4c76-96ae-c0459914b975","timestamp":1749176890030,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"4cfc0f42-8960-48fd-bc1a-3be6c209e673","data":{"air_transfer_enable":false},"need_reply":1,"tid":"fbc00e64-fc9b-4f2c-af45-79b1c3ab7c18","timestamp":1749176891079,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a0d32952-497e-4a7a-8604-1fe4fb810743","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f4df3f24-f68c-4736-8ee3-827f4e2b6af5","timestamp":1749176892982,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4cfc0f42-8960-48fd-bc1a-3be6c209e673","data":{"air_transfer_enable":false},"need_reply":1,"tid":"fbc00e64-fc9b-4f2c-af45-79b1c3ab7c18","timestamp":1749176893683,"gateway":"8UUXN4P00A06NK"} + +{"bid":"778bdf76-1133-4e09-a48f-c37ad29e07af","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a6692b24-b33c-4047-8a06-a052d86bd01c","timestamp":1749176893851,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b4526a9f-d37b-46d4-95c5-a044a9a95b99","data":{"dongle_infos":[]},"tid":"3de7a7ad-e830-49a4-9d5b-6b15dfd36f99","timestamp":1749176893866,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7cc67fcb-ba56-4687-ada2-85d6e295eaf8","data":{"mobility_status_notify":0},"need_reply":1,"tid":"331cca7e-db09-4913-9361-3a517e0bbcbe","timestamp":1749176893873,"gateway":"8UUXN4P00A06NK"} + +{"bid":"af4f223d-3636-43c3-a2fc-3fb5e92a35f0","data":{"firmware_version":"13.01.0002"},"tid":"0f798998-6e20-41a3-b2ec-ff0c91761a83","timestamp":1749176893914,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ed5d837a-8175-404c-9738-29e38a90317f","data":{"dongle_infos":[]},"tid":"e6ebefec-918e-45c2-ab2b-3c9ccd2b212f","timestamp":1749176894870,"gateway":"8UUXN4P00A06NK"} + +{"tid":"6f37b39f-32bd-44af-9eb3-67d9cfacbe2e","bid":"db490078-bb62-42a7-88f2-b980c120fc3f","timestamp":1749176894874,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"95cbac60-111c-4dbb-9720-7992851eab2b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"76ade305-8c5b-49d2-a5d3-ae60487819d8","timestamp":1749176895026,"gateway":"8UUXN4P00A06NK"} + +{"bid":"778bdf76-1133-4e09-a48f-c37ad29e07af","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a6692b24-b33c-4047-8a06-a052d86bd01c","timestamp":1749176896038,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7cc67fcb-ba56-4687-ada2-85d6e295eaf8","data":{"mobility_status_notify":0},"need_reply":1,"tid":"331cca7e-db09-4913-9361-3a517e0bbcbe","timestamp":1749176896038,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ed8255cb-b25b-40d4-9a3f-91e74096de61","bid":"974ef528-7e5c-4186-8292-58aa2ae6d397","timestamp":1749176923248,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"97a640c4-b965-4f34-8f50-1e1ccc6bf4af","bid":"3c6a2538-ec6e-4f84-bcc5-50b1425a9a63","timestamp":1749176923258,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"5f8d7a8a-ec82-4801-b79e-f827cc0fa889","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f8f38dcb-0470-4c9b-bba4-b9e789e74009","timestamp":1749176925416,"gateway":"8UUXN4P00A06NK"} + +{"bid":"140eb6d5-8014-4539-af86-c297b0c15509","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ae863d4d-e140-4572-a3e1-a69f104786ed","timestamp":1749176925437,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fa074ee0-f440-42ec-854d-d1764f0d891e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"4b94a81d-b155-4383-8b0a-b084d8bd46b0","timestamp":1749176925439,"gateway":"8UUXN4P00A06NK"} + +{"bid":"91e1ab5d-4025-468e-b0b0-868e9e64560a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"66253f9c-71e3-4da1-a397-1a5bf228c048","timestamp":1749176925485,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d8bc76c6-2976-4ba6-927d-3ac5d8c4216a","data":{"dongle_infos":[]},"tid":"c3111d4b-06c7-4859-bbc6-8bab341e9153","timestamp":1749176925489,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ac3e71b7-dd26-416a-b4bb-8f20a9c16825","data":{"firmware_version":"13.01.0002"},"tid":"c4cdd27e-96e0-4f93-8ce9-2c6d88cc8cb5","timestamp":1749176925496,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d6a2fc44-e9ec-44b7-a262-851a4ea78c06","bid":"1a62defb-497c-416e-87ff-1f60581f42fc","timestamp":1749176926015,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"9019b80d-fc02-4ee5-9f26-973db9a82d81","data":{"dongle_infos":[]},"tid":"bdc16392-8d2e-44cb-a666-c362b723d83c","timestamp":1749176926495,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5f8d7a8a-ec82-4801-b79e-f827cc0fa889","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f8f38dcb-0470-4c9b-bba4-b9e789e74009","timestamp":1749176927445,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fa074ee0-f440-42ec-854d-d1764f0d891e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"4b94a81d-b155-4383-8b0a-b084d8bd46b0","timestamp":1749176927446,"gateway":"8UUXN4P00A06NK"} + +{"bid":"140eb6d5-8014-4539-af86-c297b0c15509","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ae863d4d-e140-4572-a3e1-a69f104786ed","timestamp":1749176927446,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eb1b9c1a-885f-4523-bcf1-ada6669b0302","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bf12811b-bcdc-4964-9c5a-a30f5ecba9a3","timestamp":1749176928247,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4125329b-6e6e-4b9b-97df-3c08727b498f","data":{"dongle_infos":[]},"tid":"c7047cf2-8917-4f98-8b29-75699ac93652","timestamp":1749176928623,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7895ae7b-582d-4a4a-a2bb-a7c0c0faf9b5","data":{"departure_trajectory":[]},"tid":"a121a755-e65a-4bc4-9cae-ea15fde46ec3","timestamp":1749176929667,"gateway":"8UUXN4P00A06NK"} + +{"bid":"91e1ab5d-4025-468e-b0b0-868e9e64560a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"66253f9c-71e3-4da1-a397-1a5bf228c048","timestamp":1749176929689,"gateway":"8UUXN4P00A06NK"} + +{"bid":"86e5c0d0-aa29-4aca-9f49-6c16752848b3","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7edcfaf4-30b4-44cb-bdb5-8e9078db8071","timestamp":1749176961720,"gateway":"8UUXN4P00A06NK"} + +{"bid":"efcd4367-48fc-40f7-947e-26dd6a0deaa1","data":{"departure_trajectory":[]},"tid":"dd0e2361-f890-447f-8089-2e74747eab02","timestamp":1749176962184,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e60c099d-28ed-40a6-9664-7e322e698353","data":{"departure_trajectory":[]},"tid":"5a61365d-5f45-4a7e-abc6-655f24eea704","timestamp":1749176962404,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c3d29cd9-1f1e-46e8-8d46-f2ea9b4674d8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c7e4e677-6da6-4bf4-9521-5471035e91de","timestamp":1749176962702,"gateway":"8UUXN4P00A06NK"} + +{"bid":"81a76406-e857-4a4e-9428-5c44663ddc21","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e1fea1be-147c-49aa-9193-417095e9fbcb","timestamp":1749176963702,"gateway":"8UUXN4P00A06NK"} + +{"bid":"62461d48-6ef9-48a3-9968-83a9130e846f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"4a026ea9-3a5b-40eb-983f-df73eacf3375","timestamp":1749176963705,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8d86d810-50ff-4f99-8c14-4b9abf7ab8d8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ba40d164-96fe-49d8-803d-766e2f4a2bc8","timestamp":1749176965576,"gateway":"8UUXN4P00A06NK"} + +{"tid":"a1538831-a868-4bcf-aab4-41afc4ca7869","bid":"e1cf2689-1fcf-4e5c-8b6d-6983b7c0088b","timestamp":1749176992660,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"31e8b85f-bf64-4a39-b99e-c6ee69998901","bid":"442b4e39-1ba6-4250-a9ed-95d45d9b9017","timestamp":1749176992663,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"9afad251-20aa-437e-bf6f-6104b75ed012","data":{"air_transfer_enable":false},"need_reply":1,"tid":"a305bc72-2e91-4cb5-8512-98c378dca5f8","timestamp":1749176993967,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a5e27c3f-1b47-4e0a-9252-f09a064cc320","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a9b147cc-97b6-42ed-b455-d8d16c998814","timestamp":1749176995906,"gateway":"8UUXN4P00A06NK"} + +{"bid":"02ab2a68-4e9b-422d-ac00-7d098ae3df6a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"98c3094f-ac3a-484f-ba8d-f6515f330c79","timestamp":1749176995909,"gateway":"8UUXN4P00A06NK"} + +{"bid":"802cdbbe-2ff4-4f72-b2ae-d544e923cd78","data":{"dongle_infos":[]},"tid":"ce2f409c-a2a4-4167-a2ad-acce1d0949a6","timestamp":1749176996354,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f904306c-24a6-466e-b8f0-447fe93bfe59","data":{"firmware_version":"13.01.0002"},"tid":"c7d6cf60-a3bd-446d-bbf4-61ec8b756fcf","timestamp":1749176996361,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9afad251-20aa-437e-bf6f-6104b75ed012","data":{"air_transfer_enable":false},"need_reply":1,"tid":"a305bc72-2e91-4cb5-8512-98c378dca5f8","timestamp":1749176996625,"gateway":"8UUXN4P00A06NK"} + +{"tid":"340e939c-d57a-4f26-8f94-3a3aa8f1780b","bid":"0fd73af4-32f5-4daf-8cdf-ff8c5e22d081","timestamp":1749176996818,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"1108174c-e7ca-4d35-bc88-11582207b107","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"60529cc0-969f-4a32-bf8a-a2e253568b97","timestamp":1749176997009,"gateway":"8UUXN4P00A06NK"} + +{"bid":"891bb22e-cc0a-4326-a7b5-f9f661d74db9","data":{"dongle_infos":[]},"tid":"1943ba65-d6de-42e2-b360-d0c0542d1c56","timestamp":1749176997371,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ce38cbab-dfa8-447f-ac15-6eb3142059da","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"647c6d36-b91e-4928-859e-dc3e06ca07cc","timestamp":1749176997666,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a5e27c3f-1b47-4e0a-9252-f09a064cc320","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a9b147cc-97b6-42ed-b455-d8d16c998814","timestamp":1749176997942,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1108174c-e7ca-4d35-bc88-11582207b107","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"60529cc0-969f-4a32-bf8a-a2e253568b97","timestamp":1749176999142,"gateway":"8UUXN4P00A06NK"} + +{"tid":"52726c61-f750-4c77-a7b8-f706c8e3013d","bid":"a2ffe4f2-ce51-4122-9c67-6e84e83a062b","timestamp":1749177023785,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"d623b819-ffa2-4ee2-962c-44e0dae31ba8","bid":"292988bb-9376-43c0-baf7-9b4dada927cd","timestamp":1749177023788,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"37bddf7f-8b0a-4060-8091-debfaa6d90d1","data":{"air_transfer_enable":false},"need_reply":1,"tid":"553d0a34-9ca9-42ec-874b-a10b330309a0","timestamp":1749177026150,"gateway":"8UUXN4P00A06NK"} + +{"tid":"88164e73-9b91-4702-9e80-a938eca52d16","bid":"9ff41b18-f1ee-4d40-892f-e0ae45c19fa0","timestamp":1749177028329,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"16da5b58-6b61-419e-ba8d-ba9849440492","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c7ce5fe7-4e1a-4dba-832b-afc7948105f4","timestamp":1749177028335,"gateway":"8UUXN4P00A06NK"} + +{"bid":"37bddf7f-8b0a-4060-8091-debfaa6d90d1","data":{"air_transfer_enable":false},"need_reply":1,"tid":"553d0a34-9ca9-42ec-874b-a10b330309a0","timestamp":1749177028721,"gateway":"8UUXN4P00A06NK"} + +{"bid":"78dbb453-9adb-40e9-a5f7-3a69aafce3b2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6d031c5a-2ce3-4959-87d5-4bf1962285e7","timestamp":1749177028794,"gateway":"8UUXN4P00A06NK"} + +{"bid":"58d6fa9f-53fd-4fa5-9aef-6986a26620ec","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"731f2652-0ab2-407e-b665-727bcc491383","timestamp":1749177028932,"gateway":"8UUXN4P00A06NK"} + +{"bid":"28a592b9-ed25-43c4-9e80-4a9ac5867d3d","data":{"dongle_infos":[]},"tid":"895a4b2a-349c-41e2-929b-000dd65a94da","timestamp":1749177028946,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1d728aba-f719-49fc-80cd-3b02da9e97ef","data":{"mobility_status_notify":0},"need_reply":1,"tid":"012b6ec2-ca21-4b2f-b8d3-923530c05436","timestamp":1749177028954,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f843ee7f-f7a7-449a-93f0-7a219213070c","data":{"firmware_version":"13.01.0002"},"tid":"a6144d46-0cf4-4bd6-a377-76b4fe5582bb","timestamp":1749177028988,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2f11c778-bacc-4486-90ff-85c6dff6a51b","data":{"dongle_infos":[]},"tid":"e0484950-c4c1-4cb4-8a39-14d0a5a0a8b6","timestamp":1749177029938,"gateway":"8UUXN4P00A06NK"} + +{"tid":"2086d68b-2248-4644-b20d-4cdd3db19f44","bid":"589d4a78-cb2a-4f34-a081-8657d229a69f","timestamp":1749177054303,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"c67d35dd-bcbb-4f8b-979e-18743f092b64","bid":"b139736e-dda7-4bd1-a479-f108a9cd21f7","timestamp":1749177054315,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"d05d0895-62ca-48ff-8fe0-d8393aaf4790","bid":"ce81c775-bf33-4eb8-b048-865b2bb45692","timestamp":1749177054353,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"fdfaf8f1-db2b-46ec-9355-798635d38311","bid":"98e58ed2-8abe-4c19-8622-f85b6b662553","timestamp":1749177054355,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"148c7f58-5273-4de7-93e7-d0c1adbc28c4","bid":"d48903c8-116f-4242-b99a-450dd8d10b5b","timestamp":1749177054357,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"74d6cac5-f8aa-4209-94d2-535c82f4f8a1","data":{"air_transfer_enable":false},"need_reply":1,"tid":"0e542f96-3bfb-48e8-b218-f5f68dfa25a0","timestamp":1749177057001,"gateway":"8UUXN4P00A06NK"} + +{"bid":"104b6889-a646-432c-9faf-78ecb3fc40e8","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0fd95244-99e7-43d5-8b4c-c8480ee3a363","timestamp":1749177058942,"gateway":"8UUXN4P00A06NK"} + +{"bid":"79b65e9d-39c6-41a1-9c2c-a33e53798ffc","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"146a6256-9b02-4d22-9fd8-b2c48653365a","timestamp":1749177058950,"gateway":"8UUXN4P00A06NK"} + +{"bid":"caf2f1a0-2959-4595-bd35-e45ee0e04fa0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e16e2954-33c3-460c-86e5-0d8eab3dc0f0","timestamp":1749177059307,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c06dde0b-12e4-4e75-bbcf-45ffe8665c7e","data":{"dongle_infos":[]},"tid":"20549dd3-3122-4f3d-aa77-166352f1e7d8","timestamp":1749177059327,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ef87bb6d-f972-46c2-8418-102cc7aaef74","data":{"firmware_version":"13.01.0002"},"tid":"304dc7db-e272-4f7b-8542-9371a718b1b5","timestamp":1749177059335,"gateway":"8UUXN4P00A06NK"} + +{"bid":"81093a4a-6281-42c3-8431-ca88038bb339","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"90f0c227-2556-464c-8e39-1607c7086505","timestamp":1749177059350,"gateway":"8UUXN4P00A06NK"} + +{"bid":"74d6cac5-f8aa-4209-94d2-535c82f4f8a1","data":{"air_transfer_enable":false},"need_reply":1,"tid":"0e542f96-3bfb-48e8-b218-f5f68dfa25a0","timestamp":1749177059521,"gateway":"8UUXN4P00A06NK"} + +{"tid":"238aa518-e723-4c52-a7f6-f4264a616ef5","bid":"1bbc3cd3-4d57-4f01-9aee-fca34ffe8574","timestamp":1749177059829,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"19991eab-1dfc-471a-a4ac-0f155308f94a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"9778314b-cfb5-492d-860f-cae07dcdab14","timestamp":1749177060068,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1f76c44a-11e4-456c-904c-d6b0f18acd7b","data":{"dongle_infos":[]},"tid":"97500629-299e-4ad1-b381-801db4c2eaf5","timestamp":1749177060331,"gateway":"8UUXN4P00A06NK"} + +{"bid":"104b6889-a646-432c-9faf-78ecb3fc40e8","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0fd95244-99e7-43d5-8b4c-c8480ee3a363","timestamp":1749177061129,"gateway":"8UUXN4P00A06NK"} + +{"tid":"581245fc-7480-427c-9b77-437278753e56","bid":"4fdb8168-6ef4-4d18-80e2-44950be58800","timestamp":1749177086603,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"bc2c7098-3507-4201-8ac5-87780c63f1fe","bid":"bd2ad105-5ab1-4c93-bf27-2a706ea8e040","timestamp":1749177086607,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"4b3f576b-a894-463f-b494-934fef235a7e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"545be578-cfeb-4de8-8045-87f9685bc788","timestamp":1749177088691,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9f97e5bd-6518-4b23-a645-1aa5483622b1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e4b2cbee-1568-4023-81bc-a9a5eaf7fe23","timestamp":1749177088711,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7b668f28-6a5b-44ef-adb5-c6b550ebab4a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"9d6d2c24-d373-4e75-99e0-105098c290d1","timestamp":1749177088717,"gateway":"8UUXN4P00A06NK"} + +{"bid":"39fe65ab-d1cb-4d3e-bc2e-a7bd68f08cff","data":{"dongle_infos":[]},"tid":"067b3c66-de2a-4e7a-9bf9-a5e00450b814","timestamp":1749177088733,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7cd5bc16-9f93-4aba-a152-b88b288dfdd8","data":{"firmware_version":"13.01.0002"},"tid":"32032813-d856-4d57-bbba-f3e3b9a7683c","timestamp":1749177088741,"gateway":"8UUXN4P00A06NK"} + +{"tid":"6b90c82d-ba53-429a-b7dc-199abe2ef1d4","bid":"77f00d6b-4eb2-445c-b863-f4e1581553bd","timestamp":1749177088846,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"57bfa6bb-f9e7-4c9d-996d-161d83953df8","data":{"air_transfer_enable":false},"need_reply":1,"tid":"752777f2-45c3-4a6f-a085-cc5a15256e8a","timestamp":1749177088926,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e7b8ec79-dae3-47ff-b3d0-87e82dd70bbb","data":{"dongle_infos":[]},"tid":"08cab1a4-cbaa-473e-8c58-83e2ce3a4d7e","timestamp":1749177089735,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4b3f576b-a894-463f-b494-934fef235a7e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"545be578-cfeb-4de8-8045-87f9685bc788","timestamp":1749177090732,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9f97e5bd-6518-4b23-a645-1aa5483622b1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e4b2cbee-1568-4023-81bc-a9a5eaf7fe23","timestamp":1749177090733,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7b668f28-6a5b-44ef-adb5-c6b550ebab4a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"9d6d2c24-d373-4e75-99e0-105098c290d1","timestamp":1749177090734,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7a86faba-7447-4707-8da9-e59fabb50e55","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ac883f25-3e9e-4493-af88-666cbd17875f","timestamp":1749177091603,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ce44153e-1fc3-47e9-beb5-d3628eafadf5","data":{"dongle_infos":[]},"tid":"876a6098-a9b3-43b4-a214-2496a27a2b50","timestamp":1749177092891,"gateway":"8UUXN4P00A06NK"} + +{"bid":"57bfa6bb-f9e7-4c9d-996d-161d83953df8","data":{"air_transfer_enable":false},"need_reply":1,"tid":"752777f2-45c3-4a6f-a085-cc5a15256e8a","timestamp":1749177093121,"gateway":"8UUXN4P00A06NK"} + +{"bid":"71b601f2-e764-4e32-8530-e45a49a429ea","data":{"departure_trajectory":[]},"tid":"d7411c3a-5b5e-45fa-8f6b-61e9039b163c","timestamp":1749177093216,"gateway":"8UUXN4P00A06NK"} + +{"bid":"288b605c-61bf-4140-82f3-30e80f875646","data":{"departure_trajectory":[]},"tid":"43a49faf-7e7d-41d9-9f7b-092127dfcdb3","timestamp":1749177093723,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7a86faba-7447-4707-8da9-e59fabb50e55","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ac883f25-3e9e-4493-af88-666cbd17875f","timestamp":1749177093732,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4b3f576b-a894-463f-b494-934fef235a7e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"545be578-cfeb-4de8-8045-87f9685bc788","timestamp":1749177094931,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7b668f28-6a5b-44ef-adb5-c6b550ebab4a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"9d6d2c24-d373-4e75-99e0-105098c290d1","timestamp":1749177094933,"gateway":"8UUXN4P00A06NK"} + +{"bid":"67ef8aa5-73c6-4863-8a96-cccaa2dac071","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5b396859-06cf-42c2-8310-4a0238cb3d1a","timestamp":1749177096605,"gateway":"8UUXN4P00A06NK"} + +{"tid":"1b7efd28-ff3e-412e-bb6b-a0f082d1001a","bid":"98a6cbee-f2ec-4ff3-a281-b5fdb98a1393","timestamp":1749177123765,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"5deab9f8-aafc-4564-956d-08d43e20af7c","bid":"cc369375-ec1a-4f0e-8875-f0be80d251a7","timestamp":1749177123772,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"7f86335c-3764-4b5d-bbf4-223d22a9527b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"f3b593c8-1360-4f16-a4e6-585edcfde73c","timestamp":1749177125082,"gateway":"8UUXN4P00A06NK"} + +{"bid":"31f0e7ec-f4c8-46bf-a5e3-2926ec07f22a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9c037823-aa62-427f-8fd9-e1a1d4840d3a","timestamp":1749177127216,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7f86335c-3764-4b5d-bbf4-223d22a9527b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"f3b593c8-1360-4f16-a4e6-585edcfde73c","timestamp":1749177127859,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b792b4f5-3b29-4f82-8e3d-a4ec65b29b5f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e5dbd83d-c484-45d4-900a-ed1d9b504e2e","timestamp":1749177127869,"gateway":"8UUXN4P00A06NK"} + +{"tid":"bd548427-38f8-45db-acab-b2f3b4b29e1d","bid":"0997c09c-0efe-4bc3-8497-bf529ba55800","timestamp":1749177127883,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"6478754a-cda7-4852-bad3-fba10266ca69","data":{"dongle_infos":[]},"tid":"4b10a16a-ec2d-47b3-bbc4-eacf6965d05c","timestamp":1749177127886,"gateway":"8UUXN4P00A06NK"} + +{"bid":"681ee41f-ab24-4bef-a928-a5982d77768e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"8d061e97-85c6-42fb-8f45-f4866d2e24a3","timestamp":1749177127892,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4f16ed6c-5bd2-419a-a436-b7fa095f793e","data":{"firmware_version":"13.01.0002"},"tid":"d785cf2c-1b66-40a0-8431-bd40632e3ed7","timestamp":1749177127904,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a0f43466-55d3-4245-b42d-4a3c3b3f40c9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ef60f610-4e95-4de2-9a53-df0293f9e569","timestamp":1749177128773,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ac0a1fb6-2771-4eab-b226-bf9ccd15a854","data":{"dongle_infos":[]},"tid":"27ccd09a-e37c-4db2-b808-d2f7b2a0a3d8","timestamp":1749177128916,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b792b4f5-3b29-4f82-8e3d-a4ec65b29b5f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e5dbd83d-c484-45d4-900a-ed1d9b504e2e","timestamp":1749177129943,"gateway":"8UUXN4P00A06NK"} + +{"bid":"681ee41f-ab24-4bef-a928-a5982d77768e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"8d061e97-85c6-42fb-8f45-f4866d2e24a3","timestamp":1749177129945,"gateway":"8UUXN4P00A06NK"} + +{"tid":"0c01d40b-495c-4dd7-8d6d-51e2f35dda94","bid":"7fecb6f9-cae2-4043-b556-3060e1d72eeb","timestamp":1749177158096,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"9794735f-485a-4ada-a25e-5e4dbf787936","bid":"cf5a71bf-1f7a-463d-9fea-4998d58e3dbf","timestamp":1749177158099,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"22103b52-25ff-48b7-ba71-6a3d9ddcb2ed","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"cad1a1e1-27b8-4753-b4ab-4ef25dca5dfc","timestamp":1749177159658,"gateway":"8UUXN4P00A06NK"} + +{"bid":"007350f1-2484-4a3f-af50-662eb5d14ad3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6e92cf4d-31bf-4eb7-9bfd-47b5b17647b4","timestamp":1749177159674,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9dbe792e-22f4-4fe2-bf4f-1bc10a647179","data":{"mobility_status_notify":0},"need_reply":1,"tid":"cb647550-1216-4df6-b68b-2f3f0022eb81","timestamp":1749177159678,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9e551bc5-417d-474f-b184-694f5cf2c89b","data":{"dongle_infos":[]},"tid":"94e18b7e-04e2-42fe-9c6c-c4222254cfd7","timestamp":1749177159685,"gateway":"8UUXN4P00A06NK"} + +{"bid":"468b180c-42fb-4ee9-8a87-3f242f4cdbe9","data":{"firmware_version":"13.01.0002"},"tid":"f228d133-22c7-44dc-8222-68bdf7dae3a6","timestamp":1749177159698,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e068bf8b-9f44-41ca-acb0-041fd1dc27c9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2da57bcb-4bbd-403d-8fd0-9a8b258344dc","timestamp":1749177159798,"gateway":"8UUXN4P00A06NK"} + +{"tid":"df87f75c-702f-477c-a48a-a94bacd0f532","bid":"87b72199-be99-47db-9282-85f27e767cea","timestamp":1749177159905,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"51a3ea70-5578-413e-890b-6fb19b5b844f","data":{"dongle_infos":[]},"tid":"55a6232b-b194-415c-a956-84aa97179c0a","timestamp":1749177160668,"gateway":"8UUXN4P00A06NK"} + +{"bid":"22103b52-25ff-48b7-ba71-6a3d9ddcb2ed","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"cad1a1e1-27b8-4753-b4ab-4ef25dca5dfc","timestamp":1749177161676,"gateway":"8UUXN4P00A06NK"} + +{"bid":"007350f1-2484-4a3f-af50-662eb5d14ad3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6e92cf4d-31bf-4eb7-9bfd-47b5b17647b4","timestamp":1749177161879,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9dbe792e-22f4-4fe2-bf4f-1bc10a647179","data":{"mobility_status_notify":0},"need_reply":1,"tid":"cb647550-1216-4df6-b68b-2f3f0022eb81","timestamp":1749177161880,"gateway":"8UUXN4P00A06NK"} + +{"bid":"98b45012-3517-4579-8c74-603a9e9a9298","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6760f1a6-007c-439c-9e0f-c17e98e1b964","timestamp":1749177163096,"gateway":"8UUXN4P00A06NK"} + +{"bid":"183faa65-45bc-4cda-bf17-834e8d7d15c9","data":{"dongle_infos":[]},"tid":"f7874f27-beaf-4a1e-b188-bba7e92830c9","timestamp":1749177163948,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e068bf8b-9f44-41ca-acb0-041fd1dc27c9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2da57bcb-4bbd-403d-8fd0-9a8b258344dc","timestamp":1749177163998,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4be9b212-34b2-4677-8645-62e0e63a971a","data":{"departure_trajectory":[]},"tid":"9a6d9acd-1d91-4eba-8399-cd4d67eb4c92","timestamp":1749177164659,"gateway":"8UUXN4P00A06NK"} + +{"bid":"29745bb4-5985-4ab2-b1c0-c6ff253cb04e","data":{"departure_trajectory":[]},"tid":"c2117b3e-3d4f-4ecf-8a12-2b92e64d129c","timestamp":1749177164909,"gateway":"8UUXN4P00A06NK"} + +{"bid":"98b45012-3517-4579-8c74-603a9e9a9298","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6760f1a6-007c-439c-9e0f-c17e98e1b964","timestamp":1749177165275,"gateway":"8UUXN4P00A06NK"} + +{"bid":"22103b52-25ff-48b7-ba71-6a3d9ddcb2ed","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"cad1a1e1-27b8-4753-b4ab-4ef25dca5dfc","timestamp":1749177165874,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9dbe792e-22f4-4fe2-bf4f-1bc10a647179","data":{"mobility_status_notify":0},"need_reply":1,"tid":"cb647550-1216-4df6-b68b-2f3f0022eb81","timestamp":1749177166077,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b0b9c0ac-b9a7-43b4-b6b2-3c98e4ce77ba","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5353ae8a-2893-45f1-96c6-3f4dd43f6fe0","timestamp":1749177168099,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b0b9c0ac-b9a7-43b4-b6b2-3c98e4ce77ba","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5353ae8a-2893-45f1-96c6-3f4dd43f6fe0","timestamp":1749177170279,"gateway":"8UUXN4P00A06NK"} + +{"tid":"13249015-ef9b-476b-8915-4e9c06fdd77f","bid":"41f51db8-10cc-4de6-bc10-32536c80773c","timestamp":1749177193565,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"ee401800-daea-4163-a1f7-ad00022ad3b7","bid":"c17b84d1-ca31-4b08-bf93-2d9c24ae13d6","timestamp":1749177193568,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"25dde3f2-820d-48ec-9138-be7a2618933b","bid":"beac5a94-f6a9-40ca-8ebd-94deed9303a9","timestamp":1749177193647,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"3d60b8f9-18d7-4f71-a28e-318dd9cb6cb1","bid":"c57ddad5-43d5-414b-be7c-4be2f228a43e","timestamp":1749177193653,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"994fb96f-98ad-44cf-8a3b-139904e17692","bid":"a2cdede5-5b7c-4c10-a4db-ba7e242db1ba","timestamp":1749177193656,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"98018ffd-065d-4a0b-a017-cfa92b2dbd68","data":{"air_transfer_enable":false},"need_reply":1,"tid":"77b34c35-2ad9-4935-805b-60bacfa0a02a","timestamp":1749177195623,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3c289eea-a339-4367-8526-114156d92015","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f10bdb44-07bd-41d5-8b9d-d7a55791858b","timestamp":1749177197625,"gateway":"8UUXN4P00A06NK"} + +{"bid":"99a5f3fe-8980-49a4-b31a-dade3256ca6e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5084ddb8-ba1c-49f4-949e-021e910bf7c8","timestamp":1749177197628,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e5398e67-6ae2-4df9-ba06-7def2b15e0a4","data":{"dongle_infos":[]},"tid":"af4941c1-2978-4d91-8997-3445673830eb","timestamp":1749177198059,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f7f097e8-6fbd-4c5d-a538-1f5c9fb86406","data":{"firmware_version":"13.01.0002"},"tid":"f7ad7cf8-aabf-409b-ba43-44449ccd53b1","timestamp":1749177198072,"gateway":"8UUXN4P00A06NK"} + +{"bid":"98018ffd-065d-4a0b-a017-cfa92b2dbd68","data":{"air_transfer_enable":false},"need_reply":1,"tid":"77b34c35-2ad9-4935-805b-60bacfa0a02a","timestamp":1749177198252,"gateway":"8UUXN4P00A06NK"} + +{"tid":"40fe903e-8c0e-4840-b721-4a4310b80d54","bid":"1c36fb8c-1789-4b0d-920f-1edc71f7c68e","timestamp":1749177198256,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"00dc97ea-73ad-4df8-a24d-6d5f00e0fbe1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"437d66f4-9c9c-4eca-9646-54c670bea11f","timestamp":1749177198563,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9966cfe8-5848-49b6-a757-0db5b3983ac6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"41058ae6-32a9-4e63-96c2-57d3e5d31f8b","timestamp":1749177198644,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7b27fefb-9e61-4b59-ac5b-dfbc71717abd","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"311a1c65-74d6-43f1-8da8-763911f34446","timestamp":1749177198700,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7595c1a6-1865-429d-b453-7348415778c0","data":{"dongle_infos":[]},"tid":"aa2cd0a1-a358-4a43-818c-2251bd87f3dd","timestamp":1749177199088,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3c289eea-a339-4367-8526-114156d92015","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f10bdb44-07bd-41d5-8b9d-d7a55791858b","timestamp":1749177199770,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c41abf8b-6dcf-4da8-9814-f0390fe591f5","bid":"32162fb2-4ffa-4ef5-b493-26f2fba98d7b","timestamp":1749177227579,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"c1e2735e-f897-4a7e-9d29-ff3ee4e6a04e","bid":"15f019f2-2ee7-4ecf-973f-447d37839df8","timestamp":1749177227585,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"96095e8f-e752-4b75-9aaf-9f2dd5ac8b2e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b6b82d35-b47b-43c8-9592-01a81b3f8457","timestamp":1749177229363,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7fe5c7aa-ca0d-4cbe-bc12-cb2ac7d08673","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a971622c-cf84-4ed0-9c38-01604d2b247a","timestamp":1749177229381,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a7bc9c25-a2d2-4d0e-9332-8a640b92c68c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5fc05c91-410a-404e-8023-ef4cad997584","timestamp":1749177229387,"gateway":"8UUXN4P00A06NK"} + +{"bid":"356ef7df-5a52-4277-8278-4d9fcb6f1165","data":{"dongle_infos":[]},"tid":"ee7c268a-9ce5-43d5-a00a-afc2a10f3224","timestamp":1749177229484,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9f5636b6-ddc8-433c-9ab5-a8ec7bc3f8c8","data":{"firmware_version":"13.01.0002"},"tid":"5b2ea08f-61d4-47fb-b96d-6e48bdfa71db","timestamp":1749177229492,"gateway":"8UUXN4P00A06NK"} + +{"tid":"caf78300-a30a-4b0a-8f83-18dbd9bc6199","bid":"735573a9-c8b1-419b-ada4-dc941f1c832b","timestamp":1749177229520,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"fe469b05-6278-45ff-84dc-57a42efeee2b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"46cef765-d5e7-4d77-800c-ed001dc65b5d","timestamp":1749177229678,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5b853fea-b303-4310-8101-ecff0116be3f","data":{"dongle_infos":[]},"tid":"c5e1f15a-5628-4e81-8bb2-c035a1026593","timestamp":1749177230485,"gateway":"8UUXN4P00A06NK"} + +{"bid":"96095e8f-e752-4b75-9aaf-9f2dd5ac8b2e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b6b82d35-b47b-43c8-9592-01a81b3f8457","timestamp":1749177231371,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7fe5c7aa-ca0d-4cbe-bc12-cb2ac7d08673","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a971622c-cf84-4ed0-9c38-01604d2b247a","timestamp":1749177231571,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a7bc9c25-a2d2-4d0e-9332-8a640b92c68c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5fc05c91-410a-404e-8023-ef4cad997584","timestamp":1749177231573,"gateway":"8UUXN4P00A06NK"} + +{"bid":"05a753c2-5dec-4794-9169-ecfd38e49e63","data":{"dongle_infos":[]},"tid":"3a5458d4-6c24-4e42-86e2-5c085c2c3e59","timestamp":1749177232453,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a28c9f19-ad67-454d-bf85-366ca728dd23","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cf4479cb-b05b-4f8b-ba23-5477b995e20a","timestamp":1749177232588,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fe469b05-6278-45ff-84dc-57a42efeee2b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"46cef765-d5e7-4d77-800c-ed001dc65b5d","timestamp":1749177233873,"gateway":"8UUXN4P00A06NK"} + +{"bid":"52ae7ee3-81f9-45af-b773-e95d29c22b05","data":{"departure_trajectory":[]},"tid":"ef89411f-65c9-4bec-88d8-8ef479412baf","timestamp":1749177234202,"gateway":"8UUXN4P00A06NK"} + +{"bid":"176c66e3-a89f-4a88-9a5f-324ddce7a662","data":{"departure_trajectory":[]},"tid":"157aa87b-a3c6-4678-9668-983b8d15acb9","timestamp":1749177234471,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a28c9f19-ad67-454d-bf85-366ca728dd23","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cf4479cb-b05b-4f8b-ba23-5477b995e20a","timestamp":1749177234771,"gateway":"8UUXN4P00A06NK"} + +{"bid":"96095e8f-e752-4b75-9aaf-9f2dd5ac8b2e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b6b82d35-b47b-43c8-9592-01a81b3f8457","timestamp":1749177235569,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a7bc9c25-a2d2-4d0e-9332-8a640b92c68c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5fc05c91-410a-404e-8023-ef4cad997584","timestamp":1749177235770,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ebc8fe80-d8a2-42a1-88e7-de5d1e5005b1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cbd80087-17f7-4e93-891e-cd6061132898","timestamp":1749177237579,"gateway":"8UUXN4P00A06NK"} + +{"tid":"4b0b5446-0b2e-4cd4-89ce-70e570283b65","bid":"8a21e4b5-68a7-4f3d-93b6-54955dbb626f","timestamp":1749177265328,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"e0539800-9ea6-4753-a5ab-509b3d9c73e4","bid":"3693a16d-ed84-4aa8-9be6-3312f62e5179","timestamp":1749177265332,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"17711fde-8c12-4f3a-a882-d01a871bf197","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2cb796d6-8fe4-4de9-b063-dfd22f5d4bee","timestamp":1749177266210,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cbf93e6c-7a56-441b-95b7-19b78df18a98","data":{"air_transfer_enable":false},"need_reply":1,"tid":"40de810c-989f-4433-8215-22fa1d569b6a","timestamp":1749177266920,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e956a453-e93c-44d2-adaa-36a6ac6a9aaf","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ce923ff9-f88b-4db4-859e-455fef3b795b","timestamp":1749177267003,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e1fdf194-8746-4b74-9e12-89cca1430778","data":{"dongle_infos":[]},"tid":"67fcbf8f-9aba-409f-b4f4-d9277f861e9c","timestamp":1749177267019,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f022ac6b-9edf-4319-8021-7021ae044ed2","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d8a9e204-4157-46a4-9748-e31cf5fbaae7","timestamp":1749177267026,"gateway":"8UUXN4P00A06NK"} + +{"bid":"657ce069-d542-4ea9-9996-a7e9e4008acc","data":{"firmware_version":"13.01.0002"},"tid":"ae6fbc83-1077-4d40-8d72-2c86801d88f4","timestamp":1749177267063,"gateway":"8UUXN4P00A06NK"} + +{"tid":"812acb25-6e9a-4767-905e-8c0fa0febc96","bid":"6f379af2-2cfe-403f-b946-56a8fcf553f2","timestamp":1749177267322,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"9515cf14-5a5b-4d1b-853a-cc4672d7e2a5","data":{"dongle_infos":[]},"tid":"93c3da6b-e95e-4d7f-8c02-0fcd12be3a76","timestamp":1749177268066,"gateway":"8UUXN4P00A06NK"} + +{"bid":"17711fde-8c12-4f3a-a882-d01a871bf197","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2cb796d6-8fe4-4de9-b063-dfd22f5d4bee","timestamp":1749177268247,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e956a453-e93c-44d2-adaa-36a6ac6a9aaf","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ce923ff9-f88b-4db4-859e-455fef3b795b","timestamp":1749177269050,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f022ac6b-9edf-4319-8021-7021ae044ed2","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d8a9e204-4157-46a4-9748-e31cf5fbaae7","timestamp":1749177269051,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ffbbd779-48de-4115-b7ba-9ff9c2901523","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d32c1f8d-b92c-4d9c-ad24-c83ece17b059","timestamp":1749177270332,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cbf93e6c-7a56-441b-95b7-19b78df18a98","data":{"air_transfer_enable":false},"need_reply":1,"tid":"40de810c-989f-4433-8215-22fa1d569b6a","timestamp":1749177271126,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a5ccb74c-6dbd-4beb-b4cb-31a6e0695bec","data":{"dongle_infos":[]},"tid":"b52ce62f-61d6-45c8-a2db-b00424bfad4d","timestamp":1749177271684,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4c0c739c-1023-46bc-b6e6-34056d02aa70","data":{"departure_trajectory":[]},"tid":"c3cfe316-39b0-442a-88b2-8c9b190efd04","timestamp":1749177271984,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c3242ff4-3c36-4697-bd93-cc44ee720afc","data":{"departure_trajectory":[]},"tid":"dd39f547-93c7-41b7-af24-3499715a63fe","timestamp":1749177272013,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ffbbd779-48de-4115-b7ba-9ff9c2901523","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d32c1f8d-b92c-4d9c-ad24-c83ece17b059","timestamp":1749177272450,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e956a453-e93c-44d2-adaa-36a6ac6a9aaf","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ce923ff9-f88b-4db4-859e-455fef3b795b","timestamp":1749177273249,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f022ac6b-9edf-4319-8021-7021ae044ed2","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d8a9e204-4157-46a4-9748-e31cf5fbaae7","timestamp":1749177273250,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b5e0e224-67a4-453a-9071-627f695ce3a6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4d314060-28c1-46d7-9897-e4bb46bc0a58","timestamp":1749177275330,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b5e0e224-67a4-453a-9071-627f695ce3a6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4d314060-28c1-46d7-9897-e4bb46bc0a58","timestamp":1749177277448,"gateway":"8UUXN4P00A06NK"} + +{"tid":"a4ad9d04-412d-4f12-bf5f-0e999b5d3ad3","bid":"120f1b3c-6691-47d9-99fa-1599b9806dd3","timestamp":1749177301280,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"5f5456fe-deb8-4bd6-9a8f-e2e84075321e","bid":"fcd6f764-591d-49a7-a383-ef40bc37e664","timestamp":1749177301289,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"ece074f3-ba8a-4aab-a2f8-effa0bbf21d7","bid":"a3c4f8e0-6e4f-47e1-ad7a-15c9a3c4dd87","timestamp":1749177301763,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"0f1f957b-6419-447c-89f8-143d38960eae","bid":"ad1a448a-4701-422d-8b68-948c82b622f0","timestamp":1749177301766,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"3b988bf3-30fd-4024-88b0-973d6d117745","bid":"67c93017-9ee7-466b-81f1-e42122eb39a8","timestamp":1749177301769,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"cf91f6de-00d0-430c-8293-469a5e60edcf","data":{"air_transfer_enable":false},"need_reply":1,"tid":"fbca6905-692a-45a2-8be4-26637caf83df","timestamp":1749177303144,"gateway":"8UUXN4P00A06NK"} + +{"bid":"81bfbd13-4ee2-4e42-a822-0e52a340a0d4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1213e5f1-4634-4c97-9317-52e7e2207509","timestamp":1749177305030,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b9b8b311-8c5e-4b5d-865c-0d0d98601830","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ec316477-ca1f-4c71-9892-b8a84cd1fe40","timestamp":1749177305685,"gateway":"8UUXN4P00A06NK"} + +{"bid":"21c0e7c2-d4d7-473d-bf64-57e3aa3e4010","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ce20287f-7f37-4fa4-9572-ad53d1045fe5","timestamp":1749177305699,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f765437f-9f4c-4a6a-83b0-43650d4c47df","data":{"dongle_infos":[]},"tid":"f29bb23c-ccb2-4595-b17c-f172ffd3df8b","timestamp":1749177305704,"gateway":"8UUXN4P00A06NK"} + +{"bid":"506e8498-5422-4874-9683-41b30b35d31b","data":{"dongle_infos":[]},"tid":"f9f5fc03-4b8f-4cea-bffa-b077b7c21f7f","timestamp":1749177305706,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dd99ff06-b062-4247-901b-88d55b5900f2","data":{"firmware_version":"13.01.0002"},"tid":"6994b677-db5a-485f-8fd0-99083721b5b1","timestamp":1749177305736,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cf91f6de-00d0-430c-8293-469a5e60edcf","data":{"air_transfer_enable":false},"need_reply":1,"tid":"fbca6905-692a-45a2-8be4-26637caf83df","timestamp":1749177305844,"gateway":"8UUXN4P00A06NK"} + +{"tid":"3f14579c-73f0-4ea0-99ce-cc89dd1a90f7","bid":"dbd6d73a-1c32-46b5-a6c8-47e1618abde0","timestamp":1749177306211,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"64ac05d0-5995-4d7c-8cf7-57f5040e6fec","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bcec3822-32fa-46a8-bc1a-c2e41d4c1d48","timestamp":1749177306276,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6e924f68-107b-4613-b9db-77c69a728488","data":{"dongle_infos":[]},"tid":"6c4e9b3b-68cb-4047-8cd9-2866bbcc16c5","timestamp":1749177306697,"gateway":"8UUXN4P00A06NK"} + +{"bid":"26c83ec7-04b6-4549-9eff-502b4cb32e1f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ed7ee3d0-0eff-4091-a188-f2947af7f8d5","timestamp":1749177306763,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b9b8b311-8c5e-4b5d-865c-0d0d98601830","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ec316477-ca1f-4c71-9892-b8a84cd1fe40","timestamp":1749177307811,"gateway":"8UUXN4P00A06NK"} + +{"bid":"21c0e7c2-d4d7-473d-bf64-57e3aa3e4010","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ce20287f-7f37-4fa4-9572-ad53d1045fe5","timestamp":1749177307812,"gateway":"8UUXN4P00A06NK"} + +{"tid":"1f63c939-9f95-47e3-8216-b0bd65742757","bid":"2331d3c9-d3d2-4474-b69e-5095b7104798","timestamp":1749177334311,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"05ba8a77-8336-490b-985b-45517c7001a3","bid":"84a291fc-d25f-426f-a93b-7882488c148c","timestamp":1749177334315,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"a53fa7d3-adfc-4135-81cf-0e5ba1d3033a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"caaacee2-ff4c-4c76-9c88-8fca2fec9dc7","timestamp":1749177335810,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8e9ef9c3-a4af-4928-89b9-a44e2dc74cb0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"db456193-83e8-4818-8b47-1f709bc72e2e","timestamp":1749177335827,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8ff4f79b-ff43-4c62-b6f4-1b5857d0a9c3","data":{"mobility_status_notify":0},"need_reply":1,"tid":"86d10f75-3dc9-4be2-9ea7-64d4b9b56349","timestamp":1749177335833,"gateway":"8UUXN4P00A06NK"} + +{"bid":"29dbab13-9025-4457-95f9-76465e5b5cbf","data":{"air_transfer_enable":false},"need_reply":1,"tid":"0dca57c0-1cd2-4bc7-ba74-26d9e59a1344","timestamp":1749177335851,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1e03c461-d18f-4e59-81ce-dcd9f6ffba72","data":{"dongle_infos":[]},"tid":"dacb1173-66d9-40a0-bd40-1ae1ae6268fa","timestamp":1749177335856,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7f6a4d21-7b6f-4b68-bfc4-8647b10a18fa","data":{"firmware_version":"13.01.0002"},"tid":"46910817-fe04-485c-993b-37d857232203","timestamp":1749177335864,"gateway":"8UUXN4P00A06NK"} + +{"tid":"435288eb-0d15-49d9-ac34-861e4e7e0366","bid":"283ca942-e1e2-4129-a99b-b71128dacdf1","timestamp":1749177336805,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"444740af-ae15-49ad-91fe-be1932b1ded7","data":{"dongle_infos":[]},"tid":"58ec00b1-7037-4126-bd5b-bc0549d04a06","timestamp":1749177336865,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a53fa7d3-adfc-4135-81cf-0e5ba1d3033a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"caaacee2-ff4c-4c76-9c88-8fca2fec9dc7","timestamp":1749177337908,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8e9ef9c3-a4af-4928-89b9-a44e2dc74cb0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"db456193-83e8-4818-8b47-1f709bc72e2e","timestamp":1749177337909,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8ff4f79b-ff43-4c62-b6f4-1b5857d0a9c3","data":{"mobility_status_notify":0},"need_reply":1,"tid":"86d10f75-3dc9-4be2-9ea7-64d4b9b56349","timestamp":1749177337910,"gateway":"8UUXN4P00A06NK"} + +{"bid":"92b9f60a-3492-4de4-b318-257192967ff0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d1148757-0422-4512-99d7-fa9c6b619be8","timestamp":1749177339312,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aaf040aa-2113-4c3d-9067-d7bca5d2db49","data":{"dongle_infos":[]},"tid":"1cba2134-9465-4c9b-804d-4519d5383d51","timestamp":1749177339462,"gateway":"8UUXN4P00A06NK"} + +{"bid":"29dbab13-9025-4457-95f9-76465e5b5cbf","data":{"air_transfer_enable":false},"need_reply":1,"tid":"0dca57c0-1cd2-4bc7-ba74-26d9e59a1344","timestamp":1749177340054,"gateway":"8UUXN4P00A06NK"} + +{"bid":"56c51874-bc91-41d8-9854-56534ded6cf5","data":{"departure_trajectory":[]},"tid":"e1bde433-41db-4e5c-9629-add629eb4a86","timestamp":1749177340849,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4ba07909-a58b-41ff-834a-38e54b4126dc","data":{"departure_trajectory":[]},"tid":"d799154c-3c88-468b-a762-0e3007d68475","timestamp":1749177340991,"gateway":"8UUXN4P00A06NK"} + +{"bid":"92b9f60a-3492-4de4-b318-257192967ff0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d1148757-0422-4512-99d7-fa9c6b619be8","timestamp":1749177341508,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a53fa7d3-adfc-4135-81cf-0e5ba1d3033a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"caaacee2-ff4c-4c76-9c88-8fca2fec9dc7","timestamp":1749177342108,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8ff4f79b-ff43-4c62-b6f4-1b5857d0a9c3","data":{"mobility_status_notify":0},"need_reply":1,"tid":"86d10f75-3dc9-4be2-9ea7-64d4b9b56349","timestamp":1749177342109,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6132690d-7ba3-4d8e-8bc5-25f89d800736","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"80e7f089-13c9-4c4c-9ad3-7fa471da02d7","timestamp":1749177344310,"gateway":"8UUXN4P00A06NK"} + +{"tid":"e836c3c0-fbf1-46a7-ab66-c18b3157f021","bid":"41e21b41-d0e7-441a-bea0-f7a80152b634","timestamp":1749177373545,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"9aef344d-feb9-4a33-b767-96354c87973c","bid":"f4dd2461-d735-4e29-96df-334356870872","timestamp":1749177373556,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"88ad9178-dda8-4f5b-91b8-5eb8c1296829","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5174f996-137f-469c-ac9b-6b4b11c3380c","timestamp":1749177374682,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7d56e6ed-21a6-4b2b-9e98-6d96ace1fbd9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"50d9c98b-6ac3-4061-80bf-71a9b0e11e12","timestamp":1749177374876,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a5f58b3c-c765-4a37-8595-3569aa4ea9e4","data":{"dongle_infos":[]},"tid":"b73178fd-42f7-48fc-9f3d-92094bca79bc","timestamp":1749177375068,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e97f4a1e-61ce-4c0e-bfcf-33e87f4b9fd7","data":{"firmware_version":"13.01.0002"},"tid":"9ec7f8ff-0527-4d94-8293-b0c3eb16ea90","timestamp":1749177375081,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e88dbdb-a7a3-47a7-a6b1-ed2ac376e36e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8f59429d-3176-4033-bb1e-24d6f39f5d0a","timestamp":1749177375264,"gateway":"8UUXN4P00A06NK"} + +{"tid":"aa7ff071-e23b-4f0d-abfc-e3cdc1328e1e","bid":"0fa4644d-f91f-4af1-82a3-b30510d31adb","timestamp":1749177375431,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"3d9a54b4-7d4d-4839-b213-1f4e7b58ddf9","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6c433f50-8259-4aa3-ba03-d1d119a5c5cc","timestamp":1749177375773,"gateway":"8UUXN4P00A06NK"} + +{"bid":"37ad1013-c580-4e6a-9e93-3e5ccc6e082f","data":{"dongle_infos":[]},"tid":"bc82a1fd-72da-407b-9011-afa955cecd47","timestamp":1749177376082,"gateway":"8UUXN4P00A06NK"} + +{"bid":"88ad9178-dda8-4f5b-91b8-5eb8c1296829","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5174f996-137f-469c-ac9b-6b4b11c3380c","timestamp":1749177376869,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7d56e6ed-21a6-4b2b-9e98-6d96ace1fbd9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"50d9c98b-6ac3-4061-80bf-71a9b0e11e12","timestamp":1749177377070,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3d9a54b4-7d4d-4839-b213-1f4e7b58ddf9","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6c433f50-8259-4aa3-ba03-d1d119a5c5cc","timestamp":1749177377871,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bf9d51b5-e0d0-474b-8064-344e5358fb70","data":{"dongle_infos":[]},"tid":"bcd1f00d-01c8-4bbf-b6da-31de44428551","timestamp":1749177378328,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d3de1868-9f97-4db5-b006-6f29649a77ca","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9775bf65-7ac4-4eb7-a2f3-7270f092bc57","timestamp":1749177378545,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e88dbdb-a7a3-47a7-a6b1-ed2ac376e36e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8f59429d-3176-4033-bb1e-24d6f39f5d0a","timestamp":1749177379461,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2bb4e8cb-def5-48fb-89a4-44141be48340","data":{"departure_trajectory":[]},"tid":"764d1ea8-53e2-4e84-8c2f-c92b61a7fe79","timestamp":1749177380057,"gateway":"8UUXN4P00A06NK"} + +{"bid":"61b53f60-c8bc-4300-8560-93daffc736e5","data":{"departure_trajectory":[]},"tid":"a2f73741-2d68-418b-b2a9-2dc1f2f454d0","timestamp":1749177380128,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d3de1868-9f97-4db5-b006-6f29649a77ca","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9775bf65-7ac4-4eb7-a2f3-7270f092bc57","timestamp":1749177380668,"gateway":"8UUXN4P00A06NK"} + +{"bid":"88ad9178-dda8-4f5b-91b8-5eb8c1296829","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5174f996-137f-469c-ac9b-6b4b11c3380c","timestamp":1749177381066,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3d9a54b4-7d4d-4839-b213-1f4e7b58ddf9","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6c433f50-8259-4aa3-ba03-d1d119a5c5cc","timestamp":1749177382065,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4517f28f-ce69-4931-983e-6cb13b9a5460","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"66ed1fcc-4cd2-4aec-a57a-727164a40e4d","timestamp":1749177383550,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b7b13cbb-1010-493f-b7a3-606aa7779878","bid":"43a98c35-1c1a-4c51-ba56-224c8245de78","timestamp":1749177412855,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"4fa6a2b1-13b3-49da-8936-d8561ac8aeb5","bid":"5e2e027d-91ee-4181-8900-e8849dac5f59","timestamp":1749177412857,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"1caae2bc-b3cf-458c-b8ae-e3b0d3695db4","data":{"mobility_status_notify":0},"need_reply":1,"tid":"2ad0c8a6-c87c-4014-8a2b-f0de1a9597c0","timestamp":1749177413863,"gateway":"8UUXN4P00A06NK"} + +{"bid":"20d6020e-e8f9-461b-9db8-b73b8b20a64c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9ca5d731-1a37-4937-92e5-b45da7057709","timestamp":1749177413946,"gateway":"8UUXN4P00A06NK"} + +{"bid":"90a12c2e-a2ce-43e0-a99d-4db740c80303","data":{"air_transfer_enable":false},"need_reply":1,"tid":"bc43b4f8-2131-4eb0-94a7-972073ba4dee","timestamp":1749177414058,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2f219ab1-d73f-4479-a44c-6a3edfff214d","data":{"dongle_infos":[]},"tid":"bda4ebe6-94e2-45d2-9dc7-6dc0123ee322","timestamp":1749177414063,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4d6489c9-070b-4e10-9f68-08bbedb3c784","data":{"dongle_infos":[]},"tid":"f9466d32-72ec-4b24-83fc-b6606b8055f2","timestamp":1749177414065,"gateway":"8UUXN4P00A06NK"} + +{"bid":"87f9af29-a751-4971-9084-b317d23b99e8","data":{"firmware_version":"13.01.0002"},"tid":"ed6e5b4b-953c-44fd-9da4-09bc9541f567","timestamp":1749177414070,"gateway":"8UUXN4P00A06NK"} + +{"tid":"76805d15-1d00-47f8-8a6d-0d80c2e4558c","bid":"f2deaa2a-90d1-493b-a36d-85767b8fc88c","timestamp":1749177414709,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"ddec69c5-108d-465d-a120-877f956ad406","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"14e55efc-cc75-421d-a075-55b2a099f36b","timestamp":1749177414993,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d36deb5d-c740-4bac-a570-812ad27cb75e","data":{"dongle_infos":[]},"tid":"b803631d-e82b-4d50-90fe-d37d6da642b7","timestamp":1749177415117,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1caae2bc-b3cf-458c-b8ae-e3b0d3695db4","data":{"mobility_status_notify":0},"need_reply":1,"tid":"2ad0c8a6-c87c-4014-8a2b-f0de1a9597c0","timestamp":1749177415908,"gateway":"8UUXN4P00A06NK"} + +{"bid":"20d6020e-e8f9-461b-9db8-b73b8b20a64c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9ca5d731-1a37-4937-92e5-b45da7057709","timestamp":1749177416100,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ddec69c5-108d-465d-a120-877f956ad406","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"14e55efc-cc75-421d-a075-55b2a099f36b","timestamp":1749177417106,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2b50b3c3-3537-4417-8ef9-027591cc2d32","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1ed39b29-8b15-4846-991b-91f505e4bda5","timestamp":1749177417863,"gateway":"8UUXN4P00A06NK"} + +{"bid":"90a12c2e-a2ce-43e0-a99d-4db740c80303","data":{"air_transfer_enable":false},"need_reply":1,"tid":"bc43b4f8-2131-4eb0-94a7-972073ba4dee","timestamp":1749177418251,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0aec8a9c-0beb-4850-b30a-98212244947f","data":{"departure_trajectory":[]},"tid":"74053827-3eec-4b38-8040-53fc71daca25","timestamp":1749177419055,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b835bb9e-3146-4c96-a7b3-2d6c368f1437","data":{"departure_trajectory":[]},"tid":"4f7a9a81-d3a9-478b-ba63-87d7900257b3","timestamp":1749177419544,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2b50b3c3-3537-4417-8ef9-027591cc2d32","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1ed39b29-8b15-4846-991b-91f505e4bda5","timestamp":1749177419907,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1caae2bc-b3cf-458c-b8ae-e3b0d3695db4","data":{"mobility_status_notify":0},"need_reply":1,"tid":"2ad0c8a6-c87c-4014-8a2b-f0de1a9597c0","timestamp":1749177420101,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ddec69c5-108d-465d-a120-877f956ad406","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"14e55efc-cc75-421d-a075-55b2a099f36b","timestamp":1749177421308,"gateway":"8UUXN4P00A06NK"} + +{"bid":"18acf150-e3ed-4225-9a03-6ab159edad2e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"74e5de57-4373-49a3-b92a-a526bcb6ac49","timestamp":1749177422858,"gateway":"8UUXN4P00A06NK"} + +{"bid":"18acf150-e3ed-4225-9a03-6ab159edad2e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"74e5de57-4373-49a3-b92a-a526bcb6ac49","timestamp":1749177424902,"gateway":"8UUXN4P00A06NK"} + +{"tid":"895163d5-ecbd-4124-99fe-4d1273eedcd0","bid":"3f8eadbc-3f2e-4722-bf3f-d947aaf0923c","timestamp":1749177449091,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"27e47fcb-68e7-4421-a9c2-824e6997450a","bid":"b2185119-ccf7-437e-b386-a54ad68c205a","timestamp":1749177449093,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"80b26969-5223-4edb-a0a4-69d10c5c47f6","data":{"air_transfer_enable":false},"need_reply":1,"tid":"591490c4-c240-401e-8772-42d7736c88b0","timestamp":1749177450684,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6c8859e3-2b29-4cc6-a710-dd8196abb3f7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f5c88421-b91d-44a9-8348-575afb8d3797","timestamp":1749177452668,"gateway":"8UUXN4P00A06NK"} + +{"bid":"80b26969-5223-4edb-a0a4-69d10c5c47f6","data":{"air_transfer_enable":false},"need_reply":1,"tid":"591490c4-c240-401e-8772-42d7736c88b0","timestamp":1749177453294,"gateway":"8UUXN4P00A06NK"} + +{"bid":"77d70f1d-b1c3-4901-a6af-ec6b0e1cc5c6","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"08ec4f68-776d-4395-adc8-1ab22c97f2e7","timestamp":1749177453540,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ea1c913e-e318-45a8-b9b3-7a1a4006f1cc","data":{"dongle_infos":[]},"tid":"40182c19-a6cf-43d3-82eb-26d40f1cbf8d","timestamp":1749177453555,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dd52ce1a-dcfc-4ed9-abca-4b7505ab1376","data":{"mobility_status_notify":0},"need_reply":1,"tid":"b4157760-bb0e-465e-88f4-c46549f46f8e","timestamp":1749177453564,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dfe7f017-9f7f-4bbf-86d4-c5b05f1f48a8","data":{"firmware_version":"13.01.0002"},"tid":"e6105a81-8980-4d24-b4af-f400a656ffee","timestamp":1749177453581,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8c20c686-1c0f-4459-82d0-6caaf26e3c32","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f4e83da8-c44b-4ade-9d44-956d3d949e75","timestamp":1749177454091,"gateway":"8UUXN4P00A06NK"} + +{"tid":"10e65075-b372-4d91-a485-c8e3676c2b73","bid":"5a0c20bd-c379-44e3-9cf7-dc512b90ff48","timestamp":1749177454552,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"5a33c186-3861-418c-910c-dcfe34fff875","data":{"dongle_infos":[]},"tid":"abd35058-4ef9-4591-b958-993a59887011","timestamp":1749177454567,"gateway":"8UUXN4P00A06NK"} + +{"bid":"77d70f1d-b1c3-4901-a6af-ec6b0e1cc5c6","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"08ec4f68-776d-4395-adc8-1ab22c97f2e7","timestamp":1749177455699,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dd52ce1a-dcfc-4ed9-abca-4b7505ab1376","data":{"mobility_status_notify":0},"need_reply":1,"tid":"b4157760-bb0e-465e-88f4-c46549f46f8e","timestamp":1749177455700,"gateway":"8UUXN4P00A06NK"} + +{"tid":"fa2a2d03-6612-4e0c-b178-a5dac1d32a16","bid":"93386e43-eb71-4a94-b80f-df1e8463ea7d","timestamp":1749177480158,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"98c9deed-ba66-4363-b6d1-001881fffc70","bid":"c1908236-4319-465d-a944-c15bd460ff3a","timestamp":1749177480161,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"c7a64334-0122-49e3-832d-a6c937257030","bid":"ae2285b0-a777-4308-8cce-641d5df7ccf9","timestamp":1749177481178,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"0a9c7b30-2451-4a7b-bebf-836652664c24","bid":"2b2c29cf-c7fc-41ec-a7af-3ea5e2a3f3b7","timestamp":1749177481180,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"365b1261-ba87-443f-89d6-09a3298a145f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"f4ab9f34-170f-44f7-8d39-63d4e1d6f7a9","timestamp":1749177482343,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e3a95b2f-1f03-46dd-8c58-e17f289fd737","data":{"mobility_status_notify":0},"need_reply":1,"tid":"65ef5de3-3e31-4178-a9eb-0679236a52d6","timestamp":1749177484474,"gateway":"8UUXN4P00A06NK"} + +{"bid":"83d7e0c7-4cac-40f1-8ced-5ed039dad964","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f5a2920a-9ea3-425f-ae1e-d595f4d5132e","timestamp":1749177484496,"gateway":"8UUXN4P00A06NK"} + +{"bid":"542bc1dd-994e-4c88-9918-daf63927332d","data":{"dongle_infos":[]},"tid":"8303c0b0-f5ea-4bc2-bcdf-9f8facaf10ba","timestamp":1749177484788,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9d75180e-f2f0-4f56-ae9d-bc1191b53864","data":{"firmware_version":"13.01.0002"},"tid":"7a927cbf-5ece-49b4-aa86-4a754502b4df","timestamp":1749177484795,"gateway":"8UUXN4P00A06NK"} + +{"bid":"365b1261-ba87-443f-89d6-09a3298a145f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"f4ab9f34-170f-44f7-8d39-63d4e1d6f7a9","timestamp":1749177484984,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0511ff5a-7f65-4750-8be6-d97ee77c7577","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"109c2749-3f60-4c9c-b06c-e772c95ef03d","timestamp":1749177485157,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f0683192-4d8e-432e-b701-381ebe3b3b6d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"31946c27-5983-4c87-963c-a9b49e608b2a","timestamp":1749177485596,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b37ab45d-3afa-4090-9e63-98cb897c26b6","data":{"dongle_infos":[]},"tid":"46822d6d-1bbc-4368-8512-4e7074064f8c","timestamp":1749177485828,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d7b62841-4be4-49b8-a0e3-631bd1980bed","bid":"aafa7f87-3153-4a59-b2fd-71e5783b6597","timestamp":1749177486091,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"b28fd26f-0846-4c29-99c3-5e311f82d3c5","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e18612e4-436f-4367-a0eb-2a3d36c28983","timestamp":1749177486175,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e3a95b2f-1f03-46dd-8c58-e17f289fd737","data":{"mobility_status_notify":0},"need_reply":1,"tid":"65ef5de3-3e31-4178-a9eb-0679236a52d6","timestamp":1749177486491,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ac2f0633-7433-42fe-867e-53cd88b46db9","bid":"476a5638-7b14-4fbc-9119-58398138e807","timestamp":1749177509798,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"941aeacb-690e-4c97-9c79-576a348c4006","bid":"5dae65c8-efb2-4d2f-8acf-fd9f92534947","timestamp":1749177509814,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"81a100e7-2b13-4e65-9e1d-a36fa23045b5","data":{"air_transfer_enable":false},"need_reply":1,"tid":"ea05ecf6-f462-4394-bb29-dfa731d3a179","timestamp":1749177512215,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b9a9f837-3875-4090-89e7-ee66ddd43aab","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9e9e79e3-6382-43bf-a36a-5c21f17a976d","timestamp":1749177514208,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3bffb28e-2a79-4c43-a807-9a4eb4ccccf5","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a3c48836-e7cc-4244-8852-eba7723724b2","timestamp":1749177514305,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e436663b-88c6-4d0d-8dd3-6fe3dffa9fa4","data":{"dongle_infos":[]},"tid":"ae77cedf-07ce-4152-b1bf-57772caeeea1","timestamp":1749177514786,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8fab89f7-ddb9-4e2c-822c-a34662b7c412","data":{"firmware_version":"13.01.0002"},"tid":"a9959537-cb8f-4d62-b608-3971d17480cd","timestamp":1749177514793,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ddfa5473-a705-4179-b0ba-894fd4350fab","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"863c1f48-3d3b-4155-b532-4d12cfe161d6","timestamp":1749177514793,"gateway":"8UUXN4P00A06NK"} + +{"bid":"81a100e7-2b13-4e65-9e1d-a36fa23045b5","data":{"air_transfer_enable":false},"need_reply":1,"tid":"ea05ecf6-f462-4394-bb29-dfa731d3a179","timestamp":1749177514974,"gateway":"8UUXN4P00A06NK"} + +{"tid":"15cb94ac-ad6a-46db-9624-4d73a74f41de","bid":"c5a35055-9f0f-4383-832c-92f4504f363e","timestamp":1749177515335,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"18ffcbe1-2818-40a8-809c-c2d38f829d52","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b5fdc6c7-bc07-49af-a2c1-ebaea70245ae","timestamp":1749177515425,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e234a46-9979-455f-8e66-188c66b4f5e1","data":{"dongle_infos":[]},"tid":"e1d7a59d-9c05-40d1-953f-973dae1c1592","timestamp":1749177515780,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3bffb28e-2a79-4c43-a807-9a4eb4ccccf5","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a3c48836-e7cc-4244-8852-eba7723724b2","timestamp":1749177516310,"gateway":"8UUXN4P00A06NK"} + +{"tid":"16c3ea2a-16c8-4b11-8101-4cb456cf302c","bid":"1f736a0e-4c35-4fad-b2a3-bc8c484cd09a","timestamp":1749177540554,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"ec89fa6a-9b0f-487b-b92e-00f05999712e","bid":"f21a30e6-8d30-4e13-87ad-de4c8bc3dae0","timestamp":1749177540561,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f81b4e02-f173-45f0-9fef-ed5eea790d63","data":{"air_transfer_enable":false},"need_reply":1,"tid":"de74cbb7-2a9f-40fe-9722-2f4d9c480148","timestamp":1749177542570,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f2e9f2b6-aa5e-48e1-933d-aff8e9ee469e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"60b7992d-cd94-4858-90e3-d9e50f4fbcfe","timestamp":1749177544561,"gateway":"8UUXN4P00A06NK"} + +{"bid":"de30ed7f-a8c6-4c4e-89c3-60b97900c6b1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"caa85f4e-ddcf-4f6a-9679-0b316a339ce2","timestamp":1749177544854,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9014cdfe-456d-4e3d-b66b-645beceba2b7","data":{"dongle_infos":[]},"tid":"c504305c-d376-4a69-9c8b-93f95cb00a2b","timestamp":1749177545110,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b47de987-3d9a-4151-b1f6-dc5503e7fd3c","data":{"firmware_version":"13.01.0002"},"tid":"7a07041c-5f63-4df8-8bd5-d9f12362095c","timestamp":1749177545133,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f81b4e02-f173-45f0-9fef-ed5eea790d63","data":{"air_transfer_enable":false},"need_reply":1,"tid":"de74cbb7-2a9f-40fe-9722-2f4d9c480148","timestamp":1749177545305,"gateway":"8UUXN4P00A06NK"} + +{"tid":"41900c49-8f53-4608-b01c-4f81b1eb6b0d","bid":"54a8af8d-03e3-41d1-a2b9-861d5b26352f","timestamp":1749177545479,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"1004cee4-a5e9-4cc1-8db5-4db140bc652b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3202dd0c-d620-464b-b6a1-a2a6b3f4b97d","timestamp":1749177545562,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f261389f-b972-4575-a175-bac176e6c680","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"772c41d2-72ac-4e2b-8faf-293f563069fd","timestamp":1749177545718,"gateway":"8UUXN4P00A06NK"} + +{"bid":"525f8ffd-c6f8-4f0a-98b3-79036054f906","data":{"dongle_infos":[]},"tid":"f98d34a2-4193-4b54-a47b-f9eefd4a49fb","timestamp":1749177546129,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f2e9f2b6-aa5e-48e1-933d-aff8e9ee469e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"60b7992d-cd94-4858-90e3-d9e50f4fbcfe","timestamp":1749177546747,"gateway":"8UUXN4P00A06NK"} + +{"tid":"357e8790-5fe4-45ec-a44f-c9e0c7b62b79","bid":"df27142b-94c2-4a87-b578-fe5561031dde","timestamp":1749177574166,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"e47a7e65-9666-4ac5-bd4a-52a81a86b695","bid":"57cfed75-ca72-408b-97d9-03808154e8e3","timestamp":1749177574171,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"1d18dde4-21d6-4ac1-8161-e0e9db7605c2","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"278668ab-f886-4eac-9caa-08acc73db515","timestamp":1749177575861,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5871feef-11e0-4ade-994c-2f5e1d67f9fe","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d2079a9a-e9cb-442c-bc77-6e968889556c","timestamp":1749177575880,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d5e6b089-9b61-420f-9fc2-6fb752390123","data":{"mobility_status_notify":0},"need_reply":1,"tid":"cfe27143-53f4-4764-a5ed-f776d5f9d48b","timestamp":1749177575884,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4c9524f9-77d0-4a0c-830d-a6a6e146f2b5","data":{"dongle_infos":[]},"tid":"ca0758d8-6df2-4060-8d29-bb827082e3d5","timestamp":1749177575890,"gateway":"8UUXN4P00A06NK"} + +{"bid":"695dfb34-9177-4db2-9b48-4d68b313eb60","data":{"firmware_version":"13.01.0002"},"tid":"40c25448-d528-419c-baa4-4057c017fbd8","timestamp":1749177575902,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0f663826-3948-4994-872f-8693b447bb60","data":{"air_transfer_enable":false},"need_reply":1,"tid":"9608e3b5-744f-4b08-a266-90cf89e08887","timestamp":1749177576011,"gateway":"8UUXN4P00A06NK"} + +{"tid":"42e559a1-72c1-447a-bbfb-2b9b5a6840b8","bid":"e1270948-4f70-4ac3-af9b-af38e9b91b72","timestamp":1749177576085,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e529bbf-ea16-4b63-b522-6a88a585979e","data":{"dongle_infos":[]},"tid":"fef83057-6dd2-4148-bd85-b56248a9ad39","timestamp":1749177576921,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1d18dde4-21d6-4ac1-8161-e0e9db7605c2","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"278668ab-f886-4eac-9caa-08acc73db515","timestamp":1749177577976,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5871feef-11e0-4ade-994c-2f5e1d67f9fe","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d2079a9a-e9cb-442c-bc77-6e968889556c","timestamp":1749177577977,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d5e6b089-9b61-420f-9fc2-6fb752390123","data":{"mobility_status_notify":0},"need_reply":1,"tid":"cfe27143-53f4-4764-a5ed-f776d5f9d48b","timestamp":1749177577978,"gateway":"8UUXN4P00A06NK"} + +{"bid":"07906ee6-ff83-49d0-8719-2b675ab77b95","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5eacde2c-e65e-48ec-80e6-8e9695a54b33","timestamp":1749177579168,"gateway":"8UUXN4P00A06NK"} + +{"bid":"abfec59b-edf0-4a4d-b691-3d0ca754648e","data":{"dongle_infos":[]},"tid":"e09895c5-ceb9-4464-9751-a8eb984501ad","timestamp":1749177579349,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0f663826-3948-4994-872f-8693b447bb60","data":{"air_transfer_enable":false},"need_reply":1,"tid":"9608e3b5-744f-4b08-a266-90cf89e08887","timestamp":1749177580209,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0ab8b2be-a313-4b9e-8b35-c055acfe231d","data":{"departure_trajectory":[]},"tid":"a7a1dd9f-9d13-46d8-9130-f0150e5dfeb6","timestamp":1749177580750,"gateway":"8UUXN4P00A06NK"} + +{"bid":"707da100-9a0f-4ea9-a467-7c6ffac6d68f","data":{"departure_trajectory":[]},"tid":"7001d1d7-e9ef-41e8-a0f6-d949bca31b6f","timestamp":1749177580866,"gateway":"8UUXN4P00A06NK"} + +{"bid":"07906ee6-ff83-49d0-8719-2b675ab77b95","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5eacde2c-e65e-48ec-80e6-8e9695a54b33","timestamp":1749177581178,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1d18dde4-21d6-4ac1-8161-e0e9db7605c2","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"278668ab-f886-4eac-9caa-08acc73db515","timestamp":1749177582175,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d5e6b089-9b61-420f-9fc2-6fb752390123","data":{"mobility_status_notify":0},"need_reply":1,"tid":"cfe27143-53f4-4764-a5ed-f776d5f9d48b","timestamp":1749177582176,"gateway":"8UUXN4P00A06NK"} + +{"bid":"96ef46a7-2d6b-456e-9fbf-0016883a268d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"635c9625-5843-421e-ba33-9e5fda98faa6","timestamp":1749177584168,"gateway":"8UUXN4P00A06NK"} + +{"bid":"96ef46a7-2d6b-456e-9fbf-0016883a268d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"635c9625-5843-421e-ba33-9e5fda98faa6","timestamp":1749177586183,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ca68134e-0008-4ac6-9efc-132bf1401d3d","bid":"3d9f01e9-bf51-423a-adb0-69d82cf16344","timestamp":1749177613100,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"11624579-681e-46bf-bc61-e0a39f075d27","bid":"7e52034d-4c91-471a-a43e-18422ab4d3ab","timestamp":1749177613106,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"c5c9f6b0-2f57-40af-b816-bcfbb2b20146","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"975ca824-c784-47d3-8372-9538515894e5","timestamp":1749177614784,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ac68553f-c786-40cb-a3e2-02dfd6da0a9c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a4a77464-cd8b-4ca0-91ed-3f0b02b4b35a","timestamp":1749177614810,"gateway":"8UUXN4P00A06NK"} + +{"bid":"82d53736-0012-4951-9109-1d6ecf40f1c2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3d2913c3-d894-4ec8-8eac-bbead502844d","timestamp":1749177614812,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3e1b83a6-b05a-4cce-b1ae-42624b437bf1","data":{"dongle_infos":[]},"tid":"d8ca9569-c900-4c41-a570-6b812932d10b","timestamp":1749177614955,"gateway":"8UUXN4P00A06NK"} + +{"bid":"05ac0c88-60f0-46a9-a4d5-78d94be65595","data":{"dongle_infos":[]},"tid":"45f3d2db-a045-4b40-9425-8ab7feef2c86","timestamp":1749177614956,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3a0daea7-58c5-488b-ad5c-79b43a385167","data":{"firmware_version":"13.01.0002"},"tid":"e677fcac-0238-4b5a-a970-be69d824a78e","timestamp":1749177614965,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ffc1de0f-2fa1-4bff-a442-13212d10adb6","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2681e75b-64fb-4fda-9180-a2a133ee3d0b","timestamp":1749177615146,"gateway":"8UUXN4P00A06NK"} + +{"tid":"244cd697-1d6b-4556-964e-e9af5e83bc29","bid":"d2bb5861-1402-42b0-b958-607c3ad80233","timestamp":1749177615780,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"2df21675-23b1-4b30-81c2-257dc1661459","data":{"dongle_infos":[]},"tid":"bc46ec56-83f8-4c85-9ee9-0161e8229c00","timestamp":1749177615956,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c5c9f6b0-2f57-40af-b816-bcfbb2b20146","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"975ca824-c784-47d3-8372-9538515894e5","timestamp":1749177616934,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ac68553f-c786-40cb-a3e2-02dfd6da0a9c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a4a77464-cd8b-4ca0-91ed-3f0b02b4b35a","timestamp":1749177616936,"gateway":"8UUXN4P00A06NK"} + +{"bid":"82d53736-0012-4951-9109-1d6ecf40f1c2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3d2913c3-d894-4ec8-8eac-bbead502844d","timestamp":1749177616937,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9c4fbd95-5700-4c28-b399-aa9ea1f3ad39","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"68cb8659-01e4-4d5f-a75a-c670bf7408c3","timestamp":1749177618096,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ffc1de0f-2fa1-4bff-a442-13212d10adb6","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2681e75b-64fb-4fda-9180-a2a133ee3d0b","timestamp":1749177619346,"gateway":"8UUXN4P00A06NK"} + +{"bid":"654d473f-54b8-4394-b2ac-7bc54423e368","data":{"departure_trajectory":[]},"tid":"5efc2823-3419-45ad-ae56-513c95565d8f","timestamp":1749177619708,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c6ba2665-cc38-4631-a291-97c5ad84bf07","data":{"departure_trajectory":[]},"tid":"b57d2a23-4283-4f39-adef-5061ed34856e","timestamp":1749177619947,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9c4fbd95-5700-4c28-b399-aa9ea1f3ad39","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"68cb8659-01e4-4d5f-a75a-c670bf7408c3","timestamp":1749177620134,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c5c9f6b0-2f57-40af-b816-bcfbb2b20146","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"975ca824-c784-47d3-8372-9538515894e5","timestamp":1749177621134,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ac68553f-c786-40cb-a3e2-02dfd6da0a9c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a4a77464-cd8b-4ca0-91ed-3f0b02b4b35a","timestamp":1749177621137,"gateway":"8UUXN4P00A06NK"} + +{"bid":"12822a17-cb70-4db1-9feb-b8528ac7428e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b9661568-8b7b-4540-88e7-14823650141f","timestamp":1749177623101,"gateway":"8UUXN4P00A06NK"} + +{"bid":"12822a17-cb70-4db1-9feb-b8528ac7428e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b9661568-8b7b-4540-88e7-14823650141f","timestamp":1749177625134,"gateway":"8UUXN4P00A06NK"} + +{"tid":"88e7bfb8-bf54-4b7f-b9c4-17d365faa80e","bid":"7e5868f6-bec9-4b7e-adca-a40ad2d5b9ed","timestamp":1749177651024,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"66bdb0a3-007c-4ca0-b9aa-f81bb358f598","bid":"a8939a8a-7f8a-4b49-a717-19d4cf5e05cc","timestamp":1749177651028,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"e63a162d-d097-4178-8540-a779cecb897c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"32a9aacf-e403-4f08-be9b-f277456c2adf","timestamp":1749177652603,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f6c0b7b2-6f0b-4c20-ac4c-f310eca76a82","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a5f93d4e-9508-4bcd-8ac1-31f7a497ac76","timestamp":1749177652616,"gateway":"8UUXN4P00A06NK"} + +{"bid":"545c6c12-5367-4a55-9689-2ca1f42b3e99","data":{"dongle_infos":[]},"tid":"64d513d4-34bb-44fa-b052-e30a4fedcc77","timestamp":1749177652983,"gateway":"8UUXN4P00A06NK"} + +{"bid":"33ecac90-684d-4517-b765-2e8a0768e16a","data":{"dongle_infos":[]},"tid":"33df4db3-e656-45e4-92fd-53ae099533a9","timestamp":1749177652984,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e378a59c-ef31-4cdf-af33-d678b8847c73","data":{"firmware_version":"13.01.0002"},"tid":"c047d150-2ac2-4065-97a3-4f11481bb42d","timestamp":1749177652990,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4ee0bcbf-0e38-4527-b2d8-fe8e91427128","data":{"air_transfer_enable":false},"need_reply":1,"tid":"39d699d2-a357-46da-9d71-3c82e5056442","timestamp":1749177653180,"gateway":"8UUXN4P00A06NK"} + +{"tid":"cf7dd013-80d9-44fa-ac45-ae82319c96ed","bid":"2ae72bb6-82de-4520-baef-35922879cd6d","timestamp":1749177653207,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f5c0c98d-364a-4640-bcbc-fe2b79fa911b","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"13fab151-aaeb-4c46-b94b-3a34cd62776b","timestamp":1749177653758,"gateway":"8UUXN4P00A06NK"} + +{"bid":"709ebdaf-cc18-4cbe-aac3-a4b10707f30d","data":{"dongle_infos":[]},"tid":"bd86bfc3-6776-4992-bd29-f3af50367f67","timestamp":1749177654015,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e63a162d-d097-4178-8540-a779cecb897c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"32a9aacf-e403-4f08-be9b-f277456c2adf","timestamp":1749177654715,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f6c0b7b2-6f0b-4c20-ac4c-f310eca76a82","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a5f93d4e-9508-4bcd-8ac1-31f7a497ac76","timestamp":1749177654716,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f5c0c98d-364a-4640-bcbc-fe2b79fa911b","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"13fab151-aaeb-4c46-b94b-3a34cd62776b","timestamp":1749177655916,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2ea724a4-a88c-4a73-8508-e654cfebde24","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7aa7a976-c4cd-4593-9156-9a627795cfe9","timestamp":1749177656026,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4ee0bcbf-0e38-4527-b2d8-fe8e91427128","data":{"air_transfer_enable":false},"need_reply":1,"tid":"39d699d2-a357-46da-9d71-3c82e5056442","timestamp":1749177657373,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dbd99a01-7458-4b18-84bb-9e3fbb79ab6e","data":{"departure_trajectory":[]},"tid":"36343b4a-b63c-4136-9753-7467020f9316","timestamp":1749177657715,"gateway":"8UUXN4P00A06NK"} + +{"bid":"08f979a7-69a3-42d8-9415-f165762da68d","data":{"departure_trajectory":[]},"tid":"67eb6314-de4d-475e-8c77-c4ac374fcf0a","timestamp":1749177657980,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2ea724a4-a88c-4a73-8508-e654cfebde24","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7aa7a976-c4cd-4593-9156-9a627795cfe9","timestamp":1749177658114,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e63a162d-d097-4178-8540-a779cecb897c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"32a9aacf-e403-4f08-be9b-f277456c2adf","timestamp":1749177658914,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f5c0c98d-364a-4640-bcbc-fe2b79fa911b","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"13fab151-aaeb-4c46-b94b-3a34cd62776b","timestamp":1749177660115,"gateway":"8UUXN4P00A06NK"} + +{"bid":"be024955-2782-4e80-aade-5cb6921073c5","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1d31bda5-2829-4ae1-88f0-78b04bf73a55","timestamp":1749177661026,"gateway":"8UUXN4P00A06NK"} + +{"bid":"be024955-2782-4e80-aade-5cb6921073c5","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1d31bda5-2829-4ae1-88f0-78b04bf73a55","timestamp":1749177663116,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b37a1784-7e9a-4e11-aecb-0131f86f7458","bid":"39a7d02a-4013-4a26-bdc4-b02e315d84c2","timestamp":1749177687120,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"ca574fd6-2734-406f-9a63-3dd04a7bee8f","bid":"d4dc216d-3e8c-4fc6-87a3-7946ec224f78","timestamp":1749177687123,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"abde9504-b52c-4a4d-a0d8-6f26564b402a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"275c000b-b194-4a5c-b82e-524b3f37a2a7","timestamp":1749177689308,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bbc95ae9-0e38-42d7-9129-3bd2327d8c65","data":{"mobility_status_notify":0},"need_reply":1,"tid":"adfaf3e9-1daa-4632-8fed-8eaf8a361ecd","timestamp":1749177691434,"gateway":"8UUXN4P00A06NK"} + +{"bid":"907f37c8-4a88-4527-abf4-f04a75890d1c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9975ab08-3693-47fb-aff0-bfb0aab1ae6e","timestamp":1749177691507,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4fb81cfa-0c4c-4d8f-bedb-b364548d8a14","data":{"dongle_infos":[]},"tid":"9c1e2fdd-cc89-4f0e-b846-3f3db7e732bc","timestamp":1749177691672,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3ffc7865-1796-4c52-8786-44204f765bc6","data":{"firmware_version":"13.01.0002"},"tid":"9cc81bf5-ba5b-4ce7-a72c-622803f83abb","timestamp":1749177691685,"gateway":"8UUXN4P00A06NK"} + +{"bid":"abde9504-b52c-4a4d-a0d8-6f26564b402a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"275c000b-b194-4a5c-b82e-524b3f37a2a7","timestamp":1749177691865,"gateway":"8UUXN4P00A06NK"} + +{"tid":"65b636ba-b9c5-4481-ba7c-9c41767abb7a","bid":"13b3c213-6e91-4184-822b-9e84dbbaf532","timestamp":1749177692004,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"43d7c18c-2235-4640-9062-32c1b099e953","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"64ce0174-8006-4833-b9f3-8838ce24fa9d","timestamp":1749177692128,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b2173bb1-9b17-4823-9720-568e4f2f4fda","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"8a4a3631-578f-4269-977e-1880584f486f","timestamp":1749177692564,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b172983f-60fa-44a0-bc21-f8e0754d4850","data":{"dongle_infos":[]},"tid":"154cb161-0454-4fa6-af9a-c82561ff22d3","timestamp":1749177692723,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bbc95ae9-0e38-42d7-9129-3bd2327d8c65","data":{"mobility_status_notify":0},"need_reply":1,"tid":"adfaf3e9-1daa-4632-8fed-8eaf8a361ecd","timestamp":1749177693564,"gateway":"8UUXN4P00A06NK"} + +{"tid":"34325f26-b5cb-44d8-85d9-2d72a4c3e369","bid":"f4af0b58-5d34-4a26-9fc3-43b03004f36e","timestamp":1749177720157,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"25cc76da-19d5-42cc-a36e-b11fd56520f7","bid":"01e45f35-3033-4af8-a1bf-59bdf491f09c","timestamp":1749177720163,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"1bd7ff92-5e1a-4d4f-92db-7edef8609015","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ad62f42f-2c6f-4818-a5a6-1760b96041e7","timestamp":1749177721996,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5404655b-b0ff-4088-8097-ccdfd0ca826b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9bf7bd53-5b09-49bd-b172-3ea28dca2a42","timestamp":1749177722036,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fea960d9-a61f-4db0-8216-a9358353fcfe","data":{"dongle_infos":[]},"tid":"599b9b06-464f-43f3-b215-70cb3546e714","timestamp":1749177722378,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a58d440c-efda-43fe-b34d-74e24fbae8a0","data":{"dongle_infos":[]},"tid":"4f697241-89bd-4db5-be15-d6ad10d0713c","timestamp":1749177722379,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1870166-bed6-4877-8ac3-ef263161f644","data":{"firmware_version":"13.01.0002"},"tid":"6e64e071-e80f-4cb3-be31-f04df9305008","timestamp":1749177722384,"gateway":"8UUXN4P00A06NK"} + +{"tid":"28367f1b-706f-43c9-88ce-9e4851c0baf2","bid":"1f5cb6c4-9639-404c-bd66-527ee341b3aa","timestamp":1749177722498,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"e0511f5d-7130-451e-b446-a8ee08dc50be","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d5432781-e577-4671-a6e9-b2c56b3226b9","timestamp":1749177722583,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4b869c38-224a-4655-acd4-f7955d38ad32","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c7b18049-7ada-4dfb-9b05-aba5fa449722","timestamp":1749177723116,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4897a330-e592-45b1-bb25-3ec259ded53b","data":{"dongle_infos":[]},"tid":"af29711b-04df-448c-aea7-f4bff4e775fc","timestamp":1749177723409,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1bd7ff92-5e1a-4d4f-92db-7edef8609015","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ad62f42f-2c6f-4818-a5a6-1760b96041e7","timestamp":1749177724161,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5404655b-b0ff-4088-8097-ccdfd0ca826b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9bf7bd53-5b09-49bd-b172-3ea28dca2a42","timestamp":1749177724162,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4b869c38-224a-4655-acd4-f7955d38ad32","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c7b18049-7ada-4dfb-9b05-aba5fa449722","timestamp":1749177725157,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ec1f6aa3-d1ef-42d0-bf30-6784cc5733e8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b7192e28-4d03-41ce-8dc8-53c9f15f0212","timestamp":1749177725158,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fd22d41c-0e8c-4aa8-a889-08eb55e7291e","data":{"departure_trajectory":[]},"tid":"b18c7654-db9f-4919-b2b8-2d0c8f75fade","timestamp":1749177726778,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e0511f5d-7130-451e-b446-a8ee08dc50be","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d5432781-e577-4671-a6e9-b2c56b3226b9","timestamp":1749177726786,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ec1f6aa3-d1ef-42d0-bf30-6784cc5733e8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b7192e28-4d03-41ce-8dc8-53c9f15f0212","timestamp":1749177727363,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b233f931-bc39-49bb-adcc-87afa774ab39","data":{"departure_trajectory":[]},"tid":"267a196b-e09d-4b17-b6a0-41465414c6bb","timestamp":1749177727375,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1bd7ff92-5e1a-4d4f-92db-7edef8609015","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ad62f42f-2c6f-4818-a5a6-1760b96041e7","timestamp":1749177728358,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4b869c38-224a-4655-acd4-f7955d38ad32","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c7b18049-7ada-4dfb-9b05-aba5fa449722","timestamp":1749177729355,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5cd93148-71f7-4517-8b11-509f765b96f0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b82c01be-aefb-4f72-be3a-8491e34a2d75","timestamp":1749177730159,"gateway":"8UUXN4P00A06NK"} + +{"tid":"42304b66-eef9-484a-b383-209ea2112186","bid":"7bbece49-56a2-4ef7-83ea-db9cbd6915df","timestamp":1749177755828,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"974b740f-fbf3-4ee4-b761-259569500edd","bid":"a152c6ad-f449-418d-9b39-fa55d31ba1c2","timestamp":1749177755832,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"25822c14-fc23-409c-b8bf-39304cd0c77d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"17dc060b-9712-4666-8cd6-f6fd632da81b","timestamp":1749177757467,"gateway":"8UUXN4P00A06NK"} + +{"tid":"48bdfc7e-0fbd-4034-aac5-bff8c66a356a","bid":"aa9e0394-35fe-4b34-a2fb-8466cd1df36f","timestamp":1749177759731,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"5d212682-88d1-4aaf-9220-b2229f331a1a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"10a5964e-65ae-48c2-99f8-ef2fb1fbf0ca","timestamp":1749177760050,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fbcf86b0-b725-49d7-b7dc-aa6e59d10463","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1767e0bb-9407-45b4-b9a4-81dfd7f3860f","timestamp":1749177760062,"gateway":"8UUXN4P00A06NK"} + +{"bid":"adcc91dc-6078-408b-9269-906b70b11d78","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d8837316-1e8f-45a3-8738-61259bdca95a","timestamp":1749177760068,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d1c6bff4-5722-48e1-b80f-a7a291fa218c","data":{"dongle_infos":[]},"tid":"00f07034-d1ff-45fb-a975-86be8b54eb4d","timestamp":1749177760074,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3dc7fddd-7e86-4683-bbd4-511ae3aedd81","data":{"firmware_version":"13.01.0002"},"tid":"e28e1d55-e1fc-4144-91b2-d77ed5e8c265","timestamp":1749177760118,"gateway":"8UUXN4P00A06NK"} + +{"bid":"25822c14-fc23-409c-b8bf-39304cd0c77d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"17dc060b-9712-4666-8cd6-f6fd632da81b","timestamp":1749177760221,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7846e84e-3253-4a29-b4c1-acec30d0faf2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f00b314a-8bf8-47e1-93b5-7c9827e0cd32","timestamp":1749177760829,"gateway":"8UUXN4P00A06NK"} + +{"bid":"366fe0dc-78ac-4857-991c-d79f62c4e2ee","data":{"dongle_infos":[]},"tid":"c665fa47-6f62-4deb-a015-514657710f9d","timestamp":1749177761059,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5d212682-88d1-4aaf-9220-b2229f331a1a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"10a5964e-65ae-48c2-99f8-ef2fb1fbf0ca","timestamp":1749177762146,"gateway":"8UUXN4P00A06NK"} + +{"bid":"adcc91dc-6078-408b-9269-906b70b11d78","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d8837316-1e8f-45a3-8738-61259bdca95a","timestamp":1749177762148,"gateway":"8UUXN4P00A06NK"} + +{"tid":"4b92187f-b89b-4d82-a594-4c969057cdd3","bid":"b48e3894-530d-4f24-8ba1-8a8052377ea5","timestamp":1749177789796,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"adbb212d-906c-4cd3-a018-061fc84b172f","bid":"89c6968a-ac23-4a30-9ccf-dab5d1ebdad8","timestamp":1749177789801,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"a5de0bea-1a72-4b9e-a71f-f97127feddab","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"977cc3e3-4f98-4a76-97a7-070011c49ad3","timestamp":1749177790429,"gateway":"8UUXN4P00A06NK"} + +{"bid":"46c41f29-c3f8-4b4f-bfc1-69e58ab1eaef","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6234d8af-7aa7-479d-963f-21c2360f4377","timestamp":1749177791041,"gateway":"8UUXN4P00A06NK"} + +{"bid":"51bc6ea5-d94c-4c9d-8028-e9feb66fc05b","data":{"mobility_status_notify":0},"need_reply":1,"tid":"67816579-a754-440d-a1cb-408381eda380","timestamp":1749177791057,"gateway":"8UUXN4P00A06NK"} + +{"bid":"05c2ebeb-93d1-459c-abfb-9e9f3d2745a3","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8190f2a8-5e1d-41d1-8de8-bd3274a45048","timestamp":1749177791082,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f85b8634-8ce3-4c47-bcbd-db59e4ce307b","data":{"dongle_infos":[]},"tid":"505714c5-4c93-4df9-8b9b-0792d0bfc9f4","timestamp":1749177791087,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b45f19db-898d-4f51-b789-e318212cc890","data":{"firmware_version":"13.01.0002"},"tid":"1f168a6c-2edf-4d2f-bcce-bc19d98007c0","timestamp":1749177791094,"gateway":"8UUXN4P00A06NK"} + +{"tid":"90ea0f6b-339f-4e61-b6ef-788648bd77de","bid":"de9d16c6-9af7-41ef-b4bb-460340a566f4","timestamp":1749177791508,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f7a0f2d7-09fb-4e22-85b0-09efa98f4a46","data":{"dongle_infos":[]},"tid":"a1c09f87-aadf-4d50-a4f1-1e939376a8d3","timestamp":1749177792114,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a5de0bea-1a72-4b9e-a71f-f97127feddab","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"977cc3e3-4f98-4a76-97a7-070011c49ad3","timestamp":1749177792442,"gateway":"8UUXN4P00A06NK"} + +{"bid":"46c41f29-c3f8-4b4f-bfc1-69e58ab1eaef","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6234d8af-7aa7-479d-963f-21c2360f4377","timestamp":1749177793239,"gateway":"8UUXN4P00A06NK"} + +{"bid":"51bc6ea5-d94c-4c9d-8028-e9feb66fc05b","data":{"mobility_status_notify":0},"need_reply":1,"tid":"67816579-a754-440d-a1cb-408381eda380","timestamp":1749177793240,"gateway":"8UUXN4P00A06NK"} + +{"bid":"42f38849-d7af-4a45-b5f4-cd78fc4352d3","data":{"dongle_infos":[]},"tid":"b1a0aee1-81eb-40dc-a068-f6196515bc98","timestamp":1749177794484,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b105f1c4-8d65-4a62-a95a-e66ef4c2c56e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0dcb6304-fbc7-45c0-8031-f9ac5adf6b9b","timestamp":1749177794793,"gateway":"8UUXN4P00A06NK"} + +{"bid":"05c2ebeb-93d1-459c-abfb-9e9f3d2745a3","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8190f2a8-5e1d-41d1-8de8-bd3274a45048","timestamp":1749177795285,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9e802107-5a1b-4ff1-a052-83ee770d2914","data":{"departure_trajectory":[]},"tid":"422f48fd-039c-4311-be33-9e93de804833","timestamp":1749177796081,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3dcf0c5c-af73-404e-8792-0ce25f86e05a","data":{"departure_trajectory":[]},"tid":"673a79d3-37c5-403a-ae61-d2cf87e70a84","timestamp":1749177796434,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b105f1c4-8d65-4a62-a95a-e66ef4c2c56e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0dcb6304-fbc7-45c0-8031-f9ac5adf6b9b","timestamp":1749177796846,"gateway":"8UUXN4P00A06NK"} + +{"bid":"46c41f29-c3f8-4b4f-bfc1-69e58ab1eaef","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6234d8af-7aa7-479d-963f-21c2360f4377","timestamp":1749177797440,"gateway":"8UUXN4P00A06NK"} + +{"bid":"51bc6ea5-d94c-4c9d-8028-e9feb66fc05b","data":{"mobility_status_notify":0},"need_reply":1,"tid":"67816579-a754-440d-a1cb-408381eda380","timestamp":1749177797442,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4bf1efa9-3c1c-4c4a-b5e0-8bcd07265728","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"44c9ebc6-4bf0-413c-9149-212275d5e084","timestamp":1749177799793,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4bf1efa9-3c1c-4c4a-b5e0-8bcd07265728","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"44c9ebc6-4bf0-413c-9149-212275d5e084","timestamp":1749177801843,"gateway":"8UUXN4P00A06NK"} + +{"tid":"19ed35db-634f-4490-976a-0c9c17331795","bid":"30ff1093-d807-4f9b-8944-418840236da5","timestamp":1749177829104,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"18973d33-de86-4084-86e2-3453fa17e34c","bid":"1dbff11d-ba2f-4d44-a720-ff5c9445d422","timestamp":1749177829110,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"c8a29c87-2dd9-4e1f-a3df-185005113ea4","data":{"mobility_status_notify":0},"need_reply":1,"tid":"69ac8bd6-ef10-4414-9bd0-69bf58e04e31","timestamp":1749177830123,"gateway":"8UUXN4P00A06NK"} + +{"bid":"606ae848-5c63-4481-83a6-ff31b557b052","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b65f4888-2ed9-4398-9fa3-43f7c41cc03f","timestamp":1749177830145,"gateway":"8UUXN4P00A06NK"} + +{"bid":"748e411b-63ca-40d3-b655-d8dcfa687c96","data":{"air_transfer_enable":false},"need_reply":1,"tid":"aa54efa0-92b3-49db-99f5-9bef2e566f88","timestamp":1749177830431,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e9f2cd81-a2b5-46a0-b683-5fae7f2a9a25","data":{"dongle_infos":[]},"tid":"4b03822c-9184-4e7c-af53-936f486288dd","timestamp":1749177830437,"gateway":"8UUXN4P00A06NK"} + +{"bid":"376875b4-e41f-4e82-aac2-2bb26d4ad58e","data":{"firmware_version":"13.01.0002"},"tid":"5eb84b62-8627-42b1-a54e-8f63073436ef","timestamp":1749177830445,"gateway":"8UUXN4P00A06NK"} + +{"tid":"0fd7fdc1-9079-4444-9a5b-f2c563ab24df","bid":"e8abefa7-03b4-4bd6-ab7f-4e6c7c967111","timestamp":1749177830770,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"c6e14265-c159-4bd0-86f8-ef9a19113446","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"63acf28a-46e2-48cd-9a3e-ca3e73f4468e","timestamp":1749177831284,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eef5d31a-11a2-4f8d-8158-12568f7faf7f","data":{"dongle_infos":[]},"tid":"982d9498-01a9-4767-b396-58e62e309bf0","timestamp":1749177831451,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c8a29c87-2dd9-4e1f-a3df-185005113ea4","data":{"mobility_status_notify":0},"need_reply":1,"tid":"69ac8bd6-ef10-4414-9bd0-69bf58e04e31","timestamp":1749177832323,"gateway":"8UUXN4P00A06NK"} + +{"bid":"606ae848-5c63-4481-83a6-ff31b557b052","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b65f4888-2ed9-4398-9fa3-43f7c41cc03f","timestamp":1749177832324,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c6e14265-c159-4bd0-86f8-ef9a19113446","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"63acf28a-46e2-48cd-9a3e-ca3e73f4468e","timestamp":1749177833323,"gateway":"8UUXN4P00A06NK"} + +{"bid":"65623596-13f5-4d69-9b16-da9a27e74879","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cffe8fd2-280a-4356-b689-a9f07804dd14","timestamp":1749177834107,"gateway":"8UUXN4P00A06NK"} + +{"bid":"748e411b-63ca-40d3-b655-d8dcfa687c96","data":{"air_transfer_enable":false},"need_reply":1,"tid":"aa54efa0-92b3-49db-99f5-9bef2e566f88","timestamp":1749177834629,"gateway":"8UUXN4P00A06NK"} + +{"bid":"43465389-632b-4c55-9044-802a4cd6ed87","data":{"dongle_infos":[]},"tid":"f72fa345-8902-443b-946f-011abae37057","timestamp":1749177834665,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1c858d92-d99d-400b-b87b-39b9a03e588a","data":{"departure_trajectory":[]},"tid":"5add5ab7-6c30-4d5e-be28-48652732e6f2","timestamp":1749177835434,"gateway":"8UUXN4P00A06NK"} + +{"bid":"890c2d45-e21c-43ae-a59d-e6a0c2765825","data":{"departure_trajectory":[]},"tid":"e9a159dc-508f-4eeb-beaf-a7aae479690e","timestamp":1749177835868,"gateway":"8UUXN4P00A06NK"} + +{"bid":"65623596-13f5-4d69-9b16-da9a27e74879","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cffe8fd2-280a-4356-b689-a9f07804dd14","timestamp":1749177836123,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c8a29c87-2dd9-4e1f-a3df-185005113ea4","data":{"mobility_status_notify":0},"need_reply":1,"tid":"69ac8bd6-ef10-4414-9bd0-69bf58e04e31","timestamp":1749177836523,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c6e14265-c159-4bd0-86f8-ef9a19113446","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"63acf28a-46e2-48cd-9a3e-ca3e73f4468e","timestamp":1749177837524,"gateway":"8UUXN4P00A06NK"} + +{"bid":"10bf7f0d-67ce-4b88-8531-107993f8e837","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"77620fb8-90e9-454d-9ec4-b6d250b7ac76","timestamp":1749177839104,"gateway":"8UUXN4P00A06NK"} + +{"bid":"10bf7f0d-67ce-4b88-8531-107993f8e837","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"77620fb8-90e9-454d-9ec4-b6d250b7ac76","timestamp":1749177841124,"gateway":"8UUXN4P00A06NK"} + +{"tid":"a5bc8bc3-ca68-47b3-8c25-9f2ca66cf4bc","bid":"74256ce0-636b-40a1-a11e-6c14464c350f","timestamp":1749177868420,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"bee98498-088c-40cd-8855-e3422a8c57fb","bid":"f976d890-ff7a-4b8f-bfab-2172d1b37658","timestamp":1749177868427,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"cf51ef92-ae95-4b06-824c-84be37c341cb","data":{"mobility_status_notify":0},"need_reply":1,"tid":"4380b7b7-1707-4fb9-a3ef-3f6a37533281","timestamp":1749177869633,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a54e9576-0348-4a35-be22-ce89efbbcf14","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"84f4d8c0-9cf4-4249-9c72-9e126c3612c2","timestamp":1749177869635,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3cd204fa-e507-4294-a99a-d7fd9e0750da","data":{"air_transfer_enable":false},"need_reply":1,"tid":"04fecb1d-2e4a-45cc-85bf-203404b74dd8","timestamp":1749177870036,"gateway":"8UUXN4P00A06NK"} + +{"bid":"65b9da8b-e634-4c6f-a895-aaf16f359103","data":{"dongle_infos":[]},"tid":"f6f64165-b7f4-4b7a-82aa-ea139fc47014","timestamp":1749177870041,"gateway":"8UUXN4P00A06NK"} + +{"bid":"83b25325-50ff-4e3b-883c-9e3db64ebc35","data":{"firmware_version":"13.01.0002"},"tid":"87b23d85-32d5-406c-93c0-f0297a243a95","timestamp":1749177870048,"gateway":"8UUXN4P00A06NK"} + +{"tid":"48e62c4c-2f75-4446-895e-dc7b1c98adaf","bid":"19ade428-f5c7-44dc-8922-f529a88b7856","timestamp":1749177870359,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"849dd4a1-8476-4890-9bfe-d199be5698d1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3f7c4cec-d6db-41e5-a897-8f97b186eccd","timestamp":1749177870766,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c93cf481-974c-4397-88b3-a825a21df47d","data":{"dongle_infos":[]},"tid":"da834856-88a0-4217-9923-b7bf5971ab15","timestamp":1749177871044,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cf51ef92-ae95-4b06-824c-84be37c341cb","data":{"mobility_status_notify":0},"need_reply":1,"tid":"4380b7b7-1707-4fb9-a3ef-3f6a37533281","timestamp":1749177871800,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a54e9576-0348-4a35-be22-ce89efbbcf14","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"84f4d8c0-9cf4-4249-9c72-9e126c3612c2","timestamp":1749177871801,"gateway":"8UUXN4P00A06NK"} + +{"bid":"849dd4a1-8476-4890-9bfe-d199be5698d1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3f7c4cec-d6db-41e5-a897-8f97b186eccd","timestamp":1749177872803,"gateway":"8UUXN4P00A06NK"} + +{"bid":"68f74e59-a31b-41f7-974b-404567bcfc79","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"fdd6bb38-d57c-4802-a826-9c8350886208","timestamp":1749177873426,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3cd204fa-e507-4294-a99a-d7fd9e0750da","data":{"air_transfer_enable":false},"need_reply":1,"tid":"04fecb1d-2e4a-45cc-85bf-203404b74dd8","timestamp":1749177874234,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1a8ee137-9a42-4ae0-b156-a5cc53699af9","data":{"dongle_infos":[]},"tid":"e165643a-966e-4c0f-8f4f-ba645b4d74cf","timestamp":1749177874284,"gateway":"8UUXN4P00A06NK"} + +{"bid":"99ae15f1-605c-49b0-9918-fb56ed441ad9","data":{"departure_trajectory":[]},"tid":"1a7f0037-275f-4ad6-bb0d-ae14cf24d037","timestamp":1749177875033,"gateway":"8UUXN4P00A06NK"} + +{"bid":"855c81e3-f463-41e7-9187-73689542d4a7","data":{"departure_trajectory":[]},"tid":"a1ffebc2-bdae-437c-b032-d8fe1de087cd","timestamp":1749177875103,"gateway":"8UUXN4P00A06NK"} + +{"bid":"68f74e59-a31b-41f7-974b-404567bcfc79","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"fdd6bb38-d57c-4802-a826-9c8350886208","timestamp":1749177875602,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cf51ef92-ae95-4b06-824c-84be37c341cb","data":{"mobility_status_notify":0},"need_reply":1,"tid":"4380b7b7-1707-4fb9-a3ef-3f6a37533281","timestamp":1749177875999,"gateway":"8UUXN4P00A06NK"} + +{"bid":"849dd4a1-8476-4890-9bfe-d199be5698d1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3f7c4cec-d6db-41e5-a897-8f97b186eccd","timestamp":1749177876999,"gateway":"8UUXN4P00A06NK"} + +{"bid":"664fdb55-2c8c-49b8-b4dd-2af35b8ed496","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f1363f08-c5ff-4d11-9375-bccff89cc665","timestamp":1749177878419,"gateway":"8UUXN4P00A06NK"} + +{"tid":"f6feef4d-2f56-43b9-936f-f13f2fb745fe","bid":"6f0dedbd-e577-48c6-af7d-427d6cb2805d","timestamp":1749177906271,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"502005cb-72a0-4c66-a55d-86538cc95aa6","bid":"5cf5a147-a8eb-490f-afe0-206a962bffa5","timestamp":1749177906274,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"20b6714b-6fe8-4be2-b854-acf692a518a6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e1a7054c-28a9-4ae3-8c0b-d626c8d56ae5","timestamp":1749177907738,"gateway":"8UUXN4P00A06NK"} + +{"bid":"92e41727-bd36-4e05-a9b7-1e67f525c71a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"915044cb-3825-47ed-b2e8-7070b20f2419","timestamp":1749177907743,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fe7beade-11b3-446e-bf8c-10a5d567d590","data":{"dongle_infos":[]},"tid":"1e27958c-92d6-4bdf-8e91-42beed3b4117","timestamp":1749177908082,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c72d4035-e84f-45bb-8e38-d92aea7a4f89","data":{"firmware_version":"13.01.0002"},"tid":"8e69c5f5-b498-4487-85a1-cf82afcd4d44","timestamp":1749177908091,"gateway":"8UUXN4P00A06NK"} + +{"tid":"7e932482-8e11-4d52-81a1-d5312feb366e","bid":"fb5508c4-5a3b-4b08-a4d3-93ac5a227ab6","timestamp":1749177908285,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"43db2219-06b0-4960-9217-6a434c796474","data":{"air_transfer_enable":false},"need_reply":1,"tid":"5f3083c5-4ec6-4966-957b-f4964a1a3b4c","timestamp":1749177908297,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d9af3a0e-7b9d-4a4e-a706-d76ef346c3c5","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"62e3dfa4-3e6c-49de-a3c5-9a0d812076d4","timestamp":1749177908890,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c780b825-3eb8-4e3d-b297-915a0e87d9dd","data":{"dongle_infos":[]},"tid":"97bace99-7de4-4392-856e-793664564275","timestamp":1749177909095,"gateway":"8UUXN4P00A06NK"} + +{"bid":"20b6714b-6fe8-4be2-b854-acf692a518a6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e1a7054c-28a9-4ae3-8c0b-d626c8d56ae5","timestamp":1749177909915,"gateway":"8UUXN4P00A06NK"} + +{"bid":"92e41727-bd36-4e05-a9b7-1e67f525c71a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"915044cb-3825-47ed-b2e8-7070b20f2419","timestamp":1749177909917,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d9af3a0e-7b9d-4a4e-a706-d76ef346c3c5","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"62e3dfa4-3e6c-49de-a3c5-9a0d812076d4","timestamp":1749177910908,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8cf21509-99d4-4706-9dd4-3420560404c4","data":{"dongle_infos":[]},"tid":"a78b36d8-948b-4e78-a9bd-bd045c2c0a0d","timestamp":1749177911245,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ee071fe7-cb94-4ce8-b25a-3a1240446739","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5249b4f2-cd37-4e9b-8ed6-dae08df02987","timestamp":1749177911273,"gateway":"8UUXN4P00A06NK"} + +{"bid":"43db2219-06b0-4960-9217-6a434c796474","data":{"air_transfer_enable":false},"need_reply":1,"tid":"5f3083c5-4ec6-4966-957b-f4964a1a3b4c","timestamp":1749177912491,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9e008d33-94cd-473a-9864-1a0d5d45538b","data":{"departure_trajectory":[]},"tid":"4e4ea630-5020-462c-82b1-33c16b735bd6","timestamp":1749177912915,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3dbd7fdd-4cea-49e1-bccd-39cfd7ebc942","data":{"departure_trajectory":[]},"tid":"a6029dd8-b59b-4121-a9ed-3af6629fac80","timestamp":1749177913069,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ee071fe7-cb94-4ce8-b25a-3a1240446739","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5249b4f2-cd37-4e9b-8ed6-dae08df02987","timestamp":1749177913308,"gateway":"8UUXN4P00A06NK"} + +{"bid":"92e41727-bd36-4e05-a9b7-1e67f525c71a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"915044cb-3825-47ed-b2e8-7070b20f2419","timestamp":1749177914114,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d9af3a0e-7b9d-4a4e-a706-d76ef346c3c5","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"62e3dfa4-3e6c-49de-a3c5-9a0d812076d4","timestamp":1749177915113,"gateway":"8UUXN4P00A06NK"} + +{"bid":"82c61698-dc00-4197-9356-fd5c8ced6042","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2d4eef10-1640-4968-840c-e570ab5004ff","timestamp":1749177916273,"gateway":"8UUXN4P00A06NK"} + +{"bid":"82c61698-dc00-4197-9356-fd5c8ced6042","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2d4eef10-1640-4968-840c-e570ab5004ff","timestamp":1749177918310,"gateway":"8UUXN4P00A06NK"} + +{"tid":"5a4a7a40-e5c6-4608-a254-6a9039c99f66","bid":"b1e143d2-2294-4b13-b8c9-3811633cbaf3","timestamp":1749177945491,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"c58e2b9d-0715-4872-8c3c-39dab7b47583","bid":"c98ea6a2-e460-415e-ab6a-00f5bdbe02eb","timestamp":1749177945494,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"28591a84-8db2-4365-98d8-7631554efb3d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ec95dddc-265b-48ef-8e41-b139d613798a","timestamp":1749177946505,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3fdd494c-1c0e-4d84-ad0a-45334c63e34d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"bc1f2035-50fa-4c89-b8d1-fd264f4f1817","timestamp":1749177946532,"gateway":"8UUXN4P00A06NK"} + +{"bid":"199dec69-b6d1-40da-81d1-33cc60dc3418","data":{"dongle_infos":[]},"tid":"8ede7b02-83ce-4cf4-914a-60193d5be6d4","timestamp":1749177946877,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dce8b9bf-1144-4a87-ac2b-11d600182b76","data":{"dongle_infos":[]},"tid":"4953cd0d-b786-48e1-8368-4fea15950344","timestamp":1749177946878,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6056eded-f67c-47f1-b999-84a7caa914e3","data":{"firmware_version":"13.01.0002"},"tid":"89e8df36-8487-4d4a-860e-1c692c8592a3","timestamp":1749177946883,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cea9893c-5291-4bfd-84cd-c7ca4a5472ad","data":{"air_transfer_enable":false},"need_reply":1,"tid":"291b5a7e-d8d8-49e7-8c40-2dc69f39bedf","timestamp":1749177947072,"gateway":"8UUXN4P00A06NK"} + +{"tid":"3782eecc-16d3-4c77-9c4b-96f77a231a18","bid":"f5e9a151-7cc3-4926-8a1c-8a27ccb0a95b","timestamp":1749177947146,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"600f6932-5b86-471e-a6b7-06fdd9d9010f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b15d5380-03e1-4584-9c69-7fb9bc9cf481","timestamp":1749177947682,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5d9610a1-c746-4dbc-85bb-7a46bc1ab875","data":{"dongle_infos":[]},"tid":"967186bf-865f-4099-9c48-2a4032bc7424","timestamp":1749177947877,"gateway":"8UUXN4P00A06NK"} + +{"bid":"28591a84-8db2-4365-98d8-7631554efb3d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ec95dddc-265b-48ef-8e41-b139d613798a","timestamp":1749177948517,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3fdd494c-1c0e-4d84-ad0a-45334c63e34d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"bc1f2035-50fa-4c89-b8d1-fd264f4f1817","timestamp":1749177948717,"gateway":"8UUXN4P00A06NK"} + +{"bid":"600f6932-5b86-471e-a6b7-06fdd9d9010f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b15d5380-03e1-4584-9c69-7fb9bc9cf481","timestamp":1749177949717,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6e0ec307-5e9e-4297-898d-242936742771","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b6221102-1963-4c34-a8cf-43529dfdcbd3","timestamp":1749177950491,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cea9893c-5291-4bfd-84cd-c7ca4a5472ad","data":{"air_transfer_enable":false},"need_reply":1,"tid":"291b5a7e-d8d8-49e7-8c40-2dc69f39bedf","timestamp":1749177951277,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8ee8f1f0-5a8e-4e87-8c66-e698abad14e7","data":{"departure_trajectory":[]},"tid":"1aa25973-b607-41b2-b0b5-97b66b784aeb","timestamp":1749177951871,"gateway":"8UUXN4P00A06NK"} + +{"bid":"01e322e3-700c-439b-a5b1-672fa9c81ff1","data":{"departure_trajectory":[]},"tid":"f529c885-c282-41ff-a5fd-aa4584cfddc9","timestamp":1749177952080,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6e0ec307-5e9e-4297-898d-242936742771","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b6221102-1963-4c34-a8cf-43529dfdcbd3","timestamp":1749177952518,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3fdd494c-1c0e-4d84-ad0a-45334c63e34d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"bc1f2035-50fa-4c89-b8d1-fd264f4f1817","timestamp":1749177952918,"gateway":"8UUXN4P00A06NK"} + +{"bid":"600f6932-5b86-471e-a6b7-06fdd9d9010f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b15d5380-03e1-4584-9c69-7fb9bc9cf481","timestamp":1749177953920,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ce5bfb7c-90e7-45d7-b323-048fcc8cc33a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"522714e0-1a45-424f-a42c-b023236e9be8","timestamp":1749177955492,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ce5bfb7c-90e7-45d7-b323-048fcc8cc33a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"522714e0-1a45-424f-a42c-b023236e9be8","timestamp":1749177957517,"gateway":"8UUXN4P00A06NK"} + +{"tid":"6c5b07e9-da9f-41ce-b135-b6ccd0fd9811","bid":"fc8cf45d-9603-452b-b5ce-e398eb74ba15","timestamp":1749177981022,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"a46e96eb-5598-4565-b3fd-12d556195cb0","bid":"987c7eb0-1b85-4b95-856d-5083fd2ba7a0","timestamp":1749177981028,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"366a5670-236f-4d6c-a88a-ddd19a7db9b0","data":{"air_transfer_enable":false},"need_reply":1,"tid":"73933b12-0c99-4e99-84a4-19c6be172296","timestamp":1749177983227,"gateway":"8UUXN4P00A06NK"} + +{"bid":"af4d48fb-e23b-488c-bde5-709ebd70f46f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"12cda93d-284d-494e-829c-572c9703be65","timestamp":1749177985207,"gateway":"8UUXN4P00A06NK"} + +{"bid":"710a4c21-5512-406f-8e58-d7a68a1c87e7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"184803c8-d885-43ff-b2f6-925bcfc9586d","timestamp":1749177985328,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d1c3eeed-2259-4030-a712-32a4d60dbcab","data":{"dongle_infos":[]},"tid":"533a4b61-a528-4305-9c41-0ac1b8f93e51","timestamp":1749177985677,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7da50498-59c3-4fd0-9497-88149495e6f4","data":{"firmware_version":"13.01.0002"},"tid":"cfe6be77-4359-4f9d-a45a-abb78dea7359","timestamp":1749177985683,"gateway":"8UUXN4P00A06NK"} + +{"bid":"366a5670-236f-4d6c-a88a-ddd19a7db9b0","data":{"air_transfer_enable":false},"need_reply":1,"tid":"73933b12-0c99-4e99-84a4-19c6be172296","timestamp":1749177985875,"gateway":"8UUXN4P00A06NK"} + +{"tid":"fbfd6f53-03d5-475d-a6e5-258a4bfb50a7","bid":"e23479b0-0d06-4e92-b87d-284fef038e6b","timestamp":1749177986010,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"8e1bb390-cc31-429f-994e-d30c3ba1cc29","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0196aa1d-335b-4554-9556-2d43ad49f43d","timestamp":1749177986022,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8a0876c0-a7d9-4c05-8c49-0fd51154c9ec","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"18630b11-e107-4baf-bbbe-96f1276d6672","timestamp":1749177986359,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7f9755fc-c98d-4e1a-b08b-08a2a2acd083","data":{"dongle_infos":[]},"tid":"c36dbcad-7e97-4238-bb45-2ab61e00660c","timestamp":1749177986721,"gateway":"8UUXN4P00A06NK"} + +{"bid":"af4d48fb-e23b-488c-bde5-709ebd70f46f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"12cda93d-284d-494e-829c-572c9703be65","timestamp":1749177987356,"gateway":"8UUXN4P00A06NK"} + +{"tid":"271a23f8-acd6-4705-8989-bdfc70b00b8c","bid":"8c22b7f5-3be8-42d4-999c-54c65c555707","timestamp":1749178014406,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"67080fa5-b82a-4556-b0a3-ac85f56ebb95","bid":"cf1ce10f-150e-4254-be08-768e3739a5b7","timestamp":1749178014410,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"7b896b6e-58cc-4dfc-af68-87e2d243b14f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"877b59a4-1212-421f-a70b-d68e0231ec77","timestamp":1749178015434,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ef01616d-f296-4c4f-846d-75e9b9824118","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ad85ce6b-f87a-40ed-b8f9-940fe11d10d3","timestamp":1749178016011,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c551a7a1-e9cf-4c7b-a1f4-dff64fb6049f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1e976d7c-d01b-48f6-936a-31c224980ef7","timestamp":1749178016026,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d81da2d4-02b8-4d82-9c69-d2a47a7ba877","data":{"dongle_infos":[]},"tid":"4ce60d09-e153-40aa-b8e7-f62024d8473d","timestamp":1749178016069,"gateway":"8UUXN4P00A06NK"} + +{"bid":"15577ebb-2bf5-46de-8a18-f4495ae5cd26","data":{"firmware_version":"13.01.0002"},"tid":"b6ffdb99-59ff-4276-bc1f-6894ac70f044","timestamp":1749178016078,"gateway":"8UUXN4P00A06NK"} + +{"tid":"846ff7aa-b8ed-4a4b-988a-915f53e0e3b1","bid":"b252bd41-d842-4b82-be71-b99b1bcf59e9","timestamp":1749178016104,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"b720f5dc-faab-4aad-89f8-ae4e4a9140d6","data":{"air_transfer_enable":false},"need_reply":1,"tid":"88a641c1-2822-412a-bbe2-28b14616b92d","timestamp":1749178016259,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7eca22cc-395f-434a-9796-1a9037f8218e","data":{"dongle_infos":[]},"tid":"5f4b14e6-cc78-43fa-8c8a-e539473bc675","timestamp":1749178017071,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7b896b6e-58cc-4dfc-af68-87e2d243b14f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"877b59a4-1212-421f-a70b-d68e0231ec77","timestamp":1749178017448,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ef01616d-f296-4c4f-846d-75e9b9824118","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ad85ce6b-f87a-40ed-b8f9-940fe11d10d3","timestamp":1749178018049,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c551a7a1-e9cf-4c7b-a1f4-dff64fb6049f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1e976d7c-d01b-48f6-936a-31c224980ef7","timestamp":1749178018050,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e6b978c0-5ad2-4672-80f3-2a91a5548b3b","data":{"dongle_infos":[]},"tid":"219443a5-1082-4980-a772-ae6f5972775b","timestamp":1749178019404,"gateway":"8UUXN4P00A06NK"} + +{"bid":"54b78a84-7f49-47f1-b8fa-594ce95ab096","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bd3dccaf-2d80-4869-9027-70e91769293c","timestamp":1749178019414,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b720f5dc-faab-4aad-89f8-ae4e4a9140d6","data":{"air_transfer_enable":false},"need_reply":1,"tid":"88a641c1-2822-412a-bbe2-28b14616b92d","timestamp":1749178020466,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2e0606a6-9cfb-4393-9eff-c99becf1e1ac","data":{"departure_trajectory":[]},"tid":"a2f092de-8397-44c5-ba3e-d0ec26a2ad09","timestamp":1749178020951,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1a4dcc3-e598-465f-8b45-18b48d3c1dd3","data":{"departure_trajectory":[]},"tid":"7d69dd1d-89d0-4514-9fc3-157ccc7745db","timestamp":1749178021063,"gateway":"8UUXN4P00A06NK"} + +{"bid":"54b78a84-7f49-47f1-b8fa-594ce95ab096","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bd3dccaf-2d80-4869-9027-70e91769293c","timestamp":1749178021450,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ef01616d-f296-4c4f-846d-75e9b9824118","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ad85ce6b-f87a-40ed-b8f9-940fe11d10d3","timestamp":1749178022247,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c551a7a1-e9cf-4c7b-a1f4-dff64fb6049f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1e976d7c-d01b-48f6-936a-31c224980ef7","timestamp":1749178022249,"gateway":"8UUXN4P00A06NK"} + +{"bid":"968f6afa-b7df-434f-aba2-7786d425cf8b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"282f2223-8f37-43ba-96e7-2015ee67e3e1","timestamp":1749178024412,"gateway":"8UUXN4P00A06NK"} + +{"bid":"968f6afa-b7df-434f-aba2-7786d425cf8b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"282f2223-8f37-43ba-96e7-2015ee67e3e1","timestamp":1749178026447,"gateway":"8UUXN4P00A06NK"} + +{"tid":"443e3e86-420f-4e28-b523-4d73a3962b7b","bid":"8a8d57b7-4713-4b86-b408-4276e84170fc","timestamp":1749178053870,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"809c35f4-547a-4648-9698-5dddf241fe65","bid":"68034a04-e662-4dbc-ac7b-88b727985871","timestamp":1749178053877,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"34bb381d-4eae-49af-ad98-f12fd8af2f15","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3d816f13-651f-4e45-9d45-69d0f9001e2a","timestamp":1749178055075,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bef41157-a569-4a0c-93f5-3a79c3f572be","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a29f731d-1867-4f05-9558-0964462db933","timestamp":1749178055270,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2f6957b9-e2b2-47fc-9233-17e6bb486d99","data":{"dongle_infos":[]},"tid":"6c49b973-e524-4a61-b6de-91070d6a7fb3","timestamp":1749178055534,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7477b3b8-2039-4eb5-9e90-8f6fb8143805","data":{"firmware_version":"13.01.0002"},"tid":"b09e47f5-6ac9-41fb-b71c-5422a838a3ba","timestamp":1749178055541,"gateway":"8UUXN4P00A06NK"} + +{"bid":"00883313-db46-4450-a140-c80d1dc24a2a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"784db4ff-0325-43d0-ae9c-cab636abfcea","timestamp":1749178055719,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d141cb2e-328d-4cb7-9b5e-40090faccf58","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"da550355-d0ea-45dc-82b3-08e5879d28de","timestamp":1749178056414,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b43b536d-da95-4b9a-960b-fc061f97096a","bid":"d2587d67-d92d-47f8-969d-8603d68f3c21","timestamp":1749178056436,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"c0fce0fc-3dc1-40aa-ac27-de0fb4623a74","data":{"dongle_infos":[]},"tid":"f6d696eb-3460-4a65-8238-5bcde0426e6a","timestamp":1749178056530,"gateway":"8UUXN4P00A06NK"} + +{"bid":"34bb381d-4eae-49af-ad98-f12fd8af2f15","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3d816f13-651f-4e45-9d45-69d0f9001e2a","timestamp":1749178057170,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bef41157-a569-4a0c-93f5-3a79c3f572be","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a29f731d-1867-4f05-9558-0964462db933","timestamp":1749178057373,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d141cb2e-328d-4cb7-9b5e-40090faccf58","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"da550355-d0ea-45dc-82b3-08e5879d28de","timestamp":1749178058570,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4f6aa1b2-a688-4207-b309-8d27ca52f10d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"16c18565-5fe1-4b9e-a0fb-4029523af73e","timestamp":1749178058866,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9b35c0eb-e9fb-4f1f-9624-8683bf1ad45b","data":{"dongle_infos":[]},"tid":"7625d9a1-4428-4257-b99a-4ac7c2aba4ae","timestamp":1749178059902,"gateway":"8UUXN4P00A06NK"} + +{"bid":"00883313-db46-4450-a140-c80d1dc24a2a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"784db4ff-0325-43d0-ae9c-cab636abfcea","timestamp":1749178059928,"gateway":"8UUXN4P00A06NK"} + +{"bid":"89bfdf54-4a8b-4f87-8136-19978328fc9e","data":{"departure_trajectory":[]},"tid":"2d95bae1-a252-4056-8493-38ea9ea8c9e1","timestamp":1749178060522,"gateway":"8UUXN4P00A06NK"} + +{"bid":"41d032a0-49bd-49fe-9d26-8c365e123bbb","data":{"departure_trajectory":[]},"tid":"0b63b246-fffb-43c9-b7cf-efed9a6e73f0","timestamp":1749178060524,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4f6aa1b2-a688-4207-b309-8d27ca52f10d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"16c18565-5fe1-4b9e-a0fb-4029523af73e","timestamp":1749178060973,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bef41157-a569-4a0c-93f5-3a79c3f572be","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a29f731d-1867-4f05-9558-0964462db933","timestamp":1749178061572,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d141cb2e-328d-4cb7-9b5e-40090faccf58","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"da550355-d0ea-45dc-82b3-08e5879d28de","timestamp":1749178062771,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ceaf5663-f87d-4994-b288-797baf4295f8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0397db9e-378d-4689-abc8-57fee789f3a5","timestamp":1749178063862,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ceaf5663-f87d-4994-b288-797baf4295f8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0397db9e-378d-4689-abc8-57fee789f3a5","timestamp":1749178065971,"gateway":"8UUXN4P00A06NK"} + +{"tid":"5314a95a-e02b-472d-b2e1-efe129b240ab","bid":"01faafcf-2748-4333-8433-d8146d49a739","timestamp":1749178092017,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"4b20a8a0-8319-45b9-8f0f-67f1591ced5c","bid":"14d8b2c0-44c3-4387-9b16-5c4b0467f3ad","timestamp":1749178092019,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"66161e99-893b-4530-a8a0-71339717c2e9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bafd7efb-ea70-48c7-ae90-f303999f41d3","timestamp":1749178093066,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7889cd13-ba12-4024-8973-ac343dbcb9f7","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f1f8be20-32e7-4298-87df-473294ccc87b","timestamp":1749178093087,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df9e35c8-2128-4acb-ad72-d6120f777624","data":{"dongle_infos":[]},"tid":"a83d8422-ed3f-4773-a13a-f1cc3242cd0c","timestamp":1749178093447,"gateway":"8UUXN4P00A06NK"} + +{"bid":"db2e9b04-53ec-4f0c-87d9-efad5bcba1e4","data":{"firmware_version":"13.01.0002"},"tid":"5a0ea56c-4598-4af0-a5ca-d142b614112a","timestamp":1749178093452,"gateway":"8UUXN4P00A06NK"} + +{"bid":"65b7d179-b843-4e68-a185-36de747877e1","data":{"air_transfer_enable":false},"need_reply":1,"tid":"920a98ee-f2f7-49ae-a276-95b111d7ad75","timestamp":1749178093640,"gateway":"8UUXN4P00A06NK"} + +{"tid":"cbf7a755-13f0-42cd-9f0d-9802ad08b9b2","bid":"717f0119-55f5-4c91-9875-b68bab6848a3","timestamp":1749178093818,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"165f8bed-fdf7-467e-b1f3-6ecd76d94eb6","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"37903f24-b3cf-4a08-b2f1-e4de625d9319","timestamp":1749178094193,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b465bd53-2a3c-4e26-ba4f-db8f9710a2b0","data":{"dongle_infos":[]},"tid":"6a151346-66dd-4e41-96a6-62bf0a0d2b34","timestamp":1749178094451,"gateway":"8UUXN4P00A06NK"} + +{"bid":"66161e99-893b-4530-a8a0-71339717c2e9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bafd7efb-ea70-48c7-ae90-f303999f41d3","timestamp":1749178095257,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7889cd13-ba12-4024-8973-ac343dbcb9f7","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f1f8be20-32e7-4298-87df-473294ccc87b","timestamp":1749178095258,"gateway":"8UUXN4P00A06NK"} + +{"bid":"165f8bed-fdf7-467e-b1f3-6ecd76d94eb6","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"37903f24-b3cf-4a08-b2f1-e4de625d9319","timestamp":1749178096255,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b6ced3f3-b0d0-48c9-a3e5-12dc6efd0014","data":{"dongle_infos":[]},"tid":"895ecd88-33ed-49fa-ba2a-410623572ae7","timestamp":1749178096690,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4c1c6222-fdf8-4231-a07f-a76d1763d2da","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"61c2cf3d-4b53-4e49-ad65-8ce298d726ba","timestamp":1749178097014,"gateway":"8UUXN4P00A06NK"} + +{"bid":"65b7d179-b843-4e68-a185-36de747877e1","data":{"air_transfer_enable":false},"need_reply":1,"tid":"920a98ee-f2f7-49ae-a276-95b111d7ad75","timestamp":1749178097840,"gateway":"8UUXN4P00A06NK"} + +{"bid":"46031ced-e93a-4eb6-80f4-c81c107ca4f2","data":{"departure_trajectory":[]},"tid":"1f3fc6ee-97ba-4d29-82a7-d388b6b195d3","timestamp":1749178098437,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c0cf9f5-d9e0-429a-836f-4e402f1df3f7","data":{"departure_trajectory":[]},"tid":"07c10b81-d69f-4d11-9e70-1f504941f2a7","timestamp":1749178098656,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4c1c6222-fdf8-4231-a07f-a76d1763d2da","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"61c2cf3d-4b53-4e49-ad65-8ce298d726ba","timestamp":1749178099057,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7889cd13-ba12-4024-8973-ac343dbcb9f7","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f1f8be20-32e7-4298-87df-473294ccc87b","timestamp":1749178099461,"gateway":"8UUXN4P00A06NK"} + +{"bid":"165f8bed-fdf7-467e-b1f3-6ecd76d94eb6","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"37903f24-b3cf-4a08-b2f1-e4de625d9319","timestamp":1749178100455,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3bce274a-0d9c-436e-b8cc-7cd2e3769386","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"30b5147f-ee6e-460e-ba41-65f9e78fc0ed","timestamp":1749178102022,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3bce274a-0d9c-436e-b8cc-7cd2e3769386","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"30b5147f-ee6e-460e-ba41-65f9e78fc0ed","timestamp":1749178104057,"gateway":"8UUXN4P00A06NK"} + +{"tid":"346a3e1c-8d54-42a1-8f40-494ac8ef9059","bid":"10522566-9e0e-4ab4-8a0c-2a95dd185cfc","timestamp":1749178129813,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"abf202fc-9e6d-4e54-b508-387ba7e9527a","bid":"f24a6203-a059-4b3a-8f5b-7cba474e29ce","timestamp":1749178129819,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"c5fdbb76-3932-42e1-a310-d42c85c077ec","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cf21b541-c437-40c2-9950-01dff6a04eda","timestamp":1749178130821,"gateway":"8UUXN4P00A06NK"} + +{"bid":"40efae68-ebce-4807-bfd4-0db3687e5655","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e8cc6cca-d593-45f7-8bab-ff22faea3fa2","timestamp":1749178130862,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d9054e04-a390-49cf-bc78-cbc118222d53","data":{"dongle_infos":[]},"tid":"da70f892-7dde-4257-a977-68ea6bfd0e05","timestamp":1749178131134,"gateway":"8UUXN4P00A06NK"} + +{"bid":"545e3b3a-e7c4-4665-86e2-4053a788739c","data":{"firmware_version":"13.01.0002"},"tid":"da12c2df-4178-4664-b6a4-1496662f9ee9","timestamp":1749178131142,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2a90f0bb-d7b9-43d4-9cde-98965f82e3e2","data":{"air_transfer_enable":false},"need_reply":1,"tid":"465f2582-5aa9-4b58-8c06-72a99a7414eb","timestamp":1749178131346,"gateway":"8UUXN4P00A06NK"} + +{"tid":"f4de06c0-61d3-4052-bc3d-2f8352357daa","bid":"1b3bd40f-0ddf-4a95-9280-93dcf26264b5","timestamp":1749178131427,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"4a7d1e3f-cfbf-435c-b002-aafff640eff8","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"7e6fa8eb-1d18-4824-ba6c-a1485a0b610c","timestamp":1749178131948,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b8d6a76f-52d3-4e62-92d9-810a18685500","data":{"dongle_infos":[]},"tid":"40015f94-c152-46e1-8266-b777d197ce76","timestamp":1749178132183,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c5fdbb76-3932-42e1-a310-d42c85c077ec","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cf21b541-c437-40c2-9950-01dff6a04eda","timestamp":1749178132993,"gateway":"8UUXN4P00A06NK"} + +{"bid":"40efae68-ebce-4807-bfd4-0db3687e5655","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e8cc6cca-d593-45f7-8bab-ff22faea3fa2","timestamp":1749178132994,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4a7d1e3f-cfbf-435c-b002-aafff640eff8","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"7e6fa8eb-1d18-4824-ba6c-a1485a0b610c","timestamp":1749178133989,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a52510b4-593b-4303-8b1b-b051f1c38407","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4a8eb6c8-460c-4b75-a6b3-d806068820e1","timestamp":1749178134816,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2a90f0bb-d7b9-43d4-9cde-98965f82e3e2","data":{"air_transfer_enable":false},"need_reply":1,"tid":"465f2582-5aa9-4b58-8c06-72a99a7414eb","timestamp":1749178135555,"gateway":"8UUXN4P00A06NK"} + +{"bid":"09c7ab3a-929e-4062-ada1-f5956d98058c","data":{"departure_trajectory":[]},"tid":"a02cf0a0-1873-4c95-a2b6-d9b9537c7da8","timestamp":1749178136126,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b02ec357-e82c-4a2c-a836-b6c1a8d24fbd","data":{"dongle_infos":[]},"tid":"4706cda1-b538-4bfb-9752-fe87ce3c8e76","timestamp":1749178136429,"gateway":"8UUXN4P00A06NK"} + +{"bid":"020c6434-a44b-4dad-8479-a8ced67c25ae","data":{"departure_trajectory":[]},"tid":"0650c021-401b-4c0a-bad1-6fa079160c3d","timestamp":1749178136459,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a52510b4-593b-4303-8b1b-b051f1c38407","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4a8eb6c8-460c-4b75-a6b3-d806068820e1","timestamp":1749178136990,"gateway":"8UUXN4P00A06NK"} + +{"bid":"40efae68-ebce-4807-bfd4-0db3687e5655","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e8cc6cca-d593-45f7-8bab-ff22faea3fa2","timestamp":1749178137192,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4a7d1e3f-cfbf-435c-b002-aafff640eff8","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"7e6fa8eb-1d18-4824-ba6c-a1485a0b610c","timestamp":1749178138187,"gateway":"8UUXN4P00A06NK"} + +{"bid":"99ae42bf-7425-4c26-92b7-1566b76e3da4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5d227e84-de86-412d-b0bb-b54b1ec7f8af","timestamp":1749178139807,"gateway":"8UUXN4P00A06NK"} + +{"tid":"4cb20ff5-90ab-4d2a-8b3b-3ff9d6e2e7d7","bid":"fbc10f8a-436a-45d9-8ace-e69988de4bcb","timestamp":1749178167739,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"a061ddca-4be4-45b6-93eb-761c7c6e0611","bid":"0ed3926e-8b0c-44ca-9cf4-cd180a546297","timestamp":1749178167742,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"104264b0-fc6d-42d0-a00e-3f66c65655a5","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3e849739-f223-48ab-955f-749653cb7546","timestamp":1749178167867,"gateway":"8UUXN4P00A06NK"} + +{"bid":"525e59d2-f811-4fdf-aef5-9af3c4c4ddde","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7aa34bfd-eb01-4f98-9d71-ff2bbb8728b6","timestamp":1749178169829,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f893c2ae-dff7-4db2-8aed-19a091594ee4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d67c5338-73ed-4c55-af95-0bf2171f59cb","timestamp":1749178169870,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c9d63b45-9d8b-425d-a3b5-1e602e4001c2","data":{"dongle_infos":[]},"tid":"551e1fbe-0648-4fd7-b562-4cab6f56d862","timestamp":1749178170246,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a7f2b0d4-b8e7-4b5e-b8a0-85d2b0ba83f1","data":{"firmware_version":"13.01.0002"},"tid":"5ed65d2e-232d-4ee9-bafc-9d581569a769","timestamp":1749178170256,"gateway":"8UUXN4P00A06NK"} + +{"bid":"104264b0-fc6d-42d0-a00e-3f66c65655a5","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3e849739-f223-48ab-955f-749653cb7546","timestamp":1749178170441,"gateway":"8UUXN4P00A06NK"} + +{"tid":"11ddd2f4-1aeb-41d1-8fa1-9b3228bea669","bid":"a37b5ea6-29be-45d8-856f-344e7762061b","timestamp":1749178170782,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"c55048e0-4e64-4e77-ad9f-de531c48f1e8","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"8b84d38f-0511-421c-88a9-14e3bb599e6a","timestamp":1749178170925,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2e17243e-3dbd-44ab-9e98-84d80dd72c74","data":{"dongle_infos":[]},"tid":"0827d0cc-2864-4440-94f3-398f67015f97","timestamp":1749178171254,"gateway":"8UUXN4P00A06NK"} + +{"bid":"525e59d2-f811-4fdf-aef5-9af3c4c4ddde","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7aa34bfd-eb01-4f98-9d71-ff2bbb8728b6","timestamp":1749178171922,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f893c2ae-dff7-4db2-8aed-19a091594ee4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d67c5338-73ed-4c55-af95-0bf2171f59cb","timestamp":1749178171923,"gateway":"8UUXN4P00A06NK"} + +{"bid":"13dff7de-2606-4dad-a21b-e3536b5ec399","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"abb0a684-876e-44f9-b67e-b4aa8571d972","timestamp":1749178172742,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c55048e0-4e64-4e77-ad9f-de531c48f1e8","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"8b84d38f-0511-421c-88a9-14e3bb599e6a","timestamp":1749178172919,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eada0fca-32de-41ea-8847-c4a32a641f5d","data":{"dongle_infos":[]},"tid":"e2b5d511-6dc5-4700-b2c8-70036eac1299","timestamp":1749178173603,"gateway":"8UUXN4P00A06NK"} + +{"tid":"a95bbb6a-6e65-4735-a425-9b973126666d","bid":"df1f0931-7897-401a-9212-383271ee93fc","timestamp":1749178198541,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"26f6843b-78b7-43db-93a8-c2702cceef89","bid":"50810c80-c254-44f0-9650-ade1bfbb1e33","timestamp":1749178198544,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"84e05f5c-42da-4906-8bf9-8616ca7b2d42","bid":"2d8a0103-c243-45a4-bc28-97a74f7f133a","timestamp":1749178198660,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"a194f9f2-927c-427b-bec0-e0a8af212ceb","bid":"8ca212d0-506a-4c15-9e24-9a3370ffe590","timestamp":1749178198665,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"26636ae6-9e1e-4dac-bf2d-e00a6a46b54e","bid":"4977718a-4f67-4b10-ba4d-552676e32157","timestamp":1749178198676,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"0897ce4f-b41e-470c-85b2-74e07de0f4ee","data":{"air_transfer_enable":false},"need_reply":1,"tid":"0392ea9b-c98c-4394-b623-5e87d71c2a05","timestamp":1749178199801,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7194b0ed-dfdc-462e-9cf1-a991246a8c52","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0508ac8a-fd8a-4003-9b1e-1cbef90b291b","timestamp":1749178201749,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9a609df7-d201-4040-bf78-31c8b30e9f43","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c047d168-3bc6-4de7-b5b3-4fd162deb692","timestamp":1749178201956,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6fba0cf3-3e64-4f11-a65a-363e7db8ef73","data":{"dongle_infos":[]},"tid":"9873b2a4-5bd8-4729-bd67-2167f141ff3e","timestamp":1749178202145,"gateway":"8UUXN4P00A06NK"} + +{"bid":"424cce35-a97b-4b03-b0b8-b48e8d4ca8a5","data":{"firmware_version":"13.01.0002"},"tid":"ebcbee94-f9bd-42a4-8844-3f87782c9f94","timestamp":1749178202153,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0897ce4f-b41e-470c-85b2-74e07de0f4ee","data":{"air_transfer_enable":false},"need_reply":1,"tid":"0392ea9b-c98c-4394-b623-5e87d71c2a05","timestamp":1749178202331,"gateway":"8UUXN4P00A06NK"} + +{"tid":"cbaa7beb-42ae-4e55-9c90-954948784e7c","bid":"94842aae-e9a7-4dce-aba6-97679c2cad35","timestamp":1749178202911,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"37e2b8b6-e49e-45b8-8939-292e67c93e1c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"30f98dfd-7bca-4a81-96b0-322021269df0","timestamp":1749178203020,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e0d9e6e5-5681-4e37-9cbc-130b16159a90","data":{"dongle_infos":[]},"tid":"6ae3fa36-499b-4ca8-98a8-f06a7944c706","timestamp":1749178203152,"gateway":"8UUXN4P00A06NK"} + +{"bid":"67acc99a-b305-4f9c-8f55-d7bd8477d056","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ca5e5647-50de-4b53-8b84-2036627dc5a5","timestamp":1749178203544,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a3319f42-1c8d-47a6-a544-c235a66b375d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2da7808c-4140-4bec-bcc0-68380b8a8e47","timestamp":1749178203664,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9a609df7-d201-4040-bf78-31c8b30e9f43","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c047d168-3bc6-4de7-b5b3-4fd162deb692","timestamp":1749178204055,"gateway":"8UUXN4P00A06NK"} + +{"bid":"37e2b8b6-e49e-45b8-8939-292e67c93e1c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"30f98dfd-7bca-4a81-96b0-322021269df0","timestamp":1749178205056,"gateway":"8UUXN4P00A06NK"} + +{"tid":"2f51dfec-77d6-4863-a5b5-9ac1a90ad229","bid":"318a0b6c-6447-40cf-92ed-5c80e37b722e","timestamp":1749178231867,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"d015454e-6031-4ab8-affd-a044d21f6ba0","bid":"fa82e01f-a884-476e-a075-b451858aceef","timestamp":1749178231870,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"b2ecfdfe-5ccf-4ad8-8367-d2fe6861271d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9b0a654b-b99c-4344-a78e-01372289cde0","timestamp":1749178233329,"gateway":"8UUXN4P00A06NK"} + +{"bid":"814302b1-6e04-4530-8223-6791193a36c1","data":{"mobility_status_notify":0},"need_reply":1,"tid":"bea8275a-09be-448c-a3e2-afaf08233183","timestamp":1749178233430,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f5b11637-f74d-4228-983f-9a05415b0e0d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"17e25e55-539a-49bf-9f6d-262bdf22357e","timestamp":1749178233909,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fc57517c-c723-48c1-b7fc-c3cad577f82d","data":{"dongle_infos":[]},"tid":"b77a1233-c286-4980-b420-372746f0d0ec","timestamp":1749178233915,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b7859244-d9ad-41bf-8613-7504cf2e162e","data":{"firmware_version":"13.01.0002"},"tid":"fd207b9a-b65d-4314-a21b-f87a39193722","timestamp":1749178233923,"gateway":"8UUXN4P00A06NK"} + +{"tid":"2a48e20c-8cac-49fb-a89f-fcaf39e1d386","bid":"62986342-2acf-42c7-a77f-a452b1c8f5a1","timestamp":1749178234010,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"14895f4c-bb66-4d21-adcd-0ba907d8dc46","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"dea85a16-8758-43b0-bc9b-4952ecf947d5","timestamp":1749178234586,"gateway":"8UUXN4P00A06NK"} + +{"bid":"768d9790-6d8b-4711-9611-255464f5302a","data":{"dongle_infos":[]},"tid":"cbd44880-4b69-4f3e-8124-0a04e7a25584","timestamp":1749178234966,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b2ecfdfe-5ccf-4ad8-8367-d2fe6861271d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9b0a654b-b99c-4344-a78e-01372289cde0","timestamp":1749178235470,"gateway":"8UUXN4P00A06NK"} + +{"bid":"814302b1-6e04-4530-8223-6791193a36c1","data":{"mobility_status_notify":0},"need_reply":1,"tid":"bea8275a-09be-448c-a3e2-afaf08233183","timestamp":1749178235471,"gateway":"8UUXN4P00A06NK"} + +{"bid":"14895f4c-bb66-4d21-adcd-0ba907d8dc46","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"dea85a16-8758-43b0-bc9b-4952ecf947d5","timestamp":1749178236671,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e305315e-278a-4d1b-83bd-d0362416cd2e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"aa5aeb00-a741-4240-bf1b-a89b775c17ba","timestamp":1749178236865,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f5b11637-f74d-4228-983f-9a05415b0e0d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"17e25e55-539a-49bf-9f6d-262bdf22357e","timestamp":1749178237911,"gateway":"8UUXN4P00A06NK"} + +{"bid":"598d4343-6b4a-4d66-9a41-a8b3ca15f12e","data":{"departure_trajectory":[]},"tid":"8f05380b-eb42-4040-9058-786c9f6e7fc3","timestamp":1749178238595,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e305315e-278a-4d1b-83bd-d0362416cd2e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"aa5aeb00-a741-4240-bf1b-a89b775c17ba","timestamp":1749178238871,"gateway":"8UUXN4P00A06NK"} + +{"bid":"21924d69-f965-4e99-a779-44723b81bbf2","data":{"dongle_infos":[]},"tid":"7a794830-6dff-4bde-a9cc-e5a119efa448","timestamp":1749178238874,"gateway":"8UUXN4P00A06NK"} + +{"bid":"955e08cd-493f-4024-9edf-20438546e961","data":{"departure_trajectory":[]},"tid":"4da742c9-7921-40d0-b1fb-d470e3b720b4","timestamp":1749178238906,"gateway":"8UUXN4P00A06NK"} + +{"bid":"814302b1-6e04-4530-8223-6791193a36c1","data":{"mobility_status_notify":0},"need_reply":1,"tid":"bea8275a-09be-448c-a3e2-afaf08233183","timestamp":1749178239671,"gateway":"8UUXN4P00A06NK"} + +{"bid":"14895f4c-bb66-4d21-adcd-0ba907d8dc46","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"dea85a16-8758-43b0-bc9b-4952ecf947d5","timestamp":1749178240870,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e0ea734d-d20c-40ad-bb9b-c9b5f580db26","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5505cf42-b693-43a4-ad47-8eb9afecc648","timestamp":1749178241863,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e0ea734d-d20c-40ad-bb9b-c9b5f580db26","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5505cf42-b693-43a4-ad47-8eb9afecc648","timestamp":1749178243871,"gateway":"8UUXN4P00A06NK"} + +{"tid":"aa6ea8ae-f48b-4ee0-8574-515e869311b4","bid":"0d695ac4-9ef2-4113-862e-57651bd16b5d","timestamp":1749178266717,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"901bf38d-3188-448b-a7b0-f314e9cd75b1","bid":"db26cdb5-99c8-4966-b37f-ef49748ae48f","timestamp":1749178266719,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"388b71c5-245b-4745-bdf0-21b87cd2de9d","bid":"d3763077-c6cb-4440-a99f-7a2b131f923f","timestamp":1749178267180,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"16687143-6266-4091-93e1-6bc185c5f977","bid":"260d7605-5618-422f-99af-c2cf7b7ec845","timestamp":1749178267184,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"9ddafb92-844f-4a36-b0dc-e85cd0943dbd","bid":"c24f0007-07ff-4f70-af94-9bc2f36e2ebf","timestamp":1749178267187,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"9b61129a-8ab3-41e2-a92d-3bdb68da1982","data":{"air_transfer_enable":false},"need_reply":1,"tid":"46652ba2-05a2-4d3c-8a37-d5abf5c05be3","timestamp":1749178269176,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3ccda638-daba-42ee-a89a-56c8b98ffc59","data":{"mobility_status_notify":0},"need_reply":1,"tid":"aaaf9443-9003-4365-8e49-e4724f2db033","timestamp":1749178271258,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d644bb37-9b80-4e51-8d40-aa3ebf3d5f2c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"00cfdc29-baa2-4315-b290-93230bbb312d","timestamp":1749178271267,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2aa842ab-fb0e-4429-bbfb-e2288723880a","data":{"dongle_infos":[]},"tid":"78e0d393-51ce-42ef-ab16-e2c3f68da80b","timestamp":1749178271619,"gateway":"8UUXN4P00A06NK"} + +{"bid":"695d87a6-52fb-4336-949e-49323d828c33","data":{"firmware_version":"13.01.0002"},"tid":"a517a746-c977-4df6-a477-1209b61b4e04","timestamp":1749178271627,"gateway":"8UUXN4P00A06NK"} + +{"bid":"adc4cf7c-73be-4e71-b4f6-6f5aab1ec8c1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"597d2073-453d-4c26-bbd9-de3468cfeddf","timestamp":1749178271721,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9b61129a-8ab3-41e2-a92d-3bdb68da1982","data":{"air_transfer_enable":false},"need_reply":1,"tid":"46652ba2-05a2-4d3c-8a37-d5abf5c05be3","timestamp":1749178271814,"gateway":"8UUXN4P00A06NK"} + +{"tid":"38fcbf02-eeb3-4b98-8798-83f874526347","bid":"dd025e67-1db7-4aa8-905a-f8a1edf270c9","timestamp":1749178271975,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"670dc0d5-628c-4074-8fe1-12c4c81092c3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7a197e44-40bf-48e9-a30c-418b4cf98cf4","timestamp":1749178272183,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b7c19d0f-8727-4a6b-8bc6-f6bb73a273de","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"7f5ad9b1-cec3-4b9b-93f8-13b5c3359e23","timestamp":1749178272369,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cf94f359-a594-410d-8274-8e156d061b3a","data":{"dongle_infos":[]},"tid":"b0b4c11e-ecf8-4343-8196-3a68543d0fa6","timestamp":1749178272619,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3ccda638-daba-42ee-a89a-56c8b98ffc59","data":{"mobility_status_notify":0},"need_reply":1,"tid":"aaaf9443-9003-4365-8e49-e4724f2db033","timestamp":1749178273328,"gateway":"8UUXN4P00A06NK"} + +{"tid":"5b209a6e-4bf4-4461-a112-1452b6b383f7","bid":"a170fe86-f019-4b0d-a86d-e13679be7540","timestamp":1749178298610,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"69693b44-1507-442e-9a06-f380e331b859","bid":"fd198808-4286-4223-9890-ce4214ec3fcf","timestamp":1749178298617,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"848e5122-6c7b-4e12-930e-40b5acad222c","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e0046d3e-2bd1-4dfc-84e4-67d4b4718164","timestamp":1749178300426,"gateway":"8UUXN4P00A06NK"} + +{"bid":"80d91407-2a03-4952-a7f3-adf6a7ae7501","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1863efde-bf3f-45eb-8c0f-24f67fb17185","timestamp":1749178302375,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c336cc4d-9fd2-45bd-a957-553b66fadf5c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3038f561-f549-46ff-b98e-a0301e3c554d","timestamp":1749178302554,"gateway":"8UUXN4P00A06NK"} + +{"tid":"08efef88-4420-4090-8f7f-4bccce5dad2f","bid":"74d46fc1-1804-452c-af3d-f110da5c99ae","timestamp":1749178302982,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"848e5122-6c7b-4e12-930e-40b5acad222c","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e0046d3e-2bd1-4dfc-84e4-67d4b4718164","timestamp":1749178303060,"gateway":"8UUXN4P00A06NK"} + +{"bid":"82345bb7-6631-4d9c-befb-a265cb6f4545","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"7b423dce-5907-4c87-8d34-c906ac16fbfe","timestamp":1749178303417,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6cdd742a-99ac-47a6-8cec-0a88d301a305","data":{"dongle_infos":[]},"tid":"9b322483-f17d-4363-bf11-cabe8189645d","timestamp":1749178303435,"gateway":"8UUXN4P00A06NK"} + +{"bid":"50c03cf6-6b10-4136-97c2-79c1480994ac","data":{"firmware_version":"13.01.0002"},"tid":"c0f78561-0b91-4df5-ae5c-244bb0dd969e","timestamp":1749178303466,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2b8daa3c-54f9-41b3-a7c3-948e2ad5f1e6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"99bde56e-1423-4f8d-8f34-3d9d4fbd54d7","timestamp":1749178303613,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bcfa4b8d-b0cd-458a-bd4d-10a9fc5f597c","data":{"dongle_infos":[]},"tid":"6d80afdd-988d-4e55-8fe5-361510f79df9","timestamp":1749178304442,"gateway":"8UUXN4P00A06NK"} + +{"bid":"80d91407-2a03-4952-a7f3-adf6a7ae7501","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1863efde-bf3f-45eb-8c0f-24f67fb17185","timestamp":1749178304540,"gateway":"8UUXN4P00A06NK"} + +{"bid":"82345bb7-6631-4d9c-befb-a265cb6f4545","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"7b423dce-5907-4c87-8d34-c906ac16fbfe","timestamp":1749178305542,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d9122add-833d-4e97-ad0e-d0356f9415f6","bid":"3d28b48f-fdd2-4bc4-bfed-d9fcfb469d5a","timestamp":1749178331139,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"7dd0fb21-ef6b-4946-9e18-4dd928aa5ff0","bid":"034ce90c-f12c-47af-8504-72c0a6d9dd61","timestamp":1749178331143,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"87576b85-25b3-417a-96fe-87ca911fdb24","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"608fb08f-c395-414e-afc5-30beeae77fb9","timestamp":1749178332257,"gateway":"8UUXN4P00A06NK"} + +{"bid":"503b7443-6308-43ac-bb8b-8c74cd38a9c6","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"d6b9213b-f47a-4a55-a9f3-a4b3131b4158","timestamp":1749178332868,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4268085a-ae0e-49ca-ac64-5db992d68a87","data":{"air_transfer_enable":false},"need_reply":1,"tid":"108ac695-c7cf-4ca5-8a6e-7b91f7504441","timestamp":1749178332877,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bbb59455-57e4-45d1-aeeb-f0e6085387d8","data":{"dongle_infos":[]},"tid":"c43a323a-9aac-4b31-a1a3-d30929bee858","timestamp":1749178332885,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e4316645-8081-4210-a210-48b145e58a77","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a72bcfa9-baab-4083-9782-dc4ee7323caa","timestamp":1749178332891,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5a27c16e-2e18-4023-ada8-e0cfa671fcb6","data":{"firmware_version":"13.01.0002"},"tid":"e2079290-b3e0-486b-9696-feb88bcded33","timestamp":1749178332924,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d6e96378-f9c0-4b90-b3ba-3964e144e7ed","bid":"14c45199-5f3b-49b3-ac29-bdcecfdd13f5","timestamp":1749178332925,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"fb67918c-eec1-4ccf-8c6f-ca17147572df","data":{"dongle_infos":[]},"tid":"637e7c71-d4bb-4ee2-9b46-9273a337be3e","timestamp":1749178333878,"gateway":"8UUXN4P00A06NK"} + +{"bid":"87576b85-25b3-417a-96fe-87ca911fdb24","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"608fb08f-c395-414e-afc5-30beeae77fb9","timestamp":1749178334320,"gateway":"8UUXN4P00A06NK"} + +{"bid":"503b7443-6308-43ac-bb8b-8c74cd38a9c6","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"d6b9213b-f47a-4a55-a9f3-a4b3131b4158","timestamp":1749178334921,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e4316645-8081-4210-a210-48b145e58a77","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a72bcfa9-baab-4083-9782-dc4ee7323caa","timestamp":1749178334923,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d3eaab6c-5f13-4257-a6bb-c0dd27961a50","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"82a52111-6378-42e2-9169-0d4de69b2c55","timestamp":1749178336140,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4268085a-ae0e-49ca-ac64-5db992d68a87","data":{"air_transfer_enable":false},"need_reply":1,"tid":"108ac695-c7cf-4ca5-8a6e-7b91f7504441","timestamp":1749178337079,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a3155a5f-3401-4315-852a-871ef6c10ed0","data":{"dongle_infos":[]},"tid":"fc5c292a-4575-4e09-8098-a20f0bb84e95","timestamp":1749178337205,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cd7711ef-a70a-4120-a6db-84b001d25cff","data":{"departure_trajectory":[]},"tid":"7fd6e225-319b-44bd-bac0-994ee7a466cf","timestamp":1749178337800,"gateway":"8UUXN4P00A06NK"} + +{"bid":"644c620c-1850-4f14-b2c9-ba7f1c93b036","data":{"departure_trajectory":[]},"tid":"4a52d909-3591-4b44-bc3e-5bcbaac0f7a3","timestamp":1749178337871,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d3eaab6c-5f13-4257-a6bb-c0dd27961a50","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"82a52111-6378-42e2-9169-0d4de69b2c55","timestamp":1749178338319,"gateway":"8UUXN4P00A06NK"} + +{"bid":"503b7443-6308-43ac-bb8b-8c74cd38a9c6","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"d6b9213b-f47a-4a55-a9f3-a4b3131b4158","timestamp":1749178339119,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e4316645-8081-4210-a210-48b145e58a77","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a72bcfa9-baab-4083-9782-dc4ee7323caa","timestamp":1749178339120,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c802ca62-3f9c-4472-9fb1-9e772c62c7c9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3217e53c-d4c5-4fda-afe7-5f6dad7148fd","timestamp":1749178341141,"gateway":"8UUXN4P00A06NK"} + +{"tid":"e003d1c9-4916-4bd0-a6c8-ddc5de4a6c09","bid":"3151bde3-adfd-4167-bfcf-547803f3d21f","timestamp":1749178369511,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"8d947687-d9c3-4127-a2fb-199bccf81301","bid":"2ebe37e9-7307-44da-aa67-c931576575ca","timestamp":1749178369515,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"dd387077-a936-4f5a-a8c9-6bcfa295c2f6","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"772917e7-13b7-432d-8f53-372554fa740c","timestamp":1749178371364,"gateway":"8UUXN4P00A06NK"} + +{"bid":"470ed53b-a79c-4ee0-8217-1c527a991311","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cd872e9d-e902-4b1f-b8a7-57d7b940a94f","timestamp":1749178371377,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d41baa3b-fc5b-45ef-814d-206a11bd6052","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7006f3ae-8947-4cee-8023-e465882c10e7","timestamp":1749178371384,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aa566ed3-c75a-467c-9ae4-53a78ee13f4c","data":{"dongle_infos":[]},"tid":"aba41124-7976-4097-b79c-debecf6ade40","timestamp":1749178371391,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7d87c3df-cc69-4dcd-bd30-1c23bd1342f9","data":{"firmware_version":"13.01.0002"},"tid":"35ab8d1c-ca13-44b6-8a6d-aad8dffca67e","timestamp":1749178371403,"gateway":"8UUXN4P00A06NK"} + +{"bid":"788a1fae-5051-4364-ae14-5987822be69d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7e149bf3-9581-410e-9a0d-056c42d1dfd5","timestamp":1749178371465,"gateway":"8UUXN4P00A06NK"} + +{"tid":"0b591241-a746-4056-9744-906bf2679bb6","bid":"9db0c9ac-2e12-4ece-85c2-ce4b9ee4aefd","timestamp":1749178371697,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"d59a652f-7f85-4b0a-8d00-39094ffa6247","data":{"dongle_infos":[]},"tid":"099c26c1-7d47-41e6-a7e2-9799b8d5f535","timestamp":1749178372411,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dd387077-a936-4f5a-a8c9-6bcfa295c2f6","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"772917e7-13b7-432d-8f53-372554fa740c","timestamp":1749178373509,"gateway":"8UUXN4P00A06NK"} + +{"bid":"470ed53b-a79c-4ee0-8217-1c527a991311","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cd872e9d-e902-4b1f-b8a7-57d7b940a94f","timestamp":1749178373510,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d41baa3b-fc5b-45ef-814d-206a11bd6052","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7006f3ae-8947-4cee-8023-e465882c10e7","timestamp":1749178373511,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2d72ba79-689a-4d54-968d-ab3ba14ba183","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e9ea88fd-1ac1-4bff-bea1-0f8013366229","timestamp":1749178374527,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c9e9461b-33a1-4925-93b1-1bc2fec379bd","data":{"dongle_infos":[]},"tid":"4b35d385-1fb6-4980-b931-f4b2c0dcb816","timestamp":1749178374787,"gateway":"8UUXN4P00A06NK"} + +{"bid":"788a1fae-5051-4364-ae14-5987822be69d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7e149bf3-9581-410e-9a0d-056c42d1dfd5","timestamp":1749178375667,"gateway":"8UUXN4P00A06NK"} + +{"bid":"07c763f7-168f-469d-ade2-f0ea7ab6d3ef","data":{"departure_trajectory":[]},"tid":"584a2580-6aeb-4794-adb3-9ab1fcefa354","timestamp":1749178376176,"gateway":"8UUXN4P00A06NK"} + +{"bid":"78eeb825-a043-4527-8332-692dcbb3b752","data":{"departure_trajectory":[]},"tid":"a733cef9-169f-479b-b6b9-980adfbc0546","timestamp":1749178376366,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2d72ba79-689a-4d54-968d-ab3ba14ba183","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e9ea88fd-1ac1-4bff-bea1-0f8013366229","timestamp":1749178376706,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dd387077-a936-4f5a-a8c9-6bcfa295c2f6","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"772917e7-13b7-432d-8f53-372554fa740c","timestamp":1749178377702,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d41baa3b-fc5b-45ef-814d-206a11bd6052","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7006f3ae-8947-4cee-8023-e465882c10e7","timestamp":1749178377703,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6a90cc4e-ada1-4384-8a39-3c059680914f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8c137cf6-d27f-4b48-9d66-658dc03a53cf","timestamp":1749178379517,"gateway":"8UUXN4P00A06NK"} + +{"tid":"49165bc8-990c-4ff0-b0f6-20915a8f001b","bid":"c11337be-e030-4c5a-8e78-dd65187b0646","timestamp":1749178407837,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"92ee3342-f442-426e-80ec-4ac1c30d48ab","bid":"346368b2-26eb-4cc6-937f-f1a15aba1653","timestamp":1749178407840,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"55da9b09-983a-4a35-a19f-f3cc13bc3563","data":{"air_transfer_enable":false},"need_reply":1,"tid":"289c28f4-f2c1-4bfc-999e-4788fd72ee2a","timestamp":1749178408450,"gateway":"8UUXN4P00A06NK"} + +{"bid":"761fb0c7-0267-4bf1-a858-773259e38caa","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ff4db984-807a-4259-9e9b-4dbfd247a465","timestamp":1749178410371,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ae64cdd0-c9ed-4d1c-acb5-0133a7d36114","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"de957af0-3641-4024-97ba-57a29699a958","timestamp":1749178410374,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5f25d1bc-fc6a-4594-a419-12fc2d151e72","data":{"dongle_infos":[]},"tid":"59a276f9-dbcd-4f2e-9af2-5394a4655e6c","timestamp":1749178410823,"gateway":"8UUXN4P00A06NK"} + +{"bid":"04742dfd-1504-463d-8178-716ce51c5ac4","data":{"firmware_version":"13.01.0002"},"tid":"a61894a3-9680-4a38-b4a1-3d718eb68b60","timestamp":1749178410829,"gateway":"8UUXN4P00A06NK"} + +{"bid":"55da9b09-983a-4a35-a19f-f3cc13bc3563","data":{"air_transfer_enable":false},"need_reply":1,"tid":"289c28f4-f2c1-4bfc-999e-4788fd72ee2a","timestamp":1749178411020,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b995af54-151a-488f-b8cd-dfd5f2a2aa14","bid":"6368d35b-7b0c-49a2-9e69-91b260dbed98","timestamp":1749178411132,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"b04e8e74-57fc-4dcc-8184-11f7aa08cad2","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"8fed1d40-1cd6-4e1d-880d-ab804e7ad27d","timestamp":1749178411480,"gateway":"8UUXN4P00A06NK"} + +{"bid":"84b42680-f008-4c86-9c84-22b74c20e794","data":{"dongle_infos":[]},"tid":"28f3405b-b9ba-4fe7-8d3b-6fc7bb80271b","timestamp":1749178411836,"gateway":"8UUXN4P00A06NK"} + +{"bid":"761fb0c7-0267-4bf1-a858-773259e38caa","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ff4db984-807a-4259-9e9b-4dbfd247a465","timestamp":1749178412419,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ae64cdd0-c9ed-4d1c-acb5-0133a7d36114","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"de957af0-3641-4024-97ba-57a29699a958","timestamp":1749178412420,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2572856c-fbd8-4509-a423-e44f976c72ac","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6b843250-7c84-43e5-b23c-249cde7f249b","timestamp":1749178412848,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b04e8e74-57fc-4dcc-8184-11f7aa08cad2","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"8fed1d40-1cd6-4e1d-880d-ab804e7ad27d","timestamp":1749178413611,"gateway":"8UUXN4P00A06NK"} + +{"bid":"16dd5faf-1f62-40a8-8730-1b89f69a1b20","data":{"dongle_infos":[]},"tid":"a5e38df6-3a71-4c7d-85a3-5f37bf06f000","timestamp":1749178414053,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b1f39545-37d7-4d1f-9066-ef3869b3f5dc","bid":"fd5e11cb-b9d8-4f89-b2ee-4589f8936c60","timestamp":1749178441451,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"2f807fcd-c9d3-41ab-9580-3832d65cf218","bid":"10830ac5-dc33-4dcd-9b01-6017fd168ccc","timestamp":1749178441454,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"7923def4-7eb5-4b97-86d9-5d6fab2ef1a3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b59ed2d2-164b-457a-b21a-6952b8e31d60","timestamp":1749178442127,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a64dede5-4bce-4849-980a-365226f4ba44","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"7eb958fb-509b-46c2-8bbb-2ddba5e402bb","timestamp":1749178442744,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8a528c89-c2e3-45a5-8748-68915fbc0cbf","data":{"air_transfer_enable":false},"need_reply":1,"tid":"b2f3f706-01f6-4be5-8786-e3d95237f413","timestamp":1749178442746,"gateway":"8UUXN4P00A06NK"} + +{"bid":"74405754-89b8-429f-a6cd-f24734e45fe5","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5bd804da-20f8-4716-b2d9-31cf26ff220c","timestamp":1749178442757,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b3a7a2cc-8d76-4cbd-85a3-e380bd9442b7","data":{"dongle_infos":[]},"tid":"de167968-542d-4768-b3f3-fa31329fe6cb","timestamp":1749178442769,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2838c304-4970-47f7-9f00-8436b4d252ee","data":{"firmware_version":"13.01.0002"},"tid":"17257078-d81e-4292-bbf6-cbf3bf6e1283","timestamp":1749178442778,"gateway":"8UUXN4P00A06NK"} + +{"tid":"577bb595-0078-4cc5-bea0-f30b1d1d94b0","bid":"7ea411ba-f83a-41b0-849c-7dfd8b695607","timestamp":1749178443254,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"067a8acf-789c-4106-85d8-eaf64a455693","data":{"dongle_infos":[]},"tid":"4007e20f-0137-4dca-a1b4-e4c442abe4d6","timestamp":1749178443811,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7923def4-7eb5-4b97-86d9-5d6fab2ef1a3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b59ed2d2-164b-457a-b21a-6952b8e31d60","timestamp":1749178444313,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a64dede5-4bce-4849-980a-365226f4ba44","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"7eb958fb-509b-46c2-8bbb-2ddba5e402bb","timestamp":1749178444906,"gateway":"8UUXN4P00A06NK"} + +{"bid":"74405754-89b8-429f-a6cd-f24734e45fe5","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5bd804da-20f8-4716-b2d9-31cf26ff220c","timestamp":1749178444907,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8f6f7504-4047-4387-b311-62ea2491363f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4424b1c9-6087-48ef-b6d2-1340dff9d8f6","timestamp":1749178446452,"gateway":"8UUXN4P00A06NK"} + +{"bid":"127e3d97-1cce-42f8-b95f-080961739671","data":{"dongle_infos":[]},"tid":"d568dd4c-28e1-491b-86ff-4dde0a0bb4a1","timestamp":1749178446882,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8a528c89-c2e3-45a5-8748-68915fbc0cbf","data":{"air_transfer_enable":false},"need_reply":1,"tid":"b2f3f706-01f6-4be5-8786-e3d95237f413","timestamp":1749178446952,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a4658e4b-31f7-4a8b-ac66-92a5acff3bef","data":{"departure_trajectory":[]},"tid":"7837e914-535e-4057-9be3-144d28bec764","timestamp":1749178447759,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b8c0fc38-7cb0-4a76-87b3-bd266ba7ecdc","data":{"departure_trajectory":[]},"tid":"5ce098cf-8ab4-45e1-aa57-26f8b5f5b05a","timestamp":1749178448110,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8f6f7504-4047-4387-b311-62ea2491363f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4424b1c9-6087-48ef-b6d2-1340dff9d8f6","timestamp":1749178448505,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a64dede5-4bce-4849-980a-365226f4ba44","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"7eb958fb-509b-46c2-8bbb-2ddba5e402bb","timestamp":1749178449111,"gateway":"8UUXN4P00A06NK"} + +{"bid":"74405754-89b8-429f-a6cd-f24734e45fe5","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5bd804da-20f8-4716-b2d9-31cf26ff220c","timestamp":1749178449113,"gateway":"8UUXN4P00A06NK"} + +{"bid":"82341c1e-25dd-4f8b-8c36-c3da0d6e9b57","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b75ad87a-6cf7-4ea6-891e-66bcb059071f","timestamp":1749178451453,"gateway":"8UUXN4P00A06NK"} + +{"bid":"82341c1e-25dd-4f8b-8c36-c3da0d6e9b57","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b75ad87a-6cf7-4ea6-891e-66bcb059071f","timestamp":1749178453510,"gateway":"8UUXN4P00A06NK"} + +{"tid":"96df7d26-ca6c-4611-ab3c-cb59672652ab","bid":"545617ee-b4eb-44c1-a27f-f432869fea47","timestamp":1749178480183,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"f3d89376-971e-4b69-afcd-19f45d59d963","bid":"b13f34f4-6cc7-406f-94b4-9bd0c255d45f","timestamp":1749178480186,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"5c2a9f10-7610-4917-a9c0-2b7526b8e52c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a791f460-215b-4e5d-a38b-4e04a427d928","timestamp":1749178481547,"gateway":"8UUXN4P00A06NK"} + +{"bid":"54caeafe-cf7b-4580-8fa4-2a81d24366f9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f6d2cc4f-35b3-48d8-be1a-a770751a9697","timestamp":1749178481551,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c5f0f327-76e5-40d8-ac69-6bb4d3603eb1","data":{"air_transfer_enable":false},"need_reply":1,"tid":"29defe4e-3db4-4dd7-bea0-1e82a7939861","timestamp":1749178481937,"gateway":"8UUXN4P00A06NK"} + +{"bid":"363f4c3c-0f35-4cfa-af9f-08e46796f785","data":{"dongle_infos":[]},"tid":"23e71312-19b2-4eb1-84ae-15089c46c59c","timestamp":1749178481943,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e8efafd-f243-431c-9b48-aa74c6aee157","data":{"firmware_version":"13.01.0002"},"tid":"007a9401-8d2a-4581-b954-c7f9ffea634b","timestamp":1749178481958,"gateway":"8UUXN4P00A06NK"} + +{"tid":"80a3de08-37aa-4cb3-946d-50d3ba1bd327","bid":"493c9b53-4893-4606-ab75-13a0f1db0014","timestamp":1749178482076,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"8d5a674b-3c2e-42d6-8357-205c0b8254cb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"66505342-f629-4f8f-84f0-3468efad6daa","timestamp":1749178482676,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ade62239-a15f-4323-b1f3-c95e0b59a2ff","data":{"dongle_infos":[]},"tid":"713e9367-1ef2-4448-a0de-3d0d970ba7de","timestamp":1749178482953,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5c2a9f10-7610-4917-a9c0-2b7526b8e52c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a791f460-215b-4e5d-a38b-4e04a427d928","timestamp":1749178483721,"gateway":"8UUXN4P00A06NK"} + +{"bid":"54caeafe-cf7b-4580-8fa4-2a81d24366f9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f6d2cc4f-35b3-48d8-be1a-a770751a9697","timestamp":1749178483722,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8d5a674b-3c2e-42d6-8357-205c0b8254cb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"66505342-f629-4f8f-84f0-3468efad6daa","timestamp":1749178484721,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c120fd24-00b9-434c-bd5b-03e217cbef5d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f9c9b192-db3c-4007-b7e2-3c6f17bed57d","timestamp":1749178485182,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c5f0f327-76e5-40d8-ac69-6bb4d3603eb1","data":{"air_transfer_enable":false},"need_reply":1,"tid":"29defe4e-3db4-4dd7-bea0-1e82a7939861","timestamp":1749178486141,"gateway":"8UUXN4P00A06NK"} + +{"bid":"817c8176-59b4-4ade-9ffb-c80175492bc2","data":{"departure_trajectory":[]},"tid":"0bdbe69e-eca5-4349-a724-a88980999d0c","timestamp":1749178486831,"gateway":"8UUXN4P00A06NK"} + +{"bid":"99bcb2f3-8872-408a-8eb3-aa9475eeef1e","data":{"departure_trajectory":[]},"tid":"f2ac05a1-ae9d-4fba-ab66-90819643ef6c","timestamp":1749178486938,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cfd3117e-c70b-451e-afda-e1ae90501cf3","data":{"dongle_infos":[]},"tid":"47006ede-cd7f-44db-850c-947132de47a0","timestamp":1749178487060,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c120fd24-00b9-434c-bd5b-03e217cbef5d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f9c9b192-db3c-4007-b7e2-3c6f17bed57d","timestamp":1749178487321,"gateway":"8UUXN4P00A06NK"} + +{"bid":"54caeafe-cf7b-4580-8fa4-2a81d24366f9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f6d2cc4f-35b3-48d8-be1a-a770751a9697","timestamp":1749178487917,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8d5a674b-3c2e-42d6-8357-205c0b8254cb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"66505342-f629-4f8f-84f0-3468efad6daa","timestamp":1749178488917,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2dc3063a-d06e-4feb-b515-9e2d7815aa78","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8dd78c5e-6f7b-4995-a410-d309f1ff3753","timestamp":1749178490182,"gateway":"8UUXN4P00A06NK"} + +{"tid":"2fcc8378-dbbd-4c65-9d7e-a590fc4d9950","bid":"f8216868-2505-404c-9d12-9f2a04c7b748","timestamp":1749178517566,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"80310106-384e-4a1a-afc6-4b8764f15f9c","bid":"0bde9209-cd34-463b-a9d5-09e29e681a1c","timestamp":1749178517569,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"75707847-743d-4044-9d6e-316906e9200e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"44962b2f-bf60-44b0-bbf5-521284262e0b","timestamp":1749178517766,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b255345e-9c9c-468c-ab42-704d01a1752d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"691571e6-5e8f-44ff-8b20-8aa306159e8c","timestamp":1749178519751,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3e90efdf-fc0a-431e-8ad9-ac2ca332ebf1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"517ca979-c58a-4915-a04d-72a9cdbd14cf","timestamp":1749178519759,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c423d925-562a-49a9-86b2-5bdfd9837256","bid":"32d08d8d-dc7a-49a6-b3a1-b461b3e82ea9","timestamp":1749178520110,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"6c625095-a507-4f49-b2db-a36ce3188a19","data":{"dongle_infos":[]},"tid":"cce919aa-6e27-406e-9139-ea3d5bf384f1","timestamp":1749178520201,"gateway":"8UUXN4P00A06NK"} + +{"bid":"62e946e3-4e67-49b3-ade0-91293d1544cb","data":{"firmware_version":"13.01.0002"},"tid":"57d68ec9-117c-4e77-9213-b7db9da6779b","timestamp":1749178520226,"gateway":"8UUXN4P00A06NK"} + +{"bid":"75707847-743d-4044-9d6e-316906e9200e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"44962b2f-bf60-44b0-bbf5-521284262e0b","timestamp":1749178520401,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f240402e-2790-4068-af12-154dd87b882a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c559d228-6441-44f6-a81c-f31c8b916207","timestamp":1749178520818,"gateway":"8UUXN4P00A06NK"} + +{"bid":"660cddd6-8253-49ef-93c4-11b01e27818c","data":{"dongle_infos":[]},"tid":"a2eb69bb-1e30-481a-b191-a9d05d0860cf","timestamp":1749178521218,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b255345e-9c9c-468c-ab42-704d01a1752d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"691571e6-5e8f-44ff-8b20-8aa306159e8c","timestamp":1749178521886,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3e90efdf-fc0a-431e-8ad9-ac2ca332ebf1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"517ca979-c58a-4915-a04d-72a9cdbd14cf","timestamp":1749178521887,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4a4ee7b4-9ee3-4626-a5a3-31b9fd5b44fe","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"18e51bd0-2d45-425b-94dd-80dbef250fa6","timestamp":1749178522573,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f240402e-2790-4068-af12-154dd87b882a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c559d228-6441-44f6-a81c-f31c8b916207","timestamp":1749178522884,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7bde8739-591d-4c1e-ba32-d9154a752828","data":{"dongle_infos":[]},"tid":"26eab3df-3ed6-400a-9c09-6fb8a265d11a","timestamp":1749178524369,"gateway":"8UUXN4P00A06NK"} + +{"tid":"7dee0cfa-047f-414e-89a3-0d76ddd162f4","bid":"21672c5e-6e7b-4b84-9d51-2d4dc496ed77","timestamp":1749178547664,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"ee4506bb-8f4f-4179-b09f-d5e8978fd1df","bid":"ab2565e7-df43-4b06-a242-bc984d7fed35","timestamp":1749178547673,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"7023914e-e8bc-47f0-b0fc-f862ab94681e","bid":"1863fcde-87ed-4e65-a172-d00230375c83","timestamp":1749178547884,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"df057c34-e897-489d-b865-540f53efa18a","bid":"d887118e-0025-47d3-85e6-ae50d8f72dc9","timestamp":1749178547898,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"aa248dd4-0172-470e-8303-495b51c57811","data":{"air_transfer_enable":false},"need_reply":1,"tid":"c5e5fe1f-7751-48c0-be5f-62b899970ad9","timestamp":1749178549864,"gateway":"8UUXN4P00A06NK"} + +{"bid":"469f21b4-6f47-4c9e-ac1c-556ab93f19dc","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c0ee7f32-b48d-4f58-a210-5cfc86e146fa","timestamp":1749178552443,"gateway":"8UUXN4P00A06NK"} + +{"bid":"666d0543-e5ee-4370-9e59-24b198064227","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f4628d0e-5738-495a-b56f-388a871cd1c6","timestamp":1749178552463,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9fba695a-9625-4520-908b-cbdf2db61d9f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"6c488b03-fd27-4395-9e92-90332e171ffb","timestamp":1749178552468,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fe7b579c-450c-4994-96a1-a2481d5636e3","data":{"dongle_infos":[]},"tid":"d16add41-ce63-411e-9987-8d722e5f1c04","timestamp":1749178552554,"gateway":"8UUXN4P00A06NK"} + +{"bid":"78dd98fb-4bf9-4593-88a9-ed46928de30f","data":{"firmware_version":"13.01.0002"},"tid":"67041881-c79a-4ec2-96cb-c80e0a105b3c","timestamp":1749178552561,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2ec39b25-ac2d-4163-9069-8ebb61620243","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"240d7c76-6fc5-40fc-9afb-71c9fe47a3fa","timestamp":1749178552672,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aa248dd4-0172-470e-8303-495b51c57811","data":{"air_transfer_enable":false},"need_reply":1,"tid":"c5e5fe1f-7751-48c0-be5f-62b899970ad9","timestamp":1749178552743,"gateway":"8UUXN4P00A06NK"} + +{"bid":"846b864a-fe4d-47da-a41e-91747a6c9e65","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"659de837-8ca1-4246-b65d-9b8009a74828","timestamp":1749178552882,"gateway":"8UUXN4P00A06NK"} + +{"tid":"0ae52c09-193a-4dd6-a915-d9c3a8369a02","bid":"9df45b54-064b-4a11-9f8e-c2b48d99cfef","timestamp":1749178552900,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"add1d0b9-a30f-4c72-a6c4-d812d8b6b18a","data":{"dongle_infos":[]},"tid":"ad7dc00e-2abb-4b50-9a05-1010e1f16b61","timestamp":1749178553567,"gateway":"8UUXN4P00A06NK"} + +{"tid":"e84301ee-b752-4e4b-a866-b9ed4f4a5740","bid":"5eef0608-1aad-443d-a7cf-502668a35207","timestamp":1749178579321,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"6382ba94-3503-43d6-940a-688d3d1cbadb","bid":"0ec3f954-f019-4c35-a6a7-5fcd588c4bf7","timestamp":1749178579323,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"b8bd9e82-5d61-4a88-b252-e9d323742e0e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d7592536-a511-4577-bbcc-9cbb03848193","timestamp":1749178580930,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9f792dca-5428-4abc-829c-d8b59de8e48c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"07754180-07d8-4284-8afd-dd00ffa2ede8","timestamp":1749178582907,"gateway":"8UUXN4P00A06NK"} + +{"bid":"63e916d7-a441-4128-a54a-d6d6ed55377b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5742772d-4adf-4138-add9-9dbb1984f7f0","timestamp":1749178583184,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ba1d7239-8279-4351-9bec-99780f8f7e94","data":{"dongle_infos":[]},"tid":"db218e25-7f11-47f4-b614-231de32bb084","timestamp":1749178583363,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d4b6e7b8-b96d-4417-87b8-556e817c2f7e","data":{"firmware_version":"13.01.0002"},"tid":"2b109d9d-a98e-42e5-bf08-f2c7406d389c","timestamp":1749178583370,"gateway":"8UUXN4P00A06NK"} + +{"tid":"fea20691-0df3-4577-b902-fd69fcd186bb","bid":"cb58f73a-fdb8-4b05-80ca-abf75421ccbe","timestamp":1749178583507,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"b8bd9e82-5d61-4a88-b252-e9d323742e0e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d7592536-a511-4577-bbcc-9cbb03848193","timestamp":1749178583558,"gateway":"8UUXN4P00A06NK"} + +{"bid":"96232f70-64f5-41c5-ad1b-8b6b19cfcce3","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3b60b250-d620-4aca-b1c3-db54501b0673","timestamp":1749178584049,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e6e32ae8-9e7e-46c0-9c64-e68a38c89240","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"88c4cdd5-d4d9-4c55-868c-aa545095c08d","timestamp":1749178584326,"gateway":"8UUXN4P00A06NK"} + +{"bid":"038e9026-3d58-459b-adf2-c41bc3381c74","data":{"dongle_infos":[]},"tid":"0922de63-a537-497d-8c30-7bc27d1df04c","timestamp":1749178584440,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9f792dca-5428-4abc-829c-d8b59de8e48c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"07754180-07d8-4284-8afd-dd00ffa2ede8","timestamp":1749178584963,"gateway":"8UUXN4P00A06NK"} + +{"bid":"96232f70-64f5-41c5-ad1b-8b6b19cfcce3","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3b60b250-d620-4aca-b1c3-db54501b0673","timestamp":1749178586163,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b8edcb1b-1860-4390-8764-8c00deb0eb3c","bid":"6098984e-2614-4913-8655-536bfa02a6a0","timestamp":1749178609468,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"66853dd7-42e6-4479-855d-1a1178143678","bid":"f9aa4b9e-60a5-4933-b593-2c96a8f8dbc6","timestamp":1749178609470,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"8f4f461f-f3b0-4f63-977c-528dba356ad7","bid":"9bb2a788-c0e3-4289-b956-a3209a97da1a","timestamp":1749178609796,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"2dcb8fb7-d2a0-4306-baae-4bcea3a877a2","bid":"acff3654-f582-4e36-9905-20da9421a5ca","timestamp":1749178609808,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"a8ba6615-333f-4826-b060-52e560df4130","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2c086a66-2d47-42e2-a7d1-db9052494af4","timestamp":1749178611218,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2887b73c-66c6-472a-8d8b-39873082947e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f2b641e9-09cf-4a75-8279-8e8a89fc3d0f","timestamp":1749178613283,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5e9a8b9c-20d1-4dd3-9b1d-18180d3d90c3","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5e0f14be-9299-43cd-bcd2-f8ba7d3ea1d7","timestamp":1749178613492,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a8ba6615-333f-4826-b060-52e560df4130","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2c086a66-2d47-42e2-a7d1-db9052494af4","timestamp":1749178613766,"gateway":"8UUXN4P00A06NK"} + +{"bid":"32f7e21b-4d0f-4ee3-a935-a6dcb8aa817e","data":{"dongle_infos":[]},"tid":"e61e2379-2ec4-42f7-a1d6-18db94dfbe25","timestamp":1749178613769,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ab2b3757-c5dd-4cfe-9f75-6a5950f8d6c9","data":{"firmware_version":"13.01.0002"},"tid":"c575ce03-6cfd-4788-b166-ecae1ef7c90e","timestamp":1749178613813,"gateway":"8UUXN4P00A06NK"} + +{"tid":"00d08bcb-6c94-40d6-babd-2e04d399d0e1","bid":"7925ed8c-7518-4717-9e84-1343a79c4d3b","timestamp":1749178614321,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"4f560998-bd6d-4ab8-a444-acfb2d57deb7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"fc40df98-dfb6-40a7-8cf8-ec667b2c1739","timestamp":1749178614463,"gateway":"8UUXN4P00A06NK"} + +{"bid":"162eb502-5582-44ea-99e9-b6be30257a6e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"7c469aff-fda3-45e8-b701-120aa613fca4","timestamp":1749178614608,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1835b0c4-c31c-4526-bffc-9a397530474c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e4d81dce-ccf9-4de8-9373-341a847342fa","timestamp":1749178614800,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e6deeb78-8b33-4a50-aaa4-6019cd234674","data":{"dongle_infos":[]},"tid":"4e58283a-fad1-4d96-bcce-48bf4e128adc","timestamp":1749178614815,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5e9a8b9c-20d1-4dd3-9b1d-18180d3d90c3","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5e0f14be-9299-43cd-bcd2-f8ba7d3ea1d7","timestamp":1749178615581,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ea6fdc8f-708e-4ebe-a21e-c8bfa5c8b047","bid":"3213d1c5-6988-4d78-924d-ce2a42fe212e","timestamp":1749178643334,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"78374c81-e008-4322-9eba-ca1b99ab14e8","bid":"2d4f577f-066c-4e08-b6a3-a4e6b3fee34c","timestamp":1749178643337,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"d78f9c20-58cc-4360-9a8b-b372d310c4cd","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8e3a5e3c-2378-478d-a812-73c8e44a8cff","timestamp":1749178645200,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9830ad03-5eb7-4651-93d6-dce016629802","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1b0d661c-c12c-46f8-8966-a0925956f926","timestamp":1749178645318,"gateway":"8UUXN4P00A06NK"} + +{"bid":"599e8a3b-a81d-4e55-ac57-e210a8f1fe7d","data":{"dongle_infos":[]},"tid":"289624f2-62e2-4a94-96bc-f412586de3d8","timestamp":1749178645659,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0e54bb4f-a511-4b6c-ad55-c6db065d2380","data":{"firmware_version":"13.01.0002"},"tid":"b227892b-feee-4217-ba45-14cae8ec1aef","timestamp":1749178645676,"gateway":"8UUXN4P00A06NK"} + +{"tid":"5c56fc44-099d-4480-9044-29d356cf4c65","bid":"19cc1d7b-2eb5-4efb-9da0-43a19f562249","timestamp":1749178645821,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"82dabf76-873f-4f84-bce1-b08d0192660a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"b56a8a5f-a0a9-48d1-8efb-42a7609368f2","timestamp":1749178645855,"gateway":"8UUXN4P00A06NK"} + +{"bid":"32966a94-f543-4975-9317-d6f5651befe7","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"cab68eb8-1cf5-475d-9bc3-1307d021d20a","timestamp":1749178646436,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5f21e529-415a-4032-bc8f-14aaf7507a0d","data":{"dongle_infos":[]},"tid":"1b4cef7d-7b9a-480e-9350-99aa947d5124","timestamp":1749178646669,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d78f9c20-58cc-4360-9a8b-b372d310c4cd","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8e3a5e3c-2378-478d-a812-73c8e44a8cff","timestamp":1749178647348,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9830ad03-5eb7-4651-93d6-dce016629802","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1b0d661c-c12c-46f8-8966-a0925956f926","timestamp":1749178647349,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5ad21007-8436-4ef6-b7a2-8fd176f5b05f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"189f0c6f-8105-45a6-9d46-83718b758369","timestamp":1749178648338,"gateway":"8UUXN4P00A06NK"} + +{"bid":"32966a94-f543-4975-9317-d6f5651befe7","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"cab68eb8-1cf5-475d-9bc3-1307d021d20a","timestamp":1749178648543,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b96fd59f-06ad-4d7b-9daf-591a53cdc791","data":{"dongle_infos":[]},"tid":"240982f7-175e-41a6-b887-d529e63bcd65","timestamp":1749178648788,"gateway":"8UUXN4P00A06NK"} + +{"bid":"82dabf76-873f-4f84-bce1-b08d0192660a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"b56a8a5f-a0a9-48d1-8efb-42a7609368f2","timestamp":1749178650060,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2ff3116f-58a7-41e1-80e2-710b5c61b9f7","data":{"departure_trajectory":[]},"tid":"ac7e7d5a-f93b-4cc1-b167-c7b33b473d88","timestamp":1749178650067,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5ad21007-8436-4ef6-b7a2-8fd176f5b05f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"189f0c6f-8105-45a6-9d46-83718b758369","timestamp":1749178650347,"gateway":"8UUXN4P00A06NK"} + +{"bid":"58859717-cee4-45d5-ac03-13b81be1e989","data":{"departure_trajectory":[]},"tid":"5347db0f-555f-46ce-aa07-e525856bb630","timestamp":1749178650796,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9830ad03-5eb7-4651-93d6-dce016629802","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1b0d661c-c12c-46f8-8966-a0925956f926","timestamp":1749178651546,"gateway":"8UUXN4P00A06NK"} + +{"bid":"32966a94-f543-4975-9317-d6f5651befe7","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"cab68eb8-1cf5-475d-9bc3-1307d021d20a","timestamp":1749178652746,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c268ddf3-36b7-438c-b4d8-795b5672d82d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7e772433-4846-47c1-acf8-8eab7bb048a0","timestamp":1749178653344,"gateway":"8UUXN4P00A06NK"} + +{"tid":"02247f98-a7de-4640-a401-58e92b831fff","bid":"340d69e2-a277-4fb7-8505-01b435047ef2","timestamp":1749178680693,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"5487eaf2-d138-4fc1-bcdf-d9824e9967b1","bid":"baff7ab2-a2dc-404f-8fd9-0cfe18e8fe51","timestamp":1749178680697,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"a222f465-e9f6-4c89-9b69-b7f73af91c81","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d5fc632d-45cc-43be-a892-0b54bb1d259a","timestamp":1749178682402,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4cccc85c-9e0f-4b15-bc9b-fa2715f903fc","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"70c11863-cdb5-48ad-a3d4-e6f0f34f60e5","timestamp":1749178682423,"gateway":"8UUXN4P00A06NK"} + +{"bid":"243af4dd-22a2-4fef-bff6-db829b0902bf","data":{"dongle_infos":[]},"tid":"4eb72305-0209-45ad-952c-2fb403b01165","timestamp":1749178682766,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1a57884e-4dac-47dd-8ab7-274b89b7f06d","data":{"dongle_infos":[]},"tid":"3d5a07c0-ef87-4785-913f-860e7386d397","timestamp":1749178682768,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b453f071-da12-4433-8fb6-62f65b59eae0","data":{"firmware_version":"13.01.0002"},"tid":"d955bea7-eb0c-4282-a5bb-7efac6809330","timestamp":1749178682773,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2234096b-9bee-49bc-9648-7fddc2cbb75a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"29b644c0-04e6-47b9-a302-75f343bbf56f","timestamp":1749178682961,"gateway":"8UUXN4P00A06NK"} + +{"tid":"aae5b066-554e-404b-9201-6b0ea0ae160a","bid":"cb0ee100-f163-4632-b255-20b53116fc4a","timestamp":1749178683177,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"23825061-306b-495a-adab-34bf787d49e0","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"83c0c8e0-4bb9-4815-88f0-44c6e181b9d2","timestamp":1749178683535,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a0a7e67d-f2e9-4a12-88c3-9e2eabdf56cb","data":{"dongle_infos":[]},"tid":"38c3a1c6-fd03-4476-b64a-b7337e54fa1e","timestamp":1749178683799,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a222f465-e9f6-4c89-9b69-b7f73af91c81","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d5fc632d-45cc-43be-a892-0b54bb1d259a","timestamp":1749178684423,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4cccc85c-9e0f-4b15-bc9b-fa2715f903fc","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"70c11863-cdb5-48ad-a3d4-e6f0f34f60e5","timestamp":1749178684424,"gateway":"8UUXN4P00A06NK"} + +{"bid":"23825061-306b-495a-adab-34bf787d49e0","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"83c0c8e0-4bb9-4815-88f0-44c6e181b9d2","timestamp":1749178685624,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7a9f0522-bf0e-4970-a7b5-e8b1daeb0fb3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d7e66cce-a6cd-4a84-ae16-9e5690b1337d","timestamp":1749178685700,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2234096b-9bee-49bc-9648-7fddc2cbb75a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"29b644c0-04e6-47b9-a302-75f343bbf56f","timestamp":1749178687157,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ef731269-c026-4247-9bfd-463d1216a097","data":{"departure_trajectory":[]},"tid":"9d7ddade-d25b-425e-9d9a-838dce7135a6","timestamp":1749178687297,"gateway":"8UUXN4P00A06NK"} + +{"tid":"2bc0134f-297f-4fe2-b6af-ca59d2169bc3","bid":"28a34afc-9570-4557-a610-6d35fc410df8","timestamp":1749178712178,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"0d711bc8-dce8-47af-a78f-ee93a1d6f423","bid":"f4900812-11f0-44c5-8459-bed272593b36","timestamp":1749178712181,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f525c59b-c279-4e4f-a62b-3c1b21bad086","data":{"air_transfer_enable":false},"need_reply":1,"tid":"96c42291-f64e-4554-be7f-58ad48d4279b","timestamp":1749178712805,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1fb522e2-1980-4851-bb10-26da7ba1234c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c2647c68-c737-4d55-8b5d-7c1d3487f51d","timestamp":1749178715377,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c9375f2f-57f6-4948-885e-f9dd8f5fb753","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1f73aced-9768-4b6a-9aed-268e626c71ad","timestamp":1749178715397,"gateway":"8UUXN4P00A06NK"} + +{"bid":"264556f5-5756-4b8c-ba9c-1e06749c7104","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5e702ddf-97b8-4057-93fc-ab2a40ea2b23","timestamp":1749178715405,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dd942b0d-68e3-44a4-a5bb-849fa3aca65e","data":{"dongle_infos":[]},"tid":"8a351550-6a2d-454f-a28f-c3025e337c2d","timestamp":1749178715518,"gateway":"8UUXN4P00A06NK"} + +{"bid":"34dc49bb-eaf8-44a7-8e79-6d6155de8058","data":{"firmware_version":"13.01.0002"},"tid":"7750e831-2964-425d-9551-24a0995b30f4","timestamp":1749178715533,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f525c59b-c279-4e4f-a62b-3c1b21bad086","data":{"air_transfer_enable":false},"need_reply":1,"tid":"96c42291-f64e-4554-be7f-58ad48d4279b","timestamp":1749178715715,"gateway":"8UUXN4P00A06NK"} + +{"tid":"99be266a-accd-4d09-acae-8633433df9cb","bid":"844a26a3-e823-4274-9cca-deb4e12236aa","timestamp":1749178716129,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"54a6a134-5bc9-44f6-8abc-7e06bc6446c2","data":{"dongle_infos":[]},"tid":"2957562a-352f-4b56-b29f-8114ef9d53c0","timestamp":1749178716535,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9db15286-2cf9-4096-8853-0e323dc216bd","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a72eaacb-5007-46f6-ac7f-1cc54d758772","timestamp":1749178717177,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1fb522e2-1980-4851-bb10-26da7ba1234c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c2647c68-c737-4d55-8b5d-7c1d3487f51d","timestamp":1749178717491,"gateway":"8UUXN4P00A06NK"} + +{"bid":"264556f5-5756-4b8c-ba9c-1e06749c7104","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5e702ddf-97b8-4057-93fc-ab2a40ea2b23","timestamp":1749178717492,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df36a55b-e34b-4280-8550-15f2c7cc2857","data":{"dongle_infos":[]},"tid":"ece0f66a-742b-47c6-a2ba-7eadc9cd0bcd","timestamp":1749178718636,"gateway":"8UUXN4P00A06NK"} + +{"tid":"4c7acd6d-46df-4501-b550-37dbd573e2f9","bid":"a809598f-939d-4388-9573-efdd06f5ad91","timestamp":1749178744724,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"70a90c54-0004-4d0f-b777-9e46f1b8092e","bid":"683b4d8b-e76a-4bef-8e1b-abda76038a6e","timestamp":1749178744726,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"40a8d749-944d-4115-a661-10e31c0c837e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2dbdca27-6a56-4b88-b1e0-ff245f874588","timestamp":1749178746291,"gateway":"8UUXN4P00A06NK"} + +{"bid":"943b37b9-a261-40af-838f-afd3fe8bca7e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"60353564-c727-4e78-9dad-b2f5c52e46f1","timestamp":1749178748192,"gateway":"8UUXN4P00A06NK"} + +{"tid":"a57fc43a-b3dc-4cfc-ac11-e4be22d0ef9b","bid":"f5304c17-cc10-4af2-a203-f216cebc216b","timestamp":1749178748621,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"40a8d749-944d-4115-a661-10e31c0c837e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2dbdca27-6a56-4b88-b1e0-ff245f874588","timestamp":1749178748870,"gateway":"8UUXN4P00A06NK"} + +{"bid":"55d4d0f3-5b29-485b-939f-f78e71b54e86","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"da49fd5b-b328-4b4d-88ab-16bd5d6220b9","timestamp":1749178749060,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e469cfde-e551-4765-9594-c90cb347e64a","data":{"dongle_infos":[]},"tid":"8429a148-7cad-44a3-b5ec-22764259bf21","timestamp":1749178749074,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e9d0aa80-cc75-47fe-9ee3-5876c96d3aee","data":{"mobility_status_notify":0},"need_reply":1,"tid":"61b2d640-1fe9-44a8-992d-6f68678d5e54","timestamp":1749178749083,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5a836c6c-6364-48e1-8fab-29e6cff712af","data":{"firmware_version":"13.01.0002"},"tid":"0c98854c-80b4-40af-8f2a-cc64cff91734","timestamp":1749178749116,"gateway":"8UUXN4P00A06NK"} + +{"bid":"60a97127-cc6d-491a-bccb-c8096e27f2d8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"63c6a6b6-4422-4681-b915-4fd3ae2dd6e4","timestamp":1749178749737,"gateway":"8UUXN4P00A06NK"} + +{"bid":"581c6e16-ee11-4881-b3fc-9f18419de6df","data":{"dongle_infos":[]},"tid":"352e4a45-6b56-432a-a71e-273f73eb6b1b","timestamp":1749178750086,"gateway":"8UUXN4P00A06NK"} + +{"bid":"55d4d0f3-5b29-485b-939f-f78e71b54e86","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"da49fd5b-b328-4b4d-88ab-16bd5d6220b9","timestamp":1749178751203,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e9d0aa80-cc75-47fe-9ee3-5876c96d3aee","data":{"mobility_status_notify":0},"need_reply":1,"tid":"61b2d640-1fe9-44a8-992d-6f68678d5e54","timestamp":1749178751204,"gateway":"8UUXN4P00A06NK"} + +{"tid":"bf2527fe-96e1-473c-a7ac-0beefdcc9181","bid":"bc621454-a3e4-46c8-868f-e353568690fb","timestamp":1749178775657,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"d1e1508b-36a7-41a6-8e91-9ec3ee9fde47","bid":"f805debc-0449-4a5a-b93d-4bf7f0b3164a","timestamp":1749178775674,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"5d4fc2b1-9d39-4213-93d6-f6f5adc8dc9d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"64e2e1da-eb34-4768-91dc-da7534e769de","timestamp":1749178777162,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3ce95512-feb4-4d1d-ae8a-1ad8eb46a7ae","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d2a68485-0400-4bdd-ab14-bdd20d53cb55","timestamp":1749178779218,"gateway":"8UUXN4P00A06NK"} + +{"bid":"27a97255-53a6-4815-a95b-fc34cfc81aab","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"26d31043-98c3-42c0-bfb9-aaaa3fe7a042","timestamp":1749178779243,"gateway":"8UUXN4P00A06NK"} + +{"bid":"04870658-1237-4f30-bce0-74ebc4e932ab","data":{"dongle_infos":[]},"tid":"c8175390-1a3f-4135-bf62-0cb83bde54ce","timestamp":1749178779606,"gateway":"8UUXN4P00A06NK"} + +{"bid":"44be2f22-ea16-4b6c-b4e9-ac6de6e4540d","data":{"firmware_version":"13.01.0002"},"tid":"48ad7997-65c9-4b59-b91a-d0999c9e12da","timestamp":1749178779619,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5d4fc2b1-9d39-4213-93d6-f6f5adc8dc9d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"64e2e1da-eb34-4768-91dc-da7534e769de","timestamp":1749178779804,"gateway":"8UUXN4P00A06NK"} + +{"bid":"652ad5e4-fb8b-4e1a-87a8-64836f3c9818","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"bb2ee5f4-bd34-4d02-bfa1-d78f86c1e315","timestamp":1749178780372,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c59e311c-612c-4bb5-ba37-1d319743672e","data":{"dongle_infos":[]},"tid":"0a926404-9478-431a-a48b-0d96d4beeeda","timestamp":1749178780644,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3a0e8af8-70a3-4e43-903d-57bf4935f907","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"198628e6-21d1-4220-adef-68b29c298120","timestamp":1749178780658,"gateway":"8UUXN4P00A06NK"} + +{"tid":"24a80ee1-7191-4c23-97d0-a0ff55cf9b38","bid":"cded3ac1-2cdc-4bc8-811f-fe23545b56e1","timestamp":1749178780868,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"3ce95512-feb4-4d1d-ae8a-1ad8eb46a7ae","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d2a68485-0400-4bdd-ab14-bdd20d53cb55","timestamp":1749178781309,"gateway":"8UUXN4P00A06NK"} + +{"bid":"652ad5e4-fb8b-4e1a-87a8-64836f3c9818","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"bb2ee5f4-bd34-4d02-bfa1-d78f86c1e315","timestamp":1749178782510,"gateway":"8UUXN4P00A06NK"} + +{"tid":"fd85176c-9473-46e6-a1bc-c48fff6868be","bid":"137045c5-d7ff-4c6f-8efc-91fe131a1a91","timestamp":1749178808490,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"74e9a5a2-3847-4600-b7dc-4bcdb8d29510","bid":"06235db3-b556-4e87-a77e-1f37aa672558","timestamp":1749178808492,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"275a5a95-3183-4bc1-880e-d3d140c46aae","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6429895d-88fa-4f98-9c60-90795e5ea27e","timestamp":1749178809660,"gateway":"8UUXN4P00A06NK"} + +{"bid":"996898bf-181c-4869-bfc2-12a2fab40a0b","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"094adce4-d840-42a6-acf3-a4965ed68aa5","timestamp":1749178810330,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0e4deb0b-a867-4fa9-8f9b-8e5b98a7205f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"65b55a67-992e-4139-936c-2a71a75740d4","timestamp":1749178810342,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c947cb34-b20e-4e0d-a6e6-e2eaffb18d6a","data":{"dongle_infos":[]},"tid":"00d23065-e9c2-4e29-ba74-bddfd210a136","timestamp":1749178810349,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a486f072-1a22-4e44-9894-1fa3a1479669","data":{"firmware_version":"13.01.0002"},"tid":"4e779869-c1b7-4665-822a-46e541b837db","timestamp":1749178810360,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9bb21a3a-90d3-4398-ae59-245805c723ac","data":{"air_transfer_enable":false},"need_reply":1,"tid":"0413b320-02ca-4d5d-84ab-4364a7d236f6","timestamp":1749178810420,"gateway":"8UUXN4P00A06NK"} + +{"tid":"502792f1-9570-4f65-8f55-b42aa460b8a8","bid":"8d9153ab-95c2-4f17-a442-5708c3f9c865","timestamp":1749178810815,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"bd899393-90ef-4afe-a018-aa88fa4141e7","data":{"dongle_infos":[]},"tid":"8c1a3cd3-451f-4a73-811c-7c723a31cb8b","timestamp":1749178811344,"gateway":"8UUXN4P00A06NK"} + +{"bid":"275a5a95-3183-4bc1-880e-d3d140c46aae","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6429895d-88fa-4f98-9c60-90795e5ea27e","timestamp":1749178811662,"gateway":"8UUXN4P00A06NK"} + +{"bid":"996898bf-181c-4869-bfc2-12a2fab40a0b","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"094adce4-d840-42a6-acf3-a4965ed68aa5","timestamp":1749178812461,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0e4deb0b-a867-4fa9-8f9b-8e5b98a7205f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"65b55a67-992e-4139-936c-2a71a75740d4","timestamp":1749178812463,"gateway":"8UUXN4P00A06NK"} + +{"bid":"598a15ed-768e-48c9-bbb7-84b87faf1586","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5085a019-61f3-43fc-970b-3cdddfa45daf","timestamp":1749178813495,"gateway":"8UUXN4P00A06NK"} + +{"bid":"62a4d336-d764-4c56-b84c-6866efd30661","data":{"dongle_infos":[]},"tid":"ed7d3bbf-060e-40b4-88a1-81099f54a9b0","timestamp":1749178813596,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9bb21a3a-90d3-4398-ae59-245805c723ac","data":{"air_transfer_enable":false},"need_reply":1,"tid":"0413b320-02ca-4d5d-84ab-4364a7d236f6","timestamp":1749178814616,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e9f4c8d-a4ad-450d-a6af-9862684e8d1c","data":{"departure_trajectory":[]},"tid":"5f017b29-999a-45bb-9e31-47a54ab820bb","timestamp":1749178815144,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7256cc09-876a-49db-ac0a-9979869cbfce","data":{"departure_trajectory":[]},"tid":"3e465ca9-7cb2-44e4-9fd4-b58692df9865","timestamp":1749178815338,"gateway":"8UUXN4P00A06NK"} + +{"bid":"598a15ed-768e-48c9-bbb7-84b87faf1586","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5085a019-61f3-43fc-970b-3cdddfa45daf","timestamp":1749178815663,"gateway":"8UUXN4P00A06NK"} + +{"bid":"996898bf-181c-4869-bfc2-12a2fab40a0b","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"094adce4-d840-42a6-acf3-a4965ed68aa5","timestamp":1749178816663,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0e4deb0b-a867-4fa9-8f9b-8e5b98a7205f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"65b55a67-992e-4139-936c-2a71a75740d4","timestamp":1749178816664,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e4afccec-4876-4b7f-bfaa-8f291c1f879d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a28e2698-5fc7-4add-97b6-51e837ca3203","timestamp":1749178818495,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c056050e-1350-4dfd-9084-19267ce4a1a5","bid":"5c37dad6-2799-4c20-88c2-fdd6bf59da6f","timestamp":1749178845947,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"c10d0749-7865-466a-8169-417734cd85d8","bid":"c789b304-f4d9-4adf-b645-f5521633526d","timestamp":1749178845958,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"9ba786d0-b035-4f80-89c4-babef2495118","data":{"air_transfer_enable":false},"need_reply":1,"tid":"12b44686-0378-4243-b779-1c03873c0300","timestamp":1749178846605,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0bdc55d7-d993-440c-b4f7-d204278f72c7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"94570525-3bad-4926-bc4e-1d94e5cd0300","timestamp":1749178848888,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9ba786d0-b035-4f80-89c4-babef2495118","data":{"air_transfer_enable":false},"need_reply":1,"tid":"12b44686-0378-4243-b779-1c03873c0300","timestamp":1749178849193,"gateway":"8UUXN4P00A06NK"} + +{"tid":"f8c0c7c1-fd15-4ad6-bd0d-3748f6cd698d","bid":"e92a781a-01a7-4ce0-a2eb-a1c75268ef4e","timestamp":1749178849450,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"42296792-1dae-4ec4-9635-e4126f47f2a1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ddf54e25-61d4-4c22-abf2-b197268b52c2","timestamp":1749178849565,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7d95d007-cb87-4dfe-aac2-c2bfd4c2d987","data":{"dongle_infos":[]},"tid":"adb4d1bc-14ab-4f1a-9294-fca177885062","timestamp":1749178849578,"gateway":"8UUXN4P00A06NK"} + +{"bid":"00fc4076-8c74-40d8-85aa-feaec1c07b68","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d0a5caad-9843-473b-9107-594b9aeca6cd","timestamp":1749178849586,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d06551cf-e659-468b-b01e-79d6ff127db2","data":{"firmware_version":"13.01.0002"},"tid":"cc11a044-e5a8-4ccb-9363-8238b5d6a209","timestamp":1749178849602,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5ca3d506-298e-4a76-b421-938550784a9e","data":{"dongle_infos":[]},"tid":"4fff396f-98a7-45d1-b759-71a89e08713e","timestamp":1749178850576,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7075f7e7-d7b5-42db-b1ae-fa51a0745094","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4216d373-544c-4af0-a639-2214ea9bc117","timestamp":1749178850941,"gateway":"8UUXN4P00A06NK"} + +{"bid":"42296792-1dae-4ec4-9635-e4126f47f2a1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ddf54e25-61d4-4c22-abf2-b197268b52c2","timestamp":1749178851690,"gateway":"8UUXN4P00A06NK"} + +{"bid":"00fc4076-8c74-40d8-85aa-feaec1c07b68","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d0a5caad-9843-473b-9107-594b9aeca6cd","timestamp":1749178851691,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d86f321b-964b-4c49-823d-9c8cf0842eb2","bid":"52e3b283-6988-4844-b63a-7f32d0558497","timestamp":1749178876716,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"12cc71c4-a4cd-42b6-89c3-06e3150a6c45","bid":"6cf962bc-28d3-4473-a3d0-f08e3e5bc7f8","timestamp":1749178876728,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"567b3209-c044-42a6-bd8a-4642b0f09bd0","data":{"air_transfer_enable":false},"need_reply":1,"tid":"9c326475-497f-451c-b739-bedd6764da9c","timestamp":1749178878823,"gateway":"8UUXN4P00A06NK"} + +{"bid":"faa8b5c3-bca0-4402-938f-1b6916e48622","data":{"mobility_status_notify":0},"need_reply":1,"tid":"afcd33a6-5f28-4fad-bb51-54eedec0bf95","timestamp":1749178880825,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dffbdb37-35b0-4637-9629-20bf4b05b30f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c1d08df5-144f-43f4-a911-fd2b516cd06e","timestamp":1749178880856,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ea7dea1c-5683-491b-b383-4848301d8d32","data":{"dongle_infos":[]},"tid":"06fa573a-bd16-4249-a78b-74fddd5c6c5e","timestamp":1749178881162,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4a0c4d16-d2ae-46f9-b154-a736c8d60f87","data":{"firmware_version":"13.01.0002"},"tid":"1c94eae3-6985-4f24-9530-52db99513245","timestamp":1749178881171,"gateway":"8UUXN4P00A06NK"} + +{"tid":"9d8b7a11-1a70-4ac1-a19f-0fbe9e25ab0d","bid":"f33724cc-4971-4ea7-8539-f0f353ffd012","timestamp":1749178881346,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"567b3209-c044-42a6-bd8a-4642b0f09bd0","data":{"air_transfer_enable":false},"need_reply":1,"tid":"9c326475-497f-451c-b739-bedd6764da9c","timestamp":1749178881357,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5b9d3fc1-351f-4273-8a19-1f5f53e31637","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"29d71162-0016-4df7-8b54-bb27c1af90cc","timestamp":1749178881721,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4c9553c5-3695-4448-9796-dcac6c4bc4a2","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"731d565e-b541-4371-9aba-9a703b0b29d0","timestamp":1749178881969,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6b1746b4-0b97-48c1-a4d9-acbe300cf0c6","data":{"dongle_infos":[]},"tid":"c7a5dfc6-52d0-4a8c-ae0d-19e09817550d","timestamp":1749178882183,"gateway":"8UUXN4P00A06NK"} + +{"bid":"faa8b5c3-bca0-4402-938f-1b6916e48622","data":{"mobility_status_notify":0},"need_reply":1,"tid":"afcd33a6-5f28-4fad-bb51-54eedec0bf95","timestamp":1749178882987,"gateway":"8UUXN4P00A06NK"} + +{"tid":"653acc78-47bd-4c0f-81b9-b7e4787a4412","bid":"fdc5646c-4328-46ba-8aa4-2b792a98b9a8","timestamp":1749178908372,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"38a14d7d-3414-4f7c-9557-c948ac80fa4c","bid":"ee172e87-24e0-46fe-ae55-6e0847f6ebc1","timestamp":1749178908375,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"96b71033-2722-4a69-a50b-8b2efe30e9f5","data":{"air_transfer_enable":false},"need_reply":1,"tid":"dc2c0cec-7cd6-49e4-9d09-beff11c24e79","timestamp":1749178909674,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5df743f0-6716-42db-9f1c-91b80aced908","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d82a9ba6-8847-4a3c-95fe-45beb705e11b","timestamp":1749178911579,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a7f138b6-386d-4ea5-8aba-8e95cd12ce9a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"78d60990-418c-4274-8a46-c41499fd80e5","timestamp":1749178911582,"gateway":"8UUXN4P00A06NK"} + +{"bid":"59680d26-626c-4f54-b973-3815e373c759","data":{"dongle_infos":[]},"tid":"24bcb80c-1874-4374-a626-6161768bd43e","timestamp":1749178912035,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e32fad06-05de-4504-b763-fcb391427a21","data":{"firmware_version":"13.01.0002"},"tid":"7202c44f-96b7-43c0-abf1-a99e09ef7366","timestamp":1749178912043,"gateway":"8UUXN4P00A06NK"} + +{"bid":"96b71033-2722-4a69-a50b-8b2efe30e9f5","data":{"air_transfer_enable":false},"need_reply":1,"tid":"dc2c0cec-7cd6-49e4-9d09-beff11c24e79","timestamp":1749178912224,"gateway":"8UUXN4P00A06NK"} + +{"tid":"7dd8a286-2975-46db-92bd-025d3b7d5507","bid":"e3e35720-3775-43d6-b112-ab7cffd1d552","timestamp":1749178912302,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"5bd15a16-d4b5-4eba-bea5-757822c81c3b","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"aeeb1e30-0fc3-47a3-a19f-7ee1ed3cdc5f","timestamp":1749178912669,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0760523c-843c-4df2-abae-2488e522bf8c","data":{"dongle_infos":[]},"tid":"b839b79d-0125-41cd-b5a7-6f6dee91ba80","timestamp":1749178913039,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4fc100cf-ce09-4526-bda1-7fc1cab795af","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ff9778ca-1663-4e1f-9c9f-49a9481475a8","timestamp":1749178913376,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5df743f0-6716-42db-9f1c-91b80aced908","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d82a9ba6-8847-4a3c-95fe-45beb705e11b","timestamp":1749178913668,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5bd15a16-d4b5-4eba-bea5-757822c81c3b","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"aeeb1e30-0fc3-47a3-a19f-7ee1ed3cdc5f","timestamp":1749178914864,"gateway":"8UUXN4P00A06NK"} + +{"tid":"7f6df15e-8e29-4402-8877-371de1f258d2","bid":"42b59571-abcc-4d23-a113-7ecf03b17a9a","timestamp":1749178941168,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"02568464-a513-44dd-a3e9-c250910e81bf","bid":"e1738530-6a54-4480-90f8-53aa02db65df","timestamp":1749178941171,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"047b264e-0873-4969-93dc-f1d648c86fe5","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3077fd64-dc5b-419b-bdc3-c71e6c3339fb","timestamp":1749178942984,"gateway":"8UUXN4P00A06NK"} + +{"bid":"624a1d2f-b08c-49cf-8dca-d11c6e09a91a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d317cbd0-dbfe-4759-bd55-cd4b88777547","timestamp":1749178943132,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b4d3a23a-3ccd-48dc-b0e3-697b0cd96b34","data":{"air_transfer_enable":false},"need_reply":1,"tid":"04dcdb09-0a61-4a83-ba94-9620e76e139a","timestamp":1749178943510,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1b62621a-2ea9-44ac-a3d4-78094ffa7b26","data":{"dongle_infos":[]},"tid":"0d573e8e-614d-49b6-906d-6a14e43b3e17","timestamp":1749178943515,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a9467691-6629-4866-859a-54c763fbf0e9","data":{"firmware_version":"13.01.0002"},"tid":"e8c152f0-cccb-4224-adcd-283a5a924ec8","timestamp":1749178943522,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9c2c5c74-c1f1-4f65-908e-756daa628e67","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6cfd923f-6556-41ef-8bb1-9c150ca5fa7a","timestamp":1749178944282,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7b2ce934-e327-4603-a897-69931d32f021","data":{"dongle_infos":[]},"tid":"960cacf1-1ad2-4f74-ab9c-8d393d8405e8","timestamp":1749178944536,"gateway":"8UUXN4P00A06NK"} + +{"bid":"047b264e-0873-4969-93dc-f1d648c86fe5","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3077fd64-dc5b-419b-bdc3-c71e6c3339fb","timestamp":1749178945151,"gateway":"8UUXN4P00A06NK"} + +{"bid":"624a1d2f-b08c-49cf-8dca-d11c6e09a91a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d317cbd0-dbfe-4759-bd55-cd4b88777547","timestamp":1749178945152,"gateway":"8UUXN4P00A06NK"} + +{"tid":"92605f3e-8e11-4ff1-a2b8-30ba5d02d3fb","bid":"246dfbb6-b69b-4a14-ab76-4b1743d6c917","timestamp":1749178945320,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"8105ca64-23fc-4240-977e-6a404d86dc37","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"18ebeb38-8f99-4c27-bd7c-73aa5e745d78","timestamp":1749178946164,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9c2c5c74-c1f1-4f65-908e-756daa628e67","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6cfd923f-6556-41ef-8bb1-9c150ca5fa7a","timestamp":1749178946350,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b4d3a23a-3ccd-48dc-b0e3-697b0cd96b34","data":{"air_transfer_enable":false},"need_reply":1,"tid":"04dcdb09-0a61-4a83-ba94-9620e76e139a","timestamp":1749178947712,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ee2fcb25-14da-4314-8e23-ce4c92c0f67e","bid":"3b0442b2-ddc8-4233-91d4-32dc96891350","timestamp":1749178973784,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"a56887f8-b2e4-4066-8e8d-66b8c0b7e764","bid":"8898f8a3-7c13-4573-ac3e-af0f3f60f07b","timestamp":1749178973786,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"50e16d73-6c10-4034-9761-291e421e92c2","data":{"mobility_status_notify":0},"need_reply":1,"tid":"94054c35-f3ce-49e8-b42b-7aa004cab8e8","timestamp":1749178975694,"gateway":"8UUXN4P00A06NK"} + +{"bid":"be996c1d-62d1-490b-a63b-20e12e27bd2a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5d3d47d6-8c69-4815-9966-6c63e9b20e7f","timestamp":1749178975714,"gateway":"8UUXN4P00A06NK"} + +{"bid":"15810ae2-6ee5-4ad8-a541-32d122aa3782","data":{"dongle_infos":[]},"tid":"76d0f99f-2f68-4642-aef8-3f6cc6cd134d","timestamp":1749178976017,"gateway":"8UUXN4P00A06NK"} + +{"bid":"14317b48-c282-4bd4-bd3e-c62b1cd2137e","data":{"firmware_version":"13.01.0002"},"tid":"6d0a4b11-7e3e-4b6c-8294-651addfe0f45","timestamp":1749178976024,"gateway":"8UUXN4P00A06NK"} + +{"bid":"40c079d4-20cc-44b7-bf04-cc77d1bb4b7e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"76d14c96-3f63-4a05-8e0b-9a8979e26518","timestamp":1749178976217,"gateway":"8UUXN4P00A06NK"} + +{"tid":"e64c573f-64a6-42f1-b8ec-3e7c8ad69963","bid":"8663814e-5489-4d69-8b57-61a5e5c6aa53","timestamp":1749178976243,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"b4d9fbff-cee2-4b4c-97f5-2f10e8cd9000","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"132e5d1b-adb8-4754-98c0-998f9ae0e3bc","timestamp":1749178976855,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b66f63a8-8d7a-4147-8bd3-d139ce52f279","data":{"dongle_infos":[]},"tid":"f806af9b-cf58-4080-b8b1-3abff46a2c72","timestamp":1749178977067,"gateway":"8UUXN4P00A06NK"} + +{"bid":"50e16d73-6c10-4034-9761-291e421e92c2","data":{"mobility_status_notify":0},"need_reply":1,"tid":"94054c35-f3ce-49e8-b42b-7aa004cab8e8","timestamp":1749178977813,"gateway":"8UUXN4P00A06NK"} + +{"bid":"be996c1d-62d1-490b-a63b-20e12e27bd2a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5d3d47d6-8c69-4815-9966-6c63e9b20e7f","timestamp":1749178977814,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0afa068f-cbcc-422c-9670-d9d891068863","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e2d9179e-3299-4c71-86c0-c4562303aa42","timestamp":1749178978783,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b4d9fbff-cee2-4b4c-97f5-2f10e8cd9000","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"132e5d1b-adb8-4754-98c0-998f9ae0e3bc","timestamp":1749178979013,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3d803f78-45d6-4066-bf59-4ef7442026b6","data":{"dongle_infos":[]},"tid":"1e9393b0-4520-475f-ae03-1713bf1aee17","timestamp":1749178980318,"gateway":"8UUXN4P00A06NK"} + +{"bid":"40c079d4-20cc-44b7-bf04-cc77d1bb4b7e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"76d14c96-3f63-4a05-8e0b-9a8979e26518","timestamp":1749178980416,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e5626ae5-fd98-4855-ac20-19714acd99ef","data":{"departure_trajectory":[]},"tid":"f4b77c77-2e00-42a8-9813-d12c778f375b","timestamp":1749178980487,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0afa068f-cbcc-422c-9670-d9d891068863","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e2d9179e-3299-4c71-86c0-c4562303aa42","timestamp":1749178980819,"gateway":"8UUXN4P00A06NK"} + +{"bid":"346fd939-308f-4e94-9bfe-f4a493d60a96","data":{"departure_trajectory":[]},"tid":"66d60828-e9e1-4606-af50-cfce119f970e","timestamp":1749178981014,"gateway":"8UUXN4P00A06NK"} + +{"bid":"50e16d73-6c10-4034-9761-291e421e92c2","data":{"mobility_status_notify":0},"need_reply":1,"tid":"94054c35-f3ce-49e8-b42b-7aa004cab8e8","timestamp":1749178982016,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b4d9fbff-cee2-4b4c-97f5-2f10e8cd9000","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"132e5d1b-adb8-4754-98c0-998f9ae0e3bc","timestamp":1749178983212,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5192c1fa-968b-489a-87b5-882d972a11b5","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9e984785-6744-4b61-9478-9de519b505ca","timestamp":1749178983789,"gateway":"8UUXN4P00A06NK"} + +{"tid":"a9d1dfcd-6ff5-4ea4-a995-c518417da279","bid":"efba5b75-0292-4026-a7f0-886fc79d3124","timestamp":1749179010396,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"b91b5581-8381-4176-b1ae-43b04d721da8","bid":"061adc64-5df9-41a1-ba5a-933a805cf0fa","timestamp":1749179010398,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"e6af44cd-5fac-4e23-b165-dda1f3654024","data":{"air_transfer_enable":false},"need_reply":1,"tid":"ab617977-7bd1-42ba-9b8e-eb4228a50bb8","timestamp":1749179012058,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a75d13fb-1828-4dca-84c2-53626143037e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4f1fb02b-d606-48a1-815e-64dbc2cd1381","timestamp":1749179014073,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8f0c5433-0f30-4c45-932a-dea68ca8a265","data":{"mobility_status_notify":0},"need_reply":1,"tid":"292d9678-3dd6-4b7a-8a4e-6d1d5b435a51","timestamp":1749179014076,"gateway":"8UUXN4P00A06NK"} + +{"bid":"14bc5bcc-f835-4f53-9e4c-1efac2a4c4d2","data":{"dongle_infos":[]},"tid":"54874037-ad21-4720-a769-d0ce46d81c2a","timestamp":1749179014466,"gateway":"8UUXN4P00A06NK"} + +{"bid":"940d83e2-b9bf-470d-984f-a76adcfbf836","data":{"firmware_version":"13.01.0002"},"tid":"2273f7d9-6755-411c-996a-8017d792a7b5","timestamp":1749179014472,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e6af44cd-5fac-4e23-b165-dda1f3654024","data":{"air_transfer_enable":false},"need_reply":1,"tid":"ab617977-7bd1-42ba-9b8e-eb4228a50bb8","timestamp":1749179014661,"gateway":"8UUXN4P00A06NK"} + +{"tid":"4daf2903-50f1-480d-845d-81a1ec1b9997","bid":"5ad76736-8cdf-4ec1-86cf-6d5716abbf2a","timestamp":1749179014697,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"c8a63aec-e0bb-47bd-bce2-9185a1ad4b9f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"36166b76-be8f-4480-8ee2-09fa1319a3cc","timestamp":1749179015075,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6fef46b1-15e6-4188-84f4-01e63fd706ae","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0dade653-add3-4463-986e-b8d4a82b0567","timestamp":1749179015399,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f2bb19e6-4d22-4017-b1fb-a902adf0d018","data":{"dongle_infos":[]},"tid":"271c0c66-f3aa-412a-ab95-008aedc0dc55","timestamp":1749179015467,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8f0c5433-0f30-4c45-932a-dea68ca8a265","data":{"mobility_status_notify":0},"need_reply":1,"tid":"292d9678-3dd6-4b7a-8a4e-6d1d5b435a51","timestamp":1749179016175,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c8a63aec-e0bb-47bd-bce2-9185a1ad4b9f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"36166b76-be8f-4480-8ee2-09fa1319a3cc","timestamp":1749179017183,"gateway":"8UUXN4P00A06NK"} + +{"tid":"65d81e9a-18a5-4bcc-8da9-298adfd14944","bid":"08cd25f4-85c1-42b2-9c69-6f8ed22e39bd","timestamp":1749179041174,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"4712fe6b-5a3c-40b6-89bb-c74e7cea00cd","bid":"9f1a763b-2a31-4234-8b63-964b1fc73bd1","timestamp":1749179041180,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"535d2eba-85fc-46d1-bf86-f34833e44816","bid":"5a531ba4-c54e-4b5f-8617-efb7f5c1a2da","timestamp":1749179041433,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"a069e6f6-6d12-44eb-8cf0-7b0ab3f7a912","bid":"6ffee85e-1aef-4100-a367-12c5f5ce1383","timestamp":1749179041436,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"29136528-1334-4e97-bbd3-d881e3a68be1","bid":"258fd650-37c7-4c97-9bb3-b769463b4115","timestamp":1749179041442,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"b3b119b7-00de-4a15-a50d-6dde216c966e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"513276b3-28bf-42c6-9da6-6deda724f40b","timestamp":1749179043123,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e8437cdd-b404-4a71-9c68-8e0cbe672d25","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e07cde11-e7c6-4d3e-9463-f4467e4182fc","timestamp":1749179045081,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3c4e4c82-f9ff-4c40-9836-acea46c72257","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3ea61e6b-a972-47d4-951c-3f33731f1d1e","timestamp":1749179045714,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9320e915-834b-40db-b0a7-a8198cae6216","data":{"mobility_status_notify":0},"need_reply":1,"tid":"fcdeb780-034a-47d0-9156-7303db173dae","timestamp":1749179045725,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4a6b3d0e-d75c-4158-a4ed-36cd2daf9630","data":{"dongle_infos":[]},"tid":"5c8e01fb-238f-4707-9bed-85a157d17724","timestamp":1749179045732,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c861fbb8-0483-48b9-b5d2-cab0c950845e","data":{"dongle_infos":[]},"tid":"32e6cb4a-63e4-41d2-84cb-faf5934e5067","timestamp":1749179045733,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b7ceb63f-1714-41ea-a9e1-765f6756e8f5","data":{"firmware_version":"13.01.0002"},"tid":"b45f6c15-82ec-4d6d-8eb9-c07b8fba10df","timestamp":1749179045775,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b3b119b7-00de-4a15-a50d-6dde216c966e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"513276b3-28bf-42c6-9da6-6deda724f40b","timestamp":1749179045794,"gateway":"8UUXN4P00A06NK"} + +{"tid":"6ce7e636-145a-48ce-9804-09a82c7b3694","bid":"289d3d5a-84bc-4073-bd6a-5f2ddbddcddf","timestamp":1749179045986,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"fbf93cc1-4bce-41b8-856c-1551e7d22b4d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3d2b52d1-a91e-413f-a242-c49648d72a9c","timestamp":1749179046171,"gateway":"8UUXN4P00A06NK"} + +{"bid":"260c5083-0694-43b2-9b15-477165f00a0f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3f63ae9e-b0cb-4c76-95c8-0e11e7938258","timestamp":1749179046434,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d337945c-5c8c-4495-ad5d-969c6909ce64","data":{"dongle_infos":[]},"tid":"b7ffb596-9d3d-4bbf-9a80-966f9b5a6374","timestamp":1749179046773,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3c4e4c82-f9ff-4c40-9836-acea46c72257","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3ea61e6b-a972-47d4-951c-3f33731f1d1e","timestamp":1749179047722,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9320e915-834b-40db-b0a7-a8198cae6216","data":{"mobility_status_notify":0},"need_reply":1,"tid":"fcdeb780-034a-47d0-9156-7303db173dae","timestamp":1749179047923,"gateway":"8UUXN4P00A06NK"} + +{"tid":"7527af55-dbbd-466b-864b-44989c8b43df","bid":"963a9e81-c3b1-4046-8258-e9989e9ab091","timestamp":1749179071201,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"b0fc30ca-6b7c-40cb-b41f-4bbce4611fc4","bid":"cff205b4-fbb9-4da5-a34b-111a7a84ef59","timestamp":1749179071209,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"53401617-7e65-4975-84d7-6b1dbe3010a3","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1ba701f7-7e94-4b0a-aa1a-ed4286a0a403","timestamp":1749179073608,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8f5a7b8d-cd7d-4176-bb24-ee3c2e6c6802","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e4e0416b-9a67-462d-9eae-88db0f500392","timestamp":1749179075640,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c454cd13-de7b-46c4-a66b-eb0265496aca","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6235dd10-3bb6-4c9b-b7b6-5f8b02a70c02","timestamp":1749179075644,"gateway":"8UUXN4P00A06NK"} + +{"bid":"63f94910-3445-457d-ab77-e29c9f4fcf31","data":{"dongle_infos":[]},"tid":"7d34b0ed-9c72-41dc-8bcc-7ab3a4c1e0b7","timestamp":1749179075920,"gateway":"8UUXN4P00A06NK"} + +{"bid":"faca9973-ff9a-42e4-8f7c-00f71031803b","data":{"firmware_version":"13.01.0002"},"tid":"f4a01292-6e54-405b-8bba-bc785933b19a","timestamp":1749179075927,"gateway":"8UUXN4P00A06NK"} + +{"bid":"53401617-7e65-4975-84d7-6b1dbe3010a3","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1ba701f7-7e94-4b0a-aa1a-ed4286a0a403","timestamp":1749179076116,"gateway":"8UUXN4P00A06NK"} + +{"bid":"13ea41cb-cf57-49b8-905c-421ac4088757","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4638e14f-5249-4038-a447-8e4d4f561b70","timestamp":1749179076201,"gateway":"8UUXN4P00A06NK"} + +{"tid":"4cf85b29-74b9-4dfb-9c04-e5d02723e753","bid":"7f2a9256-8876-4935-abd6-1d3904b34d88","timestamp":1749179076537,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"022154c4-5d41-4e08-b3af-eaadcf2625d5","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"482827b7-303f-4fef-b10d-2a543c77b09d","timestamp":1749179076752,"gateway":"8UUXN4P00A06NK"} + +{"bid":"63af9a3e-b781-4871-a3dd-5a0517b3c12c","data":{"dongle_infos":[]},"tid":"e96af535-4a21-4f16-84d1-3cf6638c9ca8","timestamp":1749179076928,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8f5a7b8d-cd7d-4176-bb24-ee3c2e6c6802","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e4e0416b-9a67-462d-9eae-88db0f500392","timestamp":1749179077827,"gateway":"8UUXN4P00A06NK"} + +{"tid":"faf2c13e-20bb-46ef-9549-ae689b8664e3","bid":"1a058787-cfe0-429c-8f89-d51ff12caaeb","timestamp":1749179103827,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"b177adad-d763-4707-9044-dd3b19983560","bid":"0bb142cb-2111-4d3a-8051-618945e15f9e","timestamp":1749179103833,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"014a983c-7bdd-45fd-8ea0-d5356e7bf9ed","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9f01f68f-025c-4fa3-8aee-2814e353856f","timestamp":1749179105485,"gateway":"8UUXN4P00A06NK"} + +{"bid":"53babdfb-af9c-4415-90ad-164d95afb54e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"05bf9eda-a2c6-46a1-a5b5-a5a1971d13a3","timestamp":1749179105655,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bbc5054e-d9df-454a-a68b-96681593a2dd","data":{"dongle_infos":[]},"tid":"f9946fb2-efb9-40d8-8a3d-7a9396b3b981","timestamp":1749179105873,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b0ac7b36-da76-4eb9-8ff2-0d27b45cbaf7","data":{"firmware_version":"13.01.0002"},"tid":"53a021f7-a434-4932-8c23-da692432c28f","timestamp":1749179105884,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e1a33932-c262-4d6a-89b1-d83ff48520a5","data":{"air_transfer_enable":false},"need_reply":1,"tid":"bc1043c3-8318-4ed6-8ea8-487d1147318f","timestamp":1749179106067,"gateway":"8UUXN4P00A06NK"} + +{"tid":"babaf92c-249c-47a5-b5cd-441b77913db6","bid":"72addf87-f65a-4c88-9532-5908799886ef","timestamp":1749179106525,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"c8154f13-6c98-4609-abf1-a820a2613311","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"d99d21b8-94c4-4482-a569-d42c4d220b69","timestamp":1749179106775,"gateway":"8UUXN4P00A06NK"} + +{"bid":"75934a2f-f717-4f71-9747-df863502fd13","data":{"dongle_infos":[]},"tid":"239c0a0b-788c-4b1b-a3a2-28cb640015d0","timestamp":1749179106917,"gateway":"8UUXN4P00A06NK"} + +{"bid":"014a983c-7bdd-45fd-8ea0-d5356e7bf9ed","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9f01f68f-025c-4fa3-8aee-2814e353856f","timestamp":1749179107589,"gateway":"8UUXN4P00A06NK"} + +{"bid":"53babdfb-af9c-4415-90ad-164d95afb54e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"05bf9eda-a2c6-46a1-a5b5-a5a1971d13a3","timestamp":1749179107789,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c8154f13-6c98-4609-abf1-a820a2613311","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"d99d21b8-94c4-4482-a569-d42c4d220b69","timestamp":1749179108790,"gateway":"8UUXN4P00A06NK"} + +{"bid":"755221d8-7611-4eeb-8f1f-17665f017c05","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8f8291f0-581c-4536-9223-78fb4cb4711f","timestamp":1749179108833,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8f55a9f5-8677-423a-b4f0-63addd7b59b7","data":{"dongle_infos":[]},"tid":"7f7c8a7f-841a-4807-9308-0560576c65bb","timestamp":1749179109083,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e1a33932-c262-4d6a-89b1-d83ff48520a5","data":{"air_transfer_enable":false},"need_reply":1,"tid":"bc1043c3-8318-4ed6-8ea8-487d1147318f","timestamp":1749179110261,"gateway":"8UUXN4P00A06NK"} + +{"bid":"490d8874-2993-4640-bd30-65b9cb06c3f0","data":{"departure_trajectory":[]},"tid":"73fb12d8-8dde-4d2c-9ca1-d31b2853422c","timestamp":1749179110280,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b62d8d2d-1db3-4a28-9224-441b7e448b46","data":{"departure_trajectory":[]},"tid":"e238ad40-1d2e-4a23-9964-a4ecbe418ac7","timestamp":1749179110862,"gateway":"8UUXN4P00A06NK"} + +{"bid":"755221d8-7611-4eeb-8f1f-17665f017c05","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8f8291f0-581c-4536-9223-78fb4cb4711f","timestamp":1749179110989,"gateway":"8UUXN4P00A06NK"} + +{"bid":"53babdfb-af9c-4415-90ad-164d95afb54e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"05bf9eda-a2c6-46a1-a5b5-a5a1971d13a3","timestamp":1749179111990,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c8154f13-6c98-4609-abf1-a820a2613311","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"d99d21b8-94c4-4482-a569-d42c4d220b69","timestamp":1749179112988,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ecda40d3-4cbf-4681-98ef-befe2e55afb9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9e26221f-71c2-42be-9f15-7c7c18f0eb3d","timestamp":1749179113828,"gateway":"8UUXN4P00A06NK"} + +{"tid":"8f6e937e-2d01-4cbb-afd6-49d83dd1f499","bid":"818fdc92-c2ca-4850-ba29-71f60a4dd67b","timestamp":1749179142602,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"25ddb427-e232-4d1b-91f4-ab79533d7ab8","bid":"a0e4c2f5-c461-4965-96f9-7d9393bed32c","timestamp":1749179142605,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"71d9af8f-acbf-472b-97f2-aac7a20263f2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c98791e4-b2ba-431c-9962-0b15a5d323d1","timestamp":1749179144105,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d8e90683-b302-401f-8152-3773bb948665","bid":"5c50b6bf-08c5-45b9-8358-ca60aff059c0","timestamp":1749179144581,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"ad3574c4-4f9c-4d37-9062-3ffe624112a4","data":{"air_transfer_enable":false},"need_reply":1,"tid":"c8483db5-d946-4a54-bbdf-7002694726f2","timestamp":1749179144743,"gateway":"8UUXN4P00A06NK"} + +{"bid":"39b41f5c-f2ab-442e-b215-e9e141f41ee3","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"55211418-f93b-4442-8ced-b85f879e3401","timestamp":1749179145038,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f4b3fefa-e1c9-4429-9707-011f078209eb","data":{"dongle_infos":[]},"tid":"342346c5-e850-4581-888c-dff4c10cbeb3","timestamp":1749179145046,"gateway":"8UUXN4P00A06NK"} + +{"bid":"45530c05-6259-4082-8a25-9a62a5ef63c4","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3319a49e-add1-4624-9f8b-b257bf9fc89a","timestamp":1749179145055,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9ff430e5-02c2-4f57-865b-e639fc4afea0","data":{"firmware_version":"13.01.0002"},"tid":"6036694e-c834-4502-9a89-f58a883ddb9c","timestamp":1749179145074,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e694baa1-c718-41d3-be68-dddbcce64b89","data":{"dongle_infos":[]},"tid":"2d83c25e-cbb6-4b1a-9f95-e67189cf8a19","timestamp":1749179146044,"gateway":"8UUXN4P00A06NK"} + +{"bid":"71d9af8f-acbf-472b-97f2-aac7a20263f2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c98791e4-b2ba-431c-9962-0b15a5d323d1","timestamp":1749179146147,"gateway":"8UUXN4P00A06NK"} + +{"bid":"39b41f5c-f2ab-442e-b215-e9e141f41ee3","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"55211418-f93b-4442-8ced-b85f879e3401","timestamp":1749179147147,"gateway":"8UUXN4P00A06NK"} + +{"bid":"45530c05-6259-4082-8a25-9a62a5ef63c4","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3319a49e-add1-4624-9f8b-b257bf9fc89a","timestamp":1749179147149,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8d318af0-b037-4a25-8668-ae0964abaffb","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a36f055f-6a2e-4a8d-b689-1fd924228cfe","timestamp":1749179147601,"gateway":"8UUXN4P00A06NK"} + +{"bid":"868c1a42-46c0-414c-9346-dabcf0689a7f","data":{"dongle_infos":[]},"tid":"0f77b783-1ff9-4952-9335-aa7207ec1376","timestamp":1749179148570,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ad3574c4-4f9c-4d37-9062-3ffe624112a4","data":{"air_transfer_enable":false},"need_reply":1,"tid":"c8483db5-d946-4a54-bbdf-7002694726f2","timestamp":1749179148939,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e596e311-5cae-412b-9e26-ac888b7f2baf","data":{"departure_trajectory":[]},"tid":"15987ad5-492c-4510-bf2e-3b1326d90c74","timestamp":1749179148971,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8d318af0-b037-4a25-8668-ae0964abaffb","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a36f055f-6a2e-4a8d-b689-1fd924228cfe","timestamp":1749179149747,"gateway":"8UUXN4P00A06NK"} + +{"bid":"747ccc7a-b56e-4553-82fa-f1700181e0b6","data":{"departure_trajectory":[]},"tid":"e4f1cf54-ef2d-49ae-ae25-8cafa611fc9f","timestamp":1749179150041,"gateway":"8UUXN4P00A06NK"} + +{"bid":"39b41f5c-f2ab-442e-b215-e9e141f41ee3","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"55211418-f93b-4442-8ced-b85f879e3401","timestamp":1749179151347,"gateway":"8UUXN4P00A06NK"} + +{"bid":"45530c05-6259-4082-8a25-9a62a5ef63c4","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3319a49e-add1-4624-9f8b-b257bf9fc89a","timestamp":1749179151347,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5ad88e0b-118b-4829-bd56-986bdd72e0f4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e7e13d61-778e-4289-8c8d-befbc3955dd3","timestamp":1749179152598,"gateway":"8UUXN4P00A06NK"} + +{"tid":"abc262ee-b71a-42ea-981d-baa4e1d65ede","bid":"b2c8e33c-8866-4126-b63a-c348e424286b","timestamp":1749179178015,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"9df85e06-4765-47a1-8db5-8d205ff950b3","bid":"632f3155-c285-4d20-94d5-b4a5792118bc","timestamp":1749179178017,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"af46914c-6f5c-4b72-8ddc-b4a33f938a73","data":{"air_transfer_enable":false},"need_reply":1,"tid":"33583673-ed7e-4c80-a830-bbcb4d60e8e6","timestamp":1749179179298,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ce11ebcc-8752-4fa0-8ba7-a446aafad698","bid":"9a151e6d-5320-4f55-a8bd-38db5f4a57aa","timestamp":1749179181922,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"af46914c-6f5c-4b72-8ddc-b4a33f938a73","data":{"air_transfer_enable":false},"need_reply":1,"tid":"33583673-ed7e-4c80-a830-bbcb4d60e8e6","timestamp":1749179181928,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a7a2f3ed-5bf8-4eb6-ac52-b37853cbf7b4","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6b9fa1e7-d2a8-477d-ba8b-cb2298e3d8df","timestamp":1749179182004,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b037d696-596c-43b5-a859-6b803e2477f7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0c5641d6-be34-4607-9b6c-d760b337022e","timestamp":1749179182018,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0125f12e-31e8-4652-a240-c7197dc386ad","data":{"mobility_status_notify":0},"need_reply":1,"tid":"cdba80d7-d499-4e0d-8401-311fd87cc42d","timestamp":1749179182025,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0453cae7-0cd2-489c-9eb0-565b8a9a22f4","data":{"dongle_infos":[]},"tid":"a4ce1d51-2ef2-4e6d-84ff-bae2b41cd442","timestamp":1749179182031,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ecd30a39-14cd-4f31-ad5b-29923de0c1f5","data":{"firmware_version":"13.01.0002"},"tid":"60674563-efe7-448e-adf1-b42a01523390","timestamp":1749179182049,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c35bc9cc-a1d4-4ce8-a2d2-9e2af516f210","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9181d42c-b49c-45ba-83e7-3a776645a207","timestamp":1749179183014,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4973d1b0-3456-4839-98b0-2585fec2a612","data":{"dongle_infos":[]},"tid":"33548f2d-30af-4523-bec6-ac31d53ee38b","timestamp":1749179183021,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a7a2f3ed-5bf8-4eb6-ac52-b37853cbf7b4","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6b9fa1e7-d2a8-477d-ba8b-cb2298e3d8df","timestamp":1749179184081,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0125f12e-31e8-4652-a240-c7197dc386ad","data":{"mobility_status_notify":0},"need_reply":1,"tid":"cdba80d7-d499-4e0d-8401-311fd87cc42d","timestamp":1749179184082,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8f89e8f2-9018-4909-abe0-657d19977254","data":{"dongle_infos":[]},"tid":"4c0da112-7bf3-4128-bef2-63c2f0bd0d86","timestamp":1749179184347,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c8a0526a-d7ce-47f1-ab08-b4956d663e53","bid":"4cdd52f0-ce1e-49cd-94da-d70026bddf1d","timestamp":1749179211750,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"536ecfad-3059-43f3-a89a-a2584d9475b5","bid":"a901396d-6351-43a2-a394-e4adf6c5298b","timestamp":1749179211765,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"e2733631-f3a6-4fdf-920a-6ca98d79d815","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"24f724b9-3dc6-4a2e-af91-d4bf6664d85e","timestamp":1749179212949,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f5a526a3-e9fe-40cb-bb66-0c21b7b80ed1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5f9a7107-d2a0-449f-af9e-0340b86589b0","timestamp":1749179213579,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9eb9921f-3dc0-40e9-8ea3-9805a2fb4b4b","data":{"mobility_status_notify":0},"need_reply":1,"tid":"47b573eb-4f75-419f-8b40-f3b1b84fdc81","timestamp":1749179213598,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a2a17b2f-3b63-4896-916f-339c2f4099a7","data":{"dongle_infos":[]},"tid":"1a3f34fc-23a3-48b4-a633-408c48794175","timestamp":1749179213673,"gateway":"8UUXN4P00A06NK"} + +{"bid":"17a4835c-da94-44e8-98ed-0b39cfe6e7c6","data":{"firmware_version":"13.01.0002"},"tid":"d241ec0f-8bca-4ab4-b60f-454aa8128442","timestamp":1749179213693,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e344a47e-798c-4abf-9b44-144f540b333c","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8f1267bf-0ea1-465f-b2be-e53d992455f7","timestamp":1749179213876,"gateway":"8UUXN4P00A06NK"} + +{"tid":"38359b8f-f9e2-4d1a-970a-b6fef8cc0b18","bid":"c3b9dc63-1c70-41f1-b874-824d715bb4e2","timestamp":1749179214043,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"7baf7245-7d07-43f0-bfd9-f64a79f571be","data":{"dongle_infos":[]},"tid":"ac8bb108-fb5c-419f-adac-008d5f863c8f","timestamp":1749179214696,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e2733631-f3a6-4fdf-920a-6ca98d79d815","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"24f724b9-3dc6-4a2e-af91-d4bf6664d85e","timestamp":1749179215007,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f5a526a3-e9fe-40cb-bb66-0c21b7b80ed1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5f9a7107-d2a0-449f-af9e-0340b86589b0","timestamp":1749179215607,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9eb9921f-3dc0-40e9-8ea3-9805a2fb4b4b","data":{"mobility_status_notify":0},"need_reply":1,"tid":"47b573eb-4f75-419f-8b40-f3b1b84fdc81","timestamp":1749179215608,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2be0caf1-bac6-412d-b5a5-76e69fce6031","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f1812b92-3aaf-4c5d-b98b-bd7ccc17577f","timestamp":1749179216750,"gateway":"8UUXN4P00A06NK"} + +{"bid":"28fb5407-36cd-4a51-9548-e0d0c292794b","data":{"dongle_infos":[]},"tid":"ce0758dc-eb62-4f8b-9d39-2ee0c71b61d3","timestamp":1749179217939,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e344a47e-798c-4abf-9b44-144f540b333c","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8f1267bf-0ea1-465f-b2be-e53d992455f7","timestamp":1749179218073,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c4e52d55-7e39-4c05-b252-f3ad13acf196","data":{"departure_trajectory":[]},"tid":"1d55b573-50a0-4c46-ad1d-0965433de847","timestamp":1749179218373,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b1deccf6-55b9-4389-ad43-53075d5366b7","data":{"departure_trajectory":[]},"tid":"58db38b3-cbfe-4d04-864c-41cd48e13271","timestamp":1749179218671,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2be0caf1-bac6-412d-b5a5-76e69fce6031","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f1812b92-3aaf-4c5d-b98b-bd7ccc17577f","timestamp":1749179218807,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f5a526a3-e9fe-40cb-bb66-0c21b7b80ed1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5f9a7107-d2a0-449f-af9e-0340b86589b0","timestamp":1749179219807,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9eb9921f-3dc0-40e9-8ea3-9805a2fb4b4b","data":{"mobility_status_notify":0},"need_reply":1,"tid":"47b573eb-4f75-419f-8b40-f3b1b84fdc81","timestamp":1749179219808,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e9671cfb-2025-47d7-b1b5-cd4a43647ae1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e26a548e-f3f5-48fd-9953-05a84787cf2a","timestamp":1749179221750,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e9671cfb-2025-47d7-b1b5-cd4a43647ae1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e26a548e-f3f5-48fd-9953-05a84787cf2a","timestamp":1749179223807,"gateway":"8UUXN4P00A06NK"} + +{"tid":"9ab610cb-4b8f-4b68-b0b0-317816020bd7","bid":"4bfeee2f-29c5-4ac3-b987-9bb85ec23a49","timestamp":1749179249791,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"9849a9c7-7749-43d1-a556-6e2222784fb9","bid":"f3364247-4c82-4817-961e-9009b770a3c3","timestamp":1749179249793,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"fcf9acc2-c5c2-4fac-906e-62cc56e81c51","data":{"mobility_status_notify":0},"need_reply":1,"tid":"df23394c-072c-46bd-9e9b-db99a301265c","timestamp":1749179251589,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d3a9daf6-948f-420d-907d-db96456f97cf","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"dbacfe54-0a95-4b0a-9526-1a6614a7a593","timestamp":1749179251652,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8ad8d590-aab4-47c9-99ae-4dc315a436be","data":{"dongle_infos":[]},"tid":"ffebf7d9-009f-4bd8-9881-19aa914c4319","timestamp":1749179252019,"gateway":"8UUXN4P00A06NK"} + +{"bid":"53137025-7258-437a-981f-6c8548dddf38","data":{"firmware_version":"13.01.0002"},"tid":"81c3f42b-87f3-421d-a46d-6dbc2936f317","timestamp":1749179252035,"gateway":"8UUXN4P00A06NK"} + +{"tid":"eebf31b1-59c0-48f6-a795-5f1ea4dc2fa9","bid":"0ba7d3b9-c03a-4b57-8693-32774feecc0d","timestamp":1749179252078,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"1dc81aab-ca4e-493b-9dda-3dd27ac4e48b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"92dd1849-bd21-4959-89b2-7504a70dfe5c","timestamp":1749179252215,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5c045a66-baf5-4580-a059-f6acd588a65b","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"25fcff1f-4daf-4112-acb7-9f516f7ae663","timestamp":1749179252678,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d05fb2da-596f-48b7-86d4-bf663c3d0a92","data":{"dongle_infos":[]},"tid":"9c1a1992-1f84-46c3-a5c3-e3f5bbff2d89","timestamp":1749179253024,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fcf9acc2-c5c2-4fac-906e-62cc56e81c51","data":{"mobility_status_notify":0},"need_reply":1,"tid":"df23394c-072c-46bd-9e9b-db99a301265c","timestamp":1749179253771,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d3a9daf6-948f-420d-907d-db96456f97cf","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"dbacfe54-0a95-4b0a-9526-1a6614a7a593","timestamp":1749179253773,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5c045a66-baf5-4580-a059-f6acd588a65b","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"25fcff1f-4daf-4112-acb7-9f516f7ae663","timestamp":1749179254770,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9a38c7e4-2320-4e21-983d-9c0c21565ca3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f31051b7-3104-4379-a3e4-c73a8ba25257","timestamp":1749179254795,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ed2ccf58-bc6f-4a93-9f25-4b1103bd159c","data":{"dongle_infos":[]},"tid":"a00e705d-7ec4-42a0-a8e1-0cdf562369c6","timestamp":1749179256103,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1dc81aab-ca4e-493b-9dda-3dd27ac4e48b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"92dd1849-bd21-4959-89b2-7504a70dfe5c","timestamp":1749179256420,"gateway":"8UUXN4P00A06NK"} + +{"bid":"84e07f17-5aaf-445a-87b0-a961569a7c52","data":{"departure_trajectory":[]},"tid":"115bbda9-16d1-42de-8d6f-f653c9e76ebd","timestamp":1749179256457,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9a38c7e4-2320-4e21-983d-9c0c21565ca3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f31051b7-3104-4379-a3e4-c73a8ba25257","timestamp":1749179256970,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b405c05d-d1ab-4f3f-8611-7e390b6a7d49","data":{"departure_trajectory":[]},"tid":"483a6987-ac37-489b-ab06-57211b3f885c","timestamp":1749179257013,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fcf9acc2-c5c2-4fac-906e-62cc56e81c51","data":{"mobility_status_notify":0},"need_reply":1,"tid":"df23394c-072c-46bd-9e9b-db99a301265c","timestamp":1749179257972,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5c045a66-baf5-4580-a059-f6acd588a65b","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"25fcff1f-4daf-4112-acb7-9f516f7ae663","timestamp":1749179258973,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b0fc6d0c-5183-464e-ae18-29c066e0df9d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"45eec41f-0539-4148-8855-04bb587cbc3e","timestamp":1749179259792,"gateway":"8UUXN4P00A06NK"} + +{"tid":"93d1b7f4-c741-415d-ace6-4848c8799518","bid":"dd2dd011-300b-473d-a897-37fa02523e96","timestamp":1749179287951,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"fe6de692-a9bd-4666-a31c-3b8ec4b0440f","bid":"7be6c41c-ead8-47b0-8e95-2163d813467a","timestamp":1749179287954,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"0647c64f-cb07-403e-ac16-f11191df4e12","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c97c16f7-f0ff-4e7c-b3b2-ee016d127111","timestamp":1749179290031,"gateway":"8UUXN4P00A06NK"} + +{"tid":"0ce65efb-d060-4566-a5c2-959a50e52028","bid":"63a7a5fc-54c5-4ee3-b3a5-b7d45902a5d7","timestamp":1749179290177,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"e2bc165d-0c7e-47e9-968f-c9e3a2886a5e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"9b6bb1c6-f1ee-42c1-b9ca-9568a77ca322","timestamp":1749179290432,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f4bc9ec3-e9fc-4f7b-9430-625dee913d59","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"73a9a07f-a6cf-49aa-be07-7797fd49a936","timestamp":1749179290713,"gateway":"8UUXN4P00A06NK"} + +{"bid":"34a3cd2d-798c-4d9a-8c71-cfd25a6d79fd","data":{"dongle_infos":[]},"tid":"d03028ff-274b-448d-90fa-f58e587779be","timestamp":1749179290727,"gateway":"8UUXN4P00A06NK"} + +{"bid":"03113f18-81e4-4405-b5be-4182850d274d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ea2552b6-d859-4351-876e-1b82594af914","timestamp":1749179290734,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f903b716-3f55-4c29-bf49-8e256675f8db","data":{"firmware_version":"13.01.0002"},"tid":"273202b7-9559-4ea9-bf86-6d418d7acb47","timestamp":1749179290755,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9f046192-6a64-4872-8e06-d93f9ef5257a","data":{"dongle_infos":[]},"tid":"a9d2f3eb-b245-4d21-b1ba-b043df6ffc4c","timestamp":1749179291747,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0647c64f-cb07-403e-ac16-f11191df4e12","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c97c16f7-f0ff-4e7c-b3b2-ee016d127111","timestamp":1749179292149,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f4bc9ec3-e9fc-4f7b-9430-625dee913d59","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"73a9a07f-a6cf-49aa-be07-7797fd49a936","timestamp":1749179292748,"gateway":"8UUXN4P00A06NK"} + +{"bid":"03113f18-81e4-4405-b5be-4182850d274d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ea2552b6-d859-4351-876e-1b82594af914","timestamp":1749179292749,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e9dab62a-ba78-4630-988e-9f6ce0d6c8be","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a7e26245-eae5-4a3b-961b-4dea516e7406","timestamp":1749179292951,"gateway":"8UUXN4P00A06NK"} + +{"bid":"27f2ae15-a3e8-4105-9b39-66e812e86449","data":{"dongle_infos":[]},"tid":"bb9da0b7-e0fe-4fad-ae8a-463c2c0b3c70","timestamp":1749179293248,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e2bc165d-0c7e-47e9-968f-c9e3a2886a5e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"9b6bb1c6-f1ee-42c1-b9ca-9568a77ca322","timestamp":1749179294625,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dfa8bcb1-b8e1-403b-affe-9b5cf1d38380","data":{"departure_trajectory":[]},"tid":"8d2588a0-5cfd-4e10-8481-1ae66a71d135","timestamp":1749179294650,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e9dab62a-ba78-4630-988e-9f6ce0d6c8be","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a7e26245-eae5-4a3b-961b-4dea516e7406","timestamp":1749179295144,"gateway":"8UUXN4P00A06NK"} + +{"bid":"48bd9ee6-5882-498c-8595-1fd67fb820ce","data":{"departure_trajectory":[]},"tid":"2d781c79-1716-494f-a9a3-016afc48ad5c","timestamp":1749179295717,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f4bc9ec3-e9fc-4f7b-9430-625dee913d59","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"73a9a07f-a6cf-49aa-be07-7797fd49a936","timestamp":1749179296944,"gateway":"8UUXN4P00A06NK"} + +{"bid":"03113f18-81e4-4405-b5be-4182850d274d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ea2552b6-d859-4351-876e-1b82594af914","timestamp":1749179296944,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d92033bb-2f88-464c-9f97-136d25fd5e58","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cfb96fbc-b687-4f3b-a063-3f3d00f6561f","timestamp":1749179297951,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d2a83509-0949-4a3b-a63a-a3a89886e7a7","bid":"6495b65b-13d4-4309-80d9-9c90ad4c99fa","timestamp":1749179322627,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"2337edb0-c920-4cc5-8613-a19999017b4e","bid":"cd7d4d08-bf6e-42cc-b28a-9ae7d861de24","timestamp":1749179322637,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f488f14a-43b4-4850-b67f-d9a0e488e984","data":{"air_transfer_enable":false},"need_reply":1,"tid":"881a0729-d88e-4a52-b98e-c26ce48a96af","timestamp":1749179324803,"gateway":"8UUXN4P00A06NK"} + +{"bid":"657b2d41-e521-4cff-a114-411bce51b875","data":{"mobility_status_notify":0},"need_reply":1,"tid":"2329b73a-618e-4e11-ad98-6413d017122b","timestamp":1749179326765,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7d49b6a1-a6d5-4cf0-ba83-493e210930cf","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"228bce6c-44d5-4f20-a5eb-3e11a5aaef5f","timestamp":1749179326828,"gateway":"8UUXN4P00A06NK"} + +{"tid":"9d66c414-1369-4add-a3e7-6069f74b61ac","bid":"79e70b6a-dee0-4cee-913b-73b2b68a6a72","timestamp":1749179327088,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"3103b2e9-9f5d-40ba-a9e3-32fed13daec8","data":{"dongle_infos":[]},"tid":"e13329c6-d38d-404b-b334-380b6f2e8e90","timestamp":1749179327188,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b08bd8da-c013-4866-8558-393a45f88502","data":{"firmware_version":"13.01.0002"},"tid":"456b5432-2f9c-42a6-b2f2-5a5b72ccbba3","timestamp":1749179327195,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f488f14a-43b4-4850-b67f-d9a0e488e984","data":{"air_transfer_enable":false},"need_reply":1,"tid":"881a0729-d88e-4a52-b98e-c26ce48a96af","timestamp":1749179327379,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b45f18c3-33dd-462c-b96c-7c9e6d6eafea","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"dbeddd47-b456-4eae-9903-6d897653f3c3","timestamp":1749179327627,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1a02b37e-f3b6-46ab-ada7-b94b5df8661f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"592a7e1c-63ba-421c-a3b1-b7db4242af06","timestamp":1749179327915,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a03d28f8-b400-41ff-93a7-b7a0a98ad87d","data":{"dongle_infos":[]},"tid":"2d1a850f-d8c6-4c0f-af47-5d111ec2d23a","timestamp":1749179328239,"gateway":"8UUXN4P00A06NK"} + +{"bid":"657b2d41-e521-4cff-a114-411bce51b875","data":{"mobility_status_notify":0},"need_reply":1,"tid":"2329b73a-618e-4e11-ad98-6413d017122b","timestamp":1749179328952,"gateway":"8UUXN4P00A06NK"} + +{"tid":"7b03f00f-0e7e-48a1-91a4-b55b95bc0e97","bid":"75f84ca5-6e5c-459c-87a4-29ee08a2725a","timestamp":1749179353096,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"403bc46d-4bef-432a-9ffc-2ee58bd9c72a","bid":"089c6814-c435-4928-b015-e72084028fb5","timestamp":1749179353101,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"5122807b-ea71-4393-9c6e-67a73b25fb7b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d9b70607-fe8f-4631-ba1f-3d4c2ffbee7d","timestamp":1749179355517,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cb7e4c74-944e-4908-9a44-b5780707c83e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c9fa41da-e57a-425b-b083-9b4cd67ca004","timestamp":1749179357900,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5122807b-ea71-4393-9c6e-67a73b25fb7b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d9b70607-fe8f-4631-ba1f-3d4c2ffbee7d","timestamp":1749179357956,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e35c2c8d-fbac-4155-911c-a47088a1a355","data":{"dongle_infos":[]},"tid":"61e40ebf-3504-4878-86e2-ce286fcaad06","timestamp":1749179357962,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3e205c59-ef0a-4f8a-b187-7fbab2ba79fe","data":{"firmware_version":"13.01.0002"},"tid":"7f53a2d9-199b-40c9-8a02-ab31567fff68","timestamp":1749179357968,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5aaa45c0-d26c-4c7d-a1c1-49df45cbe214","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b99281d8-dd41-4276-8ab0-0eae18586ca9","timestamp":1749179358104,"gateway":"8UUXN4P00A06NK"} + +{"tid":"9c21f1b3-98ee-4a36-ba9b-bd670a239712","bid":"321f8b0d-fb1b-44e3-aeab-75f4aca1d189","timestamp":1749179358110,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"3547c6b0-f175-4d0b-af33-7d160d837dfa","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"8ad1cf5e-d91e-46ad-988d-06a37a45d230","timestamp":1749179358558,"gateway":"8UUXN4P00A06NK"} + +{"bid":"309d6e48-175d-4b12-91a9-0fa1097365e9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"dbb57000-2ed0-40b9-9947-04c1a7782686","timestamp":1749179358565,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cd9ff741-45d0-46fe-af39-f8a68e0aee88","data":{"dongle_infos":[]},"tid":"e2c68c8c-8c2a-4cff-8a11-e54fdc593886","timestamp":1749179359002,"gateway":"8UUXN4P00A06NK"} + +{"tid":"a32d62e7-0506-4cda-a64f-1d8a3886b8a9","bid":"35571876-d0f2-43be-bcc4-3c2c9eb7d702","timestamp":1749179386691,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"2ed43bc4-8b5b-4f0f-8e6e-78ba3c4f9cc2","bid":"7ed84741-e2a3-4788-94be-8199ed0b1a54","timestamp":1749179386698,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"796b0f35-5dc9-4bcf-ae70-66a4c6fc8965","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4b3f4ea8-1620-4504-887d-3ac33db8430a","timestamp":1749179388177,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c009449d-bdb9-4543-b7f7-8ff82bc7da2d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ca90453c-e19e-47c5-bba7-37a6af4beb08","timestamp":1749179388358,"gateway":"8UUXN4P00A06NK"} + +{"bid":"50cd326d-ffbd-48d8-b380-988a89befba1","data":{"dongle_infos":[]},"tid":"4a65a8fa-71f9-418a-8d8a-08ec6be08dab","timestamp":1749179388666,"gateway":"8UUXN4P00A06NK"} + +{"bid":"14e1bb99-5121-48b2-adfa-f68a8c8b550d","data":{"firmware_version":"13.01.0002"},"tid":"3dd09cd7-e8f4-4b87-ab10-46904472a072","timestamp":1749179388673,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bf27dcb0-ee58-47d3-827f-aaaaa42914d4","data":{"air_transfer_enable":false},"need_reply":1,"tid":"911b223b-75b1-4a9b-9bb0-3f22c71edb2b","timestamp":1749179388860,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b2f00354-7bd4-472b-8314-c3d426f5a942","bid":"f52dcbde-627d-4606-b985-71ea07d0dff3","timestamp":1749179388972,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"7a360157-fbf2-4a31-956e-b1ffabb1dde8","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"67de4b36-4aac-4b7b-ac9b-4397318cbe62","timestamp":1749179389513,"gateway":"8UUXN4P00A06NK"} + +{"bid":"33d50671-f135-40e7-9f0f-4d13a7f97cfa","data":{"dongle_infos":[]},"tid":"b41596b1-5581-432e-87c5-4805ed4a21ed","timestamp":1749179389675,"gateway":"8UUXN4P00A06NK"} + +{"bid":"796b0f35-5dc9-4bcf-ae70-66a4c6fc8965","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4b3f4ea8-1620-4504-887d-3ac33db8430a","timestamp":1749179390217,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c009449d-bdb9-4543-b7f7-8ff82bc7da2d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ca90453c-e19e-47c5-bba7-37a6af4beb08","timestamp":1749179390415,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7a360157-fbf2-4a31-956e-b1ffabb1dde8","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"67de4b36-4aac-4b7b-ac9b-4397318cbe62","timestamp":1749179391617,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ed0d8ef1-e38c-491d-b710-aad85361d516","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"dd917283-7314-46a7-aa5a-0be2e31400b8","timestamp":1749179391686,"gateway":"8UUXN4P00A06NK"} + +{"bid":"084af7f0-79d0-4767-a464-9cdde0b810fa","data":{"dongle_infos":[]},"tid":"bc2113b5-7342-4368-9b04-c3f080013f19","timestamp":1749179392902,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bf27dcb0-ee58-47d3-827f-aaaaa42914d4","data":{"air_transfer_enable":false},"need_reply":1,"tid":"911b223b-75b1-4a9b-9bb0-3f22c71edb2b","timestamp":1749179393063,"gateway":"8UUXN4P00A06NK"} + +{"bid":"26abdfcd-f4c9-471d-a6d5-59d7d463f869","data":{"departure_trajectory":[]},"tid":"24506efc-9700-47d9-ab7d-d8549fae53cc","timestamp":1749179393340,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8586ad50-d86e-4c14-bfc7-b4d01b527111","data":{"departure_trajectory":[]},"tid":"2380c29a-2229-45a4-9b14-dbb37c6a53e9","timestamp":1749179393658,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ed0d8ef1-e38c-491d-b710-aad85361d516","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"dd917283-7314-46a7-aa5a-0be2e31400b8","timestamp":1749179393817,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c009449d-bdb9-4543-b7f7-8ff82bc7da2d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ca90453c-e19e-47c5-bba7-37a6af4beb08","timestamp":1749179394614,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7a360157-fbf2-4a31-956e-b1ffabb1dde8","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"67de4b36-4aac-4b7b-ac9b-4397318cbe62","timestamp":1749179395817,"gateway":"8UUXN4P00A06NK"} + +{"bid":"672467b4-97f7-4104-b168-871898f85aef","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8e990558-cabc-4cfa-a569-fb5d1108b853","timestamp":1749179396687,"gateway":"8UUXN4P00A06NK"} + +{"bid":"672467b4-97f7-4104-b168-871898f85aef","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8e990558-cabc-4cfa-a569-fb5d1108b853","timestamp":1749179398817,"gateway":"8UUXN4P00A06NK"} + +{"tid":"46ea9c69-1e3c-43aa-8db4-201310039fd2","bid":"460cc6f0-5c13-4e17-9395-dc512c03514d","timestamp":1749179425365,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"a59ae749-0b9d-4149-829d-1ad6e6625a3f","bid":"5fc5ed7e-865c-4cc9-8cce-7595e6423257","timestamp":1749179425367,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"58cb33bc-82da-4c80-9773-dc6a3c7816ab","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"153c80e5-617f-46c7-8510-90f80b6738b4","timestamp":1749179426932,"gateway":"8UUXN4P00A06NK"} + +{"bid":"769b3e32-5b71-4714-95c1-75e8efffd2b7","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8c4ec1b3-21cc-42c5-9b57-3baf7a7db4c7","timestamp":1749179426942,"gateway":"8UUXN4P00A06NK"} + +{"bid":"17be31ae-8a09-4165-b28c-e05b17d292e9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e1c24366-2cb9-462b-bdae-83f0b74f4feb","timestamp":1749179426953,"gateway":"8UUXN4P00A06NK"} + +{"bid":"03379d25-640e-4024-8660-d677aaaffd94","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b4681233-2665-49b2-a62b-ef96cd100b9a","timestamp":1749179426955,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9d2f44b1-2153-4775-9ec5-ac91776812ec","data":{"dongle_infos":[]},"tid":"aaeb77b1-67b3-4512-a03b-f91d27a2c0c1","timestamp":1749179426965,"gateway":"8UUXN4P00A06NK"} + +{"bid":"83c1975f-ee19-426e-8464-afde20b40c99","data":{"firmware_version":"13.01.0002"},"tid":"57a96b2f-315d-4939-8485-cdde2a6a3364","timestamp":1749179426975,"gateway":"8UUXN4P00A06NK"} + +{"tid":"7fee38f2-13fc-435b-9802-b2357c272489","bid":"ab2f81be-c643-47e9-aad2-ad55fdb51fe4","timestamp":1749179427316,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"47565b84-7025-405a-87b0-f1ec08e65aca","data":{"dongle_infos":[]},"tid":"75c1f20c-3db0-44e5-9852-5c5304a1d35b","timestamp":1749179427950,"gateway":"8UUXN4P00A06NK"} + +{"bid":"58cb33bc-82da-4c80-9773-dc6a3c7816ab","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"153c80e5-617f-46c7-8510-90f80b6738b4","timestamp":1749179428997,"gateway":"8UUXN4P00A06NK"} + +{"bid":"17be31ae-8a09-4165-b28c-e05b17d292e9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e1c24366-2cb9-462b-bdae-83f0b74f4feb","timestamp":1749179428999,"gateway":"8UUXN4P00A06NK"} + +{"bid":"03379d25-640e-4024-8660-d677aaaffd94","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b4681233-2665-49b2-a62b-ef96cd100b9a","timestamp":1749179429004,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3a7ed2fd-0356-490e-b29a-3561df59f9e0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"74343415-bb08-4e41-9739-a00ef86739eb","timestamp":1749179430364,"gateway":"8UUXN4P00A06NK"} + +{"bid":"769b3e32-5b71-4714-95c1-75e8efffd2b7","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8c4ec1b3-21cc-42c5-9b57-3baf7a7db4c7","timestamp":1749179431137,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3fd591f0-2251-4260-96b8-c3c5344beccd","data":{"dongle_infos":[]},"tid":"ab5a590e-904f-419c-848f-7c17bfc51f8c","timestamp":1749179431288,"gateway":"8UUXN4P00A06NK"} + +{"bid":"28581b85-051e-41d5-bf4f-9fc3fdf667ba","data":{"departure_trajectory":[]},"tid":"54ed380e-5f0e-4e51-8b83-da49e278f820","timestamp":1749179431938,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3c3a8398-5aea-425e-b13a-5404b9c92c42","data":{"departure_trajectory":[]},"tid":"2b80fdec-f7d3-458f-b15c-a88634fc3241","timestamp":1749179432000,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3a7ed2fd-0356-490e-b29a-3561df59f9e0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"74343415-bb08-4e41-9739-a00ef86739eb","timestamp":1749179432399,"gateway":"8UUXN4P00A06NK"} + +{"bid":"58cb33bc-82da-4c80-9773-dc6a3c7816ab","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"153c80e5-617f-46c7-8510-90f80b6738b4","timestamp":1749179433196,"gateway":"8UUXN4P00A06NK"} + +{"bid":"17be31ae-8a09-4165-b28c-e05b17d292e9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e1c24366-2cb9-462b-bdae-83f0b74f4feb","timestamp":1749179433197,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fc366c7f-3913-4812-bcec-707047a1f976","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6cb04203-687b-4177-9cc1-e9f0a303a8fd","timestamp":1749179435356,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fc366c7f-3913-4812-bcec-707047a1f976","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6cb04203-687b-4177-9cc1-e9f0a303a8fd","timestamp":1749179437399,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d07d8701-e90b-4aa1-918b-441153059dcf","bid":"572a2b23-6073-456b-bb23-77cd0e9ccf1c","timestamp":1749179464554,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"7c7cb45b-bdb0-4b3c-9b63-9b1093118427","bid":"32dab677-4657-4b9b-8db3-f3793133ceb5","timestamp":1749179464561,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"903239c5-ce1c-4f74-8cf5-9d86823b4b8e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3ea3d300-7cd5-40f1-8e8c-3d939fd5ccef","timestamp":1749179466070,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7d135922-e5d6-4acf-b40b-9a7f88ba4a86","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"046028f0-f35a-40cb-bf25-bffdc1610944","timestamp":1749179466070,"gateway":"8UUXN4P00A06NK"} + +{"bid":"de7c9aab-a172-4299-a239-c68bcaa2c01d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f9f98123-bc25-4fcd-9b2c-33ec4febc178","timestamp":1749179466087,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2e8ef2a7-b2e4-48a0-8656-925f34502248","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f0e48a26-44a2-49e2-98f6-167e8915bed9","timestamp":1749179466089,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1e8e99fb-9b83-4944-a787-64f697c403a1","data":{"dongle_infos":[]},"tid":"793f7ed4-78d8-4d53-a973-8e9cc58592bc","timestamp":1749179466102,"gateway":"8UUXN4P00A06NK"} + +{"bid":"87ec61cd-5e16-4b48-8e2b-9d9e3f42d145","data":{"firmware_version":"13.01.0002"},"tid":"0b9285d8-0698-4266-a507-97665481e016","timestamp":1749179466109,"gateway":"8UUXN4P00A06NK"} + +{"tid":"2c0c609d-e517-4d62-b990-e13338a46776","bid":"304c072e-600b-42cb-8aaf-c37d4f62e678","timestamp":1749179466261,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"e3b4524e-16eb-4865-bb7b-04bbd0fc08fe","data":{"dongle_infos":[]},"tid":"054289a8-bc25-4879-a510-38a52c3d6d0d","timestamp":1749179467111,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7d135922-e5d6-4acf-b40b-9a7f88ba4a86","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"046028f0-f35a-40cb-bf25-bffdc1610944","timestamp":1749179468137,"gateway":"8UUXN4P00A06NK"} + +{"bid":"de7c9aab-a172-4299-a239-c68bcaa2c01d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f9f98123-bc25-4fcd-9b2c-33ec4febc178","timestamp":1749179468138,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2e8ef2a7-b2e4-48a0-8656-925f34502248","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f0e48a26-44a2-49e2-98f6-167e8915bed9","timestamp":1749179468140,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2bf0b137-9d7f-4dcb-a012-54d008396680","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"98d945d1-1b06-46f3-ac04-821fc2ba3407","timestamp":1749179469550,"gateway":"8UUXN4P00A06NK"} + +{"bid":"903239c5-ce1c-4f74-8cf5-9d86823b4b8e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3ea3d300-7cd5-40f1-8e8c-3d939fd5ccef","timestamp":1749179470269,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f16084fa-f6f7-4429-a5db-27fbd43a2c43","data":{"dongle_infos":[]},"tid":"f0d7f668-2c16-47cd-a4bd-26b6c6363a05","timestamp":1749179470277,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5297e19e-fc17-4ec7-aae8-7e396433650a","data":{"departure_trajectory":[]},"tid":"60f32453-9607-4d3e-b337-89f212632525","timestamp":1749179471077,"gateway":"8UUXN4P00A06NK"} + +{"bid":"afe581f6-3e58-46ba-85ba-238df256f61d","data":{"departure_trajectory":[]},"tid":"ddb60df9-0bfe-47e2-9d20-4729ff40bfde","timestamp":1749179471211,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2bf0b137-9d7f-4dcb-a012-54d008396680","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"98d945d1-1b06-46f3-ac04-821fc2ba3407","timestamp":1749179471742,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7d135922-e5d6-4acf-b40b-9a7f88ba4a86","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"046028f0-f35a-40cb-bf25-bffdc1610944","timestamp":1749179472339,"gateway":"8UUXN4P00A06NK"} + +{"bid":"de7c9aab-a172-4299-a239-c68bcaa2c01d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f9f98123-bc25-4fcd-9b2c-33ec4febc178","timestamp":1749179472340,"gateway":"8UUXN4P00A06NK"} + +{"bid":"788e0549-3cb9-4303-bae9-02db606e31b2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2724558a-0534-4f63-8555-78f88c9e1ca8","timestamp":1749179474551,"gateway":"8UUXN4P00A06NK"} + +{"tid":"0dcf5720-e7df-4c5c-84bc-08f38f82ddde","bid":"1e8b8159-f55e-469a-bf87-5f466ab5ce53","timestamp":1749179500658,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"b39af866-8622-4273-bf31-bc903cd5b7bd","bid":"e2f22687-d706-49ec-95b5-7cdcfca35fe4","timestamp":1749179500665,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"a12a6976-752d-43fe-b2c5-8f6af66895eb","data":{"air_transfer_enable":false},"need_reply":1,"tid":"71d19ad1-9fef-498e-9cd6-39faca8ef6ce","timestamp":1749179502251,"gateway":"8UUXN4P00A06NK"} + +{"bid":"64661351-1783-4155-85e7-f3133c0cdb2a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"8f0b2a81-3e7a-4003-b0f6-562ff6fbfcf6","timestamp":1749179504201,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e6b2c4c-ebac-49bd-8df6-f12fbae354d7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"90177aee-2b72-4fad-a074-ab2915847884","timestamp":1749179504381,"gateway":"8UUXN4P00A06NK"} + +{"bid":"880f5ed2-b385-4e3d-a50f-961ac0b0f05c","data":{"dongle_infos":[]},"tid":"621cf83a-0707-4a36-9808-2e54ec1bca18","timestamp":1749179504663,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a12a6976-752d-43fe-b2c5-8f6af66895eb","data":{"air_transfer_enable":false},"need_reply":1,"tid":"71d19ad1-9fef-498e-9cd6-39faca8ef6ce","timestamp":1749179504865,"gateway":"8UUXN4P00A06NK"} + +{"bid":"11c3f0f8-5977-409f-b302-2cf82fec4b0c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"657daf38-1a3d-4ba3-b7bc-bbe5e4a64535","timestamp":1749179505211,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cc4adc62-7fb7-4c22-bf9e-ed6318f76b2b","data":{"firmware_version":"13.01.0002"},"tid":"60d2a6c7-abd0-45a8-a553-4e9d2030e4ff","timestamp":1749179505218,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ec1a57e6-7ffa-40b2-a356-fbbe50aa80a6","bid":"0d9f5d14-a3b3-42ea-9564-53e656536063","timestamp":1749179505296,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"990dc03f-2707-4b90-943c-e8a399afe4df","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"36900e79-8300-4c8a-b636-2edb4d0c3f88","timestamp":1749179505660,"gateway":"8UUXN4P00A06NK"} + +{"bid":"074fd12c-4652-4c54-af1f-3322a619f5c9","data":{"dongle_infos":[]},"tid":"922248f5-339a-406e-954e-2fe9aba3fa62","timestamp":1749179505676,"gateway":"8UUXN4P00A06NK"} + +{"bid":"64661351-1783-4155-85e7-f3133c0cdb2a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"8f0b2a81-3e7a-4003-b0f6-562ff6fbfcf6","timestamp":1749179506376,"gateway":"8UUXN4P00A06NK"} + +{"bid":"11c3f0f8-5977-409f-b302-2cf82fec4b0c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"657daf38-1a3d-4ba3-b7bc-bbe5e4a64535","timestamp":1749179507376,"gateway":"8UUXN4P00A06NK"} + +{"tid":"5ed600bd-2159-42c2-9361-cdbe4df245fd","bid":"950cf351-5bd4-4a69-b6fa-6e6c5b87f502","timestamp":1749179534430,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"427b41c0-ab06-499c-9d4c-7fccbb534573","bid":"5da16596-4a4e-4293-9f0e-644a911ee944","timestamp":1749179534438,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"7a5872f6-799e-4b08-9e28-df11b4673411","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f7fce6e0-32be-4321-81da-5e71fcfc8f70","timestamp":1749179535794,"gateway":"8UUXN4P00A06NK"} + +{"bid":"51689d03-b7a4-4a2e-b7f1-431b3a52376b","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f4b3db44-4008-4576-b4ed-15f6e639355f","timestamp":1749179535978,"gateway":"8UUXN4P00A06NK"} + +{"bid":"96b87391-3cd3-4024-8e75-c01a3b7782c9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7283f167-201d-4c7f-97a6-e2093f04a1ff","timestamp":1749179536175,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7fc857f0-56aa-4ec9-ad13-c5d20a3f4fc0","data":{"dongle_infos":[]},"tid":"f07eec56-56ac-49f1-8080-0dbf70cab4b8","timestamp":1749179536182,"gateway":"8UUXN4P00A06NK"} + +{"bid":"20958238-483f-46da-936c-08ce316e8d95","data":{"firmware_version":"13.01.0002"},"tid":"5df7df62-2668-45e5-99ba-04df3bc6399e","timestamp":1749179536189,"gateway":"8UUXN4P00A06NK"} + +{"tid":"4f2a282a-9c54-4b61-b79a-06fecabfe9a4","bid":"9aedd555-283f-4301-b7d4-1e7ad4dac9a2","timestamp":1749179536562,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"056398c8-308d-4514-bbc5-5681581b48a1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"27c47d31-4b53-4143-a3e8-2f2d825a2f4e","timestamp":1749179537134,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e2f0a2ba-722b-4830-94bc-342d02327abf","data":{"dongle_infos":[]},"tid":"f3f86b57-c940-4d28-8ccf-a15bdf7b46a7","timestamp":1749179537185,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7a5872f6-799e-4b08-9e28-df11b4673411","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f7fce6e0-32be-4321-81da-5e71fcfc8f70","timestamp":1749179537864,"gateway":"8UUXN4P00A06NK"} + +{"bid":"51689d03-b7a4-4a2e-b7f1-431b3a52376b","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f4b3db44-4008-4576-b4ed-15f6e639355f","timestamp":1749179538064,"gateway":"8UUXN4P00A06NK"} + +{"bid":"056398c8-308d-4514-bbc5-5681581b48a1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"27c47d31-4b53-4143-a3e8-2f2d825a2f4e","timestamp":1749179539265,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9c355547-6277-4774-8c16-00333273e1ae","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c3e8599a-155c-41a2-b76e-aaef7044833d","timestamp":1749179539429,"gateway":"8UUXN4P00A06NK"} + +{"bid":"96b87391-3cd3-4024-8e75-c01a3b7782c9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7283f167-201d-4c7f-97a6-e2093f04a1ff","timestamp":1749179540374,"gateway":"8UUXN4P00A06NK"} + +{"bid":"acce9424-d58d-444c-999b-5f3a99d2cfd2","data":{"dongle_infos":[]},"tid":"e26568bc-053f-4eaa-99e0-5692c675c4ab","timestamp":1749179540492,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f392e280-c29b-4ddf-951f-0ec0fbae2a58","data":{"departure_trajectory":[]},"tid":"acbb7509-990d-4949-9868-d5dd2e89a626","timestamp":1749179541159,"gateway":"8UUXN4P00A06NK"} + +{"bid":"55e1245e-9528-45df-926c-0fc64f96d4f7","data":{"departure_trajectory":[]},"tid":"0dffe495-3aec-41b0-9632-7601344fc534","timestamp":1749179541178,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9c355547-6277-4774-8c16-00333273e1ae","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c3e8599a-155c-41a2-b76e-aaef7044833d","timestamp":1749179541464,"gateway":"8UUXN4P00A06NK"} + +{"bid":"51689d03-b7a4-4a2e-b7f1-431b3a52376b","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f4b3db44-4008-4576-b4ed-15f6e639355f","timestamp":1749179542264,"gateway":"8UUXN4P00A06NK"} + +{"bid":"056398c8-308d-4514-bbc5-5681581b48a1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"27c47d31-4b53-4143-a3e8-2f2d825a2f4e","timestamp":1749179543464,"gateway":"8UUXN4P00A06NK"} + +{"bid":"89290e03-b7a9-4b50-b025-b69f99da9d02","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4ffc2bc8-ca9c-437b-979c-acd864918e43","timestamp":1749179544429,"gateway":"8UUXN4P00A06NK"} + +{"bid":"89290e03-b7a9-4b50-b025-b69f99da9d02","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4ffc2bc8-ca9c-437b-979c-acd864918e43","timestamp":1749179546464,"gateway":"8UUXN4P00A06NK"} + +{"tid":"0726d243-fa1e-4c34-85f8-e5af78dfe95b","bid":"b69a056d-1668-4f2f-847c-583826eb5455","timestamp":1749179573307,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"698f89b4-a13f-44dc-9bce-c0f779592816","bid":"d7cf84c5-9334-4b98-abfd-c6fc3dceb702","timestamp":1749179573310,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"9dc9706e-e808-499e-be6a-109c51586d74","data":{"mobility_status_notify":0},"need_reply":1,"tid":"410639a8-f8aa-42e4-a1ac-d8927c52e7ae","timestamp":1749179574420,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e3ffb696-27c0-4b5f-a94c-8e2edf965885","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"10cb160f-c81e-470c-be2b-acff61b3260f","timestamp":1749179574433,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3049edbe-6bd2-458f-bc1b-68340d801b5a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e0f69371-10e3-4821-89d5-db0927d0f66e","timestamp":1749179574724,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a9bdd154-d18f-44c0-b34c-25949268da3a","data":{"dongle_infos":[]},"tid":"49889e0d-6ca7-4c9c-b0b4-dfb5dd1d8a84","timestamp":1749179574730,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bef16161-2c88-4e3f-b0c5-5dd68ea006df","data":{"firmware_version":"13.01.0002"},"tid":"11cde83f-78b7-4d06-bcad-36c9beac607f","timestamp":1749179574738,"gateway":"8UUXN4P00A06NK"} + +{"tid":"367abff8-6455-4a18-8b5d-25880a405759","bid":"0101d7ca-a683-41f0-91df-7c90a58bbbb6","timestamp":1749179575118,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f16d8205-5f20-424c-9729-96b3ad3210b2","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a59bb3ce-afe5-4b97-ac16-dc9677550006","timestamp":1749179575592,"gateway":"8UUXN4P00A06NK"} + +{"bid":"10804d94-5e96-4954-911b-81f13cbe6f3c","data":{"dongle_infos":[]},"tid":"01e5da45-4983-445e-8a5c-affb1da925cd","timestamp":1749179575730,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9dc9706e-e808-499e-be6a-109c51586d74","data":{"mobility_status_notify":0},"need_reply":1,"tid":"410639a8-f8aa-42e4-a1ac-d8927c52e7ae","timestamp":1749179576457,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e3ffb696-27c0-4b5f-a94c-8e2edf965885","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"10cb160f-c81e-470c-be2b-acff61b3260f","timestamp":1749179576458,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f16d8205-5f20-424c-9729-96b3ad3210b2","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a59bb3ce-afe5-4b97-ac16-dc9677550006","timestamp":1749179577657,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2de196ba-54ee-4f0e-8a15-1ee688dfc0fe","data":{"dongle_infos":[]},"tid":"8bcd7119-a1a5-40cc-ae01-8dc4592b9fc7","timestamp":1749179578182,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3918162e-ebe6-4a49-9e21-20b06402db72","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6f9b47e9-9832-4fdf-8d80-693ab579d2c9","timestamp":1749179578308,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3049edbe-6bd2-458f-bc1b-68340d801b5a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e0f69371-10e3-4821-89d5-db0927d0f66e","timestamp":1749179578921,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c618662b-6631-4fb7-b988-8e98c7acf3b1","data":{"departure_trajectory":[]},"tid":"29531c2e-75c5-4144-ad77-9c0bd2f3e053","timestamp":1749179579724,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8b82f969-7c22-4871-9695-4bbf3f775f3d","data":{"departure_trajectory":[]},"tid":"011ae3bc-6db0-474d-bdb1-1b283f2aa687","timestamp":1749179579932,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3918162e-ebe6-4a49-9e21-20b06402db72","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6f9b47e9-9832-4fdf-8d80-693ab579d2c9","timestamp":1749179580460,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9dc9706e-e808-499e-be6a-109c51586d74","data":{"mobility_status_notify":0},"need_reply":1,"tid":"410639a8-f8aa-42e4-a1ac-d8927c52e7ae","timestamp":1749179580659,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f16d8205-5f20-424c-9729-96b3ad3210b2","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a59bb3ce-afe5-4b97-ac16-dc9677550006","timestamp":1749179581858,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a3c4afd2-0e3c-418b-a51d-f822ee1ff217","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"82c7b38a-8d65-46df-856b-4f8ce069d781","timestamp":1749179583309,"gateway":"8UUXN4P00A06NK"} + +{"tid":"4af8cf87-87aa-481c-ad3a-3ce8a4f7c4e7","bid":"72365efc-8ab1-4feb-b20f-18fef6b6381f","timestamp":1749179611620,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"667fd7ad-c094-465c-98fc-39b0411dee19","bid":"466f4b07-58aa-4764-8854-2f9ecc736fed","timestamp":1749179611624,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"4ed7def7-4d63-486f-8404-ebf4750eb366","data":{"mobility_status_notify":0},"need_reply":1,"tid":"eda86d32-6936-485b-8808-15cae78b4881","timestamp":1749179612873,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9d23e213-0448-423c-98a8-78577e852693","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"efb0619d-a8ca-4cdf-b1e1-4f8947b9cb0c","timestamp":1749179612895,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c5d33f83-58f0-4ecc-bd7c-d7220dcce670","data":{"dongle_infos":[]},"tid":"84bcffea-ce31-4c87-b546-68c73f99191f","timestamp":1749179613286,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e6cb0b17-b078-492f-b4bb-ef8b5714c60d","data":{"firmware_version":"13.01.0002"},"tid":"3adbb60d-f365-4d7b-b449-74d92ab7afb1","timestamp":1749179613293,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ed21217d-43d1-4a1c-abde-a615c936c194","bid":"08c3d96c-9635-4fd5-a039-4c241b87ce9a","timestamp":1749179613370,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"a91b0f1c-7020-4195-a10f-74a428952271","data":{"air_transfer_enable":false},"need_reply":1,"tid":"f755a002-16bc-4655-b29d-ff281f37b1db","timestamp":1749179613458,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1bd818e0-ee7d-4965-8c06-9c19dd6cafdc","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"dc73e4b0-cb8b-4553-b6ed-b3a7969e467f","timestamp":1749179614000,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f03ed22f-d1aa-4647-95d4-33a83b6fed7f","data":{"dongle_infos":[]},"tid":"1e7ca40a-0a96-4287-89b8-21dc1fc59cbc","timestamp":1749179614280,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4ed7def7-4d63-486f-8404-ebf4750eb366","data":{"mobility_status_notify":0},"need_reply":1,"tid":"eda86d32-6936-485b-8808-15cae78b4881","timestamp":1749179614899,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9d23e213-0448-423c-98a8-78577e852693","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"efb0619d-a8ca-4cdf-b1e1-4f8947b9cb0c","timestamp":1749179614900,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1bd818e0-ee7d-4965-8c06-9c19dd6cafdc","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"dc73e4b0-cb8b-4553-b6ed-b3a7969e467f","timestamp":1749179616099,"gateway":"8UUXN4P00A06NK"} + +{"bid":"34e3a9ba-c366-4e86-9ab7-8467bb2c3038","data":{"dongle_infos":[]},"tid":"884088a4-2760-49a6-b144-7695ac91a82a","timestamp":1749179616543,"gateway":"8UUXN4P00A06NK"} + +{"bid":"90582756-4362-451c-810b-1f0e160b32b7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"47c3b476-ccb4-474d-9d70-4a3e978acb20","timestamp":1749179616621,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a91b0f1c-7020-4195-a10f-74a428952271","data":{"air_transfer_enable":false},"need_reply":1,"tid":"f755a002-16bc-4655-b29d-ff281f37b1db","timestamp":1749179617650,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c5d413a4-6768-4033-9753-82c8eebdfb21","data":{"departure_trajectory":[]},"tid":"58abfced-aa68-45af-bcdb-a9b8cebb932c","timestamp":1749179618223,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fe9fc02a-bbb2-4e18-aff0-c4051e70d849","data":{"departure_trajectory":[]},"tid":"59c981d1-ffdf-4b45-9704-d8e314da6351","timestamp":1749179618257,"gateway":"8UUXN4P00A06NK"} + +{"bid":"90582756-4362-451c-810b-1f0e160b32b7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"47c3b476-ccb4-474d-9d70-4a3e978acb20","timestamp":1749179618698,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4ed7def7-4d63-486f-8404-ebf4750eb366","data":{"mobility_status_notify":0},"need_reply":1,"tid":"eda86d32-6936-485b-8808-15cae78b4881","timestamp":1749179619098,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1bd818e0-ee7d-4965-8c06-9c19dd6cafdc","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"dc73e4b0-cb8b-4553-b6ed-b3a7969e467f","timestamp":1749179620299,"gateway":"8UUXN4P00A06NK"} + +{"bid":"82d68abb-215e-4f5c-9e3a-dc33f8a7ceb5","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"97b91442-3bbd-4b65-95bc-2dba6e7fbb51","timestamp":1749179621621,"gateway":"8UUXN4P00A06NK"} + +{"tid":"a042bf7e-6be7-40b2-b969-844e703cf9b6","bid":"be5af250-12bd-4eff-9f0b-63a4332c0b8e","timestamp":1749179650949,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"738be69a-65ed-441e-83ef-ed1e44fbb17c","bid":"8113a0f2-d749-4bae-aec5-3065f61fdcc6","timestamp":1749179650951,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"e79080f7-b13d-4fd9-ab7a-f37c57130c25","data":{"mobility_status_notify":0},"need_reply":1,"tid":"bf0e917a-5f8b-4bdf-98f8-3d9e4b505da1","timestamp":1749179651877,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fb306993-3b6a-4a9c-bced-dd0f9dca0273","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"454cec4a-e333-4c87-8969-9b996269ef56","timestamp":1749179651903,"gateway":"8UUXN4P00A06NK"} + +{"bid":"804bacf0-5d89-4ad4-a766-ca2e5d4d3909","data":{"air_transfer_enable":false},"need_reply":1,"tid":"fdd3eb95-61e2-491f-b78d-53e6aa735096","timestamp":1749179652280,"gateway":"8UUXN4P00A06NK"} + +{"bid":"637f1eaf-9003-484a-a34b-55f510b2b276","data":{"dongle_infos":[]},"tid":"330cff55-8a4a-4091-aee7-43786e9db70a","timestamp":1749179652284,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d92ddb5e-159f-4288-97d1-ec196c2b2eb8","data":{"firmware_version":"13.01.0002"},"tid":"a3d98504-7993-480e-bf66-813a9ce3d336","timestamp":1749179652293,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c08b0491-5791-48e1-9888-1edfa5d7e3bb","bid":"e1accdd6-df65-4edc-a4e3-27c8bee0e7b5","timestamp":1749179652506,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"78fdec72-684e-464a-9f2a-ad8f480130cd","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ceae8526-23ea-4323-bd2e-dc0c1abdf66a","timestamp":1749179653013,"gateway":"8UUXN4P00A06NK"} + +{"bid":"43218b3e-3ced-4dc1-a01b-80e3ccecf61c","data":{"dongle_infos":[]},"tid":"0fa5544f-02eb-4d16-80dd-95bc25cb02e1","timestamp":1749179653293,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e79080f7-b13d-4fd9-ab7a-f37c57130c25","data":{"mobility_status_notify":0},"need_reply":1,"tid":"bf0e917a-5f8b-4bdf-98f8-3d9e4b505da1","timestamp":1749179653987,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fb306993-3b6a-4a9c-bced-dd0f9dca0273","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"454cec4a-e333-4c87-8969-9b996269ef56","timestamp":1749179653988,"gateway":"8UUXN4P00A06NK"} + +{"bid":"78fdec72-684e-464a-9f2a-ad8f480130cd","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ceae8526-23ea-4323-bd2e-dc0c1abdf66a","timestamp":1749179655187,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cd14d60f-ef7e-46f7-83b1-9b37509014e1","data":{"dongle_infos":[]},"tid":"9fe005be-dc9a-4fee-957c-43a488ec6a3a","timestamp":1749179655532,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a60b0411-7a70-48ba-8154-7edffae08df7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"09fc0b3a-7929-4c46-bd03-1f1be19e90e6","timestamp":1749179655951,"gateway":"8UUXN4P00A06NK"} + +{"bid":"804bacf0-5d89-4ad4-a766-ca2e5d4d3909","data":{"air_transfer_enable":false},"need_reply":1,"tid":"fdd3eb95-61e2-491f-b78d-53e6aa735096","timestamp":1749179656478,"gateway":"8UUXN4P00A06NK"} + +{"bid":"52b8c222-bca7-421d-80b0-2629c3a4f5a2","data":{"departure_trajectory":[]},"tid":"9e9f048c-b4d6-48a5-8476-eac382494ea5","timestamp":1749179657278,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9c7c65d6-a9a5-4b3e-945d-180a8c1f24b7","data":{"departure_trajectory":[]},"tid":"d02e1e7b-85f1-4327-8bbc-845f40786606","timestamp":1749179657649,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a60b0411-7a70-48ba-8154-7edffae08df7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"09fc0b3a-7929-4c46-bd03-1f1be19e90e6","timestamp":1749179657987,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e79080f7-b13d-4fd9-ab7a-f37c57130c25","data":{"mobility_status_notify":0},"need_reply":1,"tid":"bf0e917a-5f8b-4bdf-98f8-3d9e4b505da1","timestamp":1749179658186,"gateway":"8UUXN4P00A06NK"} + +{"bid":"78fdec72-684e-464a-9f2a-ad8f480130cd","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ceae8526-23ea-4323-bd2e-dc0c1abdf66a","timestamp":1749179659387,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8cb7eec6-40d1-4709-a0a5-888ab3733c2e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8acba08a-f4a9-4f2c-b819-8d44ac958c51","timestamp":1749179660950,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8cb7eec6-40d1-4709-a0a5-888ab3733c2e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8acba08a-f4a9-4f2c-b819-8d44ac958c51","timestamp":1749179662988,"gateway":"8UUXN4P00A06NK"} + +{"tid":"4ae9099a-8c13-45c9-a5db-fc814e97192f","bid":"79dc1c99-5d28-4740-8a08-a90bd3a69e5c","timestamp":1749179687525,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"b779cbca-1943-405c-ada1-cae374aba939","bid":"038468cb-c591-41cd-8c66-d5633836db11","timestamp":1749179687528,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"0b5612d9-9042-4f48-bc36-a2158b8e5465","data":{"air_transfer_enable":false},"need_reply":1,"tid":"740d8c79-6aed-4eb5-8d9f-b7175cc8f3ac","timestamp":1749179689264,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8d69af83-57ad-463d-a63f-c5205eb37e9e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"cc45ac4e-a6cc-433e-8ab0-4efd90f469ba","timestamp":1749179691289,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e66d9674-8cce-4459-8249-c1e3daffa65d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4ccc6f18-223d-4341-a372-179e91a05111","timestamp":1749179691291,"gateway":"8UUXN4P00A06NK"} + +{"tid":"0c9783e4-2a74-41cc-8d04-bd4ffcdce2ea","bid":"a20ce3d3-7b09-45f7-8a6f-fec0447145ab","timestamp":1749179691778,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"d1f36b5c-e73b-4c16-bd0a-362b357b98f5","data":{"dongle_infos":[]},"tid":"68db935b-8a4c-43f1-9c52-71ea01ebb59f","timestamp":1749179691786,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f614e5b8-52a5-4187-9fd7-0648af3f0eb5","data":{"firmware_version":"13.01.0002"},"tid":"a6153619-bfca-47d5-9610-d93ac2f0ac4a","timestamp":1749179691793,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0b5612d9-9042-4f48-bc36-a2158b8e5465","data":{"air_transfer_enable":false},"need_reply":1,"tid":"740d8c79-6aed-4eb5-8d9f-b7175cc8f3ac","timestamp":1749179691980,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d9f2f5c1-f9e1-4a6b-a1ec-9d666d800f5c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"d7b4304f-a5aa-4d32-93a4-402aa11a4670","timestamp":1749179692383,"gateway":"8UUXN4P00A06NK"} + +{"bid":"702139c2-648f-4a66-b2a8-1312f73c4958","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"990ae963-010b-4539-9471-b3b640fcefb1","timestamp":1749179692537,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a3d02c20-1a0f-4ddb-8859-536234afe887","data":{"dongle_infos":[]},"tid":"57aac302-9c3f-4dd1-a5c5-2ab80d1cdef9","timestamp":1749179692805,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8d69af83-57ad-463d-a63f-c5205eb37e9e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"cc45ac4e-a6cc-433e-8ab0-4efd90f469ba","timestamp":1749179693339,"gateway":"8UUXN4P00A06NK"} + +{"tid":"afc9aac5-34e4-4e98-b18a-3bf9d18a50ab","bid":"6ab3a28c-a922-4b59-807f-14796f8627aa","timestamp":1749179721318,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"ce9e1f6c-f35a-4e66-a1db-f2ea355593e8","bid":"2c31b2eb-9cd8-4594-8010-db3e895cf883","timestamp":1749179721322,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"e8fd8d7a-5ef3-4d43-98a1-552cfbc38dba","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ef6c867c-bdeb-4901-854c-252b968e05cd","timestamp":1749179723027,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8fce9888-351a-410e-82d9-ba969267a8e2","data":{"mobility_status_notify":0},"need_reply":1,"tid":"b581a7db-d2d1-4063-9f63-2155e22ee816","timestamp":1749179723047,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1bf4b8b3-c76c-429b-b4e5-eee25757fb38","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5b928442-2a0e-4edf-b501-49adea992668","timestamp":1749179723049,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2b501fca-a109-4b4e-b8be-3659a5f94e35","data":{"air_transfer_enable":false},"need_reply":1,"tid":"07e7838e-f67a-494e-91f2-cbd8f0602f20","timestamp":1749179723113,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ec3687d2-7df8-458a-91b2-b0b421afebc3","data":{"dongle_infos":[]},"tid":"9d2d4194-e72e-4fa2-a7fa-d0fa0ad511f6","timestamp":1749179723119,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8340d4f8-418c-40e7-928b-75ba81800ffb","data":{"firmware_version":"13.01.0002"},"tid":"b7f22840-aaf8-40e0-bf53-e82b12b3773c","timestamp":1749179723125,"gateway":"8UUXN4P00A06NK"} + +{"tid":"460591fd-ea07-48fc-8d7a-dfd87f9ca557","bid":"7fea8a42-2724-40b4-9f8f-2de335dd7230","timestamp":1749179723446,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"3f778bf9-0e4e-491a-9b4e-847fc00f21a0","data":{"dongle_infos":[]},"tid":"a46cc5ab-3419-49cd-8845-6cb349ae3022","timestamp":1749179724164,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e8fd8d7a-5ef3-4d43-98a1-552cfbc38dba","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ef6c867c-bdeb-4901-854c-252b968e05cd","timestamp":1749179725077,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8fce9888-351a-410e-82d9-ba969267a8e2","data":{"mobility_status_notify":0},"need_reply":1,"tid":"b581a7db-d2d1-4063-9f63-2155e22ee816","timestamp":1749179725078,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1bf4b8b3-c76c-429b-b4e5-eee25757fb38","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5b928442-2a0e-4edf-b501-49adea992668","timestamp":1749179725078,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6793e23c-1e78-4b8c-b4cd-277036c339d8","data":{"dongle_infos":[]},"tid":"f0e788a2-08c8-4fa4-8fc3-95f0ebe240a8","timestamp":1749179726210,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ad99959e-ffc2-4dfe-aa8c-bdabe69842bc","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"271000b7-80a9-4a0a-af87-fb0f37f98dbc","timestamp":1749179726319,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2b501fca-a109-4b4e-b8be-3659a5f94e35","data":{"air_transfer_enable":false},"need_reply":1,"tid":"07e7838e-f67a-494e-91f2-cbd8f0602f20","timestamp":1749179727313,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cb5128ac-cba6-4319-857d-7a5c1b17be94","data":{"departure_trajectory":[]},"tid":"d8874c5f-b74a-42e8-83c5-97d73aef0d95","timestamp":1749179727970,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0ffc99b0-05c3-461e-b6d0-b4b12167cff7","data":{"departure_trajectory":[]},"tid":"b5cefd9d-7680-4f66-8688-1b30a0b314fe","timestamp":1749179728108,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ad99959e-ffc2-4dfe-aa8c-bdabe69842bc","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"271000b7-80a9-4a0a-af87-fb0f37f98dbc","timestamp":1749179728477,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e8fd8d7a-5ef3-4d43-98a1-552cfbc38dba","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ef6c867c-bdeb-4901-854c-252b968e05cd","timestamp":1749179729276,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8fce9888-351a-410e-82d9-ba969267a8e2","data":{"mobility_status_notify":0},"need_reply":1,"tid":"b581a7db-d2d1-4063-9f63-2155e22ee816","timestamp":1749179729277,"gateway":"8UUXN4P00A06NK"} + +{"bid":"13982df6-3ada-4115-a6f2-6a92811c4772","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1ae227c4-d5b4-4492-852b-30f8f56fa6e4","timestamp":1749179731319,"gateway":"8UUXN4P00A06NK"} + +{"tid":"80123855-13cd-4cc6-a3f3-7a939a6c02de","bid":"b01b3e25-ed9c-47ab-b071-126b2b713c41","timestamp":1749179760092,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"1fb8020b-e362-4a1f-a55f-7ca5bbcae5f6","bid":"b907a7ba-66ce-4a1a-b76b-010425e568b7","timestamp":1749179760095,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"de87a977-8019-4aef-b6eb-58e7e724a572","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"76f47d61-3d98-4fdb-818a-94b6894ae0ff","timestamp":1749179760824,"gateway":"8UUXN4P00A06NK"} + +{"bid":"208df68b-d521-44a7-835a-ace3ec6fa8de","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e4bfb9f5-edc9-4911-8769-802c173c3e2e","timestamp":1749179761392,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f3c51b7f-485d-46c8-b4e0-7205c6e9e306","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1b675391-fd23-4401-94cf-8fd13d334d0b","timestamp":1749179761403,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6cd2cc0e-7960-4206-99f6-a4908b3837dd","data":{"dongle_infos":[]},"tid":"9a1d82fb-5a73-4152-9083-ee7defb596e9","timestamp":1749179761528,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ee46b550-400b-440f-8dd8-a3dde0e9cf36","data":{"firmware_version":"13.01.0002"},"tid":"f66e4a1f-6ee5-40e9-8344-9cd32f56c28f","timestamp":1749179761555,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7ae6ed6e-3955-4b67-a47a-989e467fa879","data":{"air_transfer_enable":false},"need_reply":1,"tid":"fca77422-3e23-4394-a1ae-4cea1663c280","timestamp":1749179761729,"gateway":"8UUXN4P00A06NK"} + +{"tid":"7bf783ad-766f-4f58-83ba-81b62d704e3f","bid":"9f464378-abc8-4cb8-93fc-399f39e35d95","timestamp":1749179761888,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"b58b901a-8a5f-45e7-9557-9ad4de791acf","data":{"dongle_infos":[]},"tid":"8f16de51-4264-4eb3-934a-378cbbab5897","timestamp":1749179762558,"gateway":"8UUXN4P00A06NK"} + +{"bid":"de87a977-8019-4aef-b6eb-58e7e724a572","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"76f47d61-3d98-4fdb-818a-94b6894ae0ff","timestamp":1749179762992,"gateway":"8UUXN4P00A06NK"} + +{"bid":"208df68b-d521-44a7-835a-ace3ec6fa8de","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e4bfb9f5-edc9-4911-8769-802c173c3e2e","timestamp":1749179763593,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f3c51b7f-485d-46c8-b4e0-7205c6e9e306","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1b675391-fd23-4401-94cf-8fd13d334d0b","timestamp":1749179763594,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e495a33d-93b4-440a-aa6a-4eeae7ace8ae","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b6e44392-a44b-4f53-a64c-d29c6d87f322","timestamp":1749179765096,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eaf1768f-063a-4c31-ab85-aa258f0f5678","data":{"dongle_infos":[]},"tid":"10147cce-e678-4e06-99ee-ddb4af7979b7","timestamp":1749179765138,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7ae6ed6e-3955-4b67-a47a-989e467fa879","data":{"air_transfer_enable":false},"need_reply":1,"tid":"fca77422-3e23-4394-a1ae-4cea1663c280","timestamp":1749179765930,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6d601b9a-600a-416c-941c-2028dc32da19","data":{"departure_trajectory":[]},"tid":"9bfe8c07-c38b-4384-a046-19bf87768980","timestamp":1749179766524,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3ba76644-660f-47d6-9eb6-dc88993b255e","data":{"departure_trajectory":[]},"tid":"1dea68a0-44b7-40c8-9da3-b01c1574afd7","timestamp":1749179766805,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e495a33d-93b4-440a-aa6a-4eeae7ace8ae","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b6e44392-a44b-4f53-a64c-d29c6d87f322","timestamp":1749179767194,"gateway":"8UUXN4P00A06NK"} + +{"bid":"208df68b-d521-44a7-835a-ace3ec6fa8de","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e4bfb9f5-edc9-4911-8769-802c173c3e2e","timestamp":1749179767793,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f3c51b7f-485d-46c8-b4e0-7205c6e9e306","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1b675391-fd23-4401-94cf-8fd13d334d0b","timestamp":1749179767794,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1cee9ca0-2e64-4a53-9a49-5b2a35ee754f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4b44aaf5-9b83-4157-8a2b-7b27168c1df4","timestamp":1749179770096,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1cee9ca0-2e64-4a53-9a49-5b2a35ee754f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4b44aaf5-9b83-4157-8a2b-7b27168c1df4","timestamp":1749179772195,"gateway":"8UUXN4P00A06NK"} + +{"tid":"dcaabf53-2146-42ae-8414-43b1fe8db9a7","bid":"bc0e940d-8e35-4c55-aac8-8f9f33a2ae40","timestamp":1749179797908,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"dc9e0899-a803-42d1-b883-793c025c27d8","bid":"d25abfb7-4c6f-44f9-8c21-9e5ec28a2037","timestamp":1749179797914,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"171a659f-9463-4c7d-87b3-b41b1257dc76","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"889b6431-7b9c-4322-bbeb-f4a789a17f29","timestamp":1749179798915,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0539ad44-7ad4-490b-bdb0-2709c602b2ca","data":{"air_transfer_enable":false},"need_reply":1,"tid":"6b762c31-3557-4976-8068-c586d994e4fc","timestamp":1749179799500,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7d2c2fe5-0780-49b9-af29-c3cfc886b948","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a0d2973a-ea1c-49a2-a722-1992b3b5c02b","timestamp":1749179799564,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cb68b531-48a3-4e10-a74d-1ecdd4aac8c3","data":{"mobility_status_notify":0},"need_reply":1,"tid":"fa87ec1f-05e5-4af5-b096-856721825217","timestamp":1749179799577,"gateway":"8UUXN4P00A06NK"} + +{"bid":"212cf20f-7c8e-4ce3-801f-aae5a7c11d44","data":{"dongle_infos":[]},"tid":"9a715ae6-660c-461b-804f-87cfc9ea7364","timestamp":1749179799585,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8c2a741a-74e7-4191-a840-e2a114710746","data":{"firmware_version":"13.01.0002"},"tid":"664a3733-5e3b-49ff-b5d9-9dad54f98a57","timestamp":1749179799631,"gateway":"8UUXN4P00A06NK"} + +{"tid":"f6890ffc-6f67-4a72-b0c0-e66df0f0f758","bid":"0638a092-b8d8-4eec-aa52-d33f34c86df4","timestamp":1749179799931,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"932f3cd8-746b-4da9-87b8-f365109c5fab","data":{"dongle_infos":[]},"tid":"b8528fee-885c-4578-a46a-d49dee80d667","timestamp":1749179800579,"gateway":"8UUXN4P00A06NK"} + +{"bid":"171a659f-9463-4c7d-87b3-b41b1257dc76","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"889b6431-7b9c-4322-bbeb-f4a789a17f29","timestamp":1749179801003,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7d2c2fe5-0780-49b9-af29-c3cfc886b948","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a0d2973a-ea1c-49a2-a722-1992b3b5c02b","timestamp":1749179801602,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cb68b531-48a3-4e10-a74d-1ecdd4aac8c3","data":{"mobility_status_notify":0},"need_reply":1,"tid":"fa87ec1f-05e5-4af5-b096-856721825217","timestamp":1749179801602,"gateway":"8UUXN4P00A06NK"} + +{"bid":"38330c41-7098-4021-abe4-ea7cb1028d02","data":{"dongle_infos":[]},"tid":"7dd95501-02a5-4242-8e37-c31f763a8c92","timestamp":1749179802803,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b4b816a7-05e3-41f4-935d-b93b1940613c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5b81446f-b07c-407f-98de-d6799bcf050a","timestamp":1749179802912,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0539ad44-7ad4-490b-bdb0-2709c602b2ca","data":{"air_transfer_enable":false},"need_reply":1,"tid":"6b762c31-3557-4976-8068-c586d994e4fc","timestamp":1749179803700,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d1e6d10a-e980-44a1-9e28-67de3868d71f","data":{"departure_trajectory":[]},"tid":"1a509314-1d0a-4176-8345-e7f11431b7d8","timestamp":1749179804480,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ff48db8e-9b70-4641-9a45-2f870745e3ab","data":{"departure_trajectory":[]},"tid":"ca79903d-838e-47ae-8c85-7a581dd38be0","timestamp":1749179804570,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b4b816a7-05e3-41f4-935d-b93b1940613c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5b81446f-b07c-407f-98de-d6799bcf050a","timestamp":1749179804999,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7d2c2fe5-0780-49b9-af29-c3cfc886b948","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a0d2973a-ea1c-49a2-a722-1992b3b5c02b","timestamp":1749179805804,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cb68b531-48a3-4e10-a74d-1ecdd4aac8c3","data":{"mobility_status_notify":0},"need_reply":1,"tid":"fa87ec1f-05e5-4af5-b096-856721825217","timestamp":1749179805805,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d69471c2-7f17-4a64-add5-1860bf117661","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ca488932-f001-4cb7-9191-2dc0624a6ad1","timestamp":1749179807911,"gateway":"8UUXN4P00A06NK"} + +{"tid":"601086b0-18dd-4ebb-a452-951be2e74ba6","bid":"bc824756-37f0-4c56-9d44-f03551e5c10a","timestamp":1749179833832,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"ec6f96d0-71ad-4f39-8a7d-1aac8556b38e","bid":"d79ccdf2-722b-4694-b0fc-ed30d1ef882b","timestamp":1749179833844,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"644137dc-5b86-440b-b477-48caa9bc8549","data":{"air_transfer_enable":false},"need_reply":1,"tid":"a7ad8134-bc28-47de-8a99-1a9e1198764b","timestamp":1749179836008,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9d64ccaa-f942-4646-842d-dc8f51a45102","data":{"mobility_status_notify":0},"need_reply":1,"tid":"9c0a202e-4f62-4271-bb9d-08b8cd9ba843","timestamp":1749179837956,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8ded1d2c-3c78-47e9-94ed-225cf3f28ab7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e95b8721-ee95-4f70-9b48-366e5b1036f8","timestamp":1749179837961,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6a185625-af5f-45c8-b31e-664c9f4adddf","data":{"dongle_infos":[]},"tid":"5b41f615-e23a-42ef-a179-a3f309d50457","timestamp":1749179838407,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a0cc3568-c8b9-4249-804e-bd5fbfd661ba","data":{"firmware_version":"13.01.0002"},"tid":"597822a8-52c7-4ce2-8158-2fbadd9db05b","timestamp":1749179838417,"gateway":"8UUXN4P00A06NK"} + +{"bid":"644137dc-5b86-440b-b477-48caa9bc8549","data":{"air_transfer_enable":false},"need_reply":1,"tid":"a7ad8134-bc28-47de-8a99-1a9e1198764b","timestamp":1749179838601,"gateway":"8UUXN4P00A06NK"} + +{"tid":"25cac546-fe1f-4899-85e7-19a6caf6fc4f","bid":"1b3d4ba8-e1ee-43af-95db-a733d5839dda","timestamp":1749179838729,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"a3868b5c-53cd-4d9b-aa1a-1bd66de6fecf","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0af9ef9c-e108-41da-9d50-e36aae630f82","timestamp":1749179838851,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b7f6abd6-5f6a-4e5b-a0bb-9e5d22ae2352","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"d818e02a-be6f-496e-9b71-f3aed60b3ea1","timestamp":1749179839054,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8a6e951d-dd2a-4d45-836d-07070156cd9d","data":{"dongle_infos":[]},"tid":"e10ca4eb-602a-4183-9a1f-77455d2afef8","timestamp":1749179839427,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9d64ccaa-f942-4646-842d-dc8f51a45102","data":{"mobility_status_notify":0},"need_reply":1,"tid":"9c0a202e-4f62-4271-bb9d-08b8cd9ba843","timestamp":1749179840089,"gateway":"8UUXN4P00A06NK"} + +{"tid":"24848e06-d306-4ac4-a6e9-1e6fa156ded1","bid":"539c2246-94ab-44e8-92f0-9ceadc1f8ea1","timestamp":1749179866966,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"2c0ea9b6-11c4-433b-b7f5-286f4b004d7b","bid":"39554df6-6ea4-464c-adfb-90bbe2f1335c","timestamp":1749179866969,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"50c68a0c-eec7-44f3-9cb3-6f42d85b37e4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"849e3848-5189-4ec3-8fef-e928c6443791","timestamp":1749179867672,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7fe482f0-cc00-4979-8f70-5e0f725c0ebb","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e55ac6c4-2112-4480-a3f2-c203b5e617db","timestamp":1749179868407,"gateway":"8UUXN4P00A06NK"} + +{"bid":"62e8f095-32d2-4f98-8109-3bc37eaf410c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"25a93418-2785-45c4-83b5-aabc69ee37df","timestamp":1749179868509,"gateway":"8UUXN4P00A06NK"} + +{"bid":"66816ce9-4393-45ce-892c-dd354818cd84","data":{"mobility_status_notify":0},"need_reply":1,"tid":"183e2b67-23e5-4f8a-990a-2452fcc1e273","timestamp":1749179868520,"gateway":"8UUXN4P00A06NK"} + +{"bid":"17e8486e-20d0-416c-b2c6-73f947b0f1e7","data":{"dongle_infos":[]},"tid":"44083023-4adf-43df-bf4a-cee3218db72d","timestamp":1749179868527,"gateway":"8UUXN4P00A06NK"} + +{"bid":"619e088b-cc71-4895-902d-bdf454f7093c","data":{"firmware_version":"13.01.0002"},"tid":"346f1ce9-b5ba-4c3e-ba94-1deab85862f5","timestamp":1749179868547,"gateway":"8UUXN4P00A06NK"} + +{"tid":"3db6ebdf-8f52-4ebe-844d-22e1f742a67c","bid":"1b2aacf0-1cb7-492c-b704-4bb61e4e24b2","timestamp":1749179868603,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"tid":"5429f8e6-2921-44be-8206-140a030c705b","bid":"58c847e7-9a48-4c2f-a26b-42ae303c2384","timestamp":1749181582572,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"39d3e7ae-e798-4925-a63b-c1af0047841b","bid":"ffc29f2a-17fa-4271-8f1d-efb464fc6b48","timestamp":1749181582579,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"b3d54c68-9ce3-46f3-9e91-17c696c958a9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d810d398-9410-46e2-a3ff-00e5f9cada2c","timestamp":1749181582688,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e63909a2-8322-405a-9b48-0f5cb22f1359","data":{"mobility_status_notify":0},"need_reply":1,"tid":"75bc0b06-99f6-4032-ac13-da36e1dfb584","timestamp":1749181584681,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3c576d1c-5e85-465e-9798-64ac0d0257c4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bad6452b-45d9-4f6e-b221-729914e43586","timestamp":1749181584685,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c13fa8b3-39bb-4016-bb95-12c8dd312464","data":{"dongle_infos":[]},"tid":"238b6a06-4faf-4a27-8999-6f03ad0e6d5c","timestamp":1749181585085,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e6ea53c8-25c6-4801-b6fb-7f18c4f149a3","data":{"firmware_version":"13.01.0002"},"tid":"251e6617-4b49-4785-a2c3-93374ea1fe90","timestamp":1749181585092,"gateway":"8UUXN4P00A06NK"} + +{"tid":"4f92846e-5e6b-4c0d-b2bb-43d0ab9e9cdc","bid":"09265381-b419-4bb2-9aa0-35c041097772","timestamp":1749181585238,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"b3d54c68-9ce3-46f3-9e91-17c696c958a9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d810d398-9410-46e2-a3ff-00e5f9cada2c","timestamp":1749181585281,"gateway":"8UUXN4P00A06NK"} + +{"bid":"001d8f83-21a0-4848-9f75-8ef2759eff5d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"48ced01a-96f5-4d3e-b06f-7d778f5368ea","timestamp":1749181585772,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4cd393a4-8c98-4ac4-9cf4-55b4d7099b5d","data":{"dongle_infos":[]},"tid":"2036a552-9e57-4d2e-ba33-90311df144cf","timestamp":1749181586138,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e63909a2-8322-405a-9b48-0f5cb22f1359","data":{"mobility_status_notify":0},"need_reply":1,"tid":"75bc0b06-99f6-4032-ac13-da36e1dfb584","timestamp":1749181586801,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3c576d1c-5e85-465e-9798-64ac0d0257c4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bad6452b-45d9-4f6e-b221-729914e43586","timestamp":1749181586803,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7c2dc622-4d15-4173-9e90-16d61f6fbe0b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"40692003-aeb3-43fc-8418-66e49d4ef6c9","timestamp":1749181587576,"gateway":"8UUXN4P00A06NK"} + +{"bid":"001d8f83-21a0-4848-9f75-8ef2759eff5d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"48ced01a-96f5-4d3e-b06f-7d778f5368ea","timestamp":1749181587806,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1c499ecf-21c2-4ee4-a3ab-dda7842ea78c","data":{"dongle_infos":[]},"tid":"db3ad345-770e-4279-8db8-441f1e869daa","timestamp":1749181589315,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f4e2e9a1-89bc-4735-95b8-db6f9a84f723","data":{"departure_trajectory":[]},"tid":"c8285a4b-4361-48f5-b61c-19a440079971","timestamp":1749181589475,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b3d54c68-9ce3-46f3-9e91-17c696c958a9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d810d398-9410-46e2-a3ff-00e5f9cada2c","timestamp":1749181589484,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7c2dc622-4d15-4173-9e90-16d61f6fbe0b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"40692003-aeb3-43fc-8418-66e49d4ef6c9","timestamp":1749181589601,"gateway":"8UUXN4P00A06NK"} + +{"bid":"24f94b69-0cdb-4734-b980-a98fb5916359","data":{"departure_trajectory":[]},"tid":"16342ab6-4697-4eea-bcf3-830190744030","timestamp":1749181590083,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e63909a2-8322-405a-9b48-0f5cb22f1359","data":{"mobility_status_notify":0},"need_reply":1,"tid":"75bc0b06-99f6-4032-ac13-da36e1dfb584","timestamp":1749181591008,"gateway":"8UUXN4P00A06NK"} + +{"bid":"001d8f83-21a0-4848-9f75-8ef2759eff5d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"48ced01a-96f5-4d3e-b06f-7d778f5368ea","timestamp":1749181592007,"gateway":"8UUXN4P00A06NK"} + +{"bid":"89ef5b44-5123-47bb-8746-30d35e23d1a1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3792fd16-26fe-402f-8124-ccc842881264","timestamp":1749181592577,"gateway":"8UUXN4P00A06NK"} + +{"tid":"6d9f3319-efb9-4f39-86f6-d17e09a4640f","bid":"6fe7d85f-fe6c-43b0-aaef-548fa77a12ee","timestamp":1749181621051,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"bbb7a19e-4f61-44a0-8d8d-49023f135026","bid":"4d74c3d8-2fc6-4167-9ebe-9b4daa627474","timestamp":1749181621055,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"3efefc37-3aec-4607-82df-a3553f5992f2","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3346ea01-1703-4310-9957-7903cce12f5a","timestamp":1749181622627,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d14622c6-67db-4ea0-b438-f5df87091608","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b02fa416-85f7-49d0-8b11-4da78c005e56","timestamp":1749181622692,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fb8c234a-4c63-4cd6-8751-eda7516baca7","data":{"dongle_infos":[]},"tid":"9cf3e262-76bc-46ee-b5ed-b5010978900c","timestamp":1749181622999,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3306a3d3-b46b-4ed4-b419-35aa9b838ab8","data":{"firmware_version":"13.01.0002"},"tid":"4e35351a-d57e-466c-8c22-06f1382f2e01","timestamp":1749181623011,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7d5ac277-521d-4976-9428-8f61fa2085a0","data":{"air_transfer_enable":false},"need_reply":1,"tid":"dd227fbf-059d-47f6-89f5-221a88cbbef8","timestamp":1749181623045,"gateway":"8UUXN4P00A06NK"} + +{"tid":"8805393a-c953-45f2-b1d1-b73ad99792a0","bid":"0d85e0a8-be7a-4002-8adf-c358ff3e661e","timestamp":1749181623385,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"4eb59942-408e-4b7a-ae8c-7da00b142afb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b2eb2e92-3b60-4b24-adec-8309a875a4a2","timestamp":1749181623772,"gateway":"8UUXN4P00A06NK"} + +{"bid":"02be1d1c-c168-44b5-a0b4-c6e3e76587b4","data":{"dongle_infos":[]},"tid":"272eebf5-4957-4a74-94df-df692050a882","timestamp":1749181623997,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3efefc37-3aec-4607-82df-a3553f5992f2","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3346ea01-1703-4310-9957-7903cce12f5a","timestamp":1749181624818,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d14622c6-67db-4ea0-b438-f5df87091608","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b02fa416-85f7-49d0-8b11-4da78c005e56","timestamp":1749181624819,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4eb59942-408e-4b7a-ae8c-7da00b142afb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b2eb2e92-3b60-4b24-adec-8309a875a4a2","timestamp":1749181625816,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4f26b21f-cfa3-4425-be89-66b91d3978ef","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cb183ccd-1ad2-4a35-9d66-d74ee06a6c70","timestamp":1749181626053,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7d5ac277-521d-4976-9428-8f61fa2085a0","data":{"air_transfer_enable":false},"need_reply":1,"tid":"dd227fbf-059d-47f6-89f5-221a88cbbef8","timestamp":1749181627241,"gateway":"8UUXN4P00A06NK"} + +{"bid":"844d1b24-1995-4773-92ce-f977f0594285","data":{"departure_trajectory":[]},"tid":"2e2729e9-5ead-482b-93ff-b8f66889b751","timestamp":1749181627739,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a56f2368-9dc4-4d98-a3be-208e1cc9794d","data":{"departure_trajectory":[]},"tid":"33fe60a5-a5a1-4fe2-ba46-c74085b00bfe","timestamp":1749181627989,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4f26b21f-cfa3-4425-be89-66b91d3978ef","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cb183ccd-1ad2-4a35-9d66-d74ee06a6c70","timestamp":1749181628217,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d6a80055-e4a2-4457-9661-d517b3ba58e6","data":{"dongle_infos":[]},"tid":"a9d025da-25b5-4ab9-9fe2-e45d2d5072b6","timestamp":1749181628261,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3efefc37-3aec-4607-82df-a3553f5992f2","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3346ea01-1703-4310-9957-7903cce12f5a","timestamp":1749181629019,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4eb59942-408e-4b7a-ae8c-7da00b142afb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b2eb2e92-3b60-4b24-adec-8309a875a4a2","timestamp":1749181630017,"gateway":"8UUXN4P00A06NK"} + +{"bid":"405eb4ed-2ec0-4b2b-ad74-8a469c145458","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3c9ebd57-c651-4111-ba10-57addc0456a8","timestamp":1749181631054,"gateway":"8UUXN4P00A06NK"} + +{"bid":"405eb4ed-2ec0-4b2b-ad74-8a469c145458","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3c9ebd57-c651-4111-ba10-57addc0456a8","timestamp":1749181633218,"gateway":"8UUXN4P00A06NK"} + +{"tid":"314faa75-68d2-4b0c-8fc3-aeea06c1bfae","bid":"63675c17-3160-4c25-bf6e-1c33519ae098","timestamp":1749181658504,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"1802214d-7f42-4a2d-b0f7-3ec45a6ba272","bid":"bb642cf1-1c7b-4ecc-982b-1287f8df3c9a","timestamp":1749181658508,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"cf732745-2c83-4cfa-b559-547b334f80b8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ba7d0f6a-6373-44f6-8930-b8d914e14395","timestamp":1749181659920,"gateway":"8UUXN4P00A06NK"} + +{"bid":"36642822-0c35-437a-b4c1-c61643a96520","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"747cf342-face-4a05-b59b-fa98f402ba57","timestamp":1749181660496,"gateway":"8UUXN4P00A06NK"} + +{"bid":"391988e5-cf0c-4af6-92a1-528d68434fe7","data":{"mobility_status_notify":0},"need_reply":1,"tid":"fea566db-167f-40ab-9058-da78d89bbcd8","timestamp":1749181660516,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8f62c881-f94f-4952-b0bd-eb798fa08d13","data":{"dongle_infos":[]},"tid":"323e1d92-2368-4bce-9f10-a60b228f0379","timestamp":1749181660567,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8a9c4725-5416-4b03-9ca7-c3b35d9e71a4","data":{"firmware_version":"13.01.0002"},"tid":"7900a8a4-1c4c-4fab-9a21-4b98e6f74e41","timestamp":1749181660578,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7111b248-aa7b-4465-bcd5-fa0451908d94","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d3fabfca-45d3-4be0-bd7b-efb6744604a5","timestamp":1749181660764,"gateway":"8UUXN4P00A06NK"} + +{"tid":"7fa7c5c5-dd80-4018-97bb-08d52c3c9fef","bid":"4c40191c-574e-41fb-ae42-c954d728633e","timestamp":1749181661091,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"26ee9c30-a56a-4fd5-b12d-96974b8252de","data":{"dongle_infos":[]},"tid":"a9bdad4d-cb87-4e93-83a7-9aaa0d1584f0","timestamp":1749181661568,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cf732745-2c83-4cfa-b559-547b334f80b8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ba7d0f6a-6373-44f6-8930-b8d914e14395","timestamp":1749181662081,"gateway":"8UUXN4P00A06NK"} + +{"bid":"36642822-0c35-437a-b4c1-c61643a96520","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"747cf342-face-4a05-b59b-fa98f402ba57","timestamp":1749181662681,"gateway":"8UUXN4P00A06NK"} + +{"bid":"391988e5-cf0c-4af6-92a1-528d68434fe7","data":{"mobility_status_notify":0},"need_reply":1,"tid":"fea566db-167f-40ab-9058-da78d89bbcd8","timestamp":1749181662682,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c5f28faf-779b-4a80-95bd-0006d37524b0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5dce5d99-8f08-4b1c-9bd9-6880ae2fa605","timestamp":1749181663505,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8e698632-b409-4d9a-91bd-2fa6b33537ea","data":{"dongle_infos":[]},"tid":"c3f23392-2b24-4b06-a73d-06de0ca96cd9","timestamp":1749181664167,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7111b248-aa7b-4465-bcd5-fa0451908d94","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d3fabfca-45d3-4be0-bd7b-efb6744604a5","timestamp":1749181664962,"gateway":"8UUXN4P00A06NK"} + +{"bid":"12e1986f-8732-40f3-bacf-ebc32ece8eed","data":{"departure_trajectory":[]},"tid":"0236ef92-c115-4afa-8856-cf192c74c53b","timestamp":1749181665164,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7bcafcd0-c030-43bc-b930-b082757d0116","data":{"departure_trajectory":[]},"tid":"f845c379-7eec-4eb8-982f-2e356b66933e","timestamp":1749181665562,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c5f28faf-779b-4a80-95bd-0006d37524b0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5dce5d99-8f08-4b1c-9bd9-6880ae2fa605","timestamp":1749181665681,"gateway":"8UUXN4P00A06NK"} + +{"bid":"36642822-0c35-437a-b4c1-c61643a96520","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"747cf342-face-4a05-b59b-fa98f402ba57","timestamp":1749181666880,"gateway":"8UUXN4P00A06NK"} + +{"bid":"391988e5-cf0c-4af6-92a1-528d68434fe7","data":{"mobility_status_notify":0},"need_reply":1,"tid":"fea566db-167f-40ab-9058-da78d89bbcd8","timestamp":1749181666882,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d976ef73-8ee6-49ee-b6b6-04e478ccf0f3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"be5b5e5c-074c-4daa-a21c-480056bf1749","timestamp":1749181668502,"gateway":"8UUXN4P00A06NK"} + +{"tid":"62fd7b43-df30-4992-a4e9-ffd8dc39e377","bid":"b7b20e95-442f-411f-b436-463c3511ad6a","timestamp":1749181697006,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"19b772d3-ea24-4399-a57c-950445403da7","bid":"ae48fe7f-1da3-47f3-8ee2-fc5269a3bfa5","timestamp":1749181697009,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"6cf43489-2eeb-4c86-aa57-b0a9f3abd5d6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ff64a907-a69e-485f-8d16-4c55f3aac487","timestamp":1749181698763,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c47a9b2e-d504-4108-818c-656a5d8052e5","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b7debeb6-2264-4e6a-83fc-75306f3c8a2b","timestamp":1749181698801,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8511481f-dab2-41bf-842a-3e0c44a5a1cd","data":{"dongle_infos":[]},"tid":"838952c7-e966-4063-acee-d0f0134a11bd","timestamp":1749181698983,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a1fb42ea-97c8-47a3-9570-7a2df5a0eae2","data":{"firmware_version":"13.01.0002"},"tid":"a4c277af-afec-49fb-ae4f-34d3abf5a94a","timestamp":1749181698990,"gateway":"8UUXN4P00A06NK"} + +{"bid":"afcd1045-cd33-455c-907a-6b65f4dc88f8","data":{"air_transfer_enable":false},"need_reply":1,"tid":"4e7de593-be8a-4aad-bec1-49fcefafb271","timestamp":1749181699179,"gateway":"8UUXN4P00A06NK"} + +{"tid":"5955220e-5a97-456b-8a78-a00bd7e8e72c","bid":"6155bc52-dc54-4bc3-acb0-73559aefd483","timestamp":1749181699415,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"a2934c18-4831-4352-bd0b-b65e267d8c64","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"89f5c5c8-264c-47c9-801a-e8320772fd84","timestamp":1749181699906,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4d8739c9-3854-437a-ac2f-505f354dcc45","data":{"dongle_infos":[]},"tid":"f993a61e-f9d8-4e9b-b04f-abab57c16eb7","timestamp":1749181700036,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6cf43489-2eeb-4c86-aa57-b0a9f3abd5d6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ff64a907-a69e-485f-8d16-4c55f3aac487","timestamp":1749181700872,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c47a9b2e-d504-4108-818c-656a5d8052e5","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b7debeb6-2264-4e6a-83fc-75306f3c8a2b","timestamp":1749181700873,"gateway":"8UUXN4P00A06NK"} + +{"bid":"103093bf-5b52-4949-bace-7168e9403b5a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"169a51fc-c4cd-4501-b31e-216dda5ab5d5","timestamp":1749181702002,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a2934c18-4831-4352-bd0b-b65e267d8c64","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"89f5c5c8-264c-47c9-801a-e8320772fd84","timestamp":1749181702073,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c819bb21-f875-46c7-89a2-66dff5c23995","data":{"dongle_infos":[]},"tid":"55b401a1-2ec3-4297-9482-98e6e24bc0ec","timestamp":1749181702481,"gateway":"8UUXN4P00A06NK"} + +{"bid":"afcd1045-cd33-455c-907a-6b65f4dc88f8","data":{"air_transfer_enable":false},"need_reply":1,"tid":"4e7de593-be8a-4aad-bec1-49fcefafb271","timestamp":1749181703380,"gateway":"8UUXN4P00A06NK"} + +{"bid":"33d71293-b7f5-46b8-9151-08ff391c991d","data":{"departure_trajectory":[]},"tid":"32e1e6d2-0487-4f97-9976-b93ed650ea86","timestamp":1749181703430,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ea755828-5470-44f0-9fd9-842484b71dff","data":{"departure_trajectory":[]},"tid":"d737659a-4907-47af-98a2-f25c206697ca","timestamp":1749181703980,"gateway":"8UUXN4P00A06NK"} + +{"bid":"103093bf-5b52-4949-bace-7168e9403b5a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"169a51fc-c4cd-4501-b31e-216dda5ab5d5","timestamp":1749181704077,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6cf43489-2eeb-4c86-aa57-b0a9f3abd5d6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ff64a907-a69e-485f-8d16-4c55f3aac487","timestamp":1749181705073,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a2934c18-4831-4352-bd0b-b65e267d8c64","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"89f5c5c8-264c-47c9-801a-e8320772fd84","timestamp":1749181706268,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0848ac41-498a-448d-bb14-fe6a353344f9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e897cb74-7b49-44cb-8001-1f3fd2d6f175","timestamp":1749181707001,"gateway":"8UUXN4P00A06NK"} + +{"tid":"6051695e-bd18-414a-a35a-9225fb2468ef","bid":"78e034bc-7f46-4452-abd0-5840d03502d8","timestamp":1749181736234,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"e6db65d1-593d-4144-89a4-63c6c36c8755","bid":"fac346ec-7edc-4b14-852f-69d8eb0ff4b4","timestamp":1749181736236,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"1c7f8df4-aebd-4338-9fab-4b27a147e637","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"777d3269-c8dc-44e4-82b6-7aa45f42cc4a","timestamp":1749181737473,"gateway":"8UUXN4P00A06NK"} + +{"bid":"99ff1568-4cf2-42a2-8f91-ab53abc7bfe3","data":{"mobility_status_notify":0},"need_reply":1,"tid":"041a1ca9-3eb2-459e-98eb-68cddd2747b3","timestamp":1749181737477,"gateway":"8UUXN4P00A06NK"} + +{"bid":"65355a90-05e8-4e9c-b917-d114e1f28946","data":{"dongle_infos":[]},"tid":"3ecceb78-3cd1-4a19-8279-b9adaf44e084","timestamp":1749181737901,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5fbb1e45-e68f-4a10-b876-9d2e5b48cd12","data":{"firmware_version":"13.01.0002"},"tid":"cc114d41-2b3f-4029-8597-cf9ca14efd25","timestamp":1749181737944,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ad127fc8-37ec-473a-b395-664febc4b98f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3e5922b4-91ab-4c90-8743-1ac01433d3e9","timestamp":1749181738096,"gateway":"8UUXN4P00A06NK"} + +{"tid":"7dd47731-dc60-4055-9e28-a93b9938e074","bid":"cf08a5fd-1071-4024-b9ad-4c4fd10a7680","timestamp":1749181738238,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"c78fa654-9f11-4642-8c32-3087e1895812","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e04bd005-b0f7-4b47-894a-cc0e71756cbc","timestamp":1749181738522,"gateway":"8UUXN4P00A06NK"} + +{"bid":"87f354b8-c836-45ce-9f59-57e8f6201793","data":{"dongle_infos":[]},"tid":"6259f820-2ebe-4057-9dad-ba71f13d3686","timestamp":1749181738947,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1c7f8df4-aebd-4338-9fab-4b27a147e637","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"777d3269-c8dc-44e4-82b6-7aa45f42cc4a","timestamp":1749181739646,"gateway":"8UUXN4P00A06NK"} + +{"bid":"99ff1568-4cf2-42a2-8f91-ab53abc7bfe3","data":{"mobility_status_notify":0},"need_reply":1,"tid":"041a1ca9-3eb2-459e-98eb-68cddd2747b3","timestamp":1749181739647,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c78fa654-9f11-4642-8c32-3087e1895812","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e04bd005-b0f7-4b47-894a-cc0e71756cbc","timestamp":1749181740647,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bb715c76-9ca7-46c2-b36e-94cdaadfb6c2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c6c51e1e-5ffd-46c5-955f-b3fbffc4e314","timestamp":1749181741235,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7d903ed9-119b-4594-b705-bd2079b9065f","data":{"dongle_infos":[]},"tid":"6c776657-c60d-403c-a84c-32c689974fd5","timestamp":1749181741994,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ad127fc8-37ec-473a-b395-664febc4b98f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3e5922b4-91ab-4c90-8743-1ac01433d3e9","timestamp":1749181742294,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d5b8cea4-a741-441a-a119-43698d66bca6","data":{"departure_trajectory":[]},"tid":"88327248-a7ae-4d88-bcaf-62fa1571070b","timestamp":1749181742895,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7d37b0f2-4e71-4dd8-8e2f-23a0dddcf80e","data":{"departure_trajectory":[]},"tid":"4b1d5727-55d4-43be-8e98-659acf9f26b6","timestamp":1749181742945,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bb715c76-9ca7-46c2-b36e-94cdaadfb6c2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c6c51e1e-5ffd-46c5-955f-b3fbffc4e314","timestamp":1749181743242,"gateway":"8UUXN4P00A06NK"} + +{"bid":"99ff1568-4cf2-42a2-8f91-ab53abc7bfe3","data":{"mobility_status_notify":0},"need_reply":1,"tid":"041a1ca9-3eb2-459e-98eb-68cddd2747b3","timestamp":1749181743841,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c78fa654-9f11-4642-8c32-3087e1895812","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e04bd005-b0f7-4b47-894a-cc0e71756cbc","timestamp":1749181744840,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5014384b-4d2c-4d9d-9c5b-926031738c61","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f3683808-7e57-4d35-93c7-2df945e4ae4a","timestamp":1749181746234,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5014384b-4d2c-4d9d-9c5b-926031738c61","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f3683808-7e57-4d35-93c7-2df945e4ae4a","timestamp":1749181748242,"gateway":"8UUXN4P00A06NK"} + +{"tid":"74582a4e-46c6-4a09-8eaa-e2580e98d9c9","bid":"30f3fb3c-2306-4ff5-8d40-eba5cf29c669","timestamp":1749181775034,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"b33db02d-0e0c-458b-910e-4455284dccb9","bid":"be7834a1-0a0f-4933-a5f2-f250a78fa7f4","timestamp":1749181775043,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"599c02f6-d5b7-4fac-907b-5c9acf91fb1d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a6f8ec06-9e1e-4c91-ae8d-e54843222349","timestamp":1749181776291,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cd753ea6-6e40-4a4e-b651-2106f1069355","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"da2e347a-1d32-42a3-8fbb-b6ec9c0af88f","timestamp":1749181776365,"gateway":"8UUXN4P00A06NK"} + +{"bid":"791f52d0-c21b-4167-86fc-57fc51acf675","data":{"dongle_infos":[]},"tid":"a8f95796-5b11-4b75-a93a-92de83f0ce82","timestamp":1749181776501,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d3476bf2-825f-4a53-9b75-6153d0583d5a","data":{"firmware_version":"13.01.0002"},"tid":"3c1408e3-8535-45eb-b496-af4a4e231a9f","timestamp":1749181776512,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bac4ecb9-1b77-4bad-882e-e30b9c647c42","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1e30e7c1-2844-4ca8-bbc1-a2f8d6cc234b","timestamp":1749181776697,"gateway":"8UUXN4P00A06NK"} + +{"tid":"25f1f05a-2675-44c8-9016-886cbcd40e77","bid":"11b6ac2e-c854-45c0-8fcd-0354aa3108df","timestamp":1749181777387,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"6f590b1c-d2a9-4e39-923f-0ce13111475a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f19b90ae-85e3-4c76-a212-cf1a012fc2a4","timestamp":1749181777434,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3dc60ef7-8312-47b3-8ecf-7fae6b027f5f","data":{"dongle_infos":[]},"tid":"d1675acf-3a8f-49fe-ab40-bbc0e18834d6","timestamp":1749181777520,"gateway":"8UUXN4P00A06NK"} + +{"bid":"599c02f6-d5b7-4fac-907b-5c9acf91fb1d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a6f8ec06-9e1e-4c91-ae8d-e54843222349","timestamp":1749181778370,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cd753ea6-6e40-4a4e-b651-2106f1069355","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"da2e347a-1d32-42a3-8fbb-b6ec9c0af88f","timestamp":1749181778371,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6f590b1c-d2a9-4e39-923f-0ce13111475a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f19b90ae-85e3-4c76-a212-cf1a012fc2a4","timestamp":1749181779572,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f002ed94-b531-4c0d-a75d-8c4f46d8514a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"52a32c9f-6382-4f6c-beeb-b35bac23aac0","timestamp":1749181780031,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9ea0ed35-d236-45db-aca3-a998af8550a2","data":{"dongle_infos":[]},"tid":"032f17c0-0ba9-4460-9474-ba35c4005fa4","timestamp":1749181780261,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bac4ecb9-1b77-4bad-882e-e30b9c647c42","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1e30e7c1-2844-4ca8-bbc1-a2f8d6cc234b","timestamp":1749181780899,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7aa00698-19aa-452d-92b5-149edb1db232","data":{"departure_trajectory":[]},"tid":"c1d8a79f-4abd-41ea-a759-ca9559371230","timestamp":1749181781498,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9dbc2723-fc4b-44eb-a556-45891257b0d3","data":{"departure_trajectory":[]},"tid":"d2e7de16-48ff-4200-af12-b3cfd4dab7bc","timestamp":1749181781639,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f002ed94-b531-4c0d-a75d-8c4f46d8514a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"52a32c9f-6382-4f6c-beeb-b35bac23aac0","timestamp":1749181782166,"gateway":"8UUXN4P00A06NK"} + +{"bid":"599c02f6-d5b7-4fac-907b-5c9acf91fb1d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a6f8ec06-9e1e-4c91-ae8d-e54843222349","timestamp":1749181782572,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6f590b1c-d2a9-4e39-923f-0ce13111475a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f19b90ae-85e3-4c76-a212-cf1a012fc2a4","timestamp":1749181783769,"gateway":"8UUXN4P00A06NK"} + +{"bid":"40f0d4ac-e76a-454b-a141-7009e6543b5b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e78a98a4-7222-449a-b617-1ff6a1d8fd4c","timestamp":1749181785035,"gateway":"8UUXN4P00A06NK"} + +{"tid":"47dc7ffd-44ab-46e6-a1cf-35069063d61a","bid":"c558736f-3ad1-45f3-9248-76c88e26c3c0","timestamp":1749181813109,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"05dfdedb-4e89-4662-bb6a-f9e4fb78063c","bid":"ceaf2414-c114-46a3-9d0a-06afdd81217f","timestamp":1749181813112,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"8bbcfeb2-0fff-4ffa-b299-14186b8e107b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9107fadc-e76f-4e69-98c7-8c12ecfb87bd","timestamp":1749181814202,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dce41297-8ce9-4482-9601-66b35a004551","data":{"mobility_status_notify":0},"need_reply":1,"tid":"6f169db0-4246-4204-9266-bd7ce461b09e","timestamp":1749181814328,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a434f457-40d2-4261-b116-7b66cc999c59","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1a73f559-be0a-45e9-8ff9-d3bc4168aa59","timestamp":1749181814633,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ca1057ec-e36a-40a9-be6f-8e9b75f327e4","data":{"dongle_infos":[]},"tid":"0d1b9890-392b-4ec0-9855-4298f80186ed","timestamp":1749181814643,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1853e17d-e33f-45ec-b027-da6d8868121e","data":{"firmware_version":"13.01.0002"},"tid":"d1d95169-d767-4f6d-9cbc-241097f8112c","timestamp":1749181814651,"gateway":"8UUXN4P00A06NK"} + +{"tid":"5e15b529-e1c7-4921-a55c-f6194a769a6f","bid":"cbc02d94-261e-4a07-a167-133c4244efa4","timestamp":1749181815005,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"077158e9-e3f1-4bb1-b58c-b2c329b41c2f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"0ff6e069-1920-4069-980c-0406d75fc1f4","timestamp":1749181815496,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2e180645-d868-4849-a66a-c4e2dc41b459","data":{"dongle_infos":[]},"tid":"0be75902-303e-44a3-9dec-b1af2263832f","timestamp":1749181815699,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8bbcfeb2-0fff-4ffa-b299-14186b8e107b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9107fadc-e76f-4e69-98c7-8c12ecfb87bd","timestamp":1749181816403,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dce41297-8ce9-4482-9601-66b35a004551","data":{"mobility_status_notify":0},"need_reply":1,"tid":"6f169db0-4246-4204-9266-bd7ce461b09e","timestamp":1749181816404,"gateway":"8UUXN4P00A06NK"} + +{"bid":"077158e9-e3f1-4bb1-b58c-b2c329b41c2f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"0ff6e069-1920-4069-980c-0406d75fc1f4","timestamp":1749181817603,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6606ccfc-1142-4109-ba92-e1f5e756c45d","data":{"dongle_infos":[]},"tid":"1a5f9d9a-74ba-4d98-b624-61ac182438c3","timestamp":1749181818036,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3b478797-62fd-44e2-b001-f7cfcfb89029","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"69255fbc-af68-4984-8b55-2039eba12ab8","timestamp":1749181818104,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a434f457-40d2-4261-b116-7b66cc999c59","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1a73f559-be0a-45e9-8ff9-d3bc4168aa59","timestamp":1749181818837,"gateway":"8UUXN4P00A06NK"} + +{"bid":"49620468-afa5-4788-9ece-bd468b06028c","data":{"departure_trajectory":[]},"tid":"a4818305-7a5a-4e63-ac1a-d2e85305c816","timestamp":1749181819636,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4a3e1f8c-76ed-443b-851d-1b035145896c","data":{"departure_trajectory":[]},"tid":"b015d008-f93b-425e-a101-f54bf258cf1a","timestamp":1749181819814,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3b478797-62fd-44e2-b001-f7cfcfb89029","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"69255fbc-af68-4984-8b55-2039eba12ab8","timestamp":1749181820203,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dce41297-8ce9-4482-9601-66b35a004551","data":{"mobility_status_notify":0},"need_reply":1,"tid":"6f169db0-4246-4204-9266-bd7ce461b09e","timestamp":1749181820603,"gateway":"8UUXN4P00A06NK"} + +{"bid":"077158e9-e3f1-4bb1-b58c-b2c329b41c2f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"0ff6e069-1920-4069-980c-0406d75fc1f4","timestamp":1749181821802,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1436d423-6d62-4c11-9e64-ada04272d71f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f5b1aa38-d8b1-40f4-ba21-825e38672736","timestamp":1749181823103,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1436d423-6d62-4c11-9e64-ada04272d71f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f5b1aa38-d8b1-40f4-ba21-825e38672736","timestamp":1749181825204,"gateway":"8UUXN4P00A06NK"} + +{"tid":"996133c7-150d-482e-b93c-808421521e97","bid":"a730b131-0247-4c78-863f-5fc718f818f7","timestamp":1749181852083,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"55ed3cf0-63b8-429c-88a0-affb36889dfd","bid":"77a4a2e0-765b-41b0-8454-62a086dac759","timestamp":1749181852085,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"9e6299ab-3cb9-436a-ae1a-0bd1fb02fbd1","data":{"air_transfer_enable":false},"need_reply":1,"tid":"43beee04-8a56-470b-bfca-d2d6b7b4dc50","timestamp":1749181853243,"gateway":"8UUXN4P00A06NK"} + +{"bid":"86b63332-23a9-41cf-b3f6-f908b69fe39c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3361da1a-72c2-4eab-9a0b-02427bcb3e31","timestamp":1749181853286,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2df624a9-aa50-4d85-a09f-dbcb66b7e368","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ba1c45f9-068f-4caf-a6db-383d7a3d64bc","timestamp":1749181853300,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b8c3e006-94b1-460c-b800-16bf8fe30981","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5e6196d6-57ab-4e45-a881-46a94c7cc785","timestamp":1749181853306,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a559863f-26dd-4bff-bc8f-8dc8b71d501d","data":{"dongle_infos":[]},"tid":"874c6680-c166-4ede-b76d-cf8b7fd0f7ab","timestamp":1749181853315,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7f9fd6c5-b7ce-4407-ab35-15cc2b0e7477","data":{"firmware_version":"13.01.0002"},"tid":"02d42055-3e62-4784-9a55-2e7e188ada7e","timestamp":1749181853350,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c2c90b26-67fd-48ac-aa8a-c5fa02422dad","bid":"92ef4acc-41bc-4212-993c-8dcc130dc108","timestamp":1749181854013,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"d41b1660-d9c7-452c-91c4-fa37de714bc3","data":{"dongle_infos":[]},"tid":"cf9aeac9-f002-4370-b117-3f69c34111d4","timestamp":1749181854296,"gateway":"8UUXN4P00A06NK"} + +{"bid":"86b63332-23a9-41cf-b3f6-f908b69fe39c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3361da1a-72c2-4eab-9a0b-02427bcb3e31","timestamp":1749181855356,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2df624a9-aa50-4d85-a09f-dbcb66b7e368","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ba1c45f9-068f-4caf-a6db-383d7a3d64bc","timestamp":1749181855357,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b8c3e006-94b1-460c-b800-16bf8fe30981","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5e6196d6-57ab-4e45-a881-46a94c7cc785","timestamp":1749181855358,"gateway":"8UUXN4P00A06NK"} + +{"bid":"12eca6e0-a808-4801-8799-b689db15a684","data":{"dongle_infos":[]},"tid":"a1b783cf-c6e4-4ee5-bb8a-be2c0905dac7","timestamp":1749181857052,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6eb489ec-ea6b-41db-9195-706b1468c947","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"62965882-862c-446b-8adb-ba16269f1697","timestamp":1749181857089,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9e6299ab-3cb9-436a-ae1a-0bd1fb02fbd1","data":{"air_transfer_enable":false},"need_reply":1,"tid":"43beee04-8a56-470b-bfca-d2d6b7b4dc50","timestamp":1749181857441,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d48dbdec-73ab-4669-b269-054205536450","data":{"departure_trajectory":[]},"tid":"05c880c4-9db1-440f-a599-4cb9a94802ab","timestamp":1749181858291,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a0f39cad-eb23-4440-a314-7b5b152ad1a2","data":{"departure_trajectory":[]},"tid":"dedf1f58-188b-4d35-974c-53e26c46d39d","timestamp":1749181858752,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6eb489ec-ea6b-41db-9195-706b1468c947","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"62965882-862c-446b-8adb-ba16269f1697","timestamp":1749181859151,"gateway":"8UUXN4P00A06NK"} + +{"bid":"86b63332-23a9-41cf-b3f6-f908b69fe39c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"3361da1a-72c2-4eab-9a0b-02427bcb3e31","timestamp":1749181859554,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b8c3e006-94b1-460c-b800-16bf8fe30981","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5e6196d6-57ab-4e45-a881-46a94c7cc785","timestamp":1749181859556,"gateway":"8UUXN4P00A06NK"} + +{"bid":"01d850e9-c0cd-426b-9e49-05bfb99ee3bd","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"14c456ec-6a56-4217-8d15-72d01fef7f15","timestamp":1749181862083,"gateway":"8UUXN4P00A06NK"} + +{"bid":"01d850e9-c0cd-426b-9e49-05bfb99ee3bd","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"14c456ec-6a56-4217-8d15-72d01fef7f15","timestamp":1749181864157,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d8606e77-80b4-4959-8c62-7199b7b25432","bid":"e97d579d-5ee9-48e0-8b09-b5bf014e0e45","timestamp":1749181891152,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"35725796-05f2-4d67-8986-52b69dc056fe","bid":"ffc88ac6-da5c-48f3-b5a6-35afb724353b","timestamp":1749181891155,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"5b0a3831-094d-44f7-8709-fdc89d836c76","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ff123ec2-4a5b-4c66-ab10-ae946f8e15a4","timestamp":1749181892883,"gateway":"8UUXN4P00A06NK"} + +{"bid":"54b7f13a-3117-4bbe-b6ce-0636c55a4d45","data":{"air_transfer_enable":false},"need_reply":1,"tid":"9e943858-9069-42ad-afc7-8eed4943dc76","timestamp":1749181893503,"gateway":"8UUXN4P00A06NK"} + +{"tid":"e6972b02-f359-4cf0-9c45-2aca0b949e06","bid":"cf5bb453-b07f-4f04-9bb0-36ae4afcdb07","timestamp":1749181893574,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"32bdd05b-737e-4121-b037-34e67692a1b4","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"13db5177-c9e7-41f9-9fa2-38f2f554af84","timestamp":1749181893768,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7fbe6e64-5ab8-43d0-a2bc-e71a5ba0244b","data":{"dongle_infos":[]},"tid":"12c94e8c-266a-454c-b782-b5723cb6d8ff","timestamp":1749181893788,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0e85e850-6d64-4ec1-bcda-427a12394d21","data":{"mobility_status_notify":0},"need_reply":1,"tid":"4ed49826-7f71-4def-9fb6-311c7aaf8673","timestamp":1749181893799,"gateway":"8UUXN4P00A06NK"} + +{"bid":"29af955a-2a48-4502-97af-8d39e07dfca8","data":{"firmware_version":"13.01.0002"},"tid":"8c929fbc-72c5-4733-b9f8-e55b5281a413","timestamp":1749181893829,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dc0ba7b4-4ac5-4842-8de7-02d4c6f91c3d","data":{"dongle_infos":[]},"tid":"39dc321d-59de-456c-89c9-dbf9e3be75c0","timestamp":1749181894825,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5b0a3831-094d-44f7-8709-fdc89d836c76","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ff123ec2-4a5b-4c66-ab10-ae946f8e15a4","timestamp":1749181895063,"gateway":"8UUXN4P00A06NK"} + +{"bid":"32bdd05b-737e-4121-b037-34e67692a1b4","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"13db5177-c9e7-41f9-9fa2-38f2f554af84","timestamp":1749181895863,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0e85e850-6d64-4ec1-bcda-427a12394d21","data":{"mobility_status_notify":0},"need_reply":1,"tid":"4ed49826-7f71-4def-9fb6-311c7aaf8673","timestamp":1749181895864,"gateway":"8UUXN4P00A06NK"} + +{"bid":"65b52bdd-93d9-49b4-8282-ad116120b66d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c5b16018-9d01-4c1c-abfb-303bda6bf475","timestamp":1749181896157,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9323ca16-0ef6-474b-b44d-53d8135917f0","data":{"dongle_infos":[]},"tid":"0a33f185-590c-4407-a15f-b1d01da8bdac","timestamp":1749181897229,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2b389bff-e48d-47ae-835d-52cda759c24f","data":{"departure_trajectory":[]},"tid":"556ca3b8-cd6a-4b42-93b5-20761c578787","timestamp":1749181897657,"gateway":"8UUXN4P00A06NK"} + +{"bid":"54b7f13a-3117-4bbe-b6ce-0636c55a4d45","data":{"air_transfer_enable":false},"need_reply":1,"tid":"9e943858-9069-42ad-afc7-8eed4943dc76","timestamp":1749181897706,"gateway":"8UUXN4P00A06NK"} + +{"bid":"65b52bdd-93d9-49b4-8282-ad116120b66d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c5b16018-9d01-4c1c-abfb-303bda6bf475","timestamp":1749181898262,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1b2ba952-0623-4db2-a380-272b187e187b","data":{"departure_trajectory":[]},"tid":"a39c7142-a50c-4390-9a81-8576d3797d60","timestamp":1749181898775,"gateway":"8UUXN4P00A06NK"} + +{"bid":"32bdd05b-737e-4121-b037-34e67692a1b4","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"13db5177-c9e7-41f9-9fa2-38f2f554af84","timestamp":1749181900063,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0e85e850-6d64-4ec1-bcda-427a12394d21","data":{"mobility_status_notify":0},"need_reply":1,"tid":"4ed49826-7f71-4def-9fb6-311c7aaf8673","timestamp":1749181900065,"gateway":"8UUXN4P00A06NK"} + +{"bid":"69bad2c2-0307-493b-8a8a-1f1733cbd708","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0d8d6193-8f1a-44b8-ae99-f2117fc29674","timestamp":1749181901160,"gateway":"8UUXN4P00A06NK"} + +{"bid":"001d5dad-0583-4757-b1ed-7b648f3a5eb3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ff3c3e3e-5d1c-4c79-bc50-50292aa5f0eb","timestamp":1749184670752,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9bb39230-0b07-435a-b00e-d769c352accf","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f8985469-3e7f-43ac-bad0-5e5034a173f7","timestamp":1749184670754,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3420ac26-f728-4291-a77d-7baa9e179b58","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e37c03b8-67d6-4c96-ad1e-1737915237fb","timestamp":1749184671353,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6d9c1bf6-ca8d-40c2-9eae-d54e23e884e4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3e1a49ae-521a-4dc0-ba8f-4188f65c069d","timestamp":1749184672357,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bcf36195-eb00-422c-9b21-fcc4506bc29c","data":{"dongle_infos":[]},"tid":"497ad579-0bae-4e66-8e92-2358f5c1eeb1","timestamp":1749184673355,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bc266285-0850-478b-bc99-8d211205ecbb","data":{"air_transfer_enable":false},"need_reply":1,"tid":"badc9aa5-e835-4d97-a3a5-6e0b1b3a2564","timestamp":1749184673527,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2a8a44a0-091b-4c0d-ad9a-fbb0ada3eccb","data":{"departure_trajectory":[]},"tid":"d77bf1fc-05bb-48cf-908b-7fb8a5cb26e8","timestamp":1749184674057,"gateway":"8UUXN4P00A06NK"} + +{"bid":"20f1c26f-48e4-49ae-9eeb-920c32862d03","data":{"departure_trajectory":[]},"tid":"c9e7e64b-6db9-4828-a088-1da51478d0fb","timestamp":1749184674127,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6d9c1bf6-ca8d-40c2-9eae-d54e23e884e4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3e1a49ae-521a-4dc0-ba8f-4188f65c069d","timestamp":1749184674552,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9bb39230-0b07-435a-b00e-d769c352accf","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f8985469-3e7f-43ac-bad0-5e5034a173f7","timestamp":1749184674952,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3420ac26-f728-4291-a77d-7baa9e179b58","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e37c03b8-67d6-4c96-ad1e-1737915237fb","timestamp":1749184675553,"gateway":"8UUXN4P00A06NK"} + +{"bid":"da82924c-9c3b-4f73-9216-774597e5fa4d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a1d08609-3c8c-400b-a8b2-ffe2148c7cc2","timestamp":1749184677353,"gateway":"8UUXN4P00A06NK"} + +{"tid":"abbdd0fe-3fc6-472a-bf3d-fa4f4ae183dd","bid":"09c6ca51-1fe4-4d40-b95d-5b7e1fae1a53","timestamp":1749190992433,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"506ea359-88b5-4873-91f8-39ddefeb212c","bid":"ffcff557-4d87-4e6b-ab52-6da7d05df308","timestamp":1749190992437,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"78e63bd6-555f-431e-82a3-4c94db9e5ae7","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2dae2b06-bd82-455e-b985-77b124a9fe26","timestamp":1749190994219,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9339200f-6e90-46f1-b851-f93654194dc3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"55b92473-3b3a-4445-bf58-a3b342363aed","timestamp":1749190996194,"gateway":"8UUXN4P00A06NK"} + +{"tid":"026e82c8-aa08-429f-823b-80d31cb4b3b9","bid":"f8246f17-49d5-451f-9ac7-c84cfae20da7","timestamp":1749190996442,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"36ff7ea1-de24-4b0b-a091-7be64b961ecc","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f6dca460-f6ba-45b6-b3e4-ad5eba698c5b","timestamp":1749190996502,"gateway":"8UUXN4P00A06NK"} + +{"bid":"18a87e33-ae2b-47de-84cb-9a13af1650d5","data":{"dongle_infos":[]},"tid":"1f8ab33b-5267-4cc2-ae07-85b9037e9e6f","timestamp":1749190996696,"gateway":"8UUXN4P00A06NK"} + +{"bid":"10f1fbf2-40ac-434e-917e-7ace7cd1c54e","data":{"firmware_version":"13.01.0002"},"tid":"08fef67d-f60d-48fa-9908-0758fca534c1","timestamp":1749190996705,"gateway":"8UUXN4P00A06NK"} + +{"bid":"78e63bd6-555f-431e-82a3-4c94db9e5ae7","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2dae2b06-bd82-455e-b985-77b124a9fe26","timestamp":1749190996893,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8629d1cf-d1f5-4015-88b2-b178d529a99f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"4e545fdf-8fa3-4773-8a44-fe530fe6de6c","timestamp":1749190996923,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2e515c25-b1ea-4c66-bb7f-d151edb464fd","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b6a39b4f-67ea-4bec-a68b-ac1e3383acb2","timestamp":1749190997442,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2f8c74b5-d4c6-4104-bb28-5f4c5b95ac12","data":{"dongle_infos":[]},"tid":"3f1d0f4e-9ed1-4abd-8f60-55cebe89a9b3","timestamp":1749190997755,"gateway":"8UUXN4P00A06NK"} + +{"bid":"36ff7ea1-de24-4b0b-a091-7be64b961ecc","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f6dca460-f6ba-45b6-b3e4-ad5eba698c5b","timestamp":1749190998538,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8629d1cf-d1f5-4015-88b2-b178d529a99f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"4e545fdf-8fa3-4773-8a44-fe530fe6de6c","timestamp":1749190998935,"gateway":"8UUXN4P00A06NK"} + +{"tid":"01565e83-3bff-4000-832f-84f4bc2e7acd","bid":"65d3a474-6dc7-4c4d-a000-215c7edc0a25","timestamp":1749191025848,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"12f7d313-9de8-43ef-a49b-bdfb552f02e8","bid":"b2ca727a-3db6-410a-99b9-9c01e53b94fa","timestamp":1749191025850,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f344202d-b6f0-4065-a305-d9c40d643c10","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4c306e81-7698-40e3-b649-a05df2ad03e0","timestamp":1749191026300,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4b3b9829-4f51-4da3-abc9-853627fc7559","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f6675b6e-bebc-4033-9b8e-e23f7e59db2d","timestamp":1749191026396,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2e6a15af-b6f5-4889-b794-9d9086eb21f9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3f0f9df8-f2b3-4c27-a3f8-f3cf90d76670","timestamp":1749191026610,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5cf04844-6345-4fb5-961c-380e74edbe4a","data":{"dongle_infos":[]},"tid":"38ecfbb1-a088-43bd-869a-b39d9441c6a5","timestamp":1749191026613,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3c2f3bbe-194b-42a9-b581-b5a26853ed6e","data":{"firmware_version":"13.01.0002"},"tid":"89c7cde6-c276-42f2-8d99-5fead7ae0a97","timestamp":1749191026620,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eb77a342-6b57-49cf-8e6d-d68684360c41","data":{"mobility_status_notify":0},"need_reply":1,"tid":"74858cf2-3d41-4959-a2bf-7df0c5373c33","timestamp":1749191026825,"gateway":"8UUXN4P00A06NK"} + +{"bid":"54ad3b56-12d2-458c-a4db-ffc900888c4d","data":{"dongle_infos":[]},"tid":"b3e6deff-99fe-45c0-a693-f7f84892cb5a","timestamp":1749191027615,"gateway":"8UUXN4P00A06NK"} + +{"tid":"98533272-e087-4a9b-891d-ae3b34622d47","bid":"3a860109-308b-4160-9563-ada211d05532","timestamp":1749191027660,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f344202d-b6f0-4065-a305-d9c40d643c10","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4c306e81-7698-40e3-b649-a05df2ad03e0","timestamp":1749191028383,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4b3b9829-4f51-4da3-abc9-853627fc7559","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f6675b6e-bebc-4033-9b8e-e23f7e59db2d","timestamp":1749191028583,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eb77a342-6b57-49cf-8e6d-d68684360c41","data":{"mobility_status_notify":0},"need_reply":1,"tid":"74858cf2-3d41-4959-a2bf-7df0c5373c33","timestamp":1749191028981,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2e6a15af-b6f5-4889-b794-9d9086eb21f9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3f0f9df8-f2b3-4c27-a3f8-f3cf90d76670","timestamp":1749191030806,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d9f15eb7-24fd-415d-a8ba-1a2998c41a9c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5df0626d-8e33-438d-84c1-55b4296c3266","timestamp":1749191030846,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c22bdb58-e62f-4dfe-9248-df98e41b7219","data":{"dongle_infos":[]},"tid":"abea923b-556b-4096-bc2c-6dda782f39e6","timestamp":1749191031523,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b07d45a4-e7aa-45fb-89f1-8cd3311c813e","data":{"departure_trajectory":[]},"tid":"5c583c5d-f450-469b-94ae-973b3efd77a9","timestamp":1749191031604,"gateway":"8UUXN4P00A06NK"} + +{"bid":"34478013-bc4b-4381-b88a-f459ca01c8be","data":{"departure_trajectory":[]},"tid":"9ec6bcdb-25be-4a29-b436-2245996423f2","timestamp":1749191032594,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4b3b9829-4f51-4da3-abc9-853627fc7559","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f6675b6e-bebc-4033-9b8e-e23f7e59db2d","timestamp":1749191032783,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d9f15eb7-24fd-415d-a8ba-1a2998c41a9c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5df0626d-8e33-438d-84c1-55b4296c3266","timestamp":1749191032982,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eb77a342-6b57-49cf-8e6d-d68684360c41","data":{"mobility_status_notify":0},"need_reply":1,"tid":"74858cf2-3d41-4959-a2bf-7df0c5373c33","timestamp":1749191033183,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a24123b3-6875-4c99-80bf-d1c39a045c9d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"12501551-0879-4424-966e-f429bae173d1","timestamp":1749191035847,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a24123b3-6875-4c99-80bf-d1c39a045c9d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"12501551-0879-4424-966e-f429bae173d1","timestamp":1749191037983,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ff40550a-67d4-4db7-8e34-5cfcd3596662","bid":"37b29196-7838-4c70-b62a-c0bcbf2adab2","timestamp":1749191064040,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"04ef6401-d111-4a13-8870-59a195d9e217","bid":"18df36de-c236-4faf-9b38-e00ac54a29f7","timestamp":1749191064046,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"988eb617-cb82-433c-9e6d-1882eb4bbedf","data":{"air_transfer_enable":false},"need_reply":1,"tid":"fe718b57-920f-4ed1-96a8-fa0a29a2d880","timestamp":1749191064383,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3cd8ed4f-1952-4b7b-87e9-f932020eda73","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d551194a-c6e8-4135-a642-3eae56fc556b","timestamp":1749191066287,"gateway":"8UUXN4P00A06NK"} + +{"bid":"989c9f15-0942-47ea-9a8f-8b4b81d51903","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0f669433-bbad-4e94-81ee-8c9237655347","timestamp":1749191066488,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1a1b7335-b372-48e6-9884-bea86b8975cb","data":{"dongle_infos":[]},"tid":"170b4913-9469-4708-9e65-dd1c21ab5e8b","timestamp":1749191066773,"gateway":"8UUXN4P00A06NK"} + +{"bid":"52d69a2d-5866-438c-9b56-740b43a4611a","data":{"firmware_version":"13.01.0002"},"tid":"feb4af9c-8653-4161-b958-5c98fb33101e","timestamp":1749191066780,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b5d1646d-98b1-46cd-bd4e-0b35a15bfc9a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"89a5c352-96c0-4e83-b9ce-f304b5ba9e82","timestamp":1749191066819,"gateway":"8UUXN4P00A06NK"} + +{"bid":"988eb617-cb82-433c-9e6d-1882eb4bbedf","data":{"air_transfer_enable":false},"need_reply":1,"tid":"fe718b57-920f-4ed1-96a8-fa0a29a2d880","timestamp":1749191066965,"gateway":"8UUXN4P00A06NK"} + +{"tid":"be7bc362-a6e7-4994-8108-cf1d4450bc84","bid":"266438b7-4b86-4cee-85df-7fddc2c0d01d","timestamp":1749191067054,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"38d06374-045f-4651-9469-ee8f12c8aa44","data":{"dongle_infos":[]},"tid":"e99b56c6-08e2-4ba2-82a8-2871211aba17","timestamp":1749191067776,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3cd8ed4f-1952-4b7b-87e9-f932020eda73","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d551194a-c6e8-4135-a642-3eae56fc556b","timestamp":1749191068327,"gateway":"8UUXN4P00A06NK"} + +{"bid":"989c9f15-0942-47ea-9a8f-8b4b81d51903","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0f669433-bbad-4e94-81ee-8c9237655347","timestamp":1749191068527,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b5d1646d-98b1-46cd-bd4e-0b35a15bfc9a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"89a5c352-96c0-4e83-b9ce-f304b5ba9e82","timestamp":1749191068927,"gateway":"8UUXN4P00A06NK"} + +{"bid":"72b5ce1d-5b9c-495c-af4b-5b3783cb83dc","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d3edf510-21d0-42ed-8967-5efd26cb4fb7","timestamp":1749191069041,"gateway":"8UUXN4P00A06NK"} + +{"tid":"66699f91-f4a1-435e-a26f-fed9b1051182","bid":"f9dc62af-20eb-4b4e-b99c-8401a42b8961","timestamp":1749191094726,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"27f11b6a-9108-452f-aa6d-7b7af5b2350d","bid":"6a59fb1a-7d59-48d5-9a98-c27f6562056a","timestamp":1749191094728,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"99090719-692b-4526-8da5-396ad21f2d36","data":{"air_transfer_enable":false},"need_reply":1,"tid":"597596b9-cf2c-4e1d-abea-dc7f57cf46be","timestamp":1749191095745,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ed7b72a8-89bd-4d77-848c-81e670c0d671","data":{"mobility_status_notify":0},"need_reply":1,"tid":"fbb4bfd4-dc9f-4421-bf6e-d70c6a68d8c2","timestamp":1749191097829,"gateway":"8UUXN4P00A06NK"} + +{"bid":"93ebade5-5cad-4b3e-a189-c52ccfb88711","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"df03276a-20ee-431f-93b6-3b1ca70dbffd","timestamp":1749191097867,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fb00f6c3-eb37-4dc1-abd0-17b4b4ff1883","data":{"dongle_infos":[]},"tid":"1a2c670a-6708-4072-955b-19c860845505","timestamp":1749191098132,"gateway":"8UUXN4P00A06NK"} + +{"bid":"37f4826b-53f4-49fa-93db-8e2238b096b6","data":{"firmware_version":"13.01.0002"},"tid":"be7649a4-6565-4eb8-9eab-4136a07791dd","timestamp":1749191098141,"gateway":"8UUXN4P00A06NK"} + +{"tid":"536f5c4b-26a6-454d-93f0-6e8ce1faeb39","bid":"a3075f76-b054-4d98-99ab-59ffa80edce6","timestamp":1749191098281,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"99090719-692b-4526-8da5-396ad21f2d36","data":{"air_transfer_enable":false},"need_reply":1,"tid":"597596b9-cf2c-4e1d-abea-dc7f57cf46be","timestamp":1749191098327,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b5477efc-9e5e-45b5-a8a2-a58df00881a4","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"df2e487f-7727-4bd3-bada-722c7b2dd830","timestamp":1749191098400,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7517cdfa-d5eb-4383-b15e-d53525c24c9d","data":{"dongle_infos":[]},"tid":"757eaae3-f7af-4173-a5a8-e0208a15f72f","timestamp":1749191099134,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2b7adade-cffd-4653-acfc-13755c8aecd3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bfaa420d-d80a-438d-af2e-1f1609d1000f","timestamp":1749191099733,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ed7b72a8-89bd-4d77-848c-81e670c0d671","data":{"mobility_status_notify":0},"need_reply":1,"tid":"fbb4bfd4-dc9f-4421-bf6e-d70c6a68d8c2","timestamp":1749191099907,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b5477efc-9e5e-45b5-a8a2-a58df00881a4","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"df2e487f-7727-4bd3-bada-722c7b2dd830","timestamp":1749191100509,"gateway":"8UUXN4P00A06NK"} + +{"tid":"7a81788b-b976-496b-9d19-1c5a863dc267","bid":"0fe7f521-3916-4de2-962d-476e312558e4","timestamp":1749191128459,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"8133ed9d-a2eb-4d23-acd5-73c5256ce724","bid":"49b97458-cc73-40c0-94b1-3d672ba0445a","timestamp":1749191128465,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"759d5905-14c7-47f6-b7ad-3d85fa24619a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0cdbe56d-dc88-4c9c-a63c-49f2737a6dd7","timestamp":1749191129767,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aa6f1ca1-9a0b-427e-a251-777c3392261c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"87f54ac4-995f-46dc-9304-5695e159f7a6","timestamp":1749191130168,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1dab2e7e-828f-4bdd-bb99-8342abae18b4","data":{"dongle_infos":[]},"tid":"a29f534c-cdcd-460a-ab31-3b44f281e0f7","timestamp":1749191130234,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2b1e36d7-cf7a-4e3f-a00d-2f66a618c3c0","data":{"firmware_version":"13.01.0002"},"tid":"a8fc0cd7-306d-41db-9768-94b961ad81f6","timestamp":1749191130242,"gateway":"8UUXN4P00A06NK"} + +{"tid":"2f06800d-27bf-4233-b973-f947aa599d0b","bid":"72c43c3f-e650-4ec4-a43c-f2ca10366500","timestamp":1749191130334,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"5d5b2bf2-709e-4593-b665-e052ec9d6fc0","data":{"air_transfer_enable":false},"need_reply":1,"tid":"41421242-b4f5-4e11-85ec-6e91c1061520","timestamp":1749191130434,"gateway":"8UUXN4P00A06NK"} + +{"bid":"237b5db0-1d6f-48a2-8826-5930f7e073ed","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d187c45e-344e-4be9-8bc3-e5b19e46df2e","timestamp":1749191130605,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fc774334-a378-4d31-9cac-8d5ff43d7bae","data":{"dongle_infos":[]},"tid":"948e52aa-97a4-44f4-bd6b-3586f111f7dc","timestamp":1749191131245,"gateway":"8UUXN4P00A06NK"} + +{"bid":"759d5905-14c7-47f6-b7ad-3d85fa24619a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0cdbe56d-dc88-4c9c-a63c-49f2737a6dd7","timestamp":1749191131799,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aa6f1ca1-9a0b-427e-a251-777c3392261c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"87f54ac4-995f-46dc-9304-5695e159f7a6","timestamp":1749191132198,"gateway":"8UUXN4P00A06NK"} + +{"bid":"237b5db0-1d6f-48a2-8826-5930f7e073ed","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d187c45e-344e-4be9-8bc3-e5b19e46df2e","timestamp":1749191132799,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a0c9b9b7-201d-4e5c-b24b-b7385864a4f0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"19b00b3d-bad9-45dc-884c-fb6411199c27","timestamp":1749191133461,"gateway":"8UUXN4P00A06NK"} + +{"bid":"73b75fc7-2c2a-432c-9ad5-ead4be506065","data":{"dongle_infos":[]},"tid":"b8bd9065-f7ba-42f8-a390-fd75f7084362","timestamp":1749191134370,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5d5b2bf2-709e-4593-b665-e052ec9d6fc0","data":{"air_transfer_enable":false},"need_reply":1,"tid":"41421242-b4f5-4e11-85ec-6e91c1061520","timestamp":1749191134630,"gateway":"8UUXN4P00A06NK"} + +{"bid":"36d4c413-c50c-43e8-9e95-d283727cc619","data":{"departure_trajectory":[]},"tid":"5e09cb71-bae4-421d-8d13-5f96e5f782c1","timestamp":1749191135168,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b85a44ea-37fc-47ce-9d30-066c48f8ddf3","data":{"departure_trajectory":[]},"tid":"db321661-3659-4673-be6e-40be085400b1","timestamp":1749191135229,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a0c9b9b7-201d-4e5c-b24b-b7385864a4f0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"19b00b3d-bad9-45dc-884c-fb6411199c27","timestamp":1749191135599,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aa6f1ca1-9a0b-427e-a251-777c3392261c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"87f54ac4-995f-46dc-9304-5695e159f7a6","timestamp":1749191136400,"gateway":"8UUXN4P00A06NK"} + +{"bid":"237b5db0-1d6f-48a2-8826-5930f7e073ed","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d187c45e-344e-4be9-8bc3-e5b19e46df2e","timestamp":1749191136996,"gateway":"8UUXN4P00A06NK"} + +{"bid":"067f64eb-e4cf-438e-ab6a-a66c66d567d2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9abc8c50-6574-4a19-815a-260468a20635","timestamp":1749191138458,"gateway":"8UUXN4P00A06NK"} + +{"bid":"067f64eb-e4cf-438e-ab6a-a66c66d567d2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9abc8c50-6574-4a19-815a-260468a20635","timestamp":1749191140599,"gateway":"8UUXN4P00A06NK"} + +{"tid":"6a1530f5-8ebb-495b-aff6-8e2d30657ed4","bid":"5b1e58c1-1393-45e7-a761-8e42b5865647","timestamp":1749191167607,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"aa1cbe65-80f2-4e38-b2fc-a460e387b795","bid":"6f436aa1-1267-4359-977e-b912456ecd5f","timestamp":1749191167610,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"7016225f-aa9d-4856-9036-bc8e96f34440","data":{"mobility_status_notify":0},"need_reply":1,"tid":"88d28be4-2527-4745-94cd-f91d18115f88","timestamp":1749191168416,"gateway":"8UUXN4P00A06NK"} + +{"bid":"97657afa-b21f-4449-9a87-c0950ca23d1d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"52d976a7-35e9-4393-bc78-bc76c367ff8f","timestamp":1749191168670,"gateway":"8UUXN4P00A06NK"} + +{"bid":"02afbe9e-7421-4a8d-a95f-b85d6e839deb","data":{"air_transfer_enable":false},"need_reply":1,"tid":"5ca74c7f-6495-4247-b57f-d3c5b6750175","timestamp":1749191168895,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f4101399-af4e-4e35-83b7-edb3eb4dc7b7","data":{"dongle_infos":[]},"tid":"c0d22f1f-6b6c-4841-bc8c-d7bf059d4eeb","timestamp":1749191168902,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b63a369a-879f-4822-bb20-21f6a63e8cde","data":{"dongle_infos":[]},"tid":"449f71ef-6f7e-42d3-8568-61cb08bae719","timestamp":1749191168903,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9a3238e3-1c41-4de3-a865-d8ad9dda99f8","data":{"firmware_version":"13.01.0002"},"tid":"d99d2afb-5594-426a-ad60-9f3b1bcdb76d","timestamp":1749191168908,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e23f3979-6da4-4a9f-baca-f83edbb0bb06","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"461e9691-980f-4f1f-98de-38631a861db4","timestamp":1749191168999,"gateway":"8UUXN4P00A06NK"} + +{"tid":"1e8e2cff-fe4b-46b5-b63e-c1917d217f69","bid":"eaa5456f-900a-4b51-9b5e-3f81923ccf50","timestamp":1749191169240,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"7d4c2292-127f-4ea0-a144-f882fbbbdc53","data":{"dongle_infos":[]},"tid":"5f5c0227-aaeb-4805-81b6-260da845aa73","timestamp":1749191169938,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7016225f-aa9d-4856-9036-bc8e96f34440","data":{"mobility_status_notify":0},"need_reply":1,"tid":"88d28be4-2527-4745-94cd-f91d18115f88","timestamp":1749191170512,"gateway":"8UUXN4P00A06NK"} + +{"bid":"97657afa-b21f-4449-9a87-c0950ca23d1d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"52d976a7-35e9-4393-bc78-bc76c367ff8f","timestamp":1749191170706,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e23f3979-6da4-4a9f-baca-f83edbb0bb06","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"461e9691-980f-4f1f-98de-38631a861db4","timestamp":1749191171112,"gateway":"8UUXN4P00A06NK"} + +{"bid":"92ce1161-7b03-461c-8afc-da4a5d24efa9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7bfaa101-8b9a-4f11-8af9-99f11b5e82a4","timestamp":1749191172610,"gateway":"8UUXN4P00A06NK"} + +{"bid":"02afbe9e-7421-4a8d-a95f-b85d6e839deb","data":{"air_transfer_enable":false},"need_reply":1,"tid":"5ca74c7f-6495-4247-b57f-d3c5b6750175","timestamp":1749191173089,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1e0e51e1-7164-4ecb-9955-c789a9dbeb79","data":{"departure_trajectory":[]},"tid":"577f6e40-865d-4cf2-9383-8a82c4c9aa3c","timestamp":1749191173891,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3a3aa965-5eb0-437a-95e4-df375b986a55","data":{"departure_trajectory":[]},"tid":"d7ace51d-5ce6-4eb1-88a9-a731a0767400","timestamp":1749191174221,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7016225f-aa9d-4856-9036-bc8e96f34440","data":{"mobility_status_notify":0},"need_reply":1,"tid":"88d28be4-2527-4745-94cd-f91d18115f88","timestamp":1749191174712,"gateway":"8UUXN4P00A06NK"} + +{"bid":"92ce1161-7b03-461c-8afc-da4a5d24efa9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7bfaa101-8b9a-4f11-8af9-99f11b5e82a4","timestamp":1749191174713,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e23f3979-6da4-4a9f-baca-f83edbb0bb06","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"461e9691-980f-4f1f-98de-38631a861db4","timestamp":1749191175307,"gateway":"8UUXN4P00A06NK"} + +{"bid":"73ae1a7a-54a6-4eae-9294-489e8b35ff05","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6563c5cd-6942-4792-bc71-9a6dccbd25f0","timestamp":1749191177609,"gateway":"8UUXN4P00A06NK"} + +{"bid":"73ae1a7a-54a6-4eae-9294-489e8b35ff05","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6563c5cd-6942-4792-bc71-9a6dccbd25f0","timestamp":1749191179713,"gateway":"8UUXN4P00A06NK"} + +{"tid":"004af386-a4f3-4b1c-8034-5ade8a485b27","bid":"2f46b1e3-3079-4e19-9ffa-8d533ea319e1","timestamp":1749191205935,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"3a6eebda-8a52-4e3d-8598-a748e9669fdf","bid":"29485f01-b0da-4e8a-9e11-01ecb986dfae","timestamp":1749191205942,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"b17d24c5-179f-45a9-b776-8c92fe749e35","data":{"mobility_status_notify":0},"need_reply":1,"tid":"14d6f864-f502-433a-98e6-ed431d5c7341","timestamp":1749191207621,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0bc088b4-5f73-431e-80ba-7cc710877ec7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2a1c02c4-8910-4203-ac49-c52b7d79e009","timestamp":1749191207623,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a850a727-b0f2-4e7e-88ac-c2b31bbf84ba","data":{"dongle_infos":[]},"tid":"5c55571b-c171-4268-bef5-d002e9ebb1fb","timestamp":1749191208081,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b146f5f4-13aa-45fa-b98a-b4e0fe202519","data":{"firmware_version":"13.01.0002"},"tid":"d252092a-6b5a-4ea4-94f8-76cc785bf00a","timestamp":1749191208088,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2f1dadf0-8a4e-4eca-9182-3e9200edb39d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"4095f6b3-8c56-42bc-8c23-31ac850408da","timestamp":1749191208184,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6cc572fe-0cb1-474e-9626-81939f81bad2","data":{"air_transfer_enable":false},"need_reply":1,"tid":"427abf77-fd92-458b-a30a-adb208491dc3","timestamp":1749191208279,"gateway":"8UUXN4P00A06NK"} + +{"tid":"4fdbc256-0d96-4103-a5d4-d0df8c322d8a","bid":"ba4aae59-57a4-4514-8d50-a084dc934b50","timestamp":1749191208757,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"bb6ce975-ee77-459c-aa0e-4b40fc357d71","data":{"dongle_infos":[]},"tid":"ce69a6eb-a363-4d25-9133-0daa337e3ea5","timestamp":1749191209122,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b17d24c5-179f-45a9-b776-8c92fe749e35","data":{"mobility_status_notify":0},"need_reply":1,"tid":"14d6f864-f502-433a-98e6-ed431d5c7341","timestamp":1749191209771,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0bc088b4-5f73-431e-80ba-7cc710877ec7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2a1c02c4-8910-4203-ac49-c52b7d79e009","timestamp":1749191209773,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2f1dadf0-8a4e-4eca-9182-3e9200edb39d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"4095f6b3-8c56-42bc-8c23-31ac850408da","timestamp":1749191210371,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7f0e5f40-59e9-4a3e-ad50-edc526744138","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c1759d32-0204-45e0-ac50-f233a0e8d368","timestamp":1749191210936,"gateway":"8UUXN4P00A06NK"} + +{"bid":"16a521af-d853-4c0e-95c8-248299a46254","data":{"dongle_infos":[]},"tid":"e6455098-ee75-46b4-95d4-ef48f66764f6","timestamp":1749191211265,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ff22d506-526e-4fac-91ba-75b229acdf17","data":{"departure_trajectory":[]},"tid":"65a40922-9180-4cde-bdec-adc2a86e342e","timestamp":1749191212461,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6cc572fe-0cb1-474e-9626-81939f81bad2","data":{"air_transfer_enable":false},"need_reply":1,"tid":"427abf77-fd92-458b-a30a-adb208491dc3","timestamp":1749191212474,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7f0e5f40-59e9-4a3e-ad50-edc526744138","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c1759d32-0204-45e0-ac50-f233a0e8d368","timestamp":1749191212972,"gateway":"8UUXN4P00A06NK"} + +{"bid":"006259e1-76c0-48e8-bd34-9cad03936c79","data":{"departure_trajectory":[]},"tid":"056cae30-2238-4a54-9ff5-aa08178fa0c2","timestamp":1749191213074,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b17d24c5-179f-45a9-b776-8c92fe749e35","data":{"mobility_status_notify":0},"need_reply":1,"tid":"14d6f864-f502-433a-98e6-ed431d5c7341","timestamp":1749191213971,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2f1dadf0-8a4e-4eca-9182-3e9200edb39d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"4095f6b3-8c56-42bc-8c23-31ac850408da","timestamp":1749191214571,"gateway":"8UUXN4P00A06NK"} + +{"bid":"799081aa-9ce3-46c9-a365-2fdb45b43301","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4ae65c2d-4039-416c-ad93-9ab0a5f9e5a0","timestamp":1749191215936,"gateway":"8UUXN4P00A06NK"} + +{"tid":"fe418cba-b05f-49f8-970f-671c4553d5a0","bid":"814014f9-9db0-4ae8-9c73-9cde3db2441c","timestamp":1749191242996,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"e47e331e-9ec2-46a7-b207-98fb71b00375","bid":"370f81e7-79ea-49a8-b5f5-359a1ed46d9c","timestamp":1749191243003,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"dcea959a-70c4-489d-af83-e516a6fa0602","data":{"air_transfer_enable":false},"need_reply":1,"tid":"019c313e-d94f-40f5-b652-75bc07561d65","timestamp":1749191243870,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7c29457d-cd1e-4d5e-96b1-41111dc3be8a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"2f1ec77a-3b21-46cb-a501-e7ad63794a0a","timestamp":1749191245822,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4792dd6e-fc3c-48e6-b992-c81f3fdf3211","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b330cc21-780b-4a7e-a09b-8f8ece7fb159","timestamp":1749191245826,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2291778a-841a-4185-a962-99fdb614af57","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c5e53ec4-55aa-444a-8128-eeb51a8bc746","timestamp":1749191246275,"gateway":"8UUXN4P00A06NK"} + +{"bid":"39f36440-788e-4b9d-9127-37270dd81ef0","data":{"dongle_infos":[]},"tid":"b84d1070-47be-45c5-a6c4-dba99903ac38","timestamp":1749191246294,"gateway":"8UUXN4P00A06NK"} + +{"bid":"51e0efcf-6279-458f-992b-ad2861003a96","data":{"firmware_version":"13.01.0002"},"tid":"81e029d0-e8b6-4055-9bf9-4f041d8a19fa","timestamp":1749191246305,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dcea959a-70c4-489d-af83-e516a6fa0602","data":{"air_transfer_enable":false},"need_reply":1,"tid":"019c313e-d94f-40f5-b652-75bc07561d65","timestamp":1749191246499,"gateway":"8UUXN4P00A06NK"} + +{"tid":"0c6ee451-50af-4c27-932b-6ffc5c79f7b2","bid":"7903e7f4-f634-4f5b-9ae6-8df3ad6000ab","timestamp":1749191246737,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"13024de1-5f24-4dd8-962b-3378b8b4fd41","data":{"dongle_infos":[]},"tid":"aee4037e-d9ad-44b8-b017-038b90477fc1","timestamp":1749191247344,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7c29457d-cd1e-4d5e-96b1-41111dc3be8a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"2f1ec77a-3b21-46cb-a501-e7ad63794a0a","timestamp":1749191247865,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4792dd6e-fc3c-48e6-b992-c81f3fdf3211","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b330cc21-780b-4a7e-a09b-8f8ece7fb159","timestamp":1749191247866,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ae1a951e-3980-4b9a-a5bc-2fd058a1bf7f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"61bd13fc-8282-4cb8-b4db-50c8cf81597a","timestamp":1749191248011,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2291778a-841a-4185-a962-99fdb614af57","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c5e53ec4-55aa-444a-8128-eeb51a8bc746","timestamp":1749191248465,"gateway":"8UUXN4P00A06NK"} + +{"bid":"41ce0a23-a624-4251-b8b2-0be225cb4454","data":{"dongle_infos":[]},"tid":"3a0bdf64-21aa-4498-85d5-39fc4f2a3553","timestamp":1749191249371,"gateway":"8UUXN4P00A06NK"} + +{"tid":"0cd9a027-487c-41e0-a39f-a64aee897d90","bid":"36f4e0ac-fe93-4ed6-a488-abc0477b881d","timestamp":1749191275553,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"50afad8a-d7ee-4a19-8b44-26c0943ed3db","bid":"e059d967-3ade-41d9-9211-5cebb51638ea","timestamp":1749191275555,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"165ab1f8-3a8b-4cb0-988a-7fcf07c78615","data":{"air_transfer_enable":false},"need_reply":1,"tid":"02efd535-7168-4015-9a1b-6259d4006939","timestamp":1749191275907,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2599e80b-e9e9-423a-8da9-7f27b2b690af","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ba35dba6-c822-46e2-ba57-418343217b91","timestamp":1749191277966,"gateway":"8UUXN4P00A06NK"} + +{"bid":"34e795cf-7fc2-4a82-b8b5-b71665466ed1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"2a10a38a-65a3-4d4e-9a3a-a62909e946c7","timestamp":1749191278044,"gateway":"8UUXN4P00A06NK"} + +{"bid":"11568fd2-ff5c-43bf-a243-476e4678ce14","data":{"dongle_infos":[]},"tid":"1f542a07-a6d5-46bb-84f0-93e76e3e62f3","timestamp":1749191278214,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ad913809-8f09-4321-9fe6-2566ac8760fb","data":{"firmware_version":"13.01.0002"},"tid":"56a76f98-be58-44a6-a770-e1d424d982e5","timestamp":1749191278251,"gateway":"8UUXN4P00A06NK"} + +{"tid":"7fa62497-5c12-4a3e-9cf5-537129a61ab7","bid":"8c73c775-6b86-46e8-9117-4102d6c10575","timestamp":1749191278274,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"165ab1f8-3a8b-4cb0-988a-7fcf07c78615","data":{"air_transfer_enable":false},"need_reply":1,"tid":"02efd535-7168-4015-9a1b-6259d4006939","timestamp":1749191278398,"gateway":"8UUXN4P00A06NK"} + +{"bid":"074df3ce-aa0b-42f4-bf87-e81c9e408895","data":{"mobility_status_notify":0},"need_reply":1,"tid":"dc79cb54-2653-4b04-9dcd-8697acfa4bfe","timestamp":1749191278480,"gateway":"8UUXN4P00A06NK"} + +{"bid":"edb56051-b55d-443a-85cf-b70a30ab4fa7","data":{"dongle_infos":[]},"tid":"370a69e1-0ea2-4348-8e8b-78a183670564","timestamp":1749191279246,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2599e80b-e9e9-423a-8da9-7f27b2b690af","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ba35dba6-c822-46e2-ba57-418343217b91","timestamp":1749191280070,"gateway":"8UUXN4P00A06NK"} + +{"bid":"34e795cf-7fc2-4a82-b8b5-b71665466ed1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"2a10a38a-65a3-4d4e-9a3a-a62909e946c7","timestamp":1749191280071,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fd5620c6-c898-4d6f-9e14-4ed093af3f96","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"aededcf8-a0ff-4f1d-80d1-4ae468f7edfa","timestamp":1749191280553,"gateway":"8UUXN4P00A06NK"} + +{"bid":"074df3ce-aa0b-42f4-bf87-e81c9e408895","data":{"mobility_status_notify":0},"need_reply":1,"tid":"dc79cb54-2653-4b04-9dcd-8697acfa4bfe","timestamp":1749191280668,"gateway":"8UUXN4P00A06NK"} + +{"bid":"09fffbd4-1602-4b9e-8ecc-4318349588e8","data":{"dongle_infos":[]},"tid":"1d3880f7-34fd-4ddb-b4dc-c0a57c1b533c","timestamp":1749191281394,"gateway":"8UUXN4P00A06NK"} + +{"tid":"db9227b3-f912-40ae-b2ca-1a0155ee35fd","bid":"fffb29ed-75bc-43c3-a273-4713d725ebc3","timestamp":1749191305488,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"c63a5e23-599c-4c7e-abd1-199d18f8c2a0","bid":"77b4ea27-052a-4354-bf65-fe9e990c2c88","timestamp":1749191305492,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"b227a052-e215-429e-ae8a-50c95b40d085","bid":"d44e9f47-f497-4070-9953-988631a836ec","timestamp":1749191305800,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"8b194058-8279-4f01-9cc0-03e2d4467299","bid":"ded59703-94c3-47ae-a983-be7476a0537f","timestamp":1749191305802,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"668d9e9f-922f-4e40-be81-5e4879cedffc","bid":"9913fe99-d4ea-4626-af36-5723b6dd34d5","timestamp":1749191305804,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"e6cce067-a0ec-4939-b59e-7dfee5a89a30","data":{"air_transfer_enable":false},"need_reply":1,"tid":"750307c9-a06d-4ba9-9f67-dd68c3eaf01c","timestamp":1749191308069,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ef0ba79b-5ad1-4eb7-9472-9899c872e3fe","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ee6e1512-d7e3-44f6-b65a-9d26fa5c031b","timestamp":1749191310080,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a3141f36-414b-4d82-852f-3a0822460514","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a6be752f-f5cf-4f1c-b010-32c82afd6bd9","timestamp":1749191310084,"gateway":"8UUXN4P00A06NK"} + +{"bid":"28818ae7-9003-4422-aeed-50aff90a2f2d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2630a623-77d9-4249-991d-e6ccad1bc673","timestamp":1749191310492,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c63e9bd-7768-4304-822a-75615a369323","data":{"dongle_infos":[]},"tid":"1716644f-67fd-4985-8d1d-44515723d412","timestamp":1749191310538,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5fd9388a-77be-4b8a-a71b-a9a1f32de698","data":{"firmware_version":"13.01.0002"},"tid":"f97536ad-41f3-4ed8-9680-fd90a3a8940e","timestamp":1749191310544,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5e00f7a4-6b53-4564-b645-9cabf20a8967","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"8f1cb13a-5bfb-44b0-a47b-64c6bf293010","timestamp":1749191310596,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e6cce067-a0ec-4939-b59e-7dfee5a89a30","data":{"air_transfer_enable":false},"need_reply":1,"tid":"750307c9-a06d-4ba9-9f67-dd68c3eaf01c","timestamp":1749191310733,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9354bad6-3383-4551-ae6f-6c227b37dc12","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"624d84af-ca60-4c92-92f5-ed76b48046bf","timestamp":1749191310800,"gateway":"8UUXN4P00A06NK"} + +{"tid":"03c50348-2125-4df9-81c7-2d23d5483911","bid":"7b80441f-0c5f-46bf-97b0-2c1a3d567ba9","timestamp":1749191310817,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"74a865c4-9c85-4616-a7b0-bebacbe9f642","data":{"dongle_infos":[]},"tid":"3f2685d1-6ff2-451c-8c44-33fd149b75c0","timestamp":1749191311573,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ef0ba79b-5ad1-4eb7-9472-9899c872e3fe","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ee6e1512-d7e3-44f6-b65a-9d26fa5c031b","timestamp":1749191312229,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b47339f6-21f4-44d5-9a2c-ab6c0f6e7dba","bid":"0bb16d8b-fbc4-4697-b083-830fb00b430a","timestamp":1749191336028,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"520ab6ef-2f85-4d36-a02a-b85b72aced75","bid":"2fa1496d-e81d-4c30-a119-8379982f5523","timestamp":1749191336031,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"1a1790d3-c002-4e5d-a227-390dadbffa57","data":{"air_transfer_enable":false},"need_reply":1,"tid":"638b9642-4cf9-4695-8e36-d9ba02264ca0","timestamp":1749191338137,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f8b2a9fc-e321-4aa2-b46b-164d75198413","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3fdadf81-5323-4705-90ec-15d0f160ed1f","timestamp":1749191340088,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7c87c9f1-bd18-4f51-861b-e2603a4779c4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"61ecef09-055d-453a-8c2e-5822014d1db6","timestamp":1749191340165,"gateway":"8UUXN4P00A06NK"} + +{"bid":"879e0065-5443-4ac4-b3d5-dbd85841611e","data":{"dongle_infos":[]},"tid":"66dffe70-c823-4a41-8acd-246bde4752ed","timestamp":1749191340484,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3156f364-fe3d-4c0a-ae57-d4dec8435efe","data":{"firmware_version":"13.01.0002"},"tid":"5bdf510c-e52d-4607-87bf-5993b961f66a","timestamp":1749191340494,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1a1790d3-c002-4e5d-a227-390dadbffa57","data":{"air_transfer_enable":false},"need_reply":1,"tid":"638b9642-4cf9-4695-8e36-d9ba02264ca0","timestamp":1749191340672,"gateway":"8UUXN4P00A06NK"} + +{"bid":"75bbedca-3061-4bf7-9ca9-7fc53958478c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"461a18fd-813a-4bf6-bdce-9745a09bdc6e","timestamp":1749191340682,"gateway":"8UUXN4P00A06NK"} + +{"tid":"f35d2df3-a076-4b73-a107-489a83dba2d3","bid":"487274b7-4ff3-4226-b4e2-473d7994cfc7","timestamp":1749191340975,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"c337837a-ead7-4372-bd88-bb7a4888d73d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"dd93d0e9-1107-44d3-95b6-b89505e2783e","timestamp":1749191341035,"gateway":"8UUXN4P00A06NK"} + +{"bid":"454a6d18-f282-4ccb-9d4e-773103bd407e","data":{"dongle_infos":[]},"tid":"fce27a60-264b-4796-9bdb-83a4cf0e2cc8","timestamp":1749191341504,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f8b2a9fc-e321-4aa2-b46b-164d75198413","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3fdadf81-5323-4705-90ec-15d0f160ed1f","timestamp":1749191342219,"gateway":"8UUXN4P00A06NK"} + +{"bid":"75bbedca-3061-4bf7-9ca9-7fc53958478c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"461a18fd-813a-4bf6-bdce-9745a09bdc6e","timestamp":1749191342821,"gateway":"8UUXN4P00A06NK"} + +{"tid":"78296987-83f2-484a-a3f0-88956c5f420a","bid":"e89fd1d3-bc5c-4ad6-8953-d3230b365a7e","timestamp":1749191369388,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"d785e75e-6bc8-4482-89e5-5c2ca869eecf","bid":"e3000bdd-9d1b-4980-998c-d4871dd229b8","timestamp":1749191369392,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"4521a8b7-154f-44ea-874f-713c5ebda7e6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"38e4da21-a5c2-4d39-a5c6-accf74a6c3e6","timestamp":1749191370496,"gateway":"8UUXN4P00A06NK"} + +{"bid":"46ebc5d4-0020-427e-a038-d25e4f68dd16","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e3902061-f382-4b06-a23e-85b1453add98","timestamp":1749191370523,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3048e7be-2847-41ec-9a59-5ee8554106cc","data":{"dongle_infos":[]},"tid":"e0ff6425-279d-482f-b719-02b9b338ca4a","timestamp":1749191370883,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5a235465-0775-42b7-ae5d-c571633d6f1a","data":{"firmware_version":"13.01.0002"},"tid":"98a392df-8e2c-4d53-8db1-045a144cad4a","timestamp":1749191370892,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2745b608-3700-418d-b90e-341214a7f97d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"518379c2-1079-4dcd-969f-034ef00b8191","timestamp":1749191371070,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fa067c7d-5117-4fc5-8b44-adef048a9ec9","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b8ba75e9-6e77-4f2a-a403-9556dda3e861","timestamp":1749191371076,"gateway":"8UUXN4P00A06NK"} + +{"tid":"7800b970-8a90-40a9-97c8-073cdb05b0c6","bid":"6031d2e4-7cb9-4d05-b8c8-d876f7a2ca3c","timestamp":1749191371233,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"9aea8497-de04-4738-bf89-142023c45dc1","data":{"dongle_infos":[]},"tid":"a7429a3e-2cae-411a-9f6b-4d83a5d09371","timestamp":1749191371883,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4521a8b7-154f-44ea-874f-713c5ebda7e6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"38e4da21-a5c2-4d39-a5c6-accf74a6c3e6","timestamp":1749191372632,"gateway":"8UUXN4P00A06NK"} + +{"bid":"46ebc5d4-0020-427e-a038-d25e4f68dd16","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e3902061-f382-4b06-a23e-85b1453add98","timestamp":1749191372633,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fa067c7d-5117-4fc5-8b44-adef048a9ec9","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b8ba75e9-6e77-4f2a-a403-9556dda3e861","timestamp":1749191373233,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e435bcef-db20-46d5-96f9-569712610598","data":{"dongle_infos":[]},"tid":"a39b5a05-29d2-47ca-a98f-8f4991ce7023","timestamp":1749191374224,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4064368d-454c-4848-b1e9-60974d1fe27f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4530c43c-b55d-4507-83fb-1a74f35d1f96","timestamp":1749191374384,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2745b608-3700-418d-b90e-341214a7f97d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"518379c2-1079-4dcd-969f-034ef00b8191","timestamp":1749191375276,"gateway":"8UUXN4P00A06NK"} + +{"bid":"646f652b-3fcb-45d3-ad94-8dc4a142a6ac","data":{"departure_trajectory":[]},"tid":"5c75368c-c9c2-480a-8142-0c022b61aeb1","timestamp":1749191375878,"gateway":"8UUXN4P00A06NK"} + +{"bid":"07c62f38-78b2-42fc-9447-ecf3c3e0d685","data":{"departure_trajectory":[]},"tid":"3e9f9ff8-b590-4e9d-adb1-17e0f30682a4","timestamp":1749191376045,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4064368d-454c-4848-b1e9-60974d1fe27f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4530c43c-b55d-4507-83fb-1a74f35d1f96","timestamp":1749191376435,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4521a8b7-154f-44ea-874f-713c5ebda7e6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"38e4da21-a5c2-4d39-a5c6-accf74a6c3e6","timestamp":1749191376832,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fa067c7d-5117-4fc5-8b44-adef048a9ec9","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b8ba75e9-6e77-4f2a-a403-9556dda3e861","timestamp":1749191377431,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1c862ec2-2d5b-4402-81fb-9a26648156ac","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"895d3dff-1098-4cb6-97d8-fdb9903545cb","timestamp":1749191379387,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1c862ec2-2d5b-4402-81fb-9a26648156ac","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"895d3dff-1098-4cb6-97d8-fdb9903545cb","timestamp":1749191381431,"gateway":"8UUXN4P00A06NK"} + +{"tid":"dbf9f89e-26eb-45d6-940b-200b68956f6a","bid":"e7e4ea6c-7648-46ff-8a1b-2abdaad5c3b6","timestamp":1749191406798,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"37968c82-28f0-407d-82b0-cfa4be11e506","bid":"d41536c5-db28-4bb7-aa2b-a68ac7b1f7b2","timestamp":1749191406805,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"5f80468c-0141-4d4a-83b4-f9703255e1de","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2bb9d96c-3d83-4a8b-90f9-cad1824aafa0","timestamp":1749191407821,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4767e8f1-7e69-4b49-9474-c1dc8fde1a6c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"92c2dd9b-24eb-48a0-9461-93e60a9f406c","timestamp":1749191409783,"gateway":"8UUXN4P00A06NK"} + +{"bid":"78b8f6fb-f950-4ccf-8d52-9fee1b0baee6","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e49d2252-ee8c-4826-b71e-1c62a2e09637","timestamp":1749191410006,"gateway":"8UUXN4P00A06NK"} + +{"bid":"38fc4163-e0c2-4e9b-a7c8-385bb267945b","data":{"dongle_infos":[]},"tid":"452c7939-c4cc-4e11-bc5a-800a70b2c17c","timestamp":1749191410212,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1c8346b8-2eb6-48a9-8d72-b3354b89ffc3","data":{"firmware_version":"13.01.0002"},"tid":"319bc477-2e24-4857-8e55-ff17a19843ce","timestamp":1749191410225,"gateway":"8UUXN4P00A06NK"} + +{"tid":"fc8aef49-79ab-4b50-a642-2f6d58b41576","bid":"fdf63ad4-93d4-4734-b3b9-c80639a55f97","timestamp":1749191410393,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"5f80468c-0141-4d4a-83b4-f9703255e1de","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2bb9d96c-3d83-4a8b-90f9-cad1824aafa0","timestamp":1749191410407,"gateway":"8UUXN4P00A06NK"} + +{"bid":"549d352c-78ea-494c-a30e-c72812dcc9ac","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3f556c31-1477-451e-9c7f-f9e731865576","timestamp":1749191410452,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e484b15f-62e9-4ea7-9cce-e93d93660b0f","data":{"dongle_infos":[]},"tid":"6546feea-fed1-47d4-b108-abc3ecfe5e65","timestamp":1749191411221,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f276421f-e9be-4723-95e8-83c1d23bbacc","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"564bafae-dcf6-43f3-a04c-3979540adea8","timestamp":1749191411814,"gateway":"8UUXN4P00A06NK"} + +{"bid":"78b8f6fb-f950-4ccf-8d52-9fee1b0baee6","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e49d2252-ee8c-4826-b71e-1c62a2e09637","timestamp":1749191412077,"gateway":"8UUXN4P00A06NK"} + +{"bid":"549d352c-78ea-494c-a30e-c72812dcc9ac","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3f556c31-1477-451e-9c7f-f9e731865576","timestamp":1749191412480,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c24993f1-09b2-415e-a851-9bb4eedb7ddb","bid":"5ba2c56d-553c-460f-b88c-5bbe378974b4","timestamp":1749191440344,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"8bb03105-18c8-4fc1-b63c-cea99747748c","bid":"638a92d9-c367-473e-bb54-749e6268a9b2","timestamp":1749191440347,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"5c0f4cae-421f-4b5e-9811-d4b784b180ae","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7d4a9961-310b-4c76-a4ab-bf0be69b4414","timestamp":1749191441399,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bb0db394-9d6a-4e23-9e12-cc6d16af3bcd","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"290b4982-8cce-45c9-925c-435ee34cb43f","timestamp":1749191441474,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c34d0b3-3673-4ee3-826f-9d6942b31499","data":{"air_transfer_enable":false},"need_reply":1,"tid":"c0b1cd9d-5c2f-4e9b-ab26-5c96814f11e5","timestamp":1749191441827,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c8cf39df-90ee-4096-b6f4-1e0d73ecbfa5","data":{"dongle_infos":[]},"tid":"7280881d-4e25-40ee-a2c3-8e5b84aaff58","timestamp":1749191441838,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c6b491e8-c3b8-4cfe-8a2d-a9e5f78e09d1","data":{"firmware_version":"13.01.0002"},"tid":"0769955c-33d9-4c54-9a50-235c588abea3","timestamp":1749191441844,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a3db80ef-3a7e-4b71-8273-a1c19c1c694f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"01aebd3c-40a2-42ae-8f34-02e45737be9e","timestamp":1749191442008,"gateway":"8UUXN4P00A06NK"} + +{"tid":"fc521ce4-0477-48c8-8383-a60e75c00e95","bid":"60b9f17c-03c5-4fbc-9e7f-e2990dd8bf3d","timestamp":1749191442143,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"4b953fe9-2a34-4abe-bd01-f731fceee6ec","data":{"dongle_infos":[]},"tid":"0d5543fd-ad46-41f6-a654-e416a1a1283f","timestamp":1749191442838,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5c0f4cae-421f-4b5e-9811-d4b784b180ae","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7d4a9961-310b-4c76-a4ab-bf0be69b4414","timestamp":1749191443446,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bb0db394-9d6a-4e23-9e12-cc6d16af3bcd","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"290b4982-8cce-45c9-925c-435ee34cb43f","timestamp":1749191443646,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a3db80ef-3a7e-4b71-8273-a1c19c1c694f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"01aebd3c-40a2-42ae-8f34-02e45737be9e","timestamp":1749191444045,"gateway":"8UUXN4P00A06NK"} + +{"bid":"07a0e93b-dd92-48e1-909d-7469a69d7b13","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"41ae4511-dd8f-4d2d-b5b2-c4c0faca9261","timestamp":1749191445340,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c34d0b3-3673-4ee3-826f-9d6942b31499","data":{"air_transfer_enable":false},"need_reply":1,"tid":"c0b1cd9d-5c2f-4e9b-ab26-5c96814f11e5","timestamp":1749191446032,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bb468cd1-39fb-4798-83ee-4c22c886ec4d","data":{"dongle_infos":[]},"tid":"50a717fd-b0dd-4a22-93f3-784157964daf","timestamp":1749191446160,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1aba5fd9-6e79-450c-89ba-379d817d0974","data":{"departure_trajectory":[]},"tid":"d54261ba-192f-458f-a753-49d009069f75","timestamp":1749191446830,"gateway":"8UUXN4P00A06NK"} + +{"bid":"585ff79e-9ddb-42b2-bbbd-b1b6f5073727","data":{"departure_trajectory":[]},"tid":"2780dcf5-5f6d-4fd4-93bc-c6e7efbbb8ce","timestamp":1749191447007,"gateway":"8UUXN4P00A06NK"} + +{"bid":"07a0e93b-dd92-48e1-909d-7469a69d7b13","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"41ae4511-dd8f-4d2d-b5b2-c4c0faca9261","timestamp":1749191447446,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5c0f4cae-421f-4b5e-9811-d4b784b180ae","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7d4a9961-310b-4c76-a4ab-bf0be69b4414","timestamp":1749191447647,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a3db80ef-3a7e-4b71-8273-a1c19c1c694f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"01aebd3c-40a2-42ae-8f34-02e45737be9e","timestamp":1749191448248,"gateway":"8UUXN4P00A06NK"} + +{"bid":"08c2da97-392b-4e3e-b3ca-7766ad461cdb","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"36767f71-f5f7-4cc2-bcb4-e397f77692ba","timestamp":1749191450338,"gateway":"8UUXN4P00A06NK"} + +{"bid":"08c2da97-392b-4e3e-b3ca-7766ad461cdb","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"36767f71-f5f7-4cc2-bcb4-e397f77692ba","timestamp":1749191452446,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c1788a21-c3db-4f7e-9fdc-0e6375cf14da","bid":"f3663fe3-700f-45b3-b5a6-20e8ba1cfc1f","timestamp":1749191477384,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"14b91650-2674-429e-9c37-c6f61f758823","bid":"e2fa8281-aada-46ce-9d97-7c7556e161d9","timestamp":1749191477388,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"854fad55-d275-4606-9063-5c9a79cbb7fd","data":{"air_transfer_enable":false},"need_reply":1,"tid":"83ecf711-d01f-4a65-994a-61a033f1f207","timestamp":1749191479426,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b749ab91-46e6-412d-93fb-c76ae60919de","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7f7bd4a4-fd34-46fa-99b7-903592b72120","timestamp":1749191481387,"gateway":"8UUXN4P00A06NK"} + +{"bid":"af824a70-fe5b-446f-9b08-9c9f909866c0","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e7e7cc2a-daf7-4a73-b972-4eb19f326f8f","timestamp":1749191481625,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ef54065f-615c-4ccb-bc4f-3a6de7bac79d","data":{"dongle_infos":[]},"tid":"d1e0ee40-2284-4ab2-9d6c-2cbbd679d65d","timestamp":1749191481809,"gateway":"8UUXN4P00A06NK"} + +{"bid":"35588cbb-7a35-41fa-8309-13ea5bd3a325","data":{"firmware_version":"13.01.0002"},"tid":"5291899e-9923-45a9-96dc-c2c92608313e","timestamp":1749191481815,"gateway":"8UUXN4P00A06NK"} + +{"bid":"854fad55-d275-4606-9063-5c9a79cbb7fd","data":{"air_transfer_enable":false},"need_reply":1,"tid":"83ecf711-d01f-4a65-994a-61a033f1f207","timestamp":1749191482004,"gateway":"8UUXN4P00A06NK"} + +{"bid":"123a966a-5637-446c-96c7-5aa795175955","data":{"mobility_status_notify":0},"need_reply":1,"tid":"b1cf00c3-761d-4901-8586-17662d727fa7","timestamp":1749191482076,"gateway":"8UUXN4P00A06NK"} + +{"tid":"0e27959b-2966-4398-8cdb-3372831929cf","bid":"1c8ca8c0-2a2b-410e-972b-ef9ad5810741","timestamp":1749191482351,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"1641cc38-7af9-4465-a2d5-814cd939c5f2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0853bdc3-52c8-41eb-ae43-57fed60a482b","timestamp":1749191482391,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7a30ca1c-5b4a-42cb-abe6-73881090188e","data":{"dongle_infos":[]},"tid":"e71dc6f8-0dbc-4b44-97b4-b047a9e0b6ac","timestamp":1749191482878,"gateway":"8UUXN4P00A06NK"} + +{"bid":"af824a70-fe5b-446f-9b08-9c9f909866c0","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e7e7cc2a-daf7-4a73-b972-4eb19f326f8f","timestamp":1749191483708,"gateway":"8UUXN4P00A06NK"} + +{"bid":"123a966a-5637-446c-96c7-5aa795175955","data":{"mobility_status_notify":0},"need_reply":1,"tid":"b1cf00c3-761d-4901-8586-17662d727fa7","timestamp":1749191484106,"gateway":"8UUXN4P00A06NK"} + +{"tid":"9802950e-0b2d-4bcf-9d54-af3f40935c78","bid":"a191d5eb-cb0b-4b89-8b3b-585e7df9da1d","timestamp":1749191509868,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"e39b6c6d-b1c5-4fac-8523-cd0a0d3b877c","bid":"89dda2f4-84bf-4ce2-bf53-e01878004afb","timestamp":1749191509870,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"6a00e5b4-4e93-4a26-88ab-fb1ac07c2e71","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e0201ca5-9eb9-4e11-90ab-4b9dd91e54d4","timestamp":1749191510923,"gateway":"8UUXN4P00A06NK"} + +{"bid":"51911a51-c5cf-4ad8-b019-61b4984928b7","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"0f217fae-25a8-4b20-8f03-d2f93c074a75","timestamp":1749191510965,"gateway":"8UUXN4P00A06NK"} + +{"bid":"16f19014-bf41-405d-97b4-28388b0d4f07","data":{"air_transfer_enable":false},"need_reply":1,"tid":"adba0654-cf95-45e6-9f47-67c92fca2e50","timestamp":1749191511334,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8f4ab551-9d53-4274-9829-c83dfe843b18","data":{"dongle_infos":[]},"tid":"a82aa633-1fdf-476f-8267-21d6310d3ac9","timestamp":1749191511340,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c80f49c-0d48-44e3-a5e0-37620b6a83f4","data":{"dongle_infos":[]},"tid":"01d576ae-1c1a-48db-bba4-2eaf7e662783","timestamp":1749191511341,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e12ed04c-58c2-4577-b382-35ae81557628","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f1cb1f77-736c-4473-9876-9f55f6b56ac5","timestamp":1749191511367,"gateway":"8UUXN4P00A06NK"} + +{"bid":"04f45f24-e464-48e9-a606-45623bb5ccf9","data":{"firmware_version":"13.01.0002"},"tid":"ec1db16e-ac22-48ba-83b0-887e96add356","timestamp":1749191511376,"gateway":"8UUXN4P00A06NK"} + +{"bid":"802f7cea-7c78-49a4-8290-d68f68280ff9","data":{"dongle_infos":[]},"tid":"5815a0c7-aea7-4e46-9aca-c5d861468ca1","timestamp":1749191512372,"gateway":"8UUXN4P00A06NK"} + +{"tid":"92b15a53-12da-4ba6-be3b-11aff31c85c6","bid":"2ff049eb-6ada-4506-8e93-4ef0c65a087f","timestamp":1749191512402,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"6a00e5b4-4e93-4a26-88ab-fb1ac07c2e71","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e0201ca5-9eb9-4e11-90ab-4b9dd91e54d4","timestamp":1749191513105,"gateway":"8UUXN4P00A06NK"} + +{"bid":"51911a51-c5cf-4ad8-b019-61b4984928b7","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"0f217fae-25a8-4b20-8f03-d2f93c074a75","timestamp":1749191513106,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e12ed04c-58c2-4577-b382-35ae81557628","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f1cb1f77-736c-4473-9876-9f55f6b56ac5","timestamp":1749191513505,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c63eb0e9-1c84-498b-b658-0f3dd4b3c609","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"70cd4633-f121-4fcc-889e-8c96399b1ebd","timestamp":1749191514864,"gateway":"8UUXN4P00A06NK"} + +{"bid":"16f19014-bf41-405d-97b4-28388b0d4f07","data":{"air_transfer_enable":false},"need_reply":1,"tid":"adba0654-cf95-45e6-9f47-67c92fca2e50","timestamp":1749191515534,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a3d3dd5c-b618-4f9a-99c9-0d8041d041bf","data":{"departure_trajectory":[]},"tid":"a64bf585-026e-47fc-a631-3f867df343d1","timestamp":1749191516336,"gateway":"8UUXN4P00A06NK"} + +{"bid":"38c4975a-439b-4c95-b689-d07fb62fd2c7","data":{"departure_trajectory":[]},"tid":"c772db5b-dfda-4bab-af87-dd3b1503eeee","timestamp":1749191516593,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c63eb0e9-1c84-498b-b658-0f3dd4b3c609","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"70cd4633-f121-4fcc-889e-8c96399b1ebd","timestamp":1749191516905,"gateway":"8UUXN4P00A06NK"} + +{"bid":"51911a51-c5cf-4ad8-b019-61b4984928b7","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"0f217fae-25a8-4b20-8f03-d2f93c074a75","timestamp":1749191517299,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e12ed04c-58c2-4577-b382-35ae81557628","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f1cb1f77-736c-4473-9876-9f55f6b56ac5","timestamp":1749191517705,"gateway":"8UUXN4P00A06NK"} + +{"bid":"90b94f7e-c393-42a4-9f05-b7fc7fe5b9db","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6ba4bb37-df7a-4b65-adf9-903035697930","timestamp":1749191519863,"gateway":"8UUXN4P00A06NK"} + +{"bid":"90b94f7e-c393-42a4-9f05-b7fc7fe5b9db","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6ba4bb37-df7a-4b65-adf9-903035697930","timestamp":1749191521903,"gateway":"8UUXN4P00A06NK"} + +{"tid":"a85867c0-915d-4b0f-b7ec-e0878dc87445","bid":"26fc057a-9930-4818-8edf-b7f91251223b","timestamp":1749191547570,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"3ec3cceb-60a2-4118-bb08-318c5b0053b5","bid":"a051a019-685f-428e-ab33-36741f8b0eb3","timestamp":1749191547574,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"2d39b5b5-21fa-4beb-acc3-4c32c48032aa","data":{"air_transfer_enable":false},"need_reply":1,"tid":"392fe2fc-64d1-4582-91a4-5ba9ad6380d6","timestamp":1749191548327,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1a594603-bc26-457b-a3d8-1e7b9e49dad6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d7171456-5560-4578-9650-9fca81888afb","timestamp":1749191550358,"gateway":"8UUXN4P00A06NK"} + +{"bid":"19f2a4cf-5d28-4430-942d-8c3ee5c8a449","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1c2d72d5-bd8e-4f15-8a48-7289ca9fc894","timestamp":1749191550400,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7dcfb99a-de24-4533-96dc-473b709ef964","data":{"dongle_infos":[]},"tid":"8a6f91c9-7e5e-45b2-9d1e-2ac4497c5ce3","timestamp":1749191550675,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6e7f3047-09e0-4bec-b8dc-7d243901e000","data":{"firmware_version":"13.01.0002"},"tid":"9153bd1a-1fdf-4c36-9efe-3dcadef0ce1f","timestamp":1749191550681,"gateway":"8UUXN4P00A06NK"} + +{"bid":"599c19e5-95fb-4888-ad87-83c4662474fa","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c0270b29-8005-487d-8ab5-6ed554d1c83a","timestamp":1749191550806,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2d39b5b5-21fa-4beb-acc3-4c32c48032aa","data":{"air_transfer_enable":false},"need_reply":1,"tid":"392fe2fc-64d1-4582-91a4-5ba9ad6380d6","timestamp":1749191550870,"gateway":"8UUXN4P00A06NK"} + +{"tid":"7543c2aa-00a4-432d-b6ae-29d4b6cb6a3e","bid":"47554f5a-08bb-4589-b390-6e63c8cc091e","timestamp":1749191551197,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"b791951e-5ddf-48a5-ad67-099f00f4bda7","data":{"dongle_infos":[]},"tid":"c89af2d8-5a4c-4ffb-bda2-123bf3c1c39a","timestamp":1749191551681,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1a594603-bc26-457b-a3d8-1e7b9e49dad6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d7171456-5560-4578-9650-9fca81888afb","timestamp":1749191552520,"gateway":"8UUXN4P00A06NK"} + +{"bid":"19f2a4cf-5d28-4430-942d-8c3ee5c8a449","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1c2d72d5-bd8e-4f15-8a48-7289ca9fc894","timestamp":1749191552521,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2a539fa4-366c-46e6-9b9a-907deaee9e8b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"88cfaf0b-d49a-47ca-bf54-b8586c7ee6c7","timestamp":1749191552576,"gateway":"8UUXN4P00A06NK"} + +{"bid":"599c19e5-95fb-4888-ad87-83c4662474fa","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c0270b29-8005-487d-8ab5-6ed554d1c83a","timestamp":1749191552922,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cbd4d919-ccaa-4300-9533-223509e87456","data":{"dongle_infos":[]},"tid":"7ff51b63-8f69-49f8-bda2-81f7da42aa82","timestamp":1749191554154,"gateway":"8UUXN4P00A06NK"} + +{"tid":"676739a9-20a8-43c2-85d4-b1fa6b728cd0","bid":"f1910da9-cf56-43cb-8a45-20846c326750","timestamp":1749191579887,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"0ce91616-b38e-49f8-a5f8-1044e1547c68","bid":"0623d1b4-5da7-4d73-afb3-d04616e3c9e8","timestamp":1749191579891,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"0d55bd33-e954-45c0-bacf-0a12b0364947","data":{"air_transfer_enable":false},"need_reply":1,"tid":"a3f6aaa9-185a-4663-b33f-5944206e0e1f","timestamp":1749191580812,"gateway":"8UUXN4P00A06NK"} + +{"bid":"68348810-dfae-4a30-8e80-3f2fb5a32f54","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d27bdadb-95fc-4e20-a1d1-1bfb6442a41a","timestamp":1749191582805,"gateway":"8UUXN4P00A06NK"} + +{"bid":"07109afe-7d9b-4365-971e-6b34c6e2adbf","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"40ee70d8-85f4-4e15-b777-3566af157d2c","timestamp":1749191583003,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0863db9e-745c-4364-9270-a9a5e7a25b89","data":{"dongle_infos":[]},"tid":"b1906423-100b-4263-a050-2133c131eb3a","timestamp":1749191583192,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1e97c1ec-25c8-42af-92a3-75a2d301cc8f","data":{"dongle_infos":[]},"tid":"98fe020b-bea7-413b-9d2f-2884194c914c","timestamp":1749191583193,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e4cebafd-ed8d-471a-a97c-b3f8bdd295bc","data":{"firmware_version":"13.01.0002"},"tid":"e384d439-a18d-459f-9c05-26e0332f4f03","timestamp":1749191583198,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1a66b20e-1b24-4f9b-a576-53ef57137a25","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ce5c28cc-3483-4713-823e-6c5e43fa79ed","timestamp":1749191583301,"gateway":"8UUXN4P00A06NK"} + +{"tid":"251f6d8b-1844-4bae-890b-7470779a593b","bid":"9903aa12-f113-47cc-a70e-522a0b2de5fb","timestamp":1749191583325,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"0d55bd33-e954-45c0-bacf-0a12b0364947","data":{"air_transfer_enable":false},"need_reply":1,"tid":"a3f6aaa9-185a-4663-b33f-5944206e0e1f","timestamp":1749191583433,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e0a18a33-1ff0-4ae3-af48-498012f4797f","data":{"dongle_infos":[]},"tid":"7070ca40-cec5-402b-beca-ec490e513a29","timestamp":1749191584192,"gateway":"8UUXN4P00A06NK"} + +{"bid":"495c15e9-b9da-40ef-930f-154e5a72fb12","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0794727c-ded5-44ba-a979-7e22c848edf4","timestamp":1749191584882,"gateway":"8UUXN4P00A06NK"} + +{"bid":"68348810-dfae-4a30-8e80-3f2fb5a32f54","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d27bdadb-95fc-4e20-a1d1-1bfb6442a41a","timestamp":1749191584979,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1a66b20e-1b24-4f9b-a576-53ef57137a25","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ce5c28cc-3483-4713-823e-6c5e43fa79ed","timestamp":1749191585379,"gateway":"8UUXN4P00A06NK"} + +{"tid":"f333955a-459d-46e6-84a7-ac3fb90e7724","bid":"c120ff91-4cff-4353-bbae-74fbe4d4d834","timestamp":1749191613338,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"059fc67a-6b82-40be-9260-d0dca92a2d67","bid":"0778d6da-ce38-427a-b901-2198a89f8d6e","timestamp":1749191613342,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"df5b0bb2-78d5-4028-9d37-4805e8f6cdb8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3ccb9928-43bd-4c75-8267-41c691e83c44","timestamp":1749191614525,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5b3efa6a-8b1a-4b61-b321-5e17be502d07","data":{"mobility_status_notify":0},"need_reply":1,"tid":"06ba3be7-751d-40cd-9036-14d74b1b8ba3","timestamp":1749191614535,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d309d5ee-041a-46b7-bf61-5d8f77433f41","data":{"dongle_infos":[]},"tid":"1e5b0e90-fbdb-473d-adde-db73cd872b94","timestamp":1749191614909,"gateway":"8UUXN4P00A06NK"} + +{"bid":"552cfb2f-78e8-4736-84e7-9ef8d8d20318","data":{"firmware_version":"13.01.0002"},"tid":"d303b087-044a-4cd6-a971-0222b0cccd8f","timestamp":1749191614918,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f6f21dac-4ecc-4edd-a2e9-086531789a60","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2af2592a-ba9c-4d0d-b781-7ee2ca5dbc54","timestamp":1749191615092,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f5fc361b-fc23-4779-b2cf-c2f627cbf06a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"dfc7e434-f5b8-422d-a187-b803b565d274","timestamp":1749191615127,"gateway":"8UUXN4P00A06NK"} + +{"tid":"454e0122-1d66-4b08-a995-aecce6e6bd9b","bid":"2290e4c0-e913-4c48-882f-9a4303b7d28e","timestamp":1749191615253,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"abb34786-a764-4161-9ddb-8e7aa62f0ad0","data":{"dongle_infos":[]},"tid":"a333aba8-1581-42fe-83dc-d20a91bc2dae","timestamp":1749191615911,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df5b0bb2-78d5-4028-9d37-4805e8f6cdb8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3ccb9928-43bd-4c75-8267-41c691e83c44","timestamp":1749191616602,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5b3efa6a-8b1a-4b61-b321-5e17be502d07","data":{"mobility_status_notify":0},"need_reply":1,"tid":"06ba3be7-751d-40cd-9036-14d74b1b8ba3","timestamp":1749191616603,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f5fc361b-fc23-4779-b2cf-c2f627cbf06a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"dfc7e434-f5b8-422d-a187-b803b565d274","timestamp":1749191617209,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e79b9c79-a2cd-4992-af79-993f2d0e75a0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7a6bd29e-8210-4489-bc8a-05cd2d04e0ee","timestamp":1749191618339,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2f1b9c12-a25c-42c8-b32a-9f157151aa70","data":{"dongle_infos":[]},"tid":"3dfdf601-5428-4c0a-9e74-3f7dc08683ec","timestamp":1749191618358,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f6f21dac-4ecc-4edd-a2e9-086531789a60","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2af2592a-ba9c-4d0d-b781-7ee2ca5dbc54","timestamp":1749191619297,"gateway":"8UUXN4P00A06NK"} + +{"bid":"44c8a6f0-12bc-4192-af5b-49a07631c5ab","data":{"departure_trajectory":[]},"tid":"ab913e86-7c8d-4733-a4b2-5071689afa59","timestamp":1749191619899,"gateway":"8UUXN4P00A06NK"} + +{"bid":"83e2c9ce-fc1a-4a5d-a443-efca66ed6a27","data":{"departure_trajectory":[]},"tid":"f0c757d7-2812-4465-99bb-1ed17f05f175","timestamp":1749191620004,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e79b9c79-a2cd-4992-af79-993f2d0e75a0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7a6bd29e-8210-4489-bc8a-05cd2d04e0ee","timestamp":1749191620403,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5b3efa6a-8b1a-4b61-b321-5e17be502d07","data":{"mobility_status_notify":0},"need_reply":1,"tid":"06ba3be7-751d-40cd-9036-14d74b1b8ba3","timestamp":1749191620803,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f5fc361b-fc23-4779-b2cf-c2f627cbf06a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"dfc7e434-f5b8-422d-a187-b803b565d274","timestamp":1749191621408,"gateway":"8UUXN4P00A06NK"} + +{"bid":"95cc44ba-ecc6-4c49-a724-e99935951a4e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e3aa5771-dc49-48e2-a728-48cf9cf6aa6f","timestamp":1749191623338,"gateway":"8UUXN4P00A06NK"} + +{"bid":"95cc44ba-ecc6-4c49-a724-e99935951a4e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e3aa5771-dc49-48e2-a728-48cf9cf6aa6f","timestamp":1749191625408,"gateway":"8UUXN4P00A06NK"} + +{"tid":"0ec1b4e9-a441-4fec-9985-94cf6b808166","bid":"b4eaa552-a51e-44a7-975a-8dcbd45c6085","timestamp":1749191651251,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"2fb11670-b1ea-41f9-bef8-fe79318d2828","bid":"9ea93787-f71a-48e7-80ab-0e10e5b1b2a4","timestamp":1749191651253,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"116c60af-e6c7-47a9-8902-3670dcc1b42a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"6647ea11-1f29-4e80-b8fa-00d6a4d7f6f1","timestamp":1749191652816,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1614342f-23e8-44f4-8acf-e59098dca08e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"fa676161-8ff8-42e7-9d9d-e31a0d659def","timestamp":1749191652821,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b47579b6-c937-48eb-b152-74c9b00b3138","data":{"dongle_infos":[]},"tid":"b6a36cdf-8245-4749-9ee5-4bf45eab6c9c","timestamp":1749191653279,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d1091775-59f0-4a70-b91b-587193c50c33","data":{"firmware_version":"13.01.0002"},"tid":"d586cd5d-60ed-4b80-89e4-445a1d93f31b","timestamp":1749191653287,"gateway":"8UUXN4P00A06NK"} + +{"bid":"361d3372-33df-4769-840b-ae21f5eef180","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"716e3960-4ad3-405e-8dd5-4c81058bf332","timestamp":1749191653287,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2f84f488-1f50-4c5a-ad8d-4644cdc64454","data":{"air_transfer_enable":false},"need_reply":1,"tid":"bab27de4-7317-4186-9434-25d85d444581","timestamp":1749191653472,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c8cadd50-0c43-47b1-b9c0-af5f19fdc3f4","bid":"a9c44234-b613-4046-b391-cc8d81b509fa","timestamp":1749191653725,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"dc0f2523-030c-48be-b35b-f042dd0c8a8b","data":{"dongle_infos":[]},"tid":"e39fe474-1370-419f-b248-baca440edf92","timestamp":1749191654280,"gateway":"8UUXN4P00A06NK"} + +{"bid":"116c60af-e6c7-47a9-8902-3670dcc1b42a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"6647ea11-1f29-4e80-b8fa-00d6a4d7f6f1","timestamp":1749191654947,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1614342f-23e8-44f4-8acf-e59098dca08e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"fa676161-8ff8-42e7-9d9d-e31a0d659def","timestamp":1749191654948,"gateway":"8UUXN4P00A06NK"} + +{"bid":"361d3372-33df-4769-840b-ae21f5eef180","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"716e3960-4ad3-405e-8dd5-4c81058bf332","timestamp":1749191655347,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7fea2452-1f6f-4ebe-bde9-295ac4bb77da","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b916a012-11b9-4fcb-af6c-b6b199f01479","timestamp":1749191656251,"gateway":"8UUXN4P00A06NK"} + +{"bid":"97aa8d74-b30c-4c6a-8297-84bb52e42bd9","data":{"dongle_infos":[]},"tid":"76c0f7a6-e52c-4267-b219-644f9e928665","timestamp":1749191657537,"gateway":"8UUXN4P00A06NK"} + +{"bid":"64094706-5108-481e-a91c-dca330be7d04","data":{"departure_trajectory":[]},"tid":"8816f670-2032-491b-bf02-5d98af799375","timestamp":1749191657650,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2f84f488-1f50-4c5a-ad8d-4644cdc64454","data":{"air_transfer_enable":false},"need_reply":1,"tid":"bab27de4-7317-4186-9434-25d85d444581","timestamp":1749191657666,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7ee73e0a-e8c6-48d8-ad34-eaebec348717","data":{"departure_trajectory":[]},"tid":"7d290190-00a9-4028-a40d-f2f960a75fa3","timestamp":1749191658269,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7fea2452-1f6f-4ebe-bde9-295ac4bb77da","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b916a012-11b9-4fcb-af6c-b6b199f01479","timestamp":1749191658346,"gateway":"8UUXN4P00A06NK"} + +{"bid":"116c60af-e6c7-47a9-8902-3670dcc1b42a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"6647ea11-1f29-4e80-b8fa-00d6a4d7f6f1","timestamp":1749191659147,"gateway":"8UUXN4P00A06NK"} + +{"bid":"361d3372-33df-4769-840b-ae21f5eef180","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"716e3960-4ad3-405e-8dd5-4c81058bf332","timestamp":1749191659546,"gateway":"8UUXN4P00A06NK"} + +{"bid":"52482f3a-7448-407b-9d8f-a88daf934e52","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"507f8859-e3d3-4c49-b31d-d174799113ec","timestamp":1749191661247,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c8a18b32-e17d-41c7-986f-9d6d59934d6c","bid":"5717efb4-3433-4a7f-a3cd-e626d78e9e18","timestamp":1749191687302,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"4111fa70-9d57-4daf-8980-3e617a7e2da4","bid":"6ead584a-d7ab-4150-89c6-ec556b7caf3e","timestamp":1749191687304,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"7ffc9905-9350-49fd-b0ff-5e77c615ef99","bid":"86f32c70-9bfb-4200-8bad-82904e691424","timestamp":1749191687783,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"7696e980-4f7e-4c64-9ab2-2a2ba9904d9b","bid":"894429b9-aa36-4890-8ecf-e3a853e53ce3","timestamp":1749191687806,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"ebd5c30b-31b9-4b1a-9179-d01866240c18","data":{"air_transfer_enable":false},"need_reply":1,"tid":"cbc7097a-e490-45b8-b103-b6a9e766a6c2","timestamp":1749191689034,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d0460b5d-9cdc-483a-afc9-d6f9780ac1c8","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f53fb1e5-a0a5-49b3-accd-1f112f4d8d95","timestamp":1749191690963,"gateway":"8UUXN4P00A06NK"} + +{"bid":"91f726b2-11f3-4fa3-a593-0710f7b0f3c4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d2167f8f-d8d7-4389-a8ca-a7f354d40b4c","timestamp":1749191691218,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a3864c74-1e0d-4ce6-8ce9-7e3138d6b5b4","data":{"dongle_infos":[]},"tid":"4710448d-2c4f-42e7-ad67-505c607bf488","timestamp":1749191691425,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e73ad2b7-a00d-4182-b579-20bb2c4d692a","data":{"firmware_version":"13.01.0002"},"tid":"e1268bdd-6bb7-4376-bbb2-76eae01be504","timestamp":1749191691438,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7810285b-441e-4fac-8ad2-3588fddd3998","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e7803516-4c99-482c-9205-eca7f7891c5e","timestamp":1749191691564,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ebd5c30b-31b9-4b1a-9179-d01866240c18","data":{"air_transfer_enable":false},"need_reply":1,"tid":"cbc7097a-e490-45b8-b103-b6a9e766a6c2","timestamp":1749191691619,"gateway":"8UUXN4P00A06NK"} + +{"tid":"5834f9f0-46d9-4150-84bf-e2287891ffba","bid":"b1337fe1-b782-464a-a106-187d7013fbf1","timestamp":1749191692029,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"70c45526-501d-4126-8f39-e0d856401103","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5c1f8af2-dd8e-4bf1-96c0-ddea5192bc68","timestamp":1749191692303,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d6805a92-63ba-4d5b-9604-81ea45445446","data":{"dongle_infos":[]},"tid":"d2117be8-8a6c-4526-91ca-8acb25abcfcd","timestamp":1749191692468,"gateway":"8UUXN4P00A06NK"} + +{"bid":"974f55a9-218e-4b1c-9bac-1b18419f421a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c46b5cf2-dd14-4a3f-a2c3-cf8588dcee8e","timestamp":1749191692790,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d0460b5d-9cdc-483a-afc9-d6f9780ac1c8","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f53fb1e5-a0a5-49b3-accd-1f112f4d8d95","timestamp":1749191693112,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7810285b-441e-4fac-8ad2-3588fddd3998","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e7803516-4c99-482c-9205-eca7f7891c5e","timestamp":1749191693711,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ffd1936c-4797-452a-96c3-44a4e8de155d","bid":"9b182768-b88c-4ba1-bd86-eda614d78cad","timestamp":1749191720431,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"440bbf63-11be-411a-b377-891acb711349","bid":"da1d7d83-4130-4c74-8c35-acf7be1f35d3","timestamp":1749191720434,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"62f5f826-c472-4744-89f8-4f498fc30d2b","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a4f3529b-b81b-483e-8446-9e545303fb81","timestamp":1749191721514,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cee80f91-9027-4893-8de3-86a131a14121","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ced62997-bc2f-485a-94b6-6594d78a34c0","timestamp":1749191721560,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c3d796b6-870b-4609-909f-a5c900cda893","data":{"air_transfer_enable":false},"need_reply":1,"tid":"6fb23113-6b62-4480-87cb-f9d605f58537","timestamp":1749191721724,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c2282ac0-b162-415f-87d5-0a2c84770d1f","data":{"dongle_infos":[]},"tid":"2ab97cdf-3f93-4331-82ed-3616b0e63881","timestamp":1749191721728,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e07b8fc4-c50f-4952-8523-f4fa40946f84","data":{"firmware_version":"13.01.0002"},"tid":"b3a23eef-2a8f-4616-a683-7f2db1515d46","timestamp":1749191721735,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c0fb5cc5-f98b-4226-90ac-fed451cffe3c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"0a159129-3970-4b03-be89-b9f5cb03d60c","timestamp":1749191722099,"gateway":"8UUXN4P00A06NK"} + +{"tid":"82504b9d-1a0f-4a42-8644-52aba18f6e9e","bid":"834e20e1-2d16-4997-98eb-5807fadb4f26","timestamp":1749191722406,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"76bf8ef2-f8c8-4f61-a308-8282166b903d","data":{"dongle_infos":[]},"tid":"16d6ac30-7d53-41d0-a02c-0a6d1570e041","timestamp":1749191722760,"gateway":"8UUXN4P00A06NK"} + +{"bid":"62f5f826-c472-4744-89f8-4f498fc30d2b","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a4f3529b-b81b-483e-8446-9e545303fb81","timestamp":1749191723706,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cee80f91-9027-4893-8de3-86a131a14121","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ced62997-bc2f-485a-94b6-6594d78a34c0","timestamp":1749191723707,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c0fb5cc5-f98b-4226-90ac-fed451cffe3c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"0a159129-3970-4b03-be89-b9f5cb03d60c","timestamp":1749191724104,"gateway":"8UUXN4P00A06NK"} + +{"bid":"412efd60-2677-4771-a554-575852acdce1","data":{"dongle_infos":[]},"tid":"14f577ac-f945-462b-bc41-2c821396c9a5","timestamp":1749191725140,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b690fb80-f3e5-47d9-bccc-58152bd71bac","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9a422e5c-8312-46e4-b799-62069f8dfa37","timestamp":1749191725429,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c3d796b6-870b-4609-909f-a5c900cda893","data":{"air_transfer_enable":false},"need_reply":1,"tid":"6fb23113-6b62-4480-87cb-f9d605f58537","timestamp":1749191725919,"gateway":"8UUXN4P00A06NK"} + +{"bid":"58793403-d4a3-45e1-872b-c8e1ddd3de02","data":{"departure_trajectory":[]},"tid":"a7be6049-aa11-4afd-acb6-c74f1852aebb","timestamp":1749191726725,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6d24a709-5a85-40d9-8d9d-7a784afc4815","data":{"departure_trajectory":[]},"tid":"d3329232-4037-4b29-b50f-c65a7266fdb5","timestamp":1749191727114,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b690fb80-f3e5-47d9-bccc-58152bd71bac","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9a422e5c-8312-46e4-b799-62069f8dfa37","timestamp":1749191727505,"gateway":"8UUXN4P00A06NK"} + +{"bid":"62f5f826-c472-4744-89f8-4f498fc30d2b","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a4f3529b-b81b-483e-8446-9e545303fb81","timestamp":1749191727905,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c0fb5cc5-f98b-4226-90ac-fed451cffe3c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"0a159129-3970-4b03-be89-b9f5cb03d60c","timestamp":1749191728305,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aeb2481d-e4e9-4c02-afeb-dda123ade2c3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2b9a687a-8122-4fbf-8c48-65799faabeb0","timestamp":1749191730425,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aeb2481d-e4e9-4c02-afeb-dda123ade2c3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2b9a687a-8122-4fbf-8c48-65799faabeb0","timestamp":1749191732505,"gateway":"8UUXN4P00A06NK"} + +{"tid":"7488e995-1bac-440a-9ae0-255dbfbcf0c1","bid":"91d9e55c-fef3-45eb-8fcb-6ed16535281e","timestamp":1749191760410,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"cc858b13-b666-4364-b79b-618feb786e72","bid":"f03203f7-b2fe-4c4e-a543-851e9f673d78","timestamp":1749191760414,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"7a04c6a8-f428-44da-81bb-00e6d0beba80","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a9407a96-eaa2-4c61-88e5-f95b87d60315","timestamp":1749191761394,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f8fcde0c-8dbe-4c56-948d-8cca97cae713","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bc3f4e15-f14a-4f0b-947d-16391efe6afa","timestamp":1749191761694,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ca40c584-6c53-41d5-b24e-81bed071ccde","data":{"dongle_infos":[]},"tid":"71ce35ac-cb28-44d9-bf4c-1d1f8a7d66bc","timestamp":1749191761810,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6b53095d-bd45-44b3-9901-f01adb1e6f69","data":{"dongle_infos":[]},"tid":"76cee821-90da-4465-a933-5ffd41d5fed7","timestamp":1749191761812,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b693b437-839c-465a-b00a-ad45f354b04f","data":{"firmware_version":"13.01.0002"},"tid":"c3944497-4c56-48d0-b0b3-9442fd42ec37","timestamp":1749191761817,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e7f4716-ad84-416c-a094-5bd87fb93057","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"18c238ef-63e4-4fba-ab35-2453a0c6763a","timestamp":1749191761971,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4eda68be-b9e0-45a4-9210-259f4bb7ee3c","data":{"air_transfer_enable":false},"need_reply":1,"tid":"006b9250-0ddd-471e-8b93-a1f89f9441d2","timestamp":1749191762001,"gateway":"8UUXN4P00A06NK"} + +{"tid":"7aff38ee-0d1d-4427-8732-5f51b21274e1","bid":"a097dadb-3822-4ce2-af1c-b17adae3ad40","timestamp":1749191762374,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"4b20292a-07f6-46fc-8470-68f8a9463cba","data":{"dongle_infos":[]},"tid":"379c8a3d-13b4-4b22-889e-8c39f0b7b27a","timestamp":1749191762821,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7a04c6a8-f428-44da-81bb-00e6d0beba80","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a9407a96-eaa2-4c61-88e5-f95b87d60315","timestamp":1749191763576,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f8fcde0c-8dbe-4c56-948d-8cca97cae713","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bc3f4e15-f14a-4f0b-947d-16391efe6afa","timestamp":1749191763778,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e7f4716-ad84-416c-a094-5bd87fb93057","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"18c238ef-63e4-4fba-ab35-2453a0c6763a","timestamp":1749191763975,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a4755ce0-3f08-4957-8672-499d9de83970","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5c5e5c0e-15a4-40e1-8fee-302d18bb145f","timestamp":1749191765409,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4eda68be-b9e0-45a4-9210-259f4bb7ee3c","data":{"air_transfer_enable":false},"need_reply":1,"tid":"006b9250-0ddd-471e-8b93-a1f89f9441d2","timestamp":1749191766198,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3c10b68b-feeb-4e50-8698-d34453a4541e","data":{"departure_trajectory":[]},"tid":"508c278c-5360-4f41-848c-77588d83d242","timestamp":1749191766800,"gateway":"8UUXN4P00A06NK"} + +{"bid":"045b7dab-4b17-4871-beaa-51e3b31a10b9","data":{"departure_trajectory":[]},"tid":"65e67250-d539-4b91-91f1-5b07597e8a33","timestamp":1749191767000,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a4755ce0-3f08-4957-8672-499d9de83970","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5c5e5c0e-15a4-40e1-8fee-302d18bb145f","timestamp":1749191767577,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7a04c6a8-f428-44da-81bb-00e6d0beba80","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a9407a96-eaa2-4c61-88e5-f95b87d60315","timestamp":1749191767779,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e7f4716-ad84-416c-a094-5bd87fb93057","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"18c238ef-63e4-4fba-ab35-2453a0c6763a","timestamp":1749191768180,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6a1ad2ca-c70e-4c3a-91cd-ca469cfe26d3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"797d3e71-e29e-43b5-bd09-e396d2316fb7","timestamp":1749191770412,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b8fb502e-8d3b-4e46-bbbd-4144049f3600","bid":"76062d43-61af-4ec0-ae43-13a1eef22a6d","timestamp":1749191795987,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"18d07261-5979-4475-8c31-94c9cb1954b7","bid":"8e320f32-7b0b-47e6-8026-cba3875d9b4c","timestamp":1749191795990,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"e3fc8203-3ad9-4f08-9689-534b98b57330","bid":"af890c0d-60d4-417a-921a-fa5257ad6b04","timestamp":1749191796407,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"8346bc63-cbf4-4a92-95a3-780444a40cfa","bid":"a205d798-2a61-4d0b-b9e3-99b09667642a","timestamp":1749191796417,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"90b961a5-b1a0-4b0d-92dc-5fbed8eaac6a","bid":"7dcf56a4-5ab6-484a-9534-82f7f5dfb168","timestamp":1749191796429,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"ecc97fd9-4d0f-412f-844c-53218526bf88","data":{"air_transfer_enable":false},"need_reply":1,"tid":"14201e25-5fd0-4477-aefc-f7a717a133e7","timestamp":1749191798329,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b9b18cec-01a2-45b3-8a0e-d8dafc79d913","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5bc4c67c-de89-4010-a0b7-9a35c10258bd","timestamp":1749191800407,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d4c8de85-b90c-4bcb-ab31-b12f9a5e6f83","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"59396e75-f0e0-4694-9c2c-6c8ce26752dd","timestamp":1749191800567,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ecde4673-876a-4e2c-9834-9eef1e7eadd1","bid":"7fee90c9-322a-48e8-9483-cab0da52fbf1","timestamp":1749191800700,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"ce874364-b891-4f4d-8a8e-a702183fed56","data":{"dongle_infos":[]},"tid":"f6fd4331-ba5e-4088-916a-d59cefb43e5c","timestamp":1749191800733,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f57a70a8-91b5-408f-8533-e5411222c9af","data":{"firmware_version":"13.01.0002"},"tid":"a74581dc-ebcb-48c9-8d0e-c4560ecb733c","timestamp":1749191800740,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e106573-e330-4131-add6-b06160baa198","data":{"mobility_status_notify":0},"need_reply":1,"tid":"88c1fc66-4f68-492a-addc-424add608841","timestamp":1749191800861,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ecc97fd9-4d0f-412f-844c-53218526bf88","data":{"air_transfer_enable":false},"need_reply":1,"tid":"14201e25-5fd0-4477-aefc-f7a717a133e7","timestamp":1749191800930,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5b1b1b06-cf7c-419b-af6b-6286b9b65ed0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"95eff272-31d8-4943-9647-b108fbd14cb4","timestamp":1749191800991,"gateway":"8UUXN4P00A06NK"} + +{"bid":"838f9235-90fe-4e03-a52b-596af83b1d4a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e97287cf-3ae2-448d-a8ac-1fb010e3f60a","timestamp":1749191801406,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eae1daa7-814e-4ca6-bd19-c8bfc8325576","data":{"dongle_infos":[]},"tid":"42a9d973-2658-4476-aeb4-1e8934bb6ec4","timestamp":1749191801741,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b9b18cec-01a2-45b3-8a0e-d8dafc79d913","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5bc4c67c-de89-4010-a0b7-9a35c10258bd","timestamp":1749191802508,"gateway":"8UUXN4P00A06NK"} + +{"tid":"db7a87a6-c7a9-4fa5-af24-1b8c5c2c4550","bid":"4b664475-2f8f-4184-bbef-ed9d2b5f81e3","timestamp":1749191829363,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"b9aa4cf4-6e1f-4137-be04-22723665fce2","bid":"e323cfe5-0276-4ff1-95d0-ccee698afb2a","timestamp":1749191829365,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f75312fc-ab1a-4d29-9bf3-5c50fdc285a2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1debf0d8-16f8-4607-a158-24e616ae4cc4","timestamp":1749191830283,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f2ddf027-7603-4d1c-a753-b6af177e2de8","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5cdd4ffa-f341-42d0-832c-bda61b4531cf","timestamp":1749191830289,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4373c95b-b4e9-4963-90e3-b8a50fe5cceb","data":{"mobility_status_notify":0},"need_reply":1,"tid":"de8e5cd5-17c8-4e13-ba98-470376ffe592","timestamp":1749191830584,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2a96ba61-a097-4a14-8405-f6871cd6f02b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"c00c71e3-5759-4090-9db1-a2e28968dda2","timestamp":1749191830740,"gateway":"8UUXN4P00A06NK"} + +{"bid":"234904c0-3778-4300-9978-5fa92c7c637c","data":{"dongle_infos":[]},"tid":"8618fca8-7fe2-4906-b5b3-490023c91c52","timestamp":1749191830746,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e9999bf-7cb5-48a3-be2a-1de956601c32","data":{"firmware_version":"13.01.0002"},"tid":"84163d5e-a565-4410-bfe9-8ef218637efe","timestamp":1749191830754,"gateway":"8UUXN4P00A06NK"} + +{"tid":"0e35097e-9fa1-48b0-968c-361a696d8a5c","bid":"3647a489-f5a2-4b12-85f0-74ff76d550ea","timestamp":1749191831491,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"62358184-dbc0-46c0-b391-4ad5f09bb9f4","data":{"dongle_infos":[]},"tid":"b99b210e-024a-47aa-9754-641c85f49407","timestamp":1749191831777,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f75312fc-ab1a-4d29-9bf3-5c50fdc285a2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1debf0d8-16f8-4607-a158-24e616ae4cc4","timestamp":1749191832390,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f2ddf027-7603-4d1c-a753-b6af177e2de8","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5cdd4ffa-f341-42d0-832c-bda61b4531cf","timestamp":1749191832391,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4373c95b-b4e9-4963-90e3-b8a50fe5cceb","data":{"mobility_status_notify":0},"need_reply":1,"tid":"de8e5cd5-17c8-4e13-ba98-470376ffe592","timestamp":1749191832593,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f81c8b9e-e4b1-47ff-ade4-99594ab21567","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ee6bd185-1744-4edf-bf68-950af4269519","timestamp":1749191834366,"gateway":"8UUXN4P00A06NK"} + +{"bid":"030996bb-4860-4c84-a990-9c6f6bd8d94a","data":{"dongle_infos":[]},"tid":"5edcbf6f-2d8a-4c04-adca-db77d89ffd10","timestamp":1749191834720,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2a96ba61-a097-4a14-8405-f6871cd6f02b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"c00c71e3-5759-4090-9db1-a2e28968dda2","timestamp":1749191834940,"gateway":"8UUXN4P00A06NK"} + +{"bid":"04a6877b-991b-4ab3-9fb2-e11088b9d0f8","data":{"departure_trajectory":[]},"tid":"7d845a56-b4ce-4744-9cd4-65adf59de7dd","timestamp":1749191835742,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c6f4fbf1-06e3-4a74-9769-1d9c90a361b4","data":{"departure_trajectory":[]},"tid":"66eda38f-4f73-44f4-bab2-a6a5cab68f41","timestamp":1749191835996,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f81c8b9e-e4b1-47ff-ade4-99594ab21567","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ee6bd185-1744-4edf-bf68-950af4269519","timestamp":1749191836392,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f2ddf027-7603-4d1c-a753-b6af177e2de8","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5cdd4ffa-f341-42d0-832c-bda61b4531cf","timestamp":1749191836589,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4373c95b-b4e9-4963-90e3-b8a50fe5cceb","data":{"mobility_status_notify":0},"need_reply":1,"tid":"de8e5cd5-17c8-4e13-ba98-470376ffe592","timestamp":1749191836787,"gateway":"8UUXN4P00A06NK"} + +{"bid":"80fa0bb8-bbed-4690-aed3-a73bd49e235f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ab929053-85a2-41d3-9415-3c69f8e593fd","timestamp":1749191839362,"gateway":"8UUXN4P00A06NK"} + +{"bid":"80fa0bb8-bbed-4690-aed3-a73bd49e235f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ab929053-85a2-41d3-9415-3c69f8e593fd","timestamp":1749191841392,"gateway":"8UUXN4P00A06NK"} + +{"tid":"a14f305e-15ac-414a-95b4-27a31c3dfa16","bid":"2577079b-98c1-4b0b-a758-116d2c6c118d","timestamp":1749191868910,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"592fde0a-66b2-4d33-aced-d6e721d34b14","bid":"c7e1ec82-ed43-45a1-9b46-5b6432c180d8","timestamp":1749191868913,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"2d381826-5a4c-4a00-a4e4-0a83c9bc15e8","data":{"mobility_status_notify":0},"need_reply":1,"tid":"43776cff-4b42-45f5-bc76-6899869b74ad","timestamp":1749191869687,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b707a076-0ebf-48ca-b218-c1a3f8683465","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d0f872d3-6e99-4c25-9ec5-e8a1b43e7cb5","timestamp":1749191869963,"gateway":"8UUXN4P00A06NK"} + +{"bid":"17d5efa3-3b76-460c-ae0a-45b122bec013","data":{"dongle_infos":[]},"tid":"a4119891-7f62-430e-ad56-9c5013b8ff25","timestamp":1749191870102,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1b532750-51bb-477d-ad94-518b09f99f15","data":{"firmware_version":"13.01.0002"},"tid":"499547c6-29f2-4fea-9fb9-cfbca4ee2f7b","timestamp":1749191870112,"gateway":"8UUXN4P00A06NK"} + +{"bid":"53266cd6-2746-4444-b81d-ab95da3c3742","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d4a90be8-53a5-49a1-9932-4f9bc0ce33aa","timestamp":1749191870136,"gateway":"8UUXN4P00A06NK"} + +{"bid":"30ab3dc3-9757-48ac-9184-1bc0d8e5dbbd","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"29f34481-5f9e-454d-9f6d-4eb2d44fd4b7","timestamp":1749191870265,"gateway":"8UUXN4P00A06NK"} + +{"tid":"9852a760-428e-4894-b3ac-5bb824ab0db1","bid":"8dd1ad3c-1579-4cb8-9a35-c3b866a91963","timestamp":1749191870509,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"ea5bc96f-394f-4803-b829-54831a5e7dba","data":{"dongle_infos":[]},"tid":"041cf0f9-470c-477c-b2f9-4757807e389c","timestamp":1749191871098,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2d381826-5a4c-4a00-a4e4-0a83c9bc15e8","data":{"mobility_status_notify":0},"need_reply":1,"tid":"43776cff-4b42-45f5-bc76-6899869b74ad","timestamp":1749191871774,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b707a076-0ebf-48ca-b218-c1a3f8683465","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d0f872d3-6e99-4c25-9ec5-e8a1b43e7cb5","timestamp":1749191871976,"gateway":"8UUXN4P00A06NK"} + +{"bid":"30ab3dc3-9757-48ac-9184-1bc0d8e5dbbd","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"29f34481-5f9e-454d-9f6d-4eb2d44fd4b7","timestamp":1749191872370,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eeb1b8a9-5502-42ad-995d-3bd822e5fba0","data":{"dongle_infos":[]},"tid":"f1f4ae14-b91f-4eb8-9f38-55bfedd3d65d","timestamp":1749191873513,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a1c25108-34ca-422f-bbc5-a65b00a3714d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2ecbbf8d-92b6-4b65-aa3b-d6db38fc9bc9","timestamp":1749191873920,"gateway":"8UUXN4P00A06NK"} + +{"bid":"53266cd6-2746-4444-b81d-ab95da3c3742","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d4a90be8-53a5-49a1-9932-4f9bc0ce33aa","timestamp":1749191874328,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7acbf29a-8112-47c5-8209-876e99475216","data":{"departure_trajectory":[]},"tid":"7e2b87bc-388e-4008-b76f-f51f2b793b9f","timestamp":1749191875092,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cddb27a1-9941-4700-b35c-ac2e8a940895","data":{"departure_trajectory":[]},"tid":"81594a05-b967-4264-ba3a-fc4153ca8660","timestamp":1749191875614,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2d381826-5a4c-4a00-a4e4-0a83c9bc15e8","data":{"mobility_status_notify":0},"need_reply":1,"tid":"43776cff-4b42-45f5-bc76-6899869b74ad","timestamp":1749191875972,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a1c25108-34ca-422f-bbc5-a65b00a3714d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2ecbbf8d-92b6-4b65-aa3b-d6db38fc9bc9","timestamp":1749191875973,"gateway":"8UUXN4P00A06NK"} + +{"bid":"30ab3dc3-9757-48ac-9184-1bc0d8e5dbbd","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"29f34481-5f9e-454d-9f6d-4eb2d44fd4b7","timestamp":1749191876576,"gateway":"8UUXN4P00A06NK"} + +{"bid":"188ab168-36d5-4155-83a4-b04f9c63c533","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7a25e00c-dea7-4ca3-8d25-56018a5a5258","timestamp":1749191878916,"gateway":"8UUXN4P00A06NK"} + +{"bid":"188ab168-36d5-4155-83a4-b04f9c63c533","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7a25e00c-dea7-4ca3-8d25-56018a5a5258","timestamp":1749191880973,"gateway":"8UUXN4P00A06NK"} + +{"tid":"48ce8508-73d8-45ae-89e2-8d7b1c7bb74f","bid":"7ebbd8fb-0bca-49dc-a69b-75a4e74d20a7","timestamp":1749191905055,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"c9fcfd0d-f16c-43a7-8e2f-3c476725f882","bid":"b7bece6f-ea87-4265-a9b4-d251158e2819","timestamp":1749191905059,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e4e8e2a-6203-4fa2-8fa8-29c1b6a16ad1","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e4a5172a-c005-41ce-8fd7-d15affb667ff","timestamp":1749191906910,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0d1a5370-155f-4ac4-9231-deaf148a83ef","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"985514e0-eaba-4010-a23c-3dcaf91ecd33","timestamp":1749191908966,"gateway":"8UUXN4P00A06NK"} + +{"tid":"208eef61-6365-47e0-a516-bc5137b75db2","bid":"a05035bf-6b13-4141-976d-897d32b124bc","timestamp":1749191909187,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"09e2ddfa-4578-40a7-8b31-f1dd30d815bc","data":{"mobility_status_notify":0},"need_reply":1,"tid":"291d1d4a-d28e-4cdd-bc3f-c7dfbdeaddf8","timestamp":1749191909192,"gateway":"8UUXN4P00A06NK"} + +{"bid":"51840f64-e5fd-4729-9d3b-8f56410cbedc","data":{"dongle_infos":[]},"tid":"090c553f-da3e-4f74-9a05-9a22102180be","timestamp":1749191909345,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f2ee4b48-807c-4235-b2bb-f99c7582538d","data":{"firmware_version":"13.01.0002"},"tid":"10a0fc93-53f6-43cf-9b10-80556569f554","timestamp":1749191909356,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e4e8e2a-6203-4fa2-8fa8-29c1b6a16ad1","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e4a5172a-c005-41ce-8fd7-d15affb667ff","timestamp":1749191909558,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9cfd16d9-1448-40fa-9bde-dea89b07110d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1056e7f4-d4aa-4c17-81b4-cd413b52ab8c","timestamp":1749191909742,"gateway":"8UUXN4P00A06NK"} + +{"bid":"17f296f4-c092-4c27-b4df-141086e8cd77","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0d0f4be6-8202-4944-98a1-8c9d69f95725","timestamp":1749191910063,"gateway":"8UUXN4P00A06NK"} + +{"bid":"808012d6-ffce-4dac-a514-c4256d6b66ca","data":{"dongle_infos":[]},"tid":"8afd9a83-972d-4254-947f-fc4eafd8443b","timestamp":1749191910333,"gateway":"8UUXN4P00A06NK"} + +{"bid":"09e2ddfa-4578-40a7-8b31-f1dd30d815bc","data":{"mobility_status_notify":0},"need_reply":1,"tid":"291d1d4a-d28e-4cdd-bc3f-c7dfbdeaddf8","timestamp":1749191911200,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9cfd16d9-1448-40fa-9bde-dea89b07110d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1056e7f4-d4aa-4c17-81b4-cd413b52ab8c","timestamp":1749191911804,"gateway":"8UUXN4P00A06NK"} + +{"tid":"fa153f3c-f987-4c02-99a2-096a24f00123","bid":"c7830d7c-3ef5-4bb3-af37-55019035c986","timestamp":1749191935749,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"a2379d0c-b6af-4d7a-b5e1-5851c2745331","bid":"b82fa219-3ffb-40c2-a53f-78d8fce672ee","timestamp":1749191935751,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"ef7fa847-2b60-485f-a45a-f41e7c47cc6f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8e0ba615-7274-435f-8d89-174f48e372ec","timestamp":1749191937866,"gateway":"8UUXN4P00A06NK"} + +{"bid":"923f041a-188b-437d-8425-47237afd6c0a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"805eb585-9e68-4030-bd23-ad02e430ae4d","timestamp":1749191939838,"gateway":"8UUXN4P00A06NK"} + +{"bid":"409fb5be-6cd4-42a4-9cc7-cb26605e61ae","data":{"dongle_infos":[]},"tid":"82e928cd-3f47-4cc3-a2cf-c047454196c3","timestamp":1749191940235,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bb421007-63c6-4cb5-a5f3-6fd90ad9a0d4","data":{"firmware_version":"13.01.0002"},"tid":"a6aa66b0-7471-4f7c-bd10-df93c6251b28","timestamp":1749191940241,"gateway":"8UUXN4P00A06NK"} + +{"bid":"46a9aefe-3fd7-4b91-84e5-722146a23e59","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f92e9404-b9f6-4912-a700-06f0fd3cc664","timestamp":1749191940248,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ef7fa847-2b60-485f-a45a-f41e7c47cc6f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8e0ba615-7274-435f-8d89-174f48e372ec","timestamp":1749191940430,"gateway":"8UUXN4P00A06NK"} + +{"tid":"3014355f-ae45-4352-a0ad-ddf61f22698d","bid":"c0196b7a-34a6-43ee-b55f-75c98523854e","timestamp":1749191940518,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"291ec205-c2ba-4b35-b1c7-583af46fda45","data":{"mobility_status_notify":0},"need_reply":1,"tid":"cdaedecc-a6ec-4ef5-b150-df41ee0e7b09","timestamp":1749191940695,"gateway":"8UUXN4P00A06NK"} + +{"bid":"962607a1-28e9-4639-ae00-26e94189de9b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c6cdab4b-3138-48b7-bf05-543263a2bef5","timestamp":1749191940753,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0c1a1999-656b-48fe-927b-a91b9ba24737","data":{"dongle_infos":[]},"tid":"63dacd25-f273-4a59-973f-43c162dd4f51","timestamp":1749191941251,"gateway":"8UUXN4P00A06NK"} + +{"bid":"46a9aefe-3fd7-4b91-84e5-722146a23e59","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f92e9404-b9f6-4912-a700-06f0fd3cc664","timestamp":1749191942391,"gateway":"8UUXN4P00A06NK"} + +{"tid":"4e4c8383-7a2a-458a-9a26-dabc0aaf5f94","bid":"bbc3e246-6806-4b83-aaea-109578af5e7f","timestamp":1749192894774,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"2c51652b-4a4c-4e8e-8441-12b43c37c7d4","bid":"0684339d-dd92-4b89-84ac-bc1599e56f5d","timestamp":1749192894777,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"18fe2728-481b-4ed7-a17e-b8836a8c164a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"45d12fa6-b739-4b41-8bd7-57b5a1b089b6","timestamp":1749192894940,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6c1f717a-d9f2-46c7-b2ca-a536b218a8b1","data":{"mobility_status_notify":0},"need_reply":1,"tid":"216e710d-1cf7-4be7-97b5-b70bd9a6d360","timestamp":1749192896929,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d9249404-6d2d-4217-a86c-9088adb39283","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"478ed5e8-299f-4b3a-ad26-f331c7af92d9","timestamp":1749192896933,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f114eb4f-a052-46ec-a255-eb14db9f8e41","data":{"dongle_infos":[]},"tid":"c16ad3b4-4ce1-4f8f-912f-47b5faa4f639","timestamp":1749192897335,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c97c1653-4078-4d8d-8566-07fd7adb8200","data":{"firmware_version":"13.01.0002"},"tid":"4d444937-74a3-4766-b7cd-257ba6bf3579","timestamp":1749192897354,"gateway":"8UUXN4P00A06NK"} + +{"bid":"74cc6d33-3c18-4dda-b64a-e51e6f651189","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"da5d9dfe-096b-41b0-9be0-1e359f7cfb24","timestamp":1749192897391,"gateway":"8UUXN4P00A06NK"} + +{"tid":"61b40679-9bcf-4958-b7b9-eb3d6b513c33","bid":"2bf799fd-ef97-445a-8722-46093c0f318b","timestamp":1749192897491,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"18fe2728-481b-4ed7-a17e-b8836a8c164a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"45d12fa6-b739-4b41-8bd7-57b5a1b089b6","timestamp":1749192897529,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4aabf657-ed02-4fe1-800f-43975e7b3896","data":{"dongle_infos":[]},"tid":"ef586e1a-2ba0-41e7-9c08-43e657b4a7ba","timestamp":1749192898351,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6c1f717a-d9f2-46c7-b2ca-a536b218a8b1","data":{"mobility_status_notify":0},"need_reply":1,"tid":"216e710d-1cf7-4be7-97b5-b70bd9a6d360","timestamp":1749192899098,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d9249404-6d2d-4217-a86c-9088adb39283","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"478ed5e8-299f-4b3a-ad26-f331c7af92d9","timestamp":1749192899098,"gateway":"8UUXN4P00A06NK"} + +{"bid":"74cc6d33-3c18-4dda-b64a-e51e6f651189","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"da5d9dfe-096b-41b0-9be0-1e359f7cfb24","timestamp":1749192899496,"gateway":"8UUXN4P00A06NK"} + +{"bid":"100d9d27-5422-4fbc-8112-f4303cff5055","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0ee9eee1-d7a9-44d6-aab3-9ca6d63767ac","timestamp":1749192899782,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f7fe74e8-f8c8-4b6e-b193-9efe58be9725","data":{"dongle_infos":[]},"tid":"6b9e619d-8348-42f6-aa67-c085069b2ff0","timestamp":1749192900642,"gateway":"8UUXN4P00A06NK"} + +{"bid":"18fe2728-481b-4ed7-a17e-b8836a8c164a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"45d12fa6-b739-4b41-8bd7-57b5a1b089b6","timestamp":1749192901731,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9c198751-49da-479d-a0b8-fe8b591a1e84","data":{"departure_trajectory":[]},"tid":"d6d7b09e-3b61-4c59-bf2d-766bd3f3c821","timestamp":1749192901761,"gateway":"8UUXN4P00A06NK"} + +{"bid":"100d9d27-5422-4fbc-8112-f4303cff5055","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0ee9eee1-d7a9-44d6-aab3-9ca6d63767ac","timestamp":1749192901897,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f6eb807f-e09b-4f3a-8c35-21d7bef7eecc","data":{"departure_trajectory":[]},"tid":"1870f154-bf4c-4008-a50e-b9193a21ddaa","timestamp":1749192902327,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6c1f717a-d9f2-46c7-b2ca-a536b218a8b1","data":{"mobility_status_notify":0},"need_reply":1,"tid":"216e710d-1cf7-4be7-97b5-b70bd9a6d360","timestamp":1749192903299,"gateway":"8UUXN4P00A06NK"} + +{"bid":"74cc6d33-3c18-4dda-b64a-e51e6f651189","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"da5d9dfe-096b-41b0-9be0-1e359f7cfb24","timestamp":1749192903697,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aa9054e3-61c8-46ff-97aa-59c29597aa2f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b0184aad-8a09-49f9-bd19-5a385a580270","timestamp":1749192904782,"gateway":"8UUXN4P00A06NK"} + +{"tid":"e587eba3-7ecf-4110-b408-84fdb19d1c34","bid":"38089cff-5fab-4b39-8688-ec621bc8904a","timestamp":1749192933489,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"237c1e20-6a18-4a0f-93d4-cd1131b0064f","bid":"dc95598c-40d3-4302-9d5b-a84923f8a0d6","timestamp":1749192933493,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"10e17425-8a47-43de-aa20-ce9b0124ebdb","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0c6e0248-211b-4e2e-a57a-7b2af0312cdc","timestamp":1749192934657,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2b01a706-24ac-45f3-b6b8-02e110ad4271","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6efff9eb-bb70-4764-ac66-b1f332eec9b5","timestamp":1749192934663,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a60e85e3-419e-41d0-8849-695c552222cf","data":{"dongle_infos":[]},"tid":"f20c8d06-a16c-4aaa-a472-986e1b007dac","timestamp":1749192935078,"gateway":"8UUXN4P00A06NK"} + +{"bid":"79dca04a-a7bd-44d4-b692-b82492cc73e5","data":{"firmware_version":"13.01.0002"},"tid":"aca8c0df-a7cb-4c7f-a98d-4f53cf299fa8","timestamp":1749192935112,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6ecfd172-c439-4050-bef8-eaed9a133515","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"aa2302c9-80aa-4747-b498-6810f01fb09b","timestamp":1749192935144,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ae42390c-e889-42c6-86e9-0d431e368737","data":{"air_transfer_enable":false},"need_reply":1,"tid":"245e5af7-6039-445e-bd63-d431126ffe3d","timestamp":1749192935275,"gateway":"8UUXN4P00A06NK"} + +{"tid":"50f467ce-a80b-46c3-aa39-157047082cc1","bid":"887b1b5a-9681-49ce-ab04-0df0739c4a90","timestamp":1749192935437,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"a6214ee1-9832-4ba0-9804-d03a2dafbe68","data":{"dongle_infos":[]},"tid":"1cf1d343-ab14-419c-8cbe-7ec9a470c53f","timestamp":1749192936116,"gateway":"8UUXN4P00A06NK"} + +{"bid":"10e17425-8a47-43de-aa20-ce9b0124ebdb","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0c6e0248-211b-4e2e-a57a-7b2af0312cdc","timestamp":1749192936805,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2b01a706-24ac-45f3-b6b8-02e110ad4271","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6efff9eb-bb70-4764-ac66-b1f332eec9b5","timestamp":1749192936806,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6ecfd172-c439-4050-bef8-eaed9a133515","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"aa2302c9-80aa-4747-b498-6810f01fb09b","timestamp":1749192937202,"gateway":"8UUXN4P00A06NK"} + +{"bid":"be3b8726-c5df-4b37-b6fb-2f46e3182fb8","data":{"dongle_infos":[]},"tid":"1c3eef50-3dcf-4869-9184-ceaffb2acc26","timestamp":1749192938494,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3bee4c1f-a164-49c1-adbb-207749fed858","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1050a6fc-6ad7-474e-a1b5-7ba73b384869","timestamp":1749192938498,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ae42390c-e889-42c6-86e9-0d431e368737","data":{"air_transfer_enable":false},"need_reply":1,"tid":"245e5af7-6039-445e-bd63-d431126ffe3d","timestamp":1749192939475,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5c574237-bfc6-40ae-aea1-08b3fcf05f9c","data":{"departure_trajectory":[]},"tid":"0d72b0bc-4a16-4a0c-a5bb-12b311d22981","timestamp":1749192940075,"gateway":"8UUXN4P00A06NK"} + +{"bid":"763bd4d3-ec86-40c3-87e6-a68ce1eacf5f","data":{"departure_trajectory":[]},"tid":"b573b1ee-02a4-4839-be37-5895d7a99046","timestamp":1749192940076,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3bee4c1f-a164-49c1-adbb-207749fed858","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1050a6fc-6ad7-474e-a1b5-7ba73b384869","timestamp":1749192940602,"gateway":"8UUXN4P00A06NK"} + +{"bid":"10e17425-8a47-43de-aa20-ce9b0124ebdb","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0c6e0248-211b-4e2e-a57a-7b2af0312cdc","timestamp":1749192941007,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6ecfd172-c439-4050-bef8-eaed9a133515","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"aa2302c9-80aa-4747-b498-6810f01fb09b","timestamp":1749192941403,"gateway":"8UUXN4P00A06NK"} + +{"bid":"40a2871d-18bd-4093-8012-8c1601e7494e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7549d4bd-7dc8-4e90-b5d8-478d90c73e21","timestamp":1749192943496,"gateway":"8UUXN4P00A06NK"} + +{"tid":"cdb0bf88-ccaa-4266-9646-53223fd04259","bid":"040df2fa-c412-4663-9b65-9b56e63f82db","timestamp":1749192972491,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"6b11452b-4667-4648-927d-6307bf233ba0","bid":"54f4fbe1-9b2e-4fde-a38e-bfe3f2b66420","timestamp":1749192972494,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"693a2762-26f4-41f9-8e1c-0c124d9aa146","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"685060b6-01fa-40b6-b42d-2beb8ce178a5","timestamp":1749192973913,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b17dfcb0-321b-4128-bdd1-526cecfa4968","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"4fd19db0-eb1e-4656-80fd-027420e980e2","timestamp":1749192974149,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1ca7b2c5-b06f-4f9f-bd42-8a1a80115285","data":{"dongle_infos":[]},"tid":"28c0e482-3d64-46c0-b004-f7d221a4d812","timestamp":1749192974361,"gateway":"8UUXN4P00A06NK"} + +{"bid":"91649734-067b-431a-bf98-0341e829539c","data":{"firmware_version":"13.01.0002"},"tid":"c1832be1-1ff1-4490-a35c-f8c16ce5aed5","timestamp":1749192974369,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1f86c403-c8b7-4a2e-bd90-4f66e2e1fba1","data":{"air_transfer_enable":false},"need_reply":1,"tid":"6162c363-9dbb-4e9d-86a1-c5334d9dc17e","timestamp":1749192974387,"gateway":"8UUXN4P00A06NK"} + +{"tid":"857b2ef1-5d43-410c-8b0e-451111852c33","bid":"a92b2aeb-bbf8-4a89-baf6-161e2eefb52e","timestamp":1749192974452,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"692ae579-f6fa-479f-ab4b-3151ba16dbc3","data":{"mobility_status_notify":0},"need_reply":1,"tid":"028d79c5-10e3-4c0f-be05-2f1993b150ce","timestamp":1749192974583,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f603ce2c-38a5-4c39-8e19-f2f24ce67927","data":{"dongle_infos":[]},"tid":"96fa26b2-8e0c-4520-b40b-45a285be918e","timestamp":1749192975412,"gateway":"8UUXN4P00A06NK"} + +{"bid":"693a2762-26f4-41f9-8e1c-0c124d9aa146","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"685060b6-01fa-40b6-b42d-2beb8ce178a5","timestamp":1749192976012,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b17dfcb0-321b-4128-bdd1-526cecfa4968","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"4fd19db0-eb1e-4656-80fd-027420e980e2","timestamp":1749192976208,"gateway":"8UUXN4P00A06NK"} + +{"bid":"692ae579-f6fa-479f-ab4b-3151ba16dbc3","data":{"mobility_status_notify":0},"need_reply":1,"tid":"028d79c5-10e3-4c0f-be05-2f1993b150ce","timestamp":1749192976607,"gateway":"8UUXN4P00A06NK"} + +{"bid":"99275ceb-9841-402d-879c-a829e765b33f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3502934c-abbb-4b71-840b-04654b85d9af","timestamp":1749192977492,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2866135d-58b3-4dd8-98b7-589d501980d6","data":{"dongle_infos":[]},"tid":"2836db32-ea1e-466e-bc56-730d6a0d333b","timestamp":1749192977530,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1f86c403-c8b7-4a2e-bd90-4f66e2e1fba1","data":{"air_transfer_enable":false},"need_reply":1,"tid":"6162c363-9dbb-4e9d-86a1-c5334d9dc17e","timestamp":1749192978587,"gateway":"8UUXN4P00A06NK"} + +{"bid":"46d27948-e464-4175-bb0e-5c130b17fc38","data":{"departure_trajectory":[]},"tid":"ede40eee-ca77-46f4-9fa5-7081b6415848","timestamp":1749192979252,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f26438fd-8aba-4dd7-9b4b-80a050cb0fc1","data":{"departure_trajectory":[]},"tid":"9c6079ba-d4e2-4f78-ad73-e04ae35738f1","timestamp":1749192979364,"gateway":"8UUXN4P00A06NK"} + +{"bid":"99275ceb-9841-402d-879c-a829e765b33f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3502934c-abbb-4b71-840b-04654b85d9af","timestamp":1749192979609,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b17dfcb0-321b-4128-bdd1-526cecfa4968","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"4fd19db0-eb1e-4656-80fd-027420e980e2","timestamp":1749192980406,"gateway":"8UUXN4P00A06NK"} + +{"bid":"692ae579-f6fa-479f-ab4b-3151ba16dbc3","data":{"mobility_status_notify":0},"need_reply":1,"tid":"028d79c5-10e3-4c0f-be05-2f1993b150ce","timestamp":1749192980805,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5e7ed36a-d635-41b3-8e1d-580aca611e2e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8f512fad-b496-403a-98ea-ecabf35d3dbd","timestamp":1749192982495,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5e7ed36a-d635-41b3-8e1d-580aca611e2e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8f512fad-b496-403a-98ea-ecabf35d3dbd","timestamp":1749192984612,"gateway":"8UUXN4P00A06NK"} + +{"tid":"4a3e2870-bea8-4998-8486-07a85574d611","bid":"f28cb2d3-8ef4-4906-a49e-9ba4746123d8","timestamp":1749193011517,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"c8f45c18-ce54-40ee-8925-4f53250e0b2c","bid":"10cea718-f93c-4d40-9ec3-82eefcbb056a","timestamp":1749193011519,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"a100d497-eb2e-4c47-97fb-33f15d4ffe03","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"31c6b567-cb75-44ac-b0f7-58d9e722cc0d","timestamp":1749193012791,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3c5dc896-4979-4251-9a4a-e1381164677d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"172c7d42-e010-4588-b6ef-50fb513874fb","timestamp":1749193013055,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d86980f0-8d8c-41b6-8943-1f9844e3c31f","data":{"dongle_infos":[]},"tid":"f4573928-cc1c-44c5-a198-3b0066e1610b","timestamp":1749193013091,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bd6d0ae9-d44b-48dd-833f-b035833ab166","data":{"firmware_version":"13.01.0002"},"tid":"adc7d98f-b5b4-4ed2-9687-d1b81eb81e84","timestamp":1749193013096,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3ae6aac9-c06c-40c7-9d12-6248abcf745c","data":{"air_transfer_enable":false},"need_reply":1,"tid":"5a2bc85d-04fc-4be2-8590-5df3a18af614","timestamp":1749193013286,"gateway":"8UUXN4P00A06NK"} + +{"tid":"0c6eadee-ffc7-4996-899c-d3fa949bb97a","bid":"10879dcd-e0ce-40de-8743-7ea75d86f73d","timestamp":1749193013310,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"e9e6ae6e-e5cf-46e2-a45f-1e0065cb2132","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a9985e14-1a84-4dd5-9580-b1134fc1c8ba","timestamp":1749193013512,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e23edd61-cd63-4a0a-91ca-a2558d53b67a","data":{"dongle_infos":[]},"tid":"ceaaa782-688a-416a-8867-e392537e693a","timestamp":1749193014095,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a100d497-eb2e-4c47-97fb-33f15d4ffe03","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"31c6b567-cb75-44ac-b0f7-58d9e722cc0d","timestamp":1749193014983,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3c5dc896-4979-4251-9a4a-e1381164677d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"172c7d42-e010-4588-b6ef-50fb513874fb","timestamp":1749193015181,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e9e6ae6e-e5cf-46e2-a45f-1e0065cb2132","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a9985e14-1a84-4dd5-9580-b1134fc1c8ba","timestamp":1749193015580,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4614f532-c578-45b5-b250-072f866b30c8","data":{"dongle_infos":[]},"tid":"32086726-b035-4e1a-b0d8-5897e8a4b147","timestamp":1749193016305,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1a1a928-f052-4327-8041-2b5e026b3bb7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"be452168-1f5c-4049-8279-b6b10e2495b6","timestamp":1749193016512,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3ae6aac9-c06c-40c7-9d12-6248abcf745c","data":{"air_transfer_enable":false},"need_reply":1,"tid":"5a2bc85d-04fc-4be2-8590-5df3a18af614","timestamp":1749193017489,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8848a9be-fc63-4ef8-83b4-08a2dcdae8e6","data":{"departure_trajectory":[]},"tid":"b5b4e4d1-214a-4be5-8311-c18aa202c798","timestamp":1749193018086,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1f8abd6e-7e08-4d89-b10e-364d4ea6842d","data":{"departure_trajectory":[]},"tid":"802a9ae8-c56c-4354-b189-868624898439","timestamp":1749193018152,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1a1a928-f052-4327-8041-2b5e026b3bb7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"be452168-1f5c-4049-8279-b6b10e2495b6","timestamp":1749193018581,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3c5dc896-4979-4251-9a4a-e1381164677d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"172c7d42-e010-4588-b6ef-50fb513874fb","timestamp":1749193019380,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e9e6ae6e-e5cf-46e2-a45f-1e0065cb2132","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a9985e14-1a84-4dd5-9580-b1134fc1c8ba","timestamp":1749193019781,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3bd23737-20d9-4b1f-8876-e6a2d967428d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3d2aeb5f-a704-4547-aa18-00bd6036aae0","timestamp":1749193021513,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3bd23737-20d9-4b1f-8876-e6a2d967428d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3d2aeb5f-a704-4547-aa18-00bd6036aae0","timestamp":1749193023583,"gateway":"8UUXN4P00A06NK"} + +{"tid":"fd454713-fed3-4516-8c10-f56ab4d974b5","bid":"183ce7f6-34f4-41bb-aa0d-cf1d889332d7","timestamp":1749193049990,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"05676597-70af-41df-92d3-79b9732b4286","bid":"72770138-e71a-44d7-b5f0-135f1aff76a3","timestamp":1749193049993,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e8026d7-cb34-40b3-9924-a62bbc47f0de","data":{"mobility_status_notify":0},"need_reply":1,"tid":"19dbfa46-ab81-4c74-8600-15f81f0848c5","timestamp":1749193051051,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ebaa6f40-fbcc-4d80-8259-f21c13e5bfd6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e7e4f9d1-9cda-4b47-9ca2-c244e34f5e9c","timestamp":1749193051327,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3bcd2a7a-68cf-4677-b1df-a4c8ef691bef","data":{"dongle_infos":[]},"tid":"6556301b-3adc-4245-81f1-bb61e6abe4f3","timestamp":1749193051568,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bcf194e6-7224-4fc0-a602-5dcc1c1b65e2","data":{"firmware_version":"13.01.0002"},"tid":"31364d5f-fc1c-4d6c-8fbd-b2160e2dddcd","timestamp":1749193051594,"gateway":"8UUXN4P00A06NK"} + +{"bid":"32e0e9f3-87cc-4f25-8d73-2178a656955d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a832c33b-6e77-4786-ac36-c48363e09b3c","timestamp":1749193051626,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3b4c7554-317d-474b-a4b8-e03e6364f295","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d016e299-09fc-46e9-9c72-caa65aedf781","timestamp":1749193051751,"gateway":"8UUXN4P00A06NK"} + +{"tid":"68e180f9-934a-40bf-a630-1fb2329f32e5","bid":"4da8b8c2-a026-4203-a2af-394bb6a5eaf5","timestamp":1749193052123,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"db1cf375-1835-488e-a798-60f23bb451fc","data":{"dongle_infos":[]},"tid":"678317eb-41ea-41d2-a570-7be59409ed17","timestamp":1749193052596,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e8026d7-cb34-40b3-9924-a62bbc47f0de","data":{"mobility_status_notify":0},"need_reply":1,"tid":"19dbfa46-ab81-4c74-8600-15f81f0848c5","timestamp":1749193053181,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ebaa6f40-fbcc-4d80-8259-f21c13e5bfd6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e7e4f9d1-9cda-4b47-9ca2-c244e34f5e9c","timestamp":1749193053381,"gateway":"8UUXN4P00A06NK"} + +{"bid":"32e0e9f3-87cc-4f25-8d73-2178a656955d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a832c33b-6e77-4786-ac36-c48363e09b3c","timestamp":1749193053782,"gateway":"8UUXN4P00A06NK"} + +{"bid":"11187d7f-e884-4b63-920d-cbe5bc2f85da","data":{"dongle_infos":[]},"tid":"96a48cbe-c47e-45ac-8605-dafc34cd2b63","timestamp":1749193054973,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aaa71528-e3a1-45a2-afb7-0811d481f198","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"000cc45b-5c86-4975-b46a-ae8fa0580362","timestamp":1749193054998,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3b4c7554-317d-474b-a4b8-e03e6364f295","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d016e299-09fc-46e9-9c72-caa65aedf781","timestamp":1749193055956,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6a4faa06-48b6-4c64-adb2-0787995a706d","data":{"departure_trajectory":[]},"tid":"b3abe114-83ce-480d-9d72-563ee565bea9","timestamp":1749193056552,"gateway":"8UUXN4P00A06NK"} + +{"bid":"51f29541-e19b-41e2-b4a6-b9e8f5d558c4","data":{"departure_trajectory":[]},"tid":"d8932414-6535-46b5-8e4b-031d79c8fa69","timestamp":1749193056674,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aaa71528-e3a1-45a2-afb7-0811d481f198","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"000cc45b-5c86-4975-b46a-ae8fa0580362","timestamp":1749193057182,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e8026d7-cb34-40b3-9924-a62bbc47f0de","data":{"mobility_status_notify":0},"need_reply":1,"tid":"19dbfa46-ab81-4c74-8600-15f81f0848c5","timestamp":1749193057383,"gateway":"8UUXN4P00A06NK"} + +{"bid":"32e0e9f3-87cc-4f25-8d73-2178a656955d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a832c33b-6e77-4786-ac36-c48363e09b3c","timestamp":1749193057981,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0f220f9e-26fa-4e0a-b5a6-1d4aee05ad2b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"35555348-7e62-40c3-99bd-b55e57c25df3","timestamp":1749193059996,"gateway":"8UUXN4P00A06NK"} + +{"tid":"af07046e-9bad-48f7-987d-d2509fdf0500","bid":"8b16df68-6a77-4b55-b6d7-d6681bffbaac","timestamp":1749193087902,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"9a80ece1-4874-4938-b6bf-2ddb626fe570","bid":"8a1cc707-3780-4d45-9fea-cd18eaba2775","timestamp":1749193087907,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"5dd70d06-75cc-4243-9eeb-828e9cbd76b8","data":{"air_transfer_enable":false},"need_reply":1,"tid":"0cf6fe22-3e3a-4dd5-abdb-de02b2ecd939","timestamp":1749193088275,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a0bf94ed-bc03-4d29-901f-fdf41e6adbc7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0f1f995a-3499-4148-877a-96cd2c3babf8","timestamp":1749193090216,"gateway":"8UUXN4P00A06NK"} + +{"bid":"887bdd2b-4c5c-4a61-a070-e60ad101c67e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"65ebf544-4195-41ec-b577-b606217481a7","timestamp":1749193090364,"gateway":"8UUXN4P00A06NK"} + +{"bid":"510e8352-5410-4a90-8ed8-54ca1c02c95b","data":{"dongle_infos":[]},"tid":"ff275301-a408-494e-8952-9c35d2999f03","timestamp":1749193090680,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9cb16111-35ff-4a53-b50b-00c55a8346cf","data":{"firmware_version":"13.01.0002"},"tid":"ba5522f0-fdad-4849-b27f-f5b40d6c61a7","timestamp":1749193090686,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0dfe9a3e-8411-4895-934c-fa08a41d699f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5009319a-9dcb-423e-8dd3-d52dbc59f432","timestamp":1749193090794,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5dd70d06-75cc-4243-9eeb-828e9cbd76b8","data":{"air_transfer_enable":false},"need_reply":1,"tid":"0cf6fe22-3e3a-4dd5-abdb-de02b2ecd939","timestamp":1749193090872,"gateway":"8UUXN4P00A06NK"} + +{"bid":"50dda6d0-435e-42b1-82db-4a4123f403fc","data":{"dongle_infos":[]},"tid":"f51015b0-90b0-4ebd-93f4-8b5c8f1c0558","timestamp":1749193091754,"gateway":"8UUXN4P00A06NK"} + +{"tid":"8d33dbcf-0f8f-4996-8f7a-447cb7768501","bid":"04267d50-1c52-4389-af03-f3d12188ff56","timestamp":1749193091815,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"a0bf94ed-bc03-4d29-901f-fdf41e6adbc7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0f1f995a-3499-4148-877a-96cd2c3babf8","timestamp":1749193092229,"gateway":"8UUXN4P00A06NK"} + +{"bid":"887bdd2b-4c5c-4a61-a070-e60ad101c67e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"65ebf544-4195-41ec-b577-b606217481a7","timestamp":1749193092429,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0dfe9a3e-8411-4895-934c-fa08a41d699f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5009319a-9dcb-423e-8dd3-d52dbc59f432","timestamp":1749193092827,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2a85c5c1-3283-47fa-97ae-78b6e18abb1f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2c9d87e7-e40e-4a81-adf7-8009bdcf2b42","timestamp":1749193092903,"gateway":"8UUXN4P00A06NK"} + +{"tid":"cebf01d8-bf58-49b6-b00a-0a36a5015ab6","bid":"9cbf414e-59c6-4824-a097-7b2da3016cfc","timestamp":1749193094794,"data":{"live_status":[{"video_id":"4SEDL9C001X8GE/165-0-7/normal-0","video_type":"normal","video_quality":4,"status":1,"error_status":0}]},"gateway":"4SEDL9C001X8GE"} + +{"tid":"660cb14a-18a1-472b-b9aa-0fa9b43da542","bid":"0a9a6c24-0ff6-4f4f-9965-2e475c860c68","timestamp":1749193121200,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"7d49d2a8-1a4d-4ecd-9b3c-640b0bc51515","bid":"01e3d810-ed95-45fb-a90c-a3bede008319","timestamp":1749193121205,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"7d715fc3-40db-4320-a802-bdab8c54c220","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e725e206-63eb-4721-9392-4189466f6009","timestamp":1749193122361,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6e249512-72b0-45f2-9d0a-66e5c6b36eb9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f5552890-b36a-4348-accd-76de7c5c68ec","timestamp":1749193122634,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b204c5b4-cafe-42b1-8a17-cf5116796823","data":{"dongle_infos":[]},"tid":"3d339e20-eaaf-4982-99d4-56e045b6f2a9","timestamp":1749193122807,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f773756e-fef5-48fb-98d8-51cf7f911362","data":{"firmware_version":"13.01.0002"},"tid":"7aa49911-82cd-44bb-b8ea-384e928a7612","timestamp":1749193122815,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8c7960fb-fc9d-4a3f-bc4e-ac2806d4fe1e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"34aebaab-3855-415d-bc3d-56c9342ee164","timestamp":1749193122931,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b52ab2fb-f7b4-444e-8289-c3617861fd09","data":{"air_transfer_enable":false},"need_reply":1,"tid":"dd28901c-35c6-4766-be9a-939759b110c8","timestamp":1749193123001,"gateway":"8UUXN4P00A06NK"} + +{"tid":"bf4082bb-b179-41c3-9271-a611b33b4b70","bid":"176ed477-123b-483f-aeb1-2eb4d1b9c8ab","timestamp":1749193123170,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"0ed24831-4da2-4054-96d9-907b9994a9db","data":{"dongle_infos":[]},"tid":"4ff9f4b1-eeed-4575-8338-30d25749f36d","timestamp":1749193123873,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7d715fc3-40db-4320-a802-bdab8c54c220","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e725e206-63eb-4721-9392-4189466f6009","timestamp":1749193124537,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6e249512-72b0-45f2-9d0a-66e5c6b36eb9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f5552890-b36a-4348-accd-76de7c5c68ec","timestamp":1749193124737,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8c7960fb-fc9d-4a3f-bc4e-ac2806d4fe1e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"34aebaab-3855-415d-bc3d-56c9342ee164","timestamp":1749193124938,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8290a66a-0551-4948-b172-3a7b59a575ed","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9641ab28-5a98-4c5a-b168-3113371506cf","timestamp":1749193126199,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d7b02c1d-662d-428f-b261-c6b88768b550","data":{"dongle_infos":[]},"tid":"60ecf2b0-1fc8-40fc-be11-9d0d6decfbac","timestamp":1749193127091,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b52ab2fb-f7b4-444e-8289-c3617861fd09","data":{"air_transfer_enable":false},"need_reply":1,"tid":"dd28901c-35c6-4766-be9a-939759b110c8","timestamp":1749193127202,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8ae030c3-134f-4770-9b1f-d46d637055fe","data":{"departure_trajectory":[]},"tid":"bcc50816-318f-418b-8335-8fbf0583efa6","timestamp":1749193127799,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ed4d8e61-2c7e-4529-a07b-49ced630d646","data":{"departure_trajectory":[]},"tid":"be9cee07-6e08-419b-846f-40686d46ed0c","timestamp":1749193127851,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8290a66a-0551-4948-b172-3a7b59a575ed","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9641ab28-5a98-4c5a-b168-3113371506cf","timestamp":1749193128337,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7d715fc3-40db-4320-a802-bdab8c54c220","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e725e206-63eb-4721-9392-4189466f6009","timestamp":1749193128737,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8c7960fb-fc9d-4a3f-bc4e-ac2806d4fe1e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"34aebaab-3855-415d-bc3d-56c9342ee164","timestamp":1749193129137,"gateway":"8UUXN4P00A06NK"} + +{"bid":"827e4938-e0bd-490a-94dc-392a8f20323d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0122c669-e090-4cc4-b870-1901d5dd80a7","timestamp":1749193131203,"gateway":"8UUXN4P00A06NK"} + +{"bid":"827e4938-e0bd-490a-94dc-392a8f20323d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0122c669-e090-4cc4-b870-1901d5dd80a7","timestamp":1749193133337,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b62caa3a-ad6d-4140-a1ec-2c1908d6c3b4","bid":"b7e58a70-abf3-494a-be29-9a1645c49741","timestamp":1749193159924,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"b0fcdffa-e19d-44e0-aeb0-758994750280","bid":"42a9beec-1985-4d6d-b9ea-a29686a91002","timestamp":1749193159927,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"246b9f99-ef3e-404a-8d9c-540a2453649d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"000dfa5f-cb8f-4270-abdf-14504c6cf711","timestamp":1749193160043,"gateway":"8UUXN4P00A06NK"} + +{"bid":"091cdc9d-4703-4354-971b-86b401826211","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"4fdbccaa-4855-4e5b-90f7-b4ba061473a4","timestamp":1749193161982,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c97db2ff-08f8-4ebf-97df-b0475b102c04","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"02f655ab-0629-457a-a03d-49df34f991ad","timestamp":1749193162177,"gateway":"8UUXN4P00A06NK"} + +{"tid":"e6b57cfe-79a0-4a5b-a69d-543727203f57","bid":"2874954d-b354-4b16-aa02-0019215d49ff","timestamp":1749193162215,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"39f0644a-8af0-4e03-9b8e-e4931501e7dd","data":{"dongle_infos":[]},"tid":"8446521a-7e7c-46c5-a18f-96a21aa80908","timestamp":1749193162332,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d938a8f3-5c47-413e-a34d-86494155ada7","data":{"firmware_version":"13.01.0002"},"tid":"3e3d220f-1560-45b0-920d-a893e488ecd0","timestamp":1749193162342,"gateway":"8UUXN4P00A06NK"} + +{"bid":"602cea07-9558-4257-814e-7dc9abe92457","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ba13004d-3610-48c1-becc-375072919529","timestamp":1749193162444,"gateway":"8UUXN4P00A06NK"} + +{"bid":"246b9f99-ef3e-404a-8d9c-540a2453649d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"000dfa5f-cb8f-4270-abdf-14504c6cf711","timestamp":1749193162524,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e623bc00-4385-4a55-8429-3228c55d8cf5","data":{"dongle_infos":[]},"tid":"5a71464c-40c6-4e2c-8ce0-63adcd7fdfeb","timestamp":1749193163385,"gateway":"8UUXN4P00A06NK"} + +{"bid":"091cdc9d-4703-4354-971b-86b401826211","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"4fdbccaa-4855-4e5b-90f7-b4ba061473a4","timestamp":1749193164031,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c97db2ff-08f8-4ebf-97df-b0475b102c04","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"02f655ab-0629-457a-a03d-49df34f991ad","timestamp":1749193164230,"gateway":"8UUXN4P00A06NK"} + +{"bid":"602cea07-9558-4257-814e-7dc9abe92457","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ba13004d-3610-48c1-becc-375072919529","timestamp":1749193164630,"gateway":"8UUXN4P00A06NK"} + +{"bid":"55bd769d-fa95-4848-8954-614a0ae7db14","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5a4960e6-3283-40ac-b859-dada13332642","timestamp":1749193164934,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b7095d63-152f-4af2-be30-a53d2a828cc0","data":{"dongle_infos":[]},"tid":"108dee8e-f0ba-46e3-a0a8-65d2505a3eac","timestamp":1749193165174,"gateway":"8UUXN4P00A06NK"} + +{"bid":"246b9f99-ef3e-404a-8d9c-540a2453649d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"000dfa5f-cb8f-4270-abdf-14504c6cf711","timestamp":1749193166724,"gateway":"8UUXN4P00A06NK"} + +{"bid":"74bdc5b8-7c65-4710-8ed0-867847378f9c","data":{"departure_trajectory":[]},"tid":"68f1a614-d5d2-45c4-ac97-5dbc68ca2604","timestamp":1749193166786,"gateway":"8UUXN4P00A06NK"} + +{"bid":"55bd769d-fa95-4848-8954-614a0ae7db14","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5a4960e6-3283-40ac-b859-dada13332642","timestamp":1749193167030,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ac2a6f55-11eb-4121-8caf-d0e7cc4b635b","data":{"departure_trajectory":[]},"tid":"377b8225-872b-482d-bbcf-f103df44da9f","timestamp":1749193167323,"gateway":"8UUXN4P00A06NK"} + +{"bid":"091cdc9d-4703-4354-971b-86b401826211","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"4fdbccaa-4855-4e5b-90f7-b4ba061473a4","timestamp":1749193168230,"gateway":"8UUXN4P00A06NK"} + +{"bid":"602cea07-9558-4257-814e-7dc9abe92457","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ba13004d-3610-48c1-becc-375072919529","timestamp":1749193168831,"gateway":"8UUXN4P00A06NK"} + +{"bid":"865e8a9a-ebd3-4e26-a6b6-f2c3bed959ed","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"11707717-98bb-413c-a28b-14360e91a9fc","timestamp":1749193169935,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b7a89123-3d91-4a71-8a47-a5b92315fa37","bid":"6d5109e4-45a8-4b24-a786-323cb0634eb8","timestamp":1749193199154,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"923452cf-2ea3-4dfc-b8e9-25014a4476bf","bid":"9dede64d-ccbd-4039-b22c-29bf6ad21163","timestamp":1749193199158,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"15bd2356-760a-4127-87da-6bef1f47d910","data":{"mobility_status_notify":0},"need_reply":1,"tid":"bea51a23-5130-4edd-bcbb-71ac43eede29","timestamp":1749193200085,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b75661c6-5156-4bd7-82c8-abbc75774576","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e0e69e2f-2b56-4e16-93f7-903ecd29e935","timestamp":1749193200099,"gateway":"8UUXN4P00A06NK"} + +{"bid":"22a92bab-66dc-405b-af6d-18c5d10d9a53","data":{"dongle_infos":[]},"tid":"b017d418-5bd1-4c8a-ab6a-d0220cec8c38","timestamp":1749193200476,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c24702f-415f-4ee4-9e31-4888fd0f5ae4","data":{"firmware_version":"13.01.0002"},"tid":"6fbdb44c-d280-4f9f-88c4-5b1e600284e4","timestamp":1749193200483,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6a5cd955-0039-4a1a-a236-00c31ebbe696","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"328749b2-697e-45ad-aa20-ee0a0a2505c7","timestamp":1749193200655,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9230eb78-99ea-4b13-b045-3122dfbec9e0","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8c604279-73bc-42b7-b9a4-bdbfffb65028","timestamp":1749193200664,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ebec18b0-83a1-4475-af13-6118401ded32","bid":"802ecf33-4bf7-4da0-a6ce-21226b11b118","timestamp":1749193200886,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"99716513-f7c1-4e47-b647-82dad3b67ef2","data":{"dongle_infos":[]},"tid":"5233fd0d-9251-4839-9358-164d4ec7b9bd","timestamp":1749193201487,"gateway":"8UUXN4P00A06NK"} + +{"bid":"15bd2356-760a-4127-87da-6bef1f47d910","data":{"mobility_status_notify":0},"need_reply":1,"tid":"bea51a23-5130-4edd-bcbb-71ac43eede29","timestamp":1749193202249,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b75661c6-5156-4bd7-82c8-abbc75774576","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e0e69e2f-2b56-4e16-93f7-903ecd29e935","timestamp":1749193202250,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6a5cd955-0039-4a1a-a236-00c31ebbe696","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"328749b2-697e-45ad-aa20-ee0a0a2505c7","timestamp":1749193202849,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8614a0f8-fe4c-434a-98a2-e98fb3005739","data":{"dongle_infos":[]},"tid":"d7e9c775-ef04-4f46-80f5-f51e614076b8","timestamp":1749193204133,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5226dae4-d781-49f7-b610-e490293a156b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b0224eba-4f3d-44c2-b5dd-525d43d26e9b","timestamp":1749193204150,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9230eb78-99ea-4b13-b045-3122dfbec9e0","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8c604279-73bc-42b7-b9a4-bdbfffb65028","timestamp":1749193204863,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3a01dcfa-173c-4ad5-a504-0eae93ef0926","data":{"departure_trajectory":[]},"tid":"7c29403e-1861-4d8a-baa9-efd4db955ed7","timestamp":1749193205460,"gateway":"8UUXN4P00A06NK"} + +{"bid":"313e5215-f30a-4ada-b9d0-449e150b3ad1","data":{"departure_trajectory":[]},"tid":"f2acd4d6-70b7-46de-89c9-06a6c169e884","timestamp":1749193205751,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5226dae4-d781-49f7-b610-e490293a156b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b0224eba-4f3d-44c2-b5dd-525d43d26e9b","timestamp":1749193206250,"gateway":"8UUXN4P00A06NK"} + +{"bid":"15bd2356-760a-4127-87da-6bef1f47d910","data":{"mobility_status_notify":0},"need_reply":1,"tid":"bea51a23-5130-4edd-bcbb-71ac43eede29","timestamp":1749193206446,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6a5cd955-0039-4a1a-a236-00c31ebbe696","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"328749b2-697e-45ad-aa20-ee0a0a2505c7","timestamp":1749193207048,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c295e757-267b-41be-b047-43d83cc0e047","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d17aea0b-b7b7-482d-a4ce-e75101b74ea6","timestamp":1749193209150,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b441f10a-912a-4adf-aad4-4e6a3be22d74","bid":"0b517a9e-c32e-4fca-8660-c7d13d3f1f99","timestamp":1749193237617,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"f08848d5-5ed8-4692-93e0-60c3372a10db","bid":"63790e47-5912-46d4-8a99-2c228679de1c","timestamp":1749193237620,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"28f5b016-4607-46cf-8f5f-67c96e000ed2","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7c8d60fe-b1e5-4a4d-95e0-5f8ae7401149","timestamp":1749193238219,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e30c0dd8-7fe2-4b10-95eb-0954c9999325","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e0263e32-afd6-4f4d-baf3-5962904e241c","timestamp":1749193238496,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a0f89356-dc5c-4091-aebd-6b574f37927f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"383208dc-9a3e-4298-b64e-ed12be36a0c6","timestamp":1749193238724,"gateway":"8UUXN4P00A06NK"} + +{"bid":"10ee136e-43f1-4c27-b401-3067fe775792","data":{"dongle_infos":[]},"tid":"aa10f3b7-5045-4f2d-91d4-8d9af17cf0b8","timestamp":1749193238733,"gateway":"8UUXN4P00A06NK"} + +{"bid":"11f3741f-aef7-49d9-bb93-fe4a20cdaaa1","data":{"firmware_version":"13.01.0002"},"tid":"0a6ae0bb-e1e0-47b8-93cd-80b3db8fa43b","timestamp":1749193238739,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8b579d05-fd5a-48e1-a0d4-e392d47793bb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c1dc46a4-5a0f-42b5-a987-73a54fef9f0e","timestamp":1749193238799,"gateway":"8UUXN4P00A06NK"} + +{"tid":"cffd8113-846c-4957-95e5-4f94a56fae10","bid":"fe7a30fe-76a2-42e8-b37c-a8eb5cc25070","timestamp":1749193239084,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"fbbc3933-4f77-4c75-a541-64f25cfc528a","data":{"dongle_infos":[]},"tid":"12ebe2fa-618d-4724-9e02-202493965e1c","timestamp":1749193239735,"gateway":"8UUXN4P00A06NK"} + +{"bid":"28f5b016-4607-46cf-8f5f-67c96e000ed2","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7c8d60fe-b1e5-4a4d-95e0-5f8ae7401149","timestamp":1749193240286,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e30c0dd8-7fe2-4b10-95eb-0954c9999325","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e0263e32-afd6-4f4d-baf3-5962904e241c","timestamp":1749193240686,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8b579d05-fd5a-48e1-a0d4-e392d47793bb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c1dc46a4-5a0f-42b5-a987-73a54fef9f0e","timestamp":1749193240886,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bb90c2f8-3ddd-4c2e-9fd8-63efa2a9a9e2","data":{"dongle_infos":[]},"tid":"b2100a44-a0b7-4ef3-8531-2f7a6eefe904","timestamp":1749193242078,"gateway":"8UUXN4P00A06NK"} + +{"bid":"90fc7cca-f595-4ae0-afef-4a816de15a5a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"99654b3d-9f84-4fd1-902b-60298e583f12","timestamp":1749193242620,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a0f89356-dc5c-4091-aebd-6b574f37927f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"383208dc-9a3e-4298-b64e-ed12be36a0c6","timestamp":1749193242923,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1be795df-1550-4238-b79d-3b6fcd887bd9","data":{"departure_trajectory":[]},"tid":"11855d21-200b-48bc-8b04-05c115a03c95","timestamp":1749193243718,"gateway":"8UUXN4P00A06NK"} + +{"bid":"769fb056-e29a-43a9-ad56-76bc8cffceab","data":{"departure_trajectory":[]},"tid":"5ef925e7-e94c-47ae-b0ae-dc4bb4879085","timestamp":1749193244301,"gateway":"8UUXN4P00A06NK"} + +{"bid":"28f5b016-4607-46cf-8f5f-67c96e000ed2","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7c8d60fe-b1e5-4a4d-95e0-5f8ae7401149","timestamp":1749193244487,"gateway":"8UUXN4P00A06NK"} + +{"bid":"90fc7cca-f595-4ae0-afef-4a816de15a5a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"99654b3d-9f84-4fd1-902b-60298e583f12","timestamp":1749193244686,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8b579d05-fd5a-48e1-a0d4-e392d47793bb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c1dc46a4-5a0f-42b5-a987-73a54fef9f0e","timestamp":1749193245086,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ba0cfa31-9f0b-467f-9eb6-9fb2514c0509","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"fdf0f9e4-ef0a-4172-bff7-175f7d71e1c3","timestamp":1749193247616,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ba0cfa31-9f0b-467f-9eb6-9fb2514c0509","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"fdf0f9e4-ef0a-4172-bff7-175f7d71e1c3","timestamp":1749193249686,"gateway":"8UUXN4P00A06NK"} + +{"tid":"0a778fe1-88c6-4400-a1cf-d265e62d9402","bid":"7e5da91e-5a2f-498d-bfe3-f11fa67dfd48","timestamp":1749193276830,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"66e00df1-a452-4ba3-86e2-31fbe40f89ae","bid":"5a05ce80-2541-4e8f-8de9-a0773026d69a","timestamp":1749193276833,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"84b64eec-e9db-49bd-a41c-dbc734d47fd2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"fc839afa-cda5-49bf-ae8e-b8bb28c9fa27","timestamp":1749193277419,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4254d8be-0dd3-4334-8f06-5cb70a58e624","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"7a3dc9ad-2306-4610-aa59-d10864f457e1","timestamp":1749193277423,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e26e20d8-c188-484d-a3f9-d385fd153aab","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d827b6ad-33dd-4332-aaa0-bdfea49d7e5a","timestamp":1749193277804,"gateway":"8UUXN4P00A06NK"} + +{"bid":"594c7d8c-0078-418b-a874-fb7ccedd4bac","data":{"air_transfer_enable":false},"need_reply":1,"tid":"fe04aa79-c9d8-4442-ab0b-1c7300a44e61","timestamp":1749193277860,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4fe0a979-ba25-4de9-b9c6-5f5311635ddb","data":{"dongle_infos":[]},"tid":"22a6cd8a-c876-4781-8697-cef74c401e26","timestamp":1749193277870,"gateway":"8UUXN4P00A06NK"} + +{"bid":"96827465-a37e-489a-9e50-c4f58d55b4ea","data":{"firmware_version":"13.01.0002"},"tid":"ae28af9a-1b8c-4b30-aaaa-680ef6a3609f","timestamp":1749193277879,"gateway":"8UUXN4P00A06NK"} + +{"bid":"60890693-0932-45c4-b96c-29cc4eb46306","data":{"dongle_infos":[]},"tid":"02da20cc-c3db-49bf-bc55-50766e3be8d2","timestamp":1749193278880,"gateway":"8UUXN4P00A06NK"} + +{"tid":"0524f2a0-51d0-4ec9-bebc-b6d67c8b23fd","bid":"3383cb58-3017-4d70-9c9b-207749426060","timestamp":1749193279174,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"84b64eec-e9db-49bd-a41c-dbc734d47fd2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"fc839afa-cda5-49bf-ae8e-b8bb28c9fa27","timestamp":1749193279502,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4254d8be-0dd3-4334-8f06-5cb70a58e624","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"7a3dc9ad-2306-4610-aa59-d10864f457e1","timestamp":1749193279503,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e26e20d8-c188-484d-a3f9-d385fd153aab","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d827b6ad-33dd-4332-aaa0-bdfea49d7e5a","timestamp":1749193279900,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e2acbbc5-835b-4df9-9bd5-232a24de3c99","data":{"dongle_infos":[]},"tid":"b3c24a28-845f-40e4-9c1b-1856647d70df","timestamp":1749193281565,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f59308ff-af3e-4216-b625-03a9f4fc2064","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5661e054-2ae9-4f19-9d92-04712a6c1a7f","timestamp":1749193281831,"gateway":"8UUXN4P00A06NK"} + +{"bid":"594c7d8c-0078-418b-a874-fb7ccedd4bac","data":{"air_transfer_enable":false},"need_reply":1,"tid":"fe04aa79-c9d8-4442-ab0b-1c7300a44e61","timestamp":1749193282069,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d58d76ff-0be3-4fb3-9fb2-7e99ef89eee3","data":{"departure_trajectory":[]},"tid":"ea90f0cf-8e8b-41b2-82f8-54c6f1c9a9a2","timestamp":1749193282864,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0f40701c-d9de-48f1-ac4b-49f0e9c166e4","data":{"departure_trajectory":[]},"tid":"5528a7be-0fd7-4a67-b9f9-01efd33d5a83","timestamp":1749193283464,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4254d8be-0dd3-4334-8f06-5cb70a58e624","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"7a3dc9ad-2306-4610-aa59-d10864f457e1","timestamp":1749193283701,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f59308ff-af3e-4216-b625-03a9f4fc2064","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5661e054-2ae9-4f19-9d92-04712a6c1a7f","timestamp":1749193283901,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e26e20d8-c188-484d-a3f9-d385fd153aab","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d827b6ad-33dd-4332-aaa0-bdfea49d7e5a","timestamp":1749193284101,"gateway":"8UUXN4P00A06NK"} + +{"bid":"85e06131-348a-480c-ba12-ca2ac715c6ce","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9de0dead-8485-4dc3-8003-3fd6257f7458","timestamp":1749193286835,"gateway":"8UUXN4P00A06NK"} + +{"bid":"85e06131-348a-480c-ba12-ca2ac715c6ce","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9de0dead-8485-4dc3-8003-3fd6257f7458","timestamp":1749193288900,"gateway":"8UUXN4P00A06NK"} + +{"tid":"00ad84c5-ec31-4d1a-9ddd-49ae7812075a","bid":"1dfe48ec-d40f-4d25-8273-c55d2fe5fdb7","timestamp":1749193313006,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"312390e1-4c7f-498f-b413-28b4b1a33f2d","bid":"9cbf7ff3-2343-403c-89ec-d32df385466b","timestamp":1749193313009,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"dbe75dbd-9271-4035-83be-0ee1abc1467f","bid":"798317b2-d742-46ae-b246-bfb7dcf8742d","timestamp":1749193321123,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"3af9eff6-1990-4e77-aa00-725552e484ce","bid":"b5de694b-a996-4c6a-b1bc-521dfa7a3a0f","timestamp":1749193321124,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"tid":"1fd8b25f-44f5-4376-ac0b-01340fdd1494","bid":"f70a5591-f33b-404b-87d4-8f2968d30b91","timestamp":1749193321125,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"d27b78c8-4a94-4c25-b86d-49b59cc8118a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"58cd7346-54d9-4825-84c8-7ec53f144113","timestamp":1749193321481,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c7a38a41-e7fc-46c0-909a-7ba6c4e788ec","data":{"departure_trajectory":[]},"tid":"e3de6b88-e0c7-4bbf-aa39-47da61082150","timestamp":1749193322282,"gateway":"8UUXN4P00A06NK"} + +{"bid":"50fe43a6-5095-446a-ae83-e3342a5a2ee5","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"befd1d39-1ab7-4903-8b15-30abf8c475ab","timestamp":1749193323000,"gateway":"8UUXN4P00A06NK"} + +{"bid":"489509d8-ef79-420a-a8dd-b692161fc4bf","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"9f3f8dd8-fe78-4feb-862a-21fa3df58ef4","timestamp":1749193323198,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9474db3c-0770-4082-a2ad-86c5cddf12a2","data":{"mobility_status_notify":0},"need_reply":1,"tid":"9d4c0e39-e63b-4acd-a343-0e718fc7da2c","timestamp":1749193323599,"gateway":"8UUXN4P00A06NK"} + +{"bid":"76c3ac2c-ca64-4409-b0c4-e5ddc2889cf0","data":{"departure_trajectory":[]},"tid":"030db565-3559-4e2b-8068-8b054ed27020","timestamp":1749193324511,"gateway":"8UUXN4P00A06NK"} + +{"bid":"50fe43a6-5095-446a-ae83-e3342a5a2ee5","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"befd1d39-1ab7-4903-8b15-30abf8c475ab","timestamp":1749193325197,"gateway":"8UUXN4P00A06NK"} + +{"bid":"98c05aed-09c7-4bc3-a9b7-33ddfb08cbc0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a719df3f-0a96-46e1-8d1d-3beae92bf741","timestamp":1749193326123,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d3c44395-9fae-49be-8288-e2149705b6c7","data":{"dongle_infos":[]},"tid":"0022dc93-dbd2-4d1b-880a-a5d6f3774578","timestamp":1749193326124,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c9607246-34dd-4fdf-b504-229be9359ded","data":{"departure_trajectory":[]},"tid":"b602b176-1601-4ad2-9493-27be51ee0458","timestamp":1749193326124,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d0b7f1d8-0fdb-4e3c-860c-34c40629931a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a49c57e0-cc22-4694-9894-6a883f44ae07","timestamp":1749193328003,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d27b78c8-4a94-4c25-b86d-49b59cc8118a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"58cd7346-54d9-4825-84c8-7ec53f144113","timestamp":1749193329679,"gateway":"8UUXN4P00A06NK"} + +{"tid":"14bedb91-d08c-4d17-bf52-887e72f1a65d","bid":"0e7fbe26-6e96-4958-971a-0208f167b4cb","timestamp":1749193354361,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"e89ea0f7-9983-4ddd-9135-1c227ee533d1","bid":"51ada8a8-432c-4337-8561-a3b6e42a40b4","timestamp":1749193354369,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"4be1da5f-977a-4349-8943-f4abf8be3bd4","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1a56bf9d-3455-41d3-a0d3-6b2b8cfbfd73","timestamp":1749193355395,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3478a07d-3b6f-443e-83da-29ad4fea50ca","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"947f80b5-e91c-44c9-80b4-12038a76d47d","timestamp":1749193357452,"gateway":"8UUXN4P00A06NK"} + +{"bid":"38bbddd5-5d98-4a01-9e0b-c7a701c1f0ac","data":{"mobility_status_notify":0},"need_reply":1,"tid":"8c8c2885-0fbe-4296-819c-b2842c91fd9d","timestamp":1749193357626,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4be1da5f-977a-4349-8943-f4abf8be3bd4","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1a56bf9d-3455-41d3-a0d3-6b2b8cfbfd73","timestamp":1749193358013,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ace65ebf-0dc3-4910-8f22-b85f74d2cf07","data":{"dongle_infos":[]},"tid":"ac63a5d4-858e-4c3b-9bc1-dd70c6ba37b5","timestamp":1749193358019,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0a147845-0ce2-4c36-bbce-15546b6411d7","data":{"firmware_version":"13.01.0002"},"tid":"a907ac97-5a61-4319-b8c3-f0b58fc6f3c3","timestamp":1749193358027,"gateway":"8UUXN4P00A06NK"} + +{"bid":"65529e9a-0293-4d49-a58c-40523b28fab4","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c741d22e-22c0-4908-8110-dd28bd4f7991","timestamp":1749193358177,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4ce8ee6b-5923-434c-8b3b-f2d8d30a16fa","data":{"dongle_infos":[]},"tid":"bc79827b-36bb-4a0d-9333-6d01d1ed015d","timestamp":1749193359025,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ecc9993d-fec6-4333-ac61-c9bceaee8834","bid":"a07e22c9-c06a-4aab-835c-b901a4f594db","timestamp":1749193359210,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"76670534-0c36-4780-935b-9b6814e25181","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"07767f11-c6c8-4668-bf43-fc99137c876f","timestamp":1749193359362,"gateway":"8UUXN4P00A06NK"} + +{"bid":"38bbddd5-5d98-4a01-9e0b-c7a701c1f0ac","data":{"mobility_status_notify":0},"need_reply":1,"tid":"8c8c2885-0fbe-4296-819c-b2842c91fd9d","timestamp":1749193359658,"gateway":"8UUXN4P00A06NK"} + +{"bid":"65529e9a-0293-4d49-a58c-40523b28fab4","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c741d22e-22c0-4908-8110-dd28bd4f7991","timestamp":1749193360256,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d22c54af-2deb-4e08-bf58-46f059d7e8f1","bid":"fc91de2c-7bb5-46a8-84c3-356f23f9bdf8","timestamp":1749193387852,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"a0642939-df2b-4338-b5a6-4bbd2ed94de2","bid":"e1a241c6-c30c-434a-98ad-0a6349659eb2","timestamp":1749193387862,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"938c608c-27cd-4336-87fb-929cce061987","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1c9e7445-6d92-4390-9027-a7a94aa7a646","timestamp":1749193389016,"gateway":"8UUXN4P00A06NK"} + +{"bid":"591dc291-9894-4b95-954d-2c86346d41ef","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7615fcf3-6fc5-473f-896b-5e2457f5e127","timestamp":1749193389118,"gateway":"8UUXN4P00A06NK"} + +{"bid":"53c20e34-4b5d-4bf5-9442-5302ea39f7ca","data":{"dongle_infos":[]},"tid":"78da17ba-a157-47bc-9dab-b200a5f62494","timestamp":1749193389538,"gateway":"8UUXN4P00A06NK"} + +{"bid":"774864ba-58b6-4a79-b077-ee3c3089118a","data":{"firmware_version":"13.01.0002"},"tid":"85dc8681-1023-4f24-8fd7-8c252ca615c6","timestamp":1749193389546,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df1cb659-c660-40c9-9802-69ac747b0f62","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"7b02666f-6aa4-4fca-a47e-715d0a479c91","timestamp":1749193389699,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4076eb95-9302-435b-95f3-fbeaf5083f6b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8286fbf7-190c-43f5-9d2e-6fd45ded7b7a","timestamp":1749193389734,"gateway":"8UUXN4P00A06NK"} + +{"tid":"14213bc7-0a29-48bc-96a1-f83fdb2fc85d","bid":"026673aa-9171-4c71-9df1-12d141c6cb7e","timestamp":1749193389891,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"7ab9dde5-a826-4b3d-a76a-bbd7a5323e0e","data":{"dongle_infos":[]},"tid":"e94a84f5-ceee-4dbb-9ac4-e787c3fb1570","timestamp":1749193390549,"gateway":"8UUXN4P00A06NK"} + +{"bid":"938c608c-27cd-4336-87fb-929cce061987","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1c9e7445-6d92-4390-9027-a7a94aa7a646","timestamp":1749193391108,"gateway":"8UUXN4P00A06NK"} + +{"bid":"591dc291-9894-4b95-954d-2c86346d41ef","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7615fcf3-6fc5-473f-896b-5e2457f5e127","timestamp":1749193391305,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df1cb659-c660-40c9-9802-69ac747b0f62","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"7b02666f-6aa4-4fca-a47e-715d0a479c91","timestamp":1749193391707,"gateway":"8UUXN4P00A06NK"} + +{"bid":"27777ace-ffa6-42bb-b07b-0866ac4b242d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7e719bbd-2d4e-4e8c-8bbf-9f79726b9e2e","timestamp":1749193392849,"gateway":"8UUXN4P00A06NK"} + +{"bid":"de211591-d470-4738-af75-bece54ac204d","data":{"dongle_infos":[]},"tid":"801a8b50-fc28-4b43-bf1d-78f68223d77f","timestamp":1749193393101,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4076eb95-9302-435b-95f3-fbeaf5083f6b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8286fbf7-190c-43f5-9d2e-6fd45ded7b7a","timestamp":1749193393927,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e7c6d868-1fd6-48c4-9efc-1d1093a1d225","data":{"departure_trajectory":[]},"tid":"751f609a-478f-4bfd-b2ad-aeb6a76938ce","timestamp":1749193394528,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1a85016f-f12d-49fc-b15a-841d7d1b2395","data":{"departure_trajectory":[]},"tid":"5312bc14-d7fa-480d-bbfd-aa5ed70881c3","timestamp":1749193394547,"gateway":"8UUXN4P00A06NK"} + +{"bid":"27777ace-ffa6-42bb-b07b-0866ac4b242d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7e719bbd-2d4e-4e8c-8bbf-9f79726b9e2e","timestamp":1749193394907,"gateway":"8UUXN4P00A06NK"} + +{"bid":"591dc291-9894-4b95-954d-2c86346d41ef","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7615fcf3-6fc5-473f-896b-5e2457f5e127","timestamp":1749193395507,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df1cb659-c660-40c9-9802-69ac747b0f62","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"7b02666f-6aa4-4fca-a47e-715d0a479c91","timestamp":1749193395910,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0e5ef579-656a-44c2-907c-f9ee66deecb6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"40f28f3f-8134-42fb-a45a-dac76832154c","timestamp":1749193397848,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0e5ef579-656a-44c2-907c-f9ee66deecb6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"40f28f3f-8134-42fb-a45a-dac76832154c","timestamp":1749193399905,"gateway":"8UUXN4P00A06NK"} + +{"tid":"fd950368-23e7-40e4-9027-aa1a4ed38eb3","bid":"ff24ed48-6eb4-44d0-99a1-7430557ddf9f","timestamp":1749193426200,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"5bf53e8e-596a-46ca-83e4-4cf766e60909","bid":"61b395f0-68e1-4159-8945-2bb9ab97a325","timestamp":1749193426207,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"348e33fd-fb28-4605-a807-dd4ce28811f6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"79e6bbb9-81a4-4b56-8d71-9b992c9c53d2","timestamp":1749193428048,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2a2a9edc-98e0-4cfd-9a86-ad48d5dbfe22","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"76d871d4-0c66-44db-b32d-2f2af3c3434e","timestamp":1749193428052,"gateway":"8UUXN4P00A06NK"} + +{"bid":"042cc4fe-52fd-47a6-983b-4a5f6d7c0687","data":{"dongle_infos":[]},"tid":"1ffa07bd-19c0-4890-a3db-f2161dda9101","timestamp":1749193428248,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9a79cbe3-c82a-4aa8-b5ca-cde8400e054d","data":{"firmware_version":"13.01.0002"},"tid":"db98e0d3-fa17-49b8-88ef-2ab7a2a0dd62","timestamp":1749193428278,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9f546f38-42d2-4424-86ec-d14b1dee546d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"8827245b-7bb2-41bd-b584-559fde2f6e81","timestamp":1749193428457,"gateway":"8UUXN4P00A06NK"} + +{"bid":"deb3d118-ff0c-49ff-bbf9-7f83bc6aba51","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2617c7df-6324-4712-b75b-a340c2ebfc3a","timestamp":1749193428460,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b1be8dda-e8fa-49f8-be08-94a307aa13ec","bid":"59deae08-fb48-41b5-8c96-25f9d855265e","timestamp":1749193428497,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"038efd5e-225e-4dec-a252-8cb4d9173c0c","data":{"dongle_infos":[]},"tid":"8e690483-7326-4ac6-8447-fa515fb01bb9","timestamp":1749193429249,"gateway":"8UUXN4P00A06NK"} + +{"bid":"348e33fd-fb28-4605-a807-dd4ce28811f6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"79e6bbb9-81a4-4b56-8d71-9b992c9c53d2","timestamp":1749193430237,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2a2a9edc-98e0-4cfd-9a86-ad48d5dbfe22","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"76d871d4-0c66-44db-b32d-2f2af3c3434e","timestamp":1749193430239,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9f546f38-42d2-4424-86ec-d14b1dee546d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"8827245b-7bb2-41bd-b584-559fde2f6e81","timestamp":1749193430637,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a565d62b-add8-45a8-98b0-05969094acd4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1dbb104d-2c45-4cf8-9218-43232aac963d","timestamp":1749193431199,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0618cc8b-1429-4e21-81d2-0f1061872a02","data":{"dongle_infos":[]},"tid":"325fdf88-e886-453c-9417-a91d43b59e87","timestamp":1749193431341,"gateway":"8UUXN4P00A06NK"} + +{"bid":"971f68d5-1be1-48ee-bac2-68bc581dfad8","data":{"departure_trajectory":[]},"tid":"ba4c00a3-799a-4532-9889-0d1965d62d91","timestamp":1749193432653,"gateway":"8UUXN4P00A06NK"} + +{"bid":"deb3d118-ff0c-49ff-bbf9-7f83bc6aba51","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2617c7df-6324-4712-b75b-a340c2ebfc3a","timestamp":1749193432659,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c57bb415-2b1b-4aed-96ff-2054b0a1e573","data":{"departure_trajectory":[]},"tid":"b502027a-050f-424c-9863-200f65a5b58a","timestamp":1749193433237,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a565d62b-add8-45a8-98b0-05969094acd4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1dbb104d-2c45-4cf8-9218-43232aac963d","timestamp":1749193433243,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2a2a9edc-98e0-4cfd-9a86-ad48d5dbfe22","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"76d871d4-0c66-44db-b32d-2f2af3c3434e","timestamp":1749193434441,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9f546f38-42d2-4424-86ec-d14b1dee546d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"8827245b-7bb2-41bd-b584-559fde2f6e81","timestamp":1749193434839,"gateway":"8UUXN4P00A06NK"} + +{"bid":"507bf56d-3c05-4aa5-ac3a-f448eae06d59","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f2e4dc46-5990-47b8-896c-16386985c00f","timestamp":1749193436202,"gateway":"8UUXN4P00A06NK"} + +{"tid":"caa4f835-8fea-4d59-8a04-cf5f6644f1b5","bid":"0dbb16fa-ba0b-4bd7-90c6-6255a97c4d86","timestamp":1749193463215,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"bccdc5be-d259-4f4a-9440-662630369867","bid":"d24a08bd-55fb-454d-aec2-a1a3cb07b756","timestamp":1749193463217,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"d0f95133-0b95-4c62-81c6-222d55000043","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b138d2cd-8ff8-457d-a775-c9305117b1b4","timestamp":1749193464306,"gateway":"8UUXN4P00A06NK"} + +{"bid":"db3dc354-661d-4353-91cb-fa412dcc7f81","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e8e13412-d488-4cb0-bc55-34b19a4d352c","timestamp":1749193464311,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b9b6a962-a617-42ea-841f-10c8c145ed96","data":{"dongle_infos":[]},"tid":"5d5b02e1-cda1-4e1e-8989-8b6d35c542a5","timestamp":1749193464796,"gateway":"8UUXN4P00A06NK"} + +{"bid":"49433c68-fd27-4763-9da7-07f3fd12037e","data":{"firmware_version":"13.01.0002"},"tid":"9e79613b-c3e8-47b6-a045-c81a639d655c","timestamp":1749193464802,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9a7ad393-e8ce-43f0-9d01-d37a81766dbe","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"da17c4fa-c7ec-4569-a48d-cd0b57e6371a","timestamp":1749193464895,"gateway":"8UUXN4P00A06NK"} + +{"bid":"233dc982-d697-4ccb-b990-f2a0bf6340bb","data":{"air_transfer_enable":false},"need_reply":1,"tid":"805287be-7564-4532-806b-5bfec2a7c7a5","timestamp":1749193464991,"gateway":"8UUXN4P00A06NK"} + +{"tid":"96ed2644-abb1-4a90-8f87-0ad247cd4309","bid":"021d8d7e-65cd-4fc1-9d14-ddf1580b221e","timestamp":1749193465641,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"261d5095-dda2-4c4e-8774-fe183f8951af","data":{"dongle_infos":[]},"tid":"51a983d1-4280-4cc9-82f7-bfd4d02c0849","timestamp":1749193465802,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d0f95133-0b95-4c62-81c6-222d55000043","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b138d2cd-8ff8-457d-a775-c9305117b1b4","timestamp":1749193466411,"gateway":"8UUXN4P00A06NK"} + +{"bid":"db3dc354-661d-4353-91cb-fa412dcc7f81","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e8e13412-d488-4cb0-bc55-34b19a4d352c","timestamp":1749193466412,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9a7ad393-e8ce-43f0-9d01-d37a81766dbe","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"da17c4fa-c7ec-4569-a48d-cd0b57e6371a","timestamp":1749193467009,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1222b2e7-c25c-46d4-b5e3-90348d9c6bbc","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1a97d2fe-991e-4d71-9573-9a4fb4ea8602","timestamp":1749193468216,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8854b12f-a731-4e74-92ad-c7d11d044579","data":{"dongle_infos":[]},"tid":"7f90ad9d-78fb-4c35-adef-a5f7bf6d34d5","timestamp":1749193468344,"gateway":"8UUXN4P00A06NK"} + +{"bid":"233dc982-d697-4ccb-b990-f2a0bf6340bb","data":{"air_transfer_enable":false},"need_reply":1,"tid":"805287be-7564-4532-806b-5bfec2a7c7a5","timestamp":1749193469190,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cddce80f-2f94-4ac1-8b8c-fada52a2d506","data":{"departure_trajectory":[]},"tid":"46e31828-1f27-4868-98e1-7f1b54522fb3","timestamp":1749193469792,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fa0233a8-0fc4-4b54-848d-3a6d812bc480","data":{"departure_trajectory":[]},"tid":"09583f94-a0b8-4522-8ae7-f62bdc18e884","timestamp":1749193469811,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1222b2e7-c25c-46d4-b5e3-90348d9c6bbc","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1a97d2fe-991e-4d71-9573-9a4fb4ea8602","timestamp":1749193470411,"gateway":"8UUXN4P00A06NK"} + +{"bid":"db3dc354-661d-4353-91cb-fa412dcc7f81","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e8e13412-d488-4cb0-bc55-34b19a4d352c","timestamp":1749193470613,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9a7ad393-e8ce-43f0-9d01-d37a81766dbe","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"da17c4fa-c7ec-4569-a48d-cd0b57e6371a","timestamp":1749193471213,"gateway":"8UUXN4P00A06NK"} + +{"bid":"908ed87b-36f5-4b8b-9083-d4b1d0dc865b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"28408610-3083-47d8-b991-d46bc94ae91c","timestamp":1749193473211,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d1e4c7f8-c5b9-4a1e-99e4-01665fdf5e58","bid":"1a99a620-82e8-42c8-8b38-046e42f98a56","timestamp":1749193502292,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"9092e9fc-ec82-42e1-8a5d-9157dd66fbb0","bid":"3e0a0cf1-ad03-43df-86f7-70f298807511","timestamp":1749193502297,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"99815911-a860-403f-b8fe-9044c9995903","data":{"mobility_status_notify":0},"need_reply":1,"tid":"aa48fce7-8dc2-46ba-9478-04e278339ad4","timestamp":1749193503370,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d6f09b0b-185d-4f40-8cf7-e6c878325569","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c10b3225-49c1-4462-9903-741a023c257e","timestamp":1749193503567,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1c0a86ff-8160-4f5e-a5b7-70eb9d245e9a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"a7ea9cba-7b99-42d9-9b51-d867e179aaa5","timestamp":1749193503854,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7d4d4539-577f-431d-b993-cb50ac34f40b","data":{"dongle_infos":[]},"tid":"3abdaa36-4481-4705-bfd4-1b457c8375c8","timestamp":1749193503860,"gateway":"8UUXN4P00A06NK"} + +{"bid":"92e9f046-90c6-4334-a4a4-7627d03242a8","data":{"firmware_version":"13.01.0002"},"tid":"5bd26c0f-b1bd-4b58-86b8-97cd452a87e7","timestamp":1749193503867,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f376e40c-7805-4972-9a03-eb997867eb9f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"0d077115-580f-427c-8387-db88a4682338","timestamp":1749193503869,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e5618bff-9ad9-40a0-991a-5181dfee3675","data":{"dongle_infos":[]},"tid":"3fca3a3b-fe4d-4a68-869e-bf1407096b58","timestamp":1749193504869,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ee7d06e2-9dba-4fdd-8ec1-59cbdc5d54ce","bid":"1cf28c2e-e1f2-4884-9028-9a044bb4f353","timestamp":1749193504870,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"99815911-a860-403f-b8fe-9044c9995903","data":{"mobility_status_notify":0},"need_reply":1,"tid":"aa48fce7-8dc2-46ba-9478-04e278339ad4","timestamp":1749193505476,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d6f09b0b-185d-4f40-8cf7-e6c878325569","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c10b3225-49c1-4462-9903-741a023c257e","timestamp":1749193505676,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f376e40c-7805-4972-9a03-eb997867eb9f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"0d077115-580f-427c-8387-db88a4682338","timestamp":1749193505876,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6792e8de-97be-4432-bdc0-d31ab3fb8586","data":{"dongle_infos":[]},"tid":"eab17a63-1bca-49d7-8f30-2e1b4d958b79","timestamp":1749193507197,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1c711644-9180-4d51-887c-980a8ebfae9e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8f4cdfab-c15c-4e1d-88b3-cc8c2020e73e","timestamp":1749193507293,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1c0a86ff-8160-4f5e-a5b7-70eb9d245e9a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"a7ea9cba-7b99-42d9-9b51-d867e179aaa5","timestamp":1749193508056,"gateway":"8UUXN4P00A06NK"} + +{"bid":"af82f85f-fa1b-4b55-b508-2fe49fd0e423","data":{"departure_trajectory":[]},"tid":"1a9c69f4-c38b-4f47-861e-9ed2e89df97c","timestamp":1749193508852,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5c526ba0-a4f4-44d2-970b-866a74a98f9f","data":{"departure_trajectory":[]},"tid":"c43a8a14-c898-421d-8b76-4b608e6d9486","timestamp":1749193509042,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1c711644-9180-4d51-887c-980a8ebfae9e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8f4cdfab-c15c-4e1d-88b3-cc8c2020e73e","timestamp":1749193509473,"gateway":"8UUXN4P00A06NK"} + +{"bid":"99815911-a860-403f-b8fe-9044c9995903","data":{"mobility_status_notify":0},"need_reply":1,"tid":"aa48fce7-8dc2-46ba-9478-04e278339ad4","timestamp":1749193509673,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f376e40c-7805-4972-9a03-eb997867eb9f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"0d077115-580f-427c-8387-db88a4682338","timestamp":1749193510072,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a88dff27-3ed1-4ff5-abdc-ce355011b2ce","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e35fef72-2d4f-4b39-a4d6-0138cd6b8531","timestamp":1749193512293,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a88dff27-3ed1-4ff5-abdc-ce355011b2ce","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e35fef72-2d4f-4b39-a4d6-0138cd6b8531","timestamp":1749193514472,"gateway":"8UUXN4P00A06NK"} + +{"tid":"085f8ea8-c380-4897-896f-43f5d3ad4c39","bid":"a2d494f2-e0b7-40b4-aad2-aa73a9a52242","timestamp":1749193541326,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"d61cf270-5506-443c-b37f-746ce7d50d3e","bid":"d2e4c9e3-2f1c-42cc-85f3-10bb617dc783","timestamp":1749193541332,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"b567e3b3-4ffe-49f0-bf24-ca2cb87d35ab","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7519ba18-035d-41d2-8f49-bb7d406d20cd","timestamp":1749193542557,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e1b9039c-a403-44d7-b2d5-2c944a43b415","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a2c5944d-1c89-4c4b-aa7b-0cc394aa93aa","timestamp":1749193542718,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4b7f4fea-42f6-4feb-b986-f1b51d2ecd03","data":{"air_transfer_enable":false},"need_reply":1,"tid":"f2d6e68a-12a0-4138-9a2b-d85921c82782","timestamp":1749193543016,"gateway":"8UUXN4P00A06NK"} + +{"bid":"94e6483c-1d6c-4fe3-b4c9-27448e936f65","data":{"dongle_infos":[]},"tid":"0d57132d-cc7b-4abc-ab09-48967e63ae63","timestamp":1749193543023,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2a91f6b0-8e2d-4160-b986-36db7afccb9c","data":{"firmware_version":"13.01.0002"},"tid":"85facdfb-9e67-46a4-9d6b-ab0e7f2f611e","timestamp":1749193543029,"gateway":"8UUXN4P00A06NK"} + +{"bid":"44426c82-6f84-4854-a4d8-460f41adb6e1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6dd62fd4-5a2e-4eb5-90bc-91142a1645be","timestamp":1749193543030,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b46c825a-dd47-404e-a84d-c68ba588d391","bid":"fe28de33-c486-4984-96d6-f985215714a2","timestamp":1749193543225,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"be42a006-72ff-4d4e-a323-2fabe69bb660","data":{"dongle_infos":[]},"tid":"1a44ac42-23a3-4280-9cea-7e972bbb5e71","timestamp":1749193544022,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b567e3b3-4ffe-49f0-bf24-ca2cb87d35ab","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7519ba18-035d-41d2-8f49-bb7d406d20cd","timestamp":1749193544709,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e1b9039c-a403-44d7-b2d5-2c944a43b415","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a2c5944d-1c89-4c4b-aa7b-0cc394aa93aa","timestamp":1749193544908,"gateway":"8UUXN4P00A06NK"} + +{"bid":"44426c82-6f84-4854-a4d8-460f41adb6e1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6dd62fd4-5a2e-4eb5-90bc-91142a1645be","timestamp":1749193545109,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0a56b022-50b9-4f17-9718-cf42817e6186","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e99cafa7-c117-4836-bf72-69511fa6436b","timestamp":1749193546323,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4b7f4fea-42f6-4feb-b986-f1b51d2ecd03","data":{"air_transfer_enable":false},"need_reply":1,"tid":"f2d6e68a-12a0-4138-9a2b-d85921c82782","timestamp":1749193547214,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cdd4399b-dd71-4fe5-8dee-90d94d672ef1","data":{"dongle_infos":[]},"tid":"ab22a60a-f78e-4b59-b1c9-90f8cf7584a1","timestamp":1749193547378,"gateway":"8UUXN4P00A06NK"} + +{"bid":"27762b08-e800-4abb-9e36-49aa3f86142f","data":{"departure_trajectory":[]},"tid":"e22d7e7c-2156-41f8-a63a-2602cf2e7eaa","timestamp":1749193547964,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b59ec9e2-53da-444f-8a26-d9c9b5706090","data":{"departure_trajectory":[]},"tid":"b44bbadf-e7b7-420b-beb8-73d9f348d16b","timestamp":1749193548009,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0a56b022-50b9-4f17-9718-cf42817e6186","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e99cafa7-c117-4836-bf72-69511fa6436b","timestamp":1749193548509,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b567e3b3-4ffe-49f0-bf24-ca2cb87d35ab","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7519ba18-035d-41d2-8f49-bb7d406d20cd","timestamp":1749193548909,"gateway":"8UUXN4P00A06NK"} + +{"bid":"44426c82-6f84-4854-a4d8-460f41adb6e1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6dd62fd4-5a2e-4eb5-90bc-91142a1645be","timestamp":1749193549308,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e633bf2d-2def-4f1e-a496-9a6c268c2c78","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"54a7ffa8-5a7c-4581-92ee-e99bd943563d","timestamp":1749193551322,"gateway":"8UUXN4P00A06NK"} + +{"tid":"362d6ab3-ce49-4123-a7d3-5adec69b0862","bid":"326d7022-453e-49f7-9fef-0752a0b247fc","timestamp":1749193579785,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"79de995c-68de-4c2b-be09-d8bbd4350317","bid":"b9d36d33-1a49-43a6-8078-46d225954ab7","timestamp":1749193579787,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"534332da-6c78-469c-a0d7-37a65aa81170","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b436b881-d220-4a09-8657-9642bd9cb280","timestamp":1749193580487,"gateway":"8UUXN4P00A06NK"} + +{"bid":"770f0dea-96a0-46fc-b9e5-069c895761f2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"af65c877-b1ae-425d-b415-fe885849ce6c","timestamp":1749193580597,"gateway":"8UUXN4P00A06NK"} + +{"bid":"291f0884-3d70-4bfd-8c0b-b96e9b04d57c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"dad13a98-9437-43f0-b808-85719c3100e1","timestamp":1749193580817,"gateway":"8UUXN4P00A06NK"} + +{"bid":"985e11d3-a288-4528-a9da-39b0c68d867a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"6565e06f-1157-43b9-857a-528b1845e818","timestamp":1749193581024,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fcad4235-4240-4fe6-8b9e-9eb8c7a133f9","data":{"dongle_infos":[]},"tid":"650dedb6-68bd-45c8-b0fb-d5a38833dd4c","timestamp":1749193581032,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6d6825e7-1044-4ff0-b389-b7123701e812","data":{"dongle_infos":[]},"tid":"9a90b20f-2f2f-45bd-aa3e-bb69834533fa","timestamp":1749193581033,"gateway":"8UUXN4P00A06NK"} + +{"bid":"59f0ce18-dad6-4777-a6cc-524c826685ed","data":{"firmware_version":"13.01.0002"},"tid":"0f693b80-bf44-4f6b-9c13-a84c05c70199","timestamp":1749193581039,"gateway":"8UUXN4P00A06NK"} + +{"tid":"21c7ee91-b936-4d60-9d52-bd844bde0b10","bid":"743f386e-c60a-4e41-9e69-d7c5facdcb7b","timestamp":1749193581606,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"ed3bb577-0fab-458a-acfd-88cbcf02b41c","data":{"dongle_infos":[]},"tid":"1ff83315-3cf5-4272-9039-669b75d96696","timestamp":1749193582030,"gateway":"8UUXN4P00A06NK"} + +{"bid":"534332da-6c78-469c-a0d7-37a65aa81170","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b436b881-d220-4a09-8657-9642bd9cb280","timestamp":1749193582608,"gateway":"8UUXN4P00A06NK"} + +{"bid":"770f0dea-96a0-46fc-b9e5-069c895761f2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"af65c877-b1ae-425d-b415-fe885849ce6c","timestamp":1749193582609,"gateway":"8UUXN4P00A06NK"} + +{"bid":"291f0884-3d70-4bfd-8c0b-b96e9b04d57c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"dad13a98-9437-43f0-b808-85719c3100e1","timestamp":1749193583006,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cde7601a-a2df-4cf6-86c5-6e7e940259b9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"304c58b7-cd87-4ffc-bf21-ba8a4b2454d8","timestamp":1749193584788,"gateway":"8UUXN4P00A06NK"} + +{"bid":"985e11d3-a288-4528-a9da-39b0c68d867a","data":{"air_transfer_enable":false},"need_reply":1,"tid":"6565e06f-1157-43b9-857a-528b1845e818","timestamp":1749193585223,"gateway":"8UUXN4P00A06NK"} + +{"bid":"702a1855-d794-46ef-b0ba-69ca60e4c34f","data":{"departure_trajectory":[]},"tid":"ce3993d0-18ba-42db-ae4a-402b04ec6a2f","timestamp":1749193586025,"gateway":"8UUXN4P00A06NK"} + +{"bid":"edf2d4fe-3ddb-489c-b121-b2b8fd0e5331","data":{"departure_trajectory":[]},"tid":"f0a15793-f605-475c-9c35-2afa85b5e2a3","timestamp":1749193586438,"gateway":"8UUXN4P00A06NK"} + +{"bid":"534332da-6c78-469c-a0d7-37a65aa81170","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b436b881-d220-4a09-8657-9642bd9cb280","timestamp":1749193586806,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cde7601a-a2df-4cf6-86c5-6e7e940259b9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"304c58b7-cd87-4ffc-bf21-ba8a4b2454d8","timestamp":1749193586806,"gateway":"8UUXN4P00A06NK"} + +{"bid":"291f0884-3d70-4bfd-8c0b-b96e9b04d57c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"dad13a98-9437-43f0-b808-85719c3100e1","timestamp":1749193587205,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4a64c440-8049-4953-a93e-3860f11faabf","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c027f217-8ae2-4adc-b9dc-fc1c1350b01a","timestamp":1749193589793,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4a64c440-8049-4953-a93e-3860f11faabf","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c027f217-8ae2-4adc-b9dc-fc1c1350b01a","timestamp":1749193591811,"gateway":"8UUXN4P00A06NK"} + +{"tid":"f0d3a4fe-62fa-43e5-9b2f-f4331df4c07d","bid":"a3be1f3f-2f25-489b-a4c4-f243f3ef2dc6","timestamp":1749193618211,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"5ecf4ea7-5926-4dad-9907-cfe0c1cbd0fc","bid":"86355013-f027-4bd2-93f1-e5c47368ae3a","timestamp":1749193618215,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"aa7f6996-72d0-406b-9108-df1c978a3cc4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"850373ee-4dec-437e-98ed-419f23855160","timestamp":1749193619941,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ac4df8cb-a045-49e8-a854-724f6ae518ab","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"01dc06aa-de9a-48af-a728-567084daf3eb","timestamp":1749193620168,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e2eaf06-a068-459b-bdf8-838ffa7cab7d","data":{"dongle_infos":[]},"tid":"66b15dfb-52fe-4b7d-84d2-e47562eebf99","timestamp":1749193620208,"gateway":"8UUXN4P00A06NK"} + +{"bid":"02f7f7b0-cd16-4fa5-acb0-1b0b4cdebf08","data":{"firmware_version":"13.01.0002"},"tid":"be7a3626-16e5-4db0-b176-f358c7f35215","timestamp":1749193620214,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d9adc193-eebb-4a32-8e4a-3de7a920f919","data":{"air_transfer_enable":false},"need_reply":1,"tid":"5493e7e3-b02c-4e5e-886e-0c07758e32f5","timestamp":1749193620457,"gateway":"8UUXN4P00A06NK"} + +{"tid":"63714b78-e513-4f92-a1a8-e1a2b618cd20","bid":"fcf98e4e-dda4-4588-8e4d-5475e957259a","timestamp":1749193620533,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"71202110-7e68-491f-8f62-cfb3931ae1fa","data":{"mobility_status_notify":0},"need_reply":1,"tid":"9bc1dd57-8bfe-45a3-af95-e9d847721c94","timestamp":1749193620593,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0484f2f9-2707-4e0b-8ee1-a9e5adf8d8ca","data":{"dongle_infos":[]},"tid":"4978001e-7791-4f62-8233-381c554c637e","timestamp":1749193621241,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aa7f6996-72d0-406b-9108-df1c978a3cc4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"850373ee-4dec-437e-98ed-419f23855160","timestamp":1749193621961,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ac4df8cb-a045-49e8-a854-724f6ae518ab","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"01dc06aa-de9a-48af-a728-567084daf3eb","timestamp":1749193622368,"gateway":"8UUXN4P00A06NK"} + +{"bid":"71202110-7e68-491f-8f62-cfb3931ae1fa","data":{"mobility_status_notify":0},"need_reply":1,"tid":"9bc1dd57-8bfe-45a3-af95-e9d847721c94","timestamp":1749193622767,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5cc5892b-df39-4567-83cc-0bc1785cc177","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"10084fb0-6e88-4e61-8548-6ed5e138c7c6","timestamp":1749193623219,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d51e1fcd-839b-496e-b205-d591a9f878be","data":{"dongle_infos":[]},"tid":"289c9628-1cba-47cd-a321-5a8e21697c74","timestamp":1749193624438,"gateway":"8UUXN4P00A06NK"} + +{"bid":"addd3511-b55b-456a-bea8-955b7683dac2","data":{"departure_trajectory":[]},"tid":"a08693e1-1ba9-4110-8202-5f8286d85aa1","timestamp":1749193624635,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d9adc193-eebb-4a32-8e4a-3de7a920f919","data":{"air_transfer_enable":false},"need_reply":1,"tid":"5493e7e3-b02c-4e5e-886e-0c07758e32f5","timestamp":1749193624659,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8c0234aa-9802-44f3-ac0d-58f60f40859f","data":{"departure_trajectory":[]},"tid":"cc8015f1-edd7-4c7a-8487-56feb323bee4","timestamp":1749193625205,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5cc5892b-df39-4567-83cc-0bc1785cc177","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"10084fb0-6e88-4e61-8548-6ed5e138c7c6","timestamp":1749193625367,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ac4df8cb-a045-49e8-a854-724f6ae518ab","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"01dc06aa-de9a-48af-a728-567084daf3eb","timestamp":1749193626569,"gateway":"8UUXN4P00A06NK"} + +{"bid":"71202110-7e68-491f-8f62-cfb3931ae1fa","data":{"mobility_status_notify":0},"need_reply":1,"tid":"9bc1dd57-8bfe-45a3-af95-e9d847721c94","timestamp":1749193626967,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6377495b-3e57-4924-b7a6-f7ef71a02149","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f33cdbe9-880b-4f0d-8ff1-be1234c36d0d","timestamp":1749193628219,"gateway":"8UUXN4P00A06NK"} + +{"tid":"55eb5754-6e5b-43e7-8002-9995b7f4d8f1","bid":"d8750f67-ed9a-4365-bf6b-88280b94ae3e","timestamp":1749193654398,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"4a457ec3-f969-4143-952d-bb24d2178022","bid":"22aada76-661c-4566-a3af-5dc1bb56c5d9","timestamp":1749193654401,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"576c4371-022b-4c37-999a-42e2f67f461f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"cd6d46a5-826e-45dd-9174-864f4989ce22","timestamp":1749193656064,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9e836cc3-150d-41ee-b25c-b94b20b16c4c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"b3b496c4-97d4-4edb-bdc8-29a5176f97f2","timestamp":1749193658023,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b803b026-7cbd-4f5a-a068-8b75b4716bab","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"887af48d-d89a-4841-9a4b-a1a36ef93871","timestamp":1749193658198,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e83e5e5a-70fe-4c2e-91d2-11dfffd32f1e","data":{"dongle_infos":[]},"tid":"27501598-3407-49e4-8160-b6bc7fc5e3f5","timestamp":1749193658418,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a112687b-e8b7-4e49-b61e-cbc8a66dee04","data":{"firmware_version":"13.01.0002"},"tid":"13a0f37d-eb89-46de-a111-95460c2ae3a4","timestamp":1749193658425,"gateway":"8UUXN4P00A06NK"} + +{"bid":"43c75ca7-6b21-4b29-aeb4-794a13af1b85","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"4e557ca8-25f6-4c56-9c06-f16af65fb1cc","timestamp":1749193658518,"gateway":"8UUXN4P00A06NK"} + +{"bid":"576c4371-022b-4c37-999a-42e2f67f461f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"cd6d46a5-826e-45dd-9174-864f4989ce22","timestamp":1749193658637,"gateway":"8UUXN4P00A06NK"} + +{"bid":"608be930-fa24-41bc-8091-37a1459ea335","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"463d0bb2-6bf1-4bae-923b-3e68ae607f73","timestamp":1749193659401,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fe6348ea-f2b0-4f70-bf0f-75c877e98f90","data":{"dongle_infos":[]},"tid":"31123ff7-08d9-4013-9e7b-43d9819bcd74","timestamp":1749193659449,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c4493747-3482-4773-9933-73dc2f297392","bid":"bfb901be-d148-4259-8197-e457f0267802","timestamp":1749193659749,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"9e836cc3-150d-41ee-b25c-b94b20b16c4c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"b3b496c4-97d4-4edb-bdc8-29a5176f97f2","timestamp":1749193660190,"gateway":"8UUXN4P00A06NK"} + +{"bid":"43c75ca7-6b21-4b29-aeb4-794a13af1b85","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"4e557ca8-25f6-4c56-9c06-f16af65fb1cc","timestamp":1749193660587,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d401615e-39f9-4d1a-96fc-197fd1c7a4e4","bid":"e0fb3658-f75a-4ef2-8b43-7d7a0c8bdc0c","timestamp":1749193685479,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"6a2bc470-b8a3-4d47-b3ad-6f9363b37c5d","bid":"7f8c8017-4a13-4248-ac71-18ef1bc234aa","timestamp":1749193685484,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"64a764ed-0926-4c87-861f-57a243083600","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1b93c6c6-2fd1-4002-8ae4-37fb9b72bb1b","timestamp":1749193686931,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b5a8c385-9aa8-45e2-a983-065128a757cc","data":{"mobility_status_notify":0},"need_reply":1,"tid":"bc263ec4-a705-4310-a3d1-68772821c505","timestamp":1749193688980,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4c4d0945-2699-4cd5-ba70-0a76b895c991","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"200504dc-a118-4666-8133-53f2bac5b2bc","timestamp":1749193689009,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8cd0df3a-d74d-481b-b640-14b57a4d6ccb","data":{"dongle_infos":[]},"tid":"84c50c3b-7cb1-4814-9acf-2133ecd41256","timestamp":1749193689314,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ad8306d3-19f7-4f3b-ad8e-011ccfc68d9a","data":{"firmware_version":"13.01.0002"},"tid":"a89ee75d-72a6-4949-8c53-3e5f7dd4c4d7","timestamp":1749193689323,"gateway":"8UUXN4P00A06NK"} + +{"bid":"64a764ed-0926-4c87-861f-57a243083600","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1b93c6c6-2fd1-4002-8ae4-37fb9b72bb1b","timestamp":1749193689508,"gateway":"8UUXN4P00A06NK"} + +{"tid":"f669c821-f469-435a-9264-acfb5b4eebbe","bid":"983d8f1e-2ffb-4687-be1c-1025081d36a9","timestamp":1749193689866,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"10324e2d-f505-418a-92a1-989ecc06517c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b56a8df9-0338-42e8-b9f2-3f4f4c1cbc84","timestamp":1749193690118,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fe8689f2-b6ae-484d-9d48-b60c25a7a373","data":{"dongle_infos":[]},"tid":"3f081a93-769c-4be7-993e-f72f459e5bfc","timestamp":1749193690363,"gateway":"8UUXN4P00A06NK"} + +{"bid":"def4147f-3d84-44d4-9756-f6b44978f28f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3878f8c7-9166-4ea3-a614-212b9753bc02","timestamp":1749193690480,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b5a8c385-9aa8-45e2-a983-065128a757cc","data":{"mobility_status_notify":0},"need_reply":1,"tid":"bc263ec4-a705-4310-a3d1-68772821c505","timestamp":1749193691125,"gateway":"8UUXN4P00A06NK"} + +{"bid":"10324e2d-f505-418a-92a1-989ecc06517c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b56a8df9-0338-42e8-b9f2-3f4f4c1cbc84","timestamp":1749193692125,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d60efb49-c39c-4ef4-81a1-4613e6b3827e","bid":"f09b05f5-8620-49fd-bac5-54b7074c1aaf","timestamp":1749193718914,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"0d1260e9-5411-44a2-a5fd-e3f898ed4e37","bid":"0abf4fa9-c751-4a57-8987-7174a009cc9e","timestamp":1749193718918,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"bdee1940-b21e-408e-8a4a-ae97b9aa5cd3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"58510614-f122-427b-a1d8-04e9895d0385","timestamp":1749193720836,"gateway":"8UUXN4P00A06NK"} + +{"bid":"98f0749b-9023-4d74-8116-ff4339611856","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"83280b8d-5784-446e-9299-de22ccd079b4","timestamp":1749193720847,"gateway":"8UUXN4P00A06NK"} + +{"tid":"45adad72-b65f-4be7-9373-64439ed1d574","bid":"ec3b6cfa-6a39-4816-9a5c-7248d6efe554","timestamp":1749193720975,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"82b344aa-c36f-42fe-bcab-2b85f1704957","data":{"dongle_infos":[]},"tid":"b50618bc-b6a1-43f1-a57a-5a8c365cacc6","timestamp":1749193721158,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b9119a13-0ead-4daa-904f-6003ad3a1065","data":{"firmware_version":"13.01.0002"},"tid":"838b12e4-e032-41cf-9c39-392357d07580","timestamp":1749193721193,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dd422c8e-f2a0-4918-919d-0f0e9e2be51f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"8d63b7d0-4f63-472c-b680-97b36c2b9585","timestamp":1749193721294,"gateway":"8UUXN4P00A06NK"} + +{"bid":"faeada83-e411-44b8-8cc6-c4927c28773e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"01615a78-05f8-46a9-8dec-8ee60b04b43e","timestamp":1749193721355,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e59e35c8-72ed-46f1-af2d-9398c3bdd20e","data":{"dongle_infos":[]},"tid":"365401ac-be94-4c07-a5cf-be1665b8c82d","timestamp":1749193722196,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bdee1940-b21e-408e-8a4a-ae97b9aa5cd3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"58510614-f122-427b-a1d8-04e9895d0385","timestamp":1749193722972,"gateway":"8UUXN4P00A06NK"} + +{"bid":"98f0749b-9023-4d74-8116-ff4339611856","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"83280b8d-5784-446e-9299-de22ccd079b4","timestamp":1749193722973,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dd422c8e-f2a0-4918-919d-0f0e9e2be51f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"8d63b7d0-4f63-472c-b680-97b36c2b9585","timestamp":1749193723372,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eaf4485c-9aa5-4a63-90f2-9408a58539a3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"888649f2-35d5-487a-9f4c-b9efb5d7fcc5","timestamp":1749193723915,"gateway":"8UUXN4P00A06NK"} + +{"bid":"49591283-6783-4a82-b144-c78f2e9b00cc","data":{"dongle_infos":[]},"tid":"f6271b21-d2f6-4873-a361-6b456951233d","timestamp":1749193725106,"gateway":"8UUXN4P00A06NK"} + +{"bid":"05316082-dd8d-48b1-95ba-cf5a34e493aa","data":{"departure_trajectory":[]},"tid":"ceefbd91-1525-4d52-98b4-1fd4efd0b0fd","timestamp":1749193725505,"gateway":"8UUXN4P00A06NK"} + +{"bid":"faeada83-e411-44b8-8cc6-c4927c28773e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"01615a78-05f8-46a9-8dec-8ee60b04b43e","timestamp":1749193725558,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eaf4485c-9aa5-4a63-90f2-9408a58539a3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"888649f2-35d5-487a-9f4c-b9efb5d7fcc5","timestamp":1749193725971,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0a949b80-505c-4b8a-bf8c-1c4307ae4b4f","data":{"departure_trajectory":[]},"tid":"eff34660-5e80-4585-92fb-dc081a5fd787","timestamp":1749193726152,"gateway":"8UUXN4P00A06NK"} + +{"bid":"98f0749b-9023-4d74-8116-ff4339611856","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"83280b8d-5784-446e-9299-de22ccd079b4","timestamp":1749193727171,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dd422c8e-f2a0-4918-919d-0f0e9e2be51f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"8d63b7d0-4f63-472c-b680-97b36c2b9585","timestamp":1749193727571,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a9e2c7d8-bea6-4448-b99f-e5876700ffe3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8d903407-853b-4170-be0c-edbc83ec9110","timestamp":1749193728912,"gateway":"8UUXN4P00A06NK"} + +{"tid":"88ef5192-c015-4e0f-9098-2ee0b10fea1f","bid":"37d3e97a-909d-4e14-a6b6-7b124ed6bd88","timestamp":1749193754748,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"2a22a8ad-7685-46ca-96e0-2a45c0e7892f","bid":"f79faae5-9ccd-477e-89b2-bc91fe549a9f","timestamp":1749193754752,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"af9ed95f-7e37-4526-99a9-5391163b191a","bid":"339c1e23-1219-4bce-b962-f31f30f3db0d","timestamp":1749193754757,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"8fc52a45-3146-42a0-b999-bcde78b24e8d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2e3a6679-1cef-45d6-a26f-ae0ec3f0722c","timestamp":1749193756906,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e83d744d-0606-4f6c-a0a4-a4c4008d10e6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a4ba492e-5ca4-45f3-b567-ca907b40f4f2","timestamp":1749193758935,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d01c144a-a766-4588-a29a-f45abf03adc9","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"87ea1cec-6439-4fdc-b333-3b7be0e9702b","timestamp":1749193759259,"gateway":"8UUXN4P00A06NK"} + +{"bid":"03916fff-3260-42ab-a02f-e623f0ba9aa9","data":{"dongle_infos":[]},"tid":"1ff79df6-c414-4d26-b7cf-ecd469c20a42","timestamp":1749193759324,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e1d41ede-418c-42ac-a6a8-72f81cd4cb13","data":{"firmware_version":"13.01.0002"},"tid":"44d06809-2ef3-4182-a577-decc18647913","timestamp":1749193759340,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8fc52a45-3146-42a0-b999-bcde78b24e8d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2e3a6679-1cef-45d6-a26f-ae0ec3f0722c","timestamp":1749193759514,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fb36300f-e18e-4690-8392-2ade01f42e30","data":{"mobility_status_notify":0},"need_reply":1,"tid":"f74a905b-0d2c-4b74-af62-5a2efb5e0829","timestamp":1749193759685,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9ceca4fa-f0a3-4991-a9ef-660a8313a493","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8d8d8067-a2af-4519-b389-5f027754ebdf","timestamp":1749193759746,"gateway":"8UUXN4P00A06NK"} + +{"tid":"dd761f53-e61a-47a3-bbc5-24dc13945fc3","bid":"1c3646df-18f3-42e8-9c09-c3fa4032cd8d","timestamp":1749193760286,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"d0faf578-3143-4733-b111-700f178bc6e0","data":{"dongle_infos":[]},"tid":"460de9fe-bc95-4cf9-817c-0698d122815f","timestamp":1749193760391,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d01c144a-a766-4588-a29a-f45abf03adc9","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"87ea1cec-6439-4fdc-b333-3b7be0e9702b","timestamp":1749193761285,"gateway":"8UUXN4P00A06NK"} + +{"tid":"59573803-1665-4357-91ca-f73264566dbe","bid":"0f4f7834-3cc9-4b7a-8b06-9a339636efd9","timestamp":1749193787413,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"6f33b2fe-fce9-4af8-88e0-f48cbc67a069","bid":"9ca4586e-e6c8-4b2d-8496-ff25d1845d3d","timestamp":1749193787418,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"55f6dc40-fd6c-459b-bf8b-c035fc54df14","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5587723a-989a-45f9-8c20-5d7b2fcb9a84","timestamp":1749193788709,"gateway":"8UUXN4P00A06NK"} + +{"bid":"01715e2e-cfd8-41eb-89c4-9a0c756749b7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ca0d632f-77af-472e-bc1e-2a318130f04b","timestamp":1749193788726,"gateway":"8UUXN4P00A06NK"} + +{"bid":"abe8e24c-9188-4455-afba-f37ad2e9c353","data":{"air_transfer_enable":false},"need_reply":1,"tid":"f4b4b5ec-c0ff-44b8-a727-48aeeb8480b5","timestamp":1749193789150,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0527f265-390b-4bcd-85f3-8c52bafc79fe","data":{"dongle_infos":[]},"tid":"70f08004-1abf-4d1a-8fd7-0995ffc119eb","timestamp":1749193789158,"gateway":"8UUXN4P00A06NK"} + +{"bid":"30404ce8-fc1e-4eb0-95b9-44ef220dd9ee","data":{"firmware_version":"13.01.0002"},"tid":"81c43936-58b8-4e5d-b0e2-cf3712347c2c","timestamp":1749193789166,"gateway":"8UUXN4P00A06NK"} + +{"bid":"83f970e1-97e0-41bd-bb20-9e27f34db235","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"608ca9b9-cd18-44bb-8d8f-b354a55d1871","timestamp":1749193789269,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c41ff7f8-b6cd-4a78-b044-44154473c58b","bid":"48e0fbfe-2aab-4576-81b4-67633c6d7797","timestamp":1749193789471,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"91e10b5d-5417-41f6-83ab-c4e31e18189d","data":{"dongle_infos":[]},"tid":"d1e98729-0fb1-49aa-92b7-68943f3e50e6","timestamp":1749193790154,"gateway":"8UUXN4P00A06NK"} + +{"bid":"55f6dc40-fd6c-459b-bf8b-c035fc54df14","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5587723a-989a-45f9-8c20-5d7b2fcb9a84","timestamp":1749193790836,"gateway":"8UUXN4P00A06NK"} + +{"bid":"01715e2e-cfd8-41eb-89c4-9a0c756749b7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ca0d632f-77af-472e-bc1e-2a318130f04b","timestamp":1749193790838,"gateway":"8UUXN4P00A06NK"} + +{"bid":"83f970e1-97e0-41bd-bb20-9e27f34db235","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"608ca9b9-cd18-44bb-8d8f-b354a55d1871","timestamp":1749193791441,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6f65670f-fadb-4ead-9ca1-5907c26eb202","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7dbbcf14-05ec-4047-ab61-3adf3b6e61f3","timestamp":1749193792419,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0b2947c3-3346-484f-8484-8102650f9428","data":{"dongle_infos":[]},"tid":"4efb4014-b6a0-47e5-957a-7ae64d7297e5","timestamp":1749193792550,"gateway":"8UUXN4P00A06NK"} + +{"bid":"abe8e24c-9188-4455-afba-f37ad2e9c353","data":{"air_transfer_enable":false},"need_reply":1,"tid":"f4b4b5ec-c0ff-44b8-a727-48aeeb8480b5","timestamp":1749193793346,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3999db55-6c5d-445c-a58a-5907e4d9c1c5","data":{"departure_trajectory":[]},"tid":"316a520f-dc21-4fc9-a089-42740b714297","timestamp":1749193794016,"gateway":"8UUXN4P00A06NK"} + +{"bid":"db3f307b-62a0-4f2c-a24a-6dd3e3e262c1","data":{"departure_trajectory":[]},"tid":"4428242a-c0df-4c47-b4a3-b2e11d26863b","timestamp":1749193794144,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6f65670f-fadb-4ead-9ca1-5907c26eb202","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7dbbcf14-05ec-4047-ab61-3adf3b6e61f3","timestamp":1749193794439,"gateway":"8UUXN4P00A06NK"} + +{"bid":"55f6dc40-fd6c-459b-bf8b-c035fc54df14","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5587723a-989a-45f9-8c20-5d7b2fcb9a84","timestamp":1749193795034,"gateway":"8UUXN4P00A06NK"} + +{"bid":"83f970e1-97e0-41bd-bb20-9e27f34db235","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"608ca9b9-cd18-44bb-8d8f-b354a55d1871","timestamp":1749193795638,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8dd4e11d-209e-45c1-86bd-89a8ebf5f084","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cd50e3aa-b99c-4187-a7e2-c24ff27de359","timestamp":1749193797424,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8dd4e11d-209e-45c1-86bd-89a8ebf5f084","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"cd50e3aa-b99c-4187-a7e2-c24ff27de359","timestamp":1749193799434,"gateway":"8UUXN4P00A06NK"} + +{"tid":"19fb281c-9cca-45ed-968b-e20b6530646c","bid":"e86f2b0f-ef1c-4a05-b967-786218cd864b","timestamp":1749193823421,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"9b46a318-0c13-4e70-af2a-61ab179f11fe","bid":"a3f8d318-4c3f-463b-a853-803fec7625e9","timestamp":1749193823423,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"3906bc17-a083-40db-95ce-9d2ed58efcd4","bid":"3e06c018-b332-430b-adcc-df4881adcb0e","timestamp":1749193823637,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"8ae477fd-d286-4913-a6ea-bf542b2bb73b","bid":"f7955058-12b5-4db1-954f-c5bae380cbb8","timestamp":1749193823652,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"8c4a916b-d5d6-4bee-baa7-e4a483017878","data":{"air_transfer_enable":false},"need_reply":1,"tid":"f53b78bd-fdda-40f1-b0bd-ce12764b9981","timestamp":1749193826253,"gateway":"8UUXN4P00A06NK"} + +{"bid":"210740aa-0303-4071-bd6a-ff6cfd8ed313","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1ec77854-263a-406a-9cdd-fc15a9c67d5f","timestamp":1749193828205,"gateway":"8UUXN4P00A06NK"} + +{"bid":"53e2bcd5-ed38-4cf1-98a6-a860fc9df703","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d4a25691-6b67-4c09-bfd3-c7e280081dc2","timestamp":1749193828389,"gateway":"8UUXN4P00A06NK"} + +{"bid":"071e6410-620e-4dcc-b075-3da3746a77b8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5f0514bf-14ba-4cf9-a113-91e08e384567","timestamp":1749193828427,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a30b0c11-60be-458b-865b-6ad2da312742","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5fc30edf-2f56-4013-85e4-1d884759128f","timestamp":1749193828643,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d7626ad4-c22f-4995-ac49-757d2c89ceb8","data":{"dongle_infos":[]},"tid":"2c5280ac-2370-41c8-958a-da31707fc30c","timestamp":1749193828678,"gateway":"8UUXN4P00A06NK"} + +{"bid":"68ad6b24-3531-4cf1-a3ec-2a43e1b8914f","data":{"firmware_version":"13.01.0002"},"tid":"76fa791a-0fef-4619-b374-b3c87f58a95a","timestamp":1749193828686,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a01d47a1-c9dc-49b4-9b67-9bcbbb285f67","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"96609de6-9f40-409b-aacc-2f62f6219f13","timestamp":1749193828722,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8c4a916b-d5d6-4bee-baa7-e4a483017878","data":{"air_transfer_enable":false},"need_reply":1,"tid":"f53b78bd-fdda-40f1-b0bd-ce12764b9981","timestamp":1749193828872,"gateway":"8UUXN4P00A06NK"} + +{"tid":"aea4cdee-58ad-464d-b947-ea4a4dae980f","bid":"1dc23626-c516-4461-b6d4-96ad00165e5d","timestamp":1749193829171,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"5d58c939-ff9d-441f-b2cb-cfcad9a1b1ff","data":{"dongle_infos":[]},"tid":"0704482b-7533-4d32-b07b-5b31dd363846","timestamp":1749193829690,"gateway":"8UUXN4P00A06NK"} + +{"bid":"210740aa-0303-4071-bd6a-ff6cfd8ed313","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1ec77854-263a-406a-9cdd-fc15a9c67d5f","timestamp":1749193830339,"gateway":"8UUXN4P00A06NK"} + +{"tid":"05fa3fb7-23a1-4be9-aa57-d7c970b2ffca","bid":"776c3283-8f74-447e-a879-8d4bbd71b916","timestamp":1749193856420,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"e3118f2a-46cf-4a66-b632-149823e81495","bid":"68f779e2-e46e-4941-893e-40f1e4889bf6","timestamp":1749193856426,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e5cbc4b-6b23-4f3f-bad3-984a6d4da4b7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"da8ae661-1b0b-4b20-a552-71cf6d53ae49","timestamp":1749193856885,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8969ce7e-097d-4567-a984-e5236945c52a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1c0b1234-15ba-450b-a5f0-4e247a6af90c","timestamp":1749193856892,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6f7939f4-0b99-4b21-9e0f-de231de8c5b1","data":{"dongle_infos":[]},"tid":"5cfa59d7-5c46-43d7-8c8c-4982deba1ad2","timestamp":1749193857296,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8e8e097b-a5a5-46fc-8a32-fa4bf23208e3","data":{"mobility_status_notify":0},"need_reply":1,"tid":"b6b50ad2-5336-4a60-9310-a8052ee2f0d8","timestamp":1749193857301,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3f6bc8f8-cafa-4f8c-b1af-f04efb4f4dd4","data":{"firmware_version":"13.01.0002"},"tid":"ff1bc5ec-8c10-42b8-ab6a-096d2437faf4","timestamp":1749193857308,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df5ff4b0-7473-42ba-b653-6e51f9d07aed","data":{"air_transfer_enable":false},"need_reply":1,"tid":"4eaa962b-077d-4df7-9113-ceee82afee0b","timestamp":1749193857322,"gateway":"8UUXN4P00A06NK"} + +{"tid":"318bcce5-0355-4365-b962-b285a6de9ead","bid":"3fe0422b-cc9e-410e-b26e-a998c8161147","timestamp":1749193858181,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"9f4a92d5-d943-44f8-acef-32ed1e6b479f","data":{"dongle_infos":[]},"tid":"728ac412-4132-4eda-b0f8-05a655cd2516","timestamp":1749193858312,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e5cbc4b-6b23-4f3f-bad3-984a6d4da4b7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"da8ae661-1b0b-4b20-a552-71cf6d53ae49","timestamp":1749193858969,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8969ce7e-097d-4567-a984-e5236945c52a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1c0b1234-15ba-450b-a5f0-4e247a6af90c","timestamp":1749193858970,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8e8e097b-a5a5-46fc-8a32-fa4bf23208e3","data":{"mobility_status_notify":0},"need_reply":1,"tid":"b6b50ad2-5336-4a60-9310-a8052ee2f0d8","timestamp":1749193859369,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a7f2aaed-ca31-42a0-a889-e72c3cdedd1b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6e5ecec0-5cdd-4c86-be55-42ba011a9c5f","timestamp":1749193861419,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df5ff4b0-7473-42ba-b653-6e51f9d07aed","data":{"air_transfer_enable":false},"need_reply":1,"tid":"4eaa962b-077d-4df7-9113-ceee82afee0b","timestamp":1749193861517,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3c08a506-faa6-4d4c-9ef3-b7eb0037b757","data":{"dongle_infos":[]},"tid":"1ff4b2e8-1dcd-45ac-967a-acf33d193272","timestamp":1749193861959,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4033f1ad-d69f-4864-b74a-704ac86a6358","data":{"departure_trajectory":[]},"tid":"1fb0cb8e-353a-4797-8a2d-b7870f1d4947","timestamp":1749193862288,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8969ce7e-097d-4567-a984-e5236945c52a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1c0b1234-15ba-450b-a5f0-4e247a6af90c","timestamp":1749193863166,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3e85f8f9-7f3f-4df6-a998-59458894b889","data":{"departure_trajectory":[]},"tid":"42785828-91f9-49e3-8e71-86ba84596bc2","timestamp":1749193863258,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8e8e097b-a5a5-46fc-8a32-fa4bf23208e3","data":{"mobility_status_notify":0},"need_reply":1,"tid":"b6b50ad2-5336-4a60-9310-a8052ee2f0d8","timestamp":1749193863570,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a7f2aaed-ca31-42a0-a889-e72c3cdedd1b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6e5ecec0-5cdd-4c86-be55-42ba011a9c5f","timestamp":1749193863571,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7dde6d4a-2a45-4f42-8a7a-1cd4ac526c9e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"162ec81e-c10b-4e93-bf2e-eb1db3953b3a","timestamp":1749193866418,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7dde6d4a-2a45-4f42-8a7a-1cd4ac526c9e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"162ec81e-c10b-4e93-bf2e-eb1db3953b3a","timestamp":1749193868567,"gateway":"8UUXN4P00A06NK"} + +{"tid":"754b8e9c-e69b-4bf7-9c7b-f3f6674695da","bid":"2fd48fad-a4a1-4986-82b0-e012aeacbd07","timestamp":1749193895541,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"3612113b-b512-4a2c-9f20-27fc3793f4d5","bid":"8e90a47a-d53d-42d2-acd7-6c3744276052","timestamp":1749193895544,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"e8d4c631-16db-48da-bb71-04a35895731d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4d2d59b9-e372-4382-9ee8-cd377e79c5a0","timestamp":1749193897113,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df0cb19a-193f-4d75-be3f-4609af88c066","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"9eda82b3-07e6-4214-ab17-7cba575a7e75","timestamp":1749193897168,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7b00b3a0-de06-449a-9ca9-851f5fa8c7a4","data":{"dongle_infos":[]},"tid":"e0c63997-7e22-4ffc-882f-2960af9521b6","timestamp":1749193897183,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a6eb1e03-4a9a-4ab4-ae2d-e4145f9f8c62","data":{"firmware_version":"13.01.0002"},"tid":"7bc80b92-96f8-46de-8c71-a37dfef26de1","timestamp":1749193897191,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b7f7526b-e8b3-4848-89e2-6d95bf3627d6","data":{"air_transfer_enable":false},"need_reply":1,"tid":"b408ac6d-8114-4bea-b129-69de395074de","timestamp":1749193897378,"gateway":"8UUXN4P00A06NK"} + +{"tid":"a9fb3916-7344-4892-82c2-a87d58cdf500","bid":"7a040d71-f419-4e16-a31c-679580649d03","timestamp":1749193897443,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"c9be3124-eb0f-44eb-950d-ea08241d0aed","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1bb9e5b7-93cd-4820-8a7b-00a155c37b08","timestamp":1749193897596,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6572df71-2a1c-4176-8c3c-b36841a9b79f","data":{"dongle_infos":[]},"tid":"c3347971-ca7a-4182-9c23-83eba6d7c55c","timestamp":1749193898221,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e8d4c631-16db-48da-bb71-04a35895731d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4d2d59b9-e372-4382-9ee8-cd377e79c5a0","timestamp":1749193899206,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df0cb19a-193f-4d75-be3f-4609af88c066","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"9eda82b3-07e6-4214-ab17-7cba575a7e75","timestamp":1749193899207,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c9be3124-eb0f-44eb-950d-ea08241d0aed","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1bb9e5b7-93cd-4820-8a7b-00a155c37b08","timestamp":1749193899604,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5a0b7f65-f907-41a9-99ba-ce0c15a4b37e","data":{"dongle_infos":[]},"tid":"c4adace0-671a-450d-a5b0-36f980397895","timestamp":1749193900520,"gateway":"8UUXN4P00A06NK"} + +{"bid":"214b718e-56b5-4482-bbcc-5672b2ae5134","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"aa0226ad-3ba5-4e90-9edf-e44c22c90a43","timestamp":1749193900547,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b7f7526b-e8b3-4848-89e2-6d95bf3627d6","data":{"air_transfer_enable":false},"need_reply":1,"tid":"b408ac6d-8114-4bea-b129-69de395074de","timestamp":1749193901577,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7520f0e8-abbb-4767-bc50-3b891a6e0cf7","data":{"departure_trajectory":[]},"tid":"a432e203-9948-4c67-8c67-ac92f0c583bd","timestamp":1749193902145,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f5ccccf5-42fb-4ac7-94ad-d1c4c65e25f2","data":{"departure_trajectory":[]},"tid":"d8591094-5b46-47b0-a2f2-d6ae12e78fa9","timestamp":1749193902177,"gateway":"8UUXN4P00A06NK"} + +{"bid":"214b718e-56b5-4482-bbcc-5672b2ae5134","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"aa0226ad-3ba5-4e90-9edf-e44c22c90a43","timestamp":1749193902606,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df0cb19a-193f-4d75-be3f-4609af88c066","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"9eda82b3-07e6-4214-ab17-7cba575a7e75","timestamp":1749193903405,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c9be3124-eb0f-44eb-950d-ea08241d0aed","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1bb9e5b7-93cd-4820-8a7b-00a155c37b08","timestamp":1749193903804,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b7a2ecec-f3b6-4d20-a2c1-74d1c335e797","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"70b14ab5-c62e-42c1-8605-3e5c24778e7a","timestamp":1749193905550,"gateway":"8UUXN4P00A06NK"} + +{"tid":"684c479c-1a11-44f3-a51c-70b0da27eb4e","bid":"ba45574e-e619-41df-8c91-69726ed9c503","timestamp":1749193933992,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"9806d36a-1c89-4cdb-a7b7-454ef0c30e92","bid":"1e62f3ea-7974-4d1d-b808-48725829e13c","timestamp":1749193933997,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"4d34506e-0cda-432d-b996-5d5c21151df7","data":{"air_transfer_enable":false},"need_reply":1,"tid":"01ba1960-d920-4962-bedd-c5908f26afe2","timestamp":1749193934323,"gateway":"8UUXN4P00A06NK"} + +{"bid":"47a66459-6c95-4fca-8c8d-b75a6c422f80","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"391116f6-7f2b-43ec-bbb2-9aeb648c9c36","timestamp":1749193936494,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dd309b02-f4e0-4ae8-a252-015cda697088","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"61fc275f-8cf5-45e1-9f39-276e23cc0ddd","timestamp":1749193936522,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1a6370dd-9ea9-4f83-9fb7-a68281d90ce1","data":{"dongle_infos":[]},"tid":"90fbcd6a-1ee6-4a0c-b9e3-c0c35c311912","timestamp":1749193936697,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9f4c456b-c092-473f-b852-a046fa5fdf83","data":{"firmware_version":"13.01.0002"},"tid":"870aaa73-010e-4ecb-be9c-702bc22f8be8","timestamp":1749193936703,"gateway":"8UUXN4P00A06NK"} + +{"tid":"2b0911b0-5e91-4c1b-99e1-09347642e262","bid":"3543fb70-85de-42f2-8484-1e2802b41fe6","timestamp":1749193936779,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"4d34506e-0cda-432d-b996-5d5c21151df7","data":{"air_transfer_enable":false},"need_reply":1,"tid":"01ba1960-d920-4962-bedd-c5908f26afe2","timestamp":1749193936891,"gateway":"8UUXN4P00A06NK"} + +{"bid":"04826490-fc6c-4507-9338-abccb4724f6a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ef7435f3-b691-4f95-bb79-c30adbc3ba3f","timestamp":1749193936969,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d7603a2a-fe06-42c2-9769-6bb2886ccce4","data":{"dongle_infos":[]},"tid":"4fd6e674-f330-48a0-a0bc-85914e1f492c","timestamp":1749193937722,"gateway":"8UUXN4P00A06NK"} + +{"bid":"47a66459-6c95-4fca-8c8d-b75a6c422f80","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"391116f6-7f2b-43ec-bbb2-9aeb648c9c36","timestamp":1749193938607,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dd309b02-f4e0-4ae8-a252-015cda697088","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"61fc275f-8cf5-45e1-9f39-276e23cc0ddd","timestamp":1749193938609,"gateway":"8UUXN4P00A06NK"} + +{"bid":"854901d2-8d58-40bd-9a50-7f57a79495bd","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"10767560-c0c4-4ec3-82b8-4288b89b02da","timestamp":1749193938991,"gateway":"8UUXN4P00A06NK"} + +{"bid":"04826490-fc6c-4507-9338-abccb4724f6a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ef7435f3-b691-4f95-bb79-c30adbc3ba3f","timestamp":1749193939006,"gateway":"8UUXN4P00A06NK"} + +{"bid":"804e3598-3e68-4a50-8226-3dc52b61f7da","data":{"dongle_infos":[]},"tid":"b0cdda78-8b64-4f65-9d48-01f271f0fe58","timestamp":1749193939922,"gateway":"8UUXN4P00A06NK"} + +{"bid":"854901d2-8d58-40bd-9a50-7f57a79495bd","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"10767560-c0c4-4ec3-82b8-4288b89b02da","timestamp":1749193941007,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4d34506e-0cda-432d-b996-5d5c21151df7","data":{"air_transfer_enable":false},"need_reply":1,"tid":"01ba1960-d920-4962-bedd-c5908f26afe2","timestamp":1749193941091,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7867c00a-9302-4e00-a2b0-7356eb56c12a","data":{"departure_trajectory":[]},"tid":"ba8b1fc1-9288-4a4b-b659-8f1a3e225640","timestamp":1749193941122,"gateway":"8UUXN4P00A06NK"} + +{"bid":"294fd008-ce4f-4925-8937-8f9da7844097","data":{"departure_trajectory":[]},"tid":"4bd0bc2f-55bd-489a-8d56-093fa3039048","timestamp":1749193941691,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dd309b02-f4e0-4ae8-a252-015cda697088","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"61fc275f-8cf5-45e1-9f39-276e23cc0ddd","timestamp":1749193942807,"gateway":"8UUXN4P00A06NK"} + +{"bid":"04826490-fc6c-4507-9338-abccb4724f6a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ef7435f3-b691-4f95-bb79-c30adbc3ba3f","timestamp":1749193943207,"gateway":"8UUXN4P00A06NK"} + +{"bid":"77acbcc7-3764-4bfd-8364-aae4267dc247","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2c91bc9c-2271-48d3-8020-29bafa313d5b","timestamp":1749193943991,"gateway":"8UUXN4P00A06NK"} + +{"tid":"2f5dabc7-93fb-4c96-8f94-2f6a530f46d7","bid":"fbef2e7c-d382-4e6a-b8af-aea85e39eb74","timestamp":1749193972124,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"5e78bc62-1102-410f-955f-ccf5d3435a02","bid":"8227ea52-eebf-4dca-930a-8e3ee1052488","timestamp":1749193972127,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"6e5f215a-5794-4c51-b09c-dee7dea72fc1","data":{"mobility_status_notify":0},"need_reply":1,"tid":"53f2d5cf-e267-4675-bb03-5e2f8b6c5c23","timestamp":1749193972924,"gateway":"8UUXN4P00A06NK"} + +{"bid":"72280624-1358-49e0-a251-35ae86e5a45a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"884f475e-c2d6-48f3-94a8-b7da64a780d3","timestamp":1749193973110,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1341aa4b-28cb-4522-856d-ea53818575a6","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2996bbf8-a24f-404f-bdca-3cad27bf82f8","timestamp":1749193973424,"gateway":"8UUXN4P00A06NK"} + +{"bid":"57f2dc71-b7b9-455a-82ad-9200de13a2d0","data":{"dongle_infos":[]},"tid":"42317ad9-9fb3-4b23-8b92-fce773e6766e","timestamp":1749193973430,"gateway":"8UUXN4P00A06NK"} + +{"bid":"922619db-2480-4374-a01d-ea7613014957","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6aafa0a4-95e1-491f-b737-e6b5781f09a0","timestamp":1749193973437,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bfcbf0a4-3621-41c9-9405-32f470bc7de6","data":{"firmware_version":"13.01.0002"},"tid":"7a4b9d69-c06a-41af-996d-84b794ee48ef","timestamp":1749193973446,"gateway":"8UUXN4P00A06NK"} + +{"tid":"a0a6b9b6-76bf-4d19-b827-ae2a9393deed","bid":"1a153aab-19d3-401b-b9bc-c7cf5c6411bb","timestamp":1749193973643,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"109a6884-b032-479f-8979-04b43a1ba031","data":{"dongle_infos":[]},"tid":"bc6e7a18-8529-42da-9f97-ce56a0994946","timestamp":1749193974433,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6e5f215a-5794-4c51-b09c-dee7dea72fc1","data":{"mobility_status_notify":0},"need_reply":1,"tid":"53f2d5cf-e267-4675-bb03-5e2f8b6c5c23","timestamp":1749193975074,"gateway":"8UUXN4P00A06NK"} + +{"bid":"72280624-1358-49e0-a251-35ae86e5a45a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"884f475e-c2d6-48f3-94a8-b7da64a780d3","timestamp":1749193975275,"gateway":"8UUXN4P00A06NK"} + +{"bid":"922619db-2480-4374-a01d-ea7613014957","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6aafa0a4-95e1-491f-b737-e6b5781f09a0","timestamp":1749193975472,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d52b5f64-f20b-4e09-9a9b-96b5d2f21f90","data":{"dongle_infos":[]},"tid":"a22e2910-2ded-4376-8e2a-08641830dff8","timestamp":1749193976585,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b479056d-75c6-43e7-b725-3a0c5659907f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1958b4d7-9595-436f-88e8-a390004d66cb","timestamp":1749193977128,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1341aa4b-28cb-4522-856d-ea53818575a6","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2996bbf8-a24f-404f-bdca-3cad27bf82f8","timestamp":1749193977628,"gateway":"8UUXN4P00A06NK"} + +{"bid":"68c10ee1-8524-4349-9462-eabf3d904731","data":{"departure_trajectory":[]},"tid":"1f2c38fd-cfc2-4cbd-aef6-ba0f3a2b1058","timestamp":1749193978424,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4db3e950-7541-4b35-9746-ed73bd380475","data":{"departure_trajectory":[]},"tid":"4e3ce05a-8b86-48bf-8ab5-9f4232583054","timestamp":1749193978767,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6e5f215a-5794-4c51-b09c-dee7dea72fc1","data":{"mobility_status_notify":0},"need_reply":1,"tid":"53f2d5cf-e267-4675-bb03-5e2f8b6c5c23","timestamp":1749193979272,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b479056d-75c6-43e7-b725-3a0c5659907f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1958b4d7-9595-436f-88e8-a390004d66cb","timestamp":1749193979273,"gateway":"8UUXN4P00A06NK"} + +{"bid":"922619db-2480-4374-a01d-ea7613014957","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6aafa0a4-95e1-491f-b737-e6b5781f09a0","timestamp":1749193979673,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2333f720-11b5-444a-b788-b3778d86aecb","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3566e7c3-02a3-4c64-b812-c2772e340d72","timestamp":1749193982125,"gateway":"8UUXN4P00A06NK"} + +{"tid":"72607b0f-6204-4f44-92a3-e8ba2687f141","bid":"48d8e9d8-8a8d-4df0-9037-e19cce1de113","timestamp":1749194011378,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"29d108a1-6815-495e-b457-af5d1784787c","bid":"3addcbbc-c545-4c3c-9dce-6ae5716f409d","timestamp":1749194011381,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"400210b3-3377-49db-a829-61d23ad6e4bd","data":{"mobility_status_notify":0},"need_reply":1,"tid":"2227f380-9c03-447d-a73a-36a13f520c5c","timestamp":1749194012190,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1f1bfdec-aba6-4209-bf68-d565c42cf3de","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9ed47275-0798-44fe-892e-9f040019639d","timestamp":1749194012463,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a8732064-f40c-45d5-bfa4-471235cd1d50","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7d8f3c4c-9d67-4ade-93b7-16472294e2fe","timestamp":1749194012619,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4fd6f00c-1a2e-451f-be0f-d2b9f9973763","data":{"dongle_infos":[]},"tid":"f957054f-f8fe-4745-a992-46e437e12123","timestamp":1749194012626,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a8a5a8f3-39cc-47f5-8158-8b605eeb6982","data":{"firmware_version":"13.01.0002"},"tid":"49ca0a6f-5893-4770-b5a9-989710f0d4eb","timestamp":1749194012634,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3909aa21-d892-4150-96aa-c22105e2bfbf","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"fa4145d2-8828-418c-bf61-4a292304230f","timestamp":1749194012744,"gateway":"8UUXN4P00A06NK"} + +{"tid":"6f59723c-ddfb-4587-acb5-3ab557d5d566","bid":"8403cb08-ce69-4565-8f10-27ad79deb07e","timestamp":1749194012911,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"bed78f9a-5409-4cb8-8c78-7d3df0040024","data":{"dongle_infos":[]},"tid":"1820ae44-eb8e-45f7-808c-06bc8f5d1acc","timestamp":1749194013636,"gateway":"8UUXN4P00A06NK"} + +{"bid":"400210b3-3377-49db-a829-61d23ad6e4bd","data":{"mobility_status_notify":0},"need_reply":1,"tid":"2227f380-9c03-447d-a73a-36a13f520c5c","timestamp":1749194014287,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1f1bfdec-aba6-4209-bf68-d565c42cf3de","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9ed47275-0798-44fe-892e-9f040019639d","timestamp":1749194014486,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3909aa21-d892-4150-96aa-c22105e2bfbf","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"fa4145d2-8828-418c-bf61-4a292304230f","timestamp":1749194014882,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5d72c4a2-7f43-443c-991e-ed2ee7635988","data":{"dongle_infos":[]},"tid":"2384dda1-a1ba-4e84-84bc-9258243dec74","timestamp":1749194016115,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5d9888f2-4242-4931-b4f3-433fabd892ba","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4a4d336c-5351-4632-b3aa-19c3ee670ef3","timestamp":1749194016376,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a8732064-f40c-45d5-bfa4-471235cd1d50","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7d8f3c4c-9d67-4ade-93b7-16472294e2fe","timestamp":1749194016824,"gateway":"8UUXN4P00A06NK"} + +{"bid":"718a8df4-5fed-4857-8bb7-bf62f4b78076","data":{"departure_trajectory":[]},"tid":"ce649317-f8c9-40bf-8ef6-d0ba29870205","timestamp":1749194017627,"gateway":"8UUXN4P00A06NK"} + +{"bid":"166d0143-b26d-429b-8735-3c864f74f3b8","data":{"departure_trajectory":[]},"tid":"92163d0e-a11a-4e09-aa38-5be1149ba0a4","timestamp":1749194017964,"gateway":"8UUXN4P00A06NK"} + +{"bid":"400210b3-3377-49db-a829-61d23ad6e4bd","data":{"mobility_status_notify":0},"need_reply":1,"tid":"2227f380-9c03-447d-a73a-36a13f520c5c","timestamp":1749194018487,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5d9888f2-4242-4931-b4f3-433fabd892ba","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4a4d336c-5351-4632-b3aa-19c3ee670ef3","timestamp":1749194018488,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3909aa21-d892-4150-96aa-c22105e2bfbf","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"fa4145d2-8828-418c-bf61-4a292304230f","timestamp":1749194019084,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d8b91739-d688-4b03-b289-d56cda0503bf","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f6ce2e83-29a2-4f5c-95f7-ec449db93a0d","timestamp":1749194021382,"gateway":"8UUXN4P00A06NK"} + +{"tid":"328b95e0-760e-4d27-8e9c-4ee895d3afc5","bid":"08aba2be-1a68-480a-bf4d-d3843200f235","timestamp":1749194050102,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"dc89a29f-36d1-4799-a7e1-a8ce12b792ea","bid":"539ee449-42de-453a-adc5-75d8e927fbeb","timestamp":1749194050106,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"d2a0b73e-74ac-4c61-a086-611305c760d4","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a3f27203-b467-4c83-a27e-fd17f0c4fa7e","timestamp":1749194051408,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f2dbf07e-6916-44c7-9811-26c4a37f8d6f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"dfde3d03-1233-41b7-b607-a0b0aa100301","timestamp":1749194051588,"gateway":"8UUXN4P00A06NK"} + +{"bid":"94d8720b-66a7-4f1e-9494-16994e3a8695","data":{"air_transfer_enable":false},"need_reply":1,"tid":"42962f6c-788f-4a69-a48c-cf11d12ba37e","timestamp":1749194051862,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fcc774c2-e81c-45ce-862d-dd8533348c33","data":{"dongle_infos":[]},"tid":"f949c6fa-4f5a-474b-b08e-36520a722e5a","timestamp":1749194051870,"gateway":"8UUXN4P00A06NK"} + +{"bid":"179f2ae3-7f1f-4a85-b27e-c30e036dd5b1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c362c2f1-3085-4ab0-ba44-de07c7a6b17b","timestamp":1749194051875,"gateway":"8UUXN4P00A06NK"} + +{"bid":"315e9fe2-1590-45bd-9e11-b10aca329df6","data":{"firmware_version":"13.01.0002"},"tid":"7acf2286-bcb7-468c-97ae-1ff1efc1abb6","timestamp":1749194051884,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d8f67165-ef0a-418a-ba69-de2827ca3fa0","bid":"69cf85ed-bc1c-4f8e-82a7-eace095cce56","timestamp":1749194052131,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"72c3b926-d892-47ac-a7d6-f7541fba7236","data":{"dongle_infos":[]},"tid":"dc041886-3f00-4248-bf64-cdfd6e30c515","timestamp":1749194052867,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d2a0b73e-74ac-4c61-a086-611305c760d4","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a3f27203-b467-4c83-a27e-fd17f0c4fa7e","timestamp":1749194053535,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f2dbf07e-6916-44c7-9811-26c4a37f8d6f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"dfde3d03-1233-41b7-b607-a0b0aa100301","timestamp":1749194053743,"gateway":"8UUXN4P00A06NK"} + +{"bid":"179f2ae3-7f1f-4a85-b27e-c30e036dd5b1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c362c2f1-3085-4ab0-ba44-de07c7a6b17b","timestamp":1749194053942,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7c776163-325e-4bab-82e5-a039ee856cb4","data":{"dongle_infos":[]},"tid":"282f3843-14d8-4097-aa24-a4f2e7601530","timestamp":1749194055061,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4fa23838-26bf-4ea6-b566-2ad5c054ecb3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bbd9861f-bb46-473f-bb0c-75c5de5ebfef","timestamp":1749194055101,"gateway":"8UUXN4P00A06NK"} + +{"bid":"94d8720b-66a7-4f1e-9494-16994e3a8695","data":{"air_transfer_enable":false},"need_reply":1,"tid":"42962f6c-788f-4a69-a48c-cf11d12ba37e","timestamp":1749194056063,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e1b28b3e-b2c9-4ffa-a89c-8ad66885b585","data":{"departure_trajectory":[]},"tid":"606704f3-fbcc-4bdb-8221-8ae4f095fa84","timestamp":1749194056787,"gateway":"8UUXN4P00A06NK"} + +{"bid":"14f44bca-598d-408c-b8dd-ecbad17c7fd1","data":{"departure_trajectory":[]},"tid":"b22ea114-10d5-41f3-bf1e-2629386a5a12","timestamp":1749194056857,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4fa23838-26bf-4ea6-b566-2ad5c054ecb3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bbd9861f-bb46-473f-bb0c-75c5de5ebfef","timestamp":1749194057139,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d2a0b73e-74ac-4c61-a086-611305c760d4","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a3f27203-b467-4c83-a27e-fd17f0c4fa7e","timestamp":1749194057738,"gateway":"8UUXN4P00A06NK"} + +{"bid":"179f2ae3-7f1f-4a85-b27e-c30e036dd5b1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c362c2f1-3085-4ab0-ba44-de07c7a6b17b","timestamp":1749194058135,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e7e3af19-3fdc-40ad-b4b4-dad947f29481","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"777c1e4b-2fd9-4573-a57b-08da97866bf5","timestamp":1749194060104,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e7e3af19-3fdc-40ad-b4b4-dad947f29481","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"777c1e4b-2fd9-4573-a57b-08da97866bf5","timestamp":1749194062141,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c1a560a1-53f6-4a0f-b6b6-39636fac77fe","bid":"71159127-8331-4903-a8e7-1bb6563c5e89","timestamp":1749194088472,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"f9446fef-5d61-4348-900a-29c3ce1c9b21","bid":"fd3ee8ca-626b-4785-a0bc-139cb08bb4ce","timestamp":1749194088477,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"2849f660-9c8b-4502-b4fd-5395815500df","data":{"mobility_status_notify":0},"need_reply":1,"tid":"b28d593a-2c7a-4d65-a245-fc68670a1c1e","timestamp":1749194090214,"gateway":"8UUXN4P00A06NK"} + +{"bid":"31ab2c34-c75f-4d13-bd67-4cd3afcebaaa","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"af0b8015-1e8d-4f26-aa7f-30e31bb55380","timestamp":1749194090274,"gateway":"8UUXN4P00A06NK"} + +{"bid":"84931222-95cf-4359-a119-98bc0761cc84","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3fee9bec-f232-458b-9d71-eef6ffa85c31","timestamp":1749194090704,"gateway":"8UUXN4P00A06NK"} + +{"bid":"38d195a9-d36f-4716-857a-12520e75edb6","data":{"dongle_infos":[]},"tid":"f495211c-8024-4583-b986-b31afad18c3e","timestamp":1749194090709,"gateway":"8UUXN4P00A06NK"} + +{"bid":"090ddb42-687a-459d-b0eb-f5dbe079a907","data":{"firmware_version":"13.01.0002"},"tid":"d016864c-c7ab-44d5-ac73-7f724350c8fb","timestamp":1749194090716,"gateway":"8UUXN4P00A06NK"} + +{"bid":"98c22c52-7321-4f62-9f07-f5d455f7f958","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"4f142153-3f80-4b96-8afd-d47bf5e3a8df","timestamp":1749194090808,"gateway":"8UUXN4P00A06NK"} + +{"tid":"322b03d2-6c79-415b-8744-ea8f0b66bc7f","bid":"fbc25d69-169c-4488-b461-4ef67299a071","timestamp":1749194090959,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"13594da2-49de-4dff-b9b0-787eccf64fec","data":{"dongle_infos":[]},"tid":"e89187e3-b756-4b5f-8733-88f0ff148eac","timestamp":1749194091765,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2849f660-9c8b-4502-b4fd-5395815500df","data":{"mobility_status_notify":0},"need_reply":1,"tid":"b28d593a-2c7a-4d65-a245-fc68670a1c1e","timestamp":1749194092253,"gateway":"8UUXN4P00A06NK"} + +{"bid":"31ab2c34-c75f-4d13-bd67-4cd3afcebaaa","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"af0b8015-1e8d-4f26-aa7f-30e31bb55380","timestamp":1749194092452,"gateway":"8UUXN4P00A06NK"} + +{"bid":"98c22c52-7321-4f62-9f07-f5d455f7f958","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"4f142153-3f80-4b96-8afd-d47bf5e3a8df","timestamp":1749194092857,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eb2300be-8efa-4b72-8dd7-8c4dc4b9177c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"58b2b420-91b0-436b-9ca2-0aef09952198","timestamp":1749194093474,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1e677b16-c3f3-430b-9a5b-870ebed344cf","data":{"dongle_infos":[]},"tid":"575bfa30-af23-4090-96cd-29b467b82e99","timestamp":1749194093894,"gateway":"8UUXN4P00A06NK"} + +{"bid":"84931222-95cf-4359-a119-98bc0761cc84","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3fee9bec-f232-458b-9d71-eef6ffa85c31","timestamp":1749194094906,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5355e761-6ae6-45ed-8e56-7f9723b4797b","data":{"departure_trajectory":[]},"tid":"5d5a4d45-e383-4987-bb9f-9ecf67086170","timestamp":1749194095106,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d6e82088-4a8b-48f2-a97a-4e240185fdb7","bid":"801dc332-e43c-483f-8a94-56ffa7251dbe","timestamp":1749194122123,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"e97f292d-d543-4604-b78c-d188ecd8dd6e","bid":"aafdb5b2-bab4-4706-98d7-ff40432884a3","timestamp":1749194122127,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"69d609f0-5af6-4ea7-a95f-8c38f949309a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1a9283f7-2ef5-4663-8d49-8ff2f45d0ac3","timestamp":1749194123414,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c24043e1-9d53-4ec1-9845-7db3f588b161","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c780a69c-f2b3-42bd-b270-a227e9ac11b9","timestamp":1749194123416,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6a883e2f-ac8d-41b7-aecb-12ad7d672ff7","data":{"dongle_infos":[]},"tid":"c6642f9b-d952-4780-82e7-1e0a037cb7be","timestamp":1749194123910,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a10fe11c-e7b7-43c9-b3e0-45eeb33e814b","data":{"firmware_version":"13.01.0002"},"tid":"b9c7ef5f-f457-44c0-b5b4-9405b36330f4","timestamp":1749194123916,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7ce7bfe9-132c-4b19-876c-7516ff3332ca","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1e235a57-da28-4e7c-a47f-28145cf1fc64","timestamp":1749194123917,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9d32a360-e24f-4aec-bc5a-c888be70e65e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8df068cf-6b26-4e19-802b-9143ba305dd0","timestamp":1749194124105,"gateway":"8UUXN4P00A06NK"} + +{"tid":"688b560a-8bcc-49a4-a826-3a2cca4322cb","bid":"40f4ebed-7b81-4868-a83f-1edf8cdb9b76","timestamp":1749194124301,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"19e923e0-c778-4958-a878-ca96d5b103c2","data":{"dongle_infos":[]},"tid":"bee5255e-1051-410a-b811-b0088accd8bd","timestamp":1749194124917,"gateway":"8UUXN4P00A06NK"} + +{"bid":"69d609f0-5af6-4ea7-a95f-8c38f949309a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1a9283f7-2ef5-4663-8d49-8ff2f45d0ac3","timestamp":1749194125549,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c24043e1-9d53-4ec1-9845-7db3f588b161","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c780a69c-f2b3-42bd-b270-a227e9ac11b9","timestamp":1749194125551,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7ce7bfe9-132c-4b19-876c-7516ff3332ca","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1e235a57-da28-4e7c-a47f-28145cf1fc64","timestamp":1749194125951,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b6d72421-c794-4203-8e46-b50236f8a4da","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"81f34df2-b53c-46fe-9be4-e23bed53c63a","timestamp":1749194127122,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0c80920f-3977-4993-9708-a513af3ca42e","data":{"dongle_infos":[]},"tid":"2d79c4f2-c3bd-4651-b694-d6194eec27df","timestamp":1749194128230,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9d32a360-e24f-4aec-bc5a-c888be70e65e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8df068cf-6b26-4e19-802b-9143ba305dd0","timestamp":1749194128303,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2a3a6116-815f-4db1-8831-869bcb8cd393","data":{"departure_trajectory":[]},"tid":"965a21cc-5834-4676-9ef9-ac9c458a4f5c","timestamp":1749194128713,"gateway":"8UUXN4P00A06NK"} + +{"bid":"323a0dc3-5cbf-451a-9a1e-f3afbba2c328","data":{"departure_trajectory":[]},"tid":"3fb65bed-33fe-4c51-b069-2f1bf2d955fd","timestamp":1749194128904,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b6d72421-c794-4203-8e46-b50236f8a4da","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"81f34df2-b53c-46fe-9be4-e23bed53c63a","timestamp":1749194129149,"gateway":"8UUXN4P00A06NK"} + +{"bid":"69d609f0-5af6-4ea7-a95f-8c38f949309a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1a9283f7-2ef5-4663-8d49-8ff2f45d0ac3","timestamp":1749194129751,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7ce7bfe9-132c-4b19-876c-7516ff3332ca","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1e235a57-da28-4e7c-a47f-28145cf1fc64","timestamp":1749194130151,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6c95a621-f8d1-451d-990a-14eddf53d143","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b9b6d46e-961d-4ecc-927f-a51a005b75ee","timestamp":1749194132125,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6c95a621-f8d1-451d-990a-14eddf53d143","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b9b6d46e-961d-4ecc-927f-a51a005b75ee","timestamp":1749194134150,"gateway":"8UUXN4P00A06NK"} + +{"tid":"a734d348-80d0-467b-8657-ad8c3eb9d048","bid":"1dc221ee-318b-4ad6-abc8-dabbff9e81f4","timestamp":1749194159568,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"2a4b7346-ab82-432a-9150-aff74df0ea27","bid":"a1647894-0af9-4a5b-9023-06bd9fe48770","timestamp":1749194159572,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"8116dcaf-26fa-44d7-85f5-411dca88cd81","data":{"air_transfer_enable":false},"need_reply":1,"tid":"62cfde6e-b092-4c3f-9c72-50a6a9c63a54","timestamp":1749194159900,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7134d23c-59b9-4b3d-9c41-0961acfdb1d7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8ce1633b-5c83-4fca-9d0b-34eb7cb484c2","timestamp":1749194162125,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4bccd17a-2d4c-4e07-afc6-90a397b15084","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c91e4280-9391-4726-bf35-154b30c532f8","timestamp":1749194162184,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ded9fe61-23d1-4161-856d-9b946554b291","data":{"dongle_infos":[]},"tid":"736bf1bc-91d7-4186-b09d-931590678a35","timestamp":1749194162417,"gateway":"8UUXN4P00A06NK"} + +{"bid":"22c07a45-b44d-41ba-9667-7747b8422781","data":{"firmware_version":"13.01.0002"},"tid":"5b2a1599-f151-4630-b669-099ac162b856","timestamp":1749194162423,"gateway":"8UUXN4P00A06NK"} + +{"tid":"214fe40e-3ba5-45f4-af92-9b8903ddc4c1","bid":"03092581-35f5-4d43-9883-fd9bac79ffd6","timestamp":1749194162541,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"8116dcaf-26fa-44d7-85f5-411dca88cd81","data":{"air_transfer_enable":false},"need_reply":1,"tid":"62cfde6e-b092-4c3f-9c72-50a6a9c63a54","timestamp":1749194162607,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d2e58ef3-3b99-4039-bb86-a52c70a181ef","data":{"mobility_status_notify":0},"need_reply":1,"tid":"636e2f7b-9dd0-42b2-b67d-6e11069255a1","timestamp":1749194162635,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5826c74e-0ee2-4210-965e-da78e45c9180","data":{"dongle_infos":[]},"tid":"21dfaf9c-4c9c-407d-a117-3d60008c0ec6","timestamp":1749194163440,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7134d23c-59b9-4b3d-9c41-0961acfdb1d7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8ce1633b-5c83-4fca-9d0b-34eb7cb484c2","timestamp":1749194164313,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4bccd17a-2d4c-4e07-afc6-90a397b15084","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c91e4280-9391-4726-bf35-154b30c532f8","timestamp":1749194164314,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f35bc5d6-ea18-4ad2-8433-f721302aefaa","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"29c8a1cf-4713-4103-b35b-723b936eb6ab","timestamp":1749194164566,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d2e58ef3-3b99-4039-bb86-a52c70a181ef","data":{"mobility_status_notify":0},"need_reply":1,"tid":"636e2f7b-9dd0-42b2-b67d-6e11069255a1","timestamp":1749194164713,"gateway":"8UUXN4P00A06NK"} + +{"tid":"1ae919ba-bd85-4acc-a89e-fc38969db930","bid":"639be110-994b-43f4-b0e0-68533813c7ad","timestamp":1749194189983,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"5ae39121-9a99-4ce6-8a11-2130562a79a9","bid":"8f8167b4-3f37-4b95-b161-e07d6e18b5a9","timestamp":1749194189988,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"9013e879-5b2c-421a-89b8-b4376bc8d2bb","data":{"air_transfer_enable":false},"need_reply":1,"tid":"254423d4-2941-4b63-93e5-9503c1ab93b0","timestamp":1749194192049,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ec757ee3-f38f-4f53-86e5-e52d47987fc2","data":{"mobility_status_notify":0},"need_reply":1,"tid":"64008f49-fb20-419f-9b3b-2bc5a5dcc8b4","timestamp":1749194194081,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fdfc72e3-b12a-414c-8b1d-05dd54b1b77b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7e0504b4-ce79-4ea3-9c7f-17afebe081bc","timestamp":1749194194105,"gateway":"8UUXN4P00A06NK"} + +{"bid":"14993d8e-97ee-4a48-97b2-0bdfca47970d","data":{"dongle_infos":[]},"tid":"857979f1-128b-4575-9db1-eb0dd109253b","timestamp":1749194194397,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bbf5fb5d-e110-44be-ab3e-75d8afae1c8f","data":{"dongle_infos":[]},"tid":"cd0ac6a5-9319-414b-afe4-2e842d4b4e8c","timestamp":1749194194398,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cea7bef7-4769-452e-b5b1-fadb7fc7d9bd","data":{"firmware_version":"13.01.0002"},"tid":"ccaa9b77-e51a-47ec-8495-7da18e320a95","timestamp":1749194194404,"gateway":"8UUXN4P00A06NK"} + +{"tid":"da72b145-6155-4919-9eaa-2c4538fe167b","bid":"412efa11-6884-42b2-9cf2-ca24345b8319","timestamp":1749194194562,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"9013e879-5b2c-421a-89b8-b4376bc8d2bb","data":{"air_transfer_enable":false},"need_reply":1,"tid":"254423d4-2941-4b63-93e5-9503c1ab93b0","timestamp":1749194194594,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ed6e16fc-8a0b-4ec6-ac00-30321d770841","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"77f58eee-63f7-4f98-8e64-5dac622ed2c8","timestamp":1749194194652,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ef83bf3c-59eb-42a3-864e-0a8dd0c20c03","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"71f935f8-0ebb-45f1-b736-20c2f4016ed0","timestamp":1749194194984,"gateway":"8UUXN4P00A06NK"} + +{"bid":"74e236e1-dbcf-4630-9021-d8c01e218ac0","data":{"dongle_infos":[]},"tid":"f86adb40-cf06-4b82-9954-7da5b20a0d45","timestamp":1749194195410,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ec757ee3-f38f-4f53-86e5-e52d47987fc2","data":{"mobility_status_notify":0},"need_reply":1,"tid":"64008f49-fb20-419f-9b3b-2bc5a5dcc8b4","timestamp":1749194196132,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ed6e16fc-8a0b-4ec6-ac00-30321d770841","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"77f58eee-63f7-4f98-8e64-5dac622ed2c8","timestamp":1749194196731,"gateway":"8UUXN4P00A06NK"} + +{"tid":"f8829ee4-33c3-4073-a6e8-8dfe120c62f0","bid":"a0042e6d-1c27-4f32-9cda-59ce671d807c","timestamp":1749194222324,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"24eef76c-995b-4946-b088-f2be3ac478f6","bid":"b6b52258-a3ca-47e6-981c-62f13034c949","timestamp":1749194222327,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"1360362e-d8c7-42f6-87e2-426bc8323b1d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"ce8d051b-9186-44d9-b436-84afc5698d7a","timestamp":1749194222950,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4f1a8cfd-a015-437f-8651-3b4b3678af9f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"617fc462-ca68-45cd-9458-b08eafcb4f6c","timestamp":1749194224865,"gateway":"8UUXN4P00A06NK"} + +{"bid":"22631d9a-648d-4613-b3d0-42419d7ad71e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"2322619e-5823-4df5-bf18-1d5d9f742231","timestamp":1749194225232,"gateway":"8UUXN4P00A06NK"} + +{"bid":"982c8375-d8a1-43f4-9023-468a70ee1475","data":{"dongle_infos":[]},"tid":"1455b37a-620e-417e-93b2-3486ff10c354","timestamp":1749194225311,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8da8b4cd-679c-4042-aa39-005263cda75a","data":{"firmware_version":"13.01.0002"},"tid":"346f5cd5-10a2-49a5-8553-79008801768c","timestamp":1749194225330,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1360362e-d8c7-42f6-87e2-426bc8323b1d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"ce8d051b-9186-44d9-b436-84afc5698d7a","timestamp":1749194225510,"gateway":"8UUXN4P00A06NK"} + +{"tid":"1cc691a5-ec91-4e44-9f99-2a1c8a4ef981","bid":"38d7cb57-340c-4ab4-9b92-0c96e1b41794","timestamp":1749194225635,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"7a59dd97-c21c-4ce1-b05c-bf11ebe10514","data":{"mobility_status_notify":0},"need_reply":1,"tid":"fca4d964-5db1-45b8-9e02-cdbe5374abc4","timestamp":1749194225651,"gateway":"8UUXN4P00A06NK"} + +{"bid":"be6610e2-aa06-432d-9097-669fbcc5c9d2","data":{"dongle_infos":[]},"tid":"e2409e98-3b56-4c1c-b56d-e766fa261c13","timestamp":1749194226384,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4f1a8cfd-a015-437f-8651-3b4b3678af9f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"617fc462-ca68-45cd-9458-b08eafcb4f6c","timestamp":1749194226869,"gateway":"8UUXN4P00A06NK"} + +{"bid":"22631d9a-648d-4613-b3d0-42419d7ad71e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"2322619e-5823-4df5-bf18-1d5d9f742231","timestamp":1749194227269,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0144c8f9-473e-426d-8c7f-944286b227b9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"85ae5df0-6c9b-4620-bb3f-fb7523e6f2e4","timestamp":1749194227320,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7a59dd97-c21c-4ce1-b05c-bf11ebe10514","data":{"mobility_status_notify":0},"need_reply":1,"tid":"fca4d964-5db1-45b8-9e02-cdbe5374abc4","timestamp":1749194227668,"gateway":"8UUXN4P00A06NK"} + +{"tid":"934bc232-270c-4a79-af85-e525bbc9a853","bid":"e4975c11-fc82-4538-9c6a-9129356509d9","timestamp":1749194255940,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"4d13f5ad-9bb5-4089-b84b-9fbfa39197be","bid":"72782097-50ed-43c9-b330-de21c4683497","timestamp":1749194255948,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"8cfe2f18-6ff5-4b7a-81f3-3d12ba7f3083","data":{"mobility_status_notify":0},"need_reply":1,"tid":"9c6047a5-7b8e-4a70-8789-9c7261999012","timestamp":1749194257476,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e9fc2590-dd2b-4b7c-8744-3260cd001c29","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"da814e86-e895-4fdf-a91a-9a3ad5072dcb","timestamp":1749194257479,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2b325fa0-8e2f-478a-9721-d9076ad02f1a","data":{"dongle_infos":[]},"tid":"ff65cecf-a5f6-401a-80cb-d3196dc2a0ad","timestamp":1749194257916,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1a1515e9-9971-47f5-adf4-069be6ecb7ad","data":{"firmware_version":"13.01.0002"},"tid":"34b3494a-d4d9-4c19-8f7e-c5c5039d5d32","timestamp":1749194257953,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2ed71fd7-bba9-4fd8-8883-ae9d0f1f6e8b","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1aad7771-f234-44a1-adbd-8c58bc6ceead","timestamp":1749194258080,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a0114bf4-d33c-4466-8f59-8a09cf99c020","data":{"air_transfer_enable":false},"need_reply":1,"tid":"eef30e62-7910-4713-a94b-c19da7e64fed","timestamp":1749194258123,"gateway":"8UUXN4P00A06NK"} + +{"tid":"df745c67-4e7f-4529-88a9-cbdd68b30367","bid":"53cd2d08-2439-4466-831c-9d1e9a51ce4e","timestamp":1749194258535,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"747c6286-4f37-46f3-a730-00a37af2c3a9","data":{"dongle_infos":[]},"tid":"debfa179-02c5-410a-9861-a306c55c2e6f","timestamp":1749194258957,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8cfe2f18-6ff5-4b7a-81f3-3d12ba7f3083","data":{"mobility_status_notify":0},"need_reply":1,"tid":"9c6047a5-7b8e-4a70-8789-9c7261999012","timestamp":1749194259558,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e9fc2590-dd2b-4b7c-8744-3260cd001c29","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"da814e86-e895-4fdf-a91a-9a3ad5072dcb","timestamp":1749194259559,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2ed71fd7-bba9-4fd8-8883-ae9d0f1f6e8b","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1aad7771-f234-44a1-adbd-8c58bc6ceead","timestamp":1749194260163,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c4a38bb1-dcd3-4686-bef2-080a5d43a1ed","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7ff1a305-6141-49c7-9c2e-40f0820a6d58","timestamp":1749194260941,"gateway":"8UUXN4P00A06NK"} + +{"bid":"43e59883-f5fe-4b77-a851-5a2a92d787ea","data":{"dongle_infos":[]},"tid":"9fbaac66-f04b-4dc5-841e-a00040b21e42","timestamp":1749194261200,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a0114bf4-d33c-4466-8f59-8a09cf99c020","data":{"air_transfer_enable":false},"need_reply":1,"tid":"eef30e62-7910-4713-a94b-c19da7e64fed","timestamp":1749194262321,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f21aca92-28c7-4263-b0d2-f4a7cc8d7587","data":{"departure_trajectory":[]},"tid":"cfb29fe7-6ba0-4a53-82d7-8127f383616d","timestamp":1749194262729,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3ba29b5f-4719-43ac-9455-8b642bca8f99","data":{"departure_trajectory":[]},"tid":"f052640e-6405-4fb7-b924-4f782914cd0d","timestamp":1749194262903,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c4a38bb1-dcd3-4686-bef2-080a5d43a1ed","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7ff1a305-6141-49c7-9c2e-40f0820a6d58","timestamp":1749194262964,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8cfe2f18-6ff5-4b7a-81f3-3d12ba7f3083","data":{"mobility_status_notify":0},"need_reply":1,"tid":"9c6047a5-7b8e-4a70-8789-9c7261999012","timestamp":1749194263758,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2ed71fd7-bba9-4fd8-8883-ae9d0f1f6e8b","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1aad7771-f234-44a1-adbd-8c58bc6ceead","timestamp":1749194264363,"gateway":"8UUXN4P00A06NK"} + +{"bid":"06efa9c2-d4ca-4655-a811-8d02fccb2ceb","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"30cc1a77-5e22-46ac-8760-4b9003fb8d9c","timestamp":1749194265941,"gateway":"8UUXN4P00A06NK"} + +{"bid":"06efa9c2-d4ca-4655-a811-8d02fccb2ceb","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"30cc1a77-5e22-46ac-8760-4b9003fb8d9c","timestamp":1749194267958,"gateway":"8UUXN4P00A06NK"} + +{"tid":"4e75c638-94ab-4d4c-bc82-ad667253f45e","bid":"9b0f178b-b433-4ae2-8d97-ccddae22cbad","timestamp":1749194294693,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"b54ef259-84b8-4b7e-b87b-28a6839ebd29","bid":"d1647365-48ef-4c93-bb27-9223dd59f298","timestamp":1749194294698,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"5578c459-03de-40fc-8627-92416696a538","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c0751b48-ad68-4801-9e31-458d33a52c35","timestamp":1749194295696,"gateway":"8UUXN4P00A06NK"} + +{"bid":"962aa3c7-32bd-4f83-bdbb-965544f2ad14","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"35a292ba-d0f5-48ec-b67c-d76839e62319","timestamp":1749194295823,"gateway":"8UUXN4P00A06NK"} + +{"bid":"44794c0a-09ef-4fd7-ac33-7161a4ef1489","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e1a01ed0-b8b4-453a-8554-c7916ffa74c4","timestamp":1749194296130,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a1ca9cfc-e0d0-4e38-996c-08a7c0c5da32","data":{"dongle_infos":[]},"tid":"23fffb9a-00a1-476f-bfa5-38c5f6b65c93","timestamp":1749194296134,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d7730e95-64b9-41aa-9cc9-a1f2c0baebc3","data":{"firmware_version":"13.01.0002"},"tid":"56d23059-b38e-4797-a2ba-5ace1f3bc838","timestamp":1749194296139,"gateway":"8UUXN4P00A06NK"} + +{"bid":"802a554b-b683-43fb-9f7a-3b3e32cd1139","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"68814586-1201-4e80-89e8-14953535e951","timestamp":1749194296184,"gateway":"8UUXN4P00A06NK"} + +{"tid":"81eeb84d-57ae-49a6-9541-b6d16720916c","bid":"fb3a1e47-4e35-4cbf-b1b1-558426d9da6d","timestamp":1749194296846,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"d1c40d81-e9c2-41eb-bde0-86ddb171b030","data":{"dongle_infos":[]},"tid":"300793f3-89b1-4a1a-858b-e32ef62db665","timestamp":1749194297132,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5578c459-03de-40fc-8627-92416696a538","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c0751b48-ad68-4801-9e31-458d33a52c35","timestamp":1749194297871,"gateway":"8UUXN4P00A06NK"} + +{"bid":"962aa3c7-32bd-4f83-bdbb-965544f2ad14","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"35a292ba-d0f5-48ec-b67c-d76839e62319","timestamp":1749194297872,"gateway":"8UUXN4P00A06NK"} + +{"bid":"802a554b-b683-43fb-9f7a-3b3e32cd1139","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"68814586-1201-4e80-89e8-14953535e951","timestamp":1749194298278,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6d4f62fe-b943-4b82-a973-f71144e02dda","data":{"dongle_infos":[]},"tid":"c5988a73-2e77-4fad-9589-806f0362bb69","timestamp":1749194299525,"gateway":"8UUXN4P00A06NK"} + +{"bid":"86b0b1ff-8901-47b5-add5-d9abf050c622","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d77db92f-941a-48dc-a2ba-ef5d495c6014","timestamp":1749194299693,"gateway":"8UUXN4P00A06NK"} + +{"bid":"44794c0a-09ef-4fd7-ac33-7161a4ef1489","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e1a01ed0-b8b4-453a-8554-c7916ffa74c4","timestamp":1749194300323,"gateway":"8UUXN4P00A06NK"} + +{"bid":"86590dbf-bdad-47a4-ab16-25ad14345a61","data":{"departure_trajectory":[]},"tid":"2449326e-1169-433b-a1cb-3f9c1a686013","timestamp":1749194301124,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6190a846-41b7-4b57-bcef-abeb82e25ffb","data":{"departure_trajectory":[]},"tid":"9a48f8a8-92cc-4b02-a36e-4c414855c283","timestamp":1749194301353,"gateway":"8UUXN4P00A06NK"} + +{"bid":"86b0b1ff-8901-47b5-add5-d9abf050c622","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d77db92f-941a-48dc-a2ba-ef5d495c6014","timestamp":1749194301872,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5578c459-03de-40fc-8627-92416696a538","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c0751b48-ad68-4801-9e31-458d33a52c35","timestamp":1749194302076,"gateway":"8UUXN4P00A06NK"} + +{"bid":"802a554b-b683-43fb-9f7a-3b3e32cd1139","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"68814586-1201-4e80-89e8-14953535e951","timestamp":1749194302474,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3ca282e2-df23-4825-aaf5-1d641e818149","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7d1213c5-3a67-4b8f-8e5e-ec3e75f3c4d5","timestamp":1749194304694,"gateway":"8UUXN4P00A06NK"} + +{"tid":"2345ebd9-b8f4-450a-9e44-0d6994e6c31b","bid":"269daf71-a5b9-4979-8306-9354db6e5145","timestamp":1749194333425,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"026d3392-c0d2-4c42-93c2-e43794cc719a","bid":"5b439531-df50-48c1-85e3-f8d2912d857f","timestamp":1749194333430,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"5ba471f1-9fb7-4908-b1d6-4501199fd3c0","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a87cb561-4f15-42ba-b433-fe6d34160df4","timestamp":1749194335097,"gateway":"8UUXN4P00A06NK"} + +{"bid":"53527b4d-b719-4785-ac2f-eb60bb615442","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ac13532c-f531-42aa-9bfa-bfede16db48f","timestamp":1749194335236,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a08dc802-74a1-4dae-8caa-cbad54152eba","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e34878ec-ac56-418a-9814-270fe11e4082","timestamp":1749194335505,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a06f85c5-906b-4399-b52c-8bca2f5d084a","data":{"dongle_infos":[]},"tid":"ac0668aa-27eb-42f8-8350-b45e8219b233","timestamp":1749194335598,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7d104413-9464-446b-8dab-e2005edf7d4b","data":{"firmware_version":"13.01.0002"},"tid":"36dc7430-f6e1-4941-b553-e1c71506d138","timestamp":1749194335604,"gateway":"8UUXN4P00A06NK"} + +{"bid":"130e0108-a944-4f8a-9d18-5cf3dda4102d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"06b522e3-9f66-4ef0-83fd-fd2f5ad96618","timestamp":1749194335785,"gateway":"8UUXN4P00A06NK"} + +{"tid":"431740e1-72ef-4960-8465-248abc690fd8","bid":"7dc85a80-27e1-4edc-95f6-d7c71b26b0eb","timestamp":1749194335811,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"267d40e8-99a2-4aa8-8a30-0173c6286016","data":{"dongle_infos":[]},"tid":"743f6ff7-ff3b-4944-9469-d50717f67fda","timestamp":1749194336608,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5ba471f1-9fb7-4908-b1d6-4501199fd3c0","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a87cb561-4f15-42ba-b433-fe6d34160df4","timestamp":1749194337166,"gateway":"8UUXN4P00A06NK"} + +{"bid":"53527b4d-b719-4785-ac2f-eb60bb615442","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ac13532c-f531-42aa-9bfa-bfede16db48f","timestamp":1749194337370,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a08dc802-74a1-4dae-8caa-cbad54152eba","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e34878ec-ac56-418a-9814-270fe11e4082","timestamp":1749194337565,"gateway":"8UUXN4P00A06NK"} + +{"bid":"89b1d550-dc86-4ae3-a677-fea9def2ff66","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f9f6b924-e345-425c-8597-8a804cac3173","timestamp":1749194338433,"gateway":"8UUXN4P00A06NK"} + +{"bid":"62dba3c8-1742-4ad1-a8a4-607478b2fccc","data":{"dongle_infos":[]},"tid":"2f1e9ad0-a53b-47f1-9c71-67bac1a0b50b","timestamp":1749194338825,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0d5bc88a-1b13-4042-8ae4-fb3c0d1481a8","data":{"departure_trajectory":[]},"tid":"c6a4fa2b-d044-43d2-9712-95793022f3f0","timestamp":1749194339910,"gateway":"8UUXN4P00A06NK"} + +{"bid":"130e0108-a944-4f8a-9d18-5cf3dda4102d","data":{"air_transfer_enable":false},"need_reply":1,"tid":"06b522e3-9f66-4ef0-83fd-fd2f5ad96618","timestamp":1749194339989,"gateway":"8UUXN4P00A06NK"} + +{"bid":"89b1d550-dc86-4ae3-a677-fea9def2ff66","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f9f6b924-e345-425c-8597-8a804cac3173","timestamp":1749194340568,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8cad5861-4aeb-4ea6-a0dc-54067f7337ea","data":{"departure_trajectory":[]},"tid":"13997ed4-e979-4aab-b0b5-8a87f19451b9","timestamp":1749194340588,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5ba471f1-9fb7-4908-b1d6-4501199fd3c0","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a87cb561-4f15-42ba-b433-fe6d34160df4","timestamp":1749194341364,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a08dc802-74a1-4dae-8caa-cbad54152eba","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e34878ec-ac56-418a-9814-270fe11e4082","timestamp":1749194341763,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8206e6ad-31d2-4d1d-8fe2-bda9c7fe3fb8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"087047e8-72d1-4ebd-aa01-e649432a8706","timestamp":1749194343432,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b5ca2bfa-aa43-437e-97d6-462df8c098eb","bid":"551a8139-d501-4095-b2cd-5ffe781eac11","timestamp":1749194371890,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"cf0cfe56-6a9f-4965-9d3e-45dd1dcf5562","bid":"894ac2ce-0532-4202-9f8c-6a610aa7f187","timestamp":1749194371895,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"9f34c9dc-a060-4a0d-9037-0086fb3e7cc8","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"cf457f81-7f45-494d-bcd6-336b91a2d01f","timestamp":1749194372279,"gateway":"8UUXN4P00A06NK"} + +{"bid":"23f8ff99-938f-46dd-990c-6cbb30ae4711","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2dc83911-972f-461a-8b89-d5b25861c562","timestamp":1749194372303,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6fcbd552-51d2-45f7-9d81-1f53700465a7","data":{"dongle_infos":[]},"tid":"5125fa94-657a-4538-8fde-7576a433ff0f","timestamp":1749194372549,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1b7e07e1-351d-4b13-8d84-f4eb3d918f53","data":{"firmware_version":"13.01.0002"},"tid":"c720d044-083e-4dcc-b8c1-5365bee24922","timestamp":1749194372556,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2e56eda6-2ad3-40ec-b8d4-b58b42c5c3d6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3e2c146d-44f0-492f-a258-e456c51d023c","timestamp":1749194372701,"gateway":"8UUXN4P00A06NK"} + +{"bid":"db79f50f-3c2e-4879-8c54-60e50c886044","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e13d54d2-98db-4844-88c6-a4cc71e0fcc1","timestamp":1749194372738,"gateway":"8UUXN4P00A06NK"} + +{"tid":"162de757-5de9-46b0-b7f1-3140ac946480","bid":"0f16514f-1bcb-4aa9-9d3f-1037b8647d73","timestamp":1749194373275,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"16c3658e-c095-48c1-991f-4fc51e51b084","data":{"dongle_infos":[]},"tid":"123d117a-adb6-471c-a4f6-319c94c123e7","timestamp":1749194373550,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9f34c9dc-a060-4a0d-9037-0086fb3e7cc8","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"cf457f81-7f45-494d-bcd6-336b91a2d01f","timestamp":1749194374298,"gateway":"8UUXN4P00A06NK"} + +{"bid":"23f8ff99-938f-46dd-990c-6cbb30ae4711","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2dc83911-972f-461a-8b89-d5b25861c562","timestamp":1749194374497,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2e56eda6-2ad3-40ec-b8d4-b58b42c5c3d6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3e2c146d-44f0-492f-a258-e456c51d023c","timestamp":1749194374898,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a732b0bd-ba17-49bd-be84-d8698d5cdf0b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1a290dda-4f54-4bf4-87a3-46a0360dbc6f","timestamp":1749194376888,"gateway":"8UUXN4P00A06NK"} + +{"bid":"db79f50f-3c2e-4879-8c54-60e50c886044","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e13d54d2-98db-4844-88c6-a4cc71e0fcc1","timestamp":1749194376939,"gateway":"8UUXN4P00A06NK"} + +{"bid":"62faa1c4-547e-4406-aaeb-7af790caff0f","data":{"departure_trajectory":[]},"tid":"39c657a5-1b5f-4aae-9736-b884efc44e86","timestamp":1749194377536,"gateway":"8UUXN4P00A06NK"} + +{"bid":"718d2248-d1f2-4a21-9c48-45b453b0f108","data":{"dongle_infos":[]},"tid":"d160918b-bf62-45e1-ab39-ed5591c1afd7","timestamp":1749194377743,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9f34c9dc-a060-4a0d-9037-0086fb3e7cc8","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"cf457f81-7f45-494d-bcd6-336b91a2d01f","timestamp":1749194378499,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3ceda624-6558-4be1-b099-ce2bc9274d8f","data":{"departure_trajectory":[]},"tid":"0ec9830d-697c-4d42-8a43-17dd3c793fc8","timestamp":1749194378581,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a732b0bd-ba17-49bd-be84-d8698d5cdf0b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1a290dda-4f54-4bf4-87a3-46a0360dbc6f","timestamp":1749194378900,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2e56eda6-2ad3-40ec-b8d4-b58b42c5c3d6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3e2c146d-44f0-492f-a258-e456c51d023c","timestamp":1749194379099,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3451aeb0-d677-4cea-8b53-0711c8d9280e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0135be12-ff80-4aba-880c-80f6057b4bd3","timestamp":1749194381889,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3451aeb0-d677-4cea-8b53-0711c8d9280e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0135be12-ff80-4aba-880c-80f6057b4bd3","timestamp":1749194383896,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d63f7d86-64c9-4522-b475-69774a4385b4","bid":"81ddc56b-9382-4881-a35e-42066df574d6","timestamp":1749194410287,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"33545f38-727f-4388-91e0-3789f90fa9a7","bid":"7de56ffd-7506-4658-b110-92d467b9d938","timestamp":1749194410294,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"86a8ce0d-cfe3-45ad-9a51-913b26581b6e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"56df989a-db94-473e-a6d7-65338385feab","timestamp":1749194411673,"gateway":"8UUXN4P00A06NK"} + +{"bid":"82843e7d-5a5c-4333-b14c-a51e41edd68a","data":{"dongle_infos":[]},"tid":"27796258-a3cf-4170-abe4-f30eaf5b78ae","timestamp":1749194411994,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e332317d-c95a-4586-b47c-cae08c7d5f2a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"cff73a68-5fd0-4b37-9b05-2c5d2b07f0c3","timestamp":1749194411999,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e1bd04b2-cd4b-433f-af37-6918c7738822","data":{"firmware_version":"13.01.0002"},"tid":"e3bc891d-a252-4f08-b000-fd5170d98992","timestamp":1749194412009,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2d9434b9-0af0-4823-8ff5-4c65f90b4f94","data":{"air_transfer_enable":false},"need_reply":1,"tid":"dc405bef-7159-42de-9571-cf3e4e655db4","timestamp":1749194412016,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0a4567da-b2e6-44c2-9466-bbfdef83279e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ac2c6708-34f8-4839-94de-213f53d211e4","timestamp":1749194412412,"gateway":"8UUXN4P00A06NK"} + +{"tid":"e4834bf6-b472-44e4-914b-b9018ff4a7a0","bid":"3a019eda-9332-4527-8f2e-58f0bc47f4f7","timestamp":1749194412458,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"51a16abc-545b-4d79-812c-16adb22e0cff","data":{"dongle_infos":[]},"tid":"d2748a9a-e1af-4994-a61c-76636827c486","timestamp":1749194413002,"gateway":"8UUXN4P00A06NK"} + +{"bid":"86a8ce0d-cfe3-45ad-9a51-913b26581b6e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"56df989a-db94-473e-a6d7-65338385feab","timestamp":1749194413728,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e332317d-c95a-4586-b47c-cae08c7d5f2a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"cff73a68-5fd0-4b37-9b05-2c5d2b07f0c3","timestamp":1749194414130,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0a4567da-b2e6-44c2-9466-bbfdef83279e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ac2c6708-34f8-4839-94de-213f53d211e4","timestamp":1749194414533,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d7b5c5cb-537c-4588-b43d-2fc9b60ab9d0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"663574f8-c043-44ef-ba48-5c3f8188f1f9","timestamp":1749194415287,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2d9434b9-0af0-4823-8ff5-4c65f90b4f94","data":{"air_transfer_enable":false},"need_reply":1,"tid":"dc405bef-7159-42de-9571-cf3e4e655db4","timestamp":1749194416224,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e638ae4f-4998-4bd0-bd93-18d124ac2917","data":{"dongle_infos":[]},"tid":"c50c5ab5-71c4-4f50-b95d-c4e91c9f699b","timestamp":1749194416578,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d2ca6aff-3498-4c42-a3b0-6ad1b8bddae0","data":{"departure_trajectory":[]},"tid":"e7070c81-3dfe-40b8-bb4a-881bc7e6788c","timestamp":1749194416892,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cfaf5c9d-877f-4dc2-8de2-a5b3f71c8cd8","data":{"departure_trajectory":[]},"tid":"f456ee9e-75ef-43ac-944f-96c3dc7d0003","timestamp":1749194416990,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d7b5c5cb-537c-4588-b43d-2fc9b60ab9d0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"663574f8-c043-44ef-ba48-5c3f8188f1f9","timestamp":1749194417331,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e332317d-c95a-4586-b47c-cae08c7d5f2a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"cff73a68-5fd0-4b37-9b05-2c5d2b07f0c3","timestamp":1749194418331,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0a4567da-b2e6-44c2-9466-bbfdef83279e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ac2c6708-34f8-4839-94de-213f53d211e4","timestamp":1749194418734,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4002f12b-f54d-44c0-99b6-27129e877bf0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3292d279-63f6-4bb5-8815-5fd8e0beb1ab","timestamp":1749194420291,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4002f12b-f54d-44c0-99b6-27129e877bf0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3292d279-63f6-4bb5-8815-5fd8e0beb1ab","timestamp":1749194422334,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d8a813e7-f032-4b68-9845-163c19758441","bid":"ce353374-f78b-463d-9ff3-5b427d97f244","timestamp":1749194449480,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"82ec6878-2716-48ec-a5cb-8f5a6a353de5","bid":"8b1de631-1d81-442a-aaae-82d925938e71","timestamp":1749194449484,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"c7936bac-ffd9-405d-97d1-770c73d5ca81","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7aca2390-d183-4b37-bb75-fd5787b61e60","timestamp":1749194450842,"gateway":"8UUXN4P00A06NK"} + +{"bid":"364dc282-9f41-41f5-b0ce-9d584f753fe5","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"df7f6c77-2a0b-412a-a5f9-1b861e82656f","timestamp":1749194450862,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aef44006-fd87-4627-8171-f3bcf640acd6","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e7eb4a40-fd3e-422f-bdc9-efb5c7481fe0","timestamp":1749194450909,"gateway":"8UUXN4P00A06NK"} + +{"bid":"449e3de5-5bbe-42b8-80ae-ac6f75c2ee9b","data":{"dongle_infos":[]},"tid":"f84d7b6a-7159-41a2-99e2-d1e083d7dc18","timestamp":1749194450914,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cc73f659-d6f6-4526-8f5e-ecba58f9254b","data":{"firmware_version":"13.01.0002"},"tid":"cdf3bdfa-a256-4d13-b273-1f7483125dac","timestamp":1749194450934,"gateway":"8UUXN4P00A06NK"} + +{"tid":"66be6b5c-2da6-4d34-a4de-0083fdfef890","bid":"9bcd4f73-6213-4516-bc66-d825d04ae601","timestamp":1749194450999,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1eb2408-d181-49bd-b301-199cd8a23e92","data":{"mobility_status_notify":0},"need_reply":1,"tid":"76cabb5b-8a77-4762-a601-e406ebfe055c","timestamp":1749194451281,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e627bd8e-9782-4304-a779-f16731411daf","data":{"dongle_infos":[]},"tid":"c9e08d86-9fb3-44ef-aa9b-15159d562538","timestamp":1749194451955,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c7936bac-ffd9-405d-97d1-770c73d5ca81","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7aca2390-d183-4b37-bb75-fd5787b61e60","timestamp":1749194453010,"gateway":"8UUXN4P00A06NK"} + +{"bid":"364dc282-9f41-41f5-b0ce-9d584f753fe5","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"df7f6c77-2a0b-412a-a5f9-1b861e82656f","timestamp":1749194453012,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1eb2408-d181-49bd-b301-199cd8a23e92","data":{"mobility_status_notify":0},"need_reply":1,"tid":"76cabb5b-8a77-4762-a601-e406ebfe055c","timestamp":1749194453410,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9773abe6-c11a-4d90-8e5f-c1428ff2feed","data":{"dongle_infos":[]},"tid":"258c8c2e-decf-49af-a6bb-7c04e5c4f4b1","timestamp":1749194454082,"gateway":"8UUXN4P00A06NK"} + +{"bid":"30cd9e91-c25d-47a6-ad98-99f8e9a60f70","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"13b6ba7e-befb-4b36-948f-6c108476179a","timestamp":1749194454480,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aef44006-fd87-4627-8171-f3bcf640acd6","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e7eb4a40-fd3e-422f-bdc9-efb5c7481fe0","timestamp":1749194455107,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6e4b0887-9fa3-4c47-9b72-94a4ae2047f3","data":{"departure_trajectory":[]},"tid":"6af1b950-f841-4505-81dc-9d3f0de3c649","timestamp":1749194455904,"gateway":"8UUXN4P00A06NK"} + +{"bid":"27e63072-8ef1-43db-abbf-0130ac1f703e","data":{"departure_trajectory":[]},"tid":"9d04e175-8ed8-4f56-89bc-04f3ae2ea874","timestamp":1749194456135,"gateway":"8UUXN4P00A06NK"} + +{"bid":"30cd9e91-c25d-47a6-ad98-99f8e9a60f70","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"13b6ba7e-befb-4b36-948f-6c108476179a","timestamp":1749194456610,"gateway":"8UUXN4P00A06NK"} + +{"bid":"364dc282-9f41-41f5-b0ce-9d584f753fe5","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"df7f6c77-2a0b-412a-a5f9-1b861e82656f","timestamp":1749194457210,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1eb2408-d181-49bd-b301-199cd8a23e92","data":{"mobility_status_notify":0},"need_reply":1,"tid":"76cabb5b-8a77-4762-a601-e406ebfe055c","timestamp":1749194457610,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5bb90311-3733-4da1-853a-8a4399b95749","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f74671d2-7d84-48d6-b55e-eabe0da2d572","timestamp":1749194459481,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5bb90311-3733-4da1-853a-8a4399b95749","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f74671d2-7d84-48d6-b55e-eabe0da2d572","timestamp":1749194461612,"gateway":"8UUXN4P00A06NK"} + +{"tid":"410fb273-cb81-4be2-84c1-3e9ecef87d20","bid":"4618a151-f1af-47c4-ad7c-df642721d9a1","timestamp":1749194485939,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"b3ea2b68-e19c-4f10-911b-36af9c1cefb4","bid":"d8a13328-fdaa-4a7b-9310-3115d558e906","timestamp":1749194485945,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"bda373d4-53c0-470b-80d9-e6b5eba840c4","bid":"efa0c3fa-f82c-4a30-b350-d6a92946a287","timestamp":1749194486006,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"f1abc222-ee69-4057-8277-25e6ddc84f01","bid":"8c9a8d33-a766-4e5e-818c-ee95b9dc95fa","timestamp":1749194486013,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f32ed22b-ef54-4aad-80e1-3ad8836b5714","data":{"air_transfer_enable":false},"need_reply":1,"tid":"4d05fa6d-5128-412a-b176-0df693919218","timestamp":1749194487820,"gateway":"8UUXN4P00A06NK"} + +{"bid":"56016557-d5ea-41b1-8584-53cb60d711f8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"fb88c1ec-0da3-4aef-bb23-109bcec0e61c","timestamp":1749194489870,"gateway":"8UUXN4P00A06NK"} + +{"bid":"978380b6-937a-4eaa-a2ba-f5d441748685","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"bd0db4d6-2d51-4395-a809-8b3eeba4a79c","timestamp":1749194490150,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2894b8e2-4bf4-4f61-9f83-83a6002d8874","data":{"dongle_infos":[]},"tid":"8c1b01fb-1dde-47e8-bfa9-57dd4aed5706","timestamp":1749194490397,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f32ed22b-ef54-4aad-80e1-3ad8836b5714","data":{"air_transfer_enable":false},"need_reply":1,"tid":"4d05fa6d-5128-412a-b176-0df693919218","timestamp":1749194490402,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e22e767c-d8b5-427f-8d51-0a89d8a8ac8b","data":{"firmware_version":"13.01.0002"},"tid":"2daef813-109a-476d-a6fa-24425a37e740","timestamp":1749194490407,"gateway":"8UUXN4P00A06NK"} + +{"tid":"9861be99-f8ed-47d3-a5cb-dddff0978fb3","bid":"9929da27-e898-4840-9c73-6611dcf9cadb","timestamp":1749194490449,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"005b98ac-5174-466b-a8fc-06bfa5108d97","data":{"mobility_status_notify":0},"need_reply":1,"tid":"564119f1-a989-4024-9aaf-ffc6090e5a08","timestamp":1749194490597,"gateway":"8UUXN4P00A06NK"} + +{"bid":"939ac83c-7e5b-4ae9-a80d-e4c9f9a7c84d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e3def174-f6c2-4893-8e65-173d1d1af1cf","timestamp":1749194490936,"gateway":"8UUXN4P00A06NK"} + +{"bid":"51de4e43-6406-4d97-83dc-3595cdaf1dac","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8e8f206c-ba07-49eb-b7ed-4adcaa5d4ab4","timestamp":1749194491004,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f667ed0e-2f7f-4f10-8a4c-ec8fac4ccf80","data":{"dongle_infos":[]},"tid":"884c6e8a-7f36-444f-a03b-97fcd8005a1c","timestamp":1749194491423,"gateway":"8UUXN4P00A06NK"} + +{"bid":"978380b6-937a-4eaa-a2ba-f5d441748685","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"bd0db4d6-2d51-4395-a809-8b3eeba4a79c","timestamp":1749194492276,"gateway":"8UUXN4P00A06NK"} + +{"bid":"005b98ac-5174-466b-a8fc-06bfa5108d97","data":{"mobility_status_notify":0},"need_reply":1,"tid":"564119f1-a989-4024-9aaf-ffc6090e5a08","timestamp":1749194492675,"gateway":"8UUXN4P00A06NK"} + +{"bid":"51de4e43-6406-4d97-83dc-3595cdaf1dac","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8e8f206c-ba07-49eb-b7ed-4adcaa5d4ab4","timestamp":1749194493077,"gateway":"8UUXN4P00A06NK"} + +{"tid":"0d86349b-a745-415a-805c-ac391f962c1a","bid":"fca49faa-71ba-4e08-b400-e6c8610c9f90","timestamp":1749194520163,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"3766960a-0978-48ef-bbcd-138e55fa1ee5","bid":"d0564796-57eb-4b92-b0f0-0a1b7a218da2","timestamp":1749194520165,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"b2110332-b9bb-489e-8e60-07de79a2d69a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"77d77381-d262-4c2c-a135-025b5183b90b","timestamp":1749194521022,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5ac26caf-1a3e-46b0-98a7-acf11ed1eede","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"97f77caf-2d50-4a5d-8900-19693f5263fb","timestamp":1749194521026,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8d7275ff-1531-4e55-864f-4f7b9fa7da1f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"6fcf5a42-93f9-4eb8-a8a3-0dd428209c8c","timestamp":1749194521397,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3a214a13-3710-404d-853b-6ba523516c7e","data":{"dongle_infos":[]},"tid":"18f1b362-7de4-4a98-a4ea-de8173c1b04f","timestamp":1749194521534,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7eb35d5f-e867-48d1-beeb-4c94ca698f11","data":{"dongle_infos":[]},"tid":"2ede372a-52ac-4dee-8cc5-0a1a8dcb6572","timestamp":1749194521535,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0e8b22b3-8648-44cd-9d43-98055fa63980","data":{"firmware_version":"13.01.0002"},"tid":"33f91b2e-b16a-4b35-bc30-a01a8b5bbd4c","timestamp":1749194521555,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a902f5b8-06ba-4603-9ec1-7222675a1078","data":{"air_transfer_enable":false},"need_reply":1,"tid":"59afad65-5999-408f-a760-32c9fa5b573d","timestamp":1749194521721,"gateway":"8UUXN4P00A06NK"} + +{"tid":"88c63ac7-359e-4f57-ac1e-d9103b2e8569","bid":"82e9666d-201e-474f-81fa-a23ff75ec381","timestamp":1749194522110,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"3ded3b6e-0ad4-4bcd-acb1-aac6d2c7b8cb","data":{"dongle_infos":[]},"tid":"2a0e2835-b959-421e-9b2d-a76f58d335b7","timestamp":1749194522543,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b2110332-b9bb-489e-8e60-07de79a2d69a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"77d77381-d262-4c2c-a135-025b5183b90b","timestamp":1749194523196,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5ac26caf-1a3e-46b0-98a7-acf11ed1eede","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"97f77caf-2d50-4a5d-8900-19693f5263fb","timestamp":1749194523198,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8d7275ff-1531-4e55-864f-4f7b9fa7da1f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"6fcf5a42-93f9-4eb8-a8a3-0dd428209c8c","timestamp":1749194523594,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fcb198f5-3350-4d82-b314-79b030a0720b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"85c1e1c1-6379-4c99-b83c-bd25893ef1ce","timestamp":1749194525173,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a902f5b8-06ba-4603-9ec1-7222675a1078","data":{"air_transfer_enable":false},"need_reply":1,"tid":"59afad65-5999-408f-a760-32c9fa5b573d","timestamp":1749194525923,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0515fa9c-0b80-4358-a69e-7090668eb32f","data":{"departure_trajectory":[]},"tid":"3248d29e-d95d-4037-8034-b2ea08273856","timestamp":1749194526527,"gateway":"8UUXN4P00A06NK"} + +{"bid":"69a25926-6dcb-4aee-b9d4-63427d480d7e","data":{"departure_trajectory":[]},"tid":"5b724c88-a0e3-4645-b983-aeac89f1ee9a","timestamp":1749194526813,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fcb198f5-3350-4d82-b314-79b030a0720b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"85c1e1c1-6379-4c99-b83c-bd25893ef1ce","timestamp":1749194527197,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5ac26caf-1a3e-46b0-98a7-acf11ed1eede","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"97f77caf-2d50-4a5d-8900-19693f5263fb","timestamp":1749194527399,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8d7275ff-1531-4e55-864f-4f7b9fa7da1f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"6fcf5a42-93f9-4eb8-a8a3-0dd428209c8c","timestamp":1749194527795,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9b2edd89-443a-4f01-adc4-e349491f359e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"50107542-8cb3-499c-a940-73e25f684bf7","timestamp":1749194530165,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9b2edd89-443a-4f01-adc4-e349491f359e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"50107542-8cb3-499c-a940-73e25f684bf7","timestamp":1749194532199,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ef6db476-159f-4154-9cfa-dbb83d95572f","bid":"a5347350-ea9c-47d4-9226-ff6d80a0ab99","timestamp":1749194558936,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"76fe42cc-8f58-4de3-a0a4-c3223fc11333","bid":"64eb851a-2aef-4b85-9ede-496bc8a22bcf","timestamp":1749194558938,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"1cdea3df-ff59-451e-ac92-d43321d12959","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bb67f204-521a-40a7-aa7d-affb2c7d37c1","timestamp":1749194560903,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ca86ddfe-4ef9-4594-bf06-0bcf0dbb9e67","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"70e6f599-a56c-44e6-bdc3-9b3b13178c92","timestamp":1749194560915,"gateway":"8UUXN4P00A06NK"} + +{"bid":"94a3ecb8-84e5-4677-9566-e78bc2897e27","data":{"dongle_infos":[]},"tid":"1a800d8e-c1c4-4661-bf46-5aa65e76b6b9","timestamp":1749194561089,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f0e8c6df-4e6d-44e4-9c3c-cb5423fbf170","data":{"firmware_version":"13.01.0002"},"tid":"cdf434f5-2946-4771-bc1f-60582910e792","timestamp":1749194561095,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4b05bcad-3c62-4b7b-b867-db6bb39e6e6f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7dea4350-7865-4621-9685-79dea325a440","timestamp":1749194561322,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aba85687-a2ac-4535-a9f6-d361167a5313","data":{"mobility_status_notify":0},"need_reply":1,"tid":"8413f5ab-186b-4504-8707-76db3a88fe08","timestamp":1749194561364,"gateway":"8UUXN4P00A06NK"} + +{"tid":"3ec668e3-f182-487a-aae8-b8e5f1cbb24f","bid":"64dd9879-5ab9-4d0a-98dc-43461d29c321","timestamp":1749194561812,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"b267d502-5869-40bd-a935-9003a6a1dadf","data":{"dongle_infos":[]},"tid":"f4bee07b-92ec-4ca0-8e7b-a9803778f179","timestamp":1749194562097,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1cdea3df-ff59-451e-ac92-d43321d12959","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bb67f204-521a-40a7-aa7d-affb2c7d37c1","timestamp":1749194563034,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ca86ddfe-4ef9-4594-bf06-0bcf0dbb9e67","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"70e6f599-a56c-44e6-bdc3-9b3b13178c92","timestamp":1749194563035,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aba85687-a2ac-4535-a9f6-d361167a5313","data":{"mobility_status_notify":0},"need_reply":1,"tid":"8413f5ab-186b-4504-8707-76db3a88fe08","timestamp":1749194563432,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ad54ecc3-0d01-4f09-b836-58aed2ed3690","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b897868d-e327-4c3e-b8c1-669e94626134","timestamp":1749194563934,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f90ba0bf-1bca-4fe5-868c-637e72ddfa56","data":{"dongle_infos":[]},"tid":"1770e114-77a4-4bf6-a49b-bf83df91da47","timestamp":1749194565104,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4b05bcad-3c62-4b7b-b867-db6bb39e6e6f","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7dea4350-7865-4621-9685-79dea325a440","timestamp":1749194565521,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aaa31662-4713-4186-9d06-330a648c2877","data":{"departure_trajectory":[]},"tid":"ad4db28c-9304-4541-9574-139f13328605","timestamp":1749194565716,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ea790e21-9bac-4158-9886-e23a8dd9fa0c","bid":"442a2bc3-adbb-4b2b-8067-4748abff47ed","timestamp":1749194592423,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"cbe21c4f-94c8-4982-975c-4b253e9ffc4e","bid":"cf584ce1-9269-4c54-af2c-6f932a8b219b","timestamp":1749194592425,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"061bd321-0b8d-41b5-af0d-c3e0fa6250b8","data":{"mobility_status_notify":0},"need_reply":1,"tid":"747eb966-4bc8-498c-b1f8-70dbb364e9c7","timestamp":1749194593564,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0a244260-ecf4-4749-b0d6-3de809ddd6ba","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"fc9462bf-0099-45c1-a2bf-1baa11ce2774","timestamp":1749194593566,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c5acfdc7-835c-4a04-ae70-e14ce33d4ee7","data":{"dongle_infos":[]},"tid":"033e03db-18cf-4106-843b-5f62db3c6f66","timestamp":1749194593937,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f3e380c0-a377-4878-a95a-f4eaa676b2e9","data":{"firmware_version":"13.01.0002"},"tid":"3508e98f-9c2e-498d-bcb1-1710e1feb051","timestamp":1749194593945,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ca5c3448-b1f4-4f68-973c-e5a1015ec8cc","data":{"air_transfer_enable":false},"need_reply":1,"tid":"96e258df-7f72-483d-a1df-ff3090624b26","timestamp":1749194594130,"gateway":"8UUXN4P00A06NK"} + +{"bid":"127a0f20-4e49-450a-a455-a23b0cc03dbb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"aef8353f-90a1-4230-991c-b32a1b6906a3","timestamp":1749194594156,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d68e72bb-3923-4def-956f-b861208e1fdd","bid":"f02cc768-61b9-43da-84d0-ea1eacff9ce4","timestamp":1749194594664,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"78e9fe8c-4779-4d0c-a68c-32aa6d0b8fa1","data":{"dongle_infos":[]},"tid":"5d293473-f8e1-4e95-993f-03b7a7dab4a8","timestamp":1749194594956,"gateway":"8UUXN4P00A06NK"} + +{"bid":"061bd321-0b8d-41b5-af0d-c3e0fa6250b8","data":{"mobility_status_notify":0},"need_reply":1,"tid":"747eb966-4bc8-498c-b1f8-70dbb364e9c7","timestamp":1749194595584,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0a244260-ecf4-4749-b0d6-3de809ddd6ba","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"fc9462bf-0099-45c1-a2bf-1baa11ce2774","timestamp":1749194595585,"gateway":"8UUXN4P00A06NK"} + +{"bid":"127a0f20-4e49-450a-a455-a23b0cc03dbb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"aef8353f-90a1-4230-991c-b32a1b6906a3","timestamp":1749194596183,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f0efa3f0-380d-4078-8d37-0d8042e40239","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e9d5cc6c-07d6-4b81-91cb-6b662e4e64f3","timestamp":1749194597427,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c1337127-5057-4aa7-81ee-e87bbce9acff","data":{"dongle_infos":[]},"tid":"c50045aa-ed45-473e-a890-c1c3e4573781","timestamp":1749194598185,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ca5c3448-b1f4-4f68-973c-e5a1015ec8cc","data":{"air_transfer_enable":false},"need_reply":1,"tid":"96e258df-7f72-483d-a1df-ff3090624b26","timestamp":1749194598330,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cf9ab2ec-ea0a-4eab-ab04-f95aca5d8906","data":{"departure_trajectory":[]},"tid":"0693627f-74ff-41fb-ac90-e3c5a35d26cb","timestamp":1749194598933,"gateway":"8UUXN4P00A06NK"} + +{"bid":"86b1dffd-4e6b-40fa-9dde-3e9e9865ea04","data":{"departure_trajectory":[]},"tid":"212b5d9d-1d22-45cd-b54b-a193f91d83d7","timestamp":1749194599057,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f0efa3f0-380d-4078-8d37-0d8042e40239","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e9d5cc6c-07d6-4b81-91cb-6b662e4e64f3","timestamp":1749194599586,"gateway":"8UUXN4P00A06NK"} + +{"bid":"061bd321-0b8d-41b5-af0d-c3e0fa6250b8","data":{"mobility_status_notify":0},"need_reply":1,"tid":"747eb966-4bc8-498c-b1f8-70dbb364e9c7","timestamp":1749194599786,"gateway":"8UUXN4P00A06NK"} + +{"bid":"127a0f20-4e49-450a-a455-a23b0cc03dbb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"aef8353f-90a1-4230-991c-b32a1b6906a3","timestamp":1749194600384,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f6240403-9d41-4305-829f-19c271836f3f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"abeaef46-1988-4aa1-8ff7-7de7fc2e612c","timestamp":1749194602426,"gateway":"8UUXN4P00A06NK"} + +{"tid":"57b47316-87fc-4073-b37b-3ebce64d1199","bid":"8967f6d7-b597-4cf6-85f7-df0276913f94","timestamp":1749194630192,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"22434f2d-7042-43c7-87ac-ffddc31f9659","bid":"784072ff-b961-4ea4-884d-423c0ac5564b","timestamp":1749194630198,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f8ffd6ca-fec9-4fb6-8bb4-b6a3ef7f7618","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d985f21f-7879-43b7-9d2d-ed4bf6295a05","timestamp":1749194631529,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bb3239b6-2e42-4919-a347-352f6f15bbb7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d43bafc2-00c0-4b26-b317-f67a5c546b52","timestamp":1749194631832,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1693a939-9c8a-417e-b71e-25a04fa785b4","data":{"dongle_infos":[]},"tid":"132aa4ba-c662-4dd9-b7ee-aeb1bc38b9fd","timestamp":1749194631967,"gateway":"8UUXN4P00A06NK"} + +{"bid":"99ed975c-d84d-45a7-9a86-0f626d889f33","data":{"firmware_version":"13.01.0002"},"tid":"d0f18117-eac6-4ac9-b773-f7fa05cb8f94","timestamp":1749194631974,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9223344e-5ed7-499a-9145-77b00cfc680d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"73ffcd06-b153-4abe-ae0d-51893a93e2e6","timestamp":1749194632131,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e4eba4b3-8930-4264-a1aa-64ff1ca4b608","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d3a69a4c-700b-48bd-a09a-f50428fd26d5","timestamp":1749194632162,"gateway":"8UUXN4P00A06NK"} + +{"tid":"22d94dca-f7fd-42d5-9c32-1fa47ce90f21","bid":"569a3cc5-f565-48a5-bb05-b89ac307ee8e","timestamp":1749194632375,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"294c272f-6964-4fcb-846a-8aca5d08ed51","data":{"dongle_infos":[]},"tid":"df16ecfd-24a3-4393-9d79-f9424ac8ce62","timestamp":1749194632970,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f8ffd6ca-fec9-4fb6-8bb4-b6a3ef7f7618","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d985f21f-7879-43b7-9d2d-ed4bf6295a05","timestamp":1749194633682,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bb3239b6-2e42-4919-a347-352f6f15bbb7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d43bafc2-00c0-4b26-b317-f67a5c546b52","timestamp":1749194633881,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9223344e-5ed7-499a-9145-77b00cfc680d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"73ffcd06-b153-4abe-ae0d-51893a93e2e6","timestamp":1749194634286,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ee9873f7-1dad-43ea-8228-fb166aac032b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6a9be6a8-5cac-45d8-9c2e-735c195f5dd9","timestamp":1749194635199,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e4eba4b3-8930-4264-a1aa-64ff1ca4b608","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d3a69a4c-700b-48bd-a09a-f50428fd26d5","timestamp":1749194636363,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bdd70185-f2a6-420c-a9d1-1a3b966a11e4","data":{"departure_trajectory":[]},"tid":"a834f809-5664-463e-b1f4-307cb1bfd665","timestamp":1749194636931,"gateway":"8UUXN4P00A06NK"} + +{"bid":"21baa4e0-8219-498a-890b-65ff4b60072b","data":{"departure_trajectory":[]},"tid":"088a578b-0cfb-410e-be57-9df0e591df5e","timestamp":1749194636960,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ee9873f7-1dad-43ea-8228-fb166aac032b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6a9be6a8-5cac-45d8-9c2e-735c195f5dd9","timestamp":1749194637284,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3cd7a4ec-644e-4c3c-a9ff-9589200963e2","data":{"dongle_infos":[]},"tid":"3efa2135-2c08-4c3e-b317-b8832ca1ffd8","timestamp":1749194637302,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f8ffd6ca-fec9-4fb6-8bb4-b6a3ef7f7618","data":{"mobility_status_notify":0},"need_reply":1,"tid":"d985f21f-7879-43b7-9d2d-ed4bf6295a05","timestamp":1749194637881,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9223344e-5ed7-499a-9145-77b00cfc680d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"73ffcd06-b153-4abe-ae0d-51893a93e2e6","timestamp":1749194638485,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0a8a05a6-35aa-40c8-a46b-7bc55ca89761","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5bd2166f-c1b0-41e8-971a-08a02c03dad8","timestamp":1749194640202,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0a8a05a6-35aa-40c8-a46b-7bc55ca89761","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"5bd2166f-c1b0-41e8-971a-08a02c03dad8","timestamp":1749194642280,"gateway":"8UUXN4P00A06NK"} + +{"tid":"3e2408d8-02c9-4fda-abcf-ad2c7a7461d1","bid":"282f070b-2f2d-42b3-8060-d2219a569909","timestamp":1749194668876,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"a17bd2f8-f3c6-4c34-be61-558e392c4f90","bid":"ee18dd0d-c56e-4b70-91ad-1cfa7a4be57f","timestamp":1749194668879,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"488a499b-3c80-490d-80a8-188235d4b90b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"064e6bb0-b898-4793-9b9a-3d4598ea3687","timestamp":1749194671002,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c4017d6b-812b-42d4-87dc-b97216d650b1","data":{"dongle_infos":[]},"tid":"47f13e68-7b20-4bb5-9939-4fc732a33f6f","timestamp":1749194671021,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ecacdb1f-ff34-4c12-bf8c-eee2e5f3b12d","data":{"firmware_version":"13.01.0002"},"tid":"0ab8384c-8f5f-4d3f-b6f1-196a814ecd27","timestamp":1749194671028,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e66c4e4b-2c3a-4cba-b35e-45f06316ec57","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c0ea0027-0c1a-420a-9668-055a09378148","timestamp":1749194671047,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c64853d0-2247-4b89-8fbf-d7982e68c799","data":{"air_transfer_enable":false},"need_reply":1,"tid":"26455190-283a-4120-b494-d7063fcc651e","timestamp":1749194671220,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f12c24d2-944f-40d1-8baa-c57f51265ea7","data":{"mobility_status_notify":0},"need_reply":1,"tid":"138ada19-4896-4209-8cdb-0af2efbf7c47","timestamp":1749194671487,"gateway":"8UUXN4P00A06NK"} + +{"tid":"78fa4bef-57f9-4eef-88b8-c947c2839e2b","bid":"443dba39-0adc-45b8-bffd-f1a1802e20a8","timestamp":1749194671979,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"d22eaf95-f771-467a-ba08-854af8be1058","data":{"dongle_infos":[]},"tid":"6d7f6276-6113-45cd-90fd-0517a85e4118","timestamp":1749194672027,"gateway":"8UUXN4P00A06NK"} + +{"bid":"488a499b-3c80-490d-80a8-188235d4b90b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"064e6bb0-b898-4793-9b9a-3d4598ea3687","timestamp":1749194673021,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e66c4e4b-2c3a-4cba-b35e-45f06316ec57","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c0ea0027-0c1a-420a-9668-055a09378148","timestamp":1749194673223,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f12c24d2-944f-40d1-8baa-c57f51265ea7","data":{"mobility_status_notify":0},"need_reply":1,"tid":"138ada19-4896-4209-8cdb-0af2efbf7c47","timestamp":1749194673624,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d8b9096e-39dc-4d8d-a294-e306c071ade2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7d4e47f3-e1f6-4352-8a7e-10ed02bc7541","timestamp":1749194673875,"gateway":"8UUXN4P00A06NK"} + +{"bid":"481f074c-5dfa-4456-9370-ac9235fb18d1","data":{"dongle_infos":[]},"tid":"b90ee6e4-44f0-4a83-9271-4e6be2684d9d","timestamp":1749194675193,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c64853d0-2247-4b89-8fbf-d7982e68c799","data":{"air_transfer_enable":false},"need_reply":1,"tid":"26455190-283a-4120-b494-d7063fcc651e","timestamp":1749194675416,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ec3d0f96-b883-4791-ab30-d973edf56eca","bid":"3cb8577b-f7b2-4c88-914c-10726af97368","timestamp":1749194702013,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"aef86446-63cb-4175-832f-18f0c85bea65","bid":"3568592d-e328-443c-b5a9-a348161eeff3","timestamp":1749194702023,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"75146214-afa2-420a-a625-5b65876fdc5f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a01d5c46-4468-4ca9-b0d1-d2ddcc01b68a","timestamp":1749194703501,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9d2f8172-b983-495f-b969-9da152338e40","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"42bac97e-f6df-4b19-be42-386f75189f19","timestamp":1749194703567,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b9a2d1e1-bc3b-454f-af2e-6e24c28b9648","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d603e623-9b9b-427c-8dd3-7b5cb721d1be","timestamp":1749194703806,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6ee11e5c-1c6f-43b5-bbce-b701cfb6aaed","data":{"dongle_infos":[]},"tid":"6edbdad6-b151-43cb-b55b-ca7c9d458e7b","timestamp":1749194703814,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fb821608-5e84-457a-8871-08f35a33866c","data":{"firmware_version":"13.01.0002"},"tid":"2737e962-0167-46fb-8de6-9cfb55017c84","timestamp":1749194703820,"gateway":"8UUXN4P00A06NK"} + +{"bid":"15081c49-9c1f-467f-ab79-3353ff9d8c38","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1b553574-3252-44fa-9994-d0f74cf8e8f9","timestamp":1749194704095,"gateway":"8UUXN4P00A06NK"} + +{"tid":"9958cb3d-7016-465d-9823-6113b3880527","bid":"3ed88ba1-73a8-40cb-b57d-3e3b1cc8b445","timestamp":1749194704266,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"4ccf6288-2c88-4fe0-9634-f09b296bfab7","data":{"dongle_infos":[]},"tid":"6200d105-27df-49bb-a3e8-b6844a3ccb00","timestamp":1749194704857,"gateway":"8UUXN4P00A06NK"} + +{"bid":"75146214-afa2-420a-a625-5b65876fdc5f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a01d5c46-4468-4ca9-b0d1-d2ddcc01b68a","timestamp":1749194705505,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9d2f8172-b983-495f-b969-9da152338e40","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"42bac97e-f6df-4b19-be42-386f75189f19","timestamp":1749194705702,"gateway":"8UUXN4P00A06NK"} + +{"bid":"15081c49-9c1f-467f-ab79-3353ff9d8c38","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1b553574-3252-44fa-9994-d0f74cf8e8f9","timestamp":1749194706101,"gateway":"8UUXN4P00A06NK"} + +{"bid":"57607397-38f6-482c-aff1-8bef5b885017","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b5e50100-9fb9-4205-937a-db47a1a924d8","timestamp":1749194707015,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c2d09ec1-3d76-4581-9ee2-02a4ccdb1ef3","data":{"dongle_infos":[]},"tid":"b36c7c50-dc07-489b-af92-200564a19499","timestamp":1749194707247,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b9a2d1e1-bc3b-454f-af2e-6e24c28b9648","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d603e623-9b9b-427c-8dd3-7b5cb721d1be","timestamp":1749194708011,"gateway":"8UUXN4P00A06NK"} + +{"bid":"89b71f32-73b7-4d64-ab24-f633fa1bf76e","data":{"departure_trajectory":[]},"tid":"921cc227-a67d-4b28-a9ab-9c3a9ce3a3a2","timestamp":1749194708697,"gateway":"8UUXN4P00A06NK"} + +{"bid":"50208150-de21-4243-ba91-5b5d1a9d7dcb","data":{"departure_trajectory":[]},"tid":"584ab25e-cf83-4f98-aa12-1516996afb54","timestamp":1749194708804,"gateway":"8UUXN4P00A06NK"} + +{"bid":"57607397-38f6-482c-aff1-8bef5b885017","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b5e50100-9fb9-4205-937a-db47a1a924d8","timestamp":1749194709106,"gateway":"8UUXN4P00A06NK"} + +{"bid":"75146214-afa2-420a-a625-5b65876fdc5f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a01d5c46-4468-4ca9-b0d1-d2ddcc01b68a","timestamp":1749194709705,"gateway":"8UUXN4P00A06NK"} + +{"bid":"15081c49-9c1f-467f-ab79-3353ff9d8c38","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1b553574-3252-44fa-9994-d0f74cf8e8f9","timestamp":1749194710305,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d8fb26d6-0fc4-489f-8a77-5d2106403a28","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f6d889f0-3695-4c84-b437-41551d5bcfb2","timestamp":1749194712015,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d8fb26d6-0fc4-489f-8a77-5d2106403a28","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f6d889f0-3695-4c84-b437-41551d5bcfb2","timestamp":1749194714101,"gateway":"8UUXN4P00A06NK"} + +{"tid":"259f6fe3-f3a5-41eb-b970-bf0ebf8df353","bid":"4f8f0071-e913-45dc-98fb-a8851e7b23b2","timestamp":1749194741665,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"31c2e69d-39f8-472e-8ab9-60ea0ae0e0fe","bid":"9081122f-f3c0-403b-b11c-4148374aaa06","timestamp":1749194741668,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f4fb26ee-e9f0-4877-828b-a6dc9a84cac0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0d04eec1-21bc-4ecd-90a9-1a3c9fa26822","timestamp":1749194742064,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3beffd53-dab1-4567-97d1-31fdce4f0980","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a340b57a-23de-4527-aaca-e1a47d9bf6ea","timestamp":1749194742068,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ae5e24e7-7d0f-483c-9672-fdd34d497754","data":{"mobility_status_notify":0},"need_reply":1,"tid":"4c14b855-6450-404b-b250-362f621fa16b","timestamp":1749194742435,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c6fa2b2a-538e-4e12-b021-ac2b4ecf6951","data":{"dongle_infos":[]},"tid":"444a6c29-3f3f-451e-9cfc-b87802aa6d49","timestamp":1749194742516,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df20a77a-8c80-4ebc-83ec-0cab00985c65","data":{"firmware_version":"13.01.0002"},"tid":"8dd13d2e-e27d-456f-b852-dbad79cac1cf","timestamp":1749194742524,"gateway":"8UUXN4P00A06NK"} + +{"bid":"32716ce1-ff79-490f-a670-a35fa1304363","data":{"air_transfer_enable":false},"need_reply":1,"tid":"fada57d8-f9c5-4217-9fc9-8713e70f661b","timestamp":1749194742710,"gateway":"8UUXN4P00A06NK"} + +{"tid":"4c0e53f8-54ae-45ed-8f9b-3da681ba8196","bid":"44a4aeb3-1725-4355-87ee-8c3062f8834e","timestamp":1749194743195,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"615572fa-0c9f-40ea-a57b-9daf36a19f5d","data":{"dongle_infos":[]},"tid":"10a89f22-0f5d-44b9-b37d-0a41ec52924a","timestamp":1749194743519,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3beffd53-dab1-4567-97d1-31fdce4f0980","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a340b57a-23de-4527-aaca-e1a47d9bf6ea","timestamp":1749194744092,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f4fb26ee-e9f0-4877-828b-a6dc9a84cac0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0d04eec1-21bc-4ecd-90a9-1a3c9fa26822","timestamp":1749194744093,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ae5e24e7-7d0f-483c-9672-fdd34d497754","data":{"mobility_status_notify":0},"need_reply":1,"tid":"4c14b855-6450-404b-b250-362f621fa16b","timestamp":1749194744492,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2241e48c-c3d2-46e0-92a5-76d3a1218331","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6b3cc93f-9334-485b-9c11-fd1f92ffa3e2","timestamp":1749194746662,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5724e750-6216-41ab-8252-1f443953dd93","data":{"dongle_infos":[]},"tid":"f8a43fe1-e6d7-43bf-83c0-daa833cf13c9","timestamp":1749194746784,"gateway":"8UUXN4P00A06NK"} + +{"bid":"32716ce1-ff79-490f-a670-a35fa1304363","data":{"air_transfer_enable":false},"need_reply":1,"tid":"fada57d8-f9c5-4217-9fc9-8713e70f661b","timestamp":1749194746907,"gateway":"8UUXN4P00A06NK"} + +{"bid":"363648d8-bddb-434a-adbf-6c427f00a129","data":{"departure_trajectory":[]},"tid":"73dfbcb0-8abe-4d22-b1bf-460a6379d8b4","timestamp":1749194747509,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3beffd53-dab1-4567-97d1-31fdce4f0980","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a340b57a-23de-4527-aaca-e1a47d9bf6ea","timestamp":1749194748293,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f8d48857-fde4-4ad9-b86a-d4c5e94e37a5","data":{"departure_trajectory":[]},"tid":"3fb0531d-4ea9-4d2d-b137-bdb566fdbded","timestamp":1749194748484,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ae5e24e7-7d0f-483c-9672-fdd34d497754","data":{"mobility_status_notify":0},"need_reply":1,"tid":"4c14b855-6450-404b-b250-362f621fa16b","timestamp":1749194748690,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2241e48c-c3d2-46e0-92a5-76d3a1218331","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6b3cc93f-9334-485b-9c11-fd1f92ffa3e2","timestamp":1749194748691,"gateway":"8UUXN4P00A06NK"} + +{"bid":"14e3a21a-9734-48a2-85c3-e88d9c6c44e8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a6b32977-6bbd-4105-a62c-91a9fba8507e","timestamp":1749194751667,"gateway":"8UUXN4P00A06NK"} + +{"bid":"14e3a21a-9734-48a2-85c3-e88d9c6c44e8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a6b32977-6bbd-4105-a62c-91a9fba8507e","timestamp":1749194753690,"gateway":"8UUXN4P00A06NK"} + +{"tid":"a8c8db0c-d4b6-4034-9065-a3907434d0bc","bid":"7f0876e6-f419-47e2-b2e6-5068f13b2674","timestamp":1749194779731,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"22b16d32-095b-46ce-9ffa-39f27fa3de36","bid":"451d7377-cae6-4f5d-bcc5-3db39f700a63","timestamp":1749194779734,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"476de92d-e1c6-4fb1-ad27-fb2e4cb2cf7b","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7d9a7bdc-74c3-4be7-bc66-6b0b5aae360b","timestamp":1749194780954,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c848ca22-6bc6-4297-99c8-6af5286d3394","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8ec52924-5b08-4de0-9b11-50c8d3485c27","timestamp":1749194781009,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3940fce4-b5cd-41a6-b7c6-eb8f8a92284e","data":{"dongle_infos":[]},"tid":"3eb1def8-e73b-468c-a8ab-1784fb9f5e86","timestamp":1749194781311,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6e2da7b2-971d-429e-9506-03aa387dc1cf","data":{"dongle_infos":[]},"tid":"e07c5d8f-1c63-4ca6-b78f-41ea46c20036","timestamp":1749194781319,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a5a24c15-78df-428b-a61d-0e719146c2c5","data":{"firmware_version":"13.01.0002"},"tid":"4b7d0572-cdbc-4d2f-a765-84180258fa0c","timestamp":1749194781325,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c8cbc98-c769-4bfd-a42d-b599475fef44","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2a22e01c-f966-4f4a-afd8-6125f6dedbd9","timestamp":1749194781505,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9770f431-0ee1-4520-ac39-02cf4da30fc0","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"253519ac-a78b-45dd-83f2-b8064a72822b","timestamp":1749194781575,"gateway":"8UUXN4P00A06NK"} + +{"tid":"67e9194b-5cb2-49fa-b68b-41c78ad4d4f7","bid":"62a83606-61cc-4daf-9acd-c47ae2e253aa","timestamp":1749194782257,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"fa84aa89-c6a0-41cb-855c-599dda8ed4da","data":{"dongle_infos":[]},"tid":"3df627b5-9e62-4772-bfcd-ba5b2feb7f35","timestamp":1749194782342,"gateway":"8UUXN4P00A06NK"} + +{"bid":"476de92d-e1c6-4fb1-ad27-fb2e4cb2cf7b","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7d9a7bdc-74c3-4be7-bc66-6b0b5aae360b","timestamp":1749194783080,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c848ca22-6bc6-4297-99c8-6af5286d3394","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8ec52924-5b08-4de0-9b11-50c8d3485c27","timestamp":1749194783081,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9770f431-0ee1-4520-ac39-02cf4da30fc0","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"253519ac-a78b-45dd-83f2-b8064a72822b","timestamp":1749194783685,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d595158b-0b8a-4cae-a393-8b44b14b96e3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6b2bdb29-4537-41b3-af55-8669f9a27a26","timestamp":1749194784730,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c8cbc98-c769-4bfd-a42d-b599475fef44","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2a22e01c-f966-4f4a-afd8-6125f6dedbd9","timestamp":1749194785707,"gateway":"8UUXN4P00A06NK"} + +{"bid":"612bd233-b8e6-4f68-aaf5-a6180f47a654","data":{"departure_trajectory":[]},"tid":"9576dea0-a0fd-4651-8927-5f6095cdd446","timestamp":1749194786304,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d7ebbc7a-a6d8-49a8-b555-53d93f865374","data":{"departure_trajectory":[]},"tid":"789bd68c-f02c-41fe-978d-a3d8f8013ba9","timestamp":1749194786393,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d595158b-0b8a-4cae-a393-8b44b14b96e3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6b2bdb29-4537-41b3-af55-8669f9a27a26","timestamp":1749194786885,"gateway":"8UUXN4P00A06NK"} + +{"bid":"476de92d-e1c6-4fb1-ad27-fb2e4cb2cf7b","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7d9a7bdc-74c3-4be7-bc66-6b0b5aae360b","timestamp":1749194787282,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9770f431-0ee1-4520-ac39-02cf4da30fc0","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"253519ac-a78b-45dd-83f2-b8064a72822b","timestamp":1749194787880,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5d57a866-6c6d-451a-a7e5-d14cb794d7fd","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d3920173-64e1-44e3-ada7-aff10ec087ea","timestamp":1749194789731,"gateway":"8UUXN4P00A06NK"} + +{"tid":"e39e8787-df08-450b-83ec-ee46ff0cc10e","bid":"bb295175-f951-45a0-924e-93dfe216f58a","timestamp":1749194819272,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"6ef98cb8-71cc-4adc-97ea-0fd15a54a6d0","bid":"576b6785-0789-49d4-aa83-e8912dbefd2d","timestamp":1749194819281,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e5e257b-961f-488a-8b82-47dc23c3fd2d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"6bc1ddd2-b71c-4412-985d-d7ca7de8c776","timestamp":1749194820388,"gateway":"8UUXN4P00A06NK"} + +{"bid":"77041456-49a0-4f2e-bc0f-c27e8bc77e56","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1f3013dd-bc2a-4fa4-b2ed-f1605ef52031","timestamp":1749194820538,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d22971c3-8957-4f95-b27c-6aa86a3440a7","data":{"air_transfer_enable":false},"need_reply":1,"tid":"c1bc0039-912a-4022-99c6-ddeecc864353","timestamp":1749194820830,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6b98c214-c247-408d-b1fb-25c5669ef47a","data":{"dongle_infos":[]},"tid":"e3644de4-9f3b-4a31-b05c-414f0c87eaf6","timestamp":1749194820837,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6ba2dbbe-2d81-4fd4-b99e-c05a65381ddd","data":{"firmware_version":"13.01.0002"},"tid":"72d83e31-43ec-4ada-be5a-f02f2a0a82da","timestamp":1749194820849,"gateway":"8UUXN4P00A06NK"} + +{"bid":"435bdbb0-d133-4d87-9f9d-29e708648480","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"de18331c-40a1-4b73-a287-8414b1a9be91","timestamp":1749194820862,"gateway":"8UUXN4P00A06NK"} + +{"tid":"210547ef-a2cb-432f-803d-c65792b7773e","bid":"1e2429a5-12a7-4d42-a80e-1433d590307b","timestamp":1749194821276,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"9c840dad-16be-47a2-afa5-e0bb12639237","data":{"dongle_infos":[]},"tid":"1c6648a3-31cb-47e8-b32a-2f6047ab1cee","timestamp":1749194821844,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e5e257b-961f-488a-8b82-47dc23c3fd2d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"6bc1ddd2-b71c-4412-985d-d7ca7de8c776","timestamp":1749194822440,"gateway":"8UUXN4P00A06NK"} + +{"bid":"77041456-49a0-4f2e-bc0f-c27e8bc77e56","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1f3013dd-bc2a-4fa4-b2ed-f1605ef52031","timestamp":1749194822640,"gateway":"8UUXN4P00A06NK"} + +{"bid":"435bdbb0-d133-4d87-9f9d-29e708648480","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"de18331c-40a1-4b73-a287-8414b1a9be91","timestamp":1749194823040,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0dc0ff2c-2077-41bd-8e03-77b51b64d6ea","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"04a51a11-3f2c-4c41-a181-4c8a8879e626","timestamp":1749194824270,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d22971c3-8957-4f95-b27c-6aa86a3440a7","data":{"air_transfer_enable":false},"need_reply":1,"tid":"c1bc0039-912a-4022-99c6-ddeecc864353","timestamp":1749194825029,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c54c4deb-8217-4471-a3a6-d76a4d921323","data":{"dongle_infos":[]},"tid":"ce11c3c5-4b11-49f9-a03a-1213c16c1511","timestamp":1749194825132,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a174a7ba-2282-43ce-a383-d60b4424ae40","data":{"departure_trajectory":[]},"tid":"984e942b-2924-4c7b-97c5-92bb6c1035a6","timestamp":1749194825835,"gateway":"8UUXN4P00A06NK"} + +{"bid":"45fd4717-bb9d-4aa0-9518-a37f0a4ceb3f","data":{"departure_trajectory":[]},"tid":"8fe862a0-897c-45c8-b513-c95a31050d4e","timestamp":1749194825931,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0dc0ff2c-2077-41bd-8e03-77b51b64d6ea","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"04a51a11-3f2c-4c41-a181-4c8a8879e626","timestamp":1749194826441,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e5e257b-961f-488a-8b82-47dc23c3fd2d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"6bc1ddd2-b71c-4412-985d-d7ca7de8c776","timestamp":1749194826639,"gateway":"8UUXN4P00A06NK"} + +{"bid":"435bdbb0-d133-4d87-9f9d-29e708648480","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"de18331c-40a1-4b73-a287-8414b1a9be91","timestamp":1749194827242,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e32e1376-b9b1-4cdd-a499-0a5a69fcecea","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"da3ca042-acd8-43f2-be43-c2a3b8d03824","timestamp":1749194829269,"gateway":"8UUXN4P00A06NK"} + +{"tid":"bb5131d4-50af-4e85-91d7-1fef23100077","bid":"76160383-1e18-4dec-b950-b93095b796ef","timestamp":1749194858150,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"ef5053f5-c14b-401f-8908-fcd8e0b82691","bid":"d10703b2-e9b7-495b-9c55-fd79950ce5fd","timestamp":1749194858154,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"080490a0-1663-41e6-9d56-c1b166c206aa","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ff199ff9-f322-4e4e-8545-9fc00d414d7d","timestamp":1749194858995,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c563121b-8db4-4ba0-81f3-3bade53ae8a9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"992717eb-2ca3-4d63-9632-71b3bceb4771","timestamp":1749194859170,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b6e62681-1522-4366-8b34-3f7ac3bd9cec","data":{"dongle_infos":[]},"tid":"a68c02bd-e6ae-4b1c-a983-7e214600edda","timestamp":1749194859453,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cf91becd-8e21-40db-a8f0-4aa70a6f4679","data":{"firmware_version":"13.01.0002"},"tid":"269435d8-fa12-449d-93ce-dc98292343f6","timestamp":1749194859460,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c799125c-f1f4-4260-b798-a90db396bb7c","data":{"air_transfer_enable":false},"need_reply":1,"tid":"da941251-1b07-4bf8-9fd0-d453f135869c","timestamp":1749194859461,"gateway":"8UUXN4P00A06NK"} + +{"bid":"848321fd-7db0-49dc-8e73-11d8d7b2f542","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"8f4c6c9c-3e6e-4d98-9abd-da63b2dfd71d","timestamp":1749194859741,"gateway":"8UUXN4P00A06NK"} + +{"tid":"e79da0dc-f9ab-40eb-a521-17fd72d41e83","bid":"6ac7438c-f36f-473d-9e34-a4c03717414d","timestamp":1749194860131,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"d1d199aa-4943-401b-97c3-18b1aa84abde","data":{"dongle_infos":[]},"tid":"cc4915cf-74fa-4068-ab3f-3e8f919a4a7c","timestamp":1749194860490,"gateway":"8UUXN4P00A06NK"} + +{"bid":"080490a0-1663-41e6-9d56-c1b166c206aa","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ff199ff9-f322-4e4e-8545-9fc00d414d7d","timestamp":1749194861095,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c563121b-8db4-4ba0-81f3-3bade53ae8a9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"992717eb-2ca3-4d63-9632-71b3bceb4771","timestamp":1749194861295,"gateway":"8UUXN4P00A06NK"} + +{"bid":"848321fd-7db0-49dc-8e73-11d8d7b2f542","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"8f4c6c9c-3e6e-4d98-9abd-da63b2dfd71d","timestamp":1749194861894,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ac421241-dd73-4cf9-bceb-a39bfc447f0e","data":{"dongle_infos":[]},"tid":"2023206e-becd-4798-ad00-969cb9574c2f","timestamp":1749194863120,"gateway":"8UUXN4P00A06NK"} + +{"bid":"11994f9f-ec83-417b-8d2e-38c89e7442e3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"81773465-be5c-48d9-b3e4-23426fbc1414","timestamp":1749194863148,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c799125c-f1f4-4260-b798-a90db396bb7c","data":{"air_transfer_enable":false},"need_reply":1,"tid":"da941251-1b07-4bf8-9fd0-d453f135869c","timestamp":1749194863664,"gateway":"8UUXN4P00A06NK"} + +{"bid":"26fa3e21-a825-4d5b-a99e-72fbc6781a62","data":{"departure_trajectory":[]},"tid":"c7c442d5-e8ef-4174-915e-5200df46ad97","timestamp":1749194864450,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5c05fbc1-c80b-46fa-8d16-305ed159fa2f","data":{"departure_trajectory":[]},"tid":"266f19fb-1bf7-4932-8311-35d9d029fe28","timestamp":1749194865024,"gateway":"8UUXN4P00A06NK"} + +{"bid":"11994f9f-ec83-417b-8d2e-38c89e7442e3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"81773465-be5c-48d9-b3e4-23426fbc1414","timestamp":1749194865295,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c563121b-8db4-4ba0-81f3-3bade53ae8a9","data":{"mobility_status_notify":0},"need_reply":1,"tid":"992717eb-2ca3-4d63-9632-71b3bceb4771","timestamp":1749194865495,"gateway":"8UUXN4P00A06NK"} + +{"bid":"848321fd-7db0-49dc-8e73-11d8d7b2f542","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"8f4c6c9c-3e6e-4d98-9abd-da63b2dfd71d","timestamp":1749194866094,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f66ad884-6563-4542-8540-062d8567e615","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ee81e2a6-141a-49e3-9efd-523f7f10278e","timestamp":1749194868148,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f66ad884-6563-4542-8540-062d8567e615","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ee81e2a6-141a-49e3-9efd-523f7f10278e","timestamp":1749194870295,"gateway":"8UUXN4P00A06NK"} + +{"tid":"e47d3b44-ab24-49bb-83ba-e16006ed2ad5","bid":"185e8533-f844-4d88-9563-ef9e782a0ad5","timestamp":1749194896945,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"ccab506d-08af-4fcf-a82e-28793c730409","bid":"9c33b5a4-b329-4d3d-9704-ea4b3a83f4aa","timestamp":1749194896947,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"adb2b776-d248-41f5-88b3-3104c756dd29","data":{"mobility_status_notify":0},"need_reply":1,"tid":"497a2d61-c9df-401e-a40b-683a078d45e8","timestamp":1749194898460,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bafac7ed-2e78-4eaf-8615-20d9bcc076b7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"35bf5c5e-cbbe-44fd-b90f-579e1a2bd2db","timestamp":1749194898706,"gateway":"8UUXN4P00A06NK"} + +{"bid":"69076da7-b5f9-44a5-bd5b-ee124be17ded","data":{"dongle_infos":[]},"tid":"71c92f72-8a51-40c4-a258-1ccb8e91ba1a","timestamp":1749194898915,"gateway":"8UUXN4P00A06NK"} + +{"bid":"527a4846-ade0-47e9-8c62-7521b4e08344","data":{"firmware_version":"13.01.0002"},"tid":"17bc03ae-5b8e-4ee0-aae0-549ba171e95d","timestamp":1749194898926,"gateway":"8UUXN4P00A06NK"} + +{"bid":"26e887e2-54a9-4f20-adf8-1a3012e55e99","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"465c573a-46df-465f-ad36-7cc0b3329fb9","timestamp":1749194898977,"gateway":"8UUXN4P00A06NK"} + +{"bid":"424364d8-6426-46a9-8342-cb51162ea0f4","data":{"air_transfer_enable":false},"need_reply":1,"tid":"bb21ec1a-cfba-4ac8-b399-394ae2df8b86","timestamp":1749194899108,"gateway":"8UUXN4P00A06NK"} + +{"tid":"9ce299cd-9838-49a7-accf-a6dacc2aeb74","bid":"3632ec96-58e5-42ac-881a-9ec59a328dea","timestamp":1749194899616,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"8a8884ef-82c4-4028-9fd3-e94b56af6388","data":{"dongle_infos":[]},"tid":"6032f3c0-bc6c-41f2-a43e-5c026b8cef1c","timestamp":1749194899926,"gateway":"8UUXN4P00A06NK"} + +{"bid":"adb2b776-d248-41f5-88b3-3104c756dd29","data":{"mobility_status_notify":0},"need_reply":1,"tid":"497a2d61-c9df-401e-a40b-683a078d45e8","timestamp":1749194900647,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bafac7ed-2e78-4eaf-8615-20d9bcc076b7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"35bf5c5e-cbbe-44fd-b90f-579e1a2bd2db","timestamp":1749194900846,"gateway":"8UUXN4P00A06NK"} + +{"bid":"26e887e2-54a9-4f20-adf8-1a3012e55e99","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"465c573a-46df-465f-ad36-7cc0b3329fb9","timestamp":1749194901045,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3fd74902-1b40-4a1d-bac6-6021d44cde12","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c2507223-1405-4a6b-abd2-1c678a105537","timestamp":1749194901951,"gateway":"8UUXN4P00A06NK"} + +{"bid":"888b7bb4-6820-4e46-97fc-fb9ee2c28aca","data":{"dongle_infos":[]},"tid":"74ab2184-ed85-454f-b0c6-353fd9083216","timestamp":1749194902507,"gateway":"8UUXN4P00A06NK"} + +{"bid":"424364d8-6426-46a9-8342-cb51162ea0f4","data":{"air_transfer_enable":false},"need_reply":1,"tid":"bb21ec1a-cfba-4ac8-b399-394ae2df8b86","timestamp":1749194903302,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a2a7eff8-02f1-45a8-ac07-06cdf0d06bbb","data":{"departure_trajectory":[]},"tid":"6c49ae0d-9632-4916-a5a8-8457a3f34183","timestamp":1749194903677,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3702c4c7-ad90-4f2b-a2dd-556512c540dc","data":{"departure_trajectory":[]},"tid":"21610c5b-d6d9-4680-955a-4030a5210535","timestamp":1749194903904,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3fd74902-1b40-4a1d-bac6-6021d44cde12","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c2507223-1405-4a6b-abd2-1c678a105537","timestamp":1749194904049,"gateway":"8UUXN4P00A06NK"} + +{"bid":"adb2b776-d248-41f5-88b3-3104c756dd29","data":{"mobility_status_notify":0},"need_reply":1,"tid":"497a2d61-c9df-401e-a40b-683a078d45e8","timestamp":1749194904844,"gateway":"8UUXN4P00A06NK"} + +{"bid":"26e887e2-54a9-4f20-adf8-1a3012e55e99","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"465c573a-46df-465f-ad36-7cc0b3329fb9","timestamp":1749194905241,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cebd8823-e105-4105-87ec-1e9a30791329","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"631b1655-5ace-4e50-a58f-487c0057a4ad","timestamp":1749194906951,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cebd8823-e105-4105-87ec-1e9a30791329","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"631b1655-5ace-4e50-a58f-487c0057a4ad","timestamp":1749194909050,"gateway":"8UUXN4P00A06NK"} + +{"tid":"57699f9a-70c0-41bb-bf84-35bfc68793f7","bid":"cbe23395-9ac7-4b41-a1d4-397d4e7960a6","timestamp":1749194934493,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"dfd7ec1d-1264-4259-a228-564376630ae8","bid":"dd3457cd-023c-4c88-983f-6dcc984a7392","timestamp":1749194934496,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"cf6e31e0-c931-462a-b768-855d24c92a23","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3b6e4d98-fdd7-4c8c-a423-211f4df6c821","timestamp":1749194936256,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d3fc53df-d2c6-4828-8b5b-65f70b08782a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ffafb237-69bd-49f9-850c-c3f5a07e3ef9","timestamp":1749194936262,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6e7aea8c-dfb6-4431-9055-e0086a1c869b","data":{"dongle_infos":[]},"tid":"14c3e22c-6136-4395-9dd6-ee67a2ba02a9","timestamp":1749194936656,"gateway":"8UUXN4P00A06NK"} + +{"bid":"063488ef-f1e8-4860-89bd-dee8e5680581","data":{"firmware_version":"13.01.0002"},"tid":"66ad940a-f6bf-48ab-a582-64dc30ce08af","timestamp":1749194936662,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d3a98f17-d674-409f-a013-2b4839553af3","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"fcb27a54-3d06-49f6-87d3-f880ffc81106","timestamp":1749194936746,"gateway":"8UUXN4P00A06NK"} + +{"bid":"89f22b66-69c2-4a05-a30a-929d9886c3f3","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8f48d524-f2c8-4676-bad9-bd433c1d1e06","timestamp":1749194936847,"gateway":"8UUXN4P00A06NK"} + +{"bid":"457a8482-6e83-432c-b3e4-15bb17f83210","data":{"dongle_infos":[]},"tid":"ce735a45-6b62-4d5a-a097-ab601e3bd5f4","timestamp":1749194937700,"gateway":"8UUXN4P00A06NK"} + +{"tid":"a4820a6d-b695-432f-9f47-dab746caefef","bid":"5738c1de-7997-4022-81f2-1dfadcc3429a","timestamp":1749194937821,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"cf6e31e0-c931-462a-b768-855d24c92a23","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3b6e4d98-fdd7-4c8c-a423-211f4df6c821","timestamp":1749194938312,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d3fc53df-d2c6-4828-8b5b-65f70b08782a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ffafb237-69bd-49f9-850c-c3f5a07e3ef9","timestamp":1749194938313,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d3a98f17-d674-409f-a013-2b4839553af3","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"fcb27a54-3d06-49f6-87d3-f880ffc81106","timestamp":1749194938913,"gateway":"8UUXN4P00A06NK"} + +{"bid":"059b30a8-be64-49ec-9e00-d4fd633eab98","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e420b342-7ddb-454b-9afc-4a14b512cf40","timestamp":1749194939494,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3ca596ae-27e1-4a0e-80f0-3d8863c8f16e","data":{"dongle_infos":[]},"tid":"ba232321-6d4c-419a-be1b-77c8f69db3a6","timestamp":1749194940098,"gateway":"8UUXN4P00A06NK"} + +{"bid":"89f22b66-69c2-4a05-a30a-929d9886c3f3","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8f48d524-f2c8-4676-bad9-bd433c1d1e06","timestamp":1749194941046,"gateway":"8UUXN4P00A06NK"} + +{"tid":"e11e282d-81f7-4f09-84f6-9a8f5f799d95","bid":"caeb4188-8e06-4ff9-bd3c-3ded924e9178","timestamp":1749194967988,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"7c5d848a-faf3-4cc8-9a64-44f705efcb59","bid":"06b7a10d-a2a9-4132-b0ba-10484fd7f044","timestamp":1749194967993,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"0f5cf636-8ac0-44af-90c7-3a42b488f0d2","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7e68120c-ec8a-49c2-aeac-fe84fb24aeb9","timestamp":1749194969527,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ac9efb19-0671-479c-a7b3-bccd08f8a428","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f5b02d30-d653-4f08-bf4f-aa1c61d2fa58","timestamp":1749194969654,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e85c90c8-c491-4e94-9270-4a91cf6eeb7f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5dd26c8d-8457-49eb-8705-39bb471b5086","timestamp":1749194969954,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0f145757-8800-4e1f-a0c6-26043758e2dc","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d0544638-ab1b-4964-af1f-a0fa4f20cce5","timestamp":1749194969958,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1fcee08a-c6ec-4dd2-a686-7af27f1be346","data":{"dongle_infos":[]},"tid":"239498d7-3f8e-462a-8073-02e53e4549f3","timestamp":1749194969971,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e3aefc1e-aa6a-496f-bc04-3e3b4073b18c","data":{"firmware_version":"13.01.0002"},"tid":"a756e2ca-9c11-4a02-b37b-daf3fdd2ae12","timestamp":1749194969985,"gateway":"8UUXN4P00A06NK"} + +{"tid":"3c4de03e-44a1-4656-a756-b7d5f625cf59","bid":"365a08c1-c054-4e8a-a72c-87095184b5c4","timestamp":1749194970484,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"7e860fe1-731d-4e04-9360-b27e60cb5b67","data":{"dongle_infos":[]},"tid":"c9ef61b4-093d-48f8-a180-bbb3dd2c1c42","timestamp":1749194971010,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0f5cf636-8ac0-44af-90c7-3a42b488f0d2","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7e68120c-ec8a-49c2-aeac-fe84fb24aeb9","timestamp":1749194971654,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ac9efb19-0671-479c-a7b3-bccd08f8a428","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f5b02d30-d653-4f08-bf4f-aa1c61d2fa58","timestamp":1749194971851,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e85c90c8-c491-4e94-9270-4a91cf6eeb7f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5dd26c8d-8457-49eb-8705-39bb471b5086","timestamp":1749194972053,"gateway":"8UUXN4P00A06NK"} + +{"bid":"45706493-5d6b-45f2-919f-e5819138ff54","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"17798d98-4744-47a1-a951-889a44b04ecc","timestamp":1749194972994,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5bc10c05-f992-4072-ba4d-26f3188cd698","data":{"dongle_infos":[]},"tid":"ae1d3d60-efcb-435d-938c-0e5af914f1d1","timestamp":1749194973634,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0f145757-8800-4e1f-a0c6-26043758e2dc","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d0544638-ab1b-4964-af1f-a0fa4f20cce5","timestamp":1749194974156,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a83646d7-57fd-403f-a350-772a4c086e88","data":{"departure_trajectory":[]},"tid":"946e5ee3-671f-4fa8-b6f3-282a44ec4ff5","timestamp":1749194974681,"gateway":"8UUXN4P00A06NK"} + +{"bid":"55955def-fe54-4689-a4eb-7938d9dccef5","data":{"departure_trajectory":[]},"tid":"bb43ed54-81e4-448c-9c88-f8e73ca05dbb","timestamp":1749194974970,"gateway":"8UUXN4P00A06NK"} + +{"bid":"45706493-5d6b-45f2-919f-e5819138ff54","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"17798d98-4744-47a1-a951-889a44b04ecc","timestamp":1749194975052,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0f5cf636-8ac0-44af-90c7-3a42b488f0d2","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7e68120c-ec8a-49c2-aeac-fe84fb24aeb9","timestamp":1749194975854,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e85c90c8-c491-4e94-9270-4a91cf6eeb7f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5dd26c8d-8457-49eb-8705-39bb471b5086","timestamp":1749194976252,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4d47ec60-f13c-4d6c-b365-69ed1861f1e8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6522c224-4768-4f4e-8ff0-935be32858a2","timestamp":1749194977990,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4d47ec60-f13c-4d6c-b365-69ed1861f1e8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6522c224-4768-4f4e-8ff0-935be32858a2","timestamp":1749194980057,"gateway":"8UUXN4P00A06NK"} + +{"tid":"8e5f3beb-ec9a-410f-a087-4f7c9e55d28a","bid":"edf31d1c-5ccd-43d2-81f6-b72de1e07a85","timestamp":1749195006729,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"482ff46e-47c8-4b6a-b64a-7f44e5e8ee58","bid":"74e405b1-40c2-40a2-aadc-8afad5c04967","timestamp":1749195006733,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f4327d1d-8fb3-4316-8861-82a1cd397ebd","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f8902149-ab10-4364-8ce6-f9b60648c866","timestamp":1749195007647,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a03361fd-8bde-4739-ae1d-c27ba286805f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"cfc4874c-70bb-4692-8253-c9e31b7ca0ae","timestamp":1749195007814,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d0524db8-ab60-482e-8b0a-5289045930b2","data":{"air_transfer_enable":false},"need_reply":1,"tid":"0da248a1-b5b2-4c99-ad4a-523c094ec143","timestamp":1749195008035,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fc043874-7825-40bc-a7dc-c8c7038c86c5","data":{"dongle_infos":[]},"tid":"454f4c81-8a1a-4dc0-b542-3c5793f7467f","timestamp":1749195008041,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6d9a052b-1f9b-4837-ab9e-c249dc66e617","data":{"dongle_infos":[]},"tid":"fcdc6794-fbf5-4ebf-aeea-56ca2b6c7aa3","timestamp":1749195008042,"gateway":"8UUXN4P00A06NK"} + +{"bid":"17320492-6914-43ca-ab29-364655ac4400","data":{"firmware_version":"13.01.0002"},"tid":"ef1732db-a0ba-42b6-852f-dfeb49f96d9d","timestamp":1749195008049,"gateway":"8UUXN4P00A06NK"} + +{"bid":"12f43c85-14cd-46b2-bd42-45c65739628f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"61f9aa64-7655-4f27-836b-3628ac69dffc","timestamp":1749195008386,"gateway":"8UUXN4P00A06NK"} + +{"tid":"f471bbf3-a9d4-4aeb-bae3-46adcb9d1fd0","bid":"56fd2c7f-5fac-47a2-bd52-20695b2e3dc3","timestamp":1749195008768,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"97cbbe8b-ef3f-4719-a2b2-d0fec5a17bd5","data":{"dongle_infos":[]},"tid":"7d9cc482-ca5c-4925-a3b6-72deb54e289b","timestamp":1749195009043,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f4327d1d-8fb3-4316-8861-82a1cd397ebd","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f8902149-ab10-4364-8ce6-f9b60648c866","timestamp":1749195009705,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a03361fd-8bde-4739-ae1d-c27ba286805f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"cfc4874c-70bb-4692-8253-c9e31b7ca0ae","timestamp":1749195009902,"gateway":"8UUXN4P00A06NK"} + +{"bid":"12f43c85-14cd-46b2-bd42-45c65739628f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"61f9aa64-7655-4f27-836b-3628ac69dffc","timestamp":1749195010502,"gateway":"8UUXN4P00A06NK"} + +{"bid":"05728b55-4fb2-46a1-b67d-f282e837ad8d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bf34e024-2468-4bec-b73a-b2b12e076021","timestamp":1749195011728,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d0524db8-ab60-482e-8b0a-5289045930b2","data":{"air_transfer_enable":false},"need_reply":1,"tid":"0da248a1-b5b2-4c99-ad4a-523c094ec143","timestamp":1749195012236,"gateway":"8UUXN4P00A06NK"} + +{"bid":"248a5aba-cbd5-40dc-b27c-45ea64f6b776","data":{"departure_trajectory":[]},"tid":"406727be-0e51-47a5-bcd1-1691a7a1a25a","timestamp":1749195013036,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6d92f066-3905-42a5-b160-eb8a282bd374","data":{"departure_trajectory":[]},"tid":"d313722b-fc33-4f5c-801d-4fcc6edbb694","timestamp":1749195013388,"gateway":"8UUXN4P00A06NK"} + +{"bid":"05728b55-4fb2-46a1-b67d-f282e837ad8d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bf34e024-2468-4bec-b73a-b2b12e076021","timestamp":1749195013905,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a03361fd-8bde-4739-ae1d-c27ba286805f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"cfc4874c-70bb-4692-8253-c9e31b7ca0ae","timestamp":1749195014102,"gateway":"8UUXN4P00A06NK"} + +{"bid":"12f43c85-14cd-46b2-bd42-45c65739628f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"61f9aa64-7655-4f27-836b-3628ac69dffc","timestamp":1749195014705,"gateway":"8UUXN4P00A06NK"} + +{"bid":"366c2a51-bd93-4edf-8e57-7cd4d6f3ed3c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"13962e94-bc27-4810-8e2d-2c5249a12bb2","timestamp":1749195016727,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c06bf3f1-0ac8-4def-8278-82d2f505cb44","bid":"c3024982-8a55-4ae6-9376-14a1bb0ec2c9","timestamp":1749195046084,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"47e80100-fbd0-4e5a-af6b-0f067656dd61","bid":"91b0f35f-fe51-4a02-bc8b-55f1da859621","timestamp":1749195046086,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"27706e3a-aa73-477d-ab15-147b9050c775","data":{"mobility_status_notify":0},"need_reply":1,"tid":"38ac47b4-2919-44a1-aa62-fbee53495caf","timestamp":1749195047116,"gateway":"8UUXN4P00A06NK"} + +{"bid":"46fd844d-f72d-4e2d-9a6d-ed8100d4e5ad","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b5584a85-7f56-4b84-8f00-8d8e0726cb1d","timestamp":1749195047301,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3dfd0f9f-3e76-4c38-8f1b-54c63359fb8c","data":{"air_transfer_enable":false},"need_reply":1,"tid":"258014a4-7d6c-4466-b764-23da68911fed","timestamp":1749195047599,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7a053490-ea59-47e9-b7cf-77f96a51ae98","data":{"dongle_infos":[]},"tid":"33bdbb07-656e-4285-a61e-df3d104eadd1","timestamp":1749195047608,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5c2e36fe-ad5c-44ea-a760-2a07580a1a2e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5c8bab6a-f427-425b-8b7a-de44100bc344","timestamp":1749195047614,"gateway":"8UUXN4P00A06NK"} + +{"bid":"35b2938b-b8a0-4fa4-a42c-356cb13b7e00","data":{"firmware_version":"13.01.0002"},"tid":"dd0a01a8-4ceb-43d7-8c62-4e1ecdbe7b83","timestamp":1749195047621,"gateway":"8UUXN4P00A06NK"} + +{"tid":"e7e2c377-e4f3-46c9-ab60-b260b54ad68c","bid":"eefacb5b-5071-4165-bb35-0c8b92628cd3","timestamp":1749195048068,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"955dcd15-ec1c-4a29-8056-b72ed9d57383","data":{"dongle_infos":[]},"tid":"55e11d46-cdb3-4789-95ec-ec870c0c413e","timestamp":1749195048608,"gateway":"8UUXN4P00A06NK"} + +{"bid":"27706e3a-aa73-477d-ab15-147b9050c775","data":{"mobility_status_notify":0},"need_reply":1,"tid":"38ac47b4-2919-44a1-aa62-fbee53495caf","timestamp":1749195049262,"gateway":"8UUXN4P00A06NK"} + +{"bid":"46fd844d-f72d-4e2d-9a6d-ed8100d4e5ad","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b5584a85-7f56-4b84-8f00-8d8e0726cb1d","timestamp":1749195049464,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5c2e36fe-ad5c-44ea-a760-2a07580a1a2e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5c8bab6a-f427-425b-8b7a-de44100bc344","timestamp":1749195049655,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c5ad41bd-58b1-4fa0-a098-60b8889644d3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"112a6884-e461-472c-9fdc-a1bb0709aaa9","timestamp":1749195051095,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3dfd0f9f-3e76-4c38-8f1b-54c63359fb8c","data":{"air_transfer_enable":false},"need_reply":1,"tid":"258014a4-7d6c-4466-b764-23da68911fed","timestamp":1749195051794,"gateway":"8UUXN4P00A06NK"} + +{"bid":"69e5a5cb-0d21-4776-bdb9-e6e2470b6c91","data":{"dongle_infos":[]},"tid":"3b01311f-dcc9-44fd-a922-1ce8074e35f5","timestamp":1749195051942,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c0f57641-b114-4465-a40f-d42595f416f8","data":{"departure_trajectory":[]},"tid":"d9ade2aa-0281-49d6-af78-5a348ab543da","timestamp":1749195052599,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0986259b-6b99-496b-8fc1-0e7389d094ff","data":{"departure_trajectory":[]},"tid":"f8384772-2f26-40a3-94d0-f293d8c9a94d","timestamp":1749195052748,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c5ad41bd-58b1-4fa0-a098-60b8889644d3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"112a6884-e461-472c-9fdc-a1bb0709aaa9","timestamp":1749195053259,"gateway":"8UUXN4P00A06NK"} + +{"bid":"27706e3a-aa73-477d-ab15-147b9050c775","data":{"mobility_status_notify":0},"need_reply":1,"tid":"38ac47b4-2919-44a1-aa62-fbee53495caf","timestamp":1749195053461,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5c2e36fe-ad5c-44ea-a760-2a07580a1a2e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5c8bab6a-f427-425b-8b7a-de44100bc344","timestamp":1749195053854,"gateway":"8UUXN4P00A06NK"} + +{"bid":"25c4f903-2fd2-4a89-a45c-2dcf63ce4853","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"622b2fee-fe08-4544-adba-bdb82a29a902","timestamp":1749195056087,"gateway":"8UUXN4P00A06NK"} + +{"tid":"5dbf69c7-18d6-4570-ad25-7b1cde1e4c26","bid":"75aa2995-c517-4db0-85d5-f7a80bc65b4c","timestamp":1749195083573,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"aa095acb-af77-43d2-b118-350ab4229946","bid":"308f0328-9352-430e-bac7-dffbcbabab88","timestamp":1749195083578,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"947d7dd9-56c4-48b5-a01d-5f9873952a86","data":{"mobility_status_notify":0},"need_reply":1,"tid":"45c8eacb-f9e7-4340-bf42-f87eff2275c7","timestamp":1749195085554,"gateway":"8UUXN4P00A06NK"} + +{"bid":"327ebd03-8fbb-4c55-baa8-d3966df46499","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c0ddbbac-8a98-438e-9008-50f523d73f79","timestamp":1749195085556,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b65c6055-a5df-4db2-91f3-3903abc344f1","data":{"dongle_infos":[]},"tid":"48f65845-ebe8-4404-b518-194cf836fb09","timestamp":1749195085965,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fb9628b8-49e4-444a-89c9-334ea94fc42f","data":{"firmware_version":"13.01.0002"},"tid":"464cdc49-d8e7-4e63-9ee2-1ebff556f5d5","timestamp":1749195085972,"gateway":"8UUXN4P00A06NK"} + +{"bid":"966144a2-ac3b-40b3-957e-a88e0a69e3bd","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"fe82e8f0-268e-4b70-a8bb-f54de5580abe","timestamp":1749195086035,"gateway":"8UUXN4P00A06NK"} + +{"bid":"654835f5-0176-4ecf-a6fb-44faa9db87c6","data":{"air_transfer_enable":false},"need_reply":1,"tid":"c4aab32a-b70d-45ff-b3be-a77c7a0f8aea","timestamp":1749195086159,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d3e58724-312c-4203-b3a7-bacfa91d766a","bid":"77720779-3be6-4359-8a15-50137c6ecf56","timestamp":1749195086243,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"1bbf3fee-bdea-4ace-91a5-3c5ae70f6d3b","data":{"dongle_infos":[]},"tid":"426d28c9-07b0-46ea-b677-2fc3e2b16414","timestamp":1749195087008,"gateway":"8UUXN4P00A06NK"} + +{"bid":"947d7dd9-56c4-48b5-a01d-5f9873952a86","data":{"mobility_status_notify":0},"need_reply":1,"tid":"45c8eacb-f9e7-4340-bf42-f87eff2275c7","timestamp":1749195087712,"gateway":"8UUXN4P00A06NK"} + +{"bid":"327ebd03-8fbb-4c55-baa8-d3966df46499","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c0ddbbac-8a98-438e-9008-50f523d73f79","timestamp":1749195087713,"gateway":"8UUXN4P00A06NK"} + +{"bid":"966144a2-ac3b-40b3-957e-a88e0a69e3bd","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"fe82e8f0-268e-4b70-a8bb-f54de5580abe","timestamp":1749195088111,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4b9267cf-de59-4e21-aff1-cd1149896964","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d20ae358-d233-4842-a59b-13d677aa8932","timestamp":1749195088579,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eabd87db-2dd4-4868-beaa-91dd655a032f","data":{"dongle_infos":[]},"tid":"82411428-f53c-47e4-98ee-19a426150b7a","timestamp":1749195089304,"gateway":"8UUXN4P00A06NK"} + +{"bid":"654835f5-0176-4ecf-a6fb-44faa9db87c6","data":{"air_transfer_enable":false},"need_reply":1,"tid":"c4aab32a-b70d-45ff-b3be-a77c7a0f8aea","timestamp":1749195090358,"gateway":"8UUXN4P00A06NK"} + +{"bid":"09122383-f07e-49c0-b98f-d87ad6b47325","data":{"departure_trajectory":[]},"tid":"17c9cb8e-5655-402a-bf05-421117c09a69","timestamp":1749195090433,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4b9267cf-de59-4e21-aff1-cd1149896964","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d20ae358-d233-4842-a59b-13d677aa8932","timestamp":1749195090711,"gateway":"8UUXN4P00A06NK"} + +{"bid":"030de0be-56eb-4063-9dd0-bacd861cdc7d","data":{"departure_trajectory":[]},"tid":"6869f364-0764-483d-a25d-7c50d5ddd0e8","timestamp":1749195090955,"gateway":"8UUXN4P00A06NK"} + +{"bid":"947d7dd9-56c4-48b5-a01d-5f9873952a86","data":{"mobility_status_notify":0},"need_reply":1,"tid":"45c8eacb-f9e7-4340-bf42-f87eff2275c7","timestamp":1749195091916,"gateway":"8UUXN4P00A06NK"} + +{"bid":"966144a2-ac3b-40b3-957e-a88e0a69e3bd","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"fe82e8f0-268e-4b70-a8bb-f54de5580abe","timestamp":1749195092317,"gateway":"8UUXN4P00A06NK"} + +{"bid":"409a1bef-8b1c-4589-97f9-09abe7be7029","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2266f19a-5f59-4bde-a424-17547d380e4c","timestamp":1749195093582,"gateway":"8UUXN4P00A06NK"} + +{"tid":"5d02e313-abd6-4e76-874e-643902813ff6","bid":"dc826077-4093-4280-84c7-bdacea733902","timestamp":1749195122465,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"ebf1a923-0b3d-4130-98e1-3f4809b05953","bid":"c03cdd0e-51b6-4f88-81d5-218784b8f2ef","timestamp":1749195122469,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"aaa68843-194c-4af8-847d-6e0df4d9b310","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d4f54b12-0c9d-40eb-9d03-348e43fe86a7","timestamp":1749195123695,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ab9061d2-5224-44b7-aa80-908bcdd00d23","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"84b304ef-1e51-4857-8d40-e335c4ab664a","timestamp":1749195123993,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5d0d1936-ef69-481b-93eb-ddbd72a5b792","data":{"dongle_infos":[]},"tid":"83dc9b00-7b52-4d73-9275-29565b66b795","timestamp":1749195124118,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d361799b-1850-4d05-bec1-b072346cb31f","data":{"firmware_version":"13.01.0002"},"tid":"740c4645-b7a6-4816-ac17-320530297040","timestamp":1749195124123,"gateway":"8UUXN4P00A06NK"} + +{"bid":"096fb70b-0039-45c3-9c72-a3db4aeb64c6","data":{"air_transfer_enable":false},"need_reply":1,"tid":"c58a0866-a47b-4b1c-b3cf-db3c9af44b58","timestamp":1749195124311,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b28c704d-f2f6-4bc8-88d1-653987cb1fae","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1c480d70-d560-4df2-9745-b1a06dd92c9d","timestamp":1749195124416,"gateway":"8UUXN4P00A06NK"} + +{"tid":"38f8d3be-196e-4470-8032-420fdb66d8ec","bid":"e5a5c675-27b6-4294-9e3c-5ed8b3d350a2","timestamp":1749195124621,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"a8bb663e-776f-41b7-a964-d5eb0d42d1bc","data":{"dongle_infos":[]},"tid":"d1b826d8-0261-4bf4-9eeb-e6621df0f493","timestamp":1749195125119,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aaa68843-194c-4af8-847d-6e0df4d9b310","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d4f54b12-0c9d-40eb-9d03-348e43fe86a7","timestamp":1749195125816,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ab9061d2-5224-44b7-aa80-908bcdd00d23","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"84b304ef-1e51-4857-8d40-e335c4ab664a","timestamp":1749195126013,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b28c704d-f2f6-4bc8-88d1-653987cb1fae","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1c480d70-d560-4df2-9745-b1a06dd92c9d","timestamp":1749195126615,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c046518c-d9b1-424d-9fb1-a011c0b99362","data":{"dongle_infos":[]},"tid":"68cc31a7-73de-4676-a93f-93f0d70369b4","timestamp":1749195127348,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a197cae2-038e-439c-b371-550b50475e28","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a2e32724-fc39-4a8e-a1c6-4ffba846f67e","timestamp":1749195127470,"gateway":"8UUXN4P00A06NK"} + +{"bid":"096fb70b-0039-45c3-9c72-a3db4aeb64c6","data":{"air_transfer_enable":false},"need_reply":1,"tid":"c58a0866-a47b-4b1c-b3cf-db3c9af44b58","timestamp":1749195128505,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2ad1961f-f6ed-4319-b9eb-4aba239d38bd","data":{"departure_trajectory":[]},"tid":"6c287403-3b16-428e-8944-cf5e7ea3007f","timestamp":1749195129108,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e49d1247-ee41-4173-b101-26fec030dee4","data":{"departure_trajectory":[]},"tid":"216b2a3e-3ac6-4a2c-a33a-8eccda92dac6","timestamp":1749195129194,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a197cae2-038e-439c-b371-550b50475e28","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a2e32724-fc39-4a8e-a1c6-4ffba846f67e","timestamp":1749195129614,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ab9061d2-5224-44b7-aa80-908bcdd00d23","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"84b304ef-1e51-4857-8d40-e335c4ab664a","timestamp":1749195130216,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b28c704d-f2f6-4bc8-88d1-653987cb1fae","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1c480d70-d560-4df2-9745-b1a06dd92c9d","timestamp":1749195130816,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ae47648d-b37a-4754-b4ba-717479feb5a6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d88ddf4d-1daa-486f-b576-998ea52e57ef","timestamp":1749195132467,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ae47648d-b37a-4754-b4ba-717479feb5a6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d88ddf4d-1daa-486f-b576-998ea52e57ef","timestamp":1749195134616,"gateway":"8UUXN4P00A06NK"} + +{"tid":"294605e5-6e85-4014-9ffe-b4c24aa5388e","bid":"d84c0e0d-319b-441f-beb6-5db36a46e4b6","timestamp":1749195161634,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"440ab22d-21d5-4107-8f79-a21ac7c96b34","bid":"3207f6f9-fd0a-4da4-b50f-0673e7e0b16d","timestamp":1749195161636,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"2b60663e-eb0b-41d4-8134-39e5d4c09f36","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3f1cccf4-ed90-4e81-9dbc-5e09a71b1271","timestamp":1749195162538,"gateway":"8UUXN4P00A06NK"} + +{"bid":"58cb521e-b7a9-466f-9137-3c6886f61b03","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"af131954-d103-4141-8726-36f468281fcd","timestamp":1749195162652,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8a7c06a6-b758-42d3-a52a-d81d0c3ad61b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3af33991-d312-4022-b00b-66139be11d8b","timestamp":1749195162953,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6a605712-90b4-4aa3-9b47-d3c0c04aff05","data":{"dongle_infos":[]},"tid":"91d4b3f0-09bb-4c82-aee8-5945a704e2ee","timestamp":1749195162963,"gateway":"8UUXN4P00A06NK"} + +{"bid":"14484a0f-bb38-408d-9168-969ab3f35a55","data":{"firmware_version":"13.01.0002"},"tid":"64a718c8-e330-450b-a29e-3b6dc9ddb480","timestamp":1749195162969,"gateway":"8UUXN4P00A06NK"} + +{"bid":"832db169-6c56-49fe-af3e-e9293565a412","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a3ff09dd-0a3c-4d76-be32-4e5e0045bf24","timestamp":1749195162991,"gateway":"8UUXN4P00A06NK"} + +{"tid":"2f6cfabe-3511-4e41-943a-9edea52d1be8","bid":"40f41bef-6483-480a-b3b1-6412401fbdaa","timestamp":1749195163641,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"8d47c8ca-608b-4319-a525-6bf895ad4275","data":{"dongle_infos":[]},"tid":"85366a3d-25fd-454c-830d-40de60e0e572","timestamp":1749195163959,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2b60663e-eb0b-41d4-8134-39e5d4c09f36","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3f1cccf4-ed90-4e81-9dbc-5e09a71b1271","timestamp":1749195164543,"gateway":"8UUXN4P00A06NK"} + +{"bid":"58cb521e-b7a9-466f-9137-3c6886f61b03","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"af131954-d103-4141-8726-36f468281fcd","timestamp":1749195164739,"gateway":"8UUXN4P00A06NK"} + +{"bid":"832db169-6c56-49fe-af3e-e9293565a412","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a3ff09dd-0a3c-4d76-be32-4e5e0045bf24","timestamp":1749195165138,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2795101f-1722-4d47-afb0-53cbeca17d2f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"eeab2491-9bbb-474c-8c78-6fc07bcc1994","timestamp":1749195166638,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8a7c06a6-b758-42d3-a52a-d81d0c3ad61b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3af33991-d312-4022-b00b-66139be11d8b","timestamp":1749195167152,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eafc69a8-f4a2-4c31-9df7-194a3a542d2a","data":{"dongle_infos":[]},"tid":"b6b72331-03eb-4e33-82ed-d0ccdcb0e8cc","timestamp":1749195167189,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f6351fd1-3279-40e8-b80a-f8320d9f79c5","data":{"departure_trajectory":[]},"tid":"6f6c6ded-a364-44d6-b51c-9720ffc22c1e","timestamp":1749195167955,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ce2df6ab-cb5b-480f-9e54-314de75bb817","data":{"departure_trajectory":[]},"tid":"c96c66fd-f74c-49c8-8c88-c3766cff9166","timestamp":1749195168294,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2b60663e-eb0b-41d4-8134-39e5d4c09f36","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3f1cccf4-ed90-4e81-9dbc-5e09a71b1271","timestamp":1749195168743,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2795101f-1722-4d47-afb0-53cbeca17d2f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"eeab2491-9bbb-474c-8c78-6fc07bcc1994","timestamp":1749195168744,"gateway":"8UUXN4P00A06NK"} + +{"bid":"832db169-6c56-49fe-af3e-e9293565a412","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a3ff09dd-0a3c-4d76-be32-4e5e0045bf24","timestamp":1749195169339,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8210e3ca-e297-4625-a234-efe5a1766ca8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2f133bcf-1381-4ba9-b06e-b78f2b3de009","timestamp":1749195171633,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8210e3ca-e297-4625-a234-efe5a1766ca8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2f133bcf-1381-4ba9-b06e-b78f2b3de009","timestamp":1749195173742,"gateway":"8UUXN4P00A06NK"} + +{"tid":"842f02ea-ba5b-4bb4-9cce-2b45abaa83d9","bid":"5b5cf560-6873-4361-8ae8-72ad41d2da6f","timestamp":1749195201183,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"eddee756-5704-449f-bf2c-947a1c507d5f","bid":"44509ef8-973e-43a7-baaa-1ab769a65657","timestamp":1749195201186,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"007a8300-25e1-4959-9d75-2bb2324ca30a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ff15e56b-8be7-4b99-8b33-8373a386a0a8","timestamp":1749195202063,"gateway":"8UUXN4P00A06NK"} + +{"bid":"00ac7245-0487-4c82-94df-23bf7d6c2f83","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ff1a45de-a335-4584-acec-a88840905af0","timestamp":1749195202253,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4ef8385c-21b7-4729-a0d2-82c4617230b0","data":{"dongle_infos":[]},"tid":"332927ad-b8e0-492c-80fa-dbd31cfb6c73","timestamp":1749195202546,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5817433f-deb6-4b5e-afaf-1752fa89b950","data":{"firmware_version":"13.01.0002"},"tid":"4f606a0d-44da-4977-9910-21744dfd491c","timestamp":1749195202554,"gateway":"8UUXN4P00A06NK"} + +{"bid":"78c9bdd1-bf6c-4799-b524-9555bbda7c21","data":{"air_transfer_enable":false},"need_reply":1,"tid":"92a32e04-17e5-49e0-9a64-7d7d52359d76","timestamp":1749195202737,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d1c70cf8-7d43-4832-931b-22bb21229382","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5c90e64b-d767-4a97-8878-d691c3defd8c","timestamp":1749195202824,"gateway":"8UUXN4P00A06NK"} + +{"tid":"3edb4fa0-8892-4dda-b2e2-5572bfc42ce0","bid":"ed70f056-048a-4dd0-8a5f-1cf781c4bade","timestamp":1749195202986,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"259c0105-4b2b-4226-9cfd-32fc133da4d8","data":{"dongle_infos":[]},"tid":"c61c4373-86f5-4b8a-865b-b00521d220ee","timestamp":1749195203586,"gateway":"8UUXN4P00A06NK"} + +{"bid":"007a8300-25e1-4959-9d75-2bb2324ca30a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ff15e56b-8be7-4b99-8b33-8373a386a0a8","timestamp":1749195204113,"gateway":"8UUXN4P00A06NK"} + +{"bid":"00ac7245-0487-4c82-94df-23bf7d6c2f83","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ff1a45de-a335-4584-acec-a88840905af0","timestamp":1749195204313,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d1c70cf8-7d43-4832-931b-22bb21229382","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5c90e64b-d767-4a97-8878-d691c3defd8c","timestamp":1749195204914,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f5d21c3f-1bac-4194-a249-0787c52cf8d1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"20f9e6d4-17cd-47c6-b477-349b6dcfda21","timestamp":1749195206184,"gateway":"8UUXN4P00A06NK"} + +{"bid":"58704d40-8b09-4b13-a961-b6fc5dcfaf73","data":{"dongle_infos":[]},"tid":"d0840560-adb4-49e3-8f74-7ef770e1eac0","timestamp":1749195206227,"gateway":"8UUXN4P00A06NK"} + +{"bid":"78c9bdd1-bf6c-4799-b524-9555bbda7c21","data":{"air_transfer_enable":false},"need_reply":1,"tid":"92a32e04-17e5-49e0-9a64-7d7d52359d76","timestamp":1749195206933,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f1b67424-7b45-4ea4-8235-b5b3f5512990","data":{"departure_trajectory":[]},"tid":"e5002280-6fed-438e-a53d-484a43dbaf83","timestamp":1749195207535,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fe7cbda6-d1c4-439b-b5ef-9fde1aaa1e23","data":{"departure_trajectory":[]},"tid":"73e0f122-97f8-4850-bde4-a82ba6435634","timestamp":1749195207753,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f5d21c3f-1bac-4194-a249-0787c52cf8d1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"20f9e6d4-17cd-47c6-b477-349b6dcfda21","timestamp":1749195208314,"gateway":"8UUXN4P00A06NK"} + +{"bid":"00ac7245-0487-4c82-94df-23bf7d6c2f83","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ff1a45de-a335-4584-acec-a88840905af0","timestamp":1749195208514,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d1c70cf8-7d43-4832-931b-22bb21229382","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"5c90e64b-d767-4a97-8878-d691c3defd8c","timestamp":1749195209113,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ebe0f64b-095f-4585-8cbf-26235b8c2dc4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0c05ffce-d02f-4b77-8133-bed3b0107955","timestamp":1749195211195,"gateway":"8UUXN4P00A06NK"} + +{"tid":"afcd9f48-1fb7-403c-a24a-79b3a3f5bf9a","bid":"e60b5d43-d092-4cb0-98c0-98b9b3b73278","timestamp":1749195238364,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"9a8b244c-6744-4f8e-85d3-67a1c47b52e2","bid":"ba58045e-0b58-40e3-90a9-ee9bcfd64483","timestamp":1749195238367,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"ca42bfa2-f14f-4c44-925d-ff88c2473d11","data":{"air_transfer_enable":false},"need_reply":1,"tid":"cbb92f5d-5608-4bfb-a243-a272badcc3cf","timestamp":1749195239262,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c3a6490e-ca1d-4905-a4af-a01a3065bbf0","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"72f44fc7-f616-4e04-b52b-ed27d27d72fa","timestamp":1749195241360,"gateway":"8UUXN4P00A06NK"} + +{"bid":"56d4a397-839f-4786-9784-4b3c53dc6924","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b04180b4-04ed-48b0-b831-ff043ce9ef2d","timestamp":1749195241564,"gateway":"8UUXN4P00A06NK"} + +{"tid":"65629e45-e295-45cd-b146-746df837369c","bid":"1fe8aa38-707b-437d-9b5d-c4f12451cb7a","timestamp":1749195241754,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"df2b20d5-f5bf-4a8d-a0a5-e1a3f470a13d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"77591e7f-9f65-4e59-9a51-4d482cfc8903","timestamp":1749195241810,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ca42bfa2-f14f-4c44-925d-ff88c2473d11","data":{"air_transfer_enable":false},"need_reply":1,"tid":"cbb92f5d-5608-4bfb-a243-a272badcc3cf","timestamp":1749195241810,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9e048390-d3d9-46de-b13e-83a7eafc3557","data":{"dongle_infos":[]},"tid":"736a48e5-6767-4359-a1aa-14b5a74e88a3","timestamp":1749195241817,"gateway":"8UUXN4P00A06NK"} + +{"bid":"57911ed1-173f-49ca-b117-5daeddf67b57","data":{"firmware_version":"13.01.0002"},"tid":"1c21db3f-8f5b-44d6-a0da-77e623f49250","timestamp":1749195241822,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f42f882f-fb69-435e-ab66-4fd5dbd3c8f0","data":{"dongle_infos":[]},"tid":"18ed3199-a209-4212-89b8-a3be9830db0e","timestamp":1749195242843,"gateway":"8UUXN4P00A06NK"} + +{"bid":"17ef270c-8095-4a36-b934-c78662664c63","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4df6059f-123a-4075-9e53-063aa5bdccff","timestamp":1749195243371,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c3a6490e-ca1d-4905-a4af-a01a3065bbf0","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"72f44fc7-f616-4e04-b52b-ed27d27d72fa","timestamp":1749195243514,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df2b20d5-f5bf-4a8d-a0a5-e1a3f470a13d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"77591e7f-9f65-4e59-9a51-4d482cfc8903","timestamp":1749195243915,"gateway":"8UUXN4P00A06NK"} + +{"bid":"33365319-0acf-4eee-aab5-e842741d5f06","data":{"dongle_infos":[]},"tid":"007bfc2e-a8b8-4223-92d1-946a526a7804","timestamp":1749195244760,"gateway":"8UUXN4P00A06NK"} + +{"tid":"cc5f004a-0cad-4a0b-ae3c-a5d9ce043288","bid":"297660b5-4eec-4004-9e43-89bdf8f9cd5f","timestamp":1749195269170,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"08b5584a-b1f6-441d-b02a-e47629bf2230","bid":"5d215eae-6191-4d26-a8ad-cc36ca252cdc","timestamp":1749195269178,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"4e29bac1-d3bf-49ea-87e6-ce6bcc22c9f0","bid":"7e17574c-7061-4ae7-9677-add6179e8fb8","timestamp":1749195269491,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"53d94812-adbc-4160-acbd-da5871f4856f","bid":"989a3a76-5a90-42fa-933b-3239cf139e6f","timestamp":1749195269494,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"9ea616c0-e7bc-4a56-af60-68eb31ebad93","bid":"0c423c27-543f-40d3-878c-3a2eeb81ae23","timestamp":1749195269496,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"3149c66f-f883-472c-a46b-1cf47c479984","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d2a167bb-4294-42be-967c-2c8fb3141715","timestamp":1749195271168,"gateway":"8UUXN4P00A06NK"} + +{"bid":"265a0bd0-ede5-4274-bc33-b43ca05c6079","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3a35afc9-ed36-4c40-98b9-6421fa684451","timestamp":1749195273137,"gateway":"8UUXN4P00A06NK"} + +{"bid":"78e86b03-6f44-4163-b4cf-c4c2ee4f1935","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1b7bdbe7-1e63-4e21-9b28-ff1ff2945977","timestamp":1749195273550,"gateway":"8UUXN4P00A06NK"} + +{"bid":"56d075cb-8ad2-487f-b3eb-eafef28a45f2","data":{"dongle_infos":[]},"tid":"a7958dd2-5721-4a60-929e-5032cd44dd13","timestamp":1749195273607,"gateway":"8UUXN4P00A06NK"} + +{"bid":"900ff1dd-dcd0-47e6-bfb5-49e4401793ab","data":{"firmware_version":"13.01.0002"},"tid":"e9b038ea-ea9a-4016-9a19-9c140f70133f","timestamp":1749195273615,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3149c66f-f883-472c-a46b-1cf47c479984","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d2a167bb-4294-42be-967c-2c8fb3141715","timestamp":1749195273803,"gateway":"8UUXN4P00A06NK"} + +{"tid":"645429e5-3045-40ac-b7e9-bcc109a3c464","bid":"ba1cfab2-1268-4931-8a54-9f203c16a3dc","timestamp":1749195273878,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"05566288-9b26-483c-a359-406727d021b1","data":{"mobility_status_notify":0},"need_reply":1,"tid":"6bdd9409-0a0f-4cb7-ae39-d58779dc2281","timestamp":1749195273979,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c2b4999f-2f04-45c4-87ef-f35b7172a60b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"702ee3fd-56d1-41ad-baf8-e6e9b2b2350b","timestamp":1749195274167,"gateway":"8UUXN4P00A06NK"} + +{"bid":"06b17b06-2818-41e5-8a64-0b64e1536cff","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"247616e8-a09c-4b7e-8b56-def0d6282578","timestamp":1749195274485,"gateway":"8UUXN4P00A06NK"} + +{"bid":"561ceedb-a72b-420d-814e-462bfd43ec65","data":{"dongle_infos":[]},"tid":"a1148b8e-3cd0-4dff-992b-6dbff8b83626","timestamp":1749195274646,"gateway":"8UUXN4P00A06NK"} + +{"bid":"78e86b03-6f44-4163-b4cf-c4c2ee4f1935","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1b7bdbe7-1e63-4e21-9b28-ff1ff2945977","timestamp":1749195275564,"gateway":"8UUXN4P00A06NK"} + +{"bid":"05566288-9b26-483c-a359-406727d021b1","data":{"mobility_status_notify":0},"need_reply":1,"tid":"6bdd9409-0a0f-4cb7-ae39-d58779dc2281","timestamp":1749195276169,"gateway":"8UUXN4P00A06NK"} + +{"tid":"e5d5b46e-4759-46a2-9fcd-af1b8b37c02c","bid":"7fb6dc95-14a0-4226-acc9-b2c81ab4cd79","timestamp":1749195301536,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"f68031b5-955d-4c2e-ae7e-9ae2ac6a111f","bid":"afe97b93-662c-4bb8-b6e8-176d957259b3","timestamp":1749195301539,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"dfd68fb7-8dc6-4036-9088-28bb2c1793f5","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e39b3320-77f2-44e8-af91-f2e2732cc0b6","timestamp":1749195302276,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4b36e2d4-797e-4434-a108-0c643132e629","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c49ceee2-feed-4834-9e93-32c08f35ea33","timestamp":1749195304240,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f74d1f90-7f72-4126-8112-79145067cf3b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7f2bf8ae-a581-4884-a377-3c19f27177f1","timestamp":1749195304465,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e16bf126-e79e-4b56-88c2-a00d344cbec7","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7c0ce62d-8c63-4a2c-973e-7302a14bf481","timestamp":1749195304637,"gateway":"8UUXN4P00A06NK"} + +{"bid":"da3964f4-1ffa-477a-bc51-85ee3f8ab3e3","data":{"dongle_infos":[]},"tid":"1b8012b2-f4db-45f3-83f9-19db85792b8e","timestamp":1749195304785,"gateway":"8UUXN4P00A06NK"} + +{"bid":"99262d33-056b-4549-9060-5ccce7267564","data":{"firmware_version":"13.01.0002"},"tid":"89b60701-f456-4d46-b5cc-9edbb4cd6611","timestamp":1749195304809,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dfd68fb7-8dc6-4036-9088-28bb2c1793f5","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e39b3320-77f2-44e8-af91-f2e2732cc0b6","timestamp":1749195304986,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d537e216-413a-446d-9fb3-181e00be9df7","bid":"895297ef-cbd7-4472-8433-d84343655d09","timestamp":1749195305400,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"101c4805-7054-4f7b-bac9-2e7a700db5a6","data":{"dongle_infos":[]},"tid":"dd1526ee-6096-46d6-91f8-58d62d65d9e7","timestamp":1749195305836,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4b36e2d4-797e-4434-a108-0c643132e629","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"c49ceee2-feed-4834-9e93-32c08f35ea33","timestamp":1749195306388,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7ead088d-0e82-4f42-9e1a-be1390b038b6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"adf0a3ab-42d4-4465-8ff7-bd9e32c02e01","timestamp":1749195306543,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e16bf126-e79e-4b56-88c2-a00d344cbec7","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7c0ce62d-8c63-4a2c-973e-7302a14bf481","timestamp":1749195306790,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8f6e23e0-27de-42a5-a648-f4b5aa10e676","data":{"dongle_infos":[]},"tid":"1d2193c0-92c0-4742-8cd7-ec9609035022","timestamp":1749195308081,"gateway":"8UUXN4P00A06NK"} + +{"tid":"5c8de7ca-efa5-4b5c-bdef-cc1ef4da7161","bid":"cba8bcf5-3755-4476-9081-e6f2e764e9f7","timestamp":1749195334211,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"10b8c038-727b-4a92-ac58-990dc0e5d737","bid":"814f3ba4-c020-440c-b1c1-4ec003cbf4f7","timestamp":1749195334216,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"30640bf8-6d4f-4b52-9f22-0f45e3e79f03","data":{"air_transfer_enable":false},"need_reply":1,"tid":"6a84b187-5f9e-4c1b-b78e-42ea08ced29f","timestamp":1749195334597,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c362eb92-c979-48a9-9eee-3de49d8c186f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3756706b-f27a-4240-acda-6b19044d52b2","timestamp":1749195336884,"gateway":"8UUXN4P00A06NK"} + +{"bid":"979b34d4-15d3-4519-91c6-dae50e4ed21c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6e84c2a2-6ce3-48ec-b0a4-6089b1a9123b","timestamp":1749195336948,"gateway":"8UUXN4P00A06NK"} + +{"bid":"35e9a52e-7192-4612-a730-461d734b4781","data":{"dongle_infos":[]},"tid":"d1359423-657a-44f7-ac23-86807c9b4841","timestamp":1749195337070,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0d9e3be8-cda3-4adb-b270-4ceeec885544","data":{"firmware_version":"13.01.0002"},"tid":"3b1c44d4-edd7-4fdb-9b06-25ece6a54b68","timestamp":1749195337077,"gateway":"8UUXN4P00A06NK"} + +{"bid":"30640bf8-6d4f-4b52-9f22-0f45e3e79f03","data":{"air_transfer_enable":false},"need_reply":1,"tid":"6a84b187-5f9e-4c1b-b78e-42ea08ced29f","timestamp":1749195337267,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d85a6b27-948e-408e-8653-c1e326db077c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"be9f311b-14f0-4c69-be60-ffc5569a2121","timestamp":1749195337380,"gateway":"8UUXN4P00A06NK"} + +{"tid":"0f8518fb-9aff-4d76-9b65-92e65bada73d","bid":"45314c9e-8aba-471f-952e-88eb7e605bbd","timestamp":1749195337444,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"bf380cb3-23d7-40e6-9588-9a20b43cb2fd","data":{"dongle_infos":[]},"tid":"9400481b-2af6-4c65-9fa6-f8f3c98b9d1b","timestamp":1749195338081,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c362eb92-c979-48a9-9eee-3de49d8c186f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3756706b-f27a-4240-acda-6b19044d52b2","timestamp":1749195338898,"gateway":"8UUXN4P00A06NK"} + +{"bid":"979b34d4-15d3-4519-91c6-dae50e4ed21c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"6e84c2a2-6ce3-48ec-b0a4-6089b1a9123b","timestamp":1749195339100,"gateway":"8UUXN4P00A06NK"} + +{"bid":"81d7f694-b1e2-49d9-a966-e43ae869a4db","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bd5ba4d8-ba1f-481d-bec5-b82ad7da9cbe","timestamp":1749195339215,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d85a6b27-948e-408e-8653-c1e326db077c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"be9f311b-14f0-4c69-be60-ffc5569a2121","timestamp":1749195339497,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0cb97000-dd8e-4a52-96f4-ed11e6645fde","data":{"dongle_infos":[]},"tid":"73faf263-9b4d-4bfd-ab37-bd25d92fab0f","timestamp":1749195340497,"gateway":"8UUXN4P00A06NK"} + +{"tid":"53a507f8-1679-44a1-a362-37e386bc3921","bid":"d138b7c6-d9af-4663-9bd1-ffce5be3ce5c","timestamp":1749195367406,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"12803375-ad10-42e7-bff2-84aec662ebc8","bid":"b224f64d-5192-46ac-9a46-496b07fd7b9c","timestamp":1749195367408,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"dc87a766-ae00-4332-82bf-c204b01b3d66","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"2ba920eb-6bff-4da4-ac6a-58b34cec84d7","timestamp":1749195368307,"gateway":"8UUXN4P00A06NK"} + +{"bid":"05154c39-c3cf-40d5-9638-0ec94ba30172","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a912f5bf-699c-45a3-aacd-5252b648b430","timestamp":1749195368383,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b3083dc7-6c53-4ee7-b56e-d1ecfdc22c05","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3a8c9494-3340-46c1-8159-0a59c4708160","timestamp":1749195368604,"gateway":"8UUXN4P00A06NK"} + +{"bid":"10a3f2a8-d767-499f-a69a-6eac15200ba4","data":{"air_transfer_enable":false},"need_reply":1,"tid":"999c42d1-2dc8-4d96-9bdf-34661c575d30","timestamp":1749195368757,"gateway":"8UUXN4P00A06NK"} + +{"bid":"44f74d5c-1786-49f5-a4bb-e1437038c267","data":{"dongle_infos":[]},"tid":"2cb50bce-5ecf-46f9-8319-b4ebb63abd59","timestamp":1749195368763,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2110c3b2-83e1-417e-9b46-f8ddf224bb00","data":{"firmware_version":"13.01.0002"},"tid":"bae6a8d1-86a6-41e3-a1c6-1a375737b2c3","timestamp":1749195368770,"gateway":"8UUXN4P00A06NK"} + +{"tid":"586d7cdb-d5d1-40ee-b07f-9fc61088b7bf","bid":"fe885a25-e35d-4edb-bd1f-72c8e57dc693","timestamp":1749195369392,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"7b5f2532-816b-4cbc-94e3-8a6f5566b996","data":{"dongle_infos":[]},"tid":"7600468a-d7e6-4549-b812-514569be9265","timestamp":1749195369793,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dc87a766-ae00-4332-82bf-c204b01b3d66","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"2ba920eb-6bff-4da4-ac6a-58b34cec84d7","timestamp":1749195370378,"gateway":"8UUXN4P00A06NK"} + +{"bid":"05154c39-c3cf-40d5-9638-0ec94ba30172","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a912f5bf-699c-45a3-aacd-5252b648b430","timestamp":1749195370578,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b3083dc7-6c53-4ee7-b56e-d1ecfdc22c05","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3a8c9494-3340-46c1-8159-0a59c4708160","timestamp":1749195370772,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9d4cc75c-3282-43b2-acd9-908b88d937e3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"eaeb7289-a4b0-482d-a061-498be71492e6","timestamp":1749195372406,"gateway":"8UUXN4P00A06NK"} + +{"bid":"10a3f2a8-d767-499f-a69a-6eac15200ba4","data":{"air_transfer_enable":false},"need_reply":1,"tid":"999c42d1-2dc8-4d96-9bdf-34661c575d30","timestamp":1749195372956,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d789a198-7fe8-4437-8347-57d50d55efed","data":{"dongle_infos":[]},"tid":"ba51988f-c73e-4667-80ca-e622427e7a2d","timestamp":1749195373220,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cc1fbf73-62ed-4f5f-9dc9-74537f29c4ec","data":{"departure_trajectory":[]},"tid":"77458b55-2c3b-4eaf-ba6e-b48c002a42c4","timestamp":1749195373757,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2a4eb579-12c4-4338-a7a6-c84c0cb96132","data":{"departure_trajectory":[]},"tid":"a0ba401d-de26-416e-a844-5022c54543a6","timestamp":1749195374074,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dc87a766-ae00-4332-82bf-c204b01b3d66","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"2ba920eb-6bff-4da4-ac6a-58b34cec84d7","timestamp":1749195374575,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9d4cc75c-3282-43b2-acd9-908b88d937e3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"eaeb7289-a4b0-482d-a061-498be71492e6","timestamp":1749195374576,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b3083dc7-6c53-4ee7-b56e-d1ecfdc22c05","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3a8c9494-3340-46c1-8159-0a59c4708160","timestamp":1749195374975,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6db66212-0ad2-4135-a650-4705d8f31870","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"449c896e-59cb-4ceb-a149-e2474056eadf","timestamp":1749195377410,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6db66212-0ad2-4135-a650-4705d8f31870","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"449c896e-59cb-4ceb-a149-e2474056eadf","timestamp":1749195379575,"gateway":"8UUXN4P00A06NK"} + +{"tid":"5cce9b8a-217f-4515-91f9-a698fe5a79f2","bid":"40774aee-78bc-47ca-b9dd-f79f6c7fbb9c","timestamp":1749195405535,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"146ca229-9a2c-4558-bec6-11b16e707842","bid":"6ea0c12f-e4b3-4491-95f0-7c2caa2f88c1","timestamp":1749195405543,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"0d827723-3c7d-4fe8-9665-429a46d8b485","data":{"mobility_status_notify":0},"need_reply":1,"tid":"82b5da55-8331-498f-b6fd-6f3bf1f6a2f2","timestamp":1749195406835,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bfc20e9e-83eb-4a9c-b6b2-644d12b01212","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b981fc9c-589d-45ed-aa4a-cb12454aba70","timestamp":1749195407094,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5342f276-b6cb-4237-ad97-e1dbbb7759ea","data":{"dongle_infos":[]},"tid":"b2f4055b-29d5-4453-8880-ff608816325c","timestamp":1749195407257,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b85de880-fa31-433a-98cb-f23241e1615a","data":{"firmware_version":"13.01.0002"},"tid":"9f9abc82-3c04-4e5a-80c1-12b575dbc310","timestamp":1749195407264,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d4908f43-2051-41e3-a84e-11776fb4c91a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"2cd51507-40c5-4983-b1a8-21750aa0f598","timestamp":1749195407445,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bff2716d-5dd5-42c9-b939-855d3cc1398b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8723821f-ccb7-4afe-8917-9ef1c47bff99","timestamp":1749195407460,"gateway":"8UUXN4P00A06NK"} + +{"tid":"75dd9dc9-ea6e-4165-88cb-85bd5224788a","bid":"04dc9998-0c0e-4fb7-a8c5-aaba14c59ac3","timestamp":1749195407803,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"2071a3c5-26a5-4fa8-9dd6-d449b276b214","data":{"dongle_infos":[]},"tid":"ea16caff-d409-4773-bcb2-a83e690fa29b","timestamp":1749195408251,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0d827723-3c7d-4fe8-9665-429a46d8b485","data":{"mobility_status_notify":0},"need_reply":1,"tid":"82b5da55-8331-498f-b6fd-6f3bf1f6a2f2","timestamp":1749195408972,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bfc20e9e-83eb-4a9c-b6b2-644d12b01212","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b981fc9c-589d-45ed-aa4a-cb12454aba70","timestamp":1749195409172,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d4908f43-2051-41e3-a84e-11776fb4c91a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"2cd51507-40c5-4983-b1a8-21750aa0f598","timestamp":1749195409573,"gateway":"8UUXN4P00A06NK"} + +{"bid":"701b16dd-ce98-42c8-a480-3ee875e85aaf","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9cf6f886-f912-4488-8284-2aba4df709e3","timestamp":1749195410534,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f28f2ab0-252a-43b9-b44d-23183069e51d","data":{"dongle_infos":[]},"tid":"5d8d317b-77a2-41aa-ac12-8bd9f4b749f7","timestamp":1749195411558,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bff2716d-5dd5-42c9-b939-855d3cc1398b","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8723821f-ccb7-4afe-8917-9ef1c47bff99","timestamp":1749195411654,"gateway":"8UUXN4P00A06NK"} + +{"bid":"49d9911f-6ba3-4ce0-957b-1e514a6ec21a","data":{"departure_trajectory":[]},"tid":"313d39bd-cf24-4bc1-85ff-5ad2491b265c","timestamp":1749195412242,"gateway":"8UUXN4P00A06NK"} + +{"bid":"42f8a4ea-94a1-434a-a400-044f2e4c694b","data":{"departure_trajectory":[]},"tid":"0f6175f2-e634-40fb-ada9-b86c098a5a93","timestamp":1749195412245,"gateway":"8UUXN4P00A06NK"} + +{"bid":"701b16dd-ce98-42c8-a480-3ee875e85aaf","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9cf6f886-f912-4488-8284-2aba4df709e3","timestamp":1749195412572,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0d827723-3c7d-4fe8-9665-429a46d8b485","data":{"mobility_status_notify":0},"need_reply":1,"tid":"82b5da55-8331-498f-b6fd-6f3bf1f6a2f2","timestamp":1749195413174,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d4908f43-2051-41e3-a84e-11776fb4c91a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"2cd51507-40c5-4983-b1a8-21750aa0f598","timestamp":1749195413772,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e50037b-d500-46c3-be0d-5ce2e32c286f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4d6c0732-809c-4ce6-9083-4504a4aff1cc","timestamp":1749195415539,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e50037b-d500-46c3-be0d-5ce2e32c286f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4d6c0732-809c-4ce6-9083-4504a4aff1cc","timestamp":1749195417575,"gateway":"8UUXN4P00A06NK"} + +{"tid":"a3f00c5f-b2ce-462b-bd83-748067265131","bid":"69895be8-4b0e-4063-ab07-8a206940f2fe","timestamp":1749195444489,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"9bc6f084-64c0-45f7-9366-735add805514","bid":"e38d3b44-c132-49ec-b5a6-f8650363d86b","timestamp":1749195444493,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"0178209a-bbcc-4b61-bde6-00d22ba2ea56","data":{"air_transfer_enable":false},"need_reply":1,"tid":"bec95e56-80cd-4c98-8737-1634e49f7f72","timestamp":1749195444587,"gateway":"8UUXN4P00A06NK"} + +{"bid":"305f42ea-83db-4225-acf1-edea27eee3c3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"dd4f0f93-b18e-47dc-9f27-93c08666a208","timestamp":1749195446533,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bc2fd958-ece6-477c-a3f0-f221094cb090","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ca92f743-fb6f-461b-bce0-ac21166255f0","timestamp":1749195446555,"gateway":"8UUXN4P00A06NK"} + +{"bid":"30540703-eac1-4779-ba5e-ba61370b0a48","data":{"dongle_infos":[]},"tid":"f9429414-2059-4de4-bb68-3b205aa7dd77","timestamp":1749195447036,"gateway":"8UUXN4P00A06NK"} + +{"bid":"629831f1-aedf-4130-bbce-a9d9170e10e2","data":{"firmware_version":"13.01.0002"},"tid":"f6882e1e-e431-4f8c-9260-040df9b71575","timestamp":1749195447041,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d6988989-e236-43e9-88ee-7104b3d0e8ac","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"8bdb4db5-b1ce-41d7-8069-5de61d3b5a2e","timestamp":1749195447141,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0178209a-bbcc-4b61-bde6-00d22ba2ea56","data":{"air_transfer_enable":false},"need_reply":1,"tid":"bec95e56-80cd-4c98-8737-1634e49f7f72","timestamp":1749195447231,"gateway":"8UUXN4P00A06NK"} + +{"tid":"15315924-e9ac-45bb-92bf-7dbbcff794b6","bid":"46974f02-a4a2-41a8-99fb-a9d724e34f21","timestamp":1749195447410,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"ff984d35-db6f-4adb-aa5d-dbb6c9a175c9","data":{"dongle_infos":[]},"tid":"25095e9c-5415-46f5-9e73-39d4c51bd961","timestamp":1749195448041,"gateway":"8UUXN4P00A06NK"} + +{"bid":"305f42ea-83db-4225-acf1-edea27eee3c3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"dd4f0f93-b18e-47dc-9f27-93c08666a208","timestamp":1749195448709,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bc2fd958-ece6-477c-a3f0-f221094cb090","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ca92f743-fb6f-461b-bce0-ac21166255f0","timestamp":1749195448711,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d6988989-e236-43e9-88ee-7104b3d0e8ac","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"8bdb4db5-b1ce-41d7-8069-5de61d3b5a2e","timestamp":1749195449314,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b3b5fe97-2938-4724-b450-74104ce761a8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c86e22e5-016b-421c-a612-46c7f206070b","timestamp":1749195449489,"gateway":"8UUXN4P00A06NK"} + +{"bid":"338f3ab8-c3d9-419f-93ab-ffefd14e190a","data":{"dongle_infos":[]},"tid":"8a785f67-efcd-4c0f-8e5b-06962ae1fbe9","timestamp":1749195450592,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d97aadf4-5ae3-4b8f-b073-b7022c3bab8b","data":{"departure_trajectory":[]},"tid":"9f51cc57-7903-4ec7-84fd-0365999fd191","timestamp":1749195451391,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0178209a-bbcc-4b61-bde6-00d22ba2ea56","data":{"air_transfer_enable":false},"need_reply":1,"tid":"bec95e56-80cd-4c98-8737-1634e49f7f72","timestamp":1749195451431,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b3b5fe97-2938-4724-b450-74104ce761a8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c86e22e5-016b-421c-a612-46c7f206070b","timestamp":1749195451507,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0c3e08b7-19ae-4429-9646-530a750d22a1","data":{"departure_trajectory":[]},"tid":"db184e12-b4da-4afb-9d82-2dd81cc6ab78","timestamp":1749195452031,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bc2fd958-ece6-477c-a3f0-f221094cb090","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ca92f743-fb6f-461b-bce0-ac21166255f0","timestamp":1749195452910,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d6988989-e236-43e9-88ee-7104b3d0e8ac","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"8bdb4db5-b1ce-41d7-8069-5de61d3b5a2e","timestamp":1749195453513,"gateway":"8UUXN4P00A06NK"} + +{"bid":"27b79a68-e1b0-47a8-ab99-861b40cd3d14","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"fe73387a-ca02-468d-83bc-ec79ea70d476","timestamp":1749195454489,"gateway":"8UUXN4P00A06NK"} + +{"tid":"1a1a0e1d-e272-4b7c-9de1-0a5a9b8664cf","bid":"7eed3069-09aa-4a66-ae11-b9b99981acad","timestamp":1749195481655,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"d5e28a00-2c1c-4221-83ad-d10f7dc63550","bid":"46165f35-481f-4050-a816-2d7f810e68a8","timestamp":1749195481661,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c848b96-ff74-4576-9e36-da9e20f1ddd4","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5d0f6810-d3fc-496f-88aa-b9a635c2176b","timestamp":1749195483074,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3308b5b8-ef03-4833-9c39-c79324144b6f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ca160e11-6fd0-4554-a552-4e19863e789c","timestamp":1749195483283,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d7a6479d-e58d-43c9-bb4f-5d18eca97109","data":{"dongle_infos":[]},"tid":"3b99ee38-7f02-4710-97eb-d13e6dd8ba3a","timestamp":1749195483560,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7229e117-2a42-4e3d-aa38-4232cd38f0d3","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"8a5e06e1-5071-4648-bb33-44e914350efc","timestamp":1749195483566,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0a67e754-2878-46ff-8dd1-7406204da077","data":{"firmware_version":"13.01.0002"},"tid":"8418df01-6efd-4a00-aad5-70657ce1f27e","timestamp":1749195483574,"gateway":"8UUXN4P00A06NK"} + +{"bid":"312db65f-0f48-4015-a189-d101e368d084","data":{"air_transfer_enable":false},"need_reply":1,"tid":"04fdb6a1-856c-42c6-89c5-c5c56c446652","timestamp":1749195483751,"gateway":"8UUXN4P00A06NK"} + +{"tid":"f1e2d60a-cd36-4503-b648-3969dcc9cc2b","bid":"472277d7-6a11-415a-8978-94e41d529622","timestamp":1749195483952,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"7ba340ed-aef9-44fe-ad62-54cd99ba361b","data":{"dongle_infos":[]},"tid":"6f0e7be0-8b75-4887-9799-a58bc8cd41a2","timestamp":1749195484561,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c848b96-ff74-4576-9e36-da9e20f1ddd4","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5d0f6810-d3fc-496f-88aa-b9a635c2176b","timestamp":1749195485082,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3308b5b8-ef03-4833-9c39-c79324144b6f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ca160e11-6fd0-4554-a552-4e19863e789c","timestamp":1749195485481,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7229e117-2a42-4e3d-aa38-4232cd38f0d3","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"8a5e06e1-5071-4648-bb33-44e914350efc","timestamp":1749195485682,"gateway":"8UUXN4P00A06NK"} + +{"bid":"21c53df1-39c4-43cd-b18c-f5271f20b05a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c36a6ed7-690c-49bb-8554-ad27ba814be3","timestamp":1749195486657,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3482620c-a38e-4652-a279-852d12e11376","data":{"dongle_infos":[]},"tid":"9a85785c-3dbc-47b4-9deb-e96860f265da","timestamp":1749195486724,"gateway":"8UUXN4P00A06NK"} + +{"bid":"312db65f-0f48-4015-a189-d101e368d084","data":{"air_transfer_enable":false},"need_reply":1,"tid":"04fdb6a1-856c-42c6-89c5-c5c56c446652","timestamp":1749195487953,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1f46fedf-a4d1-409f-a41b-654233331798","data":{"departure_trajectory":[]},"tid":"5f753835-5b28-4b54-9bae-82691ba4f53d","timestamp":1749195488304,"gateway":"8UUXN4P00A06NK"} + +{"bid":"655976f3-8a20-4f58-8566-8cf3fd06a0be","data":{"departure_trajectory":[]},"tid":"3684a5c1-e438-49fe-9497-569c826dbe63","timestamp":1749195488552,"gateway":"8UUXN4P00A06NK"} + +{"bid":"21c53df1-39c4-43cd-b18c-f5271f20b05a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c36a6ed7-690c-49bb-8554-ad27ba814be3","timestamp":1749195488682,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c848b96-ff74-4576-9e36-da9e20f1ddd4","data":{"mobility_status_notify":0},"need_reply":1,"tid":"5d0f6810-d3fc-496f-88aa-b9a635c2176b","timestamp":1749195489280,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7229e117-2a42-4e3d-aa38-4232cd38f0d3","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"8a5e06e1-5071-4648-bb33-44e914350efc","timestamp":1749195489879,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6220b027-bdf7-4694-a54c-b9e6cfe6b84b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7465486a-96e3-4115-b90c-3d5c6c66518c","timestamp":1749195491651,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6220b027-bdf7-4694-a54c-b9e6cfe6b84b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7465486a-96e3-4115-b90c-3d5c6c66518c","timestamp":1749195493682,"gateway":"8UUXN4P00A06NK"} + +{"tid":"97cfee4c-4064-4877-a734-fa003ca8afe6","bid":"fb91b5e7-a812-466c-8c87-908d3f01f5b8","timestamp":1749195517745,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"ceb39a20-3a34-4308-92f1-a629aaf8a84a","bid":"2164a5ad-e8c9-44a8-8f6f-bafb7d39a787","timestamp":1749195517748,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"30a3213f-ed28-462b-b423-2c945d4f9d4a","bid":"b58bb9f4-a699-40db-ab43-08582d90bc8b","timestamp":1749195517918,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"eca1202d-38ff-4429-9d35-db28432c5c50","bid":"ad0ebc7f-2689-43fd-82ce-73c06b870395","timestamp":1749195517942,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"ff416275-f823-47c7-b8f6-68e48c1ccba5","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7a7b3838-fd47-4683-aef3-41244231aa18","timestamp":1749195520443,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8951122b-4482-44e8-aa28-194028388251","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2582b7cc-fd73-40ef-b0fb-6e68198f28f1","timestamp":1749195522436,"gateway":"8UUXN4P00A06NK"} + +{"bid":"49a4ff82-8619-4171-abb4-219739f842de","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"588a02c0-e7c6-4233-a91d-c59dd59b88fe","timestamp":1749195522722,"gateway":"8UUXN4P00A06NK"} + +{"bid":"74a18818-b920-4d4f-bb5a-94c6dfde1e42","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7c126781-f469-4caa-a616-c7bfc076e2b1","timestamp":1749195522755,"gateway":"8UUXN4P00A06NK"} + +{"bid":"96bc24c8-9387-47fc-82ab-d51e33ebba9c","data":{"dongle_infos":[]},"tid":"d940c695-0734-4d7e-bfd8-8019b14a5683","timestamp":1749195522879,"gateway":"8UUXN4P00A06NK"} + +{"bid":"29fe552b-3643-4fad-bf42-10ed2d86fd8d","data":{"firmware_version":"13.01.0002"},"tid":"9619e91a-4a08-42a3-9588-1c7260664b85","timestamp":1749195522890,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eddd1037-8241-4654-bb02-93f010279994","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8bc03eee-d49f-4343-ae30-f19431c9e750","timestamp":1749195522918,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ff416275-f823-47c7-b8f6-68e48c1ccba5","data":{"air_transfer_enable":false},"need_reply":1,"tid":"7a7b3838-fd47-4683-aef3-41244231aa18","timestamp":1749195523075,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d425471d-276b-4fed-ae69-bbe43c03ba44","data":{"mobility_status_notify":0},"need_reply":1,"tid":"294bd97f-fb3a-40e9-9091-6ddc0a28034e","timestamp":1749195523171,"gateway":"8UUXN4P00A06NK"} + +{"tid":"669a011c-78ec-4140-8b38-62c34ca2b356","bid":"1c3c10dd-f217-46d1-8ae1-bd43e53b299c","timestamp":1749195523309,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"6b676540-aed8-4997-bd8c-0c2405cac048","data":{"dongle_infos":[]},"tid":"3d33ab96-f8f2-4ad1-b515-5130eb3775b7","timestamp":1749195523881,"gateway":"8UUXN4P00A06NK"} + +{"tid":"cbba67bd-2fe1-48a7-9d50-dde6b2b7ec04","bid":"ab527ab7-2ce7-47df-a862-2a4d77f66066","timestamp":1749195548663,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"243e4833-4ba3-4f56-896b-5418dc40be80","bid":"e54b2cdb-79c9-4c72-8fa5-46c22e111fbf","timestamp":1749195548670,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"51787dfa-a3dc-49f3-99d3-9facdeb2293e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"c62e87dd-7e21-4da4-9575-f1071f2824e5","timestamp":1749195550018,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b42774cf-3f70-43dd-86ed-2f8d6407723f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"9419e26b-c0aa-4ea9-988d-db3f7caad809","timestamp":1749195552119,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b927665d-e432-4a35-bde3-98f9c0858708","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9202c6b0-8139-47d9-b0cc-c04a364dbd70","timestamp":1749195552195,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dc67f270-d10e-4d6e-8587-975ad89835d1","data":{"dongle_infos":[]},"tid":"f1378929-75b4-4af5-945b-584b94cf6657","timestamp":1749195552479,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a4a5eef2-0225-4373-86b7-c1dc06a1a09c","data":{"firmware_version":"13.01.0002"},"tid":"585a0d56-6a80-41a0-be61-9ba67acbf451","timestamp":1749195552493,"gateway":"8UUXN4P00A06NK"} + +{"bid":"51787dfa-a3dc-49f3-99d3-9facdeb2293e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"c62e87dd-7e21-4da4-9575-f1071f2824e5","timestamp":1749195552676,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c0f5e199-1cbb-409d-a764-3a436996a89e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a5f23289-a461-4cd2-9740-2b7e9f002bac","timestamp":1749195552695,"gateway":"8UUXN4P00A06NK"} + +{"tid":"db6e22d4-3e49-43d8-bee5-8b5283660e0f","bid":"02f2bba1-19c7-4588-be86-bc839def8e89","timestamp":1749195553065,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"2d2aa1bf-46fe-49d6-96b7-1d59e8acf1b0","data":{"dongle_infos":[]},"tid":"18954205-be21-47ab-a190-d5f441fb9e2a","timestamp":1749195553500,"gateway":"8UUXN4P00A06NK"} + +{"bid":"35558355-c127-4780-bdf7-6bd1467dcb3c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"81aa94c5-1c39-46ff-b7d2-ab8657e02212","timestamp":1749195553667,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b42774cf-3f70-43dd-86ed-2f8d6407723f","data":{"mobility_status_notify":0},"need_reply":1,"tid":"9419e26b-c0aa-4ea9-988d-db3f7caad809","timestamp":1749195554185,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c0f5e199-1cbb-409d-a764-3a436996a89e","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"a5f23289-a461-4cd2-9740-2b7e9f002bac","timestamp":1749195554784,"gateway":"8UUXN4P00A06NK"} + +{"tid":"1541e657-967f-4b43-a533-801aa8284ddf","bid":"11ac689c-f7d3-46bc-aa1d-fe90f776cd64","timestamp":1749195579819,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"c62874a5-c559-4d35-afb6-2d3d3e6bda75","bid":"282ba383-5a63-450a-8d39-bad232181bdc","timestamp":1749195579822,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"fe4d14c0-56b9-445c-8453-ab133c111515","bid":"6e3f37df-191c-4c29-8dc7-ba7140e3bce4","timestamp":1749195579830,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"9e3dee97-a28d-4403-8d13-7ce4165826db","bid":"18e97209-7280-4204-ad46-b387118391e3","timestamp":1749195579833,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"11424f7d-ad4e-49e0-9371-01fca8c3f2eb","data":{"air_transfer_enable":false},"need_reply":1,"tid":"cf13e35a-ee7e-4311-aec3-04e342b29068","timestamp":1749195581776,"gateway":"8UUXN4P00A06NK"} + +{"bid":"52140330-97da-4da8-9e8f-396c0102e7f6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"beae927c-4b04-470f-9fee-2be07420ca94","timestamp":1749195583932,"gateway":"8UUXN4P00A06NK"} + +{"bid":"43aa497f-5ea1-449e-916d-80d4bb0a207a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"dea37b70-9fbe-442e-bc62-046998c1c337","timestamp":1749195583959,"gateway":"8UUXN4P00A06NK"} + +{"bid":"090dda05-b97d-46d2-816b-12d2e6820237","data":{"dongle_infos":[]},"tid":"ee754448-ff72-4b11-9878-62e84b2bdc0c","timestamp":1749195584253,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b4b0f378-278b-4af3-a97b-d19858208a25","data":{"firmware_version":"13.01.0002"},"tid":"43bdc5de-2d74-4b74-9b48-432698f768dc","timestamp":1749195584260,"gateway":"8UUXN4P00A06NK"} + +{"bid":"18640c69-558d-46c3-a5dd-39dc42e3d250","data":{"mobility_status_notify":0},"need_reply":1,"tid":"04261ee0-b874-4ebc-bd90-09c88469c92d","timestamp":1749195584412,"gateway":"8UUXN4P00A06NK"} + +{"bid":"11424f7d-ad4e-49e0-9371-01fca8c3f2eb","data":{"air_transfer_enable":false},"need_reply":1,"tid":"cf13e35a-ee7e-4311-aec3-04e342b29068","timestamp":1749195584444,"gateway":"8UUXN4P00A06NK"} + +{"tid":"0be28081-5643-4446-899b-4c2d59177cee","bid":"a7144b4f-361f-4610-8eae-5a18b740b748","timestamp":1749195584692,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"ae7f384c-f85b-4c0b-a3ef-77a37b32bbf7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f01857c5-6580-4653-b33d-8149405093f0","timestamp":1749195584823,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c1e7e96a-b570-4dda-99b0-bd706deeaf9d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"06ed63ac-5556-46a8-9764-8aba545e7d62","timestamp":1749195584829,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9ee106e6-ad85-48e3-984a-089df66a589f","data":{"dongle_infos":[]},"tid":"3f8fd2d3-c419-4875-ba78-62d4b69701cd","timestamp":1749195585248,"gateway":"8UUXN4P00A06NK"} + +{"bid":"43aa497f-5ea1-449e-916d-80d4bb0a207a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"dea37b70-9fbe-442e-bc62-046998c1c337","timestamp":1749195586139,"gateway":"8UUXN4P00A06NK"} + +{"bid":"18640c69-558d-46c3-a5dd-39dc42e3d250","data":{"mobility_status_notify":0},"need_reply":1,"tid":"04261ee0-b874-4ebc-bd90-09c88469c92d","timestamp":1749195586537,"gateway":"8UUXN4P00A06NK"} + +{"tid":"47962652-384c-45a6-b48e-0227abdb3244","bid":"3428004b-55d5-4f16-8404-44b0bc7d8a8a","timestamp":1749195610731,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"87680f59-a707-4fb5-b0a2-c2819fe7d647","bid":"8da2ed54-03e5-4e21-bd44-021d955e8f60","timestamp":1749195610734,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"ebd7bbc4-623e-4950-9a2b-3aeba4b746fe","data":{"air_transfer_enable":false},"need_reply":1,"tid":"570c6f37-727b-4d51-bfb3-fa6d8c82b430","timestamp":1749195612728,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e10eb755-8136-4a27-848e-6e7932ca5014","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"15afb84f-cb9b-4cab-af08-01edf8184494","timestamp":1749195614752,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f0c06e50-2304-4387-bfeb-214164329fc7","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3307ae22-5e7d-4e03-9157-eaa1871c21d3","timestamp":1749195614756,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b676c8bf-587e-45b3-bc33-0ab2c4553e5b","data":{"dongle_infos":[]},"tid":"a75843bf-e14c-4b20-b6f8-a6e0f1e3772b","timestamp":1749195615152,"gateway":"8UUXN4P00A06NK"} + +{"bid":"27141e15-1fcd-4aef-89dc-a3fd91b21e61","data":{"firmware_version":"13.01.0002"},"tid":"fa595a6c-688b-4ab8-957a-3d2ae28ab463","timestamp":1749195615158,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ebd7bbc4-623e-4950-9a2b-3aeba4b746fe","data":{"air_transfer_enable":false},"need_reply":1,"tid":"570c6f37-727b-4d51-bfb3-fa6d8c82b430","timestamp":1749195615347,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2db9f6ba-a399-4498-b30e-05cb6ac7d4ed","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"27a8b93c-bdd8-4564-81be-0902d371cbdc","timestamp":1749195615351,"gateway":"8UUXN4P00A06NK"} + +{"bid":"32854294-b788-4c97-93ec-5828aed1f135","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"49df3386-156d-4c8f-91f9-42ace69b765f","timestamp":1749195615733,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b4a86ce4-be2b-43d5-b5c8-145b6488abf7","bid":"900dd74a-6505-4b8b-8103-083a513fd077","timestamp":1749195616159,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"380d370c-8cb9-4c53-bba4-e0ba2500c21b","data":{"dongle_infos":[]},"tid":"c890a672-ba06-4c1b-a471-c84aa33662b2","timestamp":1749195616181,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f0c06e50-2304-4387-bfeb-214164329fc7","data":{"mobility_status_notify":0},"need_reply":1,"tid":"3307ae22-5e7d-4e03-9157-eaa1871c21d3","timestamp":1749195616889,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2db9f6ba-a399-4498-b30e-05cb6ac7d4ed","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"27a8b93c-bdd8-4564-81be-0902d371cbdc","timestamp":1749195617492,"gateway":"8UUXN4P00A06NK"} + +{"tid":"773f72cd-f183-4b88-9640-47a3afa7bae7","bid":"54c3d42c-be5e-46da-9b83-65382eb60401","timestamp":1749195644169,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"69f07e64-8892-4355-9776-29da7a5a32e3","bid":"8029bcc1-1a0b-42e6-b8b4-92f18ac0bc7d","timestamp":1749195644175,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"5dbe07f4-f604-4e38-b345-31ba538d48ab","data":{"mobility_status_notify":0},"need_reply":1,"tid":"257e844c-1d03-400f-b762-7b8adb6e8e5a","timestamp":1749195645341,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3828e4a9-be0b-44b3-8087-9f42ecc26eee","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a653421b-b0e5-4639-973a-c49a702649f2","timestamp":1749195645416,"gateway":"8UUXN4P00A06NK"} + +{"bid":"44711b9c-a991-4fb0-92a3-617b83034f9f","data":{"dongle_infos":[]},"tid":"dbec6da0-2047-4fac-be01-a66afccec68c","timestamp":1749195645733,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bdb989ab-a8cc-444b-b417-d3e1b49c35c3","data":{"dongle_infos":[]},"tid":"a2eaacca-c360-4d30-a526-09632266ffc4","timestamp":1749195645734,"gateway":"8UUXN4P00A06NK"} + +{"bid":"76a0c82b-856e-4c85-bf73-8b035d8c084d","data":{"firmware_version":"13.01.0002"},"tid":"2371b7a8-339d-4125-abb8-f0085aa8f786","timestamp":1749195645740,"gateway":"8UUXN4P00A06NK"} + +{"bid":"83b3f31b-dc8b-44de-bde5-1e9a22d7d6e4","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ae192ef3-11e0-4850-8f4d-de8819c5caed","timestamp":1749195645915,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0d165002-4995-4a62-a98f-6c6c4d0a2771","data":{"air_transfer_enable":false},"need_reply":1,"tid":"9f6c0183-74b0-453b-95a3-9c62deac8402","timestamp":1749195645925,"gateway":"8UUXN4P00A06NK"} + +{"tid":"eced204c-4266-4d8e-8b96-d2b2e1e8bfb8","bid":"98a8ab5e-d490-4dbc-b14a-68edc475c62c","timestamp":1749195646143,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"454c77fa-1239-44c9-a495-3d145aa6652b","data":{"dongle_infos":[]},"tid":"e5728547-8b15-4785-9fdf-7bd19ff210c1","timestamp":1749195646735,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5dbe07f4-f604-4e38-b345-31ba538d48ab","data":{"mobility_status_notify":0},"need_reply":1,"tid":"257e844c-1d03-400f-b762-7b8adb6e8e5a","timestamp":1749195647442,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3828e4a9-be0b-44b3-8087-9f42ecc26eee","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a653421b-b0e5-4639-973a-c49a702649f2","timestamp":1749195647443,"gateway":"8UUXN4P00A06NK"} + +{"bid":"83b3f31b-dc8b-44de-bde5-1e9a22d7d6e4","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ae192ef3-11e0-4850-8f4d-de8819c5caed","timestamp":1749195648045,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5a2e68e2-7379-4d48-a7a6-129d263108d4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1e5824f3-efe0-439a-aae0-dc95921e9fa6","timestamp":1749195649165,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0d165002-4995-4a62-a98f-6c6c4d0a2771","data":{"air_transfer_enable":false},"need_reply":1,"tid":"9f6c0183-74b0-453b-95a3-9c62deac8402","timestamp":1749195650125,"gateway":"8UUXN4P00A06NK"} + +{"bid":"035c60ee-345a-46e8-88a4-b4ffd32d3e64","data":{"departure_trajectory":[]},"tid":"f65e45fe-719d-40b7-bf33-57c7b902ed82","timestamp":1749195650725,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4f1bc5e2-8d81-4c51-a31c-5fd4233363e0","data":{"departure_trajectory":[]},"tid":"616fbc7f-8f68-41d4-98f1-7661d5c248ed","timestamp":1749195650730,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5a2e68e2-7379-4d48-a7a6-129d263108d4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1e5824f3-efe0-439a-aae0-dc95921e9fa6","timestamp":1749195651242,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5dbe07f4-f604-4e38-b345-31ba538d48ab","data":{"mobility_status_notify":0},"need_reply":1,"tid":"257e844c-1d03-400f-b762-7b8adb6e8e5a","timestamp":1749195651642,"gateway":"8UUXN4P00A06NK"} + +{"bid":"83b3f31b-dc8b-44de-bde5-1e9a22d7d6e4","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ae192ef3-11e0-4850-8f4d-de8819c5caed","timestamp":1749195652246,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e0621671-c90b-4e01-8e4f-32bdbf002c4d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"302071e6-4557-4906-bab6-fb8c99fa3f0a","timestamp":1749195654163,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d5c4eb04-e905-4e00-bf09-487fd52c10fe","bid":"a74ccaa1-fdb4-4e51-93d0-8de22d019607","timestamp":1749195683274,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"1ea8b9ea-284a-4d1c-9171-06b2b7802fe7","bid":"4a760362-109a-4532-920a-64ef8efbdd83","timestamp":1749195683278,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"cc9442cb-034f-4789-86f4-babad8f45a99","data":{"mobility_status_notify":0},"need_reply":1,"tid":"cd68fc25-2f61-4ba6-83a8-0e4e67d0d5c9","timestamp":1749195684676,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e4e2da6d-444c-4f37-9070-d85974b5261a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d4bebce8-7270-49d3-bb66-826f0604aba8","timestamp":1749195684856,"gateway":"8UUXN4P00A06NK"} + +{"tid":"28f34dba-faa2-4143-9744-55327a51b2ea","bid":"a84078eb-c5c3-465d-8682-5f84d2f4bd76","timestamp":1749195685047,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"94765029-1c05-42f1-846b-a281504df48c","data":{"dongle_infos":[]},"tid":"ebe9308d-1b27-40b1-baa8-d4a6979a93f4","timestamp":1749195685128,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ddd98ae8-0174-4a77-a7e6-b10f312a9313","data":{"firmware_version":"13.01.0002"},"tid":"ea4deca9-7049-4b59-ad68-65f0154acf1c","timestamp":1749195685136,"gateway":"8UUXN4P00A06NK"} + +{"bid":"422308de-7952-4468-892e-5908ef3c4ae3","data":{"air_transfer_enable":false},"need_reply":1,"tid":"23529440-35ce-41bf-bc06-8842477e9a9a","timestamp":1749195685140,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5eb17ac2-7056-40f7-b501-7f7c83944252","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b333a738-8f8d-49ab-a988-a3e91d7c1fcd","timestamp":1749195685155,"gateway":"8UUXN4P00A06NK"} + +{"bid":"69d0945f-02ea-4433-b113-35f1e20a619d","data":{"dongle_infos":[]},"tid":"af62cf03-f4f4-46cb-b798-50a4eb3ff528","timestamp":1749195686139,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cc9442cb-034f-4789-86f4-babad8f45a99","data":{"mobility_status_notify":0},"need_reply":1,"tid":"cd68fc25-2f61-4ba6-83a8-0e4e67d0d5c9","timestamp":1749195686696,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e4e2da6d-444c-4f37-9070-d85974b5261a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d4bebce8-7270-49d3-bb66-826f0604aba8","timestamp":1749195686898,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5eb17ac2-7056-40f7-b501-7f7c83944252","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b333a738-8f8d-49ab-a988-a3e91d7c1fcd","timestamp":1749195687295,"gateway":"8UUXN4P00A06NK"} + +{"bid":"69b247b2-b5da-4d2c-9898-b9cc0c9fcb01","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"dc681880-68ea-4278-a75d-2e9f322bac33","timestamp":1749195688275,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e8cabac4-d184-4bfc-af2a-5d7b6366e058","data":{"dongle_infos":[]},"tid":"fad73e5b-645f-43ec-85a6-8b9ba834aa88","timestamp":1749195688389,"gateway":"8UUXN4P00A06NK"} + +{"bid":"422308de-7952-4468-892e-5908ef3c4ae3","data":{"air_transfer_enable":false},"need_reply":1,"tid":"23529440-35ce-41bf-bc06-8842477e9a9a","timestamp":1749195689339,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e76733d6-6e6d-4fe9-b5bd-904a6c1bbd44","data":{"departure_trajectory":[]},"tid":"35238ee0-6a93-4959-9f6f-1ecd3bf4e6fe","timestamp":1749195689986,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f5ca1873-567b-495d-86f3-8acf630777d3","data":{"departure_trajectory":[]},"tid":"7b252558-d295-4244-95f6-41cd5b7167d6","timestamp":1749195690123,"gateway":"8UUXN4P00A06NK"} + +{"bid":"69b247b2-b5da-4d2c-9898-b9cc0c9fcb01","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"dc681880-68ea-4278-a75d-2e9f322bac33","timestamp":1749195690294,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cc9442cb-034f-4789-86f4-babad8f45a99","data":{"mobility_status_notify":0},"need_reply":1,"tid":"cd68fc25-2f61-4ba6-83a8-0e4e67d0d5c9","timestamp":1749195690898,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5eb17ac2-7056-40f7-b501-7f7c83944252","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"b333a738-8f8d-49ab-a988-a3e91d7c1fcd","timestamp":1749195691494,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4a07da2f-b5de-44f2-a6ee-fb5357fc0290","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"23dea0f0-d7c3-4d45-99de-1b2c435dc5d1","timestamp":1749195693273,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4a07da2f-b5de-44f2-a6ee-fb5357fc0290","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"23dea0f0-d7c3-4d45-99de-1b2c435dc5d1","timestamp":1749195695295,"gateway":"8UUXN4P00A06NK"} + +{"tid":"9a7516e6-780e-41bf-86a5-c7e51bf28eff","bid":"2cb56229-870a-49e2-8481-a0adeed574ba","timestamp":1749195721465,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"27db9278-7df2-4e96-9d03-f2ce87d6a532","bid":"8575117b-5869-4dd6-a45c-95fb56a238f1","timestamp":1749195721467,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"2dca1cc4-3e5b-43c5-ac6c-44c1223249c3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2f0b8de8-5e85-405d-9a31-7887eb328f3b","timestamp":1749195723113,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6f315e7c-69c3-4f51-876c-be3f39bf0d1a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7b5d6465-880c-4611-9b03-260f528f043c","timestamp":1749195723232,"gateway":"8UUXN4P00A06NK"} + +{"bid":"23d44fa7-14c3-44c9-965d-17ec8d5437f7","data":{"dongle_infos":[]},"tid":"3f98d7c7-8bc6-4571-bd07-575add9ce029","timestamp":1749195723525,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a2e46ddc-b4b7-4072-a429-276ca5a0c172","data":{"dongle_infos":[]},"tid":"0c482676-5ecf-48ab-ba73-b1a7b8944534","timestamp":1749195723531,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c7c2657b-9d3d-4b3a-ba39-70a5af0df3a2","data":{"firmware_version":"13.01.0002"},"tid":"22588d37-f001-4958-ae56-21c033b0d359","timestamp":1749195723533,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e812e2f7-427b-4b8f-8068-02fb08e0bf79","data":{"air_transfer_enable":false},"need_reply":1,"tid":"04e3944a-20aa-48f6-ab21-fd161d99f485","timestamp":1749195723718,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a64fbab0-9a7c-42d3-9ace-2d1e6df0f9e7","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"4f13fbdb-ff6a-4427-9d0f-cbabf9ab3c97","timestamp":1749195723831,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ca9d9077-301a-4d9a-855d-a6c292ec57e7","bid":"457447d0-1557-42ae-9384-241b63f91211","timestamp":1749195724534,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"bf87c3a9-9bf1-46b5-9f60-49f0cdeb413a","data":{"dongle_infos":[]},"tid":"86b1921b-f2ee-47b4-81d9-2ddcb157c3ea","timestamp":1749195724541,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2dca1cc4-3e5b-43c5-ac6c-44c1223249c3","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2f0b8de8-5e85-405d-9a31-7887eb328f3b","timestamp":1749195725294,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6f315e7c-69c3-4f51-876c-be3f39bf0d1a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"7b5d6465-880c-4611-9b03-260f528f043c","timestamp":1749195725295,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a64fbab0-9a7c-42d3-9ace-2d1e6df0f9e7","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"4f13fbdb-ff6a-4427-9d0f-cbabf9ab3c97","timestamp":1749195725895,"gateway":"8UUXN4P00A06NK"} + +{"bid":"37c5770f-eaed-42f7-9501-eccd27bf3cea","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"648493fb-d146-4c15-8dee-3d823ac7fe38","timestamp":1749195726468,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e812e2f7-427b-4b8f-8068-02fb08e0bf79","data":{"air_transfer_enable":false},"need_reply":1,"tid":"04e3944a-20aa-48f6-ab21-fd161d99f485","timestamp":1749195727918,"gateway":"8UUXN4P00A06NK"} + +{"tid":"f41a54f2-84e3-45d7-9fe7-3e1cd9cfaea8","bid":"9a25228f-19f5-427c-8e57-5c79829184ef","timestamp":1749195754171,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"698bfe75-5dac-4663-8651-fe79a8d38b31","bid":"1dcb9af2-3d19-4db8-b399-6f740b81910a","timestamp":1749195754174,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"5d751e17-c679-40b1-b725-1ec6566a91f6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"607bf511-b292-4dfb-bd48-2854f5b53a39","timestamp":1749195755351,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c99818e7-998a-4a90-b8de-750748679687","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c6a12847-241e-4ee5-8d67-0384c19f6fe3","timestamp":1749195755548,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8cefe3de-2b44-4f26-bb77-f38b195e2fc8","data":{"air_transfer_enable":false},"need_reply":1,"tid":"95b6109c-d66d-400d-95a1-d2888f16aab7","timestamp":1749195755819,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0fc2a13d-678f-4f81-9888-50fb047a9dfb","data":{"dongle_infos":[]},"tid":"8523908a-f191-42ee-8f96-78f569426282","timestamp":1749195755834,"gateway":"8UUXN4P00A06NK"} + +{"bid":"90d56369-820a-497c-848b-d99b7d495b51","data":{"firmware_version":"13.01.0002"},"tid":"b6f6fa35-8e3f-418f-8b2e-e5a4219ed5da","timestamp":1749195755840,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c13290c-a3e2-4072-9407-ba86c1f02ab5","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"7e24b835-766d-4766-bef1-7851cd13c8a9","timestamp":1749195755847,"gateway":"8UUXN4P00A06NK"} + +{"tid":"bd9a117e-0511-4408-a8c1-8b4bae08461a","bid":"b1aef241-3d81-40dd-8a80-ed32892b2c9d","timestamp":1749195756254,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"4dc1901a-7d9d-4852-9f8f-7889909fe0ad","data":{"dongle_infos":[]},"tid":"4aedee35-3ffd-404b-a926-a8b7308b8acc","timestamp":1749195756824,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5d751e17-c679-40b1-b725-1ec6566a91f6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"607bf511-b292-4dfb-bd48-2854f5b53a39","timestamp":1749195757453,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c99818e7-998a-4a90-b8de-750748679687","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c6a12847-241e-4ee5-8d67-0384c19f6fe3","timestamp":1749195757653,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c13290c-a3e2-4072-9407-ba86c1f02ab5","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"7e24b835-766d-4766-bef1-7851cd13c8a9","timestamp":1749195757854,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1a6fbf73-900e-4e82-a76e-c61db6bf9a28","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9f70ddfe-db52-4446-b446-1ff50fa93024","timestamp":1749195759169,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8cefe3de-2b44-4f26-bb77-f38b195e2fc8","data":{"air_transfer_enable":false},"need_reply":1,"tid":"95b6109c-d66d-400d-95a1-d2888f16aab7","timestamp":1749195760017,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bc6360b8-fe8e-4812-a3e2-5d70b1c79cf9","data":{"dongle_infos":[]},"tid":"da378c93-0861-453b-b700-2e1f37ab6b71","timestamp":1749195760425,"gateway":"8UUXN4P00A06NK"} + +{"bid":"60d22c31-2bae-47ad-b8e5-05694c623599","data":{"departure_trajectory":[]},"tid":"239b0591-a2c6-42ab-9dcb-8a7bec207d60","timestamp":1749195760768,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cb6cabb4-3374-4638-81ca-75b7b9bd88a5","data":{"departure_trajectory":[]},"tid":"39234ea4-4c71-4fa8-8e9c-9b70d09ca6fb","timestamp":1749195760814,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1a6fbf73-900e-4e82-a76e-c61db6bf9a28","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9f70ddfe-db52-4446-b446-1ff50fa93024","timestamp":1749195761253,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5d751e17-c679-40b1-b725-1ec6566a91f6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"607bf511-b292-4dfb-bd48-2854f5b53a39","timestamp":1749195761652,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c13290c-a3e2-4072-9407-ba86c1f02ab5","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"7e24b835-766d-4766-bef1-7851cd13c8a9","timestamp":1749195762058,"gateway":"8UUXN4P00A06NK"} + +{"bid":"71099d99-8fa3-4f61-b375-b396c44d12f7","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6d71e68d-6939-4154-a75b-317156aa393c","timestamp":1749195764166,"gateway":"8UUXN4P00A06NK"} + +{"tid":"2b672d62-47f5-411a-84b3-022204a571a7","bid":"80e51658-21ea-4bc2-b9de-7c910ce5d666","timestamp":1749195792630,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"42fe5847-6c1b-43ca-991c-4e027a808dce","bid":"7bac1c97-9fb1-4644-b3b7-19174dadff96","timestamp":1749195792635,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"298d262c-2be9-4634-abd0-738e2411ac0e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3d2b6e35-c5ae-42a9-899e-c5e1ff8c9756","timestamp":1749195794644,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a57b23fb-0854-42ff-9359-b2a9bd25e556","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"cecafdb1-57c2-4626-84eb-15ea64c9c03b","timestamp":1749195794670,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eec8baf7-0eb1-4c7b-984c-5e84fde7fcc5","data":{"air_transfer_enable":false},"need_reply":1,"tid":"65ae2eb0-3593-4325-92c0-b7228ee77b93","timestamp":1749195794781,"gateway":"8UUXN4P00A06NK"} + +{"bid":"af5222a6-a01e-408c-bd54-498399a878aa","data":{"dongle_infos":[]},"tid":"d4b44b6f-ed9c-4b1f-ac57-4e6549414679","timestamp":1749195794786,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4014068a-a924-45f4-b985-a55795f90094","data":{"firmware_version":"13.01.0002"},"tid":"2e9c98f2-7b7b-43ca-8341-ee5b1c5c88c9","timestamp":1749195794795,"gateway":"8UUXN4P00A06NK"} + +{"tid":"1329010f-4ffb-41dc-aabc-5b5c6a373262","bid":"2f3782b4-2aa0-4837-98d3-6315e05fd3b6","timestamp":1749195794946,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"240e327e-3f51-4c41-b185-78164e7e9686","data":{"mobility_status_notify":0},"need_reply":1,"tid":"188ad45e-7336-46ea-968a-efc69cb0f086","timestamp":1749195795102,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e65dc996-babd-43d5-b438-8e62b24897d4","data":{"dongle_infos":[]},"tid":"fe4803a6-f4c6-44d1-b5e1-cd7e9b1dc6d3","timestamp":1749195795789,"gateway":"8UUXN4P00A06NK"} + +{"bid":"298d262c-2be9-4634-abd0-738e2411ac0e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3d2b6e35-c5ae-42a9-899e-c5e1ff8c9756","timestamp":1749195796736,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a57b23fb-0854-42ff-9359-b2a9bd25e556","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"cecafdb1-57c2-4626-84eb-15ea64c9c03b","timestamp":1749195796737,"gateway":"8UUXN4P00A06NK"} + +{"bid":"240e327e-3f51-4c41-b185-78164e7e9686","data":{"mobility_status_notify":0},"need_reply":1,"tid":"188ad45e-7336-46ea-968a-efc69cb0f086","timestamp":1749195797135,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f3472858-bafb-472d-b07a-21cf80994219","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"097b83ba-0b64-4d53-abd2-95fff4faa3fd","timestamp":1749195797628,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8b6919ea-6a48-41d0-aa53-5bd1ad02f2b4","data":{"dongle_infos":[]},"tid":"5e619295-505d-41fc-bd51-94e366e48bd1","timestamp":1749195798040,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eec8baf7-0eb1-4c7b-984c-5e84fde7fcc5","data":{"air_transfer_enable":false},"need_reply":1,"tid":"65ae2eb0-3593-4325-92c0-b7228ee77b93","timestamp":1749195798976,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f2a4b01c-9230-4c3d-98b0-24f4d4fa2f2d","data":{"departure_trajectory":[]},"tid":"e9b2280e-32c6-4fcf-88d1-a5032e26dc58","timestamp":1749195799239,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f3472858-bafb-472d-b07a-21cf80994219","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"097b83ba-0b64-4d53-abd2-95fff4faa3fd","timestamp":1749195799735,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b7186efa-a664-4255-ac30-3fdece951755","data":{"departure_trajectory":[]},"tid":"0acef8af-1b29-43f8-8a73-18a351d18ee5","timestamp":1749195799779,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a57b23fb-0854-42ff-9359-b2a9bd25e556","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"cecafdb1-57c2-4626-84eb-15ea64c9c03b","timestamp":1749195800934,"gateway":"8UUXN4P00A06NK"} + +{"bid":"240e327e-3f51-4c41-b185-78164e7e9686","data":{"mobility_status_notify":0},"need_reply":1,"tid":"188ad45e-7336-46ea-968a-efc69cb0f086","timestamp":1749195801334,"gateway":"8UUXN4P00A06NK"} + +{"bid":"106746cd-b1d5-48b7-bbe3-29c2f22f16e0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8334a2ce-2a49-4b33-b4c4-19231be736f0","timestamp":1749195802628,"gateway":"8UUXN4P00A06NK"} + +{"tid":"60542eee-121a-4545-8f09-67e0947e7adc","bid":"6192cb61-0af2-45b1-81e6-ef4e2ed61f38","timestamp":1749195830905,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"ee911cd2-425f-4553-a6a3-e22caf725fd1","bid":"6efa2052-04b2-4683-98d8-20850e5ba582","timestamp":1749195830908,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"545d3d35-aa94-4cdf-bb35-29c8bebcdd11","data":{"mobility_status_notify":0},"need_reply":1,"tid":"df3d8018-9de4-4870-937c-66e5bd34f753","timestamp":1749195832229,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c1253c6a-eddf-4ca8-a580-c176f231a8b8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"355ed6bf-9501-45f5-8c4c-483aef005eba","timestamp":1749195832396,"gateway":"8UUXN4P00A06NK"} + +{"bid":"770fa86a-cbc9-402e-b4bc-f82616001794","data":{"dongle_infos":[]},"tid":"46d0891a-4a98-481c-a3ac-fb196fc2f2dc","timestamp":1749195832681,"gateway":"8UUXN4P00A06NK"} + +{"bid":"17eeb624-e147-4ca4-9739-774a3921577a","data":{"firmware_version":"13.01.0002"},"tid":"f37beb09-4e57-4ab1-8bc6-5b0bc5749a61","timestamp":1749195832687,"gateway":"8UUXN4P00A06NK"} + +{"bid":"353c028e-4049-499b-92d0-b07484929439","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"40e98e0f-7bd6-49a3-85d0-f682afe2e7be","timestamp":1749195832717,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0a915a3e-693c-43c8-be90-12d4d612d434","data":{"air_transfer_enable":false},"need_reply":1,"tid":"db9597c3-3230-48b6-aba9-173f44df9e48","timestamp":1749195832874,"gateway":"8UUXN4P00A06NK"} + +{"tid":"ce044168-58fc-4406-bda5-69dd75b1ad8d","bid":"b42e3660-1192-4c41-a2bf-3411cad30511","timestamp":1749195833076,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"5f803c0a-e199-4afd-a4b5-a9b67b8d8caa","data":{"dongle_infos":[]},"tid":"eb30c9bc-f12c-4488-9528-b8a525219c51","timestamp":1749195833682,"gateway":"8UUXN4P00A06NK"} + +{"bid":"545d3d35-aa94-4cdf-bb35-29c8bebcdd11","data":{"mobility_status_notify":0},"need_reply":1,"tid":"df3d8018-9de4-4870-937c-66e5bd34f753","timestamp":1749195834290,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c1253c6a-eddf-4ca8-a580-c176f231a8b8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"355ed6bf-9501-45f5-8c4c-483aef005eba","timestamp":1749195834486,"gateway":"8UUXN4P00A06NK"} + +{"bid":"353c028e-4049-499b-92d0-b07484929439","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"40e98e0f-7bd6-49a3-85d0-f682afe2e7be","timestamp":1749195834885,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4d88b556-b361-45b4-bfab-65e39595abe4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8fe0443c-0883-4fae-8158-bf00a70e14d8","timestamp":1749195835903,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0a915a3e-693c-43c8-be90-12d4d612d434","data":{"air_transfer_enable":false},"need_reply":1,"tid":"db9597c3-3230-48b6-aba9-173f44df9e48","timestamp":1749195837078,"gateway":"8UUXN4P00A06NK"} + +{"bid":"71f1dc8b-287a-4a02-8cd8-24dddd63ded5","data":{"dongle_infos":[]},"tid":"32cb2d1a-e3cb-4f54-bbb2-8e89fc6c8fc7","timestamp":1749195837108,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a451f86e-f9c7-4901-8921-77de27ea5938","data":{"departure_trajectory":[]},"tid":"c466f059-3bf6-41c6-977c-d5ecd78287da","timestamp":1749195837535,"gateway":"8UUXN4P00A06NK"} + +{"bid":"77d6f869-3307-4036-a18f-51b6cbb832f4","data":{"departure_trajectory":[]},"tid":"6be42076-e16c-4257-8738-cb46e2882515","timestamp":1749195837678,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4d88b556-b361-45b4-bfab-65e39595abe4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8fe0443c-0883-4fae-8158-bf00a70e14d8","timestamp":1749195838090,"gateway":"8UUXN4P00A06NK"} + +{"bid":"545d3d35-aa94-4cdf-bb35-29c8bebcdd11","data":{"mobility_status_notify":0},"need_reply":1,"tid":"df3d8018-9de4-4870-937c-66e5bd34f753","timestamp":1749195838489,"gateway":"8UUXN4P00A06NK"} + +{"bid":"353c028e-4049-499b-92d0-b07484929439","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"40e98e0f-7bd6-49a3-85d0-f682afe2e7be","timestamp":1749195839083,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6f7b0906-028e-46d5-a597-cfd2fcf16870","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a1a1eb26-dad4-45f5-a5a2-727149c6c3b1","timestamp":1749195840915,"gateway":"8UUXN4P00A06NK"} + +{"tid":"2d074b70-47f4-4565-9775-9702d05bda9f","bid":"69bb00d9-6b91-41b4-bd57-82888354c7a7","timestamp":1749195868101,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"cdf6bb01-aa55-4799-b517-95dd4bd029f1","bid":"b344837f-aa5e-4189-9de5-2ec5b1e29854","timestamp":1749195868105,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"d7735312-2468-4df8-ad55-de628e7ddd03","data":{"air_transfer_enable":false},"need_reply":1,"tid":"656cdad2-d7ee-46d2-a696-e503edb84053","timestamp":1749195868569,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a6ac8ae7-4be1-4e99-ace0-9d5d0cf33313","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"112becc9-4879-4a89-84a6-1312405a44be","timestamp":1749195870517,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7bbb4d69-fe35-4985-b0ee-a978536a3b91","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ae1090b7-b5e3-4f8e-9c9e-f77ce25a7c83","timestamp":1749195870802,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5ced1cf1-5e2f-44af-b6ba-8397fd80058d","data":{"dongle_infos":[]},"tid":"42789d07-5aaf-4b42-a774-46174b75a530","timestamp":1749195870941,"gateway":"8UUXN4P00A06NK"} + +{"bid":"48438429-237d-47e2-9b2e-a6ec6b4d306d","data":{"dongle_infos":[]},"tid":"4a326f63-bd0c-4897-8205-1d4ac7a39dda","timestamp":1749195870942,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8f3c9311-bf73-4b29-a8a5-41de8a7f6d14","data":{"firmware_version":"13.01.0002"},"tid":"ce2180a4-01da-4419-8546-deaa6128cb6a","timestamp":1749195870950,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b8465f9b-d711-42ef-83ef-9ac33bfc16d6","bid":"9afdc419-403d-486d-a7bb-eda980af039a","timestamp":1749195871032,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"d7735312-2468-4df8-ad55-de628e7ddd03","data":{"air_transfer_enable":false},"need_reply":1,"tid":"656cdad2-d7ee-46d2-a696-e503edb84053","timestamp":1749195871154,"gateway":"8UUXN4P00A06NK"} + +{"bid":"76e780f7-b050-4459-9c94-3a596200810e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0cdde3ce-56d5-4a51-b873-47f3aa34ee5f","timestamp":1749195871254,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eae67bac-f02b-4dd1-b57e-bcd3eb1f7b4b","data":{"dongle_infos":[]},"tid":"7e505ec9-7936-49b3-b845-30fdad815b62","timestamp":1749195871980,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a6ac8ae7-4be1-4e99-ace0-9d5d0cf33313","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"112becc9-4879-4a89-84a6-1312405a44be","timestamp":1749195872698,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7bbb4d69-fe35-4985-b0ee-a978536a3b91","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ae1090b7-b5e3-4f8e-9c9e-f77ce25a7c83","timestamp":1749195872899,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2473748e-7651-4e50-9c36-398eeabe7ae6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8c90dede-4a8b-465e-a42b-dec6f31d0128","timestamp":1749195873102,"gateway":"8UUXN4P00A06NK"} + +{"bid":"76e780f7-b050-4459-9c94-3a596200810e","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0cdde3ce-56d5-4a51-b873-47f3aa34ee5f","timestamp":1749195873298,"gateway":"8UUXN4P00A06NK"} + +{"tid":"09e861b5-f70d-45f3-a345-8ff0cfcf1ae5","bid":"0c04e9ad-ceca-4f16-9740-7d676eb74916","timestamp":1749195899976,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"897da113-07c8-4917-b3d9-baad262f7cb4","bid":"a5a71374-755f-4420-8e00-0b30a4848298","timestamp":1749195899979,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"1d2170a9-328c-43a5-ba6a-77ea43a7d163","data":{"air_transfer_enable":false},"need_reply":1,"tid":"f18c194f-f46d-440e-9894-9c34ecb62d40","timestamp":1749195901395,"gateway":"8UUXN4P00A06NK"} + +{"bid":"667fcb7a-8387-46e3-b10d-103a69e8cdf9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4cc6d8bd-6ad8-4696-a2e0-1bd6a5733bc9","timestamp":1749195903530,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e3f7cb2-53cb-45ce-8d6a-5aabfb21051c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"0d3e7cff-475e-4a8b-b1ea-7e6baf02c64b","timestamp":1749195903545,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aa4e77be-f0a0-4837-ba6b-f157b0f737e6","data":{"dongle_infos":[]},"tid":"39c46eec-b692-4d42-a173-1351f56092e4","timestamp":1749195903833,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f61d81d6-d99f-4868-8bcf-a66b3bbea479","data":{"firmware_version":"13.01.0002"},"tid":"6e47fc26-a768-4809-8332-5b91d6635532","timestamp":1749195903838,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fb23b8dd-da7e-48fe-82c7-f694f60a5dfb","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ecfc30ff-1afc-4bef-834f-90fcfb5c693a","timestamp":1749195903988,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1d2170a9-328c-43a5-ba6a-77ea43a7d163","data":{"air_transfer_enable":false},"need_reply":1,"tid":"f18c194f-f46d-440e-9894-9c34ecb62d40","timestamp":1749195904029,"gateway":"8UUXN4P00A06NK"} + +{"tid":"3ad7c9dd-54b5-4b31-ad22-11a0deea8d57","bid":"82b20c28-1637-41c4-ab05-ec7968f2ff9f","timestamp":1749195904162,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"bde051be-da58-4764-91f1-9c056e9167f8","data":{"dongle_infos":[]},"tid":"3c097665-0ed8-496e-b273-bfe131b7a8d5","timestamp":1749195904883,"gateway":"8UUXN4P00A06NK"} + +{"bid":"051b1f4f-775d-4826-8b7e-14417363e50c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"602465d5-664c-45a1-a08a-0e29b4efe567","timestamp":1749195904980,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4e3f7cb2-53cb-45ce-8d6a-5aabfb21051c","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"0d3e7cff-475e-4a8b-b1ea-7e6baf02c64b","timestamp":1749195905667,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fb23b8dd-da7e-48fe-82c7-f694f60a5dfb","data":{"mobility_status_notify":0},"need_reply":1,"tid":"ecfc30ff-1afc-4bef-834f-90fcfb5c693a","timestamp":1749195906068,"gateway":"8UUXN4P00A06NK"} + +{"tid":"3406b6a9-314c-4f26-905c-8d6c0fe60275","bid":"dc0d0940-f480-4399-ab7b-fb3ab8662a68","timestamp":1749195934444,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"cdeb3ddc-e8dd-4df5-8f45-37a1ba0346c8","bid":"7c16aa1c-947e-4ec4-80f3-e72f1e6eba98","timestamp":1749195934447,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"1ca67c7c-3c4d-4875-895e-6eaa5189499e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"81e31334-4935-4ca2-981a-96e954c093e6","timestamp":1749195935380,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6d0c5bd5-7f3c-499a-82d4-8144bd1bab56","data":{"mobility_status_notify":0},"need_reply":1,"tid":"dc37fb9b-8470-48b0-99cb-76fa10802ad9","timestamp":1749195935395,"gateway":"8UUXN4P00A06NK"} + +{"bid":"634a5de2-8984-48d7-8a97-201e49725219","data":{"air_transfer_enable":false},"need_reply":1,"tid":"86393a4e-dda6-411a-82c9-3ca3d8b6f195","timestamp":1749195935720,"gateway":"8UUXN4P00A06NK"} + +{"bid":"08238317-5a53-4e1b-8ce3-747050f6abfa","data":{"dongle_infos":[]},"tid":"c124957c-c841-4022-be86-5f7522a89ffe","timestamp":1749195935725,"gateway":"8UUXN4P00A06NK"} + +{"bid":"89d34d26-bba3-4295-8089-52f74a0d8a03","data":{"firmware_version":"13.01.0002"},"tid":"e0e54c36-87c5-40d6-b4ca-d01c8c80b894","timestamp":1749195935733,"gateway":"8UUXN4P00A06NK"} + +{"bid":"96e67e65-f339-4430-b0aa-fc2b2eb04998","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"726d3d19-b600-46cb-be4e-48fe271e02ed","timestamp":1749195935963,"gateway":"8UUXN4P00A06NK"} + +{"tid":"5243d78b-e7fc-46e7-8110-3dc4aeb1b2e2","bid":"a6d1d4aa-c7b3-4a48-8345-aad7f7552cd0","timestamp":1749195936236,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"69fad074-5de9-4efe-965c-4d8623d9c7a7","data":{"dongle_infos":[]},"tid":"69049cca-a1da-4599-8538-aafe826b6006","timestamp":1749195936746,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1ca67c7c-3c4d-4875-895e-6eaa5189499e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"81e31334-4935-4ca2-981a-96e954c093e6","timestamp":1749195937419,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6d0c5bd5-7f3c-499a-82d4-8144bd1bab56","data":{"mobility_status_notify":0},"need_reply":1,"tid":"dc37fb9b-8470-48b0-99cb-76fa10802ad9","timestamp":1749195937421,"gateway":"8UUXN4P00A06NK"} + +{"bid":"96e67e65-f339-4430-b0aa-fc2b2eb04998","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"726d3d19-b600-46cb-be4e-48fe271e02ed","timestamp":1749195938024,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3abb8000-b112-4a52-9531-b8e7afb18265","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8883830f-b5ff-4012-bfc2-a143b506b98a","timestamp":1749195939443,"gateway":"8UUXN4P00A06NK"} + +{"bid":"634a5de2-8984-48d7-8a97-201e49725219","data":{"air_transfer_enable":false},"need_reply":1,"tid":"86393a4e-dda6-411a-82c9-3ca3d8b6f195","timestamp":1749195939911,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d67246bd-c898-4479-ba81-b4390cad07b1","data":{"dongle_infos":[]},"tid":"319e1cb2-5bff-487d-a8fb-63b1b0fe1f74","timestamp":1749195940169,"gateway":"8UUXN4P00A06NK"} + +{"bid":"50f6dbd7-c603-48b1-82e2-9d950314908f","data":{"departure_trajectory":[]},"tid":"bc7cadfe-4682-4827-867c-4d2a7f9ca583","timestamp":1749195940714,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c97f3bfc-a64a-4682-aa35-94457e22b1ed","data":{"departure_trajectory":[]},"tid":"32077f6e-975f-4d45-a6ec-3e5b94aafe6a","timestamp":1749195941511,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6d0c5bd5-7f3c-499a-82d4-8144bd1bab56","data":{"mobility_status_notify":0},"need_reply":1,"tid":"dc37fb9b-8470-48b0-99cb-76fa10802ad9","timestamp":1749195941629,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3abb8000-b112-4a52-9531-b8e7afb18265","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8883830f-b5ff-4012-bfc2-a143b506b98a","timestamp":1749195941631,"gateway":"8UUXN4P00A06NK"} + +{"bid":"96e67e65-f339-4430-b0aa-fc2b2eb04998","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"726d3d19-b600-46cb-be4e-48fe271e02ed","timestamp":1749195942224,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d995679e-17f7-4a81-8199-224b7233baed","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ed3a7f14-0c6c-46df-badc-a169efe8947d","timestamp":1749195944449,"gateway":"8UUXN4P00A06NK"} + +{"tid":"17693144-5e08-44a3-8ca1-fafe365271fa","bid":"75bc8e16-1260-46c9-9852-12e9ff2deb51","timestamp":1749195969920,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"4e24bcd9-4414-46a9-add2-713346930533","bid":"ff20930f-f9b0-49c7-8337-5d1c78e769f3","timestamp":1749195969923,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"586129f7-5f93-4d0e-bf7b-3aef31f8b764","data":{"air_transfer_enable":false},"need_reply":1,"tid":"254fdf12-709a-4895-b698-7c19e42f1af2","timestamp":1749195972387,"gateway":"8UUXN4P00A06NK"} + +{"bid":"39f555d2-929a-4c38-99c7-a41f3dd5eb27","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"62c5f080-bac6-442a-aa88-bb211336258b","timestamp":1749195974447,"gateway":"8UUXN4P00A06NK"} + +{"bid":"db484e4e-fe5c-4860-80d6-dca7b24dcd04","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f0f30d23-b11d-4cfc-946a-151c0931e31e","timestamp":1749195974611,"gateway":"8UUXN4P00A06NK"} + +{"bid":"122d70c4-540e-487a-a1b9-c3bc02715ee8","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4cde8fba-a644-44cf-8b89-4bd5774c472b","timestamp":1749195974931,"gateway":"8UUXN4P00A06NK"} + +{"bid":"586129f7-5f93-4d0e-bf7b-3aef31f8b764","data":{"air_transfer_enable":false},"need_reply":1,"tid":"254fdf12-709a-4895-b698-7c19e42f1af2","timestamp":1749195974965,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9e96718f-382f-4afa-9c76-4b1f04e2d5d8","data":{"dongle_infos":[]},"tid":"8ebfc80a-5ed5-44b3-96f5-beb141414dd1","timestamp":1749195974969,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e6ffa500-b652-46d4-9c88-4f96aaf71a7e","data":{"firmware_version":"13.01.0002"},"tid":"0b6249f1-380e-4fbe-b89d-ce82a4a96b2e","timestamp":1749195974982,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c6baacbf-c48e-4930-96b1-5cbb3061b24c","data":{"mobility_status_notify":0},"need_reply":1,"tid":"8af5ea5c-bee8-4feb-942d-23f4dd7ae5fd","timestamp":1749195975061,"gateway":"8UUXN4P00A06NK"} + +{"tid":"74a89187-6b3f-4c17-8245-6e39c08e422a","bid":"e14d55ee-bcf6-4ac3-80b9-d71ff8abdcbe","timestamp":1749195975284,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"3cec0e39-5d30-4634-9809-0d21ab79ddf8","data":{"dongle_infos":[]},"tid":"2ef68aaf-fdf8-4d33-bbba-a56b97d04594","timestamp":1749195975970,"gateway":"8UUXN4P00A06NK"} + +{"bid":"db484e4e-fe5c-4860-80d6-dca7b24dcd04","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f0f30d23-b11d-4cfc-946a-151c0931e31e","timestamp":1749195976790,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b7d7ac46-5c11-44ef-b44f-de89b6a73ca0","bid":"5be86bfb-efa1-48f5-88d7-a8e17f803b61","timestamp":1749196000438,"data":{"live_capacity":{"available_video_number":0,"coexist_video_number_max":0,"device_list":[]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"16f59d41-eafd-4ab3-8fa9-f777220518ff","bid":"b32248a5-c206-4bda-bc6a-b23e6b044407","timestamp":1749196000442,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"0b798a5b-8a8e-4241-b59a-7677a4b7056e","bid":"0731ed54-bd3b-491a-8141-e60d1a132753","timestamp":1749196001046,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"9ff15e40-6806-42a7-88dc-76fb4d625611","bid":"c6a51d6b-aee3-4c75-a253-f97a1c584abc","timestamp":1749196001052,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"b381514f-23a3-452c-868a-a77b0cc98cf4","bid":"85d6bb11-c943-4778-abb9-fa422dd6732b","timestamp":1749196001057,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"9ccc33d7-ef09-4535-be80-50484962e8bc","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d92db902-1531-4e87-b03b-e0a9f8e1a101","timestamp":1749196002551,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f2e15691-0c5f-4627-bc7d-4753ec16f18d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e677c999-b1e0-4349-8632-1a6825a57193","timestamp":1749196004547,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5bfc7bf0-60da-4334-bff6-086445777c2c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1fef212f-dcc7-4f2a-a0d4-9e2d75b9930f","timestamp":1749196004732,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9c07f54d-0e54-40b1-b969-2e88df841fc9","data":{"dongle_infos":[]},"tid":"f8ef786e-b931-480a-903c-c92ca7ba536a","timestamp":1749196004945,"gateway":"8UUXN4P00A06NK"} + +{"bid":"04dd4890-0a7b-4250-b9fa-358c08eb606a","data":{"firmware_version":"13.01.0002"},"tid":"cc7d2377-624d-47e7-a0c5-d8a40e3386fa","timestamp":1749196004952,"gateway":"8UUXN4P00A06NK"} + +{"bid":"106063b6-81ee-4b20-bd62-fa37447ec154","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"af550549-ead4-4efb-9c27-10ce49fda450","timestamp":1749196005032,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9ccc33d7-ef09-4535-be80-50484962e8bc","data":{"air_transfer_enable":false},"need_reply":1,"tid":"d92db902-1531-4e87-b03b-e0a9f8e1a101","timestamp":1749196005138,"gateway":"8UUXN4P00A06NK"} + +{"tid":"f786fda7-454d-4ee8-af84-49a2c8e99fdb","bid":"73bb3ce3-0014-4297-b6a9-c8e95bc513d7","timestamp":1749196005398,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"51d3135d-cf32-4d70-83f8-0224bdd589b4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"350b8b3f-2857-4fa1-97a0-687ec7e44cd0","timestamp":1749196005443,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7bc92c14-9e22-4df9-9afa-d9f38ba548a5","data":{"dongle_infos":[]},"tid":"14d1a08c-4120-4428-8456-e396720d71db","timestamp":1749196005943,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0f60b211-e947-481f-bbd0-9c2f24e2181b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"74fe9aa5-acff-41da-83ed-eb5950ba9acb","timestamp":1749196006052,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f2e15691-0c5f-4627-bc7d-4753ec16f18d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e677c999-b1e0-4349-8632-1a6825a57193","timestamp":1749196006715,"gateway":"8UUXN4P00A06NK"} + +{"bid":"106063b6-81ee-4b20-bd62-fa37447ec154","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"af550549-ead4-4efb-9c27-10ce49fda450","timestamp":1749196007114,"gateway":"8UUXN4P00A06NK"} + +{"tid":"07daa1c7-3c1b-43b6-85ea-7c4716e5c274","bid":"ce081956-ac76-4518-93de-b655e365e7a0","timestamp":1749196033398,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"a43d9b4f-f0d8-4851-9b31-764e0311593c","bid":"4798a1a4-11ea-419b-b8ca-8563286cafcd","timestamp":1749196033405,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"0018aa58-4b7e-4c37-850c-4bd419f76f94","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"06321f10-b6d6-4a68-a453-befde3d70c71","timestamp":1749196035629,"gateway":"8UUXN4P00A06NK"} + +{"bid":"558a0071-c09d-4a3b-b120-6ba6bf87bf8f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"22bea47a-facd-4f1b-860e-f8d252535bf2","timestamp":1749196035675,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3c5b39d7-8850-44d1-88ad-a91791caa784","data":{"dongle_infos":[]},"tid":"7fd64cdf-92dc-475c-afc2-0b25491f312f","timestamp":1749196035740,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f11af546-916b-4f03-9848-39cfa0a9f668","data":{"firmware_version":"13.01.0002"},"tid":"a4e373b7-02ee-4322-86ad-adcbfedda956","timestamp":1749196035750,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1caa798d-6c14-411c-b92b-5fc4ad8ee050","data":{"air_transfer_enable":false},"need_reply":1,"tid":"51222c8b-07bb-4412-a794-bf8e48cf7e5e","timestamp":1749196035939,"gateway":"8UUXN4P00A06NK"} + +{"tid":"195fc9ac-dc5e-4d46-ac10-058b4ffec8b0","bid":"54ad8f78-04e8-43f5-84ad-575e78dc067a","timestamp":1749196036052,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"e38a913c-0bd8-4761-9fa8-a958ca161382","data":{"mobility_status_notify":0},"need_reply":1,"tid":"2cf81bb2-f65a-4472-828e-1ed30681b70d","timestamp":1749196036093,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4f8b5924-549e-46a0-aec2-2d5a458b68ba","data":{"dongle_infos":[]},"tid":"b5eed915-ac33-4644-8ca6-1d5f4b0504ce","timestamp":1749196036796,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0018aa58-4b7e-4c37-850c-4bd419f76f94","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"06321f10-b6d6-4a68-a453-befde3d70c71","timestamp":1749196037793,"gateway":"8UUXN4P00A06NK"} + +{"bid":"558a0071-c09d-4a3b-b120-6ba6bf87bf8f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"22bea47a-facd-4f1b-860e-f8d252535bf2","timestamp":1749196037794,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e38a913c-0bd8-4761-9fa8-a958ca161382","data":{"mobility_status_notify":0},"need_reply":1,"tid":"2cf81bb2-f65a-4472-828e-1ed30681b70d","timestamp":1749196038191,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fa674824-8c90-421a-8d81-064541fd1af9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"37ce82a8-fa19-47ff-9ecb-b5447aebf8a9","timestamp":1749196038402,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e441818b-acc7-4860-bb8f-611deab14838","data":{"dongle_infos":[]},"tid":"a964b77b-2fdd-46f3-b3a8-cf1dbf8e5ec9","timestamp":1749196038973,"gateway":"8UUXN4P00A06NK"} + +{"bid":"564da238-5fe4-44fc-aa49-ed7d60a0f6d2","data":{"departure_trajectory":[]},"tid":"5233e020-9e26-4149-acc3-78813cb8a168","timestamp":1749196040128,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1caa798d-6c14-411c-b92b-5fc4ad8ee050","data":{"air_transfer_enable":false},"need_reply":1,"tid":"51222c8b-07bb-4412-a794-bf8e48cf7e5e","timestamp":1749196040139,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fa674824-8c90-421a-8d81-064541fd1af9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"37ce82a8-fa19-47ff-9ecb-b5447aebf8a9","timestamp":1749196040592,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8aef194b-9f8f-4e46-be80-56fcc07a3494","data":{"departure_trajectory":[]},"tid":"1df49d1f-eb4f-4455-ac74-e9a5981269c3","timestamp":1749196040737,"gateway":"8UUXN4P00A06NK"} + +{"bid":"558a0071-c09d-4a3b-b120-6ba6bf87bf8f","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"22bea47a-facd-4f1b-860e-f8d252535bf2","timestamp":1749196041997,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e38a913c-0bd8-4761-9fa8-a958ca161382","data":{"mobility_status_notify":0},"need_reply":1,"tid":"2cf81bb2-f65a-4472-828e-1ed30681b70d","timestamp":1749196042393,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e50540cf-28a5-4803-9932-8567ead590cb","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"dcebe716-63e1-46c2-b5e7-9fbe4e977f33","timestamp":1749196043392,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d4e1b73b-0a24-455a-8c50-3d1e0c8f3e9a","bid":"502ac446-4120-4024-bfc5-1288aa969eb4","timestamp":1749196069529,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"8b0cef6d-7b50-4973-b738-940376a35c5f","bid":"2d4fd320-6380-4c64-8fb1-2a9efd2dd4d9","timestamp":1749196069539,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"aeabb376-4a08-4a63-9baf-3db3f4acdc71","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8dd3a124-4073-46c7-b364-aaa3d6a3af33","timestamp":1749196071544,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fe79f67b-8537-460f-a5ab-80f903d5a796","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"027ade62-82ee-4435-88db-1c220faff070","timestamp":1749196073453,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ea4afc8e-02b9-40be-a0c3-b9cf0764f552","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"66277056-777b-4d73-a7fb-923817327b66","timestamp":1749196073627,"gateway":"8UUXN4P00A06NK"} + +{"bid":"488ee686-a31e-42d4-87dd-4cea7b452d3f","data":{"dongle_infos":[]},"tid":"60d10b98-3991-4875-9968-767c56b9325e","timestamp":1749196073879,"gateway":"8UUXN4P00A06NK"} + +{"bid":"00f29188-5834-4601-bcfb-cddd5c58d5e4","data":{"firmware_version":"13.01.0002"},"tid":"0e2c2b7d-f7e2-4fd2-a5cc-9eb968191356","timestamp":1749196073886,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aeabb376-4a08-4a63-9baf-3db3f4acdc71","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8dd3a124-4073-46c7-b364-aaa3d6a3af33","timestamp":1749196074075,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6b227b7f-72bc-428b-ba50-aa08d067408d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"dba459b8-a2d0-4431-b116-e51bf0f2a609","timestamp":1749196074075,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2a379992-132f-4216-89b6-7491c8dc7d13","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6efe0afa-3573-4a3a-949e-623dc27c9219","timestamp":1749196074538,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9603d677-dfba-4994-8bb1-6b598b4ba984","data":{"dongle_infos":[]},"tid":"8957b1cc-4d9e-415c-ba7f-c8c4b42d9c59","timestamp":1749196074917,"gateway":"8UUXN4P00A06NK"} + +{"tid":"788db7b3-6ff1-4280-8f83-ebe2aad0aae5","bid":"282b378c-5b1e-45fd-8cfb-9b4f3b984d73","timestamp":1749196075001,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"ea4afc8e-02b9-40be-a0c3-b9cf0764f552","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"66277056-777b-4d73-a7fb-923817327b66","timestamp":1749196075793,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6b227b7f-72bc-428b-ba50-aa08d067408d","data":{"mobility_status_notify":0},"need_reply":1,"tid":"dba459b8-a2d0-4431-b116-e51bf0f2a609","timestamp":1749196076193,"gateway":"8UUXN4P00A06NK"} + +{"tid":"2e8292b8-3664-4f90-869d-41081e257f30","bid":"d9bcc32c-2c0e-4043-8f1b-264faaec526e","timestamp":1749196102177,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"49107636-0ccf-42a4-a139-68d4a9f12d62","bid":"3d9679a1-3fc1-459f-9a04-d3f960295e83","timestamp":1749196102180,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"2e107c19-ec25-49f2-9896-ade347087377","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"74448595-bb9f-41c2-b6fa-f39e1292e1be","timestamp":1749196103792,"gateway":"8UUXN4P00A06NK"} + +{"bid":"04de06cb-ca2e-4ae7-81ae-5c83e6a46d9d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"93354a29-9e50-456b-bab4-7a480b1d670c","timestamp":1749196104034,"gateway":"8UUXN4P00A06NK"} + +{"bid":"34089f82-8750-4c6e-af18-9877bc4d7ee0","data":{"dongle_infos":[]},"tid":"b622e1e8-537f-4ee0-9edd-3e50bb33ccc0","timestamp":1749196104054,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4d149d07-6cc7-49b3-9c7a-fbd83ca77180","data":{"firmware_version":"13.01.0002"},"tid":"0c2d0f03-8efb-4ffc-a1f9-c54750b62de1","timestamp":1749196104061,"gateway":"8UUXN4P00A06NK"} + +{"tid":"88560894-37f3-484d-8103-87ea9ffb51c0","bid":"23ca1199-a91b-43e6-a3a6-46152e929410","timestamp":1749196104181,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"c3162a09-0d6b-4b8b-9177-4241c8028a74","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1034505d-1eb6-43fe-b960-8ae19a72ac40","timestamp":1749196104283,"gateway":"8UUXN4P00A06NK"} + +{"bid":"76715937-e2ad-4208-850c-9b9f8d104553","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c8ce3645-2758-4b80-9f9a-9d36198fbf35","timestamp":1749196104489,"gateway":"8UUXN4P00A06NK"} + +{"bid":"89fce447-476d-44f5-bfbb-422dc1f9a5b5","data":{"dongle_infos":[]},"tid":"9f5a9e93-aa19-45bb-a7c6-e5eba8202aec","timestamp":1749196105056,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2e107c19-ec25-49f2-9896-ade347087377","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"74448595-bb9f-41c2-b6fa-f39e1292e1be","timestamp":1749196105902,"gateway":"8UUXN4P00A06NK"} + +{"bid":"04de06cb-ca2e-4ae7-81ae-5c83e6a46d9d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"93354a29-9e50-456b-bab4-7a480b1d670c","timestamp":1749196106102,"gateway":"8UUXN4P00A06NK"} + +{"bid":"76715937-e2ad-4208-850c-9b9f8d104553","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c8ce3645-2758-4b80-9f9a-9d36198fbf35","timestamp":1749196106502,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cb9c0e69-91db-477c-a8f8-a52e2aa18afc","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b1818b69-e81d-4e47-b82a-176b9b15bd53","timestamp":1749196107175,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c3162a09-0d6b-4b8b-9177-4241c8028a74","data":{"air_transfer_enable":false},"need_reply":1,"tid":"1034505d-1eb6-43fe-b960-8ae19a72ac40","timestamp":1749196108490,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ecd99281-484f-4ff7-8f52-f9df1d16d38a","data":{"departure_trajectory":[]},"tid":"e6f52970-4420-4c6d-9de5-2a59bcc69a0b","timestamp":1749196108887,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9628e259-e3e0-4beb-af16-1c9af6d5b501","data":{"departure_trajectory":[]},"tid":"d06dbb6a-24ed-4cd8-8e0e-6b380497a9bf","timestamp":1749196109045,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d5488384-846f-482c-818e-9e236d2343b8","data":{"dongle_infos":[]},"tid":"1a994345-b981-45dc-af76-07c89cb5820e","timestamp":1749196109239,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cb9c0e69-91db-477c-a8f8-a52e2aa18afc","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b1818b69-e81d-4e47-b82a-176b9b15bd53","timestamp":1749196109302,"gateway":"8UUXN4P00A06NK"} + +{"bid":"04de06cb-ca2e-4ae7-81ae-5c83e6a46d9d","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"93354a29-9e50-456b-bab4-7a480b1d670c","timestamp":1749196110303,"gateway":"8UUXN4P00A06NK"} + +{"bid":"76715937-e2ad-4208-850c-9b9f8d104553","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c8ce3645-2758-4b80-9f9a-9d36198fbf35","timestamp":1749196110703,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df0bf9f3-b18a-48ed-b3b0-5c14f7412ed0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9489c766-9d00-4ddc-b727-a7431f7bf381","timestamp":1749196112175,"gateway":"8UUXN4P00A06NK"} + +{"bid":"df0bf9f3-b18a-48ed-b3b0-5c14f7412ed0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9489c766-9d00-4ddc-b727-a7431f7bf381","timestamp":1749196114303,"gateway":"8UUXN4P00A06NK"} + +{"tid":"07e66434-f19a-4c23-906f-646e592c33a8","bid":"357ad0f5-ad9d-43d4-a48d-c0d3dc57656a","timestamp":1749196141094,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"812da366-ab6c-47ed-87d6-f55026972cac","bid":"3b2ba63d-dfca-4b0f-bd8a-612ed4af00d5","timestamp":1749196141096,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"500826b0-7cbc-4be9-9dfb-b797b272602a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"94c62846-206f-408d-b190-ddd09f46c779","timestamp":1749196142580,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ac0b5a3a-58b8-4572-883c-e2188570b969","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f2616e50-ae69-4b99-ad13-a99dbf52d51d","timestamp":1749196142582,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4f48f470-e596-4216-8756-f88d22ca6741","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8de5a7d3-a575-4dbc-a2f5-c2b77c2b0434","timestamp":1749196142988,"gateway":"8UUXN4P00A06NK"} + +{"bid":"63931624-4a72-45ae-b8e6-cee1d21aedee","data":{"dongle_infos":[]},"tid":"b2303963-c77a-4fb3-b1b1-9fd2fd899313","timestamp":1749196142994,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1d64a8e0-a7da-4c09-a35c-bb42d901b4ba","data":{"firmware_version":"13.01.0002"},"tid":"3eeb4c00-54dc-408b-a199-dd9d6130c501","timestamp":1749196142999,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8582a02d-6635-42e6-bef3-00d2cb7d5bf1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"4d4278b8-f93b-47e4-841b-ae26fde1b7d6","timestamp":1749196143085,"gateway":"8UUXN4P00A06NK"} + +{"tid":"677378f0-82dc-4aab-83c4-52bce701bd6f","bid":"b58b8223-9399-4068-abfa-42104b7fb835","timestamp":1749196143292,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"2b76db12-de13-4764-a88a-2994177a4aa3","data":{"dongle_infos":[]},"tid":"df192f39-a6de-4ad4-a7a9-e2f4e7f9f8d6","timestamp":1749196144069,"gateway":"8UUXN4P00A06NK"} + +{"bid":"500826b0-7cbc-4be9-9dfb-b797b272602a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"94c62846-206f-408d-b190-ddd09f46c779","timestamp":1749196144581,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ac0b5a3a-58b8-4572-883c-e2188570b969","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f2616e50-ae69-4b99-ad13-a99dbf52d51d","timestamp":1749196144780,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8582a02d-6635-42e6-bef3-00d2cb7d5bf1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"4d4278b8-f93b-47e4-841b-ae26fde1b7d6","timestamp":1749196145179,"gateway":"8UUXN4P00A06NK"} + +{"bid":"011ddbb9-0874-48ad-8e2f-ffdda1303f2f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bda1ecdd-2b4f-4a41-87bc-ff1356721067","timestamp":1749196146092,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4f48f470-e596-4216-8756-f88d22ca6741","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8de5a7d3-a575-4dbc-a2f5-c2b77c2b0434","timestamp":1749196147189,"gateway":"8UUXN4P00A06NK"} + +{"bid":"de2c9d72-8aeb-41b4-85b6-04b7302e2b58","data":{"departure_trajectory":[]},"tid":"a337bdae-a34b-4dcf-9c75-221990e5f1b5","timestamp":1749196147911,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5e9d0b4d-6155-4c2e-9905-e05c047a4cdf","data":{"departure_trajectory":[]},"tid":"d81806c0-ab97-4153-a545-ab8e5d46ca26","timestamp":1749196147993,"gateway":"8UUXN4P00A06NK"} + +{"bid":"011ddbb9-0874-48ad-8e2f-ffdda1303f2f","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bda1ecdd-2b4f-4a41-87bc-ff1356721067","timestamp":1749196148180,"gateway":"8UUXN4P00A06NK"} + +{"bid":"467b2cb9-bfa8-4c19-a649-0d8dd9ef1c22","data":{"dongle_infos":[]},"tid":"4b342be7-701a-4d50-8aad-6991aeb6d1b7","timestamp":1749196148312,"gateway":"8UUXN4P00A06NK"} + +{"bid":"500826b0-7cbc-4be9-9dfb-b797b272602a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"94c62846-206f-408d-b190-ddd09f46c779","timestamp":1749196148781,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8582a02d-6635-42e6-bef3-00d2cb7d5bf1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"4d4278b8-f93b-47e4-841b-ae26fde1b7d6","timestamp":1749196149380,"gateway":"8UUXN4P00A06NK"} + +{"bid":"16970dca-bb64-40d4-9ae0-6c161bf038db","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4848d2c7-6e67-4706-ae00-dbd30b5a1f0e","timestamp":1749196151093,"gateway":"8UUXN4P00A06NK"} + +{"bid":"16970dca-bb64-40d4-9ae0-6c161bf038db","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4848d2c7-6e67-4706-ae00-dbd30b5a1f0e","timestamp":1749196153181,"gateway":"8UUXN4P00A06NK"} + +{"tid":"17a6ee53-dc19-4e7a-8134-e232ceee014e","bid":"38aeaab2-01ce-4874-ad22-758583fd6984","timestamp":1749196180539,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"c2282337-5e39-4ab6-8046-c9e598ac5882","bid":"a968706d-b079-477c-ae21-9145c5238f4b","timestamp":1749196180541,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"7651b3e9-add0-4b50-afd3-836a35130681","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a686a5a0-8870-4500-be8e-2ed953d0c952","timestamp":1749196181413,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a09177e8-75dc-4157-8c32-9a107892b6b0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"77f99280-8b2d-4ef2-8314-8b086ee4125b","timestamp":1749196181582,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a8c5cbbf-15f7-46a0-bb0b-9403eab29efb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"cb4c0308-23da-4674-a7d7-898afc5ab2d7","timestamp":1749196181852,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c97176fd-cbe5-4073-a251-5e880881cc93","data":{"air_transfer_enable":false},"need_reply":1,"tid":"cb68b86c-47f0-454b-858a-06dc20674def","timestamp":1749196181869,"gateway":"8UUXN4P00A06NK"} + +{"bid":"05791f85-ec9a-4ea8-81a4-339276dfaa9a","data":{"dongle_infos":[]},"tid":"caeadabf-f2ec-4da9-8286-669f8cb40966","timestamp":1749196181875,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c96c7230-8400-4f37-947c-5809a9d1d2fc","data":{"firmware_version":"13.01.0002"},"tid":"febb25a9-b5d8-4870-94b7-0de640ad8afb","timestamp":1749196181881,"gateway":"8UUXN4P00A06NK"} + +{"tid":"e7d16c87-33e2-475c-8852-768e11517970","bid":"7394db84-6ece-45ae-bc11-6fb6d2c84dce","timestamp":1749196182553,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"588b61d5-4a0a-4bbd-aad7-8266a26b9874","data":{"dongle_infos":[]},"tid":"27e68ec3-3f87-4bd0-a2fa-87aefb8f57eb","timestamp":1749196182879,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7651b3e9-add0-4b50-afd3-836a35130681","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a686a5a0-8870-4500-be8e-2ed953d0c952","timestamp":1749196183516,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a09177e8-75dc-4157-8c32-9a107892b6b0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"77f99280-8b2d-4ef2-8314-8b086ee4125b","timestamp":1749196183717,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a8c5cbbf-15f7-46a0-bb0b-9403eab29efb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"cb4c0308-23da-4674-a7d7-898afc5ab2d7","timestamp":1749196183917,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4bad0cdf-bb16-48c7-9c78-05adac63df43","data":{"dongle_infos":[]},"tid":"2c17463f-eebb-4c15-a042-7b102a07a792","timestamp":1749196185181,"gateway":"8UUXN4P00A06NK"} + +{"bid":"abf1404c-c708-468d-99fe-19d3ebb8b141","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f1b7b140-a9fc-4aa7-8a07-3e340f2e3133","timestamp":1749196185542,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c97176fd-cbe5-4073-a251-5e880881cc93","data":{"air_transfer_enable":false},"need_reply":1,"tid":"cb68b86c-47f0-454b-858a-06dc20674def","timestamp":1749196186068,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6457f483-67d5-4cc0-8200-bdfe758ec7bc","data":{"departure_trajectory":[]},"tid":"190b559b-b4c1-4a99-b35f-858785f329a9","timestamp":1749196186872,"gateway":"8UUXN4P00A06NK"} + +{"bid":"857273e2-a8a7-42a4-a50a-7ee68b71149c","data":{"departure_trajectory":[]},"tid":"3e05a4da-54bc-4cf1-837f-8ec668307188","timestamp":1749196187179,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7651b3e9-add0-4b50-afd3-836a35130681","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a686a5a0-8870-4500-be8e-2ed953d0c952","timestamp":1749196187717,"gateway":"8UUXN4P00A06NK"} + +{"bid":"abf1404c-c708-468d-99fe-19d3ebb8b141","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"f1b7b140-a9fc-4aa7-8a07-3e340f2e3133","timestamp":1749196187718,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a8c5cbbf-15f7-46a0-bb0b-9403eab29efb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"cb4c0308-23da-4674-a7d7-898afc5ab2d7","timestamp":1749196188118,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a66e02fd-ac3b-4332-beb0-401b23950120","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a8eaee58-413a-48ca-a25c-c14e690402f4","timestamp":1749196190545,"gateway":"8UUXN4P00A06NK"} + +{"tid":"8d614360-6772-4429-a8d0-7aa0d5961484","bid":"fb0f09c4-02c1-40cd-88bc-a0368e802cff","timestamp":1749196219207,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"8b7ac96b-e8bb-4284-8ab2-60e71ee6b6a8","bid":"d65cfb7f-4d14-4140-be0f-5d2408128517","timestamp":1749196219213,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"abf2e08e-f971-446c-9e70-9efe5e12c6df","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c068502d-6fac-4b44-9945-b55a0f746607","timestamp":1749196220319,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b6de9bb1-2eff-4824-af7b-4b7370eb0ee1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8656605c-7cb0-4ab7-9a52-5c8ffac686ea","timestamp":1749196220461,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fd2df412-e284-4fd6-a6cd-928ea88e16af","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2465bdaa-dcf6-414e-88c7-2f5972cd8643","timestamp":1749196220762,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2d7faa4f-1d4f-4d38-87b5-93b10e2f6868","data":{"dongle_infos":[]},"tid":"410afc53-47e2-4a09-992d-91a054380322","timestamp":1749196220767,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2ef3387d-235a-4d9e-91a8-244178a4522b","data":{"firmware_version":"13.01.0002"},"tid":"e12a5fb8-ec56-4ec6-9def-dffe9162e540","timestamp":1749196220774,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8578da73-c7c5-4712-a9de-172b74e54783","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"384cd1fa-559c-4d25-b9be-8e5678617789","timestamp":1749196220776,"gateway":"8UUXN4P00A06NK"} + +{"tid":"95452bad-ce95-486c-855a-6810a231594f","bid":"d71c6807-b557-4cb6-82b7-2a258d52c219","timestamp":1749196221243,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"27b52723-52be-4f97-b9fd-28f64382acc1","data":{"dongle_infos":[]},"tid":"e7834c1c-84cc-4410-85aa-956458f5be61","timestamp":1749196221777,"gateway":"8UUXN4P00A06NK"} + +{"bid":"abf2e08e-f971-446c-9e70-9efe5e12c6df","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c068502d-6fac-4b44-9945-b55a0f746607","timestamp":1749196222462,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b6de9bb1-2eff-4824-af7b-4b7370eb0ee1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"8656605c-7cb0-4ab7-9a52-5c8ffac686ea","timestamp":1749196222660,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8578da73-c7c5-4712-a9de-172b74e54783","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"384cd1fa-559c-4d25-b9be-8e5678617789","timestamp":1749196222861,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6ec1258b-9527-48ed-90b5-1b0e2950e749","data":{"dongle_infos":[]},"tid":"6f52dda7-9c78-488c-8b6b-42821b845386","timestamp":1749196224085,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8bb33330-0a9f-4d64-ad36-d6a5cc6b53c0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"298c5c85-bd76-48f7-a593-9b5458e8ba4d","timestamp":1749196224210,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fd2df412-e284-4fd6-a6cd-928ea88e16af","data":{"air_transfer_enable":false},"need_reply":1,"tid":"2465bdaa-dcf6-414e-88c7-2f5972cd8643","timestamp":1749196224966,"gateway":"8UUXN4P00A06NK"} + +{"bid":"739dfdd8-8f63-445b-8eb4-6ef255412ad9","data":{"departure_trajectory":[]},"tid":"a7b956af-2212-4a2e-94b1-4d904b3f0e0d","timestamp":1749196225761,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8a05f542-ec7d-4ba6-a6ff-dc13f37a6c4f","data":{"departure_trajectory":[]},"tid":"a6fdbf98-6179-4ed3-8c95-80df74cb9785","timestamp":1749196225844,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8bb33330-0a9f-4d64-ad36-d6a5cc6b53c0","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"298c5c85-bd76-48f7-a593-9b5458e8ba4d","timestamp":1749196226260,"gateway":"8UUXN4P00A06NK"} + +{"bid":"abf2e08e-f971-446c-9e70-9efe5e12c6df","data":{"mobility_status_notify":0},"need_reply":1,"tid":"c068502d-6fac-4b44-9945-b55a0f746607","timestamp":1749196226659,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8578da73-c7c5-4712-a9de-172b74e54783","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"384cd1fa-559c-4d25-b9be-8e5678617789","timestamp":1749196227061,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3c78dc82-7620-4099-8a82-cbf75f177904","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0b558841-c46b-4068-8802-5b03a38daeb2","timestamp":1749196229211,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3c78dc82-7620-4099-8a82-cbf75f177904","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0b558841-c46b-4068-8802-5b03a38daeb2","timestamp":1749196231263,"gateway":"8UUXN4P00A06NK"} + +{"tid":"894aec08-951e-437b-b9b0-99fd980973a0","bid":"4ebebbfa-737a-4c4d-b6d9-26e9e0c4a74a","timestamp":1749196257710,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"7c466c6a-498e-4fa3-99d1-2cb2dd8c3265","bid":"d10252b7-94b2-4a11-9265-f96dbc9b9c97","timestamp":1749196257713,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"da58a6b4-c1aa-4f98-9591-b5eceec4d39d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0cac36f2-f8f3-49f4-9526-7672deb2b0d2","timestamp":1749196259617,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1acd6bd2-a401-4f73-bc25-ae28af90bd50","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1dd13ac6-6681-4589-8727-2a07d52cdf8e","timestamp":1749196259670,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f4e4c1df-fea6-4dfa-883b-59fbc305424c","data":{"dongle_infos":[]},"tid":"fd8149f2-c061-41ff-9e96-2703e80716d1","timestamp":1749196259882,"gateway":"8UUXN4P00A06NK"} + +{"bid":"acbf17e7-ebc8-4ade-b46e-ae4852179eeb","data":{"firmware_version":"13.01.0002"},"tid":"3bd4ce4b-fff3-4eb5-a712-4e7501082b49","timestamp":1749196259917,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b20cb46f-a9a5-4902-8c98-a6151724659d","bid":"5b19401b-3d83-48db-97f6-b17d40fe6b82","timestamp":1749196260021,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"45dfdea1-d75f-4c41-bcb3-2643542028f0","data":{"air_transfer_enable":false},"need_reply":1,"tid":"56f3b8a1-19d8-4ead-8a26-48e55abe44c9","timestamp":1749196260078,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dad4f83b-8bb8-4ea1-a1aa-92daef1a4544","data":{"mobility_status_notify":0},"need_reply":1,"tid":"78690f0d-13c5-438b-92d2-7df076b7b248","timestamp":1749196260119,"gateway":"8UUXN4P00A06NK"} + +{"bid":"472c2d5c-8a65-44a7-8551-651d449aa60b","data":{"dongle_infos":[]},"tid":"1a6f8ee3-97f4-4456-beae-b8a4faf6f126","timestamp":1749196260887,"gateway":"8UUXN4P00A06NK"} + +{"bid":"da58a6b4-c1aa-4f98-9591-b5eceec4d39d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0cac36f2-f8f3-49f4-9526-7672deb2b0d2","timestamp":1749196261708,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1acd6bd2-a401-4f73-bc25-ae28af90bd50","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1dd13ac6-6681-4589-8727-2a07d52cdf8e","timestamp":1749196261709,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dad4f83b-8bb8-4ea1-a1aa-92daef1a4544","data":{"mobility_status_notify":0},"need_reply":1,"tid":"78690f0d-13c5-438b-92d2-7df076b7b248","timestamp":1749196262307,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3f20334d-ddb6-4194-a2a7-66a349387e2e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1dd79ba3-0838-4ff8-a4de-24c58bf58b9d","timestamp":1749196262708,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c5825eb3-7581-43a2-829d-2fb621c091d8","data":{"dongle_infos":[]},"tid":"e43008d4-aba3-4085-9a3b-2aa33ddeb333","timestamp":1749196263165,"gateway":"8UUXN4P00A06NK"} + +{"tid":"f88db921-6451-47a8-b394-2705b9bb845f","bid":"1b7c5598-92c1-4d56-b8f3-88a3ecc62e53","timestamp":1749196264092,"data":{"live_status":[{"video_id":"8UUXN4P00A06NK/165-0-7/normal-0","video_type":"normal","video_quality":4,"status":1,"error_status":0}]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"176eb621-2bfc-49da-8ba7-fd27a53d37f2","data":{"departure_trajectory":[]},"tid":"11bbc95f-e326-4bc6-806a-591f83a0b219","timestamp":1749196264131,"gateway":"8UUXN4P00A06NK"} + +{"bid":"45dfdea1-d75f-4c41-bcb3-2643542028f0","data":{"air_transfer_enable":false},"need_reply":1,"tid":"56f3b8a1-19d8-4ead-8a26-48e55abe44c9","timestamp":1749196264283,"gateway":"8UUXN4P00A06NK"} + +{"bid":"55b81add-34b8-49ae-9234-bf356814177f","data":{"departure_trajectory":[]},"tid":"2397434f-52a6-45d7-b81c-01491211c436","timestamp":1749196264878,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3f20334d-ddb6-4194-a2a7-66a349387e2e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1dd79ba3-0838-4ff8-a4de-24c58bf58b9d","timestamp":1749196264910,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1acd6bd2-a401-4f73-bc25-ae28af90bd50","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"1dd13ac6-6681-4589-8727-2a07d52cdf8e","timestamp":1749196265907,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dad4f83b-8bb8-4ea1-a1aa-92daef1a4544","data":{"mobility_status_notify":0},"need_reply":1,"tid":"78690f0d-13c5-438b-92d2-7df076b7b248","timestamp":1749196266505,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9f77a433-9e47-47fb-acf8-05efbaef0628","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"29d06f71-0372-451b-94f5-d2edc2d137be","timestamp":1749196267710,"gateway":"8UUXN4P00A06NK"} + +{"tid":"21bde355-b910-493d-bbdc-951454e95ec9","bid":"b719c30e-259d-4cbe-848d-525b2e605f2b","timestamp":1749196293077,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"8db01bfc-acd8-42bb-8a94-1df64d750b51","bid":"a649a3ec-6d7c-40fd-aecb-08870af78f3f","timestamp":1749196293081,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"3ee4508d-c0dc-439e-a7de-9e94ced2ad32","bid":"2a3fd18b-b26e-4622-bf83-cde73affb3ac","timestamp":1749196293738,"data":{"live_status":[{"video_id":"8UUXN4P00A06NK/165-0-7/normal-0","video_type":"normal","video_quality":4,"status":1,"error_status":0}]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"d5869302-a658-4729-926e-fa671be448f9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e875c6b6-a3d8-49df-9e52-8f97d589213f","timestamp":1749196294884,"gateway":"8UUXN4P00A06NK"} + +{"bid":"29a6302c-2840-41e8-94b5-c7bcab0aa7d6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0d147917-ed6f-44e1-be25-872dd289e494","timestamp":1749196296814,"gateway":"8UUXN4P00A06NK"} + +{"bid":"07eec737-fa8b-4003-9571-9ec862ee7a9d","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a87a5ed2-f91e-4d4f-88f7-fa8fb20e0a13","timestamp":1749196297062,"gateway":"8UUXN4P00A06NK"} + +{"bid":"185bfb9e-b5bf-4853-b21b-d798cd8bebbc","data":{"dongle_infos":[]},"tid":"0ff7feca-6ac5-43b2-a81e-5d739c66f0d5","timestamp":1749196297371,"gateway":"8UUXN4P00A06NK"} + +{"bid":"da028588-f7e0-40dd-baa5-c38f2a058deb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f115d130-9619-4679-b126-19431bba4902","timestamp":1749196297377,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7a918a6c-5a4c-4027-b7c7-9177bbb2ede6","data":{"firmware_version":"13.01.0002"},"tid":"80ef424b-cc64-4fb1-b85a-e66a8f3d9e52","timestamp":1749196297386,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d5869302-a658-4729-926e-fa671be448f9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e875c6b6-a3d8-49df-9e52-8f97d589213f","timestamp":1749196297560,"gateway":"8UUXN4P00A06NK"} + +{"tid":"e90041df-9e52-4934-8e20-5896c17c224a","bid":"61b1284a-266d-4819-a121-9dc8ceccad52","timestamp":1749196297828,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"d4edd1ce-faee-4a41-a09e-4463ce7c282a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9ae6d9e9-ab81-4f09-8c39-3aafe84397d1","timestamp":1749196298086,"gateway":"8UUXN4P00A06NK"} + +{"tid":"1707d417-e4a0-4339-947b-2ecc42e38043","bid":"fd5ebd44-ff31-43ba-8367-9facc8fce849","timestamp":1749196298174,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"5abe3355-76c6-4fdb-9b08-db1c72ba38f5","data":{"dongle_infos":[]},"tid":"f5535578-e032-4fb8-a981-8b7b984127fc","timestamp":1749196298371,"gateway":"8UUXN4P00A06NK"} + +{"bid":"29a6302c-2840-41e8-94b5-c7bcab0aa7d6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0d147917-ed6f-44e1-be25-872dd289e494","timestamp":1749196298940,"gateway":"8UUXN4P00A06NK"} + +{"bid":"da028588-f7e0-40dd-baa5-c38f2a058deb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f115d130-9619-4679-b126-19431bba4902","timestamp":1749196299544,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d4edd1ce-faee-4a41-a09e-4463ce7c282a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9ae6d9e9-ab81-4f09-8c39-3aafe84397d1","timestamp":1749196300147,"gateway":"8UUXN4P00A06NK"} + +{"bid":"227ebac6-5209-43e5-886a-e6f688f53f45","data":{"dongle_infos":[]},"tid":"401bb799-71a7-481e-882c-c0364d5bccb5","timestamp":1749196300970,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b8e86662-2b72-4987-b292-c5cf0f2f8e7d","data":{"departure_trajectory":[]},"tid":"2401c1e1-9d39-4dcd-aa26-a1a30b316a6e","timestamp":1749196301661,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d5869302-a658-4729-926e-fa671be448f9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e875c6b6-a3d8-49df-9e52-8f97d589213f","timestamp":1749196301763,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9d3ceff6-144f-4892-b891-fd58ed3c4aa1","data":{"departure_trajectory":[]},"tid":"2f1e754a-68b7-4eec-b916-cc1ab14a7b15","timestamp":1749196302363,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9984ca1e-55f1-46dd-ac52-55f0dbf1f31a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"81b984b5-2971-4b16-8cb2-30704fd79d51","timestamp":1749196303089,"gateway":"8UUXN4P00A06NK"} + +{"bid":"29a6302c-2840-41e8-94b5-c7bcab0aa7d6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0d147917-ed6f-44e1-be25-872dd289e494","timestamp":1749196303142,"gateway":"8UUXN4P00A06NK"} + +{"bid":"da028588-f7e0-40dd-baa5-c38f2a058deb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f115d130-9619-4679-b126-19431bba4902","timestamp":1749196303747,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9984ca1e-55f1-46dd-ac52-55f0dbf1f31a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"81b984b5-2971-4b16-8cb2-30704fd79d51","timestamp":1749196305145,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c5b157b-353b-471f-80bc-a3767130c410","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0ed98919-0355-4ec0-9526-4be4b626caa5","timestamp":1749196308093,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d5869302-a658-4729-926e-fa671be448f9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e875c6b6-a3d8-49df-9e52-8f97d589213f","timestamp":1749196309964,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c5b157b-353b-471f-80bc-a3767130c410","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0ed98919-0355-4ec0-9526-4be4b626caa5","timestamp":1749196310146,"gateway":"8UUXN4P00A06NK"} + +{"bid":"29a6302c-2840-41e8-94b5-c7bcab0aa7d6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0d147917-ed6f-44e1-be25-872dd289e494","timestamp":1749196311347,"gateway":"8UUXN4P00A06NK"} + +{"bid":"da028588-f7e0-40dd-baa5-c38f2a058deb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f115d130-9619-4679-b126-19431bba4902","timestamp":1749196311941,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c5b157b-353b-471f-80bc-a3767130c410","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0ed98919-0355-4ec0-9526-4be4b626caa5","timestamp":1749196314347,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d5869302-a658-4729-926e-fa671be448f9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e875c6b6-a3d8-49df-9e52-8f97d589213f","timestamp":1749196318165,"gateway":"8UUXN4P00A06NK"} + +{"bid":"29a6302c-2840-41e8-94b5-c7bcab0aa7d6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0d147917-ed6f-44e1-be25-872dd289e494","timestamp":1749196319546,"gateway":"8UUXN4P00A06NK"} + +{"bid":"da028588-f7e0-40dd-baa5-c38f2a058deb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f115d130-9619-4679-b126-19431bba4902","timestamp":1749196320139,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c5b157b-353b-471f-80bc-a3767130c410","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0ed98919-0355-4ec0-9526-4be4b626caa5","timestamp":1749196322542,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d5869302-a658-4729-926e-fa671be448f9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e875c6b6-a3d8-49df-9e52-8f97d589213f","timestamp":1749196326361,"gateway":"8UUXN4P00A06NK"} + +{"bid":"29a6302c-2840-41e8-94b5-c7bcab0aa7d6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0d147917-ed6f-44e1-be25-872dd289e494","timestamp":1749196327739,"gateway":"8UUXN4P00A06NK"} + +{"bid":"da028588-f7e0-40dd-baa5-c38f2a058deb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f115d130-9619-4679-b126-19431bba4902","timestamp":1749196328344,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c5b157b-353b-471f-80bc-a3767130c410","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0ed98919-0355-4ec0-9526-4be4b626caa5","timestamp":1749196330747,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d5869302-a658-4729-926e-fa671be448f9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e875c6b6-a3d8-49df-9e52-8f97d589213f","timestamp":1749196334567,"gateway":"8UUXN4P00A06NK"} + +{"bid":"29a6302c-2840-41e8-94b5-c7bcab0aa7d6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0d147917-ed6f-44e1-be25-872dd289e494","timestamp":1749196335940,"gateway":"8UUXN4P00A06NK"} + +{"bid":"da028588-f7e0-40dd-baa5-c38f2a058deb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f115d130-9619-4679-b126-19431bba4902","timestamp":1749196336545,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c5b157b-353b-471f-80bc-a3767130c410","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0ed98919-0355-4ec0-9526-4be4b626caa5","timestamp":1749196338942,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d5869302-a658-4729-926e-fa671be448f9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e875c6b6-a3d8-49df-9e52-8f97d589213f","timestamp":1749196342766,"gateway":"8UUXN4P00A06NK"} + +{"bid":"29a6302c-2840-41e8-94b5-c7bcab0aa7d6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0d147917-ed6f-44e1-be25-872dd289e494","timestamp":1749196344140,"gateway":"8UUXN4P00A06NK"} + +{"bid":"da028588-f7e0-40dd-baa5-c38f2a058deb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f115d130-9619-4679-b126-19431bba4902","timestamp":1749196344747,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c5b157b-353b-471f-80bc-a3767130c410","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0ed98919-0355-4ec0-9526-4be4b626caa5","timestamp":1749196347139,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d5869302-a658-4729-926e-fa671be448f9","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e875c6b6-a3d8-49df-9e52-8f97d589213f","timestamp":1749196350965,"gateway":"8UUXN4P00A06NK"} + +{"bid":"29a6302c-2840-41e8-94b5-c7bcab0aa7d6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0d147917-ed6f-44e1-be25-872dd289e494","timestamp":1749196352347,"gateway":"8UUXN4P00A06NK"} + +{"bid":"da028588-f7e0-40dd-baa5-c38f2a058deb","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f115d130-9619-4679-b126-19431bba4902","timestamp":1749196352941,"gateway":"8UUXN4P00A06NK"} + +{"bid":"791c2d04-7d8a-459b-827c-014d1cd9a046","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"95c4dc13-eea6-4537-81bd-efd2552090a8","timestamp":1749196353384,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c5b157b-353b-471f-80bc-a3767130c410","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0ed98919-0355-4ec0-9526-4be4b626caa5","timestamp":1749196355344,"gateway":"8UUXN4P00A06NK"} + +{"bid":"791c2d04-7d8a-459b-827c-014d1cd9a046","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"95c4dc13-eea6-4537-81bd-efd2552090a8","timestamp":1749196355551,"gateway":"8UUXN4P00A06NK"} + +{"bid":"791c2d04-7d8a-459b-827c-014d1cd9a046","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"95c4dc13-eea6-4537-81bd-efd2552090a8","timestamp":1749196359740,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2c5b157b-353b-471f-80bc-a3767130c410","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0ed98919-0355-4ec0-9526-4be4b626caa5","timestamp":1749196363544,"gateway":"8UUXN4P00A06NK"} + +{"bid":"791c2d04-7d8a-459b-827c-014d1cd9a046","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"95c4dc13-eea6-4537-81bd-efd2552090a8","timestamp":1749196367940,"gateway":"8UUXN4P00A06NK"} + +{"bid":"791c2d04-7d8a-459b-827c-014d1cd9a046","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"95c4dc13-eea6-4537-81bd-efd2552090a8","timestamp":1749196376146,"gateway":"8UUXN4P00A06NK"} + +{"bid":"791c2d04-7d8a-459b-827c-014d1cd9a046","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"95c4dc13-eea6-4537-81bd-efd2552090a8","timestamp":1749196384341,"gateway":"8UUXN4P00A06NK"} + +{"bid":"791c2d04-7d8a-459b-827c-014d1cd9a046","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"95c4dc13-eea6-4537-81bd-efd2552090a8","timestamp":1749196392542,"gateway":"8UUXN4P00A06NK"} + +{"bid":"791c2d04-7d8a-459b-827c-014d1cd9a046","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"95c4dc13-eea6-4537-81bd-efd2552090a8","timestamp":1749196400740,"gateway":"8UUXN4P00A06NK"} + +{"bid":"791c2d04-7d8a-459b-827c-014d1cd9a046","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"95c4dc13-eea6-4537-81bd-efd2552090a8","timestamp":1749196408942,"gateway":"8UUXN4P00A06NK"} + +{"tid":"99b74a3b-3efb-4024-983b-a66895ffb7e4","bid":"ce10b25c-ee87-48de-9e9c-cedd125b5bb7","timestamp":1749196675950,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":3,"device_list":[{"sn":"4SEDL9C001X8GE","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F5BMD238V00172JR","available_video_number":0,"coexist_video_number_max":2,"camera_list":[]}]}},"gateway":"4SEDL9C001X8GE"} + +{"bid":"ef8871be-117e-4ed5-b793-40b4c06e5c49","data":{"mode_code_reason":0},"need_reply":1,"tid":"4e87f758-9397-434c-b1ee-d3c37be7076f","timestamp":1749196675978,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8c4e012a-143b-4ab6-9978-c2172fe26156","data":{"control_source":"A","home_latitude":26.173879999465843,"home_longitude":106.29197366411931,"locked":false,"low_battery_warning_threshold":20,"payloads":[],"serious_low_battery_warning_threshold":10},"tid":"5c4c4207-12ed-4574-a9cf-034b098d2933","timestamp":1749196675990,"gateway":"4SEDL9C001X8GE"} + +{"bid":"82c8581d-584d-4e21-a857-f6d0f71ffded","data":{"wpmz_version":"1.0.5"},"tid":"5c42e010-089d-4c8f-9e0f-e48f3e9f2222","timestamp":1749196675991,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4d9e6258-f307-4683-a2b1-c2fcae7ab4ac","data":{"uom_real_name_state":9},"tid":"de0276eb-5a4a-44b1-a1ed-fb28c761678f","timestamp":1749196675992,"gateway":"4SEDL9C001X8GE"} + +{"bid":"988ad0ce-2938-49de-8a97-a3faab20646d","data":{"control_source":"A","home_latitude":26.173879999465843,"home_longitude":106.29197366411931,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"A","payload_index":"53-0-0","sn":""}],"serious_low_battery_warning_threshold":10},"tid":"eb25ba81-57a8-4736-82b5-6b5a97293e57","timestamp":1749196675993,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e098b940-03a2-4f13-b328-15efaf0960fc","data":{"wpmz_version":"1.0.5"},"tid":"42e9b7b6-9954-4fb1-86f7-5b297c1e0cc4","timestamp":1749196675994,"gateway":"4SEDL9C001X8GE"} + +{"bid":"941f1999-c39d-40cc-a9fd-e053cee212fc","data":{"uom_real_name_state":9},"tid":"a7e604f1-ccb9-4e4a-8e66-0f602b8b5561","timestamp":1749196675995,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9018b654-c030-4bfd-846f-1e6ff4f499eb","data":{"53-0-0":{"payload_index":"53-0-0","thermal_supported_palette_styles":[0,1,2,3,5,6,8,11,12,13],"version":1}},"tid":"95dc4d85-827b-4ba7-97ba-3a0dee829b1a","timestamp":1749196676065,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ac85d20a-c46b-4faa-b547-6f95619b8551","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60307395458221436,"left":0.41201296448707581,"right":0.60560256242752075,"top":0.40329182147979736},"payload_index":"53-0-0","photo_state":0,"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"zoom_calibrate_farthest_focus_value":195,"zoom_calibrate_nearest_focus_value":236,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":247,"zoom_iso":3,"zoom_max_focus_value":256,"zoom_min_focus_value":175,"zoom_shutter_speed":21}]},"tid":"341c5f00-d7e7-4f63-8fb0-0177d0fa89e9","timestamp":1749196676100,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f242b8ce-04aa-4704-9ec1-e9ebcb40ce74","data":{"control_source":"A","home_latitude":26.173879999465843,"home_longitude":106.29197366411931,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"","payload_index":"53-0-0","sn":""}],"serious_low_battery_warning_threshold":10},"tid":"dddb517b-823f-403f-851b-9600bb8cdd82","timestamp":1749196676106,"gateway":"4SEDL9C001X8GE"} + +{"bid":"3a49c39a-8bbb-4e70-bcc6-c2c13946855d","data":{"wpmz_version":"1.0.5"},"tid":"41a0d689-7d5a-4b9a-a17c-9d35da6fcbae","timestamp":1749196676107,"gateway":"4SEDL9C001X8GE"} + +{"bid":"0a9ad6e7-a72f-4734-9608-12471c44e6c2","data":{"uom_real_name_state":9},"tid":"567354e1-2f4a-4d26-b78e-9cc32fe88df0","timestamp":1749196676107,"gateway":"4SEDL9C001X8GE"} + +{"bid":"97ac9f0f-dcfc-4cbc-9eab-f677bd407f3a","data":{"control_source":"","home_latitude":26.173879999465843,"home_longitude":106.29197366411931,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"","payload_index":"53-0-0","sn":""}],"serious_low_battery_warning_threshold":10},"tid":"5deaaf2c-d177-440c-b4c4-b0cf35156128","timestamp":1749196676108,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b81e00cd-ac39-47e7-9ae4-01c9045abdbc","data":{"wpmz_version":"1.0.5"},"tid":"845361f9-5ddf-404e-aa32-0dc6351ef30e","timestamp":1749196676109,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5f92eceb-669c-403c-b69f-46e958501543","data":{"uom_real_name_state":9},"tid":"04fc19da-3555-430f-986b-33b93cca885c","timestamp":1749196676109,"gateway":"4SEDL9C001X8GE"} + +{"bid":"69ad3618-a409-4c79-85ec-5506d3ea40de","data":{"control_source":"","home_latitude":26.173879999465843,"home_longitude":106.29197366411931,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"","payload_index":"53-0-0","sn":""}],"serious_low_battery_warning_threshold":10},"tid":"5deff51c-128c-4454-830b-e7842a968828","timestamp":1749196676111,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9ede0e7a-fb69-44e7-8878-076e64b64f9b","data":{"wpmz_version":"1.0.5"},"tid":"e5fb672f-3c2c-4f24-98f4-f5e75507bfc3","timestamp":1749196676112,"gateway":"4SEDL9C001X8GE"} + +{"bid":"eefc80b1-c1d1-41cc-b658-9dc7a275c5db","data":{"uom_real_name_state":9},"tid":"667e5e0a-e072-4cf4-af39-7a2f8e552a60","timestamp":1749196676112,"gateway":"4SEDL9C001X8GE"} + +{"bid":"fbfbc8fc-cc07-4c57-97b0-d9045b87bfc6","data":{"control_source":"","home_latitude":26.173879999465843,"home_longitude":106.29197366411931,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"","payload_index":"53-0-0","sn":""}],"serious_low_battery_warning_threshold":10},"tid":"1856c775-cf8f-478d-857b-8796cf587300","timestamp":1749196676113,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b335fa67-0f93-4d43-a56c-9f775e131f6f","data":{"wpmz_version":"1.0.5"},"tid":"5e407534-832a-4dfe-a22a-d3c60c143637","timestamp":1749196676114,"gateway":"4SEDL9C001X8GE"} + +{"bid":"0d8db951-6686-40f8-8b07-11bbf55187a0","data":{"uom_real_name_state":9},"tid":"2eda06e5-58c1-471f-93a7-b30cd2a0caef","timestamp":1749196676114,"gateway":"4SEDL9C001X8GE"} + +{"bid":"40a2cc35-bfa1-4412-8fe5-747f400d9f9c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60307395458221436,"left":0.41201296448707581,"right":0.60560256242752075,"top":0.40329182147979736},"payload_index":"53-0-0","photo_state":0,"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"zoom_calibrate_farthest_focus_value":195,"zoom_calibrate_nearest_focus_value":236,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":235,"zoom_iso":3,"zoom_max_focus_value":256,"zoom_min_focus_value":175,"zoom_shutter_speed":21}]},"tid":"b474e71a-07d7-404d-b50b-ff4b45f1324a","timestamp":1749196676117,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f7de1f41-bd56-4176-a028-534b51c55708","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60307395458221436,"left":0.41201296448707581,"right":0.60560256242752075,"top":0.40329182147979736},"payload_index":"53-0-0","photo_state":0,"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"zoom_calibrate_farthest_focus_value":195,"zoom_calibrate_nearest_focus_value":236,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":221,"zoom_iso":3,"zoom_max_focus_value":256,"zoom_min_focus_value":175,"zoom_shutter_speed":21}]},"tid":"04095ce8-7e48-4e37-94bf-130a71e36dce","timestamp":1749196676126,"gateway":"4SEDL9C001X8GE"} + +{"tid":"da9fcfe7-aaeb-48cb-9df1-0d7befed328a","bid":"c29dc792-9513-4f28-bb55-e2b4d330a303","timestamp":1749196676173,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":3,"device_list":[{"sn":"4SEDL9C001X8GE","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F5BMD238V00172JR","available_video_number":0,"coexist_video_number_max":2,"camera_list":[]}]}},"gateway":"4SEDL9C001X8GE"} + +{"tid":"4a742df0-0c7b-4261-a707-3b68f2cd9326","bid":"9611e36e-4670-4ea2-bf15-a6320d5ae655","timestamp":1749196676176,"data":{"live_status":[{"video_id":"4SEDL9C001X8GE/165-0-7/normal-0","video_type":"normal","video_quality":4,"status":1,"error_status":0}]},"gateway":"4SEDL9C001X8GE"} + +{"bid":"042333fd-c7ea-4800-a911-4e2e2b5f49bc","data":{"control_source":"","home_latitude":45836623.610465862,"home_longitude":45836623.610465862,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"","payload_index":"53-0-0","sn":""}],"serious_low_battery_warning_threshold":10},"tid":"9cf23b40-62a0-4935-aa2c-cac9d8544061","timestamp":1749196676183,"gateway":"4SEDL9C001X8GE"} + +{"tid":"3bbe2b46-32f2-4b3b-988a-18117aba122c","bid":"4df24ca6-40a3-43df-9682-bd55bef446f3","timestamp":1749196676189,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":3,"device_list":[{"sn":"4SEDL9C001X8GE","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F5BMD238V00172JR","available_video_number":0,"coexist_video_number_max":2,"camera_list":[]}]}},"gateway":"4SEDL9C001X8GE"} + +{"bid":"1f18f4af-ecd2-4498-be0d-2ed528035811","data":{"wpmz_version":"1.0.5"},"tid":"ef49a962-6b88-4bbf-908b-818f97b442af","timestamp":1749196676192,"gateway":"4SEDL9C001X8GE"} + +{"bid":"399c0023-a71f-4634-857a-404be8b18e11","data":{"uom_real_name_state":9},"tid":"7117681b-90ee-4c34-be70-2dc27576b089","timestamp":1749196676193,"gateway":"4SEDL9C001X8GE"} + +{"tid":"3f751180-f5e1-4b21-96ea-1c7e3830294a","bid":"7f12c4cd-ccfb-4048-a0b5-d2a5e74b9804","timestamp":1749196676193,"data":{"live_status":[{"video_id":"4SEDL9C001X8GE/165-0-7/normal-0","video_type":"normal","video_quality":4,"status":1,"error_status":0}]},"gateway":"4SEDL9C001X8GE"} + +{"tid":"d3b2976d-f982-41d3-9711-df12e430056b","bid":"74c9b2b9-b201-41e0-acc2-9dd0f9c06375","timestamp":1749196676197,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":3,"device_list":[{"sn":"4SEDL9C001X8GE","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F5BMD238V00172JR","available_video_number":0,"coexist_video_number_max":2,"camera_list":[]}]}},"gateway":"4SEDL9C001X8GE"} + +{"bid":"6ef4c6aa-7025-4b51-ae38-c8e2cee03c6d","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"0c31f59d-4961-4fa6-a4e8-0c9bb313b7c4","timestamp":1749196676335,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8d0d6c85-4bb5-4f1c-9e61-d9ced1f97ddf","data":{"control_source":"","home_latitude":45836623.610465862,"home_longitude":45836623.610465862,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"A","payload_index":"53-0-0","sn":""}],"serious_low_battery_warning_threshold":10},"tid":"67b3461b-6b25-446d-a244-aa3a270fe328","timestamp":1749196676344,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7dd3e065-b477-4f09-b9fd-fb2ec5d8d068","data":{"wpmz_version":"1.0.5"},"tid":"bd7a809d-f70d-4016-a08c-7901df3cc066","timestamp":1749196676346,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e9bc694c-a2a1-45f8-8e70-1980c6d71a88","data":{"uom_real_name_state":9},"tid":"79be6147-753a-42c0-8803-d3473a3b1d6e","timestamp":1749196676347,"gateway":"4SEDL9C001X8GE"} + +{"bid":"883da232-512d-439f-8b1a-c04154d2db2c","data":{"control_source":"A","home_latitude":45836623.610465862,"home_longitude":45836623.610465862,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"A","payload_index":"53-0-0","sn":""}],"serious_low_battery_warning_threshold":10},"tid":"b6a39b82-3d43-4eb6-89db-0ab2c4ad7b6e","timestamp":1749196676351,"gateway":"4SEDL9C001X8GE"} + +{"bid":"37fa851f-9dd4-4d8e-a2ff-23488258e1b0","data":{"wpmz_version":"1.0.5"},"tid":"527fb9d0-fb44-4005-aeb2-b70dc65f6b89","timestamp":1749196676354,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b94c578a-8f96-4114-84a9-2ea8a697ecd2","data":{"uom_real_name_state":9},"tid":"1f18e8ca-3a76-4773-8617-912c2dae85cb","timestamp":1749196676356,"gateway":"4SEDL9C001X8GE"} + +{"bid":"61fd6f7d-8bfb-4f40-84e9-de05a828c4d1","data":{"commander_flight_height":100},"need_reply":1,"tid":"b704c228-ccbe-4930-b65e-b76f4b78120a","timestamp":1749196676892,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8ad1d546-62d0-4c99-8ad0-da0757d1af24","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"63f245f0-6705-46a6-a3c4-74d02108f9fe","timestamp":1749196676895,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5a0a932f-92ae-42c4-9954-0ca5c165acf5","data":{"offline_map_enable":false},"need_reply":1,"tid":"44786523-6f54-4e89-9a25-19807daa0bff","timestamp":1749196676900,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1d12495f-f7dc-480e-bf2d-e3e34834d677","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"08bca056-c171-47c9-9a78-b8d70aa5ddaa","timestamp":1749196677006,"gateway":"4SEDL9C001X8GE"} + +{"bid":"30532010-8627-4b88-a95c-57324ded316e","data":{"control_source":"A","home_latitude":45836623.610465862,"home_longitude":45836623.610465862,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"A","payload_index":"53-0-0","sn":"1581F5BMD238V00172JR-0"}],"serious_low_battery_warning_threshold":10},"tid":"81777ff8-4969-4a14-a3b7-6544905caf61","timestamp":1749196677007,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b9f50f5e-c976-49bf-873f-c4c75a468375","data":{"wpmz_version":"1.0.5"},"tid":"d6cdf12d-67d2-4e00-b939-5e48dad71c4c","timestamp":1749196677010,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c1b3c577-104f-4b4c-815a-79106f9ac7fd","data":{"uom_real_name_state":9},"tid":"05a5df8f-c9f1-446b-b4d0-e988f411fc01","timestamp":1749196677011,"gateway":"4SEDL9C001X8GE"} + +{"tid":"a002e674-d2fc-4d90-ac81-e18688aa66d6","bid":"ae2a09b0-4fdc-4c2c-9db5-1f71055d1b3a","timestamp":1749196677686,"data":{"live_capacity":{"available_video_number":3,"coexist_video_number_max":3,"device_list":[{"sn":"4SEDL9C001X8GE","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F5BMD238V00172JR","available_video_number":2,"coexist_video_number_max":2,"camera_list":[{"camera_index":"39-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]},{"camera_index":"53-0-0","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"wide","switchable_video_types":["normal","wide","zoom","ir"]}]}]}]}},"gateway":"4SEDL9C001X8GE"} + +{"bid":"c7bb6b70-59b8-489a-b578-e119c2edc4c7","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309386253356934,"left":0.41157123446464539,"right":0.60515815019607544,"top":0.40331169962883},"payload_index":"53-0-0","photo_state":0,"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":27,"zoom_calibrate_farthest_focus_value":195,"zoom_calibrate_nearest_focus_value":236,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":258,"zoom_iso":3,"zoom_max_focus_value":256,"zoom_min_focus_value":175,"zoom_shutter_speed":16}]},"tid":"04dec292-f2cf-42c2-8bef-fd21dc2129dc","timestamp":1749196677772,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ef8871be-117e-4ed5-b793-40b4c06e5c49","data":{"mode_code_reason":0},"need_reply":1,"tid":"4e87f758-9397-434c-b1ee-d3c37be7076f","timestamp":1749196675978,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6ef4c6aa-7025-4b51-ae38-c8e2cee03c6d","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"0c31f59d-4961-4fa6-a4e8-0c9bb313b7c4","timestamp":1749196676335,"gateway":"4SEDL9C001X8GE"} + +{"bid":"654b5155-084f-4426-9ce2-a96f57449d95","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309439897537231,"left":0.411521703004837,"right":0.60510826110839844,"top":0.40331220626831055},"payload_index":"53-0-0","photo_state":0,"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":27,"zoom_calibrate_farthest_focus_value":195,"zoom_calibrate_nearest_focus_value":236,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":99,"zoom_iso":4,"zoom_max_focus_value":256,"zoom_min_focus_value":175,"zoom_shutter_speed":27}]},"tid":"0c047ebc-4811-405e-9ebd-c8c684d221c5","timestamp":1749196678821,"gateway":"4SEDL9C001X8GE"} + +{"bid":"11239b3a-bea8-42c1-b3fd-8eabc59297e7","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309439897537231,"left":0.411521703004837,"right":0.60510826110839844,"top":0.40331220626831055},"payload_index":"53-0-0","photo_state":0,"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":27,"zoom_calibrate_farthest_focus_value":195,"zoom_calibrate_nearest_focus_value":236,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":86,"zoom_iso":4,"zoom_max_focus_value":256,"zoom_min_focus_value":175,"zoom_shutter_speed":27}]},"tid":"1eeaa2bd-ae7a-4091-8142-9e11988242a1","timestamp":1749196678839,"gateway":"4SEDL9C001X8GE"} + +{"bid":"61fd6f7d-8bfb-4f40-84e9-de05a828c4d1","data":{"commander_flight_height":100},"need_reply":1,"tid":"b704c228-ccbe-4930-b65e-b76f4b78120a","timestamp":1749196676892,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8ad1d546-62d0-4c99-8ad0-da0757d1af24","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"63f245f0-6705-46a6-a3c4-74d02108f9fe","timestamp":1749196676895,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5a0a932f-92ae-42c4-9954-0ca5c165acf5","data":{"offline_map_enable":false},"need_reply":1,"tid":"44786523-6f54-4e89-9a25-19807daa0bff","timestamp":1749196676900,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1d12495f-f7dc-480e-bf2d-e3e34834d677","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"08bca056-c171-47c9-9a78-b8d70aa5ddaa","timestamp":1749196677006,"gateway":"4SEDL9C001X8GE"} + +{"tid":"0cbf9be3-e159-499a-9543-d88c1c73ef32","bid":"a4ed5af4-9942-4505-aad7-8d840b1b4113","timestamp":1749196679741,"data":{"firmware_version":"09.01.0006","compatible_status":0,"firmware_upgrade_status":0},"gateway":"4SEDL9C001X8GE"} + +{"bid":"d24e4d15-e67a-4673-9be5-8482f00b29e9","data":{"control_source":"A","home_latitude":45836623.610465862,"home_longitude":45836623.610465862,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"A","payload_index":"53-0-0","sn":"1581F5BMD238V00172JR-0"}],"serious_low_battery_warning_threshold":10},"tid":"ee1f6ba5-c8fd-49bb-8cc1-e246a08f7351","timestamp":1749196680937,"gateway":"4SEDL9C001X8GE"} + +{"bid":"17ee711b-8492-41a5-bd99-06ccb292128d","data":{"wpmz_version":"1.0.5"},"tid":"6fba4db1-b704-43b9-8c3a-8228424e4200","timestamp":1749196680938,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ee3a9d6f-db39-4656-9552-8500c236d159","data":{"uom_real_name_state":9},"tid":"1123782c-267e-43a3-99c6-1cb98618b79a","timestamp":1749196680938,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ef8871be-117e-4ed5-b793-40b4c06e5c49","data":{"mode_code_reason":0},"need_reply":1,"tid":"4e87f758-9397-434c-b1ee-d3c37be7076f","timestamp":1749196675978,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6ef4c6aa-7025-4b51-ae38-c8e2cee03c6d","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"0c31f59d-4961-4fa6-a4e8-0c9bb313b7c4","timestamp":1749196676335,"gateway":"4SEDL9C001X8GE"} + +{"bid":"61fd6f7d-8bfb-4f40-84e9-de05a828c4d1","data":{"commander_flight_height":100},"need_reply":1,"tid":"b704c228-ccbe-4930-b65e-b76f4b78120a","timestamp":1749196676892,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8ad1d546-62d0-4c99-8ad0-da0757d1af24","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"63f245f0-6705-46a6-a3c4-74d02108f9fe","timestamp":1749196676895,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5a0a932f-92ae-42c4-9954-0ca5c165acf5","data":{"offline_map_enable":false},"need_reply":1,"tid":"44786523-6f54-4e89-9a25-19807daa0bff","timestamp":1749196676900,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1d12495f-f7dc-480e-bf2d-e3e34834d677","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"08bca056-c171-47c9-9a78-b8d70aa5ddaa","timestamp":1749196677006,"gateway":"4SEDL9C001X8GE"} + +{"tid":"b0db93bc-930a-4275-ae56-951b1ef5d516","bid":"7d3fe0e5-fda7-43e4-b152-35e9da6c71f3","timestamp":1749196688868,"data":{"live_status":[{"video_id":"1581F5BMD238V00172JR/39-0-7/normal-0","video_type":"normal","video_quality":4,"status":1,"error_status":0},{"video_id":"4SEDL9C001X8GE/165-0-7/normal-0","video_type":"normal","video_quality":4,"status":1,"error_status":0}]},"gateway":"4SEDL9C001X8GE"} + +{"bid":"ef8871be-117e-4ed5-b793-40b4c06e5c49","data":{"mode_code_reason":0},"need_reply":1,"tid":"4e87f758-9397-434c-b1ee-d3c37be7076f","timestamp":1749196675978,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6ef4c6aa-7025-4b51-ae38-c8e2cee03c6d","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"0c31f59d-4961-4fa6-a4e8-0c9bb313b7c4","timestamp":1749196676335,"gateway":"4SEDL9C001X8GE"} + +{"bid":"61fd6f7d-8bfb-4f40-84e9-de05a828c4d1","data":{"commander_flight_height":100},"need_reply":1,"tid":"b704c228-ccbe-4930-b65e-b76f4b78120a","timestamp":1749196676892,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8ad1d546-62d0-4c99-8ad0-da0757d1af24","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"63f245f0-6705-46a6-a3c4-74d02108f9fe","timestamp":1749196676895,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5a0a932f-92ae-42c4-9954-0ca5c165acf5","data":{"offline_map_enable":false},"need_reply":1,"tid":"44786523-6f54-4e89-9a25-19807daa0bff","timestamp":1749196676900,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1d12495f-f7dc-480e-bf2d-e3e34834d677","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"08bca056-c171-47c9-9a78-b8d70aa5ddaa","timestamp":1749196677006,"gateway":"4SEDL9C001X8GE"} + +{"tid":"b5f729d6-4fcc-4c01-9e49-b7a4cb14b273","bid":"8591b854-09c1-4cb6-af9e-3fb95aa4b6d3","timestamp":1749196692422,"data":{"live_status":[{"video_id":"1581F5BMD238V00172JR/39-0-7/normal-0","video_type":"normal","video_quality":4,"status":1,"error_status":0},{"video_id":"1581F5BMD238V00172JR/53-0-0/normal-0","video_type":"wide","video_quality":4,"status":1,"error_status":0},{"video_id":"4SEDL9C001X8GE/165-0-7/normal-0","video_type":"normal","video_quality":4,"status":1,"error_status":0}]},"gateway":"4SEDL9C001X8GE"} + +{"bid":"ef8871be-117e-4ed5-b793-40b4c06e5c49","data":{"mode_code_reason":0},"need_reply":1,"tid":"4e87f758-9397-434c-b1ee-d3c37be7076f","timestamp":1749196675978,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6ef4c6aa-7025-4b51-ae38-c8e2cee03c6d","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"0c31f59d-4961-4fa6-a4e8-0c9bb313b7c4","timestamp":1749196676335,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7b3681a9-de49-48b3-ae14-c97c87593138","data":{"current_rth_mode":1},"need_reply":1,"tid":"a165a528-0c51-4a0b-ab85-07c595e55376","timestamp":1749196699227,"gateway":"4SEDL9C001X8GE"} + +{"bid":"61fd6f7d-8bfb-4f40-84e9-de05a828c4d1","data":{"commander_flight_height":100},"need_reply":1,"tid":"b704c228-ccbe-4930-b65e-b76f4b78120a","timestamp":1749196676892,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8ad1d546-62d0-4c99-8ad0-da0757d1af24","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"63f245f0-6705-46a6-a3c4-74d02108f9fe","timestamp":1749196676895,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5a0a932f-92ae-42c4-9954-0ca5c165acf5","data":{"offline_map_enable":false},"need_reply":1,"tid":"44786523-6f54-4e89-9a25-19807daa0bff","timestamp":1749196676900,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1d12495f-f7dc-480e-bf2d-e3e34834d677","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"08bca056-c171-47c9-9a78-b8d70aa5ddaa","timestamp":1749196677006,"gateway":"4SEDL9C001X8GE"} + +{"bid":"3b5719ff-d3e1-4ba1-b485-9fac3c622419","data":{"control_source":"A","home_latitude":26.173879888078677,"home_longitude":106.29197376132795,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"A","payload_index":"53-0-0","sn":"1581F5BMD238V00172JR-0"}],"serious_low_battery_warning_threshold":10},"tid":"e25362a2-4c16-485c-878d-b0588779460b","timestamp":1749196700109,"gateway":"4SEDL9C001X8GE"} + +{"bid":"10464d99-b2a6-4f6b-9002-79ce2313d957","data":{"wpmz_version":"1.0.5"},"tid":"896d72f8-9f87-47c1-9e56-2f6df8b433a7","timestamp":1749196700111,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1836c661-7003-4c58-88ed-875bb81dd70b","data":{"uom_real_name_state":9},"tid":"30e3dc07-d94c-4926-bdc8-50a4511a258a","timestamp":1749196700113,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7b3681a9-de49-48b3-ae14-c97c87593138","data":{"current_rth_mode":1},"need_reply":1,"tid":"a165a528-0c51-4a0b-ab85-07c595e55376","timestamp":1749196699227,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7b3681a9-de49-48b3-ae14-c97c87593138","data":{"current_rth_mode":1},"need_reply":1,"tid":"a165a528-0c51-4a0b-ab85-07c595e55376","timestamp":1749196699227,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ef8871be-117e-4ed5-b793-40b4c06e5c49","data":{"mode_code_reason":0},"need_reply":1,"tid":"4e87f758-9397-434c-b1ee-d3c37be7076f","timestamp":1749196675978,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6ef4c6aa-7025-4b51-ae38-c8e2cee03c6d","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"0c31f59d-4961-4fa6-a4e8-0c9bb313b7c4","timestamp":1749196676335,"gateway":"4SEDL9C001X8GE"} + +{"bid":"61fd6f7d-8bfb-4f40-84e9-de05a828c4d1","data":{"commander_flight_height":100},"need_reply":1,"tid":"b704c228-ccbe-4930-b65e-b76f4b78120a","timestamp":1749196676892,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8ad1d546-62d0-4c99-8ad0-da0757d1af24","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"63f245f0-6705-46a6-a3c4-74d02108f9fe","timestamp":1749196676895,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5a0a932f-92ae-42c4-9954-0ca5c165acf5","data":{"offline_map_enable":false},"need_reply":1,"tid":"44786523-6f54-4e89-9a25-19807daa0bff","timestamp":1749196676900,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1d12495f-f7dc-480e-bf2d-e3e34834d677","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"08bca056-c171-47c9-9a78-b8d70aa5ddaa","timestamp":1749196677006,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7b3681a9-de49-48b3-ae14-c97c87593138","data":{"current_rth_mode":1},"need_reply":1,"tid":"a165a528-0c51-4a0b-ab85-07c595e55376","timestamp":1749196699227,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ef8871be-117e-4ed5-b793-40b4c06e5c49","data":{"mode_code_reason":0},"need_reply":1,"tid":"4e87f758-9397-434c-b1ee-d3c37be7076f","timestamp":1749196675978,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6ef4c6aa-7025-4b51-ae38-c8e2cee03c6d","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"0c31f59d-4961-4fa6-a4e8-0c9bb313b7c4","timestamp":1749196676335,"gateway":"4SEDL9C001X8GE"} + +{"bid":"61fd6f7d-8bfb-4f40-84e9-de05a828c4d1","data":{"commander_flight_height":100},"need_reply":1,"tid":"b704c228-ccbe-4930-b65e-b76f4b78120a","timestamp":1749196676892,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8ad1d546-62d0-4c99-8ad0-da0757d1af24","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"63f245f0-6705-46a6-a3c4-74d02108f9fe","timestamp":1749196676895,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5a0a932f-92ae-42c4-9954-0ca5c165acf5","data":{"offline_map_enable":false},"need_reply":1,"tid":"44786523-6f54-4e89-9a25-19807daa0bff","timestamp":1749196676900,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1d12495f-f7dc-480e-bf2d-e3e34834d677","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"08bca056-c171-47c9-9a78-b8d70aa5ddaa","timestamp":1749196677006,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7b3681a9-de49-48b3-ae14-c97c87593138","data":{"current_rth_mode":1},"need_reply":1,"tid":"a165a528-0c51-4a0b-ab85-07c595e55376","timestamp":1749196699227,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ef8871be-117e-4ed5-b793-40b4c06e5c49","data":{"mode_code_reason":0},"need_reply":1,"tid":"4e87f758-9397-434c-b1ee-d3c37be7076f","timestamp":1749196675978,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6ef4c6aa-7025-4b51-ae38-c8e2cee03c6d","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"0c31f59d-4961-4fa6-a4e8-0c9bb313b7c4","timestamp":1749196676335,"gateway":"4SEDL9C001X8GE"} + +{"bid":"61fd6f7d-8bfb-4f40-84e9-de05a828c4d1","data":{"commander_flight_height":100},"need_reply":1,"tid":"b704c228-ccbe-4930-b65e-b76f4b78120a","timestamp":1749196676892,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8ad1d546-62d0-4c99-8ad0-da0757d1af24","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"63f245f0-6705-46a6-a3c4-74d02108f9fe","timestamp":1749196676895,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5a0a932f-92ae-42c4-9954-0ca5c165acf5","data":{"offline_map_enable":false},"need_reply":1,"tid":"44786523-6f54-4e89-9a25-19807daa0bff","timestamp":1749196676900,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1d12495f-f7dc-480e-bf2d-e3e34834d677","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"08bca056-c171-47c9-9a78-b8d70aa5ddaa","timestamp":1749196677006,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7b3681a9-de49-48b3-ae14-c97c87593138","data":{"current_rth_mode":1},"need_reply":1,"tid":"a165a528-0c51-4a0b-ab85-07c595e55376","timestamp":1749196699227,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ef8871be-117e-4ed5-b793-40b4c06e5c49","data":{"mode_code_reason":0},"need_reply":1,"tid":"4e87f758-9397-434c-b1ee-d3c37be7076f","timestamp":1749196675978,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6ef4c6aa-7025-4b51-ae38-c8e2cee03c6d","data":{"current_commander_flight_mode":1},"need_reply":1,"tid":"0c31f59d-4961-4fa6-a4e8-0c9bb313b7c4","timestamp":1749196676335,"gateway":"4SEDL9C001X8GE"} + +{"bid":"61fd6f7d-8bfb-4f40-84e9-de05a828c4d1","data":{"commander_flight_height":100},"need_reply":1,"tid":"b704c228-ccbe-4930-b65e-b76f4b78120a","timestamp":1749196676892,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8ad1d546-62d0-4c99-8ad0-da0757d1af24","data":{"commander_mode_lost_action":1},"need_reply":1,"tid":"63f245f0-6705-46a6-a3c4-74d02108f9fe","timestamp":1749196676895,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5a0a932f-92ae-42c4-9954-0ca5c165acf5","data":{"offline_map_enable":false},"need_reply":1,"tid":"44786523-6f54-4e89-9a25-19807daa0bff","timestamp":1749196676900,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1d12495f-f7dc-480e-bf2d-e3e34834d677","data":{"flysafe_database_version":"01.00.01.33"},"need_reply":1,"tid":"08bca056-c171-47c9-9a78-b8d70aa5ddaa","timestamp":1749196677006,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2f0a8afd-c3a4-4236-9181-b7e1d73e2701","data":{"control_source":"A","home_latitude":26.173879914228859,"home_longitude":106.2919738069711,"locked":false,"low_battery_warning_threshold":20,"payloads":[{"control_source":"A","payload_index":"53-0-0","sn":"1581F5BMD238V00172JR-0"}],"serious_low_battery_warning_threshold":10},"tid":"4561d419-87b2-48ff-ac50-21de4092d28a","timestamp":1749196734152,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a733ef44-933c-4d25-b361-7c59f36dcbf9","data":{"wpmz_version":"1.0.5"},"tid":"c68e5e31-a6cf-4e04-9164-c3746c86069d","timestamp":1749196734154,"gateway":"4SEDL9C001X8GE"} + +{"bid":"305326e5-4352-4677-b864-1a054f9b3772","data":{"uom_real_name_state":9},"tid":"202b4a4c-ebad-46cd-9526-2ae03b82e272","timestamp":1749196734158,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7b3681a9-de49-48b3-ae14-c97c87593138","data":{"current_rth_mode":1},"need_reply":1,"tid":"a165a528-0c51-4a0b-ab85-07c595e55376","timestamp":1749196699227,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6dee7b7e-6213-4fd8-97b3-0d36a1f1bbe6","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60306471586227417,"left":0.40954938530921936,"right":0.60312414169311523,"top":0.403282642364502},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":17,"zoom_calibrate_farthest_focus_value":197,"zoom_calibrate_nearest_focus_value":238,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":87,"zoom_iso":3,"zoom_max_focus_value":258,"zoom_min_focus_value":177,"zoom_shutter_speed":16}]},"tid":"d37c5a1d-be70-4b8e-9c0c-4e75bca5555d","timestamp":1749196739894,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a3e24146-cec4-4eef-9454-07fc9b939c94","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60308825969696045,"left":0.4112926721572876,"right":0.60487788915634155,"top":0.40330603718757629},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":17,"zoom_calibrate_farthest_focus_value":197,"zoom_calibrate_nearest_focus_value":238,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":271,"zoom_iso":3,"zoom_max_focus_value":258,"zoom_min_focus_value":177,"zoom_shutter_speed":16}]},"tid":"31238572-db17-40d6-8487-895e8ec33b36","timestamp":1749196740484,"gateway":"4SEDL9C001X8GE"} + +{"bid":"29ef8c78-f008-4d37-8717-d50f428b5726","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60308825969696045,"left":0.4112926721572876,"right":0.60487788915634155,"top":0.40330603718757629},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":17,"zoom_calibrate_farthest_focus_value":197,"zoom_calibrate_nearest_focus_value":238,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":284,"zoom_iso":3,"zoom_max_focus_value":258,"zoom_min_focus_value":177,"zoom_shutter_speed":16}]},"tid":"739cda1d-d861-4725-8556-31efb431166f","timestamp":1749196740504,"gateway":"4SEDL9C001X8GE"} + +{"bid":"125cd5c3-6f06-4880-ba4d-6666101fdbae","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309427976608276,"left":0.41154211759567261,"right":0.605128824710846,"top":0.40331202745437622},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":17,"zoom_calibrate_farthest_focus_value":197,"zoom_calibrate_nearest_focus_value":238,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":241,"zoom_iso":3,"zoom_max_focus_value":258,"zoom_min_focus_value":177,"zoom_shutter_speed":16}]},"tid":"61da0a15-9ba5-4df5-87f6-fe8b637be31f","timestamp":1749196740745,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c25711c5-6946-4380-90e1-9242ae2eb632","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603095054626465,"left":0.41152045130729675,"right":0.605107069015503,"top":0.40331283211708069},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":17,"zoom_calibrate_farthest_focus_value":197,"zoom_calibrate_nearest_focus_value":238,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":302,"zoom_iso":3,"zoom_max_focus_value":258,"zoom_min_focus_value":177,"zoom_shutter_speed":15}]},"tid":"a146e8f1-8724-43b5-b609-3ac64999dd77","timestamp":1749196741120,"gateway":"4SEDL9C001X8GE"} + +{"bid":"fb5d05ff-52e2-4b59-a1d8-a1e26b5b3a82","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603095054626465,"left":0.41152045130729675,"right":0.605107069015503,"top":0.40331283211708069},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":17,"zoom_calibrate_farthest_focus_value":197,"zoom_calibrate_nearest_focus_value":238,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":315,"zoom_iso":3,"zoom_max_focus_value":258,"zoom_min_focus_value":177,"zoom_shutter_speed":15}]},"tid":"ad510a9c-0790-4978-b5de-3445b61a7960","timestamp":1749196741141,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7b3681a9-de49-48b3-ae14-c97c87593138","data":{"current_rth_mode":1},"need_reply":1,"tid":"a165a528-0c51-4a0b-ab85-07c595e55376","timestamp":1749196699227,"gateway":"4SEDL9C001X8GE"} + +{"bid":"3cdd5790-d1c7-477b-9877-46742865aa8a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":17,"zoom_calibrate_farthest_focus_value":197,"zoom_calibrate_nearest_focus_value":238,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":293,"zoom_iso":3,"zoom_max_focus_value":258,"zoom_min_focus_value":177,"zoom_shutter_speed":17}]},"tid":"cc800a01-993b-4c5c-a964-09e533013c87","timestamp":1749196747885,"gateway":"4SEDL9C001X8GE"} + +{"bid":"fa3188aa-8b57-4ad6-ad60-89b6da45b411","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":17,"zoom_calibrate_farthest_focus_value":197,"zoom_calibrate_nearest_focus_value":238,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":178,"zoom_iso":3,"zoom_max_focus_value":258,"zoom_min_focus_value":177,"zoom_shutter_speed":17}]},"tid":"ef9aa568-9cbf-4bc6-8452-0017adae8537","timestamp":1749196748159,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5de4bddd-3398-42e4-82d4-97b2342c2258","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":17,"zoom_calibrate_farthest_focus_value":197,"zoom_calibrate_nearest_focus_value":238,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":164,"zoom_iso":3,"zoom_max_focus_value":258,"zoom_min_focus_value":177,"zoom_shutter_speed":17}]},"tid":"fcb5be0f-f2f8-4615-9278-d3f62cd9c093","timestamp":1749196748188,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7b3681a9-de49-48b3-ae14-c97c87593138","data":{"current_rth_mode":1},"need_reply":1,"tid":"a165a528-0c51-4a0b-ab85-07c595e55376","timestamp":1749196699227,"gateway":"4SEDL9C001X8GE"} + +{"bid":"0b475911-5281-47f9-ab6c-709b6590fd6b","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":19,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":203,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":19}]},"tid":"d9d7debd-0f5a-49b4-8023-980b70c8fbc1","timestamp":1749196782868,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ddda487a-ab4f-4579-9eac-d02ead394803","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":19,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":158,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":19}]},"tid":"ce01624d-6eff-4364-ae27-509d7447f607","timestamp":1749196783401,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1c554baa-f037-41fa-b851-bf5cb4914c14","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":19,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":145,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":19}]},"tid":"eced1ffa-21f3-4c13-922b-8339c126f025","timestamp":1749196783442,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9a7e4669-0a8b-4472-97be-2211fcbea8ae","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":19,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":199,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":24}]},"tid":"5bc7e99e-840f-45d9-bd81-efa4dcb784fd","timestamp":1749196785316,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7818c45b-1863-43ee-b1e3-359d810285e8","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":21,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":230,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":24}]},"tid":"e3ca0394-f849-4922-b942-b6ff716e59e2","timestamp":1749196785610,"gateway":"4SEDL9C001X8GE"} + +{"bid":"34fde747-d163-4ac3-adc4-77ed8a99d420","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":21,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":243,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":24}]},"tid":"61ba4345-d577-44fb-811f-aef34858cc21","timestamp":1749196785619,"gateway":"4SEDL9C001X8GE"} + +{"bid":"aea3482e-589c-4214-8d35-345f4546a326","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":21,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":204,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":22}]},"tid":"1059364d-a9c4-4c1e-87c5-fccce7628d86","timestamp":1749196788554,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1b78cc97-57c1-4584-8ee4-bff6ef0a56e9","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":21,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":228,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":22}]},"tid":"4e8f9e15-2641-4055-b7ae-f00cbfd2cb00","timestamp":1749196788822,"gateway":"4SEDL9C001X8GE"} + +{"bid":"0f3ffbda-cd39-4439-8f55-92489ae1ca87","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":21,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":242,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":22}]},"tid":"0d2ee858-7974-4407-8122-0524c05a7ed3","timestamp":1749196788872,"gateway":"4SEDL9C001X8GE"} + +{"bid":"64f5ee46-7a0c-4266-ad02-4d3f88a43753","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":21,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":203,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":24}]},"tid":"c22945fd-dd95-45e5-976c-bf2acfea68e5","timestamp":1749196792236,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1e074521-7121-4773-8a66-7329f0b3444d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":21,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":230,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":24}]},"tid":"084fad3c-cce8-4cff-ac06-84d09d3247bb","timestamp":1749196792496,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4184c112-f7ec-44f8-bca4-6d71a94b8511","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":21,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":243,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":24}]},"tid":"debbd6b3-de76-4ffd-b64a-fca964da7c54","timestamp":1749196792532,"gateway":"4SEDL9C001X8GE"} + +{"bid":"551e2b49-8829-497a-a8d0-cd82dd92eca1","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":21,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":204,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":22}]},"tid":"496a5e92-3c36-4d25-bc69-44804beda82a","timestamp":1749196794730,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8d62b31b-c96e-453a-afa3-0cb756e444aa","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":21,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":204,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":22}]},"tid":"7d894b04-3d03-4689-9b24-f1338f2573cd","timestamp":1749196794809,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8f2a900a-3a06-4821-a30f-22fa54274596","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2559,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":21,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":204,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":22}]},"tid":"5de1a11e-8491-475c-a4ca-e75d9b698307","timestamp":1749196794830,"gateway":"4SEDL9C001X8GE"} + +{"bid":"147e8146-7e86-432a-98d5-8039725aa09f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2554,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":21,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":213,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":21}]},"tid":"0269fd55-30fb-4fd8-9376-81544f325c40","timestamp":1749196908493,"gateway":"4SEDL9C001X8GE"} + +{"bid":"24b0d48d-e39d-48f3-9078-3f7cbc04cefe","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2554,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":21,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":153,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":21}]},"tid":"4cce3208-ea09-463a-8e82-59920fc62196","timestamp":1749196909024,"gateway":"4SEDL9C001X8GE"} + +{"bid":"0d892438-7062-44a9-a18b-4bbfe4963b73","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2554,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":21,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":140,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":21}]},"tid":"cf1567ec-d7db-4ec2-ac12-8491400aa43e","timestamp":1749196909101,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8bb5aa82-749e-4003-9697-f1cd3dc1209f","data":{"mode_code_reason":4},"need_reply":1,"tid":"aee3c9d6-9957-483d-9f26-95ad151965e9","timestamp":1749196962710,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8bb5aa82-749e-4003-9697-f1cd3dc1209f","data":{"mode_code_reason":4},"need_reply":1,"tid":"aee3c9d6-9957-483d-9f26-95ad151965e9","timestamp":1749196962710,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8bb5aa82-749e-4003-9697-f1cd3dc1209f","data":{"mode_code_reason":4},"need_reply":1,"tid":"aee3c9d6-9957-483d-9f26-95ad151965e9","timestamp":1749196962710,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f8a02695-7303-4d4d-b7c3-9301a60cbcd7","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":13,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":199,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":15}]},"tid":"2a398532-5b61-4c08-a92a-068871ab056b","timestamp":1749196969229,"gateway":"4SEDL9C001X8GE"} + +{"bid":"d0668f5f-84a3-4d7a-9418-17a1245f54af","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":13,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":230,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":15}]},"tid":"00ac2917-3fad-4af6-92b4-d30253358d91","timestamp":1749196969596,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6d05a416-ebb2-499d-a3f6-c7c3ba6f0268","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":13,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":243,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":15}]},"tid":"a657a4cd-d01a-4d24-8db8-283f651a776a","timestamp":1749196969655,"gateway":"4SEDL9C001X8GE"} + +{"bid":"040838ff-9bf9-4504-a35d-1d2c61eeec13","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":13,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":201,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":16}]},"tid":"b5bda213-02b8-401f-83c9-bbd9fc2a29ad","timestamp":1749196969870,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ff441e87-8359-4ade-8beb-62a2d91cb1ba","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":13,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":220,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":16}]},"tid":"9deb112d-b1a3-4d55-a4af-92b0cdeb2010","timestamp":1749196970123,"gateway":"4SEDL9C001X8GE"} + +{"bid":"aaf6bb74-9025-4ba4-8b49-f7a3305fa03a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":13,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":234,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":16}]},"tid":"7b9a6e83-2d45-4835-b043-c5af9872c9f2","timestamp":1749196970167,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8bb5aa82-749e-4003-9697-f1cd3dc1209f","data":{"mode_code_reason":4},"need_reply":1,"tid":"aee3c9d6-9957-483d-9f26-95ad151965e9","timestamp":1749196962710,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8bb5aa82-749e-4003-9697-f1cd3dc1209f","data":{"mode_code_reason":4},"need_reply":1,"tid":"aee3c9d6-9957-483d-9f26-95ad151965e9","timestamp":1749196962710,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8bb5aa82-749e-4003-9697-f1cd3dc1209f","data":{"mode_code_reason":4},"need_reply":1,"tid":"aee3c9d6-9957-483d-9f26-95ad151965e9","timestamp":1749196962710,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8bb5aa82-749e-4003-9697-f1cd3dc1209f","data":{"mode_code_reason":4},"need_reply":1,"tid":"aee3c9d6-9957-483d-9f26-95ad151965e9","timestamp":1749196962710,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8bb5aa82-749e-4003-9697-f1cd3dc1209f","data":{"mode_code_reason":4},"need_reply":1,"tid":"aee3c9d6-9957-483d-9f26-95ad151965e9","timestamp":1749196962710,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8bb5aa82-749e-4003-9697-f1cd3dc1209f","data":{"mode_code_reason":4},"need_reply":1,"tid":"aee3c9d6-9957-483d-9f26-95ad151965e9","timestamp":1749196962710,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b8be2d65-d819-43ba-9444-dad720390717","data":{"mode_code_reason":12},"need_reply":1,"tid":"8fbffb71-2176-43f4-a3f1-0e1ed308250c","timestamp":1749197024895,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b8be2d65-d819-43ba-9444-dad720390717","data":{"mode_code_reason":12},"need_reply":1,"tid":"8fbffb71-2176-43f4-a3f1-0e1ed308250c","timestamp":1749197024895,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b8be2d65-d819-43ba-9444-dad720390717","data":{"mode_code_reason":12},"need_reply":1,"tid":"8fbffb71-2176-43f4-a3f1-0e1ed308250c","timestamp":1749197024895,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ed9fad15-f545-42ab-b0c3-779c007243d3","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":13,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":198,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":15}]},"tid":"8662a8ed-9bab-40ae-a223-55710af70bfa","timestamp":1749197031799,"gateway":"4SEDL9C001X8GE"} + +{"bid":"60c70fc1-f62f-4abc-bbfe-17e5cbbcc3fa","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":13,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":239,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":15}]},"tid":"61395cd2-3206-4c36-882d-5c785b5f0206","timestamp":1749197032136,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f06d9ff8-f4ac-4d0a-9c26-175826f74ee7","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":13,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":252,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":15}]},"tid":"0f75f248-4acd-4022-903d-68f59d97f346","timestamp":1749197032184,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b8be2d65-d819-43ba-9444-dad720390717","data":{"mode_code_reason":12},"need_reply":1,"tid":"8fbffb71-2176-43f4-a3f1-0e1ed308250c","timestamp":1749197024895,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b8be2d65-d819-43ba-9444-dad720390717","data":{"mode_code_reason":12},"need_reply":1,"tid":"8fbffb71-2176-43f4-a3f1-0e1ed308250c","timestamp":1749197024895,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b8be2d65-d819-43ba-9444-dad720390717","data":{"mode_code_reason":12},"need_reply":1,"tid":"8fbffb71-2176-43f4-a3f1-0e1ed308250c","timestamp":1749197024895,"gateway":"4SEDL9C001X8GE"} + +{"bid":"edc6eda5-454e-48b3-be51-93f8fee34935","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":13,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":205,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":13}]},"tid":"0824a4e3-d5d8-4af1-a80e-9c75377f51a4","timestamp":1749197056312,"gateway":"4SEDL9C001X8GE"} + +{"bid":"807ebfe3-6967-41a4-86af-6e2609abcbed","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":13,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":248,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":13}]},"tid":"df0b8ee4-3848-462f-ad95-f603cf022e4f","timestamp":1749197056598,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b76c8ff8-e62e-4dfd-b7bd-7faa428419ce","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":13,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":262,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":13}]},"tid":"9706a9ab-2b8b-4507-94d5-7a8c59541aea","timestamp":1749197056662,"gateway":"4SEDL9C001X8GE"} + +{"bid":"5b6638d6-5525-4f32-988b-f181af741e11","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":12,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":216,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":11}]},"tid":"bf060cf9-fdde-4044-9ef6-03040bb123b1","timestamp":1749197061016,"gateway":"4SEDL9C001X8GE"} + +{"bid":"7581bc2c-9cdf-4898-8f89-f7bb092df9f7","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":12,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":184,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":11}]},"tid":"a92067a8-62a9-43df-a247-5c402a026b79","timestamp":1749197061546,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9620dba9-2854-4cdc-810d-862f8d54ad08","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":12,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":171,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":11}]},"tid":"fe25475f-7a5d-4e93-aeec-ea3e2795d4f7","timestamp":1749197061602,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b8be2d65-d819-43ba-9444-dad720390717","data":{"mode_code_reason":12},"need_reply":1,"tid":"8fbffb71-2176-43f4-a3f1-0e1ed308250c","timestamp":1749197024895,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a816ad4c-6588-43b8-a908-ed4794425d00","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":12,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":219,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":11}]},"tid":"2a755ef9-9396-4a37-b4e1-9ee819284d71","timestamp":1749197067025,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b2f97e36-6e16-43db-8275-77b743f53efb","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":13,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":263,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":11}]},"tid":"7506f316-685d-47db-bd0c-5c68f12358d0","timestamp":1749197067357,"gateway":"4SEDL9C001X8GE"} + +{"bid":"e788baf9-9271-42cf-8432-e6605d1e8891","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":13,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":277,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":11}]},"tid":"c26b2261-ab48-48af-ac8d-a4af84f91768","timestamp":1749197067383,"gateway":"4SEDL9C001X8GE"} + +{"bid":"0fd3be64-3088-4f63-9bcc-8025db0596a3","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":12,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":235,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":11}]},"tid":"a6cbb95e-b610-452c-ac34-bcc3be8ace26","timestamp":1749197071163,"gateway":"4SEDL9C001X8GE"} + +{"bid":"0aaec671-e482-4472-acc5-2706947e0fdf","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":12,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":271,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":11}]},"tid":"5e056463-9fc9-4be9-9fb8-0f9a1f839700","timestamp":1749197071453,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4941f507-9070-4391-80c1-acb43e517c06","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":12,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":284,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":11}]},"tid":"364ff553-df7c-4a7f-acf1-3be4adc1b70a","timestamp":1749197071464,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b8be2d65-d819-43ba-9444-dad720390717","data":{"mode_code_reason":12},"need_reply":1,"tid":"8fbffb71-2176-43f4-a3f1-0e1ed308250c","timestamp":1749197024895,"gateway":"4SEDL9C001X8GE"} + +{"bid":"24ac2252-8fb4-4f36-b4d4-88f44690684f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":12,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":247,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":12}]},"tid":"2b2f7f62-9aab-4eb1-a912-ccb44503c3a4","timestamp":1749197073406,"gateway":"4SEDL9C001X8GE"} + +{"bid":"553de0ba-3d03-4e85-af35-85b3c9d68110","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":12,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":285,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":12}]},"tid":"f6d1f53c-bb6c-453b-b043-ec41f2e9ac68","timestamp":1749197073683,"gateway":"4SEDL9C001X8GE"} + +{"bid":"08ea8940-b098-4d2c-9b3d-2ad3e5ded971","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":12,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":298,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":12}]},"tid":"b32c0b50-29c1-4d35-a3f7-695b49e0ee8f","timestamp":1749197073722,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ace4c1d9-c080-4f6c-a5be-f4d91e8e9a63","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":12,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":254,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":12}]},"tid":"d20d456c-dcb6-4dca-b4aa-0ff6900906f3","timestamp":1749197075720,"gateway":"4SEDL9C001X8GE"} + +{"bid":"3958ee38-5b33-4f5e-b777-b87c665ba788","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":12,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":299,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":12}]},"tid":"91aa9549-2bab-40a3-a5d5-00f7e8b14a18","timestamp":1749197075995,"gateway":"4SEDL9C001X8GE"} + +{"bid":"2955c595-b53e-44c0-a08b-b73e9108e995","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":12,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":312,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":12}]},"tid":"01ae5240-e03a-4efc-8986-16fb655f4a50","timestamp":1749197076022,"gateway":"4SEDL9C001X8GE"} + +{"bid":"17e48c35-9662-474a-bf8e-324121dc9d7c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":12,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":266,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":13}]},"tid":"f0ad3270-652d-4180-9446-d8209f23aeab","timestamp":1749197076402,"gateway":"4SEDL9C001X8GE"} + +{"bid":"bf89887a-8def-42d4-8cfd-2a0b2eb6be12","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":11,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":330,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":13}]},"tid":"9361f714-5ae5-441a-b50d-5840eda512d4","timestamp":1749197077102,"gateway":"4SEDL9C001X8GE"} + +{"bid":"392cb8c2-553c-44cc-ac81-c19360c3fe42","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":11,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":336,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":13}]},"tid":"abe028db-236e-461c-b0bf-5d29d6f3639a","timestamp":1749197077159,"gateway":"4SEDL9C001X8GE"} + +{"bid":"0a2ce519-5396-4a57-9007-8be1107117e4","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":11,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":276,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":15}]},"tid":"e8fa14f4-1da1-49b9-90a2-f4548804875f","timestamp":1749197078332,"gateway":"4SEDL9C001X8GE"} + +{"bid":"9bb15ff6-0432-4774-8deb-014c7589dce4","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":12,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":327,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":15}]},"tid":"3365c161-44bf-47a9-891b-877bf0abcc6e","timestamp":1749197078741,"gateway":"4SEDL9C001X8GE"} + +{"bid":"cd262275-6b15-4ca2-bdf0-91d222e0e07f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":12,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":341,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":15}]},"tid":"8399d874-6f5a-40be-a869-f3587c99ca65","timestamp":1749197078779,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b8be2d65-d819-43ba-9444-dad720390717","data":{"mode_code_reason":12},"need_reply":1,"tid":"8fbffb71-2176-43f4-a3f1-0e1ed308250c","timestamp":1749197024895,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f3c7ce6d-d52a-4b99-85f0-0b54871bff20","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":11,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":301,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":13}]},"tid":"85137124-2a6b-47d0-b428-14d181c3a212","timestamp":1749197080667,"gateway":"4SEDL9C001X8GE"} + +{"bid":"a5eb5fb9-8f76-4f67-820d-401909c61a0f","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":11,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":340,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":15}]},"tid":"d803059a-c9a8-4481-8a58-6a4ccc54e417","timestamp":1749197081006,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b54a1e8e-2f39-44ca-89cf-a08b3b64200d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":11,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":327,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":15}]},"tid":"4bf86a63-684a-4869-b447-a0a63c1793d2","timestamp":1749197081042,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8e010b53-46c6-492d-b62c-8bdac5b33d24","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":11,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":377,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":15}]},"tid":"0b113933-dcad-423c-a2b6-055f95ffd1a7","timestamp":1749197081279,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6344e1c0-39e0-4321-805d-d6cf83cb8123","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":12,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":316,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":16}]},"tid":"925d2bb5-780d-4257-8624-19b37aef4892","timestamp":1749197081769,"gateway":"4SEDL9C001X8GE"} + +{"bid":"22ace852-d95d-4a48-87c8-9af598f4d483","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":12,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":320,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":16}]},"tid":"09c80272-520e-4804-8c32-fd45771df68a","timestamp":1749197081787,"gateway":"4SEDL9C001X8GE"} + +{"bid":"cab49ce1-3041-43a0-a122-0a5e804e8bb9","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":12,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":424,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":17}]},"tid":"5cdf1462-fe18-4c29-9313-2941ecbd38c7","timestamp":1749197082772,"gateway":"4SEDL9C001X8GE"} + +{"bid":"dfda0df8-9e9c-4b2a-bfb0-cdf8b4281166","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":15,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":315,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":21}]},"tid":"909d4152-b7d6-49fe-aed9-251be1fb0b07","timestamp":1749197083225,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b3b8a219-12f4-4221-8a2b-111cc4db3773","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":15,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":321,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":21}]},"tid":"b3f9ed1c-196c-4b55-b975-3cb41b5a0b22","timestamp":1749197083259,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1fe72c87-a33c-4ce0-a84a-9a48d87d6c87","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":15,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":424,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":24}]},"tid":"2ccfc367-f625-47a1-9d13-40851e787832","timestamp":1749197083592,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4a44db53-258a-4a0e-8aae-0af462e20cee","data":{"mode_code_reason":0},"need_reply":1,"tid":"674f05aa-7786-4d24-9970-13a56b70733f","timestamp":1749197083611,"gateway":"4SEDL9C001X8GE"} + +{"bid":"35aa9b42-dc76-4c30-84e6-1df9e53b74cd","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":8,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":139,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":22}]},"tid":"15877831-8954-49e0-bf9d-926b96e3bcbf","timestamp":1749197084470,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1adcc113-6833-4219-beeb-059da369d088","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155204176902771,"right":0.60513883829116821,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":8,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":166,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":22}]},"tid":"35608cf9-d6c2-48ab-a1ec-f3442f33ce33","timestamp":1749197084485,"gateway":"4SEDL9C001X8GE"} + +{"bid":"38a16957-8713-452f-8730-83dcf42c8e62","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309463739395142,"left":0.41154488921165466,"right":0.605131685733795,"top":0.40331241488456726},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":8,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":256,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":19}]},"tid":"090e73a3-2e6a-4d76-8c60-98752508cdb5","timestamp":1749197084696,"gateway":"4SEDL9C001X8GE"} + +{"bid":"f2eb9cfd-b1d1-4c3f-80bf-1a39594dd808","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.6030954122543335,"left":0.41152551770210266,"right":0.605112135410309,"top":0.403313159942627},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":8,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":296,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":19}]},"tid":"33bd79f9-e0dc-48ba-8303-a929a07f02f4","timestamp":1749197085018,"gateway":"4SEDL9C001X8GE"} + +{"bid":"15935277-e47a-413f-bf9c-6054f03a7ace","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.6030954122543335,"left":0.41152551770210266,"right":0.605112135410309,"top":0.403313159942627},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":8,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":309,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":19}]},"tid":"b7a775c7-0278-4d55-9928-328925e6d469","timestamp":1749197085048,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4a44db53-258a-4a0e-8aae-0af462e20cee","data":{"mode_code_reason":0},"need_reply":1,"tid":"674f05aa-7786-4d24-9970-13a56b70733f","timestamp":1749197083611,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4a44db53-258a-4a0e-8aae-0af462e20cee","data":{"mode_code_reason":0},"need_reply":1,"tid":"674f05aa-7786-4d24-9970-13a56b70733f","timestamp":1749197083611,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4a44db53-258a-4a0e-8aae-0af462e20cee","data":{"mode_code_reason":0},"need_reply":1,"tid":"674f05aa-7786-4d24-9970-13a56b70733f","timestamp":1749197083611,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4a44db53-258a-4a0e-8aae-0af462e20cee","data":{"mode_code_reason":0},"need_reply":1,"tid":"674f05aa-7786-4d24-9970-13a56b70733f","timestamp":1749197083611,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4a44db53-258a-4a0e-8aae-0af462e20cee","data":{"mode_code_reason":0},"need_reply":1,"tid":"674f05aa-7786-4d24-9970-13a56b70733f","timestamp":1749197083611,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4a44db53-258a-4a0e-8aae-0af462e20cee","data":{"mode_code_reason":0},"need_reply":1,"tid":"674f05aa-7786-4d24-9970-13a56b70733f","timestamp":1749197083611,"gateway":"4SEDL9C001X8GE"} + +{"bid":"3a0def8d-8226-4e5e-a6ea-0151aef2c607","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309457778930664,"left":0.41155257821083069,"right":0.60513937473297119,"top":0.4033123254776001},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":27,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":270,"zoom_iso":3,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":11}]},"tid":"b69105d7-f8b0-41cb-bbd3-a4babad59e5d","timestamp":1749197125472,"gateway":"4SEDL9C001X8GE"} + +{"bid":"64f3d20e-32a2-439a-9aea-fb7d615c4fa1","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309457778930664,"left":0.41154196858406067,"right":0.60512864589691162,"top":0.40331235527992249},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":27,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":113,"zoom_iso":4,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":27}]},"tid":"0fdf67b7-670e-4cfd-8edb-12093a2a99c1","timestamp":1749197126471,"gateway":"4SEDL9C001X8GE"} + +{"bid":"346cf6c0-4775-4ab8-b6fb-ee93aaa151c1","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309457778930664,"left":0.41154196858406067,"right":0.60512864589691162,"top":0.40331235527992249},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":27,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":86,"zoom_iso":4,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":27}]},"tid":"e8e25ee0-449b-4724-ae27-9ef8820001e3","timestamp":1749197126528,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c79eb940-5d72-49ad-b2f6-0325f6337177","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309427976608276,"left":0.41153660416603088,"right":0.605123281478882,"top":0.40331205725669861},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":3,"wide_shutter_speed":27,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":124,"zoom_iso":4,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":27}]},"tid":"53a03fb0-8f89-4791-bab1-76934f70c00b","timestamp":1749197126909,"gateway":"4SEDL9C001X8GE"} + +{"bid":"24aca9ef-1376-4ebb-a403-3f218f50ec8d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309386253356934,"left":0.411525011062622,"right":0.60511165857315063,"top":0.40331161022186279},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":27,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":438,"zoom_iso":4,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":27}]},"tid":"6381e1e5-6ab7-494e-89ca-05c670445ab8","timestamp":1749197127948,"gateway":"4SEDL9C001X8GE"} + +{"bid":"6c9f9972-f789-4d0c-b225-1079e7df2654","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309386253356934,"left":0.411525011062622,"right":0.60511165857315063,"top":0.40331161022186279},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":27,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":305,"zoom_iso":4,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":27}]},"tid":"6392fc6c-8b8a-4880-b24d-153ff9b1870d","timestamp":1749197127967,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4e61d0b6-41c1-4f41-8ccb-2ed11b64266a","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309416055679321,"left":0.4114869236946106,"right":0.60507333278656,"top":0.403311938047409},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":4,"wide_shutter_speed":27,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":134,"zoom_iso":4,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":27}]},"tid":"9c5eb257-4d42-4636-9c2e-19fe0ec676d4","timestamp":1749197128183,"gateway":"4SEDL9C001X8GE"} + +{"bid":"93ea43ca-76f5-4274-9df2-77d7d8d9d409","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309028625488281,"left":0.41121795773506165,"right":0.60480278730392456,"top":0.403308093547821},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":9,"wide_shutter_speed":43,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":435,"zoom_iso":8,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":38}]},"tid":"27123e46-f718-4a04-abca-f0a1f21c786b","timestamp":1749197129856,"gateway":"4SEDL9C001X8GE"} + +{"bid":"1accfd5b-3594-47bf-9e54-fd8991c0058c","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309708118438721,"left":0.41124653816223145,"right":0.6048315167427063,"top":0.40331482887268066},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":9,"wide_shutter_speed":43,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":302,"zoom_iso":8,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":38}]},"tid":"8a7e2e03-edb3-4814-ac1c-9de82b358c34","timestamp":1749197129890,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b593b9aa-7b59-4690-9ca0-df4c8d2b8383","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60310131311416626,"left":0.41165995597839355,"right":0.6052473783493042,"top":0.40331906080245972},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":9,"wide_shutter_speed":43,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":195,"zoom_iso":8,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":38}]},"tid":"6bc8907d-1fd6-409e-92db-827a524a1e8f","timestamp":1749197130082,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4a44db53-258a-4a0e-8aae-0af462e20cee","data":{"mode_code_reason":0},"need_reply":1,"tid":"674f05aa-7786-4d24-9970-13a56b70733f","timestamp":1749197083611,"gateway":"4SEDL9C001X8GE"} + +{"bid":"32953345-172b-4983-bafe-7de96bee7894","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60310447216033936,"left":0.41153427958488464,"right":0.60512101650238037,"top":0.40332219004631042},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":9,"wide_shutter_speed":43,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":428,"zoom_iso":8,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":38}]},"tid":"1ed39f09-56a4-468e-8684-d04a96140a7d","timestamp":1749197131056,"gateway":"4SEDL9C001X8GE"} + +{"bid":"63312262-660b-4c70-9ab4-60ab9334695d","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60310202836990356,"left":0.41151010990142822,"right":0.60509663820266724,"top":0.40331974625587463},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":9,"wide_shutter_speed":43,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":441,"zoom_iso":8,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":38}]},"tid":"6aca28e2-0471-4aad-90e6-63c319489205","timestamp":1749197131078,"gateway":"4SEDL9C001X8GE"} + +{"bid":"c24df879-d74f-439e-bbe8-7f075f28c924","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155201196670532,"right":0.60513877868652344,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":9,"wide_shutter_speed":42,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":425,"zoom_iso":8,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":38}]},"tid":"ba3c014a-9953-44f7-85ae-499937d518d2","timestamp":1749197132243,"gateway":"4SEDL9C001X8GE"} + +{"bid":"982e73f8-bdc3-4fc2-87f2-71fe619699c1","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309457778930664,"left":0.41155454516410828,"right":0.60514140129089355,"top":0.4033123254776001},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":8,"wide_shutter_speed":39,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":193,"zoom_iso":7,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":34}]},"tid":"5e08ca1d-207c-4b9d-bab7-76c3f397fa5b","timestamp":1749197133104,"gateway":"4SEDL9C001X8GE"} + +{"bid":"0bb9ee00-fe72-4af2-9166-a70b7335a043","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309457778930664,"left":0.41155454516410828,"right":0.60514140129089355,"top":0.4033123254776001},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":8,"wide_shutter_speed":39,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":182,"zoom_iso":7,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":34}]},"tid":"d7e95100-c59f-4c36-a4bf-0c72505bb611","timestamp":1749197133154,"gateway":"4SEDL9C001X8GE"} + +{"bid":"4a44db53-258a-4a0e-8aae-0af462e20cee","data":{"mode_code_reason":0},"need_reply":1,"tid":"674f05aa-7786-4d24-9970-13a56b70733f","timestamp":1749197083611,"gateway":"4SEDL9C001X8GE"} + +{"bid":"b70d3cf4-ad5e-4137-a8a5-17ebd1ef34e5","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094518184662,"left":0.41154128313064575,"right":0.605127990245819,"top":0.4033123254776001},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":8,"wide_shutter_speed":39,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":262,"zoom_iso":10,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":45}]},"tid":"895403bd-fb67-4075-b14a-b59702cfc7e3","timestamp":1749197191297,"gateway":"4SEDL9C001X8GE"} + +{"bid":"ccfacbcf-cce4-4ba3-927e-0c542403c33e","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309511423110962,"left":0.41165643930435181,"right":0.60524380207061768,"top":0.40331292152404785},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":10,"wide_shutter_speed":43,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":105,"zoom_iso":8,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":38}]},"tid":"72e46221-0bbc-42f2-8825-c11c67a3ba6a","timestamp":1749197192466,"gateway":"4SEDL9C001X8GE"} + +{"bid":"8ef3b358-f5b8-43c1-a333-e88fc077e270","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309511423110962,"left":0.41165643930435181,"right":0.60524380207061768,"top":0.40331292152404785},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":10,"wide_shutter_speed":43,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":237,"zoom_iso":8,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":38}]},"tid":"283d5bc7-b926-4630-b4f4-afc702bf63a4","timestamp":1749197192514,"gateway":"4SEDL9C001X8GE"} + +{"bid":"53f225aa-c8f3-49bc-952b-d64c697af2e5","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309517383575439,"left":0.41158369183540344,"right":0.605170726776123,"top":0.403313010931015},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":10,"wide_shutter_speed":43,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":420,"zoom_iso":8,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":38}]},"tid":"54d557bd-4a58-403d-b192-cfd2e278a187","timestamp":1749197195999,"gateway":"4SEDL9C001X8GE"} + +{"bid":"39d40a92-67ce-4563-94b5-8e9459938c45","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41155081987380981,"right":0.605137586593628,"top":0.40331229567527771},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":8,"wide_shutter_speed":39,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":220,"zoom_iso":6,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":33}]},"tid":"a77858de-990e-4115-80bc-e543e791cd28","timestamp":1749197196743,"gateway":"4SEDL9C001X8GE"} + +{"bid":"51eec8f6-6dde-4588-a82f-0b4eb39e1a54","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094518184662,"left":0.41155245900154114,"right":0.60513925552368164,"top":0.4033123254776001},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":8,"wide_shutter_speed":39,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":219,"zoom_iso":6,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":33}]},"tid":"f0482dec-0c5b-46d2-bfad-74247ce0cae2","timestamp":1749197196800,"gateway":"4SEDL9C001X8GE"} + +{"bid":"266a9e3c-7eac-4af1-b9f4-72f271aeebb8","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.60309457778930664,"left":0.4115428626537323,"right":0.605129599571228,"top":0.40331235527992249},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":8,"wide_shutter_speed":39,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":1,"zoom_focus_value":281,"zoom_iso":10,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":45}]},"tid":"303fccb5-344d-43e5-9f7a-362a7acd1f46","timestamp":1749197256992,"gateway":"4SEDL9C001X8GE"} + +{"bid":"842cc428-8107-4007-a848-3f656b047eb6","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41147494316101074,"right":0.60506123304367065,"top":0.403312236070633},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":10,"wide_shutter_speed":43,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":2,"zoom_focus_value":110,"zoom_iso":8,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":38}]},"tid":"750c4106-474a-437c-8e46-ca1a5c3b4dbb","timestamp":1749197257815,"gateway":"4SEDL9C001X8GE"} + +{"bid":"be0449a2-7c50-4f8d-bb6a-3475154f22bb","data":{"cameras":[{"camera_mode":0,"ir_metering_mode":0,"ir_metering_point":{"temperature":0,"x":0.5,"y":0.5},"ir_zoom_factor":2,"liveview_world_region":{"bottom":0.603094458580017,"left":0.41147494316101074,"right":0.60506123304367065,"top":0.403312236070633},"payload_index":"53-0-0","photo_state":0,"photo_storage_settings":["wide","zoom"],"record_time":0,"recording_state":0,"remain_photo_num":2549,"remain_record_duration":0,"screen_split_enable":false,"wide_exposure_mode":1,"wide_exposure_value":16,"wide_iso":10,"wide_shutter_speed":43,"zoom_calibrate_farthest_focus_value":199,"zoom_calibrate_nearest_focus_value":240,"zoom_exposure_mode":1,"zoom_exposure_value":16,"zoom_factor":5.0125,"zoom_focus_mode":2,"zoom_focus_state":0,"zoom_focus_value":243,"zoom_iso":8,"zoom_max_focus_value":260,"zoom_min_focus_value":179,"zoom_shutter_speed":38}]},"tid":"b76b350e-2485-4bbd-af7b-87b103f00511","timestamp":1749197257838,"gateway":"4SEDL9C001X8GE"} + +{"tid":"4d91d5a9-d4af-492e-bffb-44d40f4ae04a","bid":"ba89bd95-b376-4dce-ad30-8f3f67f235a2","timestamp":1749198999159,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"8f742885-a258-4064-a08e-bf35b59e74a9","bid":"7b7603b0-e424-4586-8c8a-0fee95600b6b","timestamp":1749198999171,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"aef19eb8-7f14-487f-9960-40dc0fd91891","data":{"air_transfer_enable":false},"need_reply":1,"tid":"80b60ba2-b640-4e06-a70d-e6ca65ca69f5","timestamp":1749199002601,"gateway":"8UUXN4P00A06NK"} + +{"tid":"443722ba-4339-4f07-a986-9018514ddcb7","bid":"99b138a2-0ff0-49d4-baa9-3a300a275466","timestamp":1749199003112,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"aef19eb8-7f14-487f-9960-40dc0fd91891","data":{"air_transfer_enable":false},"need_reply":1,"tid":"80b60ba2-b640-4e06-a70d-e6ca65ca69f5","timestamp":1749199004793,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d9ccd7e7-fde4-4149-a284-4207a78a0491","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e190a345-797b-4a14-ba3b-46cf9925a816","timestamp":1749199005040,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c9a15e73-d927-4589-bce2-fbba3ee28e4a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ae8ee67a-9760-4aad-893f-29e4772dc78d","timestamp":1749199005720,"gateway":"8UUXN4P00A06NK"} + +{"bid":"43b28c33-3ea0-450a-a130-de5c8acc5cc6","data":{"dongle_infos":[]},"tid":"cc436042-e029-4269-a6af-f010ce5ba451","timestamp":1749199005732,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cd4ff7fc-8825-4a12-a80a-e075f027c933","data":{"mobility_status_notify":0},"need_reply":1,"tid":"123b65a3-46f0-498e-bc14-f07eb678d5b4","timestamp":1749199005737,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b409dc37-3882-419b-afbe-0a8243eed9f7","data":{"firmware_version":"13.01.0002"},"tid":"72583aee-58d3-485e-aa72-67cf77c452d2","timestamp":1749199005789,"gateway":"8UUXN4P00A06NK"} + +{"bid":"55546a33-7a86-49e8-b901-becdbe796ba1","data":{"dongle_infos":[]},"tid":"206bb4c8-74a7-4e3b-9602-45722fbe7b96","timestamp":1749199006727,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d9ccd7e7-fde4-4149-a284-4207a78a0491","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e190a345-797b-4a14-ba3b-46cf9925a816","timestamp":1749199007212,"gateway":"8UUXN4P00A06NK"} + +{"bid":"614155ce-f77e-4ae7-9136-51a0a9b30277","data":{"dongle_infos":[]},"tid":"646bc087-8a4b-47de-82ea-265a6c12de67","timestamp":1749199007288,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c9a15e73-d927-4589-bce2-fbba3ee28e4a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ae8ee67a-9760-4aad-893f-29e4772dc78d","timestamp":1749199007812,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cd4ff7fc-8825-4a12-a80a-e075f027c933","data":{"mobility_status_notify":0},"need_reply":1,"tid":"123b65a3-46f0-498e-bc14-f07eb678d5b4","timestamp":1749199007813,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ce439215-a5a6-4ce0-93b8-0a3ffd5f9c25","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e7cd6bcb-a08a-4e7a-ab1d-830d23835f88","timestamp":1749199009157,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aef19eb8-7f14-487f-9960-40dc0fd91891","data":{"air_transfer_enable":false},"need_reply":1,"tid":"80b60ba2-b640-4e06-a70d-e6ca65ca69f5","timestamp":1749199009406,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9252d899-9ac5-4812-93dd-07fb860d690e","data":{"departure_trajectory":[]},"tid":"5d03ba0d-a866-46e8-891e-78554348de99","timestamp":1749199009685,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6d35843c-40d1-491b-aba9-be2c2bde2814","data":{"departure_trajectory":[]},"tid":"8688e03b-3a62-413d-8fb1-8acde1b2781d","timestamp":1749199010718,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ce439215-a5a6-4ce0-93b8-0a3ffd5f9c25","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e7cd6bcb-a08a-4e7a-ab1d-830d23835f88","timestamp":1749199011212,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c9a15e73-d927-4589-bce2-fbba3ee28e4a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ae8ee67a-9760-4aad-893f-29e4772dc78d","timestamp":1749199012012,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cd4ff7fc-8825-4a12-a80a-e075f027c933","data":{"mobility_status_notify":0},"need_reply":1,"tid":"123b65a3-46f0-498e-bc14-f07eb678d5b4","timestamp":1749199012014,"gateway":"8UUXN4P00A06NK"} + +{"bid":"42bc065c-6d47-4083-80ce-e3f4dc34e070","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6bf29a81-4b01-4321-9009-58197ae52e63","timestamp":1749199014156,"gateway":"8UUXN4P00A06NK"} + +{"bid":"42bc065c-6d47-4083-80ce-e3f4dc34e070","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6bf29a81-4b01-4321-9009-58197ae52e63","timestamp":1749199016212,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aef19eb8-7f14-487f-9960-40dc0fd91891","data":{"air_transfer_enable":false},"need_reply":1,"tid":"80b60ba2-b640-4e06-a70d-e6ca65ca69f5","timestamp":1749199017605,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c9a15e73-d927-4589-bce2-fbba3ee28e4a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ae8ee67a-9760-4aad-893f-29e4772dc78d","timestamp":1749199020213,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cd4ff7fc-8825-4a12-a80a-e075f027c933","data":{"mobility_status_notify":0},"need_reply":1,"tid":"123b65a3-46f0-498e-bc14-f07eb678d5b4","timestamp":1749199020214,"gateway":"8UUXN4P00A06NK"} + +{"bid":"42bc065c-6d47-4083-80ce-e3f4dc34e070","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6bf29a81-4b01-4321-9009-58197ae52e63","timestamp":1749199020412,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aef19eb8-7f14-487f-9960-40dc0fd91891","data":{"air_transfer_enable":false},"need_reply":1,"tid":"80b60ba2-b640-4e06-a70d-e6ca65ca69f5","timestamp":1749199025809,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c9a15e73-d927-4589-bce2-fbba3ee28e4a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ae8ee67a-9760-4aad-893f-29e4772dc78d","timestamp":1749199028412,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cd4ff7fc-8825-4a12-a80a-e075f027c933","data":{"mobility_status_notify":0},"need_reply":1,"tid":"123b65a3-46f0-498e-bc14-f07eb678d5b4","timestamp":1749199028413,"gateway":"8UUXN4P00A06NK"} + +{"bid":"42bc065c-6d47-4083-80ce-e3f4dc34e070","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6bf29a81-4b01-4321-9009-58197ae52e63","timestamp":1749199028612,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aef19eb8-7f14-487f-9960-40dc0fd91891","data":{"air_transfer_enable":false},"need_reply":1,"tid":"80b60ba2-b640-4e06-a70d-e6ca65ca69f5","timestamp":1749199034003,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c9a15e73-d927-4589-bce2-fbba3ee28e4a","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ae8ee67a-9760-4aad-893f-29e4772dc78d","timestamp":1749199036612,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cd4ff7fc-8825-4a12-a80a-e075f027c933","data":{"mobility_status_notify":0},"need_reply":1,"tid":"123b65a3-46f0-498e-bc14-f07eb678d5b4","timestamp":1749199036613,"gateway":"8UUXN4P00A06NK"} + +{"bid":"42bc065c-6d47-4083-80ce-e3f4dc34e070","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6bf29a81-4b01-4321-9009-58197ae52e63","timestamp":1749199036812,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aef19eb8-7f14-487f-9960-40dc0fd91891","data":{"air_transfer_enable":false},"need_reply":1,"tid":"80b60ba2-b640-4e06-a70d-e6ca65ca69f5","timestamp":1749199042205,"gateway":"8UUXN4P00A06NK"} + +{"bid":"52d82d96-6db5-4a62-b2b6-d4b53e703603","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"bf42c131-d9dc-4972-aa3f-0e6983ceac4c","timestamp":1749199044106,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cd4ff7fc-8825-4a12-a80a-e075f027c933","data":{"mobility_status_notify":0},"need_reply":1,"tid":"123b65a3-46f0-498e-bc14-f07eb678d5b4","timestamp":1749199044812,"gateway":"8UUXN4P00A06NK"} + +{"bid":"42bc065c-6d47-4083-80ce-e3f4dc34e070","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"6bf29a81-4b01-4321-9009-58197ae52e63","timestamp":1749199045012,"gateway":"8UUXN4P00A06NK"} + +{"bid":"52d82d96-6db5-4a62-b2b6-d4b53e703603","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":3}},"need_reply":1,"tid":"bf42c131-d9dc-4972-aa3f-0e6983ceac4c","timestamp":1749199046212,"gateway":"8UUXN4P00A06NK"} + +{"tid":"489089b9-126a-435d-8126-278ba7d4e34f","bid":"74574ad7-70e0-475c-8bd4-a8560e638f6d","timestamp":1749199076702,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"a2bf6935-a36e-4f94-9bdd-13d2fe238498","bid":"8c505c72-3790-4019-8163-43c2c72bf9ff","timestamp":1749199076705,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"6cbe3108-0dd7-4a7e-ba89-e1a04d41d874","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e5884650-7830-4353-8dde-5594016dbdc6","timestamp":1749199077346,"gateway":"8UUXN4P00A06NK"} + +{"tid":"da771d29-223b-4c32-aeb6-c4bd0d33768f","bid":"647c57d3-ebe4-4529-872b-0f548ca0a8bb","timestamp":1749199078871,"data":{"firmware_version":"13.01.0002","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"68f677b5-d417-428e-b08d-5391000a8b0a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7c85bd31-a2bc-4aca-941c-2df4412c9cbd","timestamp":1749199079329,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b6b3a93f-5343-406c-b8c6-09af616fb0a6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"38b8d816-ee92-4f45-9ff0-5ba75c5e4639","timestamp":1749199079445,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c32c580a-63dd-411a-9290-b3b37caede45","data":{"dongle_infos":[]},"tid":"3dbb34f9-c1b7-45de-835c-c453876314c5","timestamp":1749199079824,"gateway":"8UUXN4P00A06NK"} + +{"bid":"092f2e45-27a5-46c6-a75a-e7d366d014ee","data":{"firmware_version":"13.01.0002"},"tid":"87acc09e-e1f8-4be3-b382-8139509dc8ba","timestamp":1749199079830,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6cbe3108-0dd7-4a7e-ba89-e1a04d41d874","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e5884650-7830-4353-8dde-5594016dbdc6","timestamp":1749199080017,"gateway":"8UUXN4P00A06NK"} + +{"bid":"72b143f8-b649-4d37-86f8-bd20273b5782","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"99aabf79-0023-49b8-b5aa-7be5612f1ea2","timestamp":1749199080534,"gateway":"8UUXN4P00A06NK"} + +{"bid":"91017269-cb26-4a54-82a1-66cf08806fa9","data":{"dongle_infos":[]},"tid":"5504f9d3-e1ec-4253-9828-51a54085c897","timestamp":1749199080857,"gateway":"8UUXN4P00A06NK"} + +{"bid":"68f677b5-d417-428e-b08d-5391000a8b0a","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7c85bd31-a2bc-4aca-941c-2df4412c9cbd","timestamp":1749199081513,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b6b3a93f-5343-406c-b8c6-09af616fb0a6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"38b8d816-ee92-4f45-9ff0-5ba75c5e4639","timestamp":1749199081514,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6ab3d6b7-f10c-4dd3-baed-8b3e545e3059","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a951bb6a-7802-4538-8384-1a08453d27a5","timestamp":1749199081707,"gateway":"8UUXN4P00A06NK"} + +{"bid":"72b143f8-b649-4d37-86f8-bd20273b5782","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"99aabf79-0023-49b8-b5aa-7be5612f1ea2","timestamp":1749199082715,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3821425f-7ff8-4ae9-a6e8-e0a27f6f803d","data":{"dongle_infos":[]},"tid":"656ee785-35a9-4e37-8fd9-a6391443af48","timestamp":1749199083019,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6ab3d6b7-f10c-4dd3-baed-8b3e545e3059","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"a951bb6a-7802-4538-8384-1a08453d27a5","timestamp":1749199083719,"gateway":"8UUXN4P00A06NK"} + +{"bid":"131b07fc-fd21-4bcc-8062-01bed72051f9","data":{"departure_trajectory":[]},"tid":"b327e3f6-a37c-47a5-8d0f-5470139d551e","timestamp":1749199084195,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6cbe3108-0dd7-4a7e-ba89-e1a04d41d874","data":{"air_transfer_enable":false},"need_reply":1,"tid":"e5884650-7830-4353-8dde-5594016dbdc6","timestamp":1749199084211,"gateway":"8UUXN4P00A06NK"} + +{"bid":"81c5ed50-2d52-411a-acce-1cf3514369ab","data":{"departure_trajectory":[]},"tid":"fd577438-f6a9-4a3f-8284-364e53d1f2cc","timestamp":1749199084817,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b6b3a93f-5343-406c-b8c6-09af616fb0a6","data":{"mobility_status_notify":0},"need_reply":1,"tid":"38b8d816-ee92-4f45-9ff0-5ba75c5e4639","timestamp":1749199085714,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a46ffe44-dbf3-4138-928c-becc58415a37","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3d66a03c-4519-4393-bb11-eafc42339387","timestamp":1749199086711,"gateway":"8UUXN4P00A06NK"} + +{"bid":"72b143f8-b649-4d37-86f8-bd20273b5782","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"99aabf79-0023-49b8-b5aa-7be5612f1ea2","timestamp":1749199086919,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a46ffe44-dbf3-4138-928c-becc58415a37","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"3d66a03c-4519-4393-bb11-eafc42339387","timestamp":1749199088715,"gateway":"8UUXN4P00A06NK"} + +{"tid":"be9d1c8f-44e1-4534-b995-63344f4397b0","bid":"e8faeb7d-84f8-47b8-b9af-2292c1153376","timestamp":1749199905109,"data":{"firmware_version":"13.01.0007","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"tid":"cb5b59f5-95ba-4b79-a2b4-2b4cd1e1bea9","bid":"548e390e-b144-4273-bd99-90abace5901a","timestamp":1749201296951,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"d7229136-8c50-45f1-b43c-be3eddd7b474","bid":"bffa5045-f545-4419-b879-ad10bc74a691","timestamp":1749201296956,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"f436c3df-9a99-4eb8-ae7d-f9099f5482fd","bid":"da60f7a9-2f00-486f-9f78-093bf8d958f2","timestamp":1749201298187,"data":{"firmware_version":"13.01.0007","compatible_status":0,"firmware_upgrade_status":1},"gateway":"8UUXN4P00A06NK"} + +{"bid":"9dda444b-a8cc-4ebd-98ef-b327de002caf","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d79a8f38-54c9-41e9-9365-c5c7b19847f6","timestamp":1749201298669,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3057d0df-85f9-4aed-adf1-837b130f7a71","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1d7a49f5-fd13-422e-8dd8-339e6a823acf","timestamp":1749201298920,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bd948002-4a57-44d5-b394-a13e0c8fa77e","data":{"dongle_infos":[]},"tid":"48a700bc-2709-4a6d-9ee4-eca9861a84bc","timestamp":1749201299104,"gateway":"8UUXN4P00A06NK"} + +{"bid":"75a2bf20-ed68-407c-8cee-e1a96cadf3db","data":{"firmware_version":"13.01.0007"},"tid":"c8ae50b3-5f03-419b-be07-1adb2354b8d0","timestamp":1749201299116,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ee99f820-5bab-414a-a7ca-01d1bf6c11ab","data":{"air_transfer_enable":false},"need_reply":1,"tid":"6f157f9d-35bd-48cf-a986-e6c71f43c40d","timestamp":1749201299301,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6a696789-66ab-4fca-9731-66ec90ac6af8","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"d4eee988-a093-4502-92b0-248c40782fc2","timestamp":1749201300022,"gateway":"8UUXN4P00A06NK"} + +{"bid":"57acda22-545c-4ed3-8d21-d53e59ef0ca4","data":{"dongle_infos":[]},"tid":"c522cc9e-a3e2-4ad3-a946-bab020e83df6","timestamp":1749201300107,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9dda444b-a8cc-4ebd-98ef-b327de002caf","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"d79a8f38-54c9-41e9-9365-c5c7b19847f6","timestamp":1749201300785,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3057d0df-85f9-4aed-adf1-837b130f7a71","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1d7a49f5-fd13-422e-8dd8-339e6a823acf","timestamp":1749201300984,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a470d1c3-db60-4c25-b7a9-af91d0b8d785","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"908f4440-071f-4e92-9ab5-b6a4bab4fd20","timestamp":1749201301948,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1b812936-e236-4a0a-aca5-79298c8c2fd0","data":{"dongle_infos":[]},"tid":"e2f29d94-be40-4f9c-ac10-cdc8219894ca","timestamp":1749201302101,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6a696789-66ab-4fca-9731-66ec90ac6af8","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"d4eee988-a093-4502-92b0-248c40782fc2","timestamp":1749201302184,"gateway":"8UUXN4P00A06NK"} + +{"bid":"aed9023f-6655-4044-a4f2-292be58c58b0","data":{"departure_trajectory":[]},"tid":"7befa9d8-53f6-49aa-b447-0d9a816c1b41","timestamp":1749201303471,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ee99f820-5bab-414a-a7ca-01d1bf6c11ab","data":{"air_transfer_enable":false},"need_reply":1,"tid":"6f157f9d-35bd-48cf-a986-e6c71f43c40d","timestamp":1749201303495,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a470d1c3-db60-4c25-b7a9-af91d0b8d785","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"908f4440-071f-4e92-9ab5-b6a4bab4fd20","timestamp":1749201303984,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6d43fcab-ce7f-43c3-b55d-4413db0a3cb2","data":{"departure_trajectory":[]},"tid":"a847d9c1-8af9-4c46-9282-646ca3d3cbf4","timestamp":1749201304097,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3057d0df-85f9-4aed-adf1-837b130f7a71","data":{"mobility_status_notify":0},"need_reply":1,"tid":"1d7a49f5-fd13-422e-8dd8-339e6a823acf","timestamp":1749201305184,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6a696789-66ab-4fca-9731-66ec90ac6af8","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"d4eee988-a093-4502-92b0-248c40782fc2","timestamp":1749201306385,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3219a425-cb4c-430a-a473-e7ca5adb3b89","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"60843b67-2fe1-43be-beba-ef987bc37c7c","timestamp":1749201306949,"gateway":"8UUXN4P00A06NK"} + +{"bid":"3a580416-fdaa-48f8-b529-14f761654325","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"55096d74-b71f-4e9a-8e4b-b38438463c32","timestamp":1749430932844,"gateway":"8UUXN4P00A06NK"} + +{"tid":"12ddeb3a-bde7-42a4-9d02-899d57b1db60","bid":"d16fd216-8e97-4d2b-9814-09c6c94bf7c6","timestamp":1749433411523,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"9b677f2d-654a-463a-82d2-119fca52b852","bid":"d6bdc30c-84a2-4d44-81ec-2e835b3069dd","timestamp":1749433411527,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"94c24d8a-4611-438b-bb68-b5ccf026120e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3095c775-84e4-4c34-8399-922e084014ac","timestamp":1749433413581,"gateway":"8UUXN4P00A06NK"} + +{"tid":"7ca5db26-2a91-4db2-86fe-f2066082d432","bid":"c7045669-ad4d-4282-8255-07629d2a8c43","timestamp":1749433415777,"data":{"firmware_version":"13.01.0007","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"6b7d8b15-8023-41e4-aa5a-cd492bbed919","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"47a5d5a3-a936-415c-931f-761c0396e07c","timestamp":1749433415817,"gateway":"8UUXN4P00A06NK"} + +{"bid":"94c24d8a-4611-438b-bb68-b5ccf026120e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3095c775-84e4-4c34-8399-922e084014ac","timestamp":1749433416221,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8512ea1f-8011-4ba9-97d6-d154ceb67848","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f2a753f0-53e8-412e-8181-900786b1b9e6","timestamp":1749433416432,"gateway":"8UUXN4P00A06NK"} + +{"bid":"06735070-0133-46e8-876d-a1ae7efd20cd","data":{"dongle_infos":[]},"tid":"246a7027-25b4-42c5-a181-1f6062c270f3","timestamp":1749433416445,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f4f50b0c-51e1-48c7-a8bd-744ba38717a0","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e24bf301-75b0-4e7e-a76f-d014ba6858c8","timestamp":1749433416458,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f53357dd-a1db-418a-ad49-082125cad584","data":{"firmware_version":"13.01.0007"},"tid":"8ab6d183-2d70-42c0-8cc9-85a0b7e8d21c","timestamp":1749433416482,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ae1fcb48-677e-48ea-89c1-35e5dc302324","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7c010003-9abd-4058-8be5-e86ff6327ae6","timestamp":1749433416523,"gateway":"8UUXN4P00A06NK"} + +{"bid":"507a68d6-f72f-4891-89a4-abafccc30154","data":{"dongle_infos":[]},"tid":"d3ff6617-2f58-4765-9553-72952862b128","timestamp":1749433417449,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eb806e4a-4de5-4002-809a-c0f56aeab7bf","data":{"dongle_infos":[]},"tid":"239c7418-38e2-44d0-9870-9419d8339bcd","timestamp":1749433418180,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8512ea1f-8011-4ba9-97d6-d154ceb67848","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f2a753f0-53e8-412e-8181-900786b1b9e6","timestamp":1749433418589,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f4f50b0c-51e1-48c7-a8bd-744ba38717a0","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e24bf301-75b0-4e7e-a76f-d014ba6858c8","timestamp":1749433418589,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ae1fcb48-677e-48ea-89c1-35e5dc302324","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7c010003-9abd-4058-8be5-e86ff6327ae6","timestamp":1749433418590,"gateway":"8UUXN4P00A06NK"} + +{"bid":"94c24d8a-4611-438b-bb68-b5ccf026120e","data":{"air_transfer_enable":false},"need_reply":1,"tid":"3095c775-84e4-4c34-8399-922e084014ac","timestamp":1749433420419,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e9a40ea3-c9e1-4603-bb16-5fb665c0c807","data":{"departure_trajectory":[]},"tid":"6d3ed409-7497-405e-a4c3-a3893d43b1f2","timestamp":1749433420443,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9452b6e8-eb88-470c-bafd-6564a02f887d","data":{"departure_trajectory":[]},"tid":"0c3adac6-8369-4369-865e-1932c99a5121","timestamp":1749433421445,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e8502232-bb8a-4003-a06b-41f8c7c24517","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e21a4935-873d-49f1-a936-7dc8c69f3a85","timestamp":1749433421522,"gateway":"8UUXN4P00A06NK"} + +{"bid":"8512ea1f-8011-4ba9-97d6-d154ceb67848","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"f2a753f0-53e8-412e-8181-900786b1b9e6","timestamp":1749433422786,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f4f50b0c-51e1-48c7-a8bd-744ba38717a0","data":{"mobility_status_notify":0},"need_reply":1,"tid":"e24bf301-75b0-4e7e-a76f-d014ba6858c8","timestamp":1749433422787,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e8502232-bb8a-4003-a06b-41f8c7c24517","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"e21a4935-873d-49f1-a936-7dc8c69f3a85","timestamp":1749433423587,"gateway":"8UUXN4P00A06NK"} + +{"bid":"581cf3c2-9f7d-43c4-8269-621a87380ee9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7fdd7100-1585-486c-adc6-ff0452aef726","timestamp":1749433426519,"gateway":"8UUXN4P00A06NK"} + +{"tid":"d788b1c5-c7f9-424a-bb78-42afdeec9f9a","bid":"bcdf27e6-9f8c-46a0-b685-4ede3d386125","timestamp":1749433453025,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"42292e11-9a7b-4b0a-a4ef-ea721af24969","bid":"82c6346f-b84b-4438-8eb0-350a3d14098f","timestamp":1749433453031,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"146aba03-57db-42b6-854f-88cf91cabfec","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8a8c00a4-880e-4c7e-8926-112b3e69d013","timestamp":1749433454859,"gateway":"8UUXN4P00A06NK"} + +{"tid":"8cef9b68-914e-4aec-8765-2535ee591683","bid":"680b6ae9-285f-4657-bdf1-99da757f86ea","timestamp":1749433456515,"data":{"firmware_version":"13.01.0007","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"417d9472-2d5c-4fc4-8491-fb4a2f927fff","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bb8ef52f-e648-47b0-b3d3-cc22eb3639b0","timestamp":1749433456900,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6e32b958-eb7d-4be4-8246-d9b32491f4d1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ccf26f06-6f7d-48d4-bb26-5bc1263156f8","timestamp":1749433457515,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1838708e-06ad-4632-a9fc-661821090514","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a6726b29-bdd9-4ffd-9b73-48af6745b880","timestamp":1749433457530,"gateway":"8UUXN4P00A06NK"} + +{"bid":"78d8230c-9baf-4182-8568-6fb758ba8ae7","data":{"dongle_infos":[]},"tid":"0dea7d70-1586-4f86-be3e-4a9e24144f8b","timestamp":1749433457535,"gateway":"8UUXN4P00A06NK"} + +{"bid":"85fa09ff-3de1-454b-a09b-0accbd4666dc","data":{"firmware_version":"13.01.0007"},"tid":"8731a2db-0504-4410-8d8b-37aebb050c7e","timestamp":1749433457553,"gateway":"8UUXN4P00A06NK"} + +{"bid":"146aba03-57db-42b6-854f-88cf91cabfec","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8a8c00a4-880e-4c7e-8926-112b3e69d013","timestamp":1749433457599,"gateway":"8UUXN4P00A06NK"} + +{"bid":"587d81d8-1d01-46ee-a643-bfb4e3fa0054","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"10fd83b6-a460-4a77-b001-49c1a08baca8","timestamp":1749433458024,"gateway":"8UUXN4P00A06NK"} + +{"bid":"eb6743e3-cc04-4803-8db1-69d165bb49b7","data":{"dongle_infos":[]},"tid":"5ab518dc-116c-4a81-81be-e47b33d27b9a","timestamp":1749433458523,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6e32b958-eb7d-4be4-8246-d9b32491f4d1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ccf26f06-6f7d-48d4-bb26-5bc1263156f8","timestamp":1749433459632,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1838708e-06ad-4632-a9fc-661821090514","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a6726b29-bdd9-4ffd-9b73-48af6745b880","timestamp":1749433459633,"gateway":"8UUXN4P00A06NK"} + +{"bid":"587d81d8-1d01-46ee-a643-bfb4e3fa0054","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"10fd83b6-a460-4a77-b001-49c1a08baca8","timestamp":1749433460029,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e4907b00-055b-4f38-85c5-edae7f83a7e5","data":{"dongle_infos":[]},"tid":"95271c08-a71f-4349-931c-7f3c6c95d83e","timestamp":1749433460244,"gateway":"8UUXN4P00A06NK"} + +{"bid":"08c113f9-6ec5-4905-938f-cfd728dc17f6","data":{"departure_trajectory":[]},"tid":"8f315771-5773-4349-9c55-e53768506dbc","timestamp":1749433461697,"gateway":"8UUXN4P00A06NK"} + +{"bid":"146aba03-57db-42b6-854f-88cf91cabfec","data":{"air_transfer_enable":false},"need_reply":1,"tid":"8a8c00a4-880e-4c7e-8926-112b3e69d013","timestamp":1749433461791,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b5b8a232-2aae-415c-beea-199033c921aa","data":{"departure_trajectory":[]},"tid":"03687d75-6275-4e8f-9562-68aedc5e0378","timestamp":1749433462515,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7b3d887f-5507-48de-83b4-f426d92db9c6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7c25d010-ef43-44f9-8175-77e482f5f7a8","timestamp":1749433463025,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6e32b958-eb7d-4be4-8246-d9b32491f4d1","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"ccf26f06-6f7d-48d4-bb26-5bc1263156f8","timestamp":1749433463829,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1838708e-06ad-4632-a9fc-661821090514","data":{"mobility_status_notify":0},"need_reply":1,"tid":"a6726b29-bdd9-4ffd-9b73-48af6745b880","timestamp":1749433463830,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7b3d887f-5507-48de-83b4-f426d92db9c6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"7c25d010-ef43-44f9-8175-77e482f5f7a8","timestamp":1749433465029,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7b0b77b4-6892-4d3a-a389-a00d9b4f0e66","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"9ec6f04d-6b67-46c6-9a35-a40d8ac10165","timestamp":1749433468021,"gateway":"8UUXN4P00A06NK"} + +{"tid":"b5e07f2b-7339-49c6-8744-c678ee8e6e7c","bid":"2722f15e-92f2-4902-a0a5-412d63b730bb","timestamp":1749433494046,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":1,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"974719b9-029d-4dca-9757-7b18cb0fc417","bid":"0cfc625d-0ed7-49e5-b2bb-4347dcc31be7","timestamp":1749433494051,"data":{"live_status":[]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f9b0f422-6667-4752-afa9-aab6d949e8df","data":{"air_transfer_enable":false},"need_reply":1,"tid":"f23e702b-3059-4f99-882d-90b3f3d31ee5","timestamp":1749433495547,"gateway":"8UUXN4P00A06NK"} + +{"bid":"07aecd60-5eb9-4888-8f54-bcf5d5cd218c","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"b53b1724-ecae-4076-b8ed-896e21c13fa7","timestamp":1749433497579,"gateway":"8UUXN4P00A06NK"} + +{"tid":"62c5ad2b-63b5-4348-89d7-b970109f39df","bid":"4f61cf70-0b22-4afa-8da7-f1e286bdbc44","timestamp":1749433497822,"data":{"firmware_version":"13.01.0007","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"bid":"f9b0f422-6667-4752-afa9-aab6d949e8df","data":{"air_transfer_enable":false},"need_reply":1,"tid":"f23e702b-3059-4f99-882d-90b3f3d31ee5","timestamp":1749433498177,"gateway":"8UUXN4P00A06NK"} + +{"bid":"010f00f7-08de-4539-b80a-cffc7a8b8b85","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e2a8f6f8-1369-4ae0-a319-54505e49fed5","timestamp":1749433498422,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1c04e6ae-15d0-43a1-a1ca-08d0fee68bcb","data":{"dongle_infos":[]},"tid":"566d4563-d55f-4150-a274-c242f5a9d406","timestamp":1749433498436,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d890f37f-52a3-4a1a-8cf7-b8e8af767b6a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0a38490f-55ae-4c97-bc0d-35406d2ff8c4","timestamp":1749433498443,"gateway":"8UUXN4P00A06NK"} + +{"bid":"10eb0363-3f03-4def-a2b5-97fc6be68d32","data":{"firmware_version":"13.01.0007"},"tid":"8a91cf59-c83b-4a9c-8ce2-7545d93a57a2","timestamp":1749433498454,"gateway":"8UUXN4P00A06NK"} + +{"bid":"59b7cf3e-43f6-4c99-ba8b-fc6a915d47f9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bcee3d5a-d5b8-48a9-a4db-162c271ce65e","timestamp":1749433499045,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ebce5d06-f82d-401f-93b1-146cf7b4840b","data":{"dongle_infos":[]},"tid":"8d9a8d86-03fb-4098-a930-275b1cdfe6d9","timestamp":1749433499428,"gateway":"8UUXN4P00A06NK"} + +{"bid":"010f00f7-08de-4539-b80a-cffc7a8b8b85","data":{"rtcm_info":{"host":"120.253.226.97","mount_point":"RTCM33_GRCEJ","port":"8002","rtcm_device_type":1,"source_type":0}},"need_reply":1,"tid":"e2a8f6f8-1369-4ae0-a319-54505e49fed5","timestamp":1749433500611,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d890f37f-52a3-4a1a-8cf7-b8e8af767b6a","data":{"mobility_status_notify":0},"need_reply":1,"tid":"0a38490f-55ae-4c97-bc0d-35406d2ff8c4","timestamp":1749433500612,"gateway":"8UUXN4P00A06NK"} + +{"bid":"59b7cf3e-43f6-4c99-ba8b-fc6a915d47f9","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":""},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"bcee3d5a-d5b8-48a9-a4db-162c271ce65e","timestamp":1749433501212,"gateway":"8UUXN4P00A06NK"} + +{"bid":"f63788fb-4b51-4cd7-bc37-0b019568e6ae","data":{"dongle_infos":[]},"tid":"3d269e22-8daa-4cbb-bfd3-46acfbdb0701","timestamp":1749433502097,"gateway":"8UUXN4P00A06NK"} + +{"bid":"edfc2fa9-e6df-4958-b61d-7f1b4258e2c6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1f7634cd-0d5f-4237-915c-fcb14b42d369","timestamp":1749433870692,"gateway":"8UUXN4P00A06NK"} + +{"bid":"edfc2fa9-e6df-4958-b61d-7f1b4258e2c6","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"1f7634cd-0d5f-4237-915c-fcb14b42d369","timestamp":1749433878892,"gateway":"8UUXN4P00A06NK"} + +{"bid":"538f223d-36bb-4781-a093-03f38c5b79d4","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"4abb356a-5ca1-4cad-9361-5136d1974f35","timestamp":1749464020814,"gateway":"8UUXN4P00A06NK"} + +{"tid":"c179e6b7-706a-469c-ab82-42d5834131da","bid":"8b2559ae-3012-4031-b01b-db9ed19deba5","timestamp":1750322376923,"data":{"firmware_version":"13.01.0007","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"tid":"ba55af81-c56b-4ed9-a726-bc0ea334fd01","bid":"4344178a-7feb-4f49-a0b7-129de6991c65","timestamp":1750322376924,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":3,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F8HGX253U00A0626","available_video_number":0,"coexist_video_number_max":1,"camera_list":[]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"12249c81-9cb2-44b4-9b92-a0f9ef0c2e96","bid":"80efad12-4639-422f-a607-e6f8b8419ecf","timestamp":1750322376926,"data":{"live_status":[{"video_id":"1581F8HGX253U00A0626/99-0-0/normal-0","video_type":"","video_quality":4,"status":1,"error_status":0},{"video_id":"1581F8HGX253U00A0626/176-0-0/normal-0","video_type":"","video_quality":4,"status":1,"error_status":0},{"video_id":"8UUXN4P00A06NK/165-0-7/normal-0","video_type":"normal","video_quality":4,"status":1,"error_status":0}]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"b4b705eb-11ab-4700-8cab-ac3ac94e1c54","bid":"19250c76-4231-4e7c-801e-47f69de31ba9","timestamp":1750322377670,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":3,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F8HGX253U00A0626","available_video_number":0,"coexist_video_number_max":1,"camera_list":[]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"a0f935c0-17fd-461c-afbd-059e2cc26586","bid":"73de53f2-30b0-42d7-8804-b009f957bfcc","timestamp":1750322377670,"data":{"firmware_version":"13.01.0007","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"tid":"c38fce78-73de-47a7-9e42-c8110c8cde74","bid":"3bbc09fc-2c44-46b7-9800-90976c6af342","timestamp":1750322377672,"data":{"live_status":[{"video_id":"1581F8HGX253U00A0626/99-0-0/normal-0","video_type":"","video_quality":4,"status":1,"error_status":0},{"video_id":"1581F8HGX253U00A0626/176-0-0/normal-0","video_type":"","video_quality":4,"status":1,"error_status":0},{"video_id":"8UUXN4P00A06NK/165-0-7/normal-0","video_type":"normal","video_quality":4,"status":1,"error_status":0}]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"d417da37-1cde-4706-af6b-f5473abe76df","bid":"f08f7a2c-fdba-458e-b316-9996812afcff","timestamp":1750322381950,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":3,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F8HGX253U00A0626","available_video_number":0,"coexist_video_number_max":1,"camera_list":[]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"196f4ef8-f7fa-475a-813b-d0debb4bcea6","bid":"834854c9-3fbd-4fe6-aa96-40b5400c79e3","timestamp":1750322381950,"data":{"firmware_version":"13.01.0007","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"tid":"f5acb72d-ea55-4ff6-87bb-ada5cdbe66cd","bid":"ed23a6e0-6ba6-4d66-827f-81cd1b63827a","timestamp":1750322381952,"data":{"live_status":[{"video_id":"1581F8HGX253U00A0626/99-0-0/normal-0","video_type":"","video_quality":4,"status":1,"error_status":0},{"video_id":"1581F8HGX253U00A0626/176-0-0/normal-0","video_type":"","video_quality":4,"status":1,"error_status":0},{"video_id":"8UUXN4P00A06NK/165-0-7/normal-0","video_type":"normal","video_quality":4,"status":1,"error_status":0}]},"gateway":"8UUXN4P00A06NK"} + +{"tid":"c76a182d-b52a-4b98-aa5a-62b01e47d31f","bid":"337e5c8b-24fa-48e5-956f-25c6e801f920","timestamp":1750322382677,"data":{"live_capacity":{"available_video_number":1,"coexist_video_number_max":3,"device_list":[{"sn":"8UUXN4P00A06NK","available_video_number":1,"coexist_video_number_max":1,"camera_list":[{"camera_index":"165-0-7","available_video_number":1,"coexist_video_number_max":1,"video_list":[{"video_index":"normal-0","video_type":"normal","switchable_video_types":["normal"]}]}]},{"sn":"1581F8HGX253U00A0626","available_video_number":0,"coexist_video_number_max":1,"camera_list":[]}]}},"gateway":"8UUXN4P00A06NK"} + +{"tid":"2bf98b09-bd58-42bb-9466-6ebf7a2f199a","bid":"c569e669-abf1-40c3-855a-03a6b26e3632","timestamp":1750322382677,"data":{"firmware_version":"13.01.0007","compatible_status":0,"firmware_upgrade_status":0},"gateway":"8UUXN4P00A06NK"} + +{"tid":"d2eee5ad-21d1-4ea6-b9a4-ab569ebe20bd","bid":"e98627d7-b24f-4f41-871d-ca9fae64f1bb","timestamp":1750322382681,"data":{"live_status":[{"video_id":"1581F8HGX253U00A0626/99-0-0/normal-0","video_type":"","video_quality":4,"status":1,"error_status":0},{"video_id":"1581F8HGX253U00A0626/176-0-0/normal-0","video_type":"","video_quality":4,"status":1,"error_status":0},{"video_id":"8UUXN4P00A06NK/165-0-7/normal-0","video_type":"normal","video_quality":4,"status":1,"error_status":0}]},"gateway":"8UUXN4P00A06NK"} + +{"bid":"67fd6fb3-b3d5-47ff-bf4f-cd236e36bb26","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"2deafbc7-f744-462d-9f43-8fd8db003d39","timestamp":1750322384085,"gateway":"8UUXN4P00A06NK"} + +{"bid":"0a442692-1bd7-48d2-9a9e-6cebccd2c9fd","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"c4035c8a-8a59-4962-abe0-89d108e42f30","timestamp":1750322386931,"gateway":"8UUXN4P00A06NK"} + +{"bid":"74c43001-77e0-4b54-8cb2-5de002276d1a","data":{"dongle_infos":[]},"tid":"3841555e-46bd-4edd-9570-db56ccb164b8","timestamp":1750322386934,"gateway":"8UUXN4P00A06NK"} + +{"bid":"37d14c60-96d1-496b-9f45-8cfb8e37cfe8","data":{"departure_trajectory":[]},"tid":"451ec516-1753-4485-b0f3-247e21fee8b8","timestamp":1750322386935,"gateway":"8UUXN4P00A06NK"} + +{"bid":"47ef464c-da50-4ff3-812e-b164c9fc178b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"260b9f68-f355-4e62-8117-8e6517446edb","timestamp":1750322386953,"gateway":"8UUXN4P00A06NK"} + +{"bid":"185e7953-c48d-4c59-bf2a-19434f188524","data":{"dongle_infos":[]},"tid":"a424aebc-c04a-4176-be43-389b38034bce","timestamp":1750322386960,"gateway":"8UUXN4P00A06NK"} + +{"bid":"49028531-dd90-4005-a8d6-5524ca44f50e","data":{"departure_trajectory":[]},"tid":"a9c44026-4224-4596-9705-97d61283fb5c","timestamp":1750322386961,"gateway":"8UUXN4P00A06NK"} + +{"bid":"47ef464c-da50-4ff3-812e-b164c9fc178b","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"260b9f68-f355-4e62-8117-8e6517446edb","timestamp":1750322389085,"gateway":"8UUXN4P00A06NK"} + +{"bid":"461b7b37-1316-445e-8e6a-12724494114e","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"32c14cf7-ad81-4bd0-84e3-39af75209677","timestamp":1750322391926,"gateway":"8UUXN4P00A06NK"} + +{"bid":"5d7830b2-2f3f-4262-b0b6-5d38cbdf6608","data":{"dongle_infos":[]},"tid":"4847f5c3-a13c-4922-b33e-e18d3902ec00","timestamp":1750322391931,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b92641fc-22c0-45b4-834d-4623f36ef442","data":{"departure_trajectory":[]},"tid":"dfa85446-2833-4f45-b8a3-11929daa0fbb","timestamp":1750322391932,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6a57cc79-1a61-4f05-aa3e-b2e7fd4ab3e2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0a4049ee-5a5a-485e-a06a-6b782f80c3c6","timestamp":1750322391952,"gateway":"8UUXN4P00A06NK"} + +{"bid":"c002e432-3fe2-4ffc-8c25-e7c818f8fcf8","data":{"dongle_infos":[]},"tid":"e6c5fa22-ef38-43a6-9248-240cf218c991","timestamp":1750322391963,"gateway":"8UUXN4P00A06NK"} + +{"bid":"9cae4804-b967-4dad-ba86-0d0aebb9089f","data":{"departure_trajectory":[]},"tid":"300b04f0-9702-4579-8cf0-97f74654217c","timestamp":1750322391964,"gateway":"8UUXN4P00A06NK"} + +{"bid":"6a57cc79-1a61-4f05-aa3e-b2e7fd4ab3e2","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"0a4049ee-5a5a-485e-a06a-6b782f80c3c6","timestamp":1750322394088,"gateway":"8UUXN4P00A06NK"} + +{"bid":"bcdd7d8b-661e-4611-9668-2ad5b6a6ed29","data":{"dongle_infos":[]},"tid":"699b8a9a-e13f-445f-8eb0-eeb549f2148b","timestamp":1750322396927,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a6e180d1-291c-4aa8-96b8-ec511ee16164","data":{"departure_trajectory":[]},"tid":"34593508-8309-4e4c-8145-f9a135e9bcb5","timestamp":1750322396928,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e95fa3dd-5f5a-4360-96f1-4f0ab23904f1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ff033821-575f-4a95-9f82-0f1b50d0a3e5","timestamp":1750322396945,"gateway":"8UUXN4P00A06NK"} + +{"bid":"248d417a-901d-4f07-a21c-f19a3a851f3a","data":{"dongle_infos":[]},"tid":"a41a0e45-4827-450a-8d8f-cb25119baaf9","timestamp":1750322396961,"gateway":"8UUXN4P00A06NK"} + +{"bid":"13cc11f8-7a39-47f9-89a1-365261c274ac","data":{"departure_trajectory":[]},"tid":"99407513-a0e4-4c4c-9763-e367dc51ce71","timestamp":1750322396962,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e95fa3dd-5f5a-4360-96f1-4f0ab23904f1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ff033821-575f-4a95-9f82-0f1b50d0a3e5","timestamp":1750322399084,"gateway":"8UUXN4P00A06NK"} + +{"bid":"19ed859f-6a15-4d35-a8f1-83e8ecc47ff9","data":{"dongle_infos":[]},"tid":"5449fb39-2c1f-4366-9a09-178295c9c3f3","timestamp":1750322401927,"gateway":"8UUXN4P00A06NK"} + +{"bid":"cd5686e2-5d2a-4dce-88df-d4c44c43470f","data":{"departure_trajectory":[]},"tid":"30090f14-76a0-4af7-9611-efb7c91b6ef9","timestamp":1750322401929,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2bd0cbd3-0e59-4f9e-9e8d-9c1a6d2608b7","data":{"dongle_infos":[]},"tid":"1a261539-a3a5-4822-8d1d-1a53587b02e1","timestamp":1750322401960,"gateway":"8UUXN4P00A06NK"} + +{"bid":"1cd0db20-8259-4a31-9093-d62a261d3b50","data":{"departure_trajectory":[]},"tid":"acb1daa0-6399-4a72-8994-8c357bfee426","timestamp":1750322401961,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e95fa3dd-5f5a-4360-96f1-4f0ab23904f1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ff033821-575f-4a95-9f82-0f1b50d0a3e5","timestamp":1750322403284,"gateway":"8UUXN4P00A06NK"} + +{"bid":"167d10ab-6737-4aee-a096-bd8be08060cb","data":{"dongle_infos":[]},"tid":"2ccc2590-981d-4725-861a-76e799cca20e","timestamp":1750322406928,"gateway":"8UUXN4P00A06NK"} + +{"bid":"711a5cbe-b853-46fa-b0a8-33e88a51b301","data":{"departure_trajectory":[]},"tid":"715b8072-072b-4867-9a83-0ad385b0726f","timestamp":1750322406928,"gateway":"8UUXN4P00A06NK"} + +{"bid":"364dc4c4-616d-48c9-ae0b-1a38929e2486","data":{"dongle_infos":[]},"tid":"24f2dbe0-bdc2-4140-9d49-162c2939e970","timestamp":1750322406960,"gateway":"8UUXN4P00A06NK"} + +{"bid":"17f4c193-5172-4887-8d41-f85f8206959f","data":{"departure_trajectory":[]},"tid":"ea26959d-93db-42a0-9e73-52362c9fffc5","timestamp":1750322406961,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e95fa3dd-5f5a-4360-96f1-4f0ab23904f1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ff033821-575f-4a95-9f82-0f1b50d0a3e5","timestamp":1750322411487,"gateway":"8UUXN4P00A06NK"} + +{"bid":"73076e97-1d1f-42aa-9555-f9ad649b7611","data":{"dongle_infos":[]},"tid":"ceff4b13-9b45-4a58-8892-253aa96b59ef","timestamp":1750322411926,"gateway":"8UUXN4P00A06NK"} + +{"bid":"97a63e56-95f8-4bc0-8956-1fb3f9f7e1ae","data":{"departure_trajectory":[]},"tid":"78b5dc11-7bf8-46e1-9f66-29087138d65b","timestamp":1750322411927,"gateway":"8UUXN4P00A06NK"} + +{"bid":"feaac22e-ef73-4cee-8337-55d3d285eb0e","data":{"dongle_infos":[]},"tid":"a3876847-e80e-4ff8-9f31-976e07066e17","timestamp":1750322411958,"gateway":"8UUXN4P00A06NK"} + +{"bid":"b11f24d9-b666-4fbb-8329-86911dfdc0f6","data":{"departure_trajectory":[]},"tid":"2b91c1bb-e3db-4d54-9bcb-15866c5b7164","timestamp":1750322411959,"gateway":"8UUXN4P00A06NK"} + +{"bid":"dcf0db19-1e88-4a88-ab67-e36aa9c26844","data":{"dongle_infos":[]},"tid":"79f1701d-a1ce-479d-b404-59b7f7cfa7d4","timestamp":1750322416927,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e7a5f69d-9795-4459-ac93-f7aaabdd5482","data":{"departure_trajectory":[]},"tid":"7f88f822-726d-453d-b911-ffca7c9083e6","timestamp":1750322416930,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a31beede-6e1c-47d0-8c93-616d55aa0cb7","data":{"dongle_infos":[]},"tid":"d21b1871-2565-4bb9-8302-2edbbccec303","timestamp":1750322416961,"gateway":"8UUXN4P00A06NK"} + +{"bid":"ba8c2c7d-c55b-42b5-8a05-473257fe0f76","data":{"departure_trajectory":[]},"tid":"47272937-a8a7-44f7-8660-306c9346c2bd","timestamp":1750322416962,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e95fa3dd-5f5a-4360-96f1-4f0ab23904f1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ff033821-575f-4a95-9f82-0f1b50d0a3e5","timestamp":1750322419687,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4b8279ce-6130-4b5b-852d-1e16204c5819","data":{"dongle_infos":[]},"tid":"35efc226-203c-4622-ae81-3302dad08b0e","timestamp":1750322421926,"gateway":"8UUXN4P00A06NK"} + +{"bid":"7488d486-0bf9-47f6-bf6c-7c0b0daae70e","data":{"departure_trajectory":[]},"tid":"33b3575c-e182-4e0e-8e67-a232dffd9c1b","timestamp":1750322421928,"gateway":"8UUXN4P00A06NK"} + +{"bid":"362fae1c-9272-4a0a-ba13-e275298764b0","data":{"dongle_infos":[]},"tid":"3d61ea23-07da-4276-b17c-4e7b1fa0ac8f","timestamp":1750322421959,"gateway":"8UUXN4P00A06NK"} + +{"bid":"a155fc9d-9ab3-40a7-9d6d-94d5f75e56d2","data":{"departure_trajectory":[]},"tid":"22f0de1b-6f43-43fc-a904-9d8469f9cb8e","timestamp":1750322421960,"gateway":"8UUXN4P00A06NK"} + +{"bid":"22868cb6-bc8e-4b63-b356-3775c5da4737","data":{"dongle_infos":[]},"tid":"186d5109-47ff-46ca-a40a-cd0c4e42cf0e","timestamp":1750322426927,"gateway":"8UUXN4P00A06NK"} + +{"bid":"d71a1d8f-3d4f-4c8d-97da-f9cc1b957781","data":{"departure_trajectory":[]},"tid":"6eb9fecf-8b8d-47c0-97ad-e17dc531e0c9","timestamp":1750322426928,"gateway":"8UUXN4P00A06NK"} + +{"bid":"4dafc608-d42f-41b8-af9f-ea065c9cf322","data":{"dongle_infos":[]},"tid":"29d6b069-a7ee-439a-9c02-932ee704c7bb","timestamp":1750322426959,"gateway":"8UUXN4P00A06NK"} + +{"bid":"fe0b6ac5-bca6-43a5-aa88-c8cfd8fdb845","data":{"departure_trajectory":[]},"tid":"3316ab5d-f75c-4fe2-9250-493c1672c525","timestamp":1750322426959,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e95fa3dd-5f5a-4360-96f1-4f0ab23904f1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ff033821-575f-4a95-9f82-0f1b50d0a3e5","timestamp":1750322427888,"gateway":"8UUXN4P00A06NK"} + +{"bid":"19ea9b54-bae3-4584-9332-6483576a8a35","data":{"dongle_infos":[]},"tid":"d4d2f039-121a-44bd-91e3-229f0f4709cc","timestamp":1750322431957,"gateway":"8UUXN4P00A06NK"} + +{"bid":"2e59d560-8350-48f4-89e2-7e23a706a1cb","data":{"departure_trajectory":[]},"tid":"bdc419d0-5519-4013-9b48-79bac229c5b0","timestamp":1750322431958,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e95fa3dd-5f5a-4360-96f1-4f0ab23904f1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ff033821-575f-4a95-9f82-0f1b50d0a3e5","timestamp":1750322436086,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e95fa3dd-5f5a-4360-96f1-4f0ab23904f1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ff033821-575f-4a95-9f82-0f1b50d0a3e5","timestamp":1750322444287,"gateway":"8UUXN4P00A06NK"} + +{"bid":"e95fa3dd-5f5a-4360-96f1-4f0ab23904f1","data":{"wireless_link_topo":{"center_node":{"sdr_id":107904917,"sn":"1581F8HGX253U00A0626"},"leaf_nodes":[{"control_source_index":0,"sdr_id":2363083639,"sn":"8UUXN4P00A06NK","valid":true}],"secret_code":[0,0,0,0,1,0,0,0,28,226,78,8,31,32,131,175,124,245,90,75,67,9,143,171,109,58,246,133]}},"need_reply":1,"tid":"ff033821-575f-4a95-9f82-0f1b50d0a3e5","timestamp":1750322452484,"gateway":"8UUXN4P00A06NK"} + diff --git a/task/bind_function.go b/task/bind_function.go new file mode 100644 index 0000000..99bd24d --- /dev/null +++ b/task/bind_function.go @@ -0,0 +1,305 @@ +/* +* @desc:定时任务配置 +* @company:云南省奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2021/7/16 15:45 + */ + +package task + +import ( + "context" + "fmt" + "github.com/robfig/cron/v3" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" + "github.com/tiger1103/gfast/v3/third/arithmetic/SpartaApi" + "github.com/tiger1103/gfast/v3/third/jiguang" + "github.com/tiger1103/gfast/v3/third/reminders" + "log" + "os" + "strings" + "time" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gctx" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + logicDocumentData "github.com/tiger1103/gfast/v3/internal/app/system/logic/documentData" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + wxModel "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model" + wxService "github.com/tiger1103/gfast/v3/internal/app/wxApplet/service" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +func Run() { + task1 := &model.TimeTask{ + FuncName: "test1", + //Run: Test1, + Run: SpartaApi.CORYAInit, + } + task2 := &model.TimeTask{ + FuncName: "test2", + Run: Test2, + } + checkUserOnlineTask := &model.TimeTask{ + FuncName: "checkUserOnline", + Run: service.SysUserOnline().CheckUserOnline, + } + // ys7快照 + periodicCameraSnapshotTask := &model.TimeTask{ + FuncName: "periodicCameraSnapshot", + Run: controller.PeriodicSnapshotFunc, + } + theNewsAgencyIsActivatedA1amEveryDay := &model.TimeTask{ + FuncName: "theNewsAgencyIsActivatedA1amEveryDay", + Run: StartNewsAgencyTicker, + } + DailyAbsenteeism := &model.TimeTask{ + FuncName: "dailyAbsenteeism", + Run: wxService.BusAttendance().DailyAbsenteeismFunc, + } + deleteTemporaryFilesPeriodicallyTask := &model.TimeTask{ + FuncName: "deleteTemporaryFilesPeriodically", + Run: DeleteTemporaryFilesPeriodicallyFunc, + } + theRecycleBinIsEmptyTask := &model.TimeTask{ + FuncName: "theRecycleBinIsEmpty", + Run: TheRecycleBinIsEmptyFunc, + } + updateProjectStatusTask := &model.TimeTask{ + FuncName: "updateProjectStatus", + Run: UpdateProjectStatus, + } + + service.TaskList().AddTask(task1) + service.TaskList().AddTask(task2) + service.TaskList().AddTask(checkUserOnlineTask) + service.TaskList().AddTask(periodicCameraSnapshotTask) + service.TaskList().AddTask(theNewsAgencyIsActivatedA1amEveryDay) + service.TaskList().AddTask(DailyAbsenteeism) + service.TaskList().AddTask(deleteTemporaryFilesPeriodicallyTask) // 清空临时文件夹 + service.TaskList().AddTask(theRecycleBinIsEmptyTask) + service.TaskList().AddTask(updateProjectStatusTask) + ctx := gctx.New() + // 自动执行已开启的任务 + jobs, err := service.SysJob().GetJobs(ctx) + if err != nil { + g.Log().Error(ctx, err) + return + } + for _, job := range jobs { + service.SysJob().JobStart(ctx, job) + } +} + +func DeleteTemporaryFilesPeriodicallyFunc(ctx context.Context) { + directoryPath := coryCommon.GetCWD() + coryCommon.Temporary + // 调用删除函数 + if err := coryCommon.RemoveAllFilesInDirectory(directoryPath); err != nil { + fmt.Println("Error:", err) + return + } + //删除摄像头记录表(这里的记录关联了临时文件的资源) + // 计算 30 天前的时间 + //thirtyDaysAgo := gtime.Now().AddDate(0, 0, -30).Format("Y-m-d H:i:s") + //dao.Ys7DevicesImg.Ctx(ctx).Where("created_at < ?", thirtyDaysAgo).Delete() + dao.Ys7DevicesImg.Ctx(ctx).WhereNotNull(dao.Ys7DevicesImg.Columns().Name).Delete() +} + +// TheRecycleBinIsEmptyFunc 先查询出所有删除数据(删除时间+30天) 小于当前时间,那么就删除 +func TheRecycleBinIsEmptyFunc(ctx context.Context) { + tableNames := []string{ + dao.Document.Table(), // 模板 + dao.DocumentData.Table(), // 资料 + dao.DocumentCompletion.Table(), // 竣工 + dao.DocumentProductionDrawing.Table(), // 施工 + dao.DocumentReport.Table(), // 可研 + dao.DocumentQualityMeeting.Table(), // 质量会议 + dao.DocumentSafetyMeeting.Table(), // 安全会议 + } + for i := range tableNames { + DelDocumentFunc(ctx, tableNames[i]) + } +} + +func DelDocumentFunc(ctx context.Context, table string) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + var ddlr []*model.DocumentListRes + g.DB().Model(table).Ctx(ctx).Unscoped().Where(gdb.Raw("DATE_ADD(deleted_at, INTERVAL 30 DAY) < now()")).WhereNotNull("deleted_at").Fields("id,filen_path").Scan(&ddlr) + if len(ddlr) > 0 { + var idArrDdlr []int64 + // 1、删除路径对应的文件 + for _, data := range ddlr { + os.RemoveAll(coryCommon.FileToFunc(data.FilenPath, 2)) + idList := logicDocumentData.RecursiveDeletion(ctx, data.Id) + if idList != nil { + idArrDdlr = append(idArrDdlr, idList...) + } + idArrDdlr = append(idArrDdlr, data.Id) + } + // 2、删除对应文档 + _, err = g.DB().Model(table).Ctx(ctx).Unscoped().Delete(dao.Document.Columns().Id+" in (?)", idArrDdlr) + liberr.ErrIsNil(ctx, err) + // 3、删除对应文档的操作记录. + _, err = g.DB().Model("bus_design_document_record").Ctx(ctx). + Where("table_name", table). + Where("table_id in (?)", idArrDdlr).Delete() + liberr.ErrIsNil(ctx, err) + } + }) + return err +} + +// 获取所有的子项目后,如果子项目的总量和完成量相等,则将其子项目添加完成日期 +func UpdateProjectStatus(ctx context.Context) { + // 获取所有的子项目 + var projectList []entity.SubProject + if err := dao.SubProject.Ctx(ctx).Scan(&projectList); err != nil { + return + } + + // 遍历每个项目 + for _, project := range projectList { + result, err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().SubProjectid, project.Id).Fields("sum(total) as total ,sum(finished) as finished").All() + if err != nil { + continue + } + + total := result[0]["total"].Int() + finished := result[0]["finished"].Int() + + if total == 0 || finished == 0 { + continue + } + + // 如果总量和完成量相等,则将其子项目添加完成日期 + if total == finished { + // 更新项目状态 + dao.SubProject.Ctx(ctx).Where(dao.SubProject.Columns().Id, project.Id). + WhereNull(dao.SubProject.Columns().DoneTime). + Update(g.Map{ + dao.SubProject.Columns().DoneTime: time.Now().Format("2006-01-02"), + }) + } + } +} + +//===========================================上下班打卡提醒业务=========================================== +//===========================================上下班打卡提醒业务=========================================== +//===========================================上下班打卡提醒业务=========================================== + +var onAndOffDuty = cron.New(cron.WithSeconds()) + +func StartNewsAgencyTicker(ctx context.Context) { + + //停止onAndOffDuty所有的cron + entries := onAndOffDuty.Entries() + for i := range entries { + onAndOffDuty.Remove(entries[i].ID) + } + + //获取所有项目的打卡范围 + var projectEntity []model.SysProjectListRes + if err := dao.SysProject.Ctx(ctx). + Where("status", 0). + //Where("show_hidden", 1). + Fields("id,project_name,punch_range"). + Scan(&projectEntity); err != nil { + log.Printf("获取项目失败:%v", err) + if err != nil { + return + } + } + // 遍历项目列表 + for _, pData := range projectEntity { + fmt.Println(pData.ProjectName, "--", pData.Id, "--", pData.PunchRange) + + punchRange := pData.PunchRange + split := strings.Split(punchRange, ",") + // 解析上班时间并设置上班前 60 分钟的定时任务 + workStartTime, err := time.Parse("15:04", split[0]) + if err != nil { + log.Printf("解析上班时间字符串失败:%v", err) + continue + } + a := pData + + workStartTime = workStartTime.Add(-60 * time.Minute) + _, err = onAndOffDuty.AddFunc(fmt.Sprintf("1 %d %d * * *", workStartTime.Minute(), workStartTime.Hour()), func() { + go sendReminder(ctx, a, 0) + }) + // 解析下班时间并设置下班前 10 分钟的定时任务 + workEndTime, err := time.Parse("15:04", split[1]) + if err != nil { + log.Printf("解析下班时间字符串失败:%v", err) + continue + } + //workEndTime = workEndTime.Add(-2 * time.Minute) + _, err = onAndOffDuty.AddFunc(fmt.Sprintf("1 %d %d * * *", workEndTime.Minute(), workEndTime.Hour()), func() { + go sendReminder(ctx, a, 1) + }) + } + onAndOffDuty.Start() +} + +// 发送提醒 +func sendReminder(ctx context.Context, pData model.SysProjectListRes, ii int) { + // 获取当前项目下面的所有成员 + var openidList []*wxModel.BusConstructionUserListRes + if err := dao.BusConstructionUser.Ctx(ctx). + Fields("project_id,openid"). + Where("status = 0"). + Where("entry_date is not null and entry_date!='' and (leave_date is null or leave_date = '')"). + Where("project_id", pData.Id). + Scan(&openidList); err != nil { + log.Printf("获取项目成员失败:%v", err) + return + } + commuter := "" + typeInt := 0 + if ii == 0 { + typeInt = reminders.CheckIn + commuter = "上班" + } else { + typeInt = reminders.CheckOut + commuter = "下班" + } + // 记录当前openid对应最后一次登录的设备id,然后推送app通知信息 + openids := []string{} + now := time.Now() + currentDate := now.Format("2006-01-02") + for _, oi := range openidList { + openids = append(openids, oi.Openid) + message := reminders.Reminder{ + Type: typeInt, + Status: reminders.Remind, + Title: "中煤" + currentDate + commuter + "打卡提醒", + Content: "即将进入打卡时间,请前往打卡(如若休息请忽略!)", + ProjectID: int(oi.ProjectId), + ReceiverID: oi.Openid, + } + // 发布提醒 + reminders.PublishReminder(message, false) + } + deviceId := []string{} + array, err := g.DB().Model("user_registration").Ctx(ctx).WhereIn("open_id", openids).Fields("registration_id").Array() + for _, value := range array { + deviceId = append(deviceId, value.String()) + } + if err == nil && len(deviceId) > 0 { + //推送app通知 + go jiguang.SendAppClockingNotice(ctx, deviceId, currentDate, commuter) + } +} + +// @Title 函数名称 2024/8/19 11:16:00 +// @Description 存储摄像头拍到的所有图片(这些数据每月月初会删掉) +// @Auth Cory +// @param 输入参数名 ---> "参数解释" +// @Return error ---> "错误信息" +func aaaaaa() { + +} diff --git a/task/demo.go b/task/demo.go new file mode 100644 index 0000000..9357d36 --- /dev/null +++ b/task/demo.go @@ -0,0 +1,81 @@ +/* +* @desc:测试定时任务 +* @company:云南省奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2021/7/16 15:52 + */ + +package task + +import ( + "context" + "fmt" + "github.com/gogf/gf/v2/os/gtime" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + wxDao "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + "github.com/tiger1103/gfast/v3/third/thirdParty" +) + +func Test1(ctx context.Context) { + fmt.Println("无参测试") + service.SysJobLog().Add(ctx, &do.SysJobLog{ + TargetName: "test1", + CreatedAt: gtime.Now(), + Result: "无参测试运行成功", + }) +} + +func Test2(ctx context.Context) { + //1、获取到app用户表中,项目id为60的,且没有删除的所有用户 + columns := dao.BusConstructionUser.Columns() + var listData []*model.DiSanFang + dao.BusConstructionUser.Ctx(ctx).As("a"). + LeftJoin(wxDao.SysProjectTeamMember.Table()+" as b", "b.team_id = a.team_id and b.openid=a.openid"). + Where("a."+columns.ProjectId, 60). + WhereNotNull("a." + columns.SfzNumber). + Fields("a.*,b.post_id").Scan(&listData) + //2、调用第三方接口 + if listData != nil && len(listData) > 0 { + //处理得到数据 + var rr []*thirdParty.RealUser + for _, datum := range listData { + //判断是否是班长 + classManagerFlag := "0" + if datum.PostId == "10" { + classManagerFlag = "1" + } + rr = append(rr, &thirdParty.RealUser{ + UserName: datum.UserName, + ClassManagerFlag: classManagerFlag, + Phone: datum.Phone, + Sex: datum.Sex, + CardType: "0", + CardNumber: datum.SfzNumber, + UserType: "0", + Nation: datum.SfzNation, + Birthday: datum.SfzBirth, + Address: datum.SfzSite, + CardStartTime: datum.SfzStart, + CardEndTime: datum.SfzEnd, + Pic: "http://xny.yj-3d.com:7363" + datum.PacePhoto, + }) + } + //调用 + batchSize := 10 + total := len(rr) + for start := 0; start < total; start += batchSize { + end := start + batchSize + if end > total { + end = total + } + batch := rr[start:end] + err := thirdParty.SendRy(ctx, batch) + if err != nil { + fmt.Println("发送田东人员信息失败", err) + } + } + } +} diff --git a/task/uav_cron.go b/task/uav_cron.go new file mode 100644 index 0000000..46e466e --- /dev/null +++ b/task/uav_cron.go @@ -0,0 +1,124 @@ +package task + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gctx" + "github.com/robfig/cron/v3" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/controller" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "golang.org/x/net/context" + "strconv" + "time" +) + +var c = cron.New(cron.WithSeconds()) + +// UavRun 启动任务 +func UavRun(ctx context.Context) { + //1、获取到所有无人机的任务 + var taskEntity []*model.ManageTaskCronInfoRes + err := dao.ManageTaskCron.Ctx(ctx).Scan(&taskEntity) + if err != nil { + g.Log().Error(ctx, err) + return + } + if len(taskEntity) == 0 { + return + } + + //2、添加任务到cron中 + for _, data := range taskEntity { + // 创建一个包装函数 + wrapFunc := func() { + id := data.TaskId + clientId := data.MqClientId + TakeOffFunc(id, clientId) + } + oneId, err := c.AddFunc(data.Cron, wrapFunc) + if err != nil { + g.Log().Error(ctx, err) + return + } + //3、将启动任务得到的任务ID转存到数据库中 + _, err = dao.ManageTaskCron.Ctx(ctx).Where(dao.ManageTaskCron.Columns().Id, data.Id).Update(g.Map{"cron_id": oneId}) + if err != nil { + g.Log().Error(ctx, err) + return + } + } + //4、启动任务 + c.Start() +} + +// MidMissionFunc 中途追加或修改任务 +func MidMissionFunc() { + time.Sleep(time.Second * 1) //防止sql语句还未插入进数据库 + //1、关闭所有任务 + c.Stop() + //2、移除所有任务 + for _, entry := range c.Entries() { + c.Remove(entry.ID) + } + //3、重新启动任务 + ctx := gctx.New() + UavRun(ctx) +} + +// OffTimerAllFunc 关闭所有定时器 +func OffTimerAllFunc(id int) { + //1、关闭所有任务 + c.Stop() + //2、移除所有任务 + for _, entry := range c.Entries() { + c.Remove(entry.ID) + } +} + +// OffTimerFunc 关闭指定的定时器 +func OffTimerFunc(id int) { + c.Remove(cron.EntryID(id)) +} + +// TakeOffFunc 飞机从下发任务到执行任务一系列操作 +func TakeOffFunc(taskId int64, gatewaySn string) { + ctx := context.Background() + + //1、获取当前时间毫秒时间戳,然后组织数据,下发任务 + idStr := strconv.FormatInt(taskId, 10) + req := system.FlighttaskPrepareReq{ + Id: idStr, + GatewaySn: gatewaySn, + TaskType: "0", + ExecuteTime: time.Now().UnixNano() / int64(time.Millisecond), + Remark: "定时执行飞行任务", + TimedFlight: "ok", + } + + recordId, err := controller.FlighttaskPrepareFunc(ctx, &req) + if err != nil { + g.Log("uav").Error(ctx, err) + return + } + //2、等待10秒钟(确保上一个指令执行完毕),然后执行任务 + time.Sleep(10 * time.Second) + taskReq := system.PerformATaskReq{ + Id: recordId, + GatewaySn: gatewaySn, + } + _, err = controller.ManageTaskRecord.PerformATaskFunc(ctx, &taskReq) + if err != nil { + g.Log("uav").Error(ctx, err) + return + } +} + +// ValidateCronExprWithSeconds 用于验证 6 字段的 Cron 表达式 +func ValidateCronExprWithSeconds(expr string) error { + // 创建一个支持秒级字段的解析器 + parser := cron.NewParser(cron.Second | cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow | cron.Descriptor) + _, err := parser.Parse(expr) + return err +} diff --git a/test/dupl_user_test.go b/test/dupl_user_test.go new file mode 100644 index 0000000..ed14e77 --- /dev/null +++ b/test/dupl_user_test.go @@ -0,0 +1,85 @@ +package test + +import ( + "context" + "fmt" + "testing" + + "github.com/gogf/gf/v2/frame/g" + "github.com/samber/lo" +) + +type DuplUser struct { + UserName string `json:"user_name"` + Phone string `json:"phone"` + Openid string `json:"openid"` + ID uint `json:"id"` +} + +// 查询具有相同手机号的用户 +func TestDuplUser(t *testing.T) { + // SELECT + // + // id, + // user_name, + // phone, + // openid + // + // FROM + // + // bus_construction_user + // + // WHERE + // + // phone IN ( + // SELECT + // phone + // FROM + // bus_construction_user + // where + // deleted_at is nullAND phone <> '' + // GROUP BY + // phone + // HAVING + // COUNT(phone) > 1 + // ) + // AND phone IS NOT NULL AND phone <> '' + // + // ORDER BY phone; + var duplUsers []DuplUser + // 查询具有相同手机号的用户 + query, _ := g.DB().Query(context.Background(), "SELECT id, user_name, phone, openid FROM bus_construction_user WHERE phone IN (SELECT phone FROM bus_construction_user WHERE deleted_at IS NULL AND phone <> '' GROUP BY phone HAVING COUNT(phone) > 1) AND phone IS NOT NULL AND phone <> '' and deleted_at is null ORDER BY phone") + if err := query.Structs(&duplUsers); err != nil { + t.Fatal(err) + } + + var errOpenids []DuplUser + duplUsers = lo.FilterMap(duplUsers, func(v DuplUser, _ int) (DuplUser, bool) { + // 如果 openid 不包含任何字母,则认为是无效的 openid + if !hasLetter(v.Openid) { + errOpenids = append(errOpenids, v) + return v, false + } + + return v, true + }) + + for _, v := range duplUsers { + fmt.Printf("User: %#v\n", v) + } + + fmt.Println("错误的OpenID") + for _, v := range errOpenids { + fmt.Printf("User: %#v\n", v) + } +} + +// 判断字符串是否包含字母 +func hasLetter(s string) bool { + for _, r := range s { + if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') { + return true + } + } + return false +} diff --git a/test/excel_test.go b/test/excel_test.go new file mode 100644 index 0000000..c10fb1d --- /dev/null +++ b/test/excel_test.go @@ -0,0 +1,1001 @@ +package test + +import ( + "context" + "encoding/json" + "fmt" + "strconv" + "strings" + "testing" + + "github.com/samber/lo" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/third/excel" + "github.com/xuri/excelize/v2" +) + +// 测试 Excel 解析数据 +func TestExcel(t *testing.T) { + fileName := "test.xlsx" + + f, err := excelize.OpenFile(fileName) + if err != nil { + t.Fatal(err) + } + + defer func() { + if err := f.Close(); err != nil { + t.Fatal(err) + } + }() + + rows, err := f.GetRows("方阵统计分析") + if err != nil { + t.Fatal(err) + } + + type group struct { + Name string + MatrixNumber string + NominalTiltAngle string + } + + groups := map[string][]group{} + // groups := []group{} + + for _, row := range rows[1:] { + // Matrix Name + matrixName := row[0] + // Nominal Tilt Angle + nominalTiltAngle := row[2] + // Nominal Azimuth Angle + nominalAzimuthAngle := row[3] + + // 对 matrixNumber 拆分取出第一位 + a := strings.ReplaceAll(strings.Split(matrixName, ".")[0], "G", "T") + + groups[a] = append(groups[a], group{ + Name: matrixName, + MatrixNumber: nominalTiltAngle, + NominalTiltAngle: nominalAzimuthAngle, + }) + // groups = append(groups, group{ + // Name: matrixName, + // MatrixNumber: nominalTiltAngle, + // NominalTiltAngle: nominalAzimuthAngle, + // }) + } + + for _, v := range groups { + fmt.Println(v) + } +} + +// 测试导出 Excel +func TestExportExcel(t *testing.T) { + fangZhenID := "1964" + startAt := "2023-12-05" + endAt := "2024-03-22" + + list := exportExcel(fangZhenID) + // 打开 + f, err := excelize.OpenFile("test.xlsx") + if err != nil { + t.Fatal(err) + } + + sheetName := "Sheet1" + + headerPrefixes := []string{"一、", "二、", "三、", "四、", "五、", "六、"} + childPrefixes := []string{"1、", "2、", "3、", "4、", "5、", "6、", "7、", "8、", "9、", "10、", "11、", "12、"} + + // 修改表头 + f.SetCellValue(sheetName, "A1", fmt.Sprintf("%s (%s - %s)", fangZhenID, startAt, endAt)) + + // 遍历 list + rowIndex := 3 + lo.ForEach(list, func(item *model.WorkStatusProgressRes, index int) { + setExcelValues(f, sheetName, rowIndex, item, headerPrefixes[index]) + rowIndex++ + + // 遍历子集 + lo.ForEach(item.Children, func(child model.WorkStatusProgressRes, childIndex int) { + setExcelValues(f, sheetName, rowIndex, &child, childPrefixes[childIndex]) + rowIndex++ + }) + }) + + if err := f.SaveAs("asd.xlsx"); err != nil { + t.Fatal(err) + } +} + +func setExcelValues(f *excelize.File, sheetName string, i int, item *model.WorkStatusProgressRes, prefix string) { + // 单元格 A + f.SetCellValue(sheetName, fmt.Sprintf("A%d", i), prefix+item.Name) // 父名 + f.SetCellValue(sheetName, fmt.Sprintf("B%d", i), item.Total) // 总量 + f.SetCellValue(sheetName, fmt.Sprintf("C%d", i), item.Finished) // 完成 + + var percentComplete float64 + if item.Total != 0 { + percentComplete = float64(item.Finished) / float64(item.Total) * 100 + } else { + percentComplete = 0 + } + f.SetCellValue(sheetName, fmt.Sprintf("D%d", i), fmt.Sprintf("%.2f%%", percentComplete)) // 总量完成百分比 + + if item.PlanProgress != nil { + total := 0 + if item.PlanProgress.Total != nil { + total = *item.PlanProgress.Total + } + f.SetCellValue(sheetName, fmt.Sprintf("E%d", i), total) // 计划量 + + finished := 0 + if item.PlanProgress.Finished != nil { + finished = *item.PlanProgress.Finished + } + f.SetCellValue(sheetName, fmt.Sprintf("F%d", i), finished) // 计划完成量 + + var plannedPercentComplete float64 + if item.PlanProgress != nil && item.PlanProgress.Finished != nil && item.PlanProgress.Total != nil && *item.PlanProgress.Total != 0 { + plannedPercentComplete = float64(*item.PlanProgress.Finished) / float64(*item.PlanProgress.Total) * 100 + } else { + plannedPercentComplete = 0 + } + + f.SetCellValue(sheetName, fmt.Sprintf("G%d", i), fmt.Sprintf("%.2f%%", plannedPercentComplete)) // 计划完成百分比 + } +} + +func exportExcel(fangzhenID string) []*model.WorkStatusProgressRes { + startAt := "2023-12-05" + endAt := "2024-03-22" + + type scheduler struct { + // 实体 + WorkStatus *entity.WorkSchedule + // 总进度 + FinishedPtr int + // 总量 + Total int + } + + type Schdule map[string]scheduler + + Get := func(scheduleMap Schdule, workID string) (int, int) { + if scheduler, ok := scheduleMap[workID]; ok { + return scheduler.FinishedPtr, scheduler.Total + } + return 0, 0 + } + + ctx := context.Background() + + // 获取指定方阵ID的所有计划 + ScheduleData := []entity.WorkSchedule{} + if err := dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().FangzhenId, fangzhenID). + Scan(&ScheduleData); err != nil { + return nil + } + + scheduleMap := make(Schdule) + // 遍历 ScheduleData 将数据按照 WorkID 分组 + lo.ForEach(ScheduleData, func(item entity.WorkSchedule, _ int) { + bb := item.StartAt.Format("Y-m-d") + if bb > startAt { + return + } + + // 如果不存在则直接添加 + _, ok := scheduleMap[item.WorkId] + if !ok { + scheduleMap[item.WorkId] = scheduler{ + WorkStatus: &item, + } + } + + // 反序列化 item.Detail 字段 + var scheduleDetails []model.WorkScheduleDetail + if err := json.Unmarshal([]byte(item.Detail), &scheduleDetails); err != nil { + return + } + + lo.ForEach(scheduleDetails, func(detail model.WorkScheduleDetail, _ int) { + // 如果 Date 大于开始时间并小于结束时间 + if detail.Date <= endAt { + scheduler := scheduleMap[item.WorkId] + scheduler.Total += detail.PlanNum + scheduler.FinishedPtr += detail.FinishedNum + scheduleMap[item.WorkId] = scheduler + } + }) + }) + + // 获取指定方阵ID的所有项目 + workStatusList := []entity.WorkStatus{} + if err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, fangzhenID).Scan(&workStatusList); err != nil { + return nil + } + + // 父列表 + parentList := []entity.WorkStatus{} + // 子列表,使用 map 存储,键为父元素的 ID + childrenMap := make(map[int][]entity.WorkStatus) + + // 遍历所有数据,将父级和子集分开 + for i := 0; i < len(workStatusList); i++ { + item := workStatusList[i] + if item.Parent == 0 { + parentList = append(parentList, item) + } else { + childrenMap[item.Parent] = append(childrenMap[item.Parent], item) + } + } + + index := 1 + + projectList := make([]*model.WorkStatusProgressRes, 0, len(parentList)) + // 遍历父级,将子集添加到父级的字段中 + for _, parent := range parentList { + projectItem := model.WorkStatusProgressRes{ + ID: index, + WorkID: parent.WorkId, + Startat: parent.StartAt.String(), + Endat: parent.EndAt.String(), + Name: parent.WorkName, + Total: parent.Total, + Finished: parent.Finished, + Status: parent.Status, + WorkType: parent.Type, + Children: make([]model.WorkStatusProgressRes, 0, len(workStatusList)), + } + index++ + + // 子类的总量和完成量 + var subTotal, subDone int + + // 从 map 中获取子元素,将子元素添加到父元素的字段中 + for _, child := range childrenMap[int(parent.Id)] { + // 如果计划数量等于实际数量,且原状态非3,则更新状态为2 + if child.Total == child.Finished && child.Status != 3 { + // 并且 total,finished 不为 0 + if child.Total != 0 && child.Finished != 0 { + child.Status = 2 + } + } + + // 根据 WorkID 获取计划总量和实际进度 + finishedPtr, total := Get(scheduleMap, child.WorkId) + + subTotal += child.Total + subDone += child.Finished + + projectItem.Children = append(projectItem.Children, model.WorkStatusProgressRes{ + ID: index, + WorkID: child.WorkId, + Startat: child.StartAt.String(), + Endat: child.EndAt.String(), + Name: child.WorkName, + Total: child.Total, + Finished: child.Finished, + IsPercent: child.IsPercent, + Status: child.Status, + WorkType: child.Type, + PlanProgress: &model.PlanProgress{ + Finished: &finishedPtr, + Total: &total, + }, + }) + index++ + } + + // 修改父项目的总量和进度 + projectItem.Total = subTotal + projectItem.Finished = subDone + + projectList = append(projectList, &projectItem) + } + + return projectList +} + +// 获取整个子项目的 +func getChildren(subProjectId int) []*model.WorkStatusProgressRes { + startAt := "2023-12-05" + endAt := "2024-03-22" + + type scheduler struct { + // 实体 + WorkStatus *entity.WorkSchedule + // 总进度 + FinishedPtr int + // 总量 + Total int + } + + type Schdule map[string]scheduler + + Get := func(scheduleMap Schdule, workID string) (int, int) { + if scheduler, ok := scheduleMap[workID]; ok { + return scheduler.FinishedPtr, scheduler.Total + } + return 0, 0 + } + + ctx := context.Background() + + // 获取指定小项目的所有计划 + ScheduleData := []entity.WorkSchedule{} + if err := dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().SubProjectid, subProjectId). + Scan(&ScheduleData); err != nil { + return nil + } + + scheduleMap := make(Schdule) + // 遍历 ScheduleData 将数据按照 WorkID 分组 + lo.ForEach(ScheduleData, func(item entity.WorkSchedule, _ int) { + bb := item.StartAt.Format("Y-m-d") + if bb > startAt { + return + } + + // 如果不存在则直接添加 + _, ok := scheduleMap[item.WorkId] + if !ok { + scheduleMap[item.WorkId] = scheduler{ + WorkStatus: &item, + } + } + + // 反序列化 item.Detail 字段 + var scheduleDetails []model.WorkScheduleDetail + if err := json.Unmarshal([]byte(item.Detail), &scheduleDetails); err != nil { + return + } + + lo.ForEach(scheduleDetails, func(detail model.WorkScheduleDetail, _ int) { + // 如果 Date 大于开始时间并小于结束时间 + if detail.Date <= endAt { + scheduler := scheduleMap[item.WorkId] + scheduler.Total += detail.PlanNum + scheduler.FinishedPtr += detail.FinishedNum + scheduleMap[item.WorkId] = scheduler + } + }) + }) + + // 获取指定方阵ID的所有方阵数据 + workStatusList := []entity.WorkStatus{} + if err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().SubProjectid, subProjectId).Scan(&workStatusList); err != nil { + return nil + } + + // 父列表 + parentList := []entity.WorkStatus{} + // 子列表,使用 map 存储,键为父元素的 ID + childrenMap := make(map[int][]entity.WorkStatus) + + // 遍历所有数据,将父级和子集分开 + for i := 0; i < len(workStatusList); i++ { + item := workStatusList[i] + if item.Parent == 0 { + parentList = append(parentList, item) + } else { + childrenMap[item.Parent] = append(childrenMap[item.Parent], item) + } + } + + index := 1 + + projectList := make([]*model.WorkStatusProgressRes, 0, len(parentList)) + // 遍历父级,将子集添加到父级的字段中 + for _, parent := range parentList { + projectItem := model.WorkStatusProgressRes{ + ID: index, + WorkID: parent.WorkId, + Startat: parent.StartAt.String(), + Endat: parent.EndAt.String(), + Name: parent.WorkName, + Total: parent.Total, + Finished: parent.Finished, + Status: parent.Status, + WorkType: parent.Type, + Children: make([]model.WorkStatusProgressRes, 0, len(workStatusList)), + } + index++ + + // 子类的总量和完成量 + var subTotal, subDone int + + // 从 map 中获取子元素,将子元素添加到父元素的字段中 + for _, child := range childrenMap[int(parent.Id)] { + // 如果计划数量等于实际数量,且原状态非3,则更新状态为2 + if child.Total == child.Finished && child.Status != 3 { + // 并且 total,finished 不为 0 + if child.Total != 0 && child.Finished != 0 { + child.Status = 2 + } + } + + // 根据 WorkID 获取计划总量和实际进度 + finishedPtr, total := Get(scheduleMap, child.WorkId) + + subTotal += child.Total + subDone += child.Finished + + projectItem.Children = append(projectItem.Children, model.WorkStatusProgressRes{ + ID: index, + WorkID: child.WorkId, + Startat: child.StartAt.String(), + Endat: child.EndAt.String(), + Name: child.WorkName, + Total: child.Total, + Finished: child.Finished, + IsPercent: child.IsPercent, + Status: child.Status, + WorkType: child.Type, + PlanProgress: &model.PlanProgress{ + Finished: &finishedPtr, + Total: &total, + }, + }) + index++ + } + + // 修改父项目的总量和进度 + projectItem.Total = subTotal + projectItem.Finished = subDone + + projectList = append(projectList, &projectItem) + } + + return projectList +} + +// 测试子项目 +func Test_subProject(t *testing.T) { + // 根据子项目ID获取所有的方阵 + subProjectID := 23 + + fangzhenList := []entity.QianqiFangzhen{} + if err := dao.QianqiFangzhen.Ctx(context.Background()). + Where(dao.QianqiFangzhen.Columns().ProjectId, subProjectID).Scan(&fangzhenList); err != nil { + t.Fatal(err) + } + + cumulativeProjects := []*model.WorkStatusProgressRes{} + + // 用于判断是否为第一次迭代 + firstTime := true + + // 遍历项目列表 + for index := 0; index < len(fangzhenList); index++ { + // 获取当前项目 + project := fangzhenList[index] + + // 获取当前项目的子项目 + childProjects := exportExcel(strconv.Itoa(project.Id)) + + // 如果是第一次迭代,将子项目列表赋值给累积项目列表 + if firstTime { + cumulativeProjects = childProjects + // 更新标志变量,表示已经不是第一次迭代 + firstTime = false + continue + } + + // 遍历子项目列表 + for childIndex := 0; childIndex < len(childProjects); childIndex++ { + // 获取当前子项目和对应的累积项目 + singleChild := childProjects[childIndex] + cumulativeChild := cumulativeProjects[childIndex] + + // 更新累积项目的总数和完成数 + cumulativeChild.Total += singleChild.Total + cumulativeChild.Finished += singleChild.Finished + + // 如果当前子项目还有子项目,也进行同样的操作 + if len(singleChild.Children) > 0 { + for subChildIndex := 0; subChildIndex < len(singleChild.Children); subChildIndex++ { + // 获取当前子项目的子项目和对应的累积项目 + singleSubChild := singleChild.Children[subChildIndex] + cumulativeSubChild := cumulativeChild.Children[subChildIndex] + + // 更新累积项目的总数和完成数 + cumulativeSubChild.Total += singleSubChild.Total + cumulativeSubChild.Finished += singleSubChild.Finished + } + } + } + } + + // 序列化 cumulativeProjects + data, err := json.Marshal(cumulativeProjects) + if err != nil { + t.Fatal(err) + } + + fmt.Println(string(data)) +} + +// 根据方阵ID获取子项目名 +func Test_GetSubName(t *testing.T) { + excel.GetSubProjectName("1959") +} + +// 测试导出 +func TestExport(t *testing.T) { + req := system.WorkScheduleExportWeekReq{ + FangzhenID: "1964", + StartTime: "2023-09-07", + EndTime: "2024-10-22", + ProjectID: "45", + } + + ctx := context.Background() + + var ( + list []*model.WorkStatusProgressRes + err error + + projectName, subProjectName string + + excelMap = make(map[string]excel.ExcelInfo) + ) + + // 导出指定方阵的情况下 + if req.FangzhenID != "" { + // 获取方阵下的所有工作计划 + list, excelMap, err = excel.ExportExcel(req.FangzhenID, req.StartTime, req.EndTime) + if err != nil { + t.Fatal(err) + } + // 子项目名,方阵名 + projectName, subProjectName = excel.GetSubProjectName(req.FangzhenID) + } else { + // 导出一个子项目的情况 + list, excelMap, err = excel.AccumulateProject(req.SubProjectID, req.StartTime, req.EndTime) + if err != nil { + t.Fatal(err) + } + // 大项目名,子项目名 + projectName, subProjectName = excel.GetNameById(req.SubProjectID) + } + + _, _, _ = projectName, subProjectName, list + + _ = excelMap + // f, err := excelize.OpenFile("../resource/book.xlsx") + // if err != nil { + // t.Fatal(err) + // } + + f, err := excel.CreateExcelTemplate() + if err != nil { + t.Fatal(err) + } + + // 设置表头 k2 日期 + // startat - endat + f.SetCellValue("Sheet1", "K2", fmt.Sprintf("%s - %s", req.StartTime, req.EndTime)) + + // 获取周数 + week, err := excel.GetWeekNumbers(req.EndTime) + if err != nil { + t.Fatal(err) + } + + // i2 周数 + f.SetCellValue("Sheet1", "I2", week) + + // D4 开工日期: 2023-03-20 + projectInfo := entity.SysProject{} + err = dao.SysProject.Ctx(ctx).Where(dao.SysProject.Columns().Id, req.ProjectID).Scan(&projectInfo) + if err != nil { + t.Fatal(err) + } + + // A1 项目名称 + "周报" + f.SetCellValue("Sheet1", "A1", projectInfo.ProjectName+"周报") + + // C2 项目名称 + f.SetCellValue("Sheet1", "C2", projectInfo.ProjectName) + + f.SetCellValue("Sheet1", "D4", "开工日期:"+projectInfo.OnStreamTime.Format("Y-m-d")) + + sheetName := "Sheet1" + index := 10 + for i := 0; i < len(list); i++ { + postionName := list[i].Name + + for j := 0; j < len(list[i].Children); j++ { + setExcelValue(f, sheetName, index, list[i].Children[j], excelMap, postionName) + // 如果 C 的下一格为 "设备材料名称" 则新增一行 + if lo.Must(f.GetCellValue(sheetName, fmt.Sprintf("C%d", index+1))) == "设备材料名称" && index+1 != 38 { + f.InsertRows(sheetName, index+1, 1) + } + + index++ + } + } + + // A9 ,B9 向下合并到 index + _ = f.MergeCell(sheetName, "A9", fmt.Sprintf("A%d", index-1)) + f.SetCellStyle(sheetName, "A9", fmt.Sprintf("A%d", index-1), lo.Must(f.NewStyle(&GlobalStyle))) + _ = f.MergeCell(sheetName, "B9", fmt.Sprintf("B%d", index-1)) + f.SetCellStyle(sheetName, "B9", fmt.Sprintf("B%d", index-1), lo.Must(f.NewStyle(&GlobalStyle))) + + if err := f.SaveAs("test.xlsx"); err != nil { + t.Fatal(err) + } +} + +var GlobalStyle = excelize.Style{ + // 边框 + Border: []excelize.Border{ + {Type: "left", Color: "000000", Style: 1}, + {Type: "top", Color: "000000", Style: 1}, + {Type: "bottom", Color: "000000", Style: 1}, + {Type: "right", Color: "000000", Style: 1}, + }, + // 居中 + Alignment: &excelize.Alignment{ + Vertical: "center", // 上下居中 + Horizontal: "center", // 左右居中 + WrapText: true, // 自动换行 + }, +} + +func CalculateTotalProgress(list []*model.WorkStatusProgressRes) float64 { + var totalFinished, total int + + var calculate func(w model.WorkStatusProgressRes) + calculate = func(w model.WorkStatusProgressRes) { + totalFinished += w.Finished + total += w.Total + for _, child := range w.Children { + calculate(child) + } + } + + for _, item := range list { + calculate(*item) + } + + if total == 0 { + return 0 + } + + return (float64(totalFinished) / float64(total)) * 100 +} + +// Test_ExportWeek 导出周报 +func Test_ExportWeek(t *testing.T) { + req := system.WorkScheduleExportWeekReq{ + ProjectID: "45", + FangzhenID: "1964", + StartTime: "2023-09-07", + EndTime: "2024-10-22", + } + + var ( + list []*model.WorkStatusProgressRes + err error + + projectName, subProjectName string + + excelMap = make(map[string]excel.ExcelInfo) + ) + + // 判断传入的方阵或子项目是否为空 + // if !service.WorkSchedule().IsExistWorkSchedule(ctx, req.SubProjectID, req.FangzhenID, req.StartTime, req.EndTime) { + // list = []*model.WorkStatusProgressRes{} + // } + + // 导出指定方阵的情况下 + if req.FangzhenID != "" { + // 获取方阵下的所有工作计划 + list, excelMap, err = excel.ExportExcel(req.FangzhenID, req.StartTime, req.EndTime) + if err != nil { + t.Fatal(err) + } + + // 子项目名,方阵名 + projectName, subProjectName = excel.GetSubProjectName(req.FangzhenID) + } else { + // 导出一个子项目的情况 + list, excelMap, err = excel.AccumulateProject(req.SubProjectID, req.StartTime, req.EndTime) + if err != nil { + t.Fatal(err) + } + + // 大项目名,子项目名 + projectName, subProjectName = excel.GetNameById(req.SubProjectID) + } + + _, _, _ = projectName, subProjectName, list + + // dd, _ := json.Marshal(list) + // fmt.Println(string(dd)) + + ddd := CalculateTotalProgress(list) + + fmt.Println(ddd) + + // 创建 Excel 模板 + f, err := excel.CreateExcelTemplate() + if err != nil { + t.Fatal(err) + } + + sheetName := "Sheet1" + index := 10 + + for _, item := range list { + postionName := item.Name + + for _, child := range item.Children { + excel.SetExcelValue(f, sheetName, index, child, excelMap, postionName) + + if lo.Must(f.GetCellValue(sheetName, fmt.Sprintf("C%d", index+1))) == "设备材料名称" && index+1 != 38 { + f.InsertRows(sheetName, index+1, 1) + } + + index++ + } + } + + // A9 ,B9 向下合并到 index + mergeAndStyle := func(col string) { + cellRange := fmt.Sprintf("%s9", col) + _ = f.MergeCell(sheetName, cellRange, fmt.Sprintf("%s%d", col, index-1)) + f.SetCellStyle(sheetName, cellRange, fmt.Sprintf("%s%d", col, index-1), lo.Must(f.NewStyle(excel.Style))) + } + + mergeAndStyle("A") + mergeAndStyle("B") + + // 材料 + equipmentMaterials, err := excel.GetEquipmentMaterials(req.ProjectID, req.StartTime, req.EndTime) + if err != nil { + t.Fatal(err) + } + + index = 39 // 从第 39 行开始 + + for _, item := range equipmentMaterials { + + // 如果 B + index 为 "存在问题及需要协调的事项" 则新增一行 + if lo.Must(f.GetCellValue(sheetName, fmt.Sprintf("B%d", index))) == "存在问题及需要协调的事项" { + f.InsertRows(sheetName, index, 1) + } + + f.SetCellValue(sheetName, fmt.Sprintf("C%d", index), item.EquipmentMaterialsName) // 设备材料名称 + f.SetCellStyle(sheetName, fmt.Sprintf("C%d", index), fmt.Sprintf("C%d", index), lo.Must(f.NewStyle(excel.Style))) + + f.SetCellStyle(sheetName, fmt.Sprintf("D%d", index), fmt.Sprintf("D%d", index), lo.Must(f.NewStyle(excel.Style))) + f.SetCellStyle(sheetName, fmt.Sprintf("E%d", index), fmt.Sprintf("E%d", index), lo.Must(f.NewStyle(excel.Style))) + + f.SetCellValue(sheetName, fmt.Sprintf("F%d", index), item.TotalQuantityCount) // 设计数量 + f.SetCellStyle(sheetName, fmt.Sprintf("F%d", index), fmt.Sprintf("F%d", index), lo.Must(f.NewStyle(excel.Style))) + + f.SetCellValue(sheetName, fmt.Sprintf("G%d", index), item.TotalNumber) // 本周 + f.SetCellStyle(sheetName, fmt.Sprintf("G%d", index), fmt.Sprintf("G%d", index), lo.Must(f.NewStyle(excel.Style))) + + f.SetCellValue(sheetName, fmt.Sprintf("H%d", index), item.CumulativeArrivalQuantity) // 累计到货数量 + f.SetCellStyle(sheetName, fmt.Sprintf("H%d", index), fmt.Sprintf("H%d", index), lo.Must(f.NewStyle(excel.Style))) + + // 累计到货率 + cumulativeArrivalRate := 0.0 + if item.TotalQuantityCount != 0 { + cumulativeArrivalRate = float64(item.CumulativeArrivalQuantity) / float64(item.TotalQuantityCount) + } + f.SetCellValue(sheetName, fmt.Sprintf("I%d", index), cumulativeArrivalRate) + f.SetCellStyle(sheetName, fmt.Sprintf("I%d", index), fmt.Sprintf("I%d", index), lo.Must(f.NewStyle(excel.Style))) + + // 合并 jk 单元格 + _ = f.MergeCell(sheetName, fmt.Sprintf("J%d", index), fmt.Sprintf("K%d", index)) + f.SetCellStyle(sheetName, fmt.Sprintf("J%d", index), fmt.Sprintf("K%d", index), lo.Must(f.NewStyle(excel.Style))) + + // 水平居中 jk 单元格 + f.SetCellStyle(sheetName, fmt.Sprintf("J%d", index), fmt.Sprintf("K%d", index), lo.Must(f.NewStyle(&excelize.Style{ + Border: []excelize.Border{ + {Type: "left", Color: "000000", Style: 1}, + {Type: "top", Color: "000000", Style: 1}, + {Type: "bottom", Color: "000000", Style: 1}, + {Type: "right", Color: "000000", Style: 1}, + }, + Fill: excelize.Fill{}, + Font: nil, + Alignment: &excelize.Alignment{ + Horizontal: "center", // 水平居中 + Indent: 0, + JustifyLastLine: false, + ReadingOrder: 0, + RelativeIndent: 0, + ShrinkToFit: false, + TextRotation: 0, + Vertical: "", // 垂直居中 + WrapText: false, + }, + }))) + + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", "L", index), fmt.Sprintf("%s%d", "L", index), lo.Must(f.NewStyle(excel.Style))) + index++ + } + + // 合并 A38 和 B38 至 index + f.MergeCell(sheetName, "A38", fmt.Sprintf("A%d", index-1)) + f.SetCellStyle(sheetName, "A38", fmt.Sprintf("A%d", index-1), lo.Must(f.NewStyle(excel.Style))) + + f.MergeCell(sheetName, "B38", fmt.Sprintf("B%d", index-1)) + f.SetCellStyle(sheetName, "B38", fmt.Sprintf("B%d", index-1), lo.Must(f.NewStyle(excel.Style))) + + // j4 总进度完成率 + f.SetCellValue(sheetName, "J4", excel.CalculateTotalProgress(list)) + + if err := f.SaveAs("test.xlsx"); err != nil { + t.Fatal(err) + } +} + +// 材料到货情况 +func Test_Materials(t *testing.T) { + // SELECT + // bem.equipment_materials_name, + // SUM(bmi.number) AS total_number, + // SUM(bem.quantity_count) AS total_quantity_count, + // ( + // SELECT + // SUM(bi.number) + // FROM + // `bus_equipment_materials_inventory` bi + // WHERE + // bi.equipment_materials_id = bmi.equipment_materials_id + // AND bi.deleted_at IS NULL + // AND bi.out_put = 2 + // ) AS cumulative_arrival_quantity + // FROM + // `bus_equipment_materials_inventory` AS bmi + // LEFT JOIN `bus_equipment_materials` bem ON ( + // bmi.equipment_materials_id = bem.equipment_materials_id + // ) + // WHERE + // bem.project_id = 45 + // AND bmi.out_put = 2 + // AND bmi.created_at >= '2022-09-07' + // AND bmi.created_at <= '2024-10-22' + // AND bmi.deleted_at IS NULL + // AND bem.deleted_at IS NULL + // GROUP BY + // bem.equipment_materials_name; + + var list []struct { + EquipmentMaterialsName string `json:"equipment_materials_name"` // 设备材料名称 + TotalNumber int `json:"total_number"` // 本周到货量 + TotalQuantityCount int `json:"total_quantity_count"` // 设计数量 + CumulativeArrivalQuantity int `json:"cumulative_arrival_quantity"` // 累计到货量 + } + + startAT := "2022-09-07" + endAT := "2024-10-22" + + // 查询 + if err := dao.BusEquipmentMaterialsInventory.Ctx(context.Background()).As("bmi"). + Fields("bem.equipment_materials_name, SUM(bmi.number) AS total_number, SUM(bem.quantity_count) AS total_quantity_count, (SELECT SUM(bi.number) FROM `bus_equipment_materials_inventory` bi WHERE bi.equipment_materials_id = bmi.equipment_materials_id AND bi.deleted_at IS NULL AND bi.out_put = 2) AS cumulative_arrival_quantity"). + LeftJoin("bus_equipment_materials bem", "bmi.equipment_materials_id = bem.equipment_materials_id"). + Where("bem.project_id = ?", 45). + Where("bmi.out_put = ?", 2). + Where("bmi.created_at >= ?", startAT). + Where("bmi.created_at <= ?", endAT). + Group("bem.equipment_materials_name"). + Scan(&list); err != nil { + t.Fatal(err) + } + + // // C39 + + // index := 39 + + // for _, item := range list { + // // 设备材料名称 + // equipmentMaterialsName := item.EquipmentMaterialsName + // // 设计数量 + // totalQuantityCount := item.TotalQuantityCount + // // 本周到货量 + // totalNumber := item.TotalNumber + // // 累计到货量 + // cumulativeArrivalQuantity := item.CumulativeArrivalQuantity + // // 累计到货率 + // cumulativeArrivalRate := 0.0 + // if totalQuantityCount != 0 { + // cumulativeArrivalRate = float64(cumulativeArrivalQuantity) / float64(totalQuantityCount) * 100 + // } + + // } +} + +func setExcelValue(f *excelize.File, sheetName string, index int, item model.WorkStatusProgressRes, excelmap map[string]excel.ExcelInfo, postionName string) { + // 设计数量 F10 + total := item.Total + // 本周完成量 G10 + finished := item.Finished + + // 累计完成量和下周计划量 + accumulated, nextWeek := 0, 0 + + if data, exists := excelmap[item.WorkID]; exists { + accumulated = data.Accumulated + nextWeek = data.NextWeek + } + + // 累计完成百分比 单元格 I10 + percentComplete := 0.0 + if total != 0 { + percentComplete = float64(accumulated) / float64(total) * 100 + } + + // 名称 + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", "C", index), item.Name) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", "C", index), fmt.Sprintf("%s%d", "C", index), lo.Must(f.NewStyle(&GlobalStyle))) + + // 位置 + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", "D", index), postionName) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", "D", index), fmt.Sprintf("%s%d", "D", index), lo.Must(f.NewStyle(&GlobalStyle))) + + // 单位 样式 + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", "E", index), fmt.Sprintf("%s%d", "E", index), lo.Must(f.NewStyle(&GlobalStyle))) + + // 设计数量 + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", "F", index), total) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", "F", index), fmt.Sprintf("%s%d", "F", index), lo.Must(f.NewStyle(&GlobalStyle))) + + // 本周 + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", "G", index), finished) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", "G", index), fmt.Sprintf("%s%d", "G", index), lo.Must(f.NewStyle(&GlobalStyle))) + + // 累计完成量 + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", "H", index), accumulated) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", "H", index), fmt.Sprintf("%s%d", "H", index), lo.Must(f.NewStyle(&GlobalStyle))) + + // 累计完成百分比 + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", "I", index), fmt.Sprintf("%.f%%", percentComplete)) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", "I", index), fmt.Sprintf("%s%d", "I", index), lo.Must(f.NewStyle(&GlobalStyle))) + + // 合并 jk 单元格 + _ = f.MergeCell(sheetName, fmt.Sprintf("J%d", index), fmt.Sprintf("K%d", index)) + f.SetCellStyle(sheetName, fmt.Sprintf("J%d", index), fmt.Sprintf("K%d", index), lo.Must(f.NewStyle(&GlobalStyle))) + + // 水平居中 jk 单元格 + f.SetCellStyle(sheetName, fmt.Sprintf("J%d", index), fmt.Sprintf("K%d", index), lo.Must(f.NewStyle(&excelize.Style{ + Border: []excelize.Border{ + {Type: "left", Color: "000000", Style: 1}, + {Type: "top", Color: "000000", Style: 1}, + {Type: "bottom", Color: "000000", Style: 1}, + {Type: "right", Color: "000000", Style: 1}, + }, + Fill: excelize.Fill{}, + Font: nil, + Alignment: &excelize.Alignment{ + Horizontal: "center", // 水平居中 + Indent: 0, + JustifyLastLine: false, + ReadingOrder: 0, + RelativeIndent: 0, + ShrinkToFit: false, + TextRotation: 0, + Vertical: "", // 垂直居中 + WrapText: false, + }, + }))) + + // 下周计划量 + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", "J", index), nextWeek) + + // L + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", "L", index), fmt.Sprintf("%s%d", "L", index), lo.Must(f.NewStyle(&GlobalStyle))) +} diff --git a/test/gannt_test.go b/test/gannt_test.go new file mode 100644 index 0000000..6ba904f --- /dev/null +++ b/test/gannt_test.go @@ -0,0 +1,177 @@ +package test + +import ( + "context" + "encoding/json" + "fmt" + "testing" + + _ "github.com/gogf/gf/contrib/drivers/mysql/v2" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/third/create" +) + +// 构建 gantt json 数据 +func Test_createGanttJson(t *testing.T) { + a, err := create.FetchGanttData(context.Background(), 2) + if err != nil { + t.Fatal(err) + } + + data, _ := json.Marshal(a) + + println(string(data)) +} + +// 测试创建模板数据 +func Test_createTemplateData(t *testing.T) { + _, err := create.FetchTemplateData(context.Background(), 2) + if err != nil { + t.Fatal(err) + } +} + +// 测试element 数据拼接 +func Test_createElement(t *testing.T) { + group, err := create.FetchElementData(context.Background(), 2) + if err != nil { + t.Fatal(err) + } + + data, _ := json.Marshal(group) + + println(string(data)) +} + +// 测试箱变导入 +// func Test_importXiangbian(t *testing.T) { +// filePath := "" + +// err1, s2 := shp.ReadShp(filePath) +// if err1 != nil { +// liberr.ErrIsNil(ctx, err1) +// } +// } + +// FetchTemplateData 获取模板数据后绑定到指定的 ProJectID +func Test_FetchTemplateData(t *testing.T) { + ctx := context.Background() + + result, err := create.FetchTemplateData(ctx, 183) + if err != nil { + t.Fatal(err) + } + + _, err = dao.WorkStatus.Ctx(ctx).Data(result).Batch(50).Insert() + if err != nil { + t.Fatal(err) + } +} + +// 测试导入方阵后绑定到指定的 ProJectID 后修改计划表中数据 +func Test_FetchElementData(t *testing.T) { + // 根据项目ID获取方阵数据 + ctx := context.Background() + + projectID := 2 + + // 获取指定 ProJectID 下的所有方阵 + group := []entity.QianqiFangzhen{} + if err := dao.QianqiFangzhen.Ctx(ctx).Where(dao.QianqiFangzhen.Columns().ProjectId, projectID).Scan(&group); err != nil { + t.Fatal(err) + } + + // 获取指定 ProJectID 下的所有箱变数量 + // count, err := dao.QianqiXiangbian.Ctx(ctx).Where(dao.QianqiXiangbian.Columns().ProjectId, projectID).Count() + // if err != nil { + // t.Fatal(err) + // } + + // 遍历方阵 + for _, p := range group { + // 根据 p 的主键ID + // 在 Work_Status 表中关联找到其数据 + + // 更新子数据 + _, err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, p.Id). + // Where(dao.WorkStatus.Columns().Type, consts.). + // Where(dao.WorkStatus.Columns()., 1). + WhereNotNull(dao.WorkStatus.Columns().Parent).Data( + g.Map{ + dao.WorkStatus.Columns().Total: gdb.Raw(fmt.Sprintf("total+%d", 1)), + }, + ).Update() + if err != nil { + t.Fatal(err) + } + + // count, err := result.RowsAffected() + // if err != nil { + // t.Fatal(err) + // } + + // 获取所有子集数据总和 + // all, err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, p.Id). + // Where(dao.WorkStatus.Columns().Type, consts.BoxChange). + // WhereNotNull(dao.WorkStatus.Columns().Parent).Count() + // if err != nil { + // t.Fatal(err) + // } + + // 更新父数据 + // if _, err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().Id, projectID). + // Where(dao.WorkStatus.Columns().Type, consts.BoxChange). + // WhereNull(dao.WorkStatus.Columns().Parent).Data( + // g.Map{ + // dao.WorkStatus.Columns().Total: gdb.Raw(fmt.Sprintf("total+%d", count)), + // }, + // ).Update(); err != nil { + // t.Fatal(err) + // } + } +} + +// 拼接 model.WorkStatusChild +// func Test_createWorkStatusChild(t *testing.T) { +// list := []model.WorkStatusChild{} + +// ctx := context.Background() + +// // 获取指定 ProJectID 下的所有方阵 +// group := []entity.QianqiFangzhen{} +// if err := dao.QianqiFangzhen.Ctx(ctx).Where(dao.QianqiFangzhen.Columns().ProjectId, 2).Scan(&group); err != nil { +// t.Fatal(err) +// } + +// for _, p := range group { +// // 获取指定 ProJectID 下的所有箱变 +// xiangbianGroup := []entity.QianqiXiangbian{} +// if err := dao.QianqiXiangbian.Ctx(ctx).Where(dao.QianqiXiangbian.Columns().ProjectId, p.Id).Scan(&xiangbianGroup); err != nil { +// t.Fatal(err) +// } + +// fangzhenList := []model.FangzhenList{} +// for _, x := range xiangbianGroup { +// fangzhenList = append(fangzhenList, model.FangzhenList{ +// FangzhenID: x.Id, +// FangzhenName: x.Name, +// }) +// } + +// list = append(list, model.WorkStatusChild{ +// ProJectID: p.ProjectId, +// FangzhenList: fangzhenList, +// }) +// } + +// data, _ := json.Marshal(list) +// println(string(data)) +// } + +// 批量执行 SQL +func Test_batchUpdate(t *testing.T) { + +} diff --git a/test/intro_test.go b/test/intro_test.go new file mode 100644 index 0000000..d852791 --- /dev/null +++ b/test/intro_test.go @@ -0,0 +1,75 @@ +package test + +import ( + "context" + "testing" + + "github.com/gogf/gf/v2/container/gvar" + "github.com/gogf/gf/v2/util/gconv" + "github.com/samber/lo" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + wxDao "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + "github.com/tiger1103/gfast/v3/library/liberr" + richtext "github.com/tiger1103/gfast/v3/third/richText" +) + +// 获取所有的后台项目公告,同步一份给App +func TestSyncIntro(t *testing.T) { + intructID := []entity.SysProjectIntroduce{} + if err := dao.SysProjectIntroduce.Ctx(context.Background()).Scan(&intructID); err != nil { + t.Error(err) + } + + ctx := context.Background() + + var notificationsList []do.NotificationRecipients + + for _, v := range intructID { + // imags := richtext.ExtractImageURLs(v.RichText) + data := entity.Notifications{ + Title: v.Headline, + NotificationText: richtext.RemoveRichText(v.RichText), + NotificationTime: v.CreatedAt.Format("2006-01-02 15:04:05"), + IsApp: 2, + Initiator: gconv.Int(v.CreatedBy), + ProjectId: int(v.ProjectId), + IntroduceId: int(v.ID), + } + notifiID, err := dao.Notifications.Ctx(ctx).InsertAndGetId(data) + if err != nil { + t.Fatal(err) + } + + // 获取项目下的所有用户 + projectUserIDs, err := wxDao.SysUserProjectRelevancy.Ctx(ctx). + Where(wxDao.SysUserProjectRelevancy.Columns().ProjectId, int(v.ProjectId)). + Fields(wxDao.SysUserProjectRelevancy.Columns().UserId).Distinct().Array() + liberr.ErrIsNil(ctx, err) + + constructionUserIDs, err := dao.BusConstructionUser.Ctx(ctx).As("bcs"). + InnerJoin("sys_user as su", "bcs.phone = su.mobile"). + Where("bcs.project_id", int(v.ProjectId)). + Fields("su.id").Distinct().Array() + liberr.ErrIsNil(ctx, err) + + // 将两个用户ID列表合并并去重 + Users := lo.Uniq(lo.Map(append(projectUserIDs, constructionUserIDs...), func(item *gvar.Var, _ int) int { + return item.Int() + })) + + lo.ForEach(Users, func(item int, _ int) { + notificationsList = append(notificationsList, do.NotificationRecipients{ + NotificationId: notifiID, // 通知ID + RecipientId: item, // 接收者ID + NotificationStatus: 0, // 0 未读 + IntroduceId: int(v.ID), // 关联的PC 端项目新闻ID + }) + }) + } + + if _, err := dao.NotificationRecipients.Ctx(ctx).Insert(notificationsList); err != nil { + t.Error(err) + } +} diff --git a/test/kdTree_test.go b/test/kdTree_test.go new file mode 100644 index 0000000..e27ab49 --- /dev/null +++ b/test/kdTree_test.go @@ -0,0 +1,29 @@ +package test + +import ( + "context" + "encoding/json" + "os" + "testing" + + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +// 获取指定方阵所有的数据 +func TestGetMatrixData(t *testing.T) { + var matrix []entity.PvModule + // 获取指定方阵所有的数据 + FangzhenID := 23 + if err := dao.PvModule.Ctx(context.Background()).Where(dao.PvModule.Columns().SubProjectid, FangzhenID). + Where(dao.PvModule.Columns().Type, 15). + Limit(100000).Scan(&matrix); err != nil { + t.Fatal(err) + } + + // json + data, _ := json.Marshal(matrix) + + // 保存为文件 + os.WriteFile("matrix.json", data, 0o644) +} diff --git a/test/manifest/config/config.yaml b/test/manifest/config/config.yaml new file mode 100644 index 0000000..b997c89 --- /dev/null +++ b/test/manifest/config/config.yaml @@ -0,0 +1,201 @@ +server: + address: "8919" + serverRoot: "resource/public" + dumpRouterMap: false + routeOverWrite: true + openapiPath: "/api.json" + swaggerPath: "/swagger" + NameToUriType: 3 + maxHeaderBytes: "20KB" + clientMaxBodySize: "50MB" + # Logging配置 + logPath: "resource/log/server" # 日志文件存储目录路径,建议使用绝对路径。默认为空,表示关闭 + logStdout: true # 日志是否输出到终端。默认为true + errorStack: true # 当Server捕获到异常时是否记录堆栈信息到日志中。默认为true + errorLogEnabled: true # 是否记录异常日志信息到日志中。默认为true + errorLogPattern: "error-{Ymd}.log" # 异常错误日志文件格式。默认为"error-{Ymd}.log" + accessLogEnabled: true # 是否记录访问日志。默认为false + accessLogPattern: "access-{Ymd}.log" # 访问日志文件格式。默认为"access-{Ymd}.log" + +logger: + path: "resource/log/run" + file: "{Y-m-d}.log" + level: "all" + stdout: true + +# Database. +database: + logger: + level: "all" + stdout: true + Path: "resource/log/sql" + + default: + link: "mysql:zmkg:NwSfMLLHkNMrkMzy@tcp(192.168.1.177:9996)/zmkg?charset=utf8mb4&parseTime=true&loc=Local&multiStatements=true" + # link: "mysql:root:CQyj20200808!@tcp(www.yj-3d.com:3386)/zs_zm?charset=utf8mb4&parseTime=true&loc=Local&multiStatements=true" + # link: "mysql:root:CQyj20200808!@tcp(122.9.140.40:3386)/zs_zm?charset=utf8mb4&parseTime=true&loc=Local&multiStatements=true" + # link: "mysql:zmkg:RBCE83eRH6YCL8PL@tcp(119.45.210.154:28002)/zmkg?charset=utf8mb4&parseTime=true&loc=Local&multiStatements=true" + debug: true + charset: "utf8mb4" #数据库编码 + dryRun: false #空跑 + maxIdle: 10 #连接池最大闲置的连接数 + maxOpen: 10 #连接池最大打开的连接数 + maxLifetime: "30s" #(单位秒)连接对象可重复使用的时间长度 + sqlite: + link: "sqlite:D:/Cory/go/中煤/zmkg-back/resource/data/3m精度.clt" + +gfToken: + cacheKey: "gfToken:" + timeOut: 259200 + maxRefresh: 129600 + multiLogin: true + encryptKey: "49c54195e750b04e74a8429b17896586" + cacheModel: "redis" + excludePaths: + - "/api/v1/system/login" + - "/zm/api/v1/system/uEditor/action" + - "/zm/api/v1/system/device/websocketReq" + - "/zm/api/v1/system/busConstructionUser/complaintBoxAdd" + - "/zm/api/v1/system/bigUpload/upload" + - "/zm/api/v1/system/workStatus/getProgress" + - "/zm/api/v1/system/constructionDetails/gannt" + - "/zm/api/v1/system/workSchedule/addPlan" + - "/zm/api/v1/system/workSchedule/check" + - "/zm/api/v1/system/workSchedule/maxTime" + - "/zm/api/v1/system/workSchedule/lastTime" + +# Redis 配置示例 +redis: + # 单实例配置 + default: + address: localhost:6379 + db: 1 + pass: zmkg2023 + idleTimeout: "60s" #连接最大空闲时间,使用时间字符串例如30s/1m/1d + maxConnLifetime: "90s" #连接最长存活时间,使用时间字符串例如30s/1m/1d + waitTimeout: "60s" #等待连接池连接的超时时间,使用时间字符串例如30s/1m/1d + dialTimeout: "30s" #TCP连接的超时时间,使用时间字符串例如30s/1m/1d + readTimeout: "30s" #TCP的Read操作超时时间,使用时间字符串例如30s/1m/1d + writeTimeout: "30s" #TCP的Write操作超时时间,使用时间字符串例如30s/1m/1d + maxActive: 100 + helmetRedis: + address: 119.45.210.154:28004 + db: 1 + pass: zmkg2023 + idleTimeout: "60s" #连接最大空闲时间,使用时间字符串例如30s/1m/1d + maxConnLifetime: "90s" #连接最长存活时间,使用时间字符串例如30s/1m/1d + waitTimeout: "60s" #等待连接池连接的超时时间,使用时间字符串例如30s/1m/1d + dialTimeout: "30s" #TCP连接的超时时间,使用时间字符串例如30s/1m/1d + readTimeout: "30s" #TCP的Read操作超时时间,使用时间字符串例如30s/1m/1d + writeTimeout: "30s" #TCP的Write操作超时时间,使用时间字符串例如30s/1m/1d + maxActive: 100 + +system: + notCheckAuthAdminIds: [1] #无需验证后台权限的用户id + dataDir: "./resource/data" + cache: + model: "redis" #缓存模式 memory OR redis + prefix: "gFastV3Cache:" #缓存前缀 + +#casbin配置 +casbin: + modelFile: "./resource/casbin/rbac_model.conf" + policyFile: "./resource/casbin/rbac_policy.csv" + +# 上传配置 +upload: + default: 0 # 默认上传至本地 + tencentCOS: + upPath: "/gfast/" + rawUrl: "https://xxxxxx.ap-xxxxx.myqcloud.com" + secretID: "xxxxxxxxxx" + secretKey: "xxxxxxxxxx" + +# 代码生成配置 +gen: + author: "gfast" + moduleName: "system" + apiName: "api/v1" + packageName: "internal/app/system" + goModName: "github.com/tiger1103/gfast/v3" + autoRemovePre: true #是否自动删除表前缀 + tablePrefix: "table_,qxkj_" #表前缀 + templatePath: "./resource/template/vm" #代码生成模板路径 + frontDir: "../zmkg-ui" #前端路径 + +## 代码生成配置 +#gen: +# author: "gfast" +# moduleName: "wxApplet" +# apiName: "api/wxApplet" +# packageName: "internal/app/wxApplet" +# goModName: "github.com/tiger1103/gfast/v3" +# autoRemovePre: true #是否自动删除表前缀 +# tablePrefix: "table_,qxkj_" #表前缀 +# templatePath: "./resource/template/vm" #代码生成模板路径 +# frontDir: "../正版前端/zmkg-ui" #前端路径 + +wx: + crt: "" + key: "" + appId: "wxb31ec6ee58db5d17" + appSecret: "9603be1c81b791d0288ced63cc40861a" + +#百度云ocr识别+人脸检测、对比 +baiDuYun: + clientId: "zSB7KdLgY7a1tIEx3eTy65TE" + clientSecret: "5nabjclW5BWGV8UwEueDgBDmOveRVkmD" + +ys: + dev: true + +#LiveGBS: +# safety: +# #ip +# ip: "119.45.210.154" +# #api 请求路径 +# api: "http://119.45.210.154:10000/" +# #acc 账号 +# acc: "admin" +# #pas 密码 +# pas: "zmkg@2023" +# #sms 固定sms +# sms: "sms/34020000002020000001/" +# redis: +# address: "119.45.210.154:6379" +# password: "zmkg2023" +## redis: +## address: "43.136.86.137:26379" +## password: "livegbs@2019" + +# mqtt +mqtt: + #host= jl.yj-3d.com + # host: 192.168.1.177 + host: nas.cctegcqet.com + port: 1883 + username: cory18600000000 + password: cory18600000000 + clientid: cory18600000000 + topics: sys/product/+/status,thing/product/+/requests,thing/product/+/osd,thing/product/+/state,thing/product/+/services_reply,thing/product/+/events + +# 斯巴达算法 +spartaApi: + Url: "http://119.3.204.120:8040" + key: "test" + secret: "115fcb08fa6742a1b086d9bb80a6ad59" + # 由于斯巴达算法需要线上地址资源,所以需要把本地的路径转成线上(外网)能访问到的静态资源【D:/Cory/go/中煤/zmkg-back/resource/public/upload_file/2023-11-30/helmet1701328146812_127.png】----》【http://nas.cctegcqet.com:8899/file/upload_file/2023-11-30/helmet1701328146812_127.png】 + prefix: "http://nas.cctegcqet.com:8899" + +# 安全帽识别 +ys7: + key: "f01490bd5d5241b7809d8fc5fe84f7f8" + secret: "d468f270699de855fd85fe7fd6f9595f" + +# 无人机(java) +uav: + #生成航线 + hostOne: "http://nas.cctegcqet.com:8899/airlineserver/" + +# 由于小程序和pc不在同一个服务器,导致安全考试批量下载需要将pdf的文件copy到临时压缩包里面然后提供给前端下载,所以需要此字段实现网络资源下载到本地,然后将本地临时资源文件放到临时压缩文件中 +cory: "https://www.yj-3d.com:8919" diff --git a/test/manifest/config/config.yaml.bak b/test/manifest/config/config.yaml.bak new file mode 100644 index 0000000..f24bdf7 --- /dev/null +++ b/test/manifest/config/config.yaml.bak @@ -0,0 +1,110 @@ +server: + address: ":8808" + serverRoot: "resource/public" + dumpRouterMap: false + routeOverWrite: true + openapiPath: "/api.json" + swaggerPath: "/swagger" + NameToUriType: 3 + maxHeaderBytes: "20KB" + clientMaxBodySize: "50MB" + # Logging配置 + logPath: "resource/log/server" # 日志文件存储目录路径,建议使用绝对路径。默认为空,表示关闭 + logStdout: true # 日志是否输出到终端。默认为true + errorStack: true # 当Server捕获到异常时是否记录堆栈信息到日志中。默认为true + errorLogEnabled: true # 是否记录异常日志信息到日志中。默认为true + errorLogPattern: "error-{Ymd}.log" # 异常错误日志文件格式。默认为"error-{Ymd}.log" + accessLogEnabled: true # 是否记录访问日志。默认为false + accessLogPattern: "access-{Ymd}.log" # 访问日志文件格式。默认为"access-{Ymd}.log" + +logger: + path: "resource/log/run" + file: "{Y-m-d}.log" + level: "all" + stdout: true + +# Database. +database: + logger: + level: "all" + stdout: true + Path: "resource/log/sql" + + default: + link: "mysql:gfast3:gfast333@tcp(localhost:3306)/gfast-v32?charset=utf8mb4&parseTime=true&loc=Local" + debug: true + charset: "utf8mb4" #数据库编码 + dryRun: false #空跑 + maxIdle: 10 #连接池最大闲置的连接数 + maxOpen: 10 #连接池最大打开的连接数 + maxLifetime: "30s" #(单位秒)连接对象可重复使用的时间长度 + +gfToken: + cacheKey: "gfToken:" + timeOut: 10800 + maxRefresh: 5400 + multiLogin: true + encryptKey: "49c54195e750b04e74a8429b17896586" + cacheModel: "redis" + excludePaths: + - "/api/v1/system/login" + + +# Redis 配置示例 +redis: + # 单实例配置 + default: + address: 127.0.0.1:6379 + db: 1 + idleTimeout: "60s" #连接最大空闲时间,使用时间字符串例如30s/1m/1d + maxConnLifetime: "90s" #连接最长存活时间,使用时间字符串例如30s/1m/1d + waitTimeout: "60s" #等待连接池连接的超时时间,使用时间字符串例如30s/1m/1d + dialTimeout: "30s" #TCP连接的超时时间,使用时间字符串例如30s/1m/1d + readTimeout: "30s" #TCP的Read操作超时时间,使用时间字符串例如30s/1m/1d + writeTimeout: "30s" #TCP的Write操作超时时间,使用时间字符串例如30s/1m/1d + maxActive: 100 + +system: + notCheckAuthAdminIds: [1,2,31] #无需验证后台权限的用户id + dataDir: "./resource/data" + cache: + model: "redis" #缓存模式 memory OR redis + prefix: "gFastV3Cache:" #缓存前缀 + +#casbin配置 +casbin: + modelFile: "./resource/casbin/rbac_model.conf" + policyFile: "./resource/casbin/rbac_policy.csv" + + +# CLI. +gfcli: + gen: + dao: + - link: "mysql:gfast3:gfast333@tcp(localhost:3306)/gfast-v32" + tables: "tools_gen_table,tools_gen_table_column" + removePrefix: "gf_" + descriptionTag: true + noModelComment: true + path: "./internal/app/system" + +# 上传配置 +upload: + default: 0 # 默认上传至本地 + tencentCOS: + upPath : "/gfast/" + rawUrl : "https://xxxxxx.ap-xxxxx.myqcloud.com" + secretID : "xxxxxxxxxx" + secretKey : "xxxxxxxxxx" + +# 代码生成配置 +gen: + author: "gfast" + moduleName: "system" + apiName: "api/v1" + packageName: "internal/app/system" + goModName: "github.com/tiger1103/gfast/v3" + autoRemovePre: true #是否自动删除表前缀 + tablePrefix: "table_,qxkj_" #表前缀 + templatePath: "./resource/template/vm" #代码生成模板路径 + frontDir: "../../../project/webProject/p2022/gfast-v3.2-ui/gfast3.2-ui" #前端路径 \ No newline at end of file diff --git a/test/manifest/deploy/kustomize/base/deployment.yaml b/test/manifest/deploy/kustomize/base/deployment.yaml new file mode 100644 index 0000000..28f1d69 --- /dev/null +++ b/test/manifest/deploy/kustomize/base/deployment.yaml @@ -0,0 +1,21 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: template-single + labels: + app: template-single +spec: + replicas: 1 + selector: + matchLabels: + app: template-single + template: + metadata: + labels: + app: template-single + spec: + containers: + - name : main + image: template-single + imagePullPolicy: Always + diff --git a/test/manifest/deploy/kustomize/base/kustomization.yaml b/test/manifest/deploy/kustomize/base/kustomization.yaml new file mode 100644 index 0000000..302d92d --- /dev/null +++ b/test/manifest/deploy/kustomize/base/kustomization.yaml @@ -0,0 +1,8 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: +- deployment.yaml +- service.yaml + + + diff --git a/test/manifest/deploy/kustomize/base/service.yaml b/test/manifest/deploy/kustomize/base/service.yaml new file mode 100644 index 0000000..608771c --- /dev/null +++ b/test/manifest/deploy/kustomize/base/service.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: template-single +spec: + ports: + - port: 80 + protocol: TCP + targetPort: 8000 + selector: + app: template-single + diff --git a/test/manifest/deploy/kustomize/overlays/develop/configmap.yaml b/test/manifest/deploy/kustomize/overlays/develop/configmap.yaml new file mode 100644 index 0000000..3b1d0af --- /dev/null +++ b/test/manifest/deploy/kustomize/overlays/develop/configmap.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: template-single-configmap +data: + config.yaml: | + server: + address: ":8000" + openapiPath: "/api.json" + swaggerPath: "/swagger" + + logger: + level : "all" + stdout: true diff --git a/test/manifest/deploy/kustomize/overlays/develop/deployment.yaml b/test/manifest/deploy/kustomize/overlays/develop/deployment.yaml new file mode 100644 index 0000000..04e4851 --- /dev/null +++ b/test/manifest/deploy/kustomize/overlays/develop/deployment.yaml @@ -0,0 +1,10 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: template-single +spec: + template: + spec: + containers: + - name : main + image: template-single:develop \ No newline at end of file diff --git a/test/manifest/deploy/kustomize/overlays/develop/kustomization.yaml b/test/manifest/deploy/kustomize/overlays/develop/kustomization.yaml new file mode 100644 index 0000000..4731c47 --- /dev/null +++ b/test/manifest/deploy/kustomize/overlays/develop/kustomization.yaml @@ -0,0 +1,14 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +resources: +- ../../base +- configmap.yaml + +patchesStrategicMerge: +- deployment.yaml + +namespace: default + + + diff --git a/test/manifest/docker/Dockerfile b/test/manifest/docker/Dockerfile new file mode 100644 index 0000000..399619e --- /dev/null +++ b/test/manifest/docker/Dockerfile @@ -0,0 +1,19 @@ +FROM loads/alpine:3.8 + +############################################################################### +# INSTALLATION +############################################################################### + +ENV WORKDIR /app + +ADD resource $WORKDIR/ + +ADD ./bin/linux_amd64/main $WORKDIR/main + +RUN chmod +x $WORKDIR/main + +############################################################################### +# START +############################################################################### +WORKDIR $WORKDIR +CMD ./main diff --git a/test/manifest/docker/docker.sh b/test/manifest/docker/docker.sh new file mode 100644 index 0000000..ff393f9 --- /dev/null +++ b/test/manifest/docker/docker.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# This shell is executed before docker build. + + + + + diff --git a/test/path_test.go b/test/path_test.go new file mode 100644 index 0000000..d63a8de --- /dev/null +++ b/test/path_test.go @@ -0,0 +1,49 @@ +/* +* @desc:xxxx功能描述 +* @company:云南奇讯科技有限公司 +* @Author: yixiaohu +* @Date: 2022/12/8 17:48 + */ + +package test + +import ( + "fmt" + "github.com/gogf/gf/v2/os/gfile" + "github.com/gogf/gf/v2/text/gstr" + "strings" + "testing" +) + +func TestContainer(t *testing.T) { + //t.Run("testEncryptPassword", testEncryptPassword) + //t.Run("testIpToAddr", testIpToAddr) + //t.Run("testDb", testDb) + t.Run("ScanPath", scanPath) +} + +func scanPath(t *testing.T) { + var ( + packages []string + err error + packageNames []string + ) + //logic路径 + path := strings.Join([]string{"D:/goProject/p2022/gfast-v3/internal/app/demo/logic"}, "") + //获取该路径下所有需要加载的包 + packages, err = gfile.ScanDirFunc(path, "*", false, func(p string) string { + if gfile.IsDir(p) { + return p + } + return "" + }) + if err != nil { + panic(err) + } + packageNames = make([]string, len(packages)) + for k, v := range packages { + v = gstr.Replace(v, "\\", "/") + packageNames[k] = gstr.SubStr(v, gstr.PosR(v, "/")+1) + } + fmt.Println("dddd", packageNames) +} diff --git a/test/reminder_test.go b/test/reminder_test.go new file mode 100644 index 0000000..5a3faf9 --- /dev/null +++ b/test/reminder_test.go @@ -0,0 +1,30 @@ +package test + +import ( + "testing" + + "github.com/tiger1103/gfast/v3/third/reminders" +) + +// 发布一条安全检查工单提醒 +func Test_PublishReminder(t *testing.T) { + // 1. 构建消息模板 + // 安全检查工单提醒 + message := reminders.Reminder{ + Type: reminders.Security, // 安全 + Status: reminders.Remind, // 提醒 + + Title: "安全提醒标题", // 巡检类型 + Content: "安全提醒内容", // 巡检结果 + + ProjectID: 8, // 项目 ID + ReceiverID: "1", // 消息接收者的 sys_User.Id + TargetID: 1, // 对应跳转的主键ID + } + + // 2. 发布提醒 + err := reminders.PublishReminder(message, false) // 你发起了安全检查工单提醒 + if err != nil { + t.Fatal(err) + } +} diff --git a/test/resource/log/sql/2024-03-12.log b/test/resource/log/sql/2024-03-12.log new file mode 100644 index 0000000..46eecbe --- /dev/null +++ b/test/resource/log/sql/2024-03-12.log @@ -0,0 +1,2 @@ +2024-03-12 22:56:56.071 [DEBU] {3c039f3f3d0cbc171a27406546f9eb0b} [378 ms] [default] [zs_zm] [rows:9 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-12 22:56:56.086 [DEBU] {54ea1e563d0cbc171b274065fcced641} [ 15 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`duration`,`current_progress`,`total_progress`,`created_at`,`name` FROM `project_schedule` diff --git a/test/resource/log/sql/2024-03-14.log b/test/resource/log/sql/2024-03-14.log new file mode 100644 index 0000000..6135712 --- /dev/null +++ b/test/resource/log/sql/2024-03-14.log @@ -0,0 +1,1316 @@ +2024-03-14 11:09:11.625 [DEBU] {da10975cc782bc171cdb350dcf2e6552} [368 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 11:09:11.639 [DEBU] {c7ac8d72c782bc171ddb350d29fb706b} [ 14 ms] [default] [zs_zm] [rows:4 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num` FROM `project_schedule` +2024-03-14 11:09:29.927 [DEBU] {0752779ecb82bc17fb86e2566c03bfb1} [385 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 11:09:29.941 [DEBU] {27d871b5cb82bc17fc86e25653fdb91b} [ 13 ms] [default] [zs_zm] [rows:4 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num` FROM `project_schedule` +2024-03-14 11:13:56.678 [DEBU] {1d9182b90983bc1740e8747c26f456ea} [394 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 11:13:56.694 [DEBU] {486c0dd10983bc1741e8747c868cea1b} [ 15 ms] [default] [zs_zm] [rows:4 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num` FROM `project_schedule` +2024-03-14 11:16:23.781 [DEBU] {b75d3cfc2b83bc1725bb105db36ddda6} [349 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 11:16:23.794 [DEBU] {5e3307112c83bc1726bb105d0f6cf368} [ 13 ms] [default] [zs_zm] [rows:4 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num` FROM `project_schedule` +2024-03-14 11:16:28.440 [DEBU] {cff683112d83bc1701b8fb790826bfc5} [356 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 11:16:28.454 [DEBU] {1375bf262d83bc1702b8fb79dbfb9c8d} [ 14 ms] [default] [zs_zm] [rows:4 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num` FROM `project_schedule` +2024-03-14 11:18:29.426 [DEBU] {76bbec404983bc17a2aa0058b049d5fd} [287 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 11:18:29.437 [DEBU] {0db50c524983bc17a3aa0058b33db8e4} [ 11 ms] [default] [zs_zm] [rows:4 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num` FROM `project_schedule` +2024-03-14 11:18:35.720 [DEBU] {65c575ba4a83bc170875576bea4e16e7} [247 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 11:18:35.733 [DEBU] {a4753cc94a83bc170975576b64eae60c} [ 13 ms] [default] [zs_zm] [rows:4 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num` FROM `project_schedule` +2024-03-14 11:18:39.385 [DEBU] {da16e38d4b83bc174c624215bb3a7fca} [365 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 11:18:39.401 [DEBU] {276cb4a34b83bc174d624215bf73e338} [ 15 ms] [default] [zs_zm] [rows:4 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num` FROM `project_schedule` +2024-03-14 11:19:24.980 [DEBU] {d2b5ff2a5683bc178cbcd6688e1d41c1} [375 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 11:19:24.995 [DEBU] {fc6556415683bc178dbcd668bec6dd02} [ 15 ms] [default] [zs_zm] [rows:4 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num` FROM `project_schedule` +2024-03-14 11:31:53.243 [DEBU] {4b19da370484bc1799d48225e25fadf7} [1098 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 11:31:53.262 [DEBU] {0abf68790484bc179ad482259a686471} [ 17 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `types` IS NULL +2024-03-14 11:31:53.313 [DEBU] {23186c7a0484bc179bd482256c413e63} [ 51 ms] [default] [zs_zm] [rows:0 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=1) AND (`types` IS NOT NULL) LIMIT 1 +2024-03-14 11:31:58.901 [DEBU] {ab326eac0584bc177fc8f76a5d0444b1} [505 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 11:31:58.913 [DEBU] {3c1288ca0584bc1780c8f76ace37e906} [ 12 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `types` IS NULL +2024-03-14 11:31:58.945 [DEBU] {083f46cb0584bc1781c8f76ae979d35b} [ 31 ms] [default] [zs_zm] [rows:0 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=1) AND (`types` IS NOT NULL) LIMIT 1 +2024-03-14 11:32:14.663 [DEBU] {0eb9a3600984bc17174b0e00b4217d6b} [359 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 11:32:14.707 [DEBU] {cea109760984bc17184b0e00402c9df4} [ 44 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `types` IS NULL +2024-03-14 11:32:14.747 [DEBU] {23bfac780984bc17194b0e0034e8806f} [ 39 ms] [default] [zs_zm] [rows:0 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=1) AND (`types` IS NOT NULL) LIMIT 1 +2024-03-14 11:33:06.866 [DEBU] {4460da871584bc17bc6dd35720946b41} [364 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 11:33:06.877 [DEBU] {68d18f9d1584bc17bd6dd35759c8782b} [ 11 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `types` IS NULL +2024-03-14 11:33:09.420 [DEBU] {02aa5f341684bc17be6dd35783a44ef9} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=109) AND (`types` IS NOT NULL) LIMIT 1 +2024-03-14 11:33:25.475 [DEBU] {9afe5bf11984bc17bf6dd357c28889a8} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=110) AND (`types` IS NOT NULL) LIMIT 1 +2024-03-14 11:33:25.497 [DEBU] {643dc0f21984bc17c06dd357882287bb} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=111) AND (`types` IS NOT NULL) LIMIT 1 +2024-03-14 14:57:55.257 [DEBU] {e76320a4428fbc17fa20b20c129a5067} [379 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 14:57:55.287 [DEBU] {0b7aeaba428fbc17fb20b20c5dd0dde8} [ 27 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 14:58:09.084 [DEBU] {611024f1458fbc17fc20b20c2b65cc4e} [ 29 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 14:58:09.110 [DEBU] {750be4f2458fbc17fd20b20c878b1906} [ 26 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 14:58:25.644 [DEBU] {92376ab7498fbc17fe20b20cd1fcb801} [378 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 14:58:25.669 [DEBU] {fd7ffbcd498fbc17ff20b20c8d5de37c} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 14:58:59.505 [DEBU] {6c076199518fbc170021b20c870f0020} [383 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 14:59:02.686 [DEBU] {7a7e406c528fbc170121b20c6c05b495} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 14:59:13.117 [DEBU] {2fcfb7d9548fbc170221b20c3e78c1d7} [ 31 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 14:59:17.803 [DEBU] {65686ef1558fbc170321b20c15843687} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=112 +2024-03-14 14:59:20.321 [DEBU] {19017a87568fbc170421b20ce57a3255} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=113 +2024-03-14 14:59:20.345 [DEBU] {b49ffb88568fbc170521b20c84e7b4ed} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 14:59:20.379 [DEBU] {5b426f8a568fbc170621b20c42ef7e0a} [ 33 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=114 +2024-03-14 14:59:20.404 [DEBU] {87276c8c568fbc170721b20c2210f1a0} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=115 +2024-03-14 14:59:20.429 [DEBU] {3340f78d568fbc170821b20cf2190ed3} [ 24 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 14:59:20.461 [DEBU] {1a868e8f568fbc170921b20cacf92944} [ 29 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=116 +2024-03-14 14:59:20.484 [DEBU] {a81b4891568fbc170a21b20c58eedf99} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=117 +2024-03-14 14:59:20.507 [DEBU] {c925b392568fbc170b21b20c4681fd46} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=118 +2024-03-14 14:59:20.530 [DEBU] {74990f94568fbc170c21b20c4403c893} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=119 +2024-03-14 14:59:20.553 [DEBU] {af226595568fbc170d21b20c0f524b3a} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=120 +2024-03-14 14:59:20.575 [DEBU] {9494c696568fbc170e21b20c9bfdf150} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=121 +2024-03-14 14:59:20.598 [DEBU] {4bad1e98568fbc170f21b20c48caf8d1} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=122 +2024-03-14 14:59:20.621 [DEBU] {b9827599568fbc171021b20c5fa83a66} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=123 +2024-03-14 14:59:20.645 [DEBU] {2146d89a568fbc171121b20c5f399f2c} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=124 +2024-03-14 14:59:20.670 [DEBU] {1f70439c568fbc171221b20c7cc4da7d} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=125 +2024-03-14 14:59:20.701 [DEBU] {3947cc9d568fbc171321b20c7752360c} [ 30 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 14:59:20.726 [DEBU] {b970aa9f568fbc171421b20ca02d9090} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=126 +2024-03-14 14:59:20.749 [DEBU] {fa5d1ba1568fbc171521b20cdf5f13fd} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=127 +2024-03-14 14:59:20.772 [DEBU] {992278a2568fbc171621b20c526f1940} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=128 +2024-03-14 14:59:20.796 [DEBU] {602adba3568fbc171721b20c63730a06} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=129 +2024-03-14 14:59:20.826 [DEBU] {afa547a5568fbc171821b20cc0dd2e71} [ 30 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=130 +2024-03-14 14:59:20.848 [DEBU] {71020da7568fbc171921b20c5e9ed354} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=131 +2024-03-14 14:59:20.872 [DEBU] {467764a8568fbc171a21b20c18c8fcbd} [ 23 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 14:59:20.895 [DEBU] {bf84d3a9568fbc171b21b20c20473cf4} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=132 +2024-03-14 14:59:20.917 [DEBU] {a6342aab568fbc171c21b20c911361ab} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=133 +2024-03-14 14:59:20.940 [DEBU] {d02480ac568fbc171d21b20cf60c1e8e} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=134 +2024-03-14 14:59:20.966 [DEBU] {fea8dcad568fbc171e21b20c094ee3b6} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=135 +2024-03-14 14:59:20.990 [DEBU] {b4c366af568fbc171f21b20c7a100e12} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=136 +2024-03-14 15:04:53.569 [DEBU] {3e63ae09a48fbc173420641939765f13} [376 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 15:04:53.597 [DEBU] {a9301220a48fbc1735206419a8641d77} [ 28 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 15:04:53.612 [DEBU] {8f40d621a48fbc173620641947892f98} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 15:04:53.636 [DEBU] {785aa522a48fbc1737206419073d66a9} [ 24 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 15:04:53.649 [DEBU] {b4bb1924a48fbc173820641952584119} [ 12 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 15:04:53.675 [DEBU] {466ddb24a48fbc17392064195b5c029c} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:04:53.698 [DEBU] {44ea6126a48fbc173a206419439310c3} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 15:04:53.722 [DEBU] {6642c827a48fbc173b2064192a38053e} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 15:04:53.745 [DEBU] {d2203829a48fbc173c206419270cabea} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 15:04:53.768 [DEBU] {d81f972aa48fbc173d2064197e35145f} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=112 +2024-03-14 15:04:53.790 [DEBU] {e315ed2ba48fbc173e206419213d0c28} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=113 +2024-03-14 15:04:53.816 [DEBU] {b56c3f2da48fbc173f2064197e2beb86} [ 26 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 15:04:53.839 [DEBU] {ca2ad22ea48fbc17402064194fa2b677} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=114 +2024-03-14 15:04:53.860 [DEBU] {0a9b2830a48fbc1741206419d385d357} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=115 +2024-03-14 15:04:53.888 [DEBU] {97617731a48fbc17422064196a78f454} [ 27 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 15:04:53.911 [DEBU] {65602333a48fbc1743206419fe300d93} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=116 +2024-03-14 15:04:53.933 [DEBU] {99237534a48fbc17442064193329a43a} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=117 +2024-03-14 15:04:53.958 [DEBU] {eacbcc35a48fbc174520641996ea6eb2} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=118 +2024-03-14 15:04:53.982 [DEBU] {be064837a48fbc1746206419d37b223e} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=119 +2024-03-14 15:04:54.003 [DEBU] {5f3aae38a48fbc17472064196556ccba} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=120 +2024-03-14 15:04:54.029 [DEBU] {f67ef339a48fbc17482064198e6561d7} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=121 +2024-03-14 15:04:54.052 [DEBU] {b6547f3ba48fbc174920641941108978} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=122 +2024-03-14 15:04:54.074 [DEBU] {9c6be53ca48fbc174a206419deb5ba40} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=123 +2024-03-14 15:04:54.096 [DEBU] {7da7373ea48fbc174b206419cde09a8e} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=124 +2024-03-14 15:04:54.119 [DEBU] {f2aa873fa48fbc174c206419ff8a8ccf} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=125 +2024-03-14 15:04:54.147 [DEBU] {f0a6e340a48fbc174d206419ee7049e5} [ 27 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 15:04:54.170 [DEBU] {f4b68d42a48fbc174e206419a994a0dc} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=126 +2024-03-14 15:04:54.192 [DEBU] {e323e643a48fbc174f206419a919ac1f} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=127 +2024-03-14 15:04:54.214 [DEBU] {72853345a48fbc1750206419682e59ff} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=128 +2024-03-14 15:04:54.237 [DEBU] {c56e8946a48fbc1751206419d28be459} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=129 +2024-03-14 15:04:54.260 [DEBU] {0bcbe247a48fbc175220641919146feb} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=130 +2024-03-14 15:04:54.285 [DEBU] {66f74849a48fbc17532064190c8eea50} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=131 +2024-03-14 15:04:54.315 [DEBU] {a12e184ba48fbc175420641932285139} [ 24 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 15:04:54.337 [DEBU] {33878c4ca48fbc1755206419e4e956ea} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=132 +2024-03-14 15:04:54.360 [DEBU] {8ca9e34da48fbc17562064197e6e89e9} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=133 +2024-03-14 15:04:54.383 [DEBU] {bc95404fa48fbc17572064199c141617} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=134 +2024-03-14 15:04:54.405 [DEBU] {ccda9750a48fbc17582064198aee876e} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=135 +2024-03-14 15:04:54.427 [DEBU] {b826e951a48fbc17592064192b5eea47} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=136 +2024-03-14 15:06:48.080 [DEBU] {45eb53b2be8fbc17f5b7646064e4b865} [388 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 15:06:48.104 [DEBU] {86be84c9be8fbc17f6b76460d37995df} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 15:06:48.117 [DEBU] {01dbf4cabe8fbc17f7b76460ae592e90} [ 12 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 15:06:48.139 [DEBU] {004cadcbbe8fbc17f8b76460872be592} [ 22 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 15:06:48.152 [DEBU] {22b6fbccbe8fbc17f9b76460497e5acc} [ 13 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 15:06:48.173 [DEBU] {c71ac8cdbe8fbc17fab764607ab34241} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:06:48.193 [DEBU] {67e008cfbe8fbc17fbb764600fca705b} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 15:06:48.214 [DEBU] {ac3b3dd0be8fbc17fcb76460d6cfa8f6} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 15:06:48.237 [DEBU] {d4067bd1be8fbc17fdb7646015d07857} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 15:06:48.260 [DEBU] {b6edd1d2be8fbc17feb76460af9ded17} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=112 +2024-03-14 15:06:48.285 [DEBU] {0c9a3bd4be8fbc17ffb76460467b4536} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=113 +2024-03-14 15:06:48.306 [DEBU] {6bd0aed5be8fbc1700b864602acac9ef} [ 21 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 15:06:48.327 [DEBU] {5181f9d6be8fbc1701b8646097d7a909} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=114 +2024-03-14 15:06:48.349 [DEBU] {d0313dd8be8fbc1702b864609f18b75c} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=115 +2024-03-14 15:06:48.373 [DEBU] {c5d088d9be8fbc1703b86460a87d4da4} [ 23 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 15:06:48.394 [DEBU] {c4a1f6dabe8fbc1704b864601225baef} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=116 +2024-03-14 15:06:48.415 [DEBU] {30b936dcbe8fbc1705b864606cd4d7e0} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=117 +2024-03-14 15:06:48.436 [DEBU] {8ba27addbe8fbc1706b8646052d92e9c} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=118 +2024-03-14 15:06:48.466 [DEBU] {990cb4debe8fbc1707b86460d37c687a} [ 30 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=119 +2024-03-14 15:06:48.488 [DEBU] {634377e0be8fbc1708b864601938d1ec} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=120 +2024-03-14 15:06:48.509 [DEBU] {5902cfe1be8fbc1709b86460c83e11f6} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=121 +2024-03-14 15:06:48.530 [DEBU] {117b0ce3be8fbc170ab864601c2943bb} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=122 +2024-03-14 15:06:48.551 [DEBU] {f38047e4be8fbc170bb86460425615d0} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=123 +2024-03-14 15:06:48.574 [DEBU] {dc3e87e5be8fbc170cb8646050272e78} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=124 +2024-03-14 15:06:48.594 [DEBU] {2f2ce6e6be8fbc170db864606d24f6bb} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=125 +2024-03-14 15:06:48.616 [DEBU] {353c1ee8be8fbc170eb86460510f7ec3} [ 22 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 15:06:48.636 [DEBU] {52dc6fe9be8fbc170fb864600f01efb3} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=126 +2024-03-14 15:06:48.659 [DEBU] {4985a4eabe8fbc1710b86460e930a7ab} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=127 +2024-03-14 15:06:48.681 [DEBU] {7316feebbe8fbc1711b864609dc7f251} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=128 +2024-03-14 15:06:48.702 [DEBU] {43a747edbe8fbc1712b86460ef8860eb} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=129 +2024-03-14 15:06:48.723 [DEBU] {428689eebe8fbc1713b864602e6e8d7c} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=130 +2024-03-14 15:06:48.743 [DEBU] {05dac9efbe8fbc1714b8646039b46d49} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=131 +2024-03-14 15:06:48.767 [DEBU] {616e09f1be8fbc1715b86460578a5046} [ 23 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 15:06:48.793 [DEBU] {7fff86f2be8fbc1716b86460703136bc} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=132 +2024-03-14 15:06:48.814 [DEBU] {20ba00f4be8fbc1717b864606e6af2e5} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=133 +2024-03-14 15:06:48.835 [DEBU] {839939f5be8fbc1718b86460f0b3b945} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=134 +2024-03-14 15:06:48.859 [DEBU] {01f574f6be8fbc1719b86460b3baa7e9} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=135 +2024-03-14 15:06:48.881 [DEBU] {4015eef7be8fbc171ab86460acad0afc} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=136 +2024-03-14 15:06:55.830 [DEBU] {c1361b82c08fbc17d555f9132938fda2} [357 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 15:06:55.852 [DEBU] {795f6b97c08fbc17d655f913093da3d6} [ 22 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 15:06:55.865 [DEBU] {58f8c298c08fbc17d755f9139092d1b5} [ 12 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 15:06:55.887 [DEBU] {e7408899c08fbc17d855f913a515cc99} [ 21 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 15:06:55.899 [DEBU] {902fce9ac08fbc17d955f913ac341530} [ 12 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 15:06:55.919 [DEBU] {324b839bc08fbc17da55f913578bba7b} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:06:55.941 [DEBU] {a465b99cc08fbc17db55f913554935d9} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 15:06:55.961 [DEBU] {df2c039ec08fbc17dc55f913f49bc5ca} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 15:06:55.982 [DEBU] {b87d3a9fc08fbc17dd55f91306098748} [ 21 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 15:06:56.004 [DEBU] {1a817ca0c08fbc17de55f9137f38ac73} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=112 +2024-03-14 15:06:56.028 [DEBU] {dd80c2a1c08fbc17df55f9138b80ef33} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=113 +2024-03-14 15:06:56.050 [DEBU] {78213ea3c08fbc17e055f913774f9b18} [ 21 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 15:06:56.072 [DEBU] {9dbd83a4c08fbc17e155f91382202241} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=114 +2024-03-14 15:06:56.094 [DEBU] {e9e1d3a5c08fbc17e255f913bd098e85} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=115 +2024-03-14 15:06:56.115 [DEBU] {a1dd21a7c08fbc17e355f9136388dea8} [ 21 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 15:06:56.136 [DEBU] {018d71a8c08fbc17e455f9136381283a} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=116 +2024-03-14 15:06:56.156 [DEBU] {2af9a2a9c08fbc17e555f91318a4c78a} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=117 +2024-03-14 15:06:56.177 [DEBU] {62a9d9aac08fbc17e655f9137c87fad6} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=118 +2024-03-14 15:06:56.196 [DEBU] {69ff10acc08fbc17e755f9131c69bff8} [ 19 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=119 +2024-03-14 15:06:56.221 [DEBU] {55283eadc08fbc17e855f913bddacdae} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=120 +2024-03-14 15:06:56.241 [DEBU] {1644b4aec08fbc17e955f913830cafdd} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=121 +2024-03-14 15:06:56.261 [DEBU] {1e21e9afc08fbc17ea55f913721dcb9b} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=122 +2024-03-14 15:06:56.281 [DEBU] {fdc91ab1c08fbc17eb55f913ccda7feb} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=123 +2024-03-14 15:06:56.302 [DEBU] {22e550b2c08fbc17ec55f913cd3879dd} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=124 +2024-03-14 15:06:56.328 [DEBU] {29df85b3c08fbc17ed55f91315b23069} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=125 +2024-03-14 15:06:56.350 [DEBU] {726a18b5c08fbc17ee55f913d3f810dc} [ 22 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 15:06:56.371 [DEBU] {49b475b6c08fbc17ef55f9133156ed20} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=126 +2024-03-14 15:06:56.393 [DEBU] {ed2db0b7c08fbc17f055f91327ce5e20} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=127 +2024-03-14 15:06:56.415 [DEBU] {0860f8b8c08fbc17f155f913e7f27870} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=128 +2024-03-14 15:06:56.435 [DEBU] {6c0146bac08fbc17f255f913cf836c76} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=129 +2024-03-14 15:06:56.455 [DEBU] {ec5676bbc08fbc17f355f913f5947da0} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=130 +2024-03-14 15:06:56.477 [DEBU] {87fea9bcc08fbc17f455f913c78f78c3} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=131 +2024-03-14 15:06:56.498 [DEBU] {441efdbdc08fbc17f555f9130180f859} [ 21 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 15:06:56.519 [DEBU] {0e893ebfc08fbc17f655f913f09bd958} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=132 +2024-03-14 15:06:56.540 [DEBU] {f6f676c0c08fbc17f755f9135cab858c} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=133 +2024-03-14 15:06:56.564 [DEBU] {94d0b8c1c08fbc17f855f913de779ddb} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=134 +2024-03-14 15:06:56.586 [DEBU] {56b62fc3c08fbc17f955f9132b12782c} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=135 +2024-03-14 15:06:56.607 [DEBU] {4fae74c4c08fbc17fa55f9130196531d} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=136 +2024-03-14 15:07:06.136 [DEBU] {c88a3fedc28fbc1754a57b5abae096af} [276 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 15:07:06.163 [DEBU] {9c4cbdfdc28fbc1755a57b5a293ffe9b} [ 26 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 15:07:06.177 [DEBU] {a12b55ffc28fbc1756a57b5a11ef5b66} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 15:07:06.202 [DEBU] {98992100c38fbc1757a57b5a76067e71} [ 25 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 15:07:06.216 [DEBU] {29afb301c38fbc1758a57b5ac52b28a6} [ 13 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 15:07:06.239 [DEBU] {656c7c02c38fbc1759a57b5a94443e7d} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:07:19.998 [DEBU] {2f8b2628c68fbc17d953704c468acf98} [265 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 15:07:20.024 [DEBU] {dae71038c68fbc17da53704c7c6963d0} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 15:07:20.038 [DEBU] {edfc8c39c68fbc17db53704c63df5bd3} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 15:07:20.065 [DEBU] {8433593ac68fbc17dc53704cffcad27c} [ 26 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 15:07:20.079 [DEBU] {219ff63bc68fbc17dd53704cb0e81770} [ 13 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 15:07:20.102 [DEBU] {1fa9c53cc68fbc17de53704c806872aa} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:07:23.743 [DEBU] {fdc5a215c78fbc17df53704cb05e936a} [ 25 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:07:44.570 [DEBU] {1ee00fefcb8fbc17e053704cf20f0aa1} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=109) AND (`types` IS NOT NULL) LIMIT 1 +2024-03-14 15:07:44.597 [DEBU] {2b9787f0cb8fbc17e153704c2ab2f6e3} [ 27 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=109) AND (`types` IS NOT NULL) LIMIT 1 +2024-03-14 15:15:26.105 [DEBU] {b8ce33513790bc17ed33e865df888159} [352 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 15:15:26.132 [DEBU] {1a5631663790bc17ee33e865888f64c9} [ 26 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 15:15:26.146 [DEBU] {7296ca673790bc17ef33e865db7b4273} [ 14 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 15:15:26.172 [DEBU] {be839a683790bc17f033e865ea96fb47} [ 26 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 15:15:26.190 [DEBU] {a18e316a3790bc17f133e865f22f240b} [ 17 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 15:15:26.216 [DEBU] {e33d3d6b3790bc17f233e865a92ea2dc} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:16:18.444 [DEBU] {6b477c7e4390bc1721d4675e912ae467} [391 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 15:16:18.470 [DEBU] {b833f4954390bc1722d4675eaefc62e5} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 15:16:18.483 [DEBU] {e87865974390bc1723d4675e8a89bcf7} [ 12 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 15:16:18.507 [DEBU] {439628984390bc1724d4675ee82c0d84} [ 24 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 15:16:18.521 [DEBU] {a02395994390bc1725d4675e4fbc785a} [ 14 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 15:16:18.544 [DEBU] {d480639a4390bc1726d4675eb422aff4} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:16:30.385 [DEBU] {3f84885b4690bc1727d4675e73d07f9d} [ 34 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:16:43.031 [DEBU] {c27dbe4d4990bc1728d4675ec68750bb} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 15:16:44.587 [DEBU] {3b2c82aa4990bc1729d4675ed26f57d0} [ 26 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 15:16:46.905 [DEBU] {e949a5344a90bc172ad4675e4a4fda79} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 15:16:49.602 [DEBU] {cbc004c04a90bc172bd4675e5ce672a7} [385 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 15:16:53.054 [DEBU] {e93258a34b90bc172cd4675eae1a6779} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 15:16:53.078 [DEBU] {f36fc7a44b90bc172dd4675ef0d81cb2} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=112 +2024-03-14 15:16:53.103 [DEBU] {6d7528a64b90bc172ed4675e15cf171a} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=113 +2024-03-14 15:16:53.128 [DEBU] {561ba5a74b90bc172fd4675ec8b917d0} [ 25 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 15:16:53.158 [DEBU] {066e2fa94b90bc1730d4675ec81f44f4} [ 29 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=114 +2024-03-14 15:16:53.182 [DEBU] {cd74f0aa4b90bc1731d4675ea0039da8} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=115 +2024-03-14 15:16:53.206 [DEBU] {11b85cac4b90bc1732d4675eb21a1be4} [ 24 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 15:16:53.230 [DEBU] {ce89d1ad4b90bc1733d4675e5b378ca3} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=116 +2024-03-14 15:16:53.253 [DEBU] {20303faf4b90bc1734d4675e8403e9f7} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=117 +2024-03-14 15:16:53.276 [DEBU] {6b2a9fb04b90bc1735d4675ededb0cc5} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=118 +2024-03-14 15:16:53.309 [DEBU] {44ddfab14b90bc1736d4675ec33aa072} [ 33 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=119 +2024-03-14 15:16:53.332 [DEBU] {934aebb34b90bc1737d4675e7eee5075} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=120 +2024-03-14 15:16:53.358 [DEBU] {37185ab54b90bc1738d4675e04c0a8f3} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=121 +2024-03-14 15:16:53.386 [DEBU] {c1d8dcb64b90bc1739d4675e11012516} [ 28 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=122 +2024-03-14 15:16:53.409 [DEBU] {c21883b84b90bc173ad4675ea383f6f4} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=123 +2024-03-14 15:16:53.430 [DEBU] {bbe8dfb94b90bc173bd4675e1fc4ad88} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=124 +2024-03-14 15:16:53.454 [DEBU] {69c82bbb4b90bc173cd4675edb801223} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=125 +2024-03-14 15:16:53.477 [DEBU] {a19e91bc4b90bc173dd4675e0db751cd} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 15:16:53.505 [DEBU] {0116f9bd4b90bc173ed4675e85a4ea6c} [ 27 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=126 +2024-03-14 15:16:53.526 [DEBU] {f47897bf4b90bc173fd4675e5a8f8d9b} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=127 +2024-03-14 15:16:53.548 [DEBU] {90dae1c04b90bc1740d4675e0ad84477} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=128 +2024-03-14 15:16:53.570 [DEBU] {9f2632c24b90bc1741d4675eb604e0c1} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=129 +2024-03-14 15:16:53.594 [DEBU] {bc9784c34b90bc1742d4675ea76f47ff} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=130 +2024-03-14 15:16:53.616 [DEBU] {e2e5eec44b90bc1743d4675ea2f82ab4} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=131 +2024-03-14 15:16:53.640 [DEBU] {d95d3ec64b90bc1744d4675ee0c002b1} [ 24 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 15:16:53.663 [DEBU] {22d1afc74b90bc1745d4675ef04e4c82} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=132 +2024-03-14 15:16:53.685 [DEBU] {75a60ac94b90bc1746d4675e8d2c013e} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=133 +2024-03-14 15:16:53.727 [DEBU] {df4161ca4b90bc1747d4675eafc17ec0} [ 41 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=134 +2024-03-14 15:16:53.749 [DEBU] {0de0d5cc4b90bc1748d4675e772efe71} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=135 +2024-03-14 15:16:53.772 [DEBU] {99752ace4b90bc1749d4675e6a3504e1} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=136 +2024-03-14 15:17:05.546 [DEBU] {6110c78b4e90bc174ad4675e0135cdca} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=109) AND (`types` IS NOT NULL) LIMIT 1 +2024-03-14 15:17:05.579 [DEBU] {ad2b578d4e90bc174bd4675e1206f46e} [ 32 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=109) AND (`types` IS NOT NULL) LIMIT 1 +2024-03-14 15:17:05.603 [DEBU] {f86a508f4e90bc174cd4675e17ad5527} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=110) AND (`types` IS NOT NULL) LIMIT 1 +2024-03-14 15:17:05.626 [DEBU] {3103c1904e90bc174dd4675e26e3471c} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=110) AND (`types` IS NOT NULL) LIMIT 1 +2024-03-14 15:17:05.649 [DEBU] {d1e41c924e90bc174ed4675e9cae2380} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=111) AND (`types` IS NOT NULL) LIMIT 1 +2024-03-14 15:17:05.673 [DEBU] {9a1d72934e90bc174fd4675e8b29aa8e} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=111) AND (`types` IS NOT NULL) LIMIT 1 +2024-03-14 15:18:13.269 [DEBU] {ef4333415e90bc17dcff95574c671725} [280 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 15:18:13.294 [DEBU] {ac6df3515e90bc17ddff95573357f21c} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 15:18:13.308 [DEBU] {d3ad7a535e90bc17deff955713d05993} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 15:18:13.330 [DEBU] {685c40545e90bc17dfff95570472348c} [ 22 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 15:18:13.343 [DEBU] {641e98555e90bc17e0ff95570d232208} [ 12 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 15:18:13.364 [DEBU] {4b1850565e90bc17e1ff95571b41ea56} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:18:13.385 [DEBU] {adb596575e90bc17e2ff955785b0b6f1} [ 21 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:18:13.408 [DEBU] {9231df585e90bc17e3ff95578e767c2f} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 15:18:13.431 [DEBU] {43a0335a5e90bc17e4ff9557638e190e} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 15:18:13.456 [DEBU] {e95c915b5e90bc17e5ff9557ea5b1f77} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 15:18:13.488 [DEBU] {b41a145d5e90bc17e6ff95577f17a82a} [ 32 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 15:18:13.510 [DEBU] {887cff5e5e90bc17e7ff95572625386b} [ 21 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 15:18:13.531 [DEBU] {3ed04c605e90bc17e8ff95576f706e78} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=112 +2024-03-14 15:18:13.552 [DEBU] {65758c615e90bc17e9ff95573173094d} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=113 +2024-03-14 15:18:13.573 [DEBU] {6f71c7625e90bc17eaff9557b7080bd8} [ 21 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 15:18:13.594 [DEBU] {0c8b0d645e90bc17ebff95579dc24279} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=114 +2024-03-14 15:18:13.614 [DEBU] {d8b746655e90bc17ecff95575df6ddba} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=115 +2024-03-14 15:18:13.638 [DEBU] {1b2386665e90bc17edff9557720646bb} [ 23 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 15:18:13.661 [DEBU] {2d9012685e90bc17eeff9557fb72d6ad} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=116 +2024-03-14 15:18:13.682 [DEBU] {7d7f4b695e90bc17efff95574a4ab561} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=117 +2024-03-14 15:18:13.703 [DEBU] {491b896a5e90bc17f0ff95573e0c2ba7} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=118 +2024-03-14 15:18:13.726 [DEBU] {6d3dcb6b5e90bc17f1ff9557fd7772d7} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=119 +2024-03-14 15:18:13.747 [DEBU] {fdd1306d5e90bc17f2ff9557ee95bdeb} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=120 +2024-03-14 15:18:13.768 [DEBU] {29726c6e5e90bc17f3ff95576974c36b} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=121 +2024-03-14 15:18:13.788 [DEBU] {9361ad6f5e90bc17f4ff95578d49c7b7} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=122 +2024-03-14 15:18:13.810 [DEBU] {be8cdc705e90bc17f5ff955771746a4d} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=123 +2024-03-14 15:18:13.831 [DEBU] {7f292e725e90bc17f6ff955759f128d2} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=124 +2024-03-14 15:18:13.851 [DEBU] {62d864735e90bc17f7ff95578780af66} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=125 +2024-03-14 15:18:13.873 [DEBU] {119ba0745e90bc17f8ff9557660e87ed} [ 22 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 15:18:13.895 [DEBU] {f9a9f4755e90bc17f9ff9557c377ad36} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=126 +2024-03-14 15:18:13.917 [DEBU] {7fc840775e90bc17faff95579fb6258e} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=127 +2024-03-14 15:18:13.954 [DEBU] {b33e8e785e90bc17fbff9557b385f531} [ 37 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=128 +2024-03-14 15:18:13.977 [DEBU] {7d1cc27a5e90bc17fcff9557beddb0fa} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=129 +2024-03-14 15:18:13.999 [DEBU] {d790197c5e90bc17fdff95577d27fa66} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=130 +2024-03-14 15:18:14.023 [DEBU] {65f2737d5e90bc17feff955729b6964f} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=131 +2024-03-14 15:18:14.047 [DEBU] {505ade7e5e90bc17ffff9557292984b1} [ 24 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 15:18:14.068 [DEBU] {01694d805e90bc1700009657f7cdbd59} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=132 +2024-03-14 15:18:14.090 [DEBU] {ff7d8b815e90bc17010096574f63d34e} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=133 +2024-03-14 15:18:14.110 [DEBU] {dac3d4825e90bc1702009657090e0ae0} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=134 +2024-03-14 15:18:14.131 [DEBU] {dec010845e90bc170300965788b2109b} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=135 +2024-03-14 15:18:14.154 [DEBU] {b3af53855e90bc1704009657b8245fda} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=136 +2024-03-14 15:18:54.754 [DEBU] {24ff70e56790bc17f9895c46cc13d673} [355 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 15:18:54.785 [DEBU] {b2eccdfa6790bc17fa895c460214f88a} [ 28 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 15:18:54.798 [DEBU] {1b5583fc6790bc17fb895c462a7e4aa2} [ 12 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 15:18:54.828 [DEBU] {c5ad46fd6790bc17fc895c4659e24340} [ 29 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 15:18:54.841 [DEBU] {7ca810ff6790bc17fd895c465029bea5} [ 12 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 15:18:54.864 [DEBU] {ccb0cbff6790bc17fe895c46426872da} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:18:54.886 [DEBU] {dd1432016890bc17ff895c462b3449a0} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:18:54.909 [DEBU] {6f3b80026890bc17008a5c46b87e632a} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 15:18:54.934 [DEBU] {ebe8e1036890bc17018a5c463b8b99ea} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 15:18:54.958 [DEBU] {17c258056890bc17028a5c46bafd1c4e} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 15:18:54.981 [DEBU] {f1f1ce066890bc17038a5c46da94b731} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 15:18:55.003 [DEBU] {c80f29086890bc17048a5c46de4c47af} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 15:18:55.026 [DEBU] {11ec80096890bc17058a5c46e94de719} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=112 +2024-03-14 15:18:55.047 [DEBU] {97e4ce0a6890bc17068a5c46cddb825d} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=113 +2024-03-14 15:18:55.069 [DEBU] {1f671d0c6890bc17078a5c461c189f36} [ 21 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 15:18:55.096 [DEBU] {1e40690d6890bc17088a5c46d6c8db9a} [ 27 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=114 +2024-03-14 15:18:55.120 [DEBU] {0fe3ff0e6890bc17098a5c46de644f4f} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=115 +2024-03-14 15:18:55.149 [DEBU] {9f776d106890bc170a8a5c4670deec2d} [ 29 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 15:18:55.172 [DEBU] {7f9c34126890bc170b8a5c466b1f0531} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=116 +2024-03-14 15:18:55.194 [DEBU] {1bc985136890bc170c8a5c468e11bc3b} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=117 +2024-03-14 15:18:55.216 [DEBU] {5875e0146890bc170d8a5c46a5d53108} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=118 +2024-03-14 15:18:55.239 [DEBU] {8fe62c166890bc170e8a5c460c9efd8f} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=119 +2024-03-14 15:18:55.262 [DEBU] {d64d88176890bc170f8a5c46cf0d668f} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=120 +2024-03-14 15:18:55.285 [DEBU] {1b31e6186890bc17108a5c4619e343dd} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=121 +2024-03-14 15:18:55.310 [DEBU] {56064b1a6890bc17118a5c46d0906700} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=122 +2024-03-14 15:18:55.332 [DEBU] {0b11c91b6890bc17128a5c46af4a7c28} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=123 +2024-03-14 15:18:55.353 [DEBU] {ed83101d6890bc17138a5c46a6f4a2d1} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=124 +2024-03-14 15:18:55.376 [DEBU] {e068571e6890bc17148a5c46c0d84ce1} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=125 +2024-03-14 15:18:55.399 [DEBU] {d34eb71f6890bc17158a5c462dfb1ff8} [ 22 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 15:18:55.423 [DEBU] {823526216890bc17168a5c469214afb5} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=126 +2024-03-14 15:18:55.444 [DEBU] {21747f226890bc17178a5c46627dc313} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=127 +2024-03-14 15:18:55.466 [DEBU] {68d4c7236890bc17188a5c465fe490fc} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=128 +2024-03-14 15:18:55.491 [DEBU] {ff900f256890bc17198a5c46cb10a855} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=129 +2024-03-14 15:18:55.514 [DEBU] {98cb85266890bc171a8a5c46d5126499} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=130 +2024-03-14 15:18:55.536 [DEBU] {3b94eb276890bc171b8a5c46dad72021} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=131 +2024-03-14 15:18:55.566 [DEBU] {177c3c296890bc171c8a5c4692e22410} [ 30 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 15:18:55.603 [DEBU] {3db10c2b6890bc171d8a5c4603055a5b} [ 36 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=132 +2024-03-14 15:18:55.626 [DEBU] {4ffa332d6890bc171e8a5c461c4b6630} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=133 +2024-03-14 15:18:55.648 [DEBU] {e1149a2e6890bc171f8a5c466a063fae} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=134 +2024-03-14 15:18:55.671 [DEBU] {5a17ed2f6890bc17208a5c469aac28bd} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=135 +2024-03-14 15:18:55.695 [DEBU] {719949316890bc17218a5c463408c025} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=136 +2024-03-14 15:20:42.802 [DEBU] {b217e90d8190bc1715d4d54fbe24c967} [350 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 15:20:42.825 [DEBU] {ad59ce228190bc1716d4d54f39465daa} [ 22 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 15:20:42.850 [DEBU] {3fb05d248190bc1717d4d54fa0588293} [ 21 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 15:20:42.872 [DEBU] {c40baa258190bc1718d4d54f15111944} [ 21 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 15:20:42.885 [DEBU] {7c24fb268190bc1719d4d54f7d4cc887} [ 12 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 15:20:42.906 [DEBU] {ad31b7278190bc171ad4d54f8b261cdd} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:20:42.928 [DEBU] {3f2bfd288190bc171bd4d54f8de8dd2f} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:20:42.952 [DEBU] {1ff74e2a8190bc171cd4d54f13970802} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 15:20:42.973 [DEBU] {7df8b32b8190bc171dd4d54f7639b15a} [ 21 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 15:20:42.996 [DEBU] {8145002d8190bc171ed4d54f93028c00} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 15:20:43.020 [DEBU] {1b5d5e2e8190bc171fd4d54f17c8c80e} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 15:20:43.060 [DEBU] {ed0bc52f8190bc1720d4d54fd8978daa} [ 40 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 15:20:43.081 [DEBU] {a56c2c328190bc1721d4d54f074f7da8} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=112 +2024-03-14 15:20:43.107 [DEBU] {c9726c338190bc1722d4d54f91b741e5} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=113 +2024-03-14 15:20:43.129 [DEBU] {a99bfb348190bc1723d4d54f028336bb} [ 21 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 15:20:43.167 [DEBU] {c8ea4e368190bc1724d4d54f31b990ac} [ 37 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=114 +2024-03-14 15:20:43.188 [DEBU] {624c8f388190bc1725d4d54fe574e564} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=115 +2024-03-14 15:20:43.211 [DEBU] {b0a1d2398190bc1726d4d54f753e1301} [ 22 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 15:20:43.232 [DEBU] {76f2343b8190bc1727d4d54f366e98c7} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=116 +2024-03-14 15:20:43.259 [DEBU] {55816e3c8190bc1728d4d54f6b50df9b} [ 27 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=117 +2024-03-14 15:20:43.280 [DEBU] {5488043e8190bc1729d4d54f5f2ed029} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=118 +2024-03-14 15:20:43.310 [DEBU] {af52473f8190bc172ad4d54f1ab872ca} [ 30 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=119 +2024-03-14 15:20:43.332 [DEBU] {02440a418190bc172bd4d54fe77ac4fc} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=120 +2024-03-14 15:20:43.359 [DEBU] {98f15a428190bc172cd4d54ff86cca57} [ 27 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=121 +2024-03-14 15:20:43.382 [DEBU] {0d7ffd438190bc172dd4d54fe99ad40b} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=122 +2024-03-14 15:20:43.402 [DEBU] {28d654458190bc172ed4d54f185da900} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=123 +2024-03-14 15:20:43.426 [DEBU] {e85392468190bc172fd4d54f3b5a83cb} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=124 +2024-03-14 15:20:43.447 [DEBU] {b088f4478190bc1730d4d54ffb05dbe9} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=125 +2024-03-14 15:20:43.486 [DEBU] {fde147498190bc1731d4d54f09485853} [ 38 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 15:20:43.507 [DEBU] {d867914b8190bc1732d4d54f73680155} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=126 +2024-03-14 15:20:43.529 [DEBU] {1357cd4c8190bc1733d4d54fd7936c32} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=127 +2024-03-14 15:20:43.550 [DEBU] {1410254e8190bc1734d4d54f782f5fc9} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=128 +2024-03-14 15:20:43.574 [DEBU] {0755624f8190bc1735d4d54f3f9b40e4} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=129 +2024-03-14 15:20:43.596 [DEBU] {2116d3508190bc1736d4d54f4526e829} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=130 +2024-03-14 15:20:43.618 [DEBU] {067e1d528190bc1737d4d54fab632e43} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=131 +2024-03-14 15:20:43.643 [DEBU] {a2e770538190bc1738d4d54f7bf94990} [ 24 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 15:20:43.668 [DEBU] {e240f3548190bc1739d4d54f24b79346} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=132 +2024-03-14 15:20:43.689 [DEBU] {bcc16a568190bc173ad4d54ff81bc387} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=133 +2024-03-14 15:20:43.713 [DEBU] {e9e3ac578190bc173bd4d54fb892ffd8} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=134 +2024-03-14 15:20:43.735 [DEBU] {52141a598190bc173cd4d54f7576176b} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=135 +2024-03-14 15:20:43.757 [DEBU] {bcb2635a8190bc173dd4d54f28f327fc} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=136 +2024-03-14 15:23:52.959 [DEBU] {4e586753ad90bc17da122b12b4b753ba} [363 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 15:23:53.009 [DEBU] {1db00969ad90bc17db122b122c2e2434} [ 50 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 15:23:53.026 [DEBU] {5163076cad90bc17dc122b128294af9f} [ 16 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 15:23:53.049 [DEBU] {0537016dad90bc17dd122b12385af215} [ 23 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 15:23:53.062 [DEBU] {2841696ead90bc17de122b12c5408eed} [ 12 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 15:23:53.095 [DEBU] {4fb7306fad90bc17df122b129c3073f1} [ 32 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:23:53.118 [DEBU] {2f562771ad90bc17e0122b12d2dfc301} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:23:53.139 [DEBU] {89ee8872ad90bc17e1122b1249390282} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 15:23:53.162 [DEBU] {541dc873ad90bc17e2122b12bef0f33c} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 15:23:53.183 [DEBU] {4dfe1c75ad90bc17e3122b12574b128b} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 15:23:53.205 [DEBU] {40156976ad90bc17e4122b128609d62d} [ 21 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 15:23:53.228 [DEBU] {845baf77ad90bc17e5122b129dcd1da9} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 15:23:53.249 [DEBU] {2da90d79ad90bc17e6122b1275091bc6} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=112 +2024-03-14 15:23:53.273 [DEBU] {10544f7aad90bc17e7122b120743f720} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=113 +2024-03-14 15:23:53.295 [DEBU] {bed5c07bad90bc17e8122b1294b43a13} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 15:23:53.321 [DEBU] {404b177dad90bc17e9122b129f381157} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=114 +2024-03-14 15:23:53.343 [DEBU] {c7d5a17ead90bc17ea122b12b5a1371f} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=115 +2024-03-14 15:23:53.371 [DEBU] {6c6ef47fad90bc17eb122b121d1d8fa0} [ 27 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 15:23:53.395 [DEBU] {839bb581ad90bc17ec122b1219fa6a41} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=116 +2024-03-14 15:23:53.418 [DEBU] {f9b70983ad90bc17ed122b12cca5d1d2} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=117 +2024-03-14 15:23:53.440 [DEBU] {7d886884ad90bc17ee122b123ca3f063} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=118 +2024-03-14 15:23:53.461 [DEBU] {67d7b085ad90bc17ef122b12e81f3a1d} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=119 +2024-03-14 15:23:53.485 [DEBU] {44cff186ad90bc17f0122b129f8311e3} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=120 +2024-03-14 15:23:53.510 [DEBU] {d0f66488ad90bc17f1122b1228461910} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=121 +2024-03-14 15:23:53.531 [DEBU] {7218e189ad90bc17f2122b12671c36e8} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=122 +2024-03-14 15:23:53.552 [DEBU] {eca01f8bad90bc17f3122b124f299d79} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=123 +2024-03-14 15:23:53.573 [DEBU] {056e5c8cad90bc17f4122b127d8dfcba} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=124 +2024-03-14 15:23:53.594 [DEBU] {d0329d8dad90bc17f5122b12a2f6edaa} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=125 +2024-03-14 15:23:53.617 [DEBU] {e1cce78ead90bc17f6122b124f608209} [ 22 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 15:23:53.640 [DEBU] {fee24790ad90bc17f7122b1244f5f296} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=126 +2024-03-14 15:23:53.661 [DEBU] {7f0c9a91ad90bc17f8122b1287db04d4} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=127 +2024-03-14 15:23:53.682 [DEBU] {84bedb92ad90bc17f9122b1294618e78} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=128 +2024-03-14 15:23:53.705 [DEBU] {44ea1794ad90bc17fa122b128e775c1c} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=129 +2024-03-14 15:23:53.727 [DEBU] {e3a07d95ad90bc17fb122b12f996240f} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=130 +2024-03-14 15:23:53.748 [DEBU] {ba7cd296ad90bc17fc122b122c00b21f} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=131 +2024-03-14 15:23:53.773 [DEBU] {33de1198ad90bc17fd122b123671aff9} [ 25 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 15:23:53.794 [DEBU] {7ad18e99ad90bc17fe122b1293d5d38d} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=132 +2024-03-14 15:23:53.818 [DEBU] {8d22ca9aad90bc17ff122b128aebfdfa} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=133 +2024-03-14 15:23:53.842 [DEBU] {c71e379cad90bc1700132b12e59d2005} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=134 +2024-03-14 15:23:53.864 [DEBU] {ad09af9dad90bc1701132b125ab40352} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=135 +2024-03-14 15:23:53.885 [DEBU] {8e27f09ead90bc1702132b123af802c4} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=136 +2024-03-14 15:35:09.189 [DEBU] {8ac55dc44a91bc174cbb145db3477955} [387 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 15:35:09.215 [DEBU] {394981db4a91bc174dbb145d06a5d10e} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 15:35:09.229 [DEBU] {bcae0bdd4a91bc174ebb145df05c7071} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 15:35:09.256 [DEBU] {3543d9dd4a91bc174fbb145d1dfa64be} [ 27 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 15:35:09.276 [DEBU] {d0047bdf4a91bc1750bb145d8b11572e} [ 20 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 15:35:09.303 [DEBU] {a75caae04a91bc1751bb145d761f15ea} [ 27 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:35:09.327 [DEBU] {32f145e24a91bc1752bb145d6c488a45} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:35:09.349 [DEBU] {83c5b3e34a91bc1753bb145df83d9838} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 15:35:09.373 [DEBU] {58e608e54a91bc1754bb145d72e22cf5} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 15:35:09.395 [DEBU] {a3936fe64a91bc1755bb145d14ad8b5a} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 15:35:09.419 [DEBU] {7bf7c8e74a91bc1756bb145d4f448292} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 15:35:09.445 [DEBU] {c61f31e94a91bc1757bb145dde8f4756} [ 26 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 15:35:09.469 [DEBU] {a087c0ea4a91bc1758bb145d872a5c94} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=112 +2024-03-14 15:35:09.492 [DEBU] {c25e29ec4a91bc1759bb145d3cf0d3d6} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=113 +2024-03-14 15:35:09.517 [DEBU] {684992ed4a91bc175abb145d706379fe} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 15:35:09.540 [DEBU] {fa380aef4a91bc175bbb145dcd5dec18} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=114 +2024-03-14 15:35:09.564 [DEBU] {7aba69f04a91bc175cbb145d4fc09d27} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=115 +2024-03-14 15:35:09.588 [DEBU] {c425d4f14a91bc175dbb145d9ca40b80} [ 24 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 15:35:09.618 [DEBU] {d55356f34a91bc175ebb145d322f4ad8} [ 28 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=116 +2024-03-14 15:35:09.644 [DEBU] {950f09f54a91bc175fbb145df36cad87} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=117 +2024-03-14 15:35:09.670 [DEBU] {e9eb9df64a91bc1760bb145d90fc802e} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=118 +2024-03-14 15:35:09.708 [DEBU] {f42b27f84a91bc1761bb145d231d15ce} [ 38 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=119 +2024-03-14 15:35:09.731 [DEBU] {3b5762fa4a91bc1762bb145d34bfe7c1} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=120 +2024-03-14 15:35:09.758 [DEBU] {6850cbfb4a91bc1763bb145de913dd08} [ 27 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=121 +2024-03-14 15:35:09.781 [DEBU] {c83367fd4a91bc1764bb145d0a255c53} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=122 +2024-03-14 15:35:09.804 [DEBU] {7a70cafe4a91bc1765bb145dfc5a0be1} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=123 +2024-03-14 15:35:09.828 [DEBU] {57d727004b91bc1766bb145d61055187} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=124 +2024-03-14 15:35:09.851 [DEBU] {d6198f014b91bc1767bb145d5e6ba590} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=125 +2024-03-14 15:35:09.876 [DEBU] {843cec024b91bc1768bb145dd3c3a1bd} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 15:35:09.900 [DEBU] {8d2c72044b91bc1769bb145dde983801} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=126 +2024-03-14 15:35:09.925 [DEBU] {efd4de054b91bc176abb145d16eeb624} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=127 +2024-03-14 15:35:09.951 [DEBU] {05835b074b91bc176bbb145d13965247} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=128 +2024-03-14 15:35:09.978 [DEBU] {7b40dd084b91bc176cbb145df82eaa07} [ 27 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=129 +2024-03-14 15:35:10.001 [DEBU] {b194840a4b91bc176dbb145d2a556a16} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=130 +2024-03-14 15:35:10.022 [DEBU] {5966dc0b4b91bc176ebb145de88b37b4} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=131 +2024-03-14 15:35:10.045 [DEBU] {504f1c0d4b91bc176fbb145d9ed16e9c} [ 22 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 15:35:10.067 [DEBU] {16257c0e4b91bc1770bb145d99263e94} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=132 +2024-03-14 15:35:10.094 [DEBU] {913bd20f4b91bc1771bb145d087480ea} [ 27 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=133 +2024-03-14 15:35:10.122 [DEBU] {64116b114b91bc1772bb145d3dbbe33c} [ 28 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=134 +2024-03-14 15:35:10.146 [DEBU] {56f514134b91bc1773bb145d7c23521e} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=135 +2024-03-14 15:35:10.168 [DEBU] {f6267f144b91bc1774bb145d63f4b33e} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=136 +2024-03-14 15:39:28.370 [DEBU] {8fb00b1e8791bc178c4d3c3d448751e6} [366 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 15:39:28.395 [DEBU] {9317e4338791bc178d4d3c3da4dcb3d1} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 15:39:28.409 [DEBU] {3ea35d358791bc178e4d3c3d0b22b2a0} [ 14 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 15:39:28.438 [DEBU] {791734368791bc178f4d3c3d91912847} [ 29 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 15:39:28.452 [DEBU] {c98fef378791bc17904d3c3d8a6542db} [ 14 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 15:39:28.479 [DEBU] {1f30ba388791bc17914d3c3d504e67c6} [ 27 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:39:28.508 [DEBU] {d4de623a8791bc17924d3c3dcba47afb} [ 27 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:39:28.531 [DEBU] {c401123c8791bc17934d3c3d395185f1} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 15:39:28.554 [DEBU] {70c3763d8791bc17944d3c3daa79f1a9} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 15:39:28.577 [DEBU] {7d1ce03e8791bc17954d3c3d76e1da95} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 15:39:28.601 [DEBU] {f9b63c408791bc17964d3c3d22b2ae03} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 15:39:28.628 [DEBU] {4c36ac418791bc17974d3c3d69ea8b7a} [ 26 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 15:39:28.651 [DEBU] {fd4f3f438791bc17984d3c3df398e5bf} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=112 +2024-03-14 15:39:28.674 [DEBU] {7d919c448791bc17994d3c3d7471e7dd} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=113 +2024-03-14 15:39:28.706 [DEBU] {8410fa458791bc179a4d3c3d9c477cad} [ 32 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 15:39:28.731 [DEBU] {bf0ee8478791bc179b4d3c3db2568eb3} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=114 +2024-03-14 15:39:28.757 [DEBU] {c96568498791bc179c4d3c3d06f09e0f} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=115 +2024-03-14 15:39:28.784 [DEBU] {3bf2f14a8791bc179d4d3c3defd8c4b2} [ 27 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 15:39:28.811 [DEBU] {1c98ca4c8791bc179e4d3c3dfd9db8b4} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=116 +2024-03-14 15:39:28.836 [DEBU] {a3d32b4e8791bc179f4d3c3d516ecb3b} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=117 +2024-03-14 15:39:28.861 [DEBU] {bc29ad4f8791bc17a04d3c3df53c0303} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=118 +2024-03-14 15:39:28.886 [DEBU] {88e521518791bc17a14d3c3d71a9ad85} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=119 +2024-03-14 15:39:28.922 [DEBU] {ce57a5528791bc17a24d3c3d82f6d2fa} [ 35 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=120 +2024-03-14 15:39:28.949 [DEBU] {4362cb548791bc17a34d3c3d6f29b271} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=121 +2024-03-14 15:39:28.978 [DEBU] {b3c75d568791bc17a44d3c3d8cdc63c6} [ 29 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=122 +2024-03-14 15:39:29.019 [DEBU] {92ec1c588791bc17a54d3c3d51b6da38} [ 41 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=123 +2024-03-14 15:39:29.043 [DEBU] {d009915a8791bc17a64d3c3d2461d41c} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=124 +2024-03-14 15:39:29.067 [DEBU] {f360f95b8791bc17a74d3c3de52971d5} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=125 +2024-03-14 15:39:29.091 [DEBU] {dcae675d8791bc17a84d3c3d3ebe1568} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 15:39:29.127 [DEBU] {9238dc5e8791bc17a94d3c3d30c51fe3} [ 35 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=126 +2024-03-14 15:39:29.154 [DEBU] {711efa608791bc17aa4d3c3ddc403836} [ 27 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=127 +2024-03-14 15:39:29.177 [DEBU] {cd6d9b628791bc17ab4d3c3d870fcade} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=128 +2024-03-14 15:39:29.204 [DEBU] {0593f8638791bc17ac4d3c3d44f445de} [ 27 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=129 +2024-03-14 15:39:29.228 [DEBU] {de879a658791bc17ad4d3c3dcb253710} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=130 +2024-03-14 15:39:29.252 [DEBU] {a123fd668791bc17ae4d3c3df917211b} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=131 +2024-03-14 15:39:29.277 [DEBU] {ecbc78688791bc17af4d3c3dd8ac94cb} [ 24 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 15:39:29.303 [DEBU] {5940eb698791bc17b04d3c3d2a1894c6} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=132 +2024-03-14 15:39:29.338 [DEBU] {23f9776b8791bc17b14d3c3df4a96cd1} [ 35 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=133 +2024-03-14 15:39:29.362 [DEBU] {4ae28c6d8791bc17b24d3c3d84f4ddcf} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=134 +2024-03-14 15:39:29.406 [DEBU] {cc45036f8791bc17b34d3c3dbac9c351} [ 43 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=135 +2024-03-14 15:39:29.443 [DEBU] {a77099718791bc17b44d3c3d8d1eac6a} [ 37 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=136 +2024-03-14 15:39:53.864 [DEBU] {9b24f3138d91bc17ffd6896c1e41a306} [259 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 15:39:53.889 [DEBU] {cb866a238d91bc1700d7896c16087976} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 15:39:53.903 [DEBU] {e783f7248d91bc1701d7896cad8f4506} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 15:39:53.928 [DEBU] {35d0c0258d91bc1702d7896c28227812} [ 25 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 15:39:53.941 [DEBU] {1f673d278d91bc1703d7896c9bbeb49f} [ 13 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 15:39:53.964 [DEBU] {522001288d91bc1704d7896ce7e00865} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:39:53.990 [DEBU] {4f3165298d91bc1705d7896cb17ea812} [ 26 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:39:54.014 [DEBU] {3d33eb2a8d91bc1706d7896ca440def8} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 15:39:54.038 [DEBU] {f1ad612c8d91bc1707d7896c4d520b30} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 15:39:54.061 [DEBU] {f2c6d42d8d91bc1708d7896c2f0ff966} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 15:39:54.094 [DEBU] {19c9292f8d91bc1709d7896c9a55406d} [ 33 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 15:39:54.117 [DEBU] {e7a427318d91bc170ad7896cf53d832a} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 15:39:54.140 [DEBU] {6ce387328d91bc170bd7896cbf913871} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=112 +2024-03-14 15:39:54.163 [DEBU] {03a7da338d91bc170cd7896c73ba30dd} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=113 +2024-03-14 15:39:54.196 [DEBU] {39193f358d91bc170dd7896c3c5332ea} [ 33 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 15:39:54.218 [DEBU] {d64134378d91bc170ed7896cd6d72a71} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=114 +2024-03-14 15:39:54.241 [DEBU] {b2668c388d91bc170fd7896ce1d8af8e} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=115 +2024-03-14 15:39:54.264 [DEBU] {b106e2398d91bc1710d7896cba559587} [ 23 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 15:39:54.286 [DEBU] {fec0483b8d91bc1711d7896c4b197fbb} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=116 +2024-03-14 15:39:54.309 [DEBU] {ed0d993c8d91bc1712d7896ce495694e} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=117 +2024-03-14 15:39:54.332 [DEBU] {238af53d8d91bc1713d7896cd961c21c} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=118 +2024-03-14 15:39:54.355 [DEBU] {83af563f8d91bc1714d7896c5ef7c30c} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=119 +2024-03-14 15:39:54.378 [DEBU] {4124b2408d91bc1715d7896cef27b38f} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=120 +2024-03-14 15:39:54.412 [DEBU] {c93b0f428d91bc1716d7896c373d7eff} [ 34 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=121 +2024-03-14 15:39:54.434 [DEBU] {f5be17448d91bc1717d7896ca454e94a} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=122 +2024-03-14 15:39:54.459 [DEBU] {434469458d91bc1718d7896c59fb295e} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=123 +2024-03-14 15:39:54.490 [DEBU] {1571e5468d91bc1719d7896cf70caec4} [ 31 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=124 +2024-03-14 15:39:54.513 [DEBU] {ad1cc2488d91bc171ad7896cc0420d1e} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=125 +2024-03-14 15:39:54.537 [DEBU] {10c61e4a8d91bc171bd7896c92eeb9c9} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 15:39:54.566 [DEBU] {b2aab24b8d91bc171cd7896c45ec52d5} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=126 +2024-03-14 15:39:54.592 [DEBU] {2391474d8d91bc171dd7896cd27d362f} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=127 +2024-03-14 15:39:54.615 [DEBU] {40bfd44e8d91bc171ed7896c88ec7c94} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=128 +2024-03-14 15:39:54.639 [DEBU] {39cb2d508d91bc171fd7896c65d10d97} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=129 +2024-03-14 15:39:54.664 [DEBU] {21519d518d91bc1720d7896c84cf60f5} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=130 +2024-03-14 15:39:54.689 [DEBU] {2cb418538d91bc1721d7896cfee77f30} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=131 +2024-03-14 15:39:54.720 [DEBU] {df0499548d91bc1722d7896c325f1f6f} [ 31 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 15:39:54.746 [DEBU] {206275568d91bc1723d7896cdbb47c24} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=132 +2024-03-14 15:39:54.768 [DEBU] {75adf9578d91bc1724d7896c93158088} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=133 +2024-03-14 15:39:54.791 [DEBU] {7ed14d598d91bc1725d7896c7238cc7e} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=134 +2024-03-14 15:39:54.814 [DEBU] {077dae5a8d91bc1726d7896c49b66a6c} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=135 +2024-03-14 15:39:54.836 [DEBU] {acea0d5c8d91bc1727d7896c86d161d3} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=136 +2024-03-14 15:41:22.856 [DEBU] {7d10a099a191bc179013752aa224d925} [1109 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 15:41:22.882 [DEBU] {2968cfdba191bc179113752a9f2d3785} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 15:41:22.895 [DEBU] {e98253dda191bc179213752a2495ffd9} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 15:41:22.924 [DEBU] {15e319dea191bc179313752a8f416f6d} [ 29 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 15:41:22.939 [DEBU] {e517dbdfa191bc179413752a7a9e2045} [ 14 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 15:41:22.964 [DEBU] {a919afe0a191bc179513752a9676a85a} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:41:22.987 [DEBU] {0d9730e2a191bc179613752a66a5a07b} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 15:41:23.014 [DEBU] {f4bd8de3a191bc179713752ac73e017f} [ 27 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 15:41:23.042 [DEBU] {54f737e5a191bc179813752a3fe7b2ce} [ 27 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 15:41:23.067 [DEBU] {9cfcd8e6a191bc179913752a05c494a8} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 15:41:23.094 [DEBU] {427d5ee8a191bc179a13752a1bd42ef2} [ 26 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 15:41:23.120 [DEBU] {7726f0e9a191bc179b13752ae7bf1cba} [ 26 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 15:41:23.144 [DEBU] {c13881eba191bc179c13752ac500ee21} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=112 +2024-03-14 15:41:23.167 [DEBU] {4471f1eca191bc179d13752a194ae9ee} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=113 +2024-03-14 15:41:23.190 [DEBU] {ae4059eea191bc179e13752a567f35e0} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 15:41:23.213 [DEBU] {912db5efa191bc179f13752afefa6b74} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=114 +2024-03-14 15:41:23.246 [DEBU] {d7db0df1a191bc17a013752a7b82cd90} [ 33 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=115 +2024-03-14 15:41:23.273 [DEBU] {3c7c04f3a191bc17a113752a27a22b89} [ 27 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 15:41:23.295 [DEBU] {8a6ea6f4a191bc17a213752a9c438a9e} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=116 +2024-03-14 15:41:23.318 [DEBU] {37ebf4f5a191bc17a313752a5a2a1cc9} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=117 +2024-03-14 15:41:23.353 [DEBU] {b8d549f7a191bc17a413752a10d98dce} [ 35 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=118 +2024-03-14 15:41:23.380 [DEBU] {b3a66af9a191bc17a513752accd14331} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=119 +2024-03-14 15:41:23.404 [DEBU] {0d35fcfaa191bc17a613752a20d9857a} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=120 +2024-03-14 15:41:23.439 [DEBU] {191468fca191bc17a713752af2ff6945} [ 35 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=121 +2024-03-14 15:41:23.462 [DEBU] {2a2f87fea191bc17a813752a514c1d71} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=122 +2024-03-14 15:41:23.484 [DEBU] {7c6dddffa191bc17a913752ad58fb82b} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=123 +2024-03-14 15:41:23.513 [DEBU] {27df3201a291bc17aa13752af80f88ee} [ 29 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=124 +2024-03-14 15:41:23.539 [DEBU] {4ab5f002a291bc17ab13752ae0043721} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=125 +2024-03-14 15:41:23.562 [DEBU] {f3ee7304a291bc17ac13752a6085ef23} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 15:41:23.585 [DEBU] {c47ad905a291bc17ad13752a47ae05ac} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=126 +2024-03-14 15:41:23.609 [DEBU] {fbf13107a291bc17ae13752a3ce5c0fb} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=127 +2024-03-14 15:41:23.633 [DEBU] {2779a108a291bc17af13752a47238131} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=128 +2024-03-14 15:41:23.655 [DEBU] {e825140aa291bc17b013752acf328e0d} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=129 +2024-03-14 15:41:23.677 [DEBU] {c448650ba291bc17b113752afe0eaef6} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=130 +2024-03-14 15:41:23.700 [DEBU] {3227b60ca291bc17b213752aeead7f04} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=131 +2024-03-14 15:41:23.732 [DEBU] {33b72e0ea291bc17b313752a4bbfc391} [ 30 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 15:41:23.755 [DEBU] {6fc70010a291bc17b413752a8ea808df} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=132 +2024-03-14 15:41:23.777 [DEBU] {a55c5311a291bc17b513752a45884ea3} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=133 +2024-03-14 15:41:23.799 [DEBU] {8d00aa12a291bc17b613752a739f0f96} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=134 +2024-03-14 15:41:23.822 [DEBU] {d007f813a291bc17b713752a20dd5f24} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=135 +2024-03-14 15:41:23.847 [DEBU] {802e5815a291bc17b813752aee1b83b8} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=136 +2024-03-14 18:47:03.381 [DEBU] {6cf3ad9fc39bbc175da26049b1170227} [388 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 18:47:03.413 [DEBU] {499de5b6c39bbc175ea26049d47ae17f} [ 30 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 18:47:03.428 [DEBU] {fa54b5b8c39bbc175fa260491713fae9} [ 15 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 18:47:03.454 [DEBU] {9d189bb9c39bbc1760a26049987eb0ae} [ 26 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 18:47:03.469 [DEBU] {b6ff29bbc39bbc1761a260490b10b017} [ 15 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 18:47:03.498 [DEBU] {d69e03bcc39bbc1762a260494334da95} [ 29 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 18:47:03.523 [DEBU] {9cb7c6bdc39bbc1763a2604927b625aa} [ 25 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 18:47:03.550 [DEBU] {261f43bfc39bbc1764a26049d67cdbfb} [ 27 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 18:47:34.896 [DEBU] {5a7c21f5ca9bbc17f91d496ca29f2fef} [404 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 18:47:34.922 [DEBU] {4746410dcb9bbc17fa1d496c0d2da1f4} [ 26 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 18:47:34.940 [DEBU] {9dcfd50ecb9bbc17fb1d496c49f8993e} [ 17 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 18:47:34.965 [DEBU] {8f56db0fcb9bbc17fc1d496cb44ef724} [ 25 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 18:47:34.980 [DEBU] {dd456511cb9bbc17fd1d496c94054d79} [ 14 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 18:47:35.010 [DEBU] {e0504112cb9bbc17fe1d496cbf9138e3} [ 30 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 18:47:35.037 [DEBU] {da1d0d14cb9bbc17ff1d496c94fec52e} [ 26 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 18:47:35.062 [DEBU] {c78fa315cb9bbc17001e496c20288237} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 18:47:35.087 [DEBU] {692c2817cb9bbc17011e496cf8c6512e} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 18:47:35.116 [DEBU] {5826a718cb9bbc17021e496caf38766a} [ 28 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 18:47:35.143 [DEBU] {525d5e1acb9bbc17031e496cbc4eb265} [ 27 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 18:47:35.173 [DEBU] {ae01041ccb9bbc17041e496c3317700f} [ 29 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 18:47:35.198 [DEBU] {4cf7c81dcb9bbc17051e496c694b3592} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=112 +2024-03-14 18:47:35.223 [DEBU] {88c4421fcb9bbc17061e496c906eb0fa} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 18:52:37.750 [DEBU] {f893ae79119cbc1771251d53a60e9efe} [387 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 18:52:37.784 [DEBU] {cc411991119cbc1772251d5370ce96e4} [ 28 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 18:52:37.800 [DEBU] {e92ece92119cbc1773251d5311a70b23} [ 15 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 18:52:37.826 [DEBU] {6fb2b693119cbc1774251d53412ba154} [ 26 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 18:52:37.840 [DEBU] {d2db5095119cbc1775251d536269f077} [ 13 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 18:52:37.871 [DEBU] {505f1e96119cbc1776251d53d5443242} [ 31 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 18:52:37.897 [DEBU] {88fef997119cbc1777251d53162c4609} [ 25 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 18:52:37.930 [DEBU] {0abf8199119cbc1778251d538e1885f4} [ 33 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 18:52:37.956 [DEBU] {afc7759b119cbc1779251d534e6cb156} [ 26 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 18:52:37.982 [DEBU] {7529ff9c119cbc177a251d53f9c26340} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 18:52:38.008 [DEBU] {da73919e119cbc177b251d53ec6ea943} [ 26 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 18:52:38.029 [DEBU] {a94c1ba0119cbc177c251d53238bdf63} [ 21 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 18:52:38.053 [DEBU] {83c866a1119cbc177d251d534cd164e6} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=112 +2024-03-14 18:52:38.075 [DEBU] {9f33cea2119cbc177e251d5384369de6} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 18:52:38.102 [DEBU] {7a4a1ca4119cbc177f251d5343076a04} [ 27 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=113 +2024-03-14 18:52:38.127 [DEBU] {df45b9a5119cbc1780251d5383531e3a} [ 25 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 18:52:38.150 [DEBU] {f88438a7119cbc1781251d53d3d744f4} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 18:52:38.177 [DEBU] {834d9ba8119cbc1782251d53b85ba700} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=114 +2024-03-14 18:52:38.202 [DEBU] {64962faa119cbc1783251d53cf02cd17} [ 25 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 18:52:38.226 [DEBU] {27e9b3ab119cbc1784251d5344730d14} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=115 +2024-03-14 18:52:38.249 [DEBU] {88f616ad119cbc1785251d5314b1ad27} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 18:52:38.273 [DEBU] {e74e81ae119cbc1786251d5356c2b34d} [ 23 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 18:52:38.298 [DEBU] {b10502b0119cbc1787251d531fef3da3} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=116 +2024-03-14 18:52:38.323 [DEBU] {182b6eb1119cbc1788251d531253b176} [ 24 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 18:52:38.345 [DEBU] {1913e4b2119cbc1789251d530fb361ed} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=117 +2024-03-14 18:52:38.372 [DEBU] {79583db4119cbc178a251d53a80f694e} [ 26 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 18:52:38.396 [DEBU] {c7ccddb5119cbc178b251d5352593390} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=118 +2024-03-14 18:52:38.420 [DEBU] {a8c23eb7119cbc178c251d534acd51f4} [ 24 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 18:52:38.445 [DEBU] {6fe9b2b8119cbc178d251d532ea44075} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=119 +2024-03-14 18:52:38.470 [DEBU] {cfd928ba119cbc178e251d53ca608982} [ 25 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 18:52:38.496 [DEBU] {3b5eacbb119cbc178f251d53f6562c4a} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=120 +2024-03-14 18:52:38.521 [DEBU] {67f139bd119cbc1790251d53b781a9a9} [ 24 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 18:52:38.544 [DEBU] {3543b2be119cbc1791251d53c306fbfa} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=121 +2024-03-14 18:52:38.568 [DEBU] {221014c0119cbc1792251d5308a3a5d5} [ 24 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 18:52:38.590 [DEBU] {463f8ac1119cbc1793251d53d1b1f5b1} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=122 +2024-03-14 18:52:38.616 [DEBU] {7190d2c2119cbc1794251d53d8aaddd7} [ 26 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 18:52:38.640 [DEBU] {b2da64c4119cbc1795251d53bfd294e3} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=123 +2024-03-14 18:52:38.665 [DEBU] {a06ccdc5119cbc1796251d53a8c22295} [ 25 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 18:52:38.694 [DEBU] {c96a49c7119cbc1797251d535729d461} [ 29 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=124 +2024-03-14 18:52:38.718 [DEBU] {fdc1fec8119cbc1798251d536ef9635b} [ 24 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 18:52:38.743 [DEBU] {5e6f7fca119cbc1799251d53ec11bcbc} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=125 +2024-03-14 18:52:38.769 [DEBU] {e369e9cb119cbc179a251d5352b88602} [ 26 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 18:52:38.795 [DEBU] {43d984cd119cbc179b251d5352ec72d4} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 18:52:38.818 [DEBU] {680305cf119cbc179c251d534e962b35} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=126 +2024-03-14 18:52:38.842 [DEBU] {a51a68d0119cbc179d251d531ee1a56f} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 18:52:38.867 [DEBU] {0512dfd1119cbc179e251d53923f54ee} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=127 +2024-03-14 18:52:38.893 [DEBU] {01b251d3119cbc179f251d532e6004cb} [ 26 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 18:52:38.916 [DEBU] {908be0d4119cbc17a0251d537207b393} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=128 +2024-03-14 18:52:38.941 [DEBU] {39f345d6119cbc17a1251d5310af3173} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 18:52:38.966 [DEBU] {607ebad7119cbc17a2251d53530bd0c1} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=129 +2024-03-14 18:52:38.990 [DEBU] {988a3ed9119cbc17a3251d531183b63f} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 18:52:39.017 [DEBU] {8c56bfda119cbc17a4251d535a0ac7d7} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=130 +2024-03-14 18:52:39.042 [DEBU] {972f4bdc119cbc17a5251d536a82dfce} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 18:52:39.065 [DEBU] {d7e9bedd119cbc17a6251d534ce26afd} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=131 +2024-03-14 18:52:39.090 [DEBU] {3d5824df119cbc17a7251d530cbf6507} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 18:52:39.116 [DEBU] {8864a5e0119cbc17a8251d5388f51ffd} [ 25 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 18:52:39.141 [DEBU] {f44829e2119cbc17a9251d53b9c95f16} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=132 +2024-03-14 18:52:39.165 [DEBU] {7451a0e3119cbc17aa251d53a6468df4} [ 24 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 18:52:39.189 [DEBU] {e18e16e5119cbc17ab251d536281800a} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=133 +2024-03-14 18:52:39.214 [DEBU] {0bca7ee6119cbc17ac251d534300023b} [ 25 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 18:52:39.237 [DEBU] {62f305e8119cbc17ad251d53e1eb4588} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=134 +2024-03-14 18:52:39.262 [DEBU] {f9f661e9119cbc17ae251d53e124b3ef} [ 25 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 18:52:39.287 [DEBU] {ca6ae6ea119cbc17af251d5329a53149} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=135 +2024-03-14 18:52:39.313 [DEBU] {4d475dec119cbc17b0251d530d4561c0} [ 26 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 18:52:39.336 [DEBU] {a7b2efed119cbc17b1251d538a4bea94} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=136 +2024-03-14 18:52:39.361 [DEBU] {ea6b45ef119cbc17b2251d53ee700eb9} [ 25 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 18:52:42.823 [DEBU] {5f97f8ab129cbc1784ae3268bca5907d} [320 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 18:52:42.849 [DEBU] {62d127bf129cbc1785ae3268d0dab51e} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 18:52:42.863 [DEBU] {6e71aec0129cbc1786ae326863bee0e0} [ 14 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 18:52:42.888 [DEBU] {4eb882c1129cbc1787ae3268ef37b032} [ 25 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 18:52:42.902 [DEBU] {6b0301c3129cbc1788ae3268c074099a} [ 14 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 18:52:42.927 [DEBU] {b5e6d4c3129cbc1789ae326874535a55} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 18:52:42.951 [DEBU] {6b254bc5129cbc178aae32686e319e2c} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=109 +2024-03-14 18:52:42.976 [DEBU] {4ae1bcc6129cbc178bae32688d33a565} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 18:52:43.001 [DEBU] {057340c8129cbc178cae32684438ecf7} [ 25 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=110 +2024-03-14 18:52:43.027 [DEBU] {2297b9c9129cbc178dae3268e0402a4b} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 18:52:43.052 [DEBU] {072b4dcb129cbc178eae3268def78f67} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `parent_id`=111 +2024-03-14 18:52:43.078 [DEBU] {e339c8cc129cbc178fae32682d50b538} [ 26 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 18:52:43.105 [DEBU] {15975ace129cbc1790ae3268922af8fa} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=112 +2024-03-14 18:53:05.821 [DEBU] {1d0ec517189cbc1791ae32681ae42baa} [ 36 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 18:54:50.625 [DEBU] {862a096c309cbc1792ae32685764d994} [347 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=113 +2024-03-14 18:54:52.942 [DEBU] {69bf3809319cbc1793ae32685febe1f0} [ 27 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 18:54:52.972 [DEBU] {40b7df0a319cbc1794ae326817a15a90} [ 29 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 18:54:53.016 [DEBU] {a3a5990c319cbc1795ae32688e82cdf2} [ 44 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=114 +2024-03-14 18:54:53.042 [DEBU] {73d23c0f319cbc1796ae32682cc72dba} [ 26 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 18:54:53.068 [DEBU] {eddec210319cbc1797ae32689156f242} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=115 +2024-03-14 18:54:53.094 [DEBU] {72e65012319cbc1798ae3268c4c83734} [ 26 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 18:54:53.118 [DEBU] {e3bcdf13319cbc1799ae3268673a99b0} [ 24 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 18:54:53.144 [DEBU] {d52e5d15319cbc179aae32682f07affb} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=116 +2024-03-14 18:54:53.171 [DEBU] {17aad816319cbc179bae32685508c840} [ 27 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 18:54:53.197 [DEBU] {64279318319cbc179cae32682805c842} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=117 +2024-03-14 18:54:53.222 [DEBU] {97d6071a319cbc179dae32683d341af8} [ 25 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 18:54:53.247 [DEBU] {6f0d911b319cbc179eae32687387c017} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=118 +2024-03-14 18:54:53.274 [DEBU] {b2b5071d319cbc179fae32683b0a5af5} [ 26 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 18:54:53.299 [DEBU] {ded09c1e319cbc17a0ae3268cfa1acb0} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=119 +2024-03-14 18:54:53.324 [DEBU] {679b1b20319cbc17a1ae326886055ad6} [ 25 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 18:54:53.350 [DEBU] {14f6b321319cbc17a2ae32687a0b066f} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=120 +2024-03-14 18:54:53.376 [DEBU] {b93e2223319cbc17a3ae326898bfdc7c} [ 26 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 18:54:53.403 [DEBU] {8342b524319cbc17a4ae3268f0641797} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=121 +2024-03-14 18:54:53.428 [DEBU] {7da94c26319cbc17a5ae32681010b409} [ 25 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 18:54:53.453 [DEBU] {78efd427319cbc17a6ae32686ecdf85f} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=122 +2024-03-14 18:54:53.481 [DEBU] {81334a29319cbc17a7ae3268d6342f64} [ 28 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 18:54:53.514 [DEBU] {9df2102b319cbc17a8ae3268d1d3881e} [ 31 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=123 +2024-03-14 18:54:53.540 [DEBU] {0d1deb2c319cbc17a9ae3268079fe6f8} [ 26 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 18:54:53.564 [DEBU] {070f792e319cbc17aaae32684f7efc57} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=124 +2024-03-14 18:54:53.590 [DEBU] {149bee2f319cbc17abae32689d3145e3} [ 25 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 18:54:53.614 [DEBU] {34287431319cbc17acae3268502d1ed1} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=125 +2024-03-14 18:54:53.642 [DEBU] {3ab3e932319cbc17adae3268ec69d25c} [ 27 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 18:54:53.668 [DEBU] {f2708e34319cbc17aeae32685bd382a9} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 18:54:53.694 [DEBU] {155d2d36319cbc17afae326854b23204} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=126 +2024-03-14 18:54:53.719 [DEBU] {326b9e37319cbc17b0ae3268fa02d535} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 18:54:53.746 [DEBU] {cbc22d39319cbc17b1ae32681a18d706} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=127 +2024-03-14 18:54:53.772 [DEBU] {6b9abf3a319cbc17b2ae326838f3f086} [ 26 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 18:54:53.799 [DEBU] {7378483c319cbc17b3ae3268786f4114} [ 27 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=128 +2024-03-14 18:54:53.824 [DEBU] {f48feb3d319cbc17b4ae32684f3db3b9} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 18:54:53.851 [DEBU] {48266f3f319cbc17b5ae3268fb96c254} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=129 +2024-03-14 18:54:53.876 [DEBU] {e0f6fb40319cbc17b6ae3268a3fa0787} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 18:54:53.901 [DEBU] {82c28242319cbc17b7ae32683d607ecf} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=130 +2024-03-14 18:54:53.926 [DEBU] {1ae4fa43319cbc17b8ae3268ce25350f} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 18:54:53.952 [DEBU] {f7da8f45319cbc17b9ae32680cd876b8} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=131 +2024-03-14 18:54:53.977 [DEBU] {a2820b47319cbc17baae3268da1aefb6} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 18:54:54.011 [DEBU] {60488e48319cbc17bbae3268333627f1} [ 33 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 18:54:54.036 [DEBU] {bff58f4a319cbc17bcae32683d182cb9} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=132 +2024-03-14 18:54:54.062 [DEBU] {4a49044c319cbc17bdae3268c966452c} [ 26 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 18:54:54.088 [DEBU] {3ead9b4d319cbc17beae3268fb7d422c} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=133 +2024-03-14 18:54:54.116 [DEBU] {9380244f319cbc17bfae326845b1007d} [ 27 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 18:54:54.141 [DEBU] {ef73d350319cbc17c0ae326813d90e05} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=134 +2024-03-14 18:54:54.167 [DEBU] {07a94a52319cbc17c1ae32687d989807} [ 26 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 18:54:54.193 [DEBU] {3ebdf453319cbc17c2ae3268d7c7a650} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=135 +2024-03-14 18:54:54.228 [DEBU] {f89d6a55319cbc17c3ae3268bbc97ca2} [ 34 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 18:54:54.256 [DEBU] {6cd17757319cbc17c4ae3268f144b26e} [ 28 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=136 +2024-03-14 18:54:54.281 [DEBU] {67ba2159319cbc17c5ae3268b9f514e6} [ 25 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 18:59:47.300 [DEBU] {dab23585759cbc1758a49d65ad6f8523} [247 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 18:59:47.327 [DEBU] {24a4f393759cbc1759a49d656e462403} [ 26 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 19:06:22.691 [DEBU] {f19b9f91d19cbc17a2355a22da9b176f} [292 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 19:06:22.720 [DEBU] {d27529a3d19cbc17a3355a223abed2f8} [ 27 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 19:06:22.734 [DEBU] {f79ecba4d19cbc17a4355a22f927f8fc} [ 14 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 19:06:22.760 [DEBU] {b020a2a5d19cbc17a5355a22854fd478} [ 26 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 19:12:31.869 [DEBU] {c7395e7e279dbc17f655df27e087b6cb} [426 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 19:12:31.902 [DEBU] {0aafe197279dbc17f755df27abd38090} [ 31 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 19:12:31.916 [DEBU] {4349d199279dbc17f855df27d0bbb2cd} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 19:12:31.941 [DEBU] {29909a9a279dbc17f955df2795c114cb} [ 24 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 19:12:31.966 [DEBU] {6b361c9c279dbc17fa55df2718919cb5} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 19:12:31.989 [DEBU] {e2db959d279dbc17fb55df279c6007da} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 19:12:32.012 [DEBU] {05a9ee9e279dbc17fc55df2781f3bff5} [ 23 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 19:12:32.035 [DEBU] {d91656a0279dbc17fd55df27616bd674} [ 22 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 19:12:32.057 [DEBU] {2813aea1279dbc17fe55df27665c3518} [ 22 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 19:13:05.406 [DEBU] {f1cbad572f9dbc1711e28016781033b1} [253 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 19:13:05.431 [DEBU] {468dc6662f9dbc1712e28016933a902a} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 19:13:05.444 [DEBU] {5f683c682f9dbc1713e280163f696101} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 19:13:05.468 [DEBU] {647dff682f9dbc1714e28016e4612a01} [ 24 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 19:13:05.493 [DEBU] {a5246f6a2f9dbc1715e28016ae95bde0} [ 25 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 19:13:05.517 [DEBU] {a493f16b2f9dbc1716e28016549a0cef} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 19:13:05.540 [DEBU] {5804596d2f9dbc1717e2801663f57ae9} [ 23 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 19:13:05.565 [DEBU] {81ffc86e2f9dbc1718e280162effb048} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 19:13:05.590 [DEBU] {9cb743702f9dbc1719e280161e25d175} [ 24 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 19:13:06.942 [DEBU] {3b6a2cab2f9dbc17aa49051483fbe829} [388 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 19:13:06.968 [DEBU] {81fd54c22f9dbc17ab49051407a429eb} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 19:13:06.981 [DEBU] {731bdac32f9dbc17ac49051449287ea9} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 19:13:07.005 [DEBU] {a57b9ec42f9dbc17ad4905141a5de43f} [ 24 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 19:13:07.028 [DEBU] {4aa00bc62f9dbc17ae490514d6abc6d8} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 19:13:07.050 [DEBU] {038a6cc72f9dbc17af4905148a9ef9c3} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 19:13:07.078 [DEBU] {a321c5c82f9dbc17b0490514c2f0912f} [ 27 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 19:13:07.103 [DEBU] {ebfa78ca2f9dbc17b14905140c7661e6} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 19:13:07.128 [DEBU] {0841eccb2f9dbc17b2490514303252ac} [ 24 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 19:13:33.063 [DEBU] {6e5050c1359dbc179c444072e2cc24c2} [366 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 19:13:33.092 [DEBU] {39a18bd7359dbc179d444072d549a9ae} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 19:13:33.105 [DEBU] {8bfaf9d8359dbc179e444072f0b736e6} [ 12 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 19:13:33.129 [DEBU] {9fa9bed9359dbc179f44407274d986b4} [ 23 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 19:13:33.152 [DEBU] {bbda28db359dbc17a0444072142005a4} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 19:13:33.175 [DEBU] {cd3487dc359dbc17a1444072808920e6} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 19:13:33.198 [DEBU] {8522eedd359dbc17a2444072907b9650} [ 22 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 19:13:33.224 [DEBU] {a15954df359dbc17a3444072f6f36ec3} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 19:13:33.247 [DEBU] {c6b0d5e0359dbc17a4444072d4ab0f9d} [ 23 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 19:15:49.948 [DEBU] {9e2262a1559dbc1799375b1fcf65f9ad} [349 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 19:15:49.971 [DEBU] {005b38b6559dbc179a375b1f8993e2cb} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 19:15:49.985 [DEBU] {bf819fb7559dbc179b375b1f305d0528} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 19:15:50.010 [DEBU] {16376db8559dbc179c375b1f046ce5ba} [ 25 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 19:15:50.032 [DEBU] {9dbceab9559dbc179d375b1f6f45b845} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 19:15:50.055 [DEBU] {853440bb559dbc179e375b1f08735f2f} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 19:15:50.077 [DEBU] {72f793bc559dbc179f375b1f7136f844} [ 22 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 19:15:50.100 [DEBU] {994df1bd559dbc17a0375b1f817bb797} [ 22 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 19:15:50.124 [DEBU] {62f94fbf559dbc17a1375b1f6a88d881} [ 23 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 19:20:00.547 [DEBU] {77bfd9f88f9dbc1710c12b162a8a3225} [373 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 19:20:00.573 [DEBU] {6d881f0f909dbc1711c12b16df5ba164} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 19:20:00.587 [DEBU] {bcb6aa10909dbc1712c12b167d194ab0} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 19:20:00.610 [DEBU] {2a537311909dbc1713c12b1622d25505} [ 23 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 19:20:00.635 [DEBU] {c539de12909dbc1714c12b16828e5ee8} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 19:20:00.657 [DEBU] {79785214909dbc1715c12b1633133de5} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 19:20:00.680 [DEBU] {96e4a615909dbc1716c12b16726276f8} [ 22 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 19:20:00.703 [DEBU] {3a150717909dbc1717c12b1694cf4d14} [ 22 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 19:20:00.725 [DEBU] {c8026418909dbc1718c12b1671ac6c3f} [ 22 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 19:20:35.794 [DEBU] {e89aef2d989dbc17dc29d310a118dd05} [369 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 19:20:35.826 [DEBU] {1c7d5844989dbc17dd29d3106979068c} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 19:20:35.840 [DEBU] {dc68ec45989dbc17de29d3102c8fed98} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 19:20:35.864 [DEBU] {56f4b946989dbc17df29d310fc707f33} [ 23 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 19:20:35.888 [DEBU] {ffcf2348989dbc17e029d31055dcc936} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 19:20:35.913 [DEBU] {1ca79249989dbc17e129d310b5b7db90} [ 25 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 19:20:35.937 [DEBU] {ee7c164b989dbc17e229d3105ac36b22} [ 23 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 19:20:35.960 [DEBU] {c26d864c989dbc17e329d310a1e0194c} [ 22 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 19:20:35.987 [DEBU] {1c49e84d989dbc17e429d31060bd7833} [ 26 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 19:22:01.180 [DEBU] {356e520fac9dbc17716b816298a925e8} [370 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 19:22:01.207 [DEBU] {b6cc6025ac9dbc17726b8162141ae141} [ 27 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 19:22:01.220 [DEBU] {033afa26ac9dbc17736b816245f219bf} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 19:22:01.244 [DEBU] {69bbc427ac9dbc17746b81626697afbb} [ 23 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 19:22:01.269 [DEBU] {0e233429ac9dbc17756b81620aa0daa8} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 19:22:01.293 [DEBU] {6a76ad2aac9dbc17766b81621f778711} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 19:22:01.319 [DEBU] {3f201c2cac9dbc17776b81626e84cb5e} [ 26 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 19:22:01.344 [DEBU] {01d4b72dac9dbc17786b8162d3d2dc5a} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 19:22:01.372 [DEBU] {416b4a2fac9dbc17796b81622e57b852} [ 25 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 19:25:44.544 [DEBU] {f3d2f810e09dbc174fdff84cf0ef80e6} [368 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 19:25:44.575 [DEBU] {fa033727e09dbc1750dff84ce1ccab80} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 19:25:44.592 [DEBU] {0cbbc428e09dbc1751dff84cf61d2811} [ 16 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 19:25:44.618 [DEBU] {0dfec229e09dbc1752dff84cb189deba} [ 26 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 19:25:44.645 [DEBU] {fedb642be09dbc1753dff84c6da1a771} [ 25 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 19:25:44.669 [DEBU] {4260eb2ce09dbc1754dff84c5bb3cbc0} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 19:25:44.695 [DEBU] {3ca5602ee09dbc1755dff84c1ec110cf} [ 25 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 19:25:44.721 [DEBU] {8a9ae82fe09dbc1756dff84cf44bd4c4} [ 26 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 19:25:44.747 [DEBU] {23787e31e09dbc1757dff84cbc50959d} [ 25 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 19:25:46.738 [DEBU] {a9e8b7a8e09dbc1758dff84c8e0ce0c8} [ 16 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 19:25:46.766 [DEBU] {92afa5a9e09dbc1759dff84ca01b6d8d} [ 28 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=85) AND (`name`='接地沟') +2024-03-14 19:26:39.768 [DEBU] {d9eafeebec9dbc177839a1239efb2a93} [377 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 19:26:39.792 [DEBU] {b6b28902ed9dbc177939a123eeb1d234} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 19:26:39.808 [DEBU] {808dfb03ed9dbc177a39a123724ebcd3} [ 15 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 19:26:39.831 [DEBU] {3019dd04ed9dbc177b39a123bf869199} [ 23 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 19:26:39.857 [DEBU] {d0284b06ed9dbc177c39a12317493995} [ 25 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 19:26:39.882 [DEBU] {0cdbda07ed9dbc177d39a1237659eb46} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 19:26:39.906 [DEBU] {703a4e09ed9dbc177e39a1238841ef3f} [ 24 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 19:26:39.933 [DEBU] {48c9cc0aed9dbc177f39a123dac0115a} [ 26 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 19:26:39.963 [DEBU] {5543650ced9dbc178039a1234569b589} [ 29 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 19:26:46.417 [DEBU] {95fbfc8dee9dbc178139a123c804b7ad} [ 14 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 19:26:46.441 [DEBU] {748dd68eee9dbc178239a12322216233} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') +2024-03-14 19:44:26.038 [DEBU] {37c8dd2fe59ebc17330670558383fa82} [357 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 19:44:26.063 [DEBU] {4a5e3f45e59ebc17340670555a44cc7f} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 19:44:26.076 [DEBU] {150aa646e59ebc1735067055de6cd598} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 19:44:26.099 [DEBU] {65267247e59ebc17360670558d42d697} [ 22 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 19:44:26.122 [DEBU] {364bcc48e59ebc1737067055784f4e2a} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 19:44:26.145 [DEBU] {38672d4ae59ebc173806705552ccf915} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 19:44:26.167 [DEBU] {3c6d874be59ebc1739067055f9ced81e} [ 22 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 19:44:26.190 [DEBU] {a750e64ce59ebc173a067055d9d0823c} [ 22 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 19:44:26.214 [DEBU] {6155424ee59ebc173b067055d7e3d9e0} [ 23 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 19:44:31.493 [DEBU] {3de8f488e69ebc173c06705534ade610} [ 22 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 19:44:31.516 [DEBU] {fb564d8ae69ebc173d067055cbdc5c5a} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') +2024-03-14 19:44:31.538 [DEBU] {468cac8be69ebc173e06705570755b1d} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') LIMIT 1 +2024-03-14 19:44:31.563 [DEBU] {f964fe8ce69ebc173f0670557dee418b} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') +2024-03-14 19:44:31.589 [DEBU] {571b818ee69ebc17400670550be1dfbf} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') LIMIT 1 +2024-03-14 19:44:31.615 [DEBU] {4dcafd8fe69ebc17410670557a351b46} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') +2024-03-14 19:44:31.640 [DEBU] {ed7d9691e69ebc1742067055dc470a53} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') LIMIT 1 +2024-03-14 19:44:34.087 [DEBU] {e5e97923e79ebc17430670556aecc980} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=112) AND (`name`='基础') +2024-03-14 19:44:34.112 [DEBU] {2736ea24e79ebc17440670555f812ecf} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=113) AND (`name`='安装') +2024-03-14 19:44:51.108 [DEBU] {9342d600eb9ebc174994dd254fd6735a} [446 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 19:44:51.178 [DEBU] {fccfb51beb9ebc174a94dd252be21c8c} [ 65 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 19:44:51.240 [DEBU] {58b9a41feb9ebc174b94dd258e0dffca} [ 61 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 19:44:51.267 [DEBU] {4f625123eb9ebc174c94dd25ea7c9a7e} [ 27 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 19:44:51.293 [DEBU] {d4e9f524eb9ebc174d94dd25050e6b4d} [ 25 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 19:44:51.318 [DEBU] {a16c7626eb9ebc174e94dd255d3b408f} [ 25 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 19:44:51.341 [DEBU] {35c4f227eb9ebc174f94dd250d9b906c} [ 23 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 19:44:51.398 [DEBU] {a29f5729eb9ebc175094dd25ec2d1c80} [ 56 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 19:44:51.420 [DEBU] {56b9bc2ceb9ebc175194dd25f12a231d} [ 21 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 19:44:54.188 [DEBU] {f64d54d2eb9ebc175294dd2541db3825} [ 11 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 19:44:54.208 [DEBU] {af0608d3eb9ebc175394dd25c35f046d} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') +2024-03-14 19:44:54.230 [DEBU] {f47f43d4eb9ebc175494dd25fa8d35b9} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') LIMIT 1 +2024-03-14 19:44:54.252 [DEBU] {45e280d5eb9ebc175594dd25db2b9419} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') +2024-03-14 19:44:54.272 [DEBU] {c23fdbd6eb9ebc175694dd25c44974eb} [ 19 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') LIMIT 1 +2024-03-14 19:44:54.292 [DEBU] {4b7100d8eb9ebc175794dd25f467a953} [ 19 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') +2024-03-14 19:44:54.311 [DEBU] {cdfb30d9eb9ebc175894dd25cba2b973} [ 19 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') LIMIT 1 +2024-03-14 19:44:56.685 [DEBU] {3af2ae66ec9ebc175994dd25f9a2fd4f} [ 19 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=112) AND (`name`='基础') +2024-03-14 19:44:56.706 [DEBU] {5895d967ec9ebc175a94dd250a663372} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=113) AND (`name`='安装') +2024-03-14 19:48:50.440 [DEBU] {5fe002c5229fbc17145d337a60a5f830} [264 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 19:48:50.465 [DEBU] {87e9c0d4229fbc17155d337a4ea9786e} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 19:48:50.479 [DEBU] {fb5d48d6229fbc17165d337af0ed9ba4} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 19:48:50.502 [DEBU] {d3c514d7229fbc17175d337a4eeadf6c} [ 22 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 19:48:50.523 [DEBU] {971975d8229fbc17185d337a9dbd244b} [ 20 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 19:48:50.550 [DEBU] {2dc5b8d9229fbc17195d337af4ddbee6} [ 26 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 19:48:50.574 [DEBU] {0a3e53db229fbc171a5d337a917a6e4e} [ 23 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 19:48:50.597 [DEBU] {095bc8dc229fbc171b5d337ae06f9c8f} [ 22 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 19:48:50.624 [DEBU] {48a637de229fbc171c5d337a36d80486} [ 25 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 19:48:52.904 [DEBU] {310dce66239fbc171d5d337afe997ca9} [ 13 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 19:48:52.927 [DEBU] {1ff49a67239fbc171e5d337a2927d8da} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') +2024-03-14 19:48:52.949 [DEBU] {9cf0f568239fbc171f5d337a7686ec81} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') LIMIT 1 +2024-03-14 19:48:52.971 [DEBU] {5ff7426a239fbc17205d337a92ecb44d} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') +2024-03-14 19:48:52.995 [DEBU] {3a38a26b239fbc17215d337a3462f9de} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') LIMIT 1 +2024-03-14 19:48:53.017 [DEBU] {4878086d239fbc17225d337a5f1eefd7} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') +2024-03-14 19:48:53.038 [DEBU] {7516546e239fbc17235d337ac7632cae} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') LIMIT 1 +2024-03-14 19:48:55.685 [DEBU] {0bed090c249fbc17245d337acb9d8bd7} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=112) AND (`name`='基础') +2024-03-14 19:48:55.707 [DEBU] {380d640d249fbc17255d337ab899adcd} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=113) AND (`name`='安装') +2024-03-14 19:49:23.202 [DEBU] {24302e662a9fbc17265d337a397edd02} [257 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=114) AND (`name`='路基') +2024-03-14 19:49:23.226 [DEBU] {f85185752a9fbc17275d337ad6a80dce} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=115) AND (`name`='排水沟') +2024-03-14 19:52:02.401 [DEBU] {655a4b714f9fbc174f43f2143adbc0f0} [356 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 19:52:02.424 [DEBU] {aa8d8d864f9fbc175043f2145c7c729b} [ 22 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 19:52:02.437 [DEBU] {0f43e3874f9fbc175143f2147ee5b2fc} [ 12 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 19:52:02.459 [DEBU] {73e19e884f9fbc175243f214f6a66292} [ 22 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 19:52:02.481 [DEBU] {317af3894f9fbc175343f214cff0696d} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 19:52:02.503 [DEBU] {4d374e8b4f9fbc175443f2143121ee2b} [ 21 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 19:52:02.528 [DEBU] {4174978c4f9fbc175543f21429264bc3} [ 25 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 19:52:02.552 [DEBU] {c863238e4f9fbc175643f214f5cd8df8} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 19:52:02.575 [DEBU] {d58a828f4f9fbc175743f21468cde3de} [ 23 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 19:52:08.706 [DEBU] {38f58ffd509fbc175843f214ceef7020} [ 12 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 19:52:08.727 [DEBU] {d01e49fe509fbc175943f214c545d0c1} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') +2024-03-14 19:52:08.750 [DEBU] {d5e1b5ff509fbc175a43f21414de1cca} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') LIMIT 1 +2024-03-14 19:52:08.773 [DEBU] {815ff300519fbc175b43f214dcf8dab4} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') +2024-03-14 19:52:08.797 [DEBU] {f3314d02519fbc175c43f2141d2126a0} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') LIMIT 1 +2024-03-14 19:52:08.818 [DEBU] {a2faba03519fbc175d43f214573b8833} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') +2024-03-14 19:52:08.839 [DEBU] {57f1f804519fbc175e43f214d2506f40} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') LIMIT 1 +2024-03-14 19:52:11.054 [DEBU] {1dc9e288519fbc175f43f2146e8a7a2f} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=112) AND (`name`='基础') +2024-03-14 19:52:11.075 [DEBU] {2c43418a519fbc176043f214ca57bc4e} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=113) AND (`name`='安装') +2024-03-14 19:52:30.362 [DEBU] {1ce2b707569fbc176143f214812a9327} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=114) AND (`name`='路基') +2024-03-14 19:52:30.385 [DEBU] {73281809569fbc176243f2143c70cbf9} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=115) AND (`name`='排水沟') +2024-03-14 19:53:47.375 [DEBU] {198494e1679fbc176a4eb87108f0bd8e} [367 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 19:53:47.401 [DEBU] {ef838ff7679fbc176b4eb8710a2d408c} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 19:53:47.415 [DEBU] {3c3c0af9679fbc176c4eb8715c710caa} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 19:53:47.441 [DEBU] {0537d5f9679fbc176d4eb871d82461df} [ 26 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 19:53:47.482 [DEBU] {28ed65fb679fbc176e4eb87192b246ba} [ 40 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 19:53:47.541 [DEBU] {0f16d0fd679fbc176f4eb87103830784} [ 59 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 19:53:47.579 [DEBU] {72d85201689fbc17704eb871fdb66dae} [ 38 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 19:53:47.638 [DEBU] {478aa103689fbc17714eb8718ec01bad} [ 58 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 19:53:47.671 [DEBU] {576c2107689fbc17724eb871a7eb43eb} [ 33 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 19:53:47.684 [DEBU] {10591909689fbc17734eb871a1ed68a0} [ 12 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 19:53:47.707 [DEBU] {b2f8de09689fbc17744eb8711d65bfca} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') +2024-03-14 19:53:47.730 [DEBU] {bd47350b689fbc17754eb8718cfe926e} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') LIMIT 1 +2024-03-14 19:53:47.756 [DEBU] {695a980c689fbc17764eb8712418bf02} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') +2024-03-14 19:53:47.781 [DEBU] {4cfe2d0e689fbc17774eb8711dda1881} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') LIMIT 1 +2024-03-14 19:53:47.806 [DEBU] {e858a30f689fbc17784eb8710cd6f498} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') +2024-03-14 19:53:47.830 [DEBU] {43ee2611689fbc17794eb871706109e7} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') LIMIT 1 +2024-03-14 19:53:49.734 [DEBU] {3a348f82689fbc177a4eb871331de4e9} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=112) AND (`name`='基础') +2024-03-14 19:53:49.757 [DEBU] {1d290d84689fbc177b4eb8719e8f8ca2} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=113) AND (`name`='安装') +2024-03-14 19:55:43.746 [DEBU] {101faffe829fbc17d052ec523c3bb349} [285 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 19:55:43.770 [DEBU] {6438b40f839fbc17d152ec522535b4c9} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 19:55:43.784 [DEBU] {32ac2711839fbc17d252ec529b9f83b8} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 19:55:43.810 [DEBU] {1520f411839fbc17d352ec520895cd2e} [ 26 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 19:55:43.835 [DEBU] {be468f13839fbc17d452ec524747095b} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 19:55:43.862 [DEBU] {8fd20915839fbc17d552ec5206d9309e} [ 26 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 19:55:43.886 [DEBU] {23eea816839fbc17d652ec52d7f705f6} [ 23 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 19:55:43.914 [DEBU] {483e1b18839fbc17d752ec52ceec58f6} [ 27 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 19:55:43.939 [DEBU] {dc9ac119839fbc17d852ec521b792ad3} [ 24 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 19:55:43.955 [DEBU] {92fb431b839fbc17d952ec52d3fdb0ea} [ 15 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 19:55:43.978 [DEBU] {a74d291c839fbc17da52ec524baa0555} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') +2024-03-14 19:55:46.320 [DEBU] {8d9e9da7839fbc17db52ec5292eef892} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') LIMIT 1 +2024-03-14 19:56:37.351 [DEBU] {0d77727a8f9fbc17dc52ec529f8cfc22} [274 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') +2024-03-14 19:56:48.670 [DEBU] {0a9fc92b929fbc17dd52ec52804acd29} [ 28 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') LIMIT 1 +2024-03-14 19:56:52.043 [DEBU] {45ec18f5929fbc17de52ec525991bb94} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') +2024-03-14 19:56:53.066 [DEBU] {57b8ea31939fbc17df52ec5227d63fb3} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') LIMIT 1 +2024-03-14 19:57:05.795 [DEBU] {0dceba28969fbc17e052ec52c902ebc3} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=112) AND (`name`='基础') +2024-03-14 19:57:54.088 [DEBU] {86074c52a19fbc17a794df797cb86fed} [375 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 19:57:54.114 [DEBU] {5eb7c168a19fbc17a894df79e532a4a8} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 19:57:54.127 [DEBU] {c0093d6aa19fbc17a994df79201c2d86} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 19:57:54.154 [DEBU] {b468096ba19fbc17aa94df79478efa78} [ 26 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 19:57:54.178 [DEBU] {fcfc9f6ca19fbc17ab94df790ba93ce4} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 19:57:54.203 [DEBU] {2e20116ea19fbc17ac94df79e8bbccef} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 19:57:54.228 [DEBU] {d0de896fa19fbc17ad94df797dfdbb24} [ 25 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 19:57:54.252 [DEBU] {48951071a19fbc17ae94df793e273637} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 19:57:54.280 [DEBU] {65018272a19fbc17af94df79d8b5c958} [ 27 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 19:57:54.300 [DEBU] {70d94974a19fbc17b094df790ecee0df} [ 17 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 19:57:54.326 [DEBU] {a33f5375a19fbc17b194df79af09139b} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') +2024-03-14 19:58:04.211 [DEBU] {673696c2a39fbc17b294df7952130272} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') LIMIT 1 +2024-03-14 19:58:04.234 [DEBU] {a08113c4a39fbc17b394df7971d9e2de} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') +2024-03-14 19:58:04.258 [DEBU] {318c76c5a39fbc17b494df79a3a8999d} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') LIMIT 1 +2024-03-14 19:58:04.281 [DEBU] {b6baddc6a39fbc17b594df79f038812f} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') +2024-03-14 19:58:04.305 [DEBU] {9ca040c8a39fbc17b694df79fbe458da} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') LIMIT 1 +2024-03-14 19:58:14.174 [DEBU] {c9626614a69fbc17b794df79e0f38017} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=112) AND (`name`='基础') +2024-03-14 19:58:14.197 [DEBU] {921dea15a69fbc17b894df791cbe799f} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=113) AND (`name`='安装') +2024-03-14 20:03:20.730 [DEBU] {9fdde15fed9fbc17b994df79003a6781} [372 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=114) AND (`name`='路基') +2024-03-14 20:03:20.752 [DEBU] {12ba0a76ed9fbc17ba94df7999f80d09} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=115) AND (`name`='排水沟') +2024-03-14 20:03:21.167 [DEBU] {ff894a7bed9fbc17c708c249d3e2a099} [349 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 20:03:21.196 [DEBU] {89bf1990ed9fbc17c808c24901321dee} [ 29 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 20:03:21.210 [DEBU] {39f7d891ed9fbc17c908c2499be39a36} [ 14 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 20:03:21.234 [DEBU] {2fe6ad92ed9fbc17ca08c2499a57eea1} [ 24 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 20:03:21.257 [DEBU] {b4c21d94ed9fbc17cb08c2494bba5c81} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 20:03:21.283 [DEBU] {58867b95ed9fbc17cc08c2495633919d} [ 26 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 20:03:21.308 [DEBU] {a6d10997ed9fbc17cd08c249220f69af} [ 24 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 20:03:21.334 [DEBU] {e9a88b98ed9fbc17ce08c249c71c238c} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 20:03:21.359 [DEBU] {e20f339aed9fbc17cf08c249b431c4c3} [ 22 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 20:03:21.372 [DEBU] {69ec8d9bed9fbc17d008c249cd1ed52c} [ 13 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 20:03:21.396 [DEBU] {e5084f9ced9fbc17d108c2499fd8b720} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') +2024-03-14 20:03:21.419 [DEBU] {d496bc9ded9fbc17d208c249d1440d2a} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') LIMIT 1 +2024-03-14 20:03:21.440 [DEBU] {de971a9fed9fbc17d308c24989c8422a} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') +2024-03-14 20:03:21.463 [DEBU] {1aa069a0ed9fbc17d408c249751c3ad9} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') LIMIT 1 +2024-03-14 20:03:21.487 [DEBU] {b25cc4a1ed9fbc17d508c24967135a51} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') +2024-03-14 20:03:21.511 [DEBU] {c0bc2da3ed9fbc17d608c24994b93868} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') LIMIT 1 +2024-03-14 20:04:15.156 [DEBU] {fa33640cfa9fbc1761d4285a51376632} [364 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 20:04:15.183 [DEBU] {0dec5522fa9fbc1762d4285ac5688215} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 20:04:15.196 [DEBU] {7b95bd23fa9fbc1763d4285a14930242} [ 12 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 20:04:15.218 [DEBU] {ce6f7c24fa9fbc1764d4285a807538d3} [ 22 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 20:04:15.241 [DEBU] {02f3d225fa9fbc1765d4285a2ebc63a1} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 20:04:15.263 [DEBU] {59282e27fa9fbc1766d4285a51068199} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 20:04:15.285 [DEBU] {5bd87b28fa9fbc1767d4285a4a2df991} [ 22 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 20:04:15.307 [DEBU] {a30bcf29fa9fbc1768d4285ac3a5acc6} [ 21 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 20:04:15.329 [DEBU] {3805222bfa9fbc1769d4285a76403a62} [ 21 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 20:04:15.343 [DEBU] {94ce742cfa9fbc176ad4285a2cdbfb67} [ 13 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 20:04:15.364 [DEBU] {8b573f2dfa9fbc176bd4285a72a693c6} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') +2024-03-14 20:04:15.387 [DEBU] {ddf8882efa9fbc176cd4285a5f749912} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') LIMIT 1 +2024-03-14 20:04:15.408 [DEBU] {17bbe52ffa9fbc176dd4285a4c636aed} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') +2024-03-14 20:04:15.429 [DEBU] {146c1e31fa9fbc176ed4285a55d2bebb} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') LIMIT 1 +2024-03-14 20:04:15.450 [DEBU] {8aaf6532fa9fbc176fd4285a99e4b61d} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') +2024-03-14 20:04:15.476 [DEBU] {199fa233fa9fbc1770d4285aaa903585} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') LIMIT 1 +2024-03-14 20:04:32.634 [DEBU] {1ace3532fe9fbc1771d4285ac81f3955} [ 28 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=112) AND (`name`='基础') +2024-03-14 20:04:32.660 [DEBU] {eb410934fe9fbc1772d4285a8090d15e} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=113) AND (`name`='安装') +2024-03-14 20:11:49.101 [DEBU] {5804f8bd63a0bc1745be681b975eb348} [358 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 20:11:49.131 [DEBU] {bd1892d363a0bc1746be681b15fb445e} [ 26 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 20:11:49.145 [DEBU] {c6fe21d563a0bc1747be681bdbbe2484} [ 14 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 20:11:49.170 [DEBU] {d8f8fdd563a0bc1748be681b210e7e0a} [ 24 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 20:11:49.203 [DEBU] {e9f677d763a0bc1749be681bef49073a} [ 32 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 20:11:49.234 [DEBU] {305a74d963a0bc174abe681baf5ee2c7} [ 30 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 20:11:49.258 [DEBU] {e88844db63a0bc174bbe681b8bdacf27} [ 24 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 20:11:49.283 [DEBU] {a88bc0dc63a0bc174cbe681b9508cffa} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 20:11:49.308 [DEBU] {21e433de63a0bc174dbe681bb9e228f9} [ 24 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 20:11:49.324 [DEBU] {43dfb6df63a0bc174ebe681b66212965} [ 15 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 20:11:49.348 [DEBU] {f59098e063a0bc174fbe681bc92e9e03} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') +2024-03-14 20:11:49.371 [DEBU] {d86e08e263a0bc1750be681b8e95f5a1} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') LIMIT 1 +2024-03-14 20:11:49.394 [DEBU] {974874e363a0bc1751be681bc4d65159} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') +2024-03-14 20:11:49.417 [DEBU] {77b5cfe463a0bc1752be681b58991c61} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') LIMIT 1 +2024-03-14 20:11:49.440 [DEBU] {fa5233e663a0bc1753be681bd0064cef} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') +2024-03-14 20:11:49.464 [DEBU] {1fa48be763a0bc1754be681b8af78374} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') LIMIT 1 +2024-03-14 20:11:49.491 [DEBU] {e95df8e863a0bc1755be681b54d0aec2} [ 27 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=112) AND (`name`='基础') +2024-03-14 20:11:49.514 [DEBU] {677d9bea63a0bc1756be681ba17bb0a2} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=113) AND (`name`='安装') +2024-03-14 20:11:49.538 [DEBU] {2819f5eb63a0bc1757be681b179b4c72} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=114) AND (`name`='路基') +2024-03-14 20:11:49.563 [DEBU] {9c745ced63a0bc1758be681b9ed56b3b} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=115) AND (`name`='排水沟') +2024-03-14 20:11:49.587 [DEBU] {14bed7ee63a0bc1759be681b1fa440ce} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=116) AND (`name`='钻孔') +2024-03-14 20:11:49.613 [DEBU] {8c3c4ef063a0bc175abe681b654ec3fa} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=117) AND (`name`='桩基') +2024-03-14 20:11:49.637 [DEBU] {956edff163a0bc175bbe681ba570296f} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=118) AND (`name`='支架') +2024-03-14 20:11:49.660 [DEBU] {02de46f363a0bc175cbe681bf5a5423e} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=119) AND (`name`='光伏板') +2024-03-14 20:11:49.686 [DEBU] {9ebda8f463a0bc175dbe681b8f9d381f} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=120) AND (`name`='直流电缆') +2024-03-14 20:11:49.708 [DEBU] {485e2cf663a0bc175ebe681b7a642981} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=121) AND (`name`='接地线') +2024-03-14 20:11:49.735 [DEBU] {a71185f763a0bc175fbe681b7930fcc6} [ 27 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=122) AND (`name`='逆变器安装') +2024-03-14 20:11:49.759 [DEBU] {ffe01ff963a0bc1760be681b4b483a92} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=123) AND (`name`='电缆沟开挖') +2024-03-14 20:11:49.784 [DEBU] {cebe88fa63a0bc1761be681b8078f0bd} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=124) AND (`name`='敷设') +2024-03-14 20:11:49.808 [DEBU] {143305fc63a0bc1762be681b3dc8c7d2} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=125) AND (`name`='调试') +2024-03-14 20:11:49.835 [DEBU] {dd5871fd63a0bc1763be681b9a656087} [ 27 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=126) AND (`name`='基础') +2024-03-14 20:11:49.859 [DEBU] {91e712ff63a0bc1764be681b5bdba0f7} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=127) AND (`name`='安装') +2024-03-14 20:11:49.882 [DEBU] {ed53810064a0bc1765be681b4348ff90} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=128) AND (`name`='电缆沟开挖') +2024-03-14 20:11:49.905 [DEBU] {946ddb0164a0bc1766be681bbebbab99} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=129) AND (`name`='敷设') +2024-03-14 20:11:49.927 [DEBU] {6eb33a0364a0bc1767be681bb273f423} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=130) AND (`name`='试验') +2024-03-14 20:11:49.951 [DEBU] {e01d980464a0bc1768be681b49a23252} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=131) AND (`name`='调试试验') +2024-03-14 20:11:49.974 [DEBU] {d821fc0564a0bc1769be681bf2cc5043} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=132) AND (`name`='基础') +2024-03-14 20:11:49.997 [DEBU] {de90560764a0bc176abe681bdcef489b} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=133) AND (`name`='安装') +2024-03-14 20:11:50.024 [DEBU] {7b54bc0864a0bc176bbe681b26b1cdc4} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=134) AND (`name`='敷设') +2024-03-14 20:11:50.052 [DEBU] {21fa500a64a0bc176cbe681bc0619078} [ 28 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=135) AND (`name`='试验') +2024-03-14 20:11:50.075 [DEBU] {4c10060c64a0bc176dbe681ba5e7cac0} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=136) AND (`name`='调试试验') +2024-03-14 20:13:23.169 [DEBU] {fe0d58ab79a0bc1779cab50f9d3f4cf0} [249 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 20:13:23.197 [DEBU] {55656cba79a0bc177acab50ffb10274b} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 20:13:23.212 [DEBU] {6811ebbb79a0bc177bcab50f9f9c49f0} [ 14 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 20:13:23.238 [DEBU] {6962c6bc79a0bc177ccab50fe2676632} [ 26 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 20:13:23.265 [DEBU] {023f57be79a0bc177dcab50fb44f2f2b} [ 27 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 20:13:23.290 [DEBU] {c77af7bf79a0bc177ecab50f67155421} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 20:13:23.315 [DEBU] {b1ee7ac179a0bc177fcab50f5c6dcfe2} [ 24 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 20:13:23.339 [DEBU] {a6c0f6c279a0bc1780cab50f0bd4afb4} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 20:13:23.364 [DEBU] {9ef165c479a0bc1781cab50f4cfab3d1} [ 24 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 20:13:23.377 [DEBU] {106fd9c579a0bc1782cab50f546432ec} [ 13 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 20:13:23.401 [DEBU] {0a76a2c679a0bc1783cab50f1ed0f3d1} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') +2024-03-14 20:13:23.424 [DEBU] {ba2d0bc879a0bc1784cab50f646a1ce9} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') LIMIT 1 +2024-03-14 20:13:23.448 [DEBU] {a6256ac979a0bc1785cab50fba5cb28a} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') +2024-03-14 20:13:23.477 [DEBU] {40f4d5ca79a0bc1786cab50fdf0dc44e} [ 29 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') LIMIT 1 +2024-03-14 20:13:23.500 [DEBU] {d7c997cc79a0bc1787cab50f6af104ca} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') +2024-03-14 20:13:23.523 [DEBU] {d749f1cd79a0bc1788cab50fb41c2ba5} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') LIMIT 1 +2024-03-14 20:13:23.545 [DEBU] {19114fcf79a0bc1789cab50fb34f8509} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=112) AND (`name`='基础') +2024-03-14 20:13:23.568 [DEBU] {f7c7a5d079a0bc178acab50f98885b54} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=113) AND (`name`='安装') +2024-03-14 20:13:23.590 [DEBU] {2bb701d279a0bc178bcab50fe21944dd} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=114) AND (`name`='路基') +2024-03-14 20:13:23.614 [DEBU] {17f05cd379a0bc178ccab50fa8c4291f} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=115) AND (`name`='排水沟') +2024-03-14 20:13:23.636 [DEBU] {be3ebdd479a0bc178dcab50f99e295e2} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=116) AND (`name`='钻孔') +2024-03-14 20:13:23.659 [DEBU] {4aa317d679a0bc178ecab50f51b7c021} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=117) AND (`name`='桩基') +2024-03-14 20:13:23.681 [DEBU] {08f66cd779a0bc178fcab50f9b821c9e} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=118) AND (`name`='支架') +2024-03-14 20:13:23.704 [DEBU] {27fdc0d879a0bc1790cab50fb96396c3} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=119) AND (`name`='光伏板') +2024-03-14 20:13:23.728 [DEBU] {5ea021da79a0bc1791cab50f0abe4794} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=120) AND (`name`='直流电缆') +2024-03-14 20:13:23.751 [DEBU] {cc1a90db79a0bc1792cab50fd67fbc77} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=121) AND (`name`='接地线') +2024-03-14 20:13:23.773 [DEBU] {facce4dc79a0bc1793cab50fb417006a} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=122) AND (`name`='逆变器安装') +2024-03-14 20:13:23.796 [DEBU] {7a683fde79a0bc1794cab50f653d58eb} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=123) AND (`name`='电缆沟开挖') +2024-03-14 20:13:23.819 [DEBU] {f6d493df79a0bc1795cab50f7dad2997} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=124) AND (`name`='敷设') +2024-03-14 20:13:23.841 [DEBU] {3c85f1e079a0bc1796cab50f109247b6} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=125) AND (`name`='调试') +2024-03-14 20:13:23.864 [DEBU] {ed1d49e279a0bc1797cab50fb13dc6a0} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=126) AND (`name`='基础') +2024-03-14 20:13:23.886 [DEBU] {5d92a0e379a0bc1798cab50f8ab7479d} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=127) AND (`name`='安装') +2024-03-14 20:13:23.909 [DEBU] {e87cfce479a0bc1799cab50f9565f048} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=128) AND (`name`='电缆沟开挖') +2024-03-14 20:13:23.931 [DEBU] {810352e679a0bc179acab50f1235b3fa} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=129) AND (`name`='敷设') +2024-03-14 20:13:23.955 [DEBU] {da0ba7e779a0bc179bcab50f5120ee1b} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=130) AND (`name`='试验') +2024-03-14 20:13:23.978 [DEBU] {a58012e979a0bc179ccab50fbd3a4dcc} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=131) AND (`name`='调试试验') +2024-03-14 20:13:24.001 [DEBU] {3c0874ea79a0bc179dcab50f73d4a6ff} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=132) AND (`name`='基础') +2024-03-14 20:13:24.024 [DEBU] {caabd7eb79a0bc179ecab50f99939d06} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=133) AND (`name`='安装') +2024-03-14 20:13:24.048 [DEBU] {6f9829ed79a0bc179fcab50f27e65577} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=134) AND (`name`='敷设') +2024-03-14 20:13:24.073 [DEBU] {f2df9eee79a0bc17a0cab50f8d458aea} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=135) AND (`name`='试验') +2024-03-14 20:13:24.099 [DEBU] {b35317f079a0bc17a1cab50f9e5f4947} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=136) AND (`name`='调试试验') +2024-03-14 20:30:31.287 [DEBU] {a9cf0e0569a1bc17a7e3ce7f45b749e0} [365 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 20:30:31.317 [DEBU] {a9f1e91a69a1bc17a8e3ce7f65e7853f} [ 28 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 20:30:31.332 [DEBU] {e66dab1c69a1bc17a9e3ce7fc7cf6702} [ 14 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 20:30:31.361 [DEBU] {86ce7e1d69a1bc17aae3ce7f7c0d1391} [ 29 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 20:30:31.386 [DEBU] {ca46421f69a1bc17abe3ce7f9391adc0} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 20:30:31.409 [DEBU] {6644bf2069a1bc17ace3ce7fca3d18ac} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 20:30:31.432 [DEBU] {40901f2269a1bc17ade3ce7f70c0946f} [ 22 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 20:30:31.455 [DEBU] {e1a7802369a1bc17aee3ce7faf92c349} [ 22 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 20:30:31.482 [DEBU] {c1fee32469a1bc17afe3ce7f90d8a803} [ 26 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 20:30:31.498 [DEBU] {a8197a2669a1bc17b0e3ce7fc594f2dc} [ 15 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 20:30:31.520 [DEBU] {d843632769a1bc17b1e3ce7f804d08cb} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') +2024-03-14 20:30:31.545 [DEBU] {6af3ba2869a1bc17b2e3ce7f6106740c} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') LIMIT 1 +2024-03-14 20:30:31.567 [DEBU] {935f372a69a1bc17b3e3ce7fecf46d1d} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') +2024-03-14 20:30:31.598 [DEBU] {fc8a872b69a1bc17b4e3ce7f9366266c} [ 31 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') LIMIT 1 +2024-03-14 20:30:31.620 [DEBU] {26fb642d69a1bc17b5e3ce7f91f2995a} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') +2024-03-14 20:30:31.643 [DEBU] {4d3faf2e69a1bc17b6e3ce7f47805cbe} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') LIMIT 1 +2024-03-14 20:30:31.668 [DEBU] {e4af063069a1bc17b7e3ce7fbf2b1763} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=112) AND (`name`='基础') +2024-03-14 20:30:31.689 [DEBU] {1088823169a1bc17b8e3ce7f9553ce0c} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=113) AND (`name`='安装') +2024-03-14 20:30:31.711 [DEBU] {c286ca3269a1bc17b9e3ce7f49f3ec6e} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=114) AND (`name`='路基') +2024-03-14 20:30:31.733 [DEBU] {bc91163469a1bc17bae3ce7fbed31411} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=115) AND (`name`='排水沟') +2024-03-14 20:30:31.754 [DEBU] {988d623569a1bc17bbe3ce7f5c0395d0} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=116) AND (`name`='钻孔') +2024-03-14 20:30:31.786 [DEBU] {2b68b23669a1bc17bce3ce7f3619f08f} [ 31 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=117) AND (`name`='桩基') +2024-03-14 20:30:31.817 [DEBU] {2826933869a1bc17bde3ce7f0b1d10cc} [ 31 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=118) AND (`name`='支架') +2024-03-14 20:30:31.848 [DEBU] {800c6e3a69a1bc17bee3ce7f02e5832f} [ 31 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=119) AND (`name`='光伏板') +2024-03-14 20:30:31.872 [DEBU] {76a8463c69a1bc17bfe3ce7f9b341e84} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=120) AND (`name`='直流电缆') +2024-03-14 20:30:31.894 [DEBU] {e308b23d69a1bc17c0e3ce7f153b5990} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=121) AND (`name`='接地线') +2024-03-14 20:30:31.915 [DEBU] {6ac7013f69a1bc17c1e3ce7f5211ec32} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=122) AND (`name`='逆变器安装') +2024-03-14 20:30:31.937 [DEBU] {775a494069a1bc17c2e3ce7f2b93fcf0} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=123) AND (`name`='电缆沟开挖') +2024-03-14 20:30:31.963 [DEBU] {3d10944169a1bc17c3e3ce7f2c7463f1} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=124) AND (`name`='敷设') +2024-03-14 20:30:31.985 [DEBU] {09f0214369a1bc17c4e3ce7ff8659690} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=125) AND (`name`='调试') +2024-03-14 20:30:32.008 [DEBU] {02b8754469a1bc17c5e3ce7f1bdf4cec} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=126) AND (`name`='基础') +2024-03-14 20:30:32.030 [DEBU] {f7efc84569a1bc17c6e3ce7fb3f2e1df} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=127) AND (`name`='安装') +2024-03-14 20:30:32.051 [DEBU] {d60c184769a1bc17c7e3ce7f8b8220b7} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=128) AND (`name`='电缆沟开挖') +2024-03-14 20:30:32.073 [DEBU] {3bc65d4869a1bc17c8e3ce7f8a58e74a} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=129) AND (`name`='敷设') +2024-03-14 20:30:32.095 [DEBU] {9a8bae4969a1bc17c9e3ce7fb91d894d} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=130) AND (`name`='试验') +2024-03-14 20:30:32.117 [DEBU] {2f68ff4a69a1bc17cae3ce7fb1a57b59} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=131) AND (`name`='调试试验') +2024-03-14 20:30:32.140 [DEBU] {65c6504c69a1bc17cbe3ce7f3947b307} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=132) AND (`name`='基础') +2024-03-14 20:30:32.163 [DEBU] {6bd5a44d69a1bc17cce3ce7ffe2a1074} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=133) AND (`name`='安装') +2024-03-14 20:30:32.184 [DEBU] {cb4a074f69a1bc17cde3ce7f6a735af4} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=134) AND (`name`='敷设') +2024-03-14 20:30:32.206 [DEBU] {dab94f5069a1bc17cee3ce7f6b94d4ea} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=135) AND (`name`='试验') +2024-03-14 20:30:32.227 [DEBU] {18b8975169a1bc17cfe3ce7f8eafcd01} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=136) AND (`name`='调试试验') +2024-03-14 20:32:55.561 [DEBU] {1f8639a38aa1bc17387b1337d5aa941c} [252 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 20:32:55.588 [DEBU] {c6cd3fb28aa1bc17397b1337ea02dbfa} [ 26 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 20:32:55.604 [DEBU] {569be0b38aa1bc173a7b133712f3a240} [ 15 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 20:32:55.629 [DEBU] {311fc9b48aa1bc173b7b13378e05add0} [ 25 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 20:32:55.655 [DEBU] {aeb249b68aa1bc173c7b1337d6377955} [ 26 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 20:32:55.686 [DEBU] {4485d7b78aa1bc173d7b1337ec39f9cd} [ 31 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 20:32:55.712 [DEBU] {aca1b5b98aa1bc173e7b133768a3ef9a} [ 25 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 20:32:55.738 [DEBU] {6dfb4cbb8aa1bc173f7b1337e34c4919} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 20:32:55.764 [DEBU] {23ebcdbc8aa1bc17407b133747043769} [ 25 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 20:34:09.843 [DEBU] {915605e99ba1bc177372c26fe0b6a6f4} [348 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 20:34:09.869 [DEBU] {b104ecfd9ba1bc177472c26fe58911b0} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 20:34:09.884 [DEBU] {520357ff9ba1bc177572c26f37511ed1} [ 14 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 20:34:09.906 [DEBU] {cd8f33009ca1bc177672c26f20aea1f6} [ 22 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 20:34:09.928 [DEBU] {c3378c019ca1bc177772c26f32a98e98} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 20:34:09.950 [DEBU] {bf35e2029ca1bc177872c26f77c833a1} [ 21 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 20:34:09.973 [DEBU] {14c631049ca1bc177972c26f39eb4ecf} [ 22 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 20:34:09.997 [DEBU] {17fc93059ca1bc177a72c26f4e3a753a} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 20:34:10.023 [DEBU] {82b7fb069ca1bc177b72c26f4c4bef16} [ 25 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 20:36:52.857 [DEBU] {6fa21addc1a1bc17ec6a5a71bc91cb0c} [353 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 20:36:52.885 [DEBU] {22eb5ff2c1a1bc17ed6a5a7134b89b37} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 20:36:52.899 [DEBU] {6250dff3c1a1bc17ee6a5a713140fcf6} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 20:36:52.924 [DEBU] {cc9cacf4c1a1bc17ef6a5a71c4ab5ecf} [ 25 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 20:36:52.948 [DEBU] {e26630f6c1a1bc17f06a5a71dce6c9db} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 20:36:52.972 [DEBU] {613ca0f7c1a1bc17f16a5a71882cfb1e} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 20:36:52.997 [DEBU] {fe760bf9c1a1bc17f26a5a7163744212} [ 25 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 20:36:53.023 [DEBU] {91da8ffac1a1bc17f36a5a71fdbaf939} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 20:36:53.047 [DEBU] {673d16fcc1a1bc17f46a5a71a2f2f8d4} [ 23 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 20:37:40.585 [DEBU] {7847ccffcca1bc17f8349965c363855b} [255 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 20:37:40.614 [DEBU] {0795fe0ecda1bc17f9349965a203f981} [ 29 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 20:37:40.631 [DEBU] {d006c810cda1bc17fa3499657971d012} [ 16 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 20:37:40.657 [DEBU] {29aaca11cda1bc17fb349965222b0e58} [ 25 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 20:37:40.682 [DEBU] {b6b34d13cda1bc17fc349965cb1ebb62} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 20:37:40.711 [DEBU] {0048cc14cda1bc17fd349965c7787892} [ 28 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 20:37:40.737 [DEBU] {3cd08816cda1bc17fe34996526f92854} [ 25 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 20:37:40.765 [DEBU] {99c51b18cda1bc17ff349965cd17c0aa} [ 27 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 20:37:40.789 [DEBU] {80cabd19cda1bc17003599658035e534} [ 23 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 20:37:40.803 [DEBU] {cce8311bcda1bc17013599654547a716} [ 13 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 20:37:40.828 [DEBU] {a326fb1bcda1bc170235996578540d48} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') +2024-03-14 20:37:40.854 [DEBU] {f06e7d1dcda1bc170335996538430df2} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') LIMIT 1 +2024-03-14 20:37:40.879 [DEBU] {f304021fcda1bc17043599651b7b4272} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') +2024-03-14 20:37:40.902 [DEBU] {4b087f20cda1bc1705359965bcc138bd} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') LIMIT 1 +2024-03-14 20:37:40.928 [DEBU] {1b2eea21cda1bc17063599651ca8cd70} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') +2024-03-14 20:37:40.953 [DEBU] {0a2f6b23cda1bc17073599657d975eee} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') LIMIT 1 +2024-03-14 20:37:40.980 [DEBU] {0296f524cda1bc17083599654afd90b6} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=112) AND (`name`='基础') +2024-03-14 20:37:41.003 [DEBU] {38258926cda1bc1709359965964c60de} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=113) AND (`name`='安装') +2024-03-14 20:37:41.026 [DEBU] {2a3feb27cda1bc170a359965aadbe37f} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=114) AND (`name`='路基') +2024-03-14 20:37:41.050 [DEBU] {41194d29cda1bc170b3599657d82cd21} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=115) AND (`name`='排水沟') +2024-03-14 20:37:41.075 [DEBU] {cf7cae2acda1bc170c359965bd12bfca} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=116) AND (`name`='钻孔') +2024-03-14 20:37:41.098 [DEBU] {96782a2ccda1bc170d35996564b16b23} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=117) AND (`name`='桩基') +2024-03-14 20:37:41.121 [DEBU] {7c79932dcda1bc170e35996588d72817} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=118) AND (`name`='支架') +2024-03-14 20:37:41.144 [DEBU] {7135f42ecda1bc170f3599657d56ac68} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=119) AND (`name`='光伏板') +2024-03-14 20:37:41.167 [DEBU] {33cb5030cda1bc171035996542d13afe} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=120) AND (`name`='直流电缆') +2024-03-14 20:37:41.190 [DEBU] {e1f1b231cda1bc1711359965025195a8} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=121) AND (`name`='接地线') +2024-03-14 20:37:41.222 [DEBU] {85bb1033cda1bc17123599650c142328} [ 31 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=122) AND (`name`='逆变器安装') +2024-03-14 20:37:41.246 [DEBU] {32f3f634cda1bc171335996548aa0146} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=123) AND (`name`='电缆沟开挖') +2024-03-14 20:37:41.270 [DEBU] {43d56936cda1bc171435996515045927} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=124) AND (`name`='敷设') +2024-03-14 20:37:41.292 [DEBU] {1dc4c837cda1bc171535996511f71292} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=125) AND (`name`='调试') +2024-03-14 20:37:41.319 [DEBU] {46e42639cda1bc1716359965c63f5cc7} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=126) AND (`name`='基础') +2024-03-14 20:37:41.344 [DEBU] {8d63be3acda1bc1717359965193be0a2} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=127) AND (`name`='安装') +2024-03-14 20:37:41.368 [DEBU] {ea5b3f3ccda1bc171835996521fa6ee3} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=128) AND (`name`='电缆沟开挖') +2024-03-14 20:37:41.391 [DEBU] {3f28a73dcda1bc1719359965ebbaa6c5} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=129) AND (`name`='敷设') +2024-03-14 20:37:41.416 [DEBU] {b2bf083fcda1bc171a359965e1e27407} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=130) AND (`name`='试验') +2024-03-14 20:37:41.441 [DEBU] {af278b40cda1bc171b359965fb9ff248} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=131) AND (`name`='调试试验') +2024-03-14 20:37:41.465 [DEBU] {28dc0542cda1bc171c359965d14bee7e} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=132) AND (`name`='基础') +2024-03-14 20:37:41.492 [DEBU] {41797543cda1bc171d359965c24d535f} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=133) AND (`name`='安装') +2024-03-14 20:37:41.518 [DEBU] {6d091245cda1bc171e35996520154759} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=134) AND (`name`='敷设') +2024-03-14 20:37:41.543 [DEBU] {b74d9e46cda1bc171f359965295de684} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=135) AND (`name`='试验') +2024-03-14 20:37:41.565 [DEBU] {58331648cda1bc1720359965df6fa931} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=136) AND (`name`='调试试验') +2024-03-14 20:46:44.888 [DEBU] {63c8fdb34ba2bc17fae3e3049c8d12a0} [369 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 20:46:44.916 [DEBU] {28270aca4ba2bc17fbe3e3044babd425} [ 27 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 20:46:44.930 [DEBU] {b54eafcb4ba2bc17fce3e3042489e24b} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 20:46:44.954 [DEBU] {af7a79cc4ba2bc17fde3e3041981d656} [ 24 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 20:46:44.978 [DEBU] {5f2bf4cd4ba2bc17fee3e30491c7d34f} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 20:46:45.002 [DEBU] {87085fcf4ba2bc17ffe3e304aad7387c} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 20:46:45.029 [DEBU] {25bdc6d04ba2bc1700e4e304cbbb3a31} [ 27 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 20:46:45.057 [DEBU] {47776cd24ba2bc1701e4e30412766e32} [ 27 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 20:46:45.084 [DEBU] {06db11d44ba2bc1702e4e3041ebc53a6} [ 26 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 20:46:45.097 [DEBU] {8937a8d54ba2bc1703e4e3043916e435} [ 13 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 20:46:45.120 [DEBU] {68326bd64ba2bc1704e4e30492e327f5} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') +2024-03-14 20:46:45.152 [DEBU] {54ceccd74ba2bc1705e4e304943b2e6c} [ 32 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') LIMIT 1 +2024-03-14 20:46:45.177 [DEBU] {6f84bcd94ba2bc1706e4e304d4cb35c2} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') +2024-03-14 20:46:45.203 [DEBU] {36a455db4ba2bc1707e4e304540de1c9} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') LIMIT 1 +2024-03-14 20:46:45.226 [DEBU] {0f4dbedc4ba2bc1708e4e3047005e2ce} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') +2024-03-14 20:46:45.248 [DEBU] {60481bde4ba2bc1709e4e304e1b8750e} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') LIMIT 1 +2024-03-14 20:46:45.271 [DEBU] {700b74df4ba2bc170ae4e30496c2d232} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=112) AND (`name`='基础') +2024-03-14 20:46:45.295 [DEBU] {bc44cae04ba2bc170be4e304043814f6} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=112) AND (`name`='基础') LIMIT 1 +2024-03-14 20:46:45.318 [DEBU] {efda3ce24ba2bc170ce4e304e7f073ad} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=113) AND (`name`='安装') +2024-03-14 20:46:45.340 [DEBU] {b9779be34ba2bc170de4e304bbfdbfd9} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=114) AND (`name`='路基') +2024-03-14 20:46:45.363 [DEBU] {11edf0e44ba2bc170ee4e304e94fc994} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=115) AND (`name`='排水沟') +2024-03-14 20:46:45.400 [DEBU] {e1e24be64ba2bc170fe4e30427eae90b} [ 37 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=116) AND (`name`='钻孔') +2024-03-14 20:46:45.425 [DEBU] {6c0283e84ba2bc1710e4e304deea984b} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=117) AND (`name`='桩基') +2024-03-14 20:46:45.447 [DEBU] {1f42f5e94ba2bc1711e4e3045e1f8737} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=118) AND (`name`='支架') +2024-03-14 20:46:45.471 [DEBU] {2aa84aeb4ba2bc1712e4e30479cf57e2} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=119) AND (`name`='光伏板') +2024-03-14 20:46:45.494 [DEBU] {7564b4ec4ba2bc1713e4e304845fc98b} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=120) AND (`name`='直流电缆') +2024-03-14 20:46:45.516 [DEBU] {f7e71aee4ba2bc1714e4e3041ec1eaa8} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=121) AND (`name`='接地线') +2024-03-14 20:46:45.539 [DEBU] {0da56def4ba2bc1715e4e3044bd0c995} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=122) AND (`name`='逆变器安装') +2024-03-14 20:46:45.561 [DEBU] {8e8cc4f04ba2bc1716e4e304aaed06a8} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=123) AND (`name`='电缆沟开挖') +2024-03-14 20:46:45.586 [DEBU] {8bdf1af24ba2bc1717e4e304540b6bb8} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=124) AND (`name`='敷设') +2024-03-14 20:46:45.610 [DEBU] {897e96f34ba2bc1718e4e30408227bd5} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=125) AND (`name`='调试') +2024-03-14 20:46:45.633 [DEBU] {67a905f54ba2bc1719e4e30421cd025d} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=126) AND (`name`='基础') +2024-03-14 20:46:45.655 [DEBU] {e8bd62f64ba2bc171ae4e3042caf77af} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=127) AND (`name`='安装') +2024-03-14 20:46:45.680 [DEBU] {b52cb3f74ba2bc171be4e304e35f8f1c} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=128) AND (`name`='电缆沟开挖') +2024-03-14 20:46:45.704 [DEBU] {215436f94ba2bc171ce4e3043a7fe44b} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=129) AND (`name`='敷设') +2024-03-14 20:46:45.728 [DEBU] {6cdb9efa4ba2bc171de4e3047647d4dc} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=130) AND (`name`='试验') +2024-03-14 20:46:45.750 [DEBU] {02c204fc4ba2bc171ee4e304a880a0af} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=131) AND (`name`='调试试验') +2024-03-14 20:46:45.779 [DEBU] {136063fd4ba2bc171fe4e30422f57eae} [ 28 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=132) AND (`name`='基础') +2024-03-14 20:46:45.812 [DEBU] {51ac1bff4ba2bc1720e4e3042ad5b103} [ 32 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=133) AND (`name`='安装') +2024-03-14 20:46:45.834 [DEBU] {be1c08014ca2bc1721e4e304525e49e6} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=134) AND (`name`='敷设') +2024-03-14 20:46:45.858 [DEBU] {d9985f024ca2bc1722e4e304d400c9b6} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=135) AND (`name`='试验') +2024-03-14 20:46:45.885 [DEBU] {8dafc3034ca2bc1723e4e3046ddbea08} [ 27 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=136) AND (`name`='调试试验') +2024-03-14 20:48:03.514 [DEBU] {fa3071035ea2bc178c505978b80fa619} [352 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 20:48:03.542 [DEBU] {3057a9185ea2bc178d505978ef5e4844} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 20:48:03.558 [DEBU] {7ff11c1a5ea2bc178e505978342873f7} [ 16 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 20:48:03.582 [DEBU] {49310f1b5ea2bc178f50597836c2dea5} [ 24 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 20:48:03.605 [DEBU] {e1817f1c5ea2bc179050597833a717ae} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 20:48:03.628 [DEBU] {fff1e31d5ea2bc1791505978aaf7bc66} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 20:48:03.652 [DEBU] {91bc421f5ea2bc17925059786b6b693b} [ 23 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 20:48:03.676 [DEBU] {b8c9af205ea2bc179350597828dc8c55} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 20:48:03.699 [DEBU] {28e71c225ea2bc1794505978c3bf80b1} [ 23 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 20:48:03.712 [DEBU] {6b3080235ea2bc1795505978bca61694} [ 12 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 20:48:03.735 [DEBU] {3c8541245ea2bc17965059780f3b048d} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') +2024-03-14 20:48:03.758 [DEBU] {0357a5255ea2bc179750597882d2455d} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') LIMIT 1 +2024-03-14 20:48:03.780 [DEBU] {7a15f8265ea2bc1798505978d82d57d0} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') +2024-03-14 20:48:03.803 [DEBU] {d49d50285ea2bc1799505978c543a11c} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') LIMIT 1 +2024-03-14 20:48:03.825 [DEBU] {3c38b2295ea2bc179a5059783b8d34fc} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') +2024-03-14 20:48:03.848 [DEBU] {23b4002b5ea2bc179b5059784067f2e0} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') LIMIT 1 +2024-03-14 20:48:03.871 [DEBU] {5940622c5ea2bc179c505978fea391f6} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=112) AND (`name`='基础') +2024-03-14 20:48:03.894 [DEBU] {a554bb2d5ea2bc179d505978a9777f91} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=112) AND (`name`='基础') LIMIT 1 +2024-03-14 20:48:03.917 [DEBU] {37d4142f5ea2bc179e5059780f400ba9} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=113) AND (`name`='安装') +2024-03-14 20:48:03.940 [DEBU] {19097a305ea2bc179f505978f78885a7} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=114) AND (`name`='路基') +2024-03-14 20:48:03.962 [DEBU] {dcf8d6315ea2bc17a0505978e577c5df} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=115) AND (`name`='排水沟') +2024-03-14 20:48:03.989 [DEBU] {ad752d335ea2bc17a15059785565afc3} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=116) AND (`name`='钻孔') +2024-03-14 20:48:04.014 [DEBU] {cc23bd345ea2bc17a2505978b3021ade} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=117) AND (`name`='桩基') +2024-03-14 20:48:04.036 [DEBU] {aaba38365ea2bc17a35059789c9d00c0} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=118) AND (`name`='支架') +2024-03-14 20:48:04.058 [DEBU] {65648b375ea2bc17a450597865b2a0f5} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=119) AND (`name`='光伏板') +2024-03-14 20:48:04.086 [DEBU] {c827da385ea2bc17a5505978e19aff48} [ 28 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=120) AND (`name`='直流电缆') +2024-03-14 20:48:04.108 [DEBU] {c5018c3a5ea2bc17a65059784d554ec7} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=121) AND (`name`='接地线') +2024-03-14 20:48:04.131 [DEBU] {f295db3b5ea2bc17a75059786c3fa4a6} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=122) AND (`name`='逆变器安装') +2024-03-14 20:48:04.153 [DEBU] {5b79363d5ea2bc17a85059781a9dd1e5} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=123) AND (`name`='电缆沟开挖') +2024-03-14 20:48:04.177 [DEBU] {641b8b3e5ea2bc17a9505978a17fb75b} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=124) AND (`name`='敷设') +2024-03-14 20:48:04.200 [DEBU] {bcbefe3f5ea2bc17aa505978e23a2eb6} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=125) AND (`name`='调试') +2024-03-14 20:48:04.222 [DEBU] {c47c4f415ea2bc17ab50597845ab4f08} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=126) AND (`name`='基础') +2024-03-14 20:48:04.245 [DEBU] {9f6fa2425ea2bc17ac505978f255b684} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=127) AND (`name`='安装') +2024-03-14 20:48:04.269 [DEBU] {1a5d02445ea2bc17ad505978d3e20252} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=128) AND (`name`='电缆沟开挖') +2024-03-14 20:48:04.295 [DEBU] {574977455ea2bc17ae5059782f25b8b9} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=129) AND (`name`='敷设') +2024-03-14 20:48:04.316 [DEBU] {e7b501475ea2bc17af505978743aa8ac} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=130) AND (`name`='试验') +2024-03-14 20:48:04.338 [DEBU] {45623f485ea2bc17b050597800cfc2a8} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=131) AND (`name`='调试试验') +2024-03-14 20:48:04.363 [DEBU] {b4e18e495ea2bc17b150597803e7eee5} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=132) AND (`name`='基础') +2024-03-14 20:48:04.392 [DEBU] {7f91124b5ea2bc17b250597837029a5c} [ 28 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=133) AND (`name`='安装') +2024-03-14 20:48:04.415 [DEBU] {3873c54c5ea2bc17b35059787b203ff0} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=134) AND (`name`='敷设') +2024-03-14 20:48:04.437 [DEBU] {079d254e5ea2bc17b450597889fc3a27} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=135) AND (`name`='试验') +2024-03-14 20:48:04.462 [DEBU] {671c7c4f5ea2bc17b5505978a9a87412} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=136) AND (`name`='调试试验') +2024-03-14 20:48:52.343 [DEBU] {00c8186169a2bc17268122461e0ffb92} [365 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-14 20:48:52.367 [DEBU] {b5b3eb7669a2bc172781224693b2194d} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-14 20:48:52.383 [DEBU] {6c79597869a2bc17288122468669d817} [ 15 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-14 20:48:52.406 [DEBU] {b4293e7969a2bc17298122463e96d76d} [ 23 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-14 20:48:52.431 [DEBU] {8943a67a69a2bc172a812246ebe30e57} [ 25 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-14 20:48:52.460 [DEBU] {0788267c69a2bc172b81224619a96c5a} [ 28 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-14 20:48:52.483 [DEBU] {4b9ddc7d69a2bc172c8122464682f64c} [ 23 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-14 20:48:52.510 [DEBU] {6ef8447f69a2bc172d8122464b0f365f} [ 26 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-14 20:48:52.533 [DEBU] {2994dc8069a2bc172e81224611b5e4d1} [ 22 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-14 20:48:52.548 [DEBU] {6ce5398269a2bc172f812246aafdafb6} [ 14 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-14 20:48:52.571 [DEBU] {6ea5188369a2bc17308122460aebf692} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') +2024-03-14 20:48:52.595 [DEBU] {e164758469a2bc17318122461c2adac6} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=109) AND (`name`='接地沟') LIMIT 1 +2024-03-14 20:48:52.617 [DEBU] {a07bec8569a2bc17328122462eef4168} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') +2024-03-14 20:48:52.640 [DEBU] {09473b8769a2bc17338122463acebb20} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=110) AND (`name`='接地敷设') LIMIT 1 +2024-03-14 20:48:52.662 [DEBU] {b0afa68869a2bc1734812246be1834c3} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') +2024-03-14 20:48:52.687 [DEBU] {1300eb8969a2bc17358122462afac0bb} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=111) AND (`name`='检测') LIMIT 1 +2024-03-14 20:48:52.710 [DEBU] {027f608b69a2bc1736812246bebe3ff5} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=112) AND (`name`='基础') +2024-03-14 20:48:52.732 [DEBU] {ba6cc18c69a2bc173781224682d28292} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=112) AND (`name`='基础') LIMIT 1 +2024-03-14 20:48:52.754 [DEBU] {676c198e69a2bc1738812246a3210f08} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=113) AND (`name`='安装') +2024-03-14 20:48:52.776 [DEBU] {fc93648f69a2bc173981224607353f23} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=114) AND (`name`='路基') +2024-03-14 20:48:52.800 [DEBU] {b128b49069a2bc173a8122460dbe4133} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=115) AND (`name`='排水沟') +2024-03-14 20:48:52.823 [DEBU] {9dec189269a2bc173b812246f0a57157} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=116) AND (`name`='钻孔') +2024-03-14 20:48:52.845 [DEBU] {1477789369a2bc173c8122464f6970d5} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=117) AND (`name`='桩基') +2024-03-14 20:48:52.867 [DEBU] {83f6d49469a2bc173d81224672cfc247} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=118) AND (`name`='支架') +2024-03-14 20:48:52.890 [DEBU] {8e2d239669a2bc173e8122460943063a} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=119) AND (`name`='光伏板') +2024-03-14 20:48:52.912 [DEBU] {5924789769a2bc173f812246ac65a17f} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=120) AND (`name`='直流电缆') +2024-03-14 20:48:52.934 [DEBU] {adb4ce9869a2bc174081224614ba89f5} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=121) AND (`name`='接地线') +2024-03-14 20:48:52.956 [DEBU] {cf72229a69a2bc17418122462beae8ad} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=122) AND (`name`='逆变器安装') +2024-03-14 20:48:52.983 [DEBU] {d76b6e9b69a2bc174281224626ac37ae} [ 27 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=123) AND (`name`='电缆沟开挖') +2024-03-14 20:48:53.007 [DEBU] {1d0e0f9d69a2bc174381224697580a88} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=124) AND (`name`='敷设') +2024-03-14 20:48:53.030 [DEBU] {c5297d9e69a2bc174481224622853e15} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=125) AND (`name`='调试') +2024-03-14 20:48:53.052 [DEBU] {f28ccf9f69a2bc1745812246a4b2b6b5} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=126) AND (`name`='基础') +2024-03-14 20:48:53.074 [DEBU] {7af626a169a2bc1746812246feda6486} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=127) AND (`name`='安装') +2024-03-14 20:48:53.095 [DEBU] {9fe275a269a2bc1747812246ad206cd8} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=128) AND (`name`='电缆沟开挖') +2024-03-14 20:48:53.119 [DEBU] {cbc5baa369a2bc174881224659b6dd45} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=129) AND (`name`='敷设') +2024-03-14 20:48:53.142 [DEBU] {7b7122a569a2bc1749812246db3d93a2} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=130) AND (`name`='试验') +2024-03-14 20:48:53.164 [DEBU] {9c4b82a669a2bc174a812246688a5391} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=131) AND (`name`='调试试验') +2024-03-14 20:48:53.187 [DEBU] {3e3cd1a769a2bc174b812246bfe412d0} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=132) AND (`name`='基础') +2024-03-14 20:48:53.210 [DEBU] {49882da969a2bc174c812246e792b207} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=133) AND (`name`='安装') +2024-03-14 20:48:53.232 [DEBU] {e91691aa69a2bc174d812246ebae081c} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=134) AND (`name`='敷设') +2024-03-14 20:48:53.254 [DEBU] {2db8dfab69a2bc174e81224612b15940} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=135) AND (`name`='试验') +2024-03-14 20:48:53.275 [DEBU] {66022cad69a2bc174f812246a2eee1c6} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE (`parent_id`=136) AND (`name`='调试试验') diff --git a/test/resource/log/sql/2024-03-15.log b/test/resource/log/sql/2024-03-15.log new file mode 100644 index 0000000..eb5c236 --- /dev/null +++ b/test/resource/log/sql/2024-03-15.log @@ -0,0 +1,360 @@ +2024-03-15 10:52:55.520 [DEBU] {3a3d6bb078d0bc17cc31ba2b47a464a8} [252 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 10:52:55.542 [DEBU] {2fd96ebf78d0bc17cd31ba2bc7d6de38} [ 22 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 10:52:55.554 [DEBU] {a839c3c078d0bc17ce31ba2ba8df6753} [ 12 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 10:52:55.576 [DEBU] {225381c178d0bc17cf31ba2b0796d2ab} [ 21 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 10:52:55.621 [DEBU] {69c5cdc278d0bc17d031ba2b826a2c2a} [ 45 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-15 10:52:55.644 [DEBU] {eb0d7bc578d0bc17d131ba2b1b0341a9} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-15 10:52:55.665 [DEBU] {f307d5c678d0bc17d231ba2b2369e6bf} [ 21 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-15 10:52:55.691 [DEBU] {bf691ac878d0bc17d331ba2b0da80213} [ 26 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-15 10:52:55.714 [DEBU] {9649a5c978d0bc17d431ba2b8cd75b18} [ 23 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-15 10:52:55.726 [DEBU] {561400cb78d0bc17d531ba2bd87f75af} [ 12 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-15 10:52:55.749 [DEBU] {8aabb3cb78d0bc17d631ba2b5dd0e026} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=109 +2024-03-15 10:52:55.772 [DEBU] {c1651ccd78d0bc17d731ba2b0b02c763} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=109) AND (`types`=1) LIMIT 1 +2024-03-15 10:52:55.793 [DEBU] {94b578ce78d0bc17d831ba2b2327a1fb} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=110 +2024-03-15 10:52:55.814 [DEBU] {e4c4bacf78d0bc17d931ba2b6d985bfc} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=110) AND (`types`=1) LIMIT 1 +2024-03-15 10:52:55.836 [DEBU] {dbeafdd078d0bc17da31ba2bdd21fa4d} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=111 +2024-03-15 10:52:55.858 [DEBU] {b0bf46d278d0bc17db31ba2b117f6c73} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=111) AND (`types`=1) LIMIT 1 +2024-03-15 10:52:55.879 [DEBU] {b1749fd378d0bc17dc31ba2bf5f628ac} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=112 +2024-03-15 10:52:55.900 [DEBU] {5f98d9d478d0bc17dd31ba2b20b9a07d} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=112) AND (`types`=1) LIMIT 1 +2024-03-15 10:52:55.920 [DEBU] {0e0b15d678d0bc17de31ba2b02473205} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=113 +2024-03-15 10:52:55.942 [DEBU] {61724cd778d0bc17df31ba2b18a64992} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=114 +2024-03-15 10:52:55.962 [DEBU] {d8f099d878d0bc17e031ba2b735b329c} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=115 +2024-03-15 10:52:55.988 [DEBU] {11d9d3d978d0bc17e131ba2be1b147ee} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=116 +2024-03-15 10:52:56.009 [DEBU] {ae765cdb78d0bc17e231ba2bc17b7611} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=117 +2024-03-15 10:52:56.031 [DEBU] {cbf29bdc78d0bc17e331ba2bfbc9bfac} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=118 +2024-03-15 10:52:56.053 [DEBU] {459de9dd78d0bc17e431ba2ba64b180b} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=119 +2024-03-15 10:52:56.076 [DEBU] {5e4838df78d0bc17e531ba2b6e9c60a6} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=120 +2024-03-15 10:52:56.101 [DEBU] {85bb97e078d0bc17e631ba2b842abde5} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=121 +2024-03-15 10:52:56.123 [DEBU] {88c914e278d0bc17e731ba2bf0ee6b72} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=122 +2024-03-15 10:52:56.144 [DEBU] {1ed169e378d0bc17e831ba2b93757b82} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=123 +2024-03-15 10:52:56.164 [DEBU] {da60a2e478d0bc17e931ba2bd8b4aca0} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=124 +2024-03-15 10:52:56.184 [DEBU] {8371d3e578d0bc17ea31ba2bc00e128d} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=125 +2024-03-15 10:52:56.208 [DEBU] {5f5703e778d0bc17eb31ba2bb32befd9} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=126 +2024-03-15 10:52:56.229 [DEBU] {923d78e878d0bc17ec31ba2b35989b72} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=127 +2024-03-15 10:52:56.249 [DEBU] {713bb4e978d0bc17ed31ba2bb01dfb33} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=128 +2024-03-15 10:52:56.269 [DEBU] {da3ae9ea78d0bc17ee31ba2b901b59ad} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=129 +2024-03-15 10:52:56.289 [DEBU] {b7de1aec78d0bc17ef31ba2bbb64786b} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=130 +2024-03-15 10:52:56.312 [DEBU] {15bf49ed78d0bc17f031ba2bfd5ca785} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=131 +2024-03-15 10:52:56.333 [DEBU] {0047b0ee78d0bc17f131ba2be750868b} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=132 +2024-03-15 10:52:56.357 [DEBU] {02e8e9ef78d0bc17f231ba2b5415e37e} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=133 +2024-03-15 10:52:56.377 [DEBU] {541050f178d0bc17f331ba2b29c4a256} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=134 +2024-03-15 10:52:56.398 [DEBU] {c1c183f278d0bc17f431ba2b238efc51} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=135 +2024-03-15 10:52:56.432 [DEBU] {cc46cbf378d0bc17f531ba2b773bbc6c} [ 34 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=136 +2024-03-15 10:53:07.881 [DEBU] {4302e48a7bd0bc17696cf730487eb632} [358 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 10:53:07.905 [DEBU] {17f145a07bd0bc176a6cf730a33194ad} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 10:53:07.918 [DEBU] {211dafa17bd0bc176b6cf730956f5054} [ 12 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 10:53:07.940 [DEBU] {845b75a27bd0bc176c6cf7300b091d3e} [ 21 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 10:53:07.968 [DEBU] {12a2caa37bd0bc176d6cf7307a3b6681} [ 27 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-15 10:53:07.994 [DEBU] {788b74a57bd0bc176e6cf730c5355b12} [ 25 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-15 10:53:08.045 [DEBU] {b4b0f6a67bd0bc176f6cf7302af5fefd} [ 51 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-15 10:53:08.080 [DEBU] {da4413aa7bd0bc17706cf7304f10f0a2} [ 34 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-15 10:53:08.109 [DEBU] {73c718ac7bd0bc17716cf730720af0f1} [ 29 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-15 10:53:08.124 [DEBU] {803ad6ad7bd0bc17726cf730f3cff2af} [ 15 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-15 10:53:08.147 [DEBU] {6704b4ae7bd0bc17736cf7302987889f} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=109 +2024-03-15 10:53:08.176 [DEBU] {e07c18b07bd0bc17746cf7304f667865} [ 29 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=109) AND (`types`=1) LIMIT 1 +2024-03-15 10:53:08.198 [DEBU] {31a8d5b17bd0bc17756cf730e964ba02} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=110 +2024-03-15 10:53:08.220 [DEBU] {fe7f1db37bd0bc17766cf730c6c60477} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=110) AND (`types`=1) LIMIT 1 +2024-03-15 10:53:08.241 [DEBU] {6bed71b47bd0bc17776cf7307d52478b} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=111 +2024-03-15 10:53:08.265 [DEBU] {dfddceb57bd0bc17786cf73054816fe7} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=111) AND (`types`=1) LIMIT 1 +2024-03-15 10:53:08.289 [DEBU] {500421b77bd0bc17796cf73017a8add4} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=112 +2024-03-15 10:53:08.311 [DEBU] {d9f987b87bd0bc177a6cf730b84ba426} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=112) AND (`types`=1) LIMIT 1 +2024-03-15 10:53:08.332 [DEBU] {c067deb97bd0bc177b6cf730408c4c49} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=113 +2024-03-15 10:53:08.356 [DEBU] {35341dbb7bd0bc177c6cf73072dff6cf} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=114 +2024-03-15 10:53:08.379 [DEBU] {fa2884bc7bd0bc177d6cf730e1fb241a} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=115 +2024-03-15 10:53:08.403 [DEBU] {c541e3bd7bd0bc177e6cf730bcf88d22} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=116 +2024-03-15 10:53:08.424 [DEBU] {a48053bf7bd0bc177f6cf730f4a5a499} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=117 +2024-03-15 10:53:08.445 [DEBU] {9a6a93c07bd0bc17806cf730b254dd8a} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=118 +2024-03-15 10:53:08.467 [DEBU] {a2c5ddc17bd0bc17816cf7307118340d} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=119 +2024-03-15 10:53:08.490 [DEBU] {c22622c37bd0bc17826cf730193fb10d} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=120 +2024-03-15 10:53:08.511 [DEBU] {5ee483c47bd0bc17836cf73088d8e137} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=121 +2024-03-15 10:53:08.534 [DEBU] {064bccc57bd0bc17846cf73087031dd5} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=122 +2024-03-15 10:53:08.556 [DEBU] {611a2bc77bd0bc17856cf7309fc4dc8e} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=123 +2024-03-15 10:53:08.583 [DEBU] {b4d570c87bd0bc17866cf730c286040d} [ 27 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=124 +2024-03-15 10:53:08.606 [DEBU] {ecc711ca7bd0bc17876cf73060f44c0e} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=125 +2024-03-15 10:53:08.627 [DEBU] {9e5e76cb7bd0bc17886cf7309ed85e42} [ 20 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=126 +2024-03-15 10:53:08.649 [DEBU] {8f45b9cc7bd0bc17896cf7302b25ff22} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=127 +2024-03-15 10:53:08.672 [DEBU] {80e6fecd7bd0bc178a6cf73031c35a25} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=128 +2024-03-15 10:53:08.695 [DEBU] {622b67cf7bd0bc178b6cf7306d9a8c38} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=129 +2024-03-15 10:53:08.717 [DEBU] {655ec3d07bd0bc178c6cf730bdb506ea} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=130 +2024-03-15 10:53:08.738 [DEBU] {898408d27bd0bc178d6cf730704ca5ef} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=131 +2024-03-15 10:53:08.759 [DEBU] {cf8849d37bd0bc178e6cf7303c3400cd} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=132 +2024-03-15 10:53:08.781 [DEBU] {06da8ed47bd0bc178f6cf7302bac75e1} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=133 +2024-03-15 10:53:08.813 [DEBU] {b1dfdad57bd0bc17906cf730fbf1f8a5} [ 32 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=134 +2024-03-15 10:53:08.839 [DEBU] {e24ecbd77bd0bc17916cf73060025540} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=135 +2024-03-15 10:53:08.861 [DEBU] {bbd85bd97bd0bc17926cf73043ac6dcd} [ 21 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=136 +2024-03-15 10:55:07.787 [DEBU] {8bc9347697d0bc17763e243280bb7140} [350 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 10:55:07.821 [DEBU] {1f33758b97d0bc17773e2432753a16ee} [ 29 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 10:55:07.835 [DEBU] {e08e3e8d97d0bc17783e243234b6f2fc} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 10:55:07.862 [DEBU] {70ba0a8e97d0bc17793e2432364d8658} [ 27 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 10:55:07.886 [DEBU] {21a4af8f97d0bc177a3e2432b02143a2} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-15 10:55:07.910 [DEBU] {3cbe1c9197d0bc177b3e24327cff9ba6} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-15 10:55:07.938 [DEBU] {f1d68f9297d0bc177c3e2432f539b90f} [ 27 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-15 10:55:07.962 [DEBU] {c6bc3d9497d0bc177d3e2432f07405b0} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-15 10:55:07.986 [DEBU] {06a8ab9597d0bc177e3e24324696cc9b} [ 23 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-15 10:55:08.001 [DEBU] {6d6a1e9797d0bc177f3e2432c36221b8} [ 14 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-15 10:55:08.025 [DEBU] {fc98ee9797d0bc17803e24329f754ff2} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=109 +2024-03-15 10:55:08.051 [DEBU] {4842619997d0bc17813e2432f4dedb9a} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=109) AND (`types`=1) LIMIT 1 +2024-03-15 10:55:08.075 [DEBU] {409dea9a97d0bc17823e24324301dce3} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=110 +2024-03-15 10:55:08.099 [DEBU] {b4f4559c97d0bc17833e24321e8105e3} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=110) AND (`types`=1) LIMIT 1 +2024-03-15 10:55:08.128 [DEBU] {0446c79d97d0bc17843e243215f303f1} [ 29 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=111 +2024-03-15 10:55:08.151 [DEBU] {7ec2819f97d0bc17853e2432426a64cb} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=111) AND (`types`=1) LIMIT 1 +2024-03-15 10:55:08.179 [DEBU] {d7cddfa097d0bc17863e2432f4a486d9} [ 28 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=112 +2024-03-15 10:55:08.205 [DEBU] {0a438ea297d0bc17873e2432f714e42f} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE (`parent_id`=112) AND (`types`=1) LIMIT 1 +2024-03-15 10:55:08.233 [DEBU] {b5a21da497d0bc17883e243205fa7f84} [ 28 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=113 +2024-03-15 10:55:08.256 [DEBU] {dcdebda597d0bc17893e2432f185d4eb} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=114 +2024-03-15 10:55:08.279 [DEBU] {450122a797d0bc178a3e2432872e9f61} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=115 +2024-03-15 10:55:08.304 [DEBU] {c3b280a897d0bc178b3e2432293f216a} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=116 +2024-03-15 10:55:08.337 [DEBU] {e838faa997d0bc178c3e2432bc18b6bb} [ 33 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=117 +2024-03-15 10:55:08.362 [DEBU] {3ceef8ab97d0bc178d3e2432210ea964} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=118 +2024-03-15 10:55:08.384 [DEBU] {299b74ad97d0bc178e3e24326a956222} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=119 +2024-03-15 10:55:08.407 [DEBU] {0d89c7ae97d0bc178f3e24320a5751b5} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=120 +2024-03-15 10:55:08.438 [DEBU] {4fcc21b097d0bc17903e2432571a7340} [ 31 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=121 +2024-03-15 10:55:08.461 [DEBU] {8f0afdb197d0bc17913e24324fcd8715} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=122 +2024-03-15 10:55:08.487 [DEBU] {017d63b397d0bc17923e2432c74d8956} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=123 +2024-03-15 10:55:08.510 [DEBU] {59a4e6b497d0bc17933e2432329ab468} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=124 +2024-03-15 10:55:08.535 [DEBU] {ba9345b697d0bc17943e24327ebdd5ff} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=125 +2024-03-15 10:55:08.557 [DEBU] {610bc6b797d0bc17953e2432dbb36d2c} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=126 +2024-03-15 10:55:08.580 [DEBU] {14fc16b997d0bc17963e243237e4cc1a} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=127 +2024-03-15 10:55:08.603 [DEBU] {310770ba97d0bc17973e243288bf976f} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=128 +2024-03-15 10:55:08.629 [DEBU] {5fbcd1bb97d0bc17983e24323420fbf5} [ 26 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=129 +2024-03-15 10:55:08.652 [DEBU] {fc625fbd97d0bc17993e2432c7620db8} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=130 +2024-03-15 10:55:08.677 [DEBU] {2fffbcbe97d0bc179a3e2432e00fbb94} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=131 +2024-03-15 10:55:08.700 [DEBU] {29283ec097d0bc179b3e2432125d9051} [ 23 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=132 +2024-03-15 10:55:08.722 [DEBU] {c37298c197d0bc179c3e2432f5a9b8c5} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=133 +2024-03-15 10:55:08.754 [DEBU] {f5d0edc297d0bc179d3e243276ddd852} [ 32 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=134 +2024-03-15 10:55:08.783 [DEBU] {c1e4ccc497d0bc179e3e243222430296} [ 29 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=135 +2024-03-15 10:55:08.805 [DEBU] {eadd87c697d0bc179f3e24322eb7b7e7} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT COUNT(1) FROM `project_schedule` WHERE `parent_id`=136 +2024-03-15 15:22:12.842 [DEBU] {b344f2942adfbc1763946c41ac6a6c31} [368 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 15:22:12.880 [DEBU] {bec351ab2adfbc1764946c41c73a2bc1} [ 31 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 15:22:12.905 [DEBU] {58b527ad2adfbc1765946c41ee4c5cb8} [ 25 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 15:22:12.927 [DEBU] {8776a0ae2adfbc1766946c41a89556f4} [ 22 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 15:22:12.950 [DEBU] {1975fcaf2adfbc1767946c41fb84e1f8} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-15 15:22:12.974 [DEBU] {904051b12adfbc1768946c4107799d31} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-15 15:22:13.006 [DEBU] {7263c4b22adfbc1769946c413bbabe7c} [ 32 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-15 15:22:13.029 [DEBU] {4dc3afb42adfbc176a946c41ca1db203} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-15 15:22:13.054 [DEBU] {bbc70ab62adfbc176b946c415eb761ed} [ 25 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-15 15:22:16.589 [DEBU] {a3a7bc742bdfbc17252b096f3c5df7a5} [360 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 15:22:16.613 [DEBU] {f176458a2bdfbc17262b096f91fdfc31} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 15:22:16.629 [DEBU] {a85aaa8b2bdfbc17272b096fcbf3084c} [ 16 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 15:22:16.652 [DEBU] {566da68c2bdfbc17282b096f7199c157} [ 21 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 15:22:16.682 [DEBU] {38e5fb8d2bdfbc17292b096f90667817} [ 30 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-15 15:22:16.704 [DEBU] {a732ca8f2bdfbc172a2b096f7d3073ca} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-15 15:22:16.725 [DEBU] {68b31b912bdfbc172b2b096f70339bf2} [ 20 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-15 15:22:16.748 [DEBU] {6d3465922bdfbc172c2b096f67e8d9a6} [ 22 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-15 15:22:16.775 [DEBU] {bafebd932bdfbc172d2b096f189e7f11} [ 26 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-15 15:23:38.076 [DEBU] {bd7a6c6e3edfbc17e443f931685c43b1} [349 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 15:23:38.099 [DEBU] {1d2846833edfbc17e543f931fdc18a29} [ 22 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 15:23:38.112 [DEBU] {0689a1843edfbc17e643f9317128c6f1} [ 12 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 15:23:38.137 [DEBU] {dd3e62853edfbc17e743f93153ff77c9} [ 25 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 15:23:38.160 [DEBU] {c20ae9863edfbc17e843f93157cbaf7e} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-15 15:23:38.183 [DEBU] {892d45883edfbc17e943f93121f85770} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-15 15:23:38.206 [DEBU] {6351a5893edfbc17ea43f931afa21d6c} [ 22 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-15 15:23:38.230 [DEBU] {be7f0e8b3edfbc17eb43f9314f5deb43} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-15 15:23:38.266 [DEBU] {f7709f8c3edfbc17ec43f931bf8a89c8} [ 32 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-15 15:24:18.526 [DEBU] {6c128dd947dfbc178ae708151fd77f80} [347 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 15:24:18.551 [DEBU] {e5b241ee47dfbc178be7081532152e41} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 15:24:18.564 [DEBU] {647fbcef47dfbc178ce70815701b3c86} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 15:24:18.594 [DEBU] {c54989f047dfbc178de70815d6df4b0a} [ 29 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 15:24:18.620 [DEBU] {122a57f247dfbc178ee70815ce9da2db} [ 25 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-15 15:24:18.644 [DEBU] {11ace0f347dfbc178fe70815db247378} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-15 15:24:18.677 [DEBU] {e1904cf547dfbc1790e708152659dd57} [ 32 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-15 15:24:18.701 [DEBU] {38bb43f747dfbc1791e708151bea99a4} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-15 15:24:18.725 [DEBU] {cf4eb0f847dfbc1792e70815d826a479} [ 24 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-15 15:24:37.628 [DEBU] {5b4b0f4a4cdfbc1797572153f7f2fb0b} [382 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 15:24:37.657 [DEBU] {fbdafe604cdfbc179857215343ccc2ef} [ 26 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 15:24:37.672 [DEBU] {f0f796624cdfbc17995721533f170f29} [ 14 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 15:24:37.696 [DEBU] {a4f86b634cdfbc179a572153b7760a03} [ 24 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 15:24:37.728 [DEBU] {1fbde9644cdfbc179b5721530327012e} [ 31 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-15 15:24:37.751 [DEBU] {91b8cb664cdfbc179c5721533913f857} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-15 15:24:37.778 [DEBU] {48fe30684cdfbc179d572153b14a2464} [ 26 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-15 15:24:37.804 [DEBU] {10b3cd694cdfbc179e572153444f4692} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-15 15:24:37.827 [DEBU] {51ab536b4cdfbc179f57215388e4e66f} [ 22 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-15 15:25:03.333 [DEBU] {5c7f604752dfbc1712db2a073f84d67c} [362 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 15:25:03.359 [DEBU] {4983fd5c52dfbc1713db2a07e2d8b2ed} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 15:25:03.372 [DEBU] {a25d815e52dfbc1714db2a073b97c908} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 15:25:03.399 [DEBU] {e94c435f52dfbc1715db2a072306fd53} [ 27 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 15:25:03.421 [DEBU] {a659e66052dfbc1716db2a07554b0afa} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-15 15:25:03.448 [DEBU] {a9703c6252dfbc1717db2a073a59aa7e} [ 26 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-15 15:25:03.472 [DEBU] {6fd9d86352dfbc1718db2a07d662333b} [ 23 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-15 15:25:03.503 [DEBU] {eb1f416552dfbc1719db2a07824c302e} [ 30 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-15 15:25:03.527 [DEBU] {3f7c216752dfbc171adb2a071342c4f8} [ 23 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-15 15:25:07.807 [DEBU] {c05c1c6653dfbc171bdb2a07ae5fa3ac} [ 25 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-15 15:25:07.830 [DEBU] {f273a96753dfbc171cdb2a0798396c9f} [ 22 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `types` != 0 +2024-03-15 15:26:57.292 [DEBU] {95deea3b69dfbc17309ea838c9b70970} [15729 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 15:26:57.325 [DEBU] {784772e56cdfbc17319ea8383c58e339} [ 33 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 15:26:57.341 [DEBU] {9cc074e76cdfbc17329ea83808742141} [ 15 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 15:26:57.363 [DEBU] {96955ae86cdfbc17339ea838903f3c28} [ 22 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 15:26:57.387 [DEBU] {065cb3e96cdfbc17349ea838743c599e} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-15 15:26:57.418 [DEBU] {6a4116eb6cdfbc17359ea83810b86de8} [ 31 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-15 15:26:57.445 [DEBU] {435bfdec6cdfbc17369ea838da95aa5c} [ 26 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-15 15:26:57.470 [DEBU] {e9739cee6cdfbc17379ea83873f99638} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-15 15:26:57.500 [DEBU] {a21015f06cdfbc17389ea838159a7ab6} [ 29 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-15 15:26:57.514 [DEBU] {623dd6f16cdfbc17399ea83829c848f3} [ 14 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-15 15:26:57.539 [DEBU] {198bb1f26cdfbc173a9ea838a58b99ac} [ 24 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `types` != 0 +2024-03-15 15:30:15.309 [DEBU] {d7f457e89adfbc17e707a25bbbc18d99} [400 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 15:30:15.340 [DEBU] {611739009bdfbc17e807a25bebcdf2f2} [ 30 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 15:30:15.355 [DEBU] {fa3704029bdfbc17e907a25bb605b249} [ 15 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 15:30:15.382 [DEBU] {add3eb029bdfbc17ea07a25b2cb55e3c} [ 27 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 15:30:15.412 [DEBU] {8a1887049bdfbc17eb07a25b742da472} [ 30 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-15 15:30:15.440 [DEBU] {1c7a54069bdfbc17ec07a25be94446ed} [ 27 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-15 15:30:15.466 [DEBU] {30b9f9079bdfbc17ed07a25b72474408} [ 26 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-15 15:30:15.492 [DEBU] {6da68b099bdfbc17ee07a25ba66a18b5} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-15 15:30:15.519 [DEBU] {05d3230b9bdfbc17ef07a25b799f1403} [ 26 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-15 15:30:15.533 [DEBU] {a3c1af0c9bdfbc17f007a25b6df60fc3} [ 14 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-15 15:30:15.558 [DEBU] {bbc8840d9bdfbc17f107a25bb23bdecd} [ 25 ms] [default] [zs_zm] [rows:1 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `types` != 0 +2024-03-15 16:17:05.412 [DEBU] {620f643129e2bc1769cc5470b650bde6} [368 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 16:17:05.437 [DEBU] {f3085c4729e2bc176acc5470a82e819b} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 16:17:05.451 [DEBU] {bd5bd54829e2bc176bcc5470bfab3a5d} [ 14 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 16:17:05.477 [DEBU] {6741b64929e2bc176ccc547047470b8d} [ 25 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 16:17:13.763 [DEBU] {4fec12242be2bc1796df655c6a42d8e7} [353 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 16:17:13.789 [DEBU] {ecab42392be2bc1797df655cedaf6c1d} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 16:17:13.803 [DEBU] {31dbb53a2be2bc1798df655cbbd53e9f} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 16:17:13.826 [DEBU] {81c37e3b2be2bc1799df655c16826006} [ 23 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 16:17:58.231 [DEBU] {db571e8435e2bc17c3dbc17c734f36bb} [260 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 16:17:58.259 [DEBU] {f5c7c29335e2bc17c4dbc17c9b982917} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 16:17:58.274 [DEBU] {b8d84e9535e2bc17c5dbc17c18ab79a4} [ 14 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 16:17:58.301 [DEBU] {2324299635e2bc17c6dbc17c1e0494be} [ 26 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 16:19:20.900 [DEBU] {d7da97bd48e2bc171bc42a4fe44e2339} [360 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 16:19:20.925 [DEBU] {cf3019d348e2bc171cc42a4fdc7f7db2} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 16:19:20.939 [DEBU] {c4cb98d448e2bc171dc42a4f917ccf5a} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 16:19:20.965 [DEBU] {d85668d548e2bc171ec42a4fdb86b35d} [ 26 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 16:20:53.435 [DEBU] {827a444f5ee2bc170bd00a6f9d6e8162} [257 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 16:20:53.475 [DEBU] {5064b05e5ee2bc170cd00a6f61375f1d} [ 38 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 16:20:53.489 [DEBU] {e4a704615ee2bc170dd00a6f3c11c73f} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 16:20:53.512 [DEBU] {818ece615ee2bc170ed00a6fb8449a36} [ 23 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 16:23:05.764 [DEBU] {f40f31187de2bc178e2d1c6015b7fa3e} [366 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 16:23:05.786 [DEBU] {2d2d022e7de2bc178f2d1c606114b40d} [ 22 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 16:23:05.799 [DEBU] {f1945a2f7de2bc17902d1c6072db6a72} [ 12 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 16:23:05.822 [DEBU] {da1319307de2bc17912d1c60ee37995c} [ 23 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 16:24:17.705 [DEBU] {d0974dd88de2bc179d90f019b872edc2} [364 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 16:24:17.730 [DEBU] {7ea920ee8de2bc179e90f019b56c8b42} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 16:24:17.743 [DEBU] {af7f88ef8de2bc179f90f01910d3c079} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 16:24:17.765 [DEBU] {75cf49f08de2bc17a090f0191632a443} [ 22 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 16:24:29.357 [DEBU] {287232a390e2bc17a190f019aef4e930} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-15 16:24:41.188 [DEBU] {e8c41d6493e2bc17a290f019c4aa1a95} [ 27 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-15 16:24:41.215 [DEBU] {4f41bd6593e2bc17a390f019f5fc093e} [ 27 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-15 16:24:41.250 [DEBU] {b25f836793e2bc17a490f01965887bf1} [ 32 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-15 16:24:41.276 [DEBU] {02467a6993e2bc17a590f01969199197} [ 25 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-15 16:24:41.289 [DEBU] {60b5f86a93e2bc17a690f019c626d90d} [ 13 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-15 16:24:41.311 [DEBU] {eed1ba6b93e2bc17a790f019f27dcf67} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `types` != 0 +2024-03-15 16:34:17.565 [DEBU] {a9936f8119e3bc171ee73a4503b9ffc8} [386 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 16:34:17.589 [DEBU] {e3697f9819e3bc171fe73a459f7fe633} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 16:34:17.603 [DEBU] {a2fbec9919e3bc1720e73a45e1094451} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 16:34:17.626 [DEBU] {8b19b99a19e3bc1721e73a45b94bf0af} [ 23 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 16:34:17.654 [DEBU] {2004239c19e3bc1722e73a453bcbb965} [ 27 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-15 16:34:17.679 [DEBU] {5bd8d29d19e3bc1723e73a4553de0146} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-15 16:34:17.703 [DEBU] {1d3c4b9f19e3bc1724e73a458ff69166} [ 23 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-15 16:34:17.727 [DEBU] {c481bea019e3bc1725e73a457f76d390} [ 23 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-15 16:34:17.757 [DEBU] {d4142aa219e3bc1726e73a45196aeb39} [ 29 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-15 16:34:17.773 [DEBU] {4fb316a419e3bc1727e73a453f80a2e9} [ 13 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-15 16:34:17.796 [DEBU] {8327e3a419e3bc1728e73a456e9086e6} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `types` != 0 +2024-03-15 16:36:25.841 [DEBU] {c9254a6037e3bc17648adb228ec43216} [369 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 16:36:25.867 [DEBU] {57b5547637e3bc17658adb22049f230e} [ 26 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 16:36:25.882 [DEBU] {f2b1eb7737e3bc17668adb223344633b} [ 14 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 16:36:25.907 [DEBU] {3dcbc37837e3bc17678adb22bc413d42} [ 25 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 16:36:25.935 [DEBU] {6fc1497a37e3bc17688adb2224e7a4a1} [ 27 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-15 16:36:25.960 [DEBU] {476bf37b37e3bc17698adb228ed7717b} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-15 16:36:25.992 [DEBU] {0cfa6a7d37e3bc176a8adb223f0c7e88} [ 32 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-15 16:36:26.017 [DEBU] {5dbb597f37e3bc176b8adb22dfc8ed04} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-15 16:36:26.043 [DEBU] {8d73d78037e3bc176c8adb22a0b6279a} [ 25 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-15 16:36:26.058 [DEBU] {3ee26a8237e3bc176d8adb22bbf16ee5} [ 14 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-15 16:36:26.094 [DEBU] {a46b468337e3bc176e8adb22a6625fba} [ 35 ms] [default] [zs_zm] [rows:4 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `types` != 0 +2024-03-15 16:37:57.574 [DEBU] {fd6c0abc4ce3bc1782035112930bd630} [369 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 16:37:57.607 [DEBU] {a53808d24ce3bc1783035112f690f0fa} [ 33 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 16:37:57.630 [DEBU] {ef198cd44ce3bc1784035112f1e08a6a} [ 14 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 16:37:57.660 [DEBU] {2aac5ed54ce3bc1785035112b1231e81} [ 30 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 16:37:57.690 [DEBU] {70052ad74ce3bc1786035112ccb391a0} [ 30 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-15 16:37:57.715 [DEBU] {9ab7f3d84ce3bc1787035112ba8e55e5} [ 25 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-15 16:37:57.741 [DEBU] {272f6eda4ce3bc1788035112acdece6e} [ 26 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-15 16:37:57.770 [DEBU] {e4c40adc4ce3bc1789035112ca55c617} [ 28 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-15 16:37:57.807 [DEBU] {69b5c8dd4ce3bc178a035112bbee581f} [ 36 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-15 16:37:57.821 [DEBU] {3809f1df4ce3bc178b03511234fd000e} [ 13 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-15 16:37:57.845 [DEBU] {d96cbbe04ce3bc178c035112bfe30a6b} [ 24 ms] [default] [zs_zm] [rows:4 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `types` != 0 +2024-03-15 16:40:21.942 [DEBU] {341594586ee3bc1784cf2459d9a793e7} [377 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 16:40:21.968 [DEBU] {e4ed0b6f6ee3bc1785cf24593e1f9a94} [ 26 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 16:40:21.987 [DEBU] {e5169d706ee3bc1786cf24598419f904} [ 18 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 16:40:22.014 [DEBU] {5769bc716ee3bc1787cf2459dd9a05d7} [ 26 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 16:40:22.040 [DEBU] {fdf459736ee3bc1788cf2459f6c2beda} [ 25 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-15 16:40:22.069 [DEBU] {ecdfe8746ee3bc1789cf245961fb96f2} [ 28 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-15 16:40:22.096 [DEBU] {e6ad9e766ee3bc178acf2459e843167f} [ 27 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-15 16:40:22.122 [DEBU] {310243786ee3bc178bcf2459cce2d3e0} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-15 16:40:22.148 [DEBU] {7a52c6796ee3bc178ccf2459bc3c7af9} [ 26 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-15 16:40:22.163 [DEBU] {cc4a5b7b6ee3bc178dcf245929c9b29c} [ 14 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-15 16:40:22.192 [DEBU] {0476357c6ee3bc178ecf245964958ddf} [ 29 ms] [default] [zs_zm] [rows:7 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `types` != 0 +2024-03-15 16:46:26.290 [DEBU] {5733872ec3e3bc1712ae9e105b00a3da} [358 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 16:46:26.318 [DEBU] {f841da43c3e3bc1713ae9e105d1cf38b} [ 28 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 16:46:26.334 [DEBU] {6aa08d45c3e3bc1714ae9e1043885d0f} [ 16 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 16:46:26.361 [DEBU] {6c9b7b46c3e3bc1715ae9e10220e58f2} [ 27 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 16:46:26.387 [DEBU] {388a1e48c3e3bc1716ae9e1030021113} [ 25 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-15 16:46:26.413 [DEBU] {e11da849c3e3bc1717ae9e1067d61990} [ 26 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-15 16:46:26.442 [DEBU] {76db3d4bc3e3bc1718ae9e10cce5bbbe} [ 28 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-15 16:46:26.468 [DEBU] {570ff94cc3e3bc1719ae9e1096656449} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-15 16:46:26.498 [DEBU] {9f7e834ec3e3bc171aae9e102a9377c1} [ 29 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-15 16:46:26.519 [DEBU] {a8d76650c3e3bc171bae9e10991d956e} [ 19 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-15 16:46:26.544 [DEBU] {1ebd8551c3e3bc171cae9e104183bd02} [ 25 ms] [default] [zs_zm] [rows:7 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `types` != 0 +2024-03-15 16:49:19.902 [DEBU] {fa1d669cebe3bc17179704286c002e10} [328 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 16:49:19.927 [DEBU] {924df0afebe3bc1718970428bc23170b} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 16:49:19.941 [DEBU] {16ee72b1ebe3bc17199704288d923a08} [ 14 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 16:49:19.965 [DEBU] {709c47b2ebe3bc171a970428179079cf} [ 24 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 16:49:19.989 [DEBU] {4c43beb3ebe3bc171b9704280a08d71d} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-15 16:49:20.014 [DEBU] {776124b5ebe3bc171c9704282028535d} [ 25 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-15 16:49:20.038 [DEBU] {9d6ba2b6ebe3bc171d970428b2aeebde} [ 24 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-15 16:49:20.065 [DEBU] {49c11ab8ebe3bc171e970428ca3d7d81} [ 26 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-15 16:49:20.091 [DEBU] {7151aeb9ebe3bc171f970428cb4789c0} [ 26 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-15 16:49:20.112 [DEBU] {cf3537bbebe3bc1720970428aebce9d7} [ 21 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-15 16:49:20.137 [DEBU] {0f1987bcebe3bc172197042846a81034} [ 24 ms] [default] [zs_zm] [rows:7 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `types` != 0 +2024-03-15 16:52:24.940 [DEBU] {e156e9b116e4bc17f1528e6e83da5cb4} [321 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 16:52:24.968 [DEBU] {df493fc516e4bc17f2528e6e43efe98b} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 16:52:24.981 [DEBU] {f30dbec616e4bc17f3528e6ec5745bb1} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 16:52:25.004 [DEBU] {794788c716e4bc17f4528e6efade618b} [ 23 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 16:52:25.031 [DEBU] {d1c9e4c816e4bc17f5528e6ee09b41ef} [ 27 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-15 16:52:25.054 [DEBU] {5c6884ca16e4bc17f6528e6e7d874589} [ 22 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-15 16:52:25.077 [DEBU] {ad4fe7cb16e4bc17f7528e6e06c3082f} [ 22 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-15 16:52:25.099 [DEBU] {a08946cd16e4bc17f8528e6e242f63d1} [ 21 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-15 16:52:25.124 [DEBU] {78a09cce16e4bc17f9528e6ea6301ea9} [ 24 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-15 16:52:25.140 [DEBU] {bb3c0ed016e4bc17fa528e6e5f1fa0b6} [ 16 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-15 16:52:25.162 [DEBU] {864d02d116e4bc17fb528e6e99d53097} [ 22 ms] [default] [zs_zm] [rows:7 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `types` != 0 +2024-03-15 16:58:20.804 [DEBU] {75c8d78969e4bc178bd48a01d687776c} [375 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 16:58:20.839 [DEBU] {443170a069e4bc178cd48a01384ebd94} [ 31 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 16:58:20.853 [DEBU] {abe454a269e4bc178dd48a01a27eabcb} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 16:58:20.878 [DEBU] {ba5c2da369e4bc178ed48a014cf4a420} [ 24 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 16:58:20.903 [DEBU] {5261aba469e4bc178fd48a01712b10eb} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-15 16:58:20.928 [DEBU] {b9902ba669e4bc1790d48a0184259f69} [ 24 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-15 16:58:20.953 [DEBU] {1202a7a769e4bc1791d48a01aaf3c387} [ 24 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-15 16:58:20.981 [DEBU] {4d152ca969e4bc1792d48a010993de21} [ 27 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-15 16:58:21.006 [DEBU] {3238d4aa69e4bc1793d48a01bbedfee5} [ 24 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-15 16:58:21.020 [DEBU] {f1504fac69e4bc1794d48a016642c388} [ 13 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-15 16:58:21.046 [DEBU] {9da026ad69e4bc1795d48a01f725008f} [ 25 ms] [default] [zs_zm] [rows:7 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `types` != 0 +2024-03-15 17:01:27.375 [DEBU] {926942f994e4bc17d72a8a20631432b7} [393 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 17:01:27.401 [DEBU] {c588c31095e4bc17d82a8a202187bb22} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 17:01:27.415 [DEBU] {be404f1295e4bc17d92a8a20a0663c49} [ 13 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 17:01:27.447 [DEBU] {01191b1395e4bc17da2a8a20efbab953} [ 32 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 17:01:27.480 [DEBU] {71ee041595e4bc17db2a8a2090e45afa} [ 33 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-15 17:01:27.504 [DEBU] {93c3021795e4bc17dc2a8a201e77aa8b} [ 23 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-15 17:01:27.530 [DEBU] {fef26a1895e4bc17dd2a8a20a9e1c7f6} [ 26 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-15 17:01:27.556 [DEBU] {ae0efd1995e4bc17de2a8a20063a341f} [ 25 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-15 17:01:27.585 [DEBU] {1d938a1b95e4bc17df2a8a20414fe1d9} [ 28 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-15 17:01:27.605 [DEBU] {80b74e1d95e4bc17e02a8a20e7a08d41} [ 19 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-15 17:01:27.643 [DEBU] {288d671e95e4bc17e12a8a2096a84e56} [ 38 ms] [default] [zs_zm] [rows:7 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `types` != 0 +2024-03-15 17:01:56.810 [DEBU] {fc0679db9be4bc177c75381c1b497600} [263 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 17:01:56.839 [DEBU] {f62b4deb9be4bc177d75381cd04dbc4e} [ 27 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 17:01:56.854 [DEBU] {8b38f4ec9be4bc177e75381c8f566c77} [ 14 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 17:01:56.880 [DEBU] {06aecbed9be4bc177f75381cf10e120a} [ 26 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 17:01:56.908 [DEBU] {6beb62ef9be4bc178075381c9b1fc953} [ 27 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-15 17:01:56.936 [DEBU] {e3310af19be4bc178175381c170db9cb} [ 28 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-15 17:01:56.964 [DEBU] {cde5b5f29be4bc178275381cb4c0e3e3} [ 27 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-15 17:01:56.992 [DEBU] {f28564f49be4bc178375381cb4f0ed47} [ 27 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-15 17:01:57.040 [DEBU] {35ed0ff69be4bc178475381c56c06a54} [ 47 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-15 17:01:57.056 [DEBU] {b770eef89be4bc178575381ccd3b618a} [ 15 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-15 17:01:57.084 [DEBU] {a42de0f99be4bc178675381c37eb97c1} [ 27 ms] [default] [zs_zm] [rows:7 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `types` != 0 +2024-03-15 17:30:13.834 [DEBU] {92f5abf326e6bc1782dda860276fc959} [369 ms] [default] [zs_zm] [rows:13 ] SHOW FULL COLUMNS FROM `construction_project` +2024-03-15 17:30:13.863 [DEBU] {90c4d50927e6bc1783dda86039727f46} [ 26 ms] [default] [zs_zm] [rows:6 ] SELECT `construction_id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`fangzhen_id`,`construction_name`,`total`,`remark`,`isPercentage`,`end_time`,`start_time` FROM `construction_project` WHERE (`fangzhen_id`=2) AND `deleted_at` IS NULL +2024-03-15 17:30:14.475 [DEBU] {cef80a2f27e6bc1784dda8608316b595} [ 14 ms] [default] [zs_zm] [rows:17 ] SHOW FULL COLUMNS FROM `construction_details` +2024-03-15 17:30:14.500 [DEBU] {8545ed2f27e6bc1785dda860c3a7288f} [ 24 ms] [default] [zs_zm] [rows:3 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=85) AND `deleted_at` IS NULL +2024-03-15 17:30:14.528 [DEBU] {ac2c6b3127e6bc1786dda860c72136e6} [ 27 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=86) AND `deleted_at` IS NULL +2024-03-15 17:30:14.556 [DEBU] {2e38143327e6bc1787dda8605916e543} [ 27 ms] [default] [zs_zm] [rows:2 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=87) AND `deleted_at` IS NULL +2024-03-15 17:30:14.584 [DEBU] {f23ac53427e6bc1788dda860faa2c972} [ 27 ms] [default] [zs_zm] [rows:10 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=88) AND `deleted_at` IS NULL +2024-03-15 17:30:14.609 [DEBU] {dea5763627e6bc1789dda860b2b364b6} [ 24 ms] [default] [zs_zm] [rows:6 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=89) AND `deleted_at` IS NULL +2024-03-15 17:30:14.634 [DEBU] {d803f53727e6bc178adda860dde40a10} [ 23 ms] [default] [zs_zm] [rows:5 ] SELECT `id`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`,`name`,`types`,`total`,`construction_id`,`remark`,`isPercentage`,`start_time`,`end_time`,`completed`,`selectable`,`overall` FROM `construction_details` WHERE (`construction_id`=90) AND `deleted_at` IS NULL +2024-03-15 17:30:14.648 [DEBU] {0bbe633927e6bc178bdda86084572447} [ 14 ms] [default] [zs_zm] [rows:8 ] SHOW FULL COLUMNS FROM `project_schedule` +2024-03-15 17:30:14.672 [DEBU] {3925303a27e6bc178cdda86013147a88} [ 24 ms] [default] [zs_zm] [rows:7 ] SELECT `id`,`parent_id`,`start_date`,`end_date`,`created_at`,`name`,`plane_num`,`types` FROM `project_schedule` WHERE `types` != 0 diff --git a/test/resource/log/sql/2024-03-19.log b/test/resource/log/sql/2024-03-19.log new file mode 100644 index 0000000..92ac6df --- /dev/null +++ b/test/resource/log/sql/2024-03-19.log @@ -0,0 +1,20 @@ +2024-03-19 11:52:55.038 [DEBU] {e67cb90d110ebe1780aad43a10b6a96c} [184 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-19 11:52:55.110 [DEBU] {40dfa918110ebe1781aad43a136335de} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`work_id`,`created_at`,`work_name`,`status`) VALUES(2,505482040829804910,'2024-03-19 11:52:54','防雷接地网',0) +2024-03-19 11:52:55.185 [DEBU] {c0d9fd1c110ebe1782aad43a2334e578} [ 75 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`work_name`,`created_at`,`status`,`work_id`) VALUES(2,'围栏','2024-03-19 11:52:55',0,505482040830067054) +2024-03-19 11:52:55.255 [DEBU] {be646e21110ebe1783aad43a19a560cf} [ 70 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`total`,`work_name`,`created_at`,`work_id`,`fangzhen_id`) VALUES(0,20,'道路','2024-03-19 11:52:55',505482040830263662,2) +2024-03-19 11:52:55.324 [DEBU] {95389a25110ebe1784aad43a90965e38} [ 69 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`created_at`,`fangzhen_id`,`work_name`,`work_id`,`status`) VALUES('2024-03-19 11:52:55',2,'逆变器子阵',505482040830460270,0) +2024-03-19 11:52:55.393 [DEBU] {6d38b829110ebe1785aad43a8faf8c99} [ 69 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`work_name`,`work_id`,`total`,`status`,`created_at`) VALUES(2,'箱变',505482040831181166,5,0,'2024-03-19 11:52:55') +2024-03-19 11:52:55.462 [DEBU] {9112d72d110ebe1786aad43a1dd9d8fe} [ 69 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`total`,`fangzhen_id`,`work_name`,`created_at`,`status`) VALUES(505482040831639918,5,2,'环网柜','2024-03-19 11:52:55',0) +2024-03-19 11:53:19.060 [DEBU] {a7420fac160ebe1787aad43a1f7f0ab3} [ 74 ms] [default] [zmkg] [rows:28 ] INSERT INTO `work_status`(`parent`,`work_name`,`fangzhen_id`,`status`,`created_at`,`work_id`,`total`) VALUES(78,'接地沟',2,0,'2024-03-19 11:53:18',505482040829870446,100),(78,'接地敷设',2,0,'2024-03-19 11:53:18',505482040829935982,100),(78,'检测',2,0,'2024-03-19 11:53:18',505482040830001518,100),(79,'基础',2,0,'2024-03-19 11:53:18',505482040830132590,100),(79,'安装',2,0,'2024-03-19 11:53:18',505482040830198126,100),(80,'路基',2,0,'2024-03-19 11:53:18',505482040830329198,100),(80,'排水沟',2,0,'2024-03-19 11:53:18',505482040830394734,100),(81,'钻孔',2,0,'2024-03-19 11:53:18',505482040830525806,200),(81,'桩基',2,0,'2024-03-19 11:53:18',505482040830591342,200),(81,'支架',2,0,'2024-03-19 11:53:18',505482040830656878,200),(81,'光伏板',2,0,'2024-03-19 11:53:18',505482040830722414,16),(81,'直流电缆',2,0,'2024-03-19 11:53:18',505482040830787950,100),(81,'接地线',2,0,'2024-03-19 11:53:18',505482040830853486,100),(81,'逆变器安装',2,0,'2024-03-19 11:53:18',505482040830919022,1),(81,'电缆沟开挖',2,0,'2024-03-19 11:53:18',505482040830984558,100),(81,'敷设',2,0,'2024-03-19 11:53:18',505482040831050094,100),(81,'调试',2,0,'2024-03-19 11:53:18',505482040831115630,100),(82,'基础',2,0,'2024-03-19 11:53:18',505482040831246702,5),(82,'安装',2,0,'2024-03-19 11:53:18',505482040831312238,5),(82,'电缆沟开挖',2,0,'2024-03-19 11:53:18',505482040831377774,5),(82,'敷设',2,0,'2024-03-19 11:53:18',505482040831443310,5),(82,'试验',2,0,'2024-03-19 11:53:18',505482040831508846,5),(82,'调试试验',2,0,'2024-03-19 11:53:18',505482040831574382,5),(83,'基础',2,0,'2024-03-19 11:53:18',505482040831705454,5),(83,'安装',2,0,'2024-03-19 11:53:18',505482040831770990,5),(83,'敷设',2,0,'2024-03-19 11:53:18',505482040831836526,5),(83,'试验',2,0,'2024-03-19 11:53:18',505482040831902062,5),(83,'调试试验',2,0,'2024-03-19 11:53:18',505482040831967598,5) +2024-03-19 14:48:25.794 [DEBU] {66b48fcba417be17789b962338f6473e} [790 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-19 14:48:25.876 [DEBU] {4236b0faa417be17799b96234094f613} [ 81 ms] [default] [zmkg] [rows:6 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE (`fangzhen_id`=2) AND (`parent` IS NULL) +2024-03-19 14:48:25.965 [DEBU] {4afd8fffa417be177a9b9623e488eb57} [ 88 ms] [default] [zmkg] [rows:28 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE (`fangzhen_id`=2) AND (`parent` IS NOT NULL) +2024-03-19 14:53:14.143 [DEBU] {99d05506e817be17d7af04284636d33a} [390 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-19 14:53:14.365 [DEBU] {d1ac981de817be17d8af042898adc604} [222 ms] [default] [zmkg] [rows:6 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE (`fangzhen_id`=2) AND (`parent` IS NULL) +2024-03-19 14:53:14.463 [DEBU] {4c63e02ae817be17d9af04289b121249} [ 97 ms] [default] [zmkg] [rows:28 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE (`fangzhen_id`=2) AND (`parent` IS NOT NULL) +2024-03-19 16:46:49.730 [DEBU] {554d4ef31a1ebe17b4e6a87b27ad6df4} [183 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-19 16:46:49.804 [DEBU] {b95346fe1a1ebe17b5e6a87b5cc7aa13} [ 73 ms] [default] [zmkg] [rows:6 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE (`fangzhen_id`=2) AND (`parent` IS NULL) +2024-03-19 16:46:49.877 [DEBU] {b4a6a9021b1ebe17b6e6a87b529470ab} [ 73 ms] [default] [zmkg] [rows:28 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE (`fangzhen_id`=2) AND (`parent` IS NOT NULL) +2024-03-19 16:49:33.817 [DEBU] {ab8f0826411ebe172c89741419335b30} [210 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-19 16:49:33.898 [DEBU] {479e9c32411ebe172d8974149e1606c9} [ 80 ms] [default] [zmkg] [rows:6 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE (`fangzhen_id`=2) AND (`parent` IS NULL) +2024-03-19 16:49:33.981 [DEBU] {f6357137411ebe172e8974146d3badce} [ 82 ms] [default] [zmkg] [rows:28 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE (`fangzhen_id`=2) AND (`parent` IS NOT NULL) diff --git a/test/resource/log/sql/2024-03-20.log b/test/resource/log/sql/2024-03-20.log new file mode 100644 index 0000000..cc3eeb6 --- /dev/null +++ b/test/resource/log/sql/2024-03-20.log @@ -0,0 +1,55 @@ +2024-03-20 14:20:44.531 [DEBU] {4c01a1b5b664be17aed13d0782aa713d} [190 ms] [default] [zmkg] [rows:8 ] SHOW FULL COLUMNS FROM `work_schedule` +2024-03-20 14:20:44.601 [DEBU] {234cf8c0b664be17afd13d077a2da473} [ 70 ms] [default] [zmkg] [rows:1 ] SELECT `end_at` FROM `work_schedule` WHERE `work_id`='505482040829870446' ORDER BY `id` DESC LIMIT 1 +2024-03-20 14:20:44.671 [DEBU] {baf222c5b664be17b0d13d07b414144d} [ 70 ms] [default] [zmkg] [rows:1 ] SELECT SUM(`plan_num`) FROM `work_schedule` WHERE `work_id`='505482040829870446' LIMIT 1 +2024-03-20 14:20:44.708 [DEBU] {44994bc9b664be17b1d13d072b10a1e2} [ 37 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-20 14:20:44.782 [DEBU] {3b7a7fcbb664be17b2d13d0723b1571c} [ 74 ms] [default] [zmkg] [rows:1 ] SELECT `total` FROM `work_status` WHERE `work_id`='505482040829870446' LIMIT 1 +2024-03-20 14:21:52.924 [DEBU] {d1cd40a2c664be179521e57f32717575} [189 ms] [default] [zmkg] [rows:8 ] SHOW FULL COLUMNS FROM `work_schedule` +2024-03-20 14:21:52.999 [DEBU] {343987adc664be179621e57f9dc12c3b} [ 75 ms] [default] [zmkg] [rows:1 ] SELECT `end_at` FROM `work_schedule` WHERE `work_id`='505482040829870446' ORDER BY `id` DESC LIMIT 1 +2024-03-20 14:21:53.074 [DEBU] {5a59fbb1c664be179721e57fe64efe89} [ 75 ms] [default] [zmkg] [rows:1 ] SELECT SUM(`plan_num`) FROM `work_schedule` WHERE `work_id`='505482040829870446' LIMIT 1 +2024-03-20 14:21:53.111 [DEBU] {2b316eb6c664be179821e57ff4e19972} [ 37 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-20 14:21:53.194 [DEBU] {7396aeb8c664be179921e57fc435d357} [ 82 ms] [default] [zmkg] [rows:1 ] SELECT `total` FROM `work_status` WHERE `work_id`='505482040829870446' LIMIT 1 +2024-03-20 14:22:09.801 [DEBU] {c3adc96dca64be176fd96170320aa370} [766 ms] [default] [zmkg] [rows:8 ] SHOW FULL COLUMNS FROM `work_schedule` +2024-03-20 14:22:09.877 [DEBU] {0a9e749bca64be1770d96170cd6d8d86} [ 76 ms] [default] [zmkg] [rows:1 ] SELECT `end_at` FROM `work_schedule` WHERE `work_id`='505482040829870446' ORDER BY `id` DESC LIMIT 1 +2024-03-20 14:22:09.954 [DEBU] {7e7b0ca0ca64be1771d96170697967de} [ 76 ms] [default] [zmkg] [rows:1 ] SELECT SUM(`plan_num`) FROM `work_schedule` WHERE `work_id`='505482040829870446' LIMIT 1 +2024-03-20 14:22:10.020 [DEBU] {c32299a4ca64be1772d96170a05bbc28} [ 65 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-20 14:22:10.096 [DEBU] {e89f86a8ca64be1773d961707af3b973} [ 76 ms] [default] [zmkg] [rows:1 ] SELECT `total` FROM `work_status` WHERE `work_id`='505482040829870446' LIMIT 1 +2024-03-20 19:03:50.148 [DEBU] {75117e7a2974be1788f6392925b4c25c} [204 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-20 19:03:50.225 [DEBU] {7bf7a7862974be1789f63929c20b0e6f} [ 77 ms] [default] [zmkg] [rows:34 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE `fangzhen_id`=2 +2024-03-20 19:05:07.081 [DEBU] {b731a0643b74be17a8bcbc3af3910da0} [194 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-20 19:05:07.159 [DEBU] {c87b3d703b74be17a9bcbc3a14a1e464} [ 77 ms] [default] [zmkg] [rows:34 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE `fangzhen_id`=2 +2024-03-20 19:05:47.997 [DEBU] {9506ebeb4474be17b98be3749b62e1e4} [185 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-20 19:05:48.085 [DEBU] {6f2d03f74474be17ba8be3745a394e70} [ 87 ms] [default] [zmkg] [rows:34 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE `fangzhen_id`=2 +2024-03-20 19:07:06.679 [DEBU] {03fed43d5774be1785841105c6b62bdb} [184 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-20 19:07:06.753 [DEBU] {3d62d0485774be17868411050ebf02c4} [ 74 ms] [default] [zmkg] [rows:34 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE `fangzhen_id`=2 +2024-03-20 19:08:35.381 [DEBU] {dd8b62e46b74be17b497d300de066ef7} [192 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-20 19:08:35.455 [DEBU] {3290deef6b74be17b597d300a77c6c7a} [ 73 ms] [default] [zmkg] [rows:34 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE `fangzhen_id`=2 +2024-03-20 19:08:44.375 [DEBU] {83529afc6d74be17adce042aeb87a2f3} [190 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-20 19:08:44.448 [DEBU] {eb58ee076e74be17aece042a08eda8e6} [ 73 ms] [default] [zmkg] [rows:34 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE `fangzhen_id`=2 +2024-03-20 19:09:08.182 [DEBU] {012924887374be172639a0438c769181} [181 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-20 19:09:08.259 [DEBU] {b205f8927374be172739a043a9b3f2d7} [ 76 ms] [default] [zmkg] [rows:34 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE `fangzhen_id`=2 +2024-03-20 19:09:23.873 [DEBU] {d79c4a217774be172f476d746b0c3cf5} [418 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-20 19:09:23.959 [DEBU] {5ab9393a7774be1730476d747e33a001} [ 85 ms] [default] [zmkg] [rows:34 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE `fangzhen_id`=2 +2024-03-20 19:09:51.297 [DEBU] {6e7db5717d74be1738fb946270f1066f} [723 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-20 19:09:51.374 [DEBU] {be8ad69c7d74be1739fb9462315e42a2} [ 76 ms] [default] [zmkg] [rows:34 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE `fangzhen_id`=2 +2024-03-20 19:10:19.766 [DEBU] {626d7d318474be177e6aa371f8c655a1} [204 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-20 19:10:19.842 [DEBU] {e4abb03d8474be177f6aa371a9b73166} [ 76 ms] [default] [zmkg] [rows:34 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE `fangzhen_id`=2 +2024-03-20 19:13:18.794 [DEBU] {24c35ae1ad74be179c6e2e5c030d7fb5} [188 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-20 19:13:18.867 [DEBU] {c5e79cecad74be179d6e2e5cef660e43} [ 72 ms] [default] [zmkg] [rows:34 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE `fangzhen_id`=2 +2024-03-20 19:23:35.786 [DEBU] {cbb167883d75be1722bff269cf4b7eaf} [197 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-20 19:23:35.861 [DEBU] {08402e943d75be1723bff2698e6f5dc6} [ 74 ms] [default] [zmkg] [rows:3 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE (`fangzhen_id`=2) AND (`parent`=78) +2024-03-20 19:53:55.498 [DEBU] {05ae9b37e576be171563f03c571347fb} [199 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-20 19:53:55.569 [DEBU] {d7048243e576be171663f03cc900e7a5} [ 70 ms] [default] [zmkg] [rows:34 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE `fangzhen_id`=2 +2024-03-20 19:54:36.050 [DEBU] {6b3cfea8ee76be179422d30ce737eaf5} [194 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-20 19:54:36.126 [DEBU] {2fe694b4ee76be179522d30cda5919df} [ 75 ms] [default] [zmkg] [rows:34 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE `fangzhen_id`=2 +2024-03-20 19:57:46.656 [DEBU] {9ad065d11a77be175394c500ef60b6f6} [1143 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-20 19:57:46.725 [DEBU] {d7ca8a151b77be175494c5006f19e267} [ 69 ms] [default] [zmkg] [rows:34 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE `fangzhen_id`=2 +2024-03-20 20:00:26.069 [DEBU] {c5d8ed264077be17069a990596726490} [207 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-20 20:00:26.146 [DEBU] {9f104b334077be17079a9905a6d314d8} [ 77 ms] [default] [zmkg] [rows:34 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE `fangzhen_id`=2 +2024-03-20 20:00:54.730 [DEBU] {b4b264d44677be179828f2161808486b} [188 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-20 20:00:54.811 [DEBU] {16e0abdf4677be179928f2166acd165e} [ 80 ms] [default] [zmkg] [rows:34 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE `fangzhen_id`=2 +2024-03-20 20:05:14.601 [DEBU] {19b083558377be17456e5a49cccb6632} [195 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-20 20:05:14.677 [DEBU] {54d528618377be17466e5a49b949565a} [ 76 ms] [default] [zmkg] [rows:34 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE `fangzhen_id`=2 +2024-03-20 20:07:13.768 [DEBU] {7598c3159f77be17afcf2a59c2b58d3d} [172 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-20 20:07:13.855 [DEBU] {ebde12209f77be17b0cf2a59b8525c6f} [ 86 ms] [default] [zmkg] [rows:34 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE `fangzhen_id`=2 +2024-03-20 20:08:30.754 [DEBU] {c1275be1b077be1722fbd95ce1cdc9fa} [728 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-20 20:08:30.828 [DEBU] {63e4c90cb177be1723fbd95c4490ace0} [ 74 ms] [default] [zmkg] [rows:34 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE `fangzhen_id`=2 diff --git a/test/resource/log/sql/2024-03-21.log b/test/resource/log/sql/2024-03-21.log new file mode 100644 index 0000000..aa445e7 --- /dev/null +++ b/test/resource/log/sql/2024-03-21.log @@ -0,0 +1,170 @@ +2024-03-21 09:41:23.719 [DEBU] {ecf8897b0ca4be172ea72463c4cc808d} [1753 ms] [default] [zmkg] [rows:8 ] SHOW FULL COLUMNS FROM `work_schedule` +2024-03-21 09:41:23.753 [DEBU] {52020ee40ca4be172fa72463cd0cf090} [ 33 ms] [default] [zmkg] [rows:4 ] SELECT `id`,`work_id`,`start_at`,`detail`,`status`,`plan_num`,`finished_num`,`end_at` FROM `work_schedule` +2024-03-21 09:41:23.787 [DEBU] {6da10fe60ca4be1730a72463f91d628f} [ 34 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-21 09:41:23.859 [DEBU] {58f41ce80ca4be1731a72463a8299cd0} [ 71 ms] [default] [zmkg] [rows:34 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE `fangzhen_id`=2 +2024-03-21 09:41:35.427 [DEBU] {513cab920fa4be17630a2f4505705e7d} [188 ms] [default] [zmkg] [rows:8 ] SHOW FULL COLUMNS FROM `work_schedule` +2024-03-21 09:41:35.463 [DEBU] {d162ea9d0fa4be17640a2f45b2e2e547} [ 35 ms] [default] [zmkg] [rows:4 ] SELECT `id`,`work_id`,`start_at`,`detail`,`status`,`plan_num`,`finished_num`,`end_at` FROM `work_schedule` +2024-03-21 09:41:35.500 [DEBU] {199f1ba00fa4be17650a2f45709d6dcf} [ 36 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-21 09:41:35.574 [DEBU] {f8d436a20fa4be17660a2f45d320f357} [ 74 ms] [default] [zmkg] [rows:34 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE `fangzhen_id`=2 +2024-03-21 09:42:22.686 [DEBU] {b7d7ba811aa4be179f78c14f588187e6} [487 ms] [default] [zmkg] [rows:8 ] SHOW FULL COLUMNS FROM `work_schedule` +2024-03-21 09:42:22.723 [DEBU] {6b68c49e1aa4be17a078c14f559d485b} [ 36 ms] [default] [zmkg] [rows:4 ] SELECT `id`,`work_id`,`start_at`,`detail`,`status`,`plan_num`,`finished_num`,`end_at` FROM `work_schedule` +2024-03-21 09:42:22.766 [DEBU] {b7e4f7a01aa4be17a178c14f942f7258} [ 42 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-21 09:42:22.860 [DEBU] {9b2786a31aa4be17a278c14f708bacd3} [ 94 ms] [default] [zmkg] [rows:34 ] SELECT `id`,`fangzhen_id`,`parent`,`work_id`,`work_name`,`total`,`finished`,`start_at`,`end_at`,`status`,`created_at` FROM `work_status` WHERE `fangzhen_id`=2 +2024-03-21 11:09:08.132 [DEBU] {70352754d6a8be170d22f5253be6dba7} [1197 ms] [default] [zmkg] [rows:8 ] SHOW FULL COLUMNS FROM `work_schedule` +2024-03-21 11:09:08.200 [DEBU] {0c3d8b9bd6a8be170e22f5259298e491} [ 67 ms] [default] [zmkg] [rows:1 ] SELECT `id`,`work_id`,`start_at`,`detail`,`status`,`plan_num`,`finished_num`,`end_at` FROM `work_schedule` WHERE (`work_id`='505482040829935982') AND (`id`=14) LIMIT 1 +2024-03-21 11:09:56.141 [DEBU] {3b2c3dbee1a8be17cbdd511c98d77a8d} [181 ms] [default] [zmkg] [rows:8 ] SHOW FULL COLUMNS FROM `work_schedule` +2024-03-21 11:09:56.210 [DEBU] {93c81fc9e1a8be17ccdd511c86b6ce5a} [ 68 ms] [default] [zmkg] [rows:1 ] SELECT `id`,`work_id`,`start_at`,`detail`,`status`,`plan_num`,`finished_num`,`end_at` FROM `work_schedule` WHERE (`work_id`='505482040829935982') AND (`id`=14) LIMIT 1 +2024-03-21 11:11:55.135 [DEBU] {18443372fda8be17907efc381a92f11b} [192 ms] [default] [zmkg] [rows:8 ] SHOW FULL COLUMNS FROM `work_schedule` +2024-03-21 11:11:55.209 [DEBU] {c481a87dfda8be17917efc388623eda6} [ 74 ms] [default] [zmkg] [rows:1 ] SELECT `id`,`work_id`,`start_at`,`detail`,`status`,`plan_num`,`finished_num`,`end_at` FROM `work_schedule` WHERE (`work_id`='505482040829935982') AND (`id`=14) LIMIT 1 +2024-03-21 11:12:09.458 [ERRO] {7e195bd100a9be17927efc38d3e67efa} [ 34 ms] [default] [zmkg] [rows:0 ] UPDATE `work_schedule` SET detail WHERE (`work_id`='505482040829935982') AND (`id`=14) AND ([{"date":"2024-03-21","planNum":2,"finishedNum":2},{"date":"2024-03-22","planNum":1,"finishedNum":0},{"date":"2024-03-23","planNum":1,"finishedNum":0},{"date":"2024-03-24","planNum":1,"finishedNum":0},{"date":"2024-03-25","planNum":1,"finishedNum":0},{"date":"2024-03-26","planNum":1,"finishedNum":0},{"date":"2024-03-27","planNum":1,"finishedNum":0},{"date":"2024-03-28","planNum":1,"finishedNum":0},{"date":"2024-03-29","planNum":1,"finishedNum":0},{"date":"2024-03-30","planNum":1,"finishedNum":0},{"date":"2024-03-31","planNum":1,"finishedNum":0},{"date":"2024-04-01","planNum":1,"finishedNum":0},{"date":"2024-04-02","planNum":1,"finishedNum":0},{"date":"2024-04-03","planNum":1,"finishedNum":0},{"date":"2024-04-04","planNum":1,"finishedNum":0},{"date":"2024-04-05","planNum":1,"finishedNum":0},{"date":"2024-04-06","planNum":1,"finishedNum":0}]) +Error: Error 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE (`work_id`=?) AND (`id`=?) AND ([{"date":"2024-03-21","planNum":2,"finishe' at line 1 +Stack: +1. github.com/gogf/gf/v2/database/gdb.(*Core).writeSqlToLogger + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core.go:671 +2. github.com/gogf/gf/v2/database/gdb.(*Core).DoCommit + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core_underlying.go:279 +3. github.com/gogf/gf/v2/database/gdb.(*Core).DoExec + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core_underlying.go:136 +4. github.com/gogf/gf/v2/database/gdb.(*Core).DoUpdate + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core.go:608 +5. github.com/gogf/gf/v2/database/gdb.(*HookUpdateInput).Next + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_model_hook.go:138 +6. github.com/gogf/gf/v2/database/gdb.(*Model).Update + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_model_update.go:111 +7. github.com/gogf/gf/v2/database/gdb.(*Model).Update + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_model_update.go:34 +8. github.com/tiger1103/gfast/v3/test.Test_Add + /home/ubuntu/zmkg-back/test/schdule_test.go:314 + +2024-03-21 11:13:14.933 [DEBU] {beb27bff0fa9be17dcc0ce23f084b3fa} [310 ms] [default] [zmkg] [rows:8 ] SHOW FULL COLUMNS FROM `work_schedule` +2024-03-21 11:13:15.039 [DEBU] {a37dfc1110a9be17ddc0ce23fb6acfbf} [106 ms] [default] [zmkg] [rows:1 ] SELECT `id`,`work_id`,`start_at`,`detail`,`status`,`plan_num`,`finished_num`,`end_at` FROM `work_schedule` WHERE (`work_id`='505482040829935982') AND (`id`=14) LIMIT 1 +2024-03-21 11:13:15.099 [ERRO] {20c2531810a9be17dec0ce232fb8376d} [ 59 ms] [default] [zmkg] [rows:0 ] UPDATE `work_schedule` SET detail WHERE (`work_id`='505482040829935982') AND (`id`=14) AND ([{"date":"2024-03-21","planNum":2,"finishedNum":2},{"date":"2024-03-22","planNum":1,"finishedNum":0},{"date":"2024-03-23","planNum":1,"finishedNum":0},{"date":"2024-03-24","planNum":1,"finishedNum":0},{"date":"2024-03-25","planNum":1,"finishedNum":0},{"date":"2024-03-26","planNum":1,"finishedNum":0},{"date":"2024-03-27","planNum":1,"finishedNum":0},{"date":"2024-03-28","planNum":1,"finishedNum":0},{"date":"2024-03-29","planNum":1,"finishedNum":0},{"date":"2024-03-30","planNum":1,"finishedNum":0},{"date":"2024-03-31","planNum":1,"finishedNum":0},{"date":"2024-04-01","planNum":1,"finishedNum":0},{"date":"2024-04-02","planNum":1,"finishedNum":0},{"date":"2024-04-03","planNum":1,"finishedNum":0},{"date":"2024-04-04","planNum":1,"finishedNum":0},{"date":"2024-04-05","planNum":1,"finishedNum":0},{"date":"2024-04-06","planNum":1,"finishedNum":0}]) +Error: Error 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE (`work_id`=?) AND (`id`=?) AND ([{"date":"2024-03-21","planNum":2,"finishe' at line 1 +Stack: +1. github.com/gogf/gf/v2/database/gdb.(*Core).writeSqlToLogger + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core.go:671 +2. github.com/gogf/gf/v2/database/gdb.(*Core).DoCommit + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core_underlying.go:279 +3. github.com/gogf/gf/v2/database/gdb.(*Core).DoExec + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core_underlying.go:136 +4. github.com/gogf/gf/v2/database/gdb.(*Core).DoUpdate + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core.go:608 +5. github.com/gogf/gf/v2/database/gdb.(*HookUpdateInput).Next + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_model_hook.go:138 +6. github.com/gogf/gf/v2/database/gdb.(*Model).Update + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_model_update.go:111 +7. github.com/gogf/gf/v2/database/gdb.(*Model).Update + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_model_update.go:34 +8. github.com/tiger1103/gfast/v3/test.Test_Add + /home/ubuntu/zmkg-back/test/schdule_test.go:308 + +2024-03-21 11:16:38.863 [DEBU] {f305a6433fa9be17f694057c09b5fb34} [1233 ms] [default] [zmkg] [rows:8 ] SHOW FULL COLUMNS FROM `work_schedule` +2024-03-21 11:16:38.898 [DEBU] {2cff298d3fa9be17f794057cc6fe3c44} [ 35 ms] [default] [zmkg] [rows:3 ] SELECT `id`,`work_id`,`start_at`,`detail`,`status`,`plan_num`,`finished_num`,`end_at` FROM `work_schedule` +2024-03-21 11:17:26.197 [DEBU] {91633d884aa9be176daa807c283a9e49} [172 ms] [default] [zmkg] [rows:8 ] SHOW FULL COLUMNS FROM `work_schedule` +2024-03-21 11:17:26.231 [DEBU] {5d497d924aa9be176eaa807c339deb3d} [ 33 ms] [default] [zmkg] [rows:3 ] SELECT `id`,`work_id`,`start_at`,`detail`,`status`,`plan_num`,`finished_num`,`end_at` FROM `work_schedule` +2024-03-21 11:19:30.492 [DEBU] {0b394e7767a9be17a999a01e0032d5dd} [197 ms] [default] [zmkg] [rows:8 ] SHOW FULL COLUMNS FROM `work_schedule` +2024-03-21 11:19:30.530 [DEBU] {5dec158367a9be17aa99a01ecb687c75} [ 37 ms] [default] [zmkg] [rows:3 ] SELECT `id`,`work_id`,`start_at`,`detail`,`status`,`plan_num`,`finished_num`,`end_at` FROM `work_schedule` +2024-03-21 11:25:00.027 [DEBU] {f749e631b4a9be177909773d3fbea365} [184 ms] [default] [zmkg] [rows:8 ] SHOW FULL COLUMNS FROM `work_schedule` +2024-03-21 11:25:00.098 [DEBU] {6222db3cb4a9be177a09773d9a7d9b17} [ 71 ms] [default] [zmkg] [rows:1 ] SELECT `id`,`work_id`,`start_at`,`detail`,`status`,`plan_num`,`finished_num`,`end_at` FROM `work_schedule` WHERE (`work_id`='505482040829935982') AND (`id`=14) LIMIT 1 +2024-03-21 11:25:00.133 [ERRO] {1e0b2341b4a9be177b09773d89ee0ecd} [ 34 ms] [default] [zmkg] [rows:0 ] UPDATE `work_schedule` SET detail WHERE (`work_id`='505482040829935982') AND (`id`=14) AND ([{"date":"2024-03-21","planNum":2,"finishedNum":2},{"date":"2024-03-22","planNum":1,"finishedNum":0},{"date":"2024-03-23","planNum":1,"finishedNum":0},{"date":"2024-03-24","planNum":1,"finishedNum":0},{"date":"2024-03-25","planNum":1,"finishedNum":0},{"date":"2024-03-26","planNum":1,"finishedNum":0},{"date":"2024-03-27","planNum":1,"finishedNum":0},{"date":"2024-03-28","planNum":1,"finishedNum":0},{"date":"2024-03-29","planNum":1,"finishedNum":0},{"date":"2024-03-30","planNum":1,"finishedNum":0},{"date":"2024-03-31","planNum":1,"finishedNum":0},{"date":"2024-04-01","planNum":1,"finishedNum":0},{"date":"2024-04-02","planNum":1,"finishedNum":0},{"date":"2024-04-03","planNum":1,"finishedNum":0},{"date":"2024-04-04","planNum":1,"finishedNum":0},{"date":"2024-04-05","planNum":1,"finishedNum":0},{"date":"2024-04-06","planNum":1,"finishedNum":0}]) +Error: Error 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE (`work_id`=?) AND (`id`=?) AND ([{"date":"2024-03-21","planNum":2,"finishe' at line 1 +Stack: +1. github.com/gogf/gf/v2/database/gdb.(*Core).writeSqlToLogger + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core.go:671 +2. github.com/gogf/gf/v2/database/gdb.(*Core).DoCommit + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core_underlying.go:279 +3. github.com/gogf/gf/v2/database/gdb.(*Core).DoExec + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core_underlying.go:136 +4. github.com/gogf/gf/v2/database/gdb.(*Core).DoUpdate + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core.go:608 +5. github.com/gogf/gf/v2/database/gdb.(*HookUpdateInput).Next + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_model_hook.go:138 +6. github.com/gogf/gf/v2/database/gdb.(*Model).Update + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_model_update.go:111 +7. github.com/gogf/gf/v2/database/gdb.(*Model).Update + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_model_update.go:34 +8. github.com/tiger1103/gfast/v3/test.Test_Add + /home/ubuntu/zmkg-back/test/schdule_test.go:309 + +2024-03-21 11:26:14.644 [DEBU] {3a7e3391c5a9be17d3af9d5e3dbeb933} [187 ms] [default] [zmkg] [rows:8 ] SHOW FULL COLUMNS FROM `work_schedule` +2024-03-21 11:26:14.720 [DEBU] {c76c619cc5a9be17d4af9d5ecf0a10a8} [ 76 ms] [default] [zmkg] [rows:1 ] SELECT `id`,`work_id`,`start_at`,`detail`,`status`,`plan_num`,`finished_num`,`end_at` FROM `work_schedule` WHERE (`work_id`='505482040829935982') AND (`id`=14) LIMIT 1 +2024-03-21 11:26:14.810 [DEBU] {c019f7a0c5a9be17d5af9d5e560dea26} [ 89 ms] [default] [zmkg] [rows:1 ] UPDATE `work_schedule` SET `detail`='[{"date":"2024-03-21","planNum":2,"finishedNum":2},{"date":"2024-03-22","planNum":1,"finishedNum":0},{"date":"2024-03-23","planNum":1,"finishedNum":0},{"date":"2024-03-24","planNum":1,"finishedNum":0},{"date":"2024-03-25","planNum":1,"finishedNum":0},{"date":"2024-03-26","planNum":1,"finishedNum":0},{"date":"2024-03-27","planNum":1,"finishedNum":0},{"date":"2024-03-28","planNum":1,"finishedNum":0},{"date":"2024-03-29","planNum":1,"finishedNum":0},{"date":"2024-03-30","planNum":1,"finishedNum":0},{"date":"2024-03-31","planNum":1,"finishedNum":0},{"date":"2024-04-01","planNum":1,"finishedNum":0},{"date":"2024-04-02","planNum":1,"finishedNum":0},{"date":"2024-04-03","planNum":1,"finishedNum":0},{"date":"2024-04-04","planNum":1,"finishedNum":0},{"date":"2024-04-05","planNum":1,"finishedNum":0},{"date":"2024-04-06","planNum":1,"finishedNum":0}]' WHERE (`work_id`='505482040829935982') AND (`id`=14) +2024-03-21 11:28:59.752 [DEBU] {81d84803eca9be17f01f52329c88398c} [173 ms] [default] [zmkg] [rows:8 ] SHOW FULL COLUMNS FROM `work_schedule` +2024-03-21 11:28:59.820 [DEBU] {bafd980deca9be17f11f52326939ec71} [ 68 ms] [default] [zmkg] [rows:1 ] SELECT `id`,`work_id`,`start_at`,`detail`,`status`,`plan_num`,`finished_num`,`end_at` FROM `work_schedule` WHERE (`work_id`='505482040829935982') AND (`id`=14) LIMIT 1 +2024-03-21 11:28:59.888 [ERRO] {1d49a911eca9be17f21f52329a8fe669} [ 66 ms] [default] [zmkg] [rows:0 ] UPDATE `work_schedule` SET `finished_num`='finished_num+2' WHERE (`work_id`='505482040829935982') AND (`id`=14) +Error: Error 1366 (HY000): Incorrect integer value: 'finished_num+2' for column 'finished_num' at row 1 +Stack: +1. github.com/gogf/gf/v2/database/gdb.(*Core).writeSqlToLogger + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core.go:671 +2. github.com/gogf/gf/v2/database/gdb.(*Core).DoCommit + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core_underlying.go:279 +3. github.com/gogf/gf/v2/database/gdb.(*Core).DoExec + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core_underlying.go:136 +4. github.com/gogf/gf/v2/database/gdb.(*Core).DoUpdate + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core.go:608 +5. github.com/gogf/gf/v2/database/gdb.(*HookUpdateInput).Next + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_model_hook.go:138 +6. github.com/gogf/gf/v2/database/gdb.(*Model).Update + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_model_update.go:111 +7. github.com/tiger1103/gfast/v3/test.Test_Add + /home/ubuntu/zmkg-back/test/schdule_test.go:314 + +2024-03-21 11:29:43.384 [DEBU] {7663302bf6a9be170cd5e06f88acb156} [185 ms] [default] [zmkg] [rows:8 ] SHOW FULL COLUMNS FROM `work_schedule` +2024-03-21 11:29:43.455 [DEBU] {fd4f4036f6a9be170dd5e06f6a818df0} [ 71 ms] [default] [zmkg] [rows:1 ] SELECT `id`,`work_id`,`start_at`,`detail`,`status`,`plan_num`,`finished_num`,`end_at` FROM `work_schedule` WHERE (`work_id`='505482040829935982') AND (`id`=14) LIMIT 1 +2024-03-21 11:29:43.526 [ERRO] {6885813af6a9be170ed5e06f4dd6e935} [ 71 ms] [default] [zmkg] [rows:0 ] UPDATE `work_schedule` SET `finished_num`='finished_num+2',`detail`='[{"date":"2024-03-21","planNum":2,"finishedNum":2},{"date":"2024-03-22","planNum":1,"finishedNum":0},{"date":"2024-03-23","planNum":1,"finishedNum":0},{"date":"2024-03-24","planNum":1,"finishedNum":0},{"date":"2024-03-25","planNum":1,"finishedNum":0},{"date":"2024-03-26","planNum":1,"finishedNum":0},{"date":"2024-03-27","planNum":1,"finishedNum":0},{"date":"2024-03-28","planNum":1,"finishedNum":0},{"date":"2024-03-29","planNum":1,"finishedNum":0},{"date":"2024-03-30","planNum":1,"finishedNum":0},{"date":"2024-03-31","planNum":1,"finishedNum":0},{"date":"2024-04-01","planNum":1,"finishedNum":0},{"date":"2024-04-02","planNum":1,"finishedNum":0},{"date":"2024-04-03","planNum":1,"finishedNum":0},{"date":"2024-04-04","planNum":1,"finishedNum":0},{"date":"2024-04-05","planNum":1,"finishedNum":0},{"date":"2024-04-06","planNum":1,"finishedNum":0}]' WHERE (`work_id`='505482040829935982') AND (`id`=14) +Error: Error 1366 (HY000): Incorrect integer value: 'finished_num+2' for column 'finished_num' at row 1 +Stack: +1. github.com/gogf/gf/v2/database/gdb.(*Core).writeSqlToLogger + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core.go:671 +2. github.com/gogf/gf/v2/database/gdb.(*Core).DoCommit + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core_underlying.go:279 +3. github.com/gogf/gf/v2/database/gdb.(*Core).DoExec + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core_underlying.go:136 +4. github.com/gogf/gf/v2/database/gdb.(*Core).DoUpdate + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core.go:608 +5. github.com/gogf/gf/v2/database/gdb.(*HookUpdateInput).Next + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_model_hook.go:138 +6. github.com/gogf/gf/v2/database/gdb.(*Model).Update + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_model_update.go:111 +7. github.com/tiger1103/gfast/v3/test.Test_Add + /home/ubuntu/zmkg-back/test/schdule_test.go:314 + +2024-03-21 11:31:52.496 [DEBU] {a37b573a14aabe1799ad18075dbf4bce} [193 ms] [default] [zmkg] [rows:8 ] SHOW FULL COLUMNS FROM `work_schedule` +2024-03-21 11:31:52.571 [DEBU] {c5dbe94514aabe179aad1807f5b68a4a} [ 75 ms] [default] [zmkg] [rows:1 ] SELECT `id`,`work_id`,`start_at`,`detail`,`status`,`plan_num`,`finished_num`,`end_at` FROM `work_schedule` WHERE (`work_id`='505482040829935982') AND (`id`=14) LIMIT 1 +2024-03-21 11:31:52.642 [ERRO] {0ea2654a14aabe179bad18072c6c1d90} [ 70 ms] [default] [zmkg] [rows:0 ] UPDATE `work_schedule` SET `finished_num`='\'finished_num\'+2',`detail`='[{"date":"2024-03-21","planNum":2,"finishedNum":2},{"date":"2024-03-22","planNum":1,"finishedNum":0},{"date":"2024-03-23","planNum":1,"finishedNum":0},{"date":"2024-03-24","planNum":1,"finishedNum":0},{"date":"2024-03-25","planNum":1,"finishedNum":0},{"date":"2024-03-26","planNum":1,"finishedNum":0},{"date":"2024-03-27","planNum":1,"finishedNum":0},{"date":"2024-03-28","planNum":1,"finishedNum":0},{"date":"2024-03-29","planNum":1,"finishedNum":0},{"date":"2024-03-30","planNum":1,"finishedNum":0},{"date":"2024-03-31","planNum":1,"finishedNum":0},{"date":"2024-04-01","planNum":1,"finishedNum":0},{"date":"2024-04-02","planNum":1,"finishedNum":0},{"date":"2024-04-03","planNum":1,"finishedNum":0},{"date":"2024-04-04","planNum":1,"finishedNum":0},{"date":"2024-04-05","planNum":1,"finishedNum":0},{"date":"2024-04-06","planNum":1,"finishedNum":0}]' WHERE (`work_id`='505482040829935982') AND (`id`=14) +Error: Error 1366 (HY000): Incorrect integer value: ''finished_num'+2' for column 'finished_num' at row 1 +Stack: +1. github.com/gogf/gf/v2/database/gdb.(*Core).writeSqlToLogger + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core.go:671 +2. github.com/gogf/gf/v2/database/gdb.(*Core).DoCommit + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core_underlying.go:279 +3. github.com/gogf/gf/v2/database/gdb.(*Core).DoExec + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core_underlying.go:136 +4. github.com/gogf/gf/v2/database/gdb.(*Core).DoUpdate + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core.go:608 +5. github.com/gogf/gf/v2/database/gdb.(*HookUpdateInput).Next + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_model_hook.go:138 +6. github.com/gogf/gf/v2/database/gdb.(*Model).Update + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_model_update.go:111 +7. github.com/tiger1103/gfast/v3/test.Test_Add + /home/ubuntu/zmkg-back/test/schdule_test.go:314 + +2024-03-21 11:33:08.950 [DEBU] {19992d0726aabe176a9650212b66af15} [197 ms] [default] [zmkg] [rows:8 ] SHOW FULL COLUMNS FROM `work_schedule` +2024-03-21 11:33:09.023 [DEBU] {b0b0fa1226aabe176b965021bc71baac} [ 72 ms] [default] [zmkg] [rows:1 ] SELECT `id`,`work_id`,`start_at`,`detail`,`status`,`plan_num`,`finished_num`,`end_at` FROM `work_schedule` WHERE (`work_id`='505482040829935982') AND (`id`=14) LIMIT 1 +2024-03-21 11:33:09.100 [DEBU] {db56511726aabe176c965021683b8933} [ 76 ms] [default] [zmkg] [rows:1 ] UPDATE `work_schedule` SET `finished_num`=finished_num+2,`detail`='[{"date":"2024-03-21","planNum":2,"finishedNum":2},{"date":"2024-03-22","planNum":1,"finishedNum":0},{"date":"2024-03-23","planNum":1,"finishedNum":0},{"date":"2024-03-24","planNum":1,"finishedNum":0},{"date":"2024-03-25","planNum":1,"finishedNum":0},{"date":"2024-03-26","planNum":1,"finishedNum":0},{"date":"2024-03-27","planNum":1,"finishedNum":0},{"date":"2024-03-28","planNum":1,"finishedNum":0},{"date":"2024-03-29","planNum":1,"finishedNum":0},{"date":"2024-03-30","planNum":1,"finishedNum":0},{"date":"2024-03-31","planNum":1,"finishedNum":0},{"date":"2024-04-01","planNum":1,"finishedNum":0},{"date":"2024-04-02","planNum":1,"finishedNum":0},{"date":"2024-04-03","planNum":1,"finishedNum":0},{"date":"2024-04-04","planNum":1,"finishedNum":0},{"date":"2024-04-05","planNum":1,"finishedNum":0},{"date":"2024-04-06","planNum":1,"finishedNum":0}]' WHERE (`work_id`='505482040829935982') AND (`id`=14) +2024-03-21 11:49:49.914 [DEBU] {df672d110fabbe174736c66d0aa05d65} [266 ms] [default] [zmkg] [rows:8 ] SHOW FULL COLUMNS FROM `work_schedule` +2024-03-21 11:49:50.037 [DEBU] {2c9d17210fabbe174836c66d085d19a7} [122 ms] [default] [zmkg] [rows:1 ] SELECT `id`,`work_id`,`start_at`,`detail`,`status`,`plan_num`,`finished_num`,`end_at` FROM `work_schedule` WHERE (`work_id`='505482040829935982') AND (`id`=14) LIMIT 1 +2024-03-21 11:49:50.205 [DEBU] {456f61280fabbe174936c66d40310806} [168 ms] [default] [zmkg] [rows:1 ] UPDATE `work_schedule` SET `finished_num`=finished_num+2,`detail`='[{"date":"2024-03-21","planNum":2,"finishedNum":2},{"date":"2024-03-22","planNum":1,"finishedNum":0},{"date":"2024-03-23","planNum":1,"finishedNum":0},{"date":"2024-03-24","planNum":1,"finishedNum":0},{"date":"2024-03-25","planNum":1,"finishedNum":0},{"date":"2024-03-26","planNum":1,"finishedNum":0},{"date":"2024-03-27","planNum":1,"finishedNum":0},{"date":"2024-03-28","planNum":1,"finishedNum":0},{"date":"2024-03-29","planNum":1,"finishedNum":0},{"date":"2024-03-30","planNum":1,"finishedNum":0},{"date":"2024-03-31","planNum":1,"finishedNum":0},{"date":"2024-04-01","planNum":1,"finishedNum":0},{"date":"2024-04-02","planNum":1,"finishedNum":0},{"date":"2024-04-03","planNum":1,"finishedNum":0},{"date":"2024-04-04","planNum":1,"finishedNum":0},{"date":"2024-04-05","planNum":1,"finishedNum":0},{"date":"2024-04-06","planNum":1,"finishedNum":0}]' WHERE (`work_id`='505482040829935982') AND (`id`=14) +2024-03-21 11:50:02.361 [DEBU] {17d6870212abbe174a36c66d7794604d} [ 74 ms] [default] [zmkg] [rows:1 ] SELECT SUM(`finished_num`) FROM `work_schedule` WHERE `work_id`='505482040829935982' LIMIT 1 +2024-03-21 11:50:17.259 [DEBU] {2e539f7c15abbe174b36c66da97af10f} [ 39 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-21 11:50:17.340 [DEBU] {b513f77e15abbe174c36c66d7e6404c0} [ 80 ms] [default] [zmkg] [rows:1 ] UPDATE `work_status` SET `finished`=2 WHERE `work_id`='505482040829935982' +2024-03-21 11:56:25.375 [DEBU] {033534086babbe178e831340934463d7} [741 ms] [default] [zmkg] [rows:8 ] SHOW FULL COLUMNS FROM `work_schedule` +2024-03-21 11:56:25.452 [DEBU] {358c67346babbe178f831340e978fa46} [ 75 ms] [default] [zmkg] [rows:1 ] SELECT `id`,`work_id`,`start_at`,`detail`,`status`,`plan_num`,`finished_num`,`end_at` FROM `work_schedule` WHERE (`work_id`='505482040829935982') AND (`id`=14) LIMIT 1 +2024-03-21 11:56:44.523 [DEBU] {c6aa995e6fabbe175692536d091cf1e7} [1259 ms] [default] [zmkg] [rows:8 ] SHOW FULL COLUMNS FROM `work_schedule` +2024-03-21 11:56:44.597 [DEBU] {59d0c4a96fabbe175792536dc340e393} [ 72 ms] [default] [zmkg] [rows:1 ] SELECT `id`,`work_id`,`start_at`,`detail`,`status`,`plan_num`,`finished_num`,`end_at` FROM `work_schedule` WHERE (`work_id`='505482040829935982') AND (`id`=14) LIMIT 1 +2024-03-21 11:57:35.690 [DEBU] {fc3786887babbe17e4042e5eda0179c2} [183 ms] [default] [zmkg] [rows:8 ] SHOW FULL COLUMNS FROM `work_schedule` +2024-03-21 11:57:35.761 [DEBU] {6e1a77937babbe17e5042e5e2329d718} [ 71 ms] [default] [zmkg] [rows:1 ] SELECT `id`,`work_id`,`start_at`,`detail`,`status`,`plan_num`,`finished_num`,`end_at` FROM `work_schedule` WHERE (`work_id`='505482040829935982') AND (`id`=14) LIMIT 1 +2024-03-21 17:13:18.744 [DEBU] {4a8a1fe9b5bcbe17598bc87a8831163f} [811 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-21 17:13:18.825 [DEBU] {b6ac9619b6bcbe175a8bc87aa236863f} [ 79 ms] [default] [zmkg] [rows:1 ] UPDATE `work_status` SET `finished`=0 WHERE `work_id`='505482040830329198' +2024-03-21 17:14:23.063 [DEBU] {c4fb0a08c5bcbe17caa0234baa10e13b} [187 ms] [default] [zmkg] [rows:11 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-21 17:14:23.136 [DEBU] {10a43813c5bcbe17cba0234b214be4f0} [ 72 ms] [default] [zmkg] [rows:0 ] UPDATE `work_status` SET `finished`=0 WHERE `work_id`='505482040830329198' diff --git a/test/resource/log/sql/2024-03-22.log b/test/resource/log/sql/2024-03-22.log new file mode 100644 index 0000000..fc2edbe --- /dev/null +++ b/test/resource/log/sql/2024-03-22.log @@ -0,0 +1,231 @@ +2024-03-22 09:58:59.312 [DEBU] {de3a0a3097f3be171a1848150eaec7f1} [194 ms] [default] [zmkg] [rows:12 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 09:58:59.396 [DEBU] {c4e50a3c97f3be171b18481572317ed6} [ 76 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`work_name`,`fangzhen_id`,`work_id`,`created_at`) VALUES(0,'防雷接地网',2,505905437816652088,'2024-03-22 09:58:59') +2024-03-22 09:58:59.473 [DEBU] {2140974097f3be171c184815732cd8e6} [ 77 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`work_id`,`created_at`,`fangzhen_id`,`work_name`) VALUES(0,505905437816914232,'2024-03-22 09:58:59',2,'围栏') +2024-03-22 09:58:59.555 [DEBU] {b558384597f3be171d1848157d9d38c5} [ 81 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`status`,`work_id`,`created_at`,`work_name`) VALUES(2,0,505905437817110840,'2024-03-22 09:58:59','道路') +2024-03-22 09:58:59.630 [DEBU] {8443134a97f3be171e184815b26a9144} [ 75 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`fangzhen_id`,`work_id`,`status`,`created_at`) VALUES('逆变器',2,505905437817307448,0,'2024-03-22 09:58:59') +2024-03-22 09:58:59.713 [DEBU] {7a9a934e97f3be171f18481535d7b046} [ 82 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`created_at`,`fangzhen_id`,`work_id`,`work_name`) VALUES(0,'2024-03-22 09:58:59',2,505905437818028344,'箱变') +2024-03-22 09:58:59.790 [DEBU] {59b0845397f3be1720184815b53083d9} [ 76 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`created_at`,`fangzhen_id`,`work_name`,`status`) VALUES(505905437818487096,'2024-03-22 09:58:59',2,'环网柜',0) +2024-03-22 10:01:25.289 [DEBU] {8969bb2db9f3be17dc8bc538ca1b770f} [180 ms] [default] [zmkg] [rows:12 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 10:01:25.363 [DEBU] {a03a9038b9f3be17dd8bc5382c41772a} [ 73 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`created_at`,`status`,`work_name`,`fangzhen_id`) VALUES(505905682747228472,'2024-03-22 10:01:25',0,'防雷接地网',2) +2024-03-22 10:01:25.436 [DEBU] {8dc1f03cb9f3be17de8bc538dc36ae11} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`created_at`,`work_name`,`status`,`fangzhen_id`) VALUES(505905682747490616,'2024-03-22 10:01:25','围栏',0,2) +2024-03-22 10:01:25.510 [DEBU] {62794541b9f3be17df8bc538503898bd} [ 74 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`work_name`,`work_id`,`status`,`created_at`) VALUES(2,'道路',505905682747687224,0,'2024-03-22 10:01:25') +2024-03-22 10:01:25.582 [DEBU] {fecaac45b9f3be17e08bc538316844af} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`work_name`,`status`,`created_at`,`work_id`) VALUES(2,'逆变器',0,'2024-03-22 10:01:25',505905682747883832) +2024-03-22 10:01:25.671 [DEBU] {22c4fb49b9f3be17e18bc538e109c73a} [ 88 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`created_at`,`fangzhen_id`,`work_id`,`status`) VALUES('箱变','2024-03-22 10:01:25',2,505905682748604728,0) +2024-03-22 10:01:25.743 [DEBU] {c262424fb9f3be17e28bc5384cba6b91} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`work_id`,`status`,`fangzhen_id`,`created_at`) VALUES('环网柜',505905682749063480,0,2,'2024-03-22 10:01:25') +2024-03-22 10:01:25.818 [DEBU] {6b299b53b9f3be17e38bc53804da5b3b} [ 74 ms] [default] [zmkg] [rows:28 ] INSERT INTO `work_status`(`fangzhen_id`,`work_name`,`total`,`status`,`parent`,`work_id`,`created_at`) VALUES(2,'接地沟',100,0,2294,505905682747294008,'2024-03-22 10:01:25'),(2,'接地敷设',100,0,2294,505905682747359544,'2024-03-22 10:01:25'),(2,'检测',100,0,2294,505905682747425080,'2024-03-22 10:01:25'),(2,'基础',100,0,2295,505905682747556152,'2024-03-22 10:01:25'),(2,'安装',100,0,2295,505905682747621688,'2024-03-22 10:01:25'),(2,'路基',100,0,2296,505905682747752760,'2024-03-22 10:01:25'),(2,'排水沟',100,0,2296,505905682747818296,'2024-03-22 10:01:25'),(2,'钻孔',0,0,2297,505905682747949368,'2024-03-22 10:01:25'),(2,'桩基',0,0,2297,505905682748014904,'2024-03-22 10:01:25'),(2,'支架',0,0,2297,505905682748080440,'2024-03-22 10:01:25'),(2,'光伏板',0,0,2297,505905682748145976,'2024-03-22 10:01:25'),(2,'直流电缆',100,0,2297,505905682748211512,'2024-03-22 10:01:25'),(2,'接地线',100,0,2297,505905682748277048,'2024-03-22 10:01:25'),(2,'逆变器安装',0,0,2297,505905682748342584,'2024-03-22 10:01:25'),(2,'电缆沟开挖',100,0,2297,505905682748408120,'2024-03-22 10:01:25'),(2,'敷设',100,0,2297,505905682748473656,'2024-03-22 10:01:25'),(2,'调试',100,0,2297,505905682748539192,'2024-03-22 10:01:25'),(2,'基础',0,0,2298,505905682748670264,'2024-03-22 10:01:25'),(2,'安装',0,0,2298,505905682748735800,'2024-03-22 10:01:25'),(2,'电缆沟开挖',0,0,2298,505905682748801336,'2024-03-22 10:01:25'),(2,'敷设',0,0,2298,505905682748866872,'2024-03-22 10:01:25'),(2,'试验',0,0,2298,505905682748932408,'2024-03-22 10:01:25'),(2,'调试试验',0,0,2298,505905682748997944,'2024-03-22 10:01:25'),(2,'基础',0,0,2299,505905682749129016,'2024-03-22 10:01:25'),(2,'安装',0,0,2299,505905682749194552,'2024-03-22 10:01:25'),(2,'敷设',0,0,2299,505905682749260088,'2024-03-22 10:01:25'),(2,'试验',0,0,2299,505905682749325624,'2024-03-22 10:01:25'),(2,'调试试验',0,0,2299,505905682749391160,'2024-03-22 10:01:25') +2024-03-22 14:42:09.357 [DEBU] {536efffd0a03bf17080e514a06bc1033} [187 ms] [default] [zmkg] [rows:12 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 14:42:09.439 [DEBU] {70df30090b03bf17090e514ad3c68472} [ 82 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`created_at`,`status`,`fangzhen_id`,`work_id`,`type`,`work_name`) VALUES('2024-03-22 14:42:09',0,2,505933942390522168,1,'防雷接地网') +2024-03-22 14:42:09.517 [DEBU] {6d31180e0b03bf170a0e514ad592f067} [ 77 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`status`,`work_name`,`type`,`work_id`,`created_at`) VALUES(2,0,'围栏',2,505933942390784312,'2024-03-22 14:42:09') +2024-03-22 14:42:09.594 [DEBU] {36c2b6120b03bf170b0e514ae17745ce} [ 77 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`fangzhen_id`,`work_id`,`type`,`work_name`,`created_at`) VALUES(0,2,505933942390980920,3,'道路','2024-03-22 14:42:09') +2024-03-22 14:42:09.693 [DEBU] {512651170b03bf170c0e514ad3ec961e} [ 99 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`created_at`,`fangzhen_id`,`work_id`,`status`,`work_name`) VALUES(4,'2024-03-22 14:42:09',2,505933942391177528,0,'逆变器') +2024-03-22 14:42:09.770 [DEBU] {870d3a1d0b03bf170d0e514a8e1ccd62} [ 77 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`work_name`,`created_at`,`status`,`work_id`,`fangzhen_id`) VALUES(5,'箱变','2024-03-22 14:42:09',0,505933942391898424,2) +2024-03-22 14:42:09.847 [DEBU] {428bd6210b03bf170e0e514affff7465} [ 76 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`created_at`,`work_id`,`type`,`work_name`,`status`,`fangzhen_id`) VALUES('2024-03-22 14:42:09',505933942392357176,6,'环网柜',0,2) +2024-03-22 14:42:09.930 [DEBU] {332989260b03bf170f0e514a4ecaf9e7} [ 80 ms] [default] [zmkg] [rows:28 ] INSERT INTO `work_status`(`status`,`parent`,`total`,`fangzhen_id`,`work_name`,`type`,`work_id`,`created_at`) VALUES(0,2328,100,2,'接地沟',1,505933942390587704,'2024-03-22 14:42:09'),(0,2328,100,2,'接地敷设',1,505933942390653240,'2024-03-22 14:42:09'),(0,2328,100,2,'检测',1,505933942390718776,'2024-03-22 14:42:09'),(0,2329,100,2,'基础',2,505933942390849848,'2024-03-22 14:42:09'),(0,2329,100,2,'安装',2,505933942390915384,'2024-03-22 14:42:09'),(0,2330,100,2,'路基',3,505933942391046456,'2024-03-22 14:42:09'),(0,2330,100,2,'排水沟',3,505933942391111992,'2024-03-22 14:42:09'),(0,2331,0,2,'钻孔',4,505933942391243064,'2024-03-22 14:42:09'),(0,2331,0,2,'桩基',4,505933942391308600,'2024-03-22 14:42:09'),(0,2331,0,2,'支架',4,505933942391374136,'2024-03-22 14:42:09'),(0,2331,0,2,'光伏板',4,505933942391439672,'2024-03-22 14:42:09'),(0,2331,100,2,'直流电缆',4,505933942391505208,'2024-03-22 14:42:09'),(0,2331,100,2,'接地线',4,505933942391570744,'2024-03-22 14:42:09'),(0,2331,0,2,'逆变器安装',4,505933942391636280,'2024-03-22 14:42:09'),(0,2331,100,2,'电缆沟开挖',4,505933942391701816,'2024-03-22 14:42:09'),(0,2331,100,2,'敷设',4,505933942391767352,'2024-03-22 14:42:09'),(0,2331,100,2,'调试',4,505933942391832888,'2024-03-22 14:42:09'),(0,2332,0,2,'基础',5,505933942391963960,'2024-03-22 14:42:09'),(0,2332,0,2,'安装',5,505933942392029496,'2024-03-22 14:42:09'),(0,2332,0,2,'电缆沟开挖',5,505933942392095032,'2024-03-22 14:42:09'),(0,2332,0,2,'敷设',5,505933942392160568,'2024-03-22 14:42:09'),(0,2332,0,2,'试验',5,505933942392226104,'2024-03-22 14:42:09'),(0,2332,0,2,'调试试验',5,505933942392291640,'2024-03-22 14:42:09'),(0,2333,0,2,'基础',6,505933942392422712,'2024-03-22 14:42:09'),(0,2333,0,2,'安装',6,505933942392488248,'2024-03-22 14:42:09'),(0,2333,0,2,'敷设',6,505933942392553784,'2024-03-22 14:42:09'),(0,2333,0,2,'试验',6,505933942392619320,'2024-03-22 14:42:09'),(0,2333,0,2,'调试试验',6,505933942392684856,'2024-03-22 14:42:09') +2024-03-22 15:28:58.487 [DEBU] {1109860b9905bf174fa18c5d4cc55ec2} [182 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-22 15:28:58.563 [DEBU] {418a63169905bf1750a18c5d4122563b} [ 76 ms] [default] [zmkg] [rows:8 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=2) AND `deleted_at` IS NULL +2024-03-22 15:28:58.601 [DEBU] {7b0cf51a9905bf1751a18c5d43281fe6} [ 37 ms] [default] [zmkg] [rows:12 ] SHOW FULL COLUMNS FROM `qianqi_xiangbian` +2024-03-22 15:28:58.675 [DEBU] {d5f52e1d9905bf1752a18c5dc3d1a482} [ 74 ms] [default] [zmkg] [rows:1 ] SELECT COUNT(1) FROM `qianqi_xiangbian` WHERE (`project_id`=2) AND `deleted_at` IS NULL +2024-03-22 15:29:54.754 [DEBU] {cfae6a25a605bf1753a18c5d771496ca} [180 ms] [default] [zmkg] [rows:12 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 15:29:54.828 [DEBU] {cad03030a605bf1754a18c5d2f040702} [ 73 ms] [default] [zmkg] [rows:0 ] UPDATE `work_status` SET `total`=8 WHERE (`id`='2') AND (`type`=5) AND (`parent` IS NOT NULL) +2024-03-22 15:29:54.896 [DEBU] {ce5f9034a605bf1755a18c5db78433c9} [ 68 ms] [default] [zmkg] [rows:1 ] SELECT SUM(`total`) FROM `work_status` WHERE (`id`='2') AND (`type`=5) AND (`parent` IS NOT NULL) LIMIT 1 +2024-03-22 15:31:24.743 [DEBU] {94406519bb05bf17228bb102775a0085} [176 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-22 15:31:24.813 [DEBU] {a8c1fc23bb05bf17238bb10205d0a19c} [ 69 ms] [default] [zmkg] [rows:8 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=2) AND `deleted_at` IS NULL +2024-03-22 15:31:24.850 [DEBU] {eca93028bb05bf17248bb1025fa3fbb1} [ 35 ms] [default] [zmkg] [rows:12 ] SHOW FULL COLUMNS FROM `qianqi_xiangbian` +2024-03-22 15:31:24.921 [DEBU] {79534d2abb05bf17258bb10273365804} [ 71 ms] [default] [zmkg] [rows:1 ] SELECT COUNT(1) FROM `qianqi_xiangbian` WHERE (`project_id`=2) AND `deleted_at` IS NULL +2024-03-22 15:31:37.057 [DEBU] {449bc0ffbd05bf17268bb102d3a49198} [ 36 ms] [default] [zmkg] [rows:12 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 15:31:37.129 [DEBU] {91efe101be05bf17278bb1029393eaae} [ 72 ms] [default] [zmkg] [rows:0 ] UPDATE `work_status` SET `total`=8 WHERE (`id`=175) AND (`type`=5) AND (`parent` IS NOT NULL) +2024-03-22 15:31:37.196 [DEBU] {0e503206be05bf17288bb1026cb9c7b2} [ 67 ms] [default] [zmkg] [rows:1 ] SELECT SUM(`total`) FROM `work_status` WHERE (`fangzhen_id`=175) AND (`type`=5) AND (`parent` IS NOT NULL) LIMIT 1 +2024-03-22 15:33:50.892 [DEBU] {b1e48320dd05bf176b15c24cbff28a2f} [177 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-22 15:33:50.966 [DEBU] {9a5c172bdd05bf176c15c24ce06ee370} [ 74 ms] [default] [zmkg] [rows:8 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=2) AND `deleted_at` IS NULL +2024-03-22 15:33:51.012 [DEBU] {ab33912fdd05bf176d15c24c3993aeae} [ 44 ms] [default] [zmkg] [rows:12 ] SHOW FULL COLUMNS FROM `qianqi_xiangbian` +2024-03-22 15:33:51.082 [DEBU] {8e843f32dd05bf176e15c24c25bd26c3} [ 69 ms] [default] [zmkg] [rows:1 ] SELECT COUNT(1) FROM `qianqi_xiangbian` WHERE (`project_id`=2) AND `deleted_at` IS NULL +2024-03-22 15:33:57.119 [DEBU] {03a2219cde05bf176f15c24cf1595f5f} [ 35 ms] [default] [zmkg] [rows:12 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 15:33:57.193 [DEBU] {1a2d439ede05bf177015c24c2aa0bbdd} [ 73 ms] [default] [zmkg] [rows:0 ] UPDATE `work_status` SET `total`=8 WHERE (`parent`=175) AND (`type`=5) AND (`parent` IS NOT NULL) +2024-03-22 15:33:57.262 [DEBU] {f9c3aba2de05bf177115c24cab9a7c93} [ 68 ms] [default] [zmkg] [rows:1 ] SELECT SUM(`total`) FROM `work_status` WHERE (`fangzhen_id`=175) AND (`type`=5) AND (`parent` IS NOT NULL) LIMIT 1 +2024-03-22 15:34:46.407 [DEBU] {efd0270cea05bf173f545f429c51a65a} [199 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-22 15:34:46.486 [DEBU] {e8bb1318ea05bf1740545f4237f7c076} [ 78 ms] [default] [zmkg] [rows:8 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=2) AND `deleted_at` IS NULL +2024-03-22 15:34:46.525 [DEBU] {6fecbd1cea05bf1741545f42f6730fea} [ 39 ms] [default] [zmkg] [rows:12 ] SHOW FULL COLUMNS FROM `qianqi_xiangbian` +2024-03-22 15:34:46.604 [DEBU] {884a101fea05bf1742545f42b990a994} [ 79 ms] [default] [zmkg] [rows:1 ] SELECT COUNT(1) FROM `qianqi_xiangbian` WHERE (`project_id`=2) AND `deleted_at` IS NULL +2024-03-22 15:34:50.585 [DEBU] {07aa9f0eeb05bf1743545f423d1c48ce} [ 41 ms] [default] [zmkg] [rows:12 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 15:34:50.662 [DEBU] {5fe31511eb05bf1744545f42caa86616} [ 76 ms] [default] [zmkg] [rows:6 ] UPDATE `work_status` SET `total`=8 WHERE (`fangzhen_id`=175) AND (`type`=5) AND (`parent` IS NOT NULL) +2024-03-22 15:34:50.730 [DEBU] {69bdab15eb05bf1745545f42e201cffc} [ 67 ms] [default] [zmkg] [rows:1 ] SELECT SUM(`total`) FROM `work_status` WHERE (`fangzhen_id`=175) AND (`type`=5) AND (`parent` IS NOT NULL) LIMIT 1 +2024-03-22 15:35:25.077 [DEBU] {451c4a0cf305bf1746545f423af27b22} [212 ms] [default] [zmkg] [rows:0 ] UPDATE `work_status` SET `total`=48 WHERE (`id`='2') AND (`type`=5) AND (`parent` IS NULL) +2024-03-22 15:47:52.502 [DEBU] {8528a213a106bf1708106c13a2a75a05} [190 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-22 15:47:52.580 [DEBU] {46e9f61ea106bf1709106c13ef459051} [ 77 ms] [default] [zmkg] [rows:8 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=2) AND `deleted_at` IS NULL +2024-03-22 15:47:52.617 [DEBU] {c72c9723a106bf170a106c13b40d56ad} [ 37 ms] [default] [zmkg] [rows:12 ] SHOW FULL COLUMNS FROM `qianqi_xiangbian` +2024-03-22 15:47:52.703 [DEBU] {3628c825a106bf170b106c13eee0d277} [ 86 ms] [default] [zmkg] [rows:1 ] SELECT COUNT(1) FROM `qianqi_xiangbian` WHERE (`project_id`=2) AND `deleted_at` IS NULL +2024-03-22 15:48:09.705 [DEBU] {3c2d321ea506bf170c106c13ae05cf02} [ 35 ms] [default] [zmkg] [rows:12 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 15:48:09.779 [DEBU] {fc825920a506bf170d106c13cbf42b92} [ 73 ms] [default] [zmkg] [rows:0 ] UPDATE `work_status` SET `total`=8 WHERE (`fangzhen_id`=175) AND (`type`=5) AND (`parent` IS NOT NULL) +2024-03-22 15:48:09.857 [DEBU] {4038b724a506bf170e106c132c7a7a39} [ 78 ms] [default] [zmkg] [rows:1 ] SELECT SUM(`total`) FROM `work_status` WHERE (`fangzhen_id`=175) AND (`type`=5) AND (`parent` IS NOT NULL) LIMIT 1 +2024-03-22 15:48:31.568 [DEBU] {b2154a2aaa06bf170f106c13a2a736c8} [221 ms] [default] [zmkg] [rows:0 ] UPDATE `work_status` SET `total`=48 WHERE (`fangzhen_id`='2') AND (`type`=5) AND (`parent` IS NULL) +2024-03-22 15:49:04.783 [DEBU] {394844e6b106bf1700ab655ea7fd2c9d} [217 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-22 15:49:04.856 [DEBU] {92e941f3b106bf1701ab655e49e7b2d5} [ 72 ms] [default] [zmkg] [rows:8 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=2) AND `deleted_at` IS NULL +2024-03-22 15:49:04.893 [DEBU] {10bba1f7b106bf1702ab655e3fc57dda} [ 36 ms] [default] [zmkg] [rows:12 ] SHOW FULL COLUMNS FROM `qianqi_xiangbian` +2024-03-22 15:49:04.964 [DEBU] {4be8cff9b106bf1703ab655e1a4ebff7} [ 70 ms] [default] [zmkg] [rows:1 ] SELECT COUNT(1) FROM `qianqi_xiangbian` WHERE (`project_id`=2) AND `deleted_at` IS NULL +2024-03-22 15:49:08.207 [DEBU] {d80284bcb206bf1704ab655e794ae704} [ 47 ms] [default] [zmkg] [rows:12 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 15:49:08.281 [DEBU] {048958bfb206bf1705ab655e33a2af60} [ 73 ms] [default] [zmkg] [rows:0 ] UPDATE `work_status` SET `total`=8 WHERE (`fangzhen_id`=175) AND (`type`=5) AND (`parent` IS NOT NULL) +2024-03-22 15:49:08.365 [DEBU] {65f4bac3b206bf1706ab655e18869566} [ 84 ms] [default] [zmkg] [rows:1 ] SELECT SUM(`total`) FROM `work_status` WHERE (`fangzhen_id`=175) AND (`type`=5) AND (`parent` IS NOT NULL) LIMIT 1 +2024-03-22 15:49:10.748 [DEBU] {e0431752b306bf1707ab655e55e13792} [ 77 ms] [default] [zmkg] [rows:1 ] UPDATE `work_status` SET `total`=48 WHERE (`fangzhen_id`=175) AND (`type`=5) AND (`parent` IS NULL) +2024-03-22 16:12:39.419 [DEBU] {c0478d46fb07bf17a1e3a55b4dba8b09} [194 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-22 16:12:39.495 [DEBU] {40d21752fb07bf17a2e3a55b0740002e} [ 76 ms] [default] [zmkg] [rows:1 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`id`=182) AND `deleted_at` IS NULL LIMIT 1 +2024-03-22 16:12:39.534 [DEBU] {ccc8a156fb07bf17a3e3a55b793c2b41} [ 39 ms] [default] [zmkg] [rows:12 ] SHOW FULL COLUMNS FROM `qianqi_xiangbian` +2024-03-22 16:12:39.608 [DEBU] {2de1f458fb07bf17a4e3a55bbf76db27} [ 74 ms] [default] [zmkg] [rows:1 ] SELECT COUNT(1) FROM `qianqi_xiangbian` WHERE (`project_id`=182) AND `deleted_at` IS NULL +2024-03-22 16:17:21.812 [DEBU] {8b83a4073d08bf178b8240173a9a9c7c} [174 ms] [default] [zmkg] [rows:12 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 16:17:21.884 [DEBU] {160511123d08bf178c824017f916be24} [ 71 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`type`,`status`,`fangzhen_id`,`work_name`,`created_at`) VALUES(505943526324830520,1,0,2,'防雷接地网','2024-03-22 16:17:21') +2024-03-22 16:17:21.954 [DEBU] {b28e57163d08bf178d824017d701f0f4} [ 70 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`fangzhen_id`,`work_id`,`type`,`status`,`created_at`) VALUES('围栏',2,505943526325092664,2,0,'2024-03-22 16:17:21') +2024-03-22 16:17:22.026 [DEBU] {178c861a3d08bf178e8240178fcfaee8} [ 71 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`created_at`,`fangzhen_id`,`status`,`type`,`work_id`) VALUES('道路','2024-03-22 16:17:21',2,0,3,505943526325289272) +2024-03-22 16:17:22.097 [DEBU] {3c6bd21e3d08bf178f824017ab91ec08} [ 70 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`fangzhen_id`,`work_name`,`created_at`,`work_id`,`status`) VALUES(4,2,'逆变器','2024-03-22 16:17:22',505943526325485880,0) +2024-03-22 16:17:22.168 [DEBU] {94e409233d08bf17908240177e8a003b} [ 71 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`status`,`work_id`,`fangzhen_id`,`work_name`,`created_at`) VALUES(5,0,505943526326206776,2,'箱变','2024-03-22 16:17:22') +2024-03-22 16:17:22.239 [DEBU] {706248273d08bf179182401768677063} [ 70 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`fangzhen_id`,`work_id`,`work_name`,`status`,`created_at`) VALUES(6,2,505943526326665528,'环网柜',0,'2024-03-22 16:17:22') +2024-03-22 16:17:22.315 [DEBU] {3866932b3d08bf1792824017be43ee89} [ 74 ms] [default] [zmkg] [rows:28 ] INSERT INTO `work_status`(`type`,`parent`,`work_name`,`total`,`created_at`,`work_id`,`fangzhen_id`,`status`) VALUES(1,2634,'接地沟',100,'2024-03-22 16:17:22',505943526324896056,2,0),(1,2634,'接地敷设',100,'2024-03-22 16:17:22',505943526324961592,2,0),(1,2634,'检测',100,'2024-03-22 16:17:22',505943526325027128,2,0),(2,2635,'基础',100,'2024-03-22 16:17:22',505943526325158200,2,0),(2,2635,'安装',100,'2024-03-22 16:17:22',505943526325223736,2,0),(3,2636,'路基',100,'2024-03-22 16:17:22',505943526325354808,2,0),(3,2636,'排水沟',100,'2024-03-22 16:17:22',505943526325420344,2,0),(4,2637,'钻孔',0,'2024-03-22 16:17:22',505943526325551416,2,0),(4,2637,'桩基',0,'2024-03-22 16:17:22',505943526325616952,2,0),(4,2637,'支架',0,'2024-03-22 16:17:22',505943526325682488,2,0),(4,2637,'光伏板',0,'2024-03-22 16:17:22',505943526325748024,2,0),(4,2637,'直流电缆',100,'2024-03-22 16:17:22',505943526325813560,2,0),(4,2637,'接地线',100,'2024-03-22 16:17:22',505943526325879096,2,0),(4,2637,'逆变器安装',0,'2024-03-22 16:17:22',505943526325944632,2,0),(4,2637,'电缆沟开挖',100,'2024-03-22 16:17:22',505943526326010168,2,0),(4,2637,'敷设',100,'2024-03-22 16:17:22',505943526326075704,2,0),(4,2637,'调试',100,'2024-03-22 16:17:22',505943526326141240,2,0),(5,2638,'基础',0,'2024-03-22 16:17:22',505943526326272312,2,0),(5,2638,'安装',0,'2024-03-22 16:17:22',505943526326337848,2,0),(5,2638,'电缆沟开挖',0,'2024-03-22 16:17:22',505943526326403384,2,0),(5,2638,'敷设',0,'2024-03-22 16:17:22',505943526326468920,2,0),(5,2638,'试验',0,'2024-03-22 16:17:22',505943526326534456,2,0),(5,2638,'调试试验',0,'2024-03-22 16:17:22',505943526326599992,2,0),(6,2639,'基础',0,'2024-03-22 16:17:22',505943526326731064,2,0),(6,2639,'安装',0,'2024-03-22 16:17:22',505943526326796600,2,0),(6,2639,'敷设',0,'2024-03-22 16:17:22',505943526326862136,2,0),(6,2639,'试验',0,'2024-03-22 16:17:22',505943526326927672,2,0),(6,2639,'调试试验',0,'2024-03-22 16:17:22',505943526326993208,2,0) +2024-03-22 16:35:58.607 [DEBU] {809fa80d4109bf17e0c9122f02cbf8a6} [177 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-22 16:35:58.703 [DEBU] {fdba40184109bf17e1c9122f6a2bcacf} [ 95 ms] [default] [zmkg] [rows:8 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=2) AND `deleted_at` IS NULL +2024-03-22 17:09:07.210 [DEBU] {dbc03a0f100bbf1773f737717e080bed} [184 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-22 17:09:07.286 [DEBU] {668f3c1a100bbf1774f73771064a73b5} [ 75 ms] [default] [zmkg] [rows:8 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=2) AND `deleted_at` IS NULL +2024-03-22 17:09:27.255 [DEBU] {ff35b3c2140bbf1775f7377174dddee8} [ 38 ms] [default] [zmkg] [rows:12 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 17:09:27.331 [ERRO] {c6f4fac4140bbf1776f73771b3a36884} [ 74 ms] [default] [zmkg] [rows:0 ] UPDATE `work_status` SET `total`='total+1' WHERE (`fangzhen_id`=183) AND (`type`=5) AND (`parent` IS NOT NULL) +Error: Error 1366 (HY000): Incorrect integer value: 'total+1' for column 'total' at row 100 +Stack: +1. github.com/gogf/gf/v2/database/gdb.(*Core).writeSqlToLogger + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core.go:671 +2. github.com/gogf/gf/v2/database/gdb.(*Core).DoCommit + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core_underlying.go:279 +3. github.com/gogf/gf/v2/database/gdb.(*Core).DoExec + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core_underlying.go:136 +4. github.com/gogf/gf/v2/database/gdb.(*Core).DoUpdate + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_core.go:608 +5. github.com/gogf/gf/v2/database/gdb.(*HookUpdateInput).Next + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_model_hook.go:138 +6. github.com/gogf/gf/v2/database/gdb.(*Model).Update + /home/ubuntu/go/pkg/mod/github.com/gogf/gf/v2@v2.3.2/database/gdb/gdb_model_update.go:111 +7. github.com/tiger1103/gfast/v3/test.Test_FetchElementData + /home/ubuntu/zmkg-back/test/gannt_test.go:106 + +2024-03-22 17:11:35.777 [DEBU] {be5877a6320bbf17ab6aa74b7f9089b6} [184 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-22 17:11:35.851 [DEBU] {5b5783b1320bbf17ac6aa74b4e85d4a1} [ 73 ms] [default] [zmkg] [rows:8 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=2) AND `deleted_at` IS NULL +2024-03-22 17:11:38.687 [DEBU] {3981335c330bbf17ad6aa74bd0c16cae} [ 45 ms] [default] [zmkg] [rows:12 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 17:11:38.765 [DEBU] {feb0e45e330bbf17ae6aa74b41f9fabe} [ 78 ms] [default] [zmkg] [rows:6 ] UPDATE `work_status` SET `total`=total+1 WHERE (`fangzhen_id`=183) AND (`type`=5) AND (`parent` IS NOT NULL) +2024-03-22 17:11:38.836 [DEBU] {ca169163330bbf17af6aa74ba39ab8b8} [ 71 ms] [default] [zmkg] [rows:1 ] SELECT COUNT(1) FROM `work_status` WHERE (`fangzhen_id`=183) AND (`type`=5) AND (`parent` IS NOT NULL) +2024-03-22 17:14:06.626 [DEBU] {70741dc5550bbf173aa68400d46cf27d} [195 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-22 17:14:06.697 [DEBU] {f9fbc2d0550bbf173ba68400093f27de} [ 71 ms] [default] [zmkg] [rows:8 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=2) AND `deleted_at` IS NULL +2024-03-22 17:14:09.587 [DEBU] {b43b1c7f560bbf173ca6840076be1d88} [ 36 ms] [default] [zmkg] [rows:12 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 17:14:09.661 [DEBU] {cae24181560bbf173da68400efe6960f} [ 74 ms] [default] [zmkg] [rows:6 ] UPDATE `work_status` SET `total`=total+1 WHERE (`fangzhen_id`=183) AND (`type`=5) AND (`parent` IS NOT NULL) +2024-03-22 17:14:19.078 [DEBU] {5867c0b1580bbf173ea68400d1e9c165} [ 87 ms] [default] [zmkg] [rows:0 ] UPDATE `work_status` SET `total`=total+6 WHERE (`fangzhen_id`=183) AND (`type`=5) AND (`parent` IS NULL) +2024-03-22 17:17:10.250 [DEBU] {908ca383800bbf173fa684001e9940c3} [234 ms] [default] [zmkg] [rows:6 ] UPDATE `work_status` SET `total`=total+1 WHERE (`fangzhen_id`=184) AND (`type`=5) AND (`parent` IS NOT NULL) +2024-03-22 17:17:11.241 [DEBU] {3c54e9c7800bbf1740a68400c7665440} [ 80 ms] [default] [zmkg] [rows:0 ] UPDATE `work_status` SET `total`=total+6 WHERE (`fangzhen_id`=184) AND (`type`=5) AND (`parent` IS NULL) +2024-03-22 17:17:12.049 [DEBU] {79aad8f7800bbf1741a6840083c2e96a} [ 84 ms] [default] [zmkg] [rows:6 ] UPDATE `work_status` SET `total`=total+1 WHERE (`fangzhen_id`=185) AND (`type`=5) AND (`parent` IS NOT NULL) +2024-03-22 17:17:13.640 [DEBU] {c77be056810bbf1742a68400b3563f53} [ 80 ms] [default] [zmkg] [rows:0 ] UPDATE `work_status` SET `total`=total+6 WHERE (`fangzhen_id`=185) AND (`type`=5) AND (`parent` IS NULL) +2024-03-22 17:53:43.542 [DEBU] {845f01327f0dbf1751c493790868d68d} [167 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-22 17:53:43.612 [DEBU] {ff98083c7f0dbf1752c4937948235e73} [ 69 ms] [default] [zmkg] [rows:8 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=2) AND `deleted_at` IS NULL +2024-03-22 17:53:43.649 [DEBU] {63b733407f0dbf1753c493797c7bc6d3} [ 36 ms] [default] [zmkg] [rows:12 ] SHOW FULL COLUMNS FROM `qianqi_xiangbian` +2024-03-22 17:53:43.717 [DEBU] {190668427f0dbf1754c49379c0d413af} [ 67 ms] [default] [zmkg] [rows:0 ] SELECT `id`,`project_id`,`name`,`source_id`,`model_id`,`detail`,`create_by`,`update_by`,`updated_at`,`deleted_at` FROM `qianqi_xiangbian` WHERE (`project_id`=183) AND `deleted_at` IS NULL +2024-03-22 17:53:43.785 [DEBU] {6f7f6f467f0dbf1755c493791521d8d7} [ 68 ms] [default] [zmkg] [rows:0 ] SELECT `id`,`project_id`,`name`,`source_id`,`model_id`,`detail`,`create_by`,`update_by`,`updated_at`,`deleted_at` FROM `qianqi_xiangbian` WHERE (`project_id`=184) AND `deleted_at` IS NULL +2024-03-22 17:53:43.853 [DEBU] {ec80884a7f0dbf1756c493796166ee2d} [ 67 ms] [default] [zmkg] [rows:0 ] SELECT `id`,`project_id`,`name`,`source_id`,`model_id`,`detail`,`create_by`,`update_by`,`updated_at`,`deleted_at` FROM `qianqi_xiangbian` WHERE (`project_id`=185) AND `deleted_at` IS NULL +2024-03-22 17:53:43.924 [DEBU] {545c8a4e7f0dbf1757c4937932bf1d8c} [ 71 ms] [default] [zmkg] [rows:0 ] SELECT `id`,`project_id`,`name`,`source_id`,`model_id`,`detail`,`create_by`,`update_by`,`updated_at`,`deleted_at` FROM `qianqi_xiangbian` WHERE (`project_id`=186) AND `deleted_at` IS NULL +2024-03-22 17:53:43.992 [DEBU] {6c4bc2527f0dbf1758c493791a157602} [ 68 ms] [default] [zmkg] [rows:0 ] SELECT `id`,`project_id`,`name`,`source_id`,`model_id`,`detail`,`create_by`,`update_by`,`updated_at`,`deleted_at` FROM `qianqi_xiangbian` WHERE (`project_id`=187) AND `deleted_at` IS NULL +2024-03-22 17:53:44.067 [DEBU] {bf44cf567f0dbf1759c49379536b45f0} [ 75 ms] [default] [zmkg] [rows:0 ] SELECT `id`,`project_id`,`name`,`source_id`,`model_id`,`detail`,`create_by`,`update_by`,`updated_at`,`deleted_at` FROM `qianqi_xiangbian` WHERE (`project_id`=188) AND `deleted_at` IS NULL +2024-03-22 17:53:44.135 [DEBU] {e525565b7f0dbf175ac4937952981404} [ 67 ms] [default] [zmkg] [rows:0 ] SELECT `id`,`project_id`,`name`,`source_id`,`model_id`,`detail`,`create_by`,`update_by`,`updated_at`,`deleted_at` FROM `qianqi_xiangbian` WHERE (`project_id`=189) AND `deleted_at` IS NULL +2024-03-22 17:53:44.203 [DEBU] {c092545f7f0dbf175bc49379630b924a} [ 68 ms] [default] [zmkg] [rows:0 ] SELECT `id`,`project_id`,`name`,`source_id`,`model_id`,`detail`,`create_by`,`update_by`,`updated_at`,`deleted_at` FROM `qianqi_xiangbian` WHERE (`project_id`=190) AND `deleted_at` IS NULL +2024-03-22 19:59:07.740 [DEBU] {a3c80c0e5714bf17b3ba0068eccdc399} [186 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 19:59:07.815 [DEBU] {3f812c195714bf17b4ba00680ccb5418} [ 74 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`status`,`fangzhen_id`,`work_id`,`type`,`created_at`) VALUES('防雷接地网',0,2,505965849954222392,1,'2024-03-22 19:59:07') +2024-03-22 19:59:07.893 [DEBU] {22f6a01d5714bf17b5ba0068ce994123} [ 78 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`status`,`work_id`,`type`,`fangzhen_id`,`created_at`) VALUES('围栏',0,505965849954484536,2,2,'2024-03-22 19:59:07') +2024-03-22 19:59:07.980 [DEBU] {012846225714bf17b6ba00686e9819cd} [ 87 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`work_name`,`status`,`work_id`,`created_at`,`type`) VALUES(2,'道路',0,505965849954681144,'2024-03-22 19:59:07',3) +2024-03-22 19:59:08.052 [DEBU] {a96670275714bf17b7ba006890e2cc2f} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`total`,`status`,`work_id`,`fangzhen_id`,`work_name`,`type`,`created_at`) VALUES(1,0,505965849954877752,2,'低压部分',4,'2024-03-22 19:59:07') +2024-03-22 19:59:08.125 [DEBU] {aaf0c72b5714bf17b8ba00683ce408e6} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`fangzhen_id`,`type`,`work_id`,`status`,`created_at`) VALUES('高压部分',2,5,505965849955598648,0,'2024-03-22 19:59:08') +2024-03-22 19:59:08.199 [DEBU] {dbba22305714bf17b9ba006866bb54eb} [ 73 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`created_at`,`work_name`,`fangzhen_id`,`type`,`work_id`) VALUES(0,'2024-03-22 19:59:08','环网柜',2,6,505965849956057400) +2024-03-22 19:59:08.296 [DEBU] {bd73ab345714bf17baba00684aaee244} [ 94 ms] [default] [zmkg] [rows:28 ] INSERT INTO `work_status`(`work_id`,`status`,`parent`,`created_at`,`type`,`fangzhen_id`,`total`,`work_name`) VALUES(505965849954287928,0,2940,'2024-03-22 19:59:08',1,2,100,'接地沟'),(505965849954353464,0,2940,'2024-03-22 19:59:08',1,2,100,'接地敷设'),(505965849954419000,0,2940,'2024-03-22 19:59:08',1,2,100,'检测'),(505965849954550072,0,2941,'2024-03-22 19:59:08',2,2,100,'基础'),(505965849954615608,0,2941,'2024-03-22 19:59:08',2,2,100,'安装'),(505965849954746680,0,2942,'2024-03-22 19:59:08',3,2,100,'路基'),(505965849954812216,0,2942,'2024-03-22 19:59:08',3,2,100,'排水沟'),(505965849954943288,0,2943,'2024-03-22 19:59:08',4,2,0,'钻孔'),(505965849955008824,0,2943,'2024-03-22 19:59:08',4,2,0,'桩基'),(505965849955074360,0,2943,'2024-03-22 19:59:08',4,2,0,'支架'),(505965849955139896,0,2943,'2024-03-22 19:59:08',4,2,0,'光伏板'),(505965849955205432,0,2943,'2024-03-22 19:59:08',4,2,100,'直流电缆'),(505965849955270968,0,2943,'2024-03-22 19:59:08',4,2,100,'接地线'),(505965849955336504,0,2943,'2024-03-22 19:59:08',4,2,0,'逆变器安装'),(505965849955402040,0,2943,'2024-03-22 19:59:08',4,2,100,'电缆沟开挖'),(505965849955467576,0,2943,'2024-03-22 19:59:08',4,2,100,'敷设'),(505965849955533112,0,2943,'2024-03-22 19:59:08',4,2,100,'调试'),(505965849955664184,0,2944,'2024-03-22 19:59:08',5,2,0,'箱变基础'),(505965849955729720,0,2944,'2024-03-22 19:59:08',5,2,0,'箱变安装'),(505965849955795256,0,2944,'2024-03-22 19:59:08',5,2,0,'电缆沟开挖'),(505965849955860792,0,2944,'2024-03-22 19:59:08',5,2,0,'高压电缆敷设'),(505965849955926328,0,2944,'2024-03-22 19:59:08',5,2,0,'高压电缆试验'),(505965849955991864,0,2944,'2024-03-22 19:59:08',5,2,0,'高压电缆调试试验'),(505965849956122936,0,2945,'2024-03-22 19:59:08',6,2,0,'基础'),(505965849956188472,0,2945,'2024-03-22 19:59:08',6,2,0,'安装'),(505965849956254008,0,2945,'2024-03-22 19:59:08',6,2,0,'敷设'),(505965849956319544,0,2945,'2024-03-22 19:59:08',6,2,0,'试验'),(505965849956385080,0,2945,'2024-03-22 19:59:08',6,2,0,'调试试验') +2024-03-22 19:59:41.616 [DEBU] {f151d1f15e14bf177e30384a41a2270a} [176 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 19:59:41.689 [DEBU] {9e9555fc5e14bf177f30384ae223c97e} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`work_id`,`is_percent`,`type`,`status`,`created_at`,`fangzhen_id`) VALUES('防雷接地网',505965906795430200,1,1,0,'2024-03-22 19:59:41',2) +2024-03-22 19:59:41.777 [DEBU] {cdceb0005f14bf178030384a517023c9} [ 87 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`type`,`status`,`created_at`,`work_name`,`fangzhen_id`,`is_percent`) VALUES(505965906795692344,2,0,'2024-03-22 19:59:41','围栏',2,1) +2024-03-22 19:59:41.850 [DEBU] {9ac1ec055f14bf178130384a7423b062} [ 73 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`is_percent`,`status`,`work_name`,`work_id`,`fangzhen_id`,`created_at`) VALUES(3,1,0,'道路',505965906795888952,2,'2024-03-22 19:59:41') +2024-03-22 19:59:41.926 [DEBU] {0410450a5f14bf178230384afad9e482} [ 76 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`work_name`,`type`,`status`,`work_id`,`total`,`created_at`) VALUES(2,'低压部分',4,0,505965906796085560,1,'2024-03-22 19:59:41') +2024-03-22 19:59:42.000 [DEBU] {088cc70e5f14bf178330384a9b6531b9} [ 74 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`work_name`,`created_at`,`is_percent`,`status`,`fangzhen_id`,`work_id`) VALUES(5,'高压部分','2024-03-22 19:59:41',0,0,2,505965906796806456) +2024-03-22 19:59:42.072 [DEBU] {c9d93e135f14bf178430384af977ff9b} [ 71 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`is_percent`,`status`,`created_at`,`fangzhen_id`,`type`,`work_name`,`work_id`) VALUES(0,0,'2024-03-22 19:59:42',2,6,'环网柜',505965906797265208) +2024-03-22 19:59:42.154 [DEBU] {32b9af175f14bf178530384a3e6a907a} [ 79 ms] [default] [zmkg] [rows:28 ] INSERT INTO `work_status`(`fangzhen_id`,`status`,`work_name`,`total`,`created_at`,`type`,`parent`,`work_id`) VALUES(2,0,'接地沟',100,'2024-03-22 19:59:42',1,2974,505965906795495736),(2,0,'接地敷设',100,'2024-03-22 19:59:42',1,2974,505965906795561272),(2,0,'检测',100,'2024-03-22 19:59:42',1,2974,505965906795626808),(2,0,'基础',100,'2024-03-22 19:59:42',2,2975,505965906795757880),(2,0,'安装',100,'2024-03-22 19:59:42',2,2975,505965906795823416),(2,0,'路基',100,'2024-03-22 19:59:42',3,2976,505965906795954488),(2,0,'排水沟',100,'2024-03-22 19:59:42',3,2976,505965906796020024),(2,0,'钻孔',0,'2024-03-22 19:59:42',4,2977,505965906796151096),(2,0,'桩基',0,'2024-03-22 19:59:42',4,2977,505965906796216632),(2,0,'支架',0,'2024-03-22 19:59:42',4,2977,505965906796282168),(2,0,'光伏板',0,'2024-03-22 19:59:42',4,2977,505965906796347704),(2,0,'直流电缆',100,'2024-03-22 19:59:42',4,2977,505965906796413240),(2,0,'接地线',100,'2024-03-22 19:59:42',4,2977,505965906796478776),(2,0,'逆变器安装',0,'2024-03-22 19:59:42',4,2977,505965906796544312),(2,0,'电缆沟开挖',100,'2024-03-22 19:59:42',4,2977,505965906796609848),(2,0,'敷设',100,'2024-03-22 19:59:42',4,2977,505965906796675384),(2,0,'调试',100,'2024-03-22 19:59:42',4,2977,505965906796740920),(2,0,'箱变基础',0,'2024-03-22 19:59:42',5,2978,505965906796871992),(2,0,'箱变安装',0,'2024-03-22 19:59:42',5,2978,505965906796937528),(2,0,'电缆沟开挖',0,'2024-03-22 19:59:42',5,2978,505965906797003064),(2,0,'高压电缆敷设',0,'2024-03-22 19:59:42',5,2978,505965906797068600),(2,0,'高压电缆试验',0,'2024-03-22 19:59:42',5,2978,505965906797134136),(2,0,'高压电缆调试试验',0,'2024-03-22 19:59:42',5,2978,505965906797199672),(2,0,'基础',0,'2024-03-22 19:59:42',6,2979,505965906797330744),(2,0,'安装',0,'2024-03-22 19:59:42',6,2979,505965906797396280),(2,0,'敷设',0,'2024-03-22 19:59:42',6,2979,505965906797461816),(2,0,'试验',0,'2024-03-22 19:59:42',6,2979,505965906797527352),(2,0,'调试试验',0,'2024-03-22 19:59:42',6,2979,505965906797592888) +2024-03-22 20:00:36.281 [DEBU] {f803b5ab6b14bf17dcae300b51906def} [183 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 20:00:36.372 [DEBU] {888ea0b66b14bf17ddae300bbbb056c6} [ 90 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`work_id`,`fangzhen_id`,`type`,`status`,`is_percent`,`created_at`) VALUES('防雷接地网',505965998499692856,2,1,0,1,'2024-03-22 20:00:36') +2024-03-22 20:00:36.446 [DEBU] {bc7801bc6b14bf17deae300b752d7f6d} [ 74 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`work_name`,`created_at`,`status`,`work_id`,`is_percent`,`type`) VALUES(2,'围栏','2024-03-22 20:00:36',0,505965998499955000,1,2) +2024-03-22 20:00:36.521 [DEBU] {94a271c06b14bf17dfae300b5ac9b0e1} [ 75 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`type`,`work_name`,`work_id`,`status`,`is_percent`,`created_at`) VALUES(2,3,'道路',505965998500151608,0,1,'2024-03-22 20:00:36') +2024-03-22 20:00:36.595 [DEBU] {2e67e9c46b14bf17e0ae300b9914900b} [ 74 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`work_id`,`total`,`created_at`,`status`,`type`,`fangzhen_id`) VALUES('低压部分',505965998500348216,1,'2024-03-22 20:00:36',0,4,2) +2024-03-22 20:00:36.674 [DEBU] {d93055c96b14bf17e1ae300b1637f655} [ 79 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`type`,`is_percent`,`work_name`,`status`,`fangzhen_id`,`created_at`) VALUES(505965998501069112,5,0,'高压部分',0,2,'2024-03-22 20:00:36') +2024-03-22 20:00:36.755 [DEBU] {afe309ce6b14bf17e2ae300b6ee94d1a} [ 81 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`work_name`,`created_at`,`status`,`type`,`is_percent`,`fangzhen_id`) VALUES(505965998501527864,'环网柜','2024-03-22 20:00:36',0,6,0,2) +2024-03-22 20:00:36.839 [DEBU] {03980ed36b14bf17e3ae300b525648e2} [ 80 ms] [default] [zmkg] [rows:28 ] INSERT INTO `work_status`(`fangzhen_id`,`total`,`parent`,`created_at`,`work_id`,`work_name`,`status`,`type`) VALUES(2,100,3008,'2024-03-22 20:00:36',505965998499758392,'接地沟',0,1),(2,100,3008,'2024-03-22 20:00:36',505965998499823928,'接地敷设',0,1),(2,100,3008,'2024-03-22 20:00:36',505965998499889464,'检测',0,1),(2,100,3009,'2024-03-22 20:00:36',505965998500020536,'基础',0,2),(2,100,3009,'2024-03-22 20:00:36',505965998500086072,'安装',0,2),(2,100,3010,'2024-03-22 20:00:36',505965998500217144,'路基',0,3),(2,100,3010,'2024-03-22 20:00:36',505965998500282680,'排水沟',0,3),(2,0,3011,'2024-03-22 20:00:36',505965998500413752,'钻孔',0,4),(2,0,3011,'2024-03-22 20:00:36',505965998500479288,'桩基',0,4),(2,0,3011,'2024-03-22 20:00:36',505965998500544824,'支架',0,4),(2,0,3011,'2024-03-22 20:00:36',505965998500610360,'光伏板',0,4),(2,100,3011,'2024-03-22 20:00:36',505965998500675896,'直流电缆',0,4),(2,100,3011,'2024-03-22 20:00:36',505965998500741432,'接地线',0,4),(2,0,3011,'2024-03-22 20:00:36',505965998500806968,'逆变器安装',0,4),(2,100,3011,'2024-03-22 20:00:36',505965998500872504,'电缆沟开挖',0,4),(2,100,3011,'2024-03-22 20:00:36',505965998500938040,'敷设',0,4),(2,100,3011,'2024-03-22 20:00:36',505965998501003576,'调试',0,4),(2,0,3012,'2024-03-22 20:00:36',505965998501134648,'箱变基础',0,5),(2,0,3012,'2024-03-22 20:00:36',505965998501200184,'箱变安装',0,5),(2,0,3012,'2024-03-22 20:00:36',505965998501265720,'电缆沟开挖',0,5),(2,0,3012,'2024-03-22 20:00:36',505965998501331256,'高压电缆敷设',0,5),(2,0,3012,'2024-03-22 20:00:36',505965998501396792,'高压电缆试验',0,5),(2,0,3012,'2024-03-22 20:00:36',505965998501462328,'高压电缆调试试验',0,5),(2,0,3013,'2024-03-22 20:00:36',505965998501593400,'基础',0,6),(2,0,3013,'2024-03-22 20:00:36',505965998501658936,'安装',0,6),(2,0,3013,'2024-03-22 20:00:36',505965998501724472,'敷设',0,6),(2,0,3013,'2024-03-22 20:00:36',505965998501790008,'试验',0,6),(2,0,3013,'2024-03-22 20:00:36',505965998501855544,'调试试验',0,6) +2024-03-22 20:01:34.941 [DEBU] {8d7a91537914bf17af6e653730776a90} [192 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 20:01:35.016 [DEBU] {2a17075f7914bf17b06e65378be2d945} [ 75 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`created_at`,`fangzhen_id`,`type`,`work_name`,`is_percent`,`status`,`work_id`) VALUES('2024-03-22 20:01:34',2,1,'防雷接地网',1,0,505966096898064696) +2024-03-22 20:01:35.091 [DEBU] {b19d88637914bf17b16e6537e75173ea} [ 74 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`created_at`,`work_name`,`work_id`,`type`,`is_percent`,`status`) VALUES(2,'2024-03-22 20:01:35','围栏',505966096898326840,2,1,0) +2024-03-22 20:01:35.189 [DEBU] {aa66fb677914bf17b26e653767b3e1d1} [ 97 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`type`,`fangzhen_id`,`status`,`is_percent`,`work_id`,`created_at`) VALUES('道路',3,2,0,1,505966096898523448,'2024-03-22 20:01:35') +2024-03-22 20:01:35.266 [DEBU] {d51dc86d7914bf17b36e6537a9f335ce} [ 77 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`work_id`,`total`,`fangzhen_id`,`type`,`work_name`,`created_at`) VALUES(0,505966096898720056,1,2,4,'低压部分','2024-03-22 20:01:35') +2024-03-22 20:01:35.358 [DEBU] {bac76c727914bf17b46e65371b52e9bc} [ 91 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`is_percent`,`work_id`,`type`,`created_at`,`work_name`,`fangzhen_id`) VALUES(0,0,505966096899440952,5,'2024-03-22 20:01:35','高压部分',2) +2024-03-22 20:01:35.433 [DEBU] {6af5e5777914bf17b56e65375a9399a1} [ 74 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`type`,`fangzhen_id`,`work_name`,`is_percent`,`work_id`,`created_at`) VALUES(0,6,2,'环网柜',0,505966096899899704,'2024-03-22 20:01:35') +2024-03-22 20:01:35.522 [DEBU] {41e07a7c7914bf17b66e6537eb4f40b6} [ 86 ms] [default] [zmkg] [rows:28 ] INSERT INTO `work_status`(`work_name`,`fangzhen_id`,`parent`,`work_id`,`created_at`,`status`,`type`,`total`) VALUES('接地沟',2,3042,505966096898130232,'2024-03-22 20:01:35',0,1,100),('接地敷设',2,3042,505966096898195768,'2024-03-22 20:01:35',0,1,100),('检测',2,3042,505966096898261304,'2024-03-22 20:01:35',0,1,100),('基础',2,3043,505966096898392376,'2024-03-22 20:01:35',0,2,100),('安装',2,3043,505966096898457912,'2024-03-22 20:01:35',0,2,100),('路基',2,3044,505966096898588984,'2024-03-22 20:01:35',0,3,100),('排水沟',2,3044,505966096898654520,'2024-03-22 20:01:35',0,3,100),('钻孔',2,3045,505966096898785592,'2024-03-22 20:01:35',0,4,0),('桩基',2,3045,505966096898851128,'2024-03-22 20:01:35',0,4,0),('支架',2,3045,505966096898916664,'2024-03-22 20:01:35',0,4,0),('光伏板',2,3045,505966096898982200,'2024-03-22 20:01:35',0,4,0),('直流电缆',2,3045,505966096899047736,'2024-03-22 20:01:35',0,4,100),('接地线',2,3045,505966096899113272,'2024-03-22 20:01:35',0,4,100),('逆变器安装',2,3045,505966096899178808,'2024-03-22 20:01:35',0,4,0),('电缆沟开挖',2,3045,505966096899244344,'2024-03-22 20:01:35',0,4,100),('敷设',2,3045,505966096899309880,'2024-03-22 20:01:35',0,4,100),('调试',2,3045,505966096899375416,'2024-03-22 20:01:35',0,4,100),('箱变基础',2,3046,505966096899506488,'2024-03-22 20:01:35',0,5,0),('箱变安装',2,3046,505966096899572024,'2024-03-22 20:01:35',0,5,0),('电缆沟开挖',2,3046,505966096899637560,'2024-03-22 20:01:35',0,5,0),('高压电缆敷设',2,3046,505966096899703096,'2024-03-22 20:01:35',0,5,0),('高压电缆试验',2,3046,505966096899768632,'2024-03-22 20:01:35',0,5,0),('高压电缆调试试验',2,3046,505966096899834168,'2024-03-22 20:01:35',0,5,0),('基础',2,3047,505966096899965240,'2024-03-22 20:01:35',0,6,0),('安装',2,3047,505966096900030776,'2024-03-22 20:01:35',0,6,0),('敷设',2,3047,505966096900096312,'2024-03-22 20:01:35',0,6,0),('试验',2,3047,505966096900161848,'2024-03-22 20:01:35',0,6,0),('调试试验',2,3047,505966096900227384,'2024-03-22 20:01:35',0,6,0) +2024-03-22 20:08:14.140 [DEBU] {6defe545d614bf17da0e6f520f1bad2a} [188 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 20:08:14.217 [DEBU] {e44e2851d614bf17db0e6f5263e205a7} [ 76 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`status`,`work_id`,`created_at`,`fangzhen_id`,`is_percent`,`type`) VALUES('防雷接地网',0,505966766661304632,'2024-03-22 20:08:13',2,true,1) +2024-03-22 20:08:14.293 [DEBU] {992bbb55d614bf17dc0e6f52495c00c4} [ 76 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`is_percent`,`work_name`,`type`,`work_id`,`fangzhen_id`,`created_at`) VALUES(0,true,'围栏',2,505966766661566776,2,'2024-03-22 20:08:14') +2024-03-22 20:08:14.371 [DEBU] {5933425ad614bf17dd0e6f5270c8d596} [ 77 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`work_name`,`type`,`is_percent`,`status`,`created_at`,`fangzhen_id`) VALUES(505966766661763384,'道路',3,true,0,'2024-03-22 20:08:14',2) +2024-03-22 20:08:14.448 [DEBU] {da91e25ed614bf17de0e6f52e60b171a} [ 77 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`fangzhen_id`,`work_name`,`created_at`,`work_id`,`total`,`type`) VALUES(0,2,'低压部分','2024-03-22 20:08:14',505966766661959992,1,4) +2024-03-22 20:08:14.524 [DEBU] {15807b63d614bf17df0e6f52d710eb4b} [ 76 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`is_percent`,`created_at`,`status`,`work_id`,`work_name`,`fangzhen_id`) VALUES(5,false,'2024-03-22 20:08:14',0,505966766662680888,'高压部分',2) +2024-03-22 20:08:14.624 [DEBU] {a0b80768d614bf17e00e6f52e560169d} [100 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`is_percent`,`work_name`,`work_id`,`created_at`,`status`,`type`,`fangzhen_id`) VALUES(false,'环网柜',505966766663139640,'2024-03-22 20:08:14',0,6,2) +2024-03-22 20:08:14.706 [DEBU] {7f601d6ed614bf17e10e6f5202ddca1f} [ 79 ms] [default] [zmkg] [rows:28 ] INSERT INTO `work_status`(`fangzhen_id`,`work_id`,`total`,`type`,`work_name`,`status`,`parent`,`created_at`) VALUES(2,505966766661370168,100,1,'接地沟',0,3076,'2024-03-22 20:08:14'),(2,505966766661435704,100,1,'接地敷设',0,3076,'2024-03-22 20:08:14'),(2,505966766661501240,100,1,'检测',0,3076,'2024-03-22 20:08:14'),(2,505966766661632312,100,2,'基础',0,3077,'2024-03-22 20:08:14'),(2,505966766661697848,100,2,'安装',0,3077,'2024-03-22 20:08:14'),(2,505966766661828920,100,3,'路基',0,3078,'2024-03-22 20:08:14'),(2,505966766661894456,100,3,'排水沟',0,3078,'2024-03-22 20:08:14'),(2,505966766662025528,0,4,'钻孔',0,3079,'2024-03-22 20:08:14'),(2,505966766662091064,0,4,'桩基',0,3079,'2024-03-22 20:08:14'),(2,505966766662156600,0,4,'支架',0,3079,'2024-03-22 20:08:14'),(2,505966766662222136,0,4,'光伏板',0,3079,'2024-03-22 20:08:14'),(2,505966766662287672,100,4,'直流电缆',0,3079,'2024-03-22 20:08:14'),(2,505966766662353208,100,4,'接地线',0,3079,'2024-03-22 20:08:14'),(2,505966766662418744,0,4,'逆变器安装',0,3079,'2024-03-22 20:08:14'),(2,505966766662484280,100,4,'电缆沟开挖',0,3079,'2024-03-22 20:08:14'),(2,505966766662549816,100,4,'敷设',0,3079,'2024-03-22 20:08:14'),(2,505966766662615352,100,4,'调试',0,3079,'2024-03-22 20:08:14'),(2,505966766662746424,0,5,'箱变基础',0,3080,'2024-03-22 20:08:14'),(2,505966766662811960,0,5,'箱变安装',0,3080,'2024-03-22 20:08:14'),(2,505966766662877496,0,5,'电缆沟开挖',0,3080,'2024-03-22 20:08:14'),(2,505966766662943032,0,5,'高压电缆敷设',0,3080,'2024-03-22 20:08:14'),(2,505966766663008568,0,5,'高压电缆试验',0,3080,'2024-03-22 20:08:14'),(2,505966766663074104,0,5,'高压电缆调试试验',0,3080,'2024-03-22 20:08:14'),(2,505966766663205176,0,6,'基础',0,3081,'2024-03-22 20:08:14'),(2,505966766663270712,0,6,'安装',0,3081,'2024-03-22 20:08:14'),(2,505966766663336248,0,6,'敷设',0,3081,'2024-03-22 20:08:14'),(2,505966766663401784,0,6,'试验',0,3081,'2024-03-22 20:08:14'),(2,505966766663467320,0,6,'调试试验',0,3081,'2024-03-22 20:08:14') +2024-03-22 20:08:55.049 [DEBU] {b0f824ccdf14bf170fac682ec19e9bf6} [190 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 20:08:55.125 [DEBU] {df9780d7df14bf1710ac682e2100f4c3} [ 76 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`work_id`,`created_at`,`status`,`fangzhen_id`,`type`,`is_percent`) VALUES('防雷接地网',505966835280118072,'2024-03-22 20:08:54',0,2,1,true) +2024-03-22 20:08:55.198 [DEBU] {020f0ddcdf14bf1711ac682e20964650} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`type`,`is_percent`,`work_id`,`status`,`created_at`,`work_name`) VALUES(2,2,true,505966835280380216,0,'2024-03-22 20:08:55','围栏') +2024-03-22 20:08:55.271 [DEBU] {96fa63e0df14bf1712ac682e5ff137dc} [ 73 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`created_at`,`is_percent`,`work_id`,`fangzhen_id`,`work_name`,`type`) VALUES(0,'2024-03-22 20:08:55',true,505966835280576824,2,'道路',3) +2024-03-22 20:08:55.347 [DEBU] {838ec0e4df14bf1713ac682e1641e874} [ 75 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`work_id`,`status`,`total`,`fangzhen_id`,`work_name`,`created_at`) VALUES(4,505966835280773432,0,1,2,'低压部分','2024-03-22 20:08:55') +2024-03-22 20:08:55.421 [DEBU] {846c41e9df14bf1714ac682e9776d856} [ 74 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`is_percent`,`fangzhen_id`,`created_at`,`status`,`work_id`,`type`) VALUES('高压部分',false,2,'2024-03-22 20:08:55',0,505966835281494328,5) +2024-03-22 20:08:55.494 [DEBU] {89d6aaeddf14bf1715ac682e1ce51dc6} [ 73 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`fangzhen_id`,`is_percent`,`created_at`,`type`,`work_name`,`status`) VALUES(505966835281953080,2,false,'2024-03-22 20:08:55',6,'环网柜',0) +2024-03-22 20:08:55.574 [DEBU] {0f3e28f2df14bf1716ac682e6278317a} [ 77 ms] [default] [zmkg] [rows:28 ] INSERT INTO `work_status`(`parent`,`status`,`work_id`,`created_at`,`work_name`,`fangzhen_id`,`total`,`type`) VALUES(3110,0,505966835280183608,'2024-03-22 20:08:55','接地沟',2,100,1),(3110,0,505966835280249144,'2024-03-22 20:08:55','接地敷设',2,100,1),(3110,0,505966835280314680,'2024-03-22 20:08:55','检测',2,100,1),(3111,0,505966835280445752,'2024-03-22 20:08:55','基础',2,100,2),(3111,0,505966835280511288,'2024-03-22 20:08:55','安装',2,100,2),(3112,0,505966835280642360,'2024-03-22 20:08:55','路基',2,100,3),(3112,0,505966835280707896,'2024-03-22 20:08:55','排水沟',2,100,3),(3113,0,505966835280838968,'2024-03-22 20:08:55','钻孔',2,0,4),(3113,0,505966835280904504,'2024-03-22 20:08:55','桩基',2,0,4),(3113,0,505966835280970040,'2024-03-22 20:08:55','支架',2,0,4),(3113,0,505966835281035576,'2024-03-22 20:08:55','光伏板',2,0,4),(3113,0,505966835281101112,'2024-03-22 20:08:55','直流电缆',2,100,4),(3113,0,505966835281166648,'2024-03-22 20:08:55','接地线',2,100,4),(3113,0,505966835281232184,'2024-03-22 20:08:55','逆变器安装',2,0,4),(3113,0,505966835281297720,'2024-03-22 20:08:55','电缆沟开挖',2,100,4),(3113,0,505966835281363256,'2024-03-22 20:08:55','敷设',2,100,4),(3113,0,505966835281428792,'2024-03-22 20:08:55','调试',2,100,4),(3114,0,505966835281559864,'2024-03-22 20:08:55','箱变基础',2,0,5),(3114,0,505966835281625400,'2024-03-22 20:08:55','箱变安装',2,0,5),(3114,0,505966835281690936,'2024-03-22 20:08:55','电缆沟开挖',2,0,5),(3114,0,505966835281756472,'2024-03-22 20:08:55','高压电缆敷设',2,0,5),(3114,0,505966835281822008,'2024-03-22 20:08:55','高压电缆试验',2,0,5),(3114,0,505966835281887544,'2024-03-22 20:08:55','高压电缆调试试验',2,0,5),(3115,0,505966835282018616,'2024-03-22 20:08:55','基础',2,0,6),(3115,0,505966835282084152,'2024-03-22 20:08:55','安装',2,0,6),(3115,0,505966835282149688,'2024-03-22 20:08:55','敷设',2,0,6),(3115,0,505966835282215224,'2024-03-22 20:08:55','试验',2,0,6),(3115,0,505966835282280760,'2024-03-22 20:08:55','调试试验',2,0,6) +2024-03-22 20:09:36.075 [DEBU] {a323125be914bf1745d6eb063ae8f50e} [164 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 20:09:36.145 [DEBU] {f5c7e864e914bf1746d6eb0604bff622} [ 69 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`status`,`work_id`,`created_at`,`type`,`is_percent`,`fangzhen_id`) VALUES('防雷接地网',0,505966904167366968,'2024-03-22 20:09:35',1,true,2) +2024-03-22 20:09:36.214 [DEBU] {74af0969e914bf1747d6eb068ee3df16} [ 68 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`type`,`work_name`,`created_at`,`is_percent`,`fangzhen_id`,`status`) VALUES(505966904167629112,2,'围栏','2024-03-22 20:09:36',true,2,0) +2024-03-22 20:09:36.282 [DEBU] {0703276de914bf1748d6eb06023b0b2e} [ 67 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`created_at`,`fangzhen_id`,`is_percent`,`status`,`work_id`,`type`) VALUES('道路','2024-03-22 20:09:36',2,true,0,505966904167825720,3) +2024-03-22 20:09:36.349 [DEBU] {fc942971e914bf1749d6eb0695564f94} [ 67 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`fangzhen_id`,`created_at`,`type`,`total`,`work_id`,`status`) VALUES('低压部分',2,'2024-03-22 20:09:36',4,1,505966904168022328,0) +2024-03-22 20:09:36.425 [DEBU] {49463075e914bf174ad6eb0603ebf410} [ 75 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`is_percent`,`created_at`,`work_id`,`status`,`type`,`fangzhen_id`) VALUES('高压部分',false,'2024-03-22 20:09:36',505966904168743224,0,5,2) +2024-03-22 20:09:36.495 [DEBU] {d316b779e914bf174bd6eb066cf98c89} [ 69 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`is_percent`,`status`,`fangzhen_id`,`created_at`,`type`,`work_id`) VALUES('环网柜',false,0,2,'2024-03-22 20:09:36',6,505966904169201976) +2024-03-22 20:09:36.571 [DEBU] {0ce32b7ee914bf174cd6eb06e9448899} [ 71 ms] [default] [zmkg] [rows:28 ] INSERT INTO `work_status`(`total`,`type`,`parent`,`created_at`,`is_percent`,`fangzhen_id`,`work_name`,`status`,`work_id`) VALUES(100,1,3144,'2024-03-22 20:09:36',true,2,'接地沟',0,505966904167432504),(100,1,3144,'2024-03-22 20:09:36',true,2,'接地敷设',0,505966904167498040),(100,1,3144,'2024-03-22 20:09:36',true,2,'检测',0,505966904167563576),(100,2,3145,'2024-03-22 20:09:36',true,2,'基础',0,505966904167694648),(100,2,3145,'2024-03-22 20:09:36',true,2,'安装',0,505966904167760184),(100,3,3146,'2024-03-22 20:09:36',true,2,'路基',0,505966904167891256),(100,3,3146,'2024-03-22 20:09:36',true,2,'排水沟',0,505966904167956792),(0,4,3147,'2024-03-22 20:09:36',false,2,'钻孔',0,505966904168087864),(0,4,3147,'2024-03-22 20:09:36',false,2,'桩基',0,505966904168153400),(0,4,3147,'2024-03-22 20:09:36',false,2,'支架',0,505966904168218936),(0,4,3147,'2024-03-22 20:09:36',false,2,'光伏板',0,505966904168284472),(100,4,3147,'2024-03-22 20:09:36',true,2,'直流电缆',0,505966904168350008),(100,4,3147,'2024-03-22 20:09:36',true,2,'接地线',0,505966904168415544),(0,4,3147,'2024-03-22 20:09:36',false,2,'逆变器安装',0,505966904168481080),(100,4,3147,'2024-03-22 20:09:36',true,2,'电缆沟开挖',0,505966904168546616),(100,4,3147,'2024-03-22 20:09:36',true,2,'敷设',0,505966904168612152),(100,4,3147,'2024-03-22 20:09:36',true,2,'调试',0,505966904168677688),(0,5,3148,'2024-03-22 20:09:36',false,2,'箱变基础',0,505966904168808760),(0,5,3148,'2024-03-22 20:09:36',false,2,'箱变安装',0,505966904168874296),(0,5,3148,'2024-03-22 20:09:36',false,2,'电缆沟开挖',0,505966904168939832),(0,5,3148,'2024-03-22 20:09:36',false,2,'高压电缆敷设',0,505966904169005368),(0,5,3148,'2024-03-22 20:09:36',false,2,'高压电缆试验',0,505966904169070904),(0,5,3148,'2024-03-22 20:09:36',false,2,'高压电缆调试试验',0,505966904169136440),(0,6,3149,'2024-03-22 20:09:36',false,2,'基础',0,505966904169267512),(0,6,3149,'2024-03-22 20:09:36',false,2,'安装',0,505966904169333048),(0,6,3149,'2024-03-22 20:09:36',false,2,'敷设',0,505966904169398584),(0,6,3149,'2024-03-22 20:09:36',false,2,'试验',0,505966904169464120),(0,6,3149,'2024-03-22 20:09:36',false,2,'调试试验',0,505966904169529656) +2024-03-22 20:16:50.166 [DEBU] {b2e6366c4e15bf17467bf361ed3d41ed} [175 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 20:16:50.237 [DEBU] {032cb5764e15bf17477bf361ab6c1308} [ 70 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`status`,`fangzhen_id`,`work_name`,`is_percent`,`created_at`,`work_id`) VALUES(1,0,2,'防雷接地网',0,'2024-03-22 20:16:49',505967632432759096) +2024-03-22 20:16:50.307 [DEBU] {ad3bef7a4e15bf17487bf36163dac278} [ 69 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`is_percent`,`fangzhen_id`,`type`,`created_at`,`work_name`,`work_id`) VALUES(0,0,2,2,'2024-03-22 20:16:50','围栏',505967632433021240) +2024-03-22 20:16:50.397 [DEBU] {4d1f157f4e15bf17497bf3619438c9da} [ 90 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`is_percent`,`created_at`,`type`,`work_id`,`fangzhen_id`,`work_name`) VALUES(0,0,'2024-03-22 20:16:50',3,505967632433217848,2,'道路') +2024-03-22 20:16:50.467 [DEBU] {c13d70844e15bf174a7bf361604cca4d} [ 70 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`created_at`,`total`,`fangzhen_id`,`work_id`,`work_name`,`type`,`status`) VALUES('2024-03-22 20:16:50',1,2,505967632433414456,'低压部分',4,0) +2024-03-22 20:16:50.535 [DEBU] {aeb19e884e15bf174b7bf361d80c103d} [ 68 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`work_id`,`type`,`work_name`,`status`,`is_percent`,`created_at`) VALUES(2,505967632434135352,5,'高压部分',0,1,'2024-03-22 20:16:50') +2024-03-22 20:16:50.606 [DEBU] {4672ad8c4e15bf174c7bf3617a9f06be} [ 71 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`fangzhen_id`,`work_name`,`created_at`,`is_percent`,`work_id`,`status`) VALUES(6,2,'环网柜','2024-03-22 20:16:50',1,505967632434594104,0) +2024-03-22 20:16:50.681 [DEBU] {141209914e15bf174d7bf361e875aba1} [ 73 ms] [default] [zmkg] [rows:28 ] INSERT INTO `work_status`(`work_name`,`type`,`status`,`created_at`,`parent`,`fangzhen_id`,`total`,`is_percent`,`work_id`) VALUES('接地沟',1,0,'2024-03-22 20:16:50',3178,2,100,0,505967632432824632),('接地敷设',1,0,'2024-03-22 20:16:50',3178,2,100,0,505967632432890168),('检测',1,0,'2024-03-22 20:16:50',3178,2,100,0,505967632432955704),('基础',2,0,'2024-03-22 20:16:50',3179,2,100,0,505967632433086776),('安装',2,0,'2024-03-22 20:16:50',3179,2,100,0,505967632433152312),('路基',3,0,'2024-03-22 20:16:50',3180,2,100,0,505967632433283384),('排水沟',3,0,'2024-03-22 20:16:50',3180,2,100,0,505967632433348920),('钻孔',4,0,'2024-03-22 20:16:50',3181,2,0,1,505967632433479992),('桩基',4,0,'2024-03-22 20:16:50',3181,2,0,1,505967632433545528),('支架',4,0,'2024-03-22 20:16:50',3181,2,0,1,505967632433611064),('光伏板',4,0,'2024-03-22 20:16:50',3181,2,0,1,505967632433676600),('直流电缆',4,0,'2024-03-22 20:16:50',3181,2,100,0,505967632433742136),('接地线',4,0,'2024-03-22 20:16:50',3181,2,100,0,505967632433807672),('逆变器安装',4,0,'2024-03-22 20:16:50',3181,2,0,1,505967632433873208),('电缆沟开挖',4,0,'2024-03-22 20:16:50',3181,2,100,0,505967632433938744),('敷设',4,0,'2024-03-22 20:16:50',3181,2,100,0,505967632434004280),('调试',4,0,'2024-03-22 20:16:50',3181,2,100,0,505967632434069816),('箱变基础',5,0,'2024-03-22 20:16:50',3182,2,0,1,505967632434200888),('箱变安装',5,0,'2024-03-22 20:16:50',3182,2,0,1,505967632434266424),('电缆沟开挖',5,0,'2024-03-22 20:16:50',3182,2,0,1,505967632434331960),('高压电缆敷设',5,0,'2024-03-22 20:16:50',3182,2,0,1,505967632434397496),('高压电缆试验',5,0,'2024-03-22 20:16:50',3182,2,0,1,505967632434463032),('高压电缆调试试验',5,0,'2024-03-22 20:16:50',3182,2,0,1,505967632434528568),('基础',6,0,'2024-03-22 20:16:50',3183,2,0,1,505967632434659640),('安装',6,0,'2024-03-22 20:16:50',3183,2,0,1,505967632434725176),('敷设',6,0,'2024-03-22 20:16:50',3183,2,0,1,505967632434790712),('试验',6,0,'2024-03-22 20:16:50',3183,2,0,1,505967632434856248),('调试试验',6,0,'2024-03-22 20:16:50',3183,2,0,1,505967632434921784) +2024-03-22 20:18:01.316 [DEBU] {3bffd7fc5e15bf17a96a160e6c174c68} [179 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 20:18:01.391 [DEBU] {ba1394075f15bf17aa6a160eb5e3bf10} [ 74 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`work_id`,`created_at`,`fangzhen_id`,`work_name`,`status`,`is_percent`) VALUES(1,505967751785873720,'2024-03-22 20:18:01',2,'防雷接地网',0,0) +2024-03-22 20:18:01.467 [DEBU] {35200b0c5f15bf17ab6a160ebcb2eca3} [ 75 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`is_percent`,`work_name`,`type`,`created_at`,`status`,`fangzhen_id`) VALUES(505967751786135864,0,'围栏',2,'2024-03-22 20:18:01',0,2) +2024-03-22 20:18:01.547 [DEBU] {453389105f15bf17ac6a160e3bd65536} [ 80 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`type`,`created_at`,`is_percent`,`status`,`fangzhen_id`,`work_name`) VALUES(505967751786332472,3,'2024-03-22 20:18:01',0,0,2,'道路') +2024-03-22 20:18:01.620 [DEBU] {ff0553155f15bf17ad6a160e649a3653} [ 73 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`work_id`,`total`,`created_at`,`type`,`work_name`,`fangzhen_id`) VALUES(0,505967751786529080,0,'2024-03-22 20:18:01',4,'低压部分',2) +2024-03-22 20:18:01.693 [DEBU] {1599b5195f15bf17ae6a160e94dccbbb} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`status`,`fangzhen_id`,`type`,`is_percent`,`created_at`,`work_id`) VALUES('高压部分',0,2,5,1,'2024-03-22 20:18:01',505967751787249976) +2024-03-22 20:18:01.766 [DEBU] {85370c1e5f15bf17af6a160e2e0d991c} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`created_at`,`fangzhen_id`,`is_percent`,`type`,`status`,`work_id`,`work_name`) VALUES('2024-03-22 20:18:01',2,1,6,0,505967751787708728,'环网柜') +2024-03-22 20:18:01.849 [DEBU] {5eef7a225f15bf17b06a160eb497d4a1} [ 81 ms] [default] [zmkg] [rows:28 ] INSERT INTO `work_status`(`fangzhen_id`,`type`,`work_name`,`total`,`created_at`,`work_id`,`is_percent`,`status`,`parent`) VALUES(2,1,'接地沟',100,'2024-03-22 20:18:01',505967751785939256,0,0,3212),(2,1,'接地敷设',100,'2024-03-22 20:18:01',505967751786004792,0,0,3212),(2,1,'检测',100,'2024-03-22 20:18:01',505967751786070328,0,0,3212),(2,2,'基础',100,'2024-03-22 20:18:01',505967751786201400,0,0,3213),(2,2,'安装',100,'2024-03-22 20:18:01',505967751786266936,0,0,3213),(2,3,'路基',100,'2024-03-22 20:18:01',505967751786398008,0,0,3214),(2,3,'排水沟',100,'2024-03-22 20:18:01',505967751786463544,0,0,3214),(2,4,'钻孔',0,'2024-03-22 20:18:01',505967751786594616,1,0,3215),(2,4,'桩基',0,'2024-03-22 20:18:01',505967751786660152,1,0,3215),(2,4,'支架',0,'2024-03-22 20:18:01',505967751786725688,1,0,3215),(2,4,'光伏板',0,'2024-03-22 20:18:01',505967751786791224,1,0,3215),(2,4,'直流电缆',100,'2024-03-22 20:18:01',505967751786856760,0,0,3215),(2,4,'接地线',100,'2024-03-22 20:18:01',505967751786922296,0,0,3215),(2,4,'逆变器安装',0,'2024-03-22 20:18:01',505967751786987832,1,0,3215),(2,4,'电缆沟开挖',100,'2024-03-22 20:18:01',505967751787053368,0,0,3215),(2,4,'敷设',100,'2024-03-22 20:18:01',505967751787118904,0,0,3215),(2,4,'调试',100,'2024-03-22 20:18:01',505967751787184440,0,0,3215),(2,5,'箱变基础',0,'2024-03-22 20:18:01',505967751787315512,1,0,3216),(2,5,'箱变安装',0,'2024-03-22 20:18:01',505967751787381048,1,0,3216),(2,5,'电缆沟开挖',0,'2024-03-22 20:18:01',505967751787446584,1,0,3216),(2,5,'高压电缆敷设',0,'2024-03-22 20:18:01',505967751787512120,1,0,3216),(2,5,'高压电缆试验',0,'2024-03-22 20:18:01',505967751787577656,1,0,3216),(2,5,'高压电缆调试试验',0,'2024-03-22 20:18:01',505967751787643192,1,0,3216),(2,6,'基础',0,'2024-03-22 20:18:01',505967751787774264,1,0,3217),(2,6,'安装',0,'2024-03-22 20:18:01',505967751787839800,1,0,3217),(2,6,'敷设',0,'2024-03-22 20:18:01',505967751787905336,1,0,3217),(2,6,'试验',0,'2024-03-22 20:18:01',505967751787970872,1,0,3217),(2,6,'调试试验',0,'2024-03-22 20:18:01',505967751788036408,1,0,3217) +2024-03-22 20:23:13.056 [DEBU] {85814c92a715bf170601d54d1b256898} [174 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 20:23:13.128 [DEBU] {dc5bb89ca715bf170701d54d3ba4f32f} [ 71 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`created_at`,`work_name`,`status`,`work_id`,`type`,`is_percent`,`fangzhen_id`) VALUES('2024-03-22 20:23:12','防雷接地网',0,505968274815582520,1,0,2) +2024-03-22 20:23:13.199 [DEBU] {0d7805a1a715bf170801d54d116863e9} [ 70 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`work_name`,`type`,`created_at`,`is_percent`,`fangzhen_id`,`status`) VALUES(505968274815844664,'围栏',2,'2024-03-22 20:23:13',0,2,0) +2024-03-22 20:23:13.270 [DEBU] {8b6e3fa5a715bf170901d54d59577934} [ 70 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`is_percent`,`type`,`status`,`created_at`,`work_name`,`work_id`) VALUES(2,0,3,0,'2024-03-22 20:23:13','道路',505968274816041272) +2024-03-22 20:23:13.344 [DEBU] {61377ba9a715bf170a01d54dfac2c130} [ 73 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`fangzhen_id`,`is_percent`,`type`,`total`,`work_id`,`status`,`created_at`) VALUES('低压部分',2,0,4,0,505968274816237880,0,'2024-03-22 20:23:13') +2024-03-22 20:23:13.416 [DEBU] {760cddada715bf170b01d54dd73295ed} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`is_percent`,`fangzhen_id`,`work_id`,`type`,`work_name`,`created_at`) VALUES(0,1,2,505968274816958776,5,'高压部分','2024-03-22 20:23:13') +2024-03-22 20:23:13.491 [DEBU] {7e1c29b2a715bf170c01d54ddfc428cf} [ 75 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`is_percent`,`created_at`,`work_id`,`status`,`work_name`,`fangzhen_id`,`type`) VALUES(1,'2024-03-22 20:23:13',505968274817417528,0,'环网柜',2,6) +2024-03-22 20:23:13.586 [DEBU] {02b2bfb6a715bf170d01d54d46835428} [ 93 ms] [default] [zmkg] [rows:28 ] INSERT INTO `work_status`(`is_percent`,`parent`,`created_at`,`work_id`,`work_name`,`fangzhen_id`,`status`,`type`,`total`) VALUES(0,3246,'2024-03-22 20:23:13',505968274815648056,'接地沟',2,0,1,100),(0,3246,'2024-03-22 20:23:13',505968274815713592,'接地敷设',2,0,1,100),(0,3246,'2024-03-22 20:23:13',505968274815779128,'检测',2,0,1,100),(0,3247,'2024-03-22 20:23:13',505968274815910200,'基础',2,0,2,100),(0,3247,'2024-03-22 20:23:13',505968274815975736,'安装',2,0,2,100),(0,3248,'2024-03-22 20:23:13',505968274816106808,'路基',2,0,3,100),(0,3248,'2024-03-22 20:23:13',505968274816172344,'排水沟',2,0,3,100),(1,3249,'2024-03-22 20:23:13',505968274816303416,'钻孔',2,0,4,0),(1,3249,'2024-03-22 20:23:13',505968274816368952,'桩基',2,0,4,0),(1,3249,'2024-03-22 20:23:13',505968274816434488,'支架',2,0,4,0),(1,3249,'2024-03-22 20:23:13',505968274816500024,'光伏板',2,0,4,0),(0,3249,'2024-03-22 20:23:13',505968274816565560,'直流电缆',2,0,4,100),(0,3249,'2024-03-22 20:23:13',505968274816631096,'接地线',2,0,4,100),(1,3249,'2024-03-22 20:23:13',505968274816696632,'逆变器安装',2,0,4,0),(0,3249,'2024-03-22 20:23:13',505968274816762168,'电缆沟开挖',2,0,4,100),(0,3249,'2024-03-22 20:23:13',505968274816827704,'敷设',2,0,4,100),(0,3249,'2024-03-22 20:23:13',505968274816893240,'调试',2,0,4,100),(1,3250,'2024-03-22 20:23:13',505968274817024312,'箱变基础',2,0,5,0),(1,3250,'2024-03-22 20:23:13',505968274817089848,'箱变安装',2,0,5,0),(1,3250,'2024-03-22 20:23:13',505968274817155384,'电缆沟开挖',2,0,5,0),(1,3250,'2024-03-22 20:23:13',505968274817220920,'高压电缆敷设',2,0,5,0),(1,3250,'2024-03-22 20:23:13',505968274817286456,'高压电缆试验',2,0,5,0),(1,3250,'2024-03-22 20:23:13',505968274817351992,'高压电缆调试试验',2,0,5,0),(1,3251,'2024-03-22 20:23:13',505968274817483064,'基础',2,0,6,0),(1,3251,'2024-03-22 20:23:13',505968274817548600,'安装',2,0,6,0),(1,3251,'2024-03-22 20:23:13',505968274817614136,'敷设',2,0,6,0),(1,3251,'2024-03-22 20:23:13',505968274817679672,'试验',2,0,6,0),(1,3251,'2024-03-22 20:23:13',505968274817745208,'调试试验',2,0,6,0) +2024-03-22 20:57:20.910 [DEBU] {5bf14e5f8417bf17bd72ed19a7ff8372} [184 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 20:57:20.987 [DEBU] {8252646a8417bf17be72ed19618bb453} [ 75 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`is_percent`,`work_id`,`created_at`,`status`,`fangzhen_id`,`work_name`,`type`) VALUES(0,505971710520983864,'2024-03-22 20:57:20',0,2,'防雷接地网',1) +2024-03-22 20:57:21.067 [DEBU] {c1fee26e8417bf17bf72ed198cd03dd6} [ 80 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`fangzhen_id`,`created_at`,`status`,`type`,`work_id`,`is_percent`) VALUES('围栏',2,'2024-03-22 20:57:20',0,5,505971710521246008,0) +2024-03-22 20:57:21.142 [DEBU] {b3f1b1738417bf17c072ed1906794a8b} [ 74 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`is_percent`,`fangzhen_id`,`work_name`,`work_id`,`type`,`status`,`created_at`) VALUES(0,2,'道路',505971710521442616,8,0,'2024-03-22 20:57:21') +2024-03-22 20:57:21.227 [DEBU] {739128788417bf17c172ed196dfaa68a} [ 84 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`fangzhen_id`,`type`,`is_percent`,`total`,`created_at`,`status`,`work_id`) VALUES('低压部分',2,11,0,0,'2024-03-22 20:57:21',0,505971710521639224) +2024-03-22 20:57:21.304 [DEBU] {9245327d8417bf17c272ed193f8db8cd} [ 77 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`is_percent`,`type`,`created_at`,`status`,`fangzhen_id`,`work_id`) VALUES('高压部分',1,22,'2024-03-22 20:57:21',0,2,505971710522360120) +2024-03-22 20:57:21.380 [DEBU] {f107c5818417bf17c372ed19db76bce6} [ 76 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`is_percent`,`work_id`,`status`,`fangzhen_id`,`work_name`,`created_at`) VALUES(29,1,505971710522818872,0,2,'环网柜','2024-03-22 20:57:21') +2024-03-22 20:57:21.461 [DEBU] {20a576868417bf17c472ed195e9cf550} [ 77 ms] [default] [zmkg] [rows:28 ] INSERT INTO `work_status`(`is_percent`,`parent`,`status`,`total`,`fangzhen_id`,`work_name`,`work_id`,`type`,`created_at`) VALUES(0,3280,0,100,2,'接地沟',505971710521049400,1,'2024-03-22 20:57:21'),(0,3280,0,100,2,'接地敷设',505971710521114936,1,'2024-03-22 20:57:21'),(0,3280,0,100,2,'检测',505971710521180472,1,'2024-03-22 20:57:21'),(0,3281,0,100,2,'基础',505971710521311544,5,'2024-03-22 20:57:21'),(0,3281,0,100,2,'安装',505971710521377080,5,'2024-03-22 20:57:21'),(0,3282,0,100,2,'路基',505971710521508152,8,'2024-03-22 20:57:21'),(0,3282,0,100,2,'排水沟',505971710521573688,8,'2024-03-22 20:57:21'),(1,3283,0,0,2,'钻孔',505971710521704760,11,'2024-03-22 20:57:21'),(1,3283,0,0,2,'桩基',505971710521770296,11,'2024-03-22 20:57:21'),(1,3283,0,0,2,'支架',505971710521835832,11,'2024-03-22 20:57:21'),(1,3283,0,0,2,'光伏板',505971710521901368,11,'2024-03-22 20:57:21'),(0,3283,0,100,2,'直流电缆',505971710521966904,11,'2024-03-22 20:57:21'),(0,3283,0,100,2,'接地线',505971710522032440,11,'2024-03-22 20:57:21'),(1,3283,0,0,2,'逆变器安装',505971710522097976,11,'2024-03-22 20:57:21'),(0,3283,0,100,2,'电缆沟开挖',505971710522163512,11,'2024-03-22 20:57:21'),(0,3283,0,100,2,'敷设',505971710522229048,11,'2024-03-22 20:57:21'),(0,3283,0,100,2,'调试',505971710522294584,11,'2024-03-22 20:57:21'),(1,3284,0,0,2,'箱变基础',505971710522425656,22,'2024-03-22 20:57:21'),(1,3284,0,0,2,'箱变安装',505971710522491192,22,'2024-03-22 20:57:21'),(1,3284,0,0,2,'电缆沟开挖',505971710522556728,22,'2024-03-22 20:57:21'),(1,3284,0,0,2,'高压电缆敷设',505971710522622264,22,'2024-03-22 20:57:21'),(1,3284,0,0,2,'高压电缆试验',505971710522687800,22,'2024-03-22 20:57:21'),(1,3284,0,0,2,'高压电缆调试试验',505971710522753336,22,'2024-03-22 20:57:21'),(1,3285,0,0,2,'基础',505971710522884408,29,'2024-03-22 20:57:21'),(1,3285,0,0,2,'安装',505971710522949944,29,'2024-03-22 20:57:21'),(1,3285,0,0,2,'敷设',505971710523015480,29,'2024-03-22 20:57:21'),(1,3285,0,0,2,'试验',505971710523081016,29,'2024-03-22 20:57:21'),(1,3285,0,0,2,'调试试验',505971710523146552,29,'2024-03-22 20:57:21') +2024-03-22 20:59:41.904 [DEBU] {013a0734a517bf174baae37ab017923d} [171 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 20:59:41.979 [DEBU] {abc4363ea517bf174caae37a410024b8} [ 75 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`created_at`,`fangzhen_id`,`work_id`,`is_percent`,`status`,`type`,`work_name`) VALUES('2024-03-22 20:59:41',2,505971947096506680,0,0,1,'防雷接地网') +2024-03-22 20:59:42.051 [DEBU] {bc20aa42a517bf174daae37aa0a05622} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`created_at`,`fangzhen_id`,`status`,`is_percent`,`work_id`,`type`) VALUES('围栏','2024-03-22 20:59:41',2,0,0,505971947096768824,5) +2024-03-22 20:59:42.121 [DEBU] {9f08f846a517bf174eaae37a26c24b16} [ 70 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`created_at`,`work_name`,`type`,`is_percent`,`work_id`,`fangzhen_id`) VALUES(0,'2024-03-22 20:59:42','道路',8,0,505971947096965432,2) +2024-03-22 20:59:42.194 [DEBU] {bc6d2b4ba517bf174faae37a539ded63} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`work_name`,`is_percent`,`work_id`,`fangzhen_id`,`total`,`created_at`,`status`) VALUES(11,'低压部分',0,505971947097162040,2,0,'2024-03-22 20:59:42',0) +2024-03-22 20:59:42.266 [DEBU] {f549814fa517bf1750aae37a01254b13} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`fangzhen_id`,`type`,`work_id`,`is_percent`,`work_name`,`created_at`) VALUES(0,2,22,505971947097882936,1,'高压部分','2024-03-22 20:59:42') +2024-03-22 20:59:42.338 [DEBU] {5619c653a517bf1751aae37af22b8d55} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`created_at`,`work_name`,`work_id`,`is_percent`,`type`,`status`) VALUES(2,'2024-03-22 20:59:42','环网柜',505971947098341688,1,29,0) +2024-03-22 21:00:50.983 [DEBU] {ca5a6749b517bf17d2c5bf3e69e7c2ca} [171 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-22 21:00:51.055 [DEBU] {5513a753b517bf17d3c5bf3eb0fa922d} [ 71 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`work_name`,`work_id`,`is_percent`,`fangzhen_id`,`status`,`created_at`) VALUES(1,'防雷接地网',505972062993514808,0,2,0,'2024-03-22 21:00:50') +2024-03-22 21:00:51.130 [DEBU] {ef80f157b517bf17d4c5bf3ea363f105} [ 74 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`work_id`,`fangzhen_id`,`created_at`,`is_percent`,`type`,`status`) VALUES('围栏',505972062993776952,2,'2024-03-22 21:00:51',0,5,0) +2024-03-22 21:00:51.204 [DEBU] {bf1e6d5cb517bf17d5c5bf3e0dbb4d5b} [ 73 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`type`,`fangzhen_id`,`work_name`,`status`,`is_percent`,`created_at`) VALUES(505972062993973560,8,2,'道路',0,0,'2024-03-22 21:00:51') +2024-03-22 21:00:51.278 [DEBU] {b149d560b517bf17d6c5bf3e8ec9df6f} [ 73 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`total`,`created_at`,`work_id`,`work_name`,`is_percent`,`fangzhen_id`,`status`) VALUES(11,0,'2024-03-22 21:00:51',505972062994170168,'低压部分',0,2,0) +2024-03-22 21:00:51.350 [DEBU] {75913265b517bf17d7c5bf3eb6dd8b38} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`fangzhen_id`,`status`,`created_at`,`is_percent`,`type`,`work_name`) VALUES(505972062994891064,2,0,'2024-03-22 21:00:51',1,22,'高压部分') +2024-03-22 21:00:51.422 [DEBU] {8ce58469b517bf17d8c5bf3e5ae99f29} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`is_percent`,`status`,`created_at`,`work_name`,`work_id`,`type`,`fangzhen_id`) VALUES(1,0,'2024-03-22 21:00:51','环网柜',505972062995349816,29,2) +2024-03-22 21:00:53.451 [DEBU] {853121e2b517bf17d9c5bf3e13987237} [ 77 ms] [default] [zmkg] [rows:28 ] INSERT INTO `work_status`(`is_percent`,`work_name`,`total`,`fangzhen_id`,`type`,`status`,`work_id`,`parent`,`created_at`) VALUES(0,'接地沟',100,2,2,0,505972062993580344,3320,'2024-03-22 21:00:53'),(0,'接地敷设',100,2,3,0,505972062993645880,3320,'2024-03-22 21:00:53'),(0,'检测',100,2,4,0,505972062993711416,3320,'2024-03-22 21:00:53'),(0,'基础',100,2,6,0,505972062993842488,3321,'2024-03-22 21:00:53'),(0,'安装',100,2,7,0,505972062993908024,3321,'2024-03-22 21:00:53'),(0,'路基',100,2,9,0,505972062994039096,3322,'2024-03-22 21:00:53'),(0,'排水沟',100,2,10,0,505972062994104632,3322,'2024-03-22 21:00:53'),(1,'钻孔',0,2,12,0,505972062994235704,3323,'2024-03-22 21:00:53'),(1,'桩基',0,2,13,0,505972062994301240,3323,'2024-03-22 21:00:53'),(1,'支架',0,2,14,0,505972062994366776,3323,'2024-03-22 21:00:53'),(1,'光伏板',0,2,15,0,505972062994432312,3323,'2024-03-22 21:00:53'),(0,'直流电缆',100,2,16,0,505972062994497848,3323,'2024-03-22 21:00:53'),(0,'接地线',100,2,17,0,505972062994563384,3323,'2024-03-22 21:00:53'),(1,'逆变器安装',0,2,18,0,505972062994628920,3323,'2024-03-22 21:00:53'),(0,'电缆沟开挖',100,2,19,0,505972062994694456,3323,'2024-03-22 21:00:53'),(0,'敷设',100,2,20,0,505972062994759992,3323,'2024-03-22 21:00:53'),(0,'调试',100,2,21,0,505972062994825528,3323,'2024-03-22 21:00:53'),(1,'箱变基础',0,2,23,0,505972062994956600,3324,'2024-03-22 21:00:53'),(1,'箱变安装',0,2,24,0,505972062995022136,3324,'2024-03-22 21:00:53'),(1,'电缆沟开挖',0,2,25,0,505972062995087672,3324,'2024-03-22 21:00:53'),(1,'高压电缆敷设',0,2,26,0,505972062995153208,3324,'2024-03-22 21:00:53'),(1,'高压电缆试验',0,2,27,0,505972062995218744,3324,'2024-03-22 21:00:53'),(1,'高压电缆调试试验',0,2,27,0,505972062995284280,3324,'2024-03-22 21:00:53'),(1,'基础',0,2,30,0,505972062995415352,3325,'2024-03-22 21:00:53'),(1,'安装',0,2,31,0,505972062995480888,3325,'2024-03-22 21:00:53'),(1,'敷设',0,2,32,0,505972062995546424,3325,'2024-03-22 21:00:53'),(1,'试验',0,2,33,0,505972062995611960,3325,'2024-03-22 21:00:53'),(1,'调试试验',0,2,34,0,505972062995677496,3325,'2024-03-22 21:00:53') diff --git a/test/resource/log/sql/2024-03-23.log b/test/resource/log/sql/2024-03-23.log new file mode 100644 index 0000000..68fb5d3 --- /dev/null +++ b/test/resource/log/sql/2024-03-23.log @@ -0,0 +1,170 @@ +2024-03-23 11:08:18.984 [DEBU] {a1333940f445bf17bddcce3e397d31a7} [209 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-23 11:08:19.058 [DEBU] {50a3af4cf445bf17bedcce3ef9aaf4ef} [ 74 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`is_percent`,`status`,`work_name`,`type`,`work_id`,`created_at`) VALUES(183,0,0,'防雷接地网',1,506057371714322763,'2024-03-23 11:08:18') +2024-03-23 11:08:19.130 [DEBU] {15cd1051f445bf17bfdcce3ed390873a} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`status`,`is_percent`,`work_id`,`fangzhen_id`,`work_name`,`created_at`) VALUES(5,0,0,506057371714584907,183,'围栏','2024-03-23 11:08:19') +2024-03-23 11:08:19.202 [DEBU] {ade15c55f445bf17c0dcce3e92bc9666} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`work_id`,`created_at`,`is_percent`,`type`,`fangzhen_id`,`work_name`) VALUES(0,506057371714781515,'2024-03-23 11:08:19',0,8,183,'道路') +2024-03-23 11:08:19.282 [DEBU] {f195a559f445bf17c1dcce3e332e267b} [ 80 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`status`,`total`,`type`,`fangzhen_id`,`work_id`,`is_percent`,`created_at`) VALUES('低压部分',0,0,11,183,506057371714978123,0,'2024-03-23 11:08:19') +2024-03-23 11:08:19.355 [DEBU] {18fc775ef445bf17c2dcce3e191a903e} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`type`,`is_percent`,`work_id`,`work_name`,`status`,`created_at`) VALUES(183,22,1,506057371715699019,'高压部分',0,'2024-03-23 11:08:19') +2024-03-23 11:08:19.428 [DEBU] {0686c562f445bf17c3dcce3ed058b8c1} [ 73 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`is_percent`,`work_id`,`type`,`created_at`,`status`,`work_name`,`fangzhen_id`) VALUES(1,506057371716157771,29,'2024-03-23 11:08:19',0,'环网柜',183) +2024-03-23 11:08:27.685 [DEBU] {e43b7e4bf645bf17c4dcce3e8bd9f52e} [131 ms] [default] [zmkg] [rows:28 ] INSERT INTO `work_status`(`fangzhen_id`,`work_name`,`parent`,`type`,`work_id`,`status`,`is_percent`,`total`,`created_at`) VALUES(183,'接地沟',3354,2,506057371714388299,0,0,100,'2024-03-23 11:08:27'),(183,'接地敷设',3354,3,506057371714453835,0,0,100,'2024-03-23 11:08:27'),(183,'检测',3354,4,506057371714519371,0,0,100,'2024-03-23 11:08:27'),(183,'基础',3355,6,506057371714650443,0,0,100,'2024-03-23 11:08:27'),(183,'安装',3355,7,506057371714715979,0,0,100,'2024-03-23 11:08:27'),(183,'路基',3356,9,506057371714847051,0,0,100,'2024-03-23 11:08:27'),(183,'排水沟',3356,10,506057371714912587,0,0,100,'2024-03-23 11:08:27'),(183,'钻孔',3357,12,506057371715043659,0,1,0,'2024-03-23 11:08:27'),(183,'桩基',3357,13,506057371715109195,0,1,0,'2024-03-23 11:08:27'),(183,'支架',3357,14,506057371715174731,0,1,0,'2024-03-23 11:08:27'),(183,'光伏板',3357,15,506057371715240267,0,1,0,'2024-03-23 11:08:27'),(183,'直流电缆',3357,16,506057371715305803,0,0,100,'2024-03-23 11:08:27'),(183,'接地线',3357,17,506057371715371339,0,0,100,'2024-03-23 11:08:27'),(183,'逆变器安装',3357,18,506057371715436875,0,1,0,'2024-03-23 11:08:27'),(183,'电缆沟开挖',3357,19,506057371715502411,0,0,100,'2024-03-23 11:08:27'),(183,'敷设',3357,20,506057371715567947,0,0,100,'2024-03-23 11:08:27'),(183,'调试',3357,21,506057371715633483,0,0,100,'2024-03-23 11:08:27'),(183,'箱变基础',3358,23,506057371715764555,0,1,0,'2024-03-23 11:08:27'),(183,'箱变安装',3358,24,506057371715830091,0,1,0,'2024-03-23 11:08:27'),(183,'电缆沟开挖',3358,25,506057371715895627,0,1,0,'2024-03-23 11:08:27'),(183,'高压电缆敷设',3358,26,506057371715961163,0,1,0,'2024-03-23 11:08:27'),(183,'高压电缆试验',3358,27,506057371716026699,0,1,0,'2024-03-23 11:08:27'),(183,'高压电缆调试试验',3358,27,506057371716092235,0,1,0,'2024-03-23 11:08:27'),(183,'基础',3359,30,506057371716223307,0,1,0,'2024-03-23 11:08:27'),(183,'安装',3359,31,506057371716288843,0,1,0,'2024-03-23 11:08:27'),(183,'敷设',3359,32,506057371716354379,0,1,0,'2024-03-23 11:08:27'),(183,'试验',3359,33,506057371716419915,0,1,0,'2024-03-23 11:08:27'),(183,'调试试验',3359,34,506057371716485451,0,1,0,'2024-03-23 11:08:27') +2024-03-23 11:16:14.893 [DEBU] {47e6750f6346bf17e4e28b76a8209b88} [194 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-23 11:16:14.980 [DEBU] {952b111b6346bf17e5e28b76510ad0d4} [ 87 ms] [default] [zmkg] [rows:8 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=2) AND `deleted_at` IS NULL +2024-03-23 11:16:48.871 [DEBU] {a490e8f96a46bf17e6e28b76f98f15a2} [174 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-23 11:16:48.942 [DEBU] {f4104b046b46bf17e7e28b764dc76622} [ 70 ms] [default] [zmkg] [rows:0 ] UPDATE `work_status` SET `total`=total+1 WHERE `fangzhen_id`=190 +2024-03-23 11:17:23.897 [DEBU] {802f0d1f7346bf17e8e28b767e4e3235} [217 ms] [default] [zmkg] [rows:0 ] UPDATE `work_status` SET `total`=total+1 WHERE `fangzhen_id`=189 +2024-03-23 11:17:26.997 [DEBU] {ef1659e07346bf17e9e28b76d66c8687} [ 74 ms] [default] [zmkg] [rows:0 ] UPDATE `work_status` SET `total`=total+1 WHERE `fangzhen_id`=188 +2024-03-23 11:18:32.049 [DEBU] {bdeff7fe8246bf177e0c4a14d1a14446} [188 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-23 11:18:32.123 [DEBU] {40672f0a8346bf177f0c4a145e3e7d3f} [ 74 ms] [default] [zmkg] [rows:8 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=2) AND `deleted_at` IS NULL +2024-03-23 11:19:24.482 [DEBU] {72e4d4348f46bf171bb27816d64a4a82} [178 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-23 11:19:24.551 [DEBU] {5adc753f8f46bf171cb278166a53bff7} [ 68 ms] [default] [zmkg] [rows:8 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=2) AND `deleted_at` IS NULL +2024-03-23 11:19:28.086 [DEBU] {dde012149046bf171db2781642b0d0af} [ 36 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-23 11:19:28.162 [DEBU] {c9f43a169046bf171eb27816ff62e8ff} [ 76 ms] [default] [zmkg] [rows:29 ] UPDATE `work_status` SET `total`=total+1 WHERE `fangzhen_id`=183 +2024-03-23 11:44:53.917 [DEBU] {a8a27f4cf347bf17eb89f8312d1b6170} [207 ms] [default] [zmkg] [rows:4 ] SHOW FULL COLUMNS FROM `sub_project` +2024-03-23 11:44:54.001 [DEBU] {b54de658f347bf17ec89f8310f00ecd4} [ 83 ms] [default] [zmkg] [rows:1 ] INSERT INTO `sub_project`(`project_id`,`project_name`,`created_at`) VALUES(9,'测试子项目','2024-03-23 11:44:53') +2024-03-23 11:44:54.037 [DEBU] {2398e35df347bf17ed89f831f119af42} [ 36 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-23 11:44:54.110 [DEBU] {29480660f347bf17ee89f83140eacc2b} [ 73 ms] [default] [zmkg] [rows:4 ] INSERT INTO `qianqi_fangzhen`(`deleted_at`,`id`,`project_id`,`name`,`source_id`,`source_path`,`created_at`,`xiangbian_id`,`create_by`,`update_by`,`updated_at`) VALUES(null,0,'9','T01','','','2024-03-23 11:44:54','','','','2024-03-23 11:44:54'),(null,0,'9','T02','','','2024-03-23 11:44:54','','','','2024-03-23 11:44:54'),(null,0,'9','T03','','','2024-03-23 11:44:54','','','','2024-03-23 11:44:54'),(null,0,'9','T04','','','2024-03-23 11:44:54','','','','2024-03-23 11:44:54') +2024-03-23 11:44:54.182 [DEBU] {58fe6164f347bf17ef89f8313cd435c7} [ 72 ms] [default] [zmkg] [rows:4 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=9) AND `deleted_at` IS NULL +2024-03-23 11:44:54.220 [DEBU] {6498cb68f347bf17f089f831e00ff82e} [ 36 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-23 11:44:54.293 [DEBU] {47c0f46af347bf17f189f83153f5c57d} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`status`,`created_at`,`work_name`,`is_percent`,`type`,`fangzhen_id`) VALUES(506061055001100619,0,'2024-03-23 11:44:54','防雷接地网',0,1,191) +2024-03-23 11:44:54.364 [DEBU] {4487486ff347bf17f289f83104b2d1d8} [ 71 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`work_id`,`fangzhen_id`,`created_at`,`is_percent`,`type`,`work_name`) VALUES(0,506061055001362763,191,'2024-03-23 11:44:54',0,5,'围栏') +2024-03-23 11:44:54.438 [DEBU] {69a08b73f347bf17f389f831002174d3} [ 73 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`is_percent`,`work_id`,`status`,`fangzhen_id`,`work_name`,`created_at`) VALUES(8,0,506061055001559371,0,191,'道路','2024-03-23 11:44:54') +2024-03-23 11:44:54.516 [DEBU] {4d1aef77f347bf17f489f831c120fe02} [ 78 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`work_name`,`created_at`,`fangzhen_id`,`type`,`work_id`,`total`,`is_percent`) VALUES(0,'低压部分','2024-03-23 11:44:54',191,11,506061055001755979,0,0) +2024-03-23 11:44:54.589 [DEBU] {0110997cf347bf17f589f831467cb16e} [ 71 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`type`,`created_at`,`work_id`,`is_percent`,`work_name`,`status`) VALUES(191,22,'2024-03-23 11:44:54',506061055002476875,1,'高压部分',0) +2024-03-23 11:44:54.661 [DEBU] {c83fe880f347bf17f689f8318a134bca} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`is_percent`,`work_id`,`work_name`,`created_at`,`type`,`fangzhen_id`,`status`) VALUES(1,506061055002935627,'环网柜','2024-03-23 11:44:54',29,191,0) +2024-03-23 11:44:54.762 [DEBU] {b5a1e885f347bf17f789f8319227e47d} [ 89 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`created_at`,`work_id`,`work_name`,`type`,`is_percent`,`fangzhen_id`) VALUES(0,'2024-03-23 11:44:54',506061055823184203,'防雷接地网',1,0,192) +2024-03-23 11:44:54.834 [DEBU] {3a5b418bf347bf17f889f831ac665524} [ 71 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`work_id`,`work_name`,`is_percent`,`status`,`type`,`created_at`) VALUES(192,506061055823446347,'围栏',0,0,5,'2024-03-23 11:44:54') +2024-03-23 11:44:54.906 [DEBU] {4c978c8ff347bf17f989f8311277bb78} [ 71 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`created_at`,`type`,`fangzhen_id`,`status`,`is_percent`,`work_id`,`work_name`) VALUES('2024-03-23 11:44:54',8,192,0,0,506061055823642955,'道路') +2024-03-23 11:44:54.981 [DEBU] {36e4d593f347bf17fa89f83196a8a579} [ 75 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`work_name`,`is_percent`,`status`,`created_at`,`fangzhen_id`,`total`,`work_id`) VALUES(11,'低压部分',0,0,'2024-03-23 11:44:54',192,0,506061055823839563) +2024-03-23 11:44:55.070 [DEBU] {f9b94e98f347bf17fb89f831a8af9df6} [ 89 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`status`,`work_id`,`type`,`is_percent`,`fangzhen_id`,`created_at`) VALUES('高压部分',0,506061055824560459,22,1,192,'2024-03-23 11:44:54') +2024-03-23 11:44:55.148 [DEBU] {e506c49df347bf17fc89f831a8aadbba} [ 75 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`status`,`is_percent`,`fangzhen_id`,`created_at`,`work_id`,`type`) VALUES('环网柜',0,1,192,'2024-03-23 11:44:55',506061055825019211,29) +2024-03-23 11:44:55.231 [DEBU] {0af461a2f347bf17fd89f8314e6ae0fa} [ 80 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`work_name`,`work_id`,`status`,`type`,`is_percent`,`created_at`) VALUES(193,'防雷接地网',506061056628490571,0,1,0,'2024-03-23 11:44:55') +2024-03-23 11:44:55.303 [DEBU] {dfc738a7f347bf17fe89f83187b84c70} [ 71 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`work_name`,`is_percent`,`work_id`,`type`,`status`,`created_at`) VALUES(193,'围栏',0,506061056628752715,5,0,'2024-03-23 11:44:55') +2024-03-23 11:44:55.375 [DEBU] {5d3b7fabf347bf17ff89f831df568984} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`created_at`,`type`,`is_percent`,`work_id`,`work_name`,`status`) VALUES(193,'2024-03-23 11:44:55',8,0,506061056628949323,'道路',0) +2024-03-23 11:44:55.447 [DEBU] {3adac8aff347bf17008af831ab3a56c4} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`status`,`fangzhen_id`,`total`,`work_name`,`type`,`is_percent`,`created_at`) VALUES(506061056629145931,0,193,0,'低压部分',11,0,'2024-03-23 11:44:55') +2024-03-23 11:44:55.524 [DEBU] {79f013b4f347bf17018af831109c7c2c} [ 77 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`is_percent`,`work_name`,`work_id`,`created_at`,`type`,`fangzhen_id`) VALUES(0,1,'高压部分',506061056629866827,'2024-03-23 11:44:55',22,193) +2024-03-23 11:44:55.602 [DEBU] {59a2a3b8f347bf17028af8313e77ed9d} [ 78 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`is_percent`,`status`,`work_name`,`fangzhen_id`,`work_id`,`created_at`) VALUES(29,1,0,'环网柜',193,506061056630325579,'2024-03-23 11:44:55') +2024-03-23 11:44:55.686 [DEBU] {b0e206bef347bf17038af8313fe85d55} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`is_percent`,`status`,`fangzhen_id`,`type`,`work_id`,`created_at`) VALUES('防雷接地网',0,0,194,1,506061057400242507,'2024-03-23 11:44:55') +2024-03-23 11:44:55.758 [DEBU] {82095bc2f347bf17048af8312a2c1bb6} [ 71 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`work_id`,`type`,`is_percent`,`work_name`,`fangzhen_id`,`created_at`) VALUES(0,506061057400504651,5,0,'围栏',194,'2024-03-23 11:44:55') +2024-03-23 11:44:55.829 [DEBU] {93c29cc6f347bf17058af831343b3c65} [ 71 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`work_id`,`status`,`type`,`fangzhen_id`,`is_percent`,`created_at`) VALUES('道路',506061057400701259,0,8,194,0,'2024-03-23 11:44:55') +2024-03-23 11:44:55.903 [DEBU] {5fccd9caf347bf17068af83139598bb4} [ 74 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`work_id`,`type`,`fangzhen_id`,`is_percent`,`total`,`created_at`,`work_name`) VALUES(0,506061057400897867,11,194,0,0,'2024-03-23 11:44:55','低压部分') +2024-03-23 11:44:55.984 [DEBU] {83c349cff347bf17078af8312bf6cc9c} [ 80 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`is_percent`,`fangzhen_id`,`status`,`type`,`work_id`,`work_name`,`created_at`) VALUES(1,194,0,22,506061057401618763,'高压部分','2024-03-23 11:44:55') +2024-03-23 11:44:56.057 [DEBU] {237f1bd4f347bf17088af8311cca98a5} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`work_name`,`status`,`type`,`is_percent`,`fangzhen_id`,`created_at`) VALUES(506061057402077515,'环网柜',0,29,1,194,'2024-03-23 11:44:55') +2024-03-23 11:45:15.968 [DEBU] {7545aa76f847bf17098af831a1a869c2} [ 76 ms] [default] [zmkg] [rows:50 ] INSERT INTO `work_status`(`total`,`fangzhen_id`,`status`,`work_name`,`created_at`,`type`,`is_percent`,`parent`,`work_id`) VALUES(100,191,0,'接地沟','2024-03-23 11:45:15',2,0,3388,506061055001166155),(100,191,0,'接地敷设','2024-03-23 11:45:15',3,0,3388,506061055001231691),(100,191,0,'检测','2024-03-23 11:45:15',4,0,3388,506061055001297227),(100,191,0,'基础','2024-03-23 11:45:15',6,0,3389,506061055001428299),(100,191,0,'安装','2024-03-23 11:45:15',7,0,3389,506061055001493835),(100,191,0,'路基','2024-03-23 11:45:15',9,0,3390,506061055001624907),(100,191,0,'排水沟','2024-03-23 11:45:15',10,0,3390,506061055001690443),(0,191,0,'钻孔','2024-03-23 11:45:15',12,1,3391,506061055001821515),(0,191,0,'桩基','2024-03-23 11:45:15',13,1,3391,506061055001887051),(0,191,0,'支架','2024-03-23 11:45:15',14,1,3391,506061055001952587),(0,191,0,'光伏板','2024-03-23 11:45:15',15,1,3391,506061055002018123),(100,191,0,'直流电缆','2024-03-23 11:45:15',16,0,3391,506061055002083659),(100,191,0,'接地线','2024-03-23 11:45:15',17,0,3391,506061055002149195),(0,191,0,'逆变器安装','2024-03-23 11:45:15',18,1,3391,506061055002214731),(100,191,0,'电缆沟开挖','2024-03-23 11:45:15',19,0,3391,506061055002280267),(100,191,0,'敷设','2024-03-23 11:45:15',20,0,3391,506061055002345803),(100,191,0,'调试','2024-03-23 11:45:15',21,0,3391,506061055002411339),(0,191,0,'箱变基础','2024-03-23 11:45:15',23,1,3392,506061055002542411),(0,191,0,'箱变安装','2024-03-23 11:45:15',24,1,3392,506061055002607947),(0,191,0,'电缆沟开挖','2024-03-23 11:45:15',25,1,3392,506061055002673483),(0,191,0,'高压电缆敷设','2024-03-23 11:45:15',26,1,3392,506061055002739019),(0,191,0,'高压电缆试验','2024-03-23 11:45:15',27,1,3392,506061055002804555),(0,191,0,'高压电缆调试试验','2024-03-23 11:45:15',27,1,3392,506061055002870091),(0,191,0,'基础','2024-03-23 11:45:15',30,1,3393,506061055003001163),(0,191,0,'安装','2024-03-23 11:45:15',31,1,3393,506061055003066699),(0,191,0,'敷设','2024-03-23 11:45:15',32,1,3393,506061055003132235),(0,191,0,'试验','2024-03-23 11:45:15',33,1,3393,506061055003197771),(0,191,0,'调试试验','2024-03-23 11:45:15',34,1,3393,506061055003263307),(100,192,0,'接地沟','2024-03-23 11:45:15',2,0,3394,506061055823249739),(100,192,0,'接地敷设','2024-03-23 11:45:15',3,0,3394,506061055823315275),(100,192,0,'检测','2024-03-23 11:45:15',4,0,3394,506061055823380811),(100,192,0,'基础','2024-03-23 11:45:15',6,0,3395,506061055823511883),(100,192,0,'安装','2024-03-23 11:45:15',7,0,3395,506061055823577419),(100,192,0,'路基','2024-03-23 11:45:15',9,0,3396,506061055823708491),(100,192,0,'排水沟','2024-03-23 11:45:15',10,0,3396,506061055823774027),(0,192,0,'钻孔','2024-03-23 11:45:15',12,1,3397,506061055823905099),(0,192,0,'桩基','2024-03-23 11:45:15',13,1,3397,506061055823970635),(0,192,0,'支架','2024-03-23 11:45:15',14,1,3397,506061055824036171),(0,192,0,'光伏板','2024-03-23 11:45:15',15,1,3397,506061055824101707),(100,192,0,'直流电缆','2024-03-23 11:45:15',16,0,3397,506061055824167243),(100,192,0,'接地线','2024-03-23 11:45:15',17,0,3397,506061055824232779),(0,192,0,'逆变器安装','2024-03-23 11:45:15',18,1,3397,506061055824298315),(100,192,0,'电缆沟开挖','2024-03-23 11:45:15',19,0,3397,506061055824363851),(100,192,0,'敷设','2024-03-23 11:45:15',20,0,3397,506061055824429387),(100,192,0,'调试','2024-03-23 11:45:15',21,0,3397,506061055824494923),(0,192,0,'箱变基础','2024-03-23 11:45:15',23,1,3398,506061055824625995),(0,192,0,'箱变安装','2024-03-23 11:45:15',24,1,3398,506061055824691531),(0,192,0,'电缆沟开挖','2024-03-23 11:45:15',25,1,3398,506061055824757067),(0,192,0,'高压电缆敷设','2024-03-23 11:45:15',26,1,3398,506061055824822603),(0,192,0,'高压电缆试验','2024-03-23 11:45:15',27,1,3398,506061055824888139) +2024-03-23 11:45:16.046 [DEBU] {8cc2437bf847bf170a8af8314429d5d0} [ 77 ms] [default] [zmkg] [rows:50 ] INSERT INTO `work_status`(`total`,`fangzhen_id`,`status`,`work_name`,`created_at`,`type`,`is_percent`,`parent`,`work_id`) VALUES(0,192,0,'高压电缆调试试验','2024-03-23 11:45:15',27,1,3398,506061055824953675),(0,192,0,'基础','2024-03-23 11:45:15',30,1,3399,506061055825084747),(0,192,0,'安装','2024-03-23 11:45:15',31,1,3399,506061055825150283),(0,192,0,'敷设','2024-03-23 11:45:15',32,1,3399,506061055825215819),(0,192,0,'试验','2024-03-23 11:45:15',33,1,3399,506061055825281355),(0,192,0,'调试试验','2024-03-23 11:45:15',34,1,3399,506061055825346891),(100,193,0,'接地沟','2024-03-23 11:45:15',2,0,3400,506061056628556107),(100,193,0,'接地敷设','2024-03-23 11:45:15',3,0,3400,506061056628621643),(100,193,0,'检测','2024-03-23 11:45:15',4,0,3400,506061056628687179),(100,193,0,'基础','2024-03-23 11:45:15',6,0,3401,506061056628818251),(100,193,0,'安装','2024-03-23 11:45:15',7,0,3401,506061056628883787),(100,193,0,'路基','2024-03-23 11:45:15',9,0,3402,506061056629014859),(100,193,0,'排水沟','2024-03-23 11:45:15',10,0,3402,506061056629080395),(0,193,0,'钻孔','2024-03-23 11:45:15',12,1,3403,506061056629211467),(0,193,0,'桩基','2024-03-23 11:45:15',13,1,3403,506061056629277003),(0,193,0,'支架','2024-03-23 11:45:15',14,1,3403,506061056629342539),(0,193,0,'光伏板','2024-03-23 11:45:15',15,1,3403,506061056629408075),(100,193,0,'直流电缆','2024-03-23 11:45:15',16,0,3403,506061056629473611),(100,193,0,'接地线','2024-03-23 11:45:15',17,0,3403,506061056629539147),(0,193,0,'逆变器安装','2024-03-23 11:45:15',18,1,3403,506061056629604683),(100,193,0,'电缆沟开挖','2024-03-23 11:45:15',19,0,3403,506061056629670219),(100,193,0,'敷设','2024-03-23 11:45:15',20,0,3403,506061056629735755),(100,193,0,'调试','2024-03-23 11:45:15',21,0,3403,506061056629801291),(0,193,0,'箱变基础','2024-03-23 11:45:15',23,1,3404,506061056629932363),(0,193,0,'箱变安装','2024-03-23 11:45:15',24,1,3404,506061056629997899),(0,193,0,'电缆沟开挖','2024-03-23 11:45:15',25,1,3404,506061056630063435),(0,193,0,'高压电缆敷设','2024-03-23 11:45:15',26,1,3404,506061056630128971),(0,193,0,'高压电缆试验','2024-03-23 11:45:15',27,1,3404,506061056630194507),(0,193,0,'高压电缆调试试验','2024-03-23 11:45:15',27,1,3404,506061056630260043),(0,193,0,'基础','2024-03-23 11:45:15',30,1,3405,506061056630391115),(0,193,0,'安装','2024-03-23 11:45:15',31,1,3405,506061056630456651),(0,193,0,'敷设','2024-03-23 11:45:15',32,1,3405,506061056630522187),(0,193,0,'试验','2024-03-23 11:45:15',33,1,3405,506061056630587723),(0,193,0,'调试试验','2024-03-23 11:45:15',34,1,3405,506061056630653259),(100,194,0,'接地沟','2024-03-23 11:45:15',2,0,3406,506061057400308043),(100,194,0,'接地敷设','2024-03-23 11:45:15',3,0,3406,506061057400373579),(100,194,0,'检测','2024-03-23 11:45:15',4,0,3406,506061057400439115),(100,194,0,'基础','2024-03-23 11:45:15',6,0,3407,506061057400570187),(100,194,0,'安装','2024-03-23 11:45:15',7,0,3407,506061057400635723),(100,194,0,'路基','2024-03-23 11:45:15',9,0,3408,506061057400766795),(100,194,0,'排水沟','2024-03-23 11:45:15',10,0,3408,506061057400832331),(0,194,0,'钻孔','2024-03-23 11:45:15',12,1,3409,506061057400963403),(0,194,0,'桩基','2024-03-23 11:45:15',13,1,3409,506061057401028939),(0,194,0,'支架','2024-03-23 11:45:15',14,1,3409,506061057401094475),(0,194,0,'光伏板','2024-03-23 11:45:15',15,1,3409,506061057401160011),(100,194,0,'直流电缆','2024-03-23 11:45:15',16,0,3409,506061057401225547),(100,194,0,'接地线','2024-03-23 11:45:15',17,0,3409,506061057401291083),(0,194,0,'逆变器安装','2024-03-23 11:45:15',18,1,3409,506061057401356619),(100,194,0,'电缆沟开挖','2024-03-23 11:45:15',19,0,3409,506061057401422155),(100,194,0,'敷设','2024-03-23 11:45:15',20,0,3409,506061057401487691) +2024-03-23 11:45:16.136 [DEBU] {d367e17ff847bf170b8af831c3240209} [ 89 ms] [default] [zmkg] [rows:12 ] INSERT INTO `work_status`(`total`,`fangzhen_id`,`status`,`work_name`,`created_at`,`type`,`is_percent`,`parent`,`work_id`) VALUES(100,194,0,'调试','2024-03-23 11:45:15',21,0,3409,506061057401553227),(0,194,0,'箱变基础','2024-03-23 11:45:15',23,1,3410,506061057401684299),(0,194,0,'箱变安装','2024-03-23 11:45:15',24,1,3410,506061057401749835),(0,194,0,'电缆沟开挖','2024-03-23 11:45:15',25,1,3410,506061057401815371),(0,194,0,'高压电缆敷设','2024-03-23 11:45:15',26,1,3410,506061057401880907),(0,194,0,'高压电缆试验','2024-03-23 11:45:15',27,1,3410,506061057401946443),(0,194,0,'高压电缆调试试验','2024-03-23 11:45:15',27,1,3410,506061057402011979),(0,194,0,'基础','2024-03-23 11:45:15',30,1,3411,506061057402143051),(0,194,0,'安装','2024-03-23 11:45:15',31,1,3411,506061057402208587),(0,194,0,'敷设','2024-03-23 11:45:15',32,1,3411,506061057402274123),(0,194,0,'试验','2024-03-23 11:45:15',33,1,3411,506061057402339659),(0,194,0,'调试试验','2024-03-23 11:45:15',34,1,3411,506061057402405195) +2024-03-23 11:45:41.333 [DEBU] {2fd8b856fe47bf170c8af83193f90c2d} [207 ms] [default] [zmkg] [rows:1 ] SELECT `id`,`project_id`,`project_name`,`created_at` FROM `sub_project` WHERE `project_id`=9 +2024-03-23 11:46:31.370 [DEBU] {74ad69fc0948bf170d8af8316e2f8126} [220 ms] [default] [zmkg] [rows:4 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=9) AND `deleted_at` IS NULL +2024-03-23 11:46:55.635 [DEBU] {145662ab0f48bf170e8af831385d3c5b} [ 74 ms] [default] [zmkg] [rows:28 ] UPDATE `work_status` SET `total`=total+1 WHERE (`fangzhen_id`=191) AND (`parent` IS NOT NULL) +2024-03-23 11:47:40.728 [DEBU] {2be28a221a48bf170f8af8315b14f7b7} [219 ms] [default] [zmkg] [rows:28 ] UPDATE `work_status` SET `total`=total+1 WHERE (`fangzhen_id`=192) AND (`parent` IS NOT NULL) +2024-03-23 11:47:47.429 [DEBU] {4a4202ba1b48bf17108af8311579a166} [ 83 ms] [default] [zmkg] [rows:28 ] UPDATE `work_status` SET `total`=total+1 WHERE (`fangzhen_id`=193) AND (`parent` IS NOT NULL) +2024-03-23 12:01:06.791 [DEBU] {d86c94d2d548bf171fd5c6353b781719} [169 ms] [default] [zmkg] [rows:4 ] SHOW FULL COLUMNS FROM `sub_project` +2024-03-23 12:01:06.858 [DEBU] {efe7b4dcd548bf1720d5c635bdecac86} [ 66 ms] [default] [zmkg] [rows:1 ] SELECT `id`,`project_id`,`project_name`,`created_at` FROM `sub_project` WHERE `project_id`=9 +2024-03-23 12:01:06.893 [DEBU] {a204b3e0d548bf1721d5c63572d678f3} [ 34 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-23 12:01:06.962 [DEBU] {a3dec7e2d548bf1722d5c635e328bd50} [ 68 ms] [default] [zmkg] [rows:4 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=9) AND `deleted_at` IS NULL +2024-03-23 12:01:12.700 [DEBU] {64efe532d748bf17f78072605dcbbcfd} [167 ms] [default] [zmkg] [rows:4 ] SHOW FULL COLUMNS FROM `sub_project` +2024-03-23 12:01:12.768 [DEBU] {bfd7e43cd748bf17f8807260a9464b56} [ 68 ms] [default] [zmkg] [rows:1 ] SELECT `id`,`project_id`,`project_name`,`created_at` FROM `sub_project` WHERE `project_id`=9 +2024-03-23 12:01:12.803 [DEBU] {f8acf040d748bf17f9807260ca648ae0} [ 35 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-23 12:01:12.870 [DEBU] {63eb0243d748bf17fa807260bac88ab9} [ 67 ms] [default] [zmkg] [rows:4 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=9) AND `deleted_at` IS NULL +2024-03-23 12:02:20.846 [DEBU] {5831760de748bf17b509c54d8a976ef2} [222 ms] [default] [zmkg] [rows:4 ] SHOW FULL COLUMNS FROM `sub_project` +2024-03-23 12:02:20.932 [DEBU] {1c40c11ae748bf17b609c54db9e43ed8} [ 85 ms] [default] [zmkg] [rows:1 ] SELECT `id`,`project_id`,`project_name`,`created_at` FROM `sub_project` WHERE `project_id`=9 +2024-03-23 12:02:20.974 [DEBU] {c68fd41fe748bf17b709c54d873c4e24} [ 42 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-23 12:02:21.051 [DEBU] {110e5522e748bf17b809c54d71c2dc25} [ 77 ms] [default] [zmkg] [rows:4 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=9) AND `deleted_at` IS NULL +2024-03-23 12:02:52.006 [DEBU] {6696b051ee48bf178f003078e844af7b} [172 ms] [default] [zmkg] [rows:4 ] SHOW FULL COLUMNS FROM `sub_project` +2024-03-23 12:02:52.078 [DEBU] {6cce085cee48bf1790003078a3eccdac} [ 71 ms] [default] [zmkg] [rows:2 ] SELECT `id`,`project_id`,`project_name`,`created_at` FROM `sub_project` WHERE `project_id`=9 +2024-03-23 12:02:52.114 [DEBU] {89e44360ee48bf1791003078b444e10a} [ 36 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-23 12:02:52.185 [DEBU] {88ba6862ee48bf1792003078905033e7} [ 71 ms] [default] [zmkg] [rows:4 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=9) AND `deleted_at` IS NULL +2024-03-23 12:02:52.255 [DEBU] {ca1aaf66ee48bf1793003078949ddb22} [ 69 ms] [default] [zmkg] [rows:4 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=9) AND `deleted_at` IS NULL +2024-03-23 13:52:54.557 [DEBU] {6dffa397ef4ebf17a75c5f46148261ad} [185 ms] [default] [zmkg] [rows:4 ] SHOW FULL COLUMNS FROM `sub_project` +2024-03-23 13:52:54.635 [DEBU] {b7abc2a2ef4ebf17a85c5f469f1aa53a} [ 77 ms] [default] [zmkg] [rows:1 ] INSERT INTO `sub_project`(`project_id`,`project_name`,`created_at`) VALUES(9,'测试子项目','2024-03-23 13:52:54') +2024-03-23 13:52:54.672 [DEBU] {aec257a7ef4ebf17a95c5f466d61452a} [ 37 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-23 13:52:54.765 [DEBU] {a0f097a9ef4ebf17aa5c5f46fedf2eda} [ 92 ms] [default] [zmkg] [rows:4 ] INSERT INTO `qianqi_fangzhen`(`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`project_id`,`source_id`,`updated_at`,`deleted_at`,`id`,`name`) VALUES('','','','','2024-03-23 13:52:54','9','','2024-03-23 13:52:54',null,0,'T01'),('','','','','2024-03-23 13:52:54','9','','2024-03-23 13:52:54',null,0,'T02'),('','','','','2024-03-23 13:52:54','9','','2024-03-23 13:52:54',null,0,'T03'),('','','','','2024-03-23 13:52:54','9','','2024-03-23 13:52:54',null,0,'T04') +2024-03-23 13:52:54.838 [DEBU] {b5651dafef4ebf17ab5c5f46d4a0e5c3} [ 72 ms] [default] [zmkg] [rows:4 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=9) AND `deleted_at` IS NULL +2024-03-23 13:52:54.878 [DEBU] {79747fb3ef4ebf17ac5c5f463109a4ac} [ 39 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-23 13:52:54.965 [DEBU] {d46aceb5ef4ebf17ad5c5f469df5b36b} [ 87 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`is_percent`,`work_name`,`fangzhen_id`,`status`,`work_id`,`type`,`created_at`) VALUES(0,'防雷接地网',195,0,506073940993507659,1,'2024-03-23 13:52:54') +2024-03-23 13:52:55.040 [DEBU] {e09509bbef4ebf17ae5c5f465f0c5fcf} [ 74 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`is_percent`,`work_id`,`status`,`work_name`,`created_at`,`fangzhen_id`) VALUES(5,0,506073940993769803,0,'围栏','2024-03-23 13:52:54',195) +2024-03-23 13:52:55.113 [DEBU] {39f67cbfef4ebf17af5c5f464ef2e0bb} [ 73 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`is_percent`,`status`,`fangzhen_id`,`work_name`,`type`,`work_id`,`created_at`) VALUES(0,0,195,'道路',8,506073940993966411,'2024-03-23 13:52:55') +2024-03-23 13:52:55.187 [DEBU] {59f7dfc3ef4ebf17b05c5f46f8e2fa51} [ 73 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`is_percent`,`work_id`,`status`,`created_at`,`total`,`fangzhen_id`,`work_name`,`type`) VALUES(0,506073940994163019,0,'2024-03-23 13:52:55',0,195,'低压部分',11) +2024-03-23 13:52:55.276 [DEBU] {88123fc8ef4ebf17b15c5f46a8c9d14e} [ 89 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`type`,`created_at`,`status`,`is_percent`,`work_id`,`work_name`) VALUES(195,22,'2024-03-23 13:52:55',0,1,506073940994883915,'高压部分') +2024-03-23 13:52:55.350 [DEBU] {0e9993cdef4ebf17b25c5f46a99307d7} [ 73 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`type`,`work_id`,`is_percent`,`work_name`,`fangzhen_id`,`created_at`) VALUES(0,29,506073940995342667,1,'环网柜',195,'2024-03-23 13:52:55') +2024-03-23 13:52:55.439 [DEBU] {a3f9b1d2ef4ebf17b35c5f468a999490} [ 76 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`created_at`,`work_id`,`type`,`work_name`,`is_percent`,`fangzhen_id`,`status`) VALUES('2024-03-23 13:52:55',506073941882700107,1,'防雷接地网',0,196,0) +2024-03-23 13:52:55.513 [DEBU] {956d46d7ef4ebf17b45c5f46bc8fd855} [ 74 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`is_percent`,`work_id`,`fangzhen_id`,`status`,`created_at`,`work_name`,`type`) VALUES(0,506073941882962251,196,0,'2024-03-23 13:52:55','围栏',5) +2024-03-23 13:52:55.586 [DEBU] {339eb5dbef4ebf17b55c5f46ad96b731} [ 72 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`fangzhen_id`,`work_name`,`is_percent`,`created_at`,`status`,`type`) VALUES(506073941883158859,196,'道路',0,'2024-03-23 13:52:55',0,8) +2024-03-23 13:52:55.660 [DEBU] {1ea30ee0ef4ebf17b65c5f46f9423f28} [ 73 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`total`,`fangzhen_id`,`created_at`,`work_name`,`work_id`,`is_percent`,`type`,`status`) VALUES(0,196,'2024-03-23 13:52:55','低压部分',506073941883355467,0,11,0) +2024-03-23 13:52:55.736 [DEBU] {9ed56ae4ef4ebf17b75c5f469ae76dd8} [ 76 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`fangzhen_id`,`type`,`status`,`work_id`,`created_at`,`is_percent`) VALUES('高压部分',196,22,0,506073941884076363,'2024-03-23 13:52:55',1) +2024-03-23 13:52:55.848 [DEBU] {f5b1fbe8ef4ebf17b85c5f4605bdbf5a} [111 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`type`,`fangzhen_id`,`created_at`,`status`,`is_percent`,`work_id`) VALUES('环网柜',29,196,'2024-03-23 13:52:55',0,1,506073941884535115) +2024-03-23 13:52:55.926 [DEBU] {b675c5efef4ebf17b95c5f46680ed301} [ 76 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`status`,`work_name`,`created_at`,`type`,`work_id`,`is_percent`) VALUES(197,0,'防雷接地网','2024-03-23 13:52:55',1,506073942704783691,0) +2024-03-23 13:52:55.999 [DEBU] {c5ca4bf4ef4ebf17ba5c5f464b7818f5} [ 73 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`status`,`type`,`work_name`,`created_at`,`fangzhen_id`,`is_percent`) VALUES(506073942705045835,0,5,'围栏','2024-03-23 13:52:55',197,0) +2024-03-23 13:52:56.075 [DEBU] {3166adf8ef4ebf17bb5c5f46c1ebdbb3} [ 75 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`is_percent`,`created_at`,`work_id`,`status`,`work_name`,`fangzhen_id`,`type`) VALUES(0,'2024-03-23 13:52:56',506073942705242443,0,'道路',197,8) +2024-03-23 13:52:56.150 [DEBU] {a6452ffdef4ebf17bc5c5f46bc742582} [ 75 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`type`,`work_name`,`total`,`status`,`created_at`,`is_percent`,`fangzhen_id`) VALUES(506073942705439051,11,'低压部分',0,0,'2024-03-23 13:52:56',0,197) +2024-03-23 13:52:56.236 [DEBU] {2cbaa401f04ebf17bd5c5f46cb8e2632} [ 86 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`is_percent`,`status`,`fangzhen_id`,`type`,`work_name`,`work_id`,`created_at`) VALUES(1,0,197,22,'高压部分',506073942706159947,'2024-03-23 13:52:56') +2024-03-23 13:52:56.311 [DEBU] {ea9ec706f04ebf17be5c5f46f2c6ca7d} [ 75 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`type`,`created_at`,`is_percent`,`work_id`,`status`,`fangzhen_id`) VALUES('环网柜',29,'2024-03-23 13:52:56',1,506073942706618699,0,197) +2024-03-23 13:52:56.397 [DEBU] {e1d0ed0bf04ebf17bf5c5f469a731c72} [ 74 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`work_id`,`type`,`fangzhen_id`,`is_percent`,`created_at`,`work_name`) VALUES(0,506073943493312843,1,198,0,'2024-03-23 13:52:56','防雷接地网') +2024-03-23 13:52:56.472 [DEBU] {b9375f10f04ebf17c05c5f4655908191} [ 75 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`created_at`,`work_id`,`work_name`,`type`,`fangzhen_id`,`status`,`is_percent`) VALUES('2024-03-23 13:52:56',506073943493574987,'围栏',5,198,0,0) +2024-03-23 13:52:56.546 [DEBU] {6bd7e114f04ebf17c15c5f4664e24671} [ 73 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`work_id`,`is_percent`,`fangzhen_id`,`created_at`,`work_name`,`status`) VALUES(8,506073943493771595,0,198,'2024-03-23 13:52:56','道路',0) +2024-03-23 13:52:56.622 [DEBU] {27ef4219f04ebf17c25c5f462162f591} [ 75 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`created_at`,`total`,`work_name`,`is_percent`,`work_id`,`type`,`status`,`fangzhen_id`) VALUES('2024-03-23 13:52:56',0,'低压部分',0,506073943493968203,11,0,198) +2024-03-23 13:52:56.702 [DEBU] {9910c81df04ebf17c35c5f462c833576} [ 80 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`is_percent`,`created_at`,`fangzhen_id`,`status`,`work_name`,`type`) VALUES(506073943494689099,1,'2024-03-23 13:52:56',198,0,'高压部分',22) +2024-03-23 13:52:56.781 [DEBU] {d7f2a622f04ebf17c45c5f46362d5a7d} [ 77 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`type`,`work_name`,`work_id`,`created_at`,`is_percent`,`fangzhen_id`) VALUES(0,29,'环网柜',506073943495147851,'2024-03-23 13:52:56',1,198) +2024-03-23 13:53:39.081 [DEBU] {08366ff1f94ebf17c55c5f46ef9dc130} [253 ms] [default] [zmkg] [rows:50 ] INSERT INTO `work_status`(`total`,`work_id`,`type`,`fangzhen_id`,`work_name`,`is_percent`,`parent`,`status`,`created_at`) VALUES(100,506073940993573195,2,195,'接地沟',0,3524,0,'2024-03-23 13:53:38'),(100,506073940993638731,3,195,'接地敷设',0,3524,0,'2024-03-23 13:53:38'),(100,506073940993704267,4,195,'检测',0,3524,0,'2024-03-23 13:53:38'),(100,506073940993835339,6,195,'基础',0,3525,0,'2024-03-23 13:53:38'),(100,506073940993900875,7,195,'安装',0,3525,0,'2024-03-23 13:53:38'),(100,506073940994031947,9,195,'路基',0,3526,0,'2024-03-23 13:53:38'),(100,506073940994097483,10,195,'排水沟',0,3526,0,'2024-03-23 13:53:38'),(0,506073940994228555,12,195,'钻孔',1,3527,0,'2024-03-23 13:53:38'),(0,506073940994294091,13,195,'桩基',1,3527,0,'2024-03-23 13:53:38'),(0,506073940994359627,14,195,'支架',1,3527,0,'2024-03-23 13:53:38'),(0,506073940994425163,15,195,'光伏板',1,3527,0,'2024-03-23 13:53:38'),(100,506073940994490699,16,195,'直流电缆',0,3527,0,'2024-03-23 13:53:38'),(100,506073940994556235,17,195,'接地线',0,3527,0,'2024-03-23 13:53:38'),(0,506073940994621771,18,195,'逆变器安装',1,3527,0,'2024-03-23 13:53:38'),(100,506073940994687307,19,195,'电缆沟开挖',0,3527,0,'2024-03-23 13:53:38'),(100,506073940994752843,20,195,'敷设',0,3527,0,'2024-03-23 13:53:38'),(100,506073940994818379,21,195,'调试',0,3527,0,'2024-03-23 13:53:38'),(0,506073940994949451,23,195,'箱变基础',1,3528,0,'2024-03-23 13:53:38'),(0,506073940995014987,24,195,'箱变安装',1,3528,0,'2024-03-23 13:53:38'),(0,506073940995080523,25,195,'电缆沟开挖',1,3528,0,'2024-03-23 13:53:38'),(0,506073940995146059,26,195,'高压电缆敷设',1,3528,0,'2024-03-23 13:53:38'),(0,506073940995211595,27,195,'高压电缆试验',1,3528,0,'2024-03-23 13:53:38'),(0,506073940995277131,27,195,'高压电缆调试试验',1,3528,0,'2024-03-23 13:53:38'),(0,506073940995408203,30,195,'基础',1,3529,0,'2024-03-23 13:53:38'),(0,506073940995473739,31,195,'安装',1,3529,0,'2024-03-23 13:53:38'),(0,506073940995539275,32,195,'敷设',1,3529,0,'2024-03-23 13:53:38'),(0,506073940995604811,33,195,'试验',1,3529,0,'2024-03-23 13:53:38'),(0,506073940995670347,34,195,'调试试验',1,3529,0,'2024-03-23 13:53:38'),(100,506073941882765643,2,196,'接地沟',0,3530,0,'2024-03-23 13:53:38'),(100,506073941882831179,3,196,'接地敷设',0,3530,0,'2024-03-23 13:53:38'),(100,506073941882896715,4,196,'检测',0,3530,0,'2024-03-23 13:53:38'),(100,506073941883027787,6,196,'基础',0,3531,0,'2024-03-23 13:53:38'),(100,506073941883093323,7,196,'安装',0,3531,0,'2024-03-23 13:53:38'),(100,506073941883224395,9,196,'路基',0,3532,0,'2024-03-23 13:53:38'),(100,506073941883289931,10,196,'排水沟',0,3532,0,'2024-03-23 13:53:38'),(0,506073941883421003,12,196,'钻孔',1,3533,0,'2024-03-23 13:53:38'),(0,506073941883486539,13,196,'桩基',1,3533,0,'2024-03-23 13:53:38'),(0,506073941883552075,14,196,'支架',1,3533,0,'2024-03-23 13:53:38'),(0,506073941883617611,15,196,'光伏板',1,3533,0,'2024-03-23 13:53:38'),(100,506073941883683147,16,196,'直流电缆',0,3533,0,'2024-03-23 13:53:38'),(100,506073941883748683,17,196,'接地线',0,3533,0,'2024-03-23 13:53:38'),(0,506073941883814219,18,196,'逆变器安装',1,3533,0,'2024-03-23 13:53:38'),(100,506073941883879755,19,196,'电缆沟开挖',0,3533,0,'2024-03-23 13:53:38'),(100,506073941883945291,20,196,'敷设',0,3533,0,'2024-03-23 13:53:38'),(100,506073941884010827,21,196,'调试',0,3533,0,'2024-03-23 13:53:38'),(0,506073941884141899,23,196,'箱变基础',1,3534,0,'2024-03-23 13:53:38'),(0,506073941884207435,24,196,'箱变安装',1,3534,0,'2024-03-23 13:53:38'),(0,506073941884272971,25,196,'电缆沟开挖',1,3534,0,'2024-03-23 13:53:38'),(0,506073941884338507,26,196,'高压电缆敷设',1,3534,0,'2024-03-23 13:53:38'),(0,506073941884404043,27,196,'高压电缆试验',1,3534,0,'2024-03-23 13:53:38') +2024-03-23 13:53:39.180 [DEBU] {4079a400fa4ebf17c65c5f463a847280} [ 97 ms] [default] [zmkg] [rows:50 ] INSERT INTO `work_status`(`total`,`work_id`,`type`,`fangzhen_id`,`work_name`,`is_percent`,`parent`,`status`,`created_at`) VALUES(0,506073941884469579,27,196,'高压电缆调试试验',1,3534,0,'2024-03-23 13:53:38'),(0,506073941884600651,30,196,'基础',1,3535,0,'2024-03-23 13:53:38'),(0,506073941884666187,31,196,'安装',1,3535,0,'2024-03-23 13:53:38'),(0,506073941884731723,32,196,'敷设',1,3535,0,'2024-03-23 13:53:38'),(0,506073941884797259,33,196,'试验',1,3535,0,'2024-03-23 13:53:38'),(0,506073941884862795,34,196,'调试试验',1,3535,0,'2024-03-23 13:53:38'),(100,506073942704849227,2,197,'接地沟',0,3536,0,'2024-03-23 13:53:38'),(100,506073942704914763,3,197,'接地敷设',0,3536,0,'2024-03-23 13:53:38'),(100,506073942704980299,4,197,'检测',0,3536,0,'2024-03-23 13:53:38'),(100,506073942705111371,6,197,'基础',0,3537,0,'2024-03-23 13:53:38'),(100,506073942705176907,7,197,'安装',0,3537,0,'2024-03-23 13:53:38'),(100,506073942705307979,9,197,'路基',0,3538,0,'2024-03-23 13:53:38'),(100,506073942705373515,10,197,'排水沟',0,3538,0,'2024-03-23 13:53:38'),(0,506073942705504587,12,197,'钻孔',1,3539,0,'2024-03-23 13:53:38'),(0,506073942705570123,13,197,'桩基',1,3539,0,'2024-03-23 13:53:38'),(0,506073942705635659,14,197,'支架',1,3539,0,'2024-03-23 13:53:38'),(0,506073942705701195,15,197,'光伏板',1,3539,0,'2024-03-23 13:53:38'),(100,506073942705766731,16,197,'直流电缆',0,3539,0,'2024-03-23 13:53:38'),(100,506073942705832267,17,197,'接地线',0,3539,0,'2024-03-23 13:53:38'),(0,506073942705897803,18,197,'逆变器安装',1,3539,0,'2024-03-23 13:53:38'),(100,506073942705963339,19,197,'电缆沟开挖',0,3539,0,'2024-03-23 13:53:38'),(100,506073942706028875,20,197,'敷设',0,3539,0,'2024-03-23 13:53:38'),(100,506073942706094411,21,197,'调试',0,3539,0,'2024-03-23 13:53:38'),(0,506073942706225483,23,197,'箱变基础',1,3540,0,'2024-03-23 13:53:38'),(0,506073942706291019,24,197,'箱变安装',1,3540,0,'2024-03-23 13:53:38'),(0,506073942706356555,25,197,'电缆沟开挖',1,3540,0,'2024-03-23 13:53:38'),(0,506073942706422091,26,197,'高压电缆敷设',1,3540,0,'2024-03-23 13:53:38'),(0,506073942706487627,27,197,'高压电缆试验',1,3540,0,'2024-03-23 13:53:38'),(0,506073942706553163,27,197,'高压电缆调试试验',1,3540,0,'2024-03-23 13:53:38'),(0,506073942706684235,30,197,'基础',1,3541,0,'2024-03-23 13:53:38'),(0,506073942706749771,31,197,'安装',1,3541,0,'2024-03-23 13:53:38'),(0,506073942706815307,32,197,'敷设',1,3541,0,'2024-03-23 13:53:38'),(0,506073942706880843,33,197,'试验',1,3541,0,'2024-03-23 13:53:38'),(0,506073942706946379,34,197,'调试试验',1,3541,0,'2024-03-23 13:53:38'),(100,506073943493378379,2,198,'接地沟',0,3542,0,'2024-03-23 13:53:38'),(100,506073943493443915,3,198,'接地敷设',0,3542,0,'2024-03-23 13:53:38'),(100,506073943493509451,4,198,'检测',0,3542,0,'2024-03-23 13:53:38'),(100,506073943493640523,6,198,'基础',0,3543,0,'2024-03-23 13:53:38'),(100,506073943493706059,7,198,'安装',0,3543,0,'2024-03-23 13:53:38'),(100,506073943493837131,9,198,'路基',0,3544,0,'2024-03-23 13:53:38'),(100,506073943493902667,10,198,'排水沟',0,3544,0,'2024-03-23 13:53:38'),(0,506073943494033739,12,198,'钻孔',1,3545,0,'2024-03-23 13:53:38'),(0,506073943494099275,13,198,'桩基',1,3545,0,'2024-03-23 13:53:38'),(0,506073943494164811,14,198,'支架',1,3545,0,'2024-03-23 13:53:38'),(0,506073943494230347,15,198,'光伏板',1,3545,0,'2024-03-23 13:53:38'),(100,506073943494295883,16,198,'直流电缆',0,3545,0,'2024-03-23 13:53:38'),(100,506073943494361419,17,198,'接地线',0,3545,0,'2024-03-23 13:53:38'),(0,506073943494426955,18,198,'逆变器安装',1,3545,0,'2024-03-23 13:53:38'),(100,506073943494492491,19,198,'电缆沟开挖',0,3545,0,'2024-03-23 13:53:38'),(100,506073943494558027,20,198,'敷设',0,3545,0,'2024-03-23 13:53:38') +2024-03-23 13:53:39.256 [DEBU] {86ad7006fa4ebf17c75c5f46dee97fdd} [ 76 ms] [default] [zmkg] [rows:12 ] INSERT INTO `work_status`(`total`,`work_id`,`type`,`fangzhen_id`,`work_name`,`is_percent`,`parent`,`status`,`created_at`) VALUES(100,506073943494623563,21,198,'调试',0,3545,0,'2024-03-23 13:53:38'),(0,506073943494754635,23,198,'箱变基础',1,3546,0,'2024-03-23 13:53:38'),(0,506073943494820171,24,198,'箱变安装',1,3546,0,'2024-03-23 13:53:38'),(0,506073943494885707,25,198,'电缆沟开挖',1,3546,0,'2024-03-23 13:53:38'),(0,506073943494951243,26,198,'高压电缆敷设',1,3546,0,'2024-03-23 13:53:38'),(0,506073943495016779,27,198,'高压电缆试验',1,3546,0,'2024-03-23 13:53:38'),(0,506073943495082315,27,198,'高压电缆调试试验',1,3546,0,'2024-03-23 13:53:38'),(0,506073943495213387,30,198,'基础',1,3547,0,'2024-03-23 13:53:38'),(0,506073943495278923,31,198,'安装',1,3547,0,'2024-03-23 13:53:38'),(0,506073943495344459,32,198,'敷设',1,3547,0,'2024-03-23 13:53:38'),(0,506073943495409995,33,198,'试验',1,3547,0,'2024-03-23 13:53:38'),(0,506073943495475531,34,198,'调试试验',1,3547,0,'2024-03-23 13:53:38') +2024-03-23 13:53:55.236 [DEBU] {9cbe27bffd4ebf17c85c5f4651017c99} [ 72 ms] [default] [zmkg] [rows:3 ] SELECT `id`,`project_id`,`project_name`,`created_at` FROM `sub_project` WHERE `project_id`=9 +2024-03-23 13:59:10.938 [DEBU] {24e9cf3a474fbf1710b3e03f8083c51b} [166 ms] [default] [zmkg] [rows:4 ] SHOW FULL COLUMNS FROM `sub_project` +2024-03-23 13:59:11.008 [DEBU] {7eafc044474fbf1711b3e03f4db7e85b} [ 70 ms] [default] [zmkg] [rows:1 ] INSERT INTO `sub_project`(`created_at`,`project_id`,`project_name`) VALUES('2024-03-23 13:59:10',9,'测试子项目') +2024-03-23 13:59:11.042 [DEBU] {c106e948474fbf1712b3e03f13dcda8d} [ 34 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-23 13:59:11.122 [DEBU] {4f0efa4a474fbf1713b3e03f049aa0d7} [ 79 ms] [default] [zmkg] [rows:4 ] INSERT INTO `qianqi_fangzhen`(`source_path`,`update_by`,`updated_at`,`name`,`source_id`,`xiangbian_id`,`create_by`,`created_at`,`deleted_at`,`id`,`project_id`) VALUES('','','2024-03-23 13:59:11','T01','','','','2024-03-23 13:59:11',null,0,'13'),('','','2024-03-23 13:59:11','T02','','','','2024-03-23 13:59:11',null,0,'13'),('','','2024-03-23 13:59:11','T03','','','','2024-03-23 13:59:11',null,0,'13'),('','','2024-03-23 13:59:11','T04','','','','2024-03-23 13:59:11',null,0,'13') +2024-03-23 13:59:11.189 [DEBU] {c4a9b34f474fbf1714b3e03f5d489062} [ 67 ms] [default] [zmkg] [rows:0 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=9) AND `deleted_at` IS NULL +2024-03-23 14:01:16.771 [DEBU] {e1c76386644fbf176664eb0fbe6df724} [177 ms] [default] [zmkg] [rows:4 ] SHOW FULL COLUMNS FROM `sub_project` +2024-03-23 14:01:16.843 [DEBU] {88c80991644fbf176764eb0fe633f0fd} [ 71 ms] [default] [zmkg] [rows:1 ] INSERT INTO `sub_project`(`project_name`,`project_id`,`created_at`) VALUES('测试子项目',9,'2024-03-23 14:01:16') +2024-03-23 14:02:29.898 [DEBU] {c0157e8d754fbf176864eb0f82a0fe56} [171 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-23 14:02:29.970 [DEBU] {d875b897754fbf176964eb0f8b478f57} [ 71 ms] [default] [zmkg] [rows:4 ] INSERT INTO `qianqi_fangzhen`(`update_by`,`id`,`source_path`,`xiangbian_id`,`create_by`,`created_at`,`updated_at`,`deleted_at`,`project_id`,`name`,`source_id`) VALUES('',0,'','','','2024-03-23 14:02:29','2024-03-23 14:02:29',null,'14','T01',''),('',0,'','','','2024-03-23 14:02:29','2024-03-23 14:02:29',null,'14','T02',''),('',0,'','','','2024-03-23 14:02:29','2024-03-23 14:02:29',null,'14','T03',''),('',0,'','','','2024-03-23 14:02:29','2024-03-23 14:02:29',null,'14','T04','') +2024-03-23 14:03:57.264 [DEBU] {582715e2894fbf176a64eb0fbe7e3bd7} [219 ms] [default] [zmkg] [rows:0 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=9) AND `deleted_at` IS NULL +2024-03-23 14:05:05.803 [DEBU] {36b244d9994fbf1754b4dd47f377b52e} [186 ms] [default] [zmkg] [rows:4 ] SHOW FULL COLUMNS FROM `sub_project` +2024-03-23 14:05:05.894 [DEBU] {faf65ae4994fbf1755b4dd4742fec6a1} [ 91 ms] [default] [zmkg] [rows:1 ] INSERT INTO `sub_project`(`project_id`,`project_name`,`created_at`) VALUES(9,'测试子项目','2024-03-23 14:05:05') +2024-03-23 14:05:10.371 [DEBU] {092845f29a4fbf1756b4dd4711e6aada} [ 39 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-23 14:05:10.455 [DEBU] {c638a3f49a4fbf1757b4dd4768b4cfae} [ 84 ms] [default] [zmkg] [rows:4 ] INSERT INTO `qianqi_fangzhen`(`project_id`,`name`,`xiangbian_id`,`updated_at`,`deleted_at`,`created_at`,`id`,`source_id`,`source_path`,`create_by`,`update_by`) VALUES('15','T01','','2024-03-23 14:05:10',null,'2024-03-23 14:05:10',0,'','','',''),('15','T02','','2024-03-23 14:05:10',null,'2024-03-23 14:05:10',0,'','','',''),('15','T03','','2024-03-23 14:05:10',null,'2024-03-23 14:05:10',0,'','','',''),('15','T04','','2024-03-23 14:05:10',null,'2024-03-23 14:05:10',0,'','','','') +2024-03-23 14:05:12.000 [DEBU] {9658ac4e9b4fbf1758b4dd47594c0502} [118 ms] [default] [zmkg] [rows:4 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=15) AND `deleted_at` IS NULL +2024-03-23 14:05:12.051 [DEBU] {ac7f74569b4fbf1759b4dd472691cdfe} [ 38 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `work_status` +2024-03-23 14:05:12.137 [DEBU] {ba67c8589b4fbf175ab4dd47228cf5f2} [ 85 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`status`,`is_percent`,`created_at`,`work_id`,`fangzhen_id`,`type`) VALUES('防雷接地网',0,0,'2024-03-23 14:05:12',506075177776316747,207,1) +2024-03-23 14:05:12.231 [DEBU] {b0b6ea5d9b4fbf175bb4dd470ad3297a} [ 93 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`fangzhen_id`,`created_at`,`is_percent`,`work_name`,`work_id`,`status`) VALUES(5,207,'2024-03-23 14:05:12',0,'围栏',506075177776578891,0) +2024-03-23 14:05:12.312 [DEBU] {7e667a639b4fbf175cb4dd4707eee1ca} [ 81 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`is_percent`,`type`,`status`,`created_at`,`fangzhen_id`,`work_name`,`work_id`) VALUES(0,8,0,'2024-03-23 14:05:12',207,'道路',506075177776775499) +2024-03-23 14:05:12.395 [DEBU] {322354689b4fbf175db4dd476239163a} [ 83 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`created_at`,`fangzhen_id`,`type`,`work_name`,`status`,`work_id`,`is_percent`,`total`) VALUES('2024-03-23 14:05:12',207,11,'低压部分',0,506075177776972107,0,0) +2024-03-23 14:05:12.481 [DEBU] {0cf23e6d9b4fbf175eb4dd479b0f0bb5} [ 86 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`work_id`,`fangzhen_id`,`status`,`work_name`,`is_percent`,`created_at`) VALUES(22,506075177777693003,207,0,'高压部分',1,'2024-03-23 14:05:12') +2024-03-23 14:05:12.559 [DEBU] {5bb86c729b4fbf175fb4dd47d8fa4878} [ 77 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`type`,`status`,`is_percent`,`work_name`,`created_at`,`work_id`) VALUES(207,29,0,1,'环网柜','2024-03-23 14:05:12',506075177778151755) +2024-03-23 14:05:12.659 [DEBU] {7b366b789b4fbf1760b4dd4760c8d797} [ 77 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`is_percent`,`status`,`work_id`,`type`,`created_at`,`work_name`,`fangzhen_id`) VALUES(0,0,506075178732618059,1,'2024-03-23 14:05:12','防雷接地网',208) +2024-03-23 14:05:12.752 [DEBU] {8ef6077d9b4fbf1761b4dd476d0018d8} [ 92 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`created_at`,`status`,`type`,`is_percent`,`work_id`,`work_name`) VALUES(208,'2024-03-23 14:05:12',0,5,0,506075178732880203,'围栏') +2024-03-23 14:05:12.828 [DEBU] {ecf396829b4fbf1762b4dd47ca066f77} [ 75 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`created_at`,`work_name`,`status`,`work_id`,`is_percent`,`type`,`fangzhen_id`) VALUES('2024-03-23 14:05:12','道路',0,506075178733076811,0,8,208) +2024-03-23 14:05:12.910 [DEBU] {a15413879b4fbf1763b4dd47c21f5351} [ 82 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`status`,`work_id`,`is_percent`,`work_name`,`total`,`type`,`created_at`) VALUES(208,0,506075178733273419,0,'低压部分',0,11,'2024-03-23 14:05:12') +2024-03-23 14:05:12.995 [DEBU] {1e73fe8b9b4fbf1764b4dd47a343261d} [ 84 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`created_at`,`fangzhen_id`,`type`,`work_id`,`work_name`,`status`,`is_percent`) VALUES('2024-03-23 14:05:12',208,22,506075178733994315,'高压部分',0,1) +2024-03-23 14:05:13.075 [DEBU] {394e10919b4fbf1765b4dd47bd4065cd} [ 79 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`work_id`,`work_name`,`status`,`type`,`is_percent`,`created_at`) VALUES(208,506075178734453067,'环网柜',0,29,1,'2024-03-23 14:05:12') +2024-03-23 14:05:13.161 [DEBU] {595ce0959b4fbf1766b4dd4706cd05ef} [ 84 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`fangzhen_id`,`type`,`work_name`,`status`,`is_percent`,`created_at`) VALUES(506075179554701643,209,1,'防雷接地网',0,0,'2024-03-23 14:05:13') +2024-03-23 14:05:13.239 [DEBU] {9e69ed9a9b4fbf1767b4dd47dfda83e5} [ 78 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`status`,`fangzhen_id`,`work_id`,`work_name`,`is_percent`,`type`,`created_at`) VALUES(0,209,506075179554963787,'围栏',0,5,'2024-03-23 14:05:13') +2024-03-23 14:05:13.319 [DEBU] {f1439a9f9b4fbf1768b4dd47f2f278eb} [ 79 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`work_id`,`is_percent`,`fangzhen_id`,`status`,`created_at`,`work_name`) VALUES(8,506075179555160395,0,209,0,'2024-03-23 14:05:13','道路') +2024-03-23 14:05:13.401 [DEBU] {c46f5da49b4fbf1769b4dd4760c2b039} [ 81 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`total`,`is_percent`,`work_id`,`work_name`,`status`,`fangzhen_id`,`type`,`created_at`) VALUES(0,0,506075179555357003,'低压部分',0,209,11,'2024-03-23 14:05:13') +2024-03-23 14:05:13.479 [DEBU] {86f845a99b4fbf176ab4dd47bc0b961b} [ 77 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`is_percent`,`created_at`,`fangzhen_id`,`work_name`,`type`,`work_id`,`status`) VALUES(1,'2024-03-23 14:05:13',209,'高压部分',22,506075179556077899,0) +2024-03-23 14:05:13.568 [DEBU] {ada3e0ad9b4fbf176bb4dd47a260158d} [ 89 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_name`,`is_percent`,`status`,`created_at`,`work_id`,`fangzhen_id`,`type`) VALUES('环网柜',1,0,'2024-03-23 14:05:13',506075179556536651,209,29) +2024-03-23 14:05:13.675 [DEBU] {0eb2bdb39b4fbf176cb4dd47ab2cdd8d} [ 97 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`fangzhen_id`,`created_at`,`status`,`work_name`,`work_id`,`is_percent`,`type`) VALUES(210,'2024-03-23 14:05:13',0,'防雷接地网',506075180393562443,0,1) +2024-03-23 14:05:13.756 [DEBU] {522d99b99b4fbf176db4dd4710e21bd6} [ 80 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`work_id`,`type`,`is_percent`,`created_at`,`work_name`,`fangzhen_id`,`status`) VALUES(506075180393824587,5,0,'2024-03-23 14:05:13','围栏',210,0) +2024-03-23 14:05:13.834 [DEBU] {7b5467be9b4fbf176eb4dd474c16e1d2} [ 77 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`created_at`,`status`,`is_percent`,`type`,`work_id`,`fangzhen_id`,`work_name`) VALUES('2024-03-23 14:05:13',0,0,8,506075180394021195,210,'道路') +2024-03-23 14:05:13.915 [DEBU] {516507c39b4fbf176fb4dd476e3c774b} [ 81 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`work_name`,`fangzhen_id`,`created_at`,`work_id`,`total`,`is_percent`,`status`) VALUES(11,'低压部分',210,'2024-03-23 14:05:13',506075180394217803,0,0,0) +2024-03-23 14:05:13.992 [DEBU] {dbd4ddc79b4fbf1770b4dd47b64b7411} [ 77 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`is_percent`,`work_name`,`status`,`fangzhen_id`,`created_at`,`type`,`work_id`) VALUES(1,'高压部分',0,210,'2024-03-23 14:05:13',22,506075180394938699) +2024-03-23 14:05:14.080 [DEBU] {c76d73cc9b4fbf1771b4dd4732096596} [ 88 ms] [default] [zmkg] [rows:1 ] INSERT INTO `work_status`(`type`,`fangzhen_id`,`is_percent`,`work_name`,`status`,`work_id`,`created_at`) VALUES(29,210,1,'环网柜',0,506075180395397451,'2024-03-23 14:05:13') +2024-03-23 14:05:40.903 [DEBU] {89084103a24fbf1772b4dd47b3e3d7e0} [222 ms] [default] [zmkg] [rows:50 ] INSERT INTO `work_status`(`work_name`,`created_at`,`is_percent`,`status`,`fangzhen_id`,`parent`,`total`,`type`,`work_id`) VALUES('接地沟','2024-03-23 14:05:40',0,0,207,3660,100,2,506075177776382283),('接地敷设','2024-03-23 14:05:40',0,0,207,3660,100,3,506075177776447819),('检测','2024-03-23 14:05:40',0,0,207,3660,100,4,506075177776513355),('基础','2024-03-23 14:05:40',0,0,207,3661,100,6,506075177776644427),('安装','2024-03-23 14:05:40',0,0,207,3661,100,7,506075177776709963),('路基','2024-03-23 14:05:40',0,0,207,3662,100,9,506075177776841035),('排水沟','2024-03-23 14:05:40',0,0,207,3662,100,10,506075177776906571),('钻孔','2024-03-23 14:05:40',1,0,207,3663,0,12,506075177777037643),('桩基','2024-03-23 14:05:40',1,0,207,3663,0,13,506075177777103179),('支架','2024-03-23 14:05:40',1,0,207,3663,0,14,506075177777168715),('光伏板','2024-03-23 14:05:40',1,0,207,3663,0,15,506075177777234251),('直流电缆','2024-03-23 14:05:40',0,0,207,3663,100,16,506075177777299787),('接地线','2024-03-23 14:05:40',0,0,207,3663,100,17,506075177777365323),('逆变器安装','2024-03-23 14:05:40',1,0,207,3663,0,18,506075177777430859),('电缆沟开挖','2024-03-23 14:05:40',0,0,207,3663,100,19,506075177777496395),('敷设','2024-03-23 14:05:40',0,0,207,3663,100,20,506075177777561931),('调试','2024-03-23 14:05:40',0,0,207,3663,100,21,506075177777627467),('箱变基础','2024-03-23 14:05:40',1,0,207,3664,0,23,506075177777758539),('箱变安装','2024-03-23 14:05:40',1,0,207,3664,0,24,506075177777824075),('电缆沟开挖','2024-03-23 14:05:40',1,0,207,3664,0,25,506075177777889611),('高压电缆敷设','2024-03-23 14:05:40',1,0,207,3664,0,26,506075177777955147),('高压电缆试验','2024-03-23 14:05:40',1,0,207,3664,0,27,506075177778020683),('高压电缆调试试验','2024-03-23 14:05:40',1,0,207,3664,0,27,506075177778086219),('基础','2024-03-23 14:05:40',1,0,207,3665,0,30,506075177778217291),('安装','2024-03-23 14:05:40',1,0,207,3665,0,31,506075177778282827),('敷设','2024-03-23 14:05:40',1,0,207,3665,0,32,506075177778348363),('试验','2024-03-23 14:05:40',1,0,207,3665,0,33,506075177778413899),('调试试验','2024-03-23 14:05:40',1,0,207,3665,0,34,506075177778479435),('接地沟','2024-03-23 14:05:40',0,0,208,3666,100,2,506075178732683595),('接地敷设','2024-03-23 14:05:40',0,0,208,3666,100,3,506075178732749131),('检测','2024-03-23 14:05:40',0,0,208,3666,100,4,506075178732814667),('基础','2024-03-23 14:05:40',0,0,208,3667,100,6,506075178732945739),('安装','2024-03-23 14:05:40',0,0,208,3667,100,7,506075178733011275),('路基','2024-03-23 14:05:40',0,0,208,3668,100,9,506075178733142347),('排水沟','2024-03-23 14:05:40',0,0,208,3668,100,10,506075178733207883),('钻孔','2024-03-23 14:05:40',1,0,208,3669,0,12,506075178733338955),('桩基','2024-03-23 14:05:40',1,0,208,3669,0,13,506075178733404491),('支架','2024-03-23 14:05:40',1,0,208,3669,0,14,506075178733470027),('光伏板','2024-03-23 14:05:40',1,0,208,3669,0,15,506075178733535563),('直流电缆','2024-03-23 14:05:40',0,0,208,3669,100,16,506075178733601099),('接地线','2024-03-23 14:05:40',0,0,208,3669,100,17,506075178733666635),('逆变器安装','2024-03-23 14:05:40',1,0,208,3669,0,18,506075178733732171),('电缆沟开挖','2024-03-23 14:05:40',0,0,208,3669,100,19,506075178733797707),('敷设','2024-03-23 14:05:40',0,0,208,3669,100,20,506075178733863243),('调试','2024-03-23 14:05:40',0,0,208,3669,100,21,506075178733928779),('箱变基础','2024-03-23 14:05:40',1,0,208,3670,0,23,506075178734059851),('箱变安装','2024-03-23 14:05:40',1,0,208,3670,0,24,506075178734125387),('电缆沟开挖','2024-03-23 14:05:40',1,0,208,3670,0,25,506075178734190923),('高压电缆敷设','2024-03-23 14:05:40',1,0,208,3670,0,26,506075178734256459),('高压电缆试验','2024-03-23 14:05:40',1,0,208,3670,0,27,506075178734321995) +2024-03-23 14:05:41.004 [DEBU] {de978310a24fbf1773b4dd47c5495708} [100 ms] [default] [zmkg] [rows:50 ] INSERT INTO `work_status`(`work_name`,`created_at`,`is_percent`,`status`,`fangzhen_id`,`parent`,`total`,`type`,`work_id`) VALUES('高压电缆调试试验','2024-03-23 14:05:40',1,0,208,3670,0,27,506075178734387531),('基础','2024-03-23 14:05:40',1,0,208,3671,0,30,506075178734518603),('安装','2024-03-23 14:05:40',1,0,208,3671,0,31,506075178734584139),('敷设','2024-03-23 14:05:40',1,0,208,3671,0,32,506075178734649675),('试验','2024-03-23 14:05:40',1,0,208,3671,0,33,506075178734715211),('调试试验','2024-03-23 14:05:40',1,0,208,3671,0,34,506075178734780747),('接地沟','2024-03-23 14:05:40',0,0,209,3672,100,2,506075179554767179),('接地敷设','2024-03-23 14:05:40',0,0,209,3672,100,3,506075179554832715),('检测','2024-03-23 14:05:40',0,0,209,3672,100,4,506075179554898251),('基础','2024-03-23 14:05:40',0,0,209,3673,100,6,506075179555029323),('安装','2024-03-23 14:05:40',0,0,209,3673,100,7,506075179555094859),('路基','2024-03-23 14:05:40',0,0,209,3674,100,9,506075179555225931),('排水沟','2024-03-23 14:05:40',0,0,209,3674,100,10,506075179555291467),('钻孔','2024-03-23 14:05:40',1,0,209,3675,0,12,506075179555422539),('桩基','2024-03-23 14:05:40',1,0,209,3675,0,13,506075179555488075),('支架','2024-03-23 14:05:40',1,0,209,3675,0,14,506075179555553611),('光伏板','2024-03-23 14:05:40',1,0,209,3675,0,15,506075179555619147),('直流电缆','2024-03-23 14:05:40',0,0,209,3675,100,16,506075179555684683),('接地线','2024-03-23 14:05:40',0,0,209,3675,100,17,506075179555750219),('逆变器安装','2024-03-23 14:05:40',1,0,209,3675,0,18,506075179555815755),('电缆沟开挖','2024-03-23 14:05:40',0,0,209,3675,100,19,506075179555881291),('敷设','2024-03-23 14:05:40',0,0,209,3675,100,20,506075179555946827),('调试','2024-03-23 14:05:40',0,0,209,3675,100,21,506075179556012363),('箱变基础','2024-03-23 14:05:40',1,0,209,3676,0,23,506075179556143435),('箱变安装','2024-03-23 14:05:40',1,0,209,3676,0,24,506075179556208971),('电缆沟开挖','2024-03-23 14:05:40',1,0,209,3676,0,25,506075179556274507),('高压电缆敷设','2024-03-23 14:05:40',1,0,209,3676,0,26,506075179556340043),('高压电缆试验','2024-03-23 14:05:40',1,0,209,3676,0,27,506075179556405579),('高压电缆调试试验','2024-03-23 14:05:40',1,0,209,3676,0,27,506075179556471115),('基础','2024-03-23 14:05:40',1,0,209,3677,0,30,506075179556602187),('安装','2024-03-23 14:05:40',1,0,209,3677,0,31,506075179556667723),('敷设','2024-03-23 14:05:40',1,0,209,3677,0,32,506075179556733259),('试验','2024-03-23 14:05:40',1,0,209,3677,0,33,506075179556798795),('调试试验','2024-03-23 14:05:40',1,0,209,3677,0,34,506075179556864331),('接地沟','2024-03-23 14:05:40',0,0,210,3678,100,2,506075180393627979),('接地敷设','2024-03-23 14:05:40',0,0,210,3678,100,3,506075180393693515),('检测','2024-03-23 14:05:40',0,0,210,3678,100,4,506075180393759051),('基础','2024-03-23 14:05:40',0,0,210,3679,100,6,506075180393890123),('安装','2024-03-23 14:05:40',0,0,210,3679,100,7,506075180393955659),('路基','2024-03-23 14:05:40',0,0,210,3680,100,9,506075180394086731),('排水沟','2024-03-23 14:05:40',0,0,210,3680,100,10,506075180394152267),('钻孔','2024-03-23 14:05:40',1,0,210,3681,0,12,506075180394283339),('桩基','2024-03-23 14:05:40',1,0,210,3681,0,13,506075180394348875),('支架','2024-03-23 14:05:40',1,0,210,3681,0,14,506075180394414411),('光伏板','2024-03-23 14:05:40',1,0,210,3681,0,15,506075180394479947),('直流电缆','2024-03-23 14:05:40',0,0,210,3681,100,16,506075180394545483),('接地线','2024-03-23 14:05:40',0,0,210,3681,100,17,506075180394611019),('逆变器安装','2024-03-23 14:05:40',1,0,210,3681,0,18,506075180394676555),('电缆沟开挖','2024-03-23 14:05:40',0,0,210,3681,100,19,506075180394742091),('敷设','2024-03-23 14:05:40',0,0,210,3681,100,20,506075180394807627) +2024-03-23 14:05:41.075 [DEBU] {d6247816a24fbf1774b4dd47d440d228} [ 71 ms] [default] [zmkg] [rows:12 ] INSERT INTO `work_status`(`work_name`,`created_at`,`is_percent`,`status`,`fangzhen_id`,`parent`,`total`,`type`,`work_id`) VALUES('调试','2024-03-23 14:05:40',0,0,210,3681,100,21,506075180394873163),('箱变基础','2024-03-23 14:05:40',1,0,210,3682,0,23,506075180395004235),('箱变安装','2024-03-23 14:05:40',1,0,210,3682,0,24,506075180395069771),('电缆沟开挖','2024-03-23 14:05:40',1,0,210,3682,0,25,506075180395135307),('高压电缆敷设','2024-03-23 14:05:40',1,0,210,3682,0,26,506075180395200843),('高压电缆试验','2024-03-23 14:05:40',1,0,210,3682,0,27,506075180395266379),('高压电缆调试试验','2024-03-23 14:05:40',1,0,210,3682,0,27,506075180395331915),('基础','2024-03-23 14:05:40',1,0,210,3683,0,30,506075180395462987),('安装','2024-03-23 14:05:40',1,0,210,3683,0,31,506075180395528523),('敷设','2024-03-23 14:05:40',1,0,210,3683,0,32,506075180395594059),('试验','2024-03-23 14:05:40',1,0,210,3683,0,33,506075180395659595),('调试试验','2024-03-23 14:05:40',1,0,210,3683,0,34,506075180395725131) +2024-03-23 14:05:48.365 [DEBU] {400627c9a34fbf1775b4dd4793cd13eb} [ 68 ms] [default] [zmkg] [rows:1 ] SELECT `id`,`project_id`,`project_name`,`created_at` FROM `sub_project` WHERE `project_id`=9 +2024-03-23 14:06:33.057 [DEBU] {81b27a27ae4fbf1776b4dd4766bf8cf6} [228 ms] [default] [zmkg] [rows:4 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=15) AND `deleted_at` IS NULL +2024-03-23 14:06:53.615 [DEBU] {0c56c4f9b24fbf1777b4dd470d49dbcd} [ 78 ms] [default] [zmkg] [rows:28 ] UPDATE `work_status` SET `total`=total+1 WHERE (`fangzhen_id`=207) AND (`parent` IS NOT NULL) +2024-03-23 14:06:57.305 [DEBU] {431d65d5b34fbf1778b4dd475ed9938e} [ 84 ms] [default] [zmkg] [rows:28 ] UPDATE `work_status` SET `total`=total+1 WHERE (`fangzhen_id`=208) AND (`parent` IS NOT NULL) +2024-03-23 14:07:04.272 [DEBU] {d2774d6db54fbf1779b4dd4722de3289} [207 ms] [default] [zmkg] [rows:28 ] UPDATE `work_status` SET `total`=total+1 WHERE (`fangzhen_id`=209) AND (`parent` IS NOT NULL) +2024-03-23 14:09:27.751 [DEBU] {c64e41d7d64fbf17571392296f5362d6} [174 ms] [default] [zmkg] [rows:4 ] SHOW FULL COLUMNS FROM `sub_project` +2024-03-23 14:09:27.820 [DEBU] {43bcb5e1d64fbf17581392296b39a5a5} [ 68 ms] [default] [zmkg] [rows:1 ] SELECT `id`,`project_id`,`project_name`,`created_at` FROM `sub_project` WHERE `project_id`=9 +2024-03-23 14:09:27.856 [DEBU] {be17d1e5d64fbf1759139229ffcba7f8} [ 35 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-23 14:09:27.926 [DEBU] {e94afae7d64fbf175a1392297246a877} [ 69 ms] [default] [zmkg] [rows:0 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=9) AND `deleted_at` IS NULL +2024-03-23 14:10:42.764 [DEBU] {aacd094ee84fbf179f37fc190a34a79f} [180 ms] [default] [zmkg] [rows:4 ] SHOW FULL COLUMNS FROM `sub_project` +2024-03-23 14:10:42.835 [DEBU] {b534d758e84fbf17a037fc19bee91343} [ 70 ms] [default] [zmkg] [rows:1 ] SELECT `id`,`project_id`,`project_name`,`created_at` FROM `sub_project` WHERE `project_id`=9 +2024-03-23 14:10:42.872 [DEBU] {d10c005de84fbf17a137fc19a69ee43b} [ 37 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-23 14:10:42.943 [DEBU] {1e2c3f5fe84fbf17a237fc19d406a024} [ 70 ms] [default] [zmkg] [rows:4 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=15) AND `deleted_at` IS NULL +2024-03-23 14:11:36.126 [DEBU] {28acbebaf44fbf17a834653967a18cf7} [179 ms] [default] [zmkg] [rows:4 ] SHOW FULL COLUMNS FROM `sub_project` +2024-03-23 14:11:36.197 [DEBU] {e82374c5f44fbf17a93465398f1afd17} [ 70 ms] [default] [zmkg] [rows:2 ] SELECT `id`,`project_id`,`project_name`,`created_at` FROM `sub_project` WHERE `project_id`=9 +2024-03-23 14:11:36.234 [DEBU] {80afa5c9f44fbf17aa34653906863dfa} [ 37 ms] [default] [zmkg] [rows:13 ] SHOW FULL COLUMNS FROM `qianqi_fangzhen` +2024-03-23 14:11:36.305 [DEBU] {fbcbdbcbf44fbf17ab346539f7d365a8} [ 71 ms] [default] [zmkg] [rows:4 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=15) AND `deleted_at` IS NULL +2024-03-23 14:11:36.383 [DEBU] {1c4822d0f44fbf17ac346539f65724f8} [ 77 ms] [default] [zmkg] [rows:0 ] SELECT `id`,`project_id`,`name`,`source_id`,`source_path`,`xiangbian_id`,`create_by`,`update_by`,`created_at`,`updated_at`,`deleted_at` FROM `qianqi_fangzhen` WHERE (`project_id`=16) AND `deleted_at` IS NULL diff --git a/test/role_test.go b/test/role_test.go new file mode 100644 index 0000000..174e735 --- /dev/null +++ b/test/role_test.go @@ -0,0 +1,64 @@ +package test + +import ( + "context" + "encoding/json" + "testing" + + "github.com/gogf/gf/v2/container/gvar" + "github.com/samber/lo" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" +) + +const userID = 145 + +// TestGetUserRoles 获取用户角色 +func TestGetUserRoles(t *testing.T) { + var a []model.AppMenusInfoRes + // SELECT m.menu_id, m.menu_name + // FROM app_menus m + // JOIN app_role_menus rm ON m.menu_id = rm.menu_id + // JOIN app_user_roles ur ON rm.role_id = ur.role_id + // WHERE ur.user_id = 145 + + ctx := context.Background() + + dao.AppMenus.Ctx(ctx).As("m"). + InnerJoin("app_role_menus rm", "m.menu_id = rm.menu_id"). + InnerJoin("app_user_roles ur", "rm.role_id = ur.role_id"). + Where("ur.user_id = ?", userID). + Fields("m.menu_id, m.menu_name"). + Scan(&a) + + data, _ := json.Marshal(a) + println(string(data)) +} + +// 遍历所有用户,给用户添加角色 +func TestAddUserRole(t *testing.T) { + ctx := context.Background() + // 获取所有用户 + users, err := dao.SysUser.Ctx(ctx).Fields("id").Array() + if err != nil { + t.Fatal(err) + } + + userIds := lo.FilterMap(users, func(item *gvar.Var, _ int) (int, bool) { + return item.Int(), true + }) + + for _, userId := range userIds { + if userId == 144 || userId == 145 { + continue + } + + if _, err := dao.AppUserRoles.Ctx(ctx).Data(do.AppUserRoles{ + UserId: userId, + RoleId: 2, + }).Insert(); err != nil { + t.Fatal(err) + } + } +} diff --git a/test/schdule_delete_test.go b/test/schdule_delete_test.go new file mode 100644 index 0000000..00ee283 --- /dev/null +++ b/test/schdule_delete_test.go @@ -0,0 +1,72 @@ +package test + +import ( + "context" + "testing" + + "github.com/gogf/gf/v2/frame/g" + "github.com/samber/lo" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +// TestGetMatrixsByProjectId 删除一共子项目的所有方阵数据 +func TestGetMatrixsByProjectId(t *testing.T) { + subprojectID := 33 + matrixs := getMatrixsByProjectID(subprojectID) + + for _, matrix := range matrixs { + if deleteMatrixByID(matrix) != nil { + t.Error("删除方阵下的数据失败") + } + } +} + +// TestDeleteMatrixsByProjectId 删除一个子项目的所有方阵 +func TestDeleteMatrixsByProjectId(t *testing.T) { + subprojectID := 33 + if deleteMatrixsByProjectID(subprojectID) != nil { + t.Error("删除子项目的所有方阵失败") + } +} + +// 删除一个子项目的所有方阵 +func deleteMatrixsByProjectID(subprojectID int) error { + matrixs := getMatrixsByProjectID(subprojectID) + + if _, err := dao.QianqiFangzhen.Ctx(context.Background()). + WhereIn(dao.QianqiFangzhen.Columns().Id, matrixs).Unscoped().Delete(); err != nil { + return err + } + return nil +} + +// 根据方阵ID在数据库中删除数据 +func deleteMatrixByID(fangzhenId int) error { + ctx := context.Background() + + return g.Try(ctx, func(ctx context.Context) { + // 删除任务 + if _, err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, fangzhenId).Delete(); err != nil { + panic(err) + } + + // 删除计划 + if _, err := dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().FangzhenId, fangzhenId).Delete(); err != nil { + panic(err) + } + }) +} + +// 获取一个子项目的所有方阵ID +func getMatrixsByProjectID(subprojectID int) []int { + ctx := context.Background() + var matrixs []entity.QianqiFangzhen + if err := dao.QianqiFangzhen.Ctx(ctx).Where(dao.QianqiFangzhen.Columns().ProjectId, subprojectID).Scan(&matrixs); err != nil { + panic(err) + } + + return lo.Map(matrixs, func(matrix entity.QianqiFangzhen, _ int) int { + return matrix.Id + }) +} diff --git a/test/schdule_test.go b/test/schdule_test.go new file mode 100644 index 0000000..f36deb3 --- /dev/null +++ b/test/schdule_test.go @@ -0,0 +1,851 @@ +package test + +import ( + "context" + "encoding/json" + "fmt" + "strconv" + "testing" + "time" + "unsafe" + + "github.com/gogf/gf/v2/frame/g" + "github.com/samber/lo" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + + lop "github.com/samber/lo/parallel" +) + +func Test_A(t *testing.T) { + service.WorkSchedule().List(context.Background(), &system.WorkScheduleSearchReq{ + WorkId: "505482040829870446", + }) +} + +// 测试计划表进度 +func Test_Progress(t *testing.T) { + // resp, err := service.WorkStatus().Progress(context.Background(), &system.WorkStatusGetProgressReq{ + // FangzhenId: "2", + // }) + // if err != nil { + // t.Fatal(err) + // } + + // body, _ := json.Marshal(resp) + // t.Log(string(body)) +} + +// 获取指定方针下所有的数据,拼接父级和子集 +func Test_GetAll(t *testing.T) { + fangzhenID := 2 + parentID := 78 + + detailData := []entity.WorkStatus{} + // 查询父级下的所有子集的排期 + err := dao.WorkStatus.Ctx(context.Background()). + Where(dao.WorkStatus.Columns().FangzhenId, fangzhenID). + Where(dao.WorkStatus.Columns().Parent, parentID).Scan(&detailData) + if err != nil { + t.Fatal(err) + } + + fmt.Println(detailData) +} + +// 获取所有数据 +func Test_GetAllData(t *testing.T) { + fangzhenID := 2 + + workStatusList := []entity.WorkStatus{} + // 查询父级下的所有子集的排期 + if err := dao.WorkStatus.Ctx(context.Background()).Where(dao.WorkStatus.Columns().FangzhenId, fangzhenID).Scan(&workStatusList); err != nil { + t.Fatal(err) + } + + // 父列表 + parentList := []entity.WorkStatus{} + // 子列表,使用 map 存储,键为父元素的 ID + childrenMap := make(map[int][]entity.WorkStatus) + + // 遍历所有数据,将父级和子集分开 + for _, item := range workStatusList { + if item.Parent == 0 { + parentList = append(parentList, item) + } else { + childrenMap[item.Parent] = append(childrenMap[item.Parent], item) + } + } + + projectList := []*model.WorkStatusProgressRes{} + + index := 1 + // 遍历父级,将子集添加到父级的字段中 + for _, parent := range parentList { + projectItem := model.WorkStatusProgressRes{ + ID: index, + WorkID: parent.WorkId, + Startat: parent.StartAt.String(), + Endat: parent.EndAt.String(), + Name: parent.WorkName, + Total: parent.Total, + Finished: parent.Finished, + Status: parent.Status, + Children: make([]model.WorkStatusProgressRes, 0, len(workStatusList)), + } + index++ + + // 从 map 中获取子元素,将子元素添加到父元素的字段中 + for _, child := range childrenMap[int(parent.Id)] { + projectItem.Children = append(projectItem.Children, model.WorkStatusProgressRes{ + ID: index, + WorkID: child.WorkId, + Startat: child.StartAt.String(), + Endat: child.EndAt.String(), + Name: child.WorkName, + Total: child.Total, + Finished: child.Finished, + Status: child.Status, + }) + index++ + } + projectList = append(projectList, &projectItem) + } +} + +type Scheduler struct { + // 总进度 + FinishedPtr int + // 总量 + Total int + // 实体 + WorkStatus *entity.WorkSchedule +} + +type Schdule map[string]Scheduler + +// 获取指定 WorkID 的计划和总量 +func (s Schdule) Get(workID string) (int, int) { + if scheduler, ok := s[workID]; ok { + return scheduler.FinishedPtr, scheduler.Total + } + return 0, 0 +} + +// 测试构建计划数据 +func Test_Schduler(t *testing.T) { + ScheduleData := []entity.WorkSchedule{} + if err := dao.WorkSchedule.Ctx(context.Background()).Scan(&ScheduleData); err != nil { + t.Fatal(err) + } + + // 遍历 ScheduleData,将数据按照 WorkID 分组 + scheduleMap := make(Schdule) + for _, item := range ScheduleData { + // 预计进度 + planNum := item.PlanNum + // 实际进度 + // finishedNum := item.FinishedNum + + // 如果不存在的话,创建一个新的 Scheduler + if _, ok := scheduleMap[item.WorkId]; !ok { + scheduleMap[item.WorkId] = Scheduler{ + WorkStatus: &item, + Total: planNum, + // FinishedPtr: finishedNum, + } + continue + } + + // 如果存在的话,将计划进度和实际进度相加 + scheduler := scheduleMap[item.WorkId] + scheduler.Total += planNum + // scheduler.FinishedPtr += finishedNum + } +} + +// 指针情况下忽略进度字段 +func Test_ProgressJson(t *testing.T) { + fangzhenID := 2 + + ScheduleData := []entity.WorkSchedule{} + if err := dao.WorkSchedule.Ctx(context.Background()).Scan(&ScheduleData); err != nil { + return + } + + // 遍历 ScheduleData,将数据按照 WorkID 分组 + scheduleMap := make(Schdule) + for _, item := range ScheduleData { + // 预计进度 + planNum := item.PlanNum + // 实际进度 + // finishedNum := item.FinishedNum + + // 如果不存在的话,创建一个新的 Scheduler + if _, ok := scheduleMap[item.WorkId]; !ok { + scheduleMap[item.WorkId] = Scheduler{ + WorkStatus: &item, + Total: planNum, + // FinishedPtr: finishedNum, + } + continue + } + + // 如果存在的话,将计划进度和实际进度相加 + scheduler := scheduleMap[item.WorkId] + scheduler.Total += planNum + // scheduler.FinishedPtr += finishedNum + scheduleMap[item.WorkId] = scheduler + } + + workStatusList := []entity.WorkStatus{} + // 查询父级下的所有子集的排期 + if err := dao.WorkStatus.Ctx(context.Background()).Where(dao.WorkStatus.Columns().FangzhenId, fangzhenID).Scan(&workStatusList); err != nil { + return + } + + // 父列表 + parentList := []entity.WorkStatus{} + // 子列表,使用 map 存储,键为父元素的 ID + childrenMap := make(map[int][]entity.WorkStatus) + + // 遍历所有数据,将父级和子集分开 + for _, item := range workStatusList { + if item.Parent == 0 { + parentList = append(parentList, item) + } else { + childrenMap[item.Parent] = append(childrenMap[item.Parent], item) + } + } + + projectList := []*model.WorkStatusProgressRes{} + + index := 1 + // 遍历父级,将子集添加到父级的字段中 + for _, parent := range parentList { + projectItem := model.WorkStatusProgressRes{ + ID: index, + WorkID: parent.WorkId, + Startat: parent.StartAt.String(), + Endat: parent.EndAt.String(), + Name: parent.WorkName, + Total: parent.Total, + Finished: parent.Finished, + Status: parent.Status, + Children: make([]model.WorkStatusProgressRes, 0, len(workStatusList)), + } + index++ + + // 从 map 中获取子元素,将子元素添加到父元素的字段中 + for _, child := range childrenMap[int(parent.Id)] { + // 根据 WorkID 获取计划和总量 + finishedPtr, total := scheduleMap.Get(child.WorkId) + + // 创建计划进度对象 + var planProgress *model.PlanProgress + // 如果 finishedPtr 和 total 不为 0 ,那么创建计划进度对象 + if finishedPtr != 0 || total != 0 { + planProgress = &model.PlanProgress{ + Finished: &finishedPtr, + Total: &total, + } + } + + projectItem.Children = append(projectItem.Children, model.WorkStatusProgressRes{ + ID: index, + WorkID: child.WorkId, + Startat: child.StartAt.String(), + Endat: child.EndAt.String(), + Name: child.WorkName, + Total: child.Total, + Finished: child.Finished, + Status: child.Status, + PlanProgress: planProgress, + }) + index++ + } + projectList = append(projectList, &projectItem) + } + + body, _ := json.Marshal(projectList) + println(string(body)) +} + +// 新增 +func Test_Add(t *testing.T) { + workID := "505482040829935982" + ID := 14 + SubmitTime := "2024-03-22" + FinishedNum := 2 + + ctx := context.Background() + + // 获取指定 WorkID 的计划和总量 + workSchedule := entity.WorkSchedule{} + if err := dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().WorkId, workID). + Where(dao.WorkSchedule.Columns().Id, ID).Scan(&workSchedule); err != nil { + return + } + + // 反序列化 workSchedule.Detail + var scheduleDetails []model.WorkScheduleDetail + if err := json.Unmarshal([]byte(workSchedule.Detail), &scheduleDetails); err != nil { + return + } + + // 遍历 scheduleDetails 匹配 req.submitDate 的时间 + totalFinishedNum := 0 + for i, scheduleDetail := range scheduleDetails { + if scheduleDetail.Date == SubmitTime { + // 修改其 FinishedNum + scheduleDetails[i].FinishedNum = FinishedNum + } + totalFinishedNum += scheduleDetails[i].FinishedNum + } + + // 序列化 scheduleDetails + schedulesJSON, _ := json.Marshal(scheduleDetails) + schedulesJSONStr := *(*string)(unsafe.Pointer(&schedulesJSON)) + + // 修改计划表中的数据 + _, err := dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().WorkId, workID). + Where(dao.WorkSchedule.Columns().Id, ID). + Data(g.Map{ + dao.WorkSchedule.Columns().FinishedNum: totalFinishedNum, + dao.WorkSchedule.Columns().Detail: schedulesJSONStr, + }). + Update() + if err != nil { + return + } + + // 重新统计 work_schduler 的状态后更新 work_status 表 + // 获取指定 WorkID 的计划和总量 + finishedNum, err := dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().WorkId, workID). + Sum(dao.WorkSchedule.Columns().FinishedNum) + if err != nil { + return + } + + // 更新 work_status 表 + _, err = dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().WorkId, workID). + Data(g.Map{ + dao.WorkStatus.Columns().Finished: int(finishedNum), + }).Update() + if err != nil { + return + } +} + +// 测试更新 workschedule 表 +func Test_Update(t *testing.T) { + ctx := context.Background() + workID := "505482040830329198" + + var finishedNum float64 = 0 + + if _, err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().WorkId, workID). + Data(dao.WorkStatus.Columns().Finished, finishedNum).Update(); err != nil { + println(err) + } +} + +type scheduler struct { + // 总进度 + FinishedPtr int + // 总量 + Total int + // 实体 + WorkStatus *entity.WorkSchedule +} + +// 传入 WorkID 获取计划状态 +func (s Schdule) GetStatus(workID string) (int, bool) { + if scheduler, ok := s[workID]; ok { + return scheduler.WorkStatus.Status, true + } + return 0, false +} + +// 传入方阵ID 构造出 model.ProjectHierarchy 结构 +// func getTree(id string) []model.ProjectHierarchy { +// ctx := context.Background() + +// ScheduleData := []entity.WorkSchedule{} +// if err := dao.WorkSchedule.Ctx(ctx).Scan(&ScheduleData); err != nil { +// return nil +// } + +// // 遍历 ScheduleData,将数据按照 WorkID 分组 +// scheduleMap := make(Schdule) +// for _, item := range ScheduleData { +// // 预计进度 +// planNum := item.PlanNum +// // 实际进度 +// finishedNum := item.FinishedNum + +// // 如果不存在的话,创建一个新的 Scheduler +// if _, ok := scheduleMap[item.WorkId]; !ok { +// scheduleMap[item.WorkId] = Scheduler{ +// WorkStatus: &item, +// Total: planNum, +// FinishedPtr: finishedNum, +// } +// continue +// } + +// // 如果存在的话,则将多个计划数据叠加 +// scheduler := scheduleMap[item.WorkId] +// scheduler.Total += planNum +// scheduler.FinishedPtr += finishedNum +// scheduleMap[item.WorkId] = scheduler +// } + +// // 获取指定方阵ID的所有项目 +// workStatusList := []entity.WorkStatus{} +// if err := dao.WorkStatus.Ctx(context.Background()).Where(dao.WorkStatus.Columns().FangzhenId, id).Scan(&workStatusList); err != nil { +// return nil +// } + +// // 父列表 +// parentList := []entity.WorkStatus{} +// // 子列表,使用 map 存储,键为父元素的 ID +// childrenMap := make(map[int][]entity.WorkStatus) + +// // 遍历所有数据,将父级和子集分开 +// for _, item := range workStatusList { +// if item.Parent == 0 { +// parentList = append(parentList, item) +// } else { +// childrenMap[item.Parent] = append(childrenMap[item.Parent], item) +// } +// } + +// // 树形结构 +// projectList := []model.ProjectHierarchy{} + +// for _, parent := range parentList { +// projectItem := model.ProjectHierarchy{ +// Name: parent.WorkName, +// SubProjects: make([]model.SubProject, 0, len(workStatusList)), +// } + +// temp := []model.SubProject{} + +// for _, child := range childrenMap[int(parent.Id)] { +// // 根据 WorkID 获取计划和总量 +// finishedPtr, total := scheduleMap.Get(child.WorkId) + +// temp = append(temp, model.SubProject{ +// Name: child.WorkName, + +// }) +// } +// projectList = append(projectList, projectItem) +// } + +// return projectList +// } + +// func Test_GetTree(t *testing.T) { +// // 获取指定方阵ID的所有项目 +// result := getTree("489") +// body, _ := json.Marshal(result) +// println(string(body)) +// } + +// 传入子项目ID 删除及其关联数据 +func Test_Delete(t *testing.T) { + ctx := context.Background() + + subProjectName := "多傍屯15MW" + // subProjectName := "上令中令屯20MW" + + // 获取子项目的主键ID + subProject := entity.SubProject{} + if err := dao.SubProject.Ctx(ctx).Where(dao.SubProject.Columns().ProjectName, subProjectName).Scan(&subProject); err != nil { + return + } + + // 获取子项目下的所有方阵 + fangzhens := []entity.QianqiFangzhen{} + if err := dao.QianqiFangzhen.Ctx(ctx).Where(dao.QianqiFangzhen.Columns().ProjectId, subProject.Id).Scan(&fangzhens); err != nil { + return + } + + // 获取所有方阵的ID + fangzhenIds := lo.Map[entity.QianqiFangzhen, int](fangzhens, func(x entity.QianqiFangzhen, _ int) int { + return x.Id + }) + + // 删除所有方阵 + dao.QianqiFangzhen.Ctx(ctx).WhereIn(dao.QianqiFangzhen.Columns().Id, fangzhenIds).Delete() + + // 删除在 work_status 表中的数据 + dao.WorkStatus.Ctx(ctx).WhereIn(dao.WorkStatus.Columns().WorkId, fangzhenIds).Delete() + + // 删除子项目下的 pv + dao.PvModule.Ctx(ctx).WhereIn(dao.PvModule.Columns().FangzhenId, fangzhenIds).Delete() + + // 删除箱变 + dao.QianqiXiangbian.Ctx(ctx).WhereIn(dao.QianqiXiangbian.Columns().ProjectId, fangzhenIds).Delete() +} + +// 前端 type 键值 +func Test_Type(t *testing.T) { + ctx := context.Background() + + fangzhenid := 625 + SubProjectId := 26 + + workStatusList := []entity.WorkStatus{} + if err := dao.PvModule.Ctx(ctx).Where(dao.PvModule.Columns().FangzhenId, fangzhenid). + Where(dao.PvModule.Columns().SubProjectid, SubProjectId). + Fields(dao.PvModule.Columns().Type).Distinct().Scan(&workStatusList); err != nil { + t.Fatal(err) + } + + // 当前方阵所导入的 Type 列表 + typeList := lop.Map[entity.WorkStatus](workStatusList, func(item entity.WorkStatus, index int) int { + return item.Type + }) + + // 遍历 typeList + // SELECT work_id, + // GROUP_CONCAT(name) AS names, + // GROUP_CONCAT(detail) AS details, + // type + // FROM pv_module + // WHERE fangzhen_id = 625 AND sub_projectid = 26 AND type = 2 + // GROUP BY work_id; + + for i := 0; i <= len(typeList); i++ { + a := entity.WorkStatus{} + if err := dao.PvModule.Ctx(ctx).Where(dao.PvModule.Columns().FangzhenId, fangzhenid). + Where(dao.PvModule.Columns().SubProjectid, SubProjectId). + Where(dao.PvModule.Columns().Type, typeList[i]). + Fields(dao.PvModule.Columns().WorkId, dao.PvModule.Columns().Name, dao.PvModule.Columns().Detail). + Group(dao.PvModule.Columns().WorkId). + Scan(&a); err != nil { + t.Fatal(err) + } + + fmt.Printf("a: %v\n", a) + } +} + +// 测试泛型分组 +// func Test_Group(t *testing.T) { +// group := lo.GroupBy[pv]([]int{1, 2, 3, 4, 5, 6, 7, 8}, func(i int) int { +// return i % 3 +// }) +// fmt.Println(group) +// } + +// 根据 WorkID 反向找到其对应的大项目,子项目,方阵 +func Test_GetProject(t *testing.T) { + // select sp.id as sub_projectid,sp.project_id as projectid,fz.name + // + // from work_status as wsa + // Inner join qianqi_fangzhen as fz on wsa.fangzhen_id = fz.id + // Inner join sub_project as sp on fz.project_id = sp.id + // where wsa.work_id = "507070097236492777" + + // 获取所有的计划 + d := []entity.WorkStatus{} + if err := dao.WorkSchedule.Ctx(context.Background()).Scan(&d); err != nil { + t.Fatal(err) + } + + // 遍历所有的计划 + for i := 0; i < len(d); i++ { + workschdule := d[i] + + // 获取该计划对应的大项目,子项目,方阵 + projectID, subProjectID, _, err := getWorkDetail(workschdule.WorkId) + if err != nil { + t.Fatal(err) + } + + // 为其插入对应的大项目,子项目,方阵 + _, err = dao.WorkStatus.Ctx(context.Background()).Where(dao.WorkSchedule.Columns().WorkId, workschdule.WorkId). + Data(g.Map{ + dao.WorkStatus.Columns().ProjectId: projectID, + dao.WorkStatus.Columns().SubProjectid: subProjectID, + // dao.WorkStatus.Columns().FangzhenId: fangzhenid, + }).Update() + if err != nil { + t.Fatal(err) + } + } + + // 507070881722466793 + // a, b, c, err := getWorkDetail("507070881722466793") + // if err != nil { + // t.Fatal(err) + // } + + // fmt.Printf("a: %v, b: %v, c: %v\n", a, b, c) +} + +func getWorkDetail(workID string) (int, int, int, error) { + // select sp.id as sub_projectid,sp.project_id as projectid,fz.name + // + // from work_status as wsa + // Inner join qianqi_fangzhen as fz on wsa.fangzhen_id = fz.id + // Inner join sub_project as sp on fz.project_id = sp.id + // where wsa.work_id = "507070097236492777" + type WorkDetail struct { + SubProjectID int `json:"sub_project_id"` + ProjectID int `json:"project_id"` + FangzhenID int `json:"id"` + } + + workDetail := WorkDetail{} + + err := dao.WorkStatus.Ctx(context.Background()).As("workStatusAlias").Where("workStatusAlias.work_id", workID). + InnerJoin("qianqi_fangzhen as fangzhenAlias", "workStatusAlias.fangzhen_id = fangzhenAlias.id"). + InnerJoin("sub_project as subProjectAlias", "fangzhenAlias.project_id = subProjectAlias.id"). + Fields("subProjectAlias.id as sub_project_id", "subProjectAlias.project_id as project_id", "fangzhenAlias.id").Scan(&workDetail) + + return workDetail.ProjectID, workDetail.SubProjectID, workDetail.FangzhenID, err +} + +func getByFangzhenID(fangzhenid string) (int, int, error) { + type Project struct { + ProjectID int `json:"project_id" orm:"project_id"` + SubID int `json:"sub_id" orm:"sub_id"` + } + + project := Project{} + + err := dao.QianqiFangzhen.Ctx(context.Background()).As("fangzhenAlias").Where("fangzhenAlias.id", 1959). + InnerJoin("sub_project as subProjectAlias", "fangzhenAlias.project_id = subProjectAlias.id"). + InnerJoin("sys_project as projectAlias", "projectAlias.id = subProjectAlias.project_id"). + Fields("projectAlias.id as project_id", "subProjectAlias.id as sub_id").Scan(&project) + if err != nil { + return 0, 0, err + } + + return project.ProjectID, project.SubID, nil +} + +// 根据fangzhen_ID 找到对应的主项目和子项目 +func Test_GetProjectByFangzhenID(t *testing.T) { + // projectID, subID, err := getByFangzhenID("1959") + // if err != nil { + // t.Fatal(err) + // } + + // fmt.Printf("projectID: %v, subID: %v\n", projectID, subID) + + // 获取所有的 work_status + d := []entity.WorkStatus{} + if err := dao.WorkStatus.Ctx(context.Background()).Scan(&d); err != nil { + t.Fatal(err) + } + + // 遍历所有的 work_status + for i := 0; i <= len(d); i++ { + workStatus := d[i] + + // 获取该 work_status 对应的主项目和子项目 + projectID, subID, err := getByFangzhenID(workStatus.FangzhenId) + if err != nil { + t.Fatal(err) + } + + // 为其插入对应的主项目和子项目 + _, err = dao.WorkStatus.Ctx(context.Background()).Where(dao.WorkStatus.Columns().FangzhenId, workStatus.FangzhenId). + Data(g.Map{ + dao.WorkStatus.Columns().ProjectId: projectID, + dao.WorkStatus.Columns().SubProjectid: subID, + }).Update() + if err != nil { + t.Fatal(err) + } + } +} + +// 获取一个方阵的的所有夫级进度 +func Test_GetParent(t *testing.T) { + // 根据子项目获取所有的方阵 + subProjectID := 26 + + fangzhenList := []entity.QianqiFangzhen{} + if err := dao.QianqiFangzhen.Ctx(context.Background()). + Where(dao.QianqiFangzhen.Columns().ProjectId, subProjectID).Scan(&fangzhenList); err != nil { + t.Fatal(err) + } + + cumulativeProjects := []*model.WorkStatusProgressRes{} + firstTime := true + + // 遍历项目列表 + for index := 0; index < len(fangzhenList); index++ { + // 获取当前项目 + project := fangzhenList[index] + + // 获取当前项目的子项目 + childProjects, err := GetPrarent(strconv.Itoa(project.Id)) + if err != nil { + t.Fatal(err) + } + + // 如果是第一次迭代,将子项目列表赋值给累积项目列表 + if firstTime { + cumulativeProjects = childProjects + // 更新标志变量,表示已经不是第一次迭代 + firstTime = false + continue + } + + // 遍历子项目列表后叠加到累积项目列表 + for childIndex := 0; childIndex < len(childProjects); childIndex++ { + // 获取根据索引获取当前的 cumulativeProjects + singleChild := childProjects[childIndex] + comulativeChild := cumulativeProjects[childIndex] + + // 将 singleChild 的 Total 和 Finished 叠加到 comulativeChild + comulativeChild.Total += singleChild.Total + comulativeChild.Finished += singleChild.Finished + } + } + + // 序列化 cumulativeProjects + body, _ := json.Marshal(cumulativeProjects) + println(string(body)) +} + +// 获取一个方阵的所有子级进度 +func GetPrarent(fangzhenID string) ([]*model.WorkStatusProgressRes, error) { + ctx := context.Background() + + ScheduleData := []entity.WorkSchedule{} + if err := dao.WorkSchedule.Ctx(ctx).Scan(&ScheduleData); err != nil { + return nil, nil + } + + // 遍历 ScheduleData,将数据按照 WorkID 分组 + scheduleMap := make(Schdule) + for _, item := range ScheduleData { + // 预计进度 + planNum := item.PlanNum + // 实际进度 + finishedNum := item.FinishedNum + + // 如果不存在的话,创建一个新的 Scheduler + if _, ok := scheduleMap[item.WorkId]; !ok { + scheduleMap[item.WorkId] = Scheduler{ + WorkStatus: &item, + Total: planNum, + FinishedPtr: finishedNum, + } + continue + } + + // 如果存在的话,则将多个计划数据叠加 + scheduler := scheduleMap[item.WorkId] + scheduler.Total += planNum + scheduler.FinishedPtr += finishedNum + scheduleMap[item.WorkId] = scheduler + } + + // 获取指定方阵ID的所有项目 + workStatusList := []entity.WorkStatus{} + if err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, fangzhenID).Scan(&workStatusList); err != nil { + return nil, err + } + + // 父列表 + parentList := []entity.WorkStatus{} + // 子列表,使用 map 存储,键为父元素的 ID + childrenMap := make(map[int][]entity.WorkStatus) + + // 遍历所有数据,将父级和子集分开 + for _, item := range workStatusList { + if item.Parent == 0 { + parentList = append(parentList, item) + } else { + childrenMap[item.Parent] = append(childrenMap[item.Parent], item) + } + } + + index := 1 + + projectList := make([]*model.WorkStatusProgressRes, 0, len(parentList)) + // 遍历父级,将子集添加到父级的字段中 + for _, parent := range parentList { + projectItem := model.WorkStatusProgressRes{ + ID: index, + WorkID: parent.WorkId, + Startat: parent.StartAt.String(), + Endat: parent.EndAt.String(), + Name: parent.WorkName, + Total: parent.Total, + Finished: parent.Finished, + Status: parent.Status, + WorkType: parent.Type, + Children: make([]model.WorkStatusProgressRes, 0, len(workStatusList)), + } + index++ + + // 从 map 中获取子元素,将子元素添加到父元素的字段中 + for _, child := range childrenMap[int(parent.Id)] { + + projectItem.Total += child.Total + projectItem.Finished += child.Finished + } + + // 如果计划数量等于实际数量,且原状态非3,则更新状态为2 + if projectItem.Total == projectItem.Finished { + // 并且 total,finished 不为 0 + projectItem.Status = 2 + } else { + projectItem.Status = 1 + } + + projectList = append(projectList, &projectItem) + } + + return projectList, nil +} + +// 测试子项目是否已完成 +func Test_SubProject(t *testing.T) { + ctx := context.Background() + + // 获取所有的子项目 + var projectList []entity.SubProject + if err := dao.SubProject.Ctx(ctx).Scan(&projectList); err != nil { + return + } + + // 遍历每个项目 + for _, project := range projectList { + result, err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().SubProjectid, project.Id).Fields("sum(total) as total ,sum(finished) as finished").All() + if err != nil { + continue + } + + total := result[0]["total"].Int() + finished := result[0]["finished"].Int() + + if total == 0 || finished == 0 { + continue + } + + // 如果总量和完成量相等,则将其子项目添加完成日期 + if total == finished { + // 更新项目状态 + dao.SubProject.Ctx(ctx).Where(dao.SubProject.Columns().Id, project.Id). + WhereNull(dao.SubProject.Columns().DoneTime). + Update(g.Map{ + dao.SubProject.Columns().DoneTime: time.Now().Format("2006-01-02"), + }) + } + } +} diff --git a/test/todo_group_test.go b/test/todo_group_test.go new file mode 100644 index 0000000..345b2ee --- /dev/null +++ b/test/todo_group_test.go @@ -0,0 +1,30 @@ +package test + +import ( + "testing" + + "github.com/tiger1103/gfast/v3/third/todo" +) + +// CreateCardReminderTasks 测试 +func Test_CreateCardReminderTasks(t *testing.T) { + todoList := []todo.TaskGroup{ + { + Role: 0, + TsakType: 0, + ProjectID: 1, + UserID: "1", + MissingCardTime: "2021-03-14 08:30 上班卡;18:00 下班卡", + }, + { + Role: 1, + TsakType: 0, + ProjectID: 2, + UserID: "1", + MissingCardTime: "2021-03-14 08:30 上班卡;18:00 下班卡", + }, + } + if err := todo.CreateCardReminderTasks(todoList); err != nil { + t.Error(err) + } +} diff --git a/test/update_test.go b/test/update_test.go new file mode 100644 index 0000000..7df5f94 --- /dev/null +++ b/test/update_test.go @@ -0,0 +1,72 @@ +package test + +import ( + "context" + "testing" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/third/solaranalyzer" +) + +// 测试更新 +func TestUpdate(t *testing.T) { + ctx := context.Background() + + // 根据任务ID查询出所有的 PV Module ID + var pvlist []struct { + PvID int `orm:"pv_id"` + FangZhenID int `orm:"fangzhen_id"` + WorkID string `orm:"work_id"` + TypeID int `orm:"type_id"` + } + + // 查询出基本信息 + err := dao.PvModule.Ctx(ctx).As("pv").Fields("pv.id as pv_id", "pv.fangzhen_id", "pv.work_id", "pv.type"). + LeftJoin("manage_task_result as mts", "pv.id = mts.pv_id"). + Where("mts.task_id = ?", 518).Scan(&pvlist) + if err != nil { + t.Fatal(err) + } + + for _, v := range pvlist { + if v.TypeID == 15 { // 光伏板 + if err := solaranalyzer.ProcessMatchedRectangles([]int{v.PvID}); err != nil { + t.Fatal(err) + } + return + } + + // 更新 PV Module 表 + lastID, err := dao.PvModule.Ctx(ctx).Where(dao.PvModule.Columns().Id, v.PvID). + Where(dao.PvModule.Columns().FangzhenId, v.FangZhenID). + Where(dao.PvModule.Columns().Type, v.TypeID). + Data(g.Map{ + dao.PvModule.Columns().Status: 2, + }).Update() + if err != nil { + t.Fatal(err) + } + + rows, err := lastID.RowsAffected() + if err != nil { + t.Fatal(err) + } + + if rows > 0 { + // 更新 work_status 表 + _, err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, v.FangZhenID). + Where(dao.WorkStatus.Columns().Type, v.TypeID). + Data(g.Map{ + dao.WorkStatus.Columns().Finished: gdb.Raw( + "finished + 1", + ), + }).Update() + if err != nil { + t.Fatal(err) + } + + } + } +} diff --git a/test/user_project_tans_test.go b/test/user_project_tans_test.go new file mode 100644 index 0000000..cf3afd2 --- /dev/null +++ b/test/user_project_tans_test.go @@ -0,0 +1,99 @@ +package test + +import ( + "context" + "testing" + + "github.com/samber/lo" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + + wxDao "github.com/tiger1103/gfast/v3/internal/app/wxApplet/dao" + wxApplet "github.com/tiger1103/gfast/v3/internal/app/wxApplet/model/do" +) + +// 获取所有的 sys_user 的用户,如果该用户在 bus_construction_user 中的手机号相同 +// 则将该用户的在 bus_construction_user 中的项目绑定到 App 中 +func TestUserProjectTans(t *testing.T) { + // 获取所有的 sys_user 的用户 + sysUsers := GetSysUsers() + + // 提取出所有用户的手机号 + userMobiles := lo.FilterMap(sysUsers, func(user entity.SysUser, _ int) (string, bool) { + if user.Mobile == "" { + return "", false + } + return user.Mobile, true + }) + + // 获取所有的 bus_construction_user 的用户 + busUsers := GetBusUsers(userMobiles) + + // 1. 获取所有的 sys_user 的用户 + // 2. 获取所有的 bus_construction_user 的用户 + // 3. 如果该用户在 bus_construction_user 中的手机号相同 + // 4. 则将该用户的在 bus_construction_user 中的项目绑定到PC中 + + // 批量插入列表 + var insertList []wxApplet.SysUserProjectRelevancy + + for _, sysUser := range sysUsers { + if busUser, ok := busUsers[sysUser.Mobile]; ok { + // 如果该数据在 sys_user_project_relevancy 中不存在,则插入 + + exist, err := wxDao.SysUserProjectRelevancy.Ctx(context.Background()). + Where(wxDao.SysUserProjectRelevancy.Columns().UserId, sysUser.Id). + Where(wxDao.SysUserProjectRelevancy.Columns().ProjectId, busUser.ProjectId). + Where("source", 0). + Count() + if err != nil { + panic(err) + } + + if exist == 0 { + insertList = append(insertList, wxApplet.SysUserProjectRelevancy{ + UserId: sysUser.Id, + ProjectId: busUser.ProjectId, + Source: 0, + }) + } + } + } + + if len(insertList) > 0 { + if _, err := wxDao.SysUserProjectRelevancy.Ctx(context.Background()).Insert(insertList); err != nil { + panic(err) + } + } +} + +// 获取所有的 sys_user 的用户 +func GetSysUsers() []entity.SysUser { + List := []entity.SysUser{} + + ctx := context.Background() + // 获取所有的 sys_user 的用户 + if err := dao.SysUser.Ctx(ctx).Scan(&List); err != nil { + panic(err) + } + + return List +} + +// 获取所有的 bus_construction_user 的用户 +func GetBusUsers(mobiles []string) map[string]entity.BusConstructionUser { + ctx := context.Background() + + List := []entity.BusConstructionUser{} + // 获取所有的 bus_construction_user 的用户 + if err := dao.BusConstructionUser.Ctx(ctx). + WhereIn(dao.BusConstructionUser.Columns().Phone, mobiles). + WhereNotNull(dao.BusConstructionUser.Columns().ProjectId). + Scan(&List); err != nil { + panic(err) + } + + return lo.Associate(List, func(item entity.BusConstructionUser) (string, entity.BusConstructionUser) { + return item.Phone, item + }) +} diff --git a/third/arithmetic/SpartaApi/entity.go b/third/arithmetic/SpartaApi/entity.go new file mode 100644 index 0000000..5595100 --- /dev/null +++ b/third/arithmetic/SpartaApi/entity.go @@ -0,0 +1,34 @@ +package SpartaApi + +//type UniversalEntity struct { +// code string `json:"code" dc:"200:业务处理成功;40x:访问权限错误;50x:系统错误。"` +// msg string `json:"msg" dc:"结果消息提示,如:success"` +// data string `json:"leftTopPoint" dc:"业务执行结果(obj/arr)"` +//} + +type TokenEntity struct { + Token string `json:"token" dc:"token"` + ExpiresAt int `json:"expires_at" dc:"过期时间"` +} + +type RecognizeReq struct { + CapUrl string `json:"capUrl" v:"required" dc:"v-在线图片地址"` + RecType string `json:"recType" v:"required" dc:"v-识别算法模型"` + Async string `json:"async" dc:"是否异步处理:false:默认值,算法识别完后同步返回,接口请求会等待(适用于识别时间较长的模型);true: 收到请求后,算法服务器会异步识别"` + CallBackUrl string `json:"callBackUrl" dc:"若为异步,则需要此参数,系统会将结果post到这个接口中"` + AreaHigh string `json:"area_high" dc:"若为异步,则需要此参数,系统会将结果post到这个接口中"` +} + +type RecognizeRes struct { + HasTarget int `json:"hasTarget" dc:"是否监测到目标:1:是;0:否"` + OriginalImgSize []int `json:"originalImgSize" dc:"原始图片尺寸([宽,高]),ex:[1920,1080]"` + Targets []TargetsEntity `json:"targets" dc:"目标信息"` +} + +type TargetsEntity struct { + PhoNumber int `json:"pho_number" dc:"在光伏板检测的时候会多输出一个参数代表光伏板的数量"` + Type string `json:"type" dc:"目标信息"` + Size []float64 `json:"size" dc:"目标外接矩形像素"` + LeftTopPoint []float64 `json:"leftTopPoint" dc:"目标在画面中左上角位置信息"` + Score float64 `json:"score" dc:"置信度得分(0~1)"` +} diff --git a/third/arithmetic/SpartaApi/entrance.go b/third/arithmetic/SpartaApi/entrance.go new file mode 100644 index 0000000..717cfd0 --- /dev/null +++ b/third/arithmetic/SpartaApi/entrance.go @@ -0,0 +1,635 @@ +package SpartaApi + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "github.com/tiger1103/gfast/v3/library/liberr" + "io" + "log" + "net/url" + "os" + "strings" + "time" + + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gctx" + "github.com/tiger1103/gfast-cache/cache" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + commonService "github.com/tiger1103/gfast/v3/internal/app/common/service" +) + +const ( + Sensitivity = 0.6 // 识别灵敏度 //AI工单(摄像头) + CAMERA = "head smoke" // AI工单(摄像头) + UAV_MATRIX = "pho hole shelves pile" // 方阵内容 + UAV_MACHINE = "excavator Roller Truck_crane Loader Submersible_drilling_rig Sprinkler Truck_mounted_crane Truck" // 大型机械 + + //远界 + YJCAMERA = "fire,hardhat,smoking" +) + +var Url = g.Cfg().MustGet(gctx.New(), "spartaApi.Url").String() +var yjUrl = g.Cfg().MustGet(gctx.New(), "yjSpartaApi.Url").String() + +// 定义一个映射来存储不同的类型及其对应的描述 +var typeDescriptions = map[string]string{ + "head": "未带安全帽", + "smoke": "吸烟", + "belt": "未系安全带", + "excavator": "挖掘机", + "Roller": "压路机", + "Truck_crane": "汽车吊", + "Loader": "装载机", + "Submersible_drilling_rig": "潜挖钻机", + "Sprinkler": "沙水车", + "Truck_mounted_crane": "随车吊", + "Truck": "货车", + + //远界 + "nohelmet": "未戴安全帽", + "cigarette": "吸烟", + "fire": "火灾", + "smoggy": "烟雾", +} + +// @Title GetDescription 2024/8/7 17:34:00 +// @Description 可复用的函数,根据输入的类型返回对应的描述 +// @Auth Cory +func GetDescription(tp string) string { + if description, exists := typeDescriptions[tp]; exists { + return description + } + return "未知类型" +} + +//func init() { +// fmt.Println("斯巴达----------------") +// token, _ := spartaApiTokenFunc() +// fmt.Println("token----------------", token) +//} + +// @Title spartaApiTokenFunc 2024/8/7 17:35:00 +// @Description 登录获取身份凭证 +// @Auth Cory +func spartaApiTokenFunc() (token string, err error) { + key := "arithmetic:token" + ctx := gctx.New() + prefix := g.Cfg().MustGet(ctx, "system.cache.prefix").String() + gfCache := cache.New(prefix) + get, err := g.Redis().Get(ctx, gfCache.CachePrefix+key) + if err != nil && get.String() != "" { + token = get.String() + return token, err + } else { + clientId := g.Cfg().MustGet(gctx.New(), "spartaApi.key") + clientSecret := g.Cfg().MustGet(gctx.New(), "spartaApi.secret") + uri := Url + "/token?clientId=" + clientId.String() + "&clientSecret=" + clientSecret.String() + response, err := g.Client().Get(gctx.New(), uri) + if err != nil { + return "", err + } + var tk *TokenEntity + err = json.Unmarshal([]byte(response.ReadAllString()), &tk) + if err != nil { + return "", err + } else { + tk.Token = "Basic " + tk.Token + } + // 将token存储到redis中,tiken默认时间为秒,(这里少5000秒,防止token过期还存在redis中) + commonService.Cache().Set(ctx, key, tk.Token, time.Duration(tk.ExpiresAt-5000)*time.Second) + token = tk.Token + return token, err + } +} + +//// @Title CommonAlgorithmTwoFunc 2024/8/7 17:06:00 +//// @Description 提供算法得到的目标信息 +//// @Auth Cory +//func CommonAlgorithmTwoFunc(ctx context.Context, recognize *RecognizeReq) (result *RecognizeRes, flag bool, err error) { +// result = new(RecognizeRes) +// flag = false +// // 1、调用算法 +// body, err := ObjectIdentificationFunc(ctx, recognize) +// if err != nil { +// return +// } +// // 2、组装数据 +// err = json.Unmarshal(body, &result) +// if err != nil { +// return +// } +// // 3、布尔值 +// if len(result.Targets) == 0 { // 表示无违规操作 +// return +// } else { // 表述有违规操作 +// flag = true +// return +// } +//} + +// @Title CommonAlgorithmTwoUav 2024/8/7 17:06:00 +// @Description 提供算法得到的目标信息【飞机专用】 +// @Auth Cory +func CommonAlgorithmTwoUav(ctx context.Context, recognize *RecognizeReq) (result *RecognizeRes, flag bool, err error) { + result = new(RecognizeRes) + flag = false + //// 1、调用算法 + //body, err := ObjectIdentificationFunc(ctx, recognize) + //if err != nil { + // return + //} + + recognizeResult := `{ + "hasTarget": 1, + "originalImgSize": [1920, 1080], + "targets": [ + { + "type": "pho", + "size": [282, 274], + "leftTopPoint": [3192, 2758], + "score": 0.6154276132583618 + }, + { + "type": "pho", + "size": [343, 139], + "leftTopPoint": [4577, 2836], + "score": 0.722245454788208 + }, + { + "type": "pho", + "size": [372, 158], + "leftTopPoint": [4554, 3761], + "score": 0.7273581027984619 + }, + { + "type": "pho", + "size": [351, 129], + "leftTopPoint": [4124, 2251], + "score": 0.749356746673584 + }, + { + "type": "pho", + "size": [336, 152], + "leftTopPoint": [4211, 2379], + "score": 0.7633119225502014 + }, + { + "type": "pho", + "size": [343, 147], + "leftTopPoint": [4321, 2515], + "score": 0.7663174867630005 + }, + { + "type": "pho", + "size": [333, 152], + "leftTopPoint": [4933, 2771], + "score": 0.7939081192016602 + }, + { + "type": "pho", + "size": [334, 143], + "leftTopPoint": [4574, 2966], + "score": 0.8044442534446716 + }, + { + "type": "pho", + "size": [332, 138], + "leftTopPoint": [4243, 2921], + "score": 0.8075516819953918 + }, + { + "type": "pho", + "size": [315, 156], + "leftTopPoint": [3628, 2535], + "score": 0.8091028332710266 + }, + { + "type": "pho", + "size": [336, 129], + "leftTopPoint": [3913, 3655], + "score": 0.8116179704666138 + }, + { + "type": "pho", + "size": [342, 139], + "leftTopPoint": [4471, 2290], + "score": 0.814013659954071 + }, + { + "type": "pho", + "size": [350, 143], + "leftTopPoint": [4528, 2432], + "score": 0.8172851800918579 + }, + { + "type": "pho", + "size": [342, 171], + "leftTopPoint": [3992, 2469], + "score": 0.8185974359512329 + }, + { + "type": "pho", + "size": [338, 149], + "leftTopPoint": [4433, 3345], + "score": 0.8222267031669617 + }, + { + "type": "pho", + "size": [332, 134], + "leftTopPoint": [4284, 2660], + "score": 0.8247078657150269 + }, + { + "type": "pho", + "size": [328, 134], + "leftTopPoint": [4616, 2713], + "score": 0.8274019956588745 + }, + { + "type": "pho", + "size": [350, 139], + "leftTopPoint": [4928, 3685], + "score": 0.8295787572860718 + }, + { + "type": "pho", + "size": [339, 136], + "leftTopPoint": [4908, 2905], + "score": 0.8317150473594666 + }, + { + "type": "pho", + "size": [339, 135], + "leftTopPoint": [4232, 3708], + "score": 0.8319769501686096 + }, + { + "type": "pho", + "size": [323, 141], + "leftTopPoint": [3461, 3167], + "score": 0.8382804989814758 + }, + { + "type": "pho", + "size": [368, 132], + "leftTopPoint": [3761, 3219], + "score": 0.8471034169197083 + }, + { + "type": "pho", + "size": [338, 140], + "leftTopPoint": [3894, 2986], + "score": 0.8511925339698792 + }, + { + "type": "pho", + "size": [337, 144], + "leftTopPoint": [3580, 2942], + "score": 0.8524681329727173 + }, + { + "type": "pho", + "size": [348, 142], + "leftTopPoint": [3620, 3467], + "score": 0.8603440523147583 + }, + { + "type": "pho", + "size": [352, 145], + "leftTopPoint": [4632, 2584], + "score": 0.8645903468132019 + }, + { + "type": "pho", + "size": [365, 139], + "leftTopPoint": [4585, 3633], + "score": 0.8663488626480103 + }, + { + "type": "pho", + "size": [323, 138], + "leftTopPoint": [3919, 2847], + "score": 0.8686794638633728 + }, + { + "type": "pho", + "size": [394, 155], + "leftTopPoint": [3644, 3335], + "score": 0.8729261755943298 + }, + { + "type": "pho", + "size": [328, 143], + "leftTopPoint": [4274, 3576], + "score": 0.8783137798309326 + }, + { + "type": "pho", + "size": [300, 314], + "leftTopPoint": [3247, 2571], + "score": 0.879583477973938 + }, + { + "type": "pho", + "size": [660, 217], + "leftTopPoint": [4903, 3817], + "score": 0.8797935843467712 + }, + { + "type": "pho", + "size": [331, 170], + "leftTopPoint": [3923, 2713], + "score": 0.8806164264678955 + }, + { + "type": "pho", + "size": [332, 140], + "leftTopPoint": [4240, 2782], + "score": 0.8832747936248779 + }, + { + "type": "pho", + "size": [318, 143], + "leftTopPoint": [4129, 3295], + "score": 0.8922125101089478 + }, + { + "type": "pho", + "size": [349, 143], + "leftTopPoint": [3867, 3116], + "score": 0.8925455808639526 + }, + { + "type": "pho", + "size": [333, 138], + "leftTopPoint": [4016, 3404], + "score": 0.8939041495323181 + }, + { + "type": "pho", + "size": [353, 158], + "leftTopPoint": [3942, 2604], + "score": 0.8950177431106567 + }, + { + "type": "pho", + "size": [350, 148], + "leftTopPoint": [4655, 3507], + "score": 0.9090152382850647 + }, + { + "type": "pho", + "size": [322, 153], + "leftTopPoint": [3587, 2792], + "score": 0.9102197289466858 + }, + { + "type": "pho", + "size": [348, 159], + "leftTopPoint": [4777, 3397], + "score": 0.9125684499740601 + } + ], + "pho_number": 41 + }` + body := []byte(recognizeResult) + + // 2、组装数据 + err = json.Unmarshal(body, &result) + if err != nil { + fmt.Println("Error:", err) + return + } + // 3、布尔值 + if len(result.Targets) == 0 { // 表示无违规操作 + flag = false + } else { // 表述有违规操作 + flag = true + } + + //绘图 + replace := strings.Replace(recognize.CapUrl, coryCommon.GlobalPath, "", 1) + imgPath := coryCommon.FileToFunc(replace, 2) + + num := 0 + mp := make(map[string]string) + entity := coryCommon.TestDrawRectTextEntity{ + ImPath: imgPath, + } + var zuobiao []*coryCommon.CoordinatesListEntity + for _, data := range result.Targets { + if data.Score >= Sensitivity { + tp := data.Type + mp[tp] = GetDescription(tp) + flag = true + num = num + 1 + zuobiao = append(zuobiao, &coryCommon.CoordinatesListEntity{ + X: data.LeftTopPoint[0], + Y: data.LeftTopPoint[1], + W: data.Size[0], + H: data.Size[1], + }) + } + } + entity.Coordinates = zuobiao + coryCommon.TestDrawRectTextFunc(&entity) + return +} + +/* +hat:安全帽识别; +head:不戴安全帽识别; +smoke:吸烟识别; +belt : 安全带识别; +waste :工程垃圾识别(暂无) +excavator:挖掘机; +Roller:压路机; +Truck_crane:汽车吊; +Loader:装载机; +Submersible_drilling_rig:潜挖钻机; +Sprinkler:洒水车; +Truck_mounted_crane:随车吊; +Truck:货车 +pho:光伏板 +hole:洞 +shelves:架子 +*/ +func ObjectIdentificationFunc(ctx context.Context, recognize *RecognizeReq) (body []byte, err error) { + // 1、获取token + token, err := spartaApiTokenFunc() + if err != nil { + err = errors.New("获取斯巴达token错误!" + err.Error()) + return + } + // 2、设置请求数据 + uri := Url + "/api/recognize?capUrl=" + recognize.CapUrl + + "&recType=" + url.QueryEscape(recognize.RecType) + + "&async=" + recognize.Async + + "&callBackUrl=" + recognize.CallBackUrl + + "&area_high=" + recognize.AreaHigh + response, err := g.Client().ContentJson().SetHeaderMap(map[string]string{ + "Authorization": token, + }).Get(gctx.New(), uri) + defer response.Body.Close() + // 3、返回数据 + body, err = io.ReadAll(response.Body) + fmt.Println("请求的URL ", uri) + return +} + +// @Title CommonAlgorithmFunc 2024/8/7 17:07:00 +// @Description 调用算法,得到目标信息,然后圈出来 +// @Auth Cory +func CommonAlgorithmFunc(ctx context.Context, recognize *RecognizeReq) (mp map[string]string, flag bool, num int, err error) { + flag = false + num = 0 + // 0、记录绝对路径,以便后续操作 //absolutePath := "C:\\Users\\MSI\\Pictures\\222.png" + absolutePath := recognize.CapUrl + prefix := g.Cfg().MustGet(gctx.New(), "spartaApi.prefix") + recognize.CapUrl = replacePrefix(recognize.CapUrl, "/resource/public/", prefix.String()+"/file/") + // 1、调用算法 + body, err := ObjectIdentificationFunc(ctx, recognize) + if err != nil { + return + } + // 2、组装数据 + var data []json.RawMessage + err = json.Unmarshal(body, &data) + if err != nil { + fmt.Println("Error:", err) + return + } + var result RecognizeRes + for i, rawMsg := range data { + switch i { + case 0: + err = json.Unmarshal(rawMsg, &result.HasTarget) + case 1: + err = json.Unmarshal(rawMsg, &result.OriginalImgSize) + default: + var target TargetsEntity + err = json.Unmarshal(rawMsg, &target) + if err == nil { + result.Targets = append(result.Targets, target) + } + } + if err != nil { + fmt.Println("Error:", err) + return + } + } + // 3、遍历数据,然后在数据中绘画矩形框 + if result.HasTarget == 0 { + return + } + mp = make(map[string]string) + for _, data := range result.Targets { + if data.Score >= Sensitivity { + tp := data.Type + mp[tp] = GetDescription(tp) + flag = true + num = num + 1 + coryCommon.Test_draw_rect_text(absolutePath, data.LeftTopPoint[0], data.LeftTopPoint[1], data.Size[0], data.Size[1]) + } + } + return +} + +// replacePrefix 将路径中指定前缀及其之前的部分替换成新的前缀 +func replacePrefix(originalPath, prefixToReplace, newPrefix string) string { + // 查找要替换的前缀的位置 + index := strings.Index(originalPath, prefixToReplace) + // 如果找到前缀 + if index != -1 { + // 保留前缀之后的部分 + remainingPath := originalPath[index+len(prefixToReplace):] + // 拼接新的路径 + newPath := newPrefix + remainingPath + return newPath + } + // 如果未找到前缀,返回原始路径 + return originalPath +} + +/* +============================================================================= +远界算法 +============================================================================= +*/ + +func CORYAInit(ctx context.Context) { + req := RecognizeReq{ + CapUrl: "http://xny.yj-3d.com:7363/file/temporary/2025-06-22/sxt_1750583729497_972.jpg", + RecType: YJCAMERA, + } + now := time.Now() + marshal, _ := json.Marshal(req) + fmt.Println("------------", string(marshal)) + fmt.Println("------------", now) + result, flag, err := CommonAlgorithmTwoFunc(gctx.New(), &req) + now2 := time.Now() + + fmt.Println("result", result, flag, err) + fmt.Println("===========用时", now2.Sub(now)) + fmt.Println("===========") +} + +// @Title CommonAlgorithmTwoFunc 2024/8/7 17:06:00 +// @Description 提供算法得到的目标信息(远界版本) +// @Auth Cory +func CommonAlgorithmTwoFunc(ctx context.Context, recognize *RecognizeReq) (result *RecognizeRes, flag bool, err error) { + err = g.Try(ctx, func(ctx context.Context) { + result = new(RecognizeRes) + flag = false + // 1、调用算法 + postData := map[string]interface{}{ + "type": recognize.RecType, + "url": recognize.CapUrl, + "extract": false, + } + response, err := g.Client().ContentJson().Post(ctx, yjUrl, postData) + fmt.Println("1请求的URL ", err) + liberr.ErrIsNil(ctx, err, "远界算法请求失败") + defer response.Body.Close() + body, err := io.ReadAll(response.Body) + fmt.Println("2请求的URL ", err) + liberr.ErrIsNil(ctx, err, "远界算法数据获取失败") + fmt.Println("返回的数据为 ", string(body)) + // 2、组装数据 + err = json.Unmarshal(body, &result) + if err != nil { + return + } + + //======================= + //======================= + //1、本地创建一个text来记录日志 + // 定义文件路径 + filePath := coryCommon.GetCWD() + "/coryLogs/logs/ai_log.txt" + // 打开文件,如果文件不存在则创建 + file, err := os.OpenFile(filePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + log.Fatal(err) + } + defer file.Close() + // 写入日志信息 + marshal, _ := json.Marshal(result) + marshal2, _ := json.Marshal(postData) + _, err = file.WriteString(fmt.Sprintf("参数:%s,==================结果:%s\n", string(marshal), string(marshal2))) + if err != nil { + log.Fatal(err) + } + + // 3、布尔值 + if len(result.Targets) == 0 { // 表示无违规操作 + return + } else { // 表述有违规操作 + flag = true + return + } + + }) + return +} diff --git a/third/create/a.go b/third/create/a.go new file mode 100644 index 0000000..072f756 --- /dev/null +++ b/third/create/a.go @@ -0,0 +1,668 @@ +package create + +import ( + "context" + "encoding/json" + "fmt" + "math/rand" + "time" + + "github.com/gogf/gf/v2/util/gconv" + "github.com/sony/sonyflake" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/internal/consts" +) + +// 创建 gantt json 数据 +func CreateGanttJson(ctx context.Context, fangzhenName string, parentName string, data []entity.ProjectSchedule) (string, error) { + // 层级: 方阵名 --> 施工项目名 --> 子施工项目名 + ganttData := make([]system.Gantt, 0, len(data)) + + // 添加项目名 + ganttData = append(ganttData, system.Gantt{Id: 1, StartDate: "2024-01-01 00:00:00", Duration: 15, Text: "方阵1", Parent: 0, Progress: 0, Open: true}) + ganttData = append(ganttData, system.Gantt{Id: 2, StartDate: "2024-01-01 00:00:00", EndDate: "2024-01-15 00:00:00", Duration: 15, Text: "防雷接地网", Parent: 1, Progress: 0, Open: true}) + + i := 3 + + for _, project := range data { + ganttData = append(ganttData, system.Gantt{ + Id: int64(i), + StartDate: project.StartDate + " 00:00:00", + EndDate: project.EndDate + " 00:00:00", + Duration: rand.Intn(10) + 1, + Text: project.Name, + // Progress: float64(project.CurrentProgress), + Parent: 2, + Open: true, + }) + + aa := entity.ProjectSchedule{} + if err := dao.ProjectSchedule.Ctx(ctx).Where(dao.ProjectSchedule.Columns().ParentId, project.ParentId). + WhereNotNull(dao.ProjectSchedule.Columns().Types).Scan(&aa); err != nil { + return "", err + } + + ganttData = append(ganttData, system.Gantt{ + Id: int64(i + 1), + StartDate: aa.StartDate + " 00:00:00", + EndDate: aa.EndDate + " 00:00:00", + Duration: 1, + Text: "计划中", + Parent: int64(i), + }) + + i += 2 + } + + // 打印 gantt json 数据 + dd, _ := json.Marshal(ganttData) + println(string(dd)) + + return string(dd), nil +} + +func CreateGanttJson2(ctx context.Context, fangzhenName string, parentName string, data []entity.ProjectSchedule) ([]system.Gantt, error) { + // 层级: 方阵名 --> 施工项目名 --> 子施工项目名 + ganttData := make([]system.Gantt, 0, len(data)) + + // 添加项目名 + ganttData = append(ganttData, system.Gantt{Id: 1, StartDate: "2024-01-01 00:00:00", Duration: 15, Text: fangzhenName, Parent: 0, Progress: 0, Open: true}) + ganttData = append(ganttData, system.Gantt{Id: 2, StartDate: "2024-01-01 00:00:00", EndDate: "2024-01-15 00:00:00", Duration: 15, Text: parentName, Parent: 1, Progress: 0, Open: true}) + + i := 3 + + index := 0 + + for i < len(data) { + ganttData = append(ganttData, system.Gantt{ + Id: int64(i), + StartDate: data[index].StartDate + " 00:00:00", + EndDate: data[index].EndDate + " 00:00:00", + Duration: rand.Intn(10) + 1, + Text: data[index].Name, + Parent: 2, + Open: true, + }) + + ganttData = append(ganttData, system.Gantt{ + Id: int64(i + 1), + StartDate: data[index+1].StartDate + " 00:00:00", + EndDate: data[index+1].EndDate + " 00:00:00", + Duration: 1, + Text: "计划中", + Parent: int64(i), + }) + + index += 2 + i += 2 + + if index >= len(data) { + break + } + } + + return ganttData, nil +} + +type projects struct { + Name string + StartTime string + EndTime string + Sub []subJ +} +type subJ struct { + Name string + ID int + ParentID int + StartTime string + EndTime string +} + +func FetchGanttData(ctx context.Context, matrixID int) ([]system.Gantt, error) { + projectData := []entity.ConstructionProject{} + // 获取指定方阵下的所有父项目 + if err := dao.ConstructionProject.Ctx(ctx). + Where(dao.ConstructionProject.Columns().FangzhenId, matrixID).Scan(&projectData); err != nil { + return nil, err + } + + // 父子项目列表 + projectList := []projects{} + + // 构造所有的父项目及子项目 + for _, project := range projectData { + detailData := []entity.ConstructionDetails{} + if err := dao.ConstructionDetails.Ctx(ctx). + Where(dao.ConstructionDetails.Columns().ConstructionId, project.ConstructionId).Scan(&detailData); err != nil { + return nil, err + } + + // 如果 start_time 和 end_time 为空则使用当前时间 + var startTime string + var endTime string + + if project.StartTime == nil { + startTime = time.Now().Format("2006-01-02 15:04:05") + } else { + startTime = project.StartTime.Format("2006-01-02 15:04:05") + } + + if project.EndTime == nil { + endTime = time.Now().Format("2006-01-02 15:04:05") + } else { + endTime = project.EndTime.Format("2006-01-02 15:04:05") + } + + // 父 + projectItem := projects{ + Name: project.ConstructionName, + StartTime: startTime, + EndTime: endTime, + Sub: make([]subJ, 0, len(detailData)), + } + + // 子 + for _, detail := range detailData { + // 如果 start_time 和 end_time 为空则使用当前时间 + var startTime string + var endTime string + + if detail.StartTime == nil { + startTime = time.Now().Format("2006-01-02 15:04:05") + } else { + startTime = detail.StartTime.Format("2006-01-02 15:04:05") + } + + if detail.EndTime == nil { + endTime = time.Now().Format("2006-01-02 15:04:05") + } else { + endTime = detail.EndTime.Format("2006-01-02 15:04:05") + } + + projectItem.Sub = append(projectItem.Sub, subJ{ + Name: detail.Name, + ID: int(detail.Id), + ParentID: int(detail.Id), + StartTime: startTime, + EndTime: endTime, + }) + } + + projectList = append(projectList, projectItem) + } + + // 1 获取所有的排期数据 + schedulerList := []entity.ProjectSchedule{} + if err := dao.ProjectSchedule.Ctx(ctx).WhereNot(dao.ProjectSchedule.Columns().Types, 0). + Scan(&schedulerList); err != nil { + } + + // 子项目存在多个排期的情况下,需要将排期数据进行分组 + scheduleMap := make(map[int][]entity.ProjectSchedule, 0) + for _, schedule := range schedulerList { + if _, ok := scheduleMap[schedule.ParentId]; !ok { + scheduleMap[schedule.ParentId] = make([]entity.ProjectSchedule, 0, 1) + } + scheduleMap[schedule.ParentId] = append(scheduleMap[schedule.ParentId], schedule) + } + + // 1.1 传入 parentid 返回一个子项目的排期数据 + findSub := func(parentID int) ([]entity.ProjectSchedule, bool) { + if schedule, ok := scheduleMap[parentID]; ok { + return schedule, true + } + return nil, false + } + + // 主任务 + ganttList := make([]system.Gantt, 0, len(projectList)) + + taskIndex := 1 + // 查询任务是否存在排期如果存在则不添加 + for _, project := range projectList { + // 父级数据 + ganttList = append(ganttList, system.Gantt{ + Id: int64(taskIndex), + StartDate: project.StartTime, + Duration: 15, + Text: project.Name, + Parent: 0, + Open: true, + }) + + taskIndex++ + + // 记录当前主项目的下标 + parentIndex := taskIndex + for _, sub := range project.Sub { + scheduleData, ok := findSub(sub.ParentID) + // 如果有排期的情况下,填充真实数据 + if ok { + // 添加子任务 + ganttList = append(ganttList, system.Gantt{ + Id: int64(taskIndex), + StartDate: sub.StartTime, + EndDate: sub.EndTime, + Duration: rand.Intn(10) + 1, + Text: sub.Name, + Parent: int64(parentIndex) - 1, + ConstructionId: sub.ID, + }) + + // 记录当前子项目的下标 + subIndex := taskIndex + taskIndex++ + + for _, schedule := range scheduleData { + // 添加子任务排期计划 + ganttList = append(ganttList, system.Gantt{ + Id: int64(taskIndex), + StartDate: schedule.StartDate + " 00:00:00", + EndDate: schedule.EndDate + " 00:00:00", + Duration: gconv.Int(schedule.PlaneNum), + Text: "计划中", + Parent: int64(subIndex), + ConstructionId: sub.ID, + Open: true, + }) + taskIndex++ + } + continue + } + + // 添加子任务,如果没有排期的情况下,填充假数据,维护队列 + ganttList = append(ganttList, system.Gantt{ + Id: int64(taskIndex), + StartDate: "2029-01-01 00:00:00", + Duration: 15, + Text: sub.Name, + Parent: int64(parentIndex) - 1, + ConstructionId: sub.ID, + Open: true, + }) + taskIndex++ + } + } + return ganttList, nil +} + +func FetchElementData(ctx context.Context, fangzhenId int) ([]*model.WorkStatusProgressRes, error) { + // 获取所有的父项目 + projectData := []entity.WorkStatus{} + if err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, fangzhenId).WhereNull(dao.WorkStatus.Columns().Parent). + Scan(&projectData); err != nil { + return nil, err + } + + // 获取所有的子项目 + detailData := []entity.WorkStatus{} + if err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, fangzhenId).WhereNotNull(dao.WorkStatus.Columns().Parent).Scan(&detailData); err != nil { + return nil, err + } + + // 根据关联关系进行数据拼接 + index := 1 + projectList := []*model.WorkStatusProgressRes{} + for _, project := range projectData { + // 父级数据 + projectItem := model.WorkStatusProgressRes{ + ID: index, + Startat: project.StartAt.String(), + Endat: project.EndAt.String(), + Name: project.WorkName, + Total: project.Total, + Finished: project.Finished, + Children: make([]model.WorkStatusProgressRes, 0, len(detailData)), + } + + index++ + // 子 + for _, detail := range detailData { + if detail.Parent == int(project.Id) { + projectItem.Children = append(projectItem.Children, model.WorkStatusProgressRes{ + ID: index, + Startat: detail.StartAt.String(), + Endat: detail.EndAt.String(), + Name: detail.WorkName, + Total: detail.Total, + Finished: detail.Finished, + }) + index++ + } + } + projectList = append(projectList, &projectItem) + } + + return projectList, nil +} + +func randomDate(dateStr string) string { + t, _ := time.Parse("2006-01-02", dateStr) + randDays := time.Duration(rand.Intn(2)+1) * 24 * time.Hour + newDate := t.Add(-randDays) + return newDate.Format("2006-01-02") +} + +// 获取雪花算法生成的 ID +func GetSonyFlakeID() (uint64, error) { + // 初始化 sonyFlake 配置 + st := sonyflake.Settings{} + sonyFlake := sonyflake.NewSonyflake(st) + if sonyFlake == nil { + return 0, fmt.Errorf("需要先初始化以后再执行 GetID 函数") + } + + // 获取全局 ID + id, err := sonyFlake.NextID() + if err != nil { + return 0, err + } + + return id, nil +} + +func GetSonyFlakeIDs(mID uint16, count int) (ids []uint64, err error) { + // 初始化 sonyFlake 配置 + st := sonyflake.Settings{} + sonyFlake := sonyflake.NewSonyflake(st) + if sonyFlake == nil { + err = fmt.Errorf("需要先初始化以后再执行 GetID 函数 err: %#v \n", err) + return + } + + // 获取全局 ID + ids = make([]uint64, count) + for i := 0; i < count; i++ { + id, err := sonyFlake.NextID() + if err != nil { + return nil, err + } + ids[i] = id + } + + return ids, nil +} + +// FetchTemplateData 为方阵绑定父子项目 +func FetchTemplateData(ctx context.Context, protectionNetID int64) ([]do.WorkStatus, error) { + facilityGroups := createFacilities() + + // 雪花算法生成 ID + ids, err := GetSonyFlakeIDs(1, 38) + if err != nil { + return nil, err + } + + details := make([]do.WorkStatus, 0, len(facilityGroups)) + + index := 0 + for _, group := range facilityGroups { + projectID, err := dao.WorkStatus.Ctx(ctx).Data(do.WorkStatus{ + FangzhenId: protectionNetID, + WorkId: ids[index], + WorkName: group.Name, + Total: group.FacilityCount, + Type: group.TypeNumber, + IsPercent: group.IsPercentage, + Status: 0, + }).InsertAndGetId() + if err != nil { + return nil, err + } + + index++ + + for _, component := range group.Components { + details = append(details, do.WorkStatus{ + FangzhenId: protectionNetID, + Parent: projectID, + WorkId: ids[index], + WorkName: component.Name, + Total: component.Quantity, + IsPercent: component.IsPercentage, + Type: component.TypeNumber, + Status: 0, + }) + index++ + } + } + + return details, nil +} + +// 为方阵绑定施工项目 +func CreateConstructionProject(ctx context.Context, protectionNetID int64) error { + facilityGroups := createFacilities() + + details := make([]do.ConstructionDetails, len(facilityGroups)) + for _, group := range facilityGroups { + projectID, err := dao.ConstructionProject.Ctx(ctx).Data(do.ConstructionProject{ + FangzhenId: protectionNetID, + ConstructionName: group.Name, + Total: group.FacilityCount, + IsPercentage: group.IsPercentage, + }).InsertAndGetId() + if err != nil { + return err + } + + for _, component := range group.Components { + details = append(details, do.ConstructionDetails{ + Name: component.Name, + ConstructionId: projectID, + Total: component.Quantity, + IsPercentage: component.IsPercentage, + }) + } + } + + _, err := dao.ConstructionDetails.Ctx(ctx).Batch(50).Insert(details) + if err != nil { + return err + } + + return nil +} + +func createFacilities() []system.FacilityGroup { + return []system.FacilityGroup{{ + Name: "防雷接地网", + FacilityCount: nil, + IsPercentage: &[]int{0}[0], + TypeNumber: consts.LightningProtectionNet, + Components: []system.Component{ + { + Name: "接地沟", + IsPercentage: &[]int{1}[0], + Quantity: 0, + TypeNumber: consts.GroundingDitch, + }, + { + Name: "接地敷设", + IsPercentage: &[]int{1}[0], + Quantity: 0, + TypeNumber: consts.GroundingLaying, + }, + { + Name: "检测", + IsPercentage: &[]int{1}[0], + Quantity: 0, + TypeNumber: consts.GroundingTesting, + }, + }, + }, { + Name: "围栏", + FacilityCount: nil, + IsPercentage: &[]int{0}[0], + TypeNumber: consts.Fence, + Components: []system.Component{ + { + Name: "基础", + IsPercentage: &[]int{0}[0], + Quantity: 100, + TypeNumber: consts.FenceFoundation, + }, + { + Name: "安装", + IsPercentage: &[]int{0}[0], + Quantity: 100, + TypeNumber: consts.FenceInstallation, + }, + }, + }, { + Name: "道路", + IsPercentage: &[]int{0}[0], + TypeNumber: consts.Road, + Components: []system.Component{ + { + Name: "路基", + IsPercentage: &[]int{0}[0], + Quantity: 100, + TypeNumber: consts.RoadBase, + }, + { + Name: "排水沟", + IsPercentage: &[]int{0}[0], + Quantity: 100, + TypeNumber: consts.RoadDrainageDitch, + }, + }, + }, { + Name: "低压部分", + IsPercentage: &[]int{0}[0], + FacilityCount: &[]int{0}[0], + TypeNumber: consts.LowVoltage, + Components: []system.Component{ + { + Name: "钻孔", + IsPercentage: &[]int{1}[0], + Quantity: 0, + TypeNumber: consts.LowVoltageDrilling, + }, + { + Name: "桩基", + IsPercentage: &[]int{1}[0], + Quantity: 0, + TypeNumber: consts.LowVoltagePileFoundation, + }, + { + Name: "支架", + IsPercentage: &[]int{1}[0], + Quantity: 0, + TypeNumber: consts.LowVoltageBracket, + }, + { + Name: "光伏板", + IsPercentage: &[]int{1}[0], + Quantity: 0, + TypeNumber: consts.LowVoltagePhotovoltaicPanel, + }, + { + Name: "直流电缆", + IsPercentage: &[]int{1}[0], + Quantity: 0, + TypeNumber: consts.LowVoltageDC, + }, + { + Name: "接地线", + IsPercentage: &[]int{1}[0], + Quantity: 0, + TypeNumber: consts.LowVoltageGroundWire, + }, + { + Name: "逆变器安装", + IsPercentage: &[]int{1}[0], + TypeNumber: consts.LowVoltageInverterInstallation, + }, + { + Name: "电缆沟开挖", + IsPercentage: &[]int{1}[0], + Quantity: 0, + TypeNumber: consts.LowVoltageCableTrenchExcavation, + }, + { + Name: "低压电缆敷设", + IsPercentage: &[]int{1}[0], + Quantity: 0, + TypeNumber: consts.LowVoltageLaying, + }, + { + Name: "调试", + IsPercentage: &[]int{1}[0], + Quantity: 0, + TypeNumber: consts.LowVoltageDebugging, + }, + }, + }, { + Name: "高压部分", + IsPercentage: &[]int{1}[0], + TypeNumber: consts.HighVoltage, + Components: []system.Component{ + { + Name: "箱变基础", + IsPercentage: &[]int{1}[0], + TypeNumber: consts.HighVoltageBoxChangeFoundation, + }, + { + Name: "箱变安装", + IsPercentage: &[]int{1}[0], + TypeNumber: consts.HighVoltageBoxChangeInstallation, + }, + { + Name: "电缆沟开挖", + IsPercentage: &[]int{1}[0], + TypeNumber: consts.HighVoltageCableLineExcavation, + }, + { + Name: "高压电缆敷设", + IsPercentage: &[]int{1}[0], + TypeNumber: consts.HighVoltageCableLaying, + }, + { + Name: "高压电缆试验", + IsPercentage: &[]int{1}[0], + TypeNumber: consts.HighVoltageCableTest, + }, + { + Name: "高压电缆调试试验", + IsPercentage: &[]int{1}[0], + TypeNumber: consts.HighVoltageCableDebuggingTest, + }, + }, + }, { + Name: "环网柜", + IsPercentage: &[]int{1}[0], + TypeNumber: consts.RingMainCabinet, + Components: []system.Component{ + { + Name: "基础", + IsPercentage: &[]int{1}[0], + TypeNumber: consts.RingMainCabinetFoundation, + }, + { + Name: "安装", + IsPercentage: &[]int{1}[0], + TypeNumber: consts.RingMainCabinetInstallation, + }, + { + Name: "敷设", + IsPercentage: &[]int{1}[0], + TypeNumber: consts.RingMainCabinetLaying, + }, + { + Name: "试验", + IsPercentage: &[]int{1}[0], + TypeNumber: consts.RingMainCabinetTest, + }, + { + Name: "调试试验", + IsPercentage: &[]int{1}[0], + TypeNumber: consts.RingMainCabinetDebuggingTest, + }, + }, + }} +} diff --git a/third/excel/equipment_materials.go b/third/excel/equipment_materials.go new file mode 100644 index 0000000..6dc1d3a --- /dev/null +++ b/third/excel/equipment_materials.go @@ -0,0 +1,34 @@ +package excel + +import ( + "context" + + "github.com/tiger1103/gfast/v3/internal/app/system/dao" +) + +// EquipmentMaterials 设备和材料 +type EquipmentMaterials struct { + EquipmentMaterialsName string `json:"equipment_materials_name"` + TotalNumber int `json:"total_number"` + TotalQuantityCount int `json:"total_quantity_count"` + CumulativeArrivalQuantity int `json:"cumulative_arrival_quantity"` +} + +// 传入项目ID,开始时间,结束时间返回 EquipmentMaterials 列表 +func GetEquipmentMaterials(projectID string, startAt, endAt string) ([]EquipmentMaterials, error) { + var list []EquipmentMaterials + + if err := dao.BusEquipmentMaterialsInventory.Ctx(context.Background()).As("bmi"). + Fields("bem.equipment_materials_name, SUM(bmi.number) AS total_number, SUM(bem.quantity_count) AS total_quantity_count, (SELECT SUM(bi.number) FROM `bus_equipment_materials_inventory` bi WHERE bi.equipment_materials_id = bmi.equipment_materials_id AND bi.deleted_at IS NULL AND bi.out_put = 2) AS cumulative_arrival_quantity"). + LeftJoin("bus_equipment_materials bem", "bmi.equipment_materials_id = bem.equipment_materials_id"). + Where("bem.project_id = ?", projectID). + Where("bmi.out_put = ?", 2). + Where("bmi.created_at >= ?", startAt). + Where("bmi.created_at <= ?", endAt). + Group("bem.equipment_materials_name"). + Scan(&list); err != nil { + return nil, err + } + + return list, nil +} diff --git a/third/excel/export.go b/third/excel/export.go new file mode 100644 index 0000000..33e0a14 --- /dev/null +++ b/third/excel/export.go @@ -0,0 +1,513 @@ +package excel + +import ( + "context" + "encoding/json" + "fmt" + "strconv" + "time" + + "github.com/samber/lo" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/xuri/excelize/v2" +) + +// 记录累计完成量和下一周计划量 +type ExcelInfo struct { + // 累计完成量 + Accumulated int + // 下一周计划量 + NextWeek int +} + +// 导出单个方阵 +func ExportExcel(fangZhenID string, startAt, endAt string) ([]*model.WorkStatusProgressRes, map[string]ExcelInfo, error) { + ctx := context.Background() + + type scheduler struct { + // 实体 + WorkStatus *entity.WorkSchedule + // 总进度 + FinishedPtr int + // 总量 + Total int + } + + type Schdule map[string]scheduler + + Get := func(scheduleMap Schdule, workID string) (int, int) { + if scheduler, ok := scheduleMap[workID]; ok { + return scheduler.FinishedPtr, scheduler.Total + } + return 0, 0 + } + + // 获取指定方阵ID的所有计划 + ScheduleData := []entity.WorkSchedule{} + if err := dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().FangzhenId, fangZhenID). + Scan(&ScheduleData); err != nil { + return nil, nil, err + } + + // 存储指定 workID 的累计完成量 + workMap := make(map[string]ExcelInfo) + + // 计算下一周的日期 + nextWeekStart := lo.Must(time.Parse("2006-01-02", startAt)).AddDate(0, 0, 7) + nextWeekEnd := lo.Must(time.Parse("2006-01-02", endAt)).AddDate(0, 0, 7) + + scheduleMap := make(Schdule) + // 遍历 ScheduleData 将数据按照 WorkID 分组 + lo.ForEach(ScheduleData, func(item entity.WorkSchedule, _ int) { + if work, ok := workMap[item.WorkId]; ok { + // 累加完成量 + work.Accumulated += item.FinishedNum + workMap[item.WorkId] = work + } else { + workMap[item.WorkId] = ExcelInfo{ + Accumulated: item.FinishedNum, + } + } + + // 如果计划处于下一周,则添加到下一周计划量中 + stime := lo.Must(time.Parse("2006-01-02", item.StartAt.Format("2006-01-02"))) + if stime.After(nextWeekStart) && stime.Before(nextWeekEnd) { + var scheduleDetails []model.WorkScheduleDetail + if err := json.Unmarshal([]byte(item.Detail), &scheduleDetails); err != nil { + return + } + + nextweekPlanNum := 0 + + for _, detail := range scheduleDetails { + // 如果 Date 大于开始时间并小于结束时间 + if detail.Date <= endAt { + nextweekPlanNum += detail.PlanNum + } + } + + work := workMap[item.WorkId] + work.NextWeek += nextweekPlanNum + workMap[item.WorkId] = work + } + + // 如果开始时间大于当前时间,则跳过 + startTime := item.StartAt.Format("Y-m-d") + if startTime > startAt { + return + } + + // 如果不存在则直接添加 + _, ok := scheduleMap[item.WorkId] + if !ok { + scheduleMap[item.WorkId] = scheduler{ + WorkStatus: &item, + } + } + + // 反序列化 item.Detail 字段 + var scheduleDetails []model.WorkScheduleDetail + if err := json.Unmarshal([]byte(item.Detail), &scheduleDetails); err != nil { + return + } + + lo.ForEach(scheduleDetails, func(detail model.WorkScheduleDetail, _ int) { + // 如果 Date 大于开始时间并小于结束时间 + if detail.Date <= endAt { + scheduler := scheduleMap[item.WorkId] + scheduler.Total += detail.PlanNum + scheduler.FinishedPtr += detail.FinishedNum + scheduleMap[item.WorkId] = scheduler + } + }) + }) + + // 获取指定方阵ID的所有项目 + workStatusList := []entity.WorkStatus{} + if err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, fangZhenID).Scan(&workStatusList); err != nil { + return nil, nil, err + } + + // 父列表 + parentList := []entity.WorkStatus{} + // 子列表,使用 map 存储,键为父元素的 ID + childrenMap := make(map[int][]entity.WorkStatus) + + // 遍历所有数据,将父级和子集分开 + for i := 0; i < len(workStatusList); i++ { + item := workStatusList[i] + if item.Parent == 0 { + parentList = append(parentList, item) + } else { + childrenMap[item.Parent] = append(childrenMap[item.Parent], item) + } + } + + index := 1 + + projectList := make([]*model.WorkStatusProgressRes, 0, len(parentList)) + // 遍历父级,将子集添加到父级的字段中 + for _, parent := range parentList { + projectItem := model.WorkStatusProgressRes{ + ID: index, + WorkID: parent.WorkId, + Startat: parent.StartAt.String(), + Endat: parent.EndAt.String(), + Name: parent.WorkName, + Total: parent.Total, + Finished: parent.Finished, + Status: parent.Status, + WorkType: parent.Type, + Children: make([]model.WorkStatusProgressRes, 0, len(workStatusList)), + } + index++ + + // 子类的总量和完成量 + var subTotal, subDone int + + // 从 map 中获取子元素,将子元素添加到父元素的字段中 + for _, child := range childrenMap[int(parent.Id)] { + // 如果计划数量等于实际数量,且原状态非3,则更新状态为2 + if child.Total == child.Finished && child.Status != 3 { + // 并且 total,finished 不为 0 + if child.Total != 0 && child.Finished != 0 { + child.Status = 2 + } + } + + // 根据 WorkID 获取计划总量和实际进度 + finishedPtr, total := Get(scheduleMap, child.WorkId) + + subTotal += child.Total + subDone += child.Finished + + projectItem.Children = append(projectItem.Children, model.WorkStatusProgressRes{ + ID: index, + WorkID: child.WorkId, + Startat: child.StartAt.String(), + Endat: child.EndAt.String(), + Name: child.WorkName, + Total: child.Total, + Finished: child.Finished, + IsPercent: child.IsPercent, + Status: child.Status, + WorkType: child.Type, + PlanProgress: &model.PlanProgress{ + Finished: &finishedPtr, + Total: &total, + }, + }) + index++ + } + + // 修改父项目的总量和进度 + projectItem.Total = subTotal + projectItem.Finished = subDone + + projectList = append(projectList, &projectItem) + } + + return projectList, workMap, nil +} + +// 导出一个子项目 +func AccumulateProject(subProjectID string, startAt, endAt string) ([]*model.WorkStatusProgressRes, map[string]ExcelInfo, error) { + fangzhenList := []entity.QianqiFangzhen{} + if err := dao.QianqiFangzhen.Ctx(context.Background()). + Where(dao.QianqiFangzhen.Columns().ProjectId, subProjectID).Scan(&fangzhenList); err != nil { + return nil, nil, err + } + + cumulativeProjects := []*model.WorkStatusProgressRes{} + + // 用于判断是否为第一次迭代 + firstTime := true + + excelMap := make(map[string]ExcelInfo) + + // 遍历项目列表 + for index := 0; index < len(fangzhenList); index++ { + // 获取当前项目 + project := fangzhenList[index] + + // 获取当前项目的子项目 + childProjects, emap, err := ExportExcel(strconv.Itoa(project.Id), startAt, endAt) + if err != nil { + return nil, nil, err + } + + excelMap = lo.Assign(emap, excelMap) + + // 如果是第一次迭代,将子项目列表赋值给累积项目列表 + if firstTime { + cumulativeProjects = childProjects + // 更新标志变量,表示已经不是第一次迭代 + firstTime = false + continue + } + + // 遍历子项目列表 + for childIndex := 0; childIndex < len(childProjects); childIndex++ { + // 获取当前子项目和对应的累积项目 + singleChild := childProjects[childIndex] + cumulativeChild := cumulativeProjects[childIndex] + + // 更新累积项目的总数和完成数 + cumulativeChild.Total += singleChild.Total + cumulativeChild.Finished += singleChild.Finished + + // 如果当前子项目还有子项目,也进行同样的操作 + if len(singleChild.Children) > 0 { + for subChildIndex := 0; subChildIndex < len(singleChild.Children); subChildIndex++ { + // 获取当前子项目的子项目和对应的累积项目 + singleSubChild := singleChild.Children[subChildIndex] + cumulativeSubChild := cumulativeChild.Children[subChildIndex] + + // 更新累积项目的总数和完成数 + cumulativeSubChild.Total += singleSubChild.Total + cumulativeSubChild.Finished += singleSubChild.Finished + } + } + } + } + + return cumulativeProjects, excelMap, nil +} + +// 传递一个 []*model.WorkStatusProgressRes,将数据写入到 excel 中 +func WriteExcel(tableName string, list []*model.WorkStatusProgressRes, aiResult map[string]int) (*excelize.File, error) { + f, err := excelize.OpenFile("resource/template.xlsx") + if err != nil { + return nil, err + } + + // 创建一个工作表 + sheetName := "Sheet1" + + headerPrefixes := []string{"一、", "二、", "三、", "四、", "五、", "六、", "七、", "八、", "九、", "十、", "十一、", "十二、"} + childPrefixes := []string{"1、", "2、", "3、", "4、", "5、", "6、", "7、", "8、", "9、", "10、", "11、", "12、"} + + // 修改表头 + f.SetCellValue(sheetName, "A1", tableName) + + // 遍历 list + rowIndex := 3 + lo.ForEach(list, func(item *model.WorkStatusProgressRes, index int) { + setExcelValues(f, sheetName, rowIndex, item, headerPrefixes[index], aiResult) + rowIndex++ + + // 遍历子集 + lo.ForEach(item.Children, func(child model.WorkStatusProgressRes, childIndex int) { + setExcelValues(f, sheetName, rowIndex, &child, childPrefixes[childIndex], aiResult) + rowIndex++ + }) + }) + + return f, nil +} + +func setExcelValues(f *excelize.File, sheetName string, i int, item *model.WorkStatusProgressRes, prefix string, aiResult map[string]int) { + // 单元格 A + f.SetCellValue(sheetName, fmt.Sprintf("A%d", i), prefix+item.Name) // 父名 + f.SetCellValue(sheetName, fmt.Sprintf("B%d", i), item.Total) // 总量 + f.SetCellValue(sheetName, fmt.Sprintf("C%d", i), item.Finished) // 完成 + + var percentComplete float64 + if item.Total != 0 { + percentComplete = float64(item.Finished) / float64(item.Total) * 100 + } else { + percentComplete = 0 + } + f.SetCellValue(sheetName, fmt.Sprintf("D%d", i), fmt.Sprintf("%.f%%", percentComplete)) // 总量完成百分比 + + if item.PlanProgress != nil { + total := 0 + if item.PlanProgress.Total != nil { + total = *item.PlanProgress.Total + } + f.SetCellValue(sheetName, fmt.Sprintf("E%d", i), total) // 计划量 + + // AI 填报数量 F + // 用 workID 作为 key,获取 aiResult 中的值,如果不存在则为 0 + aiResultValue := aiResult[item.WorkID] + f.SetCellValue(sheetName, fmt.Sprintf("F%d", i), aiResultValue) + + finished := 0 + if item.PlanProgress.Finished != nil { + finished = *item.PlanProgress.Finished + } + f.SetCellValue(sheetName, fmt.Sprintf("G%d", i), finished) // 计划完成量 + + var plannedPercentComplete float64 + if item.PlanProgress != nil && item.PlanProgress.Finished != nil && item.PlanProgress.Total != nil && *item.PlanProgress.Total != 0 { + plannedPercentComplete = float64(*item.PlanProgress.Finished) / float64(*item.PlanProgress.Total) * 100 + } else { + plannedPercentComplete = 0 + } + + f.SetCellValue(sheetName, fmt.Sprintf("H%d", i), fmt.Sprintf("%.f%%", plannedPercentComplete)) // 计划完成百分比 + } +} + +// 根据方阵ID获取子项目名 +func GetSubProjectName(fangZhenID string) (string, string) { + // select sb.project_name + // from sub_project as sb + // left join qianqi_fangzhen as qf on qf.project_id = sb.id + // where qf.id = 1959; + + result, err := dao.SubProject.Ctx(context.Background()).As("sb"). + Where("qf.id", fangZhenID). + InnerJoin("qianqi_fangzhen as qf", "qf.project_id = sb.id"). + Fields("sb.project_name,qf.name").All() + if err != nil { + return "", "" + } + + // 获取子项目名 + subProjectName := result[0].GMap().Get("project_name").(string) + // 方阵名 + fangZhenName := result[0].GMap().Get("name").(string) + + return subProjectName, fangZhenName +} + +// 根据子项目ID获取其主项目名和子项目名 +func GetNameById(subProjectID string) (string, string) { + // select sp.project_name as projectName,sb.project_name as subProjectName + // from sys_project as sp + // inner join sub_project as sb on sb.project_id = sp.id + // where sb.id = 23; + + result, err := dao.SubProject.Ctx(context.Background()).As("sb"). + Where("sb.id", subProjectID). + InnerJoin("sys_project as sp", "sb.project_id = sp.id"). + Fields("sp.project_name as projectName,sb.project_name as subProjectName").All() + if err != nil { + return "", "" + } + + // 获取主项目名 + projectName := result[0].GMap().Get("projectName").(string) + // 获取子项目名 + subProjectName := result[0].GMap().Get("subProjectName").(string) + + return projectName, subProjectName +} + +func SetExcelValue(f *excelize.File, sheetName string, index int, item model.WorkStatusProgressRes, excelmap map[string]ExcelInfo, postionName string) { + // 设计数量 F10 + total := item.Total + // 本周完成量 G10 + finished := item.Finished + + // 累计完成量和下周计划量 + accumulated, nextWeek := 0, 0 + + if data, exists := excelmap[item.WorkID]; exists { + accumulated = data.Accumulated + nextWeek = data.NextWeek + } + + // 累计完成百分比 单元格 I10 + percentComplete := 0.0 + if total != 0 { + percentComplete = float64(accumulated) / float64(total) * 100 + } + + // 名称 + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", "C", index), item.Name) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", "C", index), fmt.Sprintf("%s%d", "C", index), lo.Must(f.NewStyle(Style))) + + // 位置 + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", "D", index), postionName) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", "D", index), fmt.Sprintf("%s%d", "D", index), lo.Must(f.NewStyle(Style))) + + // 单位 样式 + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", "E", index), fmt.Sprintf("%s%d", "E", index), lo.Must(f.NewStyle(Style))) + + // 设计数量 + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", "F", index), total) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", "F", index), fmt.Sprintf("%s%d", "F", index), lo.Must(f.NewStyle(Style))) + + // 本周 + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", "G", index), finished) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", "G", index), fmt.Sprintf("%s%d", "G", index), lo.Must(f.NewStyle(Style))) + + // 累计完成量 + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", "H", index), accumulated) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", "H", index), fmt.Sprintf("%s%d", "H", index), lo.Must(f.NewStyle(Style))) + + // 累计完成百分比 + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", "I", index), fmt.Sprintf("%.f%%", percentComplete)) + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", "I", index), fmt.Sprintf("%s%d", "I", index), lo.Must(f.NewStyle(Style))) + + // 合并 jk 单元格 + _ = f.MergeCell(sheetName, fmt.Sprintf("J%d", index), fmt.Sprintf("K%d", index)) + f.SetCellStyle(sheetName, fmt.Sprintf("J%d", index), fmt.Sprintf("K%d", index), lo.Must(f.NewStyle(Style))) + + // 水平居中 jk 单元格 + f.SetCellStyle(sheetName, fmt.Sprintf("J%d", index), fmt.Sprintf("K%d", index), lo.Must(f.NewStyle(&excelize.Style{ + Border: []excelize.Border{ + {Type: "left", Color: "000000", Style: 1}, + {Type: "top", Color: "000000", Style: 1}, + {Type: "bottom", Color: "000000", Style: 1}, + {Type: "right", Color: "000000", Style: 1}, + }, + Fill: excelize.Fill{}, + Font: nil, + Alignment: &excelize.Alignment{ + Horizontal: "center", // 水平居中 + Indent: 0, + JustifyLastLine: false, + ReadingOrder: 0, + RelativeIndent: 0, + ShrinkToFit: false, + TextRotation: 0, + Vertical: "", // 垂直居中 + WrapText: false, + }, + }))) + + // 下周计划量 + f.SetCellValue(sheetName, fmt.Sprintf("%s%d", "J", index), nextWeek) + + // L + f.SetCellStyle(sheetName, fmt.Sprintf("%s%d", "L", index), fmt.Sprintf("%s%d", "L", index), lo.Must(f.NewStyle(Style))) +} + +func GetWeekNumbers(endTime string) (int, error) { + end, err := time.Parse(time.DateOnly, endTime) + if err != nil { + return 0, fmt.Errorf("解析结束时间错误: %w", err) + } + + _, endWeek := end.ISOWeek() + + return endWeek, nil +} + +func CalculateTotalProgress(list []*model.WorkStatusProgressRes) float64 { + var totalFinished, total int + + var calculate func(w model.WorkStatusProgressRes) + calculate = func(w model.WorkStatusProgressRes) { + totalFinished += w.Finished + total += w.Total + for _, child := range w.Children { + calculate(child) + } + } + + for _, item := range list { + calculate(*item) + } + + if total == 0 { + return 0 + } + + return (float64(totalFinished) / float64(total)) * 100 +} diff --git a/third/excel/template.go b/third/excel/template.go new file mode 100644 index 0000000..03d13cb --- /dev/null +++ b/third/excel/template.go @@ -0,0 +1,302 @@ +package excel + +import ( + "regexp" + "strconv" + "strings" + + "github.com/xuri/excelize/v2" +) + +var ( + GlobalStyle int // 全局样式 + GlobalStyleBold int // 基于GlobalStyle的 加粗 + GlobalStyleBoldSize int // 基于GlobalStyle的 加粗 加字体大小 +) + +var Style = &excelize.Style{ + // 边框 + Border: []excelize.Border{ + {Type: "left", Color: "000000", Style: 1}, + {Type: "top", Color: "000000", Style: 1}, + {Type: "bottom", Color: "000000", Style: 1}, + {Type: "right", Color: "000000", Style: 1}, + }, + // 居中 + Alignment: &excelize.Alignment{ + Vertical: "center", // 上下居中 + Horizontal: "center", // 左右居中 + WrapText: true, // 自动换行 + }, +} + +const ( + excelName = "Book1.xlsx" + sheetName = "Sheet1" +) + +func styleFunc(f *excelize.File) { + baseStyle := excelize.Style{ + Border: []excelize.Border{ + {Type: "left", Color: "000000", Style: 1}, + {Type: "top", Color: "000000", Style: 1}, + {Type: "bottom", Color: "000000", Style: 1}, + {Type: "right", Color: "000000", Style: 1}, + }, + Alignment: &excelize.Alignment{ + Vertical: "center", + Horizontal: "center", + WrapText: true, + }, + } + + font := excelize.Font{ + Color: "#262626", + Bold: true, + } + + // 创建全局样式 + GlobalStyle, _ = f.NewStyle(&baseStyle) + + // 创建加粗样式 + baseStyle.Font = &font + GlobalStyleBold, _ = f.NewStyle(&baseStyle) + + // 创建加粗加字体大小样式 + font.Size = 12 + baseStyle.Font = &font + GlobalStyleBoldSize, _ = f.NewStyle(&baseStyle) +} + +// @Title cellMerge +// @Description 合并单元格 +// @Author 铁憨憨[cory] 2024-10-18 14:20:40 +// @Param f +// @Param qie 单元格切片 +// @Param qie 影响行(height高度相关) +// @Param height 单元格高度(0隐藏当前行 -1取消自定义高度 其他单元格高度) +// @Param style 样式 +// @Param str 单元格值 +func cellMerge(f *excelize.File, qie []string, height float64, style int, str string) { + if len(qie) > 1 { + f.MergeCell(sheetName, qie[0], qie[1]) // 合并单元格 + } + f.SetCellStyle(sheetName, qie[0], qie[len(qie)-1], style) // 设置样式 + + if height != -1 { + re := regexp.MustCompile("[0-9]+") + rowStr := strings.Join(re.FindAllString(qie[0], -1), "") + if rowNum, err := strconv.Atoi(rowStr); err == nil { + f.SetRowHeight(sheetName, rowNum, height) // 设置行高 + } + } + + f.SetCellValue(sheetName, qie[0], str) // 设置单元格的值 +} + +// 创建一个基础的 Excel 模板返回 *excelize.File +func CreateExcelTemplate() (*excelize.File, error) { + f := excelize.NewFile() + defer f.Close() + + // 初始化样式 + styleFunc(f) + + // 初始化单元格布局 + businessFunc(f) + + index, err := f.NewSheet(sheetName) + if err != nil { + return nil, err + } + + f.SetActiveSheet(index) + + return f, nil +} + +func businessFunc(f *excelize.File) { + // 一、 + one := []string{"A1", "L1"} + cellMerge(f, one, 64, GlobalStyleBoldSize, "兴义市捧乍猪场坪农业光伏电站项目EPC总承包项目周报") + // 二、 + two := []string{"A2", "B2"} + cellMerge(f, two, 30, GlobalStyle, "项目名称:") + two2 := []string{"C2", "G2"} + cellMerge(f, two2, -1, GlobalStyle, "兴义市捧乍猪场坪农业光伏电站项目EPC总承包项目") + two3 := []string{"H2"} + cellMerge(f, two3, -1, GlobalStyleBold, "周报期数") + two4 := []string{"I2"} + cellMerge(f, two4, -1, GlobalStyle, "53") + two5 := []string{"J2", "J3"} + cellMerge(f, two5, -1, GlobalStyle, "日期:") + two6 := []string{"K2", "L3"} + cellMerge(f, two6, -1, GlobalStyle, "2024.10.05-2024.10.11") + // 三、 + three := []string{"A3"} + cellMerge(f, three, -1, GlobalStyle, "序号") + three2 := []string{"B3", "I3"} + cellMerge(f, three2, -1, GlobalStyle, "工程实施主要情况") + // 四、 + four := []string{"A4"} + cellMerge(f, four, -1, GlobalStyle, "1") + four2 := []string{"B4"} + cellMerge(f, four2, -1, GlobalStyle, "项目基本信息") + four3 := []string{"C4"} + cellMerge(f, four3, -1, GlobalStyle, "装机容量:") + four4 := []string{"D4", "E4"} + cellMerge(f, four4, -1, GlobalStyle, "开工日期:2022-08-15") + four5 := []string{"F4", "H4"} + cellMerge(f, four5, -1, GlobalStyle, "计划并网日期:") + four6 := []string{"I4"} + cellMerge(f, four6, -1, GlobalStyle, "总进度完成:") + four7 := []string{"J4", "L4"} + cellMerge(f, four7, -1, GlobalStyle, "96.5%") + // 五、 + five := []string{"A5"} + cellMerge(f, five, -1, GlobalStyle, "2") + five2 := []string{"B5"} + cellMerge(f, five2, -1, GlobalStyle, "本周完成主要形象进度") + five3 := []string{"C5", "L5"} + cellMerge(f, five3, -1, GlobalStyle, "") + // 六、 + six := []string{"A6"} + cellMerge(f, six, -1, GlobalStyle, "3") + six2 := []string{"B6"} + cellMerge(f, six2, -1, GlobalStyle, "下周计划主要形象进度") + six3 := []string{"C6", "L6"} + cellMerge(f, six3, -1, GlobalStyle, "") + // 七、 + seven := []string{"A7"} + cellMerge(f, seven, -1, GlobalStyle, "4") + seven2 := []string{"B7"} + cellMerge(f, seven2, -1, GlobalStyle, "质量(施工质量、设备材料到货验收)情况") + seven3 := []string{"C7", "L7"} + cellMerge(f, seven3, -1, GlobalStyle, "") + // 八、 + eight := []string{"A8"} + cellMerge(f, eight, -1, GlobalStyle, "5") + eight2 := []string{"B8"} + cellMerge(f, eight2, -1, GlobalStyle, "人员到位情况及施工器具") + eight3 := []string{"C8", "L8"} + cellMerge(f, eight3, -1, GlobalStyle, "") + // 九、 + nine := []string{"A9", "A23"} + cellMerge(f, nine, -1, GlobalStyle, "6") + nine2 := []string{"B9", "B23"} + cellMerge(f, nine2, -1, GlobalStyle, "") + nine3 := []string{"C9"} + cellMerge(f, nine3, -1, GlobalStyle, "名称") + nine4 := []string{"D9"} + cellMerge(f, nine4, -1, GlobalStyle, "位置") + nine5 := []string{"E9"} + cellMerge(f, nine5, -1, GlobalStyle, "单位") + nine6 := []string{"F9"} + cellMerge(f, nine6, -1, GlobalStyle, "设计数量") + nine7 := []string{"G9"} + cellMerge(f, nine7, -1, GlobalStyle, "本周完成情况") + nine8 := []string{"H9"} + cellMerge(f, nine8, -1, GlobalStyle, "累计完成量") + nine9 := []string{"I9"} + cellMerge(f, nine9, -1, GlobalStyle, "累计完成率") + nine10 := []string{"J9", "K9"} + cellMerge(f, nine10, -1, GlobalStyle, "下周计划完成") + nine11 := []string{"L9"} + cellMerge(f, nine11, -1, GlobalStyle, "备注") + // 十 + ten := []string{"B10", "B23"} + cellMerge(f, ten, -1, GlobalStyle, "施工进度(根据项目类型及进度情况自行分项,不用太细,能体现整体进度即可)") + ten2 := []string{"C10"} + cellMerge(f, ten2, -1, GlobalStyle, "基础") + ten3 := []string{"D10"} + cellMerge(f, ten3, -1, GlobalStyle, "光伏区") + ten4 := []string{"E10"} + cellMerge(f, ten4, -1, GlobalStyle, "个") + ten5 := []string{"F10"} + cellMerge(f, ten5, -1, GlobalStyle, "45450") + ten6 := []string{"G10"} + cellMerge(f, ten6, -1, GlobalStyle, "1415") + ten7 := []string{"H10"} + cellMerge(f, ten7, -1, GlobalStyle, "15445") + ten8 := []string{"I10"} + cellMerge(f, ten8, -1, GlobalStyle, "90") + ten9 := []string{"J10", "K10"} + cellMerge(f, ten9, -1, GlobalStyle, "545") + ten10 := []string{"L10"} + cellMerge(f, ten10, -1, GlobalStyle, "备注") + // 二十四、 + twentyFour := []string{"A24", "A41"} + cellMerge(f, twentyFour, -1, GlobalStyle, "7") + twentyFour2 := []string{"B24", "B41"} + cellMerge(f, twentyFour2, -1, GlobalStyle, "主要设备材料到货情况(列出主要材料即可)") + twentyFour3 := []string{"C24"} + cellMerge(f, twentyFour3, -1, GlobalStyle, "设备材料名称") + twentyFour4 := []string{"D24"} + cellMerge(f, twentyFour4, -1, GlobalStyle, "") + twentyFour5 := []string{"E24"} + cellMerge(f, twentyFour5, -1, GlobalStyle, "单位") + twentyFour6 := []string{"F24"} + cellMerge(f, twentyFour6, -1, GlobalStyle, "设计数量") + twentyFour7 := []string{"G24"} + cellMerge(f, twentyFour7, -1, GlobalStyle, "本周到货量") + twentyFour8 := []string{"H24"} + cellMerge(f, twentyFour8, -1, GlobalStyle, "累计到货量") + twentyFour9 := []string{"I24"} + cellMerge(f, twentyFour9, -1, GlobalStyle, "累计到货率") + twentyFour10 := []string{"J24", "K24"} + cellMerge(f, twentyFour10, -1, GlobalStyle, "计划到货日期") + twentyFour11 := []string{"L24"} + cellMerge(f, twentyFour11, -1, GlobalStyle, "备注") + // 二十五 + twentyFive2 := []string{"C25"} + cellMerge(f, twentyFive2, -1, GlobalStyle, "角钢") + twentyFive3 := []string{"D25"} + cellMerge(f, twentyFive3, -1, GlobalStyle, "") + twentyFive4 := []string{"E25"} + cellMerge(f, twentyFive4, -1, GlobalStyle, "") + twentyFive5 := []string{"F25"} + cellMerge(f, twentyFive5, -1, GlobalStyle, "") + twentyFive6 := []string{"G25"} + cellMerge(f, twentyFive6, -1, GlobalStyle, "") + twentyFive7 := []string{"H25"} + cellMerge(f, twentyFive7, -1, GlobalStyle, "") + twentyFive8 := []string{"I25"} + cellMerge(f, twentyFive8, -1, GlobalStyle, "90") + twentyFive9 := []string{"J25", "K25"} + cellMerge(f, twentyFive9, -1, GlobalStyle, "") + twentyFive10 := []string{"L25"} + cellMerge(f, twentyFive10, -1, GlobalStyle, "") + // 四十二 + fortyTwo := []string{"A42"} + cellMerge(f, fortyTwo, -1, GlobalStyle, "8") + fortyTwo2 := []string{"B42"} + cellMerge(f, fortyTwo2, -1, GlobalStyle, "存在问题及需要协调的事项") + fortyTwo3 := []string{"C42", "L42"} + cellMerge(f, fortyTwo3, -1, GlobalStyle, "无") + // 四十三 + fortyThree := []string{"A43"} + cellMerge(f, fortyThree, 90, GlobalStyle, "9") + fortyThree2 := []string{"B43"} + cellMerge(f, fortyThree2, -1, GlobalStyle, "照片") + fortyThree3 := []string{"C43", "E43"} + cellMerge(f, fortyThree3, -1, GlobalStyle, "") + fortyThree4 := []string{"F43", "H43"} + cellMerge(f, fortyThree4, -1, GlobalStyle, "") + fortyThree5 := []string{"I43", "L43"} + cellMerge(f, fortyThree5, -1, GlobalStyle, "") + // 四十四 + fortyFour := []string{"A44"} + cellMerge(f, fortyFour, -1, GlobalStyle, "10") + fortyFour2 := []string{"B44"} + cellMerge(f, fortyFour2, -1, GlobalStyle, "填报:") + fortyFour3 := []string{"C44", "L44"} + cellMerge(f, fortyFour3, -1, GlobalStyleBold, "审核:") + + // 整体样式,不需要动 + f.SetColWidth(sheetName, "A", "A", 8) + f.SetColWidth(sheetName, "B", "B", 11) + f.SetColWidth(sheetName, "C", "C", 26) + f.SetColWidth(sheetName, "D", "D", 26) + f.SetColWidth(sheetName, "H", "H", 13) + f.SetCellStyle(sheetName, "A1", "B44", GlobalStyleBold) // 注意:B44到时候需要取excel最大行数 +} diff --git a/third/isc/api.go b/third/isc/api.go new file mode 100644 index 0000000..f88e220 --- /dev/null +++ b/third/isc/api.go @@ -0,0 +1,32 @@ +package isc + +type camera struct { + CameraIndexCode string `json:"cameraIndexCode"` + CameraName string `json:"cameraName"` + Marker_id string `json:"marker_id"` + Status int `json:"status"` +} + +var ca Camera +var cameras []Camera + +var DbCameraMap = make(map[string]camera) + +func InitIscApi() { + //getAllCameraFromDb() + //getCameraFromIsc() + //GetStatusList() + //createTimer() + + //GetCameraList(1, 20) +} + +type Ret struct { + Code int `json:"code"` + Msg string `json:"msg"` + Data interface{} `json:"data"` +} + +func getCameraFromIsc() { + GetCameraList(1, 1000) +} diff --git a/third/isc/isc_auth.go b/third/isc/isc_auth.go new file mode 100644 index 0000000..a2f7dd0 --- /dev/null +++ b/third/isc/isc_auth.go @@ -0,0 +1,263 @@ +package isc + +import ( + "bytes" + "crypto/hmac" + "crypto/sha256" + "crypto/tls" + "encoding/base64" + "encoding/json" + "fmt" + "io/ioutil" + "math/rand" + "net/http" + "strconv" + "strings" + "time" +) + +var AppKey = "22422818" //海康平台的key +var AppSecret = "smyUkLf2Rd9VOkLV9Ndv" + +//var AppKey = "22422818" //海康平台的key +//var AppSecret = "smyUkLf2Rd9VOkLV9Ndv" + +var Protocol = "https://" +var HOST = "192.168.1.153" +var PORT = "2443" +var reqError = "2003" +var reqErrorMsg = "请求失败" +var Ok = "0" +var Method = "POST" + +func GetStatusList() { + config := map[string]interface{}{} + config["includeSubNode"] = 1 + config["pageNo"] = 1 + config["pageSize"] = 1000 + config["regionId"] = "root000000" + //config["indexCodes"] = []string{"7cbd5a4c2dab46579b09c297cf649721", "7ec4f9689dc1466d813c801a5a0686b2"} + t := CameraStatus{Code: reqError, Msg: reqErrorMsg} + //content, _ := request("/api/nms/v1/online/camera/get", config) + content, _ := request("/api/nms/v1/online/camera/get", config) + fmt.Println("获取设备状态") + _ = json.Unmarshal([]byte(content), &t) + for _, v := range t.Data.List { + if ca, ok := DbCameraMap[v.IndexCode]; ok { + ca.Status = v.Online + DbCameraMap[v.IndexCode] = ca + } + //fmt.Println("v.Cn", v.Cn) + //fmt.Println("v.Online", v.Online) + //fmt.Println("v.DeviceIndexCode", v.DeviceIndexCode) + //fmt.Println("v.IndexCode", v.IndexCode) + //fmt.Println("v.CollectTime", v.CollectTime) + //fmt.Println("************************") + } + +} + +/*抓图接口*/ +func ManualCapture(cameraIndexCode string) CameraCap { + config := map[string]interface{}{} + config["cameraIndexCode"] = cameraIndexCode + t := CameraCap{Code: reqError, Msg: reqErrorMsg} + content, _ := request("/api/video/v1/manualCapture", config) + _ = json.Unmarshal([]byte(content), &t) + return t +} + +/* +云台控制 +action number 0-开始 ,1-停止 +注:GOTO_PRESET命令下填任意值均可转到预置点,建议填0即可 +command string 不区分大小写 +说明: +LEFT 左转 +RIGHT右转 +UP 上转 +DOWN 下转 +ZOOM_IN 焦距变大 +ZOOM_OUT 焦距变小 +LEFT_UP 左上 +LEFT_DOWN 左下 +RIGHT_UP 右上 +RIGHT_DOWN 右下 +FOCUS_NEAR 焦点前移 +FOCUS_FAR 焦点后移 +IRIS_ENLARGE 光圈扩大 +IRIS_REDUCE 光圈缩小 +WIPER_SWITCH 接通雨刷开关 +START_RECORD_TRACK 开始记录轨迹 +STOP_RECORD_TRACK 停止记录轨迹 +START_TRACK 开始轨迹 +STOP_TRACK 停止轨迹; +以下命令presetIndex不可为空: +GOTO_PRESET到预置点 +*/ +func CtrlPtz(cameraIndexCode string, action int, command string) Usual { + config := map[string]interface{}{} + config["cameraIndexCode"] = cameraIndexCode + config["action"] = action + config["command"] = command + config["speed"] = 50 //默认速度为50 + t := Usual{Code: reqError, Msg: reqErrorMsg} + content, _ := request("/api/video/v1/ptzs/controlling", config) + _ = json.Unmarshal([]byte(content), &t) + return t +} + +/*获取对讲地址*/ +func GettalkURLs(cameraIndexCode string) CameraTalk { + config := map[string]interface{}{} + config["cameraIndexCode"] = cameraIndexCode + config["protocol"] = "ws" + t := CameraTalk{Code: reqError, Msg: reqErrorMsg} + content, _ := request("/api/video/v1/cameras/talkURLs", config) + _ = json.Unmarshal([]byte(content), &t) + return t +} + +/*获取预览地址 ws协议*/ +func GetpreviewURLs(cameraIndexCode string) CameraPreview { + config := map[string]interface{}{} + config["cameraIndexCode"] = cameraIndexCode + config["protocol"] = "ws" + t := CameraPreview{Code: reqError, Msg: reqErrorMsg} + content, _ := request("/api/video/v1/cameras/previewURLs", config) + //fmt.Println(api) + //content, _ := request(api, config) + fmt.Println(content) + _ = json.Unmarshal([]byte(content), &t) + return t +} + +/*获取监控点列表*/ +func GetCameraList(pageNo, pageSize int) { + fmt.Println("开始获取第一页数据") + config := map[string]interface{}{} + config["pageNo"] = pageNo + config["pageSize"] = pageSize + t := CameraData{Code: reqError, Msg: reqErrorMsg} + content, err := request("/api/resource/v1/cameras", config) + if err != nil { + return + } + fmt.Println("数据完成") + fmt.Println(content) + err = json.Unmarshal([]byte(content), &t) + if err != nil { + fmt.Println("数据反序列化失败") + fmt.Println(err) + return + } + if t.Code == Ok { + fmt.Println("监控点总数", t.Data.Total) + fmt.Println("页码", t.Data.PageNo) + fmt.Println("当前页数量", t.Data.PageSize) + //fmt.Println(t.Data.List) + for _, v := range t.Data.List { + fmt.Println(v.CameraIndexCode, v.Name, v.Status) + //if v.Status == 1 { + // ca = v + //} + } + } else { + fmt.Println("数据获取失败") + fmt.Println(t) + } + +} + +// 请求 +func request(url string, body map[string]interface{}) (string, error) { + configData, _ := json.Marshal(body) + param := bytes.NewBuffer(configData) + tr := &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + } + client := &http.Client{Transport: tr} + url = "/artemis" + url + headers, _ := getSignature(url, Method) + url = Protocol + HOST + ":" + PORT + url + fmt.Println(url) + + // 2. 创建请求实例 + req, err := http.NewRequest(Method, url, param) + if err != nil { + panic(err) + } + //header + + for i := 0; i < len(headers); i++ { + //fmt.Println(headers[i].Key, headers[i].Val) + req.Header.Add(headers[i].Key, headers[i].Val) + } + //发送请求 + res, err := client.Do(req) + if err != nil { + return "", err + } + defer res.Body.Close() + content, err := ioutil.ReadAll(res.Body) + if err != nil { + return "", err + } + return string(content), nil +} +func getSignature(url, method string) ([]Header, string) { + var now = time.Now() + var headers = []Header{ + {Key: "Accept", Val: "*/*"}, + {Key: "Content-Type", Val: "application/json"}, + {Key: "Date", Val: now.Format("2006-01-02 15:04:05")}, + {Key: "x-ca-key", Val: AppKey, Use: true}, + {Key: "x-ca-nonce", Val: RandAllString(32), Use: true}, + {Key: "x-ca-timestamp", Val: strconv.Itoa(int(now.UnixNano() / 1e6)), Use: true}, + } + var arr = append(headers, Header{Key: "url", Val: url}) + var arr2 = append([]Header{{Val: method, Key: "method"}}, arr...) + var str []string + for i := 0; i < len(arr2); i++ { + if arr2[i].Use { + str = append(str, arr2[i].Key+":"+arr2[i].Val) + } else { + str = append(str, arr2[i].Val) + } + } + sign := ComputeHmac256(strings.Join(str, "\n"), AppSecret) + headers = append(headers, Header{Key: "x-ca-signature-headers", Val: "x-ca-key,x-ca-nonce,x-ca-timestamp"}, Header{Key: "x-ca-signature", Val: sign}) + return headers, sign +} + +func ComputeHmac256(message string, secret string) string { + key := []byte(secret) + h := hmac.New(sha256.New, key) + h.Write([]byte(message)) + return base64.StdEncoding.EncodeToString(h.Sum(nil)) +} + +type Header struct { + Key string `json:"key"` + Val string `json:"val"` + Use bool `json:"use"` +} + +/* +RandAllString 生成随机字符串([a~zA~Z0~9]) + + lenNum 长度 +*/ +func RandAllString(lenNum int) string { + var CHARS = []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", + "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", + "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"} + + str := strings.Builder{} + length := len(CHARS) + for i := 0; i < lenNum; i++ { + l := CHARS[rand.Intn(length)] + str.WriteString(l) + } + return str.String() +} diff --git a/third/isc/struct.go b/third/isc/struct.go new file mode 100644 index 0000000..e0a7a0c --- /dev/null +++ b/third/isc/struct.go @@ -0,0 +1,92 @@ +package isc + +// 通用结构体 +type Usual struct { + Code string `json:"code"` + Msg string `json:"msg"` + Data interface{} `json:"data"` +} +type Camera struct { + CameraIndexCode string `json:"cameraIndexCode"` //监控点编号 + Name string `json:"name"` //监控点名称 + CameraType int `json:"cameraType"` //监控点类型 + CameraTypeName string `json:"cameraTypeName"` //监控点类型名称 + Longitude string `json:"longitude"` //监控点类型名称 + Latitude string `json:"latitude"` //监控点类型名称 + Altitude string `json:"altitude"` //监控点类型名称 + ChannelNo string `json:"channelNo"` //监控点类型名称 + Status int `json:"status"` //监控点在线状态 在线状态(0-未知,1-在线,2-离线),扩展字段,暂不使用 +} + +// 监控点列表信息结构 +type CameraData struct { + Code string `json:"code"` + Msg string `json:"msg"` + Data struct { + Total int `json:"total"` + PageNo int `json:"pageNo"` + PageSize int `json:"pageSize"` + List []Camera `json:"list"` + } `json:"data"` +} + +// 监控点的预览接口返回值结构 +type CameraPreview struct { + Code string `json:"code"` + Msg string `json:"msg"` + Data struct { + Url string `json:"url"` + } `json:"data"` +} + +//监控点的对讲接口返回值结构 + +type CameraTalk struct { + Code string `json:"code"` + Msg string `json:"msg"` + Data struct { + Url string `json:"url"` + } `json:"data"` +} + +//监控点的抓图接口返回值结构 + +type CameraCap struct { + Code string `json:"code"` + Msg string `json:"msg"` + Data struct { + PicUrl string `json:"picUrl"` + } `json:"data"` +} + +// 监控点的在线状态接口返回值结构 +type statusList struct { + Online int `json:"online"` + IndexCode string `json:"indexCode"` + DeviceIndexCode string `json:"deviceIndexCode"` + Cn string `json:"cn"` + CollectTime string `json:"collectTime"` + //"deviceType": "HIK%2FDS-9116HW-ST%2F-AF-DVR", + //"deviceIndexCode": null, + //"regionIndexCode": "ce91c758-5af4-4539-845a", + //"collectTime": "2018-12-28T10:21:40.000+08:00", + //"regionName": "NMS自动化", + //"indexCode": "82896441ced946d5a51c6d6ca8e65851", + //"cn": "Onvif-IPC(10.67.172.13 )", + //"treatyType": "1", + //"manufacturer": "hikvision", + //"ip": null, + //"port": null, + //"online": 1 +} +type CameraStatus struct { + Code string `json:"code"` + Msg string `json:"msg"` + Data struct { + PageNo int `json:"pageNo"` + PageSize int `json:"pageSize"` + TotalPage int `json:"totalPage"` + Total int `json:"total"` + List []statusList `json:"list"` + } `json:"data"` +} diff --git a/third/jiguang/config.go b/third/jiguang/config.go new file mode 100644 index 0000000..b4470d3 --- /dev/null +++ b/third/jiguang/config.go @@ -0,0 +1,103 @@ +package jiguang + +import ( + "encoding/base64" + "fmt" + "github.com/go-resty/resty/v2" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gctx" + "golang.org/x/net/context" +) + +var appKey = "9bbb84675085d124417ceb27" +var masterSecret = "1a7dff8f3ce58df231481fce" + +// @Title Notification 2024/7/25 15:45:00 +// @Description 通知 +// @Auth Cory +type Notification struct { + Platform interface{} `json:"platform" dc:"推送平台设置"` + Audience interface{} `json:"audience" dc:"推送设备指定"` + Notification struct { + Android struct { + Title string `json:"title" dc:"通知标题"` + Alert string `json:"alert" dc:"通知内容"` + } `json:"android" dc:"Android 平台上的通知"` + } `json:"notification" dc:"通知内容体,是被推送到客户端的内容。"` +} + +// @Title SendAppClockingNotice 2024/7/25 15:35:00 +// @Description 发送APP的打卡通知信息 (需注意:registration_id一次最多只能发送1000) +// @Auth Cory +// @param 输入参数名 ---> "参数解释" +// @Return error ---> "错误信息" +func SendAppClockingNotice(ctx context.Context, deviceIds []string, dataStr string, flagStr string) { + //1、发送位置及authorization + url := "https://api.jpush.cn/v3/push" + authorization := base64.StdEncoding.EncodeToString([]byte(appKey + ":" + masterSecret)) + + //2、创建 Resty 客户端对象 + client := resty.New() + + //3、POST 请求示例 + splitIds := splitDeviceIds(deviceIds) + for _, ids := range splitIds { + //reqBody := map[string]interface{}{ + // "platform": []string{"android"}, + // "audience": map[string]interface{}{"registration_id": []string{"", ""}}, + // "notification": Notification{Android: AndroidEntity(struct { + // Title string + // Alert string + // }{Title: "上下班打卡提醒", Alert: "即将进入打卡时间,请立即前往【定位考勤】页面进行打卡(如若已打卡或休息请忽略)"})}, + //} + notification := Notification{ + Platform: []string{"android"}, + Audience: map[string]interface{}{"registration_id": ids}, + Notification: struct { + Android struct { + Title string `json:"title" dc:"通知标题"` + Alert string `json:"alert" dc:"通知内容"` + } `json:"android" dc:"Android 平台上的通知"` + }(struct { + Android struct { + Title string + Alert string + } + }{ + Android: struct { + Title string + Alert string + }{ + Title: "中煤" + dataStr + flagStr + "打卡提醒", + Alert: "即将进入打卡时间,请立即前往【定位考勤】页面进行打卡(如若已打卡或休息请忽略)", + }, + }), + } + //4、发送post请求 + _, err := client.R(). + SetHeader("Content-Type", "application/json"). + SetHeader("Authorization", "Basic "+authorization). + SetBody(notification). + Post(url) + if err != nil { + fmt.Println("发送 POST 请求失败:", err) + g.Log().Error(gctx.New(), err) + return + } + } +} + +// @Title splitDeviceIds 2024/7/26 15:56:00 +// @Description 数据切分(900一条) +// @Auth Cory +func splitDeviceIds(deviceIds []string) [][]string { + var result [][]string + for i := 0; i < len(deviceIds); i += 900 { + end := i + 900 + if end > len(deviceIds) { + end = len(deviceIds) + } + result = append(result, deviceIds[i:end]) + } + return result +} diff --git a/third/livegbs/livegbs.go b/third/livegbs/livegbs.go new file mode 100644 index 0000000..7559314 --- /dev/null +++ b/third/livegbs/livegbs.go @@ -0,0 +1,3 @@ +package livegbs + +var Token = "" diff --git a/third/officeWeb365/office.go b/third/officeWeb365/office.go new file mode 100644 index 0000000..810536a --- /dev/null +++ b/third/officeWeb365/office.go @@ -0,0 +1,112 @@ +// @Author cory 2025/4/24 15:52:00 +package officeWeb365 + +import ( + "bytes" + "encoding/json" + "errors" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "golang.org/x/net/context" + "io" + "mime/multipart" + "net/http" + "os" + "path/filepath" + "strings" +) + +func SendFile199(ctx context.Context, relativePath string, typeStr string) (err error, urlPath string) { + //1、根据相对路径获取到文件信息 + filePath := coryCommon.FileToFunc(relativePath, 2) + + fieldName := "file" // 表单字段名 + + // 获取文件名 + fileName := filepath.Base(filePath) // 自动获取 "222.xlsx" + + // 打开文件 + file, err := os.Open(filePath) + if err != nil { + panic(err) + } + defer file.Close() + + // 创建 multipart body + body := &bytes.Buffer{} + writer := multipart.NewWriter(body) + + // 创建文件字段(自动带文件名) + part, err := writer.CreateFormFile(fieldName, fileName) + if err != nil { + panic(err) + } + + // 将文件内容复制进去 + _, err = io.Copy(part, file) + if err != nil { + panic(err) + } + + // 关闭 multipart writer + err = writer.Close() + if err != nil { + panic(err) + } + + url := "" + sip := "http://192.168.1.177:8188" + switch typeStr { + case "1": + url = sip + "/api/doc/view/uploadfile" + case "2": + url = sip + "/OnlineEditing/GetPreviewUrl" + case "3": + url = sip + "/api/ppt/view/uploadfile" + } + + // 创建请求 + req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, body) + if err != nil { + panic(err) + } + + // 设置 multipart Content-Type + req.Header.Set("Content-Type", writer.FormDataContentType()) + + // 发出请求 + resp, err := http.DefaultClient.Do(req) + if err != nil { + return err, "" + } + defer resp.Body.Close() + + // 读取响应 + respBody, err := io.ReadAll(resp.Body) + if err != nil { + return errors.New("请求错误!"), "" + } + + // 解析响应 JSON + var responseData ResponseData + err = json.Unmarshal(respBody, &responseData) + if err != nil { + return errors.New(string(respBody)), "" + } + + // 输出结果 + if responseData.Code == 200 { + return nil, strings.Replace(responseData.Data.ViewURL, sip, "", -1) + } else { + return errors.New("请求错误!"), "" + } +} + +// ResponseData 定义响应数据的结构体 +type ResponseData struct { + Code int `json:"code"` + Data struct { + RequestID string `json:"request_id"` + ViewURL string `json:"view_url"` + } `json:"data"` + Msg string `json:"msg"` +} diff --git a/third/plane/dj/constant.go b/third/plane/dj/constant.go new file mode 100644 index 0000000..dd883d1 --- /dev/null +++ b/third/plane/dj/constant.go @@ -0,0 +1 @@ +package dj diff --git a/third/plane/dj/dj.go b/third/plane/dj/dj.go new file mode 100644 index 0000000..1001a95 --- /dev/null +++ b/third/plane/dj/dj.go @@ -0,0 +1,1217 @@ +package dj + +import ( + "context" + "github.com/gogf/gf/v2/crypto/gmd5" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "math/rand" + "time" +) + +const ( + Drone_open = "drone_open" + Drone_close = "drone_close" + Cover_open = "cover_open" + Cover_close = "cover_close" + Device_reboot = "device_reboot" + Putter_open = "putter_open" + Putter_close = "putter_close" + Airport_organization_bind = "airport_organization_bind" //设备绑定到组织 + Airport_organization_get = "airport_organization_get" //查询设备绑定对应的组织信息 + Airport_bind_status = "airport_bind_status" //获取设备绑定信息 + Update_topo = "update_topo" //设备拓扑更新 + Flighttask_ready = "flighttask_ready" //任务就绪通知 + Flighttask_resource_get = "flighttask_resource_get" //任务资源获取 + Return_home_info = "return_home_info" //返航信息 + Flighttask_progress = "flighttask_progress" //上报航线任务进度 + Flighttask_prepare = "flighttask_prepare" //下发任务 + Storage_config_get = "storage_config_get" //获取上传临时凭证 + File_upload_callback = "file_upload_callback" //媒体文件上传结果上报 + Takeoff_to_point = "takeoff_to_point" //一键起飞 + Fly_to_point_stop = "fly_to_point_stop" //结束飞向目标点 + Fly_to_point = "fly_to_point" //飞向目标点 + Fly_to_point_progress = "fly_to_point_progress" //flyto 执行结果事件通知 + Flight_authority_grab = "flight_authority_grab" //飞行控制权抢夺 + Speaker_tts_play_start = "speaker_tts_play_start" //喊话器-开始播放TTS文本 + Speaker_audio_play_start = "speaker_audio_play_start" //喊话器-开始播放音频 + Fileupload_progress = "fileupload_progress" //文件上传进度通知(远程日志) + Config = "config" //config + + //cory + OtaCreate = "ota_create" //固件升级 + OtaProgress = "ota_progress" //固件升级进度通知 + FileuploadList = "fileupload_list" //获取设备可上传的文件列表 + FileuploadStart = "fileupload_start" //发起日志文件上传 + DeviceFormat = "device_format" //机场数据格式化 + DroneFormat = "drone_format" //飞行器数据格式化 + ReturnHome1 = "return_home" //返航 +) + +// CoryAirportOrAircraft 机场or飞机 +type CoryAirportOrAircraft struct { + Airport interface{} `json:"airport" dc:"机场数据"` + Aircraft interface{} `json:"aircraft" dc:"飞机数据"` + HangarSn string `json:"hangarSn" dc:"机仓sn"` + AircraftSn string `json:"aircraftSn" dc:"飞机sn"` + Coordinates string `json:"coordinates" dc:"无人机最后一次发送的坐标信息"` +} + +/*共有类*/ +type Public struct { + Tid string `json:"tid"` + Bid string `json:"bid"` + Timestamp int64 `json:"timestamp"` + Gateway string `json:"gateway"` + Method string `json:"method"` +} + +type PublicTwo struct { + Public + Data struct { + Result int `json:"result"` + Output struct { + Status string `json:"status"` + } `json:"output"` + } `json:"data"` +} + +func (receiver *Public) SetDefault() { + //randString := RandString(32) + //receiver.Bid = randString + //receiver.Tid = randString + receiver.Bid = RandString(32) + receiver.Tid = RandString(32) + receiver.Timestamp = gtime.Now().TimestampMilli() +} +func RandString(len int) string { + time.Sleep(time.Nanosecond) + r := rand.New(rand.NewSource(time.Now().UnixNano())) + bytes := make([]byte, len) + for i := 0; i < len; i++ { + b := r.Intn(26) + 65 + bytes[i] = byte(b) + } + return gmd5.MustEncryptString(string(bytes)) +} + +// 属性信息1 +type OSD1 struct { + Public + Data struct { + JobNumber int `json:"job_number"` + AccTime int `json:"acc_time"` + ActivationTime int `json:"activation_time"` + MaintainStatus struct { + MaintainStatusArray []struct { + State int `json:"state"` + LastMaintainType int `json:"last_maintain_type"` + LastMaintainTime int `json:"last_maintain_time"` + LastMaintainWorkSorties int `json:"last_maintain_work_sorties"` + } `json:"maintain_status_array"` + } `json:"maintain_status"` + ElectricSupplyVoltage int `json:"electric_supply_voltage"` + WorkingVoltage int `json:"working_voltage"` + WorkingCurrent int `json:"working_current"` + BackupBattery struct { + Voltage int `json:"voltage"` + Temperature float64 `json:"temperature"` + Switch int `json:"switch"` + } `json:"backup_battery"` + DroneBatteryMaintenanceInfo struct { + MaintenanceState int `json:"maintenance_state"` + MaintenanceTimeLeft int `json:"maintenance_time_left"` + } `json:"drone_battery_maintenance_info"` + } `json:"data"` +} + +// 属性信息2 +type OSD2 struct { + Public + Data struct { + FlighttaskPrepareCapacity int `json:"flighttask_prepare_capacity"` + FlighttaskStepCode int `json:"flighttask_step_code"` + MediaFileDetail struct { + RemainUpload int `json:"remain_upload"` + } `json:"media_file_detail"` + WirelessLink struct { + GFreqBand float64 `json:"4g_freq_band"` + GGndQuality int `json:"4g_gnd_quality"` + GLinkState int `json:"4g_link_state"` + GQuality int `json:"4g_quality"` + GUavQuality int `json:"4g_uav_quality"` + DongleNumber int `json:"dongle_number"` + LinkWorkmode int `json:"link_workmode"` + SdrFreqBand float64 `json:"sdr_freq_band"` + SdrLinkState int `json:"sdr_link_state"` + SdrQuality int `json:"sdr_quality"` + } `json:"wireless_link"` + } `json:"data"` +} + +// 属性信息3 +type OSD3 struct { + Public + Data struct { + NetworkState struct { + Type int `json:"type"` + Quality int `json:"quality"` + Rate float64 `json:"rate"` + } `json:"network_state"` + DroneChargeState struct { + State int `json:"state"` + CapacityPercent int `json:"capacity_percent"` + } `json:"drone_charge_state"` + DroneInDock int `json:"drone_in_dock"` + Rainfall int `json:"rainfall"` + WindSpeed float64 `json:"wind_speed"` + EnvironmentTemperature float64 `json:"environment_temperature"` + Temperature float64 `json:"temperature"` + Humidity int `json:"humidity"` + Latitude float64 `json:"latitude"` + Longitude float64 `json:"longitude"` + Height float64 `json:"height"` + AlternateLandPoint struct { + Latitude float64 `json:"latitude"` + Longitude float64 `json:"longitude"` + SafeLandHeight int `json:"safe_land_height"` + IsConfigured int `json:"is_configured"` + } `json:"alternate_land_point"` + FirstPowerOn int64 `json:"first_power_on"` + PositionState struct { + IsCalibration int `json:"is_calibration"` + IsFixed int `json:"is_fixed"` + Quality int `json:"quality"` + GpsNumber int `json:"gps_number"` + RtkNumber int `json:"rtk_number"` + } `json:"position_state"` + Storage struct { + Total int `json:"total"` + Used int `json:"used"` + } `json:"storage"` + ModeCode int `json:"mode_code"` + CoverState int `json:"cover_state"` + SupplementLightState int `json:"supplement_light_state"` + EmergencyStopState int `json:"emergency_stop_state"` + AirConditionerMode int `json:"air_conditioner_mode"` + BatteryStoreMode int `json:"battery_store_mode"` + AlarmState int `json:"alarm_state"` + PutterState int `json:"putter_state"` + SubDevice struct { + DeviceSn string `json:"device_sn"` + DeviceModelKey string `json:"device_model_key"` + DeviceOnlineStatus int `json:"device_online_status"` + DevicePaired int `json:"device_paired"` + } `json:"sub_device"` + } `json:"data"` +} + +// M30/M30T 设备属性 +type M30tEntity struct { + Public + Data struct { + Battery struct { + CapacityPercent int `json:"capacity_percent" dc:"电池的总剩余电量"` + RemainFlightTime int `json:"remain_flight_time" dc:"剩余飞行时间"` + ReturnHomePower int `json:"return_home_power" dc:"返航所需电量百分比 "` + } `json:"battery" dc:"飞行器电池信息"` + Storage struct { + Total int `json:"total" dc:"总容量"` + Used int `json:"used" dc:"已使用容量"` + } `json:"storage" dc:"存储容量"` + cameras struct { + RemainPhotoNum int `json:"remain_photo_num" dc:"剩余拍照张数"` + } `json:"cameras" dc:"飞行器相机信息"` + HorizontalSpeed float64 `json:"horizontal_speed" dc:"水平速度"` + VerticalSpeed float64 `json:"vertical_speed" dc:"垂直速度 "` + Latitude float64 `json:"latitude" dc:"当前位置经度"` + Longitude float64 `json:"longitude" dc:"当前位置纬度"` + Elevation float64 `json:"elevation" dc:"相对起飞点高度"` + TrackId float64 `json:"track_id" dc:"航迹ID"` + } `json:"data"` +} + +// 大疆机场 设备属性 +type DjiAirportEntity struct { + Public + Data struct { + Battery struct { + VideoQuality int `json:"video_quality" dc:"直播状态 (0自动,1流畅,2高清,3超清)"` + Status int `json:"status" dc:"直播状态"` + } `json:"live_status" dc:"网关当前整体直播状态推送"` + } `json:"data"` +} + +// AircraftInformation 飞机状态信息 Cory +type AircraftInformation struct { + Public + Data struct { + CommanderFlightHeight float64 `json:"commander_flight_height" dc:"指点飞行高度"` + HorizontalSpeed float64 `json:"horizontal_speed" dc:"水平速度"` + VerticalSpeed float64 `json:"vertical_speed" dc:"垂直速度"` + } `json:"data"` +} + +// FileUploadCallbackEntity 媒体文件上传结果上报 +type FileUploadCallbackEntity struct { + Public + Data struct { + File struct { + Extension struct { + DroneModelKey string `json:"drone_model_key"` + FlightID string `json:"flight_id"` + IsOriginal bool `json:"is_original"` + PayloadModelKey string `json:"payload_model_key"` + } `json:"ext"` + Metadata struct { + AbsoluteAltitude float64 `json:"absolute_altitude"` + CreateTime string `json:"create_time"` + GimbalYawDegree float64 `json:"gimbal_yaw_degree"` + RelativeAltitude float64 `json:"relative_altitude"` + ShootPosition struct { + Latitude float64 `json:"lat"` + Longitude float64 `json:"lng"` + } `json:"shoot_position"` + } `json:"metadata"` + Name string `json:"name"` + ObjectKey string `json:"object_key"` + Path string `json:"path"` + } `json:"file"` + } `json:"data"` +} + +type State struct { + Public + Data interface{} `json:"data"` +} +type Service struct { + Public + Method string `json:"method"` + Data interface{} `json:"data"` +} +type Event struct { + Public + Method string `json:"method"` + NeedReply int `json:"need_reply"` + Data interface{} `json:"data"` +} + +type Status struct { + Public + Data struct { + Domain string `json:"domain"` + Type int `json:"type"` + SubType int `json:"sub_type"` + DeviceSecret string `json:"device_secret"` + Nonce string `json:"nonce"` + Version int `json:"version"` + SubDevices []struct { + Sn string `json:"sn"` + Type int `json:"type"` + SubType int `json:"sub_type"` + Index string `json:"index"` + DeviceSecret string `json:"device_secret"` + Nonce string `json:"nonce"` + Version int `json:"version"` + } `json:"sub_devices"` + } `json:"data"` +} + +type StatusReply struct { + Public + Data struct { + Result int `json:"result"` + } `json:"data"` +} + +type Reboot struct { + Usual +} + +func (receiver *Reboot) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "device_reboot" +} + +/*打开调试模式*/ +type DebugOpen struct { + Usual +} + +func (receiver *DebugOpen) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "debug_mode_open" +} + +/*关闭调试模式*/ +type DebugClose struct { + Usual +} + +func (receiver *DebugClose) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "debug_mode_close" +} + +type Usual struct { + Public + Data interface{} `json:"data"` +} + +/*停止直播*/ +type StopLive struct { + Public + Data struct { + VideoId string `json:"video_id"` + } `json:"data"` +} + +func (receiver *StopLive) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "live_stop_push" +} + +/*开始直播*/ +type StartLive struct { + Public + Data struct { + UrlType int `json:"url_type"` + Url string `json:"url"` + VideoId string `json:"video_id"` + VideoQuality int `json:"video_quality"` + } `json:"data"` +} + +func (receiver *StartLive) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "live_start_push" +} + +/*打开舱盖*/ +type CoverOpen struct { + Usual +} + +func (receiver *CoverOpen) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "cover_open" +} + +/*关闭舱盖*/ +type CoverClose struct { + Usual +} + +func (receiver *CoverClose) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "cover_close" +} + +/*飞行器开机*/ +type DroneOpen struct { + Usual +} + +func (receiver *DroneOpen) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "drone_open" +} + +/*飞行器开机*/ +type DroneClose struct { + Usual +} + +func (receiver *DroneClose) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "drone_close" +} + +/*打开充电*/ + +type PutterOpen struct { + Usual +} + +func (receiver *PutterOpen) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "putter_open" +} + +type PutterClose struct { + Usual +} + +func (receiver *PutterClose) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "putter_close" +} + +/*打开充电*/ + +type ChargeOpen struct { + Usual +} + +func (receiver *ChargeOpen) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "charge_open" +} + +/*关闭充电*/ + +type ChargeClose struct { + Usual +} + +func (receiver *ChargeClose) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "charge_close" +} + +/*云平台向设备发送的服务(具体service identifier 见物模型内容)。*/ +func GetServiceTopic(gateway_sn string) string { + return "thing/product/" + gateway_sn + "/services" +} +func GetRequestsReplyTopic(gateway_sn string) string { + return "thing/product/" + gateway_sn + "/requests_reply" +} +func GetEventsReplyTopic(gateway_sn string) string { + return "thing/product/" + gateway_sn + "/StatusReply" +} + +/*开始直播响应*/ +type StartLiveReply struct { + Public + Data struct { + Result int `json:"result"` + Url string `json:"url"` + } `json:"data"` +} + +/*开始直播响应*/ +type StopLiveReply struct { + UsualReply +} + +type UsualReply struct { + Public + Data struct { + Result int `json:"result"` + Output struct { + Status string `json:"status"` + } `json:"output"` + } `json:"data"` +} + +/*打开补光灯*/ + +type Supplement_light_open struct { + Usual +} + +func (receiver *Supplement_light_open) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "supplement_light_open" +} + +/*关闭补光灯*/ +type Supplement_light_close struct { + Usual +} + +func (receiver *Supplement_light_close) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "supplement_light_close" +} + +/*声光报警开关*/ +type Alarm_state_switch struct { + Public + Data struct { + Action int `json:"action"` //{"0":"关闭","1":"开启"} + } `json:"data"` +} + +func (receiver *Alarm_state_switch) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "alarm_state_switch" +} + +/*执行任务*/ +type FlighttaskExecute struct { + Public + Data struct { + FlightId string `json:"flight_id"` + } `json:"data"` +} + +func (receiver *FlighttaskExecute) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "flighttask_execute" +} + +/*取消任务*/ +type FlighttaskUndo struct { + Public + Data struct { + Flight_ids []string `json:"flight_ids"` + } `json:"data"` +} + +func (receiver *FlighttaskUndo) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "flighttask_undo" +} + +/*航线暂停*/ +type FlighttaskPause struct { + Usual +} + +func (receiver *FlighttaskPause) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "flighttask_pause" +} + +/*航线恢复*/ +type FlighttaskRecovery struct { + Usual +} + +func (receiver *FlighttaskRecovery) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "flighttask_recovery" +} + +/*一键返航*/ +type ReturnHome struct { + Usual +} + +func (receiver *ReturnHome) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "return_home" +} + +/*取消返航*/ +type ReturnHomeCancel struct { + Usual +} + +func (receiver *ReturnHomeCancel) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "return_home_cancel" +} + +/*设备绑定到组织*/ +type AirportOrganizationBind struct { + Public + Data struct { + BindDevices []struct { + DeviceBindingCode string `json:"device_binding_code"` //设备绑定码 + OrganizationId string `json:"organization_id"` //组织id + DeviceCallsign string `json:"device_callsign"` //设备在组织的名称 + Sn string `json:"sn"` //设备序列号 + DeviceModelKey string `json:"device_model_key"` //产品枚举值 + } `json:"bind_devices"` //绑定参数列表 + } `json:"data"` +} + +/*设备绑定到组织回复*/ +type AirportOrganizationBindReplay struct { + Public + Data struct { + Result int `json:"result"` //直接填0 + Output struct { + ErrInfos []struct { + Sn string `json:"sn"` //设备序列号 + ErrCode int `json:"err_code"` //错误码 自定义,非 0 表示绑定不成功 + } `json:"err_infos"` + } `json:"output"` + } `json:"data"` +} + +/*查询设备绑定对应的组织信息*/ +type AirportOrganizationGet struct { + Public + Data struct { + DeviceBindingCode string `json:"device_binding_code"` //设备绑定码 + OrganizationId string `json:"organization_id"` //组织id + } `json:"data"` +} /*查询设备绑定对应的组织信息回复*/ +type AirportOrganizationGetReplay struct { + Public + Data struct { + Result int `json:"result"` + Output struct { + OrganizationName string `json:"organization_name"` //组织名称 + } `json:"output"` + } `json:"data"` +} + +/*获取设备绑定信息*/ +type AirportBindStatus struct { + Public + Data []struct { + Devices []struct { + Sn string `json:"sn"` + } `json:"devices"` + } `json:"data"` +} + +/*获取设备绑定信息回复*/ +type AirportBindStatusReplay struct { + Public + Data []struct { + Result int `json:"result"` //默认0 + Output struct { + BindStatus []struct { + Sn string `json:"sn"` //设备序列号 + IsDeviceBindOrganization bool `json:"is_device_bind_organization"` //设备是否绑定到组织 + OrganizationId string `json:"organization_id"` //组织id + OrganizationName string `json:"organization_name"` //组织名称 + DeviceCallsign string `json:"device_callsign"` //设备在组织中的名称 + } `json:"bind_status"` + } `json:"output"` + } `json:"data"` +} + +type FlighttaskReady struct { + Public + Data struct { + FlightIds []string `json:"flight_ids"` //当前满足任务就绪条件的任务 ID 集合 + } `json:"data"` +} +type ReturnHomeInfo struct { + Public + Data struct { + FlightId string `json:"flight_id"` + LastPointType int `json:"last_point_type"` + PlannedPathPoints []struct { + Height float64 `json:"height"` + Latitude float64 `json:"latitude"` + Longitude float64 `json:"longitude"` + } `json:"planned_path_points"` + } `json:"data"` +} + +/*下发任务*/ +type FlighttaskPrepare struct { + Public + Data struct { + BreakPoint struct { + Index int `json:"index"` + Progress float64 `json:"progress"` + State int `json:"state"` + WaylineId int `json:"wayline_id"` + } `json:"break_point"` + ExecutableConditions struct { + StorageCapacity int `json:"storage_capacity"` + } `json:"executable_conditions"` + ExecuteTime int64 `json:"execute_time"` + ExitWaylineWhenRcLost int `json:"exit_wayline_when_rc_lost"` + File struct { + Fingerprint string `json:"fingerprint"` + Url string `json:"url"` + } `json:"file"` + FlightId string `json:"flight_id"` + OutOfControlAction int `json:"out_of_control_action"` + ReadyConditions struct { + BatteryCapacity int `json:"battery_capacity"` + BeginTime int64 `json:"begin_time"` + EndTime int64 `json:"end_time"` + } `json:"ready_conditions"` + RthAltitude int `json:"rth_altitude"` + RthMode int `json:"rth_mode"` + SimulateMission struct { + IsEnable int `json:"is_enable"` + Latitude float64 `json:"latitude"` + Longitude float64 `json:"longitude"` + } `json:"simulate_mission"` + TaskType int `json:"task_type"` + WaylineType int `json:"wayline_type"` + } `json:"data"` +} + +func (receiver *FlighttaskPrepare) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = Flighttask_prepare +} + +// FlighttaskPrepareRes 任务下发 cory +type FlighttaskPrepareRes struct { + Public + Data struct { + FlightId string `json:"flight_id" dc:"计划 ID"` + TaskType int `json:"task_type" dc:"任务类型"` + ExecuteTime int64 `json:"execute_time" dc:"任务类型"` + WaylineType int `json:"wayline_type" dc:"航线类型"` + File *FileEntity `json:"file" dc:"航线文件对象"` + RthAltitude int `json:"rth_altitude" dc:"返航高度" ` + RthMode int `json:"rth_mode" dc:"返航高度模式"` + OutOfControlAction int `json:"out_of_control_action" dc:"遥控器失控动作"` + ExitWaylineWhenRcLost int `json:"exit_wayline_when_rc_lost" dc:"航线失控动作"` + BreakPoint *BreakPoint `json:"break_point" dc:"断点信息" ` + } `json:"data"` +} +type BreakPoint struct { + Index int `json:"index" dc:"断点状态"` + State int `json:"state" dc:"返航高度模式"` + Progress float32 `json:"progress" dc:"遥控器失控动作"` + WaylineId int `json:"wayline_id" dc:"航线失控动作"` +} +type FileEntity struct { + Url string `json:"url" ` + Fingerprint string `json:"fingerprint" ` +} + +//type FlighttaskResourceGetEntity struct { +// Data struct { +// Output *FlighttaskResourceGetTutputEntity `json:"output" ` +// } `json:"data"` +//} +//type FlighttaskResourceGetTutputEntity struct { +// File *FileEntity `json:"file" dc:"航线文件对象"` +//} + +func (receiver *FlighttaskPrepareRes) SetDefaultValueCory() { + receiver.SetDefault() + receiver.Method = Flighttask_prepare +} + +/*任务资源获取*/ +type FlighttaskResourcGet struct { + Public + Data struct { + FlightId string `json:"flight_id"` + } `json:"data"` +} + +/*任务资源获取回复*/ +type FlighttaskResourcGetReply struct { + Public + Data struct { + Output struct { + File struct { + Fingerprint string `json:"fingerprint"` + Url string `json:"url"` + } `json:"file"` + } `json:"output"` + Result int `json:"result"` + } `json:"data"` +} + +func (receiver *FlighttaskResourcGetReply) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "flighttask_resource_get" +} + +/*获取上传临时凭证*/ +type StorageConfigGet struct { + Public + Data struct { + Module int `json:"module"` + } `json:"data"` +} + +/*获取上传临时凭证回复*/ +type StorageConfigGetReply struct { + Public + Data struct { + Output struct { + Bucket string `json:"bucket"` + Credentials struct { + AccessKeyId string `json:"access_key_id"` + AccessKeySecret string `json:"access_key_secret"` + Expire int `json:"expire"` + SecurityToken string `json:"security_token"` + } `json:"credentials"` + Endpoint string `json:"endpoint"` + ObjectKeyPrefix string `json:"object_key_prefix"` + Provider string `json:"provider"` + Region string `json:"region"` + } `json:"output"` + Result int `json:"result"` + } `json:"data"` +} + +/*配置更新回复*/ +type ConfigReply struct { + Public + Data struct { + AppId string `json:"app_id"` + AppKey string `json:"app_key"` + AppLicense string `json:"app_license"` + NtpServerHost string `json:"ntp_server_host"` + NtpServerPort int `json:"ntp_server_port"` + } `json:"data"` +} + +// FileUpLoadListDown 获取设备可上传的文件列表 发送到mqtt +type FileUpLoadListDown struct { + Public + Data struct { + ModuleList []string `json:"module_list" dc:"文件所属过滤列表"` + } `json:"data"` +} + +func (receiver *FileUpLoadListDown) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "fileupload_list" +} + +// FileUpLoadListDownUp 获取设备可上传的文件列表 mqtt下发到本地服务 +type FileUpLoadListDownUp struct { + Public + Data struct { + Files []struct { + DeviceSN string `json:"device_sn" dc:"设备序列号"` + List []struct { + BootIndex int `json:"boot_index" dc:"文件索引"` + EndTime int64 `json:"end_time" dc:"日志结束时间"` + Size int `json:"size" dc:"日志文件大小"` + StartTime int64 `json:"start_time" dc:"日志开始时间"` + } `json:"list" dc:"文件索引列表"` + Module string `json:"module" dc:"所属设备类型(0飞行器 2机场)"` + Result int `json:"result" dc:"返回码"` + } `json:"files" dc:"文件所属过滤列表"` + } `json:"data"` +} + +// LogFileUploadReply 远程日志结构体 +type LogFileUploadReply struct { + Public + Data struct { + Bucket string `json:"bucket"` + Credentials struct { + AccessKeyId string `json:"access_key_id"` + AccessKeySecret string `json:"access_key_secret"` + Expire int `json:"expire"` + SecurityToken string `json:"security_token"` + } `json:"credentials"` + Endpoint string `json:"endpoint"` + Params struct { + Files []File `json:"files"` + //Files []struct { + // List []struct { + // BootIndex int `json:"boot_index"` + // } `json:"list"` + // Module string `json:"module"` + // ObjectKey string `json:"object_key"` + //} `json:"files"` + } `json:"params"` + Provider string `json:"provider"` + Region string `json:"region"` + } `json:"data"` +} + +type File struct { + List []FileList `json:"list"` + Module string `json:"module"` + ObjectKey string `json:"object_key"` +} + +type FileList struct { + BootIndex int `json:"boot_index"` +} + +// SetDefaultValue Minio存储服务配置 +func (receiver *StorageConfigGetReply) SetDefaultValue() { + token, access, secret := MinioVoucher() + Endpoint = g.Cfg().MustGet(context.Background(), "minio.endpoint").String() + receiver.SetDefault() + receiver.Method = "storage_config_get" + receiver.Data.Result = 0 + receiver.Data.Output.Bucket = BucketName + receiver.Data.Output.Credentials.AccessKeyId = access + receiver.Data.Output.Credentials.AccessKeySecret = secret + receiver.Data.Output.Credentials.Expire = int(DurationSeconds) + receiver.Data.Output.Credentials.SecurityToken = token + receiver.Data.Output.Endpoint = "http://" + Endpoint + receiver.Data.Output.Provider = "minio" + receiver.Data.Output.Region = Region + receiver.Data.Output.ObjectKeyPrefix = "uav" +} + +// SetDefaultValue 配置更新 +func (receiver *ConfigReply) SetDefaultValue() { + ctx := context.Background() + receiver.SetDefault() + receiver.Method = "config" + receiver.Data.AppId = g.Cfg().MustGet(ctx, "uav.config.appId").String() + receiver.Data.AppKey = g.Cfg().MustGet(ctx, "uav.config.appKey").String() + receiver.Data.AppLicense = g.Cfg().MustGet(ctx, "uav.config.appLicense").String() + receiver.Data.NtpServerHost = g.Cfg().MustGet(ctx, "uav.config.ntpServerHost").String() + receiver.Data.NtpServerPort = g.Cfg().MustGet(ctx, "uav.config.ntpServerPort").Int() +} + +func (receiver *LogFileUploadReply) SetDefaultValue(rdata *FileUpLoadListDownUp) { + token, access, secret := MinioVoucher() + receiver.SetDefault() + receiver.Method = "fileupload_start" + receiver.Data.Bucket = BucketName + receiver.Data.Region = Region + receiver.Data.Credentials.AccessKeyId = access + receiver.Data.Credentials.AccessKeySecret = secret + receiver.Data.Credentials.Expire = int(DurationSeconds) + receiver.Data.Credentials.SecurityToken = token + receiver.Data.Endpoint = "http://" + coryCommon.Global + ":9999" + receiver.Data.Provider = "minio" + //fileOne := LogFileUploadReplySetDefaultValue(rdata, "0", "cory-create/log") //飞行器 + fileTwo := LogFileUploadReplySetDefaultValue(rdata, "3", "log") //机场 + var files []File + //files = append(files, fileOne, fileTwo) + files = append(files, fileTwo) + receiver.Data.Params.Files = files +} + +func LogFileUploadReplySetDefaultValue(rdata *FileUpLoadListDownUp, num string, objectKey string) (file File) { + var fileList []FileList + for _, data := range rdata.Data.Files { + if data.Module == num { + list := data.List + for i := range list { + if list[i].BootIndex == 3743 { //从2024-04-28 15:15:19 开始 + fileList = append(fileList, FileList{ + BootIndex: list[i].BootIndex, + }) + } + } + //err := copier.Copy(&fileList, &list) + //if err != nil { + // return + //} + } + } + file.List = fileList + file.Module = num + file.ObjectKey = objectKey + return +} + +/*负载控制—单拍*/ +type CameraPhotoTake struct { + Public + Data struct { + PayloadIndex string `json:"payload_index"` + } `json:"data"` +} + +func (receiver *CameraPhotoTake) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "camera_photo_take" +} + +/*负载控制—重置云台*/ +type GimbalReset struct { + Public + Data struct { + PayloadIndex string `json:"payload_index" dc:"负载编号,相机枚举值。非标准的 device_mode_key,格式为 {type-subtype-gimbalindex}"` + ResetMode int `json:"reset_mode" dc:"{0回中 1向下 2偏航回中 3俯仰向下}"` + } `json:"data"` +} + +func (receiver *GimbalReset) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "gimbal_reset" +} + +/*设置直播清晰度*/ +type LiveSetQuality struct { + Public + Data struct { + VideoId string `json:"video_id"` + VideoQuality int `json:"video_quality"` + } `json:"data"` +} + +func (receiver *LiveSetQuality) SetDefaultValue() { + receiver.SetDefault() + receiver.Method = "live_set_quality" +} + +/*负载控制—单拍 响应恢复*/ +type CameraPhotoTakeReply struct { + Public + Data struct { + Result int `json:"result"` + } `json:"data"` +} + +/*航线执行进度上报*/ +type WaylineProgress struct { + Public + Data struct { + Output struct { + Ext struct { + BreakPoint struct { + AttitudeHead float64 `json:"attitude_head"` + BreakReason int `json:"break_reason"` + Height float64 `json:"height"` + Index int `json:"index"` + Latitude float64 `json:"latitude"` + Longitude float64 `json:"longitude"` + Progress float64 `json:"progress"` + State int `json:"state"` + WaylineId int `json:"wayline_id"` + } `json:"break_point"` + CurrentWaypointIndex int `json:"current_waypoint_index"` + FlightId string `json:"flight_id"` + MediaCount int `json:"media_count"` + TrackId string `json:"track_id"` + WaylineId int `json:"wayline_id"` + WaylineMissionState int `json:"wayline_mission_state"` + } `json:"ext"` + Progress struct { + CurrentStep int `json:"current_step"` + Percent int `json:"percent"` + } `json:"progress"` + Status string `json:"status"` + } `json:"output"` + Result int `json:"result"` + } `json:"data"` +} + +type CoordinateEntity struct { + Latitude float64 `json:"latitude"` + Longitude float64 `json:"longitude"` +} + +type Point struct { + CoordinateEntity + Height float64 `json:"height"` +} + +// TakeoffToPoint /*飞向目标点*/ +type TakeoffToPoint struct { + Public + Data struct { + CommanderFlightHeight int `json:"commander_flight_height"` + CommanderModeLostAction int `json:"commander_mode_lost_action"` + FlightId string `json:"flight_id"` + MaxSpeed int `json:"max_speed"` + RcLostAction int `json:"rc_lost_action"` + RthAltitude int `json:"rth_altitude"` + SecurityTakeoffHeight int `json:"security_takeoff_height"` + TargetHeight int `json:"target_height"` + TargetLatitude float64 `json:"target_latitude"` + TargetLongitude float64 `json:"target_longitude"` + } `json:"data"` +} + +func (t *TakeoffToPoint) SetDefaultValue() { + t.SetDefault() + t.Method = Takeoff_to_point +} + +/*飞向目标点*/ +type FlyToPoint struct { + Public + Data struct { + FlyToId string `json:"fly_to_id"` + MaxSpeed int `json:"max_speed"` + Points []Point `json:"points"` + } `json:"data"` +} + +func (t *FlyToPoint) SetDefaultValue() { + t.SetDefault() + t.Method = Fly_to_point +} + +type FlyToPointStop struct { + Public + Data struct{} `json:"data"` +} + +func (t *FlyToPointStop) SetDefaultValue() { + t.SetDefault() + t.Method = Fly_to_point_stop +} + +// FlyToPointProgress /*飞向目标点的结果通知*/ +type FlyToPointProgress struct { + Public + Data struct { + FlyToId string `json:"fly_to_id"` + PlannedPathPoints []struct { + Height float64 `json:"height"` + Latitude float64 `json:"latitude"` + Longitude float64 `json:"longitude"` + } `json:"planned_path_points"` + RemainingDistance int `json:"remaining_distance"` + RemainingTime int `json:"remaining_time"` + Result int `json:"result"` + Status string `json:"status"` + WayPointIndex int `json:"way_point_index"` + } `json:"data"` +} + +type FlightAuthorityGrab struct { + Public + Data struct{} `json:"data"` +} + +func (t *FlightAuthorityGrab) SetDefaultValue() { + t.SetDefault() + t.Method = Flight_authority_grab +} + +type SpeakerTtsPlayStart struct { + Public + Data struct { + PsdkIndex int `json:"psdk_index"` + Tts struct { + Md5 string `json:"md5"` + Name string `json:"name"` + Text string `json:"text"` + } `json:"tts"` + } `json:"data"` +} + +func (t *SpeakerTtsPlayStart) SetDefaultValue() { + t.SetDefault() + t.Method = Speaker_tts_play_start +} + +type SpeakerAudioPlayStart struct { + Public + Data struct { + PsdkIndex int `json:"psdk_index" dc:"psdk 负载设备索引(默认0)"` + File struct { + Name string `json:"name"` + Url string `json:"url"` + Md5 string `json:"md5"` + Format string `json:"format"` + } `json:"file"` + } `json:"data"` +} + +func (t *SpeakerAudioPlayStart) SetDefaultValue() { + t.SetDefault() + t.Method = Speaker_audio_play_start +} + +// OtaCreateEntity 固件升级实体 +type OtaCreateEntity struct { + Public + Data struct { + DeviceList []OtaCreateDevice `json:"devices"` + } `json:"data"` +} +type OtaCreateDevice struct { + FileName string `json:"file_name"` // 文件名(可选字段) + FileSize int64 `json:"file_size"` // 文件大小(可选字段,建议使用 int64 表示字节) + FileURL string `json:"file_url"` // 文件 URL(可选字段) + FirmwareUpgradeType int `json:"firmware_upgrade_type"` // 固件升级类型(必填字段) + MD5 string `json:"md5"` // MD5 校验码(可选字段) + ProductVersion string `json:"product_version"` // 产品版本(必填字段) + SN string `json:"sn"` // 设备序列号(必填字段) +} + +func (t *OtaCreateEntity) SetDefaultValue() { + t.SetDefault() + t.Method = OtaCreate +} diff --git a/third/plane/dj/errorcode.go b/third/plane/dj/errorcode.go new file mode 100644 index 0000000..131b63c --- /dev/null +++ b/third/plane/dj/errorcode.go @@ -0,0 +1,203 @@ +package dj + +var errorMap map[int]Error + +type Error struct { + Code int `json:"code"` + Msg string `json:"msg"` +} + +func InitError() { + errorMap = make(map[int]Error) + errors := []Error{ + {0, "成功"}, + {314000, "设备当前无法支持该操作,建议检查设备当前工作状态"}, + {314001, "飞行任务下发失败,请稍后重试"}, + {314002, "飞行任务下发失败,请稍后重试"}, + {314003, "航线文件格式不兼容,请检查航线文件是否正确"}, + {314004, "飞行任务下发失败,请稍后重试或重启机场后重试"}, + {314005, "飞行任务下发失败,请稍后重试或重启机场后重试"}, + {314006, "飞行器初始化失败,请重启机场后重试"}, + {314007, "机场传输航线至飞行器失败,请重启机场后重试"}, + {314008, "飞行器起飞前准备超时,请重启机场后重试"}, + {314009, "飞行器初始化失败,请重启机场后重试"}, + {314010, "航线执行失败,请重启机场后重试"}, + {314011, "机场系统异常,无法获取飞行任务执行结果"}, + {314012, "飞行器起飞前准备失败,无法执行飞行任务,请重启机场后重试"}, + {314013, "飞行任务下发失败,机场无法获取到本次飞行任务的航线,无法执行飞行任务,请稍后重试"}, + {314014, "机场系统异常,飞行任务执行失败,请稍后重试"}, + {314015, "机场传输精准复拍航线至飞行器失败,无法执行飞行任务,请稍后重试或重启机场后重试"}, + {314016, "航线文件解析失败,无法执行飞行任务,请检查航线文件"}, + {314017, "机场系统异常,飞行任务执行失败,请稍后重试"}, + {314018, "飞行器 RTK 定位异常,无法执行飞行任务,请稍后重试或重启机场后重试"}, + {314019, "飞行器 RTK 收敛失败,无法执行飞行任务,请稍后重试或重启机场后重试"}, + {314020, "飞行器不在停机坪正中间或飞行器朝向不正确,无法执行飞行任务,请检查飞行器位置和朝向"}, + {314021, "飞行器 RTK 定位异常,无法执行飞行任务,请稍后重试或重启机场后重试"}, + {316001, "飞行器参数配置失败,请重启机场后重试"}, + {316002, "飞行器参数配置失败,请重启机场后重试"}, + {316003, "飞行器参数配置失败,请重启机场后重试"}, + {316004, "飞行器参数配置失败,请重启机场后重试"}, + {316005, "飞行器 RTK 收敛失败,无法执行飞行任务,请重启机场后重试"}, + {316006, "飞行器降落前机场未开启舱盖或展开推杆,飞行器无法降落至机场,请尽快至机场部署现场检查飞行器状况"}, + {316007, "飞行器初始化失败,请重启机场后重试"}, + {316008, "机场获取飞行器控制权失败,无法执行飞行任务,请确认遥控器未锁定控制权"}, + {316009, "飞行器电量低于30%,无法执行飞行任务,请充电后重试(建议电量≥50%)"}, + {316010, "机场未检测到飞行器,无法执行飞行任务,请检查舱内是否有飞行器,机场与飞行器是否已对频,或重启机场后重试"}, + {316011, "飞行器降落位置偏移过大,请检查飞行器是否需要现场摆正"}, + {316012, "飞行器起飞前准备失败,无法执行飞行任务,请重启机场后重试"}, + {316013, "飞行器起飞前准备失败,无法执行飞行任务,请重启机场后重试"}, + {316014, "飞行器起飞前准备失败,无法执行飞行任务,请重启机场后重试"}, + {316015, "飞行器 RTK 收敛位置距离机场过远,无法执行飞行任务,请重启机场后重试"}, + {316016, "飞行器降落至机场超时,可能是机场与飞行器断连导致,请通过直播查看飞行器是否降落至舱内"}, + {316017, "获取飞行器媒体数量超时,可能是机场与飞行器断连导致,请通过直播查看飞行器是否降落至舱内"}, + {316018, "飞行任务执行超时,可能是机场与飞行器断连导致,请通过直播查看飞行器是否降落至舱内"}, + {316019, "服务器内部错误,无法执行飞行任务,请稍后重试"}, + {316020, "飞行器使用的 RTK 信号源错误,请稍后重试"}, + {316021, "飞行器 RTK 信号源检查超时,请稍后重试"}, + {316022, "飞行器无法执行返航指令,请检查飞行器是否已开机,机场与飞行器是否已断连,请确认无以上问题后重试"}, + {316023, "飞行器无法执行返航指令,飞行器已被 B 控接管,请在 B 控操控飞行器,或关闭 B 控后重试"}, + {316024, "飞行器执行返航指令失败,请检查飞行器是否已起飞,确认飞行器已起飞后请重试"}, + {316025, "飞行器参数配置失败,请稍后重试或重启机场后重试"}, + {316026, "机场急停按钮被按下,无法执行飞行任务,请释放急停按钮后重试"}, + {316027, "飞行器参数配置超时,请稍后重试或重启机场后重试"}, + {316029, "机场急停按钮被按下,飞行器将飞往备降点降落,请立即检查飞行器是否已安全降落并将飞行器放回至机场"}, + {317001, "获取飞行器媒体文件数量失败,请重启机场后重试"}, + {317002, "飞行器存储格式化失败,飞行器未开机、未连接或未检测到相机,请确认无以上问题后重试,或重启飞行器后重试"}, + {317003, "飞行器存储格式化失败,请重启飞行器后重试"}, + {317004, "机场媒体文件格式化失败,请稍后重试或重启机场后重试"}, + {317005, "飞行器结束录像失败,本次飞行任务的媒体文件可能无法上传"}, + {319001, "机场作业中或(设备异常反馈)上传日志中,无法执行飞行任务,请等待当前飞行任务或操作执行完成后重试"}, + {319002, "机场系统运行异常,请重启机场后重试"}, + {319003, "机场系统运行异常,请重新下发任务"}, + {319004, "飞行任务执行超时,已自动终止本次飞行任务"}, + {319005, "云端与机场通信异常,无法执行飞行任务"}, + {319006, "取消飞行任务失败,飞行任务已经在执行中"}, + {319007, "修改飞行任务失败,飞行任务已经在执行中"}, + {319008, "机场时间与云端时间不同步,机场无法执行飞行任务"}, + {319009, "飞行任务下发失败,请稍后重试或重启机场后重试"}, + {319010, "机场固件版本过低,无法执行飞行任务,请升级机场固件为最新版本后重试"}, + {319015, "机场正在初始化中,无法执行飞行任务,请等待机场初始化完成后重试"}, + {319016, "机场正在执行其他飞行任务,无法执行本次飞行任务"}, + {319017, "机场正在处理上次飞行任务媒体文件,无法执行本次飞行任务,请稍后重试"}, + {319018, "机场正在自动导出日志中(设备异常反馈),无法执行飞行任务,请稍后重试"}, + {319019, "机场正在拉取日志中(设备异常反馈),无法执行飞行任务,请稍后重试"}, + {319025, "机场未准备完成,无法执行云端下发的飞行任务,请稍后重试"}, + {319026, "飞行器电池电量低于用户设置的任务开始执行的电量,请等待充电完成后再执行飞行任务"}, + {319027, "机场或飞行器剩余存储容量过低,无法执行飞行任务,请等待媒体文件上传,机场和飞行器存储容量释放后再执行飞行任务"}, + {319999, "机场系统运行异常,请重启机场后重试"}, + {321000, "航线执行异常,请稍后重试或重启机场后重试"}, + {321004, "航线文件解析失败,无法执行飞行任务,请检查航线文件"}, + {321005, "航线缺少断点信息,机场无法执行飞行任务"}, + {321257, "飞行任务已在执行中,请勿重复执行"}, + {321258, "飞行任务无法终止,请检查飞行器状态"}, + {321259, "飞行任务未开始执行,无法终止飞行任务"}, + {321260, "飞行任务未开始执行,无法中断飞行任务"}, + {321513, "航线规划高度已超过飞行器限高,机场无法执行飞行任务"}, + {321514, "任务失败,起点或终点位于限远区域的缓冲区内或超过了限远距离"}, + {321515, "航线穿过限飞区,机场无法执行飞行任务"}, + {321517, "飞行器触发避障,飞行任务执行被终止"}, + {321519, "飞行器接近限飞区或限远距离自动返航,无法完成航线飞行"}, + {321523, "飞行器起桨失败,请稍后重试,如果仍报错请联系大疆售后。"}, + {321524, "飞行器起飞前准备失败,可能是飞行器无发定位或档位错误导致,请检查飞行器状态"}, + {321769, "飞行器卫星定位信号差,无法执行飞行任务,请重启机场后重试"}, + {321770, "飞行器挡位错误,无法执行飞行任务,请重启机场后重试"}, + {321771, "飞行器返航点未设置,无法执行飞行任务,请重启机场后重试"}, + {321772, "飞行器电量低于30%,无法执行飞行任务,请充电后重试(建议电量≥50%)"}, + {321773, "飞行器执行飞行任务过程中低电量返航,无法完成航线飞行"}, + {321775, "飞行器航线飞行过程中失联,无法完成航线飞行"}, + {321776, "飞行器 RTK 收敛失败,无法执行飞行任务,请重启机场后重试"}, + {321777, "飞行器未悬停,无法开始执行飞行任务"}, + {321778, "用户使用 B 控操控飞行器起桨,机场无法执行飞行任务"}, + {322282, "机场执行飞行任务过程中被中断,飞行器被云端用户或B控接管"}, + {322283, "机场执行飞行任务过程中被用户触发返航,无法完成航线飞行"}, + {322539, "航线的断点信息错误,机场无法执行飞行任务"}, + {324012, "日志压缩过程超时,所选日志过多,请减少选择的日志后重试"}, + {324013, "设备日志列表获取失败,请稍后重试"}, + {324014, "设备日志列表为空,请刷新页面或重启机场后重试"}, + {324015, "飞行器已关机或未连接,无法获取日志列表,请确认飞行器在舱内,通过远程调试将飞行器开机后重试"}, + {324016, "机场存储空间不足,日志压缩失败,请清理机场存储空间或稍后重试"}, + {324017, "日志压缩失败,无法获取所选飞行器日志,请刷新页面或重启机场后重试"}, + {324018, "日志文件拉取失败,导致本次设备异常反馈上传失败,请稍后重试或重启机场后重试"}, + {324019, "因机场网络异常,日志上传失败,请稍后重试。如果连续多次出现该问题,请联系代理商或大疆售后进行网络排障"}, + {325001, "云端下发给机场的命令不符合格式要求,机场无法执行"}, + {327500, "飞行器镜头除雾失败,请稍后重试"}, + {386535, "航线执行异常,请稍后重试或重启机场后重试"}, + {513001, "直播失败,飞行器不存在或飞行器类型错误"}, + {513002, "直播失败,相机不存在或相机类型错误"}, + {513003, "相机已经在直播中,请勿重复开启直播"}, + {513005, "直播失败,直播参数清晰度设置错误"}, + {513005, "直播失败,直播参数清晰度设置错误"}, + {513006, "操作失败,相机未开启直播"}, + {513008, "直播失败,设备端图传数据异常"}, + {513010, "直播失败,设备无法联网"}, + {513011, "操作失败,设备未开启直播"}, + {513012, "操作失败,设备已在直播中,不支持切换镜头"}, + {513013, "直播失败,直播使用的视频传输协议不支持"}, + {513014, "直播失败,直播参数错误或者不完整"}, + {513015, "直播异常,网络卡顿"}, + {513016, "直播异常,视频解码失败"}, + {513099, "直播失败,请稍后重试"}, + {514100, "机场运行异常,请重启机场后重试"}, + {514101, "推杆闭合失败,请检查停机坪上是否存在异物,飞行器方向是否放反,或重启机场后重试"}, + {514102, "推杆展开失败,请检查停机坪上是否存在异物,或重启机场后重试"}, + {514103, "飞行器电量低于30%,无法执行飞行任务,请充电后重试(建议电量≥50%)"}, + {514104, "飞行器电池开始充电失败,请重启机场后重试"}, + {514105, "飞行器电池停止充电失败,请重启机场后重试"}, + {514106, "飞行器电源控制异常,请重启机场后重试"}, + {514107, "舱盖开启失败,请检查舱盖周围是否存在异物,或重启机场后重试"}, + {514108, "舱盖关闭失败,请检查舱盖周围是否存在异物,或重启机场后重试"}, + {514109, "飞行器开机失败,请重启机场后重试"}, + {514110, "飞行器关机失败,请重启机场后重试"}, + {514111, "飞行器慢转收桨控制异常,请重启机场后重试"}, + {514112, "飞行器慢转收桨控制异常,请重启机场后重试"}, + {514113, "机场推杆与飞行器无法连接,请检查飞行器是否在舱内,推杆闭合时是否被卡住,充电连接器是否脏污或损坏"}, + {514114, "获取飞行器电源状态失败,请重启机场后重试"}, + {514116, "无法执行当前操作,机场正在执行其他控制指令,请稍后重试"}, + {514117, "舱盖开启或关闭未到位,请重启机场后重试"}, + {514118, "推杆展开或闭合未到位,请重启机场后重试"}, + {514120, "机场与飞行器断连,请重启机场后重试或重新对频"}, + {514121, "机场急停按钮被按下,请释放急停按钮"}, + {514122, "获取飞行器充电状态失败,请重启机场后重试"}, + {514123, "飞行器电池电量过低无法开机"}, + {514124, "获取飞行器电池信息失败,无法执行飞行任务,请重启机场后重试"}, + {514125, "飞行器电池电量已接近满电状态,无法开始充电,请使用至95%以下再进行充电"}, + {514134, "雨量过大,机场无法执行飞行任务,请稍后重试"}, + {514135, "风速过大≥12m/s,机场无法执行飞行任务,请稍后重试"}, + {514136, "机场供电断开,机场无法执行飞行任务,请恢复机场供电后重试"}, + {514137, "环境温度过低<-20℃,机场无法执行飞行任务,请稍后重试"}, + {514138, "飞行器电池正在保养中,机场无法执行飞行任务,请等待保养结束后重试"}, + {514139, "飞行器电池无法执行保养指令,飞行器电池无需保养"}, + {514140, "飞行器电池无法执行保养指令,飞行器电池无需保养"}, + {514141, "机场系统运行异常,请重启机场后重试"}, + {514142, "飞行器起飞前,机场推杆与飞行器无法连接,请检查飞行器是否在舱内,推杆闭合时是否被卡住,充电连接器是否脏污或损坏"}, + {514143, "推杆未闭合或闭合不到位,请稍后重试或重启机场后重试"}, + {514144, "舱盖未关闭或关闭不到位,请稍后重试或重启机场后重试"}, + {514145, "机场处于现场调试中,无法执行当前操作或执行飞行任务,请断开遥控器和机场的数据线连接后重试"}, + {514146, "机场处于远程调试中,无法执行飞行任务,请退出远程调试后重试"}, + {514147, "设备升级中,无法执行飞行任务,请等待升级完成后重试"}, + {514148, "机场已经在作业中,无法进行远程调试或再次执行飞行任务,请等待当前任务执行完成后重试"}, + {514149, "机场系统运行异常,无法执行飞行任务,请重启机场后重试"}, + {514150, "设备重启中,无法执行飞行任务,请等待重启完成后重试"}, + {514151, "设备升级中,无法执行设备重启指令,请等待升级完成后重试"}, + {514153, "机场已退出远程调试模式,无法执行当前操作"}, + {514170, "机场系统初始化中,无法执行当前操作或指令,请等待机场系统初始化完成后重试"}, + {514171, "云端下发给机场的命令不符合格式要求,机场无法执行"}, + {514180, "停止空调制冷或停止空调制热失败,请稍后重试"}, + {514181, "开启空调制冷失败,请稍后重试"}, + {514182, "开启空调制热失败,请稍后重试"}, + {514183, "开启空调除湿失败,请稍后重试"}, + {514184, "当前温度低于 0 ℃,无法开启空调制冷"}, + {514185, "当前温度高于 45 ℃,无法开启空调制热"}, + {514300, "网关异常"}, + {514301, "请求超时,连接断开"}, + {514302, "网络证书异常,连接失败"}, + {514303, "网络异常,连接断开"}, + {514304, "机场请求被拒,连接失败"}, + } + for _, e := range errors { + errorMap[e.Code] = e + } +} +func GetErrorMap() map[int]Error { + return errorMap +} diff --git a/third/plane/dj/minio.go b/third/plane/dj/minio.go new file mode 100644 index 0000000..13778bb --- /dev/null +++ b/third/plane/dj/minio.go @@ -0,0 +1,259 @@ +package dj + +import ( + "context" + "fmt" + "github.com/aws/aws-sdk-go/aws" + awscs "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/sts" + "github.com/gogf/gf/v2/frame/g" + "github.com/minio/minio-go/v7" + "github.com/minio/minio-go/v7/pkg/credentials" + "log" + "os" + "path/filepath" + "time" +) + +//// minio的配置信息 +//const ( +// Endpoint string = coryCommon.Global + ":9999" +// AccessKeyID string = "admin" +// SecretAccessKey string = "12345678" +// BucketName string = "cory-create" +// RoleARN string = "arn:aws:s3:::cory-create/*" +// RoleSessionName string = "anysession" +// Region string = "cn-chengdu" +// UseSSL bool = true +// DurationSeconds int64 = 3600 +// +// // Endpoint string = "jl.yj-3d.com:8154" +// // AccessKeyID string = "minioadmin" +// // SecretAccessKey string = "minioadmin" +// // BucketName string = "cory-create" +// // RoleARN string = "arn:aws:s3:::cory-create/*" +// // RoleSessionName string = "anysession" +// // Region string = "cn-chengdu" +// // UseSSL bool = true +// // DurationSeconds int64 = 3600 +//) + +var ( + Endpoint string + AccessKeyID string + SecretAccessKey string + BucketName string + RoleARN string + RoleSessionName string + Region string + UseSSL bool + DurationSeconds int64 +) + +func init() { + Endpoint = g.Cfg().MustGet(context.Background(), "minio.endpoint").String() + AccessKeyID = g.Cfg().MustGet(context.Background(), "minio.accessKeyID").String() + SecretAccessKey = g.Cfg().MustGet(context.Background(), "minio.secretAccessKey").String() + BucketName = g.Cfg().MustGet(context.Background(), "minio.bucketName").String() + RoleSessionName = g.Cfg().MustGet(context.Background(), "minio.roleSessionName").String() + Region = g.Cfg().MustGet(context.Background(), "minio.region").String() + UseSSL = g.Cfg().MustGet(context.Background(), "minio.useSSL").Bool() + DurationSeconds = g.Cfg().MustGet(context.Background(), "minio.durationSeconds").Int64() + RoleARN = g.Cfg().MustGet(context.Background(), "minio.roleARN").String() + +} + +var ( + IsEnablingSSL = false //是否开启SSL安全 (只针对初始化客户端) +) + +// PublicMinioClient 初始化MinIO客户端 +func PublicMinioClient() (minioClient *minio.Client, err error) { + // 获取临时凭证 + token, accessKey, secretAccessKey := MinioVoucher() + // 初始化MinIO客户端 + minioClient, err = minio.New(Endpoint, &minio.Options{ + Creds: credentials.NewStaticV4(accessKey, secretAccessKey, token), + Secure: IsEnablingSSL, + }) + return +} + +// MinioVoucher 获取minio的临时凭证 +func MinioVoucher() (sessionToken, accessKey, secretKey string) { + // 创建AWS会话 + sess, err := session.NewSession(&aws.Config{ + Endpoint: aws.String(Endpoint), + DisableSSL: aws.Bool(UseSSL), + Region: aws.String(Region), + Credentials: awscs.NewStaticCredentials(AccessKeyID, SecretAccessKey, ""), + }) + if err != nil { + log.Printf("创建AWS会话错误:%v", err) + return + } + // 创建STS服务客户端 + stsSvc := sts.New(sess) + + // 获取STS凭证 + input := &sts.AssumeRoleInput{ + RoleArn: aws.String(RoleARN), + RoleSessionName: aws.String(RoleSessionName), + DurationSeconds: aws.Int64(DurationSeconds), + } + result, err := stsSvc.AssumeRole(input) + if err != nil { + fmt.Println("获取STS凭证错误:", err) + return + } + // 获取STS凭证的Token、AccessKey和SecretKey + sessionToken = *result.Credentials.SessionToken + accessKey = *result.Credentials.AccessKeyId + secretKey = *result.Credentials.SecretAccessKey + return +} + +/* +TheTemporaryAccessUrlIsObtainedBasedOnThePrefixOfTheSpecifiedBucket 根据指定桶的前缀获取到临时访问URL +bucketName:桶名 +prefix:前缀 +expiry:URL能够访问的时间(最长7天或至少1秒) expiry := 3 * 24 * time.Hour 3天时间访问Url +isRecursion:是否递归 +*/ +func TheTemporaryAccessUrlIsObtainedBasedOnThePrefixOfTheSpecifiedBucket(ctx context.Context, minioClient *minio.Client, bucketName string, prefix string, expiry time.Duration, isRecursion bool) (url []string) { + //1、获取递归集 + objectSet := ListAndGenerateURLs(ctx, minioClient, bucketName, prefix, isRecursion) + //2、根据集获取到临时可访问的URL + for _, object := range objectSet { + preSignature := GenerateAnOnlineScopedUrlBasedOnTheObject(ctx, minioClient, bucketName, object.Key, expiry) + url = append(url, preSignature) + } + return +} + +/* +DownloadTheFileWithTheSpecifiedPrefixBasedOnTheObjectSet 根据对象集下载指定前缀的文件 +bucketName:桶名 +prefix:前缀 +filePath:下载后保存路径 +isRecursion:是否递归获取对象集 +*/ +func DownloadTheFileWithTheSpecifiedPrefixBasedOnTheObjectSet(ctx context.Context, minioClient *minio.Client, bucketName string, prefix string, filePath string, isRecursion bool) (err error) { + objectList := ListAndGenerateURLs(ctx, minioClient, bucketName, prefix, isRecursion) + for _, object := range objectList { + //split := strings.Split(object.Key, "/") + //wz := split[len(split)-1] + //fileName := strings.Split(wz, ".")[0] + //if strings.Contains(fileName, "W") { + // fmt.Println(wz) + //} + err = minioClient.FGetObject(ctx, bucketName, object.Key, filepath.ToSlash(filePath+"/"+object.Key), minio.GetObjectOptions{}) + if err != nil { + fmt.Println("下载minio资源失败:", err) + return err + } + } + return +} + +/* +DeletesTheFileWithTheSpecifiedPrefixBasedOnTheObjectSet 根据对象集删除指定前缀的文件 +bucketName:桶名 +prefix:前缀 +isRecursion:是否递归获取对象集 +*/ +func DeletesTheFileWithTheSpecifiedPrefixBasedOnTheObjectSet(ctx context.Context, minioClient *minio.Client, bucketName string, prefix string, isRecursion bool) (err error) { + objectList := ListAndGenerateURLs(ctx, minioClient, bucketName, prefix, isRecursion) + for _, object := range objectList { + err = minioClient.RemoveObject(ctx, bucketName, object.Key, minio.RemoveObjectOptions{}) + if err != nil { + fmt.Println("删除minio资源失败:", err) + return err + } + } + return +} + +/* +UploadDataAccordingToTemporaryCredentials 根据临时凭证上传数据 +filePath:本地文件路径 +objectName:存储到minio的地址(桶+前缀) 示例:cory-create/uav/key.txt +*/ +func UploadDataAccordingToTemporaryCredentials(filePath string, objectName string) (err error) { + minioClient, err := PublicMinioClient() + if err != nil { + return + } + // 打开文件 + file, err := os.Open(filePath) + if err != nil { + fmt.Println("Error opening file:", err) + return + } + defer file.Close() + // 使用minio-go的PutObject方法上传文件 + n, err := minioClient.PutObject(context.Background(), BucketName, objectName, file, -1, minio.PutObjectOptions{}) + if err != nil { + fmt.Println("Error uploading file:", err) + return + } + fmt.Printf("Successfully uploaded %s of size %d\n", objectName, n) + return err +} + +//========================================================================================================================= +//========================================================================================================================= +//========================================================================================================================= +//========================================================================================================================= +//========================================================================================================================= +//========================================================================================================================= +//========================================================================================================================= +//========================================================================================================================= + +/* +ListAndGenerateURLs 获取指定前缀下的对象集 +bucketName:桶名 +prefix:前缀(获取哪个下面的对象集) 示例:"uav/9b0af64e1c274105b157a9781961ed99/DJI_202405170903_001_9b0af64e1c274105b157a9781961ed99" +isRecursion:是否递归 +*/ +func ListAndGenerateURLs(ctx context.Context, minioClient *minio.Client, bucketName string, prefix string, isRecursion bool) (objectInfo []minio.ObjectInfo) { + // 设置递归为 true,以获取所有对象,包括子目录中的对象 + objectCh := minioClient.ListObjects(ctx, bucketName, minio.ListObjectsOptions{ + Prefix: prefix, + Recursive: isRecursion, + }) + // 等待通道中的对象被填充 + for object := range objectCh { + if object.Err != nil { + fmt.Println("获取对象列表失败:", object.Err) + continue + } + objectInfo = append(objectInfo, object) + //fmt.Println("对象名称:", object.Key) + } + return +} + +// GenerateAnOnlineScopedUrlBasedOnTheObject 根据对象集生成可在线访问的URL +func GenerateAnOnlineScopedUrlBasedOnTheObject(ctx context.Context, minioClient *minio.Client, bucketName string, objectName string, expiry time.Duration) string { + // 生成预签名的 GET URL + presignedURL, err := minioClient.PresignedGetObject(ctx, bucketName, objectName, expiry, nil) + if err != nil { + log.Fatalf("生成预签名 URL 失败:%v", err) + } + //// 使用预签名 URL 访问对象 + //resp, err := minioClie. + //nt.GetObject(ctx, bucketName, objectName, minio.GetObjectOptions{}) + //if err != nil { + // log.Fatalf("获取对象失败:%v", err) + //} + //defer resp.Close() + return presignedURL.String() +} + +// StatObjectFunc 获取对象的元数据 +func StatObjectFunc(ctx context.Context, minioClient *minio.Client, bucketName string, objectName string) (objInfo minio.ObjectInfo, err error) { + objInfo, err = minioClient.StatObject(ctx, bucketName, objectName, minio.GetObjectOptions{}) + return +} diff --git a/third/plane/event/event.go b/third/plane/event/event.go new file mode 100644 index 0000000..66f157d --- /dev/null +++ b/third/plane/event/event.go @@ -0,0 +1,88 @@ +package event + +// eventHandlerInfo定义了事件处理器的信息 +type eventHandlerInfo struct { + handler EventHandler // 事件处理函数 + once bool // 是否只执行一次 +} + +// EventHandler定义了事件处理函数的类型 +type EventHandler func(params ...any) + +// Event表示一个事件对象 +type Event struct { + handlers []eventHandlerInfo // 事件处理器列表 +} + +// Attach将事件处理器附加到事件对象中,并返回处理器在列表中的索引 +func (e *Event) Attach(handler EventHandler) int { + handlerInfo := eventHandlerInfo{handler, true} //默认只执行一次 + for i, h := range e.handlers { + if h.handler == nil { + e.handlers[i] = handlerInfo + return i + } + } + + e.handlers = append(e.handlers, handlerInfo) + + return len(e.handlers) - 1 +} + +// Detach从事件对象中移除指定索引处的处理器 +func (e *Event) Detach(handle int) { + e.handlers[handle].handler = nil +} + +// Once将事件处理器附加到事件对象中,并将处理器标记为只执行一次 +func (e *Event) Once(handler EventHandler) { + i := e.Attach(handler) + e.handlers[i].once = true +} + +// EventPublisher表示事件发布者 +type EventPublisher struct { + event Event // 事件对象 +} + +// Event返回事件对象的指针 +func (p *EventPublisher) Event() *Event { + return &p.event +} + +// Publish触发事件,依次执行事件对象中的处理器,并在处理器标记为只执行一次时将其从事件对象中移除 +func (p *EventPublisher) Publish(params ...any) { + for i, h := range p.event.handlers { + if h.handler != nil { + h.handler(params...) + if h.once { + p.event.Detach(i) + } + } + } +} + +func GetEvent(fn func(params ...any)) *EventPublisher { + publisher := &EventPublisher{} + + // 定义一个事件处理器函数 + handler := fn + // 将事件处理器附加到事件列表中 + publisher.Event().Attach(handler) + return publisher +} + +/*func main() { + // 在这里编写您的代码逻辑 + // 创建一个事件发布者 + publisher := &EventPublisher{} + + // 定义一个事件处理器函数 + handler := func() { + fmt.Println("Event handled!") + } + // 将事件处理器附加到事件列表中 + publisher.Event().Attach(handler) + // 发布事件 + publisher.Publish() +}*/ diff --git a/third/plane/globe/globe.go b/third/plane/globe/globe.go new file mode 100644 index 0000000..fc0f613 --- /dev/null +++ b/third/plane/globe/globe.go @@ -0,0 +1,125 @@ +package globe + +import ( + "errors" + "github.com/gogf/gf/v2/net/ghttp" + "gorm.io/gorm" + "net/http" + "strconv" + "sync" +) + +const ( + ALL = -1 //所有 + ENABLE = 1 + DISABLE = 0 + DESC = "desc" + ASC = "asc" + PAGE = 1 + PAGESIZE = 10 + ONLINE = 1 + OFFLINE = 0 + DEFAULTPWD = "123456" + DEFAULTUSR = "admin" +) + +var DepartName = "一级部门" //默认的一级部门名称 +var IS_OFFLINE_VERSION = true //是否为单机版本 +const SOURCE = "static/source/" + +type WS_MAP map[string]*ghttp.WebSocket + +var WS_Status_map WS_MAP //状态数据ws +var WS_Progress_drone_open_map WS_MAP //飞行器开机进度ws +var WS_Progress_drone_close_map WS_MAP //飞行器关机进度ws +var WS_Progress_cover_open_map WS_MAP //机库打开舱盖进度ws +var WS_Progress_cover_close_map WS_MAP //机库关闭舱盖进度ws +var WS_Progress_device_reboot_map WS_MAP //机库重启进度ws +var WS_Progress_putter_open_map WS_MAP //推杆展开进度ws +var WS_Progress_putter_close_map WS_MAP //推杆闭合进度ws +var WS_Reply WS_MAP //状态恢复 + +var MutexRw sync.RWMutex //map的读写锁 + +const ( + TILESET = "tileset" + BIM = "bim" + LAYER = "layer" + TERRAIN = "terrain" + POINT = "point" + LINE = "line" + AREA = "area" + MODEL = "model" + KML = "kml" + GEOJSON = "geojson" +) + +const ( + PAK = ".pak" + MBTILES = ".mbtiles" + CLT = ".clt" + JCT = ".jct" +) + +var ( + PORT = "80" + HOST = "" + PROTOCOL = "" + KEY = "" + CRT = "" +) + +const ( + HTTP = "http" + HTTPS = "https" +) + +func GetErrors(msg string) error { + return errors.New(msg) +} + +func GetAddr() string { + //单机版本时 无代理,需要补全地址 + if IS_OFFLINE_VERSION { + return PROTOCOL + "://" + HOST + ":" + PORT + "/" + } + //网络版时 有代理 不需要补全地址 + return "" +} + +/*clt数据包*/ +type Tile struct { + MD5 string `json:"md5"` + PATH string `json:"path"` + Tile []byte `json:"tile"` + Type string `json:"type"` +} + +func RenderData(request *ghttp.Request, data []byte) { + request.Response.Header().Set("Cache-Control", "private,max-age="+strconv.Itoa(60*60)) + request.Response.WriteHeader(http.StatusOK) + request.Response.Writer.Write(data) +} +func CloseDB(db *gorm.DB) { + s, err := db.DB() + if err != nil { + return + } + s.Close() +} + +var IS_AUTH_SUCCESS = false //是否授权通过 + +func CheckAuth() bool { + return IS_AUTH_SUCCESS +} +func SetAuth(auth bool) { + IS_AUTH_SUCCESS = auth +} + +/*坐标点*/ +type Point struct { + Lng float64 `json:"lng" v:"required"` + Lat float64 `json:"lat" v:"required"` + Alt float64 `json:"alt" v:"required"` +} diff --git a/third/plane/mqtt/emqx.go b/third/plane/mqtt/emqx.go new file mode 100644 index 0000000..0ad09a0 --- /dev/null +++ b/third/plane/mqtt/emqx.go @@ -0,0 +1,197 @@ +package mqtt + +import ( + "context" + "fmt" + mqtt "github.com/eclipse/paho.mqtt.golang" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gctx" + "github.com/gogf/gf/v2/os/gtimer" + "github.com/tiger1103/gfast/v3/third/plane/dj" + "github.com/tiger1103/gfast/v3/third/plane/event" + "strings" + "time" +) + +var timer *gtimer.Timer +var client mqtt.Client +var eventMap map[string]*event.EventPublisher + +const ( + osd = "osd" //设备端定频向云平台推送的设备属性(properties), 具体内容范围参见物模型内容 + state = "state" //设备端按需上报向云平台推送的设备属性(properties), 具体内容范围参见物模型内容 + services_reply = "services_reply" //设备对 service 的回复、处理结果 + events = "events" //设备端向云平台发送的,需要关注和处理的事件。 比如SD满了,飞机解禁禁飞区等信息(事件范围参见物模型内容) + status = "status" //设备上下线、更新拓扑 + set_reply = "set_reply" //设备属性设置的响应 + requests = "requests" //设备端向云平台发送请求,为了获取一些信息,比如上传的临时凭证 + services = "services" //云平台向设备发送的服务(具体service identifier 见物模型内容)。 +) + +var MsgCallBackMap map[string]CB + +func InitMQTT() { + eventMap = make(map[string]*event.EventPublisher) + timer = gtimer.New() + initMsgs() + dj.InitError() + connect() +} + +func initMsgs() { + MsgCallBackMap = make(map[string]CB) + msgs := []CB{ + {osd, dealOsd, nil}, + {state, deal_state, nil}, + {requests, deal_requests, nil}, + {services_reply, deal_services_reply, nil}, + {status, deal_status, nil}, + {events, deal_events, nil}, + {services, deal_services, nil}, + } + for _, msg := range msgs { + MsgCallBackMap[msg.Flag] = msg + } +} + +type CB struct { + Flag string + Recv func(mqtt.Client, mqtt.Message) //接收消息 + Reply func(mqtt.Client, mqtt.Message) //回复消息 +} + +func connect() { + host := g.Cfg().MustGet(gctx.New(), "mqtt.host").String() + port := g.Cfg().MustGet(gctx.New(), "mqtt.port").String() + username := g.Cfg().MustGet(gctx.New(), "mqtt.username").String() + password := g.Cfg().MustGet(gctx.New(), "mqtt.password").String() + clientid := g.Cfg().MustGet(gctx.New(), "mqtt.clientid").String() + topics := g.Cfg().MustGet(gctx.New(), "mqtt.topics").String() + fmt.Println(host, port, username, password, clientid, topics, "tcp://"+host+":"+port) + opts := mqtt.NewClientOptions() + opts.AddBroker("tcp://" + host + ":" + port) // 设置MQTT代理服务器地址 + opts.SetClientID(clientid) // 设置客户端ID + opts.SetPassword(password) // 设置客户端ID + opts.SetUsername(username) // 设置客户端ID + // 处理消息接收 + opts.SetDefaultPublishHandler(receiveHandler) + opts.SetConnectionLostHandler(disconnected) + opts.SetOnConnectHandler(connected) + opts.SetKeepAlive(1000 * time.Second) //超时等待,防止客户端掉线 + opts.SetAutoReconnect(true) + client = mqtt.NewClient(opts) + // 连接MQTT代理服务器 + if token := client.Connect(); token.Wait() && token.Error() != nil { + panic(token.Error()) + } + arr := strings.Split(topics, ",") + for _, topic := range arr { + // 订阅主题 + fmt.Println("订阅主题", topic) + if token := client.Subscribe(topic, 0, nil); token.Wait() && token.Error() != nil { + fmt.Println(token.Error()) + } + //fmt.Println(topic) + } + + //ctx := gctx.New() + ////格式化 + //DeviceFormat(ctx, "4SEDL9C001X8GE") + //DroneFormat(ctx, "4SEDL9C001X8GE") + //DeviceFormat(ctx, "7CTDM4100BG7HV") + //DroneFormat(ctx, "7CTDM4100BG7HV") + + //飞机升级 + //OtaCreateFunc(ctx, "8UUXN4P00A06NK") + + //gtimer.SetTimeout(gctx.New(), 2*time.Second, func(ctx context.Context) { + //sn := "4SEDL9C001X8GE" + //err, d := speaker_audio_play_start(sn) + //if err != nil { + // fmt.Println(err) + // return + //} + //整一个pcm的音频文件 + // point := dj.Point{} + // point.Longitude = 106.541923087 + // point.Latitude = 23.458531397 + // point.Height = 823.8873291015625 + 10 + // //err, d := Flight_authority_grab(sn) + // //if err != nil { + // // return + // //} + // err, d := Fly_to_point(sn, point) + //fmt.Println(d) + // fmt.Println(err) + // + // sn = "4TADL210010014" //中煤广西机库的sn + // //// //sn = "4TADL2E001002D" //机库的sn + // //// //sn = "1581F5BMD2323001S928" //飞机的sn + // ////dev_sn := "1581F5BMD23280014131" //吉林飞机的sn + // //dev_sn := "1581F5BMD238V00172JR" //吉林飞机的sn + // //camera_index := "165-0-7" //机库的摄像头id + // ////camera_index = "53-0-0" //飞机摄像头1的id + // //camera_index = "39-0-7" //飞机摄像头2的id + // //Debug_mode_open(sn) //调试模式,先调试模式才能飞行器开机,推流不需要調試 + // //Debug_mode_close(sn) + // //err, d := Cover_open(sn) //打开舱盖 + // //err, d := Cover_close(sn) + // //err, d := Drone_open(sn) //飞行器开机 + // //err, d := Drone_close(sn) //飞行器关机 + // //err, d := Device_reboot(sn) + // // + // //fmt.Println(d) + // //if err != nil { + // // fmt.Println(err) + // //} //打开舱盖 + // ////fmt.Println("打开舱盖") + // //err, d := Live_start_push(sn, sn, camera_index) + // //err, d := Live_stop_push(sn, sn, camera_index) + // + // //fmt.Println(d) + // //if err != nil { + // // fmt.Println(err) + // // return + // //} //关闭舱盖 + // ////fmt.Println(d.Data.Result) + // //// //device_reboot() + // //// //if err != nil { + // //// // return + // //// //} + // //// //fmt.Println(d) + // //// //live_stop_push(sn, sn, camera_index) + // //// + //}) +} + +func receiveHandler(client mqtt.Client, msg mqtt.Message) { + topic := msg.Topic() + arrs := strings.Split(topic, "/") + + tp := arrs[len(arrs)-1] + if v, ok := MsgCallBackMap[tp]; ok { + v.Recv(client, msg) + if v.Reply != nil { + v.Reply(client, msg) + } + } else { + fmt.Println("非法topic", topic) + } +} +func disconnected(client mqtt.Client, err error) { + fmt.Println("断开了,准备重连") + if err != nil { + fmt.Println(err) + g.Log("uav").Error(gctx.New(), err) + } + + timer.Start() + timer.Add(gctx.New(), time.Second*5, func(ctx context.Context) { + connect() + }) +} + +func connected(client mqtt.Client) { + fmt.Println("链接成功") + timer.Stop() +} diff --git a/third/plane/mqtt/entity.go b/third/plane/mqtt/entity.go new file mode 100644 index 0000000..3d8630e --- /dev/null +++ b/third/plane/mqtt/entity.go @@ -0,0 +1,31 @@ +package mqtt + +// LiveStreamingCapabilityUpdateEntity 直播能力更新 UP +type LiveStreamingCapabilityUpdateEntity struct { + Tid string `json:"tid"` + Bid string `json:"bid"` + Timestamp int64 `json:"timestamp"` + Gateway string `json:"gateway"` + Method string `json:"method"` + Data struct { + LiveCapacity struct { + AvailableVideoNumber int `json:"available_video_number"` + CoexistVideoNumberMax int `json:"coexist_video_number_max"` + DeviceList []struct { + Sn string `json:"sn"` + AvailableVideoNumber int `json:"available_video_number"` + CoexistVideoNumberMax int `json:"coexist_video_number_max"` + CameraList []struct { + CameraIndex string `json:"camera_index"` + AvailableVideoNumber int `json:"available_video_number"` + CoexistVideoNumberMax int `json:"coexist_video_number_max"` + VideoList []struct { + VideoIndex string `json:"video_index"` + VideoType string `json:"video_type"` + SwitchableVideoTypes []string `json:"switchable_video_types"` + } `json:"video_list"` + } `json:"camera_list"` + } `json:"device_list"` + } `json:"live_capacity"` + } `json:"data"` +} diff --git a/third/plane/mqtt/msg_deal.go b/third/plane/mqtt/msg_deal.go new file mode 100644 index 0000000..c5d2a1d --- /dev/null +++ b/third/plane/mqtt/msg_deal.go @@ -0,0 +1,1282 @@ +package mqtt + +import ( + "encoding/json" + "errors" + "fmt" + mqtt "github.com/eclipse/paho.mqtt.golang" + "github.com/gogf/gf/v2/crypto/gmd5" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gctx" + "github.com/gogf/gf/v2/os/gtime" + _ "github.com/tiger1103/gfast-cache/cache" + "github.com/tiger1103/gfast/v3/api/v1/common/coryCommon" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + manageDeviceLogic "github.com/tiger1103/gfast/v3/internal/app/system/logic/manageDevice" + manageOperationLog "github.com/tiger1103/gfast/v3/internal/app/system/logic/manageOperationLog" + logic "github.com/tiger1103/gfast/v3/internal/app/system/logic/manageTaskRecord" + logicManageTaskRecordResource "github.com/tiger1103/gfast/v3/internal/app/system/logic/manageTaskRecordResource" + "github.com/tiger1103/gfast/v3/third/plane/dj" + "github.com/tiger1103/gfast/v3/third/plane/event" + "github.com/tiger1103/gfast/v3/third/plane/globe" + tool "github.com/tiger1103/gfast/v3/utility/coryUtils" + "golang.org/x/net/context" + "log" + "os" + "path/filepath" + "strconv" + "strings" + "time" +) + +// var ( +// +// DroneCoordinates = "sn:" //redisKey 无人机坐标 +// RainfallStr = "air:rainfall:" //redisKey 降雨量 {"0":"无雨","1":"小雨","2":"中雨","3":"大雨"} +// YunTai = "air:yuntai:" //redisKey 云台重置 +// +// ) +var ( + DroneCoordinates = "sn:" //redisKey 无人机坐标 + RainfallStr = "air:rainfall:" //redisKey 降雨量 {"0":"无雨","1":"小雨","2":"中雨","3":"大雨"} + YunTai = "air:yuntai:" //redisKey 云台重置 + Host string + Rtmp string + Http string +) + +func init() { + Host = g.Cfg().MustGet(context.Background(), "live.host").String() + Rtmp = g.Cfg().MustGet(context.Background(), "live.rtmp").String() + Http = g.Cfg().MustGet(context.Background(), "live.http").String() +} + +/*从topic中获取gatewaysn*/ +func GetGateWaySnFromTopic(topic string) string { + split := strings.Split(topic, "/") + return split[len(split)-2] +} +func dealOsd(client mqtt.Client, msg mqtt.Message) { + //存储飞机与飞行器的数据 + cory := dj.CoryAirportOrAircraft{} + //解析数据 + parsingOsd3(client, msg) + //0、获取公共信息 + pc := dj.Public{} + err := json.Unmarshal(msg.Payload(), &pc) + if err != nil { + return + } + sn := strings.Split(msg.Topic(), "/")[2] + key := DroneCoordinates + pc.Gateway + cory.HangarSn = pc.Gateway + //fmt.Println("osd上报------ ", string(msg.Payload())) + //1、Gateway与sn相同代表机场,否则代表无人机信息 + payload := string(msg.Payload()) + if pc.Gateway == sn { + cory.Airport = string(msg.Payload()) + //if strings.Contains(payload, "drone_battery_maintenance_info") { //无人机电池维护信息 + // dealOsd1Cory(client, cory, msg) + //} else if strings.Contains(payload, "wireless_link") { //无线电路 + // dealOsd2Cory(client, cory, msg) + //} else if strings.Contains(payload, "network_state") { //网络状态 + // dealOsd3Cory(client, cory, msg) + //} else if strings.Contains(payload, "live_status") { //直播状态 + // dealOsd4Cory(client, cory, msg) + //} + if strings.Contains(payload, "network_state") { //网络状态 + dealOsd3Cory(client, cory, msg) + } else { + dealOsd4Cory(client, cory, msg) + } + } else { + var entity *dj.M30tEntity + json.Unmarshal(msg.Payload(), &entity) + //数据不能为null,为null就不需要在执行下一步 + if entity != nil { + //1、获取当前飞机的坐标,然后存储到redis中 + ctx := gctx.New() + result := fmt.Sprintf("%v,%v,%v", entity.Data.Longitude, entity.Data.Latitude, entity.Data.Elevation) + _, err := g.Redis().Set(ctx, key, result) + if err != nil { + fmt.Println("无人机坐标存储数据失败:", err) + return + } + cory.Aircraft = string(msg.Payload()) + cory.AircraftSn = sn + //2、判断条件是否触发立即返航条件(电量) + percent := entity.Data.Battery.CapacityPercent + //power := entity.Data.Battery.ReturnHomePower + if percent <= 70 { + go Return_home(ctx, pc.Gateway) + } + //3、发送飞机飞行信息 + start_push_cory(globe.WS_Status_map, cory) + } + } +} + +// parsingOsd3 解析osd3 +func parsingOsd3(client mqtt.Client, msg mqtt.Message) { + payload := string(msg.Payload()) + if strings.Contains(payload, "rainfall") { //解析降雨量,后续下发任务的时候判断降雨量 + osd3 := dj.OSD3{} + err := json.Unmarshal(msg.Payload(), &osd3) + if err != nil { + g.Log("uav").Error(gctx.New(), err) + } + g.Redis().Set(gctx.New(), RainfallStr+osd3.Gateway, osd3.Data.Rainfall) + } +} + +// func dealOsd1Cory(client mqtt.Client, info dj.CoryAirportOrAircraft, msg mqtt.Message) { +// start_push_cory(globe.WS_Status_map, info) +// } +// +// func dealOsd2Cory(client mqtt.Client, info dj.CoryAirportOrAircraft, msg mqtt.Message) { +// start_push_cory(globe.WS_Status_map, info) +// } +func dealOsd3Cory(client mqtt.Client, info dj.CoryAirportOrAircraft, msg mqtt.Message) { + osd3 := dj.OSD3{} + err := json.Unmarshal(msg.Payload(), &osd3) + if err != nil { + return + } + point := dj.Point{} + point.Longitude = osd3.Data.Longitude + point.Latitude = osd3.Data.Latitude + point.Height = osd3.Data.Height + sn := GetGateWaySnFromTopic(msg.Topic()) + savePosition(sn, point) + //从redis中读取无人机最后一次的数据 + getValue, _ := g.Redis().Get(gctx.New(), DroneCoordinates+osd3.Gateway) + info.Coordinates = getValue.String() + start_push_cory(globe.WS_Status_map, info) +} +func dealOsd4Cory(client mqtt.Client, info dj.CoryAirportOrAircraft, msg mqtt.Message) { + start_push_cory(globe.WS_Status_map, info) +} + +/*存储机场位置*/ +func savePosition(gateway_sn string, point dj.Point) { + manageDeviceLogic.LongitudeAndLatitudeEdit(gateway_sn, point) +} + +// deal_events 事件 +func deal_events(client2 mqtt.Client, message mqtt.Message) { + pub := dj.Public{} + err := json.Unmarshal(message.Payload(), &pub) + if err != nil { + return + } + var _map globe.WS_MAP + switch pub.Method { + case dj.OtaProgress: + fmt.Println("固件升级进度:", string(message.Payload())) + break + case dj.Drone_open: + fmt.Println("飞机开机进度") + fmt.Println(string(message.Payload())) + StatusReply(message) + _map = globe.WS_Progress_drone_open_map + wspush(message, _map) + break + case dj.Drone_close: + StatusReply(message) + fmt.Println("飞机关机进度") + fmt.Println(string(message.Payload())) + _map = globe.WS_Progress_drone_close_map + wspush(message, _map) + break + case dj.Cover_open: + StatusReply(message) + _map = globe.WS_Progress_cover_open_map + wspush(message, _map) + break + case dj.Cover_close: + StatusReply(message) + _map = globe.WS_Progress_cover_close_map + wspush(message, _map) + break + case dj.Device_reboot: + fmt.Println("设备重启进度") + fmt.Println(string(message.Payload())) + _map = globe.WS_Progress_device_reboot_map + StatusReply(message) + wspush(message, _map) + break + case dj.Putter_open: + StatusReply(message) + _map = globe.WS_Progress_putter_open_map + wspush(message, _map) + break + case dj.Putter_close: + StatusReply(message) + _map = globe.WS_Progress_putter_close_map + wspush(message, _map) + break + case dj.Flighttask_ready: //任务就绪 + fmt.Println("任务就绪") + fmt.Println(string(message.Payload())) + break + case dj.Return_home_info: //返航信息 + fmt.Println("返航信息") + fmt.Println(string(message.Payload())) + break + case dj.Flighttask_progress: //上报航线任务进度 + fmt.Println("航线执行进度") + go dealWaylineProgress(message) + break + case dj.File_upload_callback: //媒体文件上传结果上报 + fmt.Println("媒体文件上传结果上报") + fmt.Println(string(message.Payload())) + //解析回传结果 + fileUploadCallbackEntity := dj.FileUploadCallbackEntity{} + if err := json.Unmarshal(message.Payload(), &fileUploadCallbackEntity); err != nil { + log.Printf("媒体文件上传结果上报数据解析失败:%v", err) + } + //将解析的数据存储到mysql + logicManageTaskRecordResource.StoresBackMediaFilesToTheDatabaseFunc(gctx.New(), &fileUploadCallbackEntity) + break + case dj.Fly_to_point_progress: //flyto 执行结果事件通知 + fmt.Println("flyto 执行结果事件通知") + fmt.Println(string(message.Payload())) + break + case dj.Fileupload_progress: //文件上传进度通知(远程日志) + fmt.Println("文件上传进度通知(远程日志)") + fmt.Println(string(message.Payload())) + break + } + +} + +// deal_services 事件 +func deal_services(client2 mqtt.Client, message mqtt.Message) { + pub := dj.Public{} + err := json.Unmarshal(message.Payload(), &pub) + if err != nil { + return + } + //根据方法得到对应得数据信息 + switch pub.Method { + case dj.FileuploadList: //获取设备可上传的文件列表 + break + case dj.FileuploadStart: //发起日志文件上传 + break + case dj.OtaCreate: //发起日志文件上传 + + break + } +} + +func StatusReply(message mqtt.Message) { + public := dj.Public{} + err := json.Unmarshal(message.Payload(), &public) + if err != nil { + return + } + reply := dj.StatusReply{} + reply.Method = public.Method + reply.Tid = public.Tid + reply.Bid = public.Bid + reply.Timestamp = gtime.TimestampMilli() + reply.Data.Result = 0 + sn := GetGateWaySnFromTopic(message.Topic()) + marshal, _ := json.Marshal(reply) + client.Publish(dj.GetEventsReplyTopic(sn), 1, true, string(marshal)) +} + +func dealWaylineProgress(message mqtt.Message) (err error) { + waylineProgress := dj.WaylineProgress{} + err = json.Unmarshal(message.Payload(), &waylineProgress) + if err != nil { + fmt.Println(err) + return + } + entity := waylineProgress.Data.Output + + //if waylineProgress.Data.Result > 0 { + // err = Geterror(waylineProgress.Data.Result) + // fmt.Println(err) + // return + //} + + ctx := gctx.New() + //1、根据计划ID得到最近一次飞行的航线信息,然后给当前航线填入航线ID等信息 + //if strings.Contains(str, "wayline_id") { + if entity.Status == "ok" || entity.Status == "paused" { + gmp := g.Map{ + "route_id": entity.Ext.WaylineId, + "interrupt_cause": entity.Ext.BreakPoint.BreakReason, + "dd_index": entity.Ext.BreakPoint.Index, + "dd_state": entity.Ext.BreakPoint.State, + "course_reversal": tool.MillisecondTimestamp(), + "accomplish": tool.MillisecondTimestamp(), + } + if entity.Ext.BreakPoint.Progress > 0 { + gmp["dd_progress"] = entity.Ext.BreakPoint.Progress + } + if entity.Ext.TrackId != "" { + gmp["track_id"] = entity.Ext.TrackId + } + dao.ManageTaskRecord.Ctx(ctx). + Where("flight_id", entity.Ext.FlightId). + OrderDesc("id"). + Update(gmp) + } + //} + //2、航线为>0或者100的时候变更云台的方向 + gatewaySn := GetGateWaySnFromTopic(message.Topic()) + if entity.Progress.Percent >= 0 && entity.Progress.Percent < 95 { + key := YunTai + gatewaySn + ":1" + get, _ := g.Redis().Get(ctx, key) + if !get.Bool() { + sxt, _ := dealWaylineProgressSQL(ctx, gatewaySn) + err, reply := Gimbal_reset(ctx, gatewaySn, sxt, 1) + if err == nil && reply.Data.Result == 0 { + //存放redis 每60过期秒 + g.Redis().SetEX(ctx, key, true, 60) + } + } + } + g.Log("uav").Error(ctx, waylineProgress.Data.Output.Ext.FlightId+"返航进度---- "+strconv.Itoa(entity.Progress.Percent)) + if entity.Progress.Percent == 100 { + key := YunTai + gatewaySn + ":0" + get, _ := g.Redis().Get(ctx, key) + if !get.Bool() { + sxt, _ := dealWaylineProgressSQL(ctx, gatewaySn) + err, reply := Gimbal_reset(ctx, gatewaySn, sxt, 0) + if err == nil && reply.Data.Result == 0 { + //存放redis 每60秒过期 + g.Redis().SetEX(ctx, key, true, 60) + } + if entity.Status == "ok" { + //到达一百的时候变更当前航线任务的状态 + dao.ManageTaskRecord.Ctx(ctx). + Where("flight_id", waylineProgress.Data.Output.Ext.FlightId). + WhereNull("accomplish"). + Update(g.Map{"accomplish": tool.MillisecondTimestamp()}) + } + } + } + return err +} + +func dealWaylineProgressSQL(ctx context.Context, gatewaySn string) (string, error) { + sxt, err := g.DB().Model("manage_device_video").Ctx(ctx). + Where("type = 1").Where("gateway_sn", gatewaySn).OrderDesc("id").Limit(1).Fields("son_sn"). + Cache(gdb.CacheOption{ + Duration: time.Hour, + Force: false, + }).Value() + return sxt.String(), err +} + +func wspush(msg mqtt.Message, _map globe.WS_MAP) { + if _map != nil { + start_push(_map, msg) + } +} + +func start_push(_map globe.WS_MAP, msg mqtt.Message) { + globe.MutexRw.Lock() + for _, socket := range _map { + socket.WriteMessage(1, msg.Payload()) + } + globe.MutexRw.Unlock() +} + +// cory 提供给osd使用的(用来区分机场和无人机的数据) +func start_push_cory(_map globe.WS_MAP, info dj.CoryAirportOrAircraft) { + globe.MutexRw.Lock() + for _, socket := range _map { + marshal, _ := json.Marshal(info) + socket.WriteMessage(1, marshal) + } + globe.MutexRw.Unlock() +} + +// deal_requests 请求 +func deal_requests(client mqtt.Client, msg mqtt.Message) { + pub := dj.Public{} + err := json.Unmarshal(msg.Payload(), &pub) + if err != nil { + fmt.Println(err) + return + } + switch pub.Method { + case dj.Airport_organization_bind: //处理数据库 + fmt.Println("设备绑定到组织") + fmt.Println(string(msg.Payload())) + break + case dj.Airport_organization_get: + break + case dj.Flighttask_resource_get: + fmt.Println("获取任务资源了") + fmt.Println(string(msg.Payload())) + flighttask_resource_get(client, msg) + break + case dj.Airport_bind_status: + break + case dj.Config: + pb := dj.Public{} + if err = json.Unmarshal(msg.Payload(), &pb); err != nil { + fmt.Println(err) + } + reply := dj.ConfigReply{} + reply.SetDefaultValue() + reply.Tid = pb.Tid + reply.Bid = pb.Bid + marshal, err := json.Marshal(reply) + if err != nil { + fmt.Println(err) + } + topic := msg.Topic() + "_reply" + fmt.Println("配置更新开始推送", topic, string(marshal)) + client.Publish(topic, 1, true, string(marshal)) + break + case dj.Storage_config_get: + pb := dj.Public{} + if err = json.Unmarshal(msg.Payload(), &pb); err != nil { + fmt.Println(err) + } + get := dj.StorageConfigGetReply{} + get.SetDefaultValue() + get.Tid = pb.Tid + get.Bid = pb.Bid + marshal, err := json.Marshal(get) + if err != nil { + fmt.Println(err) + } + topic := msg.Topic() + "_reply" + fmt.Println("临时凭证开始推送", topic, string(marshal)) + client.Publish(topic, 1, true, string(marshal)) + break + } + + //fmt.Println("获取数据了", string(msg.Payload())) +} +func deal_state(client mqtt.Client, msg mqtt.Message) { + + // 获取当前可执行文件所在的目录 + dir, _ := os.Getwd() + // 拼接文件路径 + filePath := filepath.Join(dir, "output.txt") + // 以追加模式打开文件,如果文件不存在则创建 + file, _ := os.OpenFile(filePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + defer file.Close() + // 写入内容并添加两个换行符 + file.WriteString(string(msg.Payload()) + "\n\n") + + payload := string(msg.Payload()) + fmt.Println("设备端按需上报向云平台推送的设备属性", payload) + + var ai *dj.AircraftInformation + err := json.Unmarshal(msg.Payload(), &ai) + if err != nil { + return + } + if ai != nil { + start_push(globe.WS_Status_map, msg) + } + + if strings.Contains(payload, "live_capacity") { + var lscue *LiveStreamingCapabilityUpdateEntity + err := json.Unmarshal(msg.Payload(), &lscue) + if err != nil { + fmt.Println("《直播能力更新》数据转换失败!") + } + var gatewaySn = "" + var mp []g.Map + for i, data := range lscue.Data.LiveCapacity.DeviceList { + if i == 0 { //机场 与 子设备(摄像头) + for _, dataOne := range data.CameraList { + count, _ := g.DB().Model("manage_device_video"). + Where("gateway_sn", data.Sn). + Where("device_sn", data.Sn). + Where("son_sn", dataOne.CameraIndex).Count() + if count == 0 { + mp = append(mp, g.Map{ + "type": i, + "gateway_sn": data.Sn, + "device_sn": data.Sn, + "son_sn": dataOne.CameraIndex, + }) + if data.Sn != "" { + gatewaySn = data.Sn + } + } + } + } + if i == 1 { //飞机 与 子设备(摄像头) + for _, dataOne := range data.CameraList { + count, _ := g.DB().Model("manage_device_video"). + Where("gateway_sn", gatewaySn). + Where("device_sn", data.Sn). + Where("son_sn", dataOne.CameraIndex).Count() + if count == 0 && gatewaySn != "" { + mp = append(mp, g.Map{ + "type": i, + "gateway_sn": gatewaySn, + "device_sn": data.Sn, + "son_sn": dataOne.CameraIndex, + }) + } + } + } + } + if len(mp) > 0 { + g.DB().Model("manage_device_video").Insert(mp) + } + } +} +func deal_status(client mqtt.Client, msg mqtt.Message) { + pub := dj.Public{} + err := json.Unmarshal(msg.Payload(), &pub) + if err != nil { + fmt.Println(err) + return + } + switch pub.Method { + case dj.Update_topo: //cory20250605 + fmt.Println("准备拓扑更新:", string(msg.Payload())) + var reply dj.StatusReply + reply.Timestamp = gtime.Now().TimestampMilli() + reply.Bid = pub.Bid + reply.Tid = pub.Tid + reply.Method = "update_topo" + reply.Data.Result = 0 + marshal, err := json.Marshal(reply) + if err != nil { + return + } + arr := strings.Split(msg.Topic(), "/") + client.Publish("sys/product/"+arr[2]+"/status_reply", 1, true, marshal) + break + } + st := dj.Status{} + json.Unmarshal(msg.Payload(), &st) + var reply dj.StatusReply + reply.Timestamp = st.Timestamp + reply.Bid = st.Bid + reply.Tid = st.Tid + reply.Method = "update_topo" + marshal, err := json.Marshal(reply) + if err != nil { + return + } + arr := strings.Split(msg.Topic(), "/") + client.Publish("sys/product/"+arr[2]+"/status_reply", 1, true, marshal) +} + +/*回复航线*/ +func flighttask_resource_get(client mqtt.Client, msg mqtt.Message) { + get := dj.FlighttaskResourcGet{} + err := json.Unmarshal(msg.Payload(), &get) + if err != nil { + return + } + //get.Data.FlightId + rsp := dj.FlighttaskResourcGetReply{} + rsp.Tid = get.Tid + rsp.Bid = get.Bid + rsp.Timestamp = gtime.Now().TimestampMilli() + rsp.Method = get.Method + arr := strings.Split(msg.Topic(), "/") + topic := dj.GetRequestsReplyTopic(arr[len(arr)-2]) + f, err := logic.GetManageAirlineFile(get.Data.FlightId) + if err != nil { + return + } + rsp.Data.Result = 0 + rsp.Data.Output.File.Fingerprint = f.Fingerprint + rsp.Data.Output.File.Url = f.Url + ReplyMsg(topic, rsp) + //rsp.Gateway = get. +} + +type File struct { + Url string `json:"url"` + Fingerprint string `json:"fingerprint"` +} + +func GetResource(flight_id string) File { + return File{} +} + +//func Live_start_push(gateway_sn, devsn, camera_index string) (error, *dj.StartLiveReply) { +// st := dj.StartLive{} +// st.SetDefaultValue() +// st.Data.UrlType = 1 +// //st.Data.Url = "serverIP=116.141.0.161&serverPort=7100&serverID=22010500002000000090&agentID=22010500002000000093&agentPassword=hik13579+&localPort=7060&channel=22010500002000000093" +// //st.Data.Url = "serverIP=jl.yj-3d.com&serverPort=15060&serverID=34020000002000000001&agentID=34020000001320000010&agentPassword=0000000&localPort=7060&channel=34020000001320000010" +// st.Data.VideoQuality = 4 +// st.Data.VideoId = devsn + "/" + camera_index + "/normal-0" +// md5 := gmd5.MustEncryptString(st.Data.VideoId) +// st.Data.Url = "rtmp://" + coryCommon.Global + ":9980/live/" + md5 +// topic := dj.GetServiceTopic(gateway_sn) +// +// //marshal, _ := json.Marshal(st) +// //fmt.Println("数据为:", string(marshal)) +// +// response := send(topic, st, st.Tid) +// +// sl := dj.StartLiveReply{} +// err := json.Unmarshal([]byte(response), &sl) +// if err != nil { +// return err, nil +// } +// sl.Data.Url = "http://" + coryCommon.Global + ":9991/live/" + md5 + ".flv" +// +// return nil, &sl +//} + +func Live_start_push(gateway_sn, devsn, camera_index string) (error, *dj.StartLiveReply) { + st := dj.StartLive{} + st.SetDefaultValue() + st.Data.UrlType = 1 + //st.Data.Url = "serverIP=116.141.0.161&serverPort=7100&serverID=22010500002000000090&agentID=22010500002000000093&agentPassword=hik13579+&localPort=7060&channel=22010500002000000093" + //st.Data.Url = "serverIP=jl.yj-3d.com&serverPort=15060&serverID=34020000002000000001&agentID=34020000001320000010&agentPassword=0000000&localPort=7060&channel=34020000001320000010" + st.Data.VideoQuality = 4 + st.Data.VideoId = devsn + "/" + camera_index + "/normal-0" + md5 := gmd5.MustEncryptString(st.Data.VideoId) + st.Data.Url = "rtmp://" + Host + ":" + Rtmp + "/live/" + md5 + topic := dj.GetServiceTopic(gateway_sn) + + //marshal, _ := json.Marshal(st) + //fmt.Println("数据为:", string(marshal)) + + response := send(topic, st, st.Tid) + + sl := dj.StartLiveReply{} + err := json.Unmarshal([]byte(response), &sl) + if err != nil { + return err, nil + } + sl.Data.Url = "http://" + Host + ":" + Http + "/live/" + md5 + ".live.flv" + + return nil, &sl +} + +// GB28181 多路推流无效,废弃GB28181 +//func Live_start_push(gateway_sn, devsn, camera_index string) (error, *dj.StartLiveReply) { +// gb := "34020000002000000001" +// port := strings.ReplaceAll(camera_index, "-", "") +// qvr := modifyString(gb, port) +// st := dj.StartLive{} +// st.SetDefaultValue() +// st.Data.UrlType = 3 +// st.Data.VideoQuality = 4 +// st.Data.VideoId = devsn + "/" + camera_index + "/normal-0" +// st.Data.Url = "serverIP=119.45.210.154&serverPort=15060&serverID=" + gb + "&agentID=" + qvr + "&agentPassword=12345678&localPort=" + port + "&channel=" + qvr +// fmt.Println(st.Data.Url, gateway_sn) +// topic := dj.GetServiceTopic(gateway_sn) +// response := send(topic, st, st.Tid) +// sl := dj.StartLiveReply{} +// err := json.Unmarshal([]byte(response), &sl) +// if err != nil { +// return err, nil +// } +// sl.Data.Url = "http://119.45.210.154:10000/api/v1/stream/start?serial=" + qvr + "&code=" + qvr +// +// return nil, &sl +//} + +func modifyString(gb, qvr string) string { + originalString := gb + targetLength := len(qvr) + resultString := "" + // 如果原始字符串长度小于目标长度,则直接拼接 + if len(originalString) < targetLength { + resultString = originalString + strings.Repeat("0", targetLength-len(originalString)) + qvr + } else { + // 将字符串转换为字节数组 + strBytes := []byte(originalString) + // 修改最右边的字符 + copy(strBytes[len(strBytes)-targetLength:], qvr) + // 将字节数组转换回字符串 + resultString = string(strBytes) + } + return resultString +} + +func Live_stop_push(gateway_sn, devsn, camera_index string) (error, *dj.StopLiveReply) { + st := dj.StopLive{} + st.SetDefaultValue() + st.Data.VideoId = devsn + "/" + camera_index + "/normal-0" + topic := dj.GetServiceTopic(gateway_sn) + //md5 := gmd5.MustEncryptString(st.Data.VideoId) + response := send(topic, st, st.Tid) + sl := dj.StopLiveReply{} + err := json.Unmarshal([]byte(response), &sl) + if err != nil { + return err, nil + } + return nil, &sl +} + +func deal_services_reply(client mqtt.Client, msg mqtt.Message) { + fmt.Println("消息响应了", msg.Topic()) + pub1 := dj.PublicTwo{} + err := json.Unmarshal(msg.Payload(), &pub1) + if err != nil { + return + } + //根据方法得到对应得数据信息 + switch pub1.Method { + case dj.FileuploadList: //获取设备可上传的文件列表 + fmt.Println("services_reply获取设备可上传的\t\t//获取所有日志消息上传到minio中\n\t\tvar rdata *dj.FileUpLoadListDownUp\n\t\terr := json.Unmarshal(msg.Payload(), &rdata)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\treply := dj.LogFileUploadReply{}\n\t\treply.SetDefaultValue(rdata)\n\t\tmarshal, err := json.Marshal(reply)\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\treplace := strings.Replace(msg.Topic(), \"_reply\", \"\", 1)\n\t\tclient.Publish(replace, 1, true, string(marshal))\n\t\tbreak文件列表==================>", string(msg.Payload())) + case dj.FileuploadStart: + fmt.Println("services_reply发起日志文件上传==================>", string(msg.Payload())) + break + case dj.DeviceFormat: + fmt.Println("机场数据格式化==================>", string(msg.Payload())) + break + case "drone_format": + fmt.Println("飞行器数据格式化==================>", string(msg.Payload())) + break + case dj.ReturnHome1: + fmt.Println("返航: ", string(msg.Payload())) + case dj.OtaCreate: + fmt.Println("固件升级: ", string(msg.Payload())) + } + publisher, ok := eventMap[pub1.Tid] + if ok { + publisher.Publish(msg.Payload()) + delete(eventMap, pub1.Tid) + } +} + +func ReplyMsg(topic string, dt interface{}) { + marshal, err := json.Marshal(dt) + if err != nil { + return + } + fmt.Println("回复任务资源消息", topic, string(marshal)) + client.Publish(topic, 1, true, string(marshal)) +} + +func send(topic string, dt interface{}, tid string) string { + marshal, err := json.Marshal(dt) + if err != nil { + return "" + } + fmt.Println("開始推送", topic, string(marshal)) + client.Publish(topic, 1, true, string(marshal)) + + mqttResponseChan := make(chan string) + + timeout := time.After(15 * time.Second) // 创建一个3秒后超时的定时器 + + e := event.GetEvent(func(argc ...any) { + /*这里的代码后执行*/ + fmt.Println("响应了") + delete(eventMap, tid) + b := argc[0].([]byte) + response := string(b) + fmt.Println(response) + mqttResponseChan <- response + }) + + eventMap[tid] = e + + select { + case response := <-mqttResponseChan: + return response + case <-timeout: + return "" + } + + //// 这里的代码会比前面的事件内部回调先执行,所以需 阻塞等待 MQTT 响应消息 + //response := <-mqttResponseChan + //return response +} + +func Device_reboot(gateway_sn string) (error, *dj.UsualReply) { + reboot := dj.Reboot{} + reboot.SetDefaultValue() + return send_msg(gateway_sn, reboot) +} + +func send_msg(gateway_sn string, in interface{}) (error, *dj.UsualReply) { + marshal, err := json.Marshal(in) + if err != nil { + return err, nil + } + public := dj.Public{} + err = json.Unmarshal(marshal, &public) + if err != nil { + return err, nil + } + topic := dj.GetServiceTopic(gateway_sn) + response := send(topic, in, public.Tid) + sl := dj.UsualReply{} + err = json.Unmarshal([]byte(response), &sl) + if err != nil { + return err, nil + } + return nil, &sl + +} + +func Debug_mode_open(ctx context.Context, gateway_sn string) (error, *dj.UsualReply) { + debug := dj.DebugOpen{} + debug.SetDefaultValue() + + err, reply := send_msg(gateway_sn, debug) + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, debug.Method, "down", reply.Data.Result) + } + return err, reply +} +func Debug_mode_close(ctx context.Context, gateway_sn string) (error, *dj.UsualReply) { + debug := dj.DebugClose{} + debug.SetDefaultValue() + err, reply := send_msg(gateway_sn, debug) + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, debug.Method, "down", reply.Data.Result) + } + return err, reply +} + +func Putter_close(ctx context.Context, gateway_sn string) (error, *dj.UsualReply) { + co := dj.PutterClose{} + co.SetDefaultValue() + err, reply := send_msg(gateway_sn, co) + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, co.Method, "down", reply.Data.Result) + } + return err, reply +} +func Putter_open(ctx context.Context, gateway_sn string) (error, *dj.UsualReply) { + co := dj.PutterOpen{} + co.SetDefaultValue() + err, reply := send_msg(gateway_sn, co) + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, co.Method, "down", reply.Data.Result) + } + return err, reply +} + +func Charge_close(ctx context.Context, gateway_sn string) (error, *dj.UsualReply) { + co := dj.ChargeClose{} + co.SetDefaultValue() + err, reply := send_msg(gateway_sn, co) + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, co.Method, "down", reply.Data.Result) + } + return err, reply +} +func Charge_open(ctx context.Context, gateway_sn string) (error, *dj.UsualReply) { + co := dj.ChargeOpen{} + co.SetDefaultValue() + err, reply := send_msg(gateway_sn, co) + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, co.Method, "down", reply.Data.Result) + } + return err, reply +} + +func Cover_open(ctx context.Context, gateway_sn string) (error, *dj.UsualReply) { + co := dj.CoverOpen{} + co.SetDefaultValue() + err, reply := send_msg(gateway_sn, co) + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, co.Method, "down", reply.Data.Result) + } + return err, reply +} + +func Cover_close(ctx context.Context, gateway_sn string) (error, *dj.UsualReply) { + co := dj.CoverClose{} + co.SetDefaultValue() + err, reply := send_msg(gateway_sn, co) + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, co.Method, "down", reply.Data.Result) + } + return err, reply +} + +func Drone_open(ctx context.Context, gateway_sn string) (error, *dj.UsualReply) { + fmt.Println("飞行器开机") + co := dj.DroneOpen{} + co.SetDefaultValue() + err, reply := send_msg(gateway_sn, co) + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, co.Method, "down", reply.Data.Result) + } + return err, reply +} + +func Drone_close(ctx context.Context, gateway_sn string) (error, *dj.UsualReply) { + co := dj.DroneClose{} + co.SetDefaultValue() + err, reply := send_msg(gateway_sn, co) + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, co.Method, "down", reply.Data.Result) + } + return err, reply +} + +/*执行任务*/ +func Flighttask_execute(ctx context.Context, gateway_sn, flight_id string) (error, *dj.UsualReply) { + co := dj.FlighttaskExecute{} + co.SetDefaultValue() + co.Data.FlightId = flight_id + + err, reply := send_msg(gateway_sn, co) + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, co.Method, "down", reply.Data.Result) + } + return err, reply +} + +/*取消任务*/ +func Flighttask_undo(ctx context.Context, gateway_sn string, flight_ids []string) (error, *dj.UsualReply) { + co := dj.FlighttaskUndo{} + co.SetDefaultValue() + co.Data.Flight_ids = flight_ids + + err, reply := send_msg(gateway_sn, co) + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, co.Method, "down", reply.Data.Result) + } + return err, reply +} + +/*航线暂停*/ +func Flighttask_pause(ctx context.Context, gateway_sn string) (error, *dj.UsualReply) { + co := dj.FlighttaskPause{} + co.SetDefaultValue() + err, reply := send_msg(gateway_sn, co) + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, co.Method, "down", reply.Data.Result) + } + return err, reply +} + +/*航线恢复*/ +func Flighttask_recovery(ctx context.Context, gateway_sn string) (error, *dj.UsualReply) { + co := dj.FlighttaskRecovery{} + co.SetDefaultValue() + + err, reply := send_msg(gateway_sn, co) + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, co.Method, "down", reply.Data.Result) + } + + return err, reply +} + +/*一键返航*/ +func Return_home(ctx context.Context, gateway_sn string) (error, *dj.UsualReply) { + co := dj.ReturnHome{} + co.SetDefaultValue() + + err, reply := send_msg(gateway_sn, co) + + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, co.Method, "down", reply.Data.Result) + } + + return err, reply +} + +/*取消返航*/ +func Return_home_cancel(ctx context.Context, gateway_sn string) (error, *dj.UsualReply) { + co := dj.FlighttaskRecovery{} + co.SetDefaultValue() + + err, reply := send_msg(gateway_sn, co) + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, co.Method, "down", reply.Data.Result) + } + return err, reply +} + +/*摄像头单拍(拍照)*/ +func Camera_photo_take(ctx context.Context, gateway_sn, payload_index string) (error, *dj.UsualReply) { + co := dj.CameraPhotoTake{} + co.SetDefaultValue() + co.Data.PayloadIndex = payload_index + + err, reply := send_msg(gateway_sn, co) + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, co.Method, "down", reply.Data.Result) + } + return err, reply +} + +/*重置云台*/ +func Gimbal_reset(ctx context.Context, gateway_sn, payload_index string, reset_mode int) (error, *dj.UsualReply) { + co := dj.GimbalReset{} + co.SetDefaultValue() + co.Data.PayloadIndex = payload_index + co.Data.ResetMode = reset_mode + err, reply := send_msg(gateway_sn, co) + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, co.Method, "down", reply.Data.Result) + } + return err, reply +} + +/*设置直播清晰度*/ +func Live_set_quality(ctx context.Context, gateway_sn, two_sn, payload_index string, enum int) (error, *dj.UsualReply) { + co := dj.LiveSetQuality{} + co.SetDefaultValue() + co.Data.VideoId = two_sn + "/" + payload_index + "/normal-0" + co.Data.VideoQuality = enum + err, reply := send_msg(gateway_sn, co) + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, co.Method, "down", reply.Data.Result) + } + return err, reply +} + +///*设置直播镜头*/ +//func Camera_photo_take(gateway_sn, payload_index string) (error, *dj.UsualReply) { +// co := dj.CameraPhotoTake{} +// co.SetDefaultValue() +// co.Data.PayloadIndex = payload_index +// return send_msg(gateway_sn, co) +//} + +/*下发任务*/ +func Flighttask_prepare(ctx context.Context, gateway_sn string, prepareRes *dj.FlighttaskPrepareRes) (string, int64, error, *dj.UsualReply) { + get, err := g.Redis().Get(ctx, RainfallStr+gateway_sn) + if err == nil && get.String() == " " { + err = errors.New("无法获取降雨量") + return "", 0, err, nil + } else if get.Int() > 0 { + err = errors.New("机舱外正在下雨,无法下发任务!") + return "", 0, err, nil + } + co := dj.FlighttaskPrepareRes{} + co.SetDefaultValueCory() + data := prepareRes.Data + co.Data.FlightId = data.FlightId + co.Data.TaskType = data.TaskType + co.Data.ExecuteTime = data.ExecuteTime + co.Data.WaylineType = data.WaylineType + co.Data.File = data.File + co.Data.RthAltitude = data.RthAltitude + co.Data.RthMode = data.RthMode + co.Data.OutOfControlAction = data.OutOfControlAction + co.Data.ExitWaylineWhenRcLost = data.ExitWaylineWhenRcLost + //断点信息 + if data.BreakPoint != nil { //断点续飞 + point := dj.BreakPoint{ + Index: data.BreakPoint.Index, + State: data.BreakPoint.State, + Progress: data.BreakPoint.Progress, + WaylineId: data.BreakPoint.WaylineId, + } + co.Data.BreakPoint = &point + } + err, reply := send_msg(gateway_sn, co) + tid := co.Tid + bid := co.Timestamp + + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, co.Method, "down", reply.Data.Result) + } + + return tid, bid, err, reply +} + +/*任务资源获取*/ +func Flighttask_resource_get(ctx context.Context, gateway_sn string, fileEneiey *dj.FileEntity) (error, *dj.UsualReply) { + co := dj.FlighttaskResourcGetReply{} + co.SetDefaultValue() + co.Data.Output.File.Fingerprint = fileEneiey.Fingerprint + co.Data.Output.File.Url = fileEneiey.Url + err, reply := send_msg(gateway_sn, co) + + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, co.Method, "down", reply.Data.Result) + } + + return err, reply +} + +/*获取通用错误*/ +func Geterror(code int) error { + if v, ok := dj.GetErrorMap()[code]; ok { + return globe.GetErrors(v.Msg) + } else { + //manageOperationLog.AddLog(gctx.New(), sn, method, direction, code) + return globe.GetErrors("未知错误:" + strconv.Itoa(code)) + } +} + +// 结束飞向目标点 +func Fly_to_point(ctx context.Context, gateway_sn string, point dj.Point) (error, *dj.UsualReply) { + toPoint := dj.FlyToPoint{} + toPoint.SetDefaultValue() + toPoint.Data.Points = append(toPoint.Data.Points, point) + toPoint.Data.MaxSpeed = 3 + toPoint.Data.FlyToId = gtime.TimestampMicroStr() + err, reply := send_msg(gateway_sn, toPoint) + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, toPoint.Method, "down", reply.Data.Result) + } + return err, reply +} + +// 结束飞向目标点 +func Fly_to_point_stop(ctx context.Context, gateway_sn string) (error, *dj.UsualReply) { + toPoint := dj.FlyToPointStop{} + toPoint.SetDefaultValue() + err, reply := send_msg(gateway_sn, toPoint) + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, toPoint.Method, "down", reply.Data.Result) + } + return err, reply +} + +/*飞行夺权*/ +func Flight_authority_grab(ctx context.Context, gateway_sn string) (error, *dj.UsualReply) { + grab := dj.FlightAuthorityGrab{} + grab.SetDefaultValue() + err, reply := send_msg(gateway_sn, grab) + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, grab.Method, "down", reply.Data.Result) + } + return err, reply +} + +// Fileupload_list 【远程日志】获取设备可上传的文件列表 +func Fileupload_list(ctx context.Context, gateway_sn string, module []string) (error, *dj.UsualReply) { + co := dj.FileUpLoadListDown{} + co.SetDefaultValue() + co.Data.ModuleList = module + err, reply := send_msg(gateway_sn, co) + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, co.Method, "down", reply.Data.Result) + } + return err, reply +} + +//// DeviceFormat 机场数据格式化 +//func DeviceFormat(ctx context.Context, gateway_sn string) (error, *dj.UsualReply) { +// co := dj.Public{} +// co.SetDefault() +// co.Method = "device_format" +// err, reply := send_msg(gateway_sn, co) +// if err == nil { //记录操作日志 +// //manageOperationLog.AddLog(ctx, gateway_sn, co.Method, "down", reply.Data.Result) +// } +// return err, reply +//} +// +//// DroneFormat 飞行器数据格式化 +//func DroneFormat(ctx context.Context, gateway_sn string) (error, *dj.UsualReply) { +// co := dj.Public{} +// co.SetDefault() +// co.Method = "drone_format" +// err, reply := send_msg(gateway_sn, co) +// if err == nil { //记录操作日志 +// manageOperationLog.AddLog(ctx, gateway_sn, co.Method, "down", reply.Data.Result) +// } +// return err, reply +//} + +func Speaker_tts_play_start(ctx context.Context, gateway_sn string) (error, *dj.UsualReply) { + sp := dj.SpeakerTtsPlayStart{} + sp.SetDefaultValue() + sp.Data.Tts.Name = "111" + sp.Data.Tts.Text = "111" + sp.Data.Tts.Md5 = "0bfb9bceee974f41a6ddfd81521bd795" + sp.Data.PsdkIndex = 2 + err, reply := send_msg(gateway_sn, sp) + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, sp.Method, "down", reply.Data.Result) + } + return err, reply +} + +func speaker_audio_play_start(ctx context.Context, gateway_sn string) (error, *dj.UsualReply) { + sp := dj.SpeakerAudioPlayStart{} + sp.SetDefaultValue() + sp.Data.PsdkIndex = 0 + sp.Data.File.Name = "output" + sp.Data.File.Url = "http://" + coryCommon.Global + ":8899/file/masterMask/coryStorageTemplate/output.pcm" + sp.Data.File.Md5 = "f69050c198f3a765a56020f5470d3bdf" + sp.Data.File.Format = "pcm" + err, reply := send_msg(gateway_sn, sp) + if err == nil { //记录操作日志 + manageOperationLog.AddLog(ctx, gateway_sn, sp.Method, "down", reply.Data.Result) + } + return err, reply +} + +func OtaCreateFunc(ctx context.Context, gateway_sn string) (error, *dj.UsualReply) { + sp := dj.OtaCreateEntity{Data: struct { + DeviceList []dj.OtaCreateDevice `json:"devices"` + }{ + DeviceList: []dj.OtaCreateDevice{ + { + FileName: "M4TD_13.01.00.07_pro.zip", + FileSize: 712498, + FileURL: "http://zmkg.cqet.top:8899/file/temporary/M4TD_13.01.00.07_pro.zip", + FirmwareUpgradeType: 3, + MD5: "acb28f172e62b38d2bfd797a522076a9", + ProductVersion: "13.01.00.07", + SN: "1581F8HGX253U00A0626", + }, + //{ + // FileName: "DOCK3_13.01.00.07_pro.zip", + // FileSize: 229252, + // FileURL: "http://zmkg.cqet.top:8899/file/temporary/DOCK3_13.01.00.07_pro.zip", + // FirmwareUpgradeType: 3, + // MD5: "c217ee9a0bfc4cdfdda0a89407c504d7", + // ProductVersion: "13.01.00.07", + // SN: "8UUXN4P00A06NK", + //}, + }, + }} + sp.SetDefaultValue() + err, reply := send_msg(gateway_sn, sp) + fmt.Println("开始固件升级.......") + //if err == nil { //记录操作日志dronedronedronedrddadadasdeddddd + // manageOperationLog.AddLog(ctx, gateway_sn, sp.Method, "down", reply.Data.Result) + //} + return err, reply +} + +//// 获取文件的md5和大小 +//func aaaaa() { +// +// path := "C:\\Users\\MSI\\Downloads\\M4TD_13.01.00.07_pro.zip" +// // 检查文件是否为ZIP格式 +// if !strings.HasSuffix(strings.ToLower(path), ".zip") { +// fmt.Println("错误:请提供ZIP格式的文件") +// return +// } +// +// // 获取文件大小 +// fileInfo, err := os.Stat(path) +// if err != nil { +// fmt.Printf("无法获取文件信息: %v\n", err) +// return +// } +// sizeKB := float64(fileInfo.Size()) / 1024.0 +// fmt.Printf("ZIP文件大小: %.2f KB\n", sizeKB) +// +// // 计算MD5 +// file, err := os.Open(path) +// if err != nil { +// fmt.Printf("无法打开文件: %v\n", err) +// return +// } +// defer file.Close() +// +// md5Hash := md5.New() +// if _, err := io.Copy(md5Hash, file); err != nil { +// fmt.Printf("计算MD5失败: %v\n", err) +// return +// } +// md5Sum := hex.EncodeToString(md5Hash.Sum(nil)) +// fmt.Printf("ZIP文件MD5: %s\n", md5Sum) +//} diff --git a/third/plane/plane.go b/third/plane/plane.go new file mode 100644 index 0000000..d941db0 --- /dev/null +++ b/third/plane/plane.go @@ -0,0 +1,334 @@ +package plane + +import ( + "context" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "github.com/tiger1103/gfast/v3/third/plane/dj" + "github.com/tiger1103/gfast/v3/third/plane/globe" + "github.com/tiger1103/gfast/v3/third/plane/mqtt" + + "strconv" +) + +type PLANE struct { +} + +func InitPlaneApi(group *ghttp.RouterGroup) { + init_map() + group.Group("/plane", func(group *ghttp.RouterGroup) { + group.Bind(new(PLANE)) + group.Middleware(service.Middleware().Ctx, service.Middleware().Auth) + }) +} + +func init_map() { + globe.WS_Status_map = make(globe.WS_MAP) + globe.WS_Progress_drone_open_map = make(globe.WS_MAP) + globe.WS_Progress_drone_close_map = make(globe.WS_MAP) + globe.WS_Progress_cover_open_map = make(globe.WS_MAP) + globe.WS_Progress_cover_close_map = make(globe.WS_MAP) + globe.WS_Progress_device_reboot_map = make(globe.WS_MAP) + globe.WS_Progress_putter_close_map = make(globe.WS_MAP) + globe.WS_Progress_putter_open_map = make(globe.WS_MAP) + globe.WS_Reply = make(globe.WS_MAP) +} + +type UsualRes struct { +} + +type DeviceGoHomeReq struct { + g.Meta `path:"gohome" summary:"一键返航" method:"post" tags:"无人机相关"` + GatewaySn string `json:"gateway_sn" v:"required" dc:"机库sn"` +} + +func (receiver PLANE) DeviceGoHome(ctx context.Context, req *DeviceGoHomeReq) (res *UsualRes, err error) { + err, d := mqtt.Return_home(ctx, req.GatewaySn) + if err != nil { + return nil, err + } + if d.Data.Result > 0 { + err = geterror(d.Data.Result) + return + } + return +} + +type DeviceListReq struct { + g.Meta `path:"list" summary:"获取飞机列表" method:"get" tags:"无人机相关"` +} +type DeviceListRes struct { +} + +func (receiver PLANE) DeviceList(ctx context.Context, req *DeviceListReq) (res *DeviceListRes, err error) { + return nil, err +} + +type DeviceRebootReq struct { + g.Meta `path:"device_reboot" summary:"机库重启" method:"post" tags:"无人机相关"` + GatewaySn string `json:"gateway_sn" v:"required" dc:"机库sn"` +} + +func (receiver PLANE) DeviceReboot(ctx context.Context, req *DeviceRebootReq) (res *UsualRes, err error) { + err, d := mqtt.Device_reboot(req.GatewaySn) + if err != nil { + return nil, err + } + if d.Data.Result > 0 { + err = geterror(d.Data.Result) + return + } + return +} + +type ClosePutterReq struct { + g.Meta `path:"close_putter" summary:"关闭推杆" method:"post" tags:"无人机相关"` + GatewaySn string `json:"gateway_sn" v:"required" dc:"机库sn"` +} + +func (receiver PLANE) ClosePutterReq(ctx context.Context, req *ClosePutterReq) (res *UsualRes, err error) { + err, d := mqtt.Putter_close(ctx, req.GatewaySn) + if err != nil { + return nil, err + } + if d.Data.Result > 0 { + err = geterror(d.Data.Result) + return + } + g.DB().Model("manage_button_state"). + Where("mq_client_id", req.GatewaySn). + Update(g.Map{"push_rod": 2}) + return +} + +type OpenPutterReq struct { + g.Meta `path:"open_putter" summary:"打开推杆" method:"post" tags:"无人机相关"` + GatewaySn string `json:"gateway_sn" v:"required" dc:"机库sn"` +} + +func (receiver PLANE) OpenPutterReq(ctx context.Context, req *OpenPutterReq) (res *UsualRes, err error) { + err, d := mqtt.Putter_open(ctx, req.GatewaySn) + if err != nil { + return nil, err + } + if d.Data.Result > 0 { + err = geterror(d.Data.Result) + return + } + g.DB().Model("manage_button_state"). + Where("mq_client_id", req.GatewaySn). + Update(g.Map{"push_rod": 1}) + return +} + +type OpenChargeReq struct { + g.Meta `path:"open_charge" summary:"打开充电" method:"post" tags:"无人机相关"` + GatewaySn string `json:"gateway_sn" v:"required" dc:"机库sn"` +} + +func (receiver PLANE) OpenChargeReq(ctx context.Context, req *OpenChargeReq) (res *UsualRes, err error) { + err, d := mqtt.Charge_open(ctx, req.GatewaySn) + if err != nil { + return nil, err + } + if d.Data.Result > 0 { + err = geterror(d.Data.Result) + return + } + g.DB().Model("manage_button_state"). + Where("mq_client_id", req.GatewaySn). + Update(g.Map{"recharge": 1}) + return +} + +type CloseChargeReq struct { + g.Meta `path:"close_charge" summary:"关闭充电" method:"post" tags:"无人机相关"` + GatewaySn string `json:"gateway_sn" v:"required" dc:"机库sn"` +} + +func (receiver PLANE) CloseCharge(ctx context.Context, req *CloseChargeReq) (res *UsualRes, err error) { + err, d := mqtt.Charge_close(ctx, req.GatewaySn) + if err != nil { + return nil, err + } + if d.Data.Result > 0 { + err = geterror(d.Data.Result) + return + } + g.DB().Model("manage_button_state"). + Where("mq_client_id", req.GatewaySn). + Update(g.Map{"recharge": 2}) + return +} + +type CloseDroneReq struct { + g.Meta `path:"close_drone" summary:"飞行器关机(调试模式下)" method:"post" tags:"无人机相关"` + GatewaySn string `json:"gateway_sn" v:"required" dc:"机库sn"` +} + +func (receiver PLANE) CloseDrone(ctx context.Context, req *CloseDroneReq) (res *UsualRes, err error) { + err, d := mqtt.Drone_close(ctx, req.GatewaySn) + if err != nil { + return nil, err + } + if d.Data.Result > 0 { + err = geterror(d.Data.Result) + return + } + g.DB().Model("manage_button_state"). + Where("mq_client_id", req.GatewaySn). + Update(g.Map{"power": 2}) + return +} + +type OpenDroneReq struct { + g.Meta `path:"open_drone" summary:"飞行器开机(调试模式下)" method:"post" tags:"无人机相关"` + GatewaySn string `json:"gateway_sn" v:"required" dc:"机库sn"` +} + +func (receiver PLANE) OpenDrone(ctx context.Context, req *OpenDroneReq) (res *UsualRes, err error) { + err, d := mqtt.Drone_open(ctx, req.GatewaySn) + if err != nil { + return nil, err + } + if d.Data.Result > 0 { + err = geterror(d.Data.Result) + return + } + g.DB().Model("manage_button_state"). + Where("mq_client_id", req.GatewaySn). + Update(g.Map{"power": 1}) + return +} + +type CloseCoverReq struct { + g.Meta `path:"close_cover" summary:"关闭舱盖(调试模式下)" method:"post" tags:"无人机相关"` + GatewaySn string `json:"gateway_sn" v:"required" dc:"机库sn"` +} + +func (receiver PLANE) CloseCover(ctx context.Context, req *CloseCoverReq) (res *UsualRes, err error) { + err, d := mqtt.Cover_close(ctx, req.GatewaySn) + if err != nil { + return nil, err + } + if d.Data.Result > 0 { + err = geterror(d.Data.Result) + return + } + g.DB().Model("manage_button_state"). + Where("mq_client_id", req.GatewaySn). + Update(g.Map{"hatch_cover": 2}) + return +} + +type OpenCoverReq struct { + g.Meta `path:"open_cover" summary:"打开舱盖(调试模式下)" method:"post" tags:"无人机相关"` + GatewaySn string `json:"gateway_sn" v:"required" dc:"机库sn"` +} + +func (receiver PLANE) OpenCover(ctx context.Context, req *OpenCoverReq) (res *UsualRes, err error) { + err, d := mqtt.Cover_open(ctx, req.GatewaySn) + if err != nil { + return nil, err + } + if d.Data.Result > 0 { + err = geterror(d.Data.Result) + return + } + g.DB().Model("manage_button_state"). + Where("mq_client_id", req.GatewaySn). + Update(g.Map{"hatch_cover": 1}) + return +} + +type CloseDebugReq struct { + g.Meta `path:"close_debug" summary:"关闭调试模式" method:"post" tags:"无人机相关"` + GatewaySn string `json:"gateway_sn" v:"required" dc:"机库sn"` +} + +func (receiver PLANE) CloseDebug(ctx context.Context, req *CloseDebugReq) (res *UsualRes, err error) { + err, d := mqtt.Debug_mode_close(ctx, req.GatewaySn) + if err != nil { + return nil, err + } + if d.Data.Result > 0 { + err = geterror(d.Data.Result) + return + } + g.DB().Model("manage_button_state"). + Where("mq_client_id", req.GatewaySn). + Update(g.Map{"debug": 2}) + return +} + +type OpenDebugReq struct { + g.Meta `path:"open_debug" summary:"打开调试模式" method:"post" tags:"无人机相关"` + GatewaySn string `json:"gateway_sn" v:"required" dc:"机库sn"` +} + +func (receiver PLANE) OpenDebug(ctx context.Context, req *OpenDebugReq) (res *UsualRes, err error) { + err, d := mqtt.Debug_mode_open(ctx, req.GatewaySn) + if err != nil { + return nil, err + } + if d.Data.Result > 0 { + err = geterror(d.Data.Result) + return + } + g.DB().Model("manage_button_state"). + Where("mq_client_id", req.GatewaySn). + Update(g.Map{"debug": 1}) + return +} + +type StopLiveReq struct { + g.Meta `path:"stop_live" summary:"停止直播" method:"post" tags:"无人机相关"` + GatewaySn string `json:"gateway_sn" v:"required" dc:"机库sn"` + Devsn string `json:"devsn" v:"required" dc:"设备sn"` + Camera_index string `json:"camera_index" v:"required" dc:"摄像头"` +} + +func (receiver PLANE) StopLive(ctx context.Context, req *StopLiveReq) (res *UsualRes, err error) { + err, d := mqtt.Live_stop_push(req.GatewaySn, req.Devsn, req.Camera_index) + if err != nil { + return nil, err + } + if d.Data.Result > 0 { + err = geterror(d.Data.Result) + return + } + return +} + +type StartLiveReq struct { + g.Meta `path:"start_live" summary:"开始直播" method:"post" tags:"无人机相关"` + GatewaySn string `json:"gateway_sn" v:"required" dc:"机库sn"` + Devsn string `json:"devsn" v:"required" dc:"设备sn"` + Camera_index string `json:"camera_index" v:"required" dc:"摄像头"` +} +type StartLiveRes struct { + Url string `json:"url"` +} + +func geterror(code int) error { + if v, ok := dj.GetErrorMap()[code]; ok { + return globe.GetErrors(v.Msg) + } else { + return globe.GetErrors("未知错误:" + strconv.Itoa(code)) + } +} + +func (receiver PLANE) StartLive(ctx context.Context, req *StartLiveReq) (res *StartLiveRes, err error) { + err, d := mqtt.Live_start_push(req.GatewaySn, req.Devsn, req.Camera_index) + if err != nil { + return nil, err + } + if d.Data.Result > 0 && d.Data.Result != 513003 /*正在直播中 ,可直接返回地址*/ { + err = geterror(d.Data.Result) + return + } + res = &StartLiveRes{} + res.Url = d.Data.Url + return +} diff --git a/third/plane/progress.go b/third/plane/progress.go new file mode 100644 index 0000000..8725373 --- /dev/null +++ b/third/plane/progress.go @@ -0,0 +1,107 @@ +package plane + +import ( + "context" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/tiger1103/gfast/v3/third/plane/globe" +) + +type Progerss_putter_close_Req struct { + g.Meta `path:"progress/putter_close" summary:"推杆闭合进度" method:"get" tags:"无人机进度数据相关(ws)"` +} + +func (receiver PLANE) Progerss_putter_close(ctx context.Context, req *Progerss_putter_close_Req) (res *UsualRes, err error) { + return save_ws(ctx, &globe.WS_Progress_putter_close_map) +} + +type Progerss_putter_open_Req struct { + g.Meta `path:"progress/putter_open" summary:"推杆展开进度" method:"get" tags:"无人机进度数据相关(ws)"` +} + +func (receiver PLANE) Progerss_putter_open(ctx context.Context, req *Progerss_putter_open_Req) (res *UsualRes, err error) { + return save_ws(ctx, &globe.WS_Progress_putter_open_map) +} + +type Progerss_Reply_Req struct { + g.Meta `path:"progress/err_reply" summary:"up回复错误状态" method:"get" tags:"无人机进度数据相关(ws)"` +} + +func (receiver PLANE) Progerss_Reply(ctx context.Context, req *Progerss_Reply_Req) (res *UsualRes, err error) { + return save_ws(ctx, &globe.WS_Reply) +} + +type Progerss_device_reboot_Req struct { + g.Meta `path:"progress/device_reboot" summary:"机库重启进度推送" method:"get" tags:"无人机进度数据相关(ws)"` +} + +func (receiver PLANE) Progerss_device_reboot(ctx context.Context, req *Progerss_device_reboot_Req) (res *UsualRes, err error) { + return save_ws(ctx, &globe.WS_Progress_device_reboot_map) +} + +type Progerss_cover_close_Req struct { + g.Meta `path:"progress/cover_close" summary:"机库关闭舱盖进度推送" method:"get" tags:"无人机进度数据相关(ws)"` +} + +func (receiver PLANE) Progerss_cover_close(ctx context.Context, req *Progerss_cover_close_Req) (res *UsualRes, err error) { + return save_ws(ctx, &globe.WS_Progress_cover_close_map) +} + +type Progerss_cover_open_Req struct { + g.Meta `path:"progress/cover_open" summary:"机库打开舱盖进度推送" method:"get" tags:"无人机进度数据相关(ws)"` +} + +func (receiver PLANE) Progerss_cover_open(ctx context.Context, req *Progerss_cover_open_Req) (res *UsualRes, err error) { + return save_ws(ctx, &globe.WS_Progress_cover_open_map) +} + +type Progerss_drone_close_Req struct { + g.Meta `path:"progress/drone_close" summary:"飞行器关机进度推送" method:"get" tags:"无人机进度数据相关(ws)"` +} + +func (receiver PLANE) Progerss_drone_close(ctx context.Context, req *Progerss_drone_close_Req) (res *UsualRes, err error) { + return save_ws(ctx, &globe.WS_Progress_drone_close_map) +} + +type Progerss_drone_open_Req struct { + g.Meta `path:"progress/drone_open" summary:"飞行器开机进度推送" method:"get" tags:"无人机进度数据相关(ws)"` +} + +func (receiver PLANE) Progerss_drone_open(ctx context.Context, req *Progerss_drone_open_Req) (res *UsualRes, err error) { + return save_ws(ctx, &globe.WS_Progress_drone_open_map) +} + +type DeviceStatusReq struct { + g.Meta `path:"device_status" summary:"ws推送飞机状态" method:"get" tags:"无人机进度数据相关(ws)"` +} +type DeviceStatusRes struct { + Code int `json:"code"` + Data interface{} `json:"data"` +} + +func (receiver PLANE) DeviceStatus(ctx context.Context, req *DeviceStatusReq) (res *UsualRes, err error) { + return save_ws(ctx, &globe.WS_Status_map) +} + +func save_ws(ctx context.Context, _map *globe.WS_MAP) (res *UsualRes, err error) { + r := ghttp.RequestFromCtx(ctx) + ws, err := r.WebSocket() + if err != nil { + return nil, err + } + ip := r.Get("token").String() + + globe.MutexRw.Lock() + (*_map)[ip] = ws + globe.MutexRw.Unlock() + fmt.Println("ws连接了", ip) + for { + _, _, err = ws.ReadMessage() + if err != nil { + fmt.Println("ws断开了", ip) + delete(*_map, ip) + return nil, err + } + } +} diff --git a/third/plane/wayline/struct/struct.go b/third/plane/wayline/struct/struct.go new file mode 100644 index 0000000..f03298a --- /dev/null +++ b/third/plane/wayline/struct/struct.go @@ -0,0 +1,157 @@ +package _struct + +import "encoding/xml" + +// 飞向首航点模式 +const ( + Safely = "safely" + PointToPoint = "pointToPoint" +) + +// 航线结束动作 +const ( + GoHome = "goHome" + AutoLand = "autoLand" + GotoFirstWaypoint = "gotoFirstWaypoint" +) + +//失控是否继续执行航线 + +const ( + GoContinue = "goContinue" //继续执行航线 + ExecuteLostAction = "executeLostAction" //退出航线,执行失控动作 +) + +// 失控动作类型 +const ( + GoBack = "goBack" //返航。飞行器从失控位置飞向起飞点 + Landing = "landing" //降落。飞行器从失控位置原地降落 + Hover = "hover" //悬停。飞行器从失控位置悬停 +) + +// 预定义模板类型 +const ( + Waypoint = "waypoint" //航点飞行 + Mapping2d = "mapping2d" //建图航拍 + Mapping3d = "mapping3d" //倾斜摄影 + MappingStrip = "mappingStrip" //航带飞行 +) + +// Placemark 结构表示 KML 的地点标记 +type Placemark struct { + Point Point `xml:"Point"` + Index int `xml:"wpml:index"` + EllipsoidHeight float64 `xml:"wpml:ellipsoidHeight"` + Height float64 `xml:"wpml:height"` + UseGlobalSpeed int `xml:"wpml:useGlobalSpeed"` + UseGlobalHeadingParam int `xml:"wpml:useGlobalHeadingParam"` + UseGlobalTurnParam int `xml:"wpml:useGlobalTurnParam"` + UseStraightLine int `xml:"wpml:useStraightLine"` + //ActionGroup ActionGroup `xml:"wpml:actionGroup"` +} + +// Point 结构表示地点坐标 +type Point struct { + Coordinates string `xml:"coordinates"` +} + +type PayloadParam struct { + PayloadPositionIndex int `xml:"wpml:payloadPositionIndex"` + ImageFormat string `xml:"wpml:imageFormat"` +} + +type Doc struct { + Author string `xml:"wpml:author"` + UpdateTime int64 `xml:"wpml:updateTime"` + CreateTime int64 `xml:"wpml:createTime"` + MissionConfig MissionConfig `xml:"wpml:missionConfig"` + Folder interface{} `xml:"Folder"` +} + +type PublicTemplate struct { + TemplateType string `xml:"wpml:templateType"` + TemplateId int `xml:"wpml:templateId"` + AutoFlightSpeed float64 `xml:"wpml:autoFlightSpeed"` + WaylineCoordinateSysParam struct { + CoordinateMode string `xml:"wpml:coordinateMode"` + HeightMode string `xml:"wpml:heightMode"` + GlobalShootHeight float64 `xml:"wpml:globalShootHeight"` + PositioningType string `xml:"wpml:positioningType"` + SurfaceFollowModeEnable int `xml:"wpml:surfaceFollowModeEnable"` + SurfaceRelativeHeight string `xml:"wpml:surfaceRelativeHeight"` + } `xml:"wpml:waylineCoordinateSysParam"` +} + +type ActionGroup struct { + ActionGroupId int `xml:"wpml:actionGroupId"` + ActionGroupStartIndex int `xml:"wpml:actionGroupStartIndex"` + ActionGroupEndIndex int `xml:"wpml:actionGroupEndIndex"` + ActionGroupMode string `xml:"wpml:actionGroupMode"` + ActionTrigger struct { + ActionTriggerType string `xml:"actionTriggerType"` + } `xml:"actionTrigger"` + Action Action `xml:"action"` +} + +type Action struct { + ActionId int `xml:"actionId"` + ActionActuatorFunc string `xml:"actionActuatorFunc"` + ActionActuatorFuncParam ActionActuatorFuncParam `xml:"actionActuatorFuncParam"` +} + +type ActionActuatorFuncParam struct { + FileSuffix string `xml:"fileSuffix"` + PayloadPositionIndex string `xml:"payloadPositionIndex"` +} + +type MissionConfig struct { + FlyToWaylineMode string `xml:"wpml:flyToWaylineMode"` + FinishAction string `xml:"wpml:finishAction"` + ExitOnRCLost string `xml:"wpml:exitOnRCLost"` + ExecuteRCLostAction string `xml:"wpml:executeRCLostAction"` + TakeOffSecurityHeight float64 `xml:"wpml:takeOffSecurityHeight"` + GlobalTransitionalSpeed float64 `xml:"wpml:globalTransitionalSpeed"` + GlobalRTHHeight float64 `xml:"wpml:globalRTHHeight"` + + //TakeOffRefPoint xml.Name `xml:"wpml:takeOffRefPoint"` + // + //TakeOffRefPointAGLHeight xml.Name `xml:"wpml:takeOffRefPointAGLHeight"` + + //DroneInfo struct { + // DroneEnumValue xml.Name `xml:"wpml:droneEnumValue"` + // DroneSubEnumValue xml.Name `xml:"wpml:droneSubEnumValue"` + //} `xml:"wpml:droneInfo"` + //PayloadInfo struct { + // PayloadEnumValue xml.Name `xml:"wpml:payloadEnumValue"` + // PayloadSubEnumValue xml.Name `xml:"wpml:payloadSubEnumValue"` + // PayloadPositionIndex xml.Name `xml:"wpml:payloadPositionIndex"` + //} `xml:"wpml:payloadInfo"` +} + +type WayPointTemplate struct { + PublicTemplate + GlobalWaypointTurnMode string `xml:"wpml:globalWaypointTurnMode"` //全局航点类型(全局航点转弯模式)coordinateTurn:协调转弯,不过点,提前转弯 toPointAndStopWithDiscontinuityCurvature:直线飞行,飞行器到点停 toPointAndStopWithContinuityCurvature:曲线飞行,飞行器到点停 toPointAndPassWithContinuityCurvature:曲线飞行,飞行器过点不停 + GlobalUseStraightLine int `xml:"wpml:globalUseStraightLine"` //全局航段轨迹是否尽量贴合直线 + GimbalPitchMode string `xml:"wpml:gimbalPitchMode"` //云台俯仰角控制模式 manual:手动控制。飞行器从一个航点飞向下一个航点的过程中, + // 支持用户手动控制云台的俯仰角度。若无用户控制,则保持飞离航点时的云台俯仰角度。 + //usePointSetting:依照每个航点设置。飞行器从一个航点飞向下一个航点的过程中,云台俯仰角均匀过渡至下一个航点的俯仰角。 + GlobalHeight float64 `xml:"wpml:globalHeight"` //全局航线高度(相对起飞点高度 + Placemark []Placemark `xml:"Placemark"` + //UseGlobalTransitionalSpeed string `xml:"wpml:useGlobalTransitionalSpeed"` + //TransitionalSpeed string `xml:"wpml:transitionalSpeed"` + //GlobalWaypointHeadingParam struct { + // WaypointHeadingMode string `xml:"wpml:waypointHeadingMode"` + // WaypointHeadingAngle string `xml:"wpml:waypointHeadingAngle"` + // WaypointPoiPoint string `xml:"wpml:waypointPoiPoint"` + // WaypointHeadingPathMode string `xml:"wpml:waypointHeadingPathMode"` + //} `xml:"wpml:globalWaypointHeadingParam"` //全局偏航角模式参数 +} + +// KML 结构表示完整的 KML 文件 +type KML struct { + //XMLName xml.Attr `xml:"kml"` + XMLName xml.Name `xml:"http://www.opengis.net/kml/2.2 kml"` + XmlnsStream string `xml:"xmlns:wpml,attr"` + //Test []Test `xml:"test"` + Document Doc `xml:"Document"` +} diff --git a/third/plane/wayline/template/template.go b/third/plane/wayline/template/template.go new file mode 100644 index 0000000..4798ee6 --- /dev/null +++ b/third/plane/wayline/template/template.go @@ -0,0 +1,78 @@ +package template + +import ( + "encoding/xml" + "fmt" + "github.com/gogf/gf/v2/os/gtime" + "github.com/tiger1103/gfast/v3/third/plane/wayline/struct" + "os" +) + +func CreateWayPointTempalteWpml() { + +} + +func CreateWayPointTempalteKml() { + kml := _struct.KML{ + //XmlnsStream: "http://www.dji.com/wpmz/1.0.3", + Document: _struct.Doc{ + Author: "重庆远界大数据研究院有限公司", + CreateTime: gtime.Now().TimestampMilli(), + UpdateTime: gtime.Now().TimestampMilli(), + }, + } + msconfig := _struct.MissionConfig{ + FlyToWaylineMode: _struct.Safely, + FinishAction: _struct.GoHome, + ExitOnRCLost: _struct.ExecuteLostAction, + ExecuteRCLostAction: _struct.Hover, + TakeOffSecurityHeight: 5, + GlobalTransitionalSpeed: 5, + GlobalRTHHeight: 5, + } + //设置公共配置 + kml.Document.MissionConfig = msconfig + tp := _struct.WayPointTemplate{} + + tp.TemplateType = _struct.Waypoint //航点飞行 + tp.TemplateId = 0 //模板ID * 注:在一个kmz文件内该ID唯一。建议从0开始单调连续递增。在template.kml和waylines.wpml文件中,将使用该id将模板与所生成的可执行航线进行关联。 + tp.AutoFlightSpeed = 5 //全局航线飞行速度 + + tp.WaylineCoordinateSysParam.CoordinateMode = "WGS84" + tp.WaylineCoordinateSysParam.HeightMode = "EGM96" + tp.WaylineCoordinateSysParam.PositioningType = "GPS" + tp.WaylineCoordinateSysParam.SurfaceFollowModeEnable = 0 + + tp.GlobalHeight = 100 + + kml.Document.Folder = tp + createXML(kml, "template.xml") +} + +func createXML(v interface{}, file string) { + // 生成 XML + xmlBytes, err := xml.MarshalIndent(v, "", " ") + if err != nil { + fmt.Println("生成XML失败:", err) + return + } + // 将 XML 写入文件 + xmlFile, err := os.Create(file) + if err != nil { + fmt.Println("创建文件失败:", err) + return + } + defer xmlFile.Close() + xmlWithVersion := []byte(xml.Header + string(xmlBytes)) + _, err = xmlFile.Write(xmlWithVersion) + if err != nil { + fmt.Println("写入文件失败:", err) + return + } + + fmt.Println("生成的KML文件:output.kml") +} + +//func CreateWayPointTempalte(points []globe.Point) { +// +//} diff --git a/third/plane/wayline/wayline.go b/third/plane/wayline/wayline.go new file mode 100644 index 0000000..c657680 --- /dev/null +++ b/third/plane/wayline/wayline.go @@ -0,0 +1 @@ +package wayline diff --git a/third/progress/parent.go b/third/progress/parent.go new file mode 100644 index 0000000..9285f87 --- /dev/null +++ b/third/progress/parent.go @@ -0,0 +1,149 @@ +package progress + +import ( + "context" + "fmt" + "strconv" + + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +type Scheduler struct { + // 总进度 + FinishedPtr int + // 总量 + Total int + // 实体 + WorkStatus *entity.WorkSchedule +} + +type Schdule map[string]Scheduler + +// 获取指定 WorkID 的计划和总量 +func (s Schdule) Get(workID string) (int, int) { + if scheduler, ok := s[workID]; ok { + return scheduler.FinishedPtr, scheduler.Total + } + return 0, 0 +} + +// WorkStatusGetProgress 传入一个方阵ID 获取其所有父级的进度 +func WorkStatusGetProgress(fangzhenID string) ([]*model.WorkStatusProgressRes, error) { + var parentList []*model.WorkStatusProgressRes + err := dao.WorkStatus.Ctx(context.Background()).As("parent"). + Fields("parent.id, parent.work_name as name ,parent.work_id,IFNULL(SUM(child.total), 0) AS total, IFNULL(SUM(child.finished), 0) AS finished"). + LeftJoin("work_status AS child", "parent.id = child.parent"). + Where("parent.parent IS NULL"). + Where("parent.fangzhen_id", fangzhenID). + Group("parent.id, parent.work_name, parent.total"). + Scan(&parentList) + if err != nil { + return nil, err + } + + if len(parentList) == 0 { + return parentList, fmt.Errorf("未找到父级计划") + } + + return parentList, err +} + +// GetProgressBySubID 获取一共子项目下所有的父级进度 +func GetProgressBySubID(subProjectID string) ([]*model.WorkStatusProgressRes, error) { + var fangzhenList []entity.QianqiFangzhen + if err := dao.QianqiFangzhen.Ctx(context.Background()). + Where(dao.QianqiFangzhen.Columns().ProjectId, subProjectID).Scan(&fangzhenList); err != nil { + return nil, err + } + + if len(fangzhenList) == 0 { + return nil, fmt.Errorf("未找到方阵") + } + + cumulativeProjects := []*model.WorkStatusProgressRes{} + firstTime := true + + // 遍历项目列表 + for index := 0; index < len(fangzhenList); index++ { + // 获取当前项目 + project := fangzhenList[index] + + // 获取当前项目的子项目 + childProjects, err := WorkStatusGetProgress(strconv.Itoa(project.Id)) + if err != nil { + return nil, err + } + + // 如果是第一次迭代,将子项目列表赋值给累积项目列表 + if firstTime { + cumulativeProjects = childProjects + // 更新标志变量,表示已经不是第一次迭代 + firstTime = false + continue + } + + // 遍历子项目列表后叠加到累积项目列表 + for childIndex := 0; childIndex < len(childProjects); childIndex++ { + // 获取根据索引获取当前的 cumulativeProjects + singleChild := childProjects[childIndex] + comulativeChild := cumulativeProjects[childIndex] + + // 将 singleChild 的 Total 和 Finished 叠加到 comulativeChild + comulativeChild.Total += singleChild.Total + comulativeChild.Finished += singleChild.Finished + } + } + + return cumulativeProjects, nil +} + +// 传入主项目ID +func GetProgressByProjectID(projectID string) ([]*model.WorkStatusProgressRes, error) { + subProjects := []entity.SubProject{} + if err := dao.SubProject.Ctx(context.Background()). + Where(dao.SubProject.Columns().ProjectId, projectID).Scan(&subProjects); err != nil { + return nil, err + } + + cumulativeProjects := []*model.WorkStatusProgressRes{} + firstTime := true + + // 遍历项目列表 + for index := 0; index < len(subProjects); index++ { + // 获取当前项目 + project := subProjects[index] + + // 获取当前项目的子项目 + childProjects, err := GetProgressBySubID(strconv.Itoa(int(project.Id))) + if err != nil { + continue + } + + // 如果是第一次迭代,将子项目列表赋值给累积项目列表 + if firstTime { + cumulativeProjects = childProjects + // 更新标志变量,表示已经不是第一次迭代 + firstTime = false + continue + } + + // 遍历子项目列表后叠加到累积项目列表 + for childIndex := 0; childIndex < len(childProjects); childIndex++ { + // 获取根据索引获取当前的 cumulativeProjects + singleChild := childProjects[childIndex] + + if childIndex < 0 || childIndex >= len(cumulativeProjects) { + continue + } + comulativeChild := cumulativeProjects[childIndex] + + // 将 singleChild 的 Total 和 Finished 叠加到 comulativeChild + comulativeChild.Total += singleChild.Total + comulativeChild.Finished += singleChild.Finished + } + } + + return cumulativeProjects, nil +} diff --git a/third/reminders/reminder.go b/third/reminders/reminder.go new file mode 100644 index 0000000..4d643c9 --- /dev/null +++ b/third/reminders/reminder.go @@ -0,0 +1,110 @@ +package reminders + +import ( + "context" + "fmt" + "github.com/jinzhu/copier" + "github.com/samber/lo" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" +) + +type Reminder struct { + Content string `copier:"ViolationType"` // 内容 + Title string // 标题 + ReceiverID string `copier:"UserId"` // 消息接收者的 User_id + Type int `copier:"ReminderType"` // 类型 + Status int // 状态 + ProjectID int `copier:"ProjectId"` // 项目 ID + TargetID int `copier:"OrderId"` // 对应跳转的主键ID + + //TargetID int `copier:"OrderId"` // 是否需要转换 +} + +// UserIDOrderIDDel 根据userID与orderID 删除提醒 +func UserIDOrderIDDel(userId string, orderID int64) error { + columns := dao.Reminders.Columns() + _, err := dao.Reminders.Ctx(context.Background()).Where(columns.UserId, userId).Where(columns.OrderId, orderID).Delete() + return err +} + +// PublishReminder 发布提醒 +func PublishReminder(message Reminder, convertOpenID bool) error { + if convertOpenID && HasLetter(message.ReceiverID) { + message.ReceiverID = GetUserIDByOpenID(message.ReceiverID) + if message.ReceiverID == "" { + return fmt.Errorf("未找到对应的用户") + } + } + + var reminder do.Reminders + copier.Copy(&reminder, &message) + + // 保存到数据库 + _, err := dao.Reminders.Ctx(context.Background()).Insert(&reminder) + return err +} + +// CheckInReminder 打卡提醒 +// Reminders.CheckIn 表示上班打卡 +// Reminders.CheckOut 表示下班打卡 +func CheckInReminder(checkType ReminderType, projectID int, userID, time string) error { + // 1. 构建消息模板 + message := Reminder{ + Type: checkType, // 打卡类型 + ProjectID: projectID, // 项目 ID + ReceiverID: userID, // 消息接收者的 sys_user.Id + Title: time, // 时间,只需要多少分钟,如 "10","20" + } + + return PublishReminder(message, false) +} + +// hasLetter 判断字符串中是否包含字母 +func HasLetter(s string) bool { + for _, c := range s { + if (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') { + return true + } + } + return false +} + +// GetUserIDByOpenID 通过 OpenID 获取用户对应的 sys_user.Id +func GetUserIDByOpenID(openID string) string { + openid, err := dao.BusConstructionUser.Ctx(context.Background()).As("bu"). + Fields("su.id"). + InnerJoin("sys_user AS su", "bu.phone = su.mobile"). + Where("bu.openid", openID).Value() + if err != nil { + return "" + } + + return openid.String() +} + +type userOpenID struct { + OpenID string + ID int +} + +// GetUserIDByOpenIDs 传入多个 OpenID,返回对应的 User.ID +func GetUserIDByOpenIDs(openIDs []string) map[string]string { + // SELECT su.id,bu.openid + // FROM bus_construction_user AS bu + // INNER JOIN sys_user AS su ON bu.phone = su.mobile + // WHERE bu.openid in ("oLYsI4x-L6ZVKCinQ4Rw1D9XtFZ0","oLYsI49aMJHTYorhmvVuRrasPTbU") + + var userOpenIDList []userOpenID + err := dao.BusConstructionUser.Ctx(context.Background()).As("bu"). + Fields("su.id", "bu.openid"). + InnerJoin("sys_user AS su", "bu.phone = su.mobile"). + WhereIn("bu.openid", openIDs).Scan(&userOpenIDList) + if err != nil { + return nil + } + + return lo.SliceToMap(userOpenIDList, func(item userOpenID) (string, string) { + return item.OpenID, fmt.Sprintf("%d", item.ID) + }) +} diff --git a/third/reminders/reminder_var.go b/third/reminders/reminder_var.go new file mode 100644 index 0000000..ea948c2 --- /dev/null +++ b/third/reminders/reminder_var.go @@ -0,0 +1,20 @@ +package reminders + +type ReminderType = int + +// 提醒类型 +const ( + Security ReminderType = iota // 安全 + Quality // 质量 + AI // AI + CheckIn // 上班打卡 + CheckOut // 下班打卡 +) + +// 提醒状态 + +const ( + Remind = iota // 提醒 + Reform // 整改 + Recheck // 复检 +) diff --git a/third/richText/strip.go b/third/richText/strip.go new file mode 100644 index 0000000..9b664f5 --- /dev/null +++ b/third/richText/strip.go @@ -0,0 +1,77 @@ +package richtext + +import ( + "fmt" + "regexp" + "strings" +) + +func RemoveRichText(text string) string { + // Regular expression to replace
and

tags with newline + reBr := regexp.MustCompile(`<(br|p)(\s[^>]*)?>`) + text = reBr.ReplaceAllString(text, "\n") + + // Add four full-width spaces after each newline + reNewline := regexp.MustCompile(`\n`) + text = reNewline.ReplaceAllString(text, "\n  ") // 两个全角空格等于四个半角空格,即四个汉字的距离 + + // Regular expression to replace   with empty string + reNbsp := regexp.MustCompile(` `) + text = reNbsp.ReplaceAllString(text, "") + + // Regular expression to match other HTML tags + re := regexp.MustCompile("<[^>]*>") + plainText := re.ReplaceAllString(text, "") + + plainText = strings.TrimSpace(plainText) + // plainText = "  " + plainText + + return plainText +} + +func ExtractImageURLs(text string) []string { + re := regexp.MustCompile(`]+\bsrc=["']([^"']+)["']`) + matches := re.FindAllStringSubmatch(text, -1) + + var urls []string + for _, match := range matches { + urls = append(urls, match[1]) + } + + return urls +} + +func ConvertToRichText(plainText string, imageURLs []string) string { + // 将纯文本分割成段落 + paragraphs := strings.Split(plainText, "\n") + + // 创建一个StringBuilder来构建富文本 + var richText strings.Builder + + // 将每个段落包装在

标签中 + for _, paragraph := range paragraphs { + richText.WriteString("

") + richText.WriteString(paragraph) + richText.WriteString("

") + } + + // 将每个图片URL包装在标签中,并附加到富文本中 + for _, imageURL := range imageURLs { + richText.WriteString("") + } + + // 返回富文本字符串 + return richText.String() +} + +// 传入一个字符串数组,将其包装为一个富文本图片标签 +func ConvertImageURLsToRichText(imageURLs []string) string { + var richText strings.Builder + for _, imageURL := range imageURLs { + richText.WriteString(fmt.Sprintf(`

`, imageURL)) + } + + return richText.String() +} diff --git a/third/schduler/schduler.go b/third/schduler/schduler.go new file mode 100644 index 0000000..a0e6097 --- /dev/null +++ b/third/schduler/schduler.go @@ -0,0 +1,112 @@ +package schduler + +import ( + "context" + "time" + + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +type scheduler struct { + // 是否延期 + IsDelay int + // 总进度 + FinishedPtr int + // 总量 + Total int + // 实体 + WorkStatus *entity.WorkSchedule +} + +type Schdule map[string]scheduler + +// New 初始化计划 +func New(ScheduleData []entity.WorkSchedule) (Schdule, error) { + ctx := context.Background() + scheduleMap := make(Schdule) + + for _, task := range ScheduleData { + // 计划进度 + expectedProgress := task.PlanNum + // 实际完成度 + actualProgress := task.FinishedNum + + // 判断是否延期 + isDelayed := isDelay(task.EndAt.Format("Y-m-d"), expectedProgress, actualProgress) + + // 如果 WorkID 不存在 + if _, exists := scheduleMap[task.WorkId]; !exists { + newScheduler := scheduler{ + IsDelay: isDelayed, + WorkStatus: &task, + Total: expectedProgress, + FinishedPtr: actualProgress, + } + + scheduleMap[task.WorkId] = newScheduler // 添加到 map 中 + + continue + } + + existingScheduler := scheduleMap[task.WorkId] // 存在则取出 Value + + // 判断延期 + if existingScheduler.IsDelay != 1 { // 为了防止在存在多个计划的情况下,未延期的计划覆盖了已经延期的状态。 + // 修改 Work_Status 中 is_delay 修改为延期状态 1 + _, err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().WorkId, task.WorkId). + Data(g.Map{dao.WorkStatus.Columns().IsDelay: 1}).Update() + if err != nil { + return nil, err + } + + existingScheduler.IsDelay = isDelayed // 修改 map 中的状态 + } + + // 多个计划的情况下叠加数据 + existingScheduler.Total += expectedProgress // 计划总量叠加 + existingScheduler.FinishedPtr += actualProgress // 实际进度叠加 + scheduleMap[task.WorkId] = existingScheduler + } + + return scheduleMap, nil +} + +// 获取指定 WorkID 的计划和总量 +func (s Schdule) Get(workID string) (finishedPtr, total int) { + if sch, ok := s[workID]; ok { + return sch.FinishedPtr, sch.Total + } + return 0, 0 +} + +// GetStatus 根据 WorkID 获取工作的状态,判断是否延期 +// s[workID] 中记录了该 WorkID 的计划总量和实际进度 +// total 是计划的总量 +// 如果实际进度(FinishedPtr)小于计划总量,则判断工作为延期(返回1) +// 如果实际进度达到或超过计划总量,或者 WorkID 不存在于计划中,判断工作未延期(返回0) +func (s Schdule) GetStatus(workID string, total int) int { + if sch, ok := s[workID]; ok { + if sch.FinishedPtr < total { + return sch.IsDelay + } + } + return 0 +} + +// isDelay 如果实际完成数量小于计划数量,且当前时间大于结束时间,则判断为延期 +// endAt 结束时间 +// planNum 计划数量 +// finishedNum 实际数量 +func isDelay(endAt string, planNum, finishedNum int) int { + // 当天时间 + nowTime := time.Now().AddDate(0, 0, -1).Format("2006-01-02") + + // 如果实际完成数量小于计划数量,且当前时间大于结束时间,则判断为延期 + if finishedNum < planNum && nowTime > endAt { + return 1 + } + + return 0 +} diff --git a/third/securityRequest.go b/third/securityRequest.go new file mode 100644 index 0000000..ad1afc1 --- /dev/null +++ b/third/securityRequest.go @@ -0,0 +1,114 @@ +// Package utility 安全请求,思路来源https://blog.csdn.net/David_jiahuan/article/details/106391956 +// @Author 铁憨憨[cory] 2024/9/11 9:38:00 +package utility + +import ( + "crypto/md5" + "crypto/sha256" + "encoding/hex" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/ghttp" + "github.com/gogf/gf/v2/os/gctx" + "github.com/gogf/gf/v2/util/gconv" + "math/big" + "strconv" + "time" +) + +// 签名验证中间件 +func SignatureMiddleware(r *ghttp.Request) { + if r.URL.Path == "/zm/api/wxApplet/wxApplet/appPort/releaseAppVersion" { + r.Middleware.Next() + return + } + // 获取请求中的参数 + signature := gconv.String(r.Header.Get("sign")) + timestamp := gconv.Int64(r.Header.Get("timestamp")) + nonce := gconv.String(r.Header.Get("nonce")) + if signature == "" || timestamp == 0 || nonce == "" { + r.Response.WriteJson(g.Map{"error": "无效验证"}) + r.ExitAll() + return + } + //验证时间戳 + if !validateTimestamp(timestamp) { + r.Response.WriteJson(g.Map{"error": "请求过期"}) + r.ExitAll() + return + } + // 验证 nonce 防止重放攻击 + if !validateNonce(nonce) { + r.Response.WriteJson(g.Map{"error": "无效请求:检测到重放"}) + r.ExitAll() + return + } + serverSignature := generateServerSignature(strconv.FormatInt(timestamp, 10), nonce) + // 验证签名 + if signature != serverSignature { + r.Response.WriteJson(g.Map{"error": "签名错误"}) + r.ExitAll() + return + } + //签名验证通过 + r.Middleware.Next() +} + +func validateTimestamp(unixTimestamp int64) bool { + // 获取当前时间 + now := time.Now().UnixMilli() + result := subtractBigFromInt64(now, unixTimestamp) + // 将整数 1500 转换为 *big.Int 类型 + big1500 := big.NewInt(30000) + // 验证时间差是否在 1500 毫秒内 + if result.Cmp(big1500) == -1 && result.Cmp(big.NewInt(0)) >= 0 { + return true + } + return false +} + +func subtractBigFromInt64(currentMillis int64, unixTimestamp int64) *big.Int { + // 将两个 int64 类型的值转换为 *big.Int 类型 + bigCurrent := big.NewInt(currentMillis) + bigUnixTimestamp := big.NewInt(unixTimestamp) + // 计算差值 + result := big.NewInt(0).Sub(bigCurrent, bigUnixTimestamp) + // 求差值的绝对值 + return result.Abs(result) +} + +// 验证 nonce +func validateNonce(nonce string) bool { + nonceKey := "reset" + nonce + // 使用 Redis 来存储 nonce,防止重放 + redisClient := g.Redis() + ctx := gctx.New() + exists, err := redisClient.Exists(ctx, nonceKey) + if err != nil { + return false + } + if exists > 0 { + return false // nonce 已经存在,说明是重放请求 + } + // nonce 不存在,存储到 Redis 并设置60秒过期时间 + err = redisClient.SetEX(ctx, nonceKey, nonce, 60) + if err != nil { + return false + } else { + return true + } +} + +// 生成服务端签名 +func generateServerSignature(timestamp, nonce string) string { + sum := md5.Sum([]byte("coyrOrtiehanhan1223202409111457")) + md5Sum := hex.EncodeToString(sum[:]) + // 拼接时间戳、nonce 和 secretKey + signStr := md5Sum + timestamp + nonce + // 对拼接后的字符串进行 MD5 加密 + md5Hash := md5.Sum([]byte(signStr)) + md5Hex := hex.EncodeToString(md5Hash[:]) + // 对 MD5 结果进行 SHA-256 加密 + sha256Hash := sha256.Sum256([]byte(md5Hex)) + sha256Hex := hex.EncodeToString(sha256Hash[:]) + return sha256Hex +} diff --git a/third/solaranalyzer/analyzer.go b/third/solaranalyzer/analyzer.go new file mode 100644 index 0000000..a4ac294 --- /dev/null +++ b/third/solaranalyzer/analyzer.go @@ -0,0 +1,88 @@ +package solaranalyzer + +import ( + "encoding/json" + "os/exec" + "path/filepath" + "strings" + + "github.com/tidwall/gjson" +) + +const ( + drillingHole = "hole" // 钻孔 + pillar = "pile" // 桩基 + bracket = "shelves" // 支架 + solarPanel = "pho" // 光伏板 +) + +type Point struct { + Points []XYPosition // 光伏板的坐标点 + ID int // pv_module 表中的自增ID +} + +type XYPosition struct { + X float64 `json:"x"` + Y float64 `json:"y"` +} + +// getSolarPanelRanges 解析光伏板 JSON +func getSolarPanelRanges(file string) []Point { + var points []Point + + gjson.Parse(file).ForEach(func(_, record gjson.Result) bool { + record.Get("detail").ForEach(func(_, detail gjson.Result) bool { + id := record.Get("id").Int() + + var longitudeAndLatitude []XYPosition + gjson.Get(detail.String(), "positions").ForEach(func(_, position gjson.Result) bool { + longitude := position.Get("lng").Float() + latitude := position.Get("lat").Float() + + longitudeAndLatitude = append(longitudeAndLatitude, XYPosition{X: longitude, Y: latitude}) + return true + }) + + points = append(points, Point{ID: int(id), Points: longitudeAndLatitude}) + + return true + }) + + return true + }) + + return points +} + +// convertToLongitudeAndLatitude 根据 tif 文件将坐标转换为经纬度 +func convertToLongitudeAndLatitude(tifFilePath string, coordinatePoints []XYPosition) []XYPosition { + positionsJSON, err := json.Marshal(coordinatePoints) + if err != nil { + panic(err) + } + + convertPath, err := filepath.Abs("./convert") + if err != nil { + panic(err) + } + + output, err := exec.Command(convertPath, filepath.Clean(tifFilePath), string(positionsJSON)).CombinedOutput() + if err != nil { + panic(err) + } + + outputLines := strings.Split(string(output), "\n") + lastLine := outputLines[len(outputLines)-2] // 获取最后一行 + + // 解析二进制返回的 JSON, 并将其转换为 XYPosition 结构 + var longitudeAndLatitude []XYPosition + gjson.Get(lastLine, "data").ForEach(func(_, position gjson.Result) bool { + longitudeAndLatitude = append(longitudeAndLatitude, XYPosition{ + X: position.Get("y").Float(), + Y: position.Get("x").Float(), + }) + return true + }) + + return longitudeAndLatitude +} diff --git a/third/solaranalyzer/bracket.go b/third/solaranalyzer/bracket.go new file mode 100644 index 0000000..9a71949 --- /dev/null +++ b/third/solaranalyzer/bracket.go @@ -0,0 +1,57 @@ +package solaranalyzer + +import ( + "math" + + "github.com/tomchavakis/geojson/geometry" +) + +const ( + earthRadius = 6371000 // 地球半径(米) + + radiusMeters = 0.07 // 半径(7厘米) + + numPoints = 8 // 点的数量 +) + +type GeoPoint struct { + ID int + Coordinates Coordinates +} + +type Coordinates struct { + Lng float64 + Lat float64 + Alt float64 +} + +// ExpandToCircle 用于桩点和支架 +// 以一个点为中心,扩展出一个圆形 +func (p Coordinates) ExpandToCircle() geometry.Polygon { + circle := make([]Coordinates, numPoints) + + for i := 0; i < numPoints; i++ { + angle := 2 * math.Pi * float64(i) / float64(numPoints) + + // 计算偏移量(米) + dx := radiusMeters * math.Cos(angle) + dy := radiusMeters * math.Sin(angle) + + // 将米转换为经纬度 + dLng := dx / (earthRadius * math.Cos(p.Lat*math.Pi/180)) * 180 / math.Pi + dLat := dy / earthRadius * 180 / math.Pi + + circle[i] = Coordinates{ + Lng: p.Lng + dLng, + Lat: p.Lat + dLat, + Alt: p.Alt, + } + } + + var coords []geometry.Point + for _, point := range circle { + coords = append(coords, geometry.Point{Lat: point.Lat, Lng: point.Lng}) + } + + return geometry.Polygon{Coordinates: []geometry.LineString{{Coordinates: coords}}} +} diff --git a/third/solaranalyzer/sparta.go b/third/solaranalyzer/sparta.go new file mode 100644 index 0000000..88bec84 --- /dev/null +++ b/third/solaranalyzer/sparta.go @@ -0,0 +1,695 @@ +package solaranalyzer + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "strings" + "time" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/samber/lo" + "github.com/tidwall/gjson" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" + "github.com/tiger1103/gfast/v3/library/liberr" + + "github.com/tomchavakis/geojson/geometry" + "github.com/tomchavakis/turf-go" +) + +type AIResult struct { + SolarPanels []XYPosition // 光伏板的坐标点 + Brackets []XYPosition // 支架的坐标点 + Pillars []XYPosition // 立柱的坐标点 + Holes []XYPosition // 钻孔的坐标点 +} + +// ToGeoPoints 将坐标转换为经纬度坐标 +func (r *AIResult) ToGeoPoints(tifPath string) *AIResult { + r.SolarPanels = convertToLongitudeAndLatitude(tifPath, r.SolarPanels) // 光伏板 + r.Brackets = convertToLongitudeAndLatitude(tifPath, r.Brackets) // 支架 + r.Pillars = convertToLongitudeAndLatitude(tifPath, r.Pillars) // 立柱 + r.Holes = convertToLongitudeAndLatitude(tifPath, r.Holes) // 钻孔 + return r +} + +// IsCircleContainsPoint 判断圆形是否包含点,返回桩点的主键ID +func (r *AIResult) IsCircleContainsPoint(m map[string]map[string]GeoPoint, usePillars string) []int { + var ids []int + + var elements []XYPosition + switch usePillars { + case drillingHole: + elements = r.Holes + case pillar: + elements = r.Pillars + case bracket: + elements = r.Brackets + } + + for _, aiPillar := range elements { + // AI 识别点 + aiPoint := geometry.Point{Lng: aiPillar.X, Lat: aiPillar.Y} + + // 方阵层 + for _, points := range m { + // 立柱层 + for _, dbPillar := range points { + circle := dbPillar.Coordinates.ExpandToCircle() + + if ok, err := turf.PointInPolygon(aiPoint, circle); ok && err == nil { + ids = append(ids, dbPillar.ID) + } + } + } + } + + return ids +} + +// GetFromDB 从数据库中获取光伏板、支架、桩点的数据 +func (r *AIResult) GetFromDB(projectID string) ([]Point, map[string]map[string]GeoPoint) { + // 光伏板、支架 + var solarPanels []Point + var pillars map[string]map[string]GeoPoint + + if len(r.SolarPanels) != 0 { + if points, err := getSolarPanelCenters(projectID); err == nil { + solarPanels = points + } + } + + if len(r.Pillars) != 0 { + pillars = getPillars(projectID) + } + + return solarPanels, pillars +} + +// 传入 AI 结果 +// 1. 将其周围的组串,全部标记为已完成 +// 2. 根据其 【方阵ID】【Type = 13】更新其在 work_status 中的总数 ok +// 3. 根据当前的 Name Etc: G1.123.1.1 将 pv_module 中的 G1.123.1 状态修改为已完成 +// 4. 记录该数据由 AI 识别。 +func (r *AIResult) Run(projectID string, id int) { + // 获取光伏板和支架,桩点的数据 + panels, brackets := r.GetFromDB(projectID) + fmt.Println("(内容)光伏板和支架: ", panels) + fmt.Println("(内容)桩点: ", brackets) + + // 预处理光伏板为多边形 + polygons := make([]geometry.Polygon, len(panels)) + for i, rect := range panels { + coords := make([]geometry.Point, len(rect.Points)) + for j, p := range rect.Points { + coords[j] = geometry.Point{Lng: p.X, Lat: p.Y} + } + polygons[i] = geometry.Polygon{Coordinates: []geometry.LineString{{Coordinates: coords}}} + } + fmt.Println("(内容)预处理光伏板为多边形: ", polygons) + fmt.Println("(内容)光伏板坐标后点: ", r.SolarPanels) + // 光伏板的主键ID + var matchedRectangles []int + // 匹配AI识别的光伏板中心点 + for _, point := range r.SolarPanels { + for i, polygon := range polygons { + if ok, err := turf.PointInPolygon(geometry.Point{Lng: point.X, Lat: point.Y}, polygon); err == nil && ok { + matchedRectangles = append(matchedRectangles, panels[i].ID) + break + } + } + } + + _, err := dao.ManageTaskResult.Ctx(context.Background()).Insert( + lo.Map(matchedRectangles, func(v int, _ int) do.ManageTaskResult { + return do.ManageTaskResult{ + TaskId: id, + PvId: v, + } + })) + liberr.ErrIsNil(context.Background(), err) + + if len(matchedRectangles) > 0 { // TODO: 去除写入数据库的逻辑 + // if err := ProcessMatchedRectangles(matchedRectangles); err != nil { + // g.Log("uav").Error(context.Background(), "更新匹配到的光伏板失败: ", err) + // } + } + + // 更新钻孔 + if len(r.Holes) > 0 { + ids := r.IsCircleContainsPoint(brackets, drillingHole) + if len(ids) > 0 { + if err := processPillarIDs(ids, 12, id); err != nil { + g.Log("uav").Error(context.Background(), "更新匹配到的支架失败: ", err) + } + } + } + + // 更新支架和桩点 + if len(r.Pillars) > 0 { + ids := r.IsCircleContainsPoint(brackets, pillar) + if len(ids) > 0 { + if err := processPillarIDs(ids, 13, id); err != nil { + g.Log("uav").Error(context.Background(), "更新匹配到的支架失败: ", err) + } + } + } + + if len(r.Brackets) > 0 { + ids := r.IsCircleContainsPoint(brackets, bracket) + if len(ids) > 0 { + if err := processPillarIDs(ids, 14, id); err != nil { + g.Log("uav").Error(context.Background(), "更新匹配到的支架失败: ", err) + } + } + } +} + +// 通过主键ID,可以从 qianqi_guangfuban_ids_zhijia 表中查询到对应的 “方阵ID” 和 "子项目ID" +// 将得到的结果分组,第一层为 方阵ID,第二层 G01.12.18,第三层数组,[ G01.12.18.1,G01.12.18.2,G01.12.18.3 ] +// 如果第三层中有数据,则从数据库中,向前后查询相邻组串,并将其组串修改为已完成,同时取出第二层和方阵ID,用于更新 pv_module 和 work_status 表中的数据。 +func processPillarIDs(ids []int, t, id int) error { + return nil + + // 查询 qianqi_guangfuban_ids_zhijia 表 + var zhijias []entity.QianqiGuangfubanIdsZhijia + if err := dao.QianqiGuangfubanIdsZhijia.Ctx(context.Background()). + Fields("id,fangzhen_id,sub_projectid,name"). + WhereIn(dao.QianqiGuangfubanIdsZhijia.Columns().Id, ids). + Scan(&zhijias); err != nil { + return err + } + + // 第一层方阵ID, 第二层支架名称, 第三层支架信息 + realGeoPoint := make(map[string]map[string][]entity.QianqiGuangfubanIdsZhijia) + for _, zhijia := range zhijias { + fangzhenID := zhijia.FangzhenId // 方阵ID + zhijiaName := zhijia.Name[:strings.LastIndex(zhijia.Name, ".")] // 支架名称 + + if _, ok := realGeoPoint[fangzhenID]; !ok { + realGeoPoint[fangzhenID] = make(map[string][]entity.QianqiGuangfubanIdsZhijia) + } + + realGeoPoint[fangzhenID][zhijiaName] = append(realGeoPoint[fangzhenID][zhijiaName], zhijia) + } + + // 查询支架及其相邻的组串 + for _, geoPoints := range realGeoPoint { + for pointKey, pointList := range geoPoints { + if len(pointList) > 1 { + firstPoint := pointList[0] + + simulationID := firstPoint.FangzhenId + namePattern := firstPoint.Name[:strings.LastIndex(firstPoint.Name, ".")] + ".%" + + var updatedPoints []entity.QianqiGuangfubanIdsZhijia + if err := dao.QianqiGuangfubanIdsZhijia.Ctx(context.Background()).Where(dao.QianqiGuangfubanIdsZhijia.Columns().FangzhenId, simulationID). + Where(dao.QianqiGuangfubanIdsZhijia.Columns().Name+" LIKE ?", namePattern). + Scan(&updatedPoints); err == nil && len(updatedPoints) > 0 { + realGeoPoint[simulationID][pointKey] = updatedPoints + } + } + } + } + + // 更新数据库状态 + for _, geoPoints := range realGeoPoint { + for key, pointList := range geoPoints { + // 取出所有的ID + primaryIDs := lo.Map(pointList, func(v entity.QianqiGuangfubanIdsZhijia, _ int) int { + return v.Id + }) + + g.Try(context.Background(), func(ctx context.Context) { + // 根据主键修改为已完成 + // 修改组串的状态 + // G01.12.18.1 -- G01.12.18.2 -- G01.12.18.3 + _, err := dao.QianqiGuangfubanIdsZhijia.Ctx(ctx).WhereIn(dao.QianqiGuangfubanIdsZhijia.Columns().Id, primaryIDs). + Data(g.Map{ + dao.QianqiGuangfubanIdsZhijia.Columns().Status: 2, + }).Update() + liberr.ErrIsNil(ctx, err) + + fangzhenID := pointList[0].FangzhenId + + // 根据名字从 pv_module 中获取主键id + result, err := dao.PvModule.Ctx(ctx).Fields("id").Where(dao.PvModule.Columns().Name, key). + Where(dao.PvModule.Columns().FangzhenId, fangzhenID). + Where(dao.PvModule.Columns().Type, t).One() + liberr.ErrIsNil(ctx, err) + + // 获取主键ID + keyID := result.Map()["id"].(int) + dao.ManageTaskResult.Ctx(ctx).Data(do.ManageTaskResult{ + TaskId: id, + PvId: keyID, + }).Insert() // 记录 + + // 更新 PVModule 表中的状态 + // G01.12.18 + lastID, err := dao.PvModule.Ctx(ctx).WhereIn(dao.PvModule.Columns().Id, keyID). + Where(dao.PvModule.Columns().FangzhenId, fangzhenID). + Where(dao.PvModule.Columns().Type, t). + Data(g.Map{ + dao.PvModule.Columns().Status: 2, + }).Update() + + // 获取影响行数并更新 work_status 表 + rows, err := lastID.RowsAffected() + liberr.ErrIsNil(ctx, err) + if rows > 0 { + _, err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, fangzhenID). + Where(dao.WorkStatus.Columns().Type, t). + Data(g.Map{ + dao.WorkStatus.Columns().Finished: gdb.Raw( + "finished + 1", + ), + }).Update() + liberr.ErrIsNil(ctx, err) + } + + // 根据 类型和方阵ID 获取对应的 work_id + dd := entity.WorkStatus{} + err = dao.WorkStatus.Ctx(ctx).Fields("work_id").Where(dao.WorkStatus.Columns().FangzhenId, fangzhenID). + Where(dao.WorkStatus.Columns().Type, t).Scan(&dd) + liberr.ErrIsNil(ctx, err) + + work_id := dd.WorkId + err = UpdateWorkSchedule(work_id) + liberr.ErrIsNil(ctx, err) + }) + } + } + + return nil +} + +// 处理匹配到的光伏板 +func ProcessMatchedRectangles(matchedRectangles []int) error { + if len(matchedRectangles) == 0 { + return nil + } + + return g.Try(context.Background(), func(ctx context.Context) { + timeNow := time.Now().Format("2006-01-02") + // 更新光伏板状态 + _, err := dao.PvModule.Ctx(ctx). + WhereIn(dao.PvModule.Columns().Id, matchedRectangles). + Data(g.Map{ + dao.PvModule.Columns().Status: 3, + dao.PvModule.Columns().DoneTime: timeNow, + }).Update() + liberr.ErrIsNil(ctx, err, "更新光伏板状态失败") + + // 获取所有的 work_id + pvModules := []entity.PvModule{} + err = dao.PvModule.Ctx(ctx).Fields("work_id").WhereIn("id", matchedRectangles).Scan(&pvModules) + liberr.ErrIsNil(ctx, err, "查询 pv_module 表失败") + + // 提取所有的 work_id + workIds := lo.Map(pvModules, func(module entity.PvModule, _ int) string { + return module.WorkId + }) + + // 查询 work_status 表 + var workStatus []entity.WorkStatus + err = dao.WorkStatus.Ctx(ctx).WhereIn(dao.WorkStatus.Columns().WorkId, workIds).Scan(&workStatus) + liberr.ErrIsNil(ctx, err, "查询 work_status 表失败") + + statusMap := make(map[string]entity.WorkStatus) + for _, status := range workStatus { + statusMap[status.WorkId] = status + } + + // 遍历 pv_module 表,根据 work_id 更新 work_status 表 + for _, pvModule := range pvModules { + if _, ok := statusMap[pvModule.WorkId]; !ok { + continue + } + + // 2. 更新计划表 work_schdule 表中计划 + // timeNow := time.Now().Format("2006-01-02") + + // 根据 work_id 查询所有的计划 + var workSchedules []entity.WorkSchedule + err = dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().WorkId, pvModule.WorkId).Scan(&workSchedules) + if len(workSchedules) == 0 { + liberr.ErrIsNil(ctx, errors.New("需要前往进度计划对应的方阵中,设置计划日期,随后再来实现进度复查功能!")) + return + } + liberr.ErrIsNil(ctx, err, "查询 work_schedule 表失败") + + // 根据计划起始和结束时间,当天位于哪个计划中 + for _, schedule := range workSchedules { + startAt := schedule.StartAt.Format("Y-m-d") + endAt := schedule.EndAt.Format("Y-m-d") + + if timeNow >= startAt && timeNow <= endAt { + // 反序列化 Detail + var details []struct { + Date string `json:"date"` + PlanNum int `json:"planNum"` + FinishedNum int `json:"finishedNum"` // 手动填充的完成数量 + AutoFill int `json:"autoFill"` // 是否自动填充 + } + if err := json.Unmarshal([]byte(schedule.Detail), &details); err != nil { + continue + } + + // 遍历 details,找到当天的计划 + for i := range details { + if details[i].Date == timeNow { + details[i].AutoFill++ // 标记为 AI 识别 + } + } + + // 序列化 details + detailBytes, err := json.Marshal(details) + if err != nil { + continue + } + + // 更新 work_schedule 表 + _, err = dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().WorkId, schedule.WorkId). + Data(g.Map{ + dao.WorkSchedule.Columns().Detail: string(detailBytes), + dao.WorkSchedule.Columns().FinishedNum: schedule.FinishedNum + 1, + }).Update() + liberr.ErrIsNil(ctx, err, "更新 work_schedule 表失败") + + var currentStatus entity.WorkStatus + err = dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().WorkId, schedule.WorkId).Scan(¤tStatus) + liberr.ErrIsNil(ctx, err, "查询 work_status 表失败") + + if currentStatus.Finished+1 <= currentStatus.Total { + finished := currentStatus.Finished + 1 + + _, err = dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().WorkId, currentStatus.WorkId). + Where(dao.WorkStatus.Columns().Type, currentStatus.Type). + Data(g.Map{ + dao.WorkStatus.Columns().Finished: finished, + }).Update() + liberr.ErrIsNil(ctx, err, "更新 work_status 表失败") + } + } + } + } + }) +} + +// 传入一个 workID 修改其对应的计划数据 +func UpdateWorkSchedule(workID string) error { + return g.Try(context.Background(), func(ctx context.Context) { + // 查询 work_status 表 + var workStatus []entity.WorkStatus + err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().WorkId, workID).Scan(&workStatus) + liberr.ErrIsNil(ctx, err, "查询 work_status 表失败") + + // 遍历 work_status 表,如果自增后的完成量小于等于总数,则将完成量加一 + for _, status := range workStatus { + if status.Finished+1 <= status.Total { + finished := status.Finished + 1 + + _, err = dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().WorkId, status.WorkId). + Data(g.Map{ + dao.WorkStatus.Columns().Finished: finished, + }).Update() + liberr.ErrIsNil(ctx, err, "更新 work_status 表失败") + } + + // 2. 更新计划表 work_schdule 表中计划 + timeNow := time.Now().Format("2006-01-02") + + // 根据 work_id 查询所有的计划 + var workSchedules []entity.WorkSchedule + err = dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().WorkId, status.WorkId).Scan(&workSchedules) + liberr.ErrIsNil(ctx, err, "查询 work_schedule 表失败") + + // 会出现多个计划的情况下,需要根据计划的起始和结束时间来确定具体的计划 + for _, schedule := range workSchedules { + startAt := schedule.StartAt.Format("Y-m-d") + endAt := schedule.EndAt.Format("Y-m-d") + + if timeNow >= startAt && timeNow <= endAt { + // 反序列化 Detail + var details []struct { + Date string `json:"date"` + PlanNum int `json:"planNum"` + FinishedNum int `json:"finishedNum"` // 手动填充的完成数量 + AutoFill int `json:"autoFill"` // 是否自动填充 + } + if err := json.Unmarshal([]byte(schedule.Detail), &details); err != nil { + continue + } + + // 遍历 details,找到当天的计划 + for i := range details { + if details[i].Date == timeNow { + // 为自动填充的数量加一 + details[i].AutoFill++ + } + } + + // 序列化 details + detailBytes, err := json.Marshal(details) + if err != nil { + continue + } + + // 更新 work_schedule 表 + _, err = dao.WorkSchedule.Ctx(ctx).Where(dao.WorkSchedule.Columns().WorkId, status.WorkId). + Where(dao.WorkSchedule.Columns().Id, schedule.Id). + Data(g.Map{ + dao.WorkSchedule.Columns().Detail: string(detailBytes), + }).Update() + liberr.ErrIsNil(ctx, err, "更新 work_schedule 表失败") + } + } + } + }) +} + +// parseAIResult 解析识别的结果,提取出光伏板、支架和立柱的中心点 +// 该函数解析的 JSON 格式如下: +// +// { +// "targets": [ +// { +// "type": "pho", // 光伏板 +// "size": [100, 100], +// "leftTopPoint": [10, 10] +// } +// ] +// } +func ParseAIResul2(fileContent string) *AIResult { + // 钻孔、桩基、支架、光伏板 + var solarPanels, brackets, pillars, holes []XYPosition + + gjson.Get(fileContent, "targets").ForEach(func(_, target gjson.Result) bool { + targetType := target.Get("type").String() + + if targetType != solarPanel && targetType != bracket && targetType != pillar && targetType != drillingHole { + return true + } + + size := lo.FilterMap(target.Get("size").Array(), func(size gjson.Result, _ int) (int, bool) { + return int(size.Int()), true + }) + + leftTopPoint := lo.FilterMap(target.Get("leftTopPoint").Array(), func(point gjson.Result, _ int) (int, bool) { + return int(point.Int()), true + }) + + // 获取中心点 + centroidX := float64(leftTopPoint[0]) + float64(size[0])/2 + centroidY := float64(leftTopPoint[1]) + float64(size[1])/2 + position := XYPosition{X: centroidX, Y: centroidY} + + switch targetType { + case solarPanel: + solarPanels = append(solarPanels, position) + case bracket: + brackets = append(brackets, position) + case pillar: + pillars = append(pillars, position) + case drillingHole: + holes = append(holes, position) + } + + return true + }) + + marshal1, _ := json.Marshal(solarPanels) + marshal2, _ := json.Marshal(brackets) + marshal3, _ := json.Marshal(pillars) + marshal4, _ := json.Marshal(holes) + fmt.Println("光伏板的坐标点", string(marshal1)) + fmt.Println("支架的坐标点", string(marshal2)) + fmt.Println("立柱的坐标点", string(marshal3)) + fmt.Println("钻孔的坐标点", string(marshal4)) + + return &AIResult{ + SolarPanels: solarPanels, + Brackets: brackets, + Pillars: pillars, + Holes: holes, + } +} + +// getSolarPanelCenters 获取数据库中光伏板的中心点 +func getSolarPanelCenters(projectID string) ([]Point, error) { + // 获取所有的子项目 + subProjectQuery := g.Model("sub_project").Fields("id").Where("project_id", projectID) + + var pvModules []entity.PvModule + if err := dao.PvModule.Ctx(context.Background()). + WhereIn(dao.PvModule.Columns().SubProjectid, subProjectQuery). + Where(dao.PvModule.Columns().Type, 15). + WhereNot(dao.PvModule.Columns().Status, 2). + WhereNot(dao.PvModule.Columns().Status, 3). + Scan(&pvModules); err != nil { + return nil, err + } + + var points []Point + + // tojson + dd, _ := json.Marshal(pvModules) + gjson.Parse(string(dd)).ForEach(func(_, record gjson.Result) bool { + record.Get("detail").ForEach(func(_, detail gjson.Result) bool { + id := record.Get("id").Int() + + var longitudeAndLatitude []XYPosition + gjson.Get(detail.String(), "positions").ForEach(func(_, position gjson.Result) bool { + longitude := position.Get("lng").Float() + latitude := position.Get("lat").Float() + + longitudeAndLatitude = append(longitudeAndLatitude, XYPosition{X: longitude, Y: latitude}) + return true + }) + + points = append(points, Point{ID: int(id), Points: longitudeAndLatitude}) + + return true + }) + + return true + }) + + return points, nil +} + +func getPillars(projectID string) map[string]map[string]GeoPoint { + ctx := context.Background() + + // 获取所有的子项目 + subProjectQuery := g.Model("sub_project").Fields("id").Where("project_id", projectID) + + // 查询 qianqi_guangfuban_ids_zhuangdian 表 + var zhuangdians []entity.QianqiGuangfubanIdsZhuangdian + if err := dao.QianqiGuangfubanIdsZhuangdian.Ctx(ctx). + Fields("id,fangzhen_id,detail,name"). + WhereIn(dao.QianqiGuangfubanIdsZhuangdian.Columns().SubProjectid, subProjectQuery). + Scan(&zhuangdians); err != nil { + panic(err) + } + + // 第一层方阵ID, 第二层立柱名称, 第三层立柱信息 + realGeoPoint := make(map[string]map[string]GeoPoint) + for _, zhuangdian := range zhuangdians { + fangzhenID := zhuangdian.FangzhenId + pillarName := zhuangdian.Name + + var coordinates struct { + Position struct { + Lng float64 `json:"lng"` + Lat float64 `json:"lat"` + Alt float64 `json:"alt"` + } + } + if err := json.Unmarshal([]byte(zhuangdian.Detail), &coordinates); err != nil { + continue + } + + if _, ok := realGeoPoint[fangzhenID]; !ok { + realGeoPoint[fangzhenID] = make(map[string]GeoPoint) + } + + realGeoPoint[fangzhenID][pillarName] = GeoPoint{ + ID: zhuangdian.Id, + Coordinates: Coordinates{ + Lng: coordinates.Position.Lng, + Lat: coordinates.Position.Lat, + Alt: coordinates.Position.Alt, + }, + } + } + + return realGeoPoint +} + +// UpdateTableData 更新表中的数据 +func UpdateTableData(task_id int) error { + ctx := context.Background() + + // 根据任务ID查询出所有的 PV Module ID + var pvlist []struct { + PvID int `orm:"pv_id"` + FangZhenID int `orm:"fangzhen_id"` + WorkID string `orm:"work_id"` + TypeID int `orm:"type"` + } + + // 查询出基本信息 + err := dao.PvModule.Ctx(ctx).As("pv").Fields("pv.id as pv_id", "pv.fangzhen_id", "pv.work_id", "pv.type"). + LeftJoin("manage_task_result as mts", "pv.id = mts.pv_id"). + Where("mts.task_id = ?", task_id).Scan(&pvlist) + if err != nil { + return fmt.Errorf("查询 PV Module 表失败: %w", err) + } + + if len(pvlist) == 0 { + return nil + } + + return g.Try(ctx, func(ctx context.Context) { + for _, v := range pvlist { + if v.TypeID == 15 { // 光伏板 + if err := ProcessMatchedRectangles([]int{v.PvID}); err != nil { + return + } + continue + } + + // 更新 PV Module 表 + lastID, err := dao.PvModule.Ctx(ctx).Where(dao.PvModule.Columns().Id, v.PvID). + Where(dao.PvModule.Columns().FangzhenId, v.FangZhenID). + Where(dao.PvModule.Columns().Type, v.TypeID). + Data(g.Map{ + dao.PvModule.Columns().Status: 2, + }).Update() + liberr.ErrIsNil(ctx, err) + + rows, err := lastID.RowsAffected() + liberr.ErrIsNil(ctx, err) + + if rows > 0 { + // 更新 work_status 表 + _, err := dao.WorkStatus.Ctx(ctx).Where(dao.WorkStatus.Columns().FangzhenId, v.FangZhenID). + Where(dao.WorkStatus.Columns().Type, v.TypeID). + Data(g.Map{ + dao.WorkStatus.Columns().Finished: gdb.Raw( + "finished + 1", + ), + }).Update() + liberr.ErrIsNil(ctx, err) + + UpdateWorkSchedule(v.WorkID) + } + } + }) +} diff --git a/third/thirdParty/tiandon.go b/third/thirdParty/tiandon.go new file mode 100644 index 0000000..9476477 --- /dev/null +++ b/third/thirdParty/tiandon.go @@ -0,0 +1,176 @@ +// Package thirdParty +// @Author 铁憨憨[cory] 2025/7/4 14:06:00 +package thirdParty + +import ( + "bytes" + "context" + "crypto/rand" + "crypto/rsa" + "crypto/x509" + "encoding/base64" + "encoding/json" + "fmt" + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast-cache/cache" + commonService "github.com/tiger1103/gfast/v3/internal/app/common/service" + "github.com/tiger1103/gfast/v3/library/liberr" + "net/http" + "time" +) + +/* +第三方接口: + + 1、获取token + 2、推送第三方数据 + 3、获取第三方数据 +*/ + +const publicKeyBase64 = `MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCoaejbjbttHyHuEzHL8lIX5GZZ6zIYrqJpEDlPM4V5LHn19rSAYp2FyAr8y5Ctny9uUdaYbkoFiVQgxWrAYo4X/3O0OFDsowE25FMOLQY0Mn5B6CvVR7Sdt3DqzIzM1tUnJCIbVGNfDMgxLrLwFN8RvOW8MPlB6LgOvlGMDbj+OQIDAQAB` + +type LoginRequest struct { + Username string `json:"username"` + Password string `json:"password"` +} +type LoginResponse struct { + Code int `json:"code"` + Msg string `json:"msg"` + Token string `json:"token"` +} + +// CheckIfThereAreTokens redis中获取token,没有就获取 +func CheckIfThereAreTokens(ctx context.Context) (token string, err error) { + key := "thirdParty:tiandon:token" + prefix := g.Cfg().MustGet(ctx, "system.cache.prefix").String() + gfCache := cache.New(prefix) + get, err := g.Redis().Get(ctx, gfCache.CachePrefix+key) + if err != nil && get.String() != "" { + token = get.String() + return token, err + } else { + token, err = getTheToken(ctx) + //过期时间为30分钟(1800秒),我这里少300秒,防止过期 + commonService.Cache().Set(ctx, key, token, time.Duration(1500)*time.Second) + return token, err + } +} + +// getTheToken token获取 +func getTheToken(ctx context.Context) (token string, err error) { + err = g.Try(ctx, func(ctx g.Ctx) { + // 1、构造加密密码 + encryptedPassword, err := rsaEncryptWithBase64PublicKey([]byte("Hkrsoft@#2023"), publicKeyBase64) + if err != nil { + liberr.ErrIsNil(ctx, err, "密码加密失败") + } + // 2、构造 JSON 请求体 + data, _ := json.Marshal(LoginRequest{ + Username: "zhangweiwei", + Password: encryptedPassword, + }) + // 3、构造 HTTP 请求 + req, _ := http.NewRequest("POST", "https://claritypm.powerchina.cn/neSmartsite-api/loginCli", bytes.NewReader(data)) + req.Header.Set("Content-Type", "application/json; charset=UTF-8") + req.Header.Set("User-Agent", "Mozilla/5.0") + req.Header.Set("Accept", "application/json") + req.Header.Set("Origin", "https://claritypm.powerchina.cn") + req.Header.Set("Referer", "https://claritypm.powerchina.cn/") + // 4、发送请求 + resp, err := http.DefaultClient.Do(req) + if err != nil { + liberr.ErrIsNil(ctx, err, "推送第三方数据失败") + } + defer resp.Body.Close() + // 5、解析响应体 + var result LoginResponse + if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { + liberr.ErrIsNil(ctx, err, "解析第三方数据失败") + } + token = result.Token + }) + return +} + +// rsaEncryptWithBase64PublicKey RSA加密函数 +func rsaEncryptWithBase64PublicKey(data []byte, base64PubKey string) (string, error) { + decoded, err := base64.StdEncoding.DecodeString(base64PubKey) + if err != nil { + return "", err + } + pubInterface, err := x509.ParsePKIXPublicKey(decoded) + if err != nil { + return "", err + } + pub := pubInterface.(*rsa.PublicKey) + encrypted, err := rsa.EncryptPKCS1v15(rand.Reader, pub, data) + if err != nil { + return "", err + } + return base64.StdEncoding.EncodeToString(encrypted), nil +} + +type RealUser struct { + UserName string `json:"userName"` + ClassManagerFlag string `json:"classManagerFlag,omitempty"` + Phone string `json:"phone"` + Sex string `json:"sex"` + CardType string `json:"cardType"` + CardNumber string `json:"cardNumber"` + UserType string `json:"userType"` + CardDept string `json:"cardDept,omitempty"` + Nation string `json:"nation,omitempty"` + Birthday string `json:"birthday,omitempty"` // 格式:2025-01-01 00:00:00 + Address string `json:"address,omitempty"` + Avatar string `json:"avatar,omitempty"` // 限一张 http 地址 + Pic string `json:"pic,omitempty"` // 限一张 http 地址 + SafetyEdu string `json:"safetyEdu,omitempty"` // 限一张 http 地址 + Technology string `json:"technology,omitempty"` // 限一张 http 地址 + CardStartTime string `json:"cardStartTime,omitempty"` // 格式:2025-01-01 00:00:00 + CardEndTime string `json:"cardEndTime,omitempty"` + StudyLevel string `json:"studyLevel,omitempty"` + PoliticsType string `json:"politicsType,omitempty"` + InsuranceFlag string `json:"insuranceFlag,omitempty"` + DiseaseFlag string `json:"diseaseFlag,omitempty"` + LaborContractFlag string `json:"laborContractFlag,omitempty"` + Contacts string `json:"contacts,omitempty"` + ContactsPhone string `json:"contactsPhone,omitempty"` + MarryRemark string `json:"marryRemark,omitempty"` +} + +// SendRy 发送工人信息 +func SendRy(ctx context.Context, user []*RealUser) (err error) { + err = g.Try(ctx, func(ctx context.Context) { + //1、获取token + token, err := CheckIfThereAreTokens(ctx) + liberr.ErrIsNil(ctx, err, "获取token失败") + // 2、创建请求 + jsonData, _ := json.Marshal(user) + fmt.Println(":::::::::::::::::::::: " + string(jsonData)) + req, err := http.NewRequest("POST", + "https://claritypm.powerchina.cn/neSmartsite-api/realUser/tiandong/insertRealUser", + bytes.NewReader(jsonData), + ) + liberr.ErrIsNil(ctx, err, "创建客户端失败") + // 3、设置请求头 + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Authorization", "Bearer "+token) + req.Header.Set("User-Agent", "Mozilla/5.0") + req.Header.Set("Accept", "application/json") + // 4、发送请求 + resp, err := http.DefaultClient.Do(req) + if err != nil { + liberr.ErrIsNil(ctx, err, "发送数据到第三方失败") + return + } + defer resp.Body.Close() + + var result LoginResponse + if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { + liberr.ErrIsNil(ctx, err, "解析第三方数据失败") + } + fmt.Println("l111响应状态码:", result.Code) + fmt.Println("c222响应内容:", result.Msg) + }) + return err +} diff --git a/third/todo/todo.go b/third/todo/todo.go new file mode 100644 index 0000000..a73a620 --- /dev/null +++ b/third/todo/todo.go @@ -0,0 +1,246 @@ +package todo + +import ( + "context" + "fmt" + "strings" + + "github.com/google/uuid" + "github.com/samber/lo" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/third/reminders" + + "github.com/gogf/gf/v2/frame/g" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/library/liberr" +) + +type TaskGroup struct { + Role int // 0 管理员 1 施工人员 + TsakType int // 补卡提醒 + ProjectID int // 项目 ID + UserID string // sys.user.id 或 wx.openid + MissingCardTime string // 缺卡时间 +} + +// 考勤审批 struct +type ReissueReminder struct { + UserID string // sys.user.id 或 wx.openid + Role int // 0 管理员 1 施工人员 + ProjectID int // 项目 ID + CreatorID string // 创建人 ID + TargetID int // 对应跳转的主键ID +} + +func CreateCardReminderTasks(todoList []TaskGroup) error { + // 获取 OpenID 对应的 sys_user.id + openIDToUserIDMap := reminders.GetUserIDByOpenIDs( // 2. 获取所有的 openid 对应的 sys_user.id + lo.FilterMap(todoList, func(item TaskGroup, _ int) (string, bool) { // 1. 筛选出所有的 openid + if reminders.HasLetter(item.UserID) { + return item.UserID, true + } + return item.UserID, false + }), + ) + + // 替换 todoList 中的 userID + for i := range todoList { + if newUserID, ok := openIDToUserIDMap[todoList[i].UserID]; ok { + todoList[i].UserID = newUserID + } + } + + // 同一组的消息拥有相同的 UUID + groupUUID := uuid.New().String() + todoTasks := lo.Map(todoList, func(item TaskGroup, _ int) do.TodoTasks { + return do.TodoTasks{ + TaskType: item.TsakType, // 补卡提醒 + ProjectId: item.ProjectID, // 项目 ID + UserId: item.UserID, // 消息接收者的 sys_User.Id + Role: item.Role, + MissingCardTime: item.MissingCardTime, // 缺卡时间 示例:`03月14日 08:30上班卡;18:00下班卡` + Uuid: groupUUID, + } + }) + + _, err := dao.TodoTasks.Ctx(context.Background()).Insert(todoTasks) + return err +} + +// CreateMissingCardReminder 创建并发布一个补卡提醒 +// userID: 消息接收者的 sys_user.id +// role: 0:普通员工 1:管理员 +// projectID: 项目 ID +// missingCardTime: 缺卡时间见设计图 +func CreateMissingCardReminder(userID string, role int, projectID int, missingCardTime string, orderId int64) error { + if reminders.HasLetter(userID) { + userID = reminders.GetUserIDByOpenID(userID) + if userID == "" { + return fmt.Errorf("未找到对应的用户") + } + } + + if strings.Contains(userID, "_") { + return fmt.Errorf("未找到对应的用户") + } + + // 构建消息模板 + task := do.TodoTasks{ + TaskType: Reissue, // 补卡提醒 + ProjectId: projectID, // 项目 ID + UserId: userID, // 消息接收者的 sys_User.Id + Role: role, + OrderId: orderId, + MissingCardTime: missingCardTime, // 缺卡时间 示例:`03月14日 08:30上班卡;18:00下班卡` + } + + // 发布提醒 + _, err := dao.TodoTasks.Ctx(context.Background()).Insert(&task) + return err +} + +// CreateAttendanceApprovalReminder 发布一条考勤审批提醒 +// projectID: 项目 ID +// userID: 消息接收者的 sys_user.id +// creatorID:创建人 ID +// targetID: 对应跳转的主键ID +func CreateAttendanceApprovalReminder(userID string, projectID int, creatorID string, targetID int) error { + if reminders.HasLetter(creatorID) || reminders.HasLetter(userID) { + if creatorID == userID { + creatorID = reminders.GetUserIDByOpenID(creatorID) + userID = creatorID + } else { + if reminders.HasLetter(creatorID) { + creatorID = reminders.GetUserIDByOpenID(creatorID) + } + if reminders.HasLetter(userID) { + userID = reminders.GetUserIDByOpenID(userID) + } + } + + if creatorID == "" || userID == "" { + return fmt.Errorf("未找到对应的用户") + } + } + + // 构建消息模板 + task := do.TodoTasks{ + TaskType: AttendanceApproval, // 考勤审批提醒 + ProjectId: projectID, // 项目 ID + UserId: userID, // 消息接收者的 sys_User.Id + Applicant: creatorID, // 创建人ID + OrderId: targetID, // 对应跳转的主键ID + Status: 0, + } + + // 发布提醒 + _, err := dao.TodoTasks.Ctx(context.Background()).Insert(&task) + return err +} + +// CreateAskForLeaveReminder 发布一条请假审批提醒 +// userID: 消息接收者的 sys_user.id +// projectID: 项目 ID +// creatorID:创建人 ID +// targetID: 对应跳转的主键ID +func CreateAskForLeaveReminder(userID string, projectID int, creatorID string, targetID int) error { + if reminders.HasLetter(creatorID) || reminders.HasLetter(userID) { + if creatorID == userID { + creatorID = reminders.GetUserIDByOpenID(creatorID) + userID = creatorID + } else { + if reminders.HasLetter(creatorID) { + creatorID = reminders.GetUserIDByOpenID(creatorID) + } + if reminders.HasLetter(userID) { + userID = reminders.GetUserIDByOpenID(userID) + } + } + + if creatorID == "" || userID == "" { + return fmt.Errorf("未找到对应的用户") + } + } + + // 构建消息模板 + task := do.TodoTasks{ + TaskType: ApprovalReminder, // 请假审批提醒 + UserId: userID, // 消息接收者的 sys_User.Id + ProjectId: projectID, // 项目 ID + Applicant: creatorID, // 创建人ID + OrderId: targetID, // 对应跳转的主键ID + Status: 0, // 未处理 + Role: "1", // 发送给施工人员 + } + + // 发布提醒 + _, err := dao.TodoTasks.Ctx(context.Background()).Insert(&task) + return err +} + +func CreateAttendanceApprovalGroup(list []ReissueReminder, num int) error { + UserIDs := lo.FilterMap(list, func(item ReissueReminder, _ int) (string, bool) { + if reminders.HasLetter(item.UserID) { + return item.UserID, true + } + return item.UserID, false + }) + + CreatorIDs := lo.FilterMap(list, func(item ReissueReminder, _ int) (string, bool) { + if reminders.HasLetter(item.CreatorID) { + return item.CreatorID, true + } + + return item.CreatorID, false + }) + + // 获取 OpenID 对应的 sys_user.id + openIDToUserIDMap := reminders.GetUserIDByOpenIDs(append(UserIDs, CreatorIDs...)) + // 替换 todoList 中的 userID + for i := range list { + if newUserID, ok := openIDToUserIDMap[list[i].UserID]; ok { + list[i].UserID = newUserID + } + + if newUserID, ok := openIDToUserIDMap[list[i].CreatorID]; ok { + list[i].CreatorID = newUserID + } + } + + // 同一组的消息拥有相同的 UUID + groupUUID := uuid.New().String() + todoTasks := lo.Map(list, func(item ReissueReminder, _ int) do.TodoTasks { + return do.TodoTasks{ + TaskType: num, // 考勤审批提醒 + ProjectId: item.ProjectID, // 项目 ID + UserId: item.UserID, // 消息接收者的 sys_User.Id + Applicant: item.CreatorID, // 创建人ID + OrderId: item.TargetID, // 对应跳转的主键ID + Role: item.Role, + Uuid: groupUUID, + } + }) + + _, err := dao.TodoTasks.Ctx(context.Background()).Insert(todoTasks) + return err +} + +// MarkTaskAsProcessed 标记特定的待办任务为已处理 +// 每个待办任务都与一个 OrderID 关联,可以通过 OrderID 查找任务详情 +// 用户完成补卡或审批操作后,应将相应的待办任务标记为已处理 +func MarkTaskAsProcessed(taskID int) error { + return g.Try(context.Background(), func(ctx context.Context) { + _, err := dao.TodoTasks.Ctx(ctx).Where("order_id", taskID).Update(g.Map{"status": 1}) + liberr.ErrIsNil(ctx, err, "标记代办任务为已处理失败") + }) +} + +// 根据 uuid 将一组待办任务标记为已处理 +func MarkTasksAsProcessedByUUID(id int64) error { + return g.Try(context.Background(), func(ctx context.Context) { + value, err2 := dao.TodoTasks.Ctx(ctx).Where("order_id", id).Where("status", 0).Limit(1).Fields("uuid").Value() + liberr.ErrIsNil(ctx, err2) + _, err := dao.TodoTasks.Ctx(ctx).Where("uuid", value.String()).Update(g.Map{"status": 1}) + liberr.ErrIsNil(ctx, err, "标记代办任务为已处理失败") + }) +} diff --git a/third/todo/todo_var.go b/third/todo/todo_var.go new file mode 100644 index 0000000..2cec5e7 --- /dev/null +++ b/third/todo/todo_var.go @@ -0,0 +1,9 @@ +package todo + +type TodoType = int + +const ( + Reissue TodoType = iota // 补卡 + AttendanceApproval // 考勤审批 + ApprovalReminder // 请假审批 +) diff --git a/third/ws/business.go b/third/ws/business.go new file mode 100644 index 0000000..ade504d --- /dev/null +++ b/third/ws/business.go @@ -0,0 +1,94 @@ +// Package ws +// @Author 铁憨憨[cory] 2025/2/12 15:45:00 +package ws + +/* +TheSenderInformationOfTheAssemblyPersonnel 组装下发人员信息 +*/ +func TheSenderInformationOfTheAssemblyPersonnel(sn string, userId string, name string, face string) (err error) { + sUuid := GenerateUUIDWithSixRandomDigits() + people := PeopleInformation{ + Cmd: "to_device", + From: sUuid, + To: sn, + Data: PeopleInData{ + Cmd: "addUser", + UserID: userId, + Name: name, + FaceTemplate: face, + IDValid: "", + }, + } + _, err = SendRequestAndWaitResponse(sn, sUuid, people) + return +} + +/* +SelectUserAll 获取打卡设备所有人员 +*/ +func SelectUserAll(sn string) (CommonResponse, error) { + sUuid := GenerateUUIDWithSixRandomDigits() + people := PersonnelInformationAcquisition{ + Cmd: "to_device", + From: sUuid, + To: sn, + Data: PersonnelInformationAcquisitionTwo{ + Cmd: "getUserInfo", + Value: 1, + }, + } + return SendRequestAndWaitResponse(sn, sUuid, people) +} + +/* +DelByUserId 删除指定人员 +*/ +func DelByUserId(sn string, userId string) (CommonResponse, error) { + sUuid := GenerateUUIDWithSixRandomDigits() + people := DeletionOfPersonnel{ + Cmd: "to_device", + From: sUuid, + To: sn, + Data: DeletionOfPersonnelData{ + Cmd: "delUser", + UserID: userId, + UserType: 0, + }, + } + return SendRequestAndWaitResponse(sn, sUuid, people) +} + +/* +BatchDelete 批量删除指定人员 +*/ +func BatchDelete(sn string, userIds []string) (CommonResponse, error) { + sUuid := GenerateUUIDWithSixRandomDigits() + people := BatchDeletion{ + Cmd: "to_device", + From: sUuid, + To: sn, + Data: BatchDeletionData{ + Cmd: "delMultiUser", + UserIds: userIds, + UserType: 0, + }, + } + return SendRequestAndWaitResponse(sn, sUuid, people) +} + +/* +DelAll 删除指定考勤机全部人员 +*/ +func DelAll(sn string) (CommonResponse, error) { + sUuid := GenerateUUIDWithSixRandomDigits() + people := DeletionALlOfPersonnel{ + Cmd: "to_device", + From: sUuid, + To: sn, + Data: DeletionALlOfPersonnelData{ + Cmd: "delAllUser", + UserType: 0, + }, + } + return SendRequestAndWaitResponse(sn, sUuid, people) +} diff --git a/third/ws/construction.go b/third/ws/construction.go new file mode 100644 index 0000000..ef38d70 --- /dev/null +++ b/third/ws/construction.go @@ -0,0 +1,167 @@ +// Package ws +// @Author 铁憨憨[cory] 2025/2/12 15:20:00 +package ws + +import "github.com/gorilla/websocket" + +/* +============================================常量============================================ +============================================常量============================================ +============================================常量============================================ +*/ +const ( + DECLARE = "declare" //设备初上线 + PING = "ping" //心跳 + ToClient = "to_client" // 服务器消息下发到客户端的响应 +) + +/* +============================================公共============================================ +============================================公共============================================ +============================================公共============================================ +*/ + +// DeviceInfo 存储连接设备信息 +type DeviceInfo struct { + IP string `json:"ip"` + Port string `json:"port"` + Conn *websocket.Conn `json:"conn"` +} + +// GenericMessage 通用消息结构,用于解析初始的 cmd 字段 +type GenericMessage struct { + CMD string `json:"cmd"` +} + +// CommonResponse 公共响应结构 +type CommonResponse struct { + Cmd string `json:"cmd"` + From string `json:"from"` + To string `json:"to"` + //Extra string `json:"extra"` + Data CommonResponseData `json:"data"` +} +type CommonResponseData struct { + Cmd string `json:"cmd"` + UserIds []string `json:"userIds" dc:"用户IDS"` + UserID string `json:"user_id"` + Code int `json:"code"` + Msg string `json:"msg"` + DelFailed []DelMultiUserData `json:"delFailed"` +} + +type DelMultiUserData struct { + UserID string `json:"user_id"` + Code int `json:"code"` + Msg string `json:"msg"` +} + +/* +============================================基础============================================ +============================================基础============================================ +============================================基础============================================ +*/ + +// DeclareMessage 设备上线消息 +type DeclareMessage struct { + Cmd string `json:"cmd"` + Type string `json:"type"` + SN string `json:"sn"` + VersionCode string `json:"version_code"` + VersionName string `json:"version_name"` + Token string `json:"token"` + Ip string `json:"ip"` + Timestamp float64 `json:"timestamp"` +} + +type PongMessage struct { + Cmd string `json:"cmd"` + From string `json:"from"` + To string `json:"to"` + Data PongMessageData `json:"data"` +} + +// PongMessageData 心跳回复消息结构 +type PongMessageData struct { + Cmd string `json:"cmd"` +} + +/* +============================================ws请求============================================ +============================================ws请求============================================ +============================================ws请求============================================ +*/ + +// PeopleInformation 人员信息下发 +type PeopleInformation struct { + Cmd string `json:"cmd"` //该接口固定为to_device + From string `json:"from"` //可不填写,填写uuid来做为发送请求或响应的标识 + To string `json:"to"` //设备号(请查看公共设置中的设备号) + //Extra string `json:"extra"` //给服务端预留的补充字段,设备端不处理这个字段内容。设备在响应这条指令时原样返回 + Data PeopleInData `json:"data"` +} +type PeopleInData struct { + Cmd string `json:"cmd"` + UserID string `json:"user_id"` + Name string `json:"name"` + FaceTemplate string `json:"face_template"` // http 链接图 + IDValid string `json:"id_valid"` // 人员有效期(人员在这个时间点后,无法通行)格式:yyyy-MM-dd 或者 yyyy-MM-dd HH:mm,为 “” 则为永久 +} + +// DeletionOfPersonnel 删除人员 +type DeletionOfPersonnel struct { + Cmd string `json:"cmd"` + From string `json:"from"` + To string `json:"to"` + Data DeletionOfPersonnelData `json:"data"` +} +type DeletionOfPersonnelData struct { + Cmd string `json:"cmd"` + UserID string `json:"user_id"` + UserType int `json:"user_type"` // 删除的用户类型:0-人脸接口下发的数据 1-人证比对接口下发的数据 +} + +// BatchDeletion 批量删除 +type BatchDeletion struct { + Cmd string `json:"cmd"` + From string `json:"from"` + To string `json:"to"` + Data BatchDeletionData `json:"data"` +} +type BatchDeletionData struct { + Cmd string `json:"cmd"` + UserIds []string `json:"user_ids"` + UserType int `json:"user_type"` // 删除的用户类型:0-人脸接口下发的数据 1-人证比对接口下发的数据 +} + +// DeletionALlOfPersonnel 删除全部人员 +type DeletionALlOfPersonnel struct { + Cmd string `json:"cmd"` + From string `json:"from"` + To string `json:"to"` + Data DeletionALlOfPersonnelData `json:"data"` +} +type DeletionALlOfPersonnelData struct { + Cmd string `json:"cmd"` + UserType int `json:"user_type"` // 删除的用户类型:0-人脸接口下发的数据 1-人证比对接口下发的数据 +} + +// PersonnelInformationAcquisition 人员信息获取 +type PersonnelInformationAcquisition struct { + Cmd string `json:"cmd"` //该接口固定为to_device + From string `json:"from"` //可不填写,填写uuid来做为发送请求或响应的标识 + To string `json:"to"` //设备号(请查看公共设置中的设备号) + Data PersonnelInformationAcquisitionTwo `json:"data"` +} +type PersonnelInformationAcquisitionTwo struct { + Cmd string `json:"cmd"` + Value int `json:"value"` +} + +/* +============================================http请求============================================ +============================================http请求============================================ +============================================http请求============================================ +*/ + +//loggerMiddlewareloggerMiddlewareloggerMiddleware diff --git a/third/ws/ws.go b/third/ws/ws.go new file mode 100644 index 0000000..f32629b --- /dev/null +++ b/third/ws/ws.go @@ -0,0 +1,265 @@ +// Package ws +// @Author 铁憨憨[cory] 2025/2/12 15:18:00 +package ws + +import ( + "encoding/json" + "fmt" + "github.com/gogf/gf/v2/os/gctx" + "github.com/google/uuid" + "github.com/gorilla/websocket" + "github.com/tiger1103/gfast/v3/api/v1/system" + "github.com/tiger1103/gfast/v3/internal/app/system/service" + "golang.org/x/net/context" + "log" + "math/rand" + "net/http" + "strconv" + "sync" + "time" +) + +// 存储所有连接的设备信息 +var connectedDevices = make(map[string]*DeviceInfo) + +// 存储每个 uuid 对应的通道 +var responseChannels = make(map[string]chan CommonResponse) +var responseChannelsMutex sync.Mutex + +// HandleWebSocket 处理WebSocket连接的函数 +func HandleWebSocket(w http.ResponseWriter, r *http.Request) { + ctx := gctx.New() + // 将HTTP连接升级为WebSocket连接 + conn, err := upgrader.Upgrade(w, r, nil) + if err != nil { + log.Println("WebSocket升级失败:", err) + return + } + defer conn.Close() + + // 读取设备发送的第一条消息,从中提取 SN然后添加到设备列表中 + declare, err := addDevice(ctx, conn, r) + if err != nil { + log.Println("添加设备信息时出错:", err) + return + } + + // 持续读取从客户端(其他服务器)发送过来的数据 + for { + // 读取消息类型和消息内容 + messageType, message, err := conn.ReadMessage() + if err != nil { + log.Println("读取消息时出错:", err) + // 移除设备信息 + delete(connectedDevices, declare.SN) + log.Printf("设备断开连接,设备信息: %+v", declare) + err = service.BusAttendanceMachine().Change(ctx, &system.BusAttendanceMachineChangeReq{ + Sn: declare.SN, + Status: "0", + }) + log.Println("修改考勤设备状态时出错:", err) + break + } + + // 先解析出 cmd 字段 + var genericMsg GenericMessage + err = json.Unmarshal(message, &genericMsg) + if err != nil { + log.Println("解析 cmd 字段时出错:", err) + continue + } + + // 根据 cmd 字段进行不同处理 + switch genericMsg.CMD { + case DECLARE: + log.Println("设备在线:", declare) + case PING: + + declareMessage := DeclareMessage{} + if json.Unmarshal(message, &declareMessage) != nil { + return + } + if err = handlePing(ctx, conn, r, declareMessage.SN); err != nil { + log.Println("处理心跳回复:", err) + } + case ToClient: + if err := requestResponse(message); err != nil { + log.Println("处理响应:", err) + } + default: + log.Printf("收到未知消息---> 类型: %d, 消息内容: %s", messageType, string(message)) + } + } + // 清理通道资源 + responseChannelsMutex.Lock() + for key, ch := range responseChannels { + if connectedDevices[declare.SN] != nil { + delete(responseChannels, key) + close(ch) + } + } + responseChannelsMutex.Unlock() +} + +// addDevice 将设备信息添加到设备列表中 +func addDevice(ctx context.Context, conn *websocket.Conn, r *http.Request) (declareMessage DeclareMessage, err error) { + // 读取设备发送的第一条消息,从中提取 SN + _, message, err := conn.ReadMessage() + if err != nil { + return + } + declareMessage = DeclareMessage{} + if json.Unmarshal(message, &declareMessage) != nil { + return + } + // 假设设备信息可以从请求中获取,这里简单从 RemoteAddr 解析 + ip, port := parseRemoteAddr(r.RemoteAddr) + deviceInfo := &DeviceInfo{ + IP: ip, + Port: port, + Conn: conn, + } + if declareMessage.SN != "" { + // 存储设备信息 + connectedDevices[declareMessage.SN] = deviceInfo + log.Printf("新设备连接,设备信息: %+v", declareMessage) + // 变更状态 + err = service.BusAttendanceMachine().Register(ctx, &system.BusAttendanceMachineRegisterReq{ + Sn: declareMessage.SN, + }) + if err != nil { + return + } + } + return declareMessage, nil +} + +// handlePing 处理 ping 消息 +func handlePing(ctx context.Context, conn *websocket.Conn, r *http.Request, sn string) (err error) { + pongMsg := PongMessageData{ + Cmd: "pong", + } + pongJSON, _ := json.Marshal(pongMsg) + err = conn.WriteMessage(websocket.TextMessage, pongJSON) + if err != nil { + log.Println("发送 Pong 消息时出错:", err) + return err + } + // 存储设备信息、变更状态 + connectedDevices[sn] = &DeviceInfo{ + Conn: conn, + } + err = service.BusAttendanceMachine().Register(ctx, &system.BusAttendanceMachineRegisterReq{ + Sn: sn, + }) + return nil +} + +// requestResponse 处理请求得到的响应 +func requestResponse(message []byte) (err error) { + log.Println("请求响应:", string(message)) + var common CommonResponse + err = json.Unmarshal(message, &common) + if err != nil { + log.Println("解析 cmd 字段时出错:", err) + return err + } + // 根据UUID查找对应的通道 + responseChannelsMutex.Lock() + if ch, ok := responseChannels[common.To]; ok { + ch <- common + delete(responseChannels, common.To) + } + responseChannelsMutex.Unlock() + + return nil +} + +// 根据 SN 发送消息给对应的设备 +func sendMessageToDevice(sn string, uuid string, message interface{}) error { + conn, exists := connectedDevices[sn] + if !exists { + return nil + } + msgJSON, err := json.Marshal(message) + if err != nil { + return err + } + + err = conn.Conn.WriteMessage(websocket.TextMessage, msgJSON) + if err != nil { + responseChannelsMutex.Lock() + delete(responseChannels, uuid) + responseChannelsMutex.Unlock() + return err + } + return nil +} + +func SendRequestAndWaitResponse(sn string, sUuid string, payload interface{}) (CommonResponse, error) { + responseChan := make(chan CommonResponse, 1) + // 存入全局映射 + responseChannelsMutex.Lock() + responseChannels[sUuid] = responseChan + responseChannelsMutex.Unlock() + + // 发送请求 + err := sendMessageToDevice(sn, sUuid, payload) + if err != nil { + return CommonResponse{}, err + } + + // 等待响应 + select { + case resp := <-responseChan: + fmt.Printf("收到响应: %+v\n", resp) + return resp, nil + case <-time.After(10 * time.Second): + responseChannelsMutex.Lock() + delete(responseChannels, sUuid) + responseChannelsMutex.Unlock() + return CommonResponse{}, fmt.Errorf("等待响应超时") + } +} + +/* +=========================================================业务无关========================================================= +=========================================================业务无关========================================================= +=========================================================业务无关========================================================= +*/ + +// 定义一个升级器,用于将HTTP连接升级为WebSocket连接 +var upgrader = websocket.Upgrader{ + ReadBufferSize: 1024, + WriteBufferSize: 1024, + // 允许跨域访问,这里设置为允许所有来源 + CheckOrigin: func(r *http.Request) bool { + return true + }, +} + +// 解析远程地址,获取 IP 和端口 +func parseRemoteAddr(addr string) (string, string) { + // 简单处理,假设地址格式为 IP:Port + for i := len(addr) - 1; i >= 0; i-- { + if addr[i] == ':' { + return addr[:i], addr[i+1:] + } + } + return "", "" +} + +// GenerateUUIDWithSixRandomDigits 生成一个 UUID 并拼接 6 位随机数 +func GenerateUUIDWithSixRandomDigits() string { + // 生成 UUID + uuidStr := uuid.New().String() + // 初始化随机数种子 + rand.Seed(time.Now().UnixNano()) + // 生成 6 位随机数 + randomNum := rand.Intn(900000) + 100000 + // 将随机数转换为字符串 + randomNumStr := strconv.Itoa(randomNum) + // 拼接 UUID 和 6 位随机数 + result := uuidStr + "-" + randomNumStr + return result +} diff --git a/third/ys7/struct.go b/third/ys7/struct.go new file mode 100644 index 0000000..1f1e009 --- /dev/null +++ b/third/ys7/struct.go @@ -0,0 +1,51 @@ +package ys7 + +const OK = "200" + +//type Public struct { +// Code string `json:"code"` +// Msg string `json:"msg"` +//} + +type TP struct { + Public + Data struct { + AccessToken string `json:"accessToken"` + ExpireTime int64 `json:"expireTime"` + } `json:"data"` +} + +type HelMet struct { + Public + RequestId string `json:"requestId"` + Data []struct { + Id string `json:"id"` + Height string `json:"height"` + TargetList []struct { + BodyRect struct { + VmodelHF string `json:"vmodel_h_f"` + VmodelWF string `json:"vmodel_w_f"` + VmodelXF string `json:"vmodel_x_f"` + VmodelYF string `json:"vmodel_y_f"` + } `json:"body_rect"` + AlarmFlg int `json:"alarm_flg"` + UniformType int `json:"uniform_type"` + ID int `json:"ID"` + HelmetType int `json:"helmet_type"` + HeadRect struct { + VmodelHF string `json:"vmodel_h_f"` + VmodelWF string `json:"vmodel_w_f"` + VmodelXF string `json:"vmodel_x_f"` + VmodelYF string `json:"vmodel_y_f"` + } `json:"head_rect"` + ColorType int `json:"color_type"` + } `json:"target_list"` + Width string `json:"width"` + RuleInfo []interface{} `json:"rule_info"` + RuleList [][]struct { + Y string `json:"y"` + X string `json:"x"` + } `json:"rule_list"` + ErrorCode int `json:"errorCode"` + } `json:"data"` +} diff --git a/third/ys7/ys7.go b/third/ys7/ys7.go new file mode 100644 index 0000000..478945c --- /dev/null +++ b/third/ys7/ys7.go @@ -0,0 +1,558 @@ +package ys7 + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "os" + "time" + + "github.com/gogf/gf/v2/encoding/gjson" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gctx" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" +) + +var accessToken = "at.ddhhz6ea49jorccubhg3elqs19nvmxta-1754nu5ce8-017egq8-fmymwvvhv" + +const ( + Ok = "200" + Online = 1 +) + +// 改变 accessToken +func SetAccessToken(token string) { + accessToken = token +} + +// 传入 serial 返回 Devicemap 中的设备信息 +func GetDevice(serial string) (Ys7Device, error) { + device, ok := deviceMap[serial] + if ok { + return device, nil + } + return Ys7Device{}, fmt.Errorf("设备不存在") +} + +var deviceMap = make(map[string]Ys7Device) + +/*当前包的入口方法*/ +func InitYs7() { + /*获取一次token*/ + getAccessToken() + /*获取一次设备列表*/ + getDeviceList(0, 50) // 可以提前获取数据库中的记录进行缓存,比对当前设备是否在数据库中已经存在,不存在则自动入库 +} + +func GetAccessToken() string { + return accessToken +} + +/*获取设备表*/ +func GetDeviceMap() map[string]Ys7Device { + return deviceMap +} + +type TokenRes struct { + Public + Data struct { + AccessToken string `json:"accessToken"` + ExpireTime int64 `json:"expireTime"` + } `json:"data"` +} + +func getAccessToken() { + // ctx := gctx.New() + // appKey := g.Cfg().MustGet(ctx, "ys7.appKey").String() + // appSecret := g.Cfg().MustGet(ctx, "ys7.appSecret").String() + + appKey := "3acf9f1a43dc4209841e0893003db0a2" + appSecret := "4bbf3e9394f55d3af6e3af27b2d3db36" + + url := "https://open.ys7.com/api/lapp/token/get" + dt := struct { + AppKey string `json:"appKey"` + AppSecret string `json:"appSecret"` + }{AppKey: appKey, AppSecret: appSecret} + post, err := Post(url, dt) + if err != nil { + } else { + res := TokenRes{} + err = json.Unmarshal(post, &res) + if err != nil { + } else { + accessToken = res.Data.AccessToken + } + } +} + +type DeviceListRes struct { + Public + Page struct { + Total int `json:"total"` + Page int `json:"page"` + Size int `json:"size"` + } `json:"page"` + Data []Ys7Device `json:"data"` +} + +func delayRequest(page, pageSize int) { + time.Sleep(time.Second * 5) + getDeviceList(page, pageSize) +} + +func getDeviceList(page, pageSize int) { + url := "https://open.ys7.com/api/lapp/device/list" + dt := struct { + AccessToken string `json:"accessToken"` + PageStart int `json:"pageStart"` + PageSize int `json:"pageSize"` + }{AccessToken: accessToken, PageSize: pageSize, PageStart: page} + post, err := Post(url, dt) + if err != nil { + delayRequest(page, pageSize) + } else { + res := DeviceListRes{} + err = json.Unmarshal(post, &res) + if err != nil { + delayRequest(page, pageSize) + } else { + if res.Code == Ok { + for _, datum := range res.Data { + deviceMap[datum.DeviceSerial] = datum + //marshal, err := json.Marshal(datum) + //if err != nil { + // return + //} + //fmt.Println(string(marshal)) + //if datum.Online() { + // capRes, err := datum.Capture() + // if err != nil { + // fmt.Println("抓图识别") + // } else { + // SavePicture(capRes.Data.PicUrl, "static/"+gmd5.MustEncryptString(capRes.Data.PicUrl)+".jpg") + // } + //} + } + if (page+1)*pageSize < res.Page.Total { + getDeviceList(page+1, pageSize) + } + } else { + delayRequest(page, pageSize) + } + } + } +} + +type Ys7Device struct { + DeviceSerial string `json:"deviceSerial"` + DeviceName string `json:"deviceName"` + DeviceType string `json:"deviceType"` + Status int `json:"status"` + Defence int `json:"defence"` + DeviceVersion string `json:"deviceVersion"` +} +type Public struct { + Code string `json:"code"` + Msg string `json:"msg"` +} + +func (receiver *Ys7Device) Online() bool { + if receiver.Status == Online { + return true + } else { + return false + } +} + +func Post(url string, data interface{}) (res []byte, err error) { + response, err := g.Client().Header(map[string]string{"Content-Type": "application/x-www-form-urlencoded"}).Post(gctx.New(), url, data) + if err != nil { + return nil, err + } + return response.ReadAll(), nil +} + +/*开始云台控制*/ +func (receiver *Ys7Device) PTZStart(direction int) (res *Public, err error) { + url := "https://open.ys7.com/api/lapp/device/ptz/start" + dt := struct { + ChannelNo int `json:"channelNo"` + Direction int `json:"direction"` + Speed int `json:"speed"` + DeviceSerial string `json:"deviceSerial"` + AccessToken string `json:"accessToken"` + }{ + AccessToken: accessToken, DeviceSerial: receiver.DeviceSerial, ChannelNo: 1, Speed: 1, Direction: direction, + } + post, err := Post(url, dt) + if err != nil { + return nil, err + } else { + res = &Public{} + err = json.Unmarshal(post, &res) + if err != nil { + return nil, err + } + return + } +} + +/*停止云台控制*/ +func (receiver *Ys7Device) PTZEnd(direction int) (res *Public, err error) { + url := "https://open.ys7.com/api/lapp/device/ptz/stop" + dt := struct { + ChannelNo int `json:"channelNo"` + Direction int `json:"direction"` + DeviceSerial string `json:"deviceSerial"` + AccessToken string `json:"accessToken"` + }{ + AccessToken: accessToken, DeviceSerial: receiver.DeviceSerial, ChannelNo: 1, Direction: direction, + } + post, err := Post(url, dt) + if err != nil { + return nil, err + } else { + res = &Public{} + err = json.Unmarshal(post, &res) + if err != nil { + return nil, err + } + return + } +} + +type PresetAddRes struct { + Public + Data struct { + Index int `json:"index"` // 预置点序号,C6设备是1-12,该参数需要开发者自行保存 + } `json:"data"` +} + +/*添加预制点*/ +func (receiver *Ys7Device) AddPreset() (res *PresetAddRes, err error) { + url := "https://open.ys7.com/api/lapp/device/preset/add" + dt := struct { + ChannelNo int `json:"channelNo"` + DeviceSerial string `json:"deviceSerial"` + AccessToken string `json:"accessToken"` + }{ + AccessToken: accessToken, DeviceSerial: receiver.DeviceSerial, ChannelNo: 1, + } + post, err := Post(url, dt) + if err != nil { + return nil, err + } else { + res = &PresetAddRes{} + err = json.Unmarshal(post, &res) + if err != nil { + return nil, err + } + return + } +} + +/*调用预制点*/ +func (receiver *Ys7Device) MovePreset(index int) (res *Public, err error) { + url := "https://open.ys7.com/api/lapp/device/preset/move" + dt := struct { + ChannelNo int `json:"channelNo"` + DeviceSerial string `json:"deviceSerial"` + AccessToken string `json:"accessToken"` + Index int `json:"index"` + }{ChannelNo: 1, DeviceSerial: receiver.DeviceSerial, AccessToken: accessToken, Index: index} + post, err := Post(url, dt) + if err != nil { + return nil, err + } else { + res = &Public{} + err = json.Unmarshal(post, &res) + if err != nil { + return nil, err + } + return + } +} + +/*清除预制点*/ +func (receiver *Ys7Device) ClearPreset(index int) (res *Public, err error) { + url := "https://open.ys7.com/api/lapp/device/preset/clear" + dt := struct { + ChannelNo int `json:"channelNo"` + DeviceSerial string `json:"deviceSerial"` + AccessToken string `json:"accessToken"` + Index int `json:"index"` + }{ChannelNo: 1, DeviceSerial: receiver.DeviceSerial, AccessToken: accessToken, Index: index} + post, err := Post(url, dt) + if err != nil { + return nil, err + } else { + res = &Public{} + err = json.Unmarshal(post, &res) + if err != nil { + return nil, err + } + return + } +} + +// 开启设备视频加密 +func (r *Ys7Device) OpenEncrypt() error { + url := "https://open.ys7.com/api/lapp/device/encrypt/on" + dt := struct { + AccessToken string `json:"accessToken"` + DeviceSerial string `json:"deviceSerial"` + }{ + AccessToken: accessToken, + DeviceSerial: r.DeviceSerial, + } + + post, err := Post(url, dt) + if err != nil { + return err + } + + if gjson.New(string(post)).Get("code").Int() != 200 { + return fmt.Errorf("%s", gjson.New(string(post)).Get("msg").String()) + } + + // 更新数据库 + _, err = dao.Ys7Devices.Ctx(context.Background()). + Where(dao.Ys7Devices.Columns().DeviceSerial, r.DeviceSerial). + Update(g.Map{ + "VideoEncrypted": 1, + }) + if err != nil { + return err + } + + return nil +} + +// 关闭设备视频加密 +func (r *Ys7Device) CloseEncrypt() error { + url := "https://open.ys7.com/api/lapp/device/encrypt/off" + dt := struct { + AccessToken string `json:"accessToken"` + DeviceSerial string `json:"deviceSerial"` + }{ + AccessToken: accessToken, + DeviceSerial: r.DeviceSerial, + } + + post, err := Post(url, dt) + if err != nil { + return err + } + + if gjson.New(string(post)).Get("code").Int() != 200 { + return fmt.Errorf("%s", gjson.New(string(post)).Get("msg").String()) + } + + _, err = dao.Ys7Devices.Ctx(context.Background()). + Where(dao.Ys7Devices.Columns().DeviceSerial, r.DeviceSerial). + Update(g.Map{ + "VideoEncrypted": 0, + }) + if err != nil { + return err + } + + return nil +} + +// GetLiveAddress 获取播放地址 +func (r *Ys7Device) GetLiveAddress() (string, error) { + url := "https://open.ys7.com/api/lapp/v2/live/address/get" + dt := struct { + AccessToken string `json:"accessToken"` + DeviceSerial string `json:"deviceSerial"` + ChannelNo int `json:"channelNo"` + }{ + AccessToken: accessToken, + DeviceSerial: r.DeviceSerial, + ChannelNo: 1, + } + + post, err := Post(url, dt) + if err != nil { + return "", err + } + + Body := string(post) + println(Body) + if gjson.New(Body).Get("code").Int() != 200 { + return "", fmt.Errorf("获取播放地址失败: %s", gjson.New(Body).Get("msg").String()) + } + + return gjson.New(Body).Get("data.url").String(), nil +} + +/*抓图结果返回*/ +type CapRes struct { + Public + Data struct { + PicUrl string `json:"picUrl"` + } `json:"data"` +} + +/*抓拍图片*/ +func (receiver *Ys7Device) Capture() (cap *CapRes, err error) { + url := "https://open.ys7.com/api/lapp/device/capture" + dt := struct { + DeviceSerial string `json:"deviceSerial"` + ChannelNo int `json:"channelNo"` + AccessToken string `json:"accessToken"` + }{DeviceSerial: receiver.DeviceSerial, ChannelNo: 1, AccessToken: accessToken} + res, err := Post(url, dt) + if err != nil { + return nil, err + } + cap = &CapRes{} + err = json.Unmarshal(res, &cap) + if err != nil { + return nil, err + } + // cap.Data.PicUrl = string(TransHtmlJson([]byte(cap.Data.PicUrl))) + return cap, nil +} + +// download file会将url下载到本地文件,它会在下载时写入,而不是将整个文件加载到内存中。 + +func SavePicture(url, dst string) (err error) { + // Get the data + resp, err := http.Get(url) + if err != nil { + return err + } + defer resp.Body.Close() + // Create the file + out, err := os.Create(dst) + if err != nil { + return err + } + defer out.Close() + + // Write the body to file + _, err = io.Copy(out, resp.Body) + return err +} + +//var appKey = "" +//var secret = "" +//var token = "" +// +//// InitYs7 安全帽 absolutePath绝对路径 +//func InitYs7(absolutePath string) (flag bool, num int, err error) { +// getConfig() +// GetAccesstoken() +// imageData, err := os.ReadFile(absolutePath) +// if err != nil { +// err = errors.New("读取图片文件失败") +// return +// } +// +// // 将图片数据转换为Base64字符串 +// base64String := base64.StdEncoding.EncodeToString(imageData) +// flag, num, err = HelmetCheck(base64String, absolutePath) +// return +//} +// +//func getConfig() { +// appKey = g.Cfg().MustGet(gctx.New(), "ys7.key").String() +// secret = g.Cfg().MustGet(gctx.New(), "ys7.secret").String() +//} +// +//func GetAccesstoken() { +// key := "ys7" +// //从缓存捞取key +// ctx := gctx.New() +// get := commonService.Cache().Get(ctx, key) +// if get != nil && get.String() != "" { +// token = get.String() +// } else { +// getConfig() +// url := "https://open.ys7.com/api/lapp/token/get" +// dt := struct { +// AppKey string `json:"appKey"` +// AppSecret string `json:"appSecret"` +// }{appKey, secret} +// err, s := post(url, dt) +// if err != nil { +// return +// } +// tp := TP{} +// err = json.Unmarshal(s, &tp) +// if err != nil { +// return +// } +// if tp.Code == OK { +// token = tp.Data.AccessToken +// //将token存储到redis中,tiken默认时间为秒,实际计算为7天,(这里少100秒,防止token过期还存在redis中) +// commonService.Cache().Set(ctx, key, tp.Data.AccessToken, time.Duration(tp.Data.ExpireTime-100)*time.Second) +// token = tp.Data.AccessToken +// } +// } +// +//} +// +//func post(uri string, data interface{}) (error, []byte) { +// response, err := g.Client().ContentType("application/x-www-form-urlencoded").Post(gctx.New(), uri, data) +// if err != nil { +// return err, nil +// } +// return nil, response.ReadAll() +//} +// +//// HelmetCheck 图片中标记安全帽 +//func HelmetCheck(image string, absolutePath string) (flag bool, num int, err error) { +// flag = false +// num = 0 +// url := "https://open.ys7.com/api/lapp/intelligence/target/analysis" +// dt := struct { +// AccessToken string `json:"accessToken"` +// DataType int `json:"dataType"` +// Image string `json:"image"` +// ServiceType string `json:"serviceType"` +// }{token, 1, image, "helmet"} +// err, s := post(url, dt) +// if err != nil { +// return +// } +// tp := HelMet{} +// err = json.Unmarshal(s, &tp) +// if err != nil { +// return +// } +// if tp.Code == OK && len(tp.Data) > 0 { +// for _, data := range tp.Data { +// height, _ := strconv.ParseFloat(data.Height, 64) +// width, _ := strconv.ParseFloat(data.Width, 64) +// if len(tp.Data) <= 0 { +// continue +// } +// for _, dataTwo := range data.TargetList { +// HeadRect := dataTwo.HeadRect +// helmetType := dataTwo.HelmetType +// if helmetType == 2 || helmetType == 0 { +// flag = true +// num = num + 1 +// vmodel_h_f, _ := strconv.ParseFloat(HeadRect.VmodelHF, 64) +// vmodel_w_f, _ := strconv.ParseFloat(HeadRect.VmodelWF, 64) +// vmodel_x_f, _ := strconv.ParseFloat(HeadRect.VmodelXF, 64) +// vmodel_y_f, _ := strconv.ParseFloat(HeadRect.VmodelYF, 64) +// +// vmodel_h_f = vmodel_h_f * height +// vmodel_w_f = vmodel_w_f * width +// vmodel_x_f = vmodel_x_f * width +// vmodel_y_f = vmodel_y_f * height +// coryCommon.Test_draw_rect_text(absolutePath, +// vmodel_x_f, vmodel_y_f, vmodel_w_f, vmodel_h_f) +// } +// } +// } +// } +// return +//} diff --git a/third/ys7/ys72.go b/third/ys7/ys72.go new file mode 100644 index 0000000..945c1d0 --- /dev/null +++ b/third/ys7/ys72.go @@ -0,0 +1,338 @@ +package ys7 + +import ( + "context" + "fmt" + "log" + "os" + "time" + + "github.com/gogf/gf/v2/os/gctx" + + "github.com/gogf/gf/v2/frame/g" + "github.com/tidwall/gjson" + "github.com/tiger1103/gfast/v3/internal/app/system/dao" + "github.com/tiger1103/gfast/v3/internal/app/system/model/do" + "github.com/tiger1103/gfast/v3/internal/app/system/model/entity" +) + +type Ys72 struct { + FnLogin func() (string, error) // 登录回调 + Devices map[string]Ys7Device // 设备列表 + Total int // 总页数 和 当前页数 +} + +var Ys72Instance = NewYs72() + +// NewYs72 初始化 +func NewYs72() *Ys72 { + ys7 := &Ys72{ + FnLogin: DefaultLogin, + Devices: make(map[string]Ys7Device), + Total: 999, // 第一次获取设备列表时,会刷新其实际值 + } + + // 刷新 ys7.go 中的 AccessToken + _ = ys7.GetAccessToken() + + // 初始化设备列表 + //if err := ys7.Init(); err != nil { + // panic(err) + //} + + // 定时任务更新设备列表 + go func() { + for range time.Tick(3 * time.Minute) { + if err := ys7.Init(); err != nil { + panic(err) + } + + if err := ys7.GetAllDeviceList(); err != nil { + log.Println("更新设备列表失败:", err) + } + + // 获取设备截图并存入 Redis + ys7.CaptureAllDevice() + } + }() + + return ys7 +} + +// Init 第一次初始化时从数据库获取设备列表存入 Devices +func (ys *Ys72) Init() error { + device := []entity.Ys7Devices{} + + // 获取设备列表 + err := dao.Ys7Devices.Ctx(context.Background()).Scan(&device) + if err != nil { + return err + } + + // 将设备列表存入 Devices + for _, v := range device { + ys.Devices[v.DeviceSerial] = Ys7Device{ + DeviceSerial: v.DeviceSerial, + DeviceName: v.DeviceName, + DeviceType: v.DeviceType, + Status: v.Status, + Defence: int(v.Defence), + DeviceVersion: v.DeviceVersion, + } + } + + return nil +} + +// 遍历 ys.Devices 调用 Capture 获取设备截图并存入Redis +func (ys *Ys72) CaptureAllDevice() { + for _, device := range ys.Devices { + // 获取设备截图 + resp, err := device.Capture() + if err != nil { + log.Println("获取设备截图失败:", err) + return + } + + // 存入 Redis + ctx := context.Background() + g.Redis().Set(ctx, "ys7:capture:"+device.DeviceSerial, resp.Data.PicUrl) + // 两小时后过期 + g.Redis().Expire(ctx, "ys7:capture:"+device.DeviceSerial, 2*60*60) + } +} + +// 由 Redis 管理 AccessToken 的生命周期,如果获取失败则重新刷新 +func (ys *Ys72) GetAccessToken() string { + ctx := context.Background() + // 从 Redis 获取 AccessToken + accessToken, err := g.Redis().Get(ctx, "ys7:accessToken") + + // 兼容原本获取 AccessToken 的逻辑 + SetAccessToken(accessToken.String()) + + if err == nil && accessToken.String() != "" { + return accessToken.String() + } + + // 未获取到 AccessToken 则重新登录 + if accessToken.String() == "" { + // 如果登录失败则递归重试 + if err := ys.login(); err != nil { + return ys.GetAccessToken() + } + + accessToken, err = g.Redis().Get(ctx, "ys7:accessToken") + if err != nil { + return accessToken.String() + } + } + + return accessToken.String() +} + +// 传入 deviceSerial 获取设备信息 +func (ys *Ys72) GetDevice(deviceSerial string) (Ys7Device, error) { + if device, ok := ys.Devices[deviceSerial]; ok { + return device, nil + } + + return Ys7Device{}, fmt.Errorf("设备不存在: %s", deviceSerial) +} + +// 获取单页设备列表并存入 Devices +func (ys *Ys72) getDeviceList(page int, deviceMapping map[string]Ys7Device) error { + accessToken := ys.GetAccessToken() + + req := struct { + AccessToken string `json:"accessToken"` + PageStart int `json:"pageStart"` + PageSize int `json:"pageSize"` + }{AccessToken: accessToken, PageSize: 50, PageStart: page} + + resp, err := Post("https://open.ys7.com/api/lapp/device/list", req) + if err != nil { + return err + } + + body := string(resp) + + // 解析返回数据 + if gjson.Get(body, "code").Int() != 200 { + return fmt.Errorf("获取设备列表失败: %s", gjson.Get(body, "msg").String()) + } + + // 解析设备列表 + gjson.Get(body, "data").ForEach(func(_, value gjson.Result) bool { + deviceSerial := value.Get("deviceSerial").String() // 设备序列号 + deviceName := value.Get("deviceName").String() // 设备名称 + deviceType := value.Get("deviceType").String() // 设备类型 + deviceStatus := int(value.Get("status").Int()) // 设备状态 1:在线 2:离线 + defence := int(value.Get("defence").Int()) // 是否布撤防 0:未布防 1:布防 不用管 + deviceVersion := value.Get("deviceVersion").String() // 设备版本 + + deviceMapping[deviceSerial] = Ys7Device{ + DeviceSerial: deviceSerial, + DeviceName: deviceName, + DeviceType: deviceType, + Status: deviceStatus, + Defence: defence, + DeviceVersion: deviceVersion, + } + + return true + }) + + ys.Total = int(gjson.Get(body, "page.total").Int()) + + return nil +} + +// 依次调用 getDeviceList 获取所有设备列表 +func (ys *Ys72) GetAllDeviceList() error { + // 创建一个设备map + deviceMapping := make(map[string]Ys7Device) + + // 遍历页码获取所有设备列表 + for page := 0; page <= ys.Total; page++ { + if err := ys.getDeviceList(page, deviceMapping); err != nil { + return err + } + } + + newDevices := []do.Ys7Devices{} // 新设备列表 + updateDevices := []do.Ys7Devices{} // 更新设备列表 + + // 遍历 deviceMapping 对比 ys.Devices 筛选出增量或更新设备列表 + for deviceSerial, device := range deviceMapping { + // 如果设备不存在则为新增设备 + if _, ok := ys.Devices[deviceSerial]; !ok { + newDevices = append(newDevices, do.Ys7Devices{ + DeviceSerial: device.DeviceSerial, + DeviceName: device.DeviceName, + DeviceType: device.DeviceType, + Status: device.Status, + Defence: device.Defence, + DeviceVersion: device.DeviceVersion, + }) + } else { + // 如果设备存在则对比设备状态 + if ok, newDevice := ys.CompareDevice(ys.Devices[deviceSerial], device); !ok { + // 如果设备状态不同则更新设备 + updateDevices = append(updateDevices, do.Ys7Devices{ + DeviceSerial: newDevice.DeviceSerial, + DeviceName: newDevice.DeviceName, + DeviceType: newDevice.DeviceType, + Status: newDevice.Status, + Defence: newDevice.Defence, + DeviceVersion: newDevice.DeviceVersion, + }) + } + } + } + + // 新旧状态替换 + ys.Devices = deviceMapping + + // 新设备列表入库 + if len(newDevices) > 0 { + _, err := dao.Ys7Devices.Ctx(context.Background()).Data(newDevices).Batch(20).Insert() + if err != nil { + return err + } + } + + // 更新设备列表 + if len(updateDevices) > 0 { + for _, device := range updateDevices { + _, err := dao.Ys7Devices.Ctx(context.Background()).Data(device). + Where(dao.Ys7Devices.Columns().DeviceSerial, device.DeviceSerial).Update() + if err != nil { + return err + } + } + + // _, err := dao.Ys7Devices.Ctx(context.Background()).Data(updateDevices).Batch(20).Update() + // if err != nil { + // log.Println("更新错误:", err) + // return err + // } + } + + return nil +} + +// 登录并将 AccessToken 存入 Redis 由 Redis 管理其有效期 +// 当获取失败则重新登录后刷新周期 +func (ys *Ys72) login() error { + accessToken, err := ys.FnLogin() + if err != nil { + return err + } + + ctx := context.Background() + g.Redis().Set(ctx, "ys7:accessToken", accessToken) + // 设置 key 将在 5 天后过期 + g.Redis().Expire(ctx, "ys7:accessToken", 5*24*60*60) + return nil +} + +// CompareDevice 对比传递的两个设备结构体是否相同 +// 如果不同则返回 false 并构造出新的设备结构体 +func (ys *Ys72) CompareDevice(old, new Ys7Device) (bool, Ys7Device) { + // 对比old 和 new 结构体的所有字段,是否相同 + if old == new { + return true, Ys7Device{} + } + + // 构造出新的ys7Device + return false, Ys7Device{ + DeviceSerial: new.DeviceSerial, + DeviceName: new.DeviceName, + DeviceType: new.DeviceType, + Status: new.Status, + Defence: new.Defence, + DeviceVersion: new.DeviceVersion, + } +} + +type defalutFn func() (string, error) + +var DefaultLogin = defalutFn(func() (string, error) { + appKey := "3acf9f1a43dc4209841e0893003db0a2" + appSecret := "4bbf3e9394f55d3af6e3af27b2d3db36" + + req := struct { + AppKey string `json:"appKey"` + AppSecret string `json:"appSecret"` + }{AppKey: appKey, AppSecret: appSecret} + + // 登录 + resp, err := Post("https://open.ys7.com/api/lapp/token/get", req) + if err != nil { + return "", err + } + + body := string(resp) + + // 解析返回数据 + if gjson.Get(body, "code").Int() != 200 { + return "", fmt.Errorf("登录失败: %s", gjson.Get(body, "msg").String()) + } + + // 返回 AccessToken + return gjson.Get(body, "data.accessToken").String(), nil +}) + +func StartAI(device Ys7Device) { + capture, err := device.Capture() + if err != nil { + fmt.Println("定时快照错误!", err) + } else { + get, err := g.Client().Get(gctx.New(), capture.Data.PicUrl) + if err != nil { + } else { + os.WriteFile("", get.ReadAll(), 0o666) + } + } +} diff --git a/utility/.gitkeep b/utility/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/utility/coryUtils/dxfClUtils.go b/utility/coryUtils/dxfClUtils.go new file mode 100644 index 0000000..5df6b99 --- /dev/null +++ b/utility/coryUtils/dxfClUtils.go @@ -0,0 +1,128 @@ +// Package timeutil +// @Author 铁憨憨[cory] 2025/6/11 20:08:00 +package timeutil + +import ( + "github.com/paulmach/orb" + "github.com/paulmach/orb/geo" + "github.com/paulmach/orb/planar" + "github.com/tiger1103/gfast/v3/api/v1/common/shp" + "math" +) + +// 将 Polygon 结构体转换为 [][]float64 格式 +func ConvertPolygonToFloatArray(polygon shp.Polygon) [][]float64 { + // 创建结果切片,长度与 Polygon 中的 Positions 相同 + result := make([][]float64, len(polygon.Positions)) + + // 遍历每个 Point 并转换为 []float64 + for i, point := range polygon.Positions { + // 每个点转换为 [经度, 纬度, 高度, 宽度] + result[i] = []float64{ + point.Lng, + point.Lat, + point.Alt, + point.Width, + } + } + + return result +} + +// 判断点是否在多边形内 +func FanWei(mian [][]float64, dian []float64) bool { + if len(mian) < 3 || len(dian) != 2 { + return false + } + + var ring orb.Ring + for _, vertex := range mian { + ring = append(ring, orb.Point{vertex[0], vertex[1]}) + } + + // 闭合环 + if !ring[0].Equal(ring[len(ring)-1]) { + ring = append(ring, ring[0]) + } + + polygon := orb.Polygon{ring} + point := orb.Point{dian[0], dian[1]} + + return planar.PolygonContains(polygon, point) +} + +// 点到线段最近点(投影点) +func closestPointOnSegment(p, a, b orb.Point) orb.Point { + ax, ay := a[0], a[1] + bx, by := b[0], b[1] + px, py := p[0], p[1] + + abx := bx - ax + aby := by - ay + apx := px - ax + apy := py - ay + + t := (apx*abx + apy*aby) / (abx*abx + aby*aby) + if t < 0 { + t = 0 + } else if t > 1 { + t = 1 + } + + return orb.Point{ax + t*abx, ay + t*aby} +} + +// 点到多边形的最近距离(米) +func PointToPolygonDistance(mian [][]float64, dian []float64) float64 { + point := orb.Point{dian[0], dian[1]} + + ring := make(orb.Ring, len(mian)) + for i, pt := range mian { + ring[i] = orb.Point{pt[0], pt[1]} + } + + // 闭合多边形 + if !ring[0].Equal(ring[len(ring)-1]) { + ring = append(ring, ring[0]) + } + + polygon := orb.Polygon{ring} + + if planar.PolygonContains(polygon, point) { + return 0 + } + + minDist := math.MaxFloat64 + for i := 0; i < len(ring)-1; i++ { + proj := closestPointOnSegment(point, ring[i], ring[i+1]) + dist := geo.Distance(point, proj) // 单位:米 + if dist < minDist { + minDist = dist + } + } + return minDist +} + +// 计算两个经纬度点之间的球面距离(单位:米) +func PointToPointDistance(p1 []float64, p2 []float64) float64 { + point1 := orb.Point{p1[0], p1[1]} + point2 := orb.Point{p2[0], p2[1]} + return geo.Distance(point1, point2) +} + +//func main() { +// polygonVertices := [][]float64{ +// {106.518314, 29.627223}, +// {106.519419, 29.627223}, +// {106.518238, 29.626399}, +// {106.519491, 29.626435}, +// } +// +// targetPoint := []float64{117.51, 40.74} +// +// inPolygon := FanWei(polygonVertices, targetPoint) +// fmt.Printf("点是否在多边形内:%v\n", inPolygon) +// +// distance := pointToPolygonDistance(polygonVertices, targetPoint) +// fmt.Printf("点到多边形的最短距离(单位米):%.2f m\n", distance) +//} diff --git a/utility/coryUtils/timeutil.go b/utility/coryUtils/timeutil.go new file mode 100644 index 0000000..3b013a0 --- /dev/null +++ b/utility/coryUtils/timeutil.go @@ -0,0 +1,415 @@ +package timeutil + +import ( + "fmt" + "strconv" + "time" +) + +func New() *TimeUtil { + return &TimeUtil{} +} + +// TimeUtil 是时间操作工具类 +type TimeUtil struct{} + +// GetFormattedDate 获取格式化的日期字符串 +func (tu *TimeUtil) GetFormattedDate(t time.Time) string { + return t.Format("2006-01-02") +} + +// GetFormattedTime 获取格式化的时间字符串 +func (tu *TimeUtil) GetFormattedTime(t time.Time) string { + return t.Format("15:04:05") +} + +// GetFormattedDateTime 获取格式化的日期时间字符串 +func (tu *TimeUtil) GetFormattedDateTime(t time.Time) string { + return t.Format("2006-01-02 15:04:05") +} + +// GetWeekday 获取星期几 +func (tu *TimeUtil) GetWeekday(t time.Time) string { + return t.Weekday().String() +} + +// IsLeapYear 判断是否为闰年 +func (tu *TimeUtil) IsLeapYear(year int) bool { + return year%4 == 0 && (year%100 != 0 || year%400 == 0) +} + +// ParseDateFromString 将日期字符串解析为时间对象 +func (tu *TimeUtil) ParseDateFromString(dateString string) (time.Time, error) { + layout := "2006-01-02" + t, err := time.Parse(layout, dateString) + if err != nil { + return time.Time{}, err + } + return t, nil +} + +// ParseTimeFromString 将时间字符串解析为时间对象 +func (tu *TimeUtil) ParseTimeFromString(timeString string) (time.Time, error) { + layout := "15:04:05" + t, err := time.Parse(layout, timeString) + if err != nil { + return time.Time{}, err + } + return t, nil +} + +// ParseDateTimeFromString 将日期时间字符串解析为时间对象 +func (tu *TimeUtil) ParseDateTimeFromString(dateTimeString string) (time.Time, error) { + layout := "2006-01-02 15:04:05" + t, err := time.Parse(layout, dateTimeString) + if err != nil { + return time.Time{}, err + } + return t, nil +} + +// NowTime 获取当前时间 format 表示要转换的日期时间格式 1、YYYY-MM-DD hh:mm:ss 2、YYYY-MM-DD 3、hh:mm:ss +func (tu *TimeUtil) NowTime(format string) (timeDate time.Time) { + // 获取当前时间 + currentTime := time.Now() + // 使用时间格式化函数,将时间转换为指定格式的字符串 + formattedTime := currentTime.Format(rule(format)) + // 输出格式化后的时间字符串 + fmt.Println(formattedTime) + // 如果你需要将时间转换为 time.Time 类型,直接使用 currentTime 即可 + // 这里的 currentTime 就是 time.Time 类型的对象 + fmt.Println(currentTime) + return currentTime +} + +// FormatTimeString 将时间字符串转换为指定格式的日期时间字符串 +/** +inputTime 表示输入的时间字符串 字符格式为:2006-01-02 15:04:05 +format 表示要转换的日期时间格式 1、YYYY-MM-DD hh:mm:ss 2、YYYY-MM-DD 3、hh:mm:ss +*/ +func (tu *TimeUtil) FormatTimeString(inputTime, format string) (string, error) { + format = rule(format) + layout := "2006-01-02 15:04:05" + t, err := time.Parse(layout, inputTime) + if err != nil { + return "", err + } + + formattedTime := t.Format(format) + return formattedTime, nil +} + +// FormatTimeStringZ 将时间字符串转换为指定格式的日期时间字符串 +/** +inputTime 表示输入的时间字符串 字符格式为:2023-07-29T15:30:00Z +format 表示要转换的日期时间格式 1、YYYY-MM-DD hh:mm:ss 2、YYYY-MM-DD 3、hh:mm:ss +*/ +func (tu *TimeUtil) FormatTimeStringZ(inputTime, format string) (string, error) { + format = rule(format) + t, err := time.Parse(time.RFC3339, inputTime) + if err != nil { + return "", err + } + formattedTime := t.Format(format) + return formattedTime, nil +} + +// CalculateAge 计算年龄 传递参数格式为20060406 +func (tu *TimeUtil) CalculateAge(timeStr string) string { + if len(timeStr) > 0 { + // 定义时间字符串和时间格式 + timeFormat := "2006-01-02" + + // 将时间字符串解析为时间对象 + birthDate, err := time.Parse(timeFormat, timeStr) + if err != nil { + fmt.Println("无法解析时间字符串:", err) + } + + //当前时间 + currentDate := time.Now() + + // 计算年份差值 + years := currentDate.Year() - birthDate.Year() + + // 检查月份和日期,如果当前日期还没过生日,则年龄减一 + if currentDate.Month() < birthDate.Month() || + (currentDate.Month() == birthDate.Month() && currentDate.Day() < birthDate.Day()) { + years -= 1 + } + return strconv.Itoa(years) + } + return "" +} + +func StringDateComparison(comparisonTime, scopeA, scopeB string) (flag bool) { + // 将日期字符串解析为时间对象 + startTime, err := time.Parse("2006-01-02", scopeA) + if err != nil { + fmt.Println("解析开始日期时出错:", err) + return + } + endTime, err := time.Parse("2006-01-02", scopeB) + if err != nil { + fmt.Println("解析结束日期时出错:", err) + return + } + // 要检查的日期 + checkTime, err := time.Parse("2006-01-02", comparisonTime) + if err != nil { + fmt.Println("解析要检查的日期时出错:", err) + return + } + // 检查a是否在start和end之间 + if checkTime.After(startTime) && checkTime.Before(endTime) || checkTime.Equal(startTime) || checkTime.Equal(endTime) { + return true + } else { + return false + } +} + +// TimeWithin 判断一个时间字符串是否在on和off之间,注意on和off规则为时分【09:00】 返回值1为在范围内 返回值2为不在范围内 +/** +strTime 需要判断的时间 +on 范围起始时间 +off 范围结束时间 +*/ +func (tu *TimeUtil) TimeWithin(strTime string, on string, off string, clockStatus string) string { + format := "2006-01-02 15:04:05" + + now := time.Now() + year, month, day := now.Date() + + // 构建完整的日期时间字符串 + onTimeStr := "" + if clockStatus == "1" { + onTimeStr = fmt.Sprintf("%d-%02d-%02d %s:00", year, month, day, on) + } else { + onTimeStr = fmt.Sprintf("%d-%02d-%02d %s:00", year, month, day, off) + } + + // 解析时间字符串为时间对象 + onTime, err := time.Parse(format, onTimeStr) + if err != nil { + // 错误处理 + } + + strDateTime, err := time.Parse(format, strTime) + if err != nil { + // 错误处理 + } + + // 判断strTime与onTime、offTime的关系 + /** + 定义了 + var on = “09:00” + var off = “18:00” + 判断strTime“2023-06-07 17:44:49” + on和off自动填补上年月日(比如说on为09:00,自动补充为2023-06-07 09:00:00然后与2023-06-07 17:44:49比较) + strTime小于等于on大于等于off返回1, + strTime大于on返回2, + strTime小于off为3 + */ + + if clockStatus == "1" { //上班 + if strDateTime.Before(onTime) || strDateTime.Equal(onTime) { + return "1" //表示正常 + } else { + if clockStatus == "1" { + return "2" //表述迟到 + } else { + //表示offTime小于等于strDateTime + return "1" //表示正常 + } + } + } else { //下班 + if strDateTime.After(onTime) || strDateTime.Equal(onTime) { + return "1" //表示正常 + } else { + if clockStatus == "2" { + return "3" //表述早退 + } else { + //表示offTime小于等于strDateTime + return "1" //表示正常 + } + } + } +} + +// TimeCycle 将字符串20060102转成2006-01-02 +func (tu *TimeUtil) TimeCycle(dateStr string) (str string, err error) { + date, err := time.Parse("20060102", dateStr) + if err != nil { + fmt.Println("解析时间失败:", err) + return + } + formattedDate := date.Format("2006-01-02") + return formattedDate, err +} + +// rule 时间规则 +func rule(format string) (str string) { + if format == "1" { + format = "2006-01-02 15:04:05" + } else if format == "2" { + format = "2006-01-02" + } else if format == "3" { + format = "15:04:05" + } + return format +} + +// GetDaysDifference 根据字符串时间2023-08-09 减去当前时间 得到 差异天数 +func GetDaysDifference(strDate string) int { + layout := "2006-01-02" // 指定日期字符串的格式 + t, err := time.Parse(layout, strDate) + if err != nil { + fmt.Println("日期解析错误:", err) + return -1 + } + now := time.Now() + duration := now.Sub(t) + days := int(duration.Hours() / 24) + + return days +} + +// RangeTime 根据时间段获取到时间段内的所有时间 2023-10-01 17:26:56 ~ 2023-10-07 17:26:56里的所有时间(年-月-日) +func RangeTime(startDateStr, endDateStr string) (qp []string) { + if startDateStr == "" || endDateStr == "" { + return + } + + // 解析起始日期和结束日期 + startDate, err := time.Parse("2006-01", startDateStr) + if err != nil { + fmt.Printf("无法解析起始日期:%s\n", err) + return + } + + endDate, err := time.Parse("2006-01", endDateStr) + if err != nil { + fmt.Printf("无法解析结束日期:%s\n", err) + return + } + + // 生成日期范围并输出 + currentDate := startDate + for !currentDate.After(endDate) { + format := currentDate.Format("2006-01") + qp = append(qp, format) + currentDate = currentDate.AddDate(0, 1, 0) + } + + return qp +} + +// TimeStr 根据时间字符串 09:00 转成 2023-10-17 09:00:00 然后 再减去10分钟 在转成 time.Duration +func TimeStr(timeString string) (dn time.Duration, err error) { + currentTime := time.Now() + newTimeString := fmt.Sprintf("%s %s", currentTime.Format("2006-01-02"), timeString) + parsedTime, err := time.Parse("2006-01-02 15:04", newTimeString) + if err != nil { + fmt.Println("时间解析错误:", err) + return + } + //duration := 10 * time.Minute + //newTime := parsedTime.Add(-duration) + + thisTime := currentTime.Format("2006-01-02 15:04:05") + t, err := time.Parse("2006-01-02 15:04:05", thisTime) + // 计算持续时间 + //dn = newTime.Sub(t) + dn = parsedTime.Sub(t) + return +} + +func MillisecondTimestamp() int64 { + // 获取当前时间 + currentTime := time.Now() + // 将时间转换为毫秒时间戳 + milliseconds := currentTime.UnixNano() / int64(time.Millisecond) + return milliseconds +} + +// TheBeginningAndTheEndOfTheMonth 获取当月的月初月末 +func TheBeginningAndTheEndOfTheMonth() (string, string) { + currentTime := time.Now() + firstDay := time.Date(currentTime.Year(), currentTime.Month(), 1, 0, 0, 0, 0, currentTime.Location()) + lastDay := firstDay.AddDate(0, 1, 0).Add(-time.Second) + statr := firstDay.Format("2006-01-02") + end := lastDay.Format("2006-01-02") + return statr, end +} + +// TheBeginningAndTheEndOfTheMonthAssign 获取指定月的月初月末 +func TheBeginningAndTheEndOfTheMonthAssign(selectedTime string) (string, string) { + // 将指定时间解析为 time.Time 对象 + selectedTimeObj, err := time.Parse("2006-01", selectedTime) + if err != nil { + // 处理解析错误 + fmt.Println(err) + return "", "" + } + // 获取当月的月初和月末 + firstDay := time.Date(selectedTimeObj.Year(), selectedTimeObj.Month(), 1, 0, 0, 0, 0, selectedTimeObj.Location()) + lastDay := firstDay.AddDate(0, 1, 0).Add(-time.Second) + // 格式化开始日期和结束日期为字符串 + start := firstDay.Format("2006-01-02") + end := lastDay.Format("2006-01-02") + return start, end +} + +// CalculateTheDifferenceBetweenTheTwoTimePoints 计算两个字符串时间相差多少分钟 +func CalculateTheDifferenceBetweenTheTwoTimePoints(currentDateTime, targetTime string) float64 { + // 计算时间差(以分钟为单位) + diff := DateTimeSub(currentDateTime, targetTime).Minutes() + return diff +} + +// CalculatesTheTimeDifferenceBetweenTwoStringsInHours 计算两个字符串时间相差多少小时 +func CalculatesTheTimeDifferenceBetweenTwoStringsInHours(currentDateTime, targetTime string) float64 { + if currentDateTime == "00:00:00" || targetTime == "00:00:00" { + return 0 + } + // 计算时间差(以小时为单位) + currentDateTime, _ = TimeToDateTimeFunc(currentDateTime) + targetTime, _ = TimeToDateTimeFunc(targetTime) + diff := DateTimeSub(currentDateTime, targetTime).Hours() + return diff +} + +func DateTimeSub(currentDateTime, targetTime string) time.Duration { + // 解析当前日期时间字符串 + t1, err := time.Parse("2006-01-02 15:04:05", currentDateTime) + if err != nil { + return 0 + } + // 解析目标时间字符串 + t2, err := time.Parse("2006-01-02 15:04:05", targetTime) + if err != nil { + return 0 + } + diff := t2.Sub(t1) + return diff +} + +// TimeToDateTimeFunc 时间转成年月日时分秒格式 +func TimeToDateTimeFunc(timeStr string) (formattedTime string, err error) { + // 当前日期 + currentDate := time.Now().Format("2006-01-02") + + // 将时间字符串添加到当前日期的字符串中 + fullTimeStr := currentDate + " " + timeStr + + // 解析完整的时间字符串 + parsedTime, err := time.Parse("2006-01-02 15:04:05", fullTimeStr) + if err != nil { + fmt.Println("解析时间时出错:", err) + return + } + + // 将解析后的时间格式化为“2006-01-02 15:04:05” + formattedTime = parsedTime.Format("2006-01-02 15:04:05") + return +} diff --git a/utility/dxfUtils.go b/utility/dxfUtils.go new file mode 100644 index 0000000..8d1b1be --- /dev/null +++ b/utility/dxfUtils.go @@ -0,0 +1,3 @@ +// Package utility +// @Author 铁憨憨[cory] 2025/6/11 20:07:00 +package utility